From 687e81b0dd34e1a1ff2c8699d7aca25c6fb5c6ba Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 28 Jun 2016 13:32:27 -0400 Subject: [PATCH 001/168] got mesh domain working for mgxs --- .../pythonapi/examples/mgxs-part-i.ipynb | 403 ++++++---- .../pythonapi/examples/mgxs-part-iii.ipynb | 239 +++--- .../pythonapi/examples/mgxs-part-iv.ipynb | 10 +- examples/xml/basic/materials.xml | 1 - openmc/__init__.py | 2 +- openmc/filter.py | 2 +- openmc/mgxs/library.py | 38 +- openmc/mgxs/mgxs.py | 703 +++++++++++++++--- 8 files changed, 1017 insertions(+), 381 deletions(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-i.ipynb b/docs/source/pythonapi/examples/mgxs-part-i.ipynb index ea75bec722..5c51b11d38 100644 --- a/docs/source/pythonapi/examples/mgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-i.ipynb @@ -183,7 +183,7 @@ "cell_type": "code", "execution_count": 4, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -208,7 +208,7 @@ "cell_type": "code", "execution_count": 5, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -229,7 +229,7 @@ "cell_type": "code", "execution_count": 6, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -324,9 +324,9 @@ "outputs": [], "source": [ "# OpenMC simulation parameters\n", - "batches = 50\n", + "batches = 20\n", "inactive = 10\n", - "particles = 2500\n", + "particles = 1000\n", "\n", "# Instantiate a Settings object\n", "settings_file = openmc.Settings()\n", @@ -395,10 +395,20 @@ }, "outputs": [], "source": [ + "# Instantiate a tally Mesh\n", + "mesh = openmc.Mesh(name='mesh')\n", + "mesh.type = 'regular'\n", + "mesh.dimension = [1, 1]\n", + "mesh.lower_left = [-0.63, -0.63]\n", + "mesh.upper_right = [+0.63, +0.63]\n", + "\n", "# Instantiate a few different sections\n", - "total = mgxs.TotalXS(domain=cell, groups=groups)\n", - "absorption = mgxs.AbsorptionXS(domain=cell, groups=groups)\n", - "scattering = mgxs.ScatterXS(domain=cell, groups=groups)" + "total = mgxs.TotalXS(domain=mesh, groups=groups)\n", + "absorption = mgxs.AbsorptionXS(domain=mesh, groups=groups)\n", + "scattering = mgxs.ScatterXS(domain=mesh, groups=groups)\n", + "#total = mgxs.TotalXS(domain=cell, groups=groups)\n", + "#absorption = mgxs.AbsorptionXS(domain=cell, groups=groups)\n", + "#scattering = mgxs.ScatterXS(domain=cell, groups=groups)" ] }, { @@ -419,24 +429,22 @@ "data": { "text/plain": [ "OrderedDict([('flux', Tally\n", - "\tID =\t10000\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tcell\t[1]\n", - " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t['flux']\n", - "\tEstimator =\ttracklength\n", - "), ('absorption', Tally\n", - "\tID =\t10001\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tcell\t[1]\n", - " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t['absorption']\n", - "\tEstimator =\ttracklength\n", - ")])" + " \tID =\t10000\n", + " \tName =\t\n", + " \tFilters =\t\n", + " \t\tmesh\t[10000]\n", + " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", + " \tNuclides =\ttotal \n", + " \tScores =\t['flux']\n", + " \tEstimator =\ttracklength), ('absorption', Tally\n", + " \tID =\t10001\n", + " \tName =\t\n", + " \tFilters =\t\n", + " \t\tmesh\t[10000]\n", + " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", + " \tNuclides =\ttotal \n", + " \tScores =\t['absorption']\n", + " \tEstimator =\ttracklength)])" ] }, "execution_count": 13, @@ -513,8 +521,8 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.7.1\n", - " Git SHA1: 19feb55e6d5e8350398627f39fb55ee8e2e63011\n", - " Date/Time: 2016-05-13 10:19:16\n", + " Git SHA1: d30d010aea2c1cba90c993a9c501be9d5d81921d\n", + " Date/Time: 2016-06-28 13:31:05\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -541,57 +549,27 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 1.11184 \n", - " 2/1 1.15820 \n", - " 3/1 1.18468 \n", - " 4/1 1.17492 \n", - " 5/1 1.19645 \n", - " 6/1 1.18436 \n", - " 7/1 1.14070 \n", - " 8/1 1.15150 \n", - " 9/1 1.19202 \n", - " 10/1 1.17677 \n", - " 11/1 1.20272 \n", - " 12/1 1.21366 1.20819 +/- 0.00547\n", - " 13/1 1.15906 1.19181 +/- 0.01668\n", - " 14/1 1.14687 1.18058 +/- 0.01629\n", - " 15/1 1.14570 1.17360 +/- 0.01442\n", - " 16/1 1.13480 1.16713 +/- 0.01343\n", - " 17/1 1.17680 1.16852 +/- 0.01144\n", - " 18/1 1.16866 1.16853 +/- 0.00990\n", - " 19/1 1.19253 1.17120 +/- 0.00913\n", - " 20/1 1.18124 1.17220 +/- 0.00823\n", - " 21/1 1.19206 1.17401 +/- 0.00766\n", - " 22/1 1.17681 1.17424 +/- 0.00700\n", - " 23/1 1.17634 1.17440 +/- 0.00644\n", - " 24/1 1.13659 1.17170 +/- 0.00654\n", - " 25/1 1.17144 1.17169 +/- 0.00609\n", - " 26/1 1.20649 1.17386 +/- 0.00610\n", - " 27/1 1.11238 1.17024 +/- 0.00678\n", - " 28/1 1.18911 1.17129 +/- 0.00647\n", - " 29/1 1.14681 1.17000 +/- 0.00626\n", - " 30/1 1.12152 1.16758 +/- 0.00641\n", - " 31/1 1.12729 1.16566 +/- 0.00639\n", - " 32/1 1.15399 1.16513 +/- 0.00612\n", - " 33/1 1.13547 1.16384 +/- 0.00599\n", - " 34/1 1.17723 1.16440 +/- 0.00576\n", - " 35/1 1.09296 1.16154 +/- 0.00622\n", - " 36/1 1.19621 1.16287 +/- 0.00612\n", - " 37/1 1.12560 1.16149 +/- 0.00605\n", - " 38/1 1.17872 1.16211 +/- 0.00586\n", - " 39/1 1.17721 1.16263 +/- 0.00568\n", - " 40/1 1.13724 1.16178 +/- 0.00555\n", - " 41/1 1.18526 1.16254 +/- 0.00542\n", - " 42/1 1.13779 1.16177 +/- 0.00531\n", - " 43/1 1.15066 1.16143 +/- 0.00516\n", - " 44/1 1.12174 1.16026 +/- 0.00514\n", - " 45/1 1.17479 1.16068 +/- 0.00501\n", - " 46/1 1.14146 1.16014 +/- 0.00489\n", - " 47/1 1.20464 1.16135 +/- 0.00491\n", - " 48/1 1.15119 1.16108 +/- 0.00479\n", - " 49/1 1.17938 1.16155 +/- 0.00468\n", - " 50/1 1.15798 1.16146 +/- 0.00457\n", - " Creating state point statepoint.50.h5...\n", + " 1/1 1.07993 \n", + " 2/1 1.23691 \n", + " 3/1 1.17407 \n", + " 4/1 1.08258 \n", + " 5/1 1.21012 \n", + " 6/1 1.23825 \n", + " 7/1 1.18016 \n", + " 8/1 1.20989 \n", + " 9/1 1.15475 \n", + " 10/1 1.13462 \n", + " 11/1 1.12749 \n", + " 12/1 1.09502 1.11125 +/- 0.01623\n", + " 13/1 1.24722 1.15657 +/- 0.04628\n", + " 14/1 1.14700 1.15418 +/- 0.03281\n", + " 15/1 1.13889 1.15112 +/- 0.02560\n", + " 16/1 1.19008 1.15762 +/- 0.02189\n", + " 17/1 1.11320 1.15127 +/- 0.01956\n", + " 18/1 1.12093 1.14748 +/- 0.01736\n", + " 19/1 1.13809 1.14643 +/- 0.01534\n", + " 20/1 1.09886 1.14168 +/- 0.01452\n", + " Creating state point statepoint.20.h5...\n", "\n", " ===========================================================================\n", " ======================> SIMULATION FINISHED <======================\n", @@ -600,27 +578,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.2300E-01 seconds\n", - " Reading cross sections = 9.3000E-02 seconds\n", - " Total time in simulation = 1.6549E+01 seconds\n", - " Time in transport only = 1.6535E+01 seconds\n", - " Time in inactive batches = 2.3650E+00 seconds\n", - " Time in active batches = 1.4184E+01 seconds\n", - " Time synchronizing fission bank = 5.0000E-03 seconds\n", - " Sampling source sites = 3.0000E-03 seconds\n", + " Total time for initialization = 8.1200E-01 seconds\n", + " Reading cross sections = 2.4200E-01 seconds\n", + " Total time in simulation = 2.8910E+00 seconds\n", + " Time in transport only = 2.8710E+00 seconds\n", + " Time in inactive batches = 8.5700E-01 seconds\n", + " Time in active batches = 2.0340E+00 seconds\n", + " Time synchronizing fission bank = 0.0000E+00 seconds\n", + " Sampling source sites = 0.0000E+00 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 1.6981E+01 seconds\n", - " Calculation Rate (inactive) = 10570.8 neutrons/second\n", - " Calculation Rate (active) = 7050.20 neutrons/second\n", + " Total time for finalization = 1.0000E-03 seconds\n", + " Total time elapsed = 3.7090E+00 seconds\n", + " Calculation Rate (inactive) = 11668.6 neutrons/second\n", + " Calculation Rate (active) = 4916.42 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.15984 +/- 0.00411\n", - " k-effective (Track-length) = 1.16146 +/- 0.00457\n", - " k-effective (Absorption) = 1.16177 +/- 0.00380\n", - " Combined k-effective = 1.16105 +/- 0.00364\n", + " k-effective (Collision) = 1.14223 +/- 0.01330\n", + " k-effective (Track-length) = 1.14168 +/- 0.01452\n", + " k-effective (Absorption) = 1.16108 +/- 0.00876\n", + " Combined k-effective = 1.15408 +/- 0.00566\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -664,7 +642,7 @@ "outputs": [], "source": [ "# Load the last statepoint file\n", - "sp = openmc.StatePoint('statepoint.50.h5')" + "sp = openmc.StatePoint('statepoint.20.h5')" ] }, { @@ -729,11 +707,11 @@ "text": [ "Multi-Group XS\n", "\tReaction Type =\ttotal\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t1\n", + "\tDomain Type =\tmesh\n", + "\tDomain ID =\t10000\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t6.81e-01 +/- 2.69e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.40e+00 +/- 5.93e-01%\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t6.79e-01 +/- 7.64e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t1.40e+00 +/- 1.79e+00%\n", "\n", "\n", "\n" @@ -764,40 +742,55 @@ "
\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", "
cellmesh 10000group innuclidemeanstd. dev.
xyz
11111total0.6677870.0018020.6662610.005072
01112total1.2920130.0076421.2924510.022969
\n", "
" ], "text/plain": [ - " cell group in nuclide mean std. dev.\n", - "1 1 1 total 0.667787 0.001802\n", - "0 1 2 total 1.292013 0.007642" + " mesh 10000 group in nuclide mean std. dev.\n", + " x y z \n", + "1 1 1 1 1 total 0.666261 0.005072\n", + "0 1 1 1 2 total 1.292451 0.022969" ] }, "execution_count": 19, @@ -821,11 +814,11 @@ "cell_type": "code", "execution_count": 20, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ - "absorption.export_xs_data(filename='absorption-xs', format='excel')" + "#absorption.export_xs_data(filename='absorption-xs', format='excel')" ] }, { @@ -875,9 +868,9 @@ "
\n", "\n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -885,40 +878,58 @@ " \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", "
cellmesh 10000energy low [MeV]energy high [MeV]nuclidemeanstd. dev.
xyz
01110.000000e+006.250000e-07total(((total / flux) - (absorption / flux)) - (sca...-3.774758e-150.011292-1.554312e-150.033991
11116.250000e-072.000000e+01total(((total / flux) - (absorption / flux)) - (sca...1.443290e-150.002570-2.886580e-150.007258
\n", "
" ], "text/plain": [ - " cell energy low [MeV] energy high [MeV] nuclide \\\n", - "0 1 0.00e+00 6.25e-07 total \n", - "1 1 6.25e-07 2.00e+01 total \n", + " mesh 10000 energy low [MeV] energy high [MeV] nuclide \\\n", + " x y z \n", + "0 1 1 1 0.00e+00 6.25e-07 total \n", + "1 1 1 1 6.25e-07 2.00e+01 total \n", "\n", - " score mean std. dev. \n", - "0 (((total / flux) - (absorption / flux)) - (sca... -3.77e-15 1.13e-02 \n", - "1 (((total / flux) - (absorption / flux)) - (sca... 1.44e-15 2.57e-03 " + " score mean std. dev. \n", + " \n", + "0 (((total / flux) - (absorption / flux)) - (sca... -1.55e-15 3.40e-02 \n", + "1 (((total / flux) - (absorption / flux)) - (sca... -2.89e-15 7.26e-03 " ] }, "execution_count": 22, @@ -954,9 +965,9 @@ "
\n", "\n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -964,40 +975,58 @@ " \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", "
cellmesh 10000energy low [MeV]energy high [MeV]nuclidemeanstd. dev.
xyz
01110.000000e+006.250000e-07total((absorption / flux) / (total / flux))0.0761150.0006490.0761440.001984
11116.250000e-072.000000e+01total((absorption / flux) / (total / flux))0.0192630.0000950.0192240.000329
\n", "
" ], "text/plain": [ - " cell energy low [MeV] energy high [MeV] nuclide \\\n", - "0 1 0.00e+00 6.25e-07 total \n", - "1 1 6.25e-07 2.00e+01 total \n", + " mesh 10000 energy low [MeV] energy high [MeV] nuclide \\\n", + " x y z \n", + "0 1 1 1 0.00e+00 6.25e-07 total \n", + "1 1 1 1 6.25e-07 2.00e+01 total \n", "\n", - " score mean std. dev. \n", - "0 ((absorption / flux) / (total / flux)) 7.61e-02 6.49e-04 \n", - "1 ((absorption / flux) / (total / flux)) 1.93e-02 9.46e-05 " + " score mean std. dev. \n", + " \n", + "0 ((absorption / flux) / (total / flux)) 7.61e-02 1.98e-03 \n", + "1 ((absorption / flux) / (total / flux)) 1.92e-02 3.29e-04 " ] }, "execution_count": 23, @@ -1026,9 +1055,9 @@ "
\n", "\n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1036,40 +1065,58 @@ " \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", "
cellmesh 10000energy low [MeV]energy high [MeV]nuclidemeanstd. dev.
xyz
01110.000000e+006.250000e-07total((scatter / flux) / (total / flux))0.9238850.0077360.9238560.023272
11116.250000e-072.000000e+01total((scatter / flux) / (total / flux))0.9807370.0037370.9807760.010576
\n", "
" ], "text/plain": [ - " cell energy low [MeV] energy high [MeV] nuclide \\\n", - "0 1 0.00e+00 6.25e-07 total \n", - "1 1 6.25e-07 2.00e+01 total \n", + " mesh 10000 energy low [MeV] energy high [MeV] nuclide \\\n", + " x y z \n", + "0 1 1 1 0.00e+00 6.25e-07 total \n", + "1 1 1 1 6.25e-07 2.00e+01 total \n", "\n", - " score mean std. dev. \n", - "0 ((scatter / flux) / (total / flux)) 9.24e-01 7.74e-03 \n", - "1 ((scatter / flux) / (total / flux)) 9.81e-01 3.74e-03 " + " score mean std. dev. \n", + " \n", + "0 ((scatter / flux) / (total / flux)) 9.24e-01 2.33e-02 \n", + "1 ((scatter / flux) / (total / flux)) 9.81e-01 1.06e-02 " ] }, "execution_count": 24, @@ -1105,9 +1152,9 @@ "
\n", "\n", " \n", - " \n", + " \n", " \n", - " \n", + " \n", " \n", " \n", " \n", @@ -1115,40 +1162,58 @@ " \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", "
cellmesh 10000energy low [MeV]energy high [MeV]nuclidemeanstd. dev.
xyz
01110.000000e+006.250000e-07total(((absorption / flux) / (total / flux)) + ((sc...1.00.00776310.023356
11116.250000e-072.000000e+01total(((absorption / flux) / (total / flux)) + ((sc...1.00.00373910.010581
\n", "
" ], "text/plain": [ - " cell energy low [MeV] energy high [MeV] nuclide \\\n", - "0 1 0.00e+00 6.25e-07 total \n", - "1 1 6.25e-07 2.00e+01 total \n", + " mesh 10000 energy low [MeV] energy high [MeV] nuclide \\\n", + " x y z \n", + "0 1 1 1 0.00e+00 6.25e-07 total \n", + "1 1 1 1 6.25e-07 2.00e+01 total \n", "\n", - " score mean std. dev. \n", - "0 (((absorption / flux) / (total / flux)) + ((sc... 1.00e+00 7.76e-03 \n", - "1 (((absorption / flux) / (total / flux)) + ((sc... 1.00e+00 3.74e-03 " + " score mean std. dev. \n", + " \n", + "0 (((absorption / flux) / (total / flux)) + ((sc... 1.00e+00 2.34e-02 \n", + "1 (((absorption / flux) / (total / flux)) + ((sc... 1.00e+00 1.06e-02 " ] }, "execution_count": 25, @@ -1163,6 +1228,24 @@ "# The scattering-to-total ratio is a derived tally which can generate Pandas DataFrames for inspection\n", "sum_ratio.get_pandas_dataframe()" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] } ], "metadata": { @@ -1181,7 +1264,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.6" + "version": "2.7.11" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb index 5f0acde3f1..e89a9cb7dc 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -32,7 +32,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/wboyd/anaconda2/lib/python2.7/site-packages/matplotlib/__init__.py:1350: UserWarning: This call to matplotlib.use() has no effect\n", + "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/__init__.py:1350: UserWarning: This call to matplotlib.use() has no effect\n", "because the backend has already been chosen;\n", "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", "or matplotlib.backends is imported for the first time.\n", @@ -94,7 +94,7 @@ "cell_type": "code", "execution_count": 3, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -458,7 +458,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -557,14 +557,14 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Specify multi-group cross section types to compute\n", - "mgxs_lib.mgxs_types = ['transport', 'nu-fission', 'fission', 'nu-scatter matrix', 'chi']" + "mgxs_lib.mgxs_types = ['transport', 'nu-fission', 'fission', 'nu-scatter matrix', 'chi', 'chi-delayed']" ] }, { @@ -578,7 +578,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": { "collapsed": true }, @@ -600,7 +600,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "metadata": { "collapsed": true }, @@ -619,7 +619,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "metadata": { "collapsed": true }, @@ -640,7 +640,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "metadata": { "collapsed": true }, @@ -660,7 +660,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "metadata": { "collapsed": false }, @@ -688,7 +688,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "metadata": { "collapsed": true }, @@ -700,7 +700,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "metadata": { "collapsed": false }, @@ -725,8 +725,8 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.7.1\n", - " Git SHA1: 47ef320ad517612376e181ec6a6bc42ca0db98ce\n", - " Date/Time: 2016-05-14 12:29:07\n", + " Git SHA1: d30d010aea2c1cba90c993a9c501be9d5d81921d\n", + " Date/Time: 2016-06-17 12:58:23\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -778,32 +778,32 @@ " 22/1 1.04175 1.02516 +/- 0.00588\n", " 23/1 1.01909 1.02469 +/- 0.00543\n", " 24/1 1.07119 1.02801 +/- 0.00603\n", - " 25/1 0.97445 1.02444 +/- 0.00665\n", - " 26/1 1.04737 1.02588 +/- 0.00638\n", - " 27/1 1.04656 1.02709 +/- 0.00612\n", - " 28/1 1.03464 1.02751 +/- 0.00578\n", - " 29/1 1.02528 1.02739 +/- 0.00547\n", - " 30/1 1.02799 1.02742 +/- 0.00519\n", - " 31/1 1.05846 1.02890 +/- 0.00516\n", - " 32/1 1.03811 1.02932 +/- 0.00493\n", - " 33/1 1.00894 1.02843 +/- 0.00480\n", - " 34/1 1.02049 1.02810 +/- 0.00460\n", - " 35/1 1.00690 1.02726 +/- 0.00450\n", - " 36/1 1.03129 1.02741 +/- 0.00432\n", - " 37/1 0.98864 1.02597 +/- 0.00440\n", - " 38/1 1.00017 1.02505 +/- 0.00434\n", - " 39/1 1.03635 1.02544 +/- 0.00421\n", - " 40/1 1.07090 1.02696 +/- 0.00434\n", - " 41/1 1.03141 1.02710 +/- 0.00420\n", - " 42/1 1.02624 1.02707 +/- 0.00406\n", - " 43/1 1.02668 1.02706 +/- 0.00394\n", - " 44/1 1.05940 1.02801 +/- 0.00394\n", - " 45/1 1.01149 1.02754 +/- 0.00385\n", - " 46/1 1.06958 1.02871 +/- 0.00392\n", - " 47/1 1.02674 1.02866 +/- 0.00381\n", - " 48/1 1.02542 1.02857 +/- 0.00371\n", - " 49/1 1.03516 1.02874 +/- 0.00362\n", - " 50/1 1.06818 1.02973 +/- 0.00366\n", + " 25/1 0.97414 1.02442 +/- 0.00666\n", + " 26/1 1.04709 1.02584 +/- 0.00639\n", + " 27/1 1.05872 1.02777 +/- 0.00631\n", + " 28/1 1.03930 1.02841 +/- 0.00598\n", + " 29/1 1.01488 1.02770 +/- 0.00570\n", + " 30/1 1.04513 1.02857 +/- 0.00548\n", + " 31/1 0.99538 1.02699 +/- 0.00545\n", + " 32/1 1.00106 1.02581 +/- 0.00532\n", + " 33/1 0.99389 1.02442 +/- 0.00527\n", + " 34/1 0.99938 1.02338 +/- 0.00516\n", + " 35/1 1.02161 1.02331 +/- 0.00495\n", + " 36/1 1.04084 1.02398 +/- 0.00480\n", + " 37/1 0.98801 1.02265 +/- 0.00481\n", + " 38/1 1.01348 1.02232 +/- 0.00464\n", + " 39/1 1.06693 1.02386 +/- 0.00474\n", + " 40/1 1.07729 1.02564 +/- 0.00491\n", + " 41/1 1.03191 1.02585 +/- 0.00475\n", + " 42/1 1.05209 1.02667 +/- 0.00468\n", + " 43/1 1.02997 1.02677 +/- 0.00453\n", + " 44/1 1.07288 1.02812 +/- 0.00460\n", + " 45/1 1.01268 1.02768 +/- 0.00449\n", + " 46/1 1.03759 1.02796 +/- 0.00437\n", + " 47/1 1.02620 1.02791 +/- 0.00425\n", + " 48/1 1.02509 1.02783 +/- 0.00414\n", + " 49/1 1.01043 1.02739 +/- 0.00406\n", + " 50/1 1.01457 1.02707 +/- 0.00397\n", " Creating state point statepoint.50.h5...\n", "\n", " ===========================================================================\n", @@ -813,27 +813,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 5.7700E-01 seconds\n", - " Reading cross sections = 1.3400E-01 seconds\n", - " Total time in simulation = 8.0461E+01 seconds\n", - " Time in transport only = 8.0422E+01 seconds\n", - " Time in inactive batches = 6.4060E+00 seconds\n", - " Time in active batches = 7.4055E+01 seconds\n", - " Time synchronizing fission bank = 6.0000E-03 seconds\n", - " Sampling source sites = 2.0000E-03 seconds\n", - " SEND/RECV source sites = 3.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for initialization = 8.4000E-01 seconds\n", + " Reading cross sections = 2.5400E-01 seconds\n", + " Total time in simulation = 7.0993E+01 seconds\n", + " Time in transport only = 7.0952E+01 seconds\n", + " Time in inactive batches = 5.0170E+00 seconds\n", + " Time in active batches = 6.5976E+01 seconds\n", + " Time synchronizing fission bank = 3.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 8.1067E+01 seconds\n", - " Calculation Rate (inactive) = 3902.59 neutrons/second\n", - " Calculation Rate (active) = 1350.35 neutrons/second\n", + " Total time elapsed = 7.1853E+01 seconds\n", + " Calculation Rate (inactive) = 4983.06 neutrons/second\n", + " Calculation Rate (active) = 1515.70 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.02763 +/- 0.00343\n", - " k-effective (Track-length) = 1.02973 +/- 0.00366\n", - " k-effective (Absorption) = 1.02732 +/- 0.00319\n", - " Combined k-effective = 1.02826 +/- 0.00259\n", + " k-effective (Collision) = 1.02489 +/- 0.00308\n", + " k-effective (Track-length) = 1.02707 +/- 0.00397\n", + " k-effective (Absorption) = 1.02637 +/- 0.00325\n", + " Combined k-effective = 1.02581 +/- 0.00264\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -844,7 +844,7 @@ "0" ] }, - "execution_count": 26, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -870,7 +870,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "metadata": { "collapsed": false }, @@ -889,7 +889,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "metadata": { "collapsed": false }, @@ -924,7 +924,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 44, "metadata": { "collapsed": false }, @@ -944,19 +944,11 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/wboyd/Documents/NSE-CRPG-Codes/openmc/openmc/tallies.py:1988: RuntimeWarning: invalid value encountered in true_divide\n", - " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" - ] - }, { "data": { "text/html": [ @@ -978,16 +970,16 @@ " 10000\n", " 1\n", " U-235\n", - " 8.055246e-03\n", - " 2.857567e-05\n", + " 8.046809e-03\n", + " 2.697198e-05\n", " \n", " \n", " 4\n", " 10000\n", " 1\n", " U-238\n", - " 7.339215e-03\n", - " 4.349466e-05\n", + " 7.366624e-03\n", + " 4.255197e-05\n", " \n", " \n", " 5\n", @@ -1002,16 +994,16 @@ " 10000\n", " 2\n", " U-235\n", - " 3.615565e-01\n", - " 2.050486e-03\n", + " 3.614917e-01\n", + " 2.135233e-03\n", " \n", " \n", " 1\n", " 10000\n", " 2\n", " U-238\n", - " 6.742638e-07\n", - " 3.795256e-09\n", + " 6.741607e-07\n", + " 3.924924e-09\n", " \n", " \n", " 2\n", @@ -1027,15 +1019,15 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "3 10000 1 U-235 8.055246e-03 2.857567e-05\n", - "4 10000 1 U-238 7.339215e-03 4.349466e-05\n", + "3 10000 1 U-235 8.046809e-03 2.697198e-05\n", + "4 10000 1 U-238 7.366624e-03 4.255197e-05\n", "5 10000 1 O-16 0.000000e+00 0.000000e+00\n", - "0 10000 2 U-235 3.615565e-01 2.050486e-03\n", - "1 10000 2 U-238 6.742638e-07 3.795256e-09\n", + "0 10000 2 U-235 3.614917e-01 2.135233e-03\n", + "1 10000 2 U-238 6.741607e-07 3.924924e-09\n", "2 10000 2 O-16 0.000000e+00 0.000000e+00" ] }, - "execution_count": 30, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } @@ -1054,7 +1046,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "metadata": { "collapsed": false }, @@ -1069,13 +1061,13 @@ "\tDomain ID =\t10000\n", "\tNuclide =\tU-235\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t8.06e-03 +/- 3.55e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t3.62e-01 +/- 5.67e-01%\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t8.05e-03 +/- 3.35e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t3.61e-01 +/- 5.91e-01%\n", "\n", "\tNuclide =\tU-238\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t7.34e-03 +/- 5.93e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t6.74e-07 +/- 5.63e-01%\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.37e-03 +/- 5.78e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t6.74e-07 +/- 5.82e-01%\n", "\n", "\tNuclide =\tO-16\n", "\tCross Sections [cm^-1]:\n", @@ -1100,7 +1092,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 33, "metadata": { "collapsed": false }, @@ -1119,7 +1111,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 34, "metadata": { "collapsed": true }, @@ -1131,7 +1123,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 35, "metadata": { "collapsed": true }, @@ -1150,7 +1142,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 36, "metadata": { "collapsed": true }, @@ -1165,7 +1157,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 41, "metadata": { "collapsed": false }, @@ -1191,16 +1183,16 @@ " 10000\n", " 1\n", " U-235\n", - " 0.074860\n", - " 0.000303\n", + " 0.074734\n", + " 0.000325\n", " \n", " \n", " 1\n", " 10000\n", " 1\n", " U-238\n", - " 0.005952\n", - " 0.000035\n", + " 0.005977\n", + " 0.000034\n", " \n", " \n", " 2\n", @@ -1216,12 +1208,12 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "0 10000 1 U-235 0.074860 0.000303\n", - "1 10000 1 U-238 0.005952 0.000035\n", + "0 10000 1 U-235 0.074734 0.000325\n", + "1 10000 1 U-238 0.005977 0.000034\n", "2 10000 1 O-16 0.000000 0.000000" ] }, - "execution_count": 36, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -1250,11 +1242,28 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 38, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'RectLattice' object has no attribute 'dimension'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Create an OpenMOC Geometry from the OpenCG Geometry\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mopenmoc_geometry\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_openmoc_geometry\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmgxs_lib\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopencg_geometry\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/Users/sam/.local/lib/python2.7/site-packages/openmc-0.7.1-py2.7.egg/openmc/mgxs/library.pyc\u001b[0m in \u001b[0;36mopencg_geometry\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 161\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_opencg_geometry\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 162\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mopenmc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mopencg_compatible\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mget_opencg_geometry\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 163\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_opencg_geometry\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_opencg_geometry\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_openmc_geometry\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 164\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_opencg_geometry\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 165\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Users/sam/.local/lib/python2.7/site-packages/openmc-0.7.1-py2.7.egg/openmc/opencg_compatible.pyc\u001b[0m in \u001b[0;36mget_opencg_geometry\u001b[0;34m(openmc_geometry)\u001b[0m\n\u001b[1;32m 997\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 998\u001b[0m \u001b[0mopenmc_root_universe\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopenmc_geometry\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mroot_universe\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 999\u001b[0;31m \u001b[0mopencg_root_universe\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_opencg_universe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mopenmc_root_universe\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1000\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1001\u001b[0m \u001b[0mopencg_geometry\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopencg\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGeometry\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Users/sam/.local/lib/python2.7/site-packages/openmc-0.7.1-py2.7.egg/openmc/opencg_compatible.pyc\u001b[0m in \u001b[0;36mget_opencg_universe\u001b[0;34m(openmc_universe)\u001b[0m\n\u001b[1;32m 746\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 747\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mcell_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mopenmc_cell\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mopenmc_cells\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 748\u001b[0;31m \u001b[0mopencg_cell\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_opencg_cell\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mopenmc_cell\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 749\u001b[0m \u001b[0mopencg_universe\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madd_cell\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mopencg_cell\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 750\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Users/sam/.local/lib/python2.7/site-packages/openmc-0.7.1-py2.7.egg/openmc/opencg_compatible.pyc\u001b[0m in \u001b[0;36mget_opencg_cell\u001b[0;34m(openmc_cell)\u001b[0m\n\u001b[1;32m 454\u001b[0m \u001b[0mopencg_cell\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfill\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_opencg_universe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfill\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 455\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 456\u001b[0;31m \u001b[0mopencg_cell\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfill\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_opencg_lattice\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfill\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 457\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 458\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mopenmc_cell\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrotation\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Users/sam/.local/lib/python2.7/site-packages/openmc-0.7.1-py2.7.egg/openmc/opencg_compatible.pyc\u001b[0m in \u001b[0;36mget_opencg_lattice\u001b[0;34m(openmc_lattice)\u001b[0m\n\u001b[1;32m 831\u001b[0m \u001b[0;31m# Create an OpenCG Lattice to represent this OpenMC Lattice\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 832\u001b[0m \u001b[0mname\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopenmc_lattice\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mname\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 833\u001b[0;31m \u001b[0mdimension\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopenmc_lattice\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdimension\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 834\u001b[0m \u001b[0mpitch\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopenmc_lattice\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpitch\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 835\u001b[0m \u001b[0mlower_left\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mopenmc_lattice\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlower_left\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mAttributeError\u001b[0m: 'RectLattice' object has no attribute 'dimension'" + ] + } + ], "source": [ "# Create an OpenMOC Geometry from the OpenCG Geometry\n", "openmoc_geometry = get_openmoc_geometry(mgxs_lib.opencg_geometry)" @@ -1269,11 +1278,23 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 39, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'openmoc_geometry' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# Load the library into the OpenMOC geometry\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mmaterials\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mload_openmc_mgxs_lib\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmgxs_lib\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mopenmoc_geometry\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;31mNameError\u001b[0m: name 'openmoc_geometry' is not defined" + ] + } + ], "source": [ "# Load the library into the OpenMOC geometry\n", "materials = load_openmc_mgxs_lib(mgxs_lib, openmoc_geometry)" @@ -1596,21 +1617,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 2", "language": "python", - "name": "python3" + "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 3 + "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.1" + "pygments_lexer": "ipython2", + "version": "2.7.11" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/mgxs-part-iv.ipynb b/docs/source/pythonapi/examples/mgxs-part-iv.ipynb index e5c80c1926..62a6a09da1 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iv.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iv.ipynb @@ -1439,21 +1439,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 2", "language": "python", - "name": "python3" + "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 3 + "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.1" + "pygments_lexer": "ipython2", + "version": "2.7.11" } }, "nbformat": 4, diff --git a/examples/xml/basic/materials.xml b/examples/xml/basic/materials.xml index 75ab74dbba..39fce5f278 100644 --- a/examples/xml/basic/materials.xml +++ b/examples/xml/basic/materials.xml @@ -12,7 +12,6 @@ - diff --git a/openmc/__init__.py b/openmc/__init__.py index 0bde0f5843..557e13039f 100644 --- a/openmc/__init__.py +++ b/openmc/__init__.py @@ -9,8 +9,8 @@ from openmc.plots import * from openmc.settings import * from openmc.surface import * from openmc.universe import * -from openmc.mgxs_library import * from openmc.mesh import * +from openmc.mgxs_library import * from openmc.filter import * from openmc.trigger import * from openmc.tallies import * diff --git a/openmc/filter.py b/openmc/filter.py index 72fb3b14ed..4c742352d2 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -564,7 +564,7 @@ class Filter(object): # Initialize dictionary to build Pandas Multi-index column filter_dict = {} - # Append Mesh ID as outermost index of mult-index + # Append Mesh ID as outermost index of multi-index mesh_key = 'mesh {0}'.format(self.mesh.id) # Find mesh dimensions - use 3D indices for simplicity diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 9241892646..9c97942347 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -55,9 +55,10 @@ class Library(object): If true, computes cross sections for each nuclide in each domain mgxs_types : Iterable of str The types of cross sections in the library (e.g., ['total', 'scatter']) - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization - domains : Iterable of openmc.Material, openmc.Cell or openmc.Universe + domains : Iterable of openmc.Material, openmc.Cell, openmc.Universe, or + openmc.Mesh The spatial domain(s) for which MGXS in the Library are computed correction : {'P0', None} Apply the P0 correction to scattering matrices if set to 'P0' @@ -188,6 +189,10 @@ class Library(object): return self.openmc_geometry.get_all_material_cells() elif self.domain_type == 'universe': return self.openmc_geometry.get_all_universes() + # FIXME: Change to get tuples of all domain cells + elif self.domain_type == 'mesh': + raise ValueError('Unable to get all domains for a mesh domain ' + + 'type. The domains must be set to [openmc.Mesh]') else: raise ValueError('Unable to get domains without a domain type') else: @@ -253,11 +258,21 @@ class Library(object): @by_nuclide.setter def by_nuclide(self, by_nuclide): cv.check_type('by_nuclide', by_nuclide, bool) + + if by_nuclide == True and self.domain_type == 'mesh': + raise ValueError('Unable to create MGXS library by nuclide with ' + + 'mesh domain') + self._by_nuclide = by_nuclide @domain_type.setter def domain_type(self, domain_type): cv.check_value('domain type', domain_type, openmc.mgxs.DOMAIN_TYPES) + + if by_nuclide == True and domain_type == 'mesh': + raise ValueError('Unable to create MGXS library by nuclide with ' + + 'mesh domain') + self._domain_type = domain_type @domains.setter @@ -278,6 +293,9 @@ class Library(object): elif self.domain_type == 'universe': cv.check_iterable_type('domain', domains, openmc.Universe) all_domains = self.openmc_geometry.get_all_universes() + elif self.domain_type == 'mesh': + cv.check_iterable_type('domain', domains, openmc.Mesh) + all_domains = domains else: msg = 'Unable to set domains with ' \ 'domain type "{}"'.format(self.domain_type) @@ -458,9 +476,13 @@ class Library(object): Parameters ---------- - domain : Material or Cell or Universe or Integral - The material, cell, or universe object of interest (or its ID) - mgxs_type : {'total', 'transport', 'nu-transport', 'absorption', 'capture', 'fission', 'nu-fission', 'kappa-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'multiplicity matrix', 'nu-fission matrix', chi'} + domain : Material or Cell or Universe or Mesh or Integral + The material, cell, universe, or mesh object of interest (or its ID) + mgxs_type : {'total', 'transport', 'nu-transport', 'absorption', + 'capture', 'fission', 'nu-fission', 'kappa-fission', + 'scatter', 'nu-scatter', 'scatter matrix', + 'nu-scatter matrix', 'multiplicity matrix', + 'nu-fission matrix', chi'} The type of multi-group cross section object to return Returns @@ -482,6 +504,8 @@ class Library(object): cv.check_type('domain', domain, (openmc.Cell, Integral)) elif self.domain_type == 'universe': cv.check_type('domain', domain, (openmc.Universe, Integral)) + elif self.domain_type == 'mesh': + cv.check_type('domain', domain, (openmc.Mesh, Integral)) # Check that requested domain is included in library if isinstance(domain, Integral): @@ -761,7 +785,7 @@ class Library(object): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization xsdata_name : str Name to apply to the "xsdata" entry produced by this method @@ -809,7 +833,7 @@ class Library(object): """ cv.check_type('domain', domain, (openmc.Material, openmc.Cell, - openmc.Cell)) + openmc.Cell, openmc.Mesh)) cv.check_type('xsdata_name', xsdata_name, basestring) cv.check_type('nuclide', nuclide, basestring) cv.check_value('xs_type', xs_type, ['macro', 'micro']) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 088db649fa..fd6d0ee494 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -13,6 +13,7 @@ import numpy as np import openmc import openmc.checkvalue as cv from openmc.mgxs import EnergyGroups +from openmc import Mesh if sys.version_info[0] >= 3: @@ -34,7 +35,10 @@ MGXS_TYPES = ['total', 'nu-scatter matrix', 'multiplicity matrix', 'nu-fission matrix', - 'chi'] + 'chi', + 'chi-delayed', + 'chi-prompt', + 'velocity'] # Supported domain types @@ -42,13 +46,15 @@ MGXS_TYPES = ['total', DOMAIN_TYPES = ['cell', 'distribcell', 'universe', - 'material'] + 'material', + 'mesh'] # Supported domain classes # TODO: Implement Mesh domains _DOMAINS = (openmc.Cell, openmc.Universe, - openmc.Material) + openmc.Material, + openmc.Mesh) class MGXS(object): @@ -63,9 +69,9 @@ class MGXS(object): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -83,9 +89,9 @@ class MGXS(object): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -111,10 +117,11 @@ class MGXS(object): Derived tally for the multi-group cross section. This attribute is None unless the multi-group cross section has been computed. num_subdomains : int - The number of subdomains is unity for 'material', 'cell' and 'universe' - domain types. When the This is equal to the number of cell instances - for 'distribcell' domain types (it is equal to unity prior to loading - tally data from a statepoint file). + The number of subdomains is unity for 'material', 'cell', and 'universe' + domain types. This is equal to the number of cell instances for + 'distribcell' domain types (it is equal to unity prior to loading + tally data from a statepoint file) and the number of mesh cells for + 'mesh' domain types. num_nuclides : int The number of nuclides for which the multi-group cross section is being tracked. This is unity if the by_nuclide attribute is False. @@ -260,6 +267,9 @@ class MGXS(object): # Create a domain Filter object domain_filter = openmc.Filter(self.domain_type, self.domain.id) + if self.domain_type == 'mesh': + domain_filter.mesh = self.domain + # Create each Tally needed to compute the multi group cross section tally_metadata = zip(self.scores, self.tally_keys, self.filters) for score, key, filters in tally_metadata: @@ -375,6 +385,8 @@ class MGXS(object): self._domain_type = 'cell' elif isinstance(domain, openmc.Universe): self._domain_type = 'universe' + elif isinstance(domain, openmc.Mesh): + self._domain_type = 'mesh' @domain_type.setter def domain_type(self, domain_type): @@ -427,11 +439,14 @@ class MGXS(object): Parameters ---------- - mgxs_type : {'total', 'transport', 'nu-transport', 'absorption', 'capture', 'fission', 'nu-fission', 'kappa-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'multiplicity matrix', 'nu-fission matrix', chi'} + mgxs_type : {'total', 'transport', 'nu-transport', 'absorption', + 'capture', 'fission', 'nu-fission', 'kappa-fission', 'scatter', + 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', + 'multiplicity matrix', 'nu-fission matrix', chi'} The type of multi-group cross section object to return - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -482,6 +497,12 @@ class MGXS(object): mgxs = NuFissionMatrixXS(domain, domain_type, energy_groups) elif mgxs_type == 'chi': mgxs = Chi(domain, domain_type, energy_groups) + elif mgxs_type == 'chi-prompt': + mgxs = ChiPrompt(domain, domain_type, energy_groups) + elif mgxs_type == 'chi-delayed': + mgxs = ChiDelayed(domain, domain_type, energy_groups) + elif mgxs_type == 'velocity': + mgxs = Velocity(domain, domain_type, energy_groups) mgxs.by_nuclide = by_nuclide mgxs.name = name @@ -666,6 +687,8 @@ class MGXS(object): self.domain = statepoint.summary.get_universe_by_id(self.domain.id) elif self.domain_type == 'material': self.domain = statepoint.summary.get_material_by_id(self.domain.id) + elif self.domain_type == 'mesh': + self.domain = statepoint.meshes[self.domain.id] else: msg = 'Unable to load data from a statepoint for domain type {0} ' \ 'which is not yet supported'.format(self.domain_type) @@ -673,7 +696,23 @@ class MGXS(object): # Use tally "slicing" to ensure that tallies correspond to our domain # NOTE: This is important if tally merging was used - if self.domain_type != 'distribcell': + if self.domain_type == 'mesh': + filters = [self.domain_type] + bins = [] + if (len(self.domain.dimension) == 3): + nx, ny, nz = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + for z in range(1,nz+1): + bins.append((x, y, z)) + else: + nx, ny = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + bins.append((x, y, 1)) + + filter_bins = [tuple(bins)] + elif self.domain_type != 'distribcell': filters = [self.domain_type] filter_bins = [(self.domain.id,)] # Distribcell filters only accept single cell - neglect it when slicing @@ -752,10 +791,13 @@ class MGXS(object): # Construct a collection of the domain filter bins if not isinstance(subdomains, basestring): - cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=2) + cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=3) for subdomain in subdomains: filters.append(self.domain_type) - filter_bins.append((subdomain,)) + if self.domain_type == 'mesh': + filter_bins.append(subdomain) + else: + filter_bins.append((subdomain,)) # Construct list of energy group bounds tuples for all requested groups if not isinstance(groups, basestring): @@ -1125,6 +1167,20 @@ class MGXS(object): cv.check_iterable_type('subdomains', subdomains, Integral) elif self.domain_type == 'distribcell': subdomains = np.arange(self.num_subdomains, dtype=np.int) + elif self.domain_type == 'mesh': + subdomains_list = [] + if (len(self.domain.dimension) == 3): + nx, ny, nz = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + for z in range(1,nz+1): + subdomains_list.append((x, y, z)) + else: + nx, ny = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + subdomains_list.append((x, y, 1)) + subdomains = [tuple(subdomains_list)] else: subdomains = [self.domain.id] @@ -1261,6 +1317,21 @@ class MGXS(object): elif self.domain_type == 'avg(distribcell)': domain_filter = self.xs_tally.find_filter('avg(distribcell)') subdomains = domain_filter.bins + elif self.domain_type == 'mesh': + bins = [] + if (len(self.domain.dimension) == 3): + nx, ny, nz = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + for z in range(1,nz+1): + bins.append((x, y, z)) + else: + nx, ny = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + bins.append((x, y, 1)) + + subdomains = [tuple(bins)] else: subdomains = [self.domain.id] @@ -1366,8 +1437,8 @@ class MGXS(object): df = self.get_pandas_dataframe(groups=groups, xs_type=xs_type) # Capitalize column label strings - df.columns = df.columns.astype(str) - df.columns = map(str.title, df.columns) + #df.columns = df.columns.astype(str) + #df.columns = map(str.title, df.columns) # Export the data using Pandas IO API if format == 'csv': @@ -1468,7 +1539,10 @@ class MGXS(object): distribcell_paths=distribcell_paths) # Remove the score column since it is homogeneous and redundant - df = df.drop('score', axis=1) + if self.domain_type == 'mesh': + df = df.drop('score', axis=1, level=0) + else: + df = df.drop('score', axis=1) # Override energy groups bounds with indices all_groups = np.arange(self.num_groups, 0, -1, dtype=np.int) @@ -1523,7 +1597,12 @@ class MGXS(object): # Sort the dataframe by domain type id (e.g., distribcell id) and # energy groups such that data is from fast to thermal - df.sort_values(by=[self.domain_type] + columns, inplace=True) + if self.domain_type == 'mesh': + mesh_str = 'mesh {0}'.format(self.domain.id) + df.sort_values(by=[(mesh_str, 'x'), (mesh_str, 'y'), \ + (mesh_str, 'z')] + columns, inplace=True) + else: + df.sort_values(by=[self.domain_type] + columns, inplace=True) return df @@ -1542,9 +1621,9 @@ class MatrixMGXS(MGXS): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -1562,9 +1641,9 @@ class MatrixMGXS(MGXS): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -1591,9 +1670,10 @@ class MatrixMGXS(MGXS): is None unless the multi-group cross section has been computed. num_subdomains : int The number of subdomains is unity for 'material', 'cell' and 'universe' - domain types. When the This is equal to the number of cell instances - for 'distribcell' domain types (it is equal to unity prior to loading - tally data from a statepoint file). + domain types. This is equal to the number of cell instances for + 'distribcell' domain types (it is equal to unity prior to loading + tally data from a statepoint file) and the number of mesh cells for + 'mesh' domain types. num_nuclides : int The number of nuclides for which the multi-group cross section is being tracked. This is unity if the by_nuclide attribute is False. @@ -1693,7 +1773,10 @@ class MatrixMGXS(MGXS): max_depth=2) for subdomain in subdomains: filters.append(self.domain_type) - filter_bins.append((subdomain,)) + if self.domain_type == 'mesh': + filter_bins.append(subdomain) + else: + filter_bins.append((subdomain,)) # Construct list of energy group bounds tuples for all requested groups if not isinstance(in_groups, basestring): @@ -1852,6 +1935,19 @@ class MatrixMGXS(MGXS): cv.check_iterable_type('subdomains', subdomains, Integral) elif self.domain_type == 'distribcell': subdomains = np.arange(self.num_subdomains, dtype=np.int) + elif self.domain_type == 'mesh': + subdomains = [] + if (len(self.domain.dimension) == 3): + nx, ny, nz = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + for z in range(1,nz+1): + subdomains.append((x, y, z)) + else: + nx, ny = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + subdomains.append((x, y, 1)) else: subdomains = [self.domain.id] @@ -1934,7 +2030,7 @@ class MatrixMGXS(MGXS): class TotalXS(MGXS): - r"""A total multi-group cross section. + """A total multi-group cross section. This class can be used for both OpenMC input generation and tally data post-processing to compute spatially-homogenized and energy-integrated @@ -1961,9 +2057,9 @@ class TotalXS(MGXS): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -1981,9 +2077,9 @@ class TotalXS(MGXS): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -2043,7 +2139,7 @@ class TotalXS(MGXS): class TransportXS(MGXS): - r"""A transport-corrected total multi-group cross section. + """A transport-corrected total multi-group cross section. This class can be used for both OpenMC input generation and tally data post-processing to compute spatially-homogenized and energy-integrated @@ -2079,9 +2175,9 @@ class TransportXS(MGXS): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -2099,9 +2195,9 @@ class TransportXS(MGXS): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -2186,7 +2282,7 @@ class TransportXS(MGXS): class NuTransportXS(TransportXS): - r"""A transport-corrected total multi-group cross section which + """A transport-corrected total multi-group cross section which accounts for neutron multiplicity in scattering reactions. This class can be used for both OpenMC input generation and tally data @@ -2209,9 +2305,9 @@ class NuTransportXS(TransportXS): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -2229,9 +2325,9 @@ class NuTransportXS(TransportXS): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -2299,7 +2395,7 @@ class NuTransportXS(TransportXS): class AbsorptionXS(MGXS): - r"""An absorption multi-group cross section. + """An absorption multi-group cross section. Absorption is defined as all reactions that do not produce secondary neutrons (disappearance) plus fission reactions. @@ -2330,9 +2426,9 @@ class AbsorptionXS(MGXS): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -2350,9 +2446,9 @@ class AbsorptionXS(MGXS): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -2381,9 +2477,10 @@ class AbsorptionXS(MGXS): is None unless the multi-group cross section has been computed. num_subdomains : int The number of subdomains is unity for 'material', 'cell' and 'universe' - domain types. When the This is equal to the number of cell instances + domain types. This is equal to the number of cell instances for 'distribcell' domain types (it is equal to unity prior to loading - tally data from a statepoint file). + tally data from a statepoint file) and the number of mesh cells for + 'mesh' domain types. num_nuclides : int The number of nuclides for which the multi-group cross section is being tracked. This is unity if the by_nuclide attribute is False. @@ -2412,7 +2509,7 @@ class AbsorptionXS(MGXS): class CaptureXS(MGXS): - r"""A capture multi-group cross section. + """A capture multi-group cross section. The neutron capture reaction rate is defined as the difference between OpenMC's 'absorption' and 'fission' reaction rate score types. This includes @@ -2446,9 +2543,9 @@ class CaptureXS(MGXS): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -2466,9 +2563,9 @@ class CaptureXS(MGXS): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -2568,9 +2665,9 @@ class FissionXS(MGXS): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -2588,9 +2685,9 @@ class FissionXS(MGXS): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -2650,7 +2747,7 @@ class FissionXS(MGXS): class NuFissionXS(MGXS): - r"""A fission neutron production multi-group cross section. + """A fission neutron production multi-group cross section. This class can be used for both OpenMC input generation and tally data post-processing to compute spatially-homogenized and energy-integrated @@ -2679,9 +2776,9 @@ class NuFissionXS(MGXS): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -2699,9 +2796,9 @@ class NuFissionXS(MGXS): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -2761,7 +2858,7 @@ class NuFissionXS(MGXS): class KappaFissionXS(MGXS): - r"""A recoverable fission energy production rate multi-group cross section. + """A recoverable fission energy production rate multi-group cross section. The recoverable energy per fission, :math:`\kappa`, is defined as the fission product kinetic energy, prompt and delayed neutron kinetic energies, @@ -2795,9 +2892,9 @@ class KappaFissionXS(MGXS): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -2815,9 +2912,9 @@ class KappaFissionXS(MGXS): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -2877,7 +2974,7 @@ class KappaFissionXS(MGXS): class ScatterXS(MGXS): - r"""A scattering multi-group cross section. + """A scattering multi-group cross section. The scattering cross section is defined as the difference between the total and absorption cross sections. @@ -2908,9 +3005,9 @@ class ScatterXS(MGXS): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -2928,9 +3025,9 @@ class ScatterXS(MGXS): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -2990,7 +3087,7 @@ class ScatterXS(MGXS): class NuScatterXS(MGXS): - r"""A scattering neutron production multi-group cross section. + """A scattering neutron production multi-group cross section. The neutron production from scattering is defined as the average number of neutrons produced from all neutron-producing reactions except for fission. @@ -3023,9 +3120,9 @@ class NuScatterXS(MGXS): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -3043,9 +3140,9 @@ class NuScatterXS(MGXS): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -3109,7 +3206,7 @@ class NuScatterXS(MGXS): class ScatterMatrixXS(MatrixMGXS): - r"""A scattering matrix multi-group cross section for one or more Legendre + """A scattering matrix multi-group cross section for one or more Legendre moments. This class can be used for both OpenMC input generation and tally data @@ -3153,9 +3250,9 @@ class ScatterMatrixXS(MatrixMGXS): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -3177,9 +3274,9 @@ class ScatterMatrixXS(MatrixMGXS): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -3443,7 +3540,7 @@ class ScatterMatrixXS(MatrixMGXS): subdomains='all', nuclides='all', moment='all', xs_type='macro', order_groups='increasing', row_column='inout', value='mean', **kwargs): - r"""Returns an array of multi-group cross sections. + """Returns an array of multi-group cross sections. This method constructs a 2D NumPy array for the requested scattering matrix data data for one or more energy groups and subdomains. @@ -3508,7 +3605,10 @@ class ScatterMatrixXS(MatrixMGXS): cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=2) for subdomain in subdomains: filters.append(self.domain_type) - filter_bins.append((subdomain,)) + if self.domain_type == 'mesh': + filter_bins.append(subdomain) + else: + filter_bins.append((subdomain,)) # Construct list of energy group bounds tuples for all requested groups if not isinstance(in_groups, basestring): @@ -3692,6 +3792,19 @@ class ScatterMatrixXS(MatrixMGXS): cv.check_iterable_type('subdomains', subdomains, Integral) elif self.domain_type == 'distribcell': subdomains = np.arange(self.num_subdomains, dtype=np.int) + elif self.domain_type == 'mesh': + subdomains = [] + if (len(self.domain.dimension) == 3): + nx, ny, nz = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + for z in range(1,nz+1): + subdomains.append((x, y, z)) + else: + nx, ny = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + subdomains.append((x, y, 1)) else: subdomains = [self.domain.id] @@ -4075,9 +4188,9 @@ class NuFissionMatrixXS(MatrixMGXS): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -4095,9 +4208,9 @@ class NuFissionMatrixXS(MatrixMGXS): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -4158,7 +4271,7 @@ class NuFissionMatrixXS(MatrixMGXS): class Chi(MGXS): - r"""The fission spectrum. + """The fission spectrum. This class can be used for both OpenMC input generation and tally data post-processing to compute spatially-homogenized and energy-integrated @@ -4190,9 +4303,9 @@ class Chi(MGXS): Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} The domain type for spatial homogenization groups : openmc.mgxs.EnergyGroups The energy group structure for energy condensation @@ -4210,9 +4323,9 @@ class Chi(MGXS): Reaction type (e.g., 'total', 'nu-fission', etc.) by_nuclide : bool If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe + domain : Material or Cell or Universe or Mesh Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe'} + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation @@ -4477,7 +4590,10 @@ class Chi(MGXS): cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=2) for subdomain in subdomains: filters.append(self.domain_type) - filter_bins.append((subdomain,)) + if self.domain_type == 'mesh': + filter_bins.append(subdomain) + else: + filter_bins.append((subdomain,)) # Construct list of energy group bounds tuples for all requested groups if not isinstance(groups, basestring): @@ -4614,3 +4730,396 @@ class Chi(MGXS): df['std. dev.'] *= np.tile(densities, tile_factor) return df + + +class ChiDelayed(Chi): + """The delayed fission spectrum. + + This class can be used for both OpenMC input generation and tally data + post-processing to compute spatially-homogenized and energy-integrated + multi-group cross sections for multi-group neutronics calculations. At a + minimum, one needs to set the :attr:`ChiDelayed.energy_groups` and + :attr:`ChiDelayed.domain` properties. Tallies for the flux and appropriate reaction + rates over the specified domain are generated automatically via the + :attr:`ChiDelayed.tallies` property, which can then be appended to a + :class:`openmc.Tallies` instance. + + For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the + necessary data to compute multi-group cross sections from a + :class:`openmc.StatePoint` instance. The derived multi-group cross section + can then be obtained from the :attr:`Chi.xs_tally` property. + + For a spatial domain :math:`V` and energy group :math:`[E_g,E_{g-1}]`, the + fission spectrum is calculated as: + + .. math:: + + \langle \nu\sigma_{f,\rightarrow g} \phi \rangle &= \int_{r \in V} dr + \int_{4\pi} d\Omega' \int_0^\infty dE' \int_{E_g}^{E_{g-1}} dE \; \chi(E) + \nu\sigma_f (r, E') \psi(r, E', \Omega')\\ + \langle \nu\sigma_f \phi \rangle &= \int_{r \in V} dr \int_{4\pi} + d\Omega' \int_0^\infty dE' \int_0^\infty dE \; \chi(E) \nu\sigma_f (r, + E') \psi(r, E', \Omega') \\ + \chi_g &= \frac{\langle \nu\sigma_{f,\rightarrow g} \phi \rangle}{\langle + \nu\sigma_f \phi \rangle} + + Parameters + ---------- + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh + The domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + The domain type for spatial homogenization + groups : openmc.mgxs.EnergyGroups + The energy group structure for energy condensation + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + name : str, optional + Name of the multi-group cross section. Used as a label to identify + tallies in OpenMC 'tallies.xml' file. + + Attributes + ---------- + name : str, optional + Name of the multi-group cross section + rxn_type : str + Reaction type (e.g., 'total', 'nu-fission', etc.) + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + domain : Material or Cell or Universe or Mesh + Domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + Domain type for spatial homogenization + energy_groups : openmc.mgxs.EnergyGroups + Energy group structure for energy condensation + tally_trigger : openmc.Trigger + An (optional) tally precision trigger given to each tally used to + compute the cross section + scores : list of str + The scores in each tally used to compute the multi-group cross section + filters : list of openmc.Filter + The filters in each tally used to compute the multi-group cross section + tally_keys : list of str + The keys into the tallies dictionary for each tally used to compute + the multi-group cross section + estimator : {'tracklength', 'analog'} + The tally estimator used to compute the multi-group cross section + tallies : collections.OrderedDict + OpenMC tallies needed to compute the multi-group cross section. The keys + are strings listed in the :attr:`Chi.tally_keys` property and values are + instances of :class:`openmc.Tally`. + rxn_rate_tally : openmc.Tally + Derived tally for the reaction rate tally used in the numerator to + compute the multi-group cross section. This attribute is None + unless the multi-group cross section has been computed. + xs_tally : openmc.Tally + Derived tally for the multi-group cross section. This attribute + is None unless the multi-group cross section has been computed. + num_subdomains : int + The number of subdomains is unity for 'material', 'cell' and 'universe' + domain types. When the This is equal to the number of cell instances + for 'distribcell' domain types (it is equal to unity prior to loading + tally data from a statepoint file). + num_nuclides : int + The number of nuclides for which the multi-group cross section is + being tracked. This is unity if the by_nuclide attribute is False. + nuclides : Iterable of str or 'sum' + The optional user-specified nuclides for which to compute cross + sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + are not specified by the user, all nuclides in the spatial domain + are included. This attribute is 'sum' if by_nuclide is false. + sparse : bool + Whether or not the MGXS' tallies use SciPy's LIL sparse matrix format + for compressed data storage + loaded_sp : bool + Whether or not a statepoint file has been loaded with tally data + derived : bool + Whether or not the MGXS is merged from one or more other MGXS + hdf5_key : str + The key used to index multi-group cross sections in an HDF5 data store + + """ + + def __init__(self, domain=None, domain_type=None, + groups=None, by_nuclide=False, name=''): + super(ChiDelayed, self).__init__(domain, domain_type, groups, by_nuclide, name) + self._rxn_type = 'chi-delayed' + + @property + def scores(self): + return ['delayed-nu-fission', 'delayed-nu-fission'] + + @property + def tally_keys(self): + return ['delayed-nu-fission-in', 'delayed-nu-fission-out'] + + @property + def rxn_rate_tally(self): + if self._rxn_rate_tally is None: + self._rxn_rate_tally = self.tallies['delayed-nu-fission-out'] + self._rxn_rate_tally.sparse = self.sparse + return self._rxn_rate_tally + + @property + def xs_tally(self): + + if self._xs_tally is None: + nu_fission_in = self.tallies['delayed-nu-fission-in'] + + # Remove coarse energy filter to keep it out of tally arithmetic + energy_filter = nu_fission_in.find_filter('energy') + nu_fission_in.remove_filter(energy_filter) + + # Compute chi + self._xs_tally = self.rxn_rate_tally / nu_fission_in + super(ChiDelayed, self)._compute_xs() + + # Add the coarse energy filter back to the nu-fission tally + nu_fission_in.filters.append(energy_filter) + + return self._xs_tally + + def get_slice(self, nuclides=[], groups=[]): + """Build a sliced Chi for the specified nuclides and energy groups. + + This method constructs a new MGXS to encapsulate a subset of the data + represented by this MGXS. The subset of data to include in the tally + slice is determined by the nuclides and energy groups specified in + the input parameters. + + Parameters + ---------- + nuclides : list of str + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) + groups : list of Integral + A list of energy group indices starting at 1 for the high energies + (e.g., [1, 2, 3]; default is []) + + Returns + ------- + openmc.mgxs.MGXS + A new MGXS which encapsulates the subset of data requested + for the nuclide(s) and/or energy group(s) requested in the + parameters. + + """ + + # Temporarily remove energy filter from nu-fission-in since its + # group structure will work in super MGXS.get_slice(...) method + nu_fission_in = self.tallies['delayed-nu-fission-in'] + energy_filter = nu_fission_in.find_filter('energy') + nu_fission_in.remove_filter(energy_filter) + + # Call super class method and null out derived tallies + slice_xs = super(Chi, self).get_slice(nuclides, groups) + slice_xs._rxn_rate_tally = None + slice_xs._xs_tally = None + + # Slice energy groups if needed + if len(groups) != 0: + filter_bins = [] + for group in groups: + group_bounds = self.energy_groups.get_group_bounds(group) + filter_bins.append(group_bounds) + filter_bins = [tuple(filter_bins)] + + # Slice nu-fission-out tally along energyout filter + nu_fission_out = slice_xs.tallies['delayed-nu-fission-out'] + tally_slice = nu_fission_out.get_slice(filters=['energyout'], + filter_bins=filter_bins) + slice_xs._tallies['delayed-nu-fission-out'] = tally_slice + + # Add energy filter back to nu-fission-in tallies + self.tallies['delayed-nu-fission-in'].add_filter(energy_filter) + slice_xs._tallies['delayed-nu-fission-in'].add_filter(energy_filter) + + slice_xs.sparse = self.sparse + return slice_xs + + def merge(self, other): + """Merge another Chi with this one + + If results have been loaded from a statepoint, then Chi are only + mergeable along one and only one of energy groups or nuclides. + + Parameters + ---------- + other : openmc.mgxs.MGXS + MGXS to merge with this one + + Returns + ------- + merged_mgxs : openmc.mgxs.MGXS + Merged MGXS + """ + + if not self.can_merge(other): + raise ValueError('Unable to merge ChiDelayed') + + # Create deep copy of tally to return as merged tally + merged_mgxs = copy.deepcopy(self) + merged_mgxs._derived = True + merged_mgxs._rxn_rate_tally = None + merged_mgxs._xs_tally = None + + # Merge energy groups + if self.energy_groups != other.energy_groups: + merged_groups = self.energy_groups.merge(other.energy_groups) + merged_mgxs.energy_groups = merged_groups + + # Merge nuclides + if self.nuclides != other.nuclides: + + # The nuclides must be mutually exclusive + for nuclide in self.nuclides: + if nuclide in other.nuclides: + msg = 'Unable to merge Chi Delayed with shared nuclides' + raise ValueError(msg) + + # Concatenate lists of nuclides for the merged MGXS + merged_mgxs.nuclides = self.nuclides + other.nuclides + + # Merge tallies + for tally_key in self.tallies: + merged_tally = self.tallies[tally_key].merge(other.tallies[tally_key]) + merged_mgxs.tallies[tally_key] = merged_tally + + return merged_mgxs + + def get_xs(self, groups='all', subdomains='all', nuclides='all', + xs_type='macro', order_groups='increasing', + value='mean', **kwargs): + """Returns an array of the fission spectrum. + + This method constructs a 2D NumPy array for the requested multi-group + cross section data data for one or more energy groups and subdomains. + + Parameters + ---------- + groups : Iterable of Integral or 'all' + Energy groups of interest. Defaults to 'all'. + subdomains : Iterable of Integral or 'all' + Subdomain IDs of interest. Defaults to 'all'. + nuclides : Iterable of str or 'all' or 'sum' + A list of nuclide name strings (e.g., ['U-235', 'U-238']). The + special string 'all' will return the cross sections for all nuclides + in the spatial domain. The special string 'sum' will return the + cross section summed over all nuclides. Defaults to 'all'. + xs_type: {'macro', 'micro'} + This parameter is not relevant for chi but is included here to + mirror the parent MGXS.get_xs(...) class method + order_groups: {'increasing', 'decreasing'} + Return the cross section indexed according to increasing or + decreasing energy groups (decreasing or increasing energies). + Defaults to 'increasing'. + value : {'mean', 'std_dev', 'rel_err'} + A string for the type of value to return. Defaults to 'mean'. + + Returns + ------- + numpy.ndarray + A NumPy array of the multi-group cross section indexed in the order + each group, subdomain and nuclide is listed in the parameters. + + Raises + ------ + ValueError + When this method is called before the multi-group cross section is + computed from tally data. + + """ + + cv.check_value('value', value, ['mean', 'std_dev', 'rel_err']) + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + + filters = [] + filter_bins = [] + + # Construct a collection of the domain filter bins + if not isinstance(subdomains, basestring): + cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=2) + for subdomain in subdomains: + filters.append(self.domain_type) + if self.domain_type == 'mesh': + filter_bins.append(subdomain) + else: + filter_bins.append((subdomain,)) + + # Construct list of energy group bounds tuples for all requested groups + if not isinstance(groups, basestring): + cv.check_iterable_type('groups', groups, Integral) + for group in groups: + filters.append('energyout') + filter_bins.append((self.energy_groups.get_group_bounds(group),)) + + # If chi was computed for each nuclide in the domain + if self.by_nuclide: + + # Get the sum as the fission source weighted average chi for all + # nuclides in the domain + if nuclides == 'sum' or nuclides == ['sum']: + + # Retrieve the fission production tallies + nu_fission_in = self.tallies['delayed-nu-fission-in'] + nu_fission_out = self.tallies['delayed-nu-fission-out'] + + # Sum out all nuclides + nuclides = self.get_all_nuclides() + nu_fission_in = nu_fission_in.summation(nuclides=nuclides) + nu_fission_out = nu_fission_out.summation(nuclides=nuclides) + + # Remove coarse energy filter to keep it out of tally arithmetic + energy_filter = nu_fission_in.find_filter('energy') + nu_fission_in.remove_filter(energy_filter) + + # Compute chi and store it as the xs_tally attribute so we can + # use the generic get_xs(...) method + xs_tally = nu_fission_out / nu_fission_in + + # Add the coarse energy filter back to the nu-fission tally + nu_fission_in.filters.append(energy_filter) + + xs = xs_tally.get_values(filters=filters, + filter_bins=filter_bins, value=value) + + # Get chi for all nuclides in the domain + elif nuclides == 'all': + nuclides = self.get_all_nuclides() + xs = self.xs_tally.get_values(filters=filters, + filter_bins=filter_bins, + nuclides=nuclides, value=value) + + # Get chi for user-specified nuclides in the domain + else: + cv.check_iterable_type('nuclides', nuclides, basestring) + xs = self.xs_tally.get_values(filters=filters, + filter_bins=filter_bins, + nuclides=nuclides, value=value) + + # If chi was computed as an average of nuclides in the domain + else: + xs = self.xs_tally.get_values(filters=filters, + filter_bins=filter_bins, value=value) + + # Reverse data if user requested increasing energy groups since + # tally data is stored in order of increasing energies + if order_groups == 'increasing': + + # Reshape tally data array with separate axes for domain and energy + if groups == 'all': + num_groups = self.num_groups + else: + num_groups = len(groups) + num_subdomains = int(xs.shape[0] / num_groups) + new_shape = (num_subdomains, num_groups) + xs.shape[1:] + xs = np.reshape(xs, new_shape) + + # Reverse energies to align with increasing energy groups + xs = xs[:, ::-1, :] + + # Eliminate trivial dimensions + xs = np.squeeze(xs) + xs = np.atleast_1d(xs) + + xs = np.nan_to_num(xs) + return xs From b4f056feb58ae9cbad2112696554ac4f3178d2aa Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 1 Jul 2016 11:22:44 -0400 Subject: [PATCH 002/168] added chi-prompt and inverse-velocity mgxs --- openmc/mgxs/mgxs.py | 852 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 771 insertions(+), 81 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index fd6d0ee494..acc240e045 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -38,8 +38,7 @@ MGXS_TYPES = ['total', 'chi', 'chi-delayed', 'chi-prompt', - 'velocity'] - + 'inverse-velocity'] # Supported domain types # TODO: Implement Mesh domains @@ -497,10 +496,10 @@ class MGXS(object): mgxs = NuFissionMatrixXS(domain, domain_type, energy_groups) elif mgxs_type == 'chi': mgxs = Chi(domain, domain_type, energy_groups) - elif mgxs_type == 'chi-prompt': - mgxs = ChiPrompt(domain, domain_type, energy_groups) elif mgxs_type == 'chi-delayed': mgxs = ChiDelayed(domain, domain_type, energy_groups) + elif mgxs_type == 'chi-prompt': + mgxs = ChiPrompt(domain, domain_type, energy_groups) elif mgxs_type == 'velocity': mgxs = Velocity(domain, domain_type, energy_groups) @@ -794,10 +793,7 @@ class MGXS(object): cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=3) for subdomain in subdomains: filters.append(self.domain_type) - if self.domain_type == 'mesh': - filter_bins.append(subdomain) - else: - filter_bins.append((subdomain,)) + filter_bins.append((subdomain,)) # Construct list of energy group bounds tuples for all requested groups if not isinstance(groups, basestring): @@ -1168,19 +1164,18 @@ class MGXS(object): elif self.domain_type == 'distribcell': subdomains = np.arange(self.num_subdomains, dtype=np.int) elif self.domain_type == 'mesh': - subdomains_list = [] + subdomains = [] if (len(self.domain.dimension) == 3): nx, ny, nz = self.domain.dimension for x in range(1,nx+1): for y in range(1,ny+1): for z in range(1,nz+1): - subdomains_list.append((x, y, z)) + subdomains.append((x, y, z)) else: nx, ny = self.domain.dimension for x in range(1,nx+1): for y in range(1,ny+1): - subdomains_list.append((x, y, 1)) - subdomains = [tuple(subdomains_list)] + subdomains.append((x, y, 1)) else: subdomains = [self.domain.id] @@ -1318,20 +1313,18 @@ class MGXS(object): domain_filter = self.xs_tally.find_filter('avg(distribcell)') subdomains = domain_filter.bins elif self.domain_type == 'mesh': - bins = [] + subdomains = [] if (len(self.domain.dimension) == 3): nx, ny, nz = self.domain.dimension for x in range(1,nx+1): for y in range(1,ny+1): for z in range(1,nz+1): - bins.append((x, y, z)) + subdomains.append((x, y, z)) else: nx, ny = self.domain.dimension for x in range(1,nx+1): for y in range(1,ny+1): - bins.append((x, y, 1)) - - subdomains = [tuple(bins)] + subdomains.append((x, y, 1)) else: subdomains = [self.domain.id] @@ -1770,13 +1763,10 @@ class MatrixMGXS(MGXS): # Construct a collection of the domain filter bins if not isinstance(subdomains, basestring): cv.check_iterable_type('subdomains', subdomains, Integral, - max_depth=2) + max_depth=3) for subdomain in subdomains: filters.append(self.domain_type) - if self.domain_type == 'mesh': - filter_bins.append(subdomain) - else: - filter_bins.append((subdomain,)) + filter_bins.append((subdomain,)) # Construct list of energy group bounds tuples for all requested groups if not isinstance(in_groups, basestring): @@ -3602,13 +3592,10 @@ class ScatterMatrixXS(MatrixMGXS): # Construct a collection of the domain filter bins if not isinstance(subdomains, basestring): - cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=2) + cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=3) for subdomain in subdomains: filters.append(self.domain_type) - if self.domain_type == 'mesh': - filter_bins.append(subdomain) - else: - filter_bins.append((subdomain,)) + filter_bins.append((subdomain,)) # Construct list of energy group bounds tuples for all requested groups if not isinstance(in_groups, basestring): @@ -4587,13 +4574,10 @@ class Chi(MGXS): # Construct a collection of the domain filter bins if not isinstance(subdomains, basestring): - cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=2) + cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=3) for subdomain in subdomains: filters.append(self.domain_type) - if self.domain_type == 'mesh': - filter_bins.append(subdomain) - else: - filter_bins.append((subdomain,)) + filter_bins.append((subdomain,)) # Construct list of energy group bounds tuples for all requested groups if not isinstance(groups, basestring): @@ -4739,15 +4723,592 @@ class ChiDelayed(Chi): post-processing to compute spatially-homogenized and energy-integrated multi-group cross sections for multi-group neutronics calculations. At a minimum, one needs to set the :attr:`ChiDelayed.energy_groups` and - :attr:`ChiDelayed.domain` properties. Tallies for the flux and appropriate reaction - rates over the specified domain are generated automatically via the + :attr:`ChiDelayed.domain` properties. Tallies for the flux and appropriate + reaction rates over the specified domain are generated automatically via the :attr:`ChiDelayed.tallies` property, which can then be appended to a :class:`openmc.Tallies` instance. For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the necessary data to compute multi-group cross sections from a :class:`openmc.StatePoint` instance. The derived multi-group cross section - can then be obtained from the :attr:`Chi.xs_tally` property. + can then be obtained from the :attr:`ChiDelayed.xs_tally` property. + + For a spatial domain :math:`V` and energy group :math:`[E_g,E_{g-1}]`, the + fission spectrum is calculated as: + + .. math:: + + \langle \nu\sigma_{f,\rightarrow g} \phi \rangle &= \int_{r \in V} dr + \int_{4\pi} d\Omega' \int_0^\infty dE' \int_{E_g}^{E_{g-1}} dE \; \chi(E) + \nu\sigma_f (r, E') \psi(r, E', \Omega')\\ + \langle \nu\sigma_f \phi \rangle &= \int_{r \in V} dr \int_{4\pi} + d\Omega' \int_0^\infty dE' \int_0^\infty dE \; \chi(E) \nu\sigma_f (r, + E') \psi(r, E', \Omega') \\ + \chi_g &= \frac{\langle \nu\sigma_{f,\rightarrow g} \phi \rangle}{\langle + \nu\sigma_f \phi \rangle} + + Parameters + ---------- + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh + The domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + The domain type for spatial homogenization + groups : openmc.mgxs.EnergyGroups + The energy group structure for energy condensation + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + name : str, optional + Name of the multi-group cross section. Used as a label to identify + tallies in OpenMC 'tallies.xml' file. + + Attributes + ---------- + name : str, optional + Name of the multi-group cross section + rxn_type : str + Reaction type (e.g., 'total', 'nu-fission', etc.) + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + domain : Material or Cell or Universe or Mesh + Domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + Domain type for spatial homogenization + energy_groups : openmc.mgxs.EnergyGroups + Energy group structure for energy condensation + delayed_groups : list of int + Delayed groups to filter out the xs + tally_trigger : openmc.Trigger + An (optional) tally precision trigger given to each tally used to + compute the cross section + scores : list of str + The scores in each tally used to compute the multi-group cross section + filters : list of openmc.Filter + The filters in each tally used to compute the multi-group cross section + tally_keys : list of str + The keys into the tallies dictionary for each tally used to compute + the multi-group cross section + estimator : {'tracklength', 'analog'} + The tally estimator used to compute the multi-group cross section + tallies : collections.OrderedDict + OpenMC tallies needed to compute the multi-group cross section. The keys + are strings listed in the :attr:`ChiDelayed.tally_keys` property and + values are instances of :class:`openmc.Tally`. + rxn_rate_tally : openmc.Tally + Derived tally for the reaction rate tally used in the numerator to + compute the multi-group cross section. This attribute is None + unless the multi-group cross section has been computed. + xs_tally : openmc.Tally + Derived tally for the multi-group cross section. This attribute + is None unless the multi-group cross section has been computed. + num_subdomains : int + The number of subdomains is unity for 'material', 'cell' and 'universe' + domain types. When the This is equal to the number of cell instances + for 'distribcell' domain types (it is equal to unity prior to loading + tally data from a statepoint file). + num_nuclides : int + The number of nuclides for which the multi-group cross section is + being tracked. This is unity if the by_nuclide attribute is False. + nuclides : Iterable of str or 'sum' + The optional user-specified nuclides for which to compute cross + sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + are not specified by the user, all nuclides in the spatial domain + are included. This attribute is 'sum' if by_nuclide is false. + sparse : bool + Whether or not the MGXS' tallies use SciPy's LIL sparse matrix format + for compressed data storage + loaded_sp : bool + Whether or not a statepoint file has been loaded with tally data + derived : bool + Whether or not the MGXS is merged from one or more other MGXS + hdf5_key : str + The key used to index multi-group cross sections in an HDF5 data store + + """ + + def __init__(self, domain=None, domain_type=None, + groups=None, by_nuclide=False, name='', delayed_groups=None): + super(ChiDelayed, self).__init__(domain, domain_type, groups, by_nuclide, name) + self._rxn_type = 'chi-delayed' + self._delayed_groups = None + + if delayed_groups is not None: + self.delayed_groups = delayed_groups + + @property + def delayed_groups(self): + return self._delayed_groups + + @property + def num_delayed_groups(self): + if self._delayed_groups != None: + return len(self.delayed_groups) + else: + return 0 + + @delayed_groups.setter + def delayed_groups(self, delayed_groups): + cv.check_iterable_type('delayed groups', delayed_groups, int) + self._delayed_groups = delayed_groups + + @property + def filters(self): + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energyout = openmc.Filter('energyout', group_edges) + energyin = openmc.Filter('energy', [group_edges[0], group_edges[-1]]) + if self.delayed_groups != None: + delayed_group_filter = openmc.Filter('delayedgroup', self.delayed_groups) + return [[delayed_group_filter, energyin], [delayed_group_filter, energyout]] + else: + return [[energyin], [energyout]] + + @property + def scores(self): + return ['delayed-nu-fission', 'delayed-nu-fission'] + + @property + def tally_keys(self): + return ['delayed-nu-fission-in', 'delayed-nu-fission-out'] + + @property + def rxn_rate_tally(self): + if self._rxn_rate_tally is None: + self._rxn_rate_tally = self.tallies['delayed-nu-fission-out'] + self._rxn_rate_tally.sparse = self.sparse + return self._rxn_rate_tally + + @property + def xs_tally(self): + + if self._xs_tally is None: + delayed_nu_fission_in = self.tallies['delayed-nu-fission-in'] + + # Remove coarse energy filter to keep it out of tally arithmetic + energy_filter = delayed_nu_fission_in.find_filter('energy') + delayed_nu_fission_in.remove_filter(energy_filter) + + # Compute chi + self._xs_tally = self.rxn_rate_tally / delayed_nu_fission_in + super(ChiDelayed, self)._compute_xs() + + # Add the coarse energy filter back to the nu-fission tally + delayed_nu_fission_in.filters.append(energy_filter) + + return self._xs_tally + + def get_slice(self, nuclides=[], groups=[]): + """Build a sliced ChiDelayed for the specified nuclides and energy + groups. + + This method constructs a new MGXS to encapsulate a subset of the data + represented by this MGXS. The subset of data to include in the tally + slice is determined by the nuclides and energy groups specified in + the input parameters. + + Parameters + ---------- + nuclides : list of str + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) + groups : list of Integral + A list of energy group indices starting at 1 for the high energies + (e.g., [1, 2, 3]; default is []) + + Returns + ------- + openmc.mgxs.MGXS + A new MGXS which encapsulates the subset of data requested + for the nuclide(s) and/or energy group(s) requested in the + parameters. + + """ + + # Temporarily remove energy filter from delayed-nu-fission-in since its + # group structure will work in super MGXS.get_slice(...) method + delayed_nu_fission_in = self.tallies['delayed-nu-fission-in'] + energy_filter = delayed_nu_fission_in.find_filter('energy') + delayed_nu_fission_in.remove_filter(energy_filter) + + # Call super class method and null out derived tallies + slice_xs = super(ChiDelayed, self).get_slice(nuclides, groups) + slice_xs._rxn_rate_tally = None + slice_xs._xs_tally = None + + # Slice energy groups if needed + if len(groups) != 0: + filter_bins = [] + for group in groups: + group_bounds = self.energy_groups.get_group_bounds(group) + filter_bins.append(group_bounds) + filter_bins = [tuple(filter_bins)] + + # Slice nu-fission-out tally along energyout filter + delayed_nu_fission_out = slice_xs.tallies['delayed-nu-fission-out'] + tally_slice = delayed_nu_fission_out.get_slice(filters=['energyout'], + filter_bins=filter_bins) + slice_xs._tallies['delayed-nu-fission-out'] = tally_slice + + # Add energy filter back to nu-fission-in tallies + self.tallies['delayed-nu-fission-in'].add_filter(energy_filter) + slice_xs._tallies['delayed-nu-fission-in'].add_filter(energy_filter) + + slice_xs.sparse = self.sparse + return slice_xs + + def merge(self, other): + """Merge another ChiDelayed with this one + + If results have been loaded from a statepoint, then ChiDelayed are only + mergeable along one and only one of energy groups or nuclides. + + Parameters + ---------- + other : openmc.mgxs.MGXS + MGXS to merge with this one + + Returns + ------- + merged_mgxs : openmc.mgxs.MGXS + Merged MGXS + """ + + if not self.can_merge(other): + raise ValueError('Unable to merge ChiDelayed') + + # Create deep copy of tally to return as merged tally + merged_mgxs = copy.deepcopy(self) + merged_mgxs._derived = True + merged_mgxs._rxn_rate_tally = None + merged_mgxs._xs_tally = None + + # Merge energy groups + if self.energy_groups != other.energy_groups: + merged_groups = self.energy_groups.merge(other.energy_groups) + merged_mgxs.energy_groups = merged_groups + + # Merge nuclides + if self.nuclides != other.nuclides: + + # The nuclides must be mutually exclusive + for nuclide in self.nuclides: + if nuclide in other.nuclides: + msg = 'Unable to merge Chi Delayed with shared nuclides' + raise ValueError(msg) + + # Concatenate lists of nuclides for the merged MGXS + merged_mgxs.nuclides = self.nuclides + other.nuclides + + # Merge tallies + for tally_key in self.tallies: + merged_tally = self.tallies[tally_key].merge(other.tallies[tally_key]) + merged_mgxs.tallies[tally_key] = merged_tally + + return merged_mgxs + + def print_xs(self, subdomains='all', nuclides='all', xs_type='macro'): + """Prints a string representation for the multi-group cross section. + + Parameters + ---------- + subdomains : Iterable of Integral or 'all' + The subdomain IDs of the cross sections to include in the report. + Defaults to 'all'. + nuclides : Iterable of str or 'all' or 'sum' + The nuclides of the cross-sections to include in the report. This + may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + The special string 'all' will report the cross sections for all + nuclides in the spatial domain. The special string 'sum' will + report the cross sections summed over all nuclides. Defaults to + 'all'. + xs_type: {'macro', 'micro'} + Return the macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. + + """ + + # Construct a collection of the subdomains to report + if not isinstance(subdomains, basestring): + cv.check_iterable_type('subdomains', subdomains, Integral) + elif self.domain_type == 'distribcell': + subdomains = np.arange(self.num_subdomains, dtype=np.int) + elif self.domain_type == 'mesh': + subdomains = [] + if (len(self.domain.dimension) == 3): + nx, ny, nz = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + for z in range(1,nz+1): + subdomains.append((x, y, z)) + else: + nx, ny = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + subdomains.append((x, y, 1)) + else: + subdomains = [self.domain.id] + + # Construct a collection of the nuclides to report + if self.by_nuclide: + if nuclides == 'all': + nuclides = self.get_all_nuclides() + if nuclides == 'sum': + nuclides = ['sum'] + else: + cv.check_iterable_type('nuclides', nuclides, basestring) + else: + nuclides = ['sum'] + + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + + # Build header for string with type and domain info + string = 'Multi-Group XS\n' + string += '{0: <16}=\t{1}\n'.format('\tReaction Type', self.rxn_type) + string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type) + string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id) + + # If cross section data has not been computed, only print string header + if self.tallies is None: + print(string) + return + + string += '{0: <16}\n'.format('\tEnergy Groups:') + template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]\n' + + # Loop over energy groups ranges + for group in range(1, self.num_groups + 1): + bounds = self.energy_groups.get_group_bounds(group) + string += template.format('', group, bounds[0], bounds[1]) + + # Loop over all subdomains + for subdomain in subdomains: + + if self.domain_type == 'distribcell': + string += \ + '{0: <16}=\t{1}\n'.format('\tSubdomain', subdomain) + + # Loop over all Nuclides + for nuclide in nuclides: + + # Build header for nuclide type + if xs_type != 'sum': + string += '{0: <16}=\t{1}\n'.format('\tNuclide', nuclide) + + # Build header for cross section type + if xs_type == 'macro': + string += '{0: <16}\n'.format('\tCross Sections [cm^-1]:') + else: + string += '{0: <16}\n'.format('\tCross Sections [barns]:') + + if self.delayed_groups != None: + + for delayed_group in range(1, self.num_delayed_groups+1): + + template = '{0: <12}Delayed Group {1}:\t' + string += template.format('', delayed_group) + string += '\n' + + template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]:\t' + + # Loop over energy groups ranges + for group in range(1, self.num_groups+1): + bounds = self.energy_groups.get_group_bounds(group) + string += template.format('', group, bounds[0], bounds[1]) + average = self.get_xs([group], [subdomain], [nuclide], + xs_type=xs_type, value='mean', + delayed_groups=[delayed_group]) + rel_err = self.get_xs([group], [subdomain], [nuclide], + xs_type=xs_type, value='rel_err', + delayed_groups=[delayed_group]) + average = average.flatten()[0] + rel_err = rel_err.flatten()[0] * 100. + string += '{:.2e} +/- {:1.2e}%'.format(average, rel_err) + string += '\n' + string += '\n' + string += '\n' + + else: + + template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]:\t' + + # Loop over energy groups ranges + for group in range(1, self.num_groups+1): + bounds = self.energy_groups.get_group_bounds(group) + string += template.format('', group, bounds[0], bounds[1]) + average = self.get_xs([group], [subdomain], [nuclide], + xs_type=xs_type, value='mean') + rel_err = self.get_xs([group], [subdomain], [nuclide], + xs_type=xs_type, value='rel_err') + average = average.flatten()[0] + rel_err = rel_err.flatten()[0] * 100. + string += '{:.2e} +/- {:1.2e}%'.format(average, rel_err) + string += '\n' + string += '\n' + string += '\n' + + + print(string) + + def get_xs(self, groups='all', subdomains='all', nuclides='all', + xs_type='macro', order_groups='increasing', + value='mean', delayed_groups='all', **kwargs): + """Returns an array of the fission spectrum. + + This method constructs a 2D NumPy array for the requested multi-group + cross section data data for one or more energy groups and subdomains. + + Parameters + ---------- + groups : Iterable of Integral or 'all' + Energy groups of interest. Defaults to 'all'. + delayed_groups : Iterable of Integral or 'all' + Delayed groups of interest. Defaults to 'all'. + subdomains : Iterable of Integral or 'all' + Subdomain IDs of interest. Defaults to 'all'. + nuclides : Iterable of str or 'all' or 'sum' + A list of nuclide name strings (e.g., ['U-235', 'U-238']). The + special string 'all' will return the cross sections for all nuclides + in the spatial domain. The special string 'sum' will return the + cross section summed over all nuclides. Defaults to 'all'. + xs_type: {'macro', 'micro'} + This parameter is not relevant for chi but is included here to + mirror the parent MGXS.get_xs(...) class method + order_groups: {'increasing', 'decreasing'} + Return the cross section indexed according to increasing or + decreasing energy groups (decreasing or increasing energies). + Defaults to 'increasing'. + value : {'mean', 'std_dev', 'rel_err'} + A string for the type of value to return. Defaults to 'mean'. + + Returns + ------- + numpy.ndarray + A NumPy array of the multi-group cross section indexed in the order + each group, subdomain and nuclide is listed in the parameters. + + Raises + ------ + ValueError + When this method is called before the multi-group cross section is + computed from tally data. + + """ + + cv.check_value('value', value, ['mean', 'std_dev', 'rel_err']) + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + + filters = [] + filter_bins = [] + + # Construct a collection of the domain filter bins + if not isinstance(subdomains, basestring): + cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=3) + for subdomain in subdomains: + filters.append(self.domain_type) + filter_bins.append((subdomain,)) + + # Construct list of energy group bounds tuples for all requested groups + if not isinstance(groups, basestring): + cv.check_iterable_type('groups', groups, Integral) + for group in groups: + filters.append('energyout') + filter_bins.append((self.energy_groups.get_group_bounds(group),)) + + # Construct list of delayed group tuples for all requested groups + if not isinstance(delayed_groups, basestring): + cv.check_iterable_type('delayed_groups', delayed_groups, Integral) + for delayed_group in delayed_groups: + filters.append('delayedgroups') + filter_bins.append((delayed_group,)) + + # If chi delayed was computed for each nuclide in the domain + if self.by_nuclide: + + # Get the sum as the fission source weighted average chi for all + # nuclides in the domain + if nuclides == 'sum' or nuclides == ['sum']: + + # Retrieve the fission production tallies + delayed_nu_fission_in = self.tallies['delayed-nu-fission-in'] + delayed_nu_fission_out = self.tallies['delayed-nu-fission-out'] + + # Sum out all nuclides + nuclides = self.get_all_nuclides() + delayed_nu_fission_in = delayed_nu_fission_in.summation(nuclides=nuclides) + delayed_nu_fission_out = delayed_nu_fission_out.summation(nuclides=nuclides) + + # Remove coarse energy filter to keep it out of tally arithmetic + energy_filter = delayed_nu_fission_in.find_filter('energy') + delayed_nu_fission_in.remove_filter(energy_filter) + + # Compute chi and store it as the xs_tally attribute so we can + # use the generic get_xs(...) method + xs_tally = delayed_nu_fission_out / delayed_nu_fission_in + + # Add the coarse energy filter back to the nu-fission tally + delayed_nu_fission_in.filters.append(energy_filter) + + xs = xs_tally.get_values(filters=filters, + filter_bins=filter_bins, value=value) + + # Get chi delayed for all nuclides in the domain + elif nuclides == 'all': + nuclides = self.get_all_nuclides() + xs = self.xs_tally.get_values(filters=filters, + filter_bins=filter_bins, + nuclides=nuclides, value=value) + + # Get chi delayed for user-specified nuclides in the domain + else: + cv.check_iterable_type('nuclides', nuclides, basestring) + xs = self.xs_tally.get_values(filters=filters, + filter_bins=filter_bins, + nuclides=nuclides, value=value) + + # If chi delayed was computed as an average of nuclides in the domain + else: + xs = self.xs_tally.get_values(filters=filters, + filter_bins=filter_bins, value=value) + + # Reverse data if user requested increasing energy groups since + # tally data is stored in order of increasing energies + if order_groups == 'increasing': + + # Reshape tally data array with separate axes for domain and energy + if groups == 'all': + num_groups = self.num_groups + else: + num_groups = len(groups) + num_subdomains = int(xs.shape[0] / num_groups) + new_shape = (num_subdomains, num_groups) + xs.shape[1:] + xs = np.reshape(xs, new_shape) + + # Reverse energies to align with increasing energy groups + xs = xs[:, ::-1, :] + + # Eliminate trivial dimensions + xs = np.squeeze(xs) + xs = np.atleast_1d(xs) + + xs = np.nan_to_num(xs) + return xs + + +class ChiPrompt(Chi): + """The prompt fission spectrum. + + This class can be used for both OpenMC input generation and tally data + post-processing to compute spatially-homogenized and energy-integrated + multi-group cross sections for multi-group neutronics calculations. At a + minimum, one needs to set the :attr:`ChiPrompt.energy_groups` and + :attr:`ChiPrompt.domain` properties. Tallies for the flux and appropriate + reaction rates over the specified domain are generated automatically via the + :attr:`ChiPrompt.tallies` property, which can then be appended to a + :class:`openmc.Tallies` instance. + + For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the + necessary data to compute multi-group cross sections from a + :class:`openmc.StatePoint` instance. The derived multi-group cross section + can then be obtained from the :attr:`ChiPrompt.xs_tally` property. For a spatial domain :math:`V` and energy group :math:`[E_g,E_{g-1}]`, the fission spectrum is calculated as: @@ -4805,8 +5366,8 @@ class ChiDelayed(Chi): The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys - are strings listed in the :attr:`Chi.tally_keys` property and values are - instances of :class:`openmc.Tally`. + are strings listed in the :attr:`ChiPrompt.tally_keys` property and + values are instances of :class:`openmc.Tally`. rxn_rate_tally : openmc.Tally Derived tally for the reaction rate tally used in the numerator to compute the multi-group cross section. This attribute is None @@ -4841,21 +5402,32 @@ class ChiDelayed(Chi): def __init__(self, domain=None, domain_type=None, groups=None, by_nuclide=False, name=''): - super(ChiDelayed, self).__init__(domain, domain_type, groups, by_nuclide, name) - self._rxn_type = 'chi-delayed' + super(ChiPrompt, self).__init__(domain, domain_type, groups, by_nuclide, name) + self._rxn_type = 'chi-prompt' @property def scores(self): - return ['delayed-nu-fission', 'delayed-nu-fission'] + return ['delayed-nu-fission', 'delayed-nu-fission', + 'nu-fission', 'nu-fission'] + + @property + def filters(self): + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energyout = openmc.Filter('energyout', group_edges) + energyin = openmc.Filter('energy', [group_edges[0], group_edges[-1]]) + return [[energyin], [energyout], [energyin], [energyout]] @property def tally_keys(self): - return ['delayed-nu-fission-in', 'delayed-nu-fission-out'] + return ['delayed-nu-fission-in', 'delayed-nu-fission-out', + 'nu-fission-in', 'nu-fission-out'] @property def rxn_rate_tally(self): if self._rxn_rate_tally is None: - self._rxn_rate_tally = self.tallies['delayed-nu-fission-out'] + self._rxn_rate_tally = self.tallies['nu-fission-out'] - \ + self.tallies['delayed-nu-fission-out'] self._rxn_rate_tally.sparse = self.sparse return self._rxn_rate_tally @@ -4863,23 +5435,26 @@ class ChiDelayed(Chi): def xs_tally(self): if self._xs_tally is None: - nu_fission_in = self.tallies['delayed-nu-fission-in'] + delayed_nu_fission_in = self.tallies['delayed-nu-fission-in'] + nu_fission_in = self.tallies['nu-fission-in'] + prompt_nu_fission_in = nu_fission_in - delayed_nu_fission_in # Remove coarse energy filter to keep it out of tally arithmetic - energy_filter = nu_fission_in.find_filter('energy') - nu_fission_in.remove_filter(energy_filter) + energy_filter = prompt_nu_fission_in.find_filter('energy') + prompt_nu_fission_in.remove_filter(energy_filter) # Compute chi - self._xs_tally = self.rxn_rate_tally / nu_fission_in - super(ChiDelayed, self)._compute_xs() + self._xs_tally = self.rxn_rate_tally / prompt_nu_fission_in + super(ChiPrompt, self)._compute_xs() # Add the coarse energy filter back to the nu-fission tally - nu_fission_in.filters.append(energy_filter) + prompt_nu_fission_in.filters.append(energy_filter) return self._xs_tally def get_slice(self, nuclides=[], groups=[]): - """Build a sliced Chi for the specified nuclides and energy groups. + """Build a sliced ChiDelayed for the specified nuclides and energy + groups. This method constructs a new MGXS to encapsulate a subset of the data represented by this MGXS. The subset of data to include in the tally @@ -4904,14 +5479,16 @@ class ChiDelayed(Chi): """ - # Temporarily remove energy filter from nu-fission-in since its + # Temporarily remove energy filter from delayed-nu-fission-in since its # group structure will work in super MGXS.get_slice(...) method - nu_fission_in = self.tallies['delayed-nu-fission-in'] - energy_filter = nu_fission_in.find_filter('energy') - nu_fission_in.remove_filter(energy_filter) + delayed_nu_fission_in = self.tallies['delayed-nu-fission-in'] + nu_fission_in = self.tallies['nu-fission-in'] + prompt_nu_fission_in = nu_fission_in - delayed_nu_fission_in + energy_filter = prompt_nu_fission_in.find_filter('energy') + prompt_nu_fission_in.remove_filter(energy_filter) # Call super class method and null out derived tallies - slice_xs = super(Chi, self).get_slice(nuclides, groups) + slice_xs = super(ChiPrompt, self).get_slice(nuclides, groups) slice_xs._rxn_rate_tally = None slice_xs._xs_tally = None @@ -4924,22 +5501,22 @@ class ChiDelayed(Chi): filter_bins = [tuple(filter_bins)] # Slice nu-fission-out tally along energyout filter - nu_fission_out = slice_xs.tallies['delayed-nu-fission-out'] - tally_slice = nu_fission_out.get_slice(filters=['energyout'], - filter_bins=filter_bins) - slice_xs._tallies['delayed-nu-fission-out'] = tally_slice + prompt_nu_fission_out = slice_xs.tallies['nu-fission-out'] - \ + slice_xs.tallies['delayed-nu-fission-out'] + tally_slice = prompt_nu_fission_out.get_slice(filters=['energyout'], + filter_bins=filter_bins) + slice_xs._tallies['prompt-nu-fission-out'] = tally_slice # Add energy filter back to nu-fission-in tallies - self.tallies['delayed-nu-fission-in'].add_filter(energy_filter) - slice_xs._tallies['delayed-nu-fission-in'].add_filter(energy_filter) + slice_xs._tallies['prompt-nu-fission-in'].add_filter(energy_filter) slice_xs.sparse = self.sparse return slice_xs def merge(self, other): - """Merge another Chi with this one + """Merge another ChiPrompt with this one - If results have been loaded from a statepoint, then Chi are only + If results have been loaded from a statepoint, then ChiPrompt are only mergeable along one and only one of energy groups or nuclides. Parameters @@ -4954,7 +5531,7 @@ class ChiDelayed(Chi): """ if not self.can_merge(other): - raise ValueError('Unable to merge ChiDelayed') + raise ValueError('Unable to merge ChiPrompt') # Create deep copy of tally to return as merged tally merged_mgxs = copy.deepcopy(self) @@ -4973,7 +5550,7 @@ class ChiDelayed(Chi): # The nuclides must be mutually exclusive for nuclide in self.nuclides: if nuclide in other.nuclides: - msg = 'Unable to merge Chi Delayed with shared nuclides' + msg = 'Unable to merge Chi Prompt with shared nuclides' raise ValueError(msg) # Concatenate lists of nuclides for the merged MGXS @@ -5037,13 +5614,10 @@ class ChiDelayed(Chi): # Construct a collection of the domain filter bins if not isinstance(subdomains, basestring): - cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=2) + cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=3) for subdomain in subdomains: filters.append(self.domain_type) - if self.domain_type == 'mesh': - filter_bins.append(subdomain) - else: - filter_bins.append((subdomain,)) + filter_bins.append((subdomain,)) # Construct list of energy group bounds tuples for all requested groups if not isinstance(groups, basestring): @@ -5052,7 +5626,7 @@ class ChiDelayed(Chi): filters.append('energyout') filter_bins.append((self.energy_groups.get_group_bounds(group),)) - # If chi was computed for each nuclide in the domain + # If chi delayed was computed for each nuclide in the domain if self.by_nuclide: # Get the sum as the fission source weighted average chi for all @@ -5060,43 +5634,45 @@ class ChiDelayed(Chi): if nuclides == 'sum' or nuclides == ['sum']: # Retrieve the fission production tallies - nu_fission_in = self.tallies['delayed-nu-fission-in'] - nu_fission_out = self.tallies['delayed-nu-fission-out'] + prompt_nu_fission_in = self.tallies['nu-fission-in'] - \ + self.tallies['delayed-nu-fission-in'] + prompt_nu_fission_out = self.tallies['nu-fission-out'] - \ + self.tallies['delayed-nu-fission-out'] # Sum out all nuclides nuclides = self.get_all_nuclides() - nu_fission_in = nu_fission_in.summation(nuclides=nuclides) - nu_fission_out = nu_fission_out.summation(nuclides=nuclides) + prompt_nu_fission_in = prompt_nu_fission_in.summation(nuclides=nuclides) + prompt_nu_fission_out = prompt_nu_fission_out.summation(nuclides=nuclides) # Remove coarse energy filter to keep it out of tally arithmetic - energy_filter = nu_fission_in.find_filter('energy') - nu_fission_in.remove_filter(energy_filter) + energy_filter = prompt_nu_fission_in.find_filter('energy') + prompt_nu_fission_in.remove_filter(energy_filter) # Compute chi and store it as the xs_tally attribute so we can # use the generic get_xs(...) method - xs_tally = nu_fission_out / nu_fission_in + xs_tally = prompt_nu_fission_out / prompt_nu_fission_in # Add the coarse energy filter back to the nu-fission tally - nu_fission_in.filters.append(energy_filter) + prompt_nu_fission_in.filters.append(energy_filter) xs = xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) - # Get chi for all nuclides in the domain + # Get chi delayed for all nuclides in the domain elif nuclides == 'all': nuclides = self.get_all_nuclides() xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, nuclides=nuclides, value=value) - # Get chi for user-specified nuclides in the domain + # Get chi prompt for user-specified nuclides in the domain else: cv.check_iterable_type('nuclides', nuclides, basestring) xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, nuclides=nuclides, value=value) - # If chi was computed as an average of nuclides in the domain + # If chi prompt was computed as an average of nuclides in the domain else: xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) @@ -5123,3 +5699,117 @@ class ChiDelayed(Chi): xs = np.nan_to_num(xs) return xs + + +class InverseVelocity(MGXS): + """An inverse velocity multi-group cross section. + + Absorption is defined as all reactions that do not produce secondary + neutrons (disappearance) plus fission reactions. + + This class can be used for both OpenMC input generation and tally data + post-processing to compute spatially-homogenized and energy-integrated + multi-group absorption cross sections for multi-group neutronics + calculations. At a minimum, one needs to set the + :attr:`AbsorptionXS.energy_groups` and :attr:`AbsorptionXS.domain` + properties. Tallies for the flux and appropriate reaction rates over the + specified domain are generated automatically via the + :attr:`AbsorptionXS.tallies` property, which can then be appended to a + :class:`openmc.Tallies` instance. + + For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the + necessary data to compute multi-group cross sections from a + :class:`openmc.StatePoint` instance. The derived multi-group cross section + can then be obtained from the :attr:`AbsorptionXS.xs_tally` property. + + For a spatial domain :math:`V` and energy group :math:`[E_g,E_{g-1}]`, the + absorption cross section is calculated as: + + .. math:: + + \frac{\int_{r \in V} dr \int_{4\pi} d\Omega \int_{E_g}^{E_{g-1}} dE \; + \sigma_a (r, E) \psi (r, E, \Omega)}{\int_{r \in V} dr \int_{4\pi} + d\Omega \int_{E_g}^{E_{g-1}} dE \; \psi (r, E, \Omega)}. + + Parameters + ---------- + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh + The domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + The domain type for spatial homogenization + groups : openmc.mgxs.EnergyGroups + The energy group structure for energy condensation + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + name : str, optional + Name of the multi-group cross section. Used as a label to identify + tallies in OpenMC 'tallies.xml' file. + + Attributes + ---------- + name : str, optional + Name of the multi-group cross section + rxn_type : str + Reaction type (e.g., 'total', 'nu-fission', etc.) + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + domain : Material or Cell or Universe or Mesh + Domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + Domain type for spatial homogenization + energy_groups : openmc.mgxs.EnergyGroups + Energy group structure for energy condensation + tally_trigger : openmc.Trigger + An (optional) tally precision trigger given to each tally used to + compute the cross section + scores : list of str + The scores in each tally used to compute the multi-group cross section + filters : list of openmc.Filter + The filters in each tally used to compute the multi-group cross section + tally_keys : list of str + The keys into the tallies dictionary for each tally used to compute + the multi-group cross section + estimator : {'tracklength', 'analog'} + The tally estimator used to compute the multi-group cross section + tallies : collections.OrderedDict + OpenMC tallies needed to compute the multi-group cross section. The keys + are strings listed in the :attr:`AbsorptionXS.tally_keys` property and + values are instances of :class:`openmc.Tally`. + rxn_rate_tally : openmc.Tally + Derived tally for the reaction rate tally used in the numerator to + compute the multi-group cross section. This attribute is None + unless the multi-group cross section has been computed. + xs_tally : openmc.Tally + Derived tally for the multi-group cross section. This attribute + is None unless the multi-group cross section has been computed. + num_subdomains : int + The number of subdomains is unity for 'material', 'cell' and 'universe' + domain types. This is equal to the number of cell instances + for 'distribcell' domain types (it is equal to unity prior to loading + tally data from a statepoint file) and the number of mesh cells for + 'mesh' domain types. + num_nuclides : int + The number of nuclides for which the multi-group cross section is + being tracked. This is unity if the by_nuclide attribute is False. + nuclides : Iterable of str or 'sum' + The optional user-specified nuclides for which to compute cross + sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + are not specified by the user, all nuclides in the spatial domain + are included. This attribute is 'sum' if by_nuclide is false. + sparse : bool + Whether or not the MGXS' tallies use SciPy's LIL sparse matrix format + for compressed data storage + loaded_sp : bool + Whether or not a statepoint file has been loaded with tally data + derived : bool + Whether or not the MGXS is merged from one or more other MGXS + hdf5_key : str + The key used to index multi-group cross sections in an HDF5 data store + + """ + + def __init__(self, domain=None, domain_type=None, + groups=None, by_nuclide=False, name=''): + super(InverseVelocity, self).__init__(domain, domain_type, + groups, by_nuclide, name) + self._rxn_type = 'inverse-velocity' From 0677e35635329f96f157160e0f760473e6d4cb91 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 4 Jul 2016 15:33:57 -0400 Subject: [PATCH 003/168] implemented MDGXS abstract class for multi-delayed-group cross sections --- openmc/checkvalue.py | 2 +- openmc/kinetics/__init__.py | 2 + openmc/kinetics/clock.py | 117 +++ openmc/kinetics/solver.py | 638 ++++++++++++++++ openmc/mgxs/__init__.py | 3 +- openmc/mgxs/groups.py | 130 ++++ openmc/mgxs/mdgxs.py | 1432 +++++++++++++++++++++++++++++++++++ openmc/mgxs/mgxs.py | 853 +++++++-------------- 8 files changed, 2580 insertions(+), 597 deletions(-) create mode 100644 openmc/kinetics/__init__.py create mode 100644 openmc/kinetics/clock.py create mode 100644 openmc/kinetics/solver.py create mode 100644 openmc/mgxs/mdgxs.py diff --git a/openmc/checkvalue.py b/openmc/checkvalue.py index cc0e1190df..6bb2be31b5 100644 --- a/openmc/checkvalue.py +++ b/openmc/checkvalue.py @@ -213,7 +213,7 @@ def check_less_than(name, value, maximum, equality=False): raise ValueError(msg) def check_greater_than(name, value, minimum, equality=False): - """Ensure that an object's value is less than a given value. + """Ensure that an object's value is greater than a given value. Parameters ---------- diff --git a/openmc/kinetics/__init__.py b/openmc/kinetics/__init__.py new file mode 100644 index 0000000000..0ccd7e882f --- /dev/null +++ b/openmc/kinetics/__init__.py @@ -0,0 +1,2 @@ +from openmc.kinetics.clock import * +from openmc.kinetics.solver import * diff --git a/openmc/kinetics/clock.py b/openmc/kinetics/clock.py new file mode 100644 index 0000000000..9df266e1d7 --- /dev/null +++ b/openmc/kinetics/clock.py @@ -0,0 +1,117 @@ + +import copy +import numpy as np + +TIME_POINTS = ['START', + 'PREVIOUS_OUT', + 'PREVIOUS_IN', + 'CURRENT', + 'FORWARD_IN', + 'FORWARD_OUT', + 'END'] + +class Clock(object): + + def __init__(self, start=0., end=3., dt_outer=1.e-1, dt_inner=1.e-2): + + # Initialize coordinates + self.dt_outer = dt_outer + self.dt_inner = dt_inner + + # Create a dictionary of clock times + self._times = {} + for t in TIME_POINTS: + self._times[t] = start + + # Reset the end time + self._times['END'] = end + + + def __deepcopy__(self, memo): + + existing = memo.get(id(self)) + + # If this is the first time we have tried to copy this object, create a copy + if existing is None: + + clone = type(self).__new__(type(self)) + + memo[id(self)] = clone + + return clone + + # If this object has been copied before, return the first copy made + else: + return existing + + def __repr__(self): + + string = 'Clock\n' + string += '{0: <24}{1}{2}\n'.format('\tdt inner', '=\t', self.dt_inner) + string += '{0: <24}{1}{2}\n'.format('\tdt outer', '=\t', self.dt_outer) + + for t in TIME_POINTS: + string += '{0: <24}{1}{2}\n'.format('\tTime ' + t, '=\t', self.times[t]) + + return string + + @property + def dt_inner(self): + return self._dt_inner + + @property + def dt_outer(self): + return self._dt_outer + + @property + def times(self): + return self._times + + @dt_inner.setter + def dt_inner(self, dt_inner): + self._dt_inner = np.float64(dt_inner) + + @dt_outer.setter + def dt_outer(self, dt_outer): + self._dt_outer = np.float64(dt_outer) + + @times.setter + def times(self, times): + self._times = np.float64(times) + + def take_outer_step(self): + """Take an outer time step and reset all the inner time step values + to the starting point for the outer time step. + + """ + + self.times['PREVIOUS_OUT'] = self.times['FORWARD_OUT'] + self.times['PREVIOUS_IN'] = self.times['FORWARD_OUT'] + self.times['FORWARD_IN'] = self.times['FORWARD_OUT'] + self.times['CURRENT'] = self.times['FORWARD_OUT'] + + if (self.times['END'] > self.times['FORWARD_OUT'] + self.dt_outer): + self.times['FORWARD_OUT'] = self.times['END'] + else: + self.times['FORWARD_OUT'] = self.times['FORWARD_OUT'] + self.dt_outer + + def take_inner_step(self): + """Take an inner time step. + + """ + self.times['PREVIOUS_IN'] = self.times['FORWARD_IN'] + self.times['CURRENT'] = self.times['FORWARD_IN'] + + if (self.times['FORWARD_OUT'] > self.times['FORWARD_IN'] + self.dt_inner): + self.times['FORWARD_IN'] = self.times['FORWARD_OUT'] + else: + self.times['FORWARD_IN'] = self.times['FORWARD_IN'] + self.dt_inner + + def reset_to_previous_outer(self): + """Reset the time values to the previous outer time. + + """ + + self.times['PREVIOUS_IN'] = self.times['PREVIOUS_IN'] + self.times['FORWARD_IN'] = self.times['PREVIOUS_IN'] + self.times['CURRENT'] = self.times['PREVIOUS_IN'] diff --git a/openmc/kinetics/solver.py b/openmc/kinetics/solver.py new file mode 100644 index 0000000000..a71907a1d3 --- /dev/null +++ b/openmc/kinetics/solver.py @@ -0,0 +1,638 @@ +from collections import OrderedDict +from xml.etree import ElementTree as ET + +import openmc +import openmc.kinetics +from openmc.clean_xml import * +from openmc.checkvalue import check_type +from openmc.kinetics.clock import TIME_POINTS +import numpy as np + + +class Solver(object): + """Solver to propagate the neutron flux and power forward in time. + + Attributes + ---------- + mesh : openmc.mesh.Mesh + Mesh which specifies the dimensions of coarse mesh. + + geometry : openmc.geometry.Geometry + Geometry which describes the problem being solved. + + settings_file : openmc.settings.SettingsFile + Settings file describing the general settings for each simulation. + + materials_file : openmc.materials.MaterialsFile + Materials file containing the materials info for each simulation. + + executor : openmc.executor.Executor + Executor object for executing OpenMC simulation. + + clock : openmc.kinetics.Clock + Clock object. + + energy_groups : openmc.mgxs.groups.EnergyGroups + EnergyGroups which specifies the energy groups structure. + + A : np.matrix + Numpy matrix used for storing the destruction terms. + + M : np.matrix + Numpy matrix used for storing the production terms. + + AM : np.matrix + Numpy matrix used for storing the combined production/destruction terms. + + flux : np.array + Numpy array used to store the flux. + + amplitude : np.array + Numpy array used to store the amplitude. + + shape : np.array + Numpy array used to store the shape. + + source : np.array + Numpy array used to store the source. + + power : np.array + Numpy array used to store the power. + + precursor_conc : np.array + Numpy array used to store the precursor concentrations. + + sigma_a : OrderedDict of openmc.MGXS.AbsorptionXS + MGXS absorption multigroup cross-sections. + + nu_sigma_f : OrderedDict of openmc.MGXS.NuFissionXS + MGXS nu-fission multigroup cross-sections. + + kappa_sigma_f : OrderedDict of openmc.MGXS.NuFissionXS + MGXS nu-fission multigroup cross-sections. + + dif_coef : OrderedDict of openmc.MGXS.DiffusionCoefficientXS + MGXS multigroup diffusion coefficients. + + beta : OrderedDict of openmc.MGXS.delayed.Beta + MGXS multigroup delayed neutron fractions. + + chi_prompt : OrderedDict of openmc.MGXS.delayed.ChiPrompt + MGXS multigroup prompt neutron spectrums. + + chi_delayed : OrderedDict of openmc.MGXS.delayed.ChiDelayed + MGXS multigroup delayed neutron spectrums. + + velocity : OrderedDict of openmc.MGXS.Velocity + MGXS multigroup velocities. + + nu_sigma_s : OrderedDict of openmc.MGXS.NuScatterMatrixXS + MGXS multigroup nu-scatter matrix. + + flux_xs : OrderedDict openmc.MGXS.Flux + MGXS multigroup flux. + + k_eff_0 : float + The initial eigenvalue. + + Methods + ------- + - initialize_xs() + take_outer_step() + take_inner_step() + solve() + - extract_xs() + 2 normalize_flux() + broadcast_to_all() + broadcast_to_one() + - compute_shape() + integrate_precursor_conc() + 3 compute_initial_precursor_conc() + 1 compute_power() + construct_A() + construct_M() + construct_AM() + interpolate_xs() + + To Do + ----- + 1) Create getters and setters for all attributes + 2) Create method to generate initialize xs + 3) Create method to compute flux + 4) Create method to compute initial precursor concentrations + 5) Create method to compute the initial power + + """ + + def __init__(self): + + # Initialize Solver class attributes + self._mesh = None + self._geometry = None + self._settings_file = None + self._materials_file = None + self._executor = openmc.Executor() + self._statepoint = None + self._summary = None + self._clock = None + self._energy_groups = None + self._A = None + self._M = None + self._AM = None + self._flux = None + self._amplitude = None + self._shape = None + self._source = None + self._power = None + self._precursor_conc = None + self._sigma_a = None + self._nu_sigma_f = None + self._kappa_sigma_f = None + self._dif_coef = None + self._beta = None + self._chi_prompt = None + self._chi_delayed = None + self._velocity = None + self._nu_sigma_s = None + self._flux_xs = None + self._decay_constants = None + self._k_eff_0 = None + + @property + def mesh(self): + return self._mesh + + @property + def geometry(self): + return self._geometry + + @property + def settings_file(self): + return self._settings_file + + @property + def materials_file(self): + return self._materials_file + + @property + def executor(self): + return self._executor + + @property + def statepoint(self): + return self._statepoint + + @property + def summary(self): + return self._summary + + @property + def clock(self): + return self._clock + + @property + def energy_groups(self): + return self._energy_groups + + @property + def A(self): + return self._A + + @property + def M(self): + return self._M + + @property + def AM(self): + return self._AM + + @property + def flux(self): + return self._flux + + @property + def amplitude(self): + return self._amplitude + + @property + def shape(self): + return self._shape + + @property + def source(self): + return self._source + + @property + def power(self): + return self._power + + @property + def precursor_conc(self): + return self._precursor_conc + + @property + def sigma_a(self): + return self._sigma_a + + @property + def nu_sigma_f(self): + return self._nu_sigma_f + + @property + def kappa_sigma_f(self): + return self._kappa_sigma_f + + @property + def dif_coef(self): + return self._dif_coef + + @property + def beta(self): + return self._beta + + @property + def chi_prompt(self): + return self._chi_prompt + + @property + def chi_delayed(self): + return self._chi_delayed + + @property + def velocity(self): + return self._velocity + + @property + def nu_sigma_s(self): + return self._nu_sigma_s + + @property + def flux_xs(self): + return self._flux_xs + + @property + def decay_constants(self): + return self._decay_constants + + @property + def k_eff_0(self): + return self._k_eff_0 + + @mesh.setter + def mesh(self, mesh): + self._mesh = mesh + + @geometry.setter + def geometry(self, geometry): + self._geometry = geometry + + @settings_file.setter + def settings_file(self, settings_file): + self._settings_file = settings_file + + @materials_file.setter + def materials_file(self, materials_file): + self._materials_file = materials_file + + @executor.setter + def executor(self, exectuor): + self._executor = executor + + @statepoint.setter + def statepoint(self, statepoint): + self._statepoint = statepoint + + @summary.setter + def summary(self, summary): + self._summary = summary + + @clock.setter + def clock(self, clock): + self._clock = clock + + @energy_groups.setter + def energy_groups(self, energy_groups): + self._energy_groups = energy_groups + + # Initialize the arrays + ng = energy_groups.num_groups + self._flux = np.zeros(ng) + self._amplitude = np.zeros(ng) + self._shape = np.zeros(ng) + self._source = np.zeros(ng) + self._power = np.zeros(ng) + + @A.setter + def A(self): + self._A = A + + @M.setter + def M(self, M): + self._M = M + + @AM.setter + def AM(self, AM): + self._AM = AM + + @flux.setter + def flux(self, flux): + self._flux = flux + + @amplitude.setter + def amplitude(self, amplitude): + self._amplitude = amplitude + + @shape.setter + def shape(self, shape): + self._shape = shape + + @source.setter + def source(self, source): + self._source = source + + @power.setter + def power(self, power): + self._power = power + + @precursor_conc.setter + def precursor_conc(self, precursor_conc): + self._precursor_conc = precursor_conc + + @sigma_a.setter + def sigma_a(self, sigma_a): + self._sigma_a = sigma_a + + @nu_sigma_f.setter + def nu_sigma_f(self, nu_sigma_f): + self._nu_sigma_f = nu_sigma_f + + @kappa_sigma_f.setter + def kappa_sigma_f(self, kappa_sigma_f): + self._kappa_sigma_f = kappa_sigma_f + + @dif_coef.setter + def dif_coef(self, dif_coef): + self._dif_coef = dif_coef + + @beta.setter + def beta(self, beta): + self._beta = beta + + @chi_prompt.setter + def chi_prompt(self, chi_prompt): + self._chi_prompt = chi_prompt + + @chi_delayed.setter + def chi_delayed(self, chi_delayed): + self._chi_delayed + + @velocity.setter + def velocity(self, velocity): + self._velocity = velocity + + @nu_sigma_s.setter + def nu_sigma_s(self, nu_sigma_s): + self._nu_sigma_s = nu_sigma_s + + @flux_xs.setter + def flux_xs(self, flux_xs): + self._flux_xs = flux_xs + + @decay_constants.setter + def decay_constants(self, decay_constants): + self._decay_constants = decay_constants + + @k_eff_0.setter + def k_eff_0(self, k_eff_0): + self._k_eff_0 = k_eff_0 + + def initialize_xs(self): + """Initialize all the tallies for the problem. + + """ + + self._sigma_a = {} + self._nu_sigma_f = {} + self._kappa_sigma_f = {} + self._dif_coef = {} + self._beta = {} + self._chi_prompt = {} + self._chi_delayed = {} + self._velocity = {} + self._nu_sigma_s = {} + self._flux_xs = {} + self._precursor_conc = {} + + self._decay_constants = openmc.Tally(name='decay constants') + self._decay_constants._derived = True + self._decay_constants.num_score_bins = 1 + self._decay_constants.add_score('None') + self._decay_constants._mean = np.array([0.012467, 0.028292, 0.042524,\ + 0.133042, 0.292467, 0.666488,\ + 1.634781, 3.554600]) + self._decay_constants._mean = np.reshape(self._decay_constants._mean, (8,1,1)) + self._decay_constants._std_dev = np.array([0 for i in range(8)]) + self._decay_constants._std_dev = np.reshape(self._decay_constants._std_dev, (8,1,1)) + self._decay_constants.estimator = 'analog' + self._decay_constants.add_filter(openmc.Filter('delayedgroup', range(1,9))) + self._decay_constants._nuclides = ['total'] + + # FIXME: replace domain with mesh + # Get the cell in the geometry + cells = self.geometry.root_universe.get_all_cells() + cell = cells.values()[0] + + global TIME_POINTS + for t in TIME_POINTS: + print 'computing tallies for time: ' + t + self._sigma_a[t] = openmc.mgxs.AbsorptionXS(name='sigma a', + domain=cell, domain_type='cell', groups=self.energy_groups) + self._nu_sigma_f[t] = openmc.mgxs.NuFissionXS(name='nu sigma f', + domain=cell, domain_type='cell', groups=self.energy_groups) + self._kappa_sigma_f[t] = openmc.mgxs.KappaFissionXS(name='kappa fission', + domain=cell, domain_type='cell', groups=self.energy_groups) + self._dif_coef[t] = openmc.mgxs.DiffusionCoefficient(name='dif coef', + domain=cell, domain_type='cell', groups=self.energy_groups) + self._beta[t] = openmc.mgxs.Beta(name='beta', + domain=cell, domain_type='cell', groups=self.energy_groups) + self._chi_prompt[t] = openmc.mgxs.ChiPrompt(name='chi prompt', + domain=cell, domain_type='cell', groups=self.energy_groups) + self._chi_delayed[t] = openmc.mgxs.ChiDelayed(name='chi delayed', + domain=cell, domain_type='cell', groups=self.energy_groups) + self._velocity[t] = openmc.mgxs.Velocity(name='velocity', + domain=cell, domain_type='cell', groups=self.energy_groups) + self._nu_sigma_s[t] = openmc.mgxs.NuScatterMatrixXS(name='nu scatter', + domain=cell, domain_type='cell', groups=self.energy_groups) + self._flux_xs[t] = openmc.mgxs.Flux(name='flux', + domain=cell, domain_type='cell', groups=self.energy_groups) + + + def generate_tallies_file(self, time): + """Initialize the tallies file. + + """ + + tallies_file = openmc.TalliesFile() + + # Add absorption tallies to the tallies file + for tally in self._sigma_a[time].tallies.values(): + tallies_file.add_tally(tally, merge=True) + + # Add nu-sigma-f tallies to the tallies file + for tally in self._nu_sigma_f[time].tallies.values(): + tallies_file.add_tally(tally, merge=True) + + # Add kappa-sigma-f tallies to the tallies file + for tally in self._kappa_sigma_f[time].tallies.values(): + tallies_file.add_tally(tally, merge=True) + + # Add dif-coef tallies to the tallies file + for tally in self._dif_coef[time].tallies.values(): + tallies_file.add_tally(tally, merge=True) + + # Add beta tallies to the tallies file + for tally in self._beta[time].tallies.values(): + tallies_file.add_tally(tally, merge=True) + + # Add chi prompt tallies to the tallies file + for tally in self._chi_prompt[time].tallies.values(): + tallies_file.add_tally(tally, merge=True) + + # Add chi delayed tallies to the tallies file + for tally in self._chi_delayed[time].tallies.values(): + tallies_file.add_tally(tally, merge=False) + + # Add velocity tallies to the tallies file + for tally in self._velocity[time].tallies.values(): + tallies_file.add_tally(tally, merge=True) + + # Add nu-sigma-s tallies to the tallies file + for tally in self._nu_sigma_s[time].tallies.values(): + tallies_file.add_tally(tally, merge=True) + + # Add flux tallies to the tallies file + for tally in self._flux_xs[time].tallies.values(): + tallies_file.add_tally(tally, merge=True) + + # Export to "tallies.xml" + tallies_file.export_to_xml() + + def extract_xs(self, time): + + filename = 'statepoint.' + str(self.settings_file.batches) + '.h5' + self.statepoint = openmc.StatePoint(filename) + self.summary = openmc.Summary('summary.h5') + self.statepoint.link_with_summary(self.summary) + + # load xs from statepoint + self._sigma_a[time].load_from_statepoint(self.statepoint) + self._nu_sigma_f[time].load_from_statepoint(self.statepoint) + self._kappa_sigma_f[time].load_from_statepoint(self.statepoint) + self._dif_coef[time].load_from_statepoint(self.statepoint) + self._beta[time].load_from_statepoint(self.statepoint) + self._chi_prompt[time].load_from_statepoint(self.statepoint) + self._chi_delayed[time].load_from_statepoint(self.statepoint) + self._velocity[time].load_from_statepoint(self.statepoint) + self._nu_sigma_s[time].load_from_statepoint(self.statepoint) + self._flux_xs[time].load_from_statepoint(self.statepoint) + self.k_eff_0 = self.statepoint.k_combined[0] + + # compute the xs + self._sigma_a[time].compute_xs() + self._nu_sigma_f[time].compute_xs() + self._kappa_sigma_f[time].compute_xs() + self._dif_coef[time].compute_xs() + self._beta[time].compute_xs() + self._chi_prompt[time].compute_xs() + self._chi_delayed[time].compute_xs() + self._velocity[time].compute_xs() + self._nu_sigma_s[time].compute_xs() + self._flux_xs[time].compute_xs() + + # extract the flux + #for g in range(self._energy_groups.num_groups): + # self._flux[g] = self._flux_xs[time].xs_tally.mean[g][0][0] + + def print_xs(self, time): + + # print the xs + self._sigma_a[time].print_xs() + self._nu_sigma_f[time].print_xs() + self._kappa_sigma_f[time].print_xs() + self._dif_coef[time].print_xs() + self._beta[time].print_xs() + self._chi_prompt[time].print_xs() + self._chi_delayed[time].print_xs() + self._velocity[time].print_xs() + self._nu_sigma_s[time].print_xs() + self._flux_xs[time].print_xs() + + def compute_shape(self, time): + + geometry_file = openmc.GeometryFile() + geometry_file.geometry = self.geometry + + # Create the xml files + self._materials_file.export_to_xml() + geometry_file.export_to_xml() + self._settings_file.export_to_xml() + self.generate_tallies_file(time) + + # Run OpenMC + self.executor.run_simulation(mpi_procs=4) + + def compute_power(self, time): + + self.power = self._kappa_sigma_f[time].xs_tally * \ + self._flux_xs[time].xs_tally + + def compute_initial_precursor_conc(self, time): + + self.precursor_conc[time] = self.nu_sigma_f[time].xs_tally \ + * self.flux_xs[time].xs_tally + self.precursor_conc[time] = self.precursor_conc[time].\ + summation(filter_type='energy', remove_filter=True) + beta = self.beta[time].xs_tally.\ + summation(filter_type='energy', remove_filter=True) + self.precursor_conc[time] = beta \ + * self.precursor_conc[time] + + self.precursor_conc[time] = self.precursor_conc[time] / self.k_eff_0 + + print self.precursor_conc[time] + print self._decay_constants + + self.precursor_conc[time] = self.precursor_conc[time] / self._decay_constants + print self.precursor_conc[time] + + + def compute_forward_flux(self, time, time_next): + + dt_v = self.clock.dt_outer * self.velocity + + fission_rate = self.nu_sigma_f[time].xs_tally \ + * self.flux_xs[time].xs_tally + + fission_rate = fission_rate.summation(filter_type='energy', remove_filter=True) + + self.flux_xs[time_next] = [self.flux_xs[time] + (1 - self.beta) \ + / self.k_eff_0 * fission_rate + \ + + self.precursor_conc[time] = self.nu_sigma_f[time].xs_tally \ + * self.flux_xs[time].xs_tally + self.precursor_conc[time] = self.precursor_conc[time].\ + summation(filter_type='energy', remove_filter=True) + beta = self.beta[time].xs_tally.\ + summation(filter_type='energy', remove_filter=True) + self.precursor_conc[time] = beta \ + * self.precursor_conc[time] + + self.precursor_conc[time] = self.precursor_conc[time] / self.k_eff_0 + + print self.precursor_conc[time] + print self._decay_constants + + inv_decay_constants = 1.0 / self._decay_constants + inv_decay_constants.name = 'inverse decay constants' + self.precursor_conc[time] = inv_decay_constants * self.precursor_conc[time] + print self.precursor_conc[time] diff --git a/openmc/mgxs/__init__.py b/openmc/mgxs/__init__.py index 4fcf8b6aed..b41deac843 100644 --- a/openmc/mgxs/__init__.py +++ b/openmc/mgxs/__init__.py @@ -1,3 +1,4 @@ -from openmc.mgxs.groups import EnergyGroups +from openmc.mgxs.groups import EnergyGroups, DelayedGroups from openmc.mgxs.library import Library from openmc.mgxs.mgxs import * +from openmc.mgxs.mdgxs import * diff --git a/openmc/mgxs/groups.py b/openmc/mgxs/groups.py index 068977d888..1b17cf7a84 100644 --- a/openmc/mgxs/groups.py +++ b/openmc/mgxs/groups.py @@ -11,6 +11,10 @@ import openmc.checkvalue as cv if sys.version_info[0] >= 3: basestring = str +# Maximum number of delayed groups +# TODO: Get value from OpenMC +MAX_DELAYED_GROUPS = 8 + class EnergyGroups(object): """An energy groups structure used for multi-group cross-sections. @@ -299,3 +303,129 @@ class EnergyGroups(object): # Assign merged edges to merged groups merged_groups.group_edges = list(merged_edges) return merged_groups + + +class DelayedGroups(object): + """A delayed groups structure used for multi-delayed-group parameters. + + Parameters + ---------- + groups : Iterable of Int + The delayed groups + + Attributes + ---------- + groups : Iterable of Int + The delayed groups + num_groups : int + The number of delayed groups + + """ + + def __init__(self, groups=None): + self._groups = None + + if groups is not None: + self.groups = groups + + def __deepcopy__(self, memo): + existing = memo.get(id(self)) + + # If this is the first time we have tried to copy object, create copy + if existing is None: + clone = type(self).__new__(type(self)) + clone._groups = copy.deepcopy(self.groups, memo) + + memo[id(self)] = clone + + return clone + + # If this object has been copied before, return the first copy made + else: + return existing + + def __eq__(self, other): + if not isinstance(other, DelayedGroups): + return False + elif self.num_groups != other.num_groups: + return False + elif np.allclose(self.groups, other.groups): + return True + else: + return False + + def __ne__(self, other): + return not self == other + + def __hash__(self): + return hash(tuple(self.groups)) + + @property + def groups(self): + return self._groups + + @property + def num_groups(self): + return len(self.groups) + + @groups.setter + def groups(self, groups): + cv.check_type('groups', groups, Iterable, Int) + cv.check_greater_than('number of delayed groups', len(groups), 0) + + # Check that the groups are within [1, MAX_DELAYED_GROUPS] + for group in groups: + cv.check_greater_than('delayed group', group, 0) + cv.check_less_than('delayed group', group, MAX_DELAYED_GROUPS + 1) + + self._groups = np.array(groups, dtype=int) + + def can_merge(self, other): + """Determine if delayed groups can be merged with another. + + Parameters + ---------- + other : openmc.mgxs.DelayedGroups + DelayedGroups to compare with + + Returns + ------- + bool + Whether the delayed groups can be merged + + """ + + if not isinstance(other, DelayedGroups): + return False + else: + return True + + def merge(self, other): + """Merge this delayed groups with another. + + Parameters + ---------- + other : openmc.mgxs.DelayedGroups + DelayedGroups to merge with + + Returns + ------- + merged_groups : openmc.mgxs.DelayedGroups + DelayedGroups resulting from the merge + + """ + + if not self.can_merge(other): + raise ValueError('Unable to merge delayed groups') + + # Create deep copy to return as merged delayed groups + merged_groups = copy.deepcopy(self) + + # Merge unique filter bins + groups = np.concatenate((self.groups, other.groups)) + groups = np.unique(groups) + groups = sorted(groups) + + # Assign groups to merged groups + merged_groups.groups = list(groups) + return merged_groups diff --git a/openmc/mgxs/mdgxs.py b/openmc/mgxs/mdgxs.py new file mode 100644 index 0000000000..202950ec32 --- /dev/null +++ b/openmc/mgxs/mdgxs.py @@ -0,0 +1,1432 @@ +from __future__ import division + +from collections import Iterable, OrderedDict +from numbers import Integral +import warnings +import os +import sys +import copy +import abc + +import numpy as np + +from mgxs import MGXS, MGXS_TYPES, DOMAIN_TYPES, _DOMAINS +from openmc.mgxs import EnergyGroups, DelayedGroups +from openmc import Mesh + +# Supported cross section types +MDGXS_TYPES = ['delayed-nu-fission', + 'chi-delayed', + 'beta'] + +class MDGXS(MGXS): + """An abstract multi-delayed-group cross section for some energy and delayed + group structures within some spatial domain. + + This class can be used for both OpenMC input generation and tally data + post-processing to compute spatially-homogenized and energy-integrated + multi-group and multi-delayed-group cross sections for downstream + neutronics calculations. + + NOTE: Users should instantiate the subclasses of this abstract class. + + Parameters + ---------- + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh + The domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + The domain type for spatial homogenization + energy_groups : openmc.mgxs.EnergyGroups + The energy group structure for energy condensation + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + name : str, optional + Name of the multi-group cross section. Used as a label to identify + tallies in OpenMC 'tallies.xml' file. + delayed_groups : openmc.mgxs.DelayedGroups + Delayed groups to filter out the xs + + Attributes + ---------- + name : str, optional + Name of the multi-group cross section + rxn_type : str + Reaction type (e.g., 'chi-delayed', 'beta', etc.) + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + domain : Material or Cell or Universe or Mesh + Domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + Domain type for spatial homogenization + energy_groups : openmc.mgxs.EnergyGroups + Energy group structure for energy condensation + delayed_groups : openmc.mgxs.DelayedGroups + Delayed groups to filter out the xs + tally_trigger : openmc.Trigger + An (optional) tally precision trigger given to each tally used to + compute the cross section + scores : list of str + The scores in each tally used to compute the multi-group cross section + filters : list of openmc.Filter + The filters in each tally used to compute the multi-group cross section + tally_keys : list of str + The keys into the tallies dictionary for each tally used to compute + the multi-group cross section + estimator : {'tracklength', 'analog'} + The tally estimator used to compute the multi-group cross section + tallies : collections.OrderedDict + OpenMC tallies needed to compute the multi-group cross section + rxn_rate_tally : openmc.Tally + Derived tally for the reaction rate tally used in the numerator to + compute the multi-group cross section. This attribute is None + unless the multi-group cross section has been computed. + xs_tally : openmc.Tally + Derived tally for the multi-group cross section. This attribute + is None unless the multi-group cross section has been computed. + num_subdomains : int + The number of subdomains is unity for 'material', 'cell', and 'universe' + domain types. This is equal to the number of cell instances for + 'distribcell' domain types (it is equal to unity prior to loading + tally data from a statepoint file) and the number of mesh cells for + 'mesh' domain types. + num_nuclides : int + The number of nuclides for which the multi-group cross section is + being tracked. This is unity if the by_nuclide attribute is False. + nuclides : Iterable of str or 'sum' + The optional user-specified nuclides for which to compute cross + sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + are not specified by the user, all nuclides in the spatial domain + are included. This attribute is 'sum' if by_nuclide is false. + sparse : bool + Whether or not the MDGXS' tallies use SciPy's LIL sparse matrix format + for compressed data storage + loaded_sp : bool + Whether or not a statepoint file has been loaded with tally data + derived : bool + Whether or not the MDGXS is merged from one or more other MDGXS + hdf5_key : str + The key used to index multi-group cross sections in an HDF5 data store + + """ + + # This is an abstract class which cannot be instantiated + __metaclass__ = abc.ABCMeta + + def __init__(self, domain=None, domain_type=None, energy_groups=None, + by_nuclide=False, name='', delayed_groups=None): + super(MDGXS, self).__init__(domain, domain_type, energy_groups, + by_nuclide, name) + self._delayed_groups = None + + if delayed_groups is not None: + self.delayed_groups = delayed_groups + + def __deepcopy__(self, memo): + super(MDGXS, self).__deepcopy__(memo) + existing = memo.get(id(self)) + + # If this is the first time we have tried to copy this object, copy it + if existing is None: + clone._delayed_groups = copy.deepcopy(self.delayed_groups, memo) + + return clone + + # If this object has been copied before, return the first copy made + else: + return existing + + @property + def delayed_groups(self): + return self._delayed_groups + + @property + def num_delayed_groups(self): + return self.delayed_groups.num_groups + + @delayed_groups.setter + def delayed_groups(self, delayed_groups): + cv.check_type('delayed groups', delayed_groups, openmc.mgxs.DelayedGroups) + self._delayed_groups = delayed_groups + + @property + def filters(self): + group_edges = self.energy_groups.group_edges + energy_filter = openmc.Filter('energy', group_edges) + if self.delayed_groups != None: + delayed_groups = self.delayed_groups.groups + delayed_filter = openmc.Filter('delayedgroup', delayed_groups) + return [[delayed_filter, energy_filter]] * len(self.scores) + else: + return [[energy]] * len(self.scores) + + @staticmethod + def get_mgxs(mdgxs_type, domain=None, domain_type=None, + energy_groups=None, by_nuclide=False, name='', + delayed_groups=None): + """Return a MDGXS subclass object for some energy group structure within + some spatial domain for some reaction type. + + This is a factory method which can be used to quickly create MDGXS + subclass objects for various reaction types. + + Parameters + ---------- + mdgxs_type : {'delayed-nu-fission', 'chi-prompt', 'chi-delayed', + 'beta'} + The type of multi-delayed-group cross section object to return + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh + The domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + The domain type for spatial homogenization + energy_groups : openmc.mgxs.EnergyGroups + The energy group structure for energy condensation + by_nuclide : bool + If true, computes cross sections for each nuclide in domain. + Defaults to False + name : str, optional + Name of the multi-group cross section. Used as a label to identify + tallies in OpenMC 'tallies.xml' file. Defaults to the empty string. + delayed_groups : openmc.mgxs.DelayedGroups + Delayed groups to filter out the xs + + Returns + ------- + openmc.mgxs.MDGXS + A subclass of the abstract MDGXS class for the multi-delayed-group + cross section type requested by the user + + """ + + cv.check_value('mdgxs_type', mdgxs_type, MDGXS_TYPES) + + if mdgxs_type == 'delayed-nu-fission': + mdgxs = DelayedNuFission(domain, domain_type, energy_groups) + elif mdgxs_type == 'chi-delayed': + mdgxs = ChiDelayed(domain, domain_type, energy_groups) + elif mdgxs_type == 'beta': + mdgxs = Beta(domain, domain_type, energy_groups) + + mdgxs.by_nuclide = by_nuclide + mdgxs.name = name + mdgxs.delayed_groups = delayed_groups + return mdgxs + + def get_xs(self, groups='all', subdomains='all', nuclides='all', + xs_type='macro', order_groups='increasing', + value='mean', delayed_groups='all', **kwargs): + """Returns an array of multi-delayed-group cross sections. + + This method constructs a 2D NumPy array for the requested + multi-delayed-group cross section data data for one or more energy + groups, delayed groups, and subdomains. + + Parameters + ---------- + groups : Iterable of Integral or 'all' + Energy groups of interest. Defaults to 'all'. + subdomains : Iterable of Integral or 'all' + Subdomain IDs of interest. Defaults to 'all'. + nuclides : Iterable of str or 'all' or 'sum' + A list of nuclide name strings (e.g., ['U-235', 'U-238']). The + special string 'all' will return the cross sections for all nuclides + in the spatial domain. The special string 'sum' will return the + cross section summed over all nuclides. Defaults to 'all'. + xs_type: {'macro', 'micro'} + Return the macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. + order_groups: {'increasing', 'decreasing'} + Return the cross section indexed according to increasing or + decreasing energy groups (decreasing or increasing energies). + Defaults to 'increasing'. + value : {'mean', 'std_dev', 'rel_err'} + A string for the type of value to return. Defaults to 'mean'. + delayed_groups : Iterable of Integral or 'all' + Delayed groups of interest. Defaults to 'all'. + + Returns + ------- + numpy.ndarray + A NumPy array of the multi-group cross section indexed in the order + each group, subdomain and nuclide is listed in the parameters. + + Raises + ------ + ValueError + When this method is called before the multi-delayed-group cross + section is computed from tally data. + + """ + + cv.check_value('value', value, ['mean', 'std_dev', 'rel_err']) + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + + filters = [] + filter_bins = [] + + # Construct a collection of the domain filter bins + if not isinstance(subdomains, basestring): + cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=3) + for subdomain in subdomains: + filters.append(self.domain_type) + filter_bins.append((subdomain,)) + + # Construct list of energy group bounds tuples for all requested groups + if not isinstance(groups, basestring): + cv.check_iterable_type('groups', groups, Integral) + for group in groups: + filters.append('energy') + filter_bins.append((self.energy_groups.get_group_bounds(group),)) + + # Construct list of delayed group tuples for all requested groups + if not isinstance(delayed_groups, basestring): + cv.check_iterable_type('delayed_groups', delayed_groups, Integral) + for delayed_group in delayed_groups: + filters.append('delayedgroups') + filter_bins.append((delayed_group,)) + + # Construct a collection of the nuclides to retrieve from the xs tally + if self.by_nuclide: + if nuclides == 'all' or nuclides == 'sum' or nuclides == ['sum']: + query_nuclides = self.get_all_nuclides() + else: + query_nuclides = nuclides + else: + query_nuclides = ['total'] + + # If user requested the sum for all nuclides, use tally summation + if nuclides == 'sum' or nuclides == ['sum']: + xs_tally = self.xs_tally.summation(nuclides=query_nuclides) + xs = xs_tally.get_values(filters=filters, + filter_bins=filter_bins, value=value) + else: + xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, + nuclides=query_nuclides, value=value) + + # Divide by atom number densities for microscopic cross sections + if xs_type == 'micro': + if self.by_nuclide: + densities = self.get_nuclide_densities(nuclides) + else: + densities = self.get_nuclide_densities('sum') + if value == 'mean' or value == 'std_dev': + xs /= densities[np.newaxis, :, np.newaxis] + + # Reverse data if user requested increasing energy groups since + # tally data is stored in order of increasing energies + if order_groups == 'increasing': + if groups == 'all': + num_groups = self.num_groups + else: + num_groups = len(groups) + + # Reshape tally data array with separate axes for domain and energy + num_subdomains = int(xs.shape[0] / num_groups) + new_shape = (num_subdomains, num_groups) + xs.shape[1:] + xs = np.reshape(xs, new_shape) + + # Reverse energies to align with increasing energy groups + xs = xs[:, ::-1, :] + + # Eliminate trivial dimensions + xs = np.squeeze(xs) + xs = np.atleast_1d(xs) + return xs + + def get_slice(self, nuclides=[], groups=[], delayed_groups=[]): + """Build a sliced MDGXS for the specified nuclides, energy groups, + and delayed groups. + + This method constructs a new MDGXS to encapsulate a subset of the data + represented by this MDGXS. The subset of data to include in the tally + slice is determined by the nuclides, energy groups, delayed groups + specified in the input parameters. + + Parameters + ---------- + nuclides : list of str + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) + groups : list of int + A list of energy group indices starting at 1 for the high energies + (e.g., [1, 2, 3]; default is []) + delayed_groups : list of int + A list of delayed group indices + (e.g., [1, 2, 3]; default is []) + + Returns + ------- + openmc.mgxs.MDGXS + A new MDGXS object which encapsulates the subset of data requested + for the nuclide(s) and/or energy group(s) and/or delayed group(s) + requested in the parameters. + + """ + + cv.check_iterable_type('nuclides', nuclides, basestring) + cv.check_iterable_type('energy_groups', groups, Integral) + cv.check_iterable_type('delayed_groups', delayed_groups, Integral) + + # Build lists of filters and filter bins to slice + filters = [] + filter_bins = [] + + if len(groups) != 0: + energy_bins = [] + for group in groups: + group_bounds = self.energy_groups.get_group_bounds(group) + energy_bins.append(group_bounds) + filter_bins.append(tuple(energy_bins)) + filters.append('energy') + + if len(delayed_groups) != 0: + filter_bins.append(tuple(delayed_groups)) + filters.append('delayedgroup') + + # Clone this MGXS to initialize the sliced version + slice_xs = copy.deepcopy(self) + slice_xs._rxn_rate_tally = None + slice_xs._xs_tally = None + + # Slice each of the tallies across nuclides and energy groups + for tally_type, tally in slice_xs.tallies.items(): + slice_nuclides = [nuc for nuc in nuclides if nuc in tally.nuclides] + if filters != []: + tally_slice = tally.get_slice(filters=filters, + filter_bins=filter_bins, + nuclides=slice_nuclides) + else: + tally_slice = tally.get_slice(nuclides=slice_nuclides) + slice_xs.tallies[tally_type] = tally_slice + + # Assign sliced energy group structure to sliced MDGXS + if groups: + new_group_edges = [] + for group in groups: + group_edges = self.energy_groups.get_group_bounds(group) + new_group_edges.extend(group_edges) + new_group_edges = np.unique(new_group_edges) + slice_xs.energy_groups.group_edges = sorted(new_group_edges) + + # Assign sliced delayed group structure to sliced MDGXS + if delayed_groups: + slice_xs.delayed_groups.groups = delayed_groups + + # Assign sliced nuclides to sliced MGXS + if nuclides: + slice_xs.nuclides = nuclides + + slice_xs.sparse = self.sparse + return slice_xs + + def can_merge(self, other): + """Determine if another MDGXS can be merged with this one + + If results have been loaded from a statepoint, then MGXS are only + mergeable along one and only one of enegy groups or nuclides. + + Parameters + ---------- + other : openmc.mgxs.MGXS + MGXS to check for merging + + """ + + can_merge = super(MDGXS, self).can_merge(other) + + # Compare delayed groups + if not self.delayed_groups.can_merge(other.delayed_groups): + can_merge = False + + # If all conditionals pass then MDGXS are mergeable + return can_merge + + def merge(self, other): + """Merge another MDGXS with this one + + MDGXS are only mergeable if their energy groups and nuclides are either + identical or mutually exclusive. If results have been loaded from a + statepoint, then MDGXS are only mergeable along one and only one of + energy groups or nuclides. + + Parameters + ---------- + other : openmc.mgxs.MDGXS + MDGXS to merge with this one + + Returns + ------- + merged_mdgxs : openmc.mgxs.MDGXS + Merged MDGXS + + """ + + + merged_mdgxs = super(MDGXS, self).merge(other) + + # Merge delayed groups + if self.delayed_groups != other.delayed_groups: + merged_delayed_groups = self.delayed_groups.merge(other.delayed_groups) + merged_mdgxs.delayed_groups = merged_delayed_groups + + return merged_mdgxs + + def print_xs(self, subdomains='all', nuclides='all', xs_type='macro'): + """Print a string representation for the multi-group cross section. + + Parameters + ---------- + subdomains : Iterable of Integral or 'all' + The subdomain IDs of the cross sections to include in the report. + Defaults to 'all'. + nuclides : Iterable of str or 'all' or 'sum' + The nuclides of the cross-sections to include in the report. This + may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + The special string 'all' will report the cross sections for all + nuclides in the spatial domain. The special string 'sum' will report + the cross sections summed over all nuclides. Defaults to 'all'. + xs_type: {'macro', 'micro'} + Return the macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. + + """ + + if self.delayed_groups != None: + super(MDGXS, self).print_xs(subdomains, nuclides, xs_type) + return + + # Construct a collection of the subdomains to report + if not isinstance(subdomains, basestring): + cv.check_iterable_type('subdomains', subdomains, Integral) + elif self.domain_type == 'distribcell': + subdomains = np.arange(self.num_subdomains, dtype=np.int) + elif self.domain_type == 'mesh': + subdomains = [] + if (len(self.domain.dimension) == 3): + nx, ny, nz = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + for z in range(1,nz+1): + subdomains.append((x, y, z)) + else: + nx, ny = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + subdomains.append((x, y, 1)) + else: + subdomains = [self.domain.id] + + # Construct a collection of the nuclides to report + if self.by_nuclide: + if nuclides == 'all': + nuclides = self.get_all_nuclides() + elif nuclides == 'sum': + nuclides = ['sum'] + else: + cv.check_iterable_type('nuclides', nuclides, basestring) + else: + nuclides = ['sum'] + + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + + # Build header for string with type and domain info + string = 'Multi-Delayed-Group XS\n' + string += '{0: <16}=\t{1}\n'.format('\tReaction Type', self.rxn_type) + string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type) + string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id) + + # If cross section data has not been computed, only print string header + if self.tallies is None: + print(string) + return + + # Loop over all subdomains + for subdomain in subdomains: + + if self.domain_type == 'distribcell': + string += '{0: <16}=\t{1}\n'.format('\tSubdomain', subdomain) + + # Loop over all Nuclides + for nuclide in nuclides: + + # Build header for nuclide type + if nuclide != 'sum': + string += '{0: <16}=\t{1}\n'.format('\tNuclide', nuclide) + + # Build header for cross section type + if xs_type == 'macro': + string += '{0: <16}\n'.format('\tCross Sections [cm^-1]:') + else: + string += '{0: <16}\n'.format('\tCross Sections [barns]:') + + for delayed_group in self.delayed_groups.groups: + + template = '{0: <12}Delayed Group {1}:\t' + string += template.format('', delayed_group) + string += '\n' + + template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]:\t' + + # Loop over energy groups ranges + for group in range(1, self.num_groups+1): + bounds = self.energy_groups.get_group_bounds(group) + string += template.format('', group, bounds[0], bounds[1]) + average = self.get_xs([group], [subdomain], [nuclide], + xs_type=xs_type, value='mean', + delayed_groups=[delayed_group]) + rel_err = self.get_xs([group], [subdomain], [nuclide], + xs_type=xs_type, value='rel_err', + delayed_groups=[delayed_group]) + average = average.flatten()[0] + rel_err = rel_err.flatten()[0] * 100. + string += '{:.2e} +/- {:1.2e}%'.format(average, rel_err) + string += '\n' + string += '\n' + string += '\n' + + print(string) + + def export_xs_data(self, filename='mgxs', directory='mgxs', + format='csv', groups='all', xs_type='macro', + delayed_groups='all'): + """Export the multi-delayed-group cross section data to a file. + + This method leverages the functionality in the Pandas library to export + the multi-group cross section data in a variety of output file formats + for storage and/or post-processing. + + Parameters + ---------- + filename : str + Filename for the exported file. Defaults to 'mgxs'. + directory : str + Directory for the exported file. Defaults to 'mgxs'. + format : {'csv', 'excel', 'pickle', 'latex'} + The format for the exported data file. Defaults to 'csv'. + groups : Iterable of Integral or 'all' + Energy groups of interest. Defaults to 'all'. + xs_type: {'macro', 'micro'} + Store the macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. + delayed_groups : Iterable of Integral or 'all' + Delayed groups of interest. Defaults to 'all'. + + """ + + cv.check_type('filename', filename, basestring) + cv.check_type('directory', directory, basestring) + cv.check_value('format', format, ['csv', 'excel', 'pickle', 'latex']) + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + + # Make directory if it does not exist + if not os.path.exists(directory): + os.makedirs(directory) + + filename = os.path.join(directory, filename) + filename = filename.replace(' ', '-') + + # Get a Pandas DataFrame for the data + df = self.get_pandas_dataframe(groups=groups, xs_type=xs_type, + delayed_groups=delayed_groups) + + # Capitalize column label strings + #df.columns = df.columns.astype(str) + #df.columns = map(str.title, df.columns) + + # Export the data using Pandas IO API + if format == 'csv': + df.to_csv(filename + '.csv', index=False) + elif format == 'excel': + df.to_excel(filename + '.xls', index=False) + elif format == 'pickle': + df.to_pickle(filename + '.pkl') + elif format == 'latex': + if self.domain_type == 'distribcell': + msg = 'Unable to export distribcell multi-group cross section' \ + 'data to a LaTeX table' + raise NotImplementedError(msg) + + df.to_latex(filename + '.tex', bold_rows=True, + longtable=True, index=False) + + # Surround LaTeX table with code needed to run pdflatex + with open(filename + '.tex','r') as original: + data = original.read() + with open(filename + '.tex','w') as modified: + modified.write( + '\\documentclass[preview, 12pt, border=1mm]{standalone}\n') + modified.write('\\usepackage{caption}\n') + modified.write('\\usepackage{longtable}\n') + modified.write('\\usepackage{booktabs}\n') + modified.write('\\begin{document}\n\n') + modified.write(data) + modified.write('\n\\end{document}') + + def get_pandas_dataframe(self, groups='all', nuclides='all', + xs_type='macro', distribcell_paths=True, + delayed_groups='all'): + """Build a Pandas DataFrame for the MGXS data. + + This method leverages :meth:`openmc.Tally.get_pandas_dataframe`, but + renames the columns with terminology appropriate for cross section data. + + Parameters + ---------- + groups : Iterable of Integral or 'all' + Energy groups of interest. Defaults to 'all'. + nuclides : Iterable of str or 'all' or 'sum' + The nuclides of the cross-sections to include in the dataframe. This + may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + The special string 'all' will include the cross sections for all + nuclides in the spatial domain. The special string 'sum' will + include the cross sections summed over all nuclides. Defaults + to 'all'. + xs_type: {'macro', 'micro'} + Return macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. + distribcell_paths : bool, optional + Construct columns for distribcell tally filters (default is True). + The geometric information in the Summary object is embedded into + a Multi-index column with a geometric "path" to each distribcell + instance. + delayed_groups : Iterable of Integral or 'all' + Delayed groups of interest. Defaults to 'all'. + + Returns + ------- + pandas.DataFrame + A Pandas DataFrame for the cross section data. + + Raises + ------ + ValueError + When this method is called before the multi-group cross section is + computed from tally data. + + """ + + df = super(MDGXS, self).get_pandas_dataframe(groups, nuclides, xs_type, + distribcell_paths) + + if not isinstance(delayed_groups, basestring): + cv.check_iterable_type('delayed groups', delayed_groups, Integral) + + # Select out those delayed groups the user requested + if not isinstance(delayed_groups, basestring): + if 'delayedgroup' in df: + df = df[df['delayedgroup'].isin(delayed_groups)] + + return df + + +class ChiDelayed(MDGXS): + """The delayed fission spectrum. + + This class can be used for both OpenMC input generation and tally data + post-processing to compute spatially-homogenized and energy-integrated + multi-group cross sections for multi-group neutronics calculations. At a + minimum, one needs to set the :attr:`ChiDelayed.energy_groups` and + :attr:`ChiDelayed.domain` properties. Tallies for the flux and appropriate + reaction rates over the specified domain are generated automatically via the + :attr:`ChiDelayed.tallies` property, which can then be appended to a + :class:`openmc.Tallies` instance. + + For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the + necessary data to compute multi-group cross sections from a + :class:`openmc.StatePoint` instance. The derived multi-group cross section + can then be obtained from the :attr:`ChiDelayed.xs_tally` property. + + For a spatial domain :math:`V` and energy group :math:`[E_g,E_{g-1}]`, the + fission spectrum is calculated as: + + .. math:: + + \langle \nu\sigma_{f,\rightarrow g} \phi \rangle &= \int_{r \in V} dr + \int_{4\pi} d\Omega' \int_0^\infty dE' \int_{E_g}^{E_{g-1}} dE \; \chi(E) + \nu\sigma_f (r, E') \psi(r, E', \Omega')\\ + \langle \nu\sigma_f \phi \rangle &= \int_{r \in V} dr \int_{4\pi} + d\Omega' \int_0^\infty dE' \int_0^\infty dE \; \chi(E) \nu\sigma_f (r, + E') \psi(r, E', \Omega') \\ + \chi_g &= \frac{\langle \nu\sigma_{f,\rightarrow g} \phi \rangle}{\langle + \nu\sigma_f \phi \rangle} + + Parameters + ---------- + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh + The domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + The domain type for spatial homogenization + groups : openmc.mgxs.EnergyGroups + The energy group structure for energy condensation + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + name : str, optional + Name of the multi-group cross section. Used as a label to identify + tallies in OpenMC 'tallies.xml' file. + delayed_groups : openmc.mgxs.DelayedGroups + Delayed groups to filter out the xs + + Attributes + ---------- + name : str, optional + Name of the multi-group cross section + rxn_type : str + Reaction type (e.g., 'total', 'nu-fission', etc.) + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + domain : Material or Cell or Universe or Mesh + Domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + Domain type for spatial homogenization + energy_groups : openmc.mgxs.EnergyGroups + Energy group structure for energy condensation + delayed_groups : openmc.mgxs.DelayedGroups + Delayed groups to filter out the xs + tally_trigger : openmc.Trigger + An (optional) tally precision trigger given to each tally used to + compute the cross section + scores : list of str + The scores in each tally used to compute the multi-group cross section + filters : list of openmc.Filter + The filters in each tally used to compute the multi-group cross section + tally_keys : list of str + The keys into the tallies dictionary for each tally used to compute + the multi-group cross section + estimator : {'tracklength', 'analog'} + The tally estimator used to compute the multi-group cross section + tallies : collections.OrderedDict + OpenMC tallies needed to compute the multi-group cross section. The keys + are strings listed in the :attr:`ChiDelayed.tally_keys` property and + values are instances of :class:`openmc.Tally`. + rxn_rate_tally : openmc.Tally + Derived tally for the reaction rate tally used in the numerator to + compute the multi-group cross section. This attribute is None + unless the multi-group cross section has been computed. + xs_tally : openmc.Tally + Derived tally for the multi-group cross section. This attribute + is None unless the multi-group cross section has been computed. + num_subdomains : int + The number of subdomains is unity for 'material', 'cell' and 'universe' + domain types. When the This is equal to the number of cell instances + for 'distribcell' domain types (it is equal to unity prior to loading + tally data from a statepoint file). + num_nuclides : int + The number of nuclides for which the multi-group cross section is + being tracked. This is unity if the by_nuclide attribute is False. + nuclides : Iterable of str or 'sum' + The optional user-specified nuclides for which to compute cross + sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + are not specified by the user, all nuclides in the spatial domain + are included. This attribute is 'sum' if by_nuclide is false. + sparse : bool + Whether or not the MGXS' tallies use SciPy's LIL sparse matrix format + for compressed data storage + loaded_sp : bool + Whether or not a statepoint file has been loaded with tally data + derived : bool + Whether or not the MGXS is merged from one or more other MGXS + hdf5_key : str + The key used to index multi-group cross sections in an HDF5 data store + + """ + + def __init__(self, domain=None, domain_type=None, energy_groups=None, + by_nuclide=False, name='', delayed_groups=None): + super(ChiDelayed, self).__init__(domain, domain_type, energy_groups, + by_nuclide, name, delayed_groups) + self._rxn_type = 'chi-delayed' + + @property + def scores(self): + return ['delayed-nu-fission', 'delayed-nu-fission'] + + @property + def filters(self): + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energyout = openmc.Filter('energyout', group_edges) + energyin = openmc.Filter('energy', [group_edges[0], group_edges[-1]]) + if self.delayed_groups != None: + delayed_groups = self.delayed_groups.groups + delayed_filter = openmc.Filter('delayedgroup', delayed_groups) + return [[delayed_filter, energyin], [delayed_filter, energyout]] + else: + return [[energyin], [energyout]] + + @property + def tally_keys(self): + return ['delayed-nu-fission-in', 'delayed-nu-fission-out'] + + @property + def estimator(self): + return 'analog' + + @property + def rxn_rate_tally(self): + if self._rxn_rate_tally is None: + self._rxn_rate_tally = self.tallies['delayed-nu-fission-out'] + self._rxn_rate_tally.sparse = self.sparse + return self._rxn_rate_tally + + @property + def xs_tally(self): + + if self._xs_tally is None: + delayed_nu_fission_in = self.tallies['delayed-nu-fission-in'] + + # Remove coarse energy filter to keep it out of tally arithmetic + energy_filter = delayed_nu_fission_in.find_filter('energy') + delayed_nu_fission_in.remove_filter(energy_filter) + + # Compute chi + self._xs_tally = self.rxn_rate_tally / delayed_nu_fission_in + super(ChiDelayed, self)._compute_xs() + + # Add the coarse energy filter back to the nu-fission tally + delayed_nu_fission_in.filters.append(energy_filter) + + return self._xs_tally + + def get_slice(self, nuclides=[], groups=[], delayed_groups=[]): + """Build a sliced ChiDelayed for the specified nuclides and energy + groups. + + This method constructs a new MGXS to encapsulate a subset of the data + represented by this MGXS. The subset of data to include in the tally + slice is determined by the nuclides and energy groups specified in + the input parameters. + + Parameters + ---------- + nuclides : list of str + A list of nuclide name strings + (e.g., ['U-235', 'U-238']; default is []) + groups : list of Integral + A list of energy group indices starting at 1 for the high energies + (e.g., [1, 2, 3]; default is []) + delayed_groups : list of int + A list of delayed group indices + (e.g., [1, 2, 3]; default is []) + + Returns + ------- + openmc.mgxs.MDGXS + A new MDGXS which encapsulates the subset of data requested + for the nuclide(s) and/or energy group(s) and/or delayed group(s) + requested in the parameters. + + """ + + # Temporarily remove energy filter from delayed-nu-fission-in since its + # group structure will work in super MGXS.get_slice(...) method + delayed_nu_fission_in = self.tallies['delayed-nu-fission-in'] + energy_filter = delayed_nu_fission_in.find_filter('energy') + delayed_nu_fission_in.remove_filter(energy_filter) + + # Call super class method and null out derived tallies + slice_xs = super(ChiDelayed, self).get_slice(nuclides, groups, + delayed_groups) + slice_xs._rxn_rate_tally = None + slice_xs._xs_tally = None + + # Slice energy groups if needed + filters = [] + filter_bins = [] + + if len(groups) != 0: + energy_bins = [] + for group in groups: + group_bounds = self.energy_groups.get_group_bounds(group) + energy_bins.append(group_bounds) + filter_bins.append(tuple(energy_bins)) + filters.append('energyout') + + if len(delayed_groups) != 0: + filter_bins.append(tuple(delayed_groups)) + filters.append('delayedgroup') + + if filters != []: + + # Slice nu-fission-out tally along energyout filter + delayed_nu_fission_out = slice_xs.tallies['delayed-nu-fission-out'] + tally_slice = delayed_nu_fission_out.get_slice(filters=filters, + filter_bins=filter_bins) + slice_xs._tallies['delayed-nu-fission-out'] = tally_slice + + # Add energy filter back to nu-fission-in tallies + self.tallies['delayed-nu-fission-in'].add_filter(energy_filter) + slice_xs._tallies['delayed-nu-fission-in'].add_filter(energy_filter) + + slice_xs.sparse = self.sparse + return slice_xs + + def merge(self, other): + """Merge another ChiDelayed with this one + + If results have been loaded from a statepoint, then ChiDelayed are only + mergeable along one and only one of energy groups or nuclides. + + Parameters + ---------- + other : openmc.mgxs.MGXS + MGXS to merge with this one + + Returns + ------- + merged_mgxs : openmc.mgxs.MGXS + Merged MGXS + """ + + if not self.can_merge(other): + raise ValueError('Unable to merge ChiDelayed') + + # Create deep copy of tally to return as merged tally + merged_mgxs = copy.deepcopy(self) + merged_mgxs._derived = True + merged_mgxs._rxn_rate_tally = None + merged_mgxs._xs_tally = None + + # Merge energy groups + if self.energy_groups != other.energy_groups: + merged_groups = self.energy_groups.merge(other.energy_groups) + merged_mgxs.energy_groups = merged_groups + + # Merge delayed groups + if self.delayed_groups != other.delayed_groups: + merged_delayed_groups = self.delayed_groups.merge(other.delayed_groups) + merged_mdgxs.delayed_groups = merged_delayed_groups + + # Merge nuclides + if self.nuclides != other.nuclides: + + # The nuclides must be mutually exclusive + for nuclide in self.nuclides: + if nuclide in other.nuclides: + msg = 'Unable to merge Chi Delayed with shared nuclides' + raise ValueError(msg) + + # Concatenate lists of nuclides for the merged MGXS + merged_mgxs.nuclides = self.nuclides + other.nuclides + + # Merge tallies + for tally_key in self.tallies: + merged_tally = self.tallies[tally_key].merge(other.tallies[tally_key]) + merged_mgxs.tallies[tally_key] = merged_tally + + return merged_mgxs + + def get_xs(self, groups='all', subdomains='all', nuclides='all', + xs_type='macro', order_groups='increasing', + value='mean', delayed_groups='all', **kwargs): + """Returns an array of the fission spectrum. + + This method constructs a 2D NumPy array for the requested multi-group + cross section data data for one or more energy groups and subdomains. + + Parameters + ---------- + groups : Iterable of Integral or 'all' + Energy groups of interest. Defaults to 'all'. + delayed_groups : Iterable of Integral or 'all' + Delayed groups of interest. Defaults to 'all'. + subdomains : Iterable of Integral or 'all' + Subdomain IDs of interest. Defaults to 'all'. + nuclides : Iterable of str or 'all' or 'sum' + A list of nuclide name strings (e.g., ['U-235', 'U-238']). The + special string 'all' will return the cross sections for all nuclides + in the spatial domain. The special string 'sum' will return the + cross section summed over all nuclides. Defaults to 'all'. + xs_type: {'macro', 'micro'} + This parameter is not relevant for chi but is included here to + mirror the parent MGXS.get_xs(...) class method + order_groups: {'increasing', 'decreasing'} + Return the cross section indexed according to increasing or + decreasing energy groups (decreasing or increasing energies). + Defaults to 'increasing'. + value : {'mean', 'std_dev', 'rel_err'} + A string for the type of value to return. Defaults to 'mean'. + + Returns + ------- + numpy.ndarray + A NumPy array of the multi-group cross section indexed in the order + each group, subdomain and nuclide is listed in the parameters. + + Raises + ------ + ValueError + When this method is called before the multi-group cross section is + computed from tally data. + + """ + + cv.check_value('value', value, ['mean', 'std_dev', 'rel_err']) + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + + filters = [] + filter_bins = [] + + # Construct a collection of the domain filter bins + if not isinstance(subdomains, basestring): + cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=3) + for subdomain in subdomains: + filters.append(self.domain_type) + filter_bins.append((subdomain,)) + + # Construct list of energy group bounds tuples for all requested groups + if not isinstance(groups, basestring): + cv.check_iterable_type('groups', groups, Integral) + for group in groups: + filters.append('energyout') + filter_bins.append((self.energy_groups.get_group_bounds(group),)) + + # Construct list of delayed group tuples for all requested groups + if not isinstance(delayed_groups, basestring): + cv.check_iterable_type('delayed_groups', delayed_groups, Integral) + for delayed_group in delayed_groups: + filters.append('delayedgroups') + filter_bins.append((delayed_group,)) + + # If chi delayed was computed for each nuclide in the domain + if self.by_nuclide: + + # Get the sum as the fission source weighted average chi for all + # nuclides in the domain + if nuclides == 'sum' or nuclides == ['sum']: + + # Retrieve the fission production tallies + delayed_nu_fission_in = self.tallies['delayed-nu-fission-in'] + delayed_nu_fission_out = self.tallies['delayed-nu-fission-out'] + + # Sum out all nuclides + nuclides = self.get_all_nuclides() + delayed_nu_fission_in = delayed_nu_fission_in.summation(nuclides=nuclides) + delayed_nu_fission_out = delayed_nu_fission_out.summation(nuclides=nuclides) + + # Remove coarse energy filter to keep it out of tally arithmetic + energy_filter = delayed_nu_fission_in.find_filter('energy') + delayed_nu_fission_in.remove_filter(energy_filter) + + # Compute chi and store it as the xs_tally attribute so we can + # use the generic get_xs(...) method + xs_tally = delayed_nu_fission_out / delayed_nu_fission_in + + # Add the coarse energy filter back to the nu-fission tally + delayed_nu_fission_in.filters.append(energy_filter) + + xs = xs_tally.get_values(filters=filters, + filter_bins=filter_bins, value=value) + + # Get chi delayed for all nuclides in the domain + elif nuclides == 'all': + nuclides = self.get_all_nuclides() + xs = self.xs_tally.get_values(filters=filters, + filter_bins=filter_bins, + nuclides=nuclides, value=value) + + # Get chi delayed for user-specified nuclides in the domain + else: + cv.check_iterable_type('nuclides', nuclides, basestring) + xs = self.xs_tally.get_values(filters=filters, + filter_bins=filter_bins, + nuclides=nuclides, value=value) + + # If chi delayed was computed as an average of nuclides in the domain + else: + xs = self.xs_tally.get_values(filters=filters, + filter_bins=filter_bins, value=value) + + # Reverse data if user requested increasing energy groups since + # tally data is stored in order of increasing energies + if order_groups == 'increasing': + + # Reshape tally data array with separate axes for domain and energy + if groups == 'all': + num_groups = self.num_groups + else: + num_groups = len(groups) + num_subdomains = int(xs.shape[0] / num_groups) + new_shape = (num_subdomains, num_groups) + xs.shape[1:] + xs = np.reshape(xs, new_shape) + + # Reverse energies to align with increasing energy groups + xs = xs[:, ::-1, :] + + # Eliminate trivial dimensions + xs = np.squeeze(xs) + xs = np.atleast_1d(xs) + + xs = np.nan_to_num(xs) + return xs + + +class DelayedNuFissionXS(MDGXS): + """A fission delayed neutron production multi-group cross section. + + This class can be used for both OpenMC input generation and tally data + post-processing to compute spatially-homogenized and energy-integrated + multi-group fission neutron production cross sections for multi-group + neutronics calculations. At a minimum, one needs to set the + :attr:`DelayedNuFissionXS.energy_groups` and :attr:`DelayedNuFissionXS.domain` + properties. Tallies for the flux and appropriate reaction rates over the + specified domain are generated automatically via the + :attr:`DelayedNuFissionXS.tallies` property, which can then be appended to a + :class:`openmc.Tallies` instance. + + For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the + necessary data to compute multi-group cross sections from a + :class:`openmc.StatePoint` instance. The derived multi-group cross section + can then be obtained from the :attr:`DelayedNuFissionXS.xs_tally` property. + + For a spatial domain :math:`V` and energy group :math:`[E_g,E_{g-1}]`, the + fission neutron production cross section is calculated as: + + .. math:: + + \frac{\int_{r \in V} dr \int_{4\pi} d\Omega \int_{E_g}^{E_{g-1}} dE \; + \nu\sigma_f (r, E) \psi (r, E, \Omega)}{\int_{r \in V} dr \int_{4\pi} + d\Omega \int_{E_g}^{E_{g-1}} dE \; \psi (r, E, \Omega)}. + + + Parameters + ---------- + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh + The domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + The domain type for spatial homogenization + groups : openmc.mgxs.EnergyGroups + The energy group structure for energy condensation + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + name : str, optional + Name of the multi-group cross section. Used as a label to identify + tallies in OpenMC 'tallies.xml' file. + delayed_groups : openmc.mgxs.DelayedGroups + Delayed groups to filter out the xs + + Attributes + ---------- + name : str, optional + Name of the multi-group cross section + rxn_type : str + Reaction type (e.g., 'total', 'nu-fission', etc.) + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + domain : Material or Cell or Universe or Mesh + Domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + Domain type for spatial homogenization + energy_groups : openmc.mgxs.EnergyGroups + Energy group structure for energy condensation + delayed_groups : openmc.mgxs.DelayedGroups + Delayed groups to filter out the xs + tally_trigger : openmc.Trigger + An (optional) tally precision trigger given to each tally used to + compute the cross section + scores : list of str + The scores in each tally used to compute the multi-group cross section + filters : list of openmc.Filter + The filters in each tally used to compute the multi-group cross section + tally_keys : list of str + The keys into the tallies dictionary for each tally used to compute + the multi-group cross section + estimator : {'tracklength', 'analog'} + The tally estimator used to compute the multi-group cross section + tallies : collections.OrderedDict + OpenMC tallies needed to compute the multi-group cross section. The keys + are strings listed in the :attr:`NuFissionXS.tally_keys` property and + values are instances of :class:`openmc.Tally`. + rxn_rate_tally : openmc.Tally + Derived tally for the reaction rate tally used in the numerator to + compute the multi-group cross section. This attribute is None + unless the multi-group cross section has been computed. + xs_tally : openmc.Tally + Derived tally for the multi-group cross section. This attribute + is None unless the multi-group cross section has been computed. + num_subdomains : int + The number of subdomains is unity for 'material', 'cell' and 'universe' + domain types. When the This is equal to the number of cell instances + for 'distribcell' domain types (it is equal to unity prior to loading + tally data from a statepoint file). + num_nuclides : int + The number of nuclides for which the multi-group cross section is + being tracked. This is unity if the by_nuclide attribute is False. + nuclides : Iterable of str or 'sum' + The optional user-specified nuclides for which to compute cross + sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + are not specified by the user, all nuclides in the spatial domain + are included. This attribute is 'sum' if by_nuclide is false. + sparse : bool + Whether or not the MGXS' tallies use SciPy's LIL sparse matrix format + for compressed data storage + loaded_sp : bool + Whether or not a statepoint file has been loaded with tally data + derived : bool + Whether or not the MGXS is merged from one or more other MGXS + hdf5_key : str + The key used to index multi-group cross sections in an HDF5 data store + + """ + + def __init__(self, domain=None, domain_type=None, energy_groups=None, + by_nuclide=False, name='', delayed_groups=None): + super(DelayedNuFissionXS, self).__init__(domain, domain_type, + energy_groups, by_nuclide, + name, delayed_groups) + self._rxn_type = 'delayed-nu-fission' + + +class Beta(MDGXS): + """The delayed neutron fraction. + + This class can be used for both OpenMC input generation and tally data + post-processing to compute spatially-homogenized and energy-integrated + multi-group cross sections for multi-group neutronics calculations. At a + minimum, one needs to set the :attr:`ChiDelayed.energy_groups` and + :attr:`ChiDelayed.domain` properties. Tallies for the flux and appropriate + reaction rates over the specified domain are generated automatically via the + :attr:`ChiDelayed.tallies` property, which can then be appended to a + :class:`openmc.Tallies` instance. + + For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the + necessary data to compute multi-group cross sections from a + :class:`openmc.StatePoint` instance. The derived multi-group cross section + can then be obtained from the :attr:`ChiDelayed.xs_tally` property. + + For a spatial domain :math:`V` and energy group :math:`[E_g,E_{g-1}]`, the + fission spectrum is calculated as: + + .. math:: + + \langle \nu\sigma_{f,\rightarrow g} \phi \rangle &= \int_{r \in V} dr + \int_{4\pi} d\Omega' \int_0^\infty dE' \int_{E_g}^{E_{g-1}} dE \; \chi(E) + \nu\sigma_f (r, E') \psi(r, E', \Omega')\\ + \langle \nu\sigma_f \phi \rangle &= \int_{r \in V} dr \int_{4\pi} + d\Omega' \int_0^\infty dE' \int_0^\infty dE \; \chi(E) \nu\sigma_f (r, + E') \psi(r, E', \Omega') \\ + \chi_g &= \frac{\langle \nu\sigma_{f,\rightarrow g} \phi \rangle}{\langle + \nu\sigma_f \phi \rangle} + + Parameters + ---------- + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh + The domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + The domain type for spatial homogenization + groups : openmc.mgxs.EnergyGroups + The energy group structure for energy condensation + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + name : str, optional + Name of the multi-group cross section. Used as a label to identify + tallies in OpenMC 'tallies.xml' file. + delayed_groups : openmc.mgxs.DelayedGroups + Delayed groups to filter out the xs + + Attributes + ---------- + name : str, optional + Name of the multi-group cross section + rxn_type : str + Reaction type (e.g., 'total', 'nu-fission', etc.) + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + domain : Material or Cell or Universe or Mesh + Domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + Domain type for spatial homogenization + energy_groups : openmc.mgxs.EnergyGroups + Energy group structure for energy condensation + delayed_groups : openmc.mgxs.DelayedGroups + Delayed groups to filter out the xs + tally_trigger : openmc.Trigger + An (optional) tally precision trigger given to each tally used to + compute the cross section + scores : list of str + The scores in each tally used to compute the multi-group cross section + filters : list of openmc.Filter + The filters in each tally used to compute the multi-group cross section + tally_keys : list of str + The keys into the tallies dictionary for each tally used to compute + the multi-group cross section + estimator : {'tracklength', 'analog'} + The tally estimator used to compute the multi-group cross section + tallies : collections.OrderedDict + OpenMC tallies needed to compute the multi-group cross section. The keys + are strings listed in the :attr:`ChiDelayed.tally_keys` property and + values are instances of :class:`openmc.Tally`. + rxn_rate_tally : openmc.Tally + Derived tally for the reaction rate tally used in the numerator to + compute the multi-group cross section. This attribute is None + unless the multi-group cross section has been computed. + xs_tally : openmc.Tally + Derived tally for the multi-group cross section. This attribute + is None unless the multi-group cross section has been computed. + num_subdomains : int + The number of subdomains is unity for 'material', 'cell' and 'universe' + domain types. When the This is equal to the number of cell instances + for 'distribcell' domain types (it is equal to unity prior to loading + tally data from a statepoint file). + num_nuclides : int + The number of nuclides for which the multi-group cross section is + being tracked. This is unity if the by_nuclide attribute is False. + nuclides : Iterable of str or 'sum' + The optional user-specified nuclides for which to compute cross + sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + are not specified by the user, all nuclides in the spatial domain + are included. This attribute is 'sum' if by_nuclide is false. + sparse : bool + Whether or not the MGXS' tallies use SciPy's LIL sparse matrix format + for compressed data storage + loaded_sp : bool + Whether or not a statepoint file has been loaded with tally data + derived : bool + Whether or not the MGXS is merged from one or more other MGXS + hdf5_key : str + The key used to index multi-group cross sections in an HDF5 data store + + """ + + def __init__(self, domain=None, domain_type=None, energy_groups=None, + by_nuclide=False, name='', delayed_groups=None): + super(Beta, self).__init__(domain, domain_type, energy_groups, + by_nuclide, name, delayed_groups) + self._rxn_type = 'beta' + + @property + def scores(self): + return ['delayed-nu-fission', 'nu-fission'] + + @property + def filters(self): + # Create the non-domain specific Filters for the Tallies + group_edges = self.energy_groups.group_edges + energy = openmc.Filter('energy', [group_edges[0], group_edges[-1]]) + if self.delayed_groups != None: + delayed_groups = self.delayed_groups.groups + delayed_filter = openmc.Filter('delayedgroup', delayed_groups) + return [[delayed_filter, energy], [energy]] + else: + return [[energy], [energy]] + + @property + def tally_keys(self): + return ['delayed-nu-fission', 'nu-fission'] + + @property + def rxn_rate_tally(self): + if self._rxn_rate_tally is None: + self._rxn_rate_tally = self.tallies['delayed-nu-fission'] + self._rxn_rate_tally.sparse = self.sparse + return self._rxn_rate_tally + + @property + def xs_tally(self): + + if self._xs_tally is None: + nu_fission = self.tallies['nu-fission'] + + # Compute chi + self._xs_tally = self.rxn_rate_tally / nu_fission + super(Beta, self)._compute_xs() + + return self._xs_tally diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index acc240e045..6ed4f9f7b9 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -36,9 +36,9 @@ MGXS_TYPES = ['total', 'multiplicity matrix', 'nu-fission matrix', 'chi', - 'chi-delayed', 'chi-prompt', - 'inverse-velocity'] + 'inverse-velocity', + 'prompt-neutron-lifetime'] # Supported domain types # TODO: Implement Mesh domains @@ -496,12 +496,12 @@ class MGXS(object): mgxs = NuFissionMatrixXS(domain, domain_type, energy_groups) elif mgxs_type == 'chi': mgxs = Chi(domain, domain_type, energy_groups) - elif mgxs_type == 'chi-delayed': - mgxs = ChiDelayed(domain, domain_type, energy_groups) elif mgxs_type == 'chi-prompt': mgxs = ChiPrompt(domain, domain_type, energy_groups) - elif mgxs_type == 'velocity': - mgxs = Velocity(domain, domain_type, energy_groups) + elif mgxs_type == 'inverse-velocity': + mgxs = InverseVelocity(domain, domain_type, energy_groups) + elif mgxs_type == 'prompt-neutron-lifetime': + mgxs = PromptNeutronLifetime(domain, domain_type, energy_groups) mgxs.by_nuclide = by_nuclide mgxs.name = name @@ -1010,16 +1010,16 @@ class MGXS(object): cv.check_iterable_type('energy_groups', groups, Integral) # Build lists of filters and filter bins to slice - if len(groups) == 0: - filters = [] - filter_bins = [] - else: - filter_bins = [] + filters = [] + filter_bins = [] + + if len(groups) != 0: + energy_bins = [] for group in groups: group_bounds = self.energy_groups.get_group_bounds(group) - filter_bins.append(group_bounds) - filter_bins = [tuple(filter_bins)] - filters = ['energy'] + energy_bins.append(group_bounds) + filter_bins.append(tuple(energy_bins)) + filters.append('energy') # Clone this MGXS to initialize the sliced version slice_xs = copy.deepcopy(self) @@ -2627,7 +2627,7 @@ class CaptureXS(MGXS): class FissionXS(MGXS): - r"""A fission multi-group cross section. + """A fission multi-group cross section. This class can be used for both OpenMC input generation and tally data post-processing to compute spatially-homogenized and energy-integrated @@ -2846,7 +2846,6 @@ class NuFissionXS(MGXS): groups, by_nuclide, name) self._rxn_type = 'nu-fission' - class KappaFissionXS(MGXS): """A recoverable fission energy production rate multi-group cross section. @@ -3989,7 +3988,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): class MultiplicityMatrixXS(MatrixMGXS): - r"""The scattering multiplicity matrix. + """The scattering multiplicity matrix. This class can be used for both OpenMC input generation and tally data post-processing to compute spatially-homogenized and energy-integrated @@ -4143,7 +4142,7 @@ class MultiplicityMatrixXS(MatrixMGXS): class NuFissionMatrixXS(MatrixMGXS): - r"""A fission production matrix multi-group cross section. + """A fission production matrix multi-group cross section. This class can be used for both OpenMC input generation and tally data post-processing to compute spatially-homogenized and energy-integrated @@ -4716,583 +4715,6 @@ class Chi(MGXS): return df -class ChiDelayed(Chi): - """The delayed fission spectrum. - - This class can be used for both OpenMC input generation and tally data - post-processing to compute spatially-homogenized and energy-integrated - multi-group cross sections for multi-group neutronics calculations. At a - minimum, one needs to set the :attr:`ChiDelayed.energy_groups` and - :attr:`ChiDelayed.domain` properties. Tallies for the flux and appropriate - reaction rates over the specified domain are generated automatically via the - :attr:`ChiDelayed.tallies` property, which can then be appended to a - :class:`openmc.Tallies` instance. - - For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the - necessary data to compute multi-group cross sections from a - :class:`openmc.StatePoint` instance. The derived multi-group cross section - can then be obtained from the :attr:`ChiDelayed.xs_tally` property. - - For a spatial domain :math:`V` and energy group :math:`[E_g,E_{g-1}]`, the - fission spectrum is calculated as: - - .. math:: - - \langle \nu\sigma_{f,\rightarrow g} \phi \rangle &= \int_{r \in V} dr - \int_{4\pi} d\Omega' \int_0^\infty dE' \int_{E_g}^{E_{g-1}} dE \; \chi(E) - \nu\sigma_f (r, E') \psi(r, E', \Omega')\\ - \langle \nu\sigma_f \phi \rangle &= \int_{r \in V} dr \int_{4\pi} - d\Omega' \int_0^\infty dE' \int_0^\infty dE \; \chi(E) \nu\sigma_f (r, - E') \psi(r, E', \Omega') \\ - \chi_g &= \frac{\langle \nu\sigma_{f,\rightarrow g} \phi \rangle}{\langle - \nu\sigma_f \phi \rangle} - - Parameters - ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh - The domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} - The domain type for spatial homogenization - groups : openmc.mgxs.EnergyGroups - The energy group structure for energy condensation - by_nuclide : bool - If true, computes cross sections for each nuclide in domain - name : str, optional - Name of the multi-group cross section. Used as a label to identify - tallies in OpenMC 'tallies.xml' file. - - Attributes - ---------- - name : str, optional - Name of the multi-group cross section - rxn_type : str - Reaction type (e.g., 'total', 'nu-fission', etc.) - by_nuclide : bool - If true, computes cross sections for each nuclide in domain - domain : Material or Cell or Universe or Mesh - Domain for spatial homogenization - domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} - Domain type for spatial homogenization - energy_groups : openmc.mgxs.EnergyGroups - Energy group structure for energy condensation - delayed_groups : list of int - Delayed groups to filter out the xs - tally_trigger : openmc.Trigger - An (optional) tally precision trigger given to each tally used to - compute the cross section - scores : list of str - The scores in each tally used to compute the multi-group cross section - filters : list of openmc.Filter - The filters in each tally used to compute the multi-group cross section - tally_keys : list of str - The keys into the tallies dictionary for each tally used to compute - the multi-group cross section - estimator : {'tracklength', 'analog'} - The tally estimator used to compute the multi-group cross section - tallies : collections.OrderedDict - OpenMC tallies needed to compute the multi-group cross section. The keys - are strings listed in the :attr:`ChiDelayed.tally_keys` property and - values are instances of :class:`openmc.Tally`. - rxn_rate_tally : openmc.Tally - Derived tally for the reaction rate tally used in the numerator to - compute the multi-group cross section. This attribute is None - unless the multi-group cross section has been computed. - xs_tally : openmc.Tally - Derived tally for the multi-group cross section. This attribute - is None unless the multi-group cross section has been computed. - num_subdomains : int - The number of subdomains is unity for 'material', 'cell' and 'universe' - domain types. When the This is equal to the number of cell instances - for 'distribcell' domain types (it is equal to unity prior to loading - tally data from a statepoint file). - num_nuclides : int - The number of nuclides for which the multi-group cross section is - being tracked. This is unity if the by_nuclide attribute is False. - nuclides : Iterable of str or 'sum' - The optional user-specified nuclides for which to compute cross - sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides - are not specified by the user, all nuclides in the spatial domain - are included. This attribute is 'sum' if by_nuclide is false. - sparse : bool - Whether or not the MGXS' tallies use SciPy's LIL sparse matrix format - for compressed data storage - loaded_sp : bool - Whether or not a statepoint file has been loaded with tally data - derived : bool - Whether or not the MGXS is merged from one or more other MGXS - hdf5_key : str - The key used to index multi-group cross sections in an HDF5 data store - - """ - - def __init__(self, domain=None, domain_type=None, - groups=None, by_nuclide=False, name='', delayed_groups=None): - super(ChiDelayed, self).__init__(domain, domain_type, groups, by_nuclide, name) - self._rxn_type = 'chi-delayed' - self._delayed_groups = None - - if delayed_groups is not None: - self.delayed_groups = delayed_groups - - @property - def delayed_groups(self): - return self._delayed_groups - - @property - def num_delayed_groups(self): - if self._delayed_groups != None: - return len(self.delayed_groups) - else: - return 0 - - @delayed_groups.setter - def delayed_groups(self, delayed_groups): - cv.check_iterable_type('delayed groups', delayed_groups, int) - self._delayed_groups = delayed_groups - - @property - def filters(self): - # Create the non-domain specific Filters for the Tallies - group_edges = self.energy_groups.group_edges - energyout = openmc.Filter('energyout', group_edges) - energyin = openmc.Filter('energy', [group_edges[0], group_edges[-1]]) - if self.delayed_groups != None: - delayed_group_filter = openmc.Filter('delayedgroup', self.delayed_groups) - return [[delayed_group_filter, energyin], [delayed_group_filter, energyout]] - else: - return [[energyin], [energyout]] - - @property - def scores(self): - return ['delayed-nu-fission', 'delayed-nu-fission'] - - @property - def tally_keys(self): - return ['delayed-nu-fission-in', 'delayed-nu-fission-out'] - - @property - def rxn_rate_tally(self): - if self._rxn_rate_tally is None: - self._rxn_rate_tally = self.tallies['delayed-nu-fission-out'] - self._rxn_rate_tally.sparse = self.sparse - return self._rxn_rate_tally - - @property - def xs_tally(self): - - if self._xs_tally is None: - delayed_nu_fission_in = self.tallies['delayed-nu-fission-in'] - - # Remove coarse energy filter to keep it out of tally arithmetic - energy_filter = delayed_nu_fission_in.find_filter('energy') - delayed_nu_fission_in.remove_filter(energy_filter) - - # Compute chi - self._xs_tally = self.rxn_rate_tally / delayed_nu_fission_in - super(ChiDelayed, self)._compute_xs() - - # Add the coarse energy filter back to the nu-fission tally - delayed_nu_fission_in.filters.append(energy_filter) - - return self._xs_tally - - def get_slice(self, nuclides=[], groups=[]): - """Build a sliced ChiDelayed for the specified nuclides and energy - groups. - - This method constructs a new MGXS to encapsulate a subset of the data - represented by this MGXS. The subset of data to include in the tally - slice is determined by the nuclides and energy groups specified in - the input parameters. - - Parameters - ---------- - nuclides : list of str - A list of nuclide name strings - (e.g., ['U-235', 'U-238']; default is []) - groups : list of Integral - A list of energy group indices starting at 1 for the high energies - (e.g., [1, 2, 3]; default is []) - - Returns - ------- - openmc.mgxs.MGXS - A new MGXS which encapsulates the subset of data requested - for the nuclide(s) and/or energy group(s) requested in the - parameters. - - """ - - # Temporarily remove energy filter from delayed-nu-fission-in since its - # group structure will work in super MGXS.get_slice(...) method - delayed_nu_fission_in = self.tallies['delayed-nu-fission-in'] - energy_filter = delayed_nu_fission_in.find_filter('energy') - delayed_nu_fission_in.remove_filter(energy_filter) - - # Call super class method and null out derived tallies - slice_xs = super(ChiDelayed, self).get_slice(nuclides, groups) - slice_xs._rxn_rate_tally = None - slice_xs._xs_tally = None - - # Slice energy groups if needed - if len(groups) != 0: - filter_bins = [] - for group in groups: - group_bounds = self.energy_groups.get_group_bounds(group) - filter_bins.append(group_bounds) - filter_bins = [tuple(filter_bins)] - - # Slice nu-fission-out tally along energyout filter - delayed_nu_fission_out = slice_xs.tallies['delayed-nu-fission-out'] - tally_slice = delayed_nu_fission_out.get_slice(filters=['energyout'], - filter_bins=filter_bins) - slice_xs._tallies['delayed-nu-fission-out'] = tally_slice - - # Add energy filter back to nu-fission-in tallies - self.tallies['delayed-nu-fission-in'].add_filter(energy_filter) - slice_xs._tallies['delayed-nu-fission-in'].add_filter(energy_filter) - - slice_xs.sparse = self.sparse - return slice_xs - - def merge(self, other): - """Merge another ChiDelayed with this one - - If results have been loaded from a statepoint, then ChiDelayed are only - mergeable along one and only one of energy groups or nuclides. - - Parameters - ---------- - other : openmc.mgxs.MGXS - MGXS to merge with this one - - Returns - ------- - merged_mgxs : openmc.mgxs.MGXS - Merged MGXS - """ - - if not self.can_merge(other): - raise ValueError('Unable to merge ChiDelayed') - - # Create deep copy of tally to return as merged tally - merged_mgxs = copy.deepcopy(self) - merged_mgxs._derived = True - merged_mgxs._rxn_rate_tally = None - merged_mgxs._xs_tally = None - - # Merge energy groups - if self.energy_groups != other.energy_groups: - merged_groups = self.energy_groups.merge(other.energy_groups) - merged_mgxs.energy_groups = merged_groups - - # Merge nuclides - if self.nuclides != other.nuclides: - - # The nuclides must be mutually exclusive - for nuclide in self.nuclides: - if nuclide in other.nuclides: - msg = 'Unable to merge Chi Delayed with shared nuclides' - raise ValueError(msg) - - # Concatenate lists of nuclides for the merged MGXS - merged_mgxs.nuclides = self.nuclides + other.nuclides - - # Merge tallies - for tally_key in self.tallies: - merged_tally = self.tallies[tally_key].merge(other.tallies[tally_key]) - merged_mgxs.tallies[tally_key] = merged_tally - - return merged_mgxs - - def print_xs(self, subdomains='all', nuclides='all', xs_type='macro'): - """Prints a string representation for the multi-group cross section. - - Parameters - ---------- - subdomains : Iterable of Integral or 'all' - The subdomain IDs of the cross sections to include in the report. - Defaults to 'all'. - nuclides : Iterable of str or 'all' or 'sum' - The nuclides of the cross-sections to include in the report. This - may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). - The special string 'all' will report the cross sections for all - nuclides in the spatial domain. The special string 'sum' will - report the cross sections summed over all nuclides. Defaults to - 'all'. - xs_type: {'macro', 'micro'} - Return the macro or micro cross section in units of cm^-1 or barns. - Defaults to 'macro'. - - """ - - # Construct a collection of the subdomains to report - if not isinstance(subdomains, basestring): - cv.check_iterable_type('subdomains', subdomains, Integral) - elif self.domain_type == 'distribcell': - subdomains = np.arange(self.num_subdomains, dtype=np.int) - elif self.domain_type == 'mesh': - subdomains = [] - if (len(self.domain.dimension) == 3): - nx, ny, nz = self.domain.dimension - for x in range(1,nx+1): - for y in range(1,ny+1): - for z in range(1,nz+1): - subdomains.append((x, y, z)) - else: - nx, ny = self.domain.dimension - for x in range(1,nx+1): - for y in range(1,ny+1): - subdomains.append((x, y, 1)) - else: - subdomains = [self.domain.id] - - # Construct a collection of the nuclides to report - if self.by_nuclide: - if nuclides == 'all': - nuclides = self.get_all_nuclides() - if nuclides == 'sum': - nuclides = ['sum'] - else: - cv.check_iterable_type('nuclides', nuclides, basestring) - else: - nuclides = ['sum'] - - cv.check_value('xs_type', xs_type, ['macro', 'micro']) - - # Build header for string with type and domain info - string = 'Multi-Group XS\n' - string += '{0: <16}=\t{1}\n'.format('\tReaction Type', self.rxn_type) - string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type) - string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id) - - # If cross section data has not been computed, only print string header - if self.tallies is None: - print(string) - return - - string += '{0: <16}\n'.format('\tEnergy Groups:') - template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]\n' - - # Loop over energy groups ranges - for group in range(1, self.num_groups + 1): - bounds = self.energy_groups.get_group_bounds(group) - string += template.format('', group, bounds[0], bounds[1]) - - # Loop over all subdomains - for subdomain in subdomains: - - if self.domain_type == 'distribcell': - string += \ - '{0: <16}=\t{1}\n'.format('\tSubdomain', subdomain) - - # Loop over all Nuclides - for nuclide in nuclides: - - # Build header for nuclide type - if xs_type != 'sum': - string += '{0: <16}=\t{1}\n'.format('\tNuclide', nuclide) - - # Build header for cross section type - if xs_type == 'macro': - string += '{0: <16}\n'.format('\tCross Sections [cm^-1]:') - else: - string += '{0: <16}\n'.format('\tCross Sections [barns]:') - - if self.delayed_groups != None: - - for delayed_group in range(1, self.num_delayed_groups+1): - - template = '{0: <12}Delayed Group {1}:\t' - string += template.format('', delayed_group) - string += '\n' - - template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]:\t' - - # Loop over energy groups ranges - for group in range(1, self.num_groups+1): - bounds = self.energy_groups.get_group_bounds(group) - string += template.format('', group, bounds[0], bounds[1]) - average = self.get_xs([group], [subdomain], [nuclide], - xs_type=xs_type, value='mean', - delayed_groups=[delayed_group]) - rel_err = self.get_xs([group], [subdomain], [nuclide], - xs_type=xs_type, value='rel_err', - delayed_groups=[delayed_group]) - average = average.flatten()[0] - rel_err = rel_err.flatten()[0] * 100. - string += '{:.2e} +/- {:1.2e}%'.format(average, rel_err) - string += '\n' - string += '\n' - string += '\n' - - else: - - template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]:\t' - - # Loop over energy groups ranges - for group in range(1, self.num_groups+1): - bounds = self.energy_groups.get_group_bounds(group) - string += template.format('', group, bounds[0], bounds[1]) - average = self.get_xs([group], [subdomain], [nuclide], - xs_type=xs_type, value='mean') - rel_err = self.get_xs([group], [subdomain], [nuclide], - xs_type=xs_type, value='rel_err') - average = average.flatten()[0] - rel_err = rel_err.flatten()[0] * 100. - string += '{:.2e} +/- {:1.2e}%'.format(average, rel_err) - string += '\n' - string += '\n' - string += '\n' - - - print(string) - - def get_xs(self, groups='all', subdomains='all', nuclides='all', - xs_type='macro', order_groups='increasing', - value='mean', delayed_groups='all', **kwargs): - """Returns an array of the fission spectrum. - - This method constructs a 2D NumPy array for the requested multi-group - cross section data data for one or more energy groups and subdomains. - - Parameters - ---------- - groups : Iterable of Integral or 'all' - Energy groups of interest. Defaults to 'all'. - delayed_groups : Iterable of Integral or 'all' - Delayed groups of interest. Defaults to 'all'. - subdomains : Iterable of Integral or 'all' - Subdomain IDs of interest. Defaults to 'all'. - nuclides : Iterable of str or 'all' or 'sum' - A list of nuclide name strings (e.g., ['U-235', 'U-238']). The - special string 'all' will return the cross sections for all nuclides - in the spatial domain. The special string 'sum' will return the - cross section summed over all nuclides. Defaults to 'all'. - xs_type: {'macro', 'micro'} - This parameter is not relevant for chi but is included here to - mirror the parent MGXS.get_xs(...) class method - order_groups: {'increasing', 'decreasing'} - Return the cross section indexed according to increasing or - decreasing energy groups (decreasing or increasing energies). - Defaults to 'increasing'. - value : {'mean', 'std_dev', 'rel_err'} - A string for the type of value to return. Defaults to 'mean'. - - Returns - ------- - numpy.ndarray - A NumPy array of the multi-group cross section indexed in the order - each group, subdomain and nuclide is listed in the parameters. - - Raises - ------ - ValueError - When this method is called before the multi-group cross section is - computed from tally data. - - """ - - cv.check_value('value', value, ['mean', 'std_dev', 'rel_err']) - cv.check_value('xs_type', xs_type, ['macro', 'micro']) - - filters = [] - filter_bins = [] - - # Construct a collection of the domain filter bins - if not isinstance(subdomains, basestring): - cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=3) - for subdomain in subdomains: - filters.append(self.domain_type) - filter_bins.append((subdomain,)) - - # Construct list of energy group bounds tuples for all requested groups - if not isinstance(groups, basestring): - cv.check_iterable_type('groups', groups, Integral) - for group in groups: - filters.append('energyout') - filter_bins.append((self.energy_groups.get_group_bounds(group),)) - - # Construct list of delayed group tuples for all requested groups - if not isinstance(delayed_groups, basestring): - cv.check_iterable_type('delayed_groups', delayed_groups, Integral) - for delayed_group in delayed_groups: - filters.append('delayedgroups') - filter_bins.append((delayed_group,)) - - # If chi delayed was computed for each nuclide in the domain - if self.by_nuclide: - - # Get the sum as the fission source weighted average chi for all - # nuclides in the domain - if nuclides == 'sum' or nuclides == ['sum']: - - # Retrieve the fission production tallies - delayed_nu_fission_in = self.tallies['delayed-nu-fission-in'] - delayed_nu_fission_out = self.tallies['delayed-nu-fission-out'] - - # Sum out all nuclides - nuclides = self.get_all_nuclides() - delayed_nu_fission_in = delayed_nu_fission_in.summation(nuclides=nuclides) - delayed_nu_fission_out = delayed_nu_fission_out.summation(nuclides=nuclides) - - # Remove coarse energy filter to keep it out of tally arithmetic - energy_filter = delayed_nu_fission_in.find_filter('energy') - delayed_nu_fission_in.remove_filter(energy_filter) - - # Compute chi and store it as the xs_tally attribute so we can - # use the generic get_xs(...) method - xs_tally = delayed_nu_fission_out / delayed_nu_fission_in - - # Add the coarse energy filter back to the nu-fission tally - delayed_nu_fission_in.filters.append(energy_filter) - - xs = xs_tally.get_values(filters=filters, - filter_bins=filter_bins, value=value) - - # Get chi delayed for all nuclides in the domain - elif nuclides == 'all': - nuclides = self.get_all_nuclides() - xs = self.xs_tally.get_values(filters=filters, - filter_bins=filter_bins, - nuclides=nuclides, value=value) - - # Get chi delayed for user-specified nuclides in the domain - else: - cv.check_iterable_type('nuclides', nuclides, basestring) - xs = self.xs_tally.get_values(filters=filters, - filter_bins=filter_bins, - nuclides=nuclides, value=value) - - # If chi delayed was computed as an average of nuclides in the domain - else: - xs = self.xs_tally.get_values(filters=filters, - filter_bins=filter_bins, value=value) - - # Reverse data if user requested increasing energy groups since - # tally data is stored in order of increasing energies - if order_groups == 'increasing': - - # Reshape tally data array with separate axes for domain and energy - if groups == 'all': - num_groups = self.num_groups - else: - num_groups = len(groups) - num_subdomains = int(xs.shape[0] / num_groups) - new_shape = (num_subdomains, num_groups) + xs.shape[1:] - xs = np.reshape(xs, new_shape) - - # Reverse energies to align with increasing energy groups - xs = xs[:, ::-1, :] - - # Eliminate trivial dimensions - xs = np.squeeze(xs) - xs = np.atleast_1d(xs) - - xs = np.nan_to_num(xs) - return xs - - class ChiPrompt(Chi): """The prompt fission spectrum. @@ -5813,3 +5235,244 @@ class InverseVelocity(MGXS): super(InverseVelocity, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'inverse-velocity' + + +class PromptNeutronLifetime(MGXS): + """The prompt neutron lifetime. + + This class can be used for both OpenMC input generation and tally data + post-processing to compute spatially-homogenized and energy-integrated + multi-group cross sections for multi-group neutronics calculations. At a + minimum, one needs to set the :attr:`PromptNeutronLifetime.energy_groups` + and :attr:`PromptNeutronLifetime.domain` properties. Tallies for the flux + and appropriate reaction rates over the specified domain are generated + automatically via the :attr:`PromptNeutronLifetime.tallies` property, which + can then be appended to a :class:`openmc.Tallies` instance. + + For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the + necessary data to compute multi-group cross sections from a + :class:`openmc.StatePoint` instance. The derived multi-group cross section + can then be obtained from the :attr:`PromptNeutronLifetime.xs_tally` + property. + + For a spatial domain :math:`V` and energy group :math:`[E_g,E_{g-1}]`, the + fission spectrum is calculated as: + + .. math:: + + \langle \nu\sigma_{f,\rightarrow g} \phi \rangle &= \int_{r \in V} dr + \int_{4\pi} d\Omega' \int_0^\infty dE' \int_{E_g}^{E_{g-1}} dE \; \chi(E) + \nu\sigma_f (r, E') \psi(r, E', \Omega')\\ + \langle \nu\sigma_f \phi \rangle &= \int_{r \in V} dr \int_{4\pi} + d\Omega' \int_0^\infty dE' \int_0^\infty dE \; \chi(E) \nu\sigma_f (r, + E') \psi(r, E', \Omega') \\ + \chi_g &= \frac{\langle \nu\sigma_{f,\rightarrow g} \phi \rangle}{\langle + \nu\sigma_f \phi \rangle} + + Parameters + ---------- + domain : openmc.Material or openmc.Cell or openmc.Universe or openmc.Mesh + The domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + The domain type for spatial homogenization + groups : openmc.mgxs.EnergyGroups + The energy group structure for energy condensation + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + name : str, optional + Name of the multi-group cross section. Used as a label to identify + tallies in OpenMC 'tallies.xml' file. + + Attributes + ---------- + name : str, optional + Name of the multi-group cross section + rxn_type : str + Reaction type (e.g., 'total', 'nu-fission', etc.) + by_nuclide : bool + If true, computes cross sections for each nuclide in domain + domain : Material or Cell or Universe or Mesh + Domain for spatial homogenization + domain_type : {'material', 'cell', 'distribcell', 'universe', 'mesh'} + Domain type for spatial homogenization + energy_groups : openmc.mgxs.EnergyGroups + Energy group structure for energy condensation + tally_trigger : openmc.Trigger + An (optional) tally precision trigger given to each tally used to + compute the cross section + scores : list of str + The scores in each tally used to compute the multi-group cross section + filters : list of openmc.Filter + The filters in each tally used to compute the multi-group cross section + tally_keys : list of str + The keys into the tallies dictionary for each tally used to compute + the multi-group cross section + estimator : {'tracklength', 'analog'} + The tally estimator used to compute the multi-group cross section + tallies : collections.OrderedDict + OpenMC tallies needed to compute the multi-group cross section. The keys + are strings listed in the :attr:`ChiDelayed.tally_keys` property and + values are instances of :class:`openmc.Tally`. + rxn_rate_tally : openmc.Tally + Derived tally for the reaction rate tally used in the numerator to + compute the multi-group cross section. This attribute is None + unless the multi-group cross section has been computed. + xs_tally : openmc.Tally + Derived tally for the multi-group cross section. This attribute + is None unless the multi-group cross section has been computed. + num_subdomains : int + The number of subdomains is unity for 'material', 'cell' and 'universe' + domain types. When the This is equal to the number of cell instances + for 'distribcell' domain types (it is equal to unity prior to loading + tally data from a statepoint file). + num_nuclides : int + The number of nuclides for which the multi-group cross section is + being tracked. This is unity if the by_nuclide attribute is False. + nuclides : Iterable of str or 'sum' + The optional user-specified nuclides for which to compute cross + sections (e.g., 'U-238', 'O-16'). If by_nuclide is True but nuclides + are not specified by the user, all nuclides in the spatial domain + are included. This attribute is 'sum' if by_nuclide is false. + sparse : bool + Whether or not the MGXS' tallies use SciPy's LIL sparse matrix format + for compressed data storage + loaded_sp : bool + Whether or not a statepoint file has been loaded with tally data + derived : bool + Whether or not the MGXS is merged from one or more other MGXS + hdf5_key : str + The key used to index multi-group cross sections in an HDF5 data store + + """ + + def __init__(self, domain=None, domain_type=None, + groups=None, by_nuclide=False, name=''): + super(PromptNeutronLifetime, self).__init__(domain, domain_type, groups, by_nuclide, name) + self._rxn_type = 'prompt-neutron-lifetime' + + @property + def scores(self): + return ['nu-fission', 'inverse-velocity'] + + @property + def tally_keys(self): + return ['nu-fission', 'inverse-velocity'] + + @property + def rxn_rate_tally(self): + if self._rxn_rate_tally is None: + self._rxn_rate_tally = self.tallies['inverse-velocity'] + self._rxn_rate_tally.sparse = self.sparse + return self._rxn_rate_tally + + @property + def xs_tally(self): + + if self._xs_tally is None: + nu_fission = self.tallies['nu-fission'] + + # Compute the prompt neutron lifetime + self._xs_tally = self.rxn_rate_tally / 100.0 / nu_fission + super(PromptNeutronLifetime, self)._compute_xs() + + return self._xs_tally + + def print_xs(self, subdomains='all', nuclides='all', xs_type='macro'): + """Print a string representation for the multi-group cross section. + + Parameters + ---------- + subdomains : Iterable of Integral or 'all' + The subdomain IDs of the cross sections to include in the report. + Defaults to 'all'. + nuclides : Iterable of str or 'all' or 'sum' + The nuclides of the cross-sections to include in the report. This + may be a list of nuclide name strings (e.g., ['U-235', 'U-238']). + The special string 'all' will report the cross sections for all + nuclides in the spatial domain. The special string 'sum' will report + the cross sections summed over all nuclides. Defaults to 'all'. + xs_type: {'macro', 'micro'} + Return the macro or micro cross section in units of cm^-1 or barns. + Defaults to 'macro'. + + """ + + # Construct a collection of the subdomains to report + if not isinstance(subdomains, basestring): + cv.check_iterable_type('subdomains', subdomains, Integral) + elif self.domain_type == 'distribcell': + subdomains = np.arange(self.num_subdomains, dtype=np.int) + elif self.domain_type == 'mesh': + subdomains = [] + if (len(self.domain.dimension) == 3): + nx, ny, nz = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + for z in range(1,nz+1): + subdomains.append((x, y, z)) + else: + nx, ny = self.domain.dimension + for x in range(1,nx+1): + for y in range(1,ny+1): + subdomains.append((x, y, 1)) + else: + subdomains = [self.domain.id] + + # Construct a collection of the nuclides to report + if self.by_nuclide: + if nuclides == 'all': + nuclides = self.get_all_nuclides() + elif nuclides == 'sum': + nuclides = ['sum'] + else: + cv.check_iterable_type('nuclides', nuclides, basestring) + else: + nuclides = ['sum'] + + cv.check_value('xs_type', xs_type, ['macro']) + + # Build header for string with type and domain info + string = 'Multi-Group XS\n' + string += '{0: <16}=\t{1}\n'.format('\tReaction Type', self.rxn_type) + string += '{0: <16}=\t{1}\n'.format('\tDomain Type', self.domain_type) + string += '{0: <16}=\t{1}\n'.format('\tDomain ID', self.domain.id) + + # If cross section data has not been computed, only print string header + if self.tallies is None: + print(string) + return + + # Loop over all subdomains + for subdomain in subdomains: + + if self.domain_type == 'distribcell': + string += '{0: <16}=\t{1}\n'.format('\tSubdomain', subdomain) + + # Loop over all Nuclides + for nuclide in nuclides: + + # Build header for nuclide type + if nuclide != 'sum': + string += '{0: <16}=\t{1}\n'.format('\tNuclide', nuclide) + + # Build header for cross section type + string += '{0: <16}\n'.format('\tCross Sections [seconds]:') + + template = '{0: <12}Group {1} [{2: <10} - {3: <10}MeV]:\t' + + # Loop over energy groups ranges + for group in range(1, self.num_groups+1): + bounds = self.energy_groups.get_group_bounds(group) + string += template.format('', group, bounds[0], bounds[1]) + average = self.get_xs([group], [subdomain], [nuclide], + xs_type=xs_type, value='mean') + rel_err = self.get_xs([group], [subdomain], [nuclide], + xs_type=xs_type, value='rel_err') + average = average.flatten()[0] + rel_err = rel_err.flatten()[0] * 100. + string += '{:.2e} +/- {:1.2e}%'.format(average, rel_err) + string += '\n' + string += '\n' + string += '\n' + + print(string) From 695cda64257d11e24eb0524eb3d97f5413f3102e Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 5 Jul 2016 08:42:56 -0400 Subject: [PATCH 004/168] fixed bug in tallies.py --- .../pythonapi/examples/mgxs-part-i.ipynb | 559 +++++------------- openmc/mgxs/mgxs.py | 2 + openmc/tallies.py | 5 + 3 files changed, 148 insertions(+), 418 deletions(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-i.ipynb b/docs/source/pythonapi/examples/mgxs-part-i.ipynb index 5c51b11d38..5ffdeece1d 100644 --- a/docs/source/pythonapi/examples/mgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-i.ipynb @@ -398,7 +398,7 @@ "# Instantiate a tally Mesh\n", "mesh = openmc.Mesh(name='mesh')\n", "mesh.type = 'regular'\n", - "mesh.dimension = [1, 1]\n", + "mesh.dimension = [2, 2]\n", "mesh.lower_left = [-0.63, -0.63]\n", "mesh.upper_right = [+0.63, +0.63]\n", "\n", @@ -406,9 +406,9 @@ "total = mgxs.TotalXS(domain=mesh, groups=groups)\n", "absorption = mgxs.AbsorptionXS(domain=mesh, groups=groups)\n", "scattering = mgxs.ScatterXS(domain=mesh, groups=groups)\n", - "#total = mgxs.TotalXS(domain=cell, groups=groups)\n", - "#absorption = mgxs.AbsorptionXS(domain=cell, groups=groups)\n", - "#scattering = mgxs.ScatterXS(domain=cell, groups=groups)" + "chi_prompt = mgxs.ChiPrompt(domain=mesh, groups=groups)\n", + "prompt_nu_fission = mgxs.PromptNuFissionXS(domain=mesh, groups=groups)\n", + "velocity = mgxs.Velocity(domain=mesh, groups=groups)" ] }, { @@ -428,22 +428,22 @@ { "data": { "text/plain": [ - "OrderedDict([('flux', Tally\n", + "OrderedDict([('inverse-velocity', Tally\n", " \tID =\t10000\n", " \tName =\t\n", " \tFilters =\t\n", " \t\tmesh\t[10000]\n", " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", " \tNuclides =\ttotal \n", - " \tScores =\t['flux']\n", - " \tEstimator =\ttracklength), ('absorption', Tally\n", + " \tScores =\t['inverse-velocity']\n", + " \tEstimator =\ttracklength), ('flux', Tally\n", " \tID =\t10001\n", " \tName =\t\n", " \tFilters =\t\n", " \t\tmesh\t[10000]\n", " \t\tenergy\t[ 0.00000000e+00 6.25000000e-07 2.00000000e+01]\n", " \tNuclides =\ttotal \n", - " \tScores =\t['absorption']\n", + " \tScores =\t['flux']\n", " \tEstimator =\ttracklength)])" ] }, @@ -453,7 +453,7 @@ } ], "source": [ - "absorption.tallies" + "velocity.tallies" ] }, { @@ -483,6 +483,15 @@ "# Add scattering tallies to the tallies file\n", "tallies_file += scattering.tallies.values()\n", "\n", + "# Add scattering tallies to the tallies file\n", + "tallies_file += chi_prompt.tallies.values()\n", + "\n", + "# Add scattering tallies to the tallies file\n", + "tallies_file += prompt_nu_fission.tallies.values()\n", + "\n", + "# Add scattering tallies to the tallies file\n", + "tallies_file += velocity.tallies.values()\n", + "\n", "# Export to \"tallies.xml\"\n", "tallies_file.export_to_xml()" ] @@ -521,9 +530,9 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.7.1\n", - " Git SHA1: d30d010aea2c1cba90c993a9c501be9d5d81921d\n", - " Date/Time: 2016-06-28 13:31:05\n", - " MPI Processes: 1\n", + " Git SHA1: edf2dd76c731a711cea7bbc28f0982292c19389f\n", + " Date/Time: 2016-07-05 08:40:11\n", + " MPI Processes: 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -578,20 +587,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 8.1200E-01 seconds\n", - " Reading cross sections = 2.4200E-01 seconds\n", - " Total time in simulation = 2.8910E+00 seconds\n", - " Time in transport only = 2.8710E+00 seconds\n", - " Time in inactive batches = 8.5700E-01 seconds\n", - " Time in active batches = 2.0340E+00 seconds\n", - " Time synchronizing fission bank = 0.0000E+00 seconds\n", - " Sampling source sites = 0.0000E+00 seconds\n", + " Total time for initialization = 1.3780E+00 seconds\n", + " Reading cross sections = 6.1400E-01 seconds\n", + " Total time in simulation = 1.9100E+00 seconds\n", + " Time in transport only = 1.7900E+00 seconds\n", + " Time in inactive batches = 3.6400E-01 seconds\n", + " Time in active batches = 1.5460E+00 seconds\n", + " Time synchronizing fission bank = 7.8000E-02 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 1.0000E-03 seconds\n", - " Total time elapsed = 3.7090E+00 seconds\n", - " Calculation Rate (inactive) = 11668.6 neutrons/second\n", - " Calculation Rate (active) = 4916.42 neutrons/second\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for finalization = 8.0000E-03 seconds\n", + " Total time elapsed = 3.2980E+00 seconds\n", + " Calculation Rate (inactive) = 27472.5 neutrons/second\n", + " Calculation Rate (active) = 6468.31 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -616,7 +625,7 @@ ], "source": [ "# Run OpenMC\n", - "openmc.run()" + "openmc.run(mpi_procs=4)" ] }, { @@ -665,12 +674,82 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n", + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n", + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n", + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n", + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n", + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n", + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n", + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n", + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n", + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n", + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n", + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n", + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n", + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n", + "['mesh']\n", + "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "[0]\n", + "[10000]\n" + ] + } + ], "source": [ "# Load the tallies from the statepoint into each MGXS object\n", "total.load_from_statepoint(sp)\n", "absorption.load_from_statepoint(sp)\n", - "scattering.load_from_statepoint(sp)" + "scattering.load_from_statepoint(sp)\n", + "chi_prompt.load_from_statepoint(sp)\n", + "prompt_nu_fission.load_from_statepoint(sp)\n", + "velocity.load_from_statepoint(sp)" ] }, { @@ -702,24 +781,22 @@ }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Group XS\n", - "\tReaction Type =\ttotal\n", - "\tDomain Type =\tmesh\n", - "\tDomain ID =\t10000\n", - "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t6.79e-01 +/- 7.64e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t1.40e+00 +/- 1.79e+00%\n", - "\n", - "\n", - "\n" + "ename": "IndexError", + "evalue": "index 3 is out of bounds for axis 0 with size 2", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mvelocity\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprint_xs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m/Users/sam/.local/lib/python2.7/site-packages/openmc-0.7.1-py2.7.egg/openmc/mgxs/mgxs.pyc\u001b[0m in \u001b[0;36mprint_xs\u001b[0;34m(self, subdomains, nuclides, xs_type)\u001b[0m\n\u001b[1;32m 5325\u001b[0m \u001b[0mstring\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mtemplate\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgroup\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbounds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbounds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5326\u001b[0m average = self.get_xs([group], [subdomain], [nuclide],\n\u001b[0;32m-> 5327\u001b[0;31m xs_type=xs_type, value='mean')\n\u001b[0m\u001b[1;32m 5328\u001b[0m rel_err = self.get_xs([group], [subdomain], [nuclide],\n\u001b[1;32m 5329\u001b[0m xs_type=xs_type, value='rel_err')\n", + "\u001b[0;32m/Users/sam/.local/lib/python2.7/site-packages/openmc-0.7.1-py2.7.egg/openmc/mgxs/mgxs.pyc\u001b[0m in \u001b[0;36mget_xs\u001b[0;34m(self, groups, subdomains, nuclides, xs_type, order_groups, value, **kwargs)\u001b[0m\n\u001b[1;32m 819\u001b[0m \u001b[0mxs_tally\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxs_tally\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msummation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnuclides\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mquery_nuclides\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 820\u001b[0m xs = xs_tally.get_values(filters=filters,\n\u001b[0;32m--> 821\u001b[0;31m filter_bins=filter_bins, value=value)\n\u001b[0m\u001b[1;32m 822\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 823\u001b[0m xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins,\n", + "\u001b[0;32m/Users/sam/.local/lib/python2.7/site-packages/openmc-0.7.1-py2.7.egg/openmc/tallies.pyc\u001b[0m in \u001b[0;36mget_values\u001b[0;34m(self, scores, filters, filter_bins, nuclides, value)\u001b[0m\n\u001b[1;32m 1479\u001b[0m \u001b[0;31m# Return the desired result from Tally\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1480\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'mean'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1481\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindices\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1482\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'std_dev'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1483\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstd_dev\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindices\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mIndexError\u001b[0m: index 3 is out of bounds for axis 0 with size 2" ] } ], "source": [ - "total.print_xs()" + "velocity.print_xs()" ] }, { @@ -731,73 +808,11 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - "
mesh 10000group innuclidemeanstd. dev.
xyz
11111total0.6662610.005072
01112total1.2924510.022969
\n", - "
" - ], - "text/plain": [ - " mesh 10000 group in nuclide mean std. dev.\n", - " x y z \n", - "1 1 1 1 1 total 0.666261 0.005072\n", - "0 1 1 1 2 total 1.292451 0.022969" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "df = scattering.get_pandas_dataframe()\n", "df.head(10)" @@ -812,13 +827,18 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ - "#absorption.export_xs_data(filename='absorption-xs', format='excel')" + "#total.export_xs_data(filename='total-xs', format='excel')\n", + "#absorption.export_xs_data(filename='absorption-xs', format='excel')\n", + "#scattering.export_xs_data(filename='scattering-xs', format='excel')\n", + "#chi_prompt.export_xs_data(filename='chi-prompt', format='excel')\n", + "#prompt_nu_fission.export_xs_data(filename='prompt-nu-fission', format='excel')\n", + "#velocity.export_xs_data(filename='velocity', format='excel')" ] }, { @@ -830,7 +850,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": { "collapsed": false }, @@ -838,7 +858,10 @@ "source": [ "total.build_hdf5_store(filename='mgxs', append=True)\n", "absorption.build_hdf5_store(filename='mgxs', append=True)\n", - "scattering.build_hdf5_store(filename='mgxs', append=True)" + "scattering.build_hdf5_store(filename='mgxs', append=True)\n", + "chi_prompt.build_hdf5_store(filename='mgxs', append=True)\n", + "prompt_nu_fission.build_hdf5_store(filename='mgxs', append=True)\n", + "velocity.build_hdf5_store(filename='mgxs', append=True)" ] }, { @@ -857,86 +880,11 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - "
mesh 10000energy low [MeV]energy high [MeV]nuclidescoremeanstd. dev.
xyz
01110.000000e+006.250000e-07total(((total / flux) - (absorption / flux)) - (sca...-1.554312e-150.033991
11116.250000e-072.000000e+01total(((total / flux) - (absorption / flux)) - (sca...-2.886580e-150.007258
\n", - "
" - ], - "text/plain": [ - " mesh 10000 energy low [MeV] energy high [MeV] nuclide \\\n", - " x y z \n", - "0 1 1 1 0.00e+00 6.25e-07 total \n", - "1 1 1 1 6.25e-07 2.00e+01 total \n", - "\n", - " score mean std. dev. \n", - " \n", - "0 (((total / flux) - (absorption / flux)) - (sca... -1.55e-15 3.40e-02 \n", - "1 (((total / flux) - (absorption / flux)) - (sca... -2.89e-15 7.26e-03 " - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Use tally arithmetic to compute the difference between the total, absorption and scattering\n", "difference = total.xs_tally - absorption.xs_tally - scattering.xs_tally\n", @@ -954,86 +902,11 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - "
mesh 10000energy low [MeV]energy high [MeV]nuclidescoremeanstd. dev.
xyz
01110.000000e+006.250000e-07total((absorption / flux) / (total / flux))0.0761440.001984
11116.250000e-072.000000e+01total((absorption / flux) / (total / flux))0.0192240.000329
\n", - "
" - ], - "text/plain": [ - " mesh 10000 energy low [MeV] energy high [MeV] nuclide \\\n", - " x y z \n", - "0 1 1 1 0.00e+00 6.25e-07 total \n", - "1 1 1 1 6.25e-07 2.00e+01 total \n", - "\n", - " score mean std. dev. \n", - " \n", - "0 ((absorption / flux) / (total / flux)) 7.61e-02 1.98e-03 \n", - "1 ((absorption / flux) / (total / flux)) 1.92e-02 3.29e-04 " - ] - }, - "execution_count": 23, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Use tally arithmetic to compute the absorption-to-total MGXS ratio\n", "absorption_to_total = absorption.xs_tally / total.xs_tally\n", @@ -1044,86 +917,11 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - "
mesh 10000energy low [MeV]energy high [MeV]nuclidescoremeanstd. dev.
xyz
01110.000000e+006.250000e-07total((scatter / flux) / (total / flux))0.9238560.023272
11116.250000e-072.000000e+01total((scatter / flux) / (total / flux))0.9807760.010576
\n", - "
" - ], - "text/plain": [ - " mesh 10000 energy low [MeV] energy high [MeV] nuclide \\\n", - " x y z \n", - "0 1 1 1 0.00e+00 6.25e-07 total \n", - "1 1 1 1 6.25e-07 2.00e+01 total \n", - "\n", - " score mean std. dev. \n", - " \n", - "0 ((scatter / flux) / (total / flux)) 9.24e-01 2.33e-02 \n", - "1 ((scatter / flux) / (total / flux)) 9.81e-01 1.06e-02 " - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Use tally arithmetic to compute the scattering-to-total MGXS ratio\n", "scattering_to_total = scattering.xs_tally / total.xs_tally\n", @@ -1141,86 +939,11 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\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", - "
mesh 10000energy low [MeV]energy high [MeV]nuclidescoremeanstd. dev.
xyz
01110.000000e+006.250000e-07total(((absorption / flux) / (total / flux)) + ((sc...10.023356
11116.250000e-072.000000e+01total(((absorption / flux) / (total / flux)) + ((sc...10.010581
\n", - "
" - ], - "text/plain": [ - " mesh 10000 energy low [MeV] energy high [MeV] nuclide \\\n", - " x y z \n", - "0 1 1 1 0.00e+00 6.25e-07 total \n", - "1 1 1 1 6.25e-07 2.00e+01 total \n", - "\n", - " score mean std. dev. \n", - " \n", - "0 (((absorption / flux) / (total / flux)) + ((sc... 1.00e+00 2.34e-02 \n", - "1 (((absorption / flux) / (total / flux)) + ((sc... 1.00e+00 1.06e-02 " - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# 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", diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index f719cc5cbc..d79d322efd 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -733,6 +733,8 @@ class MGXS(object): sp_tally = statepoint.get_tally( tally.scores, tally.filters, tally.nuclides, estimator=tally.estimator, exact_filters=True) + print(filters) + print(filter_bins) sp_tally = sp_tally.get_slice( tally.scores, filters, filter_bins, tally.nuclides) sp_tally.sparse = self.sparse diff --git a/openmc/tallies.py b/openmc/tallies.py index af19549a7c..0531cf47fe 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2986,10 +2986,15 @@ class Tally(object): elif filter_type == 'distribcell': bin_indices = [0] num_bins = find_filter.num_bins + elif filter_type == 'mesh': + bin_indices = [0] + num_bins = find_filter.mesh.num_mesh_cells else: bin_indices.append(bin_index) num_bins += 1 + print(bin_indices) + print(find_filter.bins) find_filter.bins = np.unique(find_filter.bins[bin_indices]) find_filter.num_bins = num_bins From 092760d59fbac8d929ab33b5fdc48eab0c6cc8ac Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 5 Jul 2016 08:43:17 -0400 Subject: [PATCH 005/168] updated mgxs-part-i --- .../pythonapi/examples/mgxs-part-i.ipynb | 857 +++++++++++++++++- 1 file changed, 819 insertions(+), 38 deletions(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-i.ipynb b/docs/source/pythonapi/examples/mgxs-part-i.ipynb index 5ffdeece1d..f3433b98c4 100644 --- a/docs/source/pythonapi/examples/mgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-i.ipynb @@ -531,7 +531,7 @@ " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.7.1\n", " Git SHA1: edf2dd76c731a711cea7bbc28f0982292c19389f\n", - " Date/Time: 2016-07-05 08:40:11\n", + " Date/Time: 2016-07-05 08:42:21\n", " MPI Processes: 4\n", "\n", " ===========================================================================\n", @@ -587,20 +587,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 1.3780E+00 seconds\n", - " Reading cross sections = 6.1400E-01 seconds\n", - " Total time in simulation = 1.9100E+00 seconds\n", - " Time in transport only = 1.7900E+00 seconds\n", - " Time in inactive batches = 3.6400E-01 seconds\n", - " Time in active batches = 1.5460E+00 seconds\n", - " Time synchronizing fission bank = 7.8000E-02 seconds\n", - " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 8.0000E-03 seconds\n", - " Total time elapsed = 3.2980E+00 seconds\n", - " Calculation Rate (inactive) = 27472.5 neutrons/second\n", - " Calculation Rate (active) = 6468.31 neutrons/second\n", + " Total time for initialization = 9.5600E-01 seconds\n", + " Reading cross sections = 2.7100E-01 seconds\n", + " Total time in simulation = 1.7180E+00 seconds\n", + " Time in transport only = 1.6250E+00 seconds\n", + " Time in inactive batches = 2.7700E-01 seconds\n", + " Time in active batches = 1.4410E+00 seconds\n", + " Time synchronizing fission bank = 6.1000E-02 seconds\n", + " Sampling source sites = 0.0000E+00 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 2.0000E-03 seconds\n", + " Total time for finalization = 5.0000E-03 seconds\n", + " Total time elapsed = 2.6810E+00 seconds\n", + " Calculation Rate (inactive) = 36101.1 neutrons/second\n", + " Calculation Rate (active) = 6939.63 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -781,17 +781,34 @@ }, "outputs": [ { - "ename": "IndexError", - "evalue": "index 3 is out of bounds for axis 0 with size 2", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mvelocity\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprint_xs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", - "\u001b[0;32m/Users/sam/.local/lib/python2.7/site-packages/openmc-0.7.1-py2.7.egg/openmc/mgxs/mgxs.pyc\u001b[0m in \u001b[0;36mprint_xs\u001b[0;34m(self, subdomains, nuclides, xs_type)\u001b[0m\n\u001b[1;32m 5325\u001b[0m \u001b[0mstring\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0mtemplate\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mformat\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m''\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgroup\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbounds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mbounds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5326\u001b[0m average = self.get_xs([group], [subdomain], [nuclide],\n\u001b[0;32m-> 5327\u001b[0;31m xs_type=xs_type, value='mean')\n\u001b[0m\u001b[1;32m 5328\u001b[0m rel_err = self.get_xs([group], [subdomain], [nuclide],\n\u001b[1;32m 5329\u001b[0m xs_type=xs_type, value='rel_err')\n", - "\u001b[0;32m/Users/sam/.local/lib/python2.7/site-packages/openmc-0.7.1-py2.7.egg/openmc/mgxs/mgxs.pyc\u001b[0m in \u001b[0;36mget_xs\u001b[0;34m(self, groups, subdomains, nuclides, xs_type, order_groups, value, **kwargs)\u001b[0m\n\u001b[1;32m 819\u001b[0m \u001b[0mxs_tally\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mxs_tally\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msummation\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnuclides\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mquery_nuclides\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 820\u001b[0m xs = xs_tally.get_values(filters=filters,\n\u001b[0;32m--> 821\u001b[0;31m filter_bins=filter_bins, value=value)\n\u001b[0m\u001b[1;32m 822\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 823\u001b[0m xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins,\n", - "\u001b[0;32m/Users/sam/.local/lib/python2.7/site-packages/openmc-0.7.1-py2.7.egg/openmc/tallies.pyc\u001b[0m in \u001b[0;36mget_values\u001b[0;34m(self, scores, filters, filter_bins, nuclides, value)\u001b[0m\n\u001b[1;32m 1479\u001b[0m \u001b[0;31m# Return the desired result from Tally\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1480\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'mean'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1481\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmean\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindices\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1482\u001b[0m \u001b[0;32melif\u001b[0m \u001b[0mvalue\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'std_dev'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1483\u001b[0m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstd_dev\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mindices\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;31mIndexError\u001b[0m: index 3 is out of bounds for axis 0 with size 2" + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Group XS\n", + "\tReaction Type =\tvelocity\n", + "\tDomain Type =\tmesh\n", + "\tDomain ID =\t10000\n", + "\tVelocity [cm/second]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t1.85e+07 +/- 1.57e+00%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t3.04e+05 +/- 2.55e+00%\n", + "\n", + "\n", + "\tVelocity [cm/second]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t1.85e+07 +/- 9.32e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t3.01e+05 +/- 2.62e+00%\n", + "\n", + "\n", + "\tVelocity [cm/second]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t1.82e+07 +/- 1.83e+00%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t3.04e+05 +/- 1.65e+00%\n", + "\n", + "\n", + "\tVelocity [cm/second]:\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t1.80e+07 +/- 1.41e+00%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t3.02e+05 +/- 2.18e+00%\n", + "\n", + "\n", + "\n" ] } ], @@ -808,11 +825,139 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + "
mesh 10000group innuclidemeanstd. dev.
xyz
11111total0.6666460.007969
01112total1.2909900.030906
31211total0.6644910.004534
21212total1.2945300.031677
52111total0.6665240.006541
42112total1.2913780.020686
72211total0.6673860.005754
62212total1.2929080.027042
\n", + "
" + ], + "text/plain": [ + " mesh 10000 group in nuclide mean std. dev.\n", + " x y z \n", + "1 1 1 1 1 total 0.666646 0.007969\n", + "0 1 1 1 2 total 1.290990 0.030906\n", + "3 1 2 1 1 total 0.664491 0.004534\n", + "2 1 2 1 2 total 1.294530 0.031677\n", + "5 2 1 1 1 total 0.666524 0.006541\n", + "4 2 1 1 2 total 1.291378 0.020686\n", + "7 2 2 1 1 total 0.667386 0.005754\n", + "6 2 2 1 2 total 1.292908 0.027042" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "df = scattering.get_pandas_dataframe()\n", "df.head(10)" @@ -827,7 +972,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": { "collapsed": false }, @@ -850,7 +995,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": { "collapsed": false }, @@ -880,11 +1025,170 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + "
mesh 10000energy low [MeV]energy high [MeV]nuclidescoremeanstd. dev.
xyz
01110.000000e+006.250000e-07total(((total / flux) - (absorption / flux)) - (sca...-6.661338e-160.045734
11116.250000e-072.000000e+01total(((total / flux) - (absorption / flux)) - (sca...5.551115e-160.011425
21210.000000e+006.250000e-07total(((total / flux) - (absorption / flux)) - (sca...0.000000e+000.046921
31216.250000e-072.000000e+01total(((total / flux) - (absorption / flux)) - (sca...-1.110223e-160.006502
42110.000000e+006.250000e-07total(((total / flux) - (absorption / flux)) - (sca...4.440892e-160.030542
52116.250000e-072.000000e+01total(((total / flux) - (absorption / flux)) - (sca...3.330669e-160.009373
62210.000000e+006.250000e-07total(((total / flux) - (absorption / flux)) - (sca...-2.220446e-160.039990
72216.250000e-072.000000e+01total(((total / flux) - (absorption / flux)) - (sca...0.000000e+000.008229
\n", + "
" + ], + "text/plain": [ + " mesh 10000 energy low [MeV] energy high [MeV] nuclide \\\n", + " x y z \n", + "0 1 1 1 0.00e+00 6.25e-07 total \n", + "1 1 1 1 6.25e-07 2.00e+01 total \n", + "2 1 2 1 0.00e+00 6.25e-07 total \n", + "3 1 2 1 6.25e-07 2.00e+01 total \n", + "4 2 1 1 0.00e+00 6.25e-07 total \n", + "5 2 1 1 6.25e-07 2.00e+01 total \n", + "6 2 2 1 0.00e+00 6.25e-07 total \n", + "7 2 2 1 6.25e-07 2.00e+01 total \n", + "\n", + " score mean std. dev. \n", + " \n", + "0 (((total / flux) - (absorption / flux)) - (sca... -6.66e-16 4.57e-02 \n", + "1 (((total / flux) - (absorption / flux)) - (sca... 5.55e-16 1.14e-02 \n", + "2 (((total / flux) - (absorption / flux)) - (sca... 0.00e+00 4.69e-02 \n", + "3 (((total / flux) - (absorption / flux)) - (sca... -1.11e-16 6.50e-03 \n", + "4 (((total / flux) - (absorption / flux)) - (sca... 4.44e-16 3.05e-02 \n", + "5 (((total / flux) - (absorption / flux)) - (sca... 3.33e-16 9.37e-03 \n", + "6 (((total / flux) - (absorption / flux)) - (sca... -2.22e-16 4.00e-02 \n", + "7 (((total / flux) - (absorption / flux)) - (sca... 0.00e+00 8.23e-03 " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Use tally arithmetic to compute the difference between the total, absorption and scattering\n", "difference = total.xs_tally - absorption.xs_tally - scattering.xs_tally\n", @@ -902,11 +1206,170 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + "
mesh 10000energy low [MeV]energy high [MeV]nuclidescoremeanstd. dev.
xyz
01110.000000e+006.250000e-07total((absorption / flux) / (total / flux))0.0759700.002673
11116.250000e-072.000000e+01total((absorption / flux) / (total / flux))0.0198160.000597
21210.000000e+006.250000e-07total((absorption / flux) / (total / flux))0.0763800.002764
31216.250000e-072.000000e+01total((absorption / flux) / (total / flux))0.0183040.000376
42110.000000e+006.250000e-07total((absorption / flux) / (total / flux))0.0759890.001752
52116.250000e-072.000000e+01total((absorption / flux) / (total / flux))0.0190920.000579
62210.000000e+006.250000e-07total((absorption / flux) / (total / flux))0.0762360.002319
72216.250000e-072.000000e+01total((absorption / flux) / (total / flux))0.0196820.000472
\n", + "
" + ], + "text/plain": [ + " mesh 10000 energy low [MeV] energy high [MeV] nuclide \\\n", + " x y z \n", + "0 1 1 1 0.00e+00 6.25e-07 total \n", + "1 1 1 1 6.25e-07 2.00e+01 total \n", + "2 1 2 1 0.00e+00 6.25e-07 total \n", + "3 1 2 1 6.25e-07 2.00e+01 total \n", + "4 2 1 1 0.00e+00 6.25e-07 total \n", + "5 2 1 1 6.25e-07 2.00e+01 total \n", + "6 2 2 1 0.00e+00 6.25e-07 total \n", + "7 2 2 1 6.25e-07 2.00e+01 total \n", + "\n", + " score mean std. dev. \n", + " \n", + "0 ((absorption / flux) / (total / flux)) 7.60e-02 2.67e-03 \n", + "1 ((absorption / flux) / (total / flux)) 1.98e-02 5.97e-04 \n", + "2 ((absorption / flux) / (total / flux)) 7.64e-02 2.76e-03 \n", + "3 ((absorption / flux) / (total / flux)) 1.83e-02 3.76e-04 \n", + "4 ((absorption / flux) / (total / flux)) 7.60e-02 1.75e-03 \n", + "5 ((absorption / flux) / (total / flux)) 1.91e-02 5.79e-04 \n", + "6 ((absorption / flux) / (total / flux)) 7.62e-02 2.32e-03 \n", + "7 ((absorption / flux) / (total / flux)) 1.97e-02 4.72e-04 " + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Use tally arithmetic to compute the absorption-to-total MGXS ratio\n", "absorption_to_total = absorption.xs_tally / total.xs_tally\n", @@ -917,11 +1380,170 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + "
mesh 10000energy low [MeV]energy high [MeV]nuclidescoremeanstd. dev.
xyz
01110.000000e+006.250000e-07total((scatter / flux) / (total / flux))0.9240300.031356
11116.250000e-072.000000e+01total((scatter / flux) / (total / flux))0.9801840.016619
21210.000000e+006.250000e-07total((scatter / flux) / (total / flux))0.9236200.032056
31216.250000e-072.000000e+01total((scatter / flux) / (total / flux))0.9816960.009510
42110.000000e+006.250000e-07total((scatter / flux) / (total / flux))0.9240110.020939
52116.250000e-072.000000e+01total((scatter / flux) / (total / flux))0.9809080.013650
62210.000000e+006.250000e-07total((scatter / flux) / (total / flux))0.9237640.027368
72216.250000e-072.000000e+01total((scatter / flux) / (total / flux))0.9803180.011958
\n", + "
" + ], + "text/plain": [ + " mesh 10000 energy low [MeV] energy high [MeV] nuclide \\\n", + " x y z \n", + "0 1 1 1 0.00e+00 6.25e-07 total \n", + "1 1 1 1 6.25e-07 2.00e+01 total \n", + "2 1 2 1 0.00e+00 6.25e-07 total \n", + "3 1 2 1 6.25e-07 2.00e+01 total \n", + "4 2 1 1 0.00e+00 6.25e-07 total \n", + "5 2 1 1 6.25e-07 2.00e+01 total \n", + "6 2 2 1 0.00e+00 6.25e-07 total \n", + "7 2 2 1 6.25e-07 2.00e+01 total \n", + "\n", + " score mean std. dev. \n", + " \n", + "0 ((scatter / flux) / (total / flux)) 9.24e-01 3.14e-02 \n", + "1 ((scatter / flux) / (total / flux)) 9.80e-01 1.66e-02 \n", + "2 ((scatter / flux) / (total / flux)) 9.24e-01 3.21e-02 \n", + "3 ((scatter / flux) / (total / flux)) 9.82e-01 9.51e-03 \n", + "4 ((scatter / flux) / (total / flux)) 9.24e-01 2.09e-02 \n", + "5 ((scatter / flux) / (total / flux)) 9.81e-01 1.36e-02 \n", + "6 ((scatter / flux) / (total / flux)) 9.24e-01 2.74e-02 \n", + "7 ((scatter / flux) / (total / flux)) 9.80e-01 1.20e-02 " + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Use tally arithmetic to compute the scattering-to-total MGXS ratio\n", "scattering_to_total = scattering.xs_tally / total.xs_tally\n", @@ -939,11 +1561,170 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + "
mesh 10000energy low [MeV]energy high [MeV]nuclidescoremeanstd. dev.
xyz
01110.000000e+006.250000e-07total(((absorption / flux) / (total / flux)) + ((sc...10.031469
11116.250000e-072.000000e+01total(((absorption / flux) / (total / flux)) + ((sc...10.016630
21210.000000e+006.250000e-07total(((absorption / flux) / (total / flux)) + ((sc...10.032175
31216.250000e-072.000000e+01total(((absorption / flux) / (total / flux)) + ((sc...10.009517
42110.000000e+006.250000e-07total(((absorption / flux) / (total / flux)) + ((sc...10.021012
52116.250000e-072.000000e+01total(((absorption / flux) / (total / flux)) + ((sc...10.013662
62210.000000e+006.250000e-07total(((absorption / flux) / (total / flux)) + ((sc...10.027466
72216.250000e-072.000000e+01total(((absorption / flux) / (total / flux)) + ((sc...10.011967
\n", + "
" + ], + "text/plain": [ + " mesh 10000 energy low [MeV] energy high [MeV] nuclide \\\n", + " x y z \n", + "0 1 1 1 0.00e+00 6.25e-07 total \n", + "1 1 1 1 6.25e-07 2.00e+01 total \n", + "2 1 2 1 0.00e+00 6.25e-07 total \n", + "3 1 2 1 6.25e-07 2.00e+01 total \n", + "4 2 1 1 0.00e+00 6.25e-07 total \n", + "5 2 1 1 6.25e-07 2.00e+01 total \n", + "6 2 2 1 0.00e+00 6.25e-07 total \n", + "7 2 2 1 6.25e-07 2.00e+01 total \n", + "\n", + " score mean std. dev. \n", + " \n", + "0 (((absorption / flux) / (total / flux)) + ((sc... 1.00e+00 3.15e-02 \n", + "1 (((absorption / flux) / (total / flux)) + ((sc... 1.00e+00 1.66e-02 \n", + "2 (((absorption / flux) / (total / flux)) + ((sc... 1.00e+00 3.22e-02 \n", + "3 (((absorption / flux) / (total / flux)) + ((sc... 1.00e+00 9.52e-03 \n", + "4 (((absorption / flux) / (total / flux)) + ((sc... 1.00e+00 2.10e-02 \n", + "5 (((absorption / flux) / (total / flux)) + ((sc... 1.00e+00 1.37e-02 \n", + "6 (((absorption / flux) / (total / flux)) + ((sc... 1.00e+00 2.75e-02 \n", + "7 (((absorption / flux) / (total / flux)) + ((sc... 1.00e+00 1.20e-02 " + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# 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", From d7b911645d6256a6cb3bf900d02031bf6601e121 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 5 Jul 2016 10:18:50 -0400 Subject: [PATCH 006/168] fixed issue in tally.get_slice() --- .../pythonapi/examples/mgxs-part-i.ipynb | 84 ++++++++++++++++--- openmc/tallies.py | 7 +- 2 files changed, 73 insertions(+), 18 deletions(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-i.ipynb b/docs/source/pythonapi/examples/mgxs-part-i.ipynb index f3433b98c4..0cfebedc34 100644 --- a/docs/source/pythonapi/examples/mgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-i.ipynb @@ -530,8 +530,8 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.7.1\n", - " Git SHA1: edf2dd76c731a711cea7bbc28f0982292c19389f\n", - " Date/Time: 2016-07-05 08:42:21\n", + " Git SHA1: 092760d59fbac8d929ab33b5fdc48eab0c6cc8ac\n", + " Date/Time: 2016-07-05 08:53:58\n", " MPI Processes: 4\n", "\n", " ===========================================================================\n", @@ -587,20 +587,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 9.5600E-01 seconds\n", - " Reading cross sections = 2.7100E-01 seconds\n", - " Total time in simulation = 1.7180E+00 seconds\n", - " Time in transport only = 1.6250E+00 seconds\n", - " Time in inactive batches = 2.7700E-01 seconds\n", - " Time in active batches = 1.4410E+00 seconds\n", + " Total time for initialization = 1.2080E+00 seconds\n", + " Reading cross sections = 2.6300E-01 seconds\n", + " Total time in simulation = 1.6120E+00 seconds\n", + " Time in transport only = 1.5200E+00 seconds\n", + " Time in inactive batches = 2.8400E-01 seconds\n", + " Time in active batches = 1.3280E+00 seconds\n", " Time synchronizing fission bank = 6.1000E-02 seconds\n", " Sampling source sites = 0.0000E+00 seconds\n", " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 2.0000E-03 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 5.0000E-03 seconds\n", - " Total time elapsed = 2.6810E+00 seconds\n", - " Calculation Rate (inactive) = 36101.1 neutrons/second\n", - " Calculation Rate (active) = 6939.63 neutrons/second\n", + " Total time elapsed = 2.8290E+00 seconds\n", + " Calculation Rate (inactive) = 35211.3 neutrons/second\n", + " Calculation Rate (active) = 7530.12 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -681,62 +681,122 @@ "text": [ "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n", "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n", "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n", "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n", "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n", "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n", "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n", "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n", "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n", "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n", "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n", "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n", "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n", "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n", "['mesh']\n", "[((1, 1, 1), (1, 2, 1), (2, 1, 1), (2, 2, 1))]\n", + "4\n", + "4\n", + "4\n", + "4\n", "[0]\n", "[10000]\n" ] diff --git a/openmc/tallies.py b/openmc/tallies.py index 0531cf47fe..4fc19f1e5d 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2983,18 +2983,13 @@ class Tally(object): bin_indices.extend([bin_index]) bin_indices.extend([bin_index, bin_index+1]) num_bins += 1 - elif filter_type == 'distribcell': + elif filter_type in ['distribcell', 'mesh']: bin_indices = [0] num_bins = find_filter.num_bins - elif filter_type == 'mesh': - bin_indices = [0] - num_bins = find_filter.mesh.num_mesh_cells else: bin_indices.append(bin_index) num_bins += 1 - print(bin_indices) - print(find_filter.bins) find_filter.bins = np.unique(find_filter.bins[bin_indices]) find_filter.num_bins = num_bins From a38f53d26f5585cd2d312567a3f69baf369dbe9a Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 29 Jul 2016 10:50:08 -0500 Subject: [PATCH 007/168] Add Madland fission-Q support to openmc.data --- openmc/data/__init__.py | 1 + openmc/data/endf_utils.py | 43 +++++ openmc/data/fission_energy.py | 285 ++++++++++++++++++++++++++++++++++ openmc/data/neutron.py | 22 +++ 4 files changed, 351 insertions(+) create mode 100644 openmc/data/endf_utils.py create mode 100644 openmc/data/fission_energy.py diff --git a/openmc/data/__init__.py b/openmc/data/__init__.py index ae8ea8191f..e60878d601 100644 --- a/openmc/data/__init__.py +++ b/openmc/data/__init__.py @@ -14,3 +14,4 @@ from .nbody import * from .thermal import * from .urr import * from .library import * +from .fission_energy import * diff --git a/openmc/data/endf_utils.py b/openmc/data/endf_utils.py new file mode 100644 index 0000000000..6db3c611cf --- /dev/null +++ b/openmc/data/endf_utils.py @@ -0,0 +1,43 @@ +"""This module contains a few utility functions for reading ENDF_ data. It is by +no means enough to read an entire ENDF file. For a more complete ENDF reader, +see Pyne_. + +.. _ENDF: http://www.nndc.bnl.gov/endf +.. _Pyne: http://www.pyne.io + +""" + +import re + +def read_float(float_string): + """Parse ENDF 6E11.0 formatted string into a float.""" + assert len(float_string) == 11 + pattern = '([\s\\-]\d+\\.\d+)([\\+\\-]\d+)' + mantissa, exponent = re.match(pattern, float_string).groups() + return float(mantissa + 'e' + exponent) + + +def read_CONT_line(line): + """Parse 80-column line from ENDF CONT record into floats and ints.""" + return (read_float(line[0:11]), read_float(line[11:22]), int(line[22:33]), + int(line[33:44]), int(line[44:55]), int(line[55:66]), + int(line[66:70]), int(line[70:72]), int(line[72:75]), + int(line[75:80])) + +def identify_nuclide(fname): + """Read the header of an ENDF file and extract identifying information.""" + with open(fname, 'r') as fh: + # Skip the tape id (TPID). + line = fh.readline() + + # Read the first HEAD and CONT info. + line = fh.readline() + ZA, AW, LRP, LFI, NLIB, NMOD, MAT, MF, MT, NS = read_CONT_line(line) + line = fh.readline() + ELIS, STA, LIS, LISO, junk, NFOR, MAT, MF, MT, NS = read_CONT_line(line) + + # Return dictionary of the most important identifying information. + return {'Z': int(ZA) // 1000, + 'A': int(ZA) % 1000, + 'LIS': LIS, + 'LISO': LISO} diff --git a/openmc/data/fission_energy.py b/openmc/data/fission_energy.py new file mode 100644 index 0000000000..5716a3e858 --- /dev/null +++ b/openmc/data/fission_energy.py @@ -0,0 +1,285 @@ +from collections import Callable +import sys +#from warnings import warn + +import numpy as np +from numpy.polynomial.polynomial import Polynomial + +from .function import Tabulated1D, Sum +from .endf_utils import read_float, read_CONT_line, identify_nuclide +import openmc.checkvalue as cv + +if sys.version_info[0] >= 3: + basestring = str + + +class FissionEnergyRelease(object): + def __init__(self): + self._fragments = None + self._prompt_neutrons = None + self._delayed_neutrons = None + self._prompt_photons = None + self._delayed_photons = None + self._betas = None + self._neutrinos = None + self._form = None + + @property + def fragments(self): + return self._fragments + + @property + def prompt_neutrons(self): + return self._prompt_neutrons + + @property + def delayed_neutrons(self): + return self._delayed_neutrons + + @property + def prompt_photons(self): + return self._prompt_photons + + @property + def delayed_photons(self): + return self._delayed_photons + + @property + def betas(self): + return self._betas + + @property + def neutrinos(self): + return self._neutrinos + + @property + def recoverable(self): + return Sum([self.fragments, self.prompt_neutrons, self.delayed_neutrons, + self.prompt_photons, self.delayed_photons, self.betas]) + + @property + def total(self): + return Sum([self.fragments, self.prompt_neutrons, self.delayed_neutrons, + self.prompt_photons, self.delayed_photons, self.betas, + self.neutrinos]) + + @property + def form(self): + return self._form + + @fragments.setter + def fragments(self, energy_release): + cv.check_type('fragments', energy_release, Callable) + self._fragments = energy_release + + @prompt_neutrons.setter + def prompt_neutrons(self, energy_release): + cv.check_type('prompt_neutrons', energy_release, Callable) + self._prompt_neutrons = energy_release + + @delayed_neutrons.setter + def delayed_neutrons(self, energy_release): + cv.check_type('delayed_neutrons', energy_release, Callable) + self._delayed_neutrons = energy_release + + @prompt_photons.setter + def prompt_photons(self, energy_release): + cv.check_type('prompt_photons', energy_release, Callable) + self._prompt_photons = energy_release + + @delayed_photons.setter + def delayed_photons(self, energy_release): + cv.check_type('delayed_photons', energy_release, Callable) + self._delayed_photons = energy_release + + @betas.setter + def betas(self, energy_release): + cv.check_type('betas', energy_release, Callable) + self._betas = energy_release + + @neutrinos.setter + def neutrinos(self, energy_release): + cv.check_type('neutrinos', energy_release, Callable) + self._neutrinos = energy_release + + @form.setter + def form(self, form): + cv.check_value('format', form, ('Madland', 'Sher-Beck')) + self._form = form + + @classmethod + def from_endf(cls, filename, incident_neutron): + """Generate fission energy release data from an ENDF file. + + Parameters + ---------- + filename : str + Name of the ENDF file containing fission energy release data + + incident_neutron : openmc.data.IncidentNeutron + Corresponding incident neutron dataset + + Returns + ------- + openmc.data.FissionEnergyRelease + Fission energy release data + + """ + + # Check to make sure this ENDF file matches the expected isomer. + ident = identify_nuclide(filename) + if ident['Z'] != incident_neutron.atomic_number: + pass + if ident['A'] != incident_neutron.mass_number: + pass + if ident['LISO'] != incident_neutron.metastable: + pass + + # Extract the MF=1, MT=458 section. + lines = [] + with open(filename, 'r') as fh: + line = fh.readline() + while line != '': + if line[70:75] == ' 1458': + lines.append(line) + line = fh.readline() + + # Read the number of coefficients in this LIST record. + NPL = read_CONT_line(lines[1])[4] + + # Parse the ENDF LIST into an array. + data = [] + for i in range(NPL): + row, column = divmod(i, 6) + data.append(read_float(lines[2 + row][11*column:11*(column+1)])) + + # Declare the coefficient names and the order they are given in. The + # LIST contains a value followed immediately by an uncertainty for each + # of these components, times the polynomial order + 1. If we only find + # one value for each of these components, then we need to use the + # Sher-Beck formula for energy dependence. Otherwise, it is a + # polynomial. + labels = ('EFR', 'ENP', 'END', 'EGP', 'EGD', 'EB', 'ENU', 'ER', 'ET') + + # Associate each set of values and uncertainties with its label. + value = dict() + uncertainty = dict() + for i in range(len(labels)): + value[labels[i]] = data[2*i::18] + uncertainty[labels[i]] = data[2*i + 1::18] + + # In ENDF/B-7.1, data for 2nd-order coefficients were mistakenly not + # converted from MeV to eV. Check for this error and fix it if present. + n_coeffs = len(value['EFR']) + if n_coeffs == 3: # Only check 2nd-order data. + # Check each energy component for the error. If a 1 MeV neutron + # causes a change of more than 100 MeV, we know something is wrong. + error_present = False + for coeffs in value.values(): + second_order = coeffs[2] + if abs(second_order) * 1e12 > 1e8: + error_present = True + break + + # If we found the error, reduce all 2nd-order coeffs by 10**6. + if error_present: + for coeffs in value.values(): coeffs[2] *= 1e-6 + for coeffs in uncertainty.values(): coeffs[2] *= 1e-6 + + # Perform the sanity check again... just in case. + for coeffs in value.values(): + second_order = coeffs[2] + if abs(second_order) * 1e12 > 1e8: + raise ValueError("Encountered a ludicrously large second-" + "order polynomial coefficient.") + + # Convert eV to MeV. + for coeffs in value.values(): + for i in range(len(coeffs)): + coeffs[i] *= 10**(-6 + 6*i) + for coeffs in uncertainty.values(): + for i in range(len(coeffs)): + coeffs[i] *= 10**(-6 + 6*i) + + out = cls() + if n_coeffs > 1: + out.form = 'Madland' + out.fragments = Polynomial(value['EFR']) + out.prompt_neutrons = Polynomial(value['ENP']) + out.delayed_neutrons = Polynomial(value['END']) + out.prompt_photons = Polynomial(value['EGP']) + out.delayed_photons = Polynomial(value['EGD']) + out.betas = Polynomial(value['EB']) + out.neutrinos = Polynomial(value['ENU']) + else: + out.form = 'Sher-Beck' + raise NotImplemented + + return out + + @classmethod + def from_hdf5(cls, group): + """Generate fission energy release data from an HDF5 group. + + Parameters + ---------- + group : h5py.Group + HDF5 group to read from + + Returns + ------- + openmc.data.FissionEnergyRelease + Fission energy release data + + """ + + obj = cls() + if group.attrs['format'] == 'Madland': + obj.fragments = Polynomial(group['fragments'].value) + obj.prompt_neutrons = Polynomial(group['prompt_neutrons'].value) + obj.delayed_neutrons = Polynomial(group['delayed_neutrons'].value) + obj.prompt_photons = Polynomial(group['prompt_photons'].value) + obj.delayed_photons = Polynomial(group['delayed_photons'].value) + obj.betas = Polynomial(group['betas'].value) + obj.neutrinos = Polynomial(group['neutrinos'].value) + elif group.attrs['format'] == 'Sher-Beck': + raise NotImplemented + else: + raise ValueError('Unrecognized energy release format') + + return obj + + def to_hdf5(self, group): + """Write energy release data to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + + if self.form == 'Madland': + group.attrs['format'] = np.string_('Madland') + group.create_dataset('fragments', data=self.fragments.coef) + group.create_dataset('prompt_neutrons', + data=self.prompt_neutrons.coef) + group.create_dataset('delayed_neutrons', + data=self.delayed_neutrons.coef) + group.create_dataset('prompt_photons', + data=self.prompt_photons.coef) + group.create_dataset('delayed_photons', + data=self.delayed_photons.coef) + group.create_dataset('betas', data=self.betas.coef) + group.create_dataset('neutrinos', data=self.neutrinos.coef) + elif self.form == 'Sher-Beck': + group.attrs['format'] = np.string_('Sher-Beck') + self.fragments.to_hdf5(group, 'fragments') + self.prompt_neutrons.to_hdf5(group, 'prompt_neutrons') + self.delayed_neutrons.to_hdf5(group, 'delayed_neutrons') + self.prompt_photons.to_hdf5(group, 'prompt_photons') + self.delayed_photons.to_hdf5(group, 'delayed_photons') + self.betas.to_hdf5(group, 'betas') + self.neutrinos.to_hdf5(group, 'neutrinos') + else: + raise ValueError('Unrecognized energy release format') diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 63b2bab01b..84d9bcb2c6 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -9,6 +9,7 @@ import h5py from .data import ATOMIC_SYMBOL, SUM_RULES from .ace import Table, get_table +from .fission_energy import FissionEnergyRelease from .function import Tabulated1D, Sum from .product import Product from .reaction import Reaction, _get_photon_products @@ -81,6 +82,7 @@ class IncidentNeutron(object): self.temperature = temperature self._energy = None + self._fission_energy = None self.reactions = OrderedDict() self.summed_reactions = OrderedDict() self.urr = None @@ -126,6 +128,10 @@ class IncidentNeutron(object): def energy(self): return self._energy + @property + def fission_energy(self): + return self._fission_energy + @property def temperature(self): return self._temperature @@ -186,6 +192,12 @@ class IncidentNeutron(object): cv.check_type('energy grid', energy, Iterable, Real) self._energy = energy + @fission_energy.setter + def fission_energy(self, fission_energy): + cv.check_type('fission energy release', fission_energy, + FissionEnergyRelease) + self._fission_energy = fission_energy + @reactions.setter def reactions(self, reactions): cv.check_type('reactions', reactions, Mapping) @@ -276,6 +288,11 @@ class IncidentNeutron(object): urr_group = g.create_group('urr') self.urr.to_hdf5(urr_group) + # Write fission energy release data + if self.fission_energy is not None: + fer_group = g.create_group('fission_energy_release') + self.fission_energy.to_hdf5(fer_group) + f.close() @classmethod @@ -331,6 +348,11 @@ class IncidentNeutron(object): urr_group = group['urr'] data.urr = ProbabilityTables.from_hdf5(urr_group) + # Read fission energy release data + if 'fission_energy_release' in group: + fer_group = group['fission_energy_release'] + data.fission_energy = FissionEnergyRelease.from_hdf5(fer_group) + return data @classmethod From 9acac0725a26efc14906d692bc99f0dacabeccea Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 29 Jul 2016 13:54:30 -0500 Subject: [PATCH 008/168] Add Madland fission-Q support to F90 --- openmc/data/fission_energy.py | 27 ++++++ src/constants.F90 | 6 +- src/input_xml.F90 | 4 + src/nuclide_header.F90 | 34 ++++++- src/output.F90 | 2 + src/tally.F90 | 162 +++++++++++++++++++++++++++++----- 6 files changed, 209 insertions(+), 26 deletions(-) diff --git a/openmc/data/fission_energy.py b/openmc/data/fission_energy.py index 5716a3e858..7415a9b515 100644 --- a/openmc/data/fission_energy.py +++ b/openmc/data/fission_energy.py @@ -62,6 +62,19 @@ class FissionEnergyRelease(object): return Sum([self.fragments, self.prompt_neutrons, self.delayed_neutrons, self.prompt_photons, self.delayed_photons, self.betas, self.neutrinos]) + + @property + def prompt_q(self): + return Sum([self.fragments, self.prompt_neutrons, self.prompt_photons, + lambda E: -E]) + + @property + def recoverable_q(self): + return Sum([self.recoverable, lambda E: -E]) + + @property + def total_q(self): + return Sum([self.total, lambda E: -E]) @property def form(self): @@ -272,6 +285,20 @@ class FissionEnergyRelease(object): data=self.delayed_photons.coef) group.create_dataset('betas', data=self.betas.coef) group.create_dataset('neutrinos', data=self.neutrinos.coef) + + q_prompt = (self.fragments + self.prompt_neutrons + + self.prompt_photons + Polynomial((-1.0, 0.0))) + group.create_dataset('q_prompt', data=q_prompt.coef) + q_recoverable = (self.fragments + self.prompt_neutrons + + self.delayed_neutrons + self.prompt_photons + + self.delayed_photons + self.betas + + Polynomial((-1.0, 0.0))) + group.create_dataset('q_recoverable', data=q_recoverable.coef) + q_total = (self.fragments + self.prompt_neutrons + + self.delayed_neutrons + self.prompt_photons + + self.delayed_photons + self.betas + self.neutrinos + + Polynomial((-1.0, 0.0))) + group.create_dataset('q_total', data=q_total.coef) elif self.form == 'Sher-Beck': group.attrs['format'] = np.string_('Sher-Beck') self.fragments.to_hdf5(group, 'fragments') diff --git a/src/constants.F90 b/src/constants.F90 index d2bb6e1cf6..5447b5cc21 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -289,7 +289,7 @@ module constants EVENT_ABSORB = 2 ! Tally score type - integer, parameter :: N_SCORE_TYPES = 20 + integer, parameter :: N_SCORE_TYPES = 22 integer, parameter :: & SCORE_FLUX = -1, & ! flux SCORE_TOTAL = -2, & ! total reaction rate @@ -310,7 +310,9 @@ module constants SCORE_NU_SCATTER_YN = -17, & ! angular flux-weighted nu-scattering moment (0:N) SCORE_EVENTS = -18, & ! number of events SCORE_DELAYED_NU_FISSION = -19, & ! delayed neutron production rate - SCORE_INVERSE_VELOCITY = -20 ! flux-weighted inverse velocity + SCORE_INVERSE_VELOCITY = -20, & ! flux-weighted inverse velocity + SCORE_FISS_Q_PROMPT = -21, & ! prompt fission Q-value + SCORE_FISS_Q_RECOV = -22 ! recoverable fission Q-value ! Maximum scattering order supported integer, parameter :: MAX_ANG_ORDER = 10 diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 3c8291e9c8..f661927d76 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -3629,6 +3629,10 @@ contains t % score_bins(j) = SCORE_KAPPA_FISSION case ('inverse-velocity') t % score_bins(j) = SCORE_INVERSE_VELOCITY + case ('fission-q-prompt') + t % score_bins(j) = SCORE_FISS_Q_PROMPT + case ('fission-q-recoverable') + t % score_bins(j) = SCORE_FISS_Q_RECOV case ('current') t % score_bins(j) = SCORE_CURRENT t % type = TALLY_SURFACE_CURRENT diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index 8ff83482e5..31e069b68f 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -88,6 +88,10 @@ module nuclide_header type(DictIntInt) :: reaction_index ! map MT values to index in reactions ! array; used at tally-time + ! Fission energy release + class(Function1D), allocatable :: fission_q_prompt ! prompt neutrons, gammas + class(Function1D), allocatable :: fission_q_recov ! neutrons, gammas, betas + contains procedure :: clear => nuclide_clear procedure :: print => nuclide_print @@ -192,6 +196,8 @@ module nuclide_header integer(HID_T) :: rxs_group integer(HID_T) :: rx_group integer(HID_T) :: total_nu + integer(HID_T) :: fer_group ! fission_energy_release group + integer(HID_T) :: fer_dset integer(SIZE_T) :: name_len, name_file_len integer(HSIZE_T) :: j integer(HSIZE_T) :: dims(1) @@ -251,8 +257,8 @@ module nuclide_header call this % urr_data % from_hdf5(urr_group) ! if the inelastic competition flag indicates that the inelastic cross - ! section should be determined from a normal reaction cross section, we need - ! to get the index of the reaction + ! section should be determined from a normal reaction cross section, we + ! need to get the index of the reaction if (this % urr_data % inelastic_flag > 0) then do i = 1, size(this % reactions) if (this % reactions(i) % MT == this % urr_data % inelastic_flag) then @@ -296,6 +302,30 @@ module nuclide_header call close_group(nu_group) end if + ! Read fission energy release data if present + call h5ltpath_valid_f(group_id, 'fission_energy_release', .true., exists, & + hdf5_err) + if (exists) then + fer_group = open_group(group_id, 'fission_energy_release') + call read_attribute(temp, fer_group, 'format') + if (temp == 'Madland') then + ! The data uses the Madland format, i.e. polynomials + + ! Read the prompt Q-value + allocate(Polynomial :: this % fission_q_prompt) + fer_dset = open_dataset(fer_group, 'q_prompt') + call this % fission_q_prompt % from_hdf5(fer_dset) + call close_dataset(fer_dset) + + ! Read the recoverable energy Q-value + allocate(Polynomial :: this % fission_q_recov) + fer_dset = open_dataset(fer_group, 'q_recoverable') + call this % fission_q_recov % from_hdf5(fer_dset) + call close_dataset(fer_dset) + end if + call close_group(fer_group) + end if + ! Create derived cross section data call this % create_derived() diff --git a/src/output.F90 b/src/output.F90 index 09df23f0d5..35524a9a35 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -791,6 +791,8 @@ contains score_names(abs(SCORE_NU_SCATTER_YN)) = "Scattering Prod. Rate Moment" score_names(abs(SCORE_DELAYED_NU_FISSION)) = "Delayed-Nu-Fission Rate" score_names(abs(SCORE_INVERSE_VELOCITY)) = "Flux-Weighted Inverse Velocity" + score_names(abs(SCORE_FISS_Q_PROMPT)) = "Prompt fission power" + score_names(abs(SCORE_FISS_Q_RECOV)) = "Recoverable fission power" ! Create filename for tally output filename = trim(path_output) // "tallies.out" diff --git a/src/tally.F90 b/src/tally.F90 index b40a39ce0c..1271da7da9 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -625,14 +625,14 @@ contains if (survival_biasing) then ! No fission events occur if survival biasing is on -- need to ! calculate fraction of absorptions that would have resulted in - ! fission scale by kappa-fission - associate (nuc => nuclides(p%event_nuclide)) - if (micro_xs(p%event_nuclide)%absorption > ZERO .and. & - nuc%fissionable) then - score = p%absorb_wgt * & - nuc%reactions(nuc%index_fission(1))%Q_value * & - micro_xs(p%event_nuclide)%fission / & - micro_xs(p%event_nuclide)%absorption + ! fission scaled by kappa-fission + associate (nuc => nuclides(p % event_nuclide)) + if (micro_xs(p % event_nuclide) % absorption > ZERO .and. & + nuc % fissionable) then + score = p % absorb_wgt * & + nuc % reactions(nuc % index_fission(1)) % Q_value * & + micro_xs(p % event_nuclide) % fission / & + micro_xs(p % event_nuclide) % absorption end if end associate else @@ -641,12 +641,12 @@ contains ! All fission events will contribute, so again we can use ! particle's weight entering the collision as the estimate for ! the fission energy production rate - associate (nuc => nuclides(p%event_nuclide)) - if (nuc%fissionable) then - score = p%last_wgt * & - nuc%reactions(nuc%index_fission(1))%Q_value * & - micro_xs(p%event_nuclide)%fission / & - micro_xs(p%event_nuclide)%absorption + associate (nuc => nuclides(p % event_nuclide)) + if (nuc % fissionable) then + score = p % last_wgt * & + nuc % reactions(nuc % index_fission(1)) % Q_value * & + micro_xs(p % event_nuclide) % fission / & + micro_xs(p % event_nuclide) % absorption end if end associate end if @@ -654,22 +654,23 @@ contains else if (i_nuclide > 0) then associate (nuc => nuclides(i_nuclide)) - if (nuc%fissionable) then - score = nuc%reactions(nuc%index_fission(1))%Q_value * & - micro_xs(i_nuclide)%fission * atom_density * flux + if (nuc % fissionable) then + score = nuc % reactions(nuc % index_fission(1)) % Q_value * & + micro_xs(i_nuclide) % fission * atom_density * flux end if end associate else - do l = 1, materials(p%material)%n_nuclides + do l = 1, materials(p % material) % n_nuclides ! Determine atom density and index of nuclide - atom_density_ = materials(p%material)%atom_density(l) - i_nuc = materials(p%material)%nuclide(l) + atom_density_ = materials(p % material) % atom_density(l) + i_nuc = materials(p % material) % nuclide(l) ! If nuclide is fissionable, accumulate kappa fission associate(nuc => nuclides(i_nuc)) if (nuc % fissionable) then - score = score + nuc%reactions(nuc%index_fission(1))%Q_value * & - micro_xs(i_nuc)%fission * atom_density_ * flux + score = score + & + nuc % reactions(nuc % index_fission(1)) % Q_value * & + micro_xs(i_nuc) % fission * atom_density_ * flux end if end associate end do @@ -694,6 +695,123 @@ contains end if end if + case (SCORE_FISS_Q_PROMPT) + if (t % estimator == ESTIMATOR_ANALOG) then + if (survival_biasing) then + ! No fission events occur if survival biasing is on -- need to + ! calculate fraction of absorptions that would have resulted in + ! fission scaled by Q-value + associate (nuc => nuclides(p % event_nuclide)) + if (micro_xs(p % event_nuclide) % absorption > ZERO .and. & + allocated(nuc % fission_q_prompt)) then + score = p % absorb_wgt & + * nuc % fission_q_prompt % evaluate(p % last_E) & + * micro_xs(p % event_nuclide) % fission & + / micro_xs(p % event_nuclide) % absorption + end if + end associate + else + ! Skip any non-absorption events + if (p % event == EVENT_SCATTER) cycle SCORE_LOOP + ! All fission events will contribute, so again we can use + ! particle's weight entering the collision as the estimate for + ! the fission energy production rate + associate (nuc => nuclides(p % event_nuclide)) + if (allocated(nuc % fission_q_prompt)) then + score = p % last_wgt & + * nuc % fission_q_prompt % evaluate(p % last_E) & + * micro_xs(p % event_nuclide) % fission & + / micro_xs(p % event_nuclide) % absorption + end if + end associate + end if + + else + if (t % estimator == ESTIMATOR_COLLISION) then + E = p % last_E + else + E = p % E + end if + + if (i_nuclide > 0) then + if (allocated(nuclides(i_nuclide) % fission_q_prompt)) then + score = micro_xs(i_nuclide) % fission * atom_density * flux & + * nuclides(i_nuclide) % fission_q_prompt % evaluate(E) + else + score = ZERO + end if + else + score = ZERO + do l = 1, materials(p % material) % n_nuclides + atom_density_ = materials(p % material) % atom_density(l) + i_nuc = materials(p % material) % nuclide(l) + if (allocated(nuclides(i_nuc) % fission_q_prompt)) then + score = score + micro_xs(i_nuc) % fission * atom_density_ & + * flux & + * nuclides(i_nuc) % fission_q_prompt % evaluate(E) + end if + end do + end if + end if + + case (SCORE_FISS_Q_RECOV) + if (t % estimator == ESTIMATOR_ANALOG) then + if (survival_biasing) then + ! No fission events occur if survival biasing is on -- need to + ! calculate fraction of absorptions that would have resulted in + ! fission scaled by Q-value + associate (nuc => nuclides(p % event_nuclide)) + if (micro_xs(p % event_nuclide) % absorption > ZERO .and. & + allocated(nuc % fission_q_recov)) then + score = p % absorb_wgt & + * nuc % fission_q_recov % evaluate(p % last_E) & + * micro_xs(p % event_nuclide) % fission & + / micro_xs(p % event_nuclide) % absorption + end if + end associate + else + ! Skip any non-absorption events + if (p % event == EVENT_SCATTER) cycle SCORE_LOOP + ! All fission events will contribute, so again we can use + ! particle's weight entering the collision as the estimate for + ! the fission energy production rate + associate (nuc => nuclides(p % event_nuclide)) + if (allocated(nuc % fission_q_recov)) then + score = p % last_wgt & + * nuc % fission_q_recov % evaluate(p % last_E) & + * micro_xs(p % event_nuclide) % fission & + / micro_xs(p % event_nuclide) % absorption + end if + end associate + end if + + else + if (t % estimator == ESTIMATOR_COLLISION) then + E = p % last_E + else + E = p % E + end if + + if (i_nuclide > 0) then + if (allocated(nuclides(i_nuclide) % fission_q_recov)) then + score = micro_xs(i_nuclide) % fission * atom_density * flux & + * nuclides(i_nuclide) % fission_q_recov % evaluate(E) + else + score = ZERO + end if + else + score = ZERO + do l = 1, materials(p % material) % n_nuclides + atom_density_ = materials(p % material) % atom_density(l) + i_nuc = materials(p % material) % nuclide(l) + if (allocated(nuclides(i_nuc) % fission_q_recov)) then + score = score + micro_xs(i_nuc) % fission * atom_density_ & + * flux * nuclides(i_nuc) % fission_q_recov % evaluate(E) + end if + end do + end if + end if + case default if (t % estimator == ESTIMATOR_ANALOG) then ! Any other score is assumed to be a MT number. Thus, we just need From b64dcd24c83d05e6041f01f84e65b0d0355d97fa Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 29 Jul 2016 16:09:06 -0500 Subject: [PATCH 009/168] Add Sher-Beck fission-Q support --- openmc/data/fission_energy.py | 96 ++++++++++++++++++++++++----------- src/nuclide_header.F90 | 17 +++++++ src/tally.F90 | 4 +- 3 files changed, 84 insertions(+), 33 deletions(-) diff --git a/openmc/data/fission_energy.py b/openmc/data/fission_energy.py index 7415a9b515..b7641a2370 100644 --- a/openmc/data/fission_energy.py +++ b/openmc/data/fission_energy.py @@ -1,4 +1,5 @@ from collections import Callable +from copy import deepcopy import sys #from warnings import warn @@ -64,16 +65,16 @@ class FissionEnergyRelease(object): self.neutrinos]) @property - def prompt_q(self): + def q_prompt(self): return Sum([self.fragments, self.prompt_neutrons, self.prompt_photons, lambda E: -E]) @property - def recoverable_q(self): + def q_recoverable(self): return Sum([self.recoverable, lambda E: -E]) @property - def total_q(self): + def q_total(self): return Sum([self.total, lambda E: -E]) @property @@ -226,7 +227,37 @@ class FissionEnergyRelease(object): out.neutrinos = Polynomial(value['ENU']) else: out.form = 'Sher-Beck' - raise NotImplemented + + # EFR and ENP are energy independent. Polynomial is used because it + # has a __call__ attribute that handles Iterable inputs. The + # energy-dependence of END is unspecified in ENDF-102 so assume it + # is independent. + out.fragments = Polynomial((value['EFR'][0])) + out.prompt_photons = Polynomial((value['EGP'][0])) + out.delayed_neutrons = Polynomial((value['END'][0])) + + # EDP, EB, and ENU are linear. + out.delayed_photons = Polynomial((value['EGD'][0], -0.075)) + out.betas = Polynomial((value['EB'][0], -0.075)) + out.neutrinos = Polynomial((value['ENU'][0], -0.105)) + + # Prompt neutrons require nu-data. It is not clear from ENDF-102 + # whether prompt or total nu values should be used, but the delayed + # neutron fraction is so small that the difference is negligible. + nu_prompt = [p for p in incident_neutron[18].products + if p.particle == 'neutron' + and p.emission_mode == 'prompt'] + if len(nu_prompt) == 0: + raise ValueError('Nu data is needed to compute fission energy ' + 'release with the Sher-Beck format.') + if len(nu_prompt) > 1: + raise ValueError('Ambiguous prompt nu value.') + if not isinstance(nu_prompt[0].yield_, Tabulated1D): + raise TypeError('Sher-Beck fission energy release currently ' + 'only supports Tabulated1D nu data.') + ENP = deepcopy(nu_prompt[0].yield_) + ENP.y = value['ENP'] + 1.307 * ENP.x - 8.07 * (ENP.y - ENP.y[0]) + out.prompt_neutrons = ENP return out @@ -247,16 +278,19 @@ class FissionEnergyRelease(object): """ obj = cls() + + obj.fragments = Polynomial(group['fragments'].value) + obj.delayed_neutrons = Polynomial(group['delayed_neutrons'].value) + obj.prompt_photons = Polynomial(group['prompt_photons'].value) + obj.delayed_photons = Polynomial(group['delayed_photons'].value) + obj.betas = Polynomial(group['betas'].value) + obj.neutrinos = Polynomial(group['neutrinos'].value) + if group.attrs['format'] == 'Madland': - obj.fragments = Polynomial(group['fragments'].value) obj.prompt_neutrons = Polynomial(group['prompt_neutrons'].value) - obj.delayed_neutrons = Polynomial(group['delayed_neutrons'].value) - obj.prompt_photons = Polynomial(group['prompt_photons'].value) - obj.delayed_photons = Polynomial(group['delayed_photons'].value) - obj.betas = Polynomial(group['betas'].value) - obj.neutrinos = Polynomial(group['neutrinos'].value) elif group.attrs['format'] == 'Sher-Beck': - raise NotImplemented + obj.prompt_neutrons = Tabulated1D.from_hdf5( + group['prompt_neutrons']) else: raise ValueError('Unrecognized energy release format') @@ -272,19 +306,20 @@ class FissionEnergyRelease(object): """ + group.create_dataset('fragments', data=self.fragments.coef) + group.create_dataset('delayed_neutrons', + data=self.delayed_neutrons.coef) + group.create_dataset('prompt_photons', + data=self.prompt_photons.coef) + group.create_dataset('delayed_photons', + data=self.delayed_photons.coef) + group.create_dataset('betas', data=self.betas.coef) + group.create_dataset('neutrinos', data=self.neutrinos.coef) + if self.form == 'Madland': group.attrs['format'] = np.string_('Madland') - group.create_dataset('fragments', data=self.fragments.coef) group.create_dataset('prompt_neutrons', data=self.prompt_neutrons.coef) - group.create_dataset('delayed_neutrons', - data=self.delayed_neutrons.coef) - group.create_dataset('prompt_photons', - data=self.prompt_photons.coef) - group.create_dataset('delayed_photons', - data=self.delayed_photons.coef) - group.create_dataset('betas', data=self.betas.coef) - group.create_dataset('neutrinos', data=self.neutrinos.coef) q_prompt = (self.fragments + self.prompt_neutrons + self.prompt_photons + Polynomial((-1.0, 0.0))) @@ -294,19 +329,18 @@ class FissionEnergyRelease(object): self.delayed_photons + self.betas + Polynomial((-1.0, 0.0))) group.create_dataset('q_recoverable', data=q_recoverable.coef) - q_total = (self.fragments + self.prompt_neutrons + - self.delayed_neutrons + self.prompt_photons + - self.delayed_photons + self.betas + self.neutrinos + - Polynomial((-1.0, 0.0))) - group.create_dataset('q_total', data=q_total.coef) elif self.form == 'Sher-Beck': group.attrs['format'] = np.string_('Sher-Beck') - self.fragments.to_hdf5(group, 'fragments') self.prompt_neutrons.to_hdf5(group, 'prompt_neutrons') - self.delayed_neutrons.to_hdf5(group, 'delayed_neutrons') - self.prompt_photons.to_hdf5(group, 'prompt_photons') - self.delayed_photons.to_hdf5(group, 'delayed_photons') - self.betas.to_hdf5(group, 'betas') - self.neutrinos.to_hdf5(group, 'neutrinos') + + q_prompt = deepcopy(self.prompt_neutrons) + q_prompt.y += self.fragments(q_prompt.x) + q_prompt.y += self.prompt_photons(q_prompt.x) + q_prompt.to_hdf5(group, 'q_prompt') + q_recoverable = q_prompt + q_recoverable.y += self.delayed_neutrons(q_recoverable.x) + q_recoverable.y += self.delayed_photons(q_recoverable.x) + q_recoverable.y += self.betas(q_recoverable.x) + q_recoverable.to_hdf5(group, 'q_recoverable') else: raise ValueError('Unrecognized energy release format') diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index 31e069b68f..2a2a376bd5 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -322,6 +322,23 @@ module nuclide_header fer_dset = open_dataset(fer_group, 'q_recoverable') call this % fission_q_recov % from_hdf5(fer_dset) call close_dataset(fer_dset) + else if (temp == 'Sher-Beck') then + ! The data uses the Sher-Beck format. Python has handily converted this + ! format to Tabulated1Ds. + + ! Read the prompt Q-value + allocate(Tabulated1D :: this % fission_q_prompt) + fer_dset = open_dataset(fer_group, 'q_prompt') + call this % fission_q_prompt % from_hdf5(fer_dset) + call close_dataset(fer_dset) + + ! Read the recoverable energy Q-value + allocate(Tabulated1D :: this % fission_q_recov) + fer_dset = open_dataset(fer_group, 'q_recoverable') + call this % fission_q_recov % from_hdf5(fer_dset) + call close_dataset(fer_dset) + else + call fatal_error('Unrecognized fission energy release format.') end if call close_group(fer_group) end if diff --git a/src/tally.F90 b/src/tally.F90 index 1271da7da9..8d14b1c2a6 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -703,7 +703,7 @@ contains ! fission scaled by Q-value associate (nuc => nuclides(p % event_nuclide)) if (micro_xs(p % event_nuclide) % absorption > ZERO .and. & - allocated(nuc % fission_q_prompt)) then + allocated(nuc % fission_q_prompt)) then score = p % absorb_wgt & * nuc % fission_q_prompt % evaluate(p % last_E) & * micro_xs(p % event_nuclide) % fission & @@ -762,7 +762,7 @@ contains ! fission scaled by Q-value associate (nuc => nuclides(p % event_nuclide)) if (micro_xs(p % event_nuclide) % absorption > ZERO .and. & - allocated(nuc % fission_q_recov)) then + allocated(nuc % fission_q_recov)) then score = p % absorb_wgt & * nuc % fission_q_recov % evaluate(p % last_E) & * micro_xs(p % event_nuclide) % fission & From a5e9b870fd63064edb545a509174aea12eebf08d Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sun, 31 Jul 2016 21:43:34 -0400 Subject: [PATCH 010/168] added mdgxs-part-i.ipynb notebook for mdgxs --- .../pythonapi/examples/images/mdgxs.png | Bin 0 -> 23788 bytes .../pythonapi/examples/mdgxs-part-i.ipynb | 1394 +++++++++++++++++ openmc/mgxs/mdgxs.py | 107 +- openmc/tallies.py | 10 +- 4 files changed, 1503 insertions(+), 8 deletions(-) create mode 100644 docs/source/pythonapi/examples/images/mdgxs.png create mode 100644 docs/source/pythonapi/examples/mdgxs-part-i.ipynb diff --git a/docs/source/pythonapi/examples/images/mdgxs.png b/docs/source/pythonapi/examples/images/mdgxs.png new file mode 100644 index 0000000000000000000000000000000000000000..b93d0f0423065531db8547394919d68976f370a0 GIT binary patch literal 23788 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 literal 0 HcmV?d00001 diff --git a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb new file mode 100644 index 0000000000..2eeeffa3ca --- /dev/null +++ b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb @@ -0,0 +1,1394 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This IPython Notebook introduces the use of the `openmc.mgxs` module to calculate multi-energy-group and multi-delayed-group cross sections for an infinite homogeneous medium. In particular, this Notebook introduces the the following features:\n", + "\n", + "* Creation of multi-delayed-group cross sections for an **infinite homogeneous medium**\n", + "* Calculation of delayed neutron precursor concentrations\n", + "\n", + "**Note:** This Notebook illustrates the use of [Pandas](http://pandas.pydata.org/) `DataFrames` to containerize multi-group cross section data. We recommend using [Pandas](http://pandas.pydata.org/) >v0.15.0 or later since OpenMC's Python API leverages the multi-indexing feature included in the most recent releases of [Pandas](http://pandas.pydata.org/)." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Introduction to Multi-Delayed-Group Cross Sections (MDGXS)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Many Monte Carlo particle transport codes, including OpenMC, use continuous-energy nuclear cross section data. However, most deterministic neutron transport codes use *multi-group cross sections* defined over discretized energy bins or *energy groups*. Furthermore, kinetics calculations typically separate out parameters that involve delayed neutrons by delayed groups. An example is the energy spectrum for prompt and delayed neutrons for U-235 and Pu-239 computed for a light water reactor spectrum." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\nfmI+3IqsCwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "execution_count": 1, + "metadata": { + "image/png": { + "width": 350 + } + }, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import Image\n", + "Image(filename='images/mdgxs.png', width=350)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A variety of tools employing different methodologies have been developed over the years to compute multi-group cross sections for certain applications, including NJOY (LANL), MC$^2$-3 (ANL), and Serpent (VTT). The `openmc.mgxs` Python module is designed to leverage OpenMC's tally system to calculate multi-group cross sections with arbitrary energy discretizations and different delayed group models (e.g. 6, 7, or 8 delayed group models) for fine-mesh heterogeneous deterministic neutron transport applications.\n", + "\n", + "Before proceeding to illustrate how one may use the `openmc.mgxs` module, it is worthwhile to define the general equations used to calculate multi-energy-group and multi-delayed-group cross sections. This is only intended as a brief overview of the methodology used by `openmc.mgxs` - we refer the interested reader to the large body of literature on the subject for a more comprehensive understanding of this complex topic." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Introductory Notation\n", + "The continuous real-valued microscopic cross section may be denoted $\\sigma_{n,x}(\\mathbf{r}, E)$ for position vector $\\mathbf{r}$, energy $E$, nuclide $n$ and interaction type $x$. Similarly, the scalar neutron flux may be denoted by $\\Phi(\\mathbf{r},E)$ for position $\\mathbf{r}$ and energy $E$. **Note**: Although nuclear cross sections are dependent on the temperature $T$ of the interacting medium, the temperature variable is neglected here for brevity." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Spatial and Energy Discretization\n", + "The energy domain for critical systems such as thermal reactors spans more than 10 orders of magnitude of neutron energies from 10$^{-5}$ - 10$^7$ eV. The multi-group approximation discretization divides this energy range into one or more energy groups. In particular, for $G$ total groups, we denote an energy group index $g$ such that $g \\in \\{1, 2, ..., G\\}$. The energy group indices are defined such that the smaller group the higher the energy, and vice versa. The integration over neutron energies across a discrete energy group is commonly referred to as **energy condensation**.\n", + "\n", + "The delayed neutrons created from fissions are created from > 30 delayed neutron precursors. Modeling each of the delayed neutron precursors is possible, but this approach has not recieved much attention due to large uncertainties in certain precursors. Therefore, the delayed neutrons are often combined into \"delayed groups\" that have a set time constant, $\\lambda_d$. Some cross section libraries use the same group time constants for all nuclides (e.g. JEFF 3.2) while other libraries use different time constants for all nuclides (e.g. ENDF/B-VII.1). Multi-delayed-group cross sections can either be created with the entire delayed group set, a subset of delayed groups, or integrated over all delayed groups.\n", + "\n", + "Multi-group cross sections are computed for discretized spatial zones in the geometry of interest. The spatial zones may be defined on a structured and regular fuel assembly or pin cell mesh, an arbitrary unstructured mesh or the constructive solid geometry used by OpenMC. For a geometry with $K$ distinct spatial zones, we designate each spatial zone an index $k$ such that $k \\in \\{1, 2, ..., K\\}$. The volume of each spatial zone is denoted by $V_{k}$. The integration over discrete spatial zones is commonly referred to as **spatial homogenization**." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### General Scalar-Flux Weighted MDGXS\n", + "The multi-group cross sections computed by `openmc.mgxs` are defined as a *scalar flux-weighted average* of the microscopic cross sections across each discrete energy group. This formulation is employed in order to preserve the reaction rates within each energy group and spatial zone. In particular, spatial homogenization and energy condensation are used to compute the general multi-group cross section. For instance, the delayed-nu-fission multi-energy-group and multi-delayed-group cross section, $\\nu_d \\sigma_{f,x,k,g}$, can be computed as follows:\n", + "\n", + "$$\\nu_d \\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} \\nu_d \\sigma_{f,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 only the delayed-nu-fission and delayed neutron fraction reaction type at the oment. 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, universe, or mesh) define the bounds of integration for both numerator and denominator." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Multi-Group Prompt and Delayed Fission Spectrum\n", + "The energy spectrum of neutrons emitted from fission is denoted by $\\chi_{n}(\\mathbf{r},E' \\rightarrow E'')$ for incoming and outgoing energies $E'$ and $E''$, respectively. Unlike the multi-group cross sections $\\sigma_{n,x,k,g}$ considered up to this point, the fission spectrum is a probability distribution and must sum to unity. The outgoing energy is typically much less dependent on the incoming energy for fission than for scattering interactions. As a result, it is common practice to integrate over the incoming neutron energy when computing the multi-group fission spectrum. The fission spectrum may be simplified as $\\chi_{n}(\\mathbf{r},E)$ with outgoing energy $E$.\n", + "\n", + "Computing the cumulative energy spectrum of emitted neutrons, $\\chi_{n}(\\mathbf{r},E)$, has been presented in the `mgxs-part-i.ipynb` notebook. Here, we will present the energy spectrum of prompt and delayed emission neutrons, $\\chi_{n,p}(\\mathbf{r},E)$ and $\\chi_{n,d}(\\mathbf{r},E)$, respectively. Unlike the multi-group cross sections defined up to this point, the multi-group fission spectrum is weighted by the fission production rate rather than the scalar flux. This formulation is intended to preserve the total fission production rate in the multi-group deterministic calculation. In order to mathematically define the multi-group fission spectrum, we denote the microscopic fission cross section as $\\sigma_{n,f}(\\mathbf{r},E)$ and the average number of neutrons emitted from fission interactions with nuclide $n$ as $\\nu_{n,p}(\\mathbf{r},E)$ and $\\nu_{n,d}(\\mathbf{r},E)$ for prompt and delayed neutrons, respectively. The multi-group fission spectrum $\\chi_{n,k,g,d}$ is then the probability of fission neutrons emitted into energy group $g$. \n", + "\n", + "Similar to before, spatial homogenization and energy condensation are used to find the multi-energy-group and multi-delayed-group fission spectrum $\\chi_{n,k,g,d}$ as follows:\n", + "\n", + "$$\\chi_{n,k,g',d} = \\frac{\\int_{E_{g'}}^{E_{g'-1}}\\mathrm{d}E''\\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\chi_{n,d}(\\mathbf{r},E'\\rightarrow E'')\\nu_{n,d}(\\mathbf{r},E')\\sigma_{n,f}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}{\\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r}\\nu_{n,d}(\\mathbf{r},E')\\sigma_{n,f}(\\mathbf{r},E')\\Phi(\\mathbf{r},E')}$$\n", + "\n", + "The fission production-weighted multi-energy-group and multi-delayed-group fission spectrum for delayed neutrons is computed using OpenMC tallies with energy in, energy out, and delayed group filters. Alternatively, the delayed group filter can be omitted to compute the fission spectrum integrated over all delayed groups.\n", + "\n", + "This concludes our brief overview on the methodology to compute multi-energy-group and multi-delayed-group cross sections. The following sections detail more concretely how users may employ the `openmc.mgxs` module to power simulation workflows requiring multi-group cross sections for downstream deterministic calculations." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "import openmc\n", + "import openmc.mgxs as mgxs" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate some Nuclides\n", + "h1 = openmc.Nuclide('H1')\n", + "o16 = openmc.Nuclide('O16')\n", + "u235 = openmc.Nuclide('U235')\n", + "u238 = openmc.Nuclide('U238')\n", + "pu239 = openmc.Nuclide('Pu239')\n", + "zr90 = openmc.Nuclide('Zr90')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the nuclides we defined, we will now create a material for the homogeneous medium." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a Material and register the Nuclides\n", + "inf_medium = openmc.Material(name='moderator')\n", + "inf_medium.set_density('g/cc', 5.)\n", + "inf_medium.add_nuclide(h1, 0.03)\n", + "inf_medium.add_nuclide(o16, 0.015)\n", + "inf_medium.add_nuclide(u235 , 0.0001)\n", + "inf_medium.add_nuclide(u238 , 0.007)\n", + "inf_medium.add_nuclide(pu239, 0.00003)\n", + "inf_medium.add_nuclide(zr90, 0.002)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our material, we can now create a `Materials` object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a Materials collection and export to XML\n", + "materials_file = openmc.Materials([inf_medium])\n", + "materials_file.default_xs = '71c'\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. This problem will be a simple square cell with reflective boundary conditions to simulate an infinite homogeneous medium. The first step is to create the outer bounding surfaces of the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate boundary Planes\n", + "min_x = openmc.XPlane(boundary_type='reflective', x0=-0.63)\n", + "max_x = openmc.XPlane(boundary_type='reflective', x0=0.63)\n", + "min_y = openmc.YPlane(boundary_type='reflective', y0=-0.63)\n", + "max_y = openmc.YPlane(boundary_type='reflective', y0=0.63)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now create a cell that is defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a Cell\n", + "cell = openmc.Cell(cell_id=1, name='cell')\n", + "\n", + "# Register bounding Surfaces with the Cell\n", + "cell.region = +min_x & -max_x & +min_y & -max_y\n", + "\n", + "# Fill the Cell with the Material\n", + "cell.fill = inf_medium" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "OpenMC requires that there is a \"root\" universe. Let us create a root universe and add our square cell to it." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "openmc_geometry = openmc.Geometry()\n", + "openmc_geometry.root_universe = root_universe\n", + "\n", + "# Export to \"geometry.xml\"\n", + "openmc_geometry.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we must define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "batches = 50\n", + "inactive = 10\n", + "particles = 5000\n", + "\n", + "# Instantiate a Settings object\n", + "settings_file = openmc.Settings()\n", + "settings_file.batches = batches\n", + "settings_file.inactive = inactive\n", + "settings_file.particles = particles\n", + "settings_file.output = {'tallies': True}\n", + "\n", + "# Create an initial uniform spatial source distribution over fissionable zones\n", + "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", + "uniform_dist = openmc.stats.Box(bounds[:3], bounds[3:], only_fissionable=True)\n", + "settings_file.source = openmc.source.Source(space=uniform_dist)\n", + "\n", + "# Export to \"settings.xml\"\n", + "settings_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are ready to generate multi-group cross sections! First, let's define a 2-energy-group structure using the built-in `EnergyGroups` class. We will also create a 6-delayed-group structure using the built-in `DelayedGroups` class." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a 100-group EnergyGroups object\n", + "energy_groups = mgxs.EnergyGroups()\n", + "energy_groups.group_edges = np.logspace(-9,1.3,101)\n", + "\n", + "# Instantiate a 1-group EnergyGroups object\n", + "one_group = mgxs.EnergyGroups()\n", + "one_group.group_edges = np.array([0., 20.])\n", + "\n", + "delayed_groups = mgxs.DelayedGroups()\n", + "delayed_groups.groups = range(1,7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now use the `EnergyGroups` and `DelayedGroups` objects, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", + "\n", + "* `TotalXS`\n", + "* `TransportXS`\n", + "* `NuTransportXS`\n", + "* `AbsorptionXS`\n", + "* `CaptureXS`\n", + "* `FissionXS`\n", + "* `NuFissionXS`\n", + "* `KappaFissionXS`\n", + "* `ScatterXS`\n", + "* `NuScatterXS`\n", + "* `ScatterMatrixXS`\n", + "* `NuScatterMatrixXS`\n", + "* `Chi`\n", + "* `ChiPrompt`\n", + "* `InverseVelocity`\n", + "* `PromptNuFissionXS`\n", + "\n", + "A separate abstract `MDGXS` class is used for cross-sections and parameters that involve delayed neutrons. The subclasses of `MDGXS` include:\n", + "\n", + "* `DelayedNuFissionXS`\n", + "* `ChiDelayed`\n", + "* `Beta`\n", + "\n", + "These classes provide us with an interface to generate the tally inputs as well as perform post-processing of OpenMC's tally data to compute the respective multi-group cross sections. In this case, let's create the multi-group chi-prompt and prompt-nu-fission cross sections with our 2-energy-group structure and multi-group chi-delayed, delayed-nu-fission, and beta cross sections with our 2-energy-group and 6-delayed-group structures. " + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a few different sections\n", + "chi_prompt = mgxs.ChiPrompt(domain=cell, groups=energy_groups, by_nuclide=True)\n", + "prompt_nu_fission = mgxs.PromptNuFissionXS(domain=cell, groups=one_group, by_nuclide=True)\n", + "chi_delayed = mgxs.ChiDelayed(domain=cell, energy_groups=energy_groups, by_nuclide=True)\n", + "delayed_nu_fission = mgxs.DelayedNuFissionXS(domain=cell, energy_groups=one_group, delayed_groups=delayed_groups, by_nuclide=True)\n", + "beta = mgxs.Beta(domain=cell, energy_groups=one_group, delayed_groups=delayed_groups, by_nuclide=True)\n", + "\n", + "chi_prompt.nuclides = ['U235', 'Pu239']\n", + "prompt_nu_fission.nuclides = ['U235', 'Pu239']\n", + "chi_delayed.nuclides = ['U235', 'Pu239']\n", + "delayed_nu_fission.nuclides = ['U235', 'Pu239']\n", + "beta.nuclides = ['U235', 'Pu239']" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each multi-group cross section object stores its tallies in a Python dictionary called `tallies`. We can inspect the tallies in the dictionary for our `Beta` object as follows. " + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "OrderedDict([('nu-fission', Tally\n", + " \tID =\t10000\n", + " \tName =\t\n", + " \tFilters =\t\n", + " \t\tcell\t[1]\n", + " \t\tenergy\t[ 0. 20.]\n", + " \tNuclides =\tU235 Pu239 \n", + " \tScores =\t['nu-fission']\n", + " \tEstimator =\ttracklength), ('delayed-nu-fission', Tally\n", + " \tID =\t10001\n", + " \tName =\t\n", + " \tFilters =\t\n", + " \t\tcell\t[1]\n", + " \t\tdelayedgroup\t[1 2 3 4 5 6]\n", + " \t\tenergy\t[ 0. 20.]\n", + " \tNuclides =\tU235 Pu239 \n", + " \tScores =\t['delayed-nu-fission']\n", + " \tEstimator =\ttracklength)])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "beta.tallies" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The `Beta` object includes tracklength tallies for the 'nu-fission' and 'delayed-nu-fission' scores in the 2-energy-group and 6-delayed-group structure in cell 1. Now that each `MGXS` and `MDGXS` object contains the tallies that it needs, we must add these tallies to a `Tallies` object to generate the \"tallies.xml\" input file for OpenMC." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate an empty Tallies object\n", + "tallies_file = openmc.Tallies()\n", + "\n", + "# Add chi-prompt tallies to the tallies file\n", + "tallies_file += chi_prompt.tallies.values()\n", + "\n", + "# Add prompt-nu-fission tallies to the tallies file\n", + "tallies_file += prompt_nu_fission.tallies.values()\n", + "\n", + "# Add chi-delayed tallies to the tallies file\n", + "tallies_file += chi_delayed.tallies.values()\n", + "\n", + "# Add delayed-nu-fission tallies to the tallies file\n", + "tallies_file += delayed_nu_fission.tallies.values()\n", + "\n", + "# Add beta tallies to the tallies file\n", + "tallies_file += beta.tallies.values()\n", + "\n", + "# Export to \"tallies.xml\"\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we a have a complete set of inputs, so we can go ahead and run our simulation." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " .d88888b. 888b d888 .d8888b.\n", + " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", + " 888 888 88888b.d88888 888 888\n", + " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", + " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", + " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", + " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", + " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", + "__________________888______________________________________________________\n", + " 888\n", + " 888\n", + "\n", + " Copyright: 2011-2016 Massachusetts Institute of Technology\n", + " License: http://openmc.readthedocs.io/en/latest/license.html\n", + " Version: 0.8.0\n", + " Git SHA1: bc8a346a978644f5b2b21cccb6c5ae7f8397ebee\n", + " Date/Time: 2016-07-31 19:49:00\n", + " MPI Processes: 4\n", + "\n", + " ===========================================================================\n", + " ========================> INITIALIZATION <=========================\n", + " ===========================================================================\n", + "\n", + " Reading settings XML file...\n", + " Reading geometry XML file...\n", + " Reading cross sections XML file...\n", + " Reading materials XML file...\n", + " Reading H1.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/H1_71c.h5\n", + " Reading O16.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/O16_71c.h5\n", + " Reading U235.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/U235_71c.h5\n", + " Reading U238.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/U238_71c.h5\n", + " Reading Pu239.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/Pu239_71c.h5\n", + " Reading Zr90.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/Zr90_71c.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for H1.71c\n", + " Reading tallies XML file...\n", + " Building neighboring cells lists for each surface...\n", + " Initializing source particles...\n", + "\n", + " ===========================================================================\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.21670 \n", + " 2/1 1.24155 \n", + " 3/1 1.21924 \n", + " 4/1 1.22486 \n", + " 5/1 1.21719 \n", + " 6/1 1.24330 \n", + " 7/1 1.22322 \n", + " 8/1 1.24133 \n", + " 9/1 1.21840 \n", + " 10/1 1.25141 \n", + " 11/1 1.21217 \n", + " 12/1 1.25625 1.23421 +/- 0.02204\n", + " 13/1 1.22056 1.22966 +/- 0.01351\n", + " 14/1 1.21757 1.22664 +/- 0.01002\n", + " 15/1 1.24571 1.23045 +/- 0.00865\n", + " 16/1 1.26489 1.23619 +/- 0.00910\n", + " 17/1 1.22323 1.23434 +/- 0.00791\n", + " 18/1 1.26108 1.23768 +/- 0.00762\n", + " 19/1 1.23145 1.23699 +/- 0.00676\n", + " 20/1 1.23548 1.23684 +/- 0.00605\n", + " 21/1 1.20446 1.23390 +/- 0.00621\n", + " 22/1 1.20533 1.23152 +/- 0.00615\n", + " 23/1 1.22520 1.23103 +/- 0.00568\n", + " 24/1 1.18367 1.22765 +/- 0.00625\n", + " 25/1 1.23614 1.22821 +/- 0.00585\n", + " 26/1 1.23746 1.22879 +/- 0.00550\n", + " 27/1 1.23626 1.22923 +/- 0.00518\n", + " 28/1 1.21334 1.22835 +/- 0.00497\n", + " 29/1 1.25169 1.22958 +/- 0.00486\n", + " 30/1 1.25579 1.23089 +/- 0.00479\n", + " 31/1 1.23828 1.23124 +/- 0.00457\n", + " 32/1 1.26911 1.23296 +/- 0.00468\n", + " 33/1 1.20090 1.23157 +/- 0.00469\n", + " 34/1 1.28606 1.23384 +/- 0.00503\n", + " 35/1 1.23129 1.23374 +/- 0.00483\n", + " 36/1 1.22535 1.23341 +/- 0.00465\n", + " 37/1 1.20367 1.23231 +/- 0.00461\n", + " 38/1 1.22886 1.23219 +/- 0.00444\n", + " 39/1 1.24056 1.23248 +/- 0.00429\n", + " 40/1 1.25038 1.23307 +/- 0.00419\n", + " 41/1 1.21504 1.23249 +/- 0.00410\n", + " 42/1 1.20762 1.23171 +/- 0.00404\n", + " 43/1 1.20597 1.23093 +/- 0.00399\n", + " 44/1 1.24424 1.23133 +/- 0.00389\n", + " 45/1 1.24767 1.23179 +/- 0.00381\n", + " 46/1 1.22998 1.23174 +/- 0.00370\n", + " 47/1 1.26352 1.23260 +/- 0.00370\n", + " 48/1 1.23155 1.23257 +/- 0.00360\n", + " 49/1 1.22059 1.23227 +/- 0.00352\n", + " 50/1 1.24724 1.23264 +/- 0.00345\n", + " Creating state point statepoint.50.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 7.4000E-01 seconds\n", + " Reading cross sections = 3.9400E-01 seconds\n", + " Total time in simulation = 2.5930E+01 seconds\n", + " Time in transport only = 2.5267E+01 seconds\n", + " Time in inactive batches = 1.5300E+00 seconds\n", + " Time in active batches = 2.4400E+01 seconds\n", + " Time synchronizing fission bank = 6.4500E-01 seconds\n", + " Sampling source sites = 6.0000E-03 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for finalization = 1.1000E-02 seconds\n", + " Total time elapsed = 2.6689E+01 seconds\n", + " Calculation Rate (inactive) = 32679.7 neutrons/second\n", + " Calculation Rate (active) = 8196.72 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.23260 +/- 0.00309\n", + " k-effective (Track-length) = 1.23264 +/- 0.00345\n", + " k-effective (Absorption) = 1.23111 +/- 0.00186\n", + " Combined k-effective = 1.23135 +/- 0.00185\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run OpenMC\n", + "openmc.run(mpi_procs=4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created statepoint and summary output files. We begin our analysis by instantiating a `StatePoint` object. " + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the last statepoint file\n", + "sp = openmc.StatePoint('statepoint.50.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to the statepoint file, our simulation also created a summary file which encapsulates information about the materials and geometry. By default, a `Summary` object is automatically linked when a `StatePoint` is loaded. This is necessary for the `openmc.mgxs` module to properly process the tally data." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The statepoint is now ready to be analyzed by our multi-group cross sections. We simply have to load the tallies from the `StatePoint` into each object as follows and our `MGXS` objects will compute the cross sections for us under-the-hood." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the tallies from the statepoint into each MGXS object\n", + "chi_prompt.load_from_statepoint(sp)\n", + "prompt_nu_fission.load_from_statepoint(sp)\n", + "chi_delayed.load_from_statepoint(sp)\n", + "delayed_nu_fission.load_from_statepoint(sp)\n", + "beta.load_from_statepoint(sp)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Voila! Our multi-group cross sections are now ready to rock 'n roll!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extracting and Storing MGXS Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's first inspect our delayed-nu-fission section by printing it to the screen." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Multi-Delayed-Group XS\n", + "\tReaction Type =\tdelayed-nu-fission\n", + "\tDomain Type =\tcell\n", + "\tDomain ID =\t1\n", + "\tNuclide =\tU235\n", + "\tCross Sections [cm^-1]:\n", + " Delayed Group 1:\t\n", + " Group 1 [0.0 - 20.0 MeV]:\t5.16e-06 +/- 3.38e-01%\n", + "\n", + " Delayed Group 2:\t\n", + " Group 1 [0.0 - 20.0 MeV]:\t2.67e-05 +/- 3.38e-01%\n", + "\n", + " Delayed Group 3:\t\n", + " Group 1 [0.0 - 20.0 MeV]:\t2.54e-05 +/- 3.38e-01%\n", + "\n", + " Delayed Group 4:\t\n", + " Group 1 [0.0 - 20.0 MeV]:\t5.71e-05 +/- 3.38e-01%\n", + "\n", + " Delayed Group 5:\t\n", + " Group 1 [0.0 - 20.0 MeV]:\t2.34e-05 +/- 3.38e-01%\n", + "\n", + " Delayed Group 6:\t\n", + " Group 1 [0.0 - 20.0 MeV]:\t9.80e-06 +/- 3.38e-01%\n", + "\n", + "\n", + "\tNuclide =\tPu239\n", + "\tCross Sections [cm^-1]:\n", + " Delayed Group 1:\t\n", + " Group 1 [0.0 - 20.0 MeV]:\t1.17e-06 +/- 3.00e-01%\n", + "\n", + " Delayed Group 2:\t\n", + " Group 1 [0.0 - 20.0 MeV]:\t7.60e-06 +/- 3.00e-01%\n", + "\n", + " Delayed Group 3:\t\n", + " Group 1 [0.0 - 20.0 MeV]:\t5.75e-06 +/- 3.00e-01%\n", + "\n", + " Delayed Group 4:\t\n", + " Group 1 [0.0 - 20.0 MeV]:\t1.05e-05 +/- 3.00e-01%\n", + "\n", + " Delayed Group 5:\t\n", + " Group 1 [0.0 - 20.0 MeV]:\t5.47e-06 +/- 3.00e-01%\n", + "\n", + " Delayed Group 6:\t\n", + " Group 1 [0.0 - 20.0 MeV]:\t1.66e-06 +/- 3.00e-01%\n", + "\n", + "\n", + "\n" + ] + } + ], + "source": [ + "delayed_nu_fission.print_xs()" + ] + }, + { + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + "
celldelayedgroupgroup innuclidemeanstd. dev.
0111U2350.0002281.038855e-06
1111Pu2390.0000813.258333e-07
2121U2350.0011755.362249e-06
3121Pu2390.0005312.121977e-06
4131U2350.0011225.119269e-06
5131Pu2390.0004021.605842e-06
6141U2350.0025161.147782e-05
7141Pu2390.0007332.931785e-06
8151U2350.0010314.705745e-06
9151Pu2390.0003821.527096e-06
10161U2350.0004321.971220e-06
11161Pu2390.0001164.621961e-07
\n", + "
" + ], + "text/plain": [ + " cell delayedgroup group in nuclide mean std. dev.\n", + "0 1 1 1 U235 0.000228 1.038855e-06\n", + "1 1 1 1 Pu239 0.000081 3.258333e-07\n", + "2 1 2 1 U235 0.001175 5.362249e-06\n", + "3 1 2 1 Pu239 0.000531 2.121977e-06\n", + "4 1 3 1 U235 0.001122 5.119269e-06\n", + "5 1 3 1 Pu239 0.000402 1.605842e-06\n", + "6 1 4 1 U235 0.002516 1.147782e-05\n", + "7 1 4 1 Pu239 0.000733 2.931785e-06\n", + "8 1 5 1 U235 0.001031 4.705745e-06\n", + "9 1 5 1 Pu239 0.000382 1.527096e-06\n", + "10 1 6 1 U235 0.000432 1.971220e-06\n", + "11 1 6 1 Pu239 0.000116 4.621961e-07" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df = beta.get_pandas_dataframe()\n", + "df.head(12)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each multi-group cross section object can be easily exported to a variety of file formats, including CSV, Excel, and LaTeX for storage or data processing." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "beta.export_xs_data(filename='beta', format='excel')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The following code snippet shows how to export the chi `MGXS` to the same HDF5 binary data store." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "chi_prompt.build_hdf5_store(filename='mgxs', append=True)\n", + "chi_delayed.build_hdf5_store(filename='mgxs', append=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Using Tally Arithmetic to Compute the Delayed Neutron Precursor Concentrations" + ] + }, + { + "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 compute the delayed neutron precursor concentrations using the `Beta` and `DelayedNuFissionXS` objects. The delayed neutron precursor concentrations are modeled using the following equations:\n", + "\n", + "$$\\frac{\\partial}{\\partial t} C_{k,d} (t) = \\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r} \\beta_{k,d} (t) \\nu_d \\sigma_{f,x}(\\mathbf{r},E',t)\\Phi(\\mathbf{r},E',t) - \\lambda_{d} C_{k,d} (t) $$\n", + "\n", + "$$C_{k,d} (t=0) = \\frac{1}{\\lambda_{d}} \\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r} \\beta_{k,d} (t=0) \\nu_d \\sigma_{f,x}(\\mathbf{r},E',t=0)\\Phi(\\mathbf{r},E',t=0) $$" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + "
celldelayedgroupnuclidescoremeanstd. dev.
011(U235 / total)(((delayed-nu-fission / nu-fission) * (delayed...9.430766e-085.356653e-10
111(Pu239 / total)(((delayed-nu-fission / nu-fission) * (delayed...7.631830e-093.816602e-11
212(U235 / total)(((delayed-nu-fission / nu-fission) * (delayed...1.107191e-066.288818e-09
312(Pu239 / total)(((delayed-nu-fission / nu-fission) * (delayed...1.426298e-077.132776e-10
413(U235 / total)(((delayed-nu-fission / nu-fission) * (delayed...6.713761e-073.813401e-09
513(Pu239 / total)(((delayed-nu-fission / nu-fission) * (delayed...5.434458e-082.717718e-10
614(U235 / total)(((delayed-nu-fission / nu-fission) * (delayed...4.907155e-072.787253e-09
714(Pu239 / total)(((delayed-nu-fission / nu-fission) * (delayed...2.633756e-081.317115e-10
815(U235 / total)(((delayed-nu-fission / nu-fission) * (delayed...1.475656e-088.381692e-11
915(Pu239 / total)(((delayed-nu-fission / nu-fission) * (delayed...1.278385e-096.393074e-12
1016(U235 / total)(((delayed-nu-fission / nu-fission) * (delayed...1.190878e-096.764161e-12
1116(Pu239 / total)(((delayed-nu-fission / nu-fission) * (delayed...5.385798e-112.693384e-13
\n", + "
" + ], + "text/plain": [ + " cell delayedgroup nuclide \\\n", + "0 1 1 (U235 / total) \n", + "1 1 1 (Pu239 / total) \n", + "2 1 2 (U235 / total) \n", + "3 1 2 (Pu239 / total) \n", + "4 1 3 (U235 / total) \n", + "5 1 3 (Pu239 / total) \n", + "6 1 4 (U235 / total) \n", + "7 1 4 (Pu239 / total) \n", + "8 1 5 (U235 / total) \n", + "9 1 5 (Pu239 / total) \n", + "10 1 6 (U235 / total) \n", + "11 1 6 (Pu239 / total) \n", + "\n", + " score mean std. dev. \n", + "0 (((delayed-nu-fission / nu-fission) * (delayed... 9.43e-08 5.36e-10 \n", + "1 (((delayed-nu-fission / nu-fission) * (delayed... 7.63e-09 3.82e-11 \n", + "2 (((delayed-nu-fission / nu-fission) * (delayed... 1.11e-06 6.29e-09 \n", + "3 (((delayed-nu-fission / nu-fission) * (delayed... 1.43e-07 7.13e-10 \n", + "4 (((delayed-nu-fission / nu-fission) * (delayed... 6.71e-07 3.81e-09 \n", + "5 (((delayed-nu-fission / nu-fission) * (delayed... 5.43e-08 2.72e-10 \n", + "6 (((delayed-nu-fission / nu-fission) * (delayed... 4.91e-07 2.79e-09 \n", + "7 (((delayed-nu-fission / nu-fission) * (delayed... 2.63e-08 1.32e-10 \n", + "8 (((delayed-nu-fission / nu-fission) * (delayed... 1.48e-08 8.38e-11 \n", + "9 (((delayed-nu-fission / nu-fission) * (delayed... 1.28e-09 6.39e-12 \n", + "10 (((delayed-nu-fission / nu-fission) * (delayed... 1.19e-09 6.76e-12 \n", + "11 (((delayed-nu-fission / nu-fission) * (delayed... 5.39e-11 2.69e-13 " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Set the time constants for the delayed precursors (in seconds^-1)\n", + "precursor_halflife = np.array([55.6, 24.5, 16.3, 2.37, 0.424, 0.195])\n", + "precursor_lambda = -np.log(0.5) / precursor_halflife\n", + "\n", + "# Create a tally object with only the delayed group filter for the time constants\n", + "beta_filters = [f for f in beta.xs_tally.filters if f.type != 'delayedgroup']\n", + "lambda_tally = beta.xs_tally.summation(nuclides=beta.xs_tally.nuclides)\n", + "for f in beta_filters:\n", + " lambda_tally = lambda_tally.summation(filter_type=f.type, remove_filter=True) * 0. + 1.\n", + "\n", + "# Set the mean of the lambda tally and reshape to account for nuclides and scores\n", + "lambda_tally._mean = precursor_lambda\n", + "lambda_tally._mean.shape = lambda_tally.std_dev.shape\n", + "\n", + "# Set a total nuclide and lambda score\n", + "lambda_tally.nuclides = [openmc.Nuclide(name='total')]\n", + "lambda_tally.scores = ['lambda']\n", + "\n", + "# Use tally arithmetic to compute the precursor concentrations\n", + "precursor_conc = beta.xs_tally.summation(filter_type='energy', remove_filter=True) * \\\n", + " delayed_nu_fission.xs_tally.summation(filter_type='energy', remove_filter=True) / lambda_tally\n", + " \n", + "# The difference is a derived tally which can generate Pandas DataFrames for inspection\n", + "precursor_conc.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can plot the delayed neutron fractions for each nuclide." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Beta (U-235) : 0.006504 +/- 0.000015\n", + "Beta (Pu-239): 0.002245 +/- 0.000004\n" + ] + }, + { + "data": { + "text/plain": [ + "(0, 7)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n771XLz/wwAO55JJLWLBgAfPmzVt9R8qOtPXkVe/EUikFl7+jrW3T5r6SGshKOGdGxNK0+HLggxGx\nK1mp5sftjtisizQ3w9KlVTfr1pYuza7D1rjjjjtYuHAhr7zyCj/72c/o379/m9ufcsopq29XfOGF\nF6617tvf/jZTp07lpptuqrhvv379GDNmDBdccAEvvvgiAP/1X//Fbrvtxq677so+++zD4YcfzoYb\nbsgWW2xRmwusoN5VYbOBYSWvtwHmlm0zC9gWmCupLzAwIt6UNDstX2dfSRuQJZVrI+KOlg0i4l8l\n2/8auKu1wJpLPv1NTU00NTXlviizeih6UmnRna6jM1VXNYuhQulk0003XavEMG/evNXPr7jiCq64\n4op19hk3bhz33Xcfjz76KA0NDW2ec/ny5bz88svsvPPO9O/fn0svvZRLL70UgF/96lfsvvvuuare\nJk2axKRJk6put448dwPr6APoC/w3MBzoBzwH7Fi2zanA5en5WLJ2FYCdgGfTfiPTcVpuTHYNWSN9\n+fm2Knl+FnBDK3FVv4Wa2XqW3aE9exRRV8Xfnf+eR4wYEQ8++OA6y48++ug4+uijY/ny5TF58uQY\nMmRIHHvssa0e5wc/+EGMGjUq5s2bt866J598Mh577LF47733YtmyZXHhhRfGgAED4vXXX4+IiDlz\n5sTcuXMjIuKJJ56IbbfdNh544IE2427tPSXnHSTXx22ADwD+DswAzknLxgOfS883Am5O658ERpTs\ne25KKNOA0WnZ3sDKlKSeBaYAB8SahPNCWvf/gC1bianNN9WsKzixdPS83fcNGzlyZMXE8vLLL8de\ne+0VjY2N8bnPfS7OPPPMNhOLpOjfv380Njauvl3xBRdcEBERjzzySOyyyy4xYMCAGDx4cDQ1NcVj\njz22et9HH300RowYEZtuumnssMMOceONN1aNu7OJxbcmNusmSmsmivjx7Kr4fWvi2vOtic3MrFup\n2ngv6ePAMcAnga2BZcBfgd8D10XEorpGaGZmhdJmVZikP5D1xLoD+AvwT6A/sD2wL3AwWSP6nfUP\ntXZcFWbdkavCOnpeV4XVWmerwqolliERsaBKAFW36W6cWKw7cmLp6HmdWGqtrm0sLQlD0qZp3i8k\nbS/pEEkblm5jZmYG+RvvHwX6SxoK3A8cC/y2XkGZmVlx5R15r4h4R9IJZIMZL5L0bD0DMzPLY/jw\n4bkncLR8hg8f3qn9cyeW1DvsaLJp7tuzr5lZ3cycObOrQ7AyeavCziQbBX97RPxN0geAh+sXlpmZ\nFZVH3pt1E+4VZt1d3l5huaqzJG0PfAsYUbpPROzX0QDNzKxnylVikfQ88AvgGbIJIAGIiGfqF1r9\nuMRi3VHRf/EXPX6rrqYlFmBFRKx7gwAzM7MyeRvv75J0qqStJQ1qedQ1MjMzK6S8VWGvVFgcEfGB\n2odUf64Ks+6o6FVJRY/fqqvJXGE9lROLdUdF/2IuevxWXa17hW0InAJ8Ki2aBPwyIpZ3OEIzM+uR\n8laFXQlsCExIi44FVkbEV+oYW924xGLdUdF/8Rc9fquu1r3C9oiIXUpeP5S6IJuZma0lb6+wlZI+\n2PIiTemyso3tzcysl8pbYvk28LCklwEBw4Ev1S0qMzMrrDz3vO9Ddp/7UcCHyBLL9Ih4t86xmZlZ\nAeVtvH82InZbD/GsF268t+6o6I3fRY/fqqvJrYlLPCjpCPluOmZmVkXeEssSYFNgBfBvsuqwiIgB\n9Q2vPlxise6o6L/4ix6/VVfT7sYR0dj5kMzMrDfIVRUm6cE8y8zMzNossUjqD2wCDJG0OVkVGMAA\n4P11js3MzAqoWlXYScDXyZLIlJLli4Gf1ysoMzMrrjarwiLikogYCXwrIkaWPHaJiMvynEDSAZKm\nS3pJ0tkV1veTNFHSDElPSBpWsu7ctHyapNFp2TaSHpI0VdKLks4o2X5zSfdL+ruk+yQNzP1OmJlZ\nTeTtFXZcpeURcU2V/foALwH7A3OBycDYiJhess0pwM4RcaqkMcDhETFW0k7A9cAewDbAA2SDNLcE\ntoqI5yQ1kN0u+dCImC7ph8AbEXFRSmKbR8Q5FeJyrzDrdoreq6ro8Vt1tR7HskfJ45NAM3BIjv32\nBGZExKtpiv2JwKFl2xzKmlmTbwX2S88PASZGxIqImAnMAPaMiHkR8RxARCwFpgFDKxxrAnBYzusz\nM7Maydvd+Gulr1MV0005dh0KzCp5PZss2VTcJiJWSlqUbns8FHiiZLs5rEkgLXGMAHYFnkyLtoiI\n+elY8yS9L0eMZmZWQ3knoSz3DjAyx3aVikzlheTWtmlz31QNditwZkS8nSOWtTQ3N69+3tTURFNT\nU3sPYWbWo02aNIlJkya1e7+8d5C8izVf6n2AnYCbc+w6GxhW8nobsraWUrOAbYG5kvoCAyPiTUmz\n0/J19pW0AVlSuTYi7ijZZr6kLSNivqStgH+2FlhpYjEzs3WV/+geP358rv3yllh+VPJ8BfBqRMzO\nsd9kYDtJw4HXgbHAUWXb3AUcDzwFHAk8lJbfCVwv6SdkVWDbAU+ndb8BpkbEJWXHuhP4IvDDdMw7\nMDOz9SpXrzCAlBxGRcQDkjYGNoiIJTn2OwC4hKykc1VEXChpPDA5Iu6WtBFwLbAb8AZZr7GZad9z\ngROA5WRVXvdL2ht4FHiRrBQVwHcj4t7UNnMzWUnnNeDIiHirQkzuFWbdTtF7VRU9fqsub6+wvN2N\nTwS+CgyKiA9KGgX8IiL273yo658Ti3VHRf9iLnr8Vl2tuxufBuxNNuKeiJgBbNHx8MzMrKfKm1je\njYj3Wl6kxnP/JjEzs3XkTSyPSPousLGk/wXcQtbobmZmtpa8bSx9yBrRR5ONL7kPuLKoDRVuY7Hu\nqOhtFEWP36qraeN9T+PEYt1R0b+Yix6/VVfTO0imLr7NwPC0T8utiT/QmSDNzKznyVsVNh04i2wm\n4ZUtyyPijfqFVj8usVh3VPRf/EWP36qraYkFWBQRf+hkTGZm1gvkLbFcCPQFfge827I8Iqa0ulM3\n5hKLdUdF/8Vf9PitulqPvH+4wuKIiP0qLO/2nFisOyr6F3PR47fq3CusDU4s1h0V/Yu56PFbdbWe\n0sXMzCwXJxYzM6spJxYzM6upNrsbS/p8W+sj4ne1DcfMzIqu2jiWg9tYF2Tdj83MzFZzrzCzbqLo\nvaqKHr9VV+uR90g6CPgw0L9lWUSc17HwzMysp8rVeC/pF8AY4GtkE1AeSTYhpZmZ2Vryjrx/ISI+\nUvJvA/CHiPhk/UOsPVeFWXdU9Kqkosdv1dV6gOSy9O87kt4PLAe27mhwZmbWc+VtY7lb0mbA/wWm\nkPUIu7JuUZmZWWHlrQrbKCLebXlO1oD/75ZlReOqMOuOil6VVPT4rbpaV4U90fIkIt6NiEWly8zM\nzFpUG3m/FTAU2FjSbmQ9wgAGAJvUOTYzMyugam0snwG+CGwD/Lhk+RLgu3WKyczMCixvG8sREXHb\neohnvXAbi3VHRW+jKHr8Vl2t21gelPRjSX9Jj4slDexkjGZm1gPlTSxXkVV/fSE9FgNX59lR0gGS\npkt6SdLZFdb3kzRR0gxJT0gaVrLu3LR8mqTRJcuvkjRf0gtlxxonabakKelxQM7rMzOzGslbFfZc\nROxabVmF/foALwH7A3OBycDYiJhess0pwM4RcaqkMcDhETFW0k7A9cAeZG08DwCjIiIk7QMsBa6J\niI+UHGscsCQiStuDKsXlqjDrdopelVT0+K26mo+8T1/mLQffmzWj8duyJzAjIl6NiOXARODQsm0O\nBSak57cC+6XnhwATI2JFRMwEZqTjERGPAW+2cs6qF21mZvWTN7GcDPxc0kxJM4HLgJNy7DcUmFXy\nenZaVnGbiFgJLJI0qMK+cyrsW8lpkp6TdKXbgczM1r+8U7osjohdJA0AiIjFkkbm2K9S6aG8kNza\nNnn2LXc5cF6qLjufrIv0CZU2bG5uXv28qamJpqamKoc2M+tdJk2axKRJk9q9X942likR8dGyZc9E\nxO5V9vsY0BwRB6TX5wARET8s2eYPaZunJPUFXo+ILcq3lXQvMC4inkqvhwN3lbaxlJ271fVuY7Hu\nqOhtFEWP36qryY2+JO1AdnOvgZI+X7JqACU3/GrDZGC79CX/OjAWOKpsm7uA44GnyO7z8lBafidw\nvaSfkFWBbQc8XRoeZaUaSVtFxLz08vPAX3PEaGZmNVStKuxDwOeAzYCDS5YvAU6sdvCIWCnpdOB+\nsvacqyJimqTxwOSIuJusK/O1kmYAb5AlHyJiqqSbgalk0/Sf2lLMkHQD0AQMlvQaWUnmauAiSbsC\nq4CZ5GsHMjOzGspbFfbxiOgxk066Ksy6o6JXJRU9fqsub1VYrsTS0zixWHdU9C/mosdv1dV6HIuZ\nmVkuTixmZlZTucaxpLtGHgGMKN0nIs6rT1hmZlZUeQdI3gEsAp4BCnk7YjMzWz/yJpZtWgY5mpmZ\ntSVvG8vjknauayRmZtYj5B3HMpVs5PsrZFVhIptupeJ0Kt2duxtbd1T07rpFj9+qq8mULiUO7GQ8\nZmbWS+QeIClpF+CT6eWfIuL5ukVVZy6xWHdU9F/8RY/fqqvpAElJZ5LdzXGL9LhO0tc6F6KZmfVE\nedtYXgA+HhFvp9ebAk+4jcWsdor+i7/o8Vt1tZ7SRcDKktcr8S2AzcysgryN91cDT0m6Pb0+jGy6\nezMzs7W0p/H+o8A+ZCWVRyPi2XoGVk+uCrPuqOhVSUWP36qrybT5kgak+9sPqrQ+IhZ2IsYu48Ri\n3VHRv5iLHr9VV6txLDeQ3UHyGaD0o6L0+gMdjtDMzHok3+jLrJso+i/+osdv1dV6HMuDeZZZ8V18\nMTQ2Zl8SRX00NmbXYWZdo1obS39gE+BhoIk1XYwHAH+IiB3rHWA9uMTSusZGWLq0q6PovIYGWLKk\nq6Non6KpVmKcAAASGElEQVT/4i96/FZdrdpYTgK+DryfrJ2l5YCLgZ93KkLrlnpCUoGecx1mRZR3\n5P3XIuJn6yGe9cIlltYV/VdnkeMvcuxQ/PitulqPvF8labOSg28u6dQOR2e2HnR1W097H2Y9Rd7E\ncmJEvNXyIiLeBE6sT0hmHdfQ0NURdF5PuAbr3fImlj7Smt9UkvoC/eoTklnHNTcX+4u5oSG7BrMi\ny9vG8n+BEcAvyAZGngzMiohv1jW6OnEbS+tcT24d5c9Oz1eTKV1KDtaHrIfY/mQ9w+4HroyIlW3u\n2E05sbTOXw7WUf7s9Hw1TSw9jRNL6/zlYB3lz07PV+uR96Mk3SppqqSXWx459z1A0nRJL0k6u8L6\nfpImSpoh6QlJw0rWnZuWT5M0umT5VZLmpxuQlR5rc0n3S/q7pPskDcwTo5mZ1U7exvurgSuAFcC+\nwDXAddV2SlVolwGfAT4MHCVph7LNTgAWRsQo4KfARWnfnYAvADsCBwKXl3QguDods9w5wAMR8SHg\nIeDcnNdnZjXU1V23PR1Q18qbWDaOiAfJqs5ejYhm4KAc++0JzEj7LAcmAoeWbXMoMCE9vxXYLz0/\nBJgYESsiYiYwIx2PiHgMeLPC+UqPNYHshmRmth4UuTdei6VL3SuvFvImln+n0scMSadLOhzI8zEa\nCswqeT07Lau4TeoMsCjd/6V83zkV9i23RUTMT8eaB7wvR4xmVgNF7+rdwtMBdV7eWxN/nWwyyjOA\n75NVhx2fY79KjTzlzXqtbZNn3w5rLvlZ0tTURFNTU60ObdYrffOb2aOoPPvBuiZNmsSkSZPavV/V\nxJIGQ46JiG8BS4EvteP4s4FhJa+3AeaWbTML2BaYm841MCLelDQ7LW9r33LzJW0ZEfMlbQX8s7UN\nm13eNTNrU/mP7vHjx+far2pVWKqe2qeDcU0GtpM0XFI/YCxwZ9k2d7Gm9HMkWaM7abuxqdfYSGA7\n4OmS/cS6pZo7gS+m58cDd3QwbjMz66C8VWHPSroTuAV4u2VhRPyurZ0iYqWk08kGVPYBroqIaZLG\nA5Mj4m7gKuBaSTOAN8iSDxExVdLNwFRgOXBqy+ATSTeQ3R9msKTXgHERcTXwQ+BmSV8GXiNLVGZm\nth7lHXl/dYXFERFfrn1I9ecBkq3zIDfrrfzZr64mN/qS9MOIOBu4JyJuqVl0ZmbWY1VrY/lsGpTo\ngYZmZpZLtTaWe8kGIjZIWlyyXGRVYQPqFpmZmRVS3jaWOyKifMR8YbmNpXWuZ7beyp/96moyu7Fy\nfAPn2aa7KWDI643/uKy38me/ulrNbvywpK+VzjicDt5P0n6SJpBvBL6ZmfUS1Uos/YEvA0cDI4G3\ngI3JEtL9wM8j4rn1EGdNucTSOv9qs97Kn/3qan6jL0kbAkOAZRHxVifj61JOLK3zH5f1Vv7sV1eT\ncSylImK5pJXAAEkD0rLXOhGjmZn1QHnvIHlImnLlFeARYCbwhzrGZWZmBZX3fizfBz4GvBQRI4H9\ngSfrFpWZmRVW3sSyPCLeAPpI6hMRDwP/s45xmZlZQeVtY3lLUgPwKHC9pH9SMsuxmZlZi7wj7zcF\nlpGVcI4GBgLXRcTC+oZXH+4V1jr3jLHeyp/96mra3bhkluM2lxWFE0vr/MfVdS5+/GKaH2lm6XvF\nvel6Q78Gmj/dzDc/Ubx7FPuzX12tE8uUiPho2bIXIuIjnYixyzixtM5/XF2n8YLGQieVFg39Glhy\n7pKuDqPd/Nmvrlb3YzkFOBX4gKQXSlY1An/uXIhmVqonJBXoOddhHVet8f4GsvEqFwDnlCxfUtT2\nFbMiiHHF+8ms8VV/yFov0WZ344hYFBEzI+IoYFtgv4h4lazb8cj1EqGZmRVK3pH344CzWXMnyX7A\ndfUKyszMiivvAMnDgUNIY1ciYi5ZO4uZmdla8iaW91I3qoDV41rMzMzWkTex3Czpl8Bmkk4EHgB+\nXb+wzMysqHJN6RIRP5L0v4DFwIeA70XEH+samZmZFVJ77sfyR+CPkoYAb9QvJDMzK7I2q8IkfUzS\nJEm/k7SbpL8CfwXmSzpg/YRoZmZFUq3EchnwXbJJJx8CDoyIJyXtANwI3Fvn+MzMrGCqNd5vEBH3\nR8QtwLyIeBIgIqbXPzQzMyuiaollVcnzZWXrcs05IekASdMlvSRpndmQJfWTNFHSDElPSBpWsu7c\ntHyapNHVjinpakkvS3pW0hRJhZwk08ysyKpVhe0iaTEgYOP0nPS6f7WDS+pDVp22PzAXmCzpjrIS\nzwnAwogYJWkMcBEwVtJOwBeAHYFtgAckjUrnbuuY34yI26teuVX28YuhqRk2WorGd3UwHVPkqdvN\neoJqc4X1jYgBEdEYERuk5y2vN8xx/D2BGRHxakQsByYCh5ZtcygwIT2/FdgvPT8EmBgRKyJiJjAj\nHa/aMfOOzbFKUlIpsqXvLaX5keauDsOs16r3l/BQYFbJ69lpWcVtImIlsEjSoAr7zknLqh3zfEnP\nSbpYUp7kZ6UKnlRaeOp2s66TexxLB1WaR7u8baa1bVpbXikZthzznIiYnxLKr8kmzjw/Z6xWxlO3\nm1lH1DuxzAaGlbzehqxdpNQssin550rqCwyMiDclzU7Ly/dVa8eMiPnp3+WSrgZarWRvbm5e/byp\nqYmmpqb2XJeZWY83adIkJk2a1O796p1YJgPbSRoOvA6MBY4q2+Yu4HjgKeBIsvEyAHcC10v6CVlV\n13bA02QllorHlLRVRMyTJOAwssGcFZUmFjMzW1f5j+7x4/P16KlrYomIlZJOB+4nSwhXRcQ0SeOB\nyRFxN3AVcK2kGWRTxYxN+06VdDMwFVgOnJpmWK54zHTK69OUMwKeA06u5/WZmdm66l1iISLuJZu4\nsnTZuJLn75J1K6607wVkt0Wuesy0fP/OxmtmZp1T98RiZlY0KngfkOjifjce82FmBjQ0dHUEPYdL\nLNZjueuxtUdzc/ZY6iFQnebEYj1KQ7+Gwg+ObOhX/J/ORU3qDd9t4EeeDqjTXBVmPUrzp5sL/cXc\nMs9ZERX5fW/h6YBqQ9HVrTxdQFL0xuvOo/SXZhFH3lvXufjxi2l+pLnwJUbwZ781koiIqsVRJxZb\nixOL9Vb+7FeXN7G4KszMzGrKicXMzGrKicXMzGrKicXMzGrKicXMzGrKicXMzGrKicXMzGrKicXM\nzGrKiaXGpGI/zMw6y4nFzMxqyonFzMxqyomlxiKK/TAz6ywnFjMzqyknFjMzqyknFjMzqyknFjMz\nqynf897MrEzpTb+KqKtvVOYSi5kZ0NCvoatD6DGcWMzMgOZPNzu51IjveV/rYxe8CF2qq4vTZta9\n+J731in+5WZmHVX3xCLpAEnTJb0k6ewK6/tJmihphqQnJA0rWXduWj5N0uhqx5Q0QtKTkv4u6UZJ\n7pzQAQ39Gmj+dHNXh2FmRRURdXuQJa7/BoYDGwLPATuUbXMKcHl6PgaYmJ7vBDxL1nNtRDqO2jom\ncBNwZHp+BXBSK3FFkT388MNdHUKnFDn+Isce4fi7WtHjT9+dVb/7611i2ROYERGvRsRyYCJwaNk2\nhwIT0vNbgf3S80PIksyKiJgJzEjHa+uY+wG3pecTgMNrf0ldb9KkSV0dQqcUOf4ixw6Ov6sVPf68\n6p1YhgKzSl7PTssqbhMRK4FFkgZV2HdOWlbxmJIGA29GxKqS5e+v0XWYmVlO9U4slXoPlHc1am2b\njiwvX+duTWZm61ue+rKOPoCPAfeWvD4HOLtsmz8Ae6XnfYF/VtoWuBfYq61jAv8C+pSc+w+txBV+\n+OGHH360/5Hnu7/evaYmA9tJGg68DowFjirb5i7geOAp4EjgobT8TuB6ST8hq/7aDniarJRVfsyx\naZ+H0jFuSse8o1JQkaMftpmZdUxdE0tErJR0OnA/WUK4KiKmSRoPTI6Iu4GrgGslzQDeICWJiJgq\n6WZgKrAcODX1Sqh0zOnplOcAEyV9n6xH2VX1vD4zM1tXrxx5b2Zm9dOrRt5XG6zZ3Um6StJ8SS90\ndSztJWkbSQ9JmirpRUlndHVM7SFpI0lPSXo2xT+uq2PqCEl9JE2RdGdXx9JekmZKej79Hzzd1fG0\nh6SBkm5Jg73/Jmmvro4pL0nbp/d8Svp3UbW/315TYpHUB3gJ2B+YS9b+M7akGq3bk7QPsBS4JiI+\n0tXxtIekrYCtIuI5SQ3AM8ChBXv/N4mIdyT1Bf4MnBERRfuCOwvYHRgQEYd0dTztIellYPeIeLOr\nY2kvSb8FHomIq9OMIJtExOIuDqvd0vfobLIOV7Na2643lVjyDNbs1iLiMaBwf1QAETEvIp5Lz5cC\n01h3TFO3FhHvpKcbkbVPFupXmaRtgM8CV3Z1LB3UMvNGoUhqBD4ZEVcDpEHfhUsqyX8A/2grqUAB\n/5M6Ic9gTVsPJI0AdiXrCVgYqRrpWWAe8MeImNzVMbXTT4BvU7CEWCKA+yRNlnRiVwfTDh8AFki6\nOlUn/UrSxl0dVAeNAW6stlFvSix5BmtanaVqsFuBM1PJpTAiYlVE7AZsA+wlaaeujikvSQcB81Op\nsdJg4iL4RET8T7JS12mpargINgA+Cvw8Ij4KvEPWg7VQJG1INtXWLdW27U2JZTYwrOT1NmRtLbae\npLrlW4FrI6LiGKMiSNUYk4ADujiU9tgbOCS1U9wI7Cvpmi6OqV0iYl7691/A7WTV20UwG5gVEX9J\nr28lSzRFcyDwTHr/29SbEsvqwZqS+pGNlylczxiK+2sT4DfA1Ii4pKsDaS9JQyQNTM83JqtrLkzH\ng4j4bkQMi4gPkH32H4qI47o6rrwkbZJKu0jaFBgN/LVro8onIuYDsyRtnxbtTzY+r2iOIkc1GNR5\ngGR30tpgzS4Oq10k3QA0AYMlvQaMa2kQ7O4k7Q0cDbyY2ikC+G5E3Nu1keW2NTAh9YrpA9wUEfd0\ncUy9yZbA7ZKC7Hvr+oi4v4tjao8zyGYS2RB4GfhSF8fTLiU/pr6aa/ve0t3YzMzWj95UFWZmZuuB\nE4uZmdWUE4uZmdWUE4uZmdWUE4uZmdWUE4uZmdWUE4v1apJWpvmb/pqmBD9LUpsDUNMg2xfrHNfV\nkj7fyrpvpOnXW6aQ/1GacdmsW+g1AyTNWvF2mr8JSUPIRhYPBJqr7NclA8AknUw2UG3PiFiSpsn5\nBrAx2S0VSrftExGruiBM6+VcYjFLImIB2cji02H1bMYXpRt8PVdpRt1UenlU0l/S42Np+TWSDi7Z\n7jpJn2vrmJIuSyWR+4EtWgnzu8DJEbEkxbwiIi5qmdBT0pJUgnkW+Jik/VOJ7HlJV6aR30h6RdKg\n9Hx3SQ+n5+NS7I9L+rukr3T2fbXex4nFrEREvAJI0vuAE4C3ImIvsgkPvyppeNku/wT+I826Oxb4\nWVp+JfBlsoMNAD4O3NPaMSUdDoyKiB2B44FPlMeW5sraNCJea+MSNgWeSLMwPwNcDRwZEbsAGwKn\ntFxq+aWXPN+ZbOqgTwDfSzdpM8vNicVsXS1tLKOB49Kv/6eAQcCosm03BK5UdrvoW4AdASLiUeCD\nqXrtKOC2VC3V2jE/RZrgLyJeBx5qJa7VCUDS6NTG8kpLSQlYAfwuPf8Q8HJE/CO9npDOU3qNldwR\nEe9FxBspjqLMImzdhNtYzEpI+gCwMiL+lRrxvxYRfyzbprTUchYwLyI+khrQl5WsuxY4hqwk0zLp\nYGvHPIgq7TapTeVtScPTnVDvB+6XdBfQL23271gzAWBbM2GvYM0Py/7lpyoNrVpcZuVcYrHebvUX\nb6r+uoI11Vn3AaemBnIkjapw57+BwOvp+XFAae+sCcDXgSiZSbvSMTcBHgXGpjaYrYF9W4n3QuCK\nkin8xdqJoTSRTAeGp2QJcCzZfWQAXgF2T8+PKDvHoZL6SRoMfJrslhNmubnEYr1df0lTyH7xLweu\niYifpHVXAiOAKekL/J/AYWX7Xw7cJuk44F7g7ZYVEfFPSdPIbkrVouIxI+J2SfsBfwNeAx6vFGxE\nXJES0VOS/k3WE+zPwLMtm5Rs+66kLwG3ptLUZOCXafV5wFWSFrEm2bR4IS0bDJzXcoMts7w8bb5Z\nnaQE8Dzw0ZZeXN2dpHHAkoj4cVfHYsXlqjCzOpC0PzANuLQoScWsVlxiMTOzmnKJxczMasqJxczM\nasqJxczMasqJxczMasqJxczMasqJxczMaur/B+pIw4157yBfAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "energy_filter = [f for f in beta.xs_tally.filters if f.type == 'energy']\n", + "beta_integrated = beta.xs_tally.summation(filter_type='energy', remove_filter=True)\n", + "beta_u235 = beta_integrated.get_values(nuclides=['U235'])\n", + "beta_pu239 = beta_integrated.get_values(nuclides=['Pu239'])\n", + "\n", + "# Reshape the betas\n", + "beta_u235.shape = (beta_u235.shape[0])\n", + "beta_pu239.shape = (beta_pu239.shape[0])\n", + "\n", + "df = beta_integrated.summation(filter_type='delayedgroup', remove_filter=True).get_pandas_dataframe()\n", + "print('Beta (U-235) : {:.6f} +/- {:.6f}'.format(df[df['nuclide'] == 'U235']['mean'][0], df[df['nuclide'] == 'U235']['std. dev.'][0]))\n", + "print('Beta (Pu-239): {:.6f} +/- {:.6f}'.format(df[df['nuclide'] == 'Pu239']['mean'][1], df[df['nuclide'] == 'Pu239']['std. dev.'][1]))\n", + "\n", + "beta_u235 = np.append(beta_u235[0], beta_u235)\n", + "beta_pu239 = np.append(beta_pu239[0], beta_pu239)\n", + "\n", + "# Create a step plot for the MGXS\n", + "plt.plot(np.arange(0.5, 7.5, 1), beta_u235, drawstyle='steps', color='b', linewidth=3)\n", + "plt.plot(np.arange(0.5, 7.5, 1), beta_pu239, drawstyle='steps', color='g', linewidth=3)\n", + "\n", + "plt.title('Delayed Neutron Fraction (beta)')\n", + "plt.xlabel('Delayed Group')\n", + "plt.ylabel('Beta(fraction total neutrons)')\n", + "plt.legend(['U-235', 'Pu-239'])\n", + "plt.xlim([0,7])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also plot the fission spectrum for the prompt and delayed neutrons." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(0.001, 20)" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n9erFmWeeyRtvvAFAkyZNgmWqSk5ODjt37mTHjh2AnT5zwoQJFBQU0KZNGyZMmBDTNPTCCy9w3HHH\n0bp1a8aPH1+ts3/wwQc5/vjjadOmDQMHDmTdunUR21m6dCmnnHIKBQUFFBcXh/xIBw8ezF/+8peQ\n+ieddBJPP23/dNasWUP//v1p06YNxx13HE888USw3o4dOzj//PMpKCigd+/eCaU3bciULi8NboaG\nR1IVg6oeAK4Dngc+Bhao6iciUioigwFE5Mcish64CLhPRAKJfYcCfYCxIvK+iLwnIifWpXyW30JK\npdoWzS4bqX5dRJ9cv359sKOMhldzyPfff8/KlSurpfw86aSTaNq0KRdccAFXXHFFMEdDIMxugIMH\nD7JhwwZ2795dre3t27dz0UUXcdttt7Ft2zaOPvpoXnvttWD5U089xe9//3ueeuoptm7dyplnnsmI\nESMiypmXl8fcuXPZtWsXS5Ys4b777gt2/IEcDQFWrVrFpk2bGDRoEHv37qV///6MHDmSbdu2MX/+\nfK699lo++eQTAK699lqaN2/Oli1bmD17tmf/h8FgqCLpsZJU9TlVPUZVu6rq751jJar6rPP5HVXt\nqKotVfVQZ3oqqvqYqjZR1VNU9WTn73+SLW99csEFF1BYWMhZZ51Fv379IialqSlXX301J598Mv37\n9w85vmrVKnbv3s28efM444wzgscHDhzI3XffzbZt2/jqq6+CWeH27t1bre2lS5dywgkn8LOf/YxG\njRpx/fXX065du2D5Aw88wJQpU+jWrRs5OTnceOONfPDBByFJfwKcddZZQeX1ox/9iOHDh7N8+XIA\nhgwZwmeffRZ823/00UcZNmwYjRo14tlnn6Vz586MHj0aEaFHjx5ceOGFLFy4kIMHD/Lkk09yyy23\n0LRpU0444QTGjBmT4BM1GBoeJoheClm8eDE7duzgyy+/5M9//jNNmjSJe84111wTzMXw+9//PqRs\n8uTJrF69Omou58aNGzNs2DBmzJjBhx/aA7OpU6dy8skn06NHD/r06cPPfvYzcnNzOeyww6qdH57y\nEwjZLy8vZ+LEicF0nG3atEFEqmVbA3jrrbc4++yzOeyww2jVqhX3339/MOVn48aNGTp0KI8++iiq\nyvz584O5oMvLy3nzzTdDUn7OmzePLVu2sHXrViorKznyyCOD12mwwfn8JVVbBALO6Ax0z0Uk/F6y\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "chi_d_u235 = chi_delayed.xs_tally.get_values(nuclides=['U235'])\n", + "chi_d_pu239 = chi_delayed.xs_tally.get_values(nuclides=['Pu239'])\n", + "chi_p_u235 = chi_prompt.xs_tally.get_values(nuclides=['U235'])\n", + "chi_p_pu239 = chi_prompt.xs_tally.get_values(nuclides=['Pu239'])\n", + "\n", + "# Reshape the betas\n", + "chi_d_u235.shape = (chi_d_u235.shape[0])\n", + "chi_d_pu239.shape = (chi_d_pu239.shape[0])\n", + "chi_p_u235.shape = (chi_p_u235.shape[0])\n", + "chi_p_pu239.shape = (chi_p_pu239.shape[0])\n", + "\n", + "chi_d_u235 = np.append(chi_d_u235[0] , chi_d_u235)\n", + "chi_d_pu239 = np.append(chi_d_pu239[0], chi_d_pu239)\n", + "chi_p_u235 = np.append(chi_p_u235[0] , chi_p_u235)\n", + "chi_p_pu239 = np.append(chi_p_pu239[0], chi_p_pu239)\n", + "\n", + "# Create a step plot for the MGXS\n", + "plt.semilogx(energy_groups.group_edges, chi_d_u235 , drawstyle='steps', color='b', linestyle='--', linewidth=3)\n", + "plt.semilogx(energy_groups.group_edges, chi_d_pu239, drawstyle='steps', color='g', linestyle='--', linewidth=3)\n", + "plt.semilogx(energy_groups.group_edges, chi_p_u235 , drawstyle='steps', color='b', linestyle=':', linewidth=3)\n", + "plt.semilogx(energy_groups.group_edges, chi_p_pu239, drawstyle='steps', color='g', linestyle=':', linewidth=3)\n", + "\n", + "plt.title('Energy Spectrum for Fission Neutrons')\n", + "plt.xlabel('Energy (MeV)')\n", + "plt.ylabel('Fraction on emitted neutrons')\n", + "plt.legend(['U-235 delayed', 'Pu-239 delayed', 'U-235 prompt', 'Pu-239 prompt'],loc=2)\n", + "plt.xlim(0.001,20)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/openmc/mgxs/mdgxs.py b/openmc/mgxs/mdgxs.py index d36b29f7fc..4d65aaacc5 100644 --- a/openmc/mgxs/mdgxs.py +++ b/openmc/mgxs/mdgxs.py @@ -709,12 +709,113 @@ class MDGXS(MGXS): """ - df = super(MDGXS, self).get_pandas_dataframe(groups, nuclides, xs_type, - distribcell_paths) - + if not isinstance(groups, basestring): + cv.check_iterable_type('groups', groups, Integral) + if nuclides != 'all' and nuclides != 'sum': + cv.check_iterable_type('nuclides', nuclides, basestring) if not isinstance(delayed_groups, basestring): cv.check_iterable_type('delayed groups', delayed_groups, Integral) + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + + num_delayed_groups = 1 + if self.delayed_groups != None: + num_delayed_groups = self.delayed_groups.num_groups + + # Get a Pandas DataFrame from the derived xs tally + if self.by_nuclide and nuclides == 'sum': + + # Use tally summation to sum across all nuclides + query_nuclides = self.get_all_nuclides() + xs_tally = self.xs_tally.summation(nuclides=query_nuclides) + df = xs_tally.get_pandas_dataframe( + distribcell_paths=distribcell_paths) + + # Remove nuclide column since it is homogeneous and redundant + if self.domain_type == 'mesh': + df.drop('nuclide', axis=1, level=0, inplace=True) + else: + df.drop('nuclide', axis=1, inplace=True) + + # If the user requested a specific set of nuclides + elif self.by_nuclide and nuclides != 'all': + xs_tally = self.xs_tally.get_slice(nuclides=nuclides) + df = xs_tally.get_pandas_dataframe( + distribcell_paths=distribcell_paths) + + # If the user requested all nuclides, keep nuclide column in dataframe + else: + df = self.xs_tally.get_pandas_dataframe( + distribcell_paths=distribcell_paths) + + # Remove the score column since it is homogeneous and redundant + if self.domain_type == 'mesh': + df = df.drop('score', axis=1, level=0) + else: + df = df.drop('score', axis=1) + + # Override energy groups bounds with indices + all_groups = np.arange(self.num_groups, 0, -1, dtype=np.int) + all_groups = np.repeat(all_groups, self.num_nuclides) + if 'energy low [MeV]' in df and 'energyout low [MeV]' in df: + df.rename(columns={'energy low [MeV]': 'group in'}, + inplace=True) + in_groups = np.tile(all_groups, self.num_subdomains * num_delayed_groups) + in_groups = np.repeat(in_groups, df.shape[0] / in_groups.size) + df['group in'] = in_groups + del df['energy high [MeV]'] + + df.rename(columns={'energyout low [MeV]': 'group out'}, + inplace=True) + out_groups = np.repeat(all_groups, self.xs_tally.num_scores) + out_groups = np.tile(out_groups, df.shape[0] / out_groups.size * num_delayed_groups) + df['group out'] = out_groups + del df['energyout high [MeV]'] + columns = ['group in', 'group out'] + + elif 'energyout low [MeV]' in df: + df.rename(columns={'energyout low [MeV]': 'group out'}, + inplace=True) + in_groups = np.tile(all_groups, self.num_subdomains * num_delayed_groups) + df['group out'] = in_groups + del df['energyout high [MeV]'] + columns = ['group out'] + + elif 'energy low [MeV]' in df: + df.rename(columns={'energy low [MeV]': 'group in'}, inplace=True) + in_groups = np.tile(all_groups, self.num_subdomains * num_delayed_groups) + df['group in'] = in_groups + del df['energy high [MeV]'] + columns = ['group in'] + + # Select out those groups the user requested + if not isinstance(groups, basestring): + if 'group in' in df: + df = df[df['group in'].isin(groups)] + if 'group out' in df: + df = df[df['group out'].isin(groups)] + + # If user requested micro cross sections, divide out the atom densities + if xs_type == 'micro': + if self.by_nuclide: + densities = self.get_nuclide_densities(nuclides) + else: + densities = self.get_nuclide_densities('sum') + densities = np.repeat(densities, len(self.rxn_rate_tally.scores)) + tile_factor = df.shape[0] / len(densities) + df['mean'] /= np.tile(densities, tile_factor) + df['std. dev.'] /= np.tile(densities, tile_factor) + + # Sort the dataframe by domain type id (e.g., distribcell id) and + # energy groups such that data is from fast to thermal + if self.domain_type == 'mesh': + mesh_str = 'mesh {0}'.format(self.domain.id) + df.sort_values(by=[(mesh_str, 'x'), (mesh_str, 'y'), \ + (mesh_str, 'z')] + columns, inplace=True) + else: + df.sort_values(by=[self.domain_type] + columns, inplace=True) + return df + # Select out those delayed groups the user requested if not isinstance(delayed_groups, basestring): if 'delayedgroup' in df: diff --git a/openmc/tallies.py b/openmc/tallies.py index c68b0faacb..2073bbd282 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -2197,8 +2197,8 @@ class Tally(object): """ - cv.check_type('filter1', filter1, (Filter, CrossFilter, AggregateFilter)) - cv.check_type('filter2', filter2, (Filter, CrossFilter, AggregateFilter)) + cv.check_type('filter1', filter1, _FILTER_CLASSES) + cv.check_type('filter2', filter2, _FILTER_CLASSES) # Check that the filters exist in the tally and are not the same if filter1 == filter2: @@ -2280,8 +2280,8 @@ class Tally(object): 'since it does not contain any results.'.format(self.id) raise ValueError(msg) - cv.check_type('nuclide1', nuclide1, Nuclide) - cv.check_type('nuclide2', nuclide2, Nuclide) + cv.check_type('nuclide1', nuclide1, _NUCLIDE_CLASSES) + cv.check_type('nuclide2', nuclide2, _NUCLIDE_CLASSES) # Check that the nuclides exist in the tally and are not the same if nuclide1 == nuclide2: @@ -3318,7 +3318,7 @@ class Tally(object): """ - cv.check_type('new_filter', new_filter, Filter) + cv.check_type('new_filter', new_filter, _FILTER_CLASSES) if new_filter in self.filters: msg = 'Unable to diagonalize Tally ID="{0}" which already ' \ From 6ef6740ebc01f97c4fdc7772ba1b6fe29789e07b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 25 Jul 2016 11:49:25 -0500 Subject: [PATCH 011/168] Implement stochastic volume calculation on Fortran side --- docs/source/io_formats/index.rst | 1 + docs/source/io_formats/nuclear_data.rst | 2 +- docs/source/io_formats/volume.rst | 22 ++ docs/source/usersguide/input.rst | 29 ++ src/constants.F90 | 3 +- src/global.F90 | 3 + src/hdf5_interface.F90 | 76 +++++ src/input_xml.F90 | 10 + src/random_lcg.F90 | 1 - src/simulation.F90 | 4 + src/volume_calc.F90 | 389 ++++++++++++++++++++++++ src/volume_header.F90 | 42 +++ 12 files changed, 579 insertions(+), 3 deletions(-) create mode 100644 docs/source/io_formats/volume.rst create mode 100644 src/volume_calc.F90 create mode 100644 src/volume_header.F90 diff --git a/docs/source/io_formats/index.rst b/docs/source/io_formats/index.rst index acab7e8930..1da8872c66 100644 --- a/docs/source/io_formats/index.rst +++ b/docs/source/io_formats/index.rst @@ -30,3 +30,4 @@ Output Files particle_restart track voxel + volume diff --git a/docs/source/io_formats/nuclear_data.rst b/docs/source/io_formats/nuclear_data.rst index ba6a54eb1e..9d7ff0eb1e 100644 --- a/docs/source/io_formats/nuclear_data.rst +++ b/docs/source/io_formats/nuclear_data.rst @@ -1,4 +1,4 @@ -.. _usersguide_nuclear_data: +.. _io_nuclear_data: ======================== Nuclear Data File Format diff --git a/docs/source/io_formats/volume.rst b/docs/source/io_formats/volume.rst new file mode 100644 index 0000000000..10b7a3b732 --- /dev/null +++ b/docs/source/io_formats/volume.rst @@ -0,0 +1,22 @@ +.. _io_volume: + +================== +Volume File Format +================== + +**/** + +:Attributes: - **samples** (*int*) -- Number of samples + - **lower_left** (*double[3]*) -- Lower-left coordinates of + bounding box + - **upper_right** (*double[3]*) -- Upper-right coordinates of + bounding box + +**/cell_/** + +:Datasets: - **volume** (*double[2]*) -- Calculated volume and its uncertainty + in cubic centimeters + - **nuclides** (*char[][]*) -- Names of nuclides identified in the + cell + - **atoms** (*double[][2]*) -- Total number of atoms of each nuclide + and its uncertainty diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index e530097ded..530c45d2fe 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -836,6 +836,35 @@ displayed. This element takes the following attributes: *Default*: 5 +```` Element +------------------------- + +The ```` element indicates that a stochastic volume calculation +should be run at the beginning of the simulation. This element has the following +sub-elements/attributes: + + :cells: + The unique IDs of cells for which the volume should be estimated. + + *Default*: None + + :samples: + The number of samples used to estimate volumes. + + *Default*: None + + :lower_left: + The lower-left Cartesian coordinates of a bounding box that is used to + sample points within. + + *Default*: None + + :upper_right: + The upper-right Cartesian coordinates of a bounding box that is used to + sample points within. + + *Default*: None + -------------------------------------- Geometry Specification -- geometry.xml -------------------------------------- diff --git a/src/constants.F90 b/src/constants.F90 index a22c9ac050..076e1f0d0b 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -380,11 +380,12 @@ module constants ! ============================================================================ ! RANDOM NUMBER STREAM CONSTANTS - integer, parameter :: N_STREAMS = 4 + integer, parameter :: N_STREAMS = 5 integer, parameter :: STREAM_TRACKING = 1 integer, parameter :: STREAM_TALLIES = 2 integer, parameter :: STREAM_SOURCE = 3 integer, parameter :: STREAM_URR_PTABLE = 4 + integer, parameter :: STREAM_VOLUME = 5 ! ============================================================================ ! MISCELLANEOUS CONSTANTS diff --git a/src/global.F90 b/src/global.F90 index 1b1e5632a4..ba5947f0e7 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -17,6 +17,7 @@ module global use tally_header, only: TallyObject, TallyMap, TallyResult use trigger_header, only: KTrigger use timer_header, only: Timer + use volume_header, only: VolumeCalculation #ifdef MPIF08 use mpi_f08 @@ -35,6 +36,8 @@ module global type(Material), allocatable, target :: materials(:) type(ObjectPlot), allocatable, target :: plots(:) + type(VolumeCalculation), allocatable :: volume_calcs(:) + ! Size of main arrays integer :: n_cells ! # of cells integer :: n_universes ! # of universes diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 5a1e2a2fff..6d1c87d7f5 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -75,8 +75,15 @@ module hdf5_interface module procedure read_attribute_string end interface read_attribute + interface write_attribute + module procedure write_attribute_double + module procedure write_attribute_double_1D + module procedure write_attribute_integer + end interface write_attribute + public :: write_dataset public :: read_dataset + public :: write_attribute public :: read_attribute public :: file_create public :: file_open @@ -2059,6 +2066,25 @@ contains call h5aclose_f(attr_id, hdf5_err) end subroutine read_attribute_double + subroutine write_attribute_double(obj_id, name, buffer) + integer(HID_T), intent(in) :: obj_id + character(*), intent(in) :: name + real(8), intent(in), target :: buffer + + integer :: hdf5_err + integer(HID_T) :: dspace_id + integer(HID_T) :: attr_id + type(C_PTR) :: f_ptr + + call h5screate_f(H5S_SCALAR_F, dspace_id, hdf5_err) + call h5acreate_f(obj_id, trim(name), H5T_NATIVE_DOUBLE, dspace_id, & + attr_id, hdf5_err) + f_ptr = c_loc(buffer) + call h5awrite_f(attr_id, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) + call h5aclose_f(attr_id, hdf5_err) + call h5sclose_f(dspace_id, hdf5_err) + end subroutine write_attribute_double + subroutine read_attribute_double_1D(buffer, obj_id, name) real(8), target, allocatable, intent(inout) :: buffer(:) integer(HID_T), intent(in) :: obj_id @@ -2097,6 +2123,37 @@ contains call h5aread_f(attr_id, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) end subroutine read_attribute_double_1D_explicit + subroutine write_attribute_double_1D(obj_id, name, buffer) + integer(HID_T), intent(in) :: obj_id + character(*), intent(in) :: name + real(8), target, intent(in) :: buffer(:) + + integer(HSIZE_T) :: dims(1) + + dims(:) = shape(buffer) + call write_attribute_double_1D_explicit(obj_id, dims, name, buffer) + end subroutine write_attribute_double_1D + + subroutine write_attribute_double_1D_explicit(obj_id, dims, name, buffer) + integer(HID_T), intent(in) :: obj_id + integer(HSIZE_T), intent(in) :: dims(1) + character(*), intent(in) :: name + real(8), target, intent(in) :: buffer(dims(1)) + + integer :: hdf5_err + integer(HID_T) :: dspace_id + integer(HID_T) :: attr_id + type(C_PTR) :: f_ptr + + call h5screate_simple_f(1, dims, dspace_id, hdf5_err) + call h5acreate_f(obj_id, trim(name), H5T_NATIVE_DOUBLE, dspace_id, & + attr_id, hdf5_err) + f_ptr = c_loc(buffer) + call h5awrite_f(attr_id, H5T_NATIVE_DOUBLE, f_ptr, hdf5_err) + call h5aclose_f(attr_id, hdf5_err) + call h5sclose_f(dspace_id, hdf5_err) + end subroutine write_attribute_double_1D_explicit + subroutine read_attribute_double_2D(buffer, obj_id, name) real(8), target, allocatable, intent(inout) :: buffer(:,:) integer(HID_T), intent(in) :: obj_id @@ -2150,6 +2207,25 @@ contains call h5aclose_f(attr_id, hdf5_err) end subroutine read_attribute_integer + subroutine write_attribute_integer(obj_id, name, buffer) + integer(HID_T), intent(in) :: obj_id + character(*), intent(in) :: name + integer, intent(in), target :: buffer + + integer :: hdf5_err + integer(HID_T) :: dspace_id + integer(HID_T) :: attr_id + type(C_PTR) :: f_ptr + + call h5screate_f(H5S_SCALAR_F, dspace_id, hdf5_err) + call h5acreate_f(obj_id, trim(name), H5T_NATIVE_INTEGER, dspace_id, & + attr_id, hdf5_err) + f_ptr = c_loc(buffer) + call h5awrite_f(attr_id, H5T_NATIVE_INTEGER, f_ptr, hdf5_err) + call h5aclose_f(attr_id, hdf5_err) + call h5sclose_f(dspace_id, hdf5_err) + end subroutine write_attribute_integer + subroutine read_attribute_integer_1D(buffer, obj_id, name) integer, target, allocatable, intent(inout) :: buffer(:) integer(HID_T), intent(in) :: obj_id diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 3e5a687124..0c2eca33a5 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -87,8 +87,10 @@ contains type(Node), pointer :: node_scatterer => null() type(Node), pointer :: node_trigger => null() type(Node), pointer :: node_keff_trigger => null() + type(Node), pointer :: node_vol => null() type(NodeList), pointer :: node_scat_list => null() type(NodeList), pointer :: node_source_list => null() + type(NodeList), pointer :: node_vol_list => null() ! Check if settings.xml exists filename = trim(path_input) // "settings.xml" @@ -1119,6 +1121,14 @@ contains end select end if + call get_node_list(doc, "volume_calc", node_vol_list) + n = get_list_size(node_vol_list) + allocate(volume_calcs(n)) + do i = 1, n + call get_list_item(node_vol_list, i, node_vol) + call volume_calcs(i) % from_xml(node_vol) + end do + ! Close settings XML file call close_xmldoc(doc) diff --git a/src/random_lcg.F90 b/src/random_lcg.F90 index 08f1034ab7..287bbba6d9 100644 --- a/src/random_lcg.F90 +++ b/src/random_lcg.F90 @@ -29,7 +29,6 @@ module random_lcg public :: set_particle_seed public :: advance_prn_seed public :: prn_set_stream - public :: STREAM_TRACKING, STREAM_TALLIES contains diff --git a/src/simulation.F90 b/src/simulation.F90 index 3321dc70fa..f59ce371cc 100644 --- a/src/simulation.F90 +++ b/src/simulation.F90 @@ -24,6 +24,7 @@ module simulation reset_result use trigger, only: check_triggers use tracking, only: transport + use volume_calc, only: run_volume_calculations implicit none private @@ -42,6 +43,9 @@ contains type(Particle) :: p integer(8) :: i_work + ! Volume calculations + if (size(volume_calcs) > 0) call run_volume_calculations() + if (.not. restart_run) call initialize_source() ! Display header diff --git a/src/volume_calc.F90 b/src/volume_calc.F90 new file mode 100644 index 0000000000..cb36f0b7f3 --- /dev/null +++ b/src/volume_calc.F90 @@ -0,0 +1,389 @@ +module volume_calc + + use hdf5, only: HID_T +#ifdef _OPENMP + use omp_lib +#endif + + use constants + use geometry, only: find_cell + use global + use hdf5_interface, only: file_create, file_close, write_attribute, & + create_group, close_group, write_dataset + use output, only: write_message, header + use message_passing + use particle_header, only: Particle + use random_lcg, only: prn, prn_set_stream, set_particle_seed + use stl_vector, only: VectorInt, VectorReal + use timer_header, only: Timer + use volume_header + + implicit none + private + + public :: run_volume_calculations + +contains + +!=============================================================================== +! RUN_VOLUME_CALCULATIONS runs each of the stochastic volume calculations that +! the user has specified and writes results to HDF5 files +!=============================================================================== + + subroutine run_volume_calculations() + integer :: i, j + integer :: n + real(8), allocatable :: volume(:,:) ! volume mean/stdev in each cell + character(MAX_FILE_LEN) :: filename ! filename for HDF5 file + type(Timer) :: time_volume ! timer for volume calculation + type(VectorInt), allocatable :: nuclide_vec(:) ! indices in nuclides array + type(VectorReal), allocatable :: atoms_vec(:) ! total # of atoms of each nuclide + type(VectorReal), allocatable :: uncertainty_vec(:) ! uncertainty of total # of atoms + + if (master) then + call header("STOCHASTIC VOLUME CALCULATION", level=1) + call time_volume % start() + end if + + do i = 1, size(volume_calcs) + n = size(volume_calcs(i) % cell_id) + allocate(nuclide_vec(n)) + allocate(atoms_vec(n), uncertainty_vec(n)) + allocate(volume(2,n)) + + if (master) then + call write_message("Running volume calculation " // trim(to_str(i)) & + // "...") + end if + + call get_volume(volume_calcs(i), volume, nuclide_vec, atoms_vec, & + uncertainty_vec) + + if (master) then + ! Display cell volumes + do j = 1, size(volume_calcs(i) % cell_id) + call write_message(" Cell " // trim(to_str(volume_calcs(i) % & + cell_id(j))) // ": " // trim(to_str(volume(1,j))) // " +/- " // & + trim(to_str(volume(2,j))) // " cm^3") + end do + call write_message("") + + filename = trim(path_output) // 'volume_' // trim(to_str(i)) // '.h5' + call write_volume(volume_calcs(i), filename, volume, nuclide_vec, & + atoms_vec, uncertainty_vec) + end if + + deallocate(nuclide_vec, atoms_vec, uncertainty_vec, volume) + end do + + ! Show elapsed time + if (master) then + call time_volume % stop() + call write_message("Elapsed time: " // trim(to_str(time_volume % & + get_value())) // " s") + end if + end subroutine run_volume_calculations + +!=============================================================================== +! GET_VOLUME stochastically determines the volume of a set of cells along with +! the average number densities of nuclides within the cell +!=============================================================================== + + subroutine get_volume(this, volume, nuclide_vec, atoms_vec, uncertainty_vec) + type(VolumeCalculation), intent(in) :: this + real(8), intent(out) :: volume(:,:) ! volume mean/stdev in each cell + type(VectorInt), intent(out) :: nuclide_vec(:) ! indices in nuclides array + type(VectorReal), intent(out) :: atoms_vec(:) ! total # of atoms of each nuclide + type(VectorReal), intent(out) :: uncertainty_vec(:) ! uncertainty of total # of atoms + + ! Variables that are private to each thread + integer(8) :: i + integer :: j, k + integer :: i_cell ! index in cell_id array + integer :: i_material ! index in materials array + integer :: level ! local coordinate level + logical :: found_cell + type(VectorInt) :: indices(size(this % cell_id)) ! List of material indices + type(VectorInt) :: hits(size(this % cell_id)) ! Number of hits for each material + type(Particle) :: p + + ! Shared variables + integer :: i_start, i_end ! Starting/ending sample for each process + type(VectorInt) :: master_indices(size(this % cell_id)) + type(VectorInt) :: master_hits(size(this % cell_id)) + + ! Variables used outside of parallel region + integer :: i_nuclide ! index in nuclides array + integer :: total_hits ! total hits for a single cell (summed over materials) + integer :: min_samples ! minimum number of samples per process + integer :: remainder ! leftover samples from uneven divide +#ifdef MPI + integer :: m ! index over materials + integer :: n ! number of materials + integer, allocatable :: data(:) ! array used to send number of hits +#endif + real(8) :: f ! fraction of hits + real(8) :: var_f ! variance of fraction of hits + real(8) :: volume_sample ! total volume of sampled region + real(8) :: atoms(2, size(nuclides)) + + ! Divide work over MPI processes + min_samples = this % samples / n_procs + remainder = mod(this % samples, n_procs) + if (rank < remainder) then + i_start = (min_samples + 1)*rank + i_end = i_start + min_samples + else + i_start = (min_samples + 1)*remainder + (rank - remainder)*min_samples + i_end = i_start + min_samples - 1 + end if + + call p % initialize() + +!$omp parallel private(i, j, k, i_cell, i_material, level, found_cell) & +!$omp& firstprivate(p, indices, hits) + + call prn_set_stream(STREAM_VOLUME) + + ! ========================================================================== + ! SAMPLES LOCATIONS AND COUNT HITS + +!$omp do + SAMPLE_LOOP: do i = i_start, i_end + call set_particle_seed(i) + + p % n_coord = 1 + p % coord(1) % xyz(1) = this % lower_left(1) + prn()*(& + this % upper_right(1) - this % lower_left(1)) + p % coord(1) % xyz(2) = this % lower_left(2) + prn()*(& + this % upper_right(2) - this % lower_left(2)) + p % coord(1) % xyz(3) = this % lower_left(3) + prn()*(& + this % upper_right(3) - this % lower_left(3)) + p % coord(1) % uvw(:) = [HALF, HALF, HALF] + + ! If this location is not in the geometry at all, move on to the next + ! block + call find_cell(p, found_cell) + if (.not. found_cell) cycle + + ! Determine if point is within desired cell + LEVEL_LOOP: do level = 1, p % n_coord + CELL_CHECK_LOOP: do i_cell = 1, size(this % cell_id) + if (cells(p % coord(level) % cell) % id == this % cell_id(i_cell)) then + + ! Determine what material this is + i_material = p % material + + ! Check if we've already had a hit in this material and if so, + ! simply add one + do j = 1, indices(i_cell) % size() + if (indices(i_cell) % data(j) == i_material) then + hits(i_cell) % data(j) = hits(i_cell) % data(j) + 1 + cycle CELL_CHECK_LOOP + end if + end do + + ! If we make it here, that means we haven't yet had a hit in this + ! material. Add an entry to both the indices list and the hits list + call indices(i_cell) % push_back(i_material) + call hits(i_cell) % push_back(1) + end if + end do CELL_CHECK_LOOP + end do LEVEL_LOOP + end do SAMPLE_LOOP + !$omp end do + + ! ========================================================================== + ! REDUCE HITS ONTO MASTER THREAD + + ! At this point, each thread has its own pair of index/hits lists and we now + ! need to reduce them. OpenMP is not nearly smart enough to do this on its + ! own, so we have to manually reduce them. + +#ifdef _OPENMP +!$omp do ordered schedule(static) + THREAD_LOOP: do i = 1, omp_get_num_threads() +!$omp ordered + do i_cell = 1, size(this % cell_id) + INDEX_LOOP: do j = 1, indices(i_cell) % size() + ! Check if this material has been added to the master list and if so, + ! accumulate the number of hits + do k = 1, master_indices(i_cell) % size() + if (indices(i_cell) % data(j) == master_indices(i_cell) % data(k)) then + master_hits(i_cell) % data(k) = & + master_hits(i_cell) % data(k) + hits(i_cell) % data(j) + cycle INDEX_LOOP + end if + end do + + ! If we made it here, this means the material hasn't yet been added to + ! the master list, so add an entry to both the master indices and master + ! hits lists + call master_indices(i_cell) % push_back(indices(i_cell) % data(j)) + call master_hits(i_cell) % push_back(hits(i_cell) % data(j)) + end do INDEX_LOOP + end do +!$omp end ordered + end do THREAD_LOOP +!$omp end do +#else + master_indices = indices + master_hits = hits +#endif + + call prn_set_stream(STREAM_TRACKING) +!$omp end parallel + + ! ========================================================================== + ! REDUCE HITS ONTO MASTER PROCESS + + volume_sample = product(this % upper_right - this % lower_left) + + do i_cell = 1, size(this % cell_id) + atoms(:, :) = ZERO + total_hits = 0 + + if (master) then +#ifdef MPI + do j = 1, n_procs - 1 + call MPI_RECV(n, 1, MPI_INTEGER, j, 0, MPI_COMM_WORLD, & + MPI_STATUS_IGNORE, mpi_err) + + allocate(data(2*n)) + call MPI_RECV(data, 2*n, MPI_INTEGER, j, 1, MPI_COMM_WORLD, & + MPI_STATUS_IGNORE, mpi_err) + do k = 0, n - 1 + do m = 1, master_indices(i_cell) % size() + if (data(2*k + 1) == master_indices(i_cell) % data(m)) then + master_hits(i_cell) % data(m) = master_hits(i_cell) % data(m) + & + data(2*k + 2) + end if + end do + end do + deallocate(data) + end do +#endif + + do j = 1, master_indices(i_cell) % size() + total_hits = total_hits + master_hits(i_cell) % data(j) + f = real(master_hits(i_cell) % data(j), 8) / this % samples + var_f = f*(ONE - f) / this % samples + + i_material = master_indices(i_cell) % data(j) + if (i_material == MATERIAL_VOID) cycle + + associate (mat => materials(i_material)) + do k = 1, size(mat % nuclide) + ! Accumulate nuclide density + i_nuclide = mat % nuclide(k) + atoms(1, i_nuclide) = atoms(1, i_nuclide) + & + mat % atom_density(k) * f + atoms(2, i_nuclide) = atoms(2, i_nuclide) + & + mat % atom_density(k)**2 * var_f + end do + end associate + end do + + ! Determine volume + volume(1, i_cell) = real(total_hits, 8) / this % samples * volume_sample + volume(2, i_cell) = sqrt(volume(1, i_cell) * (volume_sample - & + volume(1, i_cell)) / this % samples) + + ! Determine total number of atoms. At this point, we have values in + ! atoms/b-cm. To get to atoms we multiple by 10^24 V. + do j = 1, size(atoms, 2) + atoms(1, j) = 1.0e24_8 * volume_sample * atoms(1, j) + atoms(2, j) = 1.0e24_8 * volume_sample * sqrt(atoms(2, j)) + end do + + ! Convert full arrays to vectors + do j = 1, size(nuclides) + if (atoms(1, j) > ZERO) then + call nuclide_vec(i_cell) % push_back(j) + call atoms_vec(i_cell) % push_back(atoms(1, j)) + call uncertainty_vec(i_cell) % push_back(atoms(2, j)) + end if + end do + + else +#ifdef MPI + n = master_indices(i_cell) % size() + allocate(data(2*n)) + do k = 0, n - 1 + data(2*k + 1) = master_indices(i_cell) % data(k + 1) + data(2*k + 2) = master_hits(i_cell) % data(k + 1) + end do + + call MPI_SEND(n, 1, MPI_INTEGER, 0, 0, MPI_COMM_WORLD, mpi_err) + call MPI_SEND(data, 2*n, MPI_INTEGER, 0, 1, MPI_COMM_WORLD, mpi_err) + deallocate(data) +#endif + end if + end do + + end subroutine get_volume + +!=============================================================================== +! WRITE_VOLUME writes the results of a single stochastic volume calculation to +! an HDF5 file +!=============================================================================== + + subroutine write_volume(this, filename, volume, nuclide_vec, atoms_vec, & + uncertainty_vec) + type(VolumeCalculation), intent(in) :: this + character(*), intent(in) :: filename ! filename for HDF5 file + real(8), intent(in) :: volume(:,:) ! volume mean/stdev in each cell + type(VectorInt), intent(in) :: nuclide_vec(:) ! indices in nuclides array + type(VectorReal), intent(in) :: atoms_vec(:) ! total # of atoms of each nuclide + type(VectorReal), intent(in) :: uncertainty_vec(:) ! uncertainty of total # of atoms + + integer :: i, j + integer :: n + integer(HID_T) :: file_id + integer(HID_T) :: group_id + real(8), allocatable :: atom_data(:,:) ! mean/stdev of total # of atoms for + ! each nuclide + character(MAX_WORD_LEN), allocatable :: nucnames(:) ! names of nuclides + + ! Create HDF5 file + file_id = file_create(filename) + + ! Write basic metadata + call write_attribute(file_id, "samples", this % samples) + call write_attribute(file_id, "lower_left", this % lower_left) + call write_attribute(file_id, "upper_right", this % upper_right) + + do i = 1, size(this % cell_id) + group_id = create_group(file_id, "cell_" // trim(to_str(& + this % cell_id(i)))) + + ! Write volume for cell + call write_dataset(group_id, "volume", volume(:, i)) + + ! Create array of nuclide names from the vector + n = nuclide_vec(i) % size() + if (n > 0) then + allocate(nucnames(n)) + do j = 1, n + nucnames(j) = nuclides(nuclide_vec(i) % data(j)) % name + end do + + ! Create array of total # of atoms with uncertainty for each nuclide + allocate(atom_data(2, n)) + atom_data(1, :) = atoms_vec(i) % data(1:n) + atom_data(2, :) = uncertainty_vec(i) % data(1:n) + + ! Write results + call write_dataset(group_id, "nuclides", nucnames) + call write_dataset(group_id, "atoms", atom_data) + + deallocate(nucnames) + deallocate(atom_data) + end if + + call close_group(group_id) + end do + call file_close(file_id) + end subroutine write_volume + +end module volume_calc diff --git a/src/volume_header.F90 b/src/volume_header.F90 new file mode 100644 index 0000000000..3a34f1231a --- /dev/null +++ b/src/volume_header.F90 @@ -0,0 +1,42 @@ +module volume_header + + use error, only: fatal_error + use xml_interface + + implicit none + + type VolumeCalculation + integer, allocatable :: cell_id(:) + real(8) :: lower_left(3) + real(8) :: upper_right(3) + integer :: samples + contains + procedure :: from_xml => volume_from_xml + end type VolumeCalculation + +contains + + subroutine volume_from_xml(this, node_vol) + class(VolumeCalculation), intent(out) :: this + type(Node), pointer :: node_vol + + integer :: num_cells + + ! Read cell IDs + if (check_for_node(node_vol, "cells")) then + num_cells = get_arraysize_integer(node_vol, "cells") + else + call fatal_error("Must specify at least one cell for a volume calculation") + end if + allocate(this % cell_id(num_cells)) + call get_node_array(node_vol, "cells", this % cell_id) + + ! Read lower-left and upper-right bounding coordinates + call get_node_array(node_vol, "lower_left", this % lower_left) + call get_node_array(node_vol, "upper_right", this % upper_right) + + ! Read number of samples + call get_node_value(node_vol, "samples", this % samples) + end subroutine volume_from_xml + +end module volume_header From cac6ac6f665a3c3d2d72bb1bd87c813064a6b87a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 28 Jul 2016 12:35:15 -0500 Subject: [PATCH 012/168] Add VolumeCalculation object. Update settings.xml RELAX NG schema --- openmc/__init__.py | 5 +- openmc/settings.py | 204 +++++++++++++++++++++------------------ openmc/volume.py | 204 +++++++++++++++++++++++++++++++++++++++ src/relaxng/settings.rnc | 11 +++ src/relaxng/settings.rng | 62 ++++++++++++ 5 files changed, 392 insertions(+), 94 deletions(-) create mode 100644 openmc/volume.py diff --git a/openmc/__init__.py b/openmc/__init__.py index 557e13039f..026ccce114 100644 --- a/openmc/__init__.py +++ b/openmc/__init__.py @@ -6,6 +6,9 @@ from openmc.nuclide import * from openmc.macroscopic import * from openmc.material import * from openmc.plots import * +from openmc.region import * +from openmc.volume import * +from openmc.source import * from openmc.settings import * from openmc.surface import * from openmc.universe import * @@ -18,8 +21,6 @@ from openmc.cmfd import * from openmc.executor import * from openmc.statepoint import * from openmc.summary import * -from openmc.region import * -from openmc.source import * from openmc.particle_restart import * try: diff --git a/openmc/settings.py b/openmc/settings.py index b9a93bd114..918f97c7da 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -1,4 +1,4 @@ -from collections import Iterable +from collections import Iterable, MutableSequence from numbers import Real, Integral import warnings from xml.etree import ElementTree as ET @@ -7,10 +7,8 @@ import sys import numpy as np from openmc.clean_xml import clean_xml_indentation -from openmc.checkvalue import (check_type, check_length, check_value, - check_greater_than, check_less_than) -from openmc import Nuclide -from openmc.source import Source +import openmc.checkvalue as cv +from openmc import Nuclide, VolumeCalculation, Source if sys.version_info[0] >= 3: basestring = str @@ -137,6 +135,8 @@ class Settings(object): resonance cross sections. resonance_scattering : ResonanceScattering or iterable of ResonanceScattering The elastic scattering model to use for resonant isotopes + volume_calculations : VolumeCalculation or iterable of VolumeCalculation + Stochastic volume calculation specifications """ @@ -220,6 +220,8 @@ class Settings(object): self._multipole_active = None self._resonance_scattering = None + self._volume_calculations = cv.CheckedList(VolumeCalculation, + 'volume calculations') @property def run_mode(self): @@ -421,6 +423,10 @@ class Settings(object): def resonance_scattering(self): return self._resonance_scattering + @property + def volume_calculations(self): + return self._volume_calculations + @run_mode.setter def run_mode(self, run_mode): if run_mode not in ['eigenvalue', 'fixed source']: @@ -431,26 +437,26 @@ class Settings(object): @batches.setter def batches(self, batches): - check_type('batches', batches, Integral) - check_greater_than('batches', batches, 0) + cv.check_type('batches', batches, Integral) + cv.check_greater_than('batches', batches, 0) self._batches = batches @generations_per_batch.setter def generations_per_batch(self, generations_per_batch): - check_type('generations per patch', generations_per_batch, Integral) - check_greater_than('generations per batch', generations_per_batch, 0) + cv.check_type('generations per patch', generations_per_batch, Integral) + cv.check_greater_than('generations per batch', generations_per_batch, 0) self._generations_per_batch = generations_per_batch @inactive.setter def inactive(self, inactive): - check_type('inactive batches', inactive, Integral) - check_greater_than('inactive batches', inactive, 0, True) + cv.check_type('inactive batches', inactive, Integral) + cv.check_greater_than('inactive batches', inactive, 0, True) self._inactive = inactive @particles.setter def particles(self, particles): - check_type('particles', particles, Integral) - check_greater_than('particles', particles, 0) + cv.check_type('particles', particles, Integral) + cv.check_greater_than('particles', particles, 0) self._particles = particles @keff_trigger.setter @@ -484,14 +490,14 @@ class Settings(object): @energy_mode.setter def energy_mode(self, energy_mode): - check_value('energy mode', energy_mode, + cv.check_value('energy mode', energy_mode, ['continuous-energy', 'multi-group']) self._energy_mode = energy_mode @max_order.setter def max_order(self, max_order): - check_type('maximum scattering order', max_order, Integral) - check_greater_than('maximum scattering order', max_order, 0, True) + cv.check_type('maximum scattering order', max_order, Integral) + cv.check_greater_than('maximum scattering order', max_order, 0, True) self._max_order = max_order @source.setter @@ -499,7 +505,7 @@ class Settings(object): if isinstance(source, Source): self._source = [source,] else: - check_type('source distribution', source, Iterable, Source) + cv.check_type('source distribution', source, Iterable, Source) self._source = source @output.setter @@ -525,197 +531,197 @@ class Settings(object): @output_path.setter def output_path(self, output_path): - check_type('output path', output_path, basestring) + cv.check_type('output path', output_path, basestring) self._output_path = output_path @verbosity.setter def verbosity(self, verbosity): - check_type('verbosity', verbosity, Integral) - check_greater_than('verbosity', verbosity, 1, True) - check_less_than('verbosity', verbosity, 10, True) + cv.check_type('verbosity', verbosity, Integral) + cv.check_greater_than('verbosity', verbosity, 1, True) + cv.check_less_than('verbosity', verbosity, 10, True) self._verbosity = verbosity @statepoint_batches.setter def statepoint_batches(self, batches): - check_type('statepoint batches', batches, Iterable, Integral) + cv.check_type('statepoint batches', batches, Iterable, Integral) for batch in batches: - check_greater_than('statepoint batch', batch, 0) + cv.check_greater_than('statepoint batch', batch, 0) self._statepoint_batches = batches @statepoint_interval.setter def statepoint_interval(self, interval): - check_type('statepoint interval', interval, Integral) + cv.check_type('statepoint interval', interval, Integral) self._statepoint_interval = interval @sourcepoint_batches.setter def sourcepoint_batches(self, batches): - check_type('sourcepoint batches', batches, Iterable, Integral) + cv.check_type('sourcepoint batches', batches, Iterable, Integral) for batch in batches: - check_greater_than('sourcepoint batch', batch, 0) + cv.check_greater_than('sourcepoint batch', batch, 0) self._sourcepoint_batches = batches @sourcepoint_interval.setter def sourcepoint_interval(self, interval): - check_type('sourcepoint interval', interval, Integral) + cv.check_type('sourcepoint interval', interval, Integral) self._sourcepoint_interval = interval @sourcepoint_separate.setter def sourcepoint_separate(self, source_separate): - check_type('sourcepoint separate', source_separate, bool) + cv.check_type('sourcepoint separate', source_separate, bool) self._sourcepoint_separate = source_separate @sourcepoint_write.setter def sourcepoint_write(self, source_write): - check_type('sourcepoint write', source_write, bool) + cv.check_type('sourcepoint write', source_write, bool) self._sourcepoint_write = source_write @sourcepoint_overwrite.setter def sourcepoint_overwrite(self, source_overwrite): - check_type('sourcepoint overwrite', source_overwrite, bool) + cv.check_type('sourcepoint overwrite', source_overwrite, bool) self._sourcepoint_overwrite = source_overwrite @confidence_intervals.setter def confidence_intervals(self, confidence_intervals): - check_type('confidence interval', confidence_intervals, bool) + cv.check_type('confidence interval', confidence_intervals, bool) self._confidence_intervals = confidence_intervals @cross_sections.setter def cross_sections(self, cross_sections): - check_type('cross sections', cross_sections, basestring) + cv.check_type('cross sections', cross_sections, basestring) self._cross_sections = cross_sections @multipole_library.setter def multipole_library(self, multipole_library): - check_type('cross sections', multipole_library, basestring) + cv.check_type('cross sections', multipole_library, basestring) self._multipole_library = multipole_library @energy_grid.setter def energy_grid(self, energy_grid): - check_value('energy grid', energy_grid, + cv.check_value('energy grid', energy_grid, ['nuclide', 'logarithm', 'material-union']) self._energy_grid = energy_grid @ptables.setter def ptables(self, ptables): - check_type('probability tables', ptables, bool) + cv.check_type('probability tables', ptables, bool) self._ptables = ptables @run_cmfd.setter def run_cmfd(self, run_cmfd): - check_type('run_cmfd', run_cmfd, bool) + cv.check_type('run_cmfd', run_cmfd, bool) self._run_cmfd = run_cmfd @seed.setter def seed(self, seed): - check_type('random number generator seed', seed, Integral) - check_greater_than('random number generator seed', seed, 0) + cv.check_type('random number generator seed', seed, Integral) + cv.check_greater_than('random number generator seed', seed, 0) self._seed = seed @survival_biasing.setter def survival_biasing(self, survival_biasing): - check_type('survival biasing', survival_biasing, bool) + cv.check_type('survival biasing', survival_biasing, bool) self._survival_biasing = survival_biasing @weight.setter def weight(self, weight): - check_type('weight cutoff', weight, Real) - check_greater_than('weight cutoff', weight, 0.0) + cv.check_type('weight cutoff', weight, Real) + cv.check_greater_than('weight cutoff', weight, 0.0) self._weight = weight @weight_avg.setter def weight_avg(self, weight_avg): - check_type('average survival weight', weight_avg, Real) - check_greater_than('average survival weight', weight_avg, 0.0) + cv.check_type('average survival weight', weight_avg, Real) + cv.check_greater_than('average survival weight', weight_avg, 0.0) self._weight_avg = weight_avg @entropy_dimension.setter def entropy_dimension(self, dimension): - check_type('entropy mesh dimension', dimension, Iterable, Integral) - check_length('entropy mesh dimension', dimension, 3) + cv.check_type('entropy mesh dimension', dimension, Iterable, Integral) + cv.check_length('entropy mesh dimension', dimension, 3) self._entropy_dimension = dimension @entropy_lower_left.setter def entropy_lower_left(self, lower_left): - check_type('entropy mesh lower left corner', lower_left, + cv.check_type('entropy mesh lower left corner', lower_left, Iterable, Real) - check_length('entropy mesh lower left corner', lower_left, 3) + cv.check_length('entropy mesh lower left corner', lower_left, 3) self._entropy_lower_left = lower_left @entropy_upper_right.setter def entropy_upper_right(self, upper_right): - check_type('entropy mesh upper right corner', upper_right, + cv.check_type('entropy mesh upper right corner', upper_right, Iterable, Real) - check_length('entropy mesh upper right corner', upper_right, 3) + cv.check_length('entropy mesh upper right corner', upper_right, 3) self._entropy_upper_right = upper_right @trigger_active.setter def trigger_active(self, trigger_active): - check_type('trigger active', trigger_active, bool) + cv.check_type('trigger active', trigger_active, bool) self._trigger_active = trigger_active @trigger_max_batches.setter def trigger_max_batches(self, trigger_max_batches): - check_type('trigger maximum batches', trigger_max_batches, Integral) - check_greater_than('trigger maximum batches', trigger_max_batches, 0) + cv.check_type('trigger maximum batches', trigger_max_batches, Integral) + cv.check_greater_than('trigger maximum batches', trigger_max_batches, 0) self._trigger_max_batches = trigger_max_batches @trigger_batch_interval.setter def trigger_batch_interval(self, trigger_batch_interval): - check_type('trigger batch interval', trigger_batch_interval, Integral) - check_greater_than('trigger batch interval', trigger_batch_interval, 0) + cv.check_type('trigger batch interval', trigger_batch_interval, Integral) + cv.check_greater_than('trigger batch interval', trigger_batch_interval, 0) self._trigger_batch_interval = trigger_batch_interval @no_reduce.setter def no_reduce(self, no_reduce): - check_type('no reduction option', no_reduce, bool) + cv.check_type('no reduction option', no_reduce, bool) self._no_reduce = no_reduce @threads.setter def threads(self, threads): - check_type('number of threads', threads, Integral) - check_greater_than('number of threads', threads, 0) + cv.check_type('number of threads', threads, Integral) + cv.check_greater_than('number of threads', threads, 0) self._threads = threads @trace.setter def trace(self, trace): - check_type('trace', trace, Iterable, Integral) - check_length('trace', trace, 3) - check_greater_than('trace batch', trace[0], 0) - check_greater_than('trace generation', trace[1], 0) - check_greater_than('trace particle', trace[2], 0) + cv.check_type('trace', trace, Iterable, Integral) + cv.check_length('trace', trace, 3) + cv.check_greater_than('trace batch', trace[0], 0) + cv.check_greater_than('trace generation', trace[1], 0) + cv.check_greater_than('trace particle', trace[2], 0) self._trace = trace @track.setter def track(self, track): - check_type('track', track, Iterable, Integral) + cv.check_type('track', track, Iterable, Integral) if len(track) % 3 != 0: msg = 'Unable to set the track to "{0}" since its length is ' \ 'not a multiple of 3'.format(track) raise ValueError(msg) for t in zip(track[::3], track[1::3], track[2::3]): - check_greater_than('track batch', t[0], 0) - check_greater_than('track generation', t[0], 0) - check_greater_than('track particle', t[0], 0) + cv.check_greater_than('track batch', t[0], 0) + cv.check_greater_than('track generation', t[0], 0) + cv.check_greater_than('track particle', t[0], 0) self._track = track @ufs_dimension.setter def ufs_dimension(self, dimension): - check_type('UFS mesh dimension', dimension, Iterable, Integral) - check_length('UFS mesh dimension', dimension, 3) + cv.check_type('UFS mesh dimension', dimension, Iterable, Integral) + cv.check_length('UFS mesh dimension', dimension, 3) for dim in dimension: - check_greater_than('UFS mesh dimension', dim, 1, True) + cv.check_greater_than('UFS mesh dimension', dim, 1, True) self._ufs_dimension = dimension @ufs_lower_left.setter def ufs_lower_left(self, lower_left): - check_type('UFS mesh lower left corner', lower_left, Iterable, Real) - check_length('UFS mesh lower left corner', lower_left, 3) + cv.check_type('UFS mesh lower left corner', lower_left, Iterable, Real) + cv.check_length('UFS mesh lower left corner', lower_left, 3) self._ufs_lower_left = lower_left @ufs_upper_right.setter def ufs_upper_right(self, upper_right): - check_type('UFS mesh upper right corner', upper_right, Iterable, Real) - check_length('UFS mesh upper right corner', upper_right, 3) + cv.check_type('UFS mesh upper right corner', upper_right, Iterable, Real) + cv.check_length('UFS mesh upper right corner', upper_right, 3) self._ufs_upper_right = upper_right @dd_mesh_dimension.setter @@ -724,8 +730,8 @@ class Settings(object): warnings.warn('This feature is not yet implemented in a release ' 'version of openmc') - check_type('DD mesh dimension', dimension, Iterable, Integral) - check_length('DD mesh dimension', dimension, 3) + cv.check_type('DD mesh dimension', dimension, Iterable, Integral) + cv.check_length('DD mesh dimension', dimension, 3) self._dd_mesh_dimension = dimension @@ -735,8 +741,8 @@ class Settings(object): warnings.warn('This feature is not yet implemented in a release ' 'version of openmc') - check_type('DD mesh lower left corner', lower_left, Iterable, Real) - check_length('DD mesh lower left corner', lower_left, 3) + cv.check_type('DD mesh lower left corner', lower_left, Iterable, Real) + cv.check_length('DD mesh lower left corner', lower_left, 3) self._dd_mesh_lower_left = lower_left @@ -746,8 +752,8 @@ class Settings(object): warnings.warn('This feature is not yet implemented in a release ' 'version of openmc') - check_type('DD mesh upper right corner', upper_right, Iterable, Real) - check_length('DD mesh upper right corner', upper_right, 3) + cv.check_type('DD mesh upper right corner', upper_right, Iterable, Real) + cv.check_length('DD mesh upper right corner', upper_right, 3) self._dd_mesh_upper_right = upper_right @@ -757,7 +763,7 @@ class Settings(object): warnings.warn('This feature is not yet implemented in a release ' 'version of openmc') - check_type('DD nodemap', nodemap, Iterable) + cv.check_type('DD nodemap', nodemap, Iterable) nodemap = np.array(nodemap).flatten() @@ -782,7 +788,7 @@ class Settings(object): warnings.warn('This feature is not yet implemented in a release ' 'version of openmc') - check_type('DD allow leakage', allow, bool) + cv.check_type('DD allow leakage', allow, bool) self._dd_allow_leakage = allow @@ -793,25 +799,34 @@ class Settings(object): warnings.warn('This feature is not yet implemented in a release ' 'version of openmc') - check_type('DD count interactions', interactions, bool) + cv.check_type('DD count interactions', interactions, bool) self._dd_count_interactions = interactions @use_windowed_multipole.setter def use_windowed_multipole(self, active): - check_type('use_windowed_multipole', active, bool) + cv.check_type('use_windowed_multipole', active, bool) self._multipole_active = active @resonance_scattering.setter def resonance_scattering(self, res): if isinstance(res, Iterable): - check_type('resonance_scattering', res, Iterable, + cv.check_type('resonance_scattering', res, Iterable, ResonanceScattering) self._resonance_scattering = res else: - check_type('resonance_scattering', res, ResonanceScattering) + cv.check_type('resonance_scattering', res, ResonanceScattering) self._resonance_scattering = [res] + @volume_calculations.setter + def volume_calculations(self, vol_calcs): + name = 'stochastic volume calculations' + if not isinstance(vol_calcs, MutableSequence): + vol_calcs = [vol_calcs] + cv.check_type(name, vol_calcs, MutableSequence) + self._volume_calculations = cv.CheckedList(VolumeCalculation, + name, vol_calcs) + def _create_run_mode_subelement(self): if self.run_mode == 'eigenvalue': @@ -873,6 +888,10 @@ class Settings(object): for source in self.source: self._settings_file.append(source.to_xml()) + def _create_volume_calcs_subelement(self): + for calc in self.volume_calculations: + self._settings_file.append(calc.to_xml()) + def _create_output_subelement(self): if self._output is not None: element = ET.SubElement(self._settings_file, "output") @@ -1154,6 +1173,7 @@ class Settings(object): self._create_dd_subelement() self._create_use_multipole_subelement() self._create_resonance_scattering_element() + self._create_volume_calcs_subelement() # Clean the indentation in the file to be user-readable clean_xml_indentation(self._settings_file) @@ -1216,29 +1236,29 @@ class ResonanceScattering(object): @nuclide.setter def nuclide(self, nuc): - check_type('nuclide', nuc, Nuclide) + cv.check_type('nuclide', nuc, Nuclide) self._nuclide = nuc @nuclide_0K.setter def nuclide_0K(self, nuc): - check_type('nuclide_0K', nuc, Nuclide) + cv.check_type('nuclide_0K', nuc, Nuclide) self._nuclide_0K = nuc @method.setter def method(self, m): - check_value('method', m, ('ARES', 'CXS', 'DBRC', 'WCM')) + cv.check_value('method', m, ('ARES', 'CXS', 'DBRC', 'WCM')) self._method = m @E_min.setter def E_min(self, E): - check_type('E_min', E, Real) - check_greater_than('E_min', E, 0, True) + cv.check_type('E_min', E, Real) + cv.check_greater_than('E_min', E, 0, True) self._E_min = E @E_max.setter def E_max(self, E): - check_type('E_max', E, Real) - check_greater_than('E_max', E, 0, True) + cv.check_type('E_max', E, Real) + cv.check_greater_than('E_max', E, 0, True) self._E_max = E def create_xml_subelement(self, xml_element): diff --git a/openmc/volume.py b/openmc/volume.py new file mode 100644 index 0000000000..511af62ed3 --- /dev/null +++ b/openmc/volume.py @@ -0,0 +1,204 @@ +from collections import Iterable, Mapping +from numbers import Real, Integral +from xml.etree import ElementTree as ET + +import numpy as np +import pandas as pd + +from openmc import Cell, Union +import openmc.checkvalue as cv + + +class VolumeCalculation(object): + """Stochastic volume calculation specifications and results. + + Parameters + ---------- + cells : Iterable of Cell + Cells to find volumes of + samples : int + Number of samples used to generate volume estimates + lower_left : Iterable of float + Lower-left coordinates of bounding box used to sample points. If this + argument is not supplied, an attempt is made to automatically determine + a bounding box. + upper_right : Iterable of float + Upper-right coordinates of bounding box used to sample points. If this + argument is not supplied, an attempt is made to automatically determine + a bounding box. + + Attributes + ---------- + cell_ids : Iterable of int + IDs of cells to find volumes of + samples : int + Number of samples used to generate volume estimates + lower_left : Iterable of float + Lower-left coordinates of bounding box used to sample points + upper_right : Iterable of float + Upper-right coordinates of bounding box used to sample points + results : dict + Dictionary whose keys are unique IDs of cells and values are + dictionaries with calculated volumes and total number of atoms for each + nuclide present in the cell. + volumes : dict + Dictionary whose keys are unique IDs of cells and values are the + estimated volumes + atoms_dataframe : pandas.DataFrame + DataFrame showing the estimated number of atoms for each nuclide present + in each cell specified. + + """ + def __init__(self, cells, samples, lower_left=None, + upper_right=None): + self._results = None + + cv.check_type('cells', cells, Iterable, Cell) + self.cell_ids = [c.id for c in cells] + self.samples = samples + + if lower_left is not None: + self.lower_left = lower_left + if upper_right is None: + raise ValueError('Both lower-left and upper-right coordinates ' + 'should be specified') + self.upper_right = upper_right + else: + ll, ur = Union(*[c.region for c in cells]).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.') + else: + self.lower_left = ll + self.upper_right = ur + + @property + def cell_ids(self): + return self._cell_ids + + @property + def samples(self): + return self._samples + + @property + def lower_left(self): + return self._lower_left + + @property + def upper_right(self): + return self._upper_right + + @property + def results(self): + return self._results + + @property + def volumes(self): + return {uid: results['volume'] for uid, results in self.results.items()} + + @property + def atoms_dataframe(self): + items = [] + columns = ['Cell', 'Nuclide', 'Atoms', 'Uncertainty'] + for cell_id, results in self.results.items(): + for name, atoms in results['atoms']: + items.append((cell_id, name, atoms[0], atoms[1])) + + return pd.DataFrame.from_records(items, columns=columns) + + @cell_ids.setter + def cell_ids(self, cell_ids): + cv.check_type('cell IDs', cell_ids, Iterable, Real) + self._cell_ids = cell_ids + + @samples.setter + def samples(self, samples): + cv.check_type('number of samples', samples, Integral) + cv.check_greater_than('number of samples', samples, 0) + self._samples = samples + + @lower_left.setter + def lower_left(self, lower_left): + name = 'lower-left bounding box coordinates', + cv.check_type(name, lower_left, Iterable, Real) + cv.check_length(name, lower_left, 3) + self._lower_left = lower_left + + @upper_right.setter + def upper_right(self, upper_right): + name = 'upper-right bounding box coordinates' + cv.check_type(name, upper_right, Iterable, Real) + cv.check_length(name, upper_right, 3) + self._upper_right = upper_right + + @results.setter + def results(self, results): + cv.check_type('results', results, Mapping) + self._results = results + + @classmethod + def from_hdf5(cls, filename): + """Load stochastic volume calculation results from HDF5 file. + + Parameters + ---------- + filename : str + Path to volume.h5 file + + Returns + ------- + openmc.VolumeCalculation + Results of the stochastic volume calculation + + """ + import h5py + + with h5py.File(filename, 'r') as f: + samples = f.attrs['samples'] + lower_left = f.attrs['lower_left'] + upper_right = f.attrs['upper_right'] + + results = {} + cell_ids = [] + for obj_name in f: + if obj_name.startswith('cell_'): + cell_id = int(obj_name[5:]) + cell_ids.append(cell_id) + group = f[obj_name] + volume = tuple(group['volume'].value) + nucnames = group['nuclides'].value + atoms = group['atoms'].value + + atom_list = [] + for name_i, atoms_i in zip(nucnames, atoms): + atom_list.append((name_i.decode(), tuple(atoms_i))) + results[cell_id] = {'volume': volume, 'atoms': atom_list} + + # Instantiate some throw-away cells that are used by the constructor to + # assign IDs + cells = [Cell(uid) for uid in cell_ids] + + # Instantiate the class and assign results + vol = cls(cells, samples, lower_left, upper_right) + vol.results = results + return vol + + def to_xml(self): + """Return XML representation of the volume calculation + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing volume calculation data + + """ + element = ET.Element("volume_calc") + cell_elem = ET.SubElement(element, "cells") + cell_elem.text = ' '.join(str(uid) for uid in self.cell_ids) + samples_elem = ET.SubElement(element, "samples") + samples_elem.text = str(self.samples) + ll_elem = ET.SubElement(element, "lower_left") + ll_elem.text = ' '.join(str(x) for x in self.lower_left) + ur_elem = ET.SubElement(element, "upper_right") + ur_elem.text = ' '.join(str(x) for x in self.upper_right) + return element diff --git a/src/relaxng/settings.rnc b/src/relaxng/settings.rnc index 46950c63fb..78a32171b9 100644 --- a/src/relaxng/settings.rnc +++ b/src/relaxng/settings.rnc @@ -142,6 +142,17 @@ element settings { element verbosity { xsd:positiveInteger }? & + element volume_calc { + (element cells { list { xsd:positiveInteger+ } } | + attribute cells { list { xsd:positiveInteger+ } }) & + (element samples { xsd:positiveInteger } | + attribute samples { xsd:positiveInteger }) & + (element lower_left { list { xsd:double+ } } | + attribute lower_left { list { xsd:double+ } }) & + (element upper_right { list { xsd:double+ } } | + attribute upper_right { list { xsd:double+ } }) + }+ & + element uniform_fs{ (element dimension { list { xsd:positiveInteger+ } } | attribute dimension { list { xsd:positiveInteger+ } }) & diff --git a/src/relaxng/settings.rng b/src/relaxng/settings.rng index 0b50f79699..64fe42239d 100644 --- a/src/relaxng/settings.rng +++ b/src/relaxng/settings.rng @@ -625,6 +625,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 66d772da7997008832711db8ecfe8b58989a8ea2 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 28 Jul 2016 13:52:42 -0500 Subject: [PATCH 013/168] Refactor settings to use more CheckedLists. Rename all to_xml methods to_xml_element --- openmc/settings.py | 79 +++++++++++++++++------------------ openmc/source.py | 8 ++-- openmc/stats/multivariate.py | 74 ++++++++++++++++++++++++++------ openmc/stats/univariate.py | 81 ++++++++++++++++++++++++++++++++---- openmc/volume.py | 2 +- 5 files changed, 177 insertions(+), 67 deletions(-) diff --git a/openmc/settings.py b/openmc/settings.py index 918f97c7da..eb56381b07 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -155,7 +155,7 @@ class Settings(object): self._max_order = None # Source subelement - self._source = None + self._source = cv.CheckedList(Source, 'source distributions') self._confidence_intervals = None self._cross_sections = None @@ -216,12 +216,12 @@ class Settings(object): self._settings_file = ET.Element("settings") self._run_mode_subelement = None - self._source_element = None self._multipole_active = None - self._resonance_scattering = None - self._volume_calculations = cv.CheckedList(VolumeCalculation, - 'volume calculations') + self._resonance_scattering = cv.CheckedList( + ResonanceScattering, 'resonance scattering models') + self._volume_calculations = cv.CheckedList( + VolumeCalculation, 'volume calculations') @property def run_mode(self): @@ -502,11 +502,9 @@ class Settings(object): @source.setter def source(self, source): - if isinstance(source, Source): - self._source = [source,] - else: - cv.check_type('source distribution', source, Iterable, Source) - self._source = source + if not isinstance(source, MutableSequence): + source = [source] + self._source = cv.CheckedList(Source, 'source distributions', source) @output.setter def output(self, output): @@ -810,22 +808,17 @@ class Settings(object): @resonance_scattering.setter def resonance_scattering(self, res): - if isinstance(res, Iterable): - cv.check_type('resonance_scattering', res, Iterable, - ResonanceScattering) - self._resonance_scattering = res - else: - cv.check_type('resonance_scattering', res, ResonanceScattering) - self._resonance_scattering = [res] + if not isinstance(res, MutableSequence): + res = [res] + self._resonance_scattering = cv.CheckedList( + ResonanceScattering, 'resonance scattering models', res) @volume_calculations.setter def volume_calculations(self, vol_calcs): - name = 'stochastic volume calculations' if not isinstance(vol_calcs, MutableSequence): vol_calcs = [vol_calcs] - cv.check_type(name, vol_calcs, MutableSequence) - self._volume_calculations = cv.CheckedList(VolumeCalculation, - name, vol_calcs) + self._volume_calculations = cv.CheckedList( + VolumeCalculation, 'stochastic volume calculations', vol_calcs) def _create_run_mode_subelement(self): @@ -884,13 +877,12 @@ class Settings(object): element.text = str(self._max_order) def _create_source_subelement(self): - if self.source is not None: - for source in self.source: - self._settings_file.append(source.to_xml()) + for source in self.source: + self._settings_file.append(source.to_xml_element()) def _create_volume_calcs_subelement(self): for calc in self.volume_calculations: - self._settings_file.append(calc.to_xml()) + self._settings_file.append(calc.to_xml_element()) def _create_output_subelement(self): if self._output is not None: @@ -1121,18 +1113,15 @@ class Settings(object): "use_windowed_multipole") element.text = str(self._multipole_active) - def _create_resonance_scattering_element(self): - if self.resonance_scattering is None: - return - - element = ET.SubElement(self._settings_file, "resonance_scattering") - - for r in self.resonance_scattering: - if r.nuclide.name != r.nuclide_0K.name: - raise ValueError("The nuclide and nuclide_0K attributes of " - "a ResonantScattering object must have " - "identical names.") - r.create_xml_subelement(element) + def _create_resonance_scattering_subelement(self): + if len(self.resonance_scattering) > 0: + elem = ET.SubElement(self._settings_file, 'resonance_scattering') + for r in self.resonance_scattering: + if r.nuclide.name != r.nuclide_0K.name: + raise ValueError("The nuclide and nuclide_0K attributes of " + "a ResonantScattering object must have " + "identical names.") + elem.append(r.to_xml_element()) def export_to_xml(self): """Create a settings.xml file that can be used for a simulation. @@ -1144,7 +1133,6 @@ class Settings(object): self._source_subelement = None self._trigger_subelement = None self._run_mode_subelement = None - self._source_element = None self._create_run_mode_subelement() self._create_source_subelement() @@ -1172,7 +1160,7 @@ class Settings(object): self._create_ufs_subelement() self._create_dd_subelement() self._create_use_multipole_subelement() - self._create_resonance_scattering_element() + self._create_resonance_scattering_subelement() self._create_volume_calcs_subelement() # Clean the indentation in the file to be user-readable @@ -1261,8 +1249,16 @@ class ResonanceScattering(object): cv.check_greater_than('E_max', E, 0, True) self._E_max = E - def create_xml_subelement(self, xml_element): - scatterer = ET.SubElement(xml_element, "scatterer") + def to_xml_element(self): + """Return XML representation of the resonance scattering model + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing resonance scattering model + + """ + scatterer = ET.Element("scatterer") subelement = ET.SubElement(scatterer, 'nuclide') subelement.text = self.nuclide.name if self.method is not None: @@ -1278,3 +1274,4 @@ class ResonanceScattering(object): if self.E_max is not None: subelement = ET.SubElement(scatterer, 'E_max') subelement.text = str(self.E_max) + return scatterer diff --git a/openmc/source.py b/openmc/source.py index 7e8a68accf..ee32cd0f4b 100644 --- a/openmc/source.py +++ b/openmc/source.py @@ -103,7 +103,7 @@ class Source(object): cv.check_greater_than('source strength', strength, 0.0, True) self._strength = strength - def to_xml(self): + def to_xml_element(self): """Return XML representation of the source Returns @@ -117,9 +117,9 @@ class Source(object): if self.file is not None: element.set("file", self.file) if self.space is not None: - element.append(self.space.to_xml()) + element.append(self.space.to_xml_element()) if self.angle is not None: - element.append(self.angle.to_xml()) + element.append(self.angle.to_xml_element()) if self.energy is not None: - element.append(self.energy.to_xml('energy')) + element.append(self.energy.to_xml_element('energy')) return element diff --git a/openmc/stats/multivariate.py b/openmc/stats/multivariate.py index e4eadd7aa4..e49a94ee19 100644 --- a/openmc/stats/multivariate.py +++ b/openmc/stats/multivariate.py @@ -50,7 +50,7 @@ class UnitSphere(object): self._reference_uvw = uvw/np.linalg.norm(uvw) @abstractmethod - def to_xml(self): + def to_xml_element(self): return '' @@ -109,13 +109,21 @@ class PolarAzimuthal(UnitSphere): cv.check_type('azimuthal angle', phi, Univariate) self._phi = phi - def to_xml(self): + def to_xml_element(self): + """Return XML representation of the angular distribution + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing angular distribution data + + """ element = ET.Element('angle') element.set("type", "mu-phi") if self.reference_uvw is not None: element.set("reference_uvw", ' '.join(map(str, self.reference_uvw))) - element.append(self.mu.to_xml('mu')) - element.append(self.phi.to_xml('phi')) + element.append(self.mu.to_xml_element('mu')) + element.append(self.phi.to_xml_element('phi')) return element @@ -127,7 +135,15 @@ class Isotropic(UnitSphere): def __init__(self): super(Isotropic, self).__init__() - def to_xml(self): + def to_xml_element(self): + """Return XML representation of the isotropic distribution + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing isotropic distribution data + + """ element = ET.Element('angle') element.set("type", "isotropic") return element @@ -152,7 +168,15 @@ class Monodirectional(UnitSphere): def __init__(self, reference_uvw=[1., 0., 0.]): super(Monodirectional, self).__init__(reference_uvw) - def to_xml(self): + def to_xml_element(self): + """Return XML representation of the monodirectional distribution + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing monodirectional distribution data + + """ element = ET.Element('angle') element.set("type", "monodirectional") if self.reference_uvw is not None: @@ -174,7 +198,7 @@ class Spatial(object): pass @abstractmethod - def to_xml(self): + def to_xml_element(self): return '' @@ -238,12 +262,20 @@ class CartesianIndependent(Spatial): cv.check_type('z coordinate', z, Univariate) self._z = z - def to_xml(self): + def to_xml_element(self): + """Return XML representation of the spatial distribution + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing spatial distribution data + + """ element = ET.Element('space') element.set('type', 'cartesian') - element.append(self.x.to_xml('x')) - element.append(self.y.to_xml('y')) - element.append(self.z.to_xml('z')) + element.append(self.x.to_xml_element('x')) + element.append(self.y.to_xml_element('y')) + element.append(self.z.to_xml_element('z')) return element @@ -308,7 +340,15 @@ class Box(Spatial): cv.check_type('only fissionable', only_fissionable, bool) self._only_fissionable = only_fissionable - def to_xml(self): + def to_xml_element(self): + """Return XML representation of the box distribution + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing box distribution data + + """ element = ET.Element('space') if self.only_fissionable: element.set("type", "fission") @@ -352,7 +392,15 @@ class Point(Spatial): cv.check_length('coordinate', xyz, 3) self._xyz = xyz - def to_xml(self): + def to_xml_element(self): + """Return XML representation of the point distribution + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing point distribution location + + """ element = ET.Element('space') element.set("type", "point") params = ET.SubElement(element, "parameters") diff --git a/openmc/stats/univariate.py b/openmc/stats/univariate.py index 24ab98895d..3fdd5e4a29 100644 --- a/openmc/stats/univariate.py +++ b/openmc/stats/univariate.py @@ -29,7 +29,7 @@ class Univariate(object): pass @abstractmethod - def to_xml(self, element_name): + def to_xml_element(self, element_name): return '' @abstractmethod @@ -92,7 +92,20 @@ class Discrete(Univariate): cv.check_greater_than('discrete probability', pk, 0.0, True) self._p = p - def to_xml(self, element_name): + def to_xml_element(self, element_name): + """Return XML representation of the discrete distribution + + Parameters + ---------- + element_name : str + XML element name + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing discrete distribution data + + """ element = ET.Element(element_name) element.set("type", "discrete") @@ -153,7 +166,20 @@ class Uniform(Univariate): t.c = [0., 1.] return t - def to_xml(self, element_name): + def to_xml_element(self, element_name): + """Return XML representation of the uniform distribution + + Parameters + ---------- + element_name : str + XML element name + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing uniform distribution data + + """ element = ET.Element(element_name) element.set("type", "uniform") element.set("parameters", '{} {}'.format(self.a, self.b)) @@ -196,7 +222,20 @@ class Maxwell(Univariate): cv.check_greater_than('Maxwell temperature', theta, 0.0) self._theta = theta - def to_xml(self, element_name): + def to_xml_element(self, element_name): + """Return XML representation of the Maxwellian distribution + + Parameters + ---------- + element_name : str + XML element name + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing Maxwellian distribution data + + """ element = ET.Element(element_name) element.set("type", "maxwell") element.set("parameters", str(self.theta)) @@ -254,7 +293,20 @@ class Watt(Univariate): cv.check_greater_than('Watt b', b, 0.0) self._b = b - def to_xml(self, element_name): + def to_xml_element(self, element_name): + """Return XML representation of the Watt distribution + + Parameters + ---------- + element_name : str + XML element name + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing Watt distribution data + + """ element = ET.Element(element_name) element.set("type", "watt") element.set("parameters", '{} {}'.format(self.a, self.b)) @@ -333,7 +385,20 @@ class Tabular(Univariate): cv.check_value('interpolation', interpolation, _INTERPOLATION_SCHEMES) self._interpolation = interpolation - def to_xml(self, element_name): + def to_xml_element(self, element_name): + """Return XML representation of the tabular distribution + + Parameters + ---------- + element_name : str + XML element name + + Returns + ------- + element : xml.etree.ElementTree.Element + XML element containing tabular distribution data + + """ element = ET.Element(element_name) element.set("type", "tabular") element.set("interpolation", self.interpolation) @@ -386,7 +451,7 @@ class Legendre(Univariate): self._legendre_polynomial = np.polynomial.legendre.Legendre( coefficients) - def to_xml(self, element_name): + def to_xml_element(self, element_name): raise NotImplementedError @@ -440,5 +505,5 @@ class Mixture(Univariate): Iterable, Univariate) self._distribution = distribution - def to_xml(self, element_name): + def to_xml_element(self, element_name): raise NotImplementedError diff --git a/openmc/volume.py b/openmc/volume.py index 511af62ed3..167971bdbd 100644 --- a/openmc/volume.py +++ b/openmc/volume.py @@ -183,7 +183,7 @@ class VolumeCalculation(object): vol.results = results return vol - def to_xml(self): + def to_xml_element(self): """Return XML representation of the volume calculation Returns From 08c9036bb69c781694f65ca6957f83cfe7387d20 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 1 Aug 2016 07:02:16 -0500 Subject: [PATCH 014/168] Ability to link volume calculation results in order to compute microscopic cross sections from mgxs --- openmc/cell.py | 60 +++++++++++++++++++++++++++++++++++++++--- openmc/geometry.py | 31 +++++++++------------- openmc/lattice.py | 17 ++++++------ openmc/material.py | 24 ++++++++++++++++- openmc/mgxs/library.py | 2 +- openmc/mgxs/mgxs.py | 41 +++++++++++++---------------- openmc/statepoint.py | 25 ++++++++++++++++-- openmc/summary.py | 11 ++++++++ openmc/universe.py | 31 ++++++++++++++++------ 9 files changed, 178 insertions(+), 64 deletions(-) diff --git a/openmc/cell.py b/openmc/cell.py index 9055f10e59..23246a0f68 100644 --- a/openmc/cell.py +++ b/openmc/cell.py @@ -85,6 +85,10 @@ class Cell(object): Array of offsets used for distributed cell searches distribcell_index : int Index of this cell in distribcell arrays + volume_information : dict + Estimate of the volume and total number of atoms of each nuclide from a + stochastic volume calculation. This information is set with the + :meth:`Cell.add_volume_information` method. """ @@ -100,6 +104,7 @@ class Cell(object): self._translation = None self._offsets = None self._distribcell_index = None + self._volume_information = None def __contains__(self, point): if self.region is None: @@ -212,6 +217,10 @@ class Cell(object): def distribcell_index(self): return self._distribcell_index + @property + def volume_information(self): + return self._volume_information + @id.setter def id(self, cell_id): if cell_id is None: @@ -351,6 +360,22 @@ class Cell(object): else: self.region = Intersection(self.region, region) + def add_volume_information(self, volume_calc): + """Add volume information to a cell. + + Parameters + ---------- + volume_calc : openmc.VolumeCalculation + Results from a stochastic volume calculation + + """ + for cell_id in volume_calc.results: + if cell_id == self.id: + self._volume_information = volume_calc.results[cell_id] + break + else: + raise ValueError('No volume information found for this cell.') + def get_cell_instance(self, path, distribcell_index): # If the Cell is filled by a Material @@ -368,8 +393,19 @@ class Cell(object): return offset - def get_all_nuclides(self): - """Return all nuclides contained in the cell + def get_nuclides(self): + """Returns all nuclides in the cell + + Returns + ------- + nuclides : list + List of nuclide names + + """ + return self.fill.get_nuclides() if self.fill_type != 'void' else [] + + def get_nuclide_densities(self): + """Return all nuclides contained in the cell and their densities Returns ------- @@ -381,8 +417,24 @@ class Cell(object): nuclides = OrderedDict() - if self.fill_type != 'void': - nuclides.update(self.fill.get_all_nuclides()) + if self.fill_type == 'material': + nuclides.update(self.fill.get_nuclide_densities()) + elif self.fill_type == 'void': + pass + else: + if self.volume_information is not None: + volume = self.volume_information['volume'][0] + for full_name, atoms in self.volume_information['atoms']: + name, xs = full_name.split('.') + nuclide = openmc.Nuclide(name, xs) + density = 1.0e-24 * atoms[0]/volume # density in atoms/b-cm + nuclides[name] = (nuclide, density) + else: + raise RuntimeError( + 'Volume information is needed to calculate microscopic cross ' + 'sections for cell {}. This can be done by running a ' + 'stochastic volume calculation via the ' + 'openmc.VolumeCalculation object'.format(self.id)) return nuclides diff --git a/openmc/geometry.py b/openmc/geometry.py index 14fd48fb1e..8314a9049c 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -50,6 +50,19 @@ class Geometry(object): self._root_universe = root_universe + def add_volume_information(self, volume_calc): + """Add volume information to from a stochastic volume calculation. + + Parameters + ---------- + volume_calc : openmc.VolumeCalculation + Results from a stochastic volume calculation + + """ + for cell in self.get_all_cells(): + if cell.id in volume_calc.results: + cell.add_volume_information(volume_calc) + def export_to_xml(self): """Create a geometry.xml file that can be used for a simulation. @@ -166,24 +179,6 @@ class Geometry(object): universes.sort(key=lambda x: x.id) return universes - def get_all_nuclides(self): - """Return all nuclides assigned to a material in the geometry - - Returns - ------- - list of openmc.Nuclide - Nuclides in the geometry - - """ - - nuclides = OrderedDict() - materials = self.get_all_materials() - - for material in materials: - nuclides.update(material.get_all_nuclides()) - - return nuclides - def get_all_materials(self): """Return all materials assigned to a cell diff --git a/openmc/lattice.py b/openmc/lattice.py index 81144e4d81..b26aab4c67 100644 --- a/openmc/lattice.py +++ b/openmc/lattice.py @@ -144,25 +144,26 @@ class Lattice(object): return univs - def get_all_nuclides(self): - """Return all nuclides contained in the lattice + def get_nuclides(self): + """Returns all nuclides in the lattice Returns ------- - nuclides : collections.OrderedDict - Dictionary whose keys are nuclide names and values are 2-tuples of - (nuclide, density) + nuclides : list + List of nuclide names """ - nuclides = OrderedDict() + nuclides = [] # Get all unique Universes contained in each of the lattice cells unique_universes = self.get_unique_universes() # Append all Universes containing each cell to the dictionary - for universe_id, universe in unique_universes.items(): - nuclides.update(universe.get_all_nuclides()) + for universe in unique_universes.values(): + for nuclide in universe.get_nuclides(): + if nuclide not in nuclides: + nuclides.append(nuclide) return nuclides diff --git a/openmc/material.py b/openmc/material.py index d7ffd04e94..5603d9d25c 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -492,9 +492,31 @@ class Material(object): for element, percent, percent_type in self._elements: element.scattering = 'iso-in-lab' - def get_all_nuclides(self): + def get_nuclides(self): """Returns all nuclides in the material + Returns + ------- + nuclides : list + List of nuclide names + + """ + + nuclides = [] + + for nuclide, density, density_type in self._nuclides: + nuclides.append(nuclide.name) + + for element, density, density_type in self._elements: + # Expand natural element into isotopes + for isotope, abundance in element.expand(): + nuclides.append(isotope.name) + + return nuclides + + def get_nuclide_densities(self): + """Returns all nuclides in the material and their densities + Returns ------- nuclides : dict diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 84571ce236..ee11d0ef64 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -1008,7 +1008,7 @@ class Library(object): # Create the xsdata object and add it to the mgxs_file for i, domain in enumerate(self.domains): if self.by_nuclide: - nuclides = list(domain.get_all_nuclides().keys()) + nuclides = domain.get_nuclides() else: nuclides = ['total'] for nuclide in nuclides: diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index e1c2e62217..7aa12d0418 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -288,9 +288,7 @@ class MGXS(object): # If this is a by-nuclide cross-section, add nuclides to Tally if self.by_nuclide and score != 'flux': - all_nuclides = self.get_all_nuclides() - for nuclide in all_nuclides: - self._tallies[key].nuclides.append(nuclide) + self._tallies[key].nuclides += self.get_nuclides() else: self._tallies[key].nuclides.append('total') @@ -329,14 +327,14 @@ class MGXS(object): @property def num_nuclides(self): if self.by_nuclide: - return len(self.get_all_nuclides()) + return len(self.get_nuclides()) else: return 1 @property def nuclides(self): if self.by_nuclide: - return self.get_all_nuclides() + return self.get_nuclides() else: return 'sum' @@ -503,7 +501,7 @@ class MGXS(object): mgxs.name = name return mgxs - def get_all_nuclides(self): + def get_nuclides(self): """Get all nuclides in the cross section's spatial domain. Returns @@ -528,8 +526,7 @@ class MGXS(object): # Otherwise, return all nuclides in the spatial domain else: - nuclides = self.domain.get_all_nuclides() - return list(nuclides.keys()) + return self.domain.get_nuclides() def get_nuclide_density(self, nuclide): """Get the atomic number density in units of atoms/b-cm for a nuclide @@ -556,7 +553,7 @@ class MGXS(object): cv.check_type('nuclide', nuclide, basestring) # Get list of all nuclides in the spatial domain - nuclides = self.domain.get_all_nuclides() + nuclides = self.domain.get_nuclide_densities() if nuclide not in nuclides: msg = 'Unable to get density for nuclide "{0}" which is not in ' \ @@ -597,14 +594,14 @@ class MGXS(object): # Sum the atomic number densities for all nuclides if nuclides == 'sum': - nuclides = self.get_all_nuclides() + nuclides = self.get_nuclides() densities = np.zeros(1, dtype=np.float) for nuclide in nuclides: densities[0] += self.get_nuclide_density(nuclide) # Tabulate the atomic number densities for all nuclides elif nuclides == 'all': - nuclides = self.get_all_nuclides() + nuclides = self.get_nuclides() densities = np.zeros(self.num_nuclides, dtype=np.float) for i, nuclide in enumerate(nuclides): densities[i] += self.get_nuclide_density(nuclide) @@ -635,7 +632,7 @@ class MGXS(object): # If computing xs for each nuclide, replace CrossNuclides with originals if self.by_nuclide: self.xs_tally._nuclides = [] - nuclides = self.get_all_nuclides() + nuclides = self.get_nuclides() for nuclide in nuclides: self.xs_tally.nuclides.append(openmc.Nuclide(nuclide)) @@ -796,7 +793,7 @@ class MGXS(object): # Construct a collection of the nuclides to retrieve from the xs tally if self.by_nuclide: if nuclides == 'all' or nuclides == 'sum' or nuclides == ['sum']: - query_nuclides = self.get_all_nuclides() + query_nuclides = self.get_nuclides() else: query_nuclides = nuclides else: @@ -1164,7 +1161,7 @@ class MGXS(object): # Construct a collection of the nuclides to report if self.by_nuclide: if nuclides == 'all': - nuclides = self.get_all_nuclides() + nuclides = self.get_nuclides() elif nuclides == 'sum': nuclides = ['sum'] else: @@ -1302,7 +1299,7 @@ class MGXS(object): # Construct a collection of the nuclides to report if self.by_nuclide: if nuclides == 'all': - nuclides = self.get_all_nuclides() + nuclides = self.get_nuclides() densities = np.zeros(len(nuclides), dtype=np.float) elif nuclides == 'sum': nuclides = ['sum'] @@ -1484,7 +1481,7 @@ class MGXS(object): if self.by_nuclide and nuclides == 'sum': # Use tally summation to sum across all nuclides - query_nuclides = self.get_all_nuclides() + query_nuclides = self.get_nuclides() xs_tally = self.xs_tally.summation(nuclides=query_nuclides) df = xs_tally.get_pandas_dataframe( distribcell_paths=distribcell_paths) @@ -1790,7 +1787,7 @@ class MatrixMGXS(MGXS): # Construct a collection of the nuclides to retrieve from the xs tally if self.by_nuclide: if nuclides == 'all' or nuclides == 'sum' or nuclides == ['sum']: - query_nuclides = self.get_all_nuclides() + query_nuclides = self.get_nuclides() else: query_nuclides = nuclides else: @@ -1937,7 +1934,7 @@ class MatrixMGXS(MGXS): # Construct a collection of the nuclides to report if self.by_nuclide: if nuclides == 'all': - nuclides = self.get_all_nuclides() + nuclides = self.get_nuclides() if nuclides == 'sum': nuclides = ['sum'] else: @@ -3622,7 +3619,7 @@ class ScatterMatrixXS(MatrixMGXS): # Construct a collection of the nuclides to retrieve from the xs tally if self.by_nuclide: if nuclides == 'all' or nuclides == 'sum' or nuclides == ['sum']: - query_nuclides = self.get_all_nuclides() + query_nuclides = self.get_nuclides() else: query_nuclides = nuclides else: @@ -3789,7 +3786,7 @@ class ScatterMatrixXS(MatrixMGXS): # Construct a collection of the nuclides to report if self.by_nuclide: if nuclides == 'all': - nuclides = self.get_all_nuclides() + nuclides = self.get_nuclides() if nuclides == 'sum': nuclides = ['sum'] else: @@ -4595,7 +4592,7 @@ class Chi(MGXS): nu_fission_out = self.tallies['nu-fission-out'] # Sum out all nuclides - nuclides = self.get_all_nuclides() + nuclides = self.get_nuclides() nu_fission_in = nu_fission_in.summation(nuclides=nuclides) nu_fission_out = nu_fission_out.summation(nuclides=nuclides) @@ -4615,7 +4612,7 @@ class Chi(MGXS): # Get chi for all nuclides in the domain elif nuclides == 'all': - nuclides = self.get_all_nuclides() + nuclides = self.get_nuclides() xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, nuclides=nuclides, value=value) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 6337746650..58a79fa219 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -2,6 +2,7 @@ import sys import re import os import warnings +import glob import numpy as np @@ -22,8 +23,9 @@ class StatePoint(object): filename : str Path to file to load autolink : bool, optional - Whether to automatically link in metadata from a summary.h5 - file. Defaults to True. + Whether to automatically link in metadata from a summary.h5 file and + stochastic volume calculation results from volume_*.h5 files. Defaults + to True. Attributes ---------- @@ -143,6 +145,12 @@ class StatePoint(object): su = openmc.Summary(path_summary) self.link_with_summary(su) + path_volume = os.path.join(os.path.dirname(filename), 'volume_*.h5') + for path_i in glob.glob(path_volume): + if re.search(r'volume_\d+\.h5', path_i): + vol = openmc.VolumeCalculation.from_hdf5(path_i) + self.add_volume_information(vol) + def close(self): self._f.close() @@ -501,6 +509,19 @@ class StatePoint(object): for tally_id in self.tallies: self.tallies[tally_id].sparse = self.sparse + def add_volume_information(self, volume_calc): + """Add volume information to the geometry within the file + + Parameters + ---------- + volume_calc : openmc.VolumeCalculation + Results from a stochastic volume calculation + + """ + if self.summary is not None: + self.summary.add_volume_information(volume_calc) + + def get_tally(self, scores=[], filters=[], nuclides=[], name=None, id=None, estimator=None, exact_filters=False, exact_nuclides=False, exact_scores=False): diff --git a/openmc/summary.py b/openmc/summary.py index 8c626940e5..6fbace72ea 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -594,6 +594,17 @@ class Summary(object): # Add Tally to the global dictionary of all Tallies self.tallies[tally_id] = tally + def add_volume_information(self, volume_calc): + """Add volume information to the geometry within the summary file + + Parameters + ---------- + volume_calc : openmc.VolumeCalculation + Results from a stochastic volume calculation + + """ + self.openmc_geometry.add_volume_information(volume_calc) + def get_material_by_id(self, material_id): """Return a Material object given the material id diff --git a/openmc/universe.py b/openmc/universe.py index c8e7fcab1e..f2b8641699 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -349,7 +349,27 @@ class Universe(object): # Return the offset computed at all nested Universe levels return offset - def get_all_nuclides(self): + def get_nuclides(self): + """Returns all nuclides in the universe + + Returns + ------- + nuclides : list + List of nuclide names + + """ + + nuclides = [] + + # Append all Nuclides in each Cell in the Universe to the dictionary + for cell in self.cells.values(): + for nuclide in cell.get_nuclides(): + if nuclide not in nuclides: + nuclides.append(nuclide) + + return nuclides + + def get_nuclide_densities(self): """Return all nuclides contained in the universe Returns @@ -360,13 +380,8 @@ class Universe(object): """ - nuclides = OrderedDict() - - # Append all Nuclides in each Cell in the Universe to the dictionary - for cell in self._cells.values(): - nuclides.update(cell.get_all_nuclides()) - - return nuclides + raise NotImplementedError('Determining average nuclide densities over ' + 'an entire universe not yet supported.') def get_all_cells(self): """Return all cells that are contained within the universe From aaefad9e2ea99c8edec4874741c37c128fa9e0e9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 1 Aug 2016 10:25:08 -0500 Subject: [PATCH 015/168] Add volume calculation test --- tests/test_volume_calc/inputs_true.dat | 1 + tests/test_volume_calc/results_true.dat | 13 ++++ tests/test_volume_calc/test_volume_calc.py | 82 ++++++++++++++++++++++ tests/testing_harness.py | 1 + 4 files changed, 97 insertions(+) create mode 100644 tests/test_volume_calc/inputs_true.dat create mode 100644 tests/test_volume_calc/results_true.dat create mode 100644 tests/test_volume_calc/test_volume_calc.py diff --git a/tests/test_volume_calc/inputs_true.dat b/tests/test_volume_calc/inputs_true.dat new file mode 100644 index 0000000000..2a3f25e6d0 --- /dev/null +++ b/tests/test_volume_calc/inputs_true.dat @@ -0,0 +1 @@ +b2de6ac20ca2ca38b00d61adae707d05519f6130eea25ab050220bac005cb6d23fa5812bf876307e92e90a8806f0b371500c5611ab23f80b7c073f118eb31649 \ No newline at end of file diff --git a/tests/test_volume_calc/results_true.dat b/tests/test_volume_calc/results_true.dat new file mode 100644 index 0000000000..e7a39a9312 --- /dev/null +++ b/tests/test_volume_calc/results_true.dat @@ -0,0 +1,13 @@ +k-combined: 4.165451e-02 3.582531e-04 +Cell 1: 31.4693 +/- 0.0721 cm^3 +Cell 2: 2.0933 +/- 0.0310 cm^3 +Cell 3: 2.0486 +/- 0.0307 cm^3 + Cell Nuclide Atoms Uncertainty +0 1 U235.71c 3.481769e+23 7.979991e+20 +1 1 Mo99.71c 3.481769e+22 7.979991e+19 +2 2 H1.71c 1.399770e+23 2.072914e+21 +3 2 O16.71c 6.998852e+22 1.036457e+21 +4 2 B10.71c 6.998852e+18 1.036457e+17 +5 3 H1.71c 1.369920e+23 2.051689e+21 +6 3 O16.71c 6.849599e+22 1.025844e+21 +7 3 B10.71c 6.849599e+18 1.025844e+17 diff --git a/tests/test_volume_calc/test_volume_calc.py b/tests/test_volume_calc/test_volume_calc.py new file mode 100644 index 0000000000..a6d779a25a --- /dev/null +++ b/tests/test_volume_calc/test_volume_calc.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python + +import os +import sys +sys.path.insert(0, os.pardir) +from testing_harness import PyAPITestHarness +import openmc + + +class VolumeTest(PyAPITestHarness): + def _build_inputs(self): + # Define materials + water = openmc.Material(1) + water.add_nuclide('H1', 2.0) + water.add_nuclide('O16', 1.0) + water.add_nuclide('B10', 0.0001) + water.add_s_alpha_beta('c_H_in_H2O', '71t') + water.set_density('g/cc', 1.0) + + fuel = openmc.Material(2) + fuel.add_nuclide('U235', 1.0) + fuel.add_nuclide('Mo99', 0.1) + fuel.set_density('g/cc', 4.5) + + materials = openmc.Materials((water, fuel)) + materials.default_xs = '71c' + materials.export_to_xml() + + cyl = openmc.ZCylinder(1, R=1.0, boundary_type='vacuum') + top_sphere = openmc.Sphere(2, z0=5., R=1., boundary_type='vacuum') + top_plane = openmc.ZPlane(3, z0=5.) + bottom_sphere = openmc.Sphere(4, z0=-5., R=1., boundary_type='vacuum') + bottom_plane = openmc.ZPlane(5, z0=-5.) + + # Define geometry + inside_cyl = openmc.Cell(1, fill=fuel, region=-cyl & -top_plane & +bottom_plane) + top_hemisphere = openmc.Cell(2, fill=water, region=-top_sphere & +top_plane) + bottom_hemisphere = openmc.Cell(3, fill=water, region=-bottom_sphere & -top_plane) + root = openmc.Universe(0, cells=(inside_cyl, top_hemisphere, bottom_hemisphere)) + + geometry = openmc.Geometry() + geometry.root_universe = root + geometry.export_to_xml() + + # Set up stochastic volume calculation + vol_calc = openmc.VolumeCalculation( + [inside_cyl, top_hemisphere, bottom_hemisphere], + 100000) + + # Define settings + settings = openmc.Settings() + settings.particles = 1000 + settings.batches = 4 + settings.inactive = 0 + settings.source = openmc.Source(space=openmc.stats.Box( + [-1., -1., -5.], [1., 1., 5.])) + settings.volume_calculations = vol_calc + settings.export_to_xml() + + def _get_results(self): + # Read the statepoint file. + statepoint = os.path.join(os.getcwd(), self._sp_name) + sp = openmc.StatePoint(statepoint) + + # Write out k-combined. + outstr = 'k-combined: {:12.6e} {:12.6e}\n'.format(*sp.k_combined) + + # Read volume calculation results + vol = openmc.VolumeCalculation.from_hdf5( + os.path.join(os.getcwd(), 'volume_1.h5')) + + # Write cell volumes and total # of atoms for each nuclide + for cell_id, results in sorted(vol.results.items()): + outstr += 'Cell {0}: {1[0]:.4f} +/- {1[1]:.4f} cm^3\n'.format( + cell_id, results['volume']) + outstr += str(vol.atoms_dataframe) + '\n' + + return outstr + +if __name__ == '__main__': + harness = VolumeTest('statepoint.4.h5') + harness.main() diff --git a/tests/testing_harness.py b/tests/testing_harness.py index d360184045..19a7ffb06c 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -137,6 +137,7 @@ class TestHarness(object): output.append(os.path.join(os.getcwd(), 'tallies.out')) output.append(os.path.join(os.getcwd(), 'results_test.dat')) output.append(os.path.join(os.getcwd(), 'summary.h5')) + output += glob.glob(os.path.join(os.getcwd(), 'volume_*.h5')) for f in output: if os.path.exists(f): os.remove(f) From 413a58a363ee8fbedeffa652f068f647f0fcb0dc Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 1 Aug 2016 11:15:48 -0500 Subject: [PATCH 016/168] Change a few mentions of ACE format cross sections and update manpage --- man/man1/openmc.1 | 16 +++++++++++++--- readme.rst | 2 +- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/man/man1/openmc.1 b/man/man1/openmc.1 index e69360a7c1..7f18ab28a2 100644 --- a/man/man1/openmc.1 +++ b/man/man1/openmc.1 @@ -3,7 +3,7 @@ openmc \- Executes the OpenMC Monte Carlo code .SH DESCRIPTION This command is used to execute the OpenMC Monte Carlo code. It is assumed that -a set of XML input files has already been created and that ACE format cross +a set of XML input files has already been created and that HDF5 format cross sections are available. .SH SYNOPSIS \fBopenmc\fR [\fIoptions\fR] [\fIpath\fR] @@ -40,11 +40,21 @@ The behavior of .B openmc is affected by the following environment variables. .TP -.B CROSS_SECTIONS +.B OPENMC_CROSS_SECTIONS Indicates the default path to the cross_sections.xml summary file that is used -to locate ACE format cross section libraries if the user has not specified the +to locate HDF5 format cross section libraries if the user has not specified the tag in .I settings.xml\fP. +.TP +.B OPENMC_MG_CROSS_SECTIONS +Indicates the default path to the mgxs.xml file that contains multi-group cross +section libraries if the user has not specified the tag in +.I settings.xml\fP. +.TP +.B OPENMC_MULTIPOLE_LIBRARY +Indicates the default path to a directory containing windowed multipole data if +the user has not specified the tag in +.I settings.xml\fP. .SH LICENSE Copyright \(co 2011-2016 Massachusetts Institute of Technology. .PP diff --git a/readme.rst b/readme.rst index 03964d9436..90484ad494 100644 --- a/readme.rst +++ b/readme.rst @@ -7,7 +7,7 @@ OpenMC Monte Carlo Particle Transport Code The OpenMC project aims to provide a fully-featured Monte Carlo particle transport code based on modern methods. It is a constructive solid geometry, -continuous-energy transport code that uses ACE format cross sections. The +continuous-energy transport code that uses HDF5 format cross sections. The project started under the Computational Reactor Physics Group at MIT. Complete documentation on the usage of OpenMC is hosted on Read the Docs at From af27542af509b250e2872d48bf2708d7210ecfd5 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 1 Aug 2016 21:48:02 -0500 Subject: [PATCH 017/168] Fix a few docstrings --- openmc/cell.py | 2 +- openmc/geometry.py | 2 +- openmc/lattice.py | 2 +- openmc/material.py | 2 +- openmc/universe.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openmc/cell.py b/openmc/cell.py index 23246a0f68..c4a0952e91 100644 --- a/openmc/cell.py +++ b/openmc/cell.py @@ -398,7 +398,7 @@ class Cell(object): Returns ------- - nuclides : list + nuclides : list of str List of nuclide names """ diff --git a/openmc/geometry.py b/openmc/geometry.py index 8314a9049c..c827f4b2a7 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -51,7 +51,7 @@ class Geometry(object): self._root_universe = root_universe def add_volume_information(self, volume_calc): - """Add volume information to from a stochastic volume calculation. + """Add volume information from a stochastic volume calculation. Parameters ---------- diff --git a/openmc/lattice.py b/openmc/lattice.py index b26aab4c67..c6a5af4109 100644 --- a/openmc/lattice.py +++ b/openmc/lattice.py @@ -149,7 +149,7 @@ class Lattice(object): Returns ------- - nuclides : list + nuclides : list of str List of nuclide names """ diff --git a/openmc/material.py b/openmc/material.py index 5603d9d25c..aeebf385c6 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -497,7 +497,7 @@ class Material(object): Returns ------- - nuclides : list + nuclides : list of str List of nuclide names """ diff --git a/openmc/universe.py b/openmc/universe.py index f2b8641699..c8fb89a384 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -354,7 +354,7 @@ class Universe(object): Returns ------- - nuclides : list + nuclides : list of str List of nuclide names """ From 99adb712aba31bac85245940f09019470427a113 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 1 Aug 2016 21:51:31 -0500 Subject: [PATCH 018/168] gfortran 4.6 doesn't like firstprivate objects with allocatable components --- src/stl_vector.F90 | 15 +++++++++++++++ src/volume_calc.F90 | 12 ++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/stl_vector.F90 b/src/stl_vector.F90 index c7f2246ff8..06f487dc1e 100644 --- a/src/stl_vector.F90 +++ b/src/stl_vector.F90 @@ -114,6 +114,11 @@ contains ! Since integer is trivially destructible, we only need to set size to zero ! and can leave capacity as is this%size_ = 0 + if (allocated(this % data)) then + this%capacity_ = size(this % data) + else + this%capacity_ = 0 + end if end subroutine clear_int subroutine initialize_fill_int(this, n, val) @@ -249,6 +254,11 @@ contains ! Since real is trivially destructible, we only need to set size to zero and ! can leave capacity as is this%size_ = 0 + if (allocated(this % data)) then + this%capacity_ = size(this % data) + else + this%capacity_ = 0 + end if end subroutine clear_real subroutine initialize_fill_real(this, n, val) @@ -384,6 +394,11 @@ contains ! Since char is trivially destructible, we only need to set size to zero and ! can leave capacity as is this%size_ = 0 + if (allocated(this % data)) then + this%capacity_ = size(this % data) + else + this%capacity_ = 0 + end if end subroutine clear_char subroutine initialize_fill_char(this, n, val) diff --git a/src/volume_calc.F90 b/src/volume_calc.F90 index cb36f0b7f3..eac96f9ba7 100644 --- a/src/volume_calc.F90 +++ b/src/volume_calc.F90 @@ -140,8 +140,16 @@ contains call p % initialize() -!$omp parallel private(i, j, k, i_cell, i_material, level, found_cell) & -!$omp& firstprivate(p, indices, hits) +!$omp parallel private(i, j, k, i_cell, i_material, level, found_cell, & +!$omp& indices, hits) firstprivate(p) + + ! Reset vectors -- this is really to get around a gfortran 4.6 bug. Ideally, + ! indices and hits would just be firstprivate but 4.6 complains because they + ! have allocatable components... + do i_cell = 1, size(this % cell_id) + call indices(i_cell) % clear() + call hits(i_cell) % clear() + end do call prn_set_stream(STREAM_VOLUME) From 725ef2d9238293c0863297ba9e987ed666f932c6 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 1 Aug 2016 22:34:04 -0500 Subject: [PATCH 019/168] Add function to create compact MT=458 data library --- openmc/data/endf_utils.py | 2 + openmc/data/fission_energy.py | 255 ++++++++++++++++++++++++++-------- 2 files changed, 196 insertions(+), 61 deletions(-) diff --git a/openmc/data/endf_utils.py b/openmc/data/endf_utils.py index 6db3c611cf..bfd9ae5c85 100644 --- a/openmc/data/endf_utils.py +++ b/openmc/data/endf_utils.py @@ -24,6 +24,7 @@ def read_CONT_line(line): int(line[66:70]), int(line[70:72]), int(line[72:75]), int(line[75:80])) + def identify_nuclide(fname): """Read the header of an ENDF file and extract identifying information.""" with open(fname, 'r') as fh: @@ -39,5 +40,6 @@ def identify_nuclide(fname): # Return dictionary of the most important identifying information. return {'Z': int(ZA) // 1000, 'A': int(ZA) % 1000, + 'LFI': bool(LFI), 'LIS': LIS, 'LISO': LISO} diff --git a/openmc/data/fission_energy.py b/openmc/data/fission_energy.py index b7641a2370..ccea3d96a7 100644 --- a/openmc/data/fission_energy.py +++ b/openmc/data/fission_energy.py @@ -3,6 +3,7 @@ from copy import deepcopy import sys #from warnings import warn +import h5py import numpy as np from numpy.polynomial.polynomial import Polynomial @@ -14,6 +15,189 @@ if sys.version_info[0] >= 3: basestring = str +def _extract_458_data(filename): + """Read an ENDF file and extract the MF=1, MT=458 values. + + Parameters + ---------- + filename : str + Path to and ENDF file + + Returns + ------- + value : dict of str to list of float + Dictionary that gives lists of coefficients for each energy component. + The keys are the 2-3 letter strings used in ENDF-102, e.g. 'EFR' and + 'ET'. The list will have a length of 1 for Sher-Beck data, more for + polynomial data. + uncertainty : dict of str to list of float + A dictionary with the same format as above. This is probably a + one-standard deviation value, but that is not specified explicitly in + ENDF-102. Also, some evaluations will give zero uncertainty. Use with + caution. + + """ + ident = identify_nuclide(filename) + + if not ident['LFI']: + # This nuclide isn't fissionable. + return None + + # Extract the MF=1, MT=458 section. + lines = [] + with open(filename, 'r') as fh: + line = fh.readline() + while line != '': + if line[70:75] == ' 1458': + lines.append(line) + line = fh.readline() + + if len(lines) == 0: + # No 458 data here. + return None + + # Read the number of coefficients in this LIST record. + NPL = read_CONT_line(lines[1])[4] + + # Parse the ENDF LIST into an array. + data = [] + for i in range(NPL): + row, column = divmod(i, 6) + data.append(read_float(lines[2 + row][11*column:11*(column+1)])) + + # Declare the coefficient names and the order they are given in. The LIST + # contains a value followed immediately by an uncertainty for each of these + # components, times the polynomial order + 1. + labels = ('EFR', 'ENP', 'END', 'EGP', 'EGD', 'EB', 'ENU', 'ER', 'ET') + + # Associate each set of values and uncertainties with its label. + value = dict() + uncertainty = dict() + for i in range(len(labels)): + value[labels[i]] = data[2*i::18] + uncertainty[labels[i]] = data[2*i + 1::18] + + # In ENDF/B-7.1, data for 2nd-order coefficients were mistakenly not + # converted from MeV to eV. Check for this error and fix it if present. + n_coeffs = len(value['EFR']) + if n_coeffs == 3: # Only check 2nd-order data. + # Check each energy component for the error. If a 1 MeV neutron + # causes a change of more than 100 MeV, we know something is wrong. + error_present = False + for coeffs in value.values(): + second_order = coeffs[2] + if abs(second_order) * 1e12 > 1e8: + error_present = True + break + + # If we found the error, reduce all 2nd-order coeffs by 10**6. + if error_present: + for coeffs in value.values(): coeffs[2] *= 1e-6 + for coeffs in uncertainty.values(): coeffs[2] *= 1e-6 + + # Perform the sanity check again... just in case. + for coeffs in value.values(): + second_order = coeffs[2] + if abs(second_order) * 1e12 > 1e8: + raise ValueError("Encountered a ludicrously large second-" + "order polynomial coefficient.") + + # Convert eV to MeV. + for coeffs in value.values(): + for i in range(len(coeffs)): + coeffs[i] *= 10**(-6 + 6*i) + for coeffs in uncertainty.values(): + for i in range(len(coeffs)): + coeffs[i] *= 10**(-6 + 6*i) + + return value, uncertainty + + +def write_compact_458_library(endf_files, output_name=None, comment=None, + verbose=False): + """Read ENDF files, strip the MF=1 MT=458 data and write to small HDF5. + + Parameters + ---------- + endf_files : Collection of str + Strings giving the paths to the ENDF files that will be parsed for data. + output_name : str + Name of the output HDF5 file. Default is 'fission_Q_data.h5'. + comment : str + Comment to write in the output HDF5 file. Defaults to no comment. + verbose : bool + If True, print the name of each isomer as it is read. Defaults to + False. + + """ + # Open the output file. + if output_name is None: output_name = 'fission_Q_data.h5' + out = h5py.File(output_name, 'w', libver='latest') + + # Write comments, if given. This commented out comment is the one used for + # the library distributed with OpenMC. + #comment = ('This data is extracted from ENDF/B-VII.1 library. Thanks ' + # 'evaluators, for all your hard work :) Citation: ' + # 'M. B. Chadwick, M. Herman, P. Oblozinsky, ' + # 'M. E. Dunn, Y. Danon, A. C. Kahler, D. L. Smith, ' + # 'B. Pritychenko, G. Arbanas, R. Arcilla, R. Brewer, ' + # 'D. A. Brown, R. Capote, A. D. Carlson, Y. S. Cho, H. Derrien, ' + # 'K. Guber, G. M. Hale, S. Hoblit, S. Holloway, T. D. Johnson, ' + # 'T. Kawano, B. C. Kiedrowski, H. Kim, S. Kunieda, ' + # 'N. M. Larson, L. Leal, J. P. Lestone, R. C. Little, ' + # 'E. A. McCutchan, R. E. MacFarlane, M. MacInnes, ' + # 'C. M. Mattoon, R. D. McKnight, S. F. Mughabghab, ' + # 'G. P. A. Nobre, G. Palmiotti, A. Palumbo, M. T. Pigni, ' + # 'V. G. Pronyaev, R. O. Sayer, A. A. Sonzogni, N. C. Summers, ' + # 'P. Talou, I. J. Thompson, A. Trkov, R. L. Vogt, ' + # 'S. C. van der Marck, A. Wallner, M. C. White, D. Wiarda, ' + # 'and P. G. Young. ENDF/B-VII.1 nuclear data for science and ' + # 'technology: Cross sections, covariances, fission product ' + # 'yields and decay data", Nuclear Data Sheets, ' + # '112(12):2887-2996 (2011).') + if comment is not None: + out.attrs['comment'] = np.string_(comment) + + # Declare the order of the components. Use fixed-length numpy strings + # because they work well with h5py. + labels = np.array(('EFR', 'ENP', 'END', 'EGP', 'EGD', 'EB', 'ENU', 'ER', + 'ET'), dtype='S3') + out.attrs['component order'] = labels + + # Iterate over the given files. + if verbose: print('Reading ENDF files:') + for fname in endf_files: + if verbose: print(fname) + + ident = identify_nuclide(fname) + + # Skip non-fissionable nuclides. + if not ident['LFI']: continue + + # Get the important bits. + data = _extract_458_data(fname) + if data is None: continue + value, uncertainty = data + + # Make a group for this isomer. + name = str(ident['Z']) + str(ident['A']) + if ident['LISO'] != 0: + name += '_m' + str(ident['LISO']) + nuclide_group = out.create_group(name) + + # Write all the coefficients into one array. The first dimension gives + # the component (e.g. fragments or prompt neutrons); the second switches + # between value and uncertainty; the third gives the polynomial order. + n_coeffs = len(value['EFR']) + data_out = np.zeros((len(labels), 2, n_coeffs)) + for i, label in enumerate(labels): + data_out[i, 0, :] = value[label.decode()] + data_out[i, 1, :] = uncertainty[label.decode()] + nuclide_group.create_dataset('data', data=data_out) + + out.close() + + class FissionEnergyRelease(object): def __init__(self): self._fragments = None @@ -148,72 +332,21 @@ class FissionEnergyRelease(object): pass if ident['LISO'] != incident_neutron.metastable: pass + if not ident['LIF']: + pass - # Extract the MF=1, MT=458 section. - lines = [] - with open(filename, 'r') as fh: - line = fh.readline() - while line != '': - if line[70:75] == ' 1458': - lines.append(line) - line = fh.readline() + # Read the 458 data from the ENDF file. + value, uncertainty = _extract_458_data(filename) - # Read the number of coefficients in this LIST record. - NPL = read_CONT_line(lines[1])[4] - - # Parse the ENDF LIST into an array. - data = [] - for i in range(NPL): - row, column = divmod(i, 6) - data.append(read_float(lines[2 + row][11*column:11*(column+1)])) - - # Declare the coefficient names and the order they are given in. The - # LIST contains a value followed immediately by an uncertainty for each - # of these components, times the polynomial order + 1. If we only find - # one value for each of these components, then we need to use the - # Sher-Beck formula for energy dependence. Otherwise, it is a - # polynomial. + # Declare the coefficient names. If we only find one value for each of + # these components, then we need to use the Sher-Beck formula for energy + # dependence. Otherwise, it is a polynomial. labels = ('EFR', 'ENP', 'END', 'EGP', 'EGD', 'EB', 'ENU', 'ER', 'ET') - # Associate each set of values and uncertainties with its label. - value = dict() - uncertainty = dict() - for i in range(len(labels)): - value[labels[i]] = data[2*i::18] - uncertainty[labels[i]] = data[2*i + 1::18] - - # In ENDF/B-7.1, data for 2nd-order coefficients were mistakenly not - # converted from MeV to eV. Check for this error and fix it if present. + # How many coefficients are given for each coefficient? If we only find + # one value for each, then we need to use the Sher-Beck formula for + # energy dependence. Otherwise, it is a polynomial. n_coeffs = len(value['EFR']) - if n_coeffs == 3: # Only check 2nd-order data. - # Check each energy component for the error. If a 1 MeV neutron - # causes a change of more than 100 MeV, we know something is wrong. - error_present = False - for coeffs in value.values(): - second_order = coeffs[2] - if abs(second_order) * 1e12 > 1e8: - error_present = True - break - - # If we found the error, reduce all 2nd-order coeffs by 10**6. - if error_present: - for coeffs in value.values(): coeffs[2] *= 1e-6 - for coeffs in uncertainty.values(): coeffs[2] *= 1e-6 - - # Perform the sanity check again... just in case. - for coeffs in value.values(): - second_order = coeffs[2] - if abs(second_order) * 1e12 > 1e8: - raise ValueError("Encountered a ludicrously large second-" - "order polynomial coefficient.") - - # Convert eV to MeV. - for coeffs in value.values(): - for i in range(len(coeffs)): - coeffs[i] *= 10**(-6 + 6*i) - for coeffs in uncertainty.values(): - for i in range(len(coeffs)): - coeffs[i] *= 10**(-6 + 6*i) out = cls() if n_coeffs > 1: From 5074c9831f440a14c81cd84607a132abd24be3d0 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 2 Aug 2016 03:05:16 -0400 Subject: [PATCH 020/168] reworked surface current tally indexing and fixed issue in Python API current tallies --- openmc/filter.py | 12 ++++++ openmc/statepoint.py | 2 +- src/cmfd_data.F90 | 91 ++++++++++++++++++++++++++++-------------- src/cmfd_input.F90 | 6 +-- src/constants.F90 | 12 +++--- src/input_xml.F90 | 20 +++------- src/mesh.F90 | 15 ++----- src/output.F90 | 60 +++++----------------------- src/tally.F90 | 90 +++++++++++++++++++++--------------------- src/trigger.F90 | 94 +++----------------------------------------- 10 files changed, 151 insertions(+), 251 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index d6ee70f148..9e05cff63c 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -772,6 +772,18 @@ class Filter(object): df.loc[:, self.type + ' low'] = lo_bins df.loc[:, self.type + ' high'] = hi_bins + elif self.type == 'surface': + filter_bins = np.repeat(self.bins, self.stride) + tile_factor = data_size / len(filter_bins) + filter_bins = np.tile(filter_bins, tile_factor) + filter_bins = [x if x != 1 else 'x-min' for x in filter_bins] + filter_bins = [x if x != 2 else 'x-max' for x in filter_bins] + filter_bins = [x if x != 3 else 'y-min' for x in filter_bins] + filter_bins = [x if x != 4 else 'y-max' for x in filter_bins] + filter_bins = [x if x != 5 else 'z-min' for x in filter_bins] + filter_bins = [x if x != 6 else 'z-max' for x in filter_bins] + df = pd.concat([df, pd.DataFrame({self.type : filter_bins})]) + # universe, material, surface, cell, and cellborn filters else: filter_bins = np.repeat(self.bins, self.stride) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 6337746650..10d91d1940 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -681,7 +681,7 @@ class StatePoint(object): if tally_filter.type == 'surface': surface_ids = [] for bin in tally_filter.bins: - surface_ids.append(summary.surfaces[bin].id) + surface_ids.append(bin) tally_filter.bins = surface_ids if tally_filter.type in ['cell', 'distribcell']: diff --git a/src/cmfd_data.F90 b/src/cmfd_data.F90 index 347351e318..c07569ae5d 100644 --- a/src/cmfd_data.F90 +++ b/src/cmfd_data.F90 @@ -50,9 +50,9 @@ contains subroutine compute_xs() use constants, only: FILTER_MESH, FILTER_ENERGYIN, FILTER_ENERGYOUT, & - FILTER_SURFACE, IN_RIGHT, OUT_RIGHT, IN_FRONT, & - OUT_FRONT, IN_TOP, OUT_TOP, CMFD_NOACCEL, ZERO, & - ONE, TINY_BIT + FILTER_SURFACE, OUT_LEFT, OUT_RIGHT, OUT_BACK, & + OUT_FRONT, OUT_BOTTOM, OUT_TOP, CMFD_NOACCEL, & + ZERO, ONE, TINY_BIT use error, only: fatal_error use global, only: cmfd, n_cmfd_tallies, cmfd_tallies, meshes,& matching_bins @@ -227,60 +227,91 @@ contains ! Left surface matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i-1, j, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_RIGHT + (/ i, j, k /)) + matching_bins(i_filter_surf) = OUT_LEFT score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! outgoing cmfd % current(1,h,i,j,k) = t % results(1,score_index) % sum - matching_bins(i_filter_surf) = OUT_RIGHT - score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! incoming - cmfd % current(2,h,i,j,k) = t % results(1,score_index) % sum + + if (i > 1) then + matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & + (/ i-1, j, k /)) + matching_bins(i_filter_surf) = OUT_RIGHT + score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! incoming + cmfd % current(2,h,i,j,k) = t % results(1,score_index) % sum + end if ! Right surface + if (i < nx) then + matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & + (/ i+1, j, k /) ) + matching_bins(i_filter_surf) = OUT_LEFT + score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! incoming + cmfd % current(3,h,i,j,k) = t % results(1,score_index) % sum + end if + matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i, j, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_RIGHT - score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! incoming - cmfd % current(3,h,i,j,k) = t % results(1,score_index) % sum + (/ i, j, k /) ) matching_bins(i_filter_surf) = OUT_RIGHT score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! outgoing cmfd % current(4,h,i,j,k) = t % results(1,score_index) % sum ! Back surface + matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i, j-1, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_FRONT + (/ i, j, k /)) + matching_bins(i_filter_surf) = OUT_BACK score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! outgoing cmfd % current(5,h,i,j,k) = t % results(1,score_index) % sum - matching_bins(i_filter_surf) = OUT_FRONT - score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! incoming - cmfd % current(6,h,i,j,k) = t % results(1,score_index) % sum + + if (j > 1) then + matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & + (/ i, j-1, k /)) + matching_bins(i_filter_surf) = OUT_FRONT + score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! incoming + cmfd % current(6,h,i,j,k) = t % results(1,score_index) % sum + end if ! Front surface + if (j < ny) then + matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & + (/ i, j+1, k /)) + matching_bins(i_filter_surf) = OUT_BACK + score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! incoming + cmfd % current(7,h,i,j,k) = t % results(1,score_index) % sum + end if + matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i, j, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_FRONT - score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! incoming - cmfd % current(7,h,i,j,k) = t % results(1,score_index) % sum + (/ i, j, k /)) matching_bins(i_filter_surf) = OUT_FRONT score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! outgoing cmfd % current(8,h,i,j,k) = t % results(1,score_index) % sum ! Bottom surface matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i, j, k-1 /) + 1, .true.) - matching_bins(i_filter_surf) = IN_TOP + (/ i, j, k /)) + matching_bins(i_filter_surf) = OUT_BOTTOM score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! outgoing cmfd % current(9,h,i,j,k) = t % results(1,score_index) % sum - matching_bins(i_filter_surf) = OUT_TOP - score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! incoming - cmfd % current(10,h,i,j,k) = t % results(1,score_index) % sum + + if (k > 1) then + matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & + (/ i, j, k-1 /)) + matching_bins(i_filter_surf) = OUT_TOP + score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! incoming + cmfd % current(10,h,i,j,k) = t % results(1,score_index) % sum + end if ! Top surface + if (k < nz) then + matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & + (/ i, j, k+1 /)) + matching_bins(i_filter_surf) = OUT_BOTTOM + score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! incoming + cmfd % current(11,h,i,j,k) = t % results(1,score_index) % sum + end if + matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i, j, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_TOP - score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! incoming - cmfd % current(11,h,i,j,k) = t % results(1,score_index) % sum + (/ i, j, k /)) matching_bins(i_filter_surf) = OUT_TOP score_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 ! outgoing cmfd % current(12,h,i,j,k) = t % results(1,score_index) % sum diff --git a/src/cmfd_input.F90 b/src/cmfd_input.F90 index f69c09fe1c..e63a1fceab 100644 --- a/src/cmfd_input.F90 +++ b/src/cmfd_input.F90 @@ -526,11 +526,11 @@ contains filters(n_filters) % n_bins = 2 * m % n_dimension allocate(filters(n_filters) % int_bins(2 * m % n_dimension)) if (m % n_dimension == 2) then - filters(n_filters) % int_bins = (/ IN_RIGHT, OUT_RIGHT, IN_FRONT, & + filters(n_filters) % int_bins = (/ OUT_LEFT, OUT_RIGHT, OUT_BACK, & OUT_FRONT /) elseif (m % n_dimension == 3) then - filters(n_filters) % int_bins = (/ IN_RIGHT, OUT_RIGHT, IN_FRONT, & - OUT_FRONT, IN_TOP, OUT_TOP /) + filters(n_filters) % int_bins = (/ OUT_LEFT, OUT_RIGHT, OUT_BACK, & + OUT_FRONT, OUT_BOTTOM, OUT_TOP /) end if t % find_filter(FILTER_SURFACE) = n_filters diff --git a/src/constants.F90 b/src/constants.F90 index a22c9ac050..ebb8322e9e 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -356,12 +356,12 @@ module constants ! Tally surface current directions integer, parameter :: & - IN_RIGHT = 1, & - OUT_RIGHT = 2, & - IN_FRONT = 3, & - OUT_FRONT = 4, & - IN_TOP = 5, & - OUT_TOP = 6 + OUT_LEFT = 1, & ! x min + OUT_RIGHT = 2, & ! x max + OUT_BACK = 3, & ! y min + OUT_FRONT = 4, & ! y max + OUT_BOTTOM = 5, & ! z min + OUT_TOP = 6 ! z max ! Tally trigger types and threshold integer, parameter :: & diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 3e5a687124..b94c41a65f 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -3029,9 +3029,7 @@ contains // " specified on tally " // trim(to_str(t % id))) end if - ! Determine number of bins -- this is assuming that the tally is - ! a volume tally and not a surface current tally. If it is a - ! surface current tally, the number of bins will get reset later + ! Determine number of bins t % filters(j) % n_bins = product(m % dimension) ! Allocate and store index of mesh @@ -3646,10 +3644,6 @@ contains &same tally as surface currents") end if - ! Since the number of bins for the mesh filter was already set - ! assuming it was a volume tally, we need to adjust the number - ! of bins - ! Get index of mesh filter k = t % find_filter(FILTER_MESH) @@ -3663,10 +3657,6 @@ contains i_mesh = t % filters(k) % int_bins(1) m => meshes(i_mesh) - ! We need to increase the dimension by one since we also need - ! currents coming into and out of the boundary mesh cells. - t % filters(k) % n_bins = product(m % dimension + 1) - ! Copy filters to temporary array allocate(filters(t % n_filters + 1)) filters(1:t % n_filters) = t % filters @@ -3682,11 +3672,11 @@ contains allocate(t % filters(t % n_filters) % int_bins(& 2 * m % n_dimension)) if (m % n_dimension == 2) then - t % filters(t % n_filters) % int_bins = (/ IN_RIGHT, & - OUT_RIGHT, IN_FRONT, OUT_FRONT /) + t % filters(t % n_filters) % int_bins = (/ OUT_LEFT, & + OUT_RIGHT, OUT_BACK, OUT_FRONT /) elseif (m % n_dimension == 3) then - t % filters(t % n_filters) % int_bins = (/ IN_RIGHT, & - OUT_RIGHT, IN_FRONT, OUT_FRONT, IN_TOP, OUT_TOP /) + t % filters(t % n_filters) % int_bins = (/ OUT_LEFT, & + OUT_RIGHT, OUT_BACK, OUT_FRONT, OUT_BOTTOM, OUT_TOP /) end if t % find_filter(FILTER_SURFACE) = t % n_filters diff --git a/src/mesh.F90 b/src/mesh.F90 index 4ec84345ba..0543eaa9f3 100644 --- a/src/mesh.F90 +++ b/src/mesh.F90 @@ -93,29 +93,20 @@ contains ! use in a TallyObject results array !=============================================================================== - pure function mesh_indices_to_bin(m, ijk, surface_current) result(bin) + pure function mesh_indices_to_bin(m, ijk) result(bin) type(RegularMesh), intent(in) :: m integer, intent(in) :: ijk(:) - logical, intent(in), optional :: surface_current integer :: bin integer :: n_y ! number of mesh cells in y direction integer :: n_z ! number of mesh cells in z direction - if (present(surface_current)) then - n_y = m % dimension(2) + 1 - else - n_y = m % dimension(2) - end if + n_y = m % dimension(2) if (m % n_dimension == 2) then bin = (ijk(1) - 1)*n_y + ijk(2) elseif (m % n_dimension == 3) then - if (present(surface_current)) then - n_z = m % dimension(3) + 1 - else - n_z = m % dimension(3) - end if + n_z = m % dimension(3) bin = (ijk(1) - 1)*n_y*n_z + (ijk(2) - 1)*n_z + ijk(3) end if diff --git a/src/output.F90 b/src/output.F90 index 22733a3051..efe75ad8ba 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1047,31 +1047,17 @@ contains ! Left Surface matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i-1, j, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_RIGHT + mesh_indices_to_bin(m, (/ i, j, k /)) + matching_bins(i_filter_surf) = OUT_LEFT filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Outgoing Current to Left", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) - matching_bins(i_filter_surf) = OUT_RIGHT - filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current from Left", & - to_str(t % results(1,filter_index) % sum), & - trim(to_str(t % results(1,filter_index) % sum_sq)) - ! Right Surface matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_RIGHT - filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current from Right", & - to_str(t % results(1,filter_index) % sum), & - trim(to_str(t % results(1,filter_index) % sum_sq)) - + mesh_indices_to_bin(m, (/ i, j, k /)) matching_bins(i_filter_surf) = OUT_RIGHT filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & @@ -1081,31 +1067,17 @@ contains ! Back Surface matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j-1, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_FRONT + mesh_indices_to_bin(m, (/ i, j, k /)) + matching_bins(i_filter_surf) = OUT_BACK filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Outgoing Current to Back", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) - matching_bins(i_filter_surf) = OUT_FRONT - filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current from Back", & - to_str(t % results(1,filter_index) % sum), & - trim(to_str(t % results(1,filter_index) % sum_sq)) - ! Front Surface matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_FRONT - filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current from Front", & - to_str(t % results(1,filter_index) % sum), & - trim(to_str(t % results(1,filter_index) % sum_sq)) - + mesh_indices_to_bin(m, (/ i, j, k /)) matching_bins(i_filter_surf) = OUT_FRONT filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & @@ -1115,31 +1087,17 @@ contains ! Bottom Surface matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k-1 /) + 1, .true.) - matching_bins(i_filter_surf) = IN_TOP + mesh_indices_to_bin(m, (/ i, j, k /)) + matching_bins(i_filter_surf) = OUT_BOTTOM filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & "Outgoing Current to Bottom", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) - matching_bins(i_filter_surf) = OUT_TOP - filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current from Bottom", & - to_str(t % results(1,filter_index) % sum), & - trim(to_str(t % results(1,filter_index) % sum_sq)) - ! Top Surface matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_TOP - filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 - write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Incoming Current from Top", & - to_str(t % results(1,filter_index) % sum), & - trim(to_str(t % results(1,filter_index) % sum_sq)) - + mesh_indices_to_bin(m, (/ i, j, k /)) matching_bins(i_filter_surf) = OUT_TOP filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & diff --git a/src/tally.F90 b/src/tally.F90 index 94143184ae..5f92682162 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -2819,10 +2819,10 @@ contains if (uvw(3) > 0) then do j = ijk0(3), ijk1(3) - 1 ijk0(3) = j - if (all(ijk0 >= 0) .and. all(ijk0 <= m % dimension)) then + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then matching_bins(i_filter_surf) = OUT_TOP matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0 + 1, .true.) + mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & @@ -2830,12 +2830,12 @@ contains end if end do else - do j = ijk0(3) - 1, ijk1(3), -1 + do j = ijk0(3), ijk1(3) + 1, -1 ijk0(3) = j - if (all(ijk0 >= 0) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = IN_TOP + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then + matching_bins(i_filter_surf) = OUT_BOTTOM matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0 + 1, .true.) + mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & @@ -2849,10 +2849,10 @@ contains if (uvw(2) > 0) then do j = ijk0(2), ijk1(2) - 1 ijk0(2) = j - if (all(ijk0 >= 0) .and. all(ijk0 <= m % dimension)) then + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then matching_bins(i_filter_surf) = OUT_FRONT matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0 + 1, .true.) + mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & @@ -2860,12 +2860,12 @@ contains end if end do else - do j = ijk0(2) - 1, ijk1(2), -1 + do j = ijk0(2), ijk1(2) + 1, -1 ijk0(2) = j - if (all(ijk0 >= 0) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = IN_FRONT + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then + matching_bins(i_filter_surf) = OUT_BACK matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0 + 1, .true.) + mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & @@ -2879,10 +2879,10 @@ contains if (uvw(1) > 0) then do j = ijk0(1), ijk1(1) - 1 ijk0(1) = j - if (all(ijk0 >= 0) .and. all(ijk0 <= m % dimension)) then + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then matching_bins(i_filter_surf) = OUT_RIGHT matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0 + 1, .true.) + mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & @@ -2890,12 +2890,12 @@ contains end if end do else - do j = ijk0(1) - 1, ijk1(1), -1 + do j = ijk0(1), ijk1(1) + 1, -1 ijk0(1) = j - if (all(ijk0 >= 0) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = IN_RIGHT + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then + matching_bins(i_filter_surf) = OUT_LEFT matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0 + 1, .true.) + mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:t%n_filters) - 1) * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & @@ -2946,67 +2946,67 @@ contains if (uvw(1) > 0) then ! Crossing into right mesh cell -- this is treated as outgoing ! current from (i,j,k) - if (all(ijk0 >= 0) .and. all(ijk0 <= m % dimension)) then + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then matching_bins(i_filter_surf) = OUT_RIGHT matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0 + 1, .true.) + mesh_indices_to_bin(m, ijk0) end if ijk0(1) = ijk0(1) + 1 xyz_cross(1) = xyz_cross(1) + m % width(1) else - ! Crossing into left mesh cell -- this is treated as incoming - ! current in (i-1,j,k) + ! Crossing into left mesh cell -- this is treated as outgoing + ! current in (i,j,k) + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then + matching_bins(i_filter_surf) = OUT_LEFT + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + end if ijk0(1) = ijk0(1) - 1 xyz_cross(1) = xyz_cross(1) - m % width(1) - if (all(ijk0 >= 0) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = IN_RIGHT - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0 + 1, .true.) - end if end if elseif (distance == d(2)) then if (uvw(2) > 0) then ! Crossing into front mesh cell -- this is treated as outgoing ! current in (i,j,k) - if (all(ijk0 >= 0) .and. all(ijk0 <= m % dimension)) then + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then matching_bins(i_filter_surf) = OUT_FRONT matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0 + 1, .true.) + mesh_indices_to_bin(m, ijk0) end if ijk0(2) = ijk0(2) + 1 xyz_cross(2) = xyz_cross(2) + m % width(2) else - ! Crossing into back mesh cell -- this is treated as incoming - ! current in (i,j-1,k) + ! Crossing into back mesh cell -- this is treated as outgoing + ! current in (i,j,k) + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then + matching_bins(i_filter_surf) = OUT_BACK + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + end if ijk0(2) = ijk0(2) - 1 xyz_cross(2) = xyz_cross(2) - m % width(2) - if (all(ijk0 >= 0) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = IN_FRONT - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0 + 1, .true.) - end if end if else if (distance == d(3)) then if (uvw(3) > 0) then ! Crossing into top mesh cell -- this is treated as outgoing ! current in (i,j,k) - if (all(ijk0 >= 0) .and. all(ijk0 <= m % dimension)) then + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then matching_bins(i_filter_surf) = OUT_TOP matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0 + 1, .true.) + mesh_indices_to_bin(m, ijk0) end if ijk0(3) = ijk0(3) + 1 xyz_cross(3) = xyz_cross(3) + m % width(3) else - ! Crossing into bottom mesh cell -- this is treated as incoming - ! current in (i,j,k-1) + ! Crossing into bottom mesh cell -- this is treated as outgoing + ! current in (i,j,k) + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then + matching_bins(i_filter_surf) = OUT_BOTTOM + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + end if ijk0(3) = ijk0(3) - 1 xyz_cross(3) = xyz_cross(3) - m % width(3) - if (all(ijk0 >= 0) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = IN_TOP - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0 + 1, .true.) - end if end if end if diff --git a/src/trigger.F90 b/src/trigger.F90 index ed362154b4..7d488acb79 100644 --- a/src/trigger.F90 +++ b/src/trigger.F90 @@ -324,10 +324,11 @@ contains matching_bins(i_filter_ein) = l end if - ! Left Surface matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i-1, j, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_RIGHT + mesh_indices_to_bin(m, (/ i, j, k /) + 1) + + ! Left Surface + matching_bins(i_filter_surf) = OUT_LEFT filter_index = & sum((matching_bins(1:t % n_filters) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) @@ -339,33 +340,7 @@ contains end if trigger % variance = std_dev**2 - matching_bins(i_filter_surf) = OUT_RIGHT - filter_index = & - sum((matching_bins(1:t % n_filters) - 1) * t % stride) + 1 - call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) - if (trigger % std_dev < std_dev) then - trigger % std_dev = std_dev - end if - if (trigger % rel_err < rel_err) then - trigger % rel_err = rel_err - end if - trigger % variance = trigger % std_dev**2 - ! Right Surface - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_RIGHT - filter_index = & - sum((matching_bins(1:t % n_filters) - 1) * t % stride) + 1 - call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) - if (trigger % std_dev < std_dev) then - trigger % std_dev = std_dev - end if - if (trigger % rel_err < rel_err) then - trigger % rel_err = rel_err - end if - trigger % variance = trigger % std_dev**2 - matching_bins(i_filter_surf) = OUT_RIGHT filter_index = & sum((matching_bins(1:t % n_filters) - 1) * t % stride) + 1 @@ -379,22 +354,7 @@ contains trigger % variance = trigger % std_dev**2 ! Back Surface - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j-1, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_FRONT - filter_index = & - sum((matching_bins(1:t % n_filters) - 1) * t % stride) + 1 - call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) - if (trigger % std_dev < std_dev) then - trigger % std_dev = std_dev - end if - if (trigger % rel_err < rel_err) then - trigger % rel_err = rel_err - end if - trigger % variance = trigger % std_dev**2 - - - matching_bins(i_filter_surf) = OUT_FRONT + matching_bins(i_filter_surf) = OUT_BACK filter_index = & sum((matching_bins(1:t % n_filters) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) @@ -407,20 +367,6 @@ contains trigger % variance = trigger % std_dev**2 ! Front Surface - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_FRONT - filter_index = & - sum((matching_bins(1:t % n_filters) - 1) * t % stride) + 1 - call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) - if (trigger % std_dev < std_dev) then - trigger % std_dev = std_dev - end if - if (trigger % rel_err < rel_err) then - trigger % rel_err = rel_err - end if - trigger % variance = trigger % std_dev**2 - matching_bins(i_filter_surf) = OUT_FRONT filter_index = & sum((matching_bins(1:t % n_filters) - 1) * t % stride) + 1 @@ -434,21 +380,7 @@ contains trigger % variance = trigger % std_dev**2 ! Bottom Surface - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k-1 /) + 1, .true.) - matching_bins(i_filter_surf) = IN_TOP - filter_index = & - sum((matching_bins(1:t % n_filters) - 1) * t % stride) + 1 - call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) - if (trigger % std_dev < std_dev) then - trigger % std_dev = std_dev - end if - if (trigger % rel_err < rel_err) then - trigger % rel_err = rel_err - end if - trigger % variance = trigger % std_dev**2 - - matching_bins(i_filter_surf) = OUT_TOP + matching_bins(i_filter_surf) = OUT_BOTTOM filter_index = & sum((matching_bins(1:t % n_filters) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) @@ -461,20 +393,6 @@ contains trigger % variance = trigger % std_dev**2 ! Top Surface - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /) + 1, .true.) - matching_bins(i_filter_surf) = IN_TOP - filter_index = & - sum((matching_bins(1:t % n_filters) - 1) * t % stride) + 1 - call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) - if (trigger % std_dev < std_dev) then - trigger % std_dev = std_dev - end if - if (trigger % rel_err < rel_err) then - trigger % rel_err = rel_err - end if - trigger % variance = trigger % std_dev**2 - matching_bins(i_filter_surf) = OUT_TOP filter_index = & sum((matching_bins(1:t % n_filters) - 1) * t % stride) + 1 From 1f1dab1733113d32b21d45ee7f00d52e952ce48d Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 2 Aug 2016 08:15:45 -0400 Subject: [PATCH 021/168] removed kinetics module --- openmc/kinetics/__init__.py | 2 - openmc/kinetics/clock.py | 117 ------- openmc/kinetics/solver.py | 638 ------------------------------------ 3 files changed, 757 deletions(-) delete mode 100644 openmc/kinetics/__init__.py delete mode 100644 openmc/kinetics/clock.py delete mode 100644 openmc/kinetics/solver.py diff --git a/openmc/kinetics/__init__.py b/openmc/kinetics/__init__.py deleted file mode 100644 index 0ccd7e882f..0000000000 --- a/openmc/kinetics/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from openmc.kinetics.clock import * -from openmc.kinetics.solver import * diff --git a/openmc/kinetics/clock.py b/openmc/kinetics/clock.py deleted file mode 100644 index 9df266e1d7..0000000000 --- a/openmc/kinetics/clock.py +++ /dev/null @@ -1,117 +0,0 @@ - -import copy -import numpy as np - -TIME_POINTS = ['START', - 'PREVIOUS_OUT', - 'PREVIOUS_IN', - 'CURRENT', - 'FORWARD_IN', - 'FORWARD_OUT', - 'END'] - -class Clock(object): - - def __init__(self, start=0., end=3., dt_outer=1.e-1, dt_inner=1.e-2): - - # Initialize coordinates - self.dt_outer = dt_outer - self.dt_inner = dt_inner - - # Create a dictionary of clock times - self._times = {} - for t in TIME_POINTS: - self._times[t] = start - - # Reset the end time - self._times['END'] = end - - - def __deepcopy__(self, memo): - - existing = memo.get(id(self)) - - # If this is the first time we have tried to copy this object, create a copy - if existing is None: - - clone = type(self).__new__(type(self)) - - memo[id(self)] = clone - - return clone - - # If this object has been copied before, return the first copy made - else: - return existing - - def __repr__(self): - - string = 'Clock\n' - string += '{0: <24}{1}{2}\n'.format('\tdt inner', '=\t', self.dt_inner) - string += '{0: <24}{1}{2}\n'.format('\tdt outer', '=\t', self.dt_outer) - - for t in TIME_POINTS: - string += '{0: <24}{1}{2}\n'.format('\tTime ' + t, '=\t', self.times[t]) - - return string - - @property - def dt_inner(self): - return self._dt_inner - - @property - def dt_outer(self): - return self._dt_outer - - @property - def times(self): - return self._times - - @dt_inner.setter - def dt_inner(self, dt_inner): - self._dt_inner = np.float64(dt_inner) - - @dt_outer.setter - def dt_outer(self, dt_outer): - self._dt_outer = np.float64(dt_outer) - - @times.setter - def times(self, times): - self._times = np.float64(times) - - def take_outer_step(self): - """Take an outer time step and reset all the inner time step values - to the starting point for the outer time step. - - """ - - self.times['PREVIOUS_OUT'] = self.times['FORWARD_OUT'] - self.times['PREVIOUS_IN'] = self.times['FORWARD_OUT'] - self.times['FORWARD_IN'] = self.times['FORWARD_OUT'] - self.times['CURRENT'] = self.times['FORWARD_OUT'] - - if (self.times['END'] > self.times['FORWARD_OUT'] + self.dt_outer): - self.times['FORWARD_OUT'] = self.times['END'] - else: - self.times['FORWARD_OUT'] = self.times['FORWARD_OUT'] + self.dt_outer - - def take_inner_step(self): - """Take an inner time step. - - """ - self.times['PREVIOUS_IN'] = self.times['FORWARD_IN'] - self.times['CURRENT'] = self.times['FORWARD_IN'] - - if (self.times['FORWARD_OUT'] > self.times['FORWARD_IN'] + self.dt_inner): - self.times['FORWARD_IN'] = self.times['FORWARD_OUT'] - else: - self.times['FORWARD_IN'] = self.times['FORWARD_IN'] + self.dt_inner - - def reset_to_previous_outer(self): - """Reset the time values to the previous outer time. - - """ - - self.times['PREVIOUS_IN'] = self.times['PREVIOUS_IN'] - self.times['FORWARD_IN'] = self.times['PREVIOUS_IN'] - self.times['CURRENT'] = self.times['PREVIOUS_IN'] diff --git a/openmc/kinetics/solver.py b/openmc/kinetics/solver.py deleted file mode 100644 index a71907a1d3..0000000000 --- a/openmc/kinetics/solver.py +++ /dev/null @@ -1,638 +0,0 @@ -from collections import OrderedDict -from xml.etree import ElementTree as ET - -import openmc -import openmc.kinetics -from openmc.clean_xml import * -from openmc.checkvalue import check_type -from openmc.kinetics.clock import TIME_POINTS -import numpy as np - - -class Solver(object): - """Solver to propagate the neutron flux and power forward in time. - - Attributes - ---------- - mesh : openmc.mesh.Mesh - Mesh which specifies the dimensions of coarse mesh. - - geometry : openmc.geometry.Geometry - Geometry which describes the problem being solved. - - settings_file : openmc.settings.SettingsFile - Settings file describing the general settings for each simulation. - - materials_file : openmc.materials.MaterialsFile - Materials file containing the materials info for each simulation. - - executor : openmc.executor.Executor - Executor object for executing OpenMC simulation. - - clock : openmc.kinetics.Clock - Clock object. - - energy_groups : openmc.mgxs.groups.EnergyGroups - EnergyGroups which specifies the energy groups structure. - - A : np.matrix - Numpy matrix used for storing the destruction terms. - - M : np.matrix - Numpy matrix used for storing the production terms. - - AM : np.matrix - Numpy matrix used for storing the combined production/destruction terms. - - flux : np.array - Numpy array used to store the flux. - - amplitude : np.array - Numpy array used to store the amplitude. - - shape : np.array - Numpy array used to store the shape. - - source : np.array - Numpy array used to store the source. - - power : np.array - Numpy array used to store the power. - - precursor_conc : np.array - Numpy array used to store the precursor concentrations. - - sigma_a : OrderedDict of openmc.MGXS.AbsorptionXS - MGXS absorption multigroup cross-sections. - - nu_sigma_f : OrderedDict of openmc.MGXS.NuFissionXS - MGXS nu-fission multigroup cross-sections. - - kappa_sigma_f : OrderedDict of openmc.MGXS.NuFissionXS - MGXS nu-fission multigroup cross-sections. - - dif_coef : OrderedDict of openmc.MGXS.DiffusionCoefficientXS - MGXS multigroup diffusion coefficients. - - beta : OrderedDict of openmc.MGXS.delayed.Beta - MGXS multigroup delayed neutron fractions. - - chi_prompt : OrderedDict of openmc.MGXS.delayed.ChiPrompt - MGXS multigroup prompt neutron spectrums. - - chi_delayed : OrderedDict of openmc.MGXS.delayed.ChiDelayed - MGXS multigroup delayed neutron spectrums. - - velocity : OrderedDict of openmc.MGXS.Velocity - MGXS multigroup velocities. - - nu_sigma_s : OrderedDict of openmc.MGXS.NuScatterMatrixXS - MGXS multigroup nu-scatter matrix. - - flux_xs : OrderedDict openmc.MGXS.Flux - MGXS multigroup flux. - - k_eff_0 : float - The initial eigenvalue. - - Methods - ------- - - initialize_xs() - take_outer_step() - take_inner_step() - solve() - - extract_xs() - 2 normalize_flux() - broadcast_to_all() - broadcast_to_one() - - compute_shape() - integrate_precursor_conc() - 3 compute_initial_precursor_conc() - 1 compute_power() - construct_A() - construct_M() - construct_AM() - interpolate_xs() - - To Do - ----- - 1) Create getters and setters for all attributes - 2) Create method to generate initialize xs - 3) Create method to compute flux - 4) Create method to compute initial precursor concentrations - 5) Create method to compute the initial power - - """ - - def __init__(self): - - # Initialize Solver class attributes - self._mesh = None - self._geometry = None - self._settings_file = None - self._materials_file = None - self._executor = openmc.Executor() - self._statepoint = None - self._summary = None - self._clock = None - self._energy_groups = None - self._A = None - self._M = None - self._AM = None - self._flux = None - self._amplitude = None - self._shape = None - self._source = None - self._power = None - self._precursor_conc = None - self._sigma_a = None - self._nu_sigma_f = None - self._kappa_sigma_f = None - self._dif_coef = None - self._beta = None - self._chi_prompt = None - self._chi_delayed = None - self._velocity = None - self._nu_sigma_s = None - self._flux_xs = None - self._decay_constants = None - self._k_eff_0 = None - - @property - def mesh(self): - return self._mesh - - @property - def geometry(self): - return self._geometry - - @property - def settings_file(self): - return self._settings_file - - @property - def materials_file(self): - return self._materials_file - - @property - def executor(self): - return self._executor - - @property - def statepoint(self): - return self._statepoint - - @property - def summary(self): - return self._summary - - @property - def clock(self): - return self._clock - - @property - def energy_groups(self): - return self._energy_groups - - @property - def A(self): - return self._A - - @property - def M(self): - return self._M - - @property - def AM(self): - return self._AM - - @property - def flux(self): - return self._flux - - @property - def amplitude(self): - return self._amplitude - - @property - def shape(self): - return self._shape - - @property - def source(self): - return self._source - - @property - def power(self): - return self._power - - @property - def precursor_conc(self): - return self._precursor_conc - - @property - def sigma_a(self): - return self._sigma_a - - @property - def nu_sigma_f(self): - return self._nu_sigma_f - - @property - def kappa_sigma_f(self): - return self._kappa_sigma_f - - @property - def dif_coef(self): - return self._dif_coef - - @property - def beta(self): - return self._beta - - @property - def chi_prompt(self): - return self._chi_prompt - - @property - def chi_delayed(self): - return self._chi_delayed - - @property - def velocity(self): - return self._velocity - - @property - def nu_sigma_s(self): - return self._nu_sigma_s - - @property - def flux_xs(self): - return self._flux_xs - - @property - def decay_constants(self): - return self._decay_constants - - @property - def k_eff_0(self): - return self._k_eff_0 - - @mesh.setter - def mesh(self, mesh): - self._mesh = mesh - - @geometry.setter - def geometry(self, geometry): - self._geometry = geometry - - @settings_file.setter - def settings_file(self, settings_file): - self._settings_file = settings_file - - @materials_file.setter - def materials_file(self, materials_file): - self._materials_file = materials_file - - @executor.setter - def executor(self, exectuor): - self._executor = executor - - @statepoint.setter - def statepoint(self, statepoint): - self._statepoint = statepoint - - @summary.setter - def summary(self, summary): - self._summary = summary - - @clock.setter - def clock(self, clock): - self._clock = clock - - @energy_groups.setter - def energy_groups(self, energy_groups): - self._energy_groups = energy_groups - - # Initialize the arrays - ng = energy_groups.num_groups - self._flux = np.zeros(ng) - self._amplitude = np.zeros(ng) - self._shape = np.zeros(ng) - self._source = np.zeros(ng) - self._power = np.zeros(ng) - - @A.setter - def A(self): - self._A = A - - @M.setter - def M(self, M): - self._M = M - - @AM.setter - def AM(self, AM): - self._AM = AM - - @flux.setter - def flux(self, flux): - self._flux = flux - - @amplitude.setter - def amplitude(self, amplitude): - self._amplitude = amplitude - - @shape.setter - def shape(self, shape): - self._shape = shape - - @source.setter - def source(self, source): - self._source = source - - @power.setter - def power(self, power): - self._power = power - - @precursor_conc.setter - def precursor_conc(self, precursor_conc): - self._precursor_conc = precursor_conc - - @sigma_a.setter - def sigma_a(self, sigma_a): - self._sigma_a = sigma_a - - @nu_sigma_f.setter - def nu_sigma_f(self, nu_sigma_f): - self._nu_sigma_f = nu_sigma_f - - @kappa_sigma_f.setter - def kappa_sigma_f(self, kappa_sigma_f): - self._kappa_sigma_f = kappa_sigma_f - - @dif_coef.setter - def dif_coef(self, dif_coef): - self._dif_coef = dif_coef - - @beta.setter - def beta(self, beta): - self._beta = beta - - @chi_prompt.setter - def chi_prompt(self, chi_prompt): - self._chi_prompt = chi_prompt - - @chi_delayed.setter - def chi_delayed(self, chi_delayed): - self._chi_delayed - - @velocity.setter - def velocity(self, velocity): - self._velocity = velocity - - @nu_sigma_s.setter - def nu_sigma_s(self, nu_sigma_s): - self._nu_sigma_s = nu_sigma_s - - @flux_xs.setter - def flux_xs(self, flux_xs): - self._flux_xs = flux_xs - - @decay_constants.setter - def decay_constants(self, decay_constants): - self._decay_constants = decay_constants - - @k_eff_0.setter - def k_eff_0(self, k_eff_0): - self._k_eff_0 = k_eff_0 - - def initialize_xs(self): - """Initialize all the tallies for the problem. - - """ - - self._sigma_a = {} - self._nu_sigma_f = {} - self._kappa_sigma_f = {} - self._dif_coef = {} - self._beta = {} - self._chi_prompt = {} - self._chi_delayed = {} - self._velocity = {} - self._nu_sigma_s = {} - self._flux_xs = {} - self._precursor_conc = {} - - self._decay_constants = openmc.Tally(name='decay constants') - self._decay_constants._derived = True - self._decay_constants.num_score_bins = 1 - self._decay_constants.add_score('None') - self._decay_constants._mean = np.array([0.012467, 0.028292, 0.042524,\ - 0.133042, 0.292467, 0.666488,\ - 1.634781, 3.554600]) - self._decay_constants._mean = np.reshape(self._decay_constants._mean, (8,1,1)) - self._decay_constants._std_dev = np.array([0 for i in range(8)]) - self._decay_constants._std_dev = np.reshape(self._decay_constants._std_dev, (8,1,1)) - self._decay_constants.estimator = 'analog' - self._decay_constants.add_filter(openmc.Filter('delayedgroup', range(1,9))) - self._decay_constants._nuclides = ['total'] - - # FIXME: replace domain with mesh - # Get the cell in the geometry - cells = self.geometry.root_universe.get_all_cells() - cell = cells.values()[0] - - global TIME_POINTS - for t in TIME_POINTS: - print 'computing tallies for time: ' + t - self._sigma_a[t] = openmc.mgxs.AbsorptionXS(name='sigma a', - domain=cell, domain_type='cell', groups=self.energy_groups) - self._nu_sigma_f[t] = openmc.mgxs.NuFissionXS(name='nu sigma f', - domain=cell, domain_type='cell', groups=self.energy_groups) - self._kappa_sigma_f[t] = openmc.mgxs.KappaFissionXS(name='kappa fission', - domain=cell, domain_type='cell', groups=self.energy_groups) - self._dif_coef[t] = openmc.mgxs.DiffusionCoefficient(name='dif coef', - domain=cell, domain_type='cell', groups=self.energy_groups) - self._beta[t] = openmc.mgxs.Beta(name='beta', - domain=cell, domain_type='cell', groups=self.energy_groups) - self._chi_prompt[t] = openmc.mgxs.ChiPrompt(name='chi prompt', - domain=cell, domain_type='cell', groups=self.energy_groups) - self._chi_delayed[t] = openmc.mgxs.ChiDelayed(name='chi delayed', - domain=cell, domain_type='cell', groups=self.energy_groups) - self._velocity[t] = openmc.mgxs.Velocity(name='velocity', - domain=cell, domain_type='cell', groups=self.energy_groups) - self._nu_sigma_s[t] = openmc.mgxs.NuScatterMatrixXS(name='nu scatter', - domain=cell, domain_type='cell', groups=self.energy_groups) - self._flux_xs[t] = openmc.mgxs.Flux(name='flux', - domain=cell, domain_type='cell', groups=self.energy_groups) - - - def generate_tallies_file(self, time): - """Initialize the tallies file. - - """ - - tallies_file = openmc.TalliesFile() - - # Add absorption tallies to the tallies file - for tally in self._sigma_a[time].tallies.values(): - tallies_file.add_tally(tally, merge=True) - - # Add nu-sigma-f tallies to the tallies file - for tally in self._nu_sigma_f[time].tallies.values(): - tallies_file.add_tally(tally, merge=True) - - # Add kappa-sigma-f tallies to the tallies file - for tally in self._kappa_sigma_f[time].tallies.values(): - tallies_file.add_tally(tally, merge=True) - - # Add dif-coef tallies to the tallies file - for tally in self._dif_coef[time].tallies.values(): - tallies_file.add_tally(tally, merge=True) - - # Add beta tallies to the tallies file - for tally in self._beta[time].tallies.values(): - tallies_file.add_tally(tally, merge=True) - - # Add chi prompt tallies to the tallies file - for tally in self._chi_prompt[time].tallies.values(): - tallies_file.add_tally(tally, merge=True) - - # Add chi delayed tallies to the tallies file - for tally in self._chi_delayed[time].tallies.values(): - tallies_file.add_tally(tally, merge=False) - - # Add velocity tallies to the tallies file - for tally in self._velocity[time].tallies.values(): - tallies_file.add_tally(tally, merge=True) - - # Add nu-sigma-s tallies to the tallies file - for tally in self._nu_sigma_s[time].tallies.values(): - tallies_file.add_tally(tally, merge=True) - - # Add flux tallies to the tallies file - for tally in self._flux_xs[time].tallies.values(): - tallies_file.add_tally(tally, merge=True) - - # Export to "tallies.xml" - tallies_file.export_to_xml() - - def extract_xs(self, time): - - filename = 'statepoint.' + str(self.settings_file.batches) + '.h5' - self.statepoint = openmc.StatePoint(filename) - self.summary = openmc.Summary('summary.h5') - self.statepoint.link_with_summary(self.summary) - - # load xs from statepoint - self._sigma_a[time].load_from_statepoint(self.statepoint) - self._nu_sigma_f[time].load_from_statepoint(self.statepoint) - self._kappa_sigma_f[time].load_from_statepoint(self.statepoint) - self._dif_coef[time].load_from_statepoint(self.statepoint) - self._beta[time].load_from_statepoint(self.statepoint) - self._chi_prompt[time].load_from_statepoint(self.statepoint) - self._chi_delayed[time].load_from_statepoint(self.statepoint) - self._velocity[time].load_from_statepoint(self.statepoint) - self._nu_sigma_s[time].load_from_statepoint(self.statepoint) - self._flux_xs[time].load_from_statepoint(self.statepoint) - self.k_eff_0 = self.statepoint.k_combined[0] - - # compute the xs - self._sigma_a[time].compute_xs() - self._nu_sigma_f[time].compute_xs() - self._kappa_sigma_f[time].compute_xs() - self._dif_coef[time].compute_xs() - self._beta[time].compute_xs() - self._chi_prompt[time].compute_xs() - self._chi_delayed[time].compute_xs() - self._velocity[time].compute_xs() - self._nu_sigma_s[time].compute_xs() - self._flux_xs[time].compute_xs() - - # extract the flux - #for g in range(self._energy_groups.num_groups): - # self._flux[g] = self._flux_xs[time].xs_tally.mean[g][0][0] - - def print_xs(self, time): - - # print the xs - self._sigma_a[time].print_xs() - self._nu_sigma_f[time].print_xs() - self._kappa_sigma_f[time].print_xs() - self._dif_coef[time].print_xs() - self._beta[time].print_xs() - self._chi_prompt[time].print_xs() - self._chi_delayed[time].print_xs() - self._velocity[time].print_xs() - self._nu_sigma_s[time].print_xs() - self._flux_xs[time].print_xs() - - def compute_shape(self, time): - - geometry_file = openmc.GeometryFile() - geometry_file.geometry = self.geometry - - # Create the xml files - self._materials_file.export_to_xml() - geometry_file.export_to_xml() - self._settings_file.export_to_xml() - self.generate_tallies_file(time) - - # Run OpenMC - self.executor.run_simulation(mpi_procs=4) - - def compute_power(self, time): - - self.power = self._kappa_sigma_f[time].xs_tally * \ - self._flux_xs[time].xs_tally - - def compute_initial_precursor_conc(self, time): - - self.precursor_conc[time] = self.nu_sigma_f[time].xs_tally \ - * self.flux_xs[time].xs_tally - self.precursor_conc[time] = self.precursor_conc[time].\ - summation(filter_type='energy', remove_filter=True) - beta = self.beta[time].xs_tally.\ - summation(filter_type='energy', remove_filter=True) - self.precursor_conc[time] = beta \ - * self.precursor_conc[time] - - self.precursor_conc[time] = self.precursor_conc[time] / self.k_eff_0 - - print self.precursor_conc[time] - print self._decay_constants - - self.precursor_conc[time] = self.precursor_conc[time] / self._decay_constants - print self.precursor_conc[time] - - - def compute_forward_flux(self, time, time_next): - - dt_v = self.clock.dt_outer * self.velocity - - fission_rate = self.nu_sigma_f[time].xs_tally \ - * self.flux_xs[time].xs_tally - - fission_rate = fission_rate.summation(filter_type='energy', remove_filter=True) - - self.flux_xs[time_next] = [self.flux_xs[time] + (1 - self.beta) \ - / self.k_eff_0 * fission_rate + \ - - self.precursor_conc[time] = self.nu_sigma_f[time].xs_tally \ - * self.flux_xs[time].xs_tally - self.precursor_conc[time] = self.precursor_conc[time].\ - summation(filter_type='energy', remove_filter=True) - beta = self.beta[time].xs_tally.\ - summation(filter_type='energy', remove_filter=True) - self.precursor_conc[time] = beta \ - * self.precursor_conc[time] - - self.precursor_conc[time] = self.precursor_conc[time] / self.k_eff_0 - - print self.precursor_conc[time] - print self._decay_constants - - inv_decay_constants = 1.0 / self._decay_constants - inv_decay_constants.name = 'inverse decay constants' - self.precursor_conc[time] = inv_decay_constants * self.precursor_conc[time] - print self.precursor_conc[time] From 84cfd2d6a940920473283de15690160d6de59b58 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Tue, 2 Aug 2016 14:10:32 -0500 Subject: [PATCH 022/168] Add MT=458 data library and supporting methods --- data/fission_Q_data_endfb71.h5 | Bin 0 -> 67543 bytes data/get_nndc_data.py | 3 +- openmc/data/fission_energy.py | 195 ++++++++++++++++++++++----------- openmc/data/neutron.py | 3 + scripts/openmc-ace-to-hdf5 | 17 +++ 5 files changed, 155 insertions(+), 63 deletions(-) create mode 100644 data/fission_Q_data_endfb71.h5 diff --git a/data/fission_Q_data_endfb71.h5 b/data/fission_Q_data_endfb71.h5 new file mode 100644 index 0000000000000000000000000000000000000000..89e51b70783034b40ce4e207fdb3e34b5d5d33cc GIT binary patch literal 67543 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 1: + out.form = 'Madland' + out.fragments = Polynomial(energy_release['EFR']) + out.prompt_neutrons = Polynomial(energy_release['ENP']) + out.delayed_neutrons = Polynomial(energy_release['END']) + out.prompt_photons = Polynomial(energy_release['EGP']) + out.delayed_photons = Polynomial(energy_release['EGD']) + out.betas = Polynomial(energy_release['EB']) + out.neutrinos = Polynomial(energy_release['ENU']) + else: + out.form = 'Sher-Beck' + + # EFR and ENP are energy independent. Polynomial is used because it + # has a __call__ attribute that handles Iterable inputs. The + # energy-dependence of END is unspecified in ENDF-102 so assume it + # is independent. + out.fragments = Polynomial((energy_release['EFR'][0])) + out.prompt_photons = Polynomial((energy_release['EGP'][0])) + out.delayed_neutrons = Polynomial((energy_release['END'][0])) + + # EDP, EB, and ENU are linear. + out.delayed_photons = Polynomial((energy_release['EGD'][0], -0.075)) + out.betas = Polynomial((energy_release['EB'][0], -0.075)) + out.neutrinos = Polynomial((energy_release['ENU'][0], -0.105)) + + # Prompt neutrons require nu-data. It is not clear from ENDF-102 + # whether prompt or total nu value should be used, but the delayed + # neutron fraction is so small that the difference is negligible. + # MT=18 (n, fission) might not be available so try MT=19 (n, f) as + # well. + if 18 in incident_neutron.reactions: + nu_prompt = [p for p in incident_neutron[18].products + if p.particle == 'neutron' + and p.emission_mode == 'prompt'] + elif 19 in incident_neutron.reactions: + nu_prompt = [p for p in incident_neutron[19].products + if p.particle == 'neutron' + and p.emission_mode == 'prompt'] + else: + raise ValueError('IncidentNeutron data has no fission ' + 'reaction.') + if len(nu_prompt) == 0: + raise ValueError('Nu data is needed to compute fission energy ' + 'release with the Sher-Beck format.') + if len(nu_prompt) > 1: + raise ValueError('Ambiguous prompt value.') + if not isinstance(nu_prompt[0].yield_, Tabulated1D): + raise TypeError('Sher-Beck fission energy release currently ' + 'only supports Tabulated1D nu data.') + ENP = deepcopy(nu_prompt[0].yield_) + ENP.y = (energy_release['ENP'] + 1.307 * ENP.x + - 8.07 * (ENP.y - ENP.y[0])) + out.prompt_neutrons = ENP + + return out + @classmethod def from_endf(cls, filename, incident_neutron): """Generate fission energy release data from an ENDF file. @@ -327,72 +410,22 @@ class FissionEnergyRelease(object): # Check to make sure this ENDF file matches the expected isomer. ident = identify_nuclide(filename) if ident['Z'] != incident_neutron.atomic_number: - pass + raise ValueError('The atomic number of the ENDF evaluation does ' + 'not match the given IncidentNeutron.') if ident['A'] != incident_neutron.mass_number: - pass + raise ValueError('The atomic mass of the ENDF evaluation does ' + 'not match the given IncidentNeutron.') if ident['LISO'] != incident_neutron.metastable: - pass - if not ident['LIF']: - pass + raise ValueError('The metastable state of the ENDF evaluation does ' + 'not match the given IncidentNeutron.') + if not ident['LFI']: + raise ValueError('The ENDF evaluation is not fissionable.') # Read the 458 data from the ENDF file. value, uncertainty = _extract_458_data(filename) - # Declare the coefficient names. If we only find one value for each of - # these components, then we need to use the Sher-Beck formula for energy - # dependence. Otherwise, it is a polynomial. - labels = ('EFR', 'ENP', 'END', 'EGP', 'EGD', 'EB', 'ENU', 'ER', 'ET') - - # How many coefficients are given for each coefficient? If we only find - # one value for each, then we need to use the Sher-Beck formula for - # energy dependence. Otherwise, it is a polynomial. - n_coeffs = len(value['EFR']) - - out = cls() - if n_coeffs > 1: - out.form = 'Madland' - out.fragments = Polynomial(value['EFR']) - out.prompt_neutrons = Polynomial(value['ENP']) - out.delayed_neutrons = Polynomial(value['END']) - out.prompt_photons = Polynomial(value['EGP']) - out.delayed_photons = Polynomial(value['EGD']) - out.betas = Polynomial(value['EB']) - out.neutrinos = Polynomial(value['ENU']) - else: - out.form = 'Sher-Beck' - - # EFR and ENP are energy independent. Polynomial is used because it - # has a __call__ attribute that handles Iterable inputs. The - # energy-dependence of END is unspecified in ENDF-102 so assume it - # is independent. - out.fragments = Polynomial((value['EFR'][0])) - out.prompt_photons = Polynomial((value['EGP'][0])) - out.delayed_neutrons = Polynomial((value['END'][0])) - - # EDP, EB, and ENU are linear. - out.delayed_photons = Polynomial((value['EGD'][0], -0.075)) - out.betas = Polynomial((value['EB'][0], -0.075)) - out.neutrinos = Polynomial((value['ENU'][0], -0.105)) - - # Prompt neutrons require nu-data. It is not clear from ENDF-102 - # whether prompt or total nu values should be used, but the delayed - # neutron fraction is so small that the difference is negligible. - nu_prompt = [p for p in incident_neutron[18].products - if p.particle == 'neutron' - and p.emission_mode == 'prompt'] - if len(nu_prompt) == 0: - raise ValueError('Nu data is needed to compute fission energy ' - 'release with the Sher-Beck format.') - if len(nu_prompt) > 1: - raise ValueError('Ambiguous prompt nu value.') - if not isinstance(nu_prompt[0].yield_, Tabulated1D): - raise TypeError('Sher-Beck fission energy release currently ' - 'only supports Tabulated1D nu data.') - ENP = deepcopy(nu_prompt[0].yield_) - ENP.y = value['ENP'] + 1.307 * ENP.x - 8.07 * (ENP.y - ENP.y[0]) - out.prompt_neutrons = ENP - - return out + # Build the object. + return cls._from_dictionary(value, incident_neutron) @classmethod def from_hdf5(cls, group): @@ -419,9 +452,9 @@ class FissionEnergyRelease(object): obj.betas = Polynomial(group['betas'].value) obj.neutrinos = Polynomial(group['neutrinos'].value) - if group.attrs['format'] == 'Madland': + if group.attrs['format'].decode() == 'Madland': obj.prompt_neutrons = Polynomial(group['prompt_neutrons'].value) - elif group.attrs['format'] == 'Sher-Beck': + elif group.attrs['format'].decode() == 'Sher-Beck': obj.prompt_neutrons = Tabulated1D.from_hdf5( group['prompt_neutrons']) else: @@ -429,6 +462,44 @@ class FissionEnergyRelease(object): return obj + @classmethod + def from_compact_hdf5(cls, fname, incident_neutron): + """Generate fission energy release data from a small HDF5 library. + + Parameters + ---------- + fname : str + Path to an HDF5 file containing fission energy release data. This + file should have been generated form the + openmc.data.write_compact_458_library function. + + incident_neutron : openmc.data.IncidentNeutron + Corresponding incident neutron dataset + + Returns + ------- + openmc.data.FissionEnergyRelease or None + Fission energy release data for the given nuclide if it is present + in the data file + + """ + + fin = h5py.File(fname, 'r') + + components = [s.decode() for s in fin.attrs['component order']] + + nuclide_name = str(incident_neutron.atomic_number) + nuclide_name += str(incident_neutron.mass_number) + if incident_neutron.metastable != 0: + nuclide_name += '_m' + str(incident_neutron.metastable) + + if nuclide_name not in fin: return None + + data = {c : fin[nuclide_name + '/data'][i, 0, :] + for i, c in enumerate(components)} + + return cls._from_dictionary(data, incident_neutron) + def to_hdf5(self, group): """Write energy release data to an HDF5 group diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 84d9bcb2c6..d2c9290b69 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -52,6 +52,9 @@ class IncidentNeutron(object): Atomic weight ratio of the target nuclide. energy : numpy.ndarray The energy values (MeV) at which reaction cross-sections are tabulated. + fission_energy : None or openmc.data.FissionEnergyRelease + The energy released by fission, tabulated by component (e.g. prompt + neutrons or beta particles) and dependent on incident neutron energy mass_number : int Number of nucleons in the nucleus metastable : int diff --git a/scripts/openmc-ace-to-hdf5 b/scripts/openmc-ace-to-hdf5 index 743cf4a509..90031f0faa 100755 --- a/scripts/openmc-ace-to-hdf5 +++ b/scripts/openmc-ace-to-hdf5 @@ -25,6 +25,13 @@ follows the NNDC data convention (1000*Z + A + 300 + 100*m), or the MCNP data convention (essentially the same as NNDC, except that the first metastable state of Am242 is 95242 and the ground state is 95642). +The optional --fission_energy_release argument will accept an HDF5 file +containing a library of fission energy release (ENDF MF=1 MT=458) data. A +library built from ENDF/B-VII.1 data is released with OpenMC and can be found at +openmc/data/fission_Q_data_endb71.h5. This data is necessary for +'fission-q-prompt' and 'fission-q-recoverable' tallies, but is not needed +otherwise. + """ class CustomFormatter(argparse.ArgumentDefaultsHelpFormatter, @@ -47,6 +54,8 @@ parser.add_argument('--xsdir', help='MCNP xsdir file that lists ' 'ACE libraries') parser.add_argument('--xsdata', help='Serpent xsdata file that lists ' 'ACE libraries') +parser.add_argument('--fission_energy_release', help='HDF5 file containing ' + 'fission energy release data') args = parser.parse_args() if not os.path.isdir(args.destination): @@ -111,6 +120,14 @@ for filename in ace_libraries: # Continuous-energy neutron data neutron = openmc.data.IncidentNeutron.from_ace( table, args.metastable) + + # Fission energy release data, if available + if args.fission_energy_release is not None: + fer = openmc.data.FissionEnergyRelease.from_compact_hdf5( + args.fission_energy_release, neutron) + if fer is not None: + neutron.fission_energy = fer + print(neutron.name) # Determine filename From 7be7c6f29bd0f8d158fa3338dcad04e5783c13c3 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 2 Aug 2016 18:53:44 -0400 Subject: [PATCH 023/168] fixed mgxs library.py to accept MDGXS --- .../pythonapi/examples/mdgxs-part-i.ipynb | 256 +++++++++++------- openmc/mgxs/library.py | 45 ++- openmc/mgxs/mdgxs.py | 54 ++-- openmc/tallies.py | 3 + 4 files changed, 231 insertions(+), 127 deletions(-) diff --git a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb index 2eeeffa3ca..b15ace9519 100644 --- a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb @@ -354,7 +354,7 @@ "\n", "# Instantiate a 1-group EnergyGroups object\n", "one_group = mgxs.EnergyGroups()\n", - "one_group.group_edges = np.array([0., 20.])\n", + "one_group.group_edges = np.array([energy_groups.group_edges[0], energy_groups.group_edges[-1]])\n", "\n", "delayed_groups = mgxs.DelayedGroups()\n", "delayed_groups.groups = range(1,7)" @@ -404,8 +404,8 @@ "chi_prompt = mgxs.ChiPrompt(domain=cell, groups=energy_groups, by_nuclide=True)\n", "prompt_nu_fission = mgxs.PromptNuFissionXS(domain=cell, groups=one_group, by_nuclide=True)\n", "chi_delayed = mgxs.ChiDelayed(domain=cell, energy_groups=energy_groups, by_nuclide=True)\n", - "delayed_nu_fission = mgxs.DelayedNuFissionXS(domain=cell, energy_groups=one_group, delayed_groups=delayed_groups, by_nuclide=True)\n", - "beta = mgxs.Beta(domain=cell, energy_groups=one_group, delayed_groups=delayed_groups, by_nuclide=True)\n", + "delayed_nu_fission = mgxs.DelayedNuFissionXS(domain=cell, energy_groups=energy_groups, delayed_groups=delayed_groups, by_nuclide=True)\n", + "beta = mgxs.Beta(domain=cell, energy_groups=energy_groups, delayed_groups=delayed_groups, by_nuclide=True)\n", "\n", "chi_prompt.nuclides = ['U235', 'Pu239']\n", "prompt_nu_fission.nuclides = ['U235', 'Pu239']\n", @@ -436,7 +436,32 @@ " \tName =\t\n", " \tFilters =\t\n", " \t\tcell\t[1]\n", - " \t\tenergy\t[ 0. 20.]\n", + " \t\tenergy\t[ 1.00000000e-09 1.26765187e-09 1.60694125e-09 2.03704208e-09\n", + " 2.58226019e-09 3.27340695e-09 4.14954043e-09 5.26017266e-09\n", + " 6.66806769e-09 8.45278845e-09 1.07151931e-08 1.35831345e-08\n", + " 1.72186857e-08 2.18272991e-08 2.76694165e-08 3.50751874e-08\n", + " 4.44631267e-08 5.63637656e-08 7.14496326e-08 9.05732601e-08\n", + " 1.14815362e-07 1.45545908e-07 1.84501542e-07 2.33883724e-07\n", + " 2.96483139e-07 3.75837404e-07 4.76430987e-07 6.03948629e-07\n", + " 7.65596607e-07 9.70509967e-07 1.23026877e-06 1.55955250e-06\n", + " 1.97696964e-06 2.50610925e-06 3.17687407e-06 4.02717034e-06\n", + " 5.10505000e-06 6.47142616e-06 8.20351544e-06 1.03992017e-05\n", + " 1.31825674e-05 1.67109061e-05 2.11836114e-05 2.68534445e-05\n", + " 3.40408190e-05 4.31519077e-05 5.47015963e-05 6.93425806e-05\n", + " 8.79022517e-05 1.11429453e-04 1.41253754e-04 1.79060585e-04\n", + " 2.26986485e-04 2.87739841e-04 3.64753947e-04 4.62381021e-04\n", + " 5.86138165e-04 7.43019138e-04 9.41889597e-04 1.19398810e-03\n", + " 1.51356125e-03 1.91866874e-03 2.43220401e-03 3.08318795e-03\n", + " 3.90840896e-03 4.95450191e-03 6.28058359e-03 7.96159350e-03\n", + " 1.00925289e-02 1.27938130e-02 1.62181010e-02 2.05589060e-02\n", + " 2.60615355e-02 3.30369541e-02 4.18793565e-02 5.30884444e-02\n", + " 6.72976656e-02 8.53100114e-02 1.08143395e-01 1.37088177e-01\n", + " 1.73780083e-01 2.20292646e-01 2.79254384e-01 3.53997341e-01\n", + " 4.48745390e-01 5.68852931e-01 7.21107479e-01 9.14113241e-01\n", + " 1.15877736e+00 1.46892628e+00 1.86208714e+00 2.36047823e+00\n", + " 2.99226464e+00 3.79314985e+00 4.80839348e+00 6.09536897e+00\n", + " 7.72680585e+00 9.79489985e+00 1.24165231e+01 1.57398286e+01\n", + " 1.99526231e+01]\n", " \tNuclides =\tU235 Pu239 \n", " \tScores =\t['nu-fission']\n", " \tEstimator =\ttracklength), ('delayed-nu-fission', Tally\n", @@ -445,7 +470,32 @@ " \tFilters =\t\n", " \t\tcell\t[1]\n", " \t\tdelayedgroup\t[1 2 3 4 5 6]\n", - " \t\tenergy\t[ 0. 20.]\n", + " \t\tenergy\t[ 1.00000000e-09 1.26765187e-09 1.60694125e-09 2.03704208e-09\n", + " 2.58226019e-09 3.27340695e-09 4.14954043e-09 5.26017266e-09\n", + " 6.66806769e-09 8.45278845e-09 1.07151931e-08 1.35831345e-08\n", + " 1.72186857e-08 2.18272991e-08 2.76694165e-08 3.50751874e-08\n", + " 4.44631267e-08 5.63637656e-08 7.14496326e-08 9.05732601e-08\n", + " 1.14815362e-07 1.45545908e-07 1.84501542e-07 2.33883724e-07\n", + " 2.96483139e-07 3.75837404e-07 4.76430987e-07 6.03948629e-07\n", + " 7.65596607e-07 9.70509967e-07 1.23026877e-06 1.55955250e-06\n", + " 1.97696964e-06 2.50610925e-06 3.17687407e-06 4.02717034e-06\n", + " 5.10505000e-06 6.47142616e-06 8.20351544e-06 1.03992017e-05\n", + " 1.31825674e-05 1.67109061e-05 2.11836114e-05 2.68534445e-05\n", + " 3.40408190e-05 4.31519077e-05 5.47015963e-05 6.93425806e-05\n", + " 8.79022517e-05 1.11429453e-04 1.41253754e-04 1.79060585e-04\n", + " 2.26986485e-04 2.87739841e-04 3.64753947e-04 4.62381021e-04\n", + " 5.86138165e-04 7.43019138e-04 9.41889597e-04 1.19398810e-03\n", + " 1.51356125e-03 1.91866874e-03 2.43220401e-03 3.08318795e-03\n", + " 3.90840896e-03 4.95450191e-03 6.28058359e-03 7.96159350e-03\n", + " 1.00925289e-02 1.27938130e-02 1.62181010e-02 2.05589060e-02\n", + " 2.60615355e-02 3.30369541e-02 4.18793565e-02 5.30884444e-02\n", + " 6.72976656e-02 8.53100114e-02 1.08143395e-01 1.37088177e-01\n", + " 1.73780083e-01 2.20292646e-01 2.79254384e-01 3.53997341e-01\n", + " 4.48745390e-01 5.68852931e-01 7.21107479e-01 9.14113241e-01\n", + " 1.15877736e+00 1.46892628e+00 1.86208714e+00 2.36047823e+00\n", + " 2.99226464e+00 3.79314985e+00 4.80839348e+00 6.09536897e+00\n", + " 7.72680585e+00 9.79489985e+00 1.24165231e+01 1.57398286e+01\n", + " 1.99526231e+01]\n", " \tNuclides =\tU235 Pu239 \n", " \tScores =\t['delayed-nu-fission']\n", " \tEstimator =\ttracklength)])" @@ -531,8 +581,8 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.8.0\n", - " Git SHA1: bc8a346a978644f5b2b21cccb6c5ae7f8397ebee\n", - " Date/Time: 2016-07-31 19:49:00\n", + " Git SHA1: e8819e6a77f2e998dcce937e80fbdd8dd430b667\n", + " Date/Time: 2016-08-02 18:51:52\n", " MPI Processes: 4\n", "\n", " ===========================================================================\n", @@ -619,20 +669,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 7.4000E-01 seconds\n", - " Reading cross sections = 3.9400E-01 seconds\n", - " Total time in simulation = 2.5930E+01 seconds\n", - " Time in transport only = 2.5267E+01 seconds\n", - " Time in inactive batches = 1.5300E+00 seconds\n", - " Time in active batches = 2.4400E+01 seconds\n", - " Time synchronizing fission bank = 6.4500E-01 seconds\n", - " Sampling source sites = 6.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 1.1000E-02 seconds\n", - " Total time elapsed = 2.6689E+01 seconds\n", - " Calculation Rate (inactive) = 32679.7 neutrons/second\n", - " Calculation Rate (active) = 8196.72 neutrons/second\n", + " Total time for initialization = 9.9200E-01 seconds\n", + " Reading cross sections = 3.8400E-01 seconds\n", + " Total time in simulation = 2.8675E+01 seconds\n", + " Time in transport only = 2.8041E+01 seconds\n", + " Time in inactive batches = 1.3230E+00 seconds\n", + " Time in active batches = 2.7352E+01 seconds\n", + " Time synchronizing fission bank = 5.6200E-01 seconds\n", + " Sampling source sites = 3.0000E-03 seconds\n", + " SEND/RECV source sites = 3.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-02 seconds\n", + " Total time for finalization = 9.7000E-02 seconds\n", + " Total time elapsed = 2.9773E+01 seconds\n", + " Calculation Rate (inactive) = 37792.9 neutrons/second\n", + " Calculation Rate (active) = 7312.08 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -755,43 +805,43 @@ "\tNuclide =\tU235\n", "\tCross Sections [cm^-1]:\n", " Delayed Group 1:\t\n", - " Group 1 [0.0 - 20.0 MeV]:\t5.16e-06 +/- 3.38e-01%\n", + " Group 1 [1e-09 - 19.9526231497MeV]:\t5.14e-06 +/- 1.76e-01%\n", "\n", " Delayed Group 2:\t\n", - " Group 1 [0.0 - 20.0 MeV]:\t2.67e-05 +/- 3.38e-01%\n", + " Group 1 [1e-09 - 19.9526231497MeV]:\t2.65e-05 +/- 1.76e-01%\n", "\n", " Delayed Group 3:\t\n", - " Group 1 [0.0 - 20.0 MeV]:\t2.54e-05 +/- 3.38e-01%\n", + " Group 1 [1e-09 - 19.9526231497MeV]:\t2.53e-05 +/- 1.76e-01%\n", "\n", " Delayed Group 4:\t\n", - " Group 1 [0.0 - 20.0 MeV]:\t5.71e-05 +/- 3.38e-01%\n", + " Group 1 [1e-09 - 19.9526231497MeV]:\t5.68e-05 +/- 1.76e-01%\n", "\n", " Delayed Group 5:\t\n", - " Group 1 [0.0 - 20.0 MeV]:\t2.34e-05 +/- 3.38e-01%\n", + " Group 1 [1e-09 - 19.9526231497MeV]:\t2.33e-05 +/- 1.76e-01%\n", "\n", " Delayed Group 6:\t\n", - " Group 1 [0.0 - 20.0 MeV]:\t9.80e-06 +/- 3.38e-01%\n", + " Group 1 [1e-09 - 19.9526231497MeV]:\t9.76e-06 +/- 1.76e-01%\n", "\n", "\n", "\tNuclide =\tPu239\n", "\tCross Sections [cm^-1]:\n", " Delayed Group 1:\t\n", - " Group 1 [0.0 - 20.0 MeV]:\t1.17e-06 +/- 3.00e-01%\n", + " Group 1 [1e-09 - 19.9526231497MeV]:\t1.16e-06 +/- 1.90e-01%\n", "\n", " Delayed Group 2:\t\n", - " Group 1 [0.0 - 20.0 MeV]:\t7.60e-06 +/- 3.00e-01%\n", + " Group 1 [1e-09 - 19.9526231497MeV]:\t7.58e-06 +/- 1.90e-01%\n", "\n", " Delayed Group 3:\t\n", - " Group 1 [0.0 - 20.0 MeV]:\t5.75e-06 +/- 3.00e-01%\n", + " Group 1 [1e-09 - 19.9526231497MeV]:\t5.74e-06 +/- 1.90e-01%\n", "\n", " Delayed Group 4:\t\n", - " Group 1 [0.0 - 20.0 MeV]:\t1.05e-05 +/- 3.00e-01%\n", + " Group 1 [1e-09 - 19.9526231497MeV]:\t1.05e-05 +/- 1.90e-01%\n", "\n", " Delayed Group 5:\t\n", - " Group 1 [0.0 - 20.0 MeV]:\t5.47e-06 +/- 3.00e-01%\n", + " Group 1 [1e-09 - 19.9526231497MeV]:\t5.46e-06 +/- 1.90e-01%\n", "\n", " Delayed Group 6:\t\n", - " Group 1 [0.0 - 20.0 MeV]:\t1.66e-06 +/- 3.00e-01%\n", + " Group 1 [1e-09 - 19.9526231497MeV]:\t1.65e-06 +/- 1.90e-01%\n", "\n", "\n", "\n" @@ -799,7 +849,7 @@ } ], "source": [ - "delayed_nu_fission.print_xs()" + "delayed_nu_fission.get_condensed_xs(one_group).print_xs()" ] }, { @@ -840,7 +890,7 @@ " 1\n", " U235\n", " 0.000228\n", - " 1.038855e-06\n", + " 4.753468e-07\n", " \n", " \n", " 1\n", @@ -849,7 +899,7 @@ " 1\n", " Pu239\n", " 0.000081\n", - " 3.258333e-07\n", + " 1.885620e-07\n", " \n", " \n", " 2\n", @@ -858,7 +908,7 @@ " 1\n", " U235\n", " 0.001175\n", - " 5.362249e-06\n", + " 2.453594e-06\n", " \n", " \n", " 3\n", @@ -867,7 +917,7 @@ " 1\n", " Pu239\n", " 0.000531\n", - " 2.121977e-06\n", + " 1.228003e-06\n", " \n", " \n", " 4\n", @@ -876,7 +926,7 @@ " 1\n", " U235\n", " 0.001122\n", - " 5.119269e-06\n", + " 2.342414e-06\n", " \n", " \n", " 5\n", @@ -885,7 +935,7 @@ " 1\n", " Pu239\n", " 0.000402\n", - " 1.605842e-06\n", + " 9.293122e-07\n", " \n", " \n", " 6\n", @@ -894,7 +944,7 @@ " 1\n", " U235\n", " 0.002516\n", - " 1.147782e-05\n", + " 5.251885e-06\n", " \n", " \n", " 7\n", @@ -903,7 +953,7 @@ " 1\n", " Pu239\n", " 0.000733\n", - " 2.931785e-06\n", + " 1.696645e-06\n", " \n", " \n", " 8\n", @@ -912,7 +962,7 @@ " 1\n", " U235\n", " 0.001031\n", - " 4.705745e-06\n", + " 2.153199e-06\n", " \n", " \n", " 9\n", @@ -921,7 +971,7 @@ " 1\n", " Pu239\n", " 0.000382\n", - " 1.527096e-06\n", + " 8.837413e-07\n", " \n", " \n", " 10\n", @@ -930,7 +980,7 @@ " 1\n", " U235\n", " 0.000432\n", - " 1.971220e-06\n", + " 9.019675e-07\n", " \n", " \n", " 11\n", @@ -939,7 +989,7 @@ " 1\n", " Pu239\n", " 0.000116\n", - " 4.621961e-07\n", + " 2.674761e-07\n", " \n", " \n", "\n", @@ -947,18 +997,18 @@ ], "text/plain": [ " cell delayedgroup group in nuclide mean std. dev.\n", - "0 1 1 1 U235 0.000228 1.038855e-06\n", - "1 1 1 1 Pu239 0.000081 3.258333e-07\n", - "2 1 2 1 U235 0.001175 5.362249e-06\n", - "3 1 2 1 Pu239 0.000531 2.121977e-06\n", - "4 1 3 1 U235 0.001122 5.119269e-06\n", - "5 1 3 1 Pu239 0.000402 1.605842e-06\n", - "6 1 4 1 U235 0.002516 1.147782e-05\n", - "7 1 4 1 Pu239 0.000733 2.931785e-06\n", - "8 1 5 1 U235 0.001031 4.705745e-06\n", - "9 1 5 1 Pu239 0.000382 1.527096e-06\n", - "10 1 6 1 U235 0.000432 1.971220e-06\n", - "11 1 6 1 Pu239 0.000116 4.621961e-07" + "0 1 1 1 U235 0.000228 4.753468e-07\n", + "1 1 1 1 Pu239 0.000081 1.885620e-07\n", + "2 1 2 1 U235 0.001175 2.453594e-06\n", + "3 1 2 1 Pu239 0.000531 1.228003e-06\n", + "4 1 3 1 U235 0.001122 2.342414e-06\n", + "5 1 3 1 Pu239 0.000402 9.293122e-07\n", + "6 1 4 1 U235 0.002516 5.251885e-06\n", + "7 1 4 1 Pu239 0.000733 1.696645e-06\n", + "8 1 5 1 U235 0.001031 2.153199e-06\n", + "9 1 5 1 Pu239 0.000382 8.837413e-07\n", + "10 1 6 1 U235 0.000432 9.019675e-07\n", + "11 1 6 1 Pu239 0.000116 2.674761e-07" ] }, "execution_count": 19, @@ -967,7 +1017,7 @@ } ], "source": [ - "df = beta.get_pandas_dataframe()\n", + "df = beta.get_condensed_xs(one_group).get_pandas_dataframe()\n", "df.head(12)" ] }, @@ -1056,8 +1106,8 @@ " 1\n", " (U235 / total)\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 9.430766e-08\n", - " 5.356653e-10\n", + " 9.391610e-08\n", + " 2.566220e-10\n", " \n", " \n", " 1\n", @@ -1065,8 +1115,8 @@ " 1\n", " (Pu239 / total)\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 7.631830e-09\n", - " 3.816602e-11\n", + " 7.611347e-09\n", + " 2.278727e-11\n", " \n", " \n", " 2\n", @@ -1074,8 +1124,8 @@ " 2\n", " (U235 / total)\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 1.107191e-06\n", - " 6.288818e-09\n", + " 1.102594e-06\n", + " 3.012794e-09\n", " \n", " \n", " 3\n", @@ -1083,8 +1133,8 @@ " 2\n", " (Pu239 / total)\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 1.426298e-07\n", - " 7.132776e-10\n", + " 1.422470e-07\n", + " 4.258670e-10\n", " \n", " \n", " 4\n", @@ -1092,8 +1142,8 @@ " 3\n", " (U235 / total)\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 6.713761e-07\n", - " 3.813401e-09\n", + " 6.685886e-07\n", + " 1.826892e-09\n", " \n", " \n", " 5\n", @@ -1101,8 +1151,8 @@ " 3\n", " (Pu239 / total)\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 5.434458e-08\n", - " 2.717718e-10\n", + " 5.419872e-08\n", + " 1.622631e-10\n", " \n", " \n", " 6\n", @@ -1110,8 +1160,8 @@ " 4\n", " (U235 / total)\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 4.907155e-07\n", - " 2.787253e-09\n", + " 4.886781e-07\n", + " 1.335293e-09\n", " \n", " \n", " 7\n", @@ -1119,8 +1169,8 @@ " 4\n", " (Pu239 / total)\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 2.633756e-08\n", - " 1.317115e-10\n", + " 2.626687e-08\n", + " 7.863920e-11\n", " \n", " \n", " 8\n", @@ -1128,8 +1178,8 @@ " 5\n", " (U235 / total)\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 1.475656e-08\n", - " 8.381692e-11\n", + " 1.469529e-08\n", + " 4.015430e-11\n", " \n", " \n", " 9\n", @@ -1137,8 +1187,8 @@ " 5\n", " (Pu239 / total)\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 1.278385e-09\n", - " 6.393074e-12\n", + " 1.274953e-09\n", + " 3.817026e-12\n", " \n", " \n", " 10\n", @@ -1146,8 +1196,8 @@ " 6\n", " (U235 / total)\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 1.190878e-09\n", - " 6.764161e-12\n", + " 1.185934e-09\n", + " 3.240517e-12\n", " \n", " \n", " 11\n", @@ -1155,8 +1205,8 @@ " 6\n", " (Pu239 / total)\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 5.385798e-11\n", - " 2.693384e-13\n", + " 5.371343e-11\n", + " 1.608102e-13\n", " \n", " \n", "\n", @@ -1178,18 +1228,18 @@ "11 1 6 (Pu239 / total) \n", "\n", " score mean std. dev. \n", - "0 (((delayed-nu-fission / nu-fission) * (delayed... 9.43e-08 5.36e-10 \n", - "1 (((delayed-nu-fission / nu-fission) * (delayed... 7.63e-09 3.82e-11 \n", - "2 (((delayed-nu-fission / nu-fission) * (delayed... 1.11e-06 6.29e-09 \n", - "3 (((delayed-nu-fission / nu-fission) * (delayed... 1.43e-07 7.13e-10 \n", - "4 (((delayed-nu-fission / nu-fission) * (delayed... 6.71e-07 3.81e-09 \n", - "5 (((delayed-nu-fission / nu-fission) * (delayed... 5.43e-08 2.72e-10 \n", - "6 (((delayed-nu-fission / nu-fission) * (delayed... 4.91e-07 2.79e-09 \n", - "7 (((delayed-nu-fission / nu-fission) * (delayed... 2.63e-08 1.32e-10 \n", - "8 (((delayed-nu-fission / nu-fission) * (delayed... 1.48e-08 8.38e-11 \n", - "9 (((delayed-nu-fission / nu-fission) * (delayed... 1.28e-09 6.39e-12 \n", - "10 (((delayed-nu-fission / nu-fission) * (delayed... 1.19e-09 6.76e-12 \n", - "11 (((delayed-nu-fission / nu-fission) * (delayed... 5.39e-11 2.69e-13 " + "0 (((delayed-nu-fission / nu-fission) * (delayed... 9.39e-08 2.57e-10 \n", + "1 (((delayed-nu-fission / nu-fission) * (delayed... 7.61e-09 2.28e-11 \n", + "2 (((delayed-nu-fission / nu-fission) * (delayed... 1.10e-06 3.01e-09 \n", + "3 (((delayed-nu-fission / nu-fission) * (delayed... 1.42e-07 4.26e-10 \n", + "4 (((delayed-nu-fission / nu-fission) * (delayed... 6.69e-07 1.83e-09 \n", + "5 (((delayed-nu-fission / nu-fission) * (delayed... 5.42e-08 1.62e-10 \n", + "6 (((delayed-nu-fission / nu-fission) * (delayed... 4.89e-07 1.34e-09 \n", + "7 (((delayed-nu-fission / nu-fission) * (delayed... 2.63e-08 7.86e-11 \n", + "8 (((delayed-nu-fission / nu-fission) * (delayed... 1.47e-08 4.02e-11 \n", + "9 (((delayed-nu-fission / nu-fission) * (delayed... 1.27e-09 3.82e-12 \n", + "10 (((delayed-nu-fission / nu-fission) * (delayed... 1.19e-09 3.24e-12 \n", + "11 (((delayed-nu-fission / nu-fission) * (delayed... 5.37e-11 1.61e-13 " ] }, "execution_count": 22, @@ -1204,7 +1254,7 @@ "\n", "# Create a tally object with only the delayed group filter for the time constants\n", "beta_filters = [f for f in beta.xs_tally.filters if f.type != 'delayedgroup']\n", - "lambda_tally = beta.xs_tally.summation(nuclides=beta.xs_tally.nuclides)\n", + "lambda_tally = beta.get_condensed_xs(one_group).xs_tally.summation(nuclides=beta.xs_tally.nuclides)\n", "for f in beta_filters:\n", " lambda_tally = lambda_tally.summation(filter_type=f.type, remove_filter=True) * 0. + 1.\n", "\n", @@ -1217,8 +1267,8 @@ "lambda_tally.scores = ['lambda']\n", "\n", "# Use tally arithmetic to compute the precursor concentrations\n", - "precursor_conc = beta.xs_tally.summation(filter_type='energy', remove_filter=True) * \\\n", - " delayed_nu_fission.xs_tally.summation(filter_type='energy', remove_filter=True) / lambda_tally\n", + "precursor_conc = beta.get_condensed_xs(one_group).xs_tally.summation(filter_type='energy', remove_filter=True) * \\\n", + " delayed_nu_fission.get_condensed_xs(one_group).xs_tally.summation(filter_type='energy', remove_filter=True) / lambda_tally\n", " \n", "# The difference is a derived tally which can generate Pandas DataFrames for inspection\n", "precursor_conc.get_pandas_dataframe()" @@ -1242,8 +1292,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "Beta (U-235) : 0.006504 +/- 0.000015\n", - "Beta (Pu-239): 0.002245 +/- 0.000004\n" + "Beta (U-235) : 0.006504 +/- 0.000007\n", + "Beta (Pu-239): 0.002245 +/- 0.000002\n" ] }, { @@ -1260,7 +1310,7 @@ "data": { "image/png": "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\n771XLz/wwAO55JJLWLBgAfPmzVt9R8qOtPXkVe/EUikFl7+jrW3T5r6SGshKOGdGxNK0+HLggxGx\nK1mp5sftjtisizQ3w9KlVTfr1pYuza7D1rjjjjtYuHAhr7zyCj/72c/o379/m9ufcsopq29XfOGF\nF6617tvf/jZTp07lpptuqrhvv379GDNmDBdccAEvvvgiAP/1X//Fbrvtxq677so+++zD4YcfzoYb\nbsgWW2xRmwusoN5VYbOBYSWvtwHmlm0zC9gWmCupLzAwIt6UNDstX2dfSRuQJZVrI+KOlg0i4l8l\n2/8auKu1wJpLPv1NTU00NTXlviizeih6UmnRna6jM1VXNYuhQulk0003XavEMG/evNXPr7jiCq64\n4op19hk3bhz33Xcfjz76KA0NDW2ec/ny5bz88svsvPPO9O/fn0svvZRLL70UgF/96lfsvvvuuare\nJk2axKRJk6put448dwPr6APoC/w3MBzoBzwH7Fi2zanA5en5WLJ2FYCdgGfTfiPTcVpuTHYNWSN9\n+fm2Knl+FnBDK3FVv4Wa2XqW3aE9exRRV8Xfnf+eR4wYEQ8++OA6y48++ug4+uijY/ny5TF58uQY\nMmRIHHvssa0e5wc/+EGMGjUq5s2bt866J598Mh577LF47733YtmyZXHhhRfGgAED4vXXX4+IiDlz\n5sTcuXMjIuKJJ56IbbfdNh544IE2427tPSXnHSTXx22ADwD+DswAzknLxgOfS883Am5O658ERpTs\ne25KKNOA0WnZ3sDKlKSeBaYAB8SahPNCWvf/gC1bianNN9WsKzixdPS83fcNGzlyZMXE8vLLL8de\ne+0VjY2N8bnPfS7OPPPMNhOLpOjfv380Njauvl3xBRdcEBERjzzySOyyyy4xYMCAGDx4cDQ1NcVj\njz22et9HH300RowYEZtuumnssMMOceONN1aNu7OJxbcmNusmSmsmivjx7Kr4fWvi2vOtic3MrFup\n2ngv6ePAMcAnga2BZcBfgd8D10XEorpGaGZmhdJmVZikP5D1xLoD+AvwT6A/sD2wL3AwWSP6nfUP\ntXZcFWbdkavCOnpeV4XVWmerwqolliERsaBKAFW36W6cWKw7cmLp6HmdWGqtrm0sLQlD0qZp3i8k\nbS/pEEkblm5jZmYG+RvvHwX6SxoK3A8cC/y2XkGZmVlx5R15r4h4R9IJZIMZL5L0bD0DMzPLY/jw\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1269,7 +1319,7 @@ ], "source": [ "energy_filter = [f for f in beta.xs_tally.filters if f.type == 'energy']\n", - "beta_integrated = beta.xs_tally.summation(filter_type='energy', remove_filter=True)\n", + "beta_integrated = beta.get_condensed_xs(one_group).xs_tally.summation(filter_type='energy', remove_filter=True)\n", "beta_u235 = beta_integrated.get_values(nuclides=['U235'])\n", "beta_pu239 = beta_integrated.get_values(nuclides=['Pu239'])\n", "\n", @@ -1323,7 +1373,7 @@ "data": { "image/png": "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\n9erFmWeeyRtvvAFAkyZNgmWqSk5ODjt37mTHjh2AnT5zwoQJFBQU0KZNGyZMmBDTNPTCCy9w3HHH\n0bp1a8aPH1+ts3/wwQc5/vjjadOmDQMHDmTdunUR21m6dCmnnHIKBQUFFBcXh/xIBw8ezF/+8peQ\n+ieddBJPP23/dNasWUP//v1p06YNxx13HE888USw3o4dOzj//PMpKCigd+/eCaU3bciULi8NboaG\nR1IVg6oeAK4Dngc+Bhao6iciUioigwFE5Mcish64CLhPRAKJfYcCfYCxIvK+iLwnIifWpXyW30JK\npdoWzS4bqX5dRJ9cv359sKOMhldzyPfff8/KlSurpfw86aSTaNq0KRdccAFXXHFFMEdDIMxugIMH\nD7JhwwZ2795dre3t27dz0UUXcdttt7Ft2zaOPvpoXnvttWD5U089xe9//3ueeuoptm7dyplnnsmI\nESMiypmXl8fcuXPZtWsXS5Ys4b777gt2/IEcDQFWrVrFpk2bGDRoEHv37qV///6MHDmSbdu2MX/+\nfK699lo++eQTAK699lqaN2/Oli1bmD17tmf/h8FgqCLpsZJU9TlVPUZVu6rq751jJar6rPP5HVXt\nqKotVfVQZ3oqqvqYqjZR1VNU9WTn73+SLW99csEFF1BYWMhZZ51Fv379IialqSlXX301J598Mv37\n9w85vmrVKnbv3s28efM444wzgscHDhzI3XffzbZt2/jqq6+CWeH27t1bre2lS5dywgkn8LOf/YxG\njRpx/fXX065du2D5Aw88wJQpU+jWrRs5OTnceOONfPDBByFJfwKcddZZQeX1ox/9iOHDh7N8+XIA\nhgwZwmeffRZ823/00UcZNmwYjRo14tlnn6Vz586MHj0aEaFHjx5ceOGFLFy4kIMHD/Lkk09yyy23\n0LRpU0444QTGjBmT4BM1GBoeJoheClm8eDE7duzgyy+/5M9//jNNmjSJe84111wTzMXw+9//PqRs\n8uTJrF69Omou58aNGzNs2DBmzJjBhx/aA7OpU6dy8skn06NHD/r06cPPfvYzcnNzOeyww6qdH57y\nEwjZLy8vZ+LEicF0nG3atEFEqmVbA3jrrbc4++yzOeyww2jVqhX3339/MOVn48aNGTp0KI8++iiq\nyvz584O5oMvLy3nzzTdDUn7OmzePLVu2sHXrViorKznyyCOD12mwwfn8JVVbBALO6Ax0z0Uk/F6y\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 3099ff0b51..a40857df97 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -18,17 +18,18 @@ if sys.version_info[0] >= 3: class Library(object): - """A multi-group cross section library for some energy group structure. + """A multi-energy-group and multi-delayed-group cross section library for + some energy group structure. This class can be used for both OpenMC input generation and tally data post-processing to compute spatially-homogenized and energy-integrated multi-group cross sections for deterministic neutronics calculations. - This class helps automate the generation of MGXS objects for some energy - group structure and domain type. The Library serves as a collection for - MGXS objects with routines to automate the initialization of tallies for - input files, the loading of tally data from statepoint files, data storage, - energy group condensation and more. + This class helps automate the generation of MGXS and MDGXS objects for some + energy group structure and domain type. The Library serves as a collection + for MGXS and MDGXS objects with routines to automate the initialization of + tallies for input files, the loading of tally data from statepoint files, + data storage, energy group condensation and more. Parameters ---------- @@ -64,6 +65,8 @@ class Library(object): The highest legendre moment in the scattering matrices (default is 0) energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation + delayed_groups : openmc.mgxs.DelayedGroups + Delayed groups to filter out the xs tally_trigger : openmc.Trigger An (optional) tally precision trigger given to each tally used to compute the cross section @@ -95,6 +98,7 @@ class Library(object): self._domain_type = None self._domains = 'all' self._energy_groups = None + self._delayed_groups = None self._correction = 'P0' self._legendre_order = 0 self._tally_trigger = None @@ -126,6 +130,7 @@ class Library(object): clone._correction = self.correction clone._legendre_order = self.legendre_order clone._energy_groups = copy.deepcopy(self.energy_groups, memo) + clone._delayed_groups = copy.deepcopy(self.delayed_groups, memo) clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo) clone._all_mgxs = copy.deepcopy(self.all_mgxs) clone._sp_filename = self._sp_filename @@ -194,6 +199,10 @@ class Library(object): def energy_groups(self): return self._energy_groups + @property + def delayed_groups(self): + return self._delayed_groups + @property def correction(self): return self._correction @@ -210,6 +219,13 @@ class Library(object): def num_groups(self): return self.energy_groups.num_groups + @property + def num_delayed_groups(self): + if self.delayed_groups == None: + return 0 + else: + return self.delayed_groups.num_groups + @property def all_mgxs(self): return self._all_mgxs @@ -261,7 +277,7 @@ class Library(object): def domain_type(self, domain_type): cv.check_value('domain type', domain_type, openmc.mgxs.DOMAIN_TYPES) - if by_nuclide == True and domain_type == 'mesh': + if self.by_nuclide == True and domain_type == 'mesh': raise ValueError('Unable to create MGXS library by nuclide with ' + 'mesh domain') @@ -308,6 +324,12 @@ class Library(object): cv.check_type('energy groups', energy_groups, openmc.mgxs.EnergyGroups) self._energy_groups = energy_groups + @delayed_groups.setter + def delayed_groups(self, delayed_groups): + cv.check_type('delayed groups', delayed_groups, + openmc.mgxs.DelayedGroups) + self._delayed_groups = delayed_groups + @correction.setter def correction(self, correction): cv.check_value('correction', correction, ('P0', None)) @@ -373,12 +395,19 @@ class Library(object): for domain in self.domains: self.all_mgxs[domain.id] = OrderedDict() for mgxs_type in self.mgxs_types: - mgxs = openmc.mgxs.MGXS.get_mgxs(mgxs_type, name=self.name) + if mgxs_type in openmc.mgxs.MDGXS_TYPES: + mgxs = openmc.mgxs.MDGXS.get_mgxs(mgxs_type, name=self.name) + else: + mgxs = openmc.mgxs.MGXS.get_mgxs(mgxs_type, name=self.name) + mgxs.domain = domain mgxs.domain_type = self.domain_type mgxs.energy_groups = self.energy_groups mgxs.by_nuclide = self.by_nuclide + if mgxs_type in openmc.mgxs.MDGXS_TYPES: + mgxs.delayed_groups = self.delayed_groups + # If a tally trigger was specified, add it to the MGXS if self.tally_trigger: mgxs.tally_trigger = self.tally_trigger diff --git a/openmc/mgxs/mdgxs.py b/openmc/mgxs/mdgxs.py index 4d65aaacc5..e985b01515 100644 --- a/openmc/mgxs/mdgxs.py +++ b/openmc/mgxs/mdgxs.py @@ -115,7 +115,7 @@ class MDGXS(MGXS): __metaclass__ = abc.ABCMeta def __init__(self, domain=None, domain_type=None, energy_groups=None, - by_nuclide=False, name='', delayed_groups=None): + delayed_groups=None, by_nuclide=False, name=''): super(MDGXS, self).__init__(domain, domain_type, energy_groups, by_nuclide, name) self._delayed_groups = None @@ -124,12 +124,30 @@ class MDGXS(MGXS): self.delayed_groups = delayed_groups def __deepcopy__(self, memo): - super(MDGXS, self).__deepcopy__(memo) existing = memo.get(id(self)) # If this is the first time we have tried to copy this object, copy it if existing is None: + clone = type(self).__new__(type(self)) + clone._name = self.name + clone._rxn_type = self.rxn_type + clone._by_nuclide = self.by_nuclide + clone._nuclides = copy.deepcopy(self._nuclides) + clone._domain = self.domain + clone._domain_type = self.domain_type + clone._energy_groups = copy.deepcopy(self.energy_groups, memo) clone._delayed_groups = copy.deepcopy(self.delayed_groups, memo) + clone._tally_trigger = copy.deepcopy(self.tally_trigger, memo) + clone._rxn_rate_tally = copy.deepcopy(self._rxn_rate_tally, memo) + clone._xs_tally = copy.deepcopy(self._xs_tally, memo) + clone._sparse = self.sparse + clone._derived = self.derived + + clone._tallies = OrderedDict() + for tally_type, tally in self.tallies.items(): + clone.tallies[tally_type] = copy.deepcopy(tally, memo) + + memo[id(self)] = clone return clone @@ -143,7 +161,10 @@ class MDGXS(MGXS): @property def num_delayed_groups(self): - return self.delayed_groups.num_groups + if self.delayed_groups == None: + return 0 + else: + return self.delayed_groups.num_groups @delayed_groups.setter def delayed_groups(self, delayed_groups): @@ -167,8 +188,8 @@ class MDGXS(MGXS): @staticmethod def get_mgxs(mdgxs_type, domain=None, domain_type=None, - energy_groups=None, by_nuclide=False, name='', - delayed_groups=None): + energy_groups=None, delayed_groups=None, + by_nuclide=False, name=''): """Return a MDGXS subclass object for some energy group structure within some spatial domain for some reaction type. @@ -206,15 +227,16 @@ class MDGXS(MGXS): cv.check_value('mdgxs_type', mdgxs_type, MDGXS_TYPES) if mdgxs_type == 'delayed-nu-fission': - mdgxs = DelayedNuFissionXS(domain, domain_type, energy_groups) + mdgxs = DelayedNuFissionXS(domain, domain_type, energy_groups, + delayed_groups) elif mdgxs_type == 'chi-delayed': - mdgxs = ChiDelayed(domain, domain_type, energy_groups) + mdgxs = ChiDelayed(domain, domain_type, energy_groups, + delayed_groups) elif mdgxs_type == 'beta': - mdgxs = Beta(domain, domain_type, energy_groups) + mdgxs = Beta(domain, domain_type, energy_groups, delayed_groups) mdgxs.by_nuclide = by_nuclide mdgxs.name = name - mdgxs.delayed_groups = delayed_groups return mdgxs def get_xs(self, groups='all', subdomains='all', nuclides='all', @@ -936,9 +958,9 @@ class ChiDelayed(MDGXS): """ def __init__(self, domain=None, domain_type=None, energy_groups=None, - by_nuclide=False, name='', delayed_groups=None): + delayed_groups=None, by_nuclide=False, name=''): super(ChiDelayed, self).__init__(domain, domain_type, energy_groups, - by_nuclide, name, delayed_groups) + delayed_groups, by_nuclide, name) self._rxn_type = 'chi-delayed' @property @@ -1390,10 +1412,10 @@ class DelayedNuFissionXS(MDGXS): """ def __init__(self, domain=None, domain_type=None, energy_groups=None, - by_nuclide=False, name='', delayed_groups=None): + delayed_groups=None, by_nuclide=False, name=''): super(DelayedNuFissionXS, self).__init__(domain, domain_type, - energy_groups, by_nuclide, - name, delayed_groups) + energy_groups, delayed_groups, + by_nuclide, name) self._rxn_type = 'delayed-nu-fission' @@ -1509,9 +1531,9 @@ class Beta(MDGXS): """ def __init__(self, domain=None, domain_type=None, energy_groups=None, - by_nuclide=False, name='', delayed_groups=None): + delayed_groups=None, by_nuclide=False, name=''): super(Beta, self).__init__(domain, domain_type, energy_groups, - by_nuclide, name, delayed_groups) + delayed_groups, by_nuclide, name) self._rxn_type = 'beta' @property diff --git a/openmc/tallies.py b/openmc/tallies.py index 2073bbd282..58cf34ed7b 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -795,6 +795,9 @@ class Tally(object): else: no_scores_match = False + if score == 'current' and score not in self.scores: + return False + # Nuclides cannot be specified on 'flux' scores if 'flux' in self.scores or 'flux' in other.scores: if self.nuclides != other.nuclides: From 92e77eb57403399672bf8003ab764efdd96991a5 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 2 Aug 2016 20:35:21 -0400 Subject: [PATCH 024/168] added mdgxs tests --- openmc/mgxs/library.py | 6 +- .../inputs_true.dat | 1 + .../results_true.dat | 63 ++++++++++ .../test_mdgxs_library_condense.py | 82 ++++++++++++ .../inputs_true.dat | 1 + .../results_true.dat | 21 ++++ .../test_mdgxs_library_distribcell.py | 80 ++++++++++++ tests/test_mdgxs_library_hdf5/inputs_true.dat | 1 + .../test_mdgxs_library_hdf5/results_true.dat | 117 ++++++++++++++++++ .../test_mdgxs_library_hdf5.py | 93 ++++++++++++++ tests/test_mdgxs_library_mesh/inputs_true.dat | 1 + .../test_mdgxs_library_mesh/results_true.dat | 78 ++++++++++++ .../test_mdgxs_library_mesh.py | 84 +++++++++++++ .../inputs_true.dat | 1 + .../results_true.dat | 117 ++++++++++++++++++ .../test_mdgxs_library_no_nuclides.py | 80 ++++++++++++ .../inputs_true.dat | 1 + .../results_true.dat | 1 + .../test_mdgxs_library_nuclides.py | 80 ++++++++++++ 19 files changed, 906 insertions(+), 2 deletions(-) create mode 100644 tests/test_mdgxs_library_condense/inputs_true.dat create mode 100644 tests/test_mdgxs_library_condense/results_true.dat create mode 100644 tests/test_mdgxs_library_condense/test_mdgxs_library_condense.py create mode 100644 tests/test_mdgxs_library_distribcell/inputs_true.dat create mode 100644 tests/test_mdgxs_library_distribcell/results_true.dat create mode 100644 tests/test_mdgxs_library_distribcell/test_mdgxs_library_distribcell.py create mode 100644 tests/test_mdgxs_library_hdf5/inputs_true.dat create mode 100644 tests/test_mdgxs_library_hdf5/results_true.dat create mode 100644 tests/test_mdgxs_library_hdf5/test_mdgxs_library_hdf5.py create mode 100644 tests/test_mdgxs_library_mesh/inputs_true.dat create mode 100644 tests/test_mdgxs_library_mesh/results_true.dat create mode 100644 tests/test_mdgxs_library_mesh/test_mdgxs_library_mesh.py create mode 100644 tests/test_mdgxs_library_no_nuclides/inputs_true.dat create mode 100644 tests/test_mdgxs_library_no_nuclides/results_true.dat create mode 100644 tests/test_mdgxs_library_no_nuclides/test_mdgxs_library_no_nuclides.py create mode 100644 tests/test_mdgxs_library_nuclides/inputs_true.dat create mode 100644 tests/test_mdgxs_library_nuclides/results_true.dat create mode 100644 tests/test_mdgxs_library_nuclides/test_mdgxs_library_nuclides.py diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index a40857df97..56399ee2f0 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -255,12 +255,14 @@ class Library(object): @mgxs_types.setter def mgxs_types(self, mgxs_types): + all_mgxs_types = np.append(openmc.mgxs.MGXS_TYPES, + openmc.mgxs.MDGXS_TYPES) if mgxs_types == 'all': - self._mgxs_types = openmc.mgxs.MGXS_TYPES + self._mgxs_types = all_mgxs_types else: cv.check_iterable_type('mgxs_types', mgxs_types, basestring) for mgxs_type in mgxs_types: - cv.check_value('mgxs_type', mgxs_type, openmc.mgxs.MGXS_TYPES) + cv.check_value('mgxs_type', mgxs_type, all_mgxs_types) self._mgxs_types = mgxs_types @by_nuclide.setter diff --git a/tests/test_mdgxs_library_condense/inputs_true.dat b/tests/test_mdgxs_library_condense/inputs_true.dat new file mode 100644 index 0000000000..49fe693ee4 --- /dev/null +++ b/tests/test_mdgxs_library_condense/inputs_true.dat @@ -0,0 +1 @@ +9e8d8b468bdd81d996956d0d43eef5779b7b7d5ca3f6a1e628f10318748086183e45cf221edf7a274ff2dc6aff34f4411e21952740cdb7652477dfa0a1ffb5f2 \ No newline at end of file diff --git a/tests/test_mdgxs_library_condense/results_true.dat b/tests/test_mdgxs_library_condense/results_true.dat new file mode 100644 index 0000000000..20cc048d14 --- /dev/null +++ b/tests/test_mdgxs_library_condense/results_true.dat @@ -0,0 +1,63 @@ + 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 + material delayedgroup group out nuclide mean std. dev. +0 10000 1 1 total 0 0.000000 +1 10000 2 1 total 1 0.869128 +2 10000 3 1 total 1 1.414214 +3 10000 4 1 total 1 0.360359 +4 10000 5 1 total 0 0.000000 +5 10000 6 1 total 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 + material delayedgroup group in nuclide mean std. dev. +0 10001 1 1 total 0 0 +1 10001 2 1 total 0 0 +2 10001 3 1 total 0 0 +3 10001 4 1 total 0 0 +4 10001 5 1 total 0 0 +5 10001 6 1 total 0 0 + material delayedgroup group out nuclide mean std. dev. +0 10001 1 1 total 0 0 +1 10001 2 1 total 0 0 +2 10001 3 1 total 0 0 +3 10001 4 1 total 0 0 +4 10001 5 1 total 0 0 +5 10001 6 1 total 0 0 + material delayedgroup group in nuclide mean std. dev. +0 10001 1 1 total 0 0 +1 10001 2 1 total 0 0 +2 10001 3 1 total 0 0 +3 10001 4 1 total 0 0 +4 10001 5 1 total 0 0 +5 10001 6 1 total 0 0 + material delayedgroup group in nuclide mean std. dev. +0 10002 1 1 total 0 0 +1 10002 2 1 total 0 0 +2 10002 3 1 total 0 0 +3 10002 4 1 total 0 0 +4 10002 5 1 total 0 0 +5 10002 6 1 total 0 0 + material delayedgroup group out nuclide mean std. dev. +0 10002 1 1 total 0 0 +1 10002 2 1 total 0 0 +2 10002 3 1 total 0 0 +3 10002 4 1 total 0 0 +4 10002 5 1 total 0 0 +5 10002 6 1 total 0 0 + material delayedgroup group in nuclide mean std. dev. +0 10002 1 1 total 0 0 +1 10002 2 1 total 0 0 +2 10002 3 1 total 0 0 +3 10002 4 1 total 0 0 +4 10002 5 1 total 0 0 +5 10002 6 1 total 0 0 diff --git a/tests/test_mdgxs_library_condense/test_mdgxs_library_condense.py b/tests/test_mdgxs_library_condense/test_mdgxs_library_condense.py new file mode 100644 index 0000000000..75e40be909 --- /dev/null +++ b/tests/test_mdgxs_library_condense/test_mdgxs_library_condense.py @@ -0,0 +1,82 @@ +#!/usr/bin/env python + +import os +import sys +import glob +import hashlib +sys.path.insert(0, os.pardir) +from testing_harness import PyAPITestHarness +from input_set import PinCellInputSet +import openmc +import openmc.mgxs + + +class MDGXSTestHarness(PyAPITestHarness): + def _build_inputs(self): + # Set the input set to use the pincell model + self._input_set = PinCellInputSet() + + # Generate inputs using parent class routine + super(MDGXSTestHarness, self)._build_inputs() + + # Initialize a two-group structure + energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, + 20.]) + delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + + # Initialize MGXS Library for a few cross section types + self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) + self.mgxs_lib.by_nuclide = False + + # Test all MGXS types + self.mgxs_lib.mgxs_types = openmc.mgxs.MDGXS_TYPES + self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.delayed_groups = delayed_groups + self.mgxs_lib.domain_type = 'material' + self.mgxs_lib.build_library() + + # Initialize a tallies file + self._input_set.tallies = openmc.Tallies() + self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) + self._input_set.tallies.export_to_xml() + + def _get_results(self, hash_output=False): + """Digest info in the statepoint and return as a string.""" + + # Read the statepoint file. + statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] + sp = openmc.StatePoint(statepoint) + + # Load the MGXS library from the statepoint + self.mgxs_lib.load_from_statepoint(sp) + + # Build a condensed 1-group MGXS Library + one_group = openmc.mgxs.EnergyGroups([0., 20.]) + condense_lib = self.mgxs_lib.get_condensed_library(one_group) + + # Build a string from Pandas Dataframe for each 1-group MGXS + outstr = '' + for domain in condense_lib.domains: + for mgxs_type in condense_lib.mgxs_types: + mgxs = condense_lib.get_mgxs(domain, mgxs_type) + df = mgxs.get_pandas_dataframe() + outstr += df.to_string() + '\n' + + # Hash the results if necessary + if hash_output: + sha512 = hashlib.sha512() + sha512.update(outstr.encode('utf-8')) + outstr = sha512.hexdigest() + + return outstr + + + def _cleanup(self): + super(MDGXSTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + + +if __name__ == '__main__': + harness = MDGXSTestHarness('statepoint.10.*', True) + harness.main() diff --git a/tests/test_mdgxs_library_distribcell/inputs_true.dat b/tests/test_mdgxs_library_distribcell/inputs_true.dat new file mode 100644 index 0000000000..9b07e293ee --- /dev/null +++ b/tests/test_mdgxs_library_distribcell/inputs_true.dat @@ -0,0 +1 @@ +2d7ef183881fb47ba66ac4ff60a4e510f7b85361aca6dbbe6df2dc89b8492ad3bacbde747803532670bf207ec586dab910448fc1e49f2e57a3bf93256d24442c \ No newline at end of file diff --git a/tests/test_mdgxs_library_distribcell/results_true.dat b/tests/test_mdgxs_library_distribcell/results_true.dat new file mode 100644 index 0000000000..22aeef3967 --- /dev/null +++ b/tests/test_mdgxs_library_distribcell/results_true.dat @@ -0,0 +1,21 @@ + avg(distribcell) delayedgroup group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 0 0 +1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 2 1 total 0 0 +2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 3 1 total 0 0 +3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 4 1 total 0 0 +4 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 5 1 total 0 0 +5 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 6 1 total 0 0 + avg(distribcell) delayedgroup group out nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 0 0 +1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 2 1 total 0 0 +2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 3 1 total 0 0 +3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 4 1 total 0 0 +4 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 5 1 total 0 0 +5 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 6 1 total 0 0 + avg(distribcell) delayedgroup group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 0 0 +1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 2 1 total 0 0 +2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 3 1 total 0 0 +3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 4 1 total 0 0 +4 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 5 1 total 0 0 +5 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 6 1 total 0 0 diff --git a/tests/test_mdgxs_library_distribcell/test_mdgxs_library_distribcell.py b/tests/test_mdgxs_library_distribcell/test_mdgxs_library_distribcell.py new file mode 100644 index 0000000000..48b3758715 --- /dev/null +++ b/tests/test_mdgxs_library_distribcell/test_mdgxs_library_distribcell.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python + +import os +import sys +import glob +import hashlib +sys.path.insert(0, os.pardir) +from testing_harness import PyAPITestHarness +import openmc +import openmc.mgxs + + +class MDGXSTestHarness(PyAPITestHarness): + def _build_inputs(self): + # Generate inputs using parent class routine + super(MDGXSTestHarness, self)._build_inputs() + + # Initialize a one-group structure + energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 20.]) + + # Initialize a six-group structure + delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + + # Initialize MGXS Library for a few cross section types + # for one material-filled cell in the geometry + self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) + self.mgxs_lib.by_nuclide = False + + # Test all MDGXS types + self.mgxs_lib.mgxs_types = openmc.mgxs.MDGXS_TYPES + self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.delayed_groups = delayed_groups + self.mgxs_lib.domain_type = 'distribcell' + material_cells = self.mgxs_lib.openmc_geometry.get_all_material_cells() + self.mgxs_lib.domains = [material_cells[-1]] + self.mgxs_lib.build_library() + + # Initialize a tallies file + self._input_set.tallies = openmc.Tallies() + self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) + self._input_set.tallies.export_to_xml() + + def _get_results(self, hash_output=False): + """Digest info in the statepoint and return as a string.""" + + # Read the statepoint file. + statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] + sp = openmc.StatePoint(statepoint) + + # Load the MGXS library from the statepoint + self.mgxs_lib.load_from_statepoint(sp) + + # Average the MGXS across distribcell subdomains + avg_lib = self.mgxs_lib.get_subdomain_avg_library() + + # Build a string from Pandas Dataframe for each 1-group MGXS + outstr = '' + for domain in avg_lib.domains: + for mgxs_type in avg_lib.mgxs_types: + mgxs = avg_lib.get_mgxs(domain, mgxs_type) + df = mgxs.get_pandas_dataframe() + outstr += df.to_string() + '\n' + + # Hash the results if necessary + if hash_output: + sha512 = hashlib.sha512() + sha512.update(outstr.encode('utf-8')) + outstr = sha512.hexdigest() + + return outstr + + def _cleanup(self): + super(MDGXSTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + + +if __name__ == '__main__': + harness = MDGXSTestHarness('statepoint.10.*', True) + harness.main() diff --git a/tests/test_mdgxs_library_hdf5/inputs_true.dat b/tests/test_mdgxs_library_hdf5/inputs_true.dat new file mode 100644 index 0000000000..49fe693ee4 --- /dev/null +++ b/tests/test_mdgxs_library_hdf5/inputs_true.dat @@ -0,0 +1 @@ +9e8d8b468bdd81d996956d0d43eef5779b7b7d5ca3f6a1e628f10318748086183e45cf221edf7a274ff2dc6aff34f4411e21952740cdb7652477dfa0a1ffb5f2 \ No newline at end of file diff --git a/tests/test_mdgxs_library_hdf5/results_true.dat b/tests/test_mdgxs_library_hdf5/results_true.dat new file mode 100644 index 0000000000..d1b6358716 --- /dev/null +++ b/tests/test_mdgxs_library_hdf5/results_true.dat @@ -0,0 +1,117 @@ +domain=10000 type=delayed-nu-fission +[[ 2.29808234e-05 1.06974158e-04] + [ 1.43606337e-04 5.52167907e-04] + [ 1.51382216e-04 5.27147681e-04] + [ 7.42603178e-05 2.22018043e-04] + [ 4.14908454e-05 9.10244403e-05] + [ 1.70016000e-05 3.81298119e-05]] +[[ 1.66363133e-06 9.49156242e-06] + [ 1.05907806e-05 4.89925426e-05] + [ 1.12671238e-05 4.67725567e-05] + [ 5.22610273e-06 1.87563195e-05] + [ 2.99830766e-06 7.68984041e-06] + [ 1.22654684e-06 3.22124663e-06]] +domain=10000 type=chi-delayed +[[ 0. 0.] + [ 1. 0.] + [ 1. 0.] + [ 1. 0.] + [ 0. 0.] + [ 0. 0.]] +[[ 0. 0. ] + [ 0.86912776 0. ] + [ 1.41421356 0. ] + [ 0.36035904 0. ] + [ 0. 0. ] + [ 0. 0. ]] +domain=10000 type=beta +[[ 4.89188107e-05 2.27713711e-04] + [ 3.05691886e-04 1.17538858e-03] + [ 3.22244241e-04 1.12212853e-03] + [ 3.82159891e-03 1.14255357e-02] + [ 2.13520995e-03 4.68431744e-03] + [ 8.74939644e-04 1.96224379e-03]] +[[ 4.67388620e-06 2.46946810e-05] + [ 2.95223877e-05 1.27466393e-04] + [ 3.12885004e-05 1.21690543e-04] + [ 3.21434855e-04 1.09939816e-03] + [ 1.82980497e-04 4.50738567e-04] + [ 7.48899920e-05 1.88812772e-04]] +domain=10001 type=delayed-nu-fission +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +domain=10001 type=chi-delayed +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +domain=10001 type=beta +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +domain=10002 type=delayed-nu-fission +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +domain=10002 type=chi-delayed +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +domain=10002 type=beta +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] diff --git a/tests/test_mdgxs_library_hdf5/test_mdgxs_library_hdf5.py b/tests/test_mdgxs_library_hdf5/test_mdgxs_library_hdf5.py new file mode 100644 index 0000000000..79e0edf7c2 --- /dev/null +++ b/tests/test_mdgxs_library_hdf5/test_mdgxs_library_hdf5.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python + +import os +import sys +import glob +import hashlib +import h5py +sys.path.insert(0, os.pardir) +from testing_harness import PyAPITestHarness +from input_set import PinCellInputSet +import openmc +import openmc.mgxs + + +class MDGXSTestHarness(PyAPITestHarness): + def _build_inputs(self): + # Set the input set to use the pincell model + self._input_set = PinCellInputSet() + + # Generate inputs using parent class routine + super(MDGXSTestHarness, self)._build_inputs() + + # Initialize a two-group structure + energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, + 20.]) + + # Initialize a six-group structure + delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + + # Initialize MGXS Library for a few cross section types + self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) + self.mgxs_lib.by_nuclide = False + + # Test all MDGXS types + self.mgxs_lib.mgxs_types = openmc.mgxs.MDGXS_TYPES + self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.delayed_groups = delayed_groups + self.mgxs_lib.domain_type = 'material' + self.mgxs_lib.build_library() + + # Initialize a tallies file + self._input_set.tallies = openmc.Tallies() + self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) + self._input_set.tallies.export_to_xml() + + def _get_results(self, hash_output=False): + """Digest info in the statepoint and return as a string.""" + + # Read the statepoint file. + statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] + sp = openmc.StatePoint(statepoint) + + # Load the MGXS library from the statepoint + self.mgxs_lib.load_from_statepoint(sp) + + # Export the MGXS Library to an HDF5 file + self.mgxs_lib.build_hdf5_store(directory='.') + + # Open the MGXS HDF5 file + f = h5py.File('mgxs.h5', 'r') + + # Build a string from the datasets in the HDF5 file + outstr = '' + for domain in self.mgxs_lib.domains: + for mgxs_type in self.mgxs_lib.mgxs_types: + outstr += 'domain={0} type={1}\n'.format(domain.id, mgxs_type) + key = 'material/{0}/{1}/average'.format(domain.id, mgxs_type) + outstr += str(f[key][...]) + '\n' + key = 'material/{0}/{1}/std. dev.'.format(domain.id, mgxs_type) + outstr += str(f[key][...]) + '\n' + + # Close the MGXS HDF5 file + f.close() + + # Hash the results if necessary + if hash_output: + sha512 = hashlib.sha512() + sha512.update(outstr.encode('utf-8')) + outstr = sha512.hexdigest() + + return outstr + + def _cleanup(self): + super(MDGXSTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + f = os.path.join(os.getcwd(), 'mgxs.h5') + if os.path.exists(f): os.remove(f) + + +if __name__ == '__main__': + harness = MDGXSTestHarness('statepoint.10.*', True) + harness.main() diff --git a/tests/test_mdgxs_library_mesh/inputs_true.dat b/tests/test_mdgxs_library_mesh/inputs_true.dat new file mode 100644 index 0000000000..02a9147f88 --- /dev/null +++ b/tests/test_mdgxs_library_mesh/inputs_true.dat @@ -0,0 +1 @@ +f76b5d0cc2dbadd48d51918d8c82e4457e9ce3eafb191cd51394e420ba3ae80eccdff03098b276f7d3eb87f6a4616f1dd0e39e1892244a29d0f486ff2bf4ddbb \ No newline at end of file diff --git a/tests/test_mdgxs_library_mesh/results_true.dat b/tests/test_mdgxs_library_mesh/results_true.dat new file mode 100644 index 0000000000..82f8014f90 --- /dev/null +++ b/tests/test_mdgxs_library_mesh/results_true.dat @@ -0,0 +1,78 @@ + mesh 1 delayedgroup group in nuclide mean std. dev. + x y z +0 1 1 1 1 1 total 0.000004 4.432287e-07 +1 1 1 1 2 1 total 0.000026 2.652890e-06 +2 1 1 1 3 1 total 0.000024 2.402024e-06 +3 1 1 1 4 1 total 0.000054 5.463683e-06 +4 1 1 1 5 1 total 0.000026 2.662762e-06 +5 1 1 1 6 1 total 0.000010 1.037947e-06 +6 1 2 1 1 1 total 0.000005 1.099501e-06 +7 1 2 1 2 1 total 0.000029 6.440339e-06 +8 1 2 1 3 1 total 0.000027 5.929275e-06 +9 1 2 1 4 1 total 0.000061 1.359998e-05 +10 1 2 1 5 1 total 0.000029 6.491514e-06 +11 1 2 1 6 1 total 0.000011 2.575232e-06 +12 2 1 1 1 1 total 0.000004 6.988358e-07 +13 2 1 1 2 1 total 0.000023 4.116310e-06 +14 2 1 1 3 1 total 0.000021 3.817611e-06 +15 2 1 1 4 1 total 0.000049 8.889347e-06 +16 2 1 1 5 1 total 0.000024 4.380665e-06 +17 2 1 1 6 1 total 0.000009 1.746558e-06 +18 2 2 1 1 1 total 0.000004 1.661116e-06 +19 2 2 1 2 1 total 0.000025 9.704053e-06 +20 2 2 1 3 1 total 0.000023 9.007295e-06 +21 2 2 1 4 1 total 0.000054 2.084505e-05 +22 2 2 1 5 1 total 0.000026 9.981347e-06 +23 2 2 1 6 1 total 0.000010 3.988280e-06 + mesh 1 delayedgroup group out nuclide mean std. dev. + x y z +0 1 1 1 1 1 total 0 0.000000 +1 1 1 1 2 1 total 0 0.000000 +2 1 1 1 3 1 total 0 0.000000 +3 1 1 1 4 1 total 1 1.414214 +4 1 1 1 5 1 total 0 0.000000 +5 1 1 1 6 1 total 0 0.000000 +6 1 2 1 1 1 total 0 0.000000 +7 1 2 1 2 1 total 0 0.000000 +8 1 2 1 3 1 total 0 0.000000 +9 1 2 1 4 1 total 0 0.000000 +10 1 2 1 5 1 total 0 0.000000 +11 1 2 1 6 1 total 0 0.000000 +12 2 1 1 1 1 total 0 0.000000 +13 2 1 1 2 1 total 0 0.000000 +14 2 1 1 3 1 total 0 0.000000 +15 2 1 1 4 1 total 0 0.000000 +16 2 1 1 5 1 total 0 0.000000 +17 2 1 1 6 1 total 0 0.000000 +18 2 2 1 1 1 total 0 0.000000 +19 2 2 1 2 1 total 0 0.000000 +20 2 2 1 3 1 total 0 0.000000 +21 2 2 1 4 1 total 0 0.000000 +22 2 2 1 5 1 total 0 0.000000 +23 2 2 1 6 1 total 0 0.000000 + mesh 1 delayedgroup group in nuclide mean std. dev. + x y z +0 1 1 1 1 1 total 0.000166 0.000023 +1 1 1 1 2 1 total 0.000990 0.000136 +2 1 1 1 3 1 total 0.000907 0.000123 +3 1 1 1 4 1 total 0.002088 0.000282 +4 1 1 1 5 1 total 0.001014 0.000137 +5 1 1 1 6 1 total 0.000400 0.000054 +6 1 2 1 1 1 total 0.000171 0.000039 +7 1 2 1 2 1 total 0.001003 0.000226 +8 1 2 1 3 1 total 0.000919 0.000208 +9 1 2 1 4 1 total 0.002101 0.000478 +10 1 2 1 5 1 total 0.000997 0.000228 +11 1 2 1 6 1 total 0.000395 0.000090 +12 2 1 1 1 1 total 0.000168 0.000030 +13 2 1 1 2 1 total 0.001003 0.000178 +14 2 1 1 3 1 total 0.000927 0.000165 +15 2 1 1 4 1 total 0.002150 0.000385 +16 2 1 1 5 1 total 0.001057 0.000190 +17 2 1 1 6 1 total 0.000418 0.000076 +18 2 2 1 1 1 total 0.000171 0.000082 +19 2 2 1 2 1 total 0.001010 0.000481 +20 2 2 1 3 1 total 0.000932 0.000445 +21 2 2 1 4 1 total 0.002151 0.001030 +22 2 2 1 5 1 total 0.001030 0.000493 +23 2 2 1 6 1 total 0.000410 0.000197 diff --git a/tests/test_mdgxs_library_mesh/test_mdgxs_library_mesh.py b/tests/test_mdgxs_library_mesh/test_mdgxs_library_mesh.py new file mode 100644 index 0000000000..88ee7213da --- /dev/null +++ b/tests/test_mdgxs_library_mesh/test_mdgxs_library_mesh.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python + +import os +import sys +import glob +import hashlib +sys.path.insert(0, os.pardir) +from testing_harness import PyAPITestHarness +import openmc +import openmc.mgxs + + +class MDGXSTestHarness(PyAPITestHarness): + def _build_inputs(self): + # Generate inputs using parent class routine + super(MDGXSTestHarness, self)._build_inputs() + + # Initialize a one-group structure + energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 20.]) + + # Initialize a six-group structure + delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + + # Initialize MGXS Library for a few cross section types + # for one material-filled cell in the geometry + self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) + self.mgxs_lib.by_nuclide = False + + # Test all MDGXS types + self.mgxs_lib.mgxs_types = openmc.mgxs.MDGXS_TYPES + self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.delayed_groups = delayed_groups + self.mgxs_lib.domain_type = 'mesh' + + # Instantiate a tally mesh + mesh = openmc.Mesh(mesh_id=1) + mesh.type = 'regular' + mesh.dimension = [2, 2] + mesh.lower_left = [-100., -100.] + mesh.width = [100., 100.] + + self.mgxs_lib.domains = [mesh] + self.mgxs_lib.build_library() + + # Initialize a tallies file + self._input_set.tallies = openmc.Tallies() + self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) + self._input_set.tallies.export_to_xml() + + def _get_results(self, hash_output=False): + """Digest info in the statepoint and return as a string.""" + + # Read the statepoint file. + statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] + sp = openmc.StatePoint(statepoint) + + # Load the MGXS library from the statepoint + self.mgxs_lib.load_from_statepoint(sp) + + # Build a string from Pandas Dataframe for each 1-group MGXS + outstr = '' + for domain in self.mgxs_lib.domains: + for mgxs_type in self.mgxs_lib.mgxs_types: + mgxs = self.mgxs_lib.get_mgxs(domain, mgxs_type) + df = mgxs.get_pandas_dataframe() + outstr += df.to_string() + '\n' + + # Hash the results if necessary + if hash_output: + sha512 = hashlib.sha512() + sha512.update(outstr.encode('utf-8')) + outstr = sha512.hexdigest() + + return outstr + + def _cleanup(self): + super(MDGXSTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + + +if __name__ == '__main__': + harness = MDGXSTestHarness('statepoint.10.*', True) + harness.main() diff --git a/tests/test_mdgxs_library_no_nuclides/inputs_true.dat b/tests/test_mdgxs_library_no_nuclides/inputs_true.dat new file mode 100644 index 0000000000..49fe693ee4 --- /dev/null +++ b/tests/test_mdgxs_library_no_nuclides/inputs_true.dat @@ -0,0 +1 @@ +9e8d8b468bdd81d996956d0d43eef5779b7b7d5ca3f6a1e628f10318748086183e45cf221edf7a274ff2dc6aff34f4411e21952740cdb7652477dfa0a1ffb5f2 \ No newline at end of file diff --git a/tests/test_mdgxs_library_no_nuclides/results_true.dat b/tests/test_mdgxs_library_no_nuclides/results_true.dat new file mode 100644 index 0000000000..e3afdcdb6d --- /dev/null +++ b/tests/test_mdgxs_library_no_nuclides/results_true.dat @@ -0,0 +1,117 @@ + material delayedgroup group in nuclide mean std. dev. +1 10000 1 1 total 0.000023 0.000002 +3 10000 2 1 total 0.000144 0.000011 +5 10000 3 1 total 0.000151 0.000011 +7 10000 4 1 total 0.000074 0.000005 +9 10000 5 1 total 0.000041 0.000003 +11 10000 6 1 total 0.000017 0.000001 +0 10000 1 2 total 0.000107 0.000009 +2 10000 2 2 total 0.000552 0.000049 +4 10000 3 2 total 0.000527 0.000047 +6 10000 4 2 total 0.000222 0.000019 +8 10000 5 2 total 0.000091 0.000008 +10 10000 6 2 total 0.000038 0.000003 + material delayedgroup group out nuclide mean std. dev. +1 10000 1 1 total 0 0.000000 +3 10000 2 1 total 1 0.869128 +5 10000 3 1 total 1 1.414214 +7 10000 4 1 total 1 0.360359 +9 10000 5 1 total 0 0.000000 +11 10000 6 1 total 0 0.000000 +0 10000 1 2 total 0 0.000000 +2 10000 2 2 total 0 0.000000 +4 10000 3 2 total 0 0.000000 +6 10000 4 2 total 0 0.000000 +8 10000 5 2 total 0 0.000000 +10 10000 6 2 total 0 0.000000 + material delayedgroup group in nuclide mean std. dev. +1 10000 1 1 total 0.000049 0.000005 +3 10000 2 1 total 0.000306 0.000030 +5 10000 3 1 total 0.000322 0.000031 +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.011426 0.001099 +8 10000 5 2 total 0.004684 0.000451 +10 10000 6 2 total 0.001962 0.000189 + material delayedgroup group in nuclide mean std. dev. +1 10001 1 1 total 0 0 +3 10001 2 1 total 0 0 +5 10001 3 1 total 0 0 +7 10001 4 1 total 0 0 +9 10001 5 1 total 0 0 +11 10001 6 1 total 0 0 +0 10001 1 2 total 0 0 +2 10001 2 2 total 0 0 +4 10001 3 2 total 0 0 +6 10001 4 2 total 0 0 +8 10001 5 2 total 0 0 +10 10001 6 2 total 0 0 + material delayedgroup group out nuclide mean std. dev. +1 10001 1 1 total 0 0 +3 10001 2 1 total 0 0 +5 10001 3 1 total 0 0 +7 10001 4 1 total 0 0 +9 10001 5 1 total 0 0 +11 10001 6 1 total 0 0 +0 10001 1 2 total 0 0 +2 10001 2 2 total 0 0 +4 10001 3 2 total 0 0 +6 10001 4 2 total 0 0 +8 10001 5 2 total 0 0 +10 10001 6 2 total 0 0 + material delayedgroup group in nuclide mean std. dev. +1 10001 1 1 total 0 0 +3 10001 2 1 total 0 0 +5 10001 3 1 total 0 0 +7 10001 4 1 total 0 0 +9 10001 5 1 total 0 0 +11 10001 6 1 total 0 0 +0 10001 1 2 total 0 0 +2 10001 2 2 total 0 0 +4 10001 3 2 total 0 0 +6 10001 4 2 total 0 0 +8 10001 5 2 total 0 0 +10 10001 6 2 total 0 0 + material delayedgroup group in nuclide mean std. dev. +1 10002 1 1 total 0 0 +3 10002 2 1 total 0 0 +5 10002 3 1 total 0 0 +7 10002 4 1 total 0 0 +9 10002 5 1 total 0 0 +11 10002 6 1 total 0 0 +0 10002 1 2 total 0 0 +2 10002 2 2 total 0 0 +4 10002 3 2 total 0 0 +6 10002 4 2 total 0 0 +8 10002 5 2 total 0 0 +10 10002 6 2 total 0 0 + material delayedgroup group out nuclide mean std. dev. +1 10002 1 1 total 0 0 +3 10002 2 1 total 0 0 +5 10002 3 1 total 0 0 +7 10002 4 1 total 0 0 +9 10002 5 1 total 0 0 +11 10002 6 1 total 0 0 +0 10002 1 2 total 0 0 +2 10002 2 2 total 0 0 +4 10002 3 2 total 0 0 +6 10002 4 2 total 0 0 +8 10002 5 2 total 0 0 +10 10002 6 2 total 0 0 + material delayedgroup group in nuclide mean std. dev. +1 10002 1 1 total 0 0 +3 10002 2 1 total 0 0 +5 10002 3 1 total 0 0 +7 10002 4 1 total 0 0 +9 10002 5 1 total 0 0 +11 10002 6 1 total 0 0 +0 10002 1 2 total 0 0 +2 10002 2 2 total 0 0 +4 10002 3 2 total 0 0 +6 10002 4 2 total 0 0 +8 10002 5 2 total 0 0 +10 10002 6 2 total 0 0 diff --git a/tests/test_mdgxs_library_no_nuclides/test_mdgxs_library_no_nuclides.py b/tests/test_mdgxs_library_no_nuclides/test_mdgxs_library_no_nuclides.py new file mode 100644 index 0000000000..6ee8e9adbe --- /dev/null +++ b/tests/test_mdgxs_library_no_nuclides/test_mdgxs_library_no_nuclides.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python + +import os +import sys +import glob +import hashlib +sys.path.insert(0, os.pardir) +from testing_harness import PyAPITestHarness +from input_set import PinCellInputSet +import openmc +import openmc.mgxs + + +class MDGXSTestHarness(PyAPITestHarness): + def _build_inputs(self): + # Set the input set to use the pincell model + self._input_set = PinCellInputSet() + + # Generate inputs using parent class routine + super(MDGXSTestHarness, self)._build_inputs() + + # Initialize a two-group structure + energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, + 20.]) + + # Initialize a six-group structure + delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + + # Initialize MGXS Library for a few cross section types + self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) + self.mgxs_lib.by_nuclide = False + + # Test all MDGXS types + self.mgxs_lib.mgxs_types = openmc.mgxs.MDGXS_TYPES + self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.delayed_groups = delayed_groups + self.mgxs_lib.domain_type = 'material' + self.mgxs_lib.build_library() + + # Initialize a tallies file + self._input_set.tallies = openmc.Tallies() + self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) + self._input_set.tallies.export_to_xml() + + def _get_results(self, hash_output=False): + """Digest info in the statepoint and return as a string.""" + + # Read the statepoint file. + statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] + sp = openmc.StatePoint(statepoint) + + # Load the MGXS library from the statepoint + self.mgxs_lib.load_from_statepoint(sp) + + # Build a string from Pandas Dataframe for each MGXS + outstr = '' + for domain in self.mgxs_lib.domains: + for mgxs_type in self.mgxs_lib.mgxs_types: + mgxs = self.mgxs_lib.get_mgxs(domain, mgxs_type) + df = mgxs.get_pandas_dataframe() + outstr += df.to_string() + '\n' + + # Hash the results if necessary + if hash_output: + sha512 = hashlib.sha512() + sha512.update(outstr.encode('utf-8')) + outstr = sha512.hexdigest() + + return outstr + + + def _cleanup(self): + super(MDGXSTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + + +if __name__ == '__main__': + harness = MDGXSTestHarness('statepoint.10.*', True) + harness.main() diff --git a/tests/test_mdgxs_library_nuclides/inputs_true.dat b/tests/test_mdgxs_library_nuclides/inputs_true.dat new file mode 100644 index 0000000000..af136e1ec0 --- /dev/null +++ b/tests/test_mdgxs_library_nuclides/inputs_true.dat @@ -0,0 +1 @@ +1cf1a4e8f46f3a5e4bb2824b8b3e4f4af5b43f12e0025ef98f7f54e3212305d8ec4334b3dffeab0e0df94de2eedae2d4aa4d0f15649129264a1cc3e3f9d08b58 \ No newline at end of file diff --git a/tests/test_mdgxs_library_nuclides/results_true.dat b/tests/test_mdgxs_library_nuclides/results_true.dat new file mode 100644 index 0000000000..d8cb494c74 --- /dev/null +++ b/tests/test_mdgxs_library_nuclides/results_true.dat @@ -0,0 +1 @@ +7a6b9ba8f6289f1dac2d474f88003561a0179b45db58eedd671583eced3952f9ed708c1e35248351e469d511a6d99d33e02a9ba5135a0123f7f9c474c4e55a68 \ No newline at end of file diff --git a/tests/test_mdgxs_library_nuclides/test_mdgxs_library_nuclides.py b/tests/test_mdgxs_library_nuclides/test_mdgxs_library_nuclides.py new file mode 100644 index 0000000000..4e67c23c7f --- /dev/null +++ b/tests/test_mdgxs_library_nuclides/test_mdgxs_library_nuclides.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python + +import os +import sys +import glob +import hashlib +sys.path.insert(0, os.pardir) +from testing_harness import PyAPITestHarness +from input_set import PinCellInputSet +import openmc +import openmc.mgxs + + +class MDGXSTestHarness(PyAPITestHarness): + def _build_inputs(self): + # Set the input set to use the pincell model + self._input_set = PinCellInputSet() + + # Generate inputs using parent class routine + super(MDGXSTestHarness, self)._build_inputs() + + # Initialize a two-group structure + energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, + 20.]) + + # Initialize a six-group structure + delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + + # Initialize MGXS Library for a few cross section types + self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) + self.mgxs_lib.by_nuclide = True + + # Test all MDGXS types + self.mgxs_lib.mgxs_types = openmc.mgxs.MDGXS_TYPES + self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.delayed_groups = delayed_groups + self.mgxs_lib.domain_type = 'material' + self.mgxs_lib.build_library() + + # Initialize a tallies file + self._input_set.tallies = openmc.Tallies() + self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) + self._input_set.tallies.export_to_xml() + + def _get_results(self, hash_output=True): + """Digest info in the statepoint and return as a string.""" + + # Read the statepoint file. + statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] + sp = openmc.StatePoint(statepoint) + + # Load the MGXS library from the statepoint + self.mgxs_lib.load_from_statepoint(sp) + + # Build a string from Pandas Dataframe for each MGXS + outstr = '' + for domain in self.mgxs_lib.domains: + for mgxs_type in self.mgxs_lib.mgxs_types: + mgxs = self.mgxs_lib.get_mgxs(domain, mgxs_type) + df = mgxs.get_pandas_dataframe() + outstr += df.to_string() + '\n' + + # Hash the results if necessary + if hash_output: + sha512 = hashlib.sha512() + sha512.update(outstr.encode('utf-8')) + outstr = sha512.hexdigest() + + return outstr + + + def _cleanup(self): + super(MDGXSTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + + +if __name__ == '__main__': + harness = MDGXSTestHarness('statepoint.10.*', True) + harness.main() From c23c1cabfbb8c726ee0b4bd01bb7e74e679edcd0 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 3 Aug 2016 00:13:51 -0400 Subject: [PATCH 025/168] added second mdgxs ipython notebook --- .../pythonapi/examples/mdgxs-part-i.ipynb | 24 +- .../pythonapi/examples/mdgxs-part-ii.ipynb | 1395 +++++++++++++++++ docs/source/pythonapi/index.rst | 23 + 3 files changed, 1430 insertions(+), 12 deletions(-) create mode 100644 docs/source/pythonapi/examples/mdgxs-part-ii.ipynb diff --git a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb index b15ace9519..03bf15897e 100644 --- a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb @@ -23,7 +23,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Many Monte Carlo particle transport codes, including OpenMC, use continuous-energy nuclear cross section data. However, most deterministic neutron transport codes use *multi-group cross sections* defined over discretized energy bins or *energy groups*. Furthermore, kinetics calculations typically separate out parameters that involve delayed neutrons by delayed groups. An example is the energy spectrum for prompt and delayed neutrons for U-235 and Pu-239 computed for a light water reactor spectrum." + "Many Monte Carlo particle transport codes, including OpenMC, use continuous-energy nuclear cross section data. However, most deterministic neutron transport codes use *multi-group cross sections* defined over discretized energy bins or *energy groups*. Furthermore, kinetics calculations typically separate out parameters that involve delayed neutrons into prompt and delayed components and further subdivide delayed components by delayed groups. An example is the energy spectrum for prompt and delayed neutrons for U-235 and Pu-239 computed for a light water reactor spectrum." ] }, { @@ -78,7 +78,7 @@ "### Spatial and Energy Discretization\n", "The energy domain for critical systems such as thermal reactors spans more than 10 orders of magnitude of neutron energies from 10$^{-5}$ - 10$^7$ eV. The multi-group approximation discretization divides this energy range into one or more energy groups. In particular, for $G$ total groups, we denote an energy group index $g$ such that $g \\in \\{1, 2, ..., G\\}$. The energy group indices are defined such that the smaller group the higher the energy, and vice versa. The integration over neutron energies across a discrete energy group is commonly referred to as **energy condensation**.\n", "\n", - "The delayed neutrons created from fissions are created from > 30 delayed neutron precursors. Modeling each of the delayed neutron precursors is possible, but this approach has not recieved much attention due to large uncertainties in certain precursors. Therefore, the delayed neutrons are often combined into \"delayed groups\" that have a set time constant, $\\lambda_d$. Some cross section libraries use the same group time constants for all nuclides (e.g. JEFF 3.2) while other libraries use different time constants for all nuclides (e.g. ENDF/B-VII.1). Multi-delayed-group cross sections can either be created with the entire delayed group set, a subset of delayed groups, or integrated over all delayed groups.\n", + "The delayed neutrons created from fissions are created from > 30 delayed neutron precursors. Modeling each of the delayed neutron precursors is possible, but this approach has not recieved much attention due to large uncertainties in certain precursors. Therefore, the delayed neutrons are often combined into \"delayed groups\" that have a set time constant, $\\lambda_d$. Some cross section libraries use the same group time constants for all nuclides (e.g. JEFF 3.1) while other libraries use different time constants for all nuclides (e.g. ENDF/B-VII.1). Multi-delayed-group cross sections can either be created with the entire delayed group set, a subset of delayed groups, or integrated over all delayed groups.\n", "\n", "Multi-group cross sections are computed for discretized spatial zones in the geometry of interest. The spatial zones may be defined on a structured and regular fuel assembly or pin cell mesh, an arbitrary unstructured mesh or the constructive solid geometry used by OpenMC. For a geometry with $K$ distinct spatial zones, we designate each spatial zone an index $k$ such that $k \\in \\{1, 2, ..., K\\}$. The volume of each spatial zone is denoted by $V_{k}$. The integration over discrete spatial zones is commonly referred to as **spatial homogenization**." ] @@ -92,7 +92,7 @@ "\n", "$$\\nu_d \\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} \\nu_d \\sigma_{f,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 only the delayed-nu-fission and delayed neutron fraction reaction type at the oment. 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, universe, or mesh) define the bounds of integration for both numerator and denominator." + "This scalar flux-weighted average microscopic cross section is computed by `openmc.mgxs` for only the delayed-nu-fission and delayed neutron fraction reaction type at the moment. 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, universe, or mesh) define the bounds of integration for both numerator and denominator." ] }, { @@ -102,7 +102,7 @@ "### Multi-Group Prompt and Delayed Fission Spectrum\n", "The energy spectrum of neutrons emitted from fission is denoted by $\\chi_{n}(\\mathbf{r},E' \\rightarrow E'')$ for incoming and outgoing energies $E'$ and $E''$, respectively. Unlike the multi-group cross sections $\\sigma_{n,x,k,g}$ considered up to this point, the fission spectrum is a probability distribution and must sum to unity. The outgoing energy is typically much less dependent on the incoming energy for fission than for scattering interactions. As a result, it is common practice to integrate over the incoming neutron energy when computing the multi-group fission spectrum. The fission spectrum may be simplified as $\\chi_{n}(\\mathbf{r},E)$ with outgoing energy $E$.\n", "\n", - "Computing the cumulative energy spectrum of emitted neutrons, $\\chi_{n}(\\mathbf{r},E)$, has been presented in the `mgxs-part-i.ipynb` notebook. Here, we will present the energy spectrum of prompt and delayed emission neutrons, $\\chi_{n,p}(\\mathbf{r},E)$ and $\\chi_{n,d}(\\mathbf{r},E)$, respectively. Unlike the multi-group cross sections defined up to this point, the multi-group fission spectrum is weighted by the fission production rate rather than the scalar flux. This formulation is intended to preserve the total fission production rate in the multi-group deterministic calculation. In order to mathematically define the multi-group fission spectrum, we denote the microscopic fission cross section as $\\sigma_{n,f}(\\mathbf{r},E)$ and the average number of neutrons emitted from fission interactions with nuclide $n$ as $\\nu_{n,p}(\\mathbf{r},E)$ and $\\nu_{n,d}(\\mathbf{r},E)$ for prompt and delayed neutrons, respectively. The multi-group fission spectrum $\\chi_{n,k,g,d}$ is then the probability of fission neutrons emitted into energy group $g$. \n", + "Computing the cumulative energy spectrum of emitted neutrons, $\\chi_{n}(\\mathbf{r},E)$, has been presented in the `mgxs-part-i.ipynb` notebook. Here, we will present the energy spectrum of prompt and delayed emission neutrons, $\\chi_{n,p}(\\mathbf{r},E)$ and $\\chi_{n,d}(\\mathbf{r},E)$, respectively. Unlike the multi-group cross sections defined up to this point, the multi-group fission spectrum is weighted by the fission production rate rather than the scalar flux. This formulation is intended to preserve the total fission production rate in the multi-group deterministic calculation. In order to mathematically define the multi-group fission spectrum, we denote the microscopic fission cross section as $\\sigma_{n,f}(\\mathbf{r},E)$ and the average number of neutrons emitted from fission interactions with nuclide $n$ as $\\nu_{n,p}(\\mathbf{r},E)$ and $\\nu_{n,d}(\\mathbf{r},E)$ for prompt and delayed neutrons, respectively. The multi-group fission spectrum $\\chi_{n,k,g,d}$ is then the probability of fission neutrons emitted into energy group $g$ and delayed group $d$. There are not prompt groups, so inserting $p$ in place of $d$ just denotes all prompt neutrons. \n", "\n", "Similar to before, spatial homogenization and energy condensation are used to find the multi-energy-group and multi-delayed-group fission spectrum $\\chi_{n,k,g,d}$ as follows:\n", "\n", @@ -337,7 +337,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we are ready to generate multi-group cross sections! First, let's define a 2-energy-group structure using the built-in `EnergyGroups` class. We will also create a 6-delayed-group structure using the built-in `DelayedGroups` class." + "Now we are ready to generate multi-group cross sections! First, let's define a 100-energy-group structure and 1-energy-group structure using the built-in `EnergyGroups` class. We will also create a 6-delayed-group structure using the built-in `DelayedGroups` class." ] }, { @@ -389,7 +389,7 @@ "* `ChiDelayed`\n", "* `Beta`\n", "\n", - "These classes provide us with an interface to generate the tally inputs as well as perform post-processing of OpenMC's tally data to compute the respective multi-group cross sections. In this case, let's create the multi-group chi-prompt and prompt-nu-fission cross sections with our 2-energy-group structure and multi-group chi-delayed, delayed-nu-fission, and beta cross sections with our 2-energy-group and 6-delayed-group structures. " + "These classes provide us with an interface to generate the tally inputs as well as perform post-processing of OpenMC's tally data to compute the respective multi-group cross sections. In this case, let's create the multi-group chi-prompt, chi-delayed, and prompt-nu-fission cross sections with our 100-energy-group structure and multi-group delayed-nu-fission and beta cross sections with our 100-energy-group and 6-delayed-group structures. " ] }, { @@ -402,7 +402,7 @@ "source": [ "# Instantiate a few different sections\n", "chi_prompt = mgxs.ChiPrompt(domain=cell, groups=energy_groups, by_nuclide=True)\n", - "prompt_nu_fission = mgxs.PromptNuFissionXS(domain=cell, groups=one_group, by_nuclide=True)\n", + "prompt_nu_fission = mgxs.PromptNuFissionXS(domain=cell, groups=energy_groups, by_nuclide=True)\n", "chi_delayed = mgxs.ChiDelayed(domain=cell, energy_groups=energy_groups, by_nuclide=True)\n", "delayed_nu_fission = mgxs.DelayedNuFissionXS(domain=cell, energy_groups=energy_groups, delayed_groups=delayed_groups, by_nuclide=True)\n", "beta = mgxs.Beta(domain=cell, energy_groups=energy_groups, delayed_groups=delayed_groups, by_nuclide=True)\n", @@ -514,7 +514,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The `Beta` object includes tracklength tallies for the 'nu-fission' and 'delayed-nu-fission' scores in the 2-energy-group and 6-delayed-group structure in cell 1. Now that each `MGXS` and `MDGXS` object contains the tallies that it needs, we must add these tallies to a `Tallies` object to generate the \"tallies.xml\" input file for OpenMC." + "The `Beta` object includes tracklength tallies for the 'nu-fission' and 'delayed-nu-fission' scores in the 100-energy-group and 6-delayed-group structure in cell 1. Now that each `MGXS` and `MDGXS` object contains the tallies that it needs, we must add these tallies to a `Tallies` object to generate the \"tallies.xml\" input file for OpenMC." ] }, { @@ -784,7 +784,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Let's first inspect our delayed-nu-fission section by printing it to the screen." + "Let's first inspect our delayed-nu-fission section by printing it to the screen after condensing the cross section down to one group." ] }, { @@ -1043,7 +1043,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The following code snippet shows how to export the chi `MGXS` to the same HDF5 binary data store." + "The following code snippet shows how to export the chi-prompt and chi-delayed `MGXS` to the same HDF5 binary data store." ] }, { @@ -1248,7 +1248,7 @@ } ], "source": [ - "# Set the time constants for the delayed precursors (in seconds^-1)\n", + "# Set the time constants for the delayed precursors (in seconds^-1) using some ficticious time constant data.\n", "precursor_halflife = np.array([55.6, 24.5, 16.3, 2.37, 0.424, 0.195])\n", "precursor_lambda = -np.log(0.5) / precursor_halflife\n", "\n", @@ -1349,7 +1349,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We can also plot the fission spectrum for the prompt and delayed neutrons." + "We can also plot the energy spectrum for fission emission of prompt and delayed neutrons." ] }, { diff --git a/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb new file mode 100644 index 0000000000..bb740b7bc3 --- /dev/null +++ b/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb @@ -0,0 +1,1395 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This IPython Notebook illustrates the use of the **`openmc.mgxs.Library`** class. The `Library` class is designed to automate the calculation of multi-group cross sections for use cases with one or more domains, cross section types, and/or nuclides. In particular, this Notebook illustrates the following features:\n", + "\n", + "* Calculation of multi-energy-group and multi-delayed-group cross sections for a **fuel assembly**\n", + "* Automated creation, manipulation and storage of `MGXS` with **`openmc.mgxs.Library`**\n", + "* Steady-state pin-by-pin **delayed neutron fractions (beta)** for each delayed group.\n", + "* Generation of surface currents on the interfaces and surfaces of a Mesh." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Generate Input Files" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/__init__.py:1350: UserWarning: This call to matplotlib.use() has no effect\n", + "because the backend has already been chosen;\n", + "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", + "or matplotlib.backends is imported for the first time.\n", + "\n", + " warnings.warn(_use_error_msg)\n" + ] + } + ], + "source": [ + "import math\n", + "import pickle\n", + "\n", + "from IPython.display import Image\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "import openmc\n", + "import openmc.mgxs\n", + "import openmoc\n", + "import openmoc.process\n", + "from openmoc.opencg_compatible import get_openmoc_geometry\n", + "from openmoc.materialize import load_openmc_mgxs_lib\n", + "\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "First we need to define materials that will be used in the problem. Before defining a material, we must create nuclides that are used in the material." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate some Nuclides\n", + "h1 = openmc.Nuclide('H1')\n", + "b10 = openmc.Nuclide('B10')\n", + "o16 = openmc.Nuclide('O16')\n", + "u235 = openmc.Nuclide('U235')\n", + "u238 = openmc.Nuclide('U238')\n", + "zr90 = openmc.Nuclide('Zr90')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the nuclides we defined, we will now create three materials for the fuel, water, and cladding of the fuel pins." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# 1.6 enriched fuel\n", + "fuel = openmc.Material(name='1.6% Fuel')\n", + "fuel.set_density('g/cm3', 10.31341)\n", + "fuel.add_nuclide(u235, 3.7503e-4)\n", + "fuel.add_nuclide(u238, 2.2625e-2)\n", + "fuel.add_nuclide(o16, 4.6007e-2)\n", + "\n", + "# borated water\n", + "water = openmc.Material(name='Borated Water')\n", + "water.set_density('g/cm3', 0.740582)\n", + "water.add_nuclide(h1, 4.9457e-2)\n", + "water.add_nuclide(o16, 2.4732e-2)\n", + "water.add_nuclide(b10, 8.0042e-6)\n", + "\n", + "# zircaloy\n", + "zircaloy = openmc.Material(name='Zircaloy')\n", + "zircaloy.set_density('g/cm3', 6.55)\n", + "zircaloy.add_nuclide(zr90, 7.2758e-3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With our three materials, we can now create a `Materials` object that can be exported to an actual XML file." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Instantiate a Materials object\n", + "materials_file = openmc.Materials((fuel, water, zircaloy))\n", + "materials_file.default_xs = '71c'\n", + "\n", + "# Export to \"materials.xml\"\n", + "materials_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now let's move on to the geometry. This problem will be a square array of fuel pins and control rod guide tubes for which we can use OpenMC's lattice/universe feature. The basic universe will have three regions for the fuel, the clad, and the surrounding coolant. The first step is to create the bounding surfaces for fuel and clad, as well as the outer bounding surfaces of the problem." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create cylinders for the fuel and clad\n", + "fuel_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.39218)\n", + "clad_outer_radius = openmc.ZCylinder(x0=0.0, y0=0.0, R=0.45720)\n", + "\n", + "# Create boundary planes to surround the geometry\n", + "min_x = openmc.XPlane(x0=-10.71, boundary_type='reflective')\n", + "max_x = openmc.XPlane(x0=+10.71, boundary_type='reflective')\n", + "min_y = openmc.YPlane(y0=-10.71, boundary_type='reflective')\n", + "max_y = openmc.YPlane(y0=+10.71, boundary_type='reflective')\n", + "min_z = openmc.ZPlane(z0=-10., boundary_type='reflective')\n", + "max_z = openmc.ZPlane(z0=+10., boundary_type='reflective')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the surfaces defined, we can now construct a fuel pin cell from cells that are defined by intersections of half-spaces created by the surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# Create a Universe to encapsulate a fuel pin\n", + "fuel_pin_universe = openmc.Universe(name='1.6% Fuel Pin')\n", + "\n", + "# Create fuel Cell\n", + "fuel_cell = openmc.Cell(name='1.6% Fuel')\n", + "fuel_cell.fill = fuel\n", + "fuel_cell.region = -fuel_outer_radius\n", + "fuel_pin_universe.add_cell(fuel_cell)\n", + "\n", + "# Create a clad Cell\n", + "clad_cell = openmc.Cell(name='1.6% Clad')\n", + "clad_cell.fill = zircaloy\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", + "fuel_pin_universe.add_cell(clad_cell)\n", + "\n", + "# Create a moderator Cell\n", + "moderator_cell = openmc.Cell(name='1.6% Moderator')\n", + "moderator_cell.fill = water\n", + "moderator_cell.region = +clad_outer_radius\n", + "fuel_pin_universe.add_cell(moderator_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Likewise, we can construct a control rod guide tube with the same surfaces." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create a Universe to encapsulate a control rod guide tube\n", + "guide_tube_universe = openmc.Universe(name='Guide Tube')\n", + "\n", + "# Create guide tube Cell\n", + "guide_tube_cell = openmc.Cell(name='Guide Tube Water')\n", + "guide_tube_cell.fill = water\n", + "guide_tube_cell.region = -fuel_outer_radius\n", + "guide_tube_universe.add_cell(guide_tube_cell)\n", + "\n", + "# Create a clad Cell\n", + "clad_cell = openmc.Cell(name='Guide Clad')\n", + "clad_cell.fill = zircaloy\n", + "clad_cell.region = +fuel_outer_radius & -clad_outer_radius\n", + "guide_tube_universe.add_cell(clad_cell)\n", + "\n", + "# Create a moderator Cell\n", + "moderator_cell = openmc.Cell(name='Guide Tube Moderator')\n", + "moderator_cell.fill = water\n", + "moderator_cell.region = +clad_outer_radius\n", + "guide_tube_universe.add_cell(moderator_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Using the pin cell universe, we can construct a 17x17 rectangular lattice with a 1.26 cm pitch." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create fuel assembly Lattice\n", + "assembly = openmc.RectLattice(name='1.6% Fuel Assembly')\n", + "assembly.pitch = (1.26, 1.26)\n", + "assembly.lower_left = [-1.26 * 17. / 2.0] * 2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we create a NumPy array of fuel pin and guide tube universes for the lattice." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create array indices for guide tube locations in lattice\n", + "template_x = np.array([5, 8, 11, 3, 13, 2, 5, 8, 11, 14, 2, 5, 8,\n", + " 11, 14, 2, 5, 8, 11, 14, 3, 13, 5, 8, 11])\n", + "template_y = np.array([2, 2, 2, 3, 3, 5, 5, 5, 5, 5, 8, 8, 8, 8,\n", + " 8, 11, 11, 11, 11, 11, 13, 13, 14, 14, 14])\n", + "\n", + "# Initialize an empty 17x17 array of the lattice universes\n", + "universes = np.empty((17, 17), dtype=openmc.Universe)\n", + "\n", + "# Fill the array with the fuel pin and guide tube universes\n", + "universes[:,:] = fuel_pin_universe\n", + "universes[template_x, template_y] = guide_tube_universe\n", + "\n", + "# Store the array of universes in the lattice\n", + "assembly.universes = universes" + ] + }, + { + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create root Cell\n", + "root_cell = openmc.Cell(name='root cell')\n", + "root_cell.fill = assembly\n", + "\n", + "# Add boundary planes\n", + "root_cell.region = +min_x & -max_x & +min_y & -max_y & +min_z & -max_z\n", + "\n", + "# Create root Universe\n", + "root_universe = openmc.Universe(universe_id=0, name='root universe')\n", + "root_universe.add_cell(root_cell)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now must create a geometry that is assigned a root universe and export it to XML." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Create Geometry and set root Universe\n", + "geometry = openmc.Geometry()\n", + "geometry.root_universe = root_universe" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Export to \"geometry.xml\"\n", + "geometry.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the geometry and materials finished, we now just need to define simulation parameters. In this case, we will use 10 inactive batches and 40 active batches each with 2500 particles." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# OpenMC simulation parameters\n", + "batches = 50\n", + "inactive = 10\n", + "particles = 2500\n", + "\n", + "# Instantiate a Settings object\n", + "settings_file = openmc.Settings()\n", + "settings_file.batches = batches\n", + "settings_file.inactive = inactive\n", + "settings_file.particles = particles\n", + "settings_file.output = {'tallies': False}\n", + "\n", + "# Create an initial uniform spatial source distribution over fissionable zones\n", + "bounds = [-10.71, -10.71, -10, 10.71, 10.71, 10.]\n", + "uniform_dist = openmc.stats.Box(bounds[:3], bounds[3:], only_fissionable=True)\n", + "settings_file.source = openmc.source.Source(space=uniform_dist)\n", + "\n", + "# Export to \"settings.xml\"\n", + "settings_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us also create a `Plots` file that we can use to verify that our fuel assembly geometry was created successfully." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a Plot\n", + "plot = openmc.Plot(plot_id=1)\n", + "plot.filename = 'materials-xy'\n", + "plot.origin = [0, 0, 0]\n", + "plot.pixels = [250, 250]\n", + "plot.width = [-10.71*2, -10.71*2]\n", + "plot.color = 'mat'\n", + "\n", + "# Instantiate a Plots object, add Plot, and export to \"plots.xml\"\n", + "plot_file = openmc.Plots([plot])\n", + "plot_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the plots.xml file, we can now generate and view the plot. OpenMC outputs plots in .ppm format, which can be converted into a compressed format like .png with the convert utility." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run openmc in plotting mode\n", + "openmc.plot_geometry(output=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Convert OpenMC's funky ppm to png\n", + "!convert materials-xy.ppm materials-xy.png\n", + "\n", + "# Display the materials plot inline\n", + "Image(filename='materials-xy.png')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see from the plot, we have a nice array of fuel and guide tube pin cells with fuel, cladding, and water!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Create an MGXS Library" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we are ready to generate multi-group cross sections! First, let's define 20-energy-group, 1-energy-group, and 6-delayed-group structures using the built-in `EnergyGroups` and `DelayedGroups` classes." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a 20-group EnergyGroups object\n", + "energy_groups = openmc.mgxs.EnergyGroups()\n", + "energy_groups.group_edges = np.logspace(-9,1.3,21)\n", + "\n", + "# Instantiate a 1-group EnergyGroups object\n", + "one_group = openmc.mgxs.EnergyGroups()\n", + "one_group.group_edges = np.array([energy_groups.group_edges[0], energy_groups.group_edges[-1]])\n", + "\n", + "# Instantiate a 6-group DelayedGroups object\n", + "delayed_groups = openmc.mgxs.DelayedGroups()\n", + "delayed_groups.groups = range(1,7)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Next, we will instantiate an `openmc.mgxs.Library` for the energy and delayed groups with our the fuel assembly geometry." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Instantiate a tally mesh \n", + "mesh = openmc.Mesh(mesh_id=1)\n", + "mesh.type = 'regular'\n", + "mesh.dimension = [17, 17, 1]\n", + "mesh.lower_left = [-10.71, -10.71, -10000.]\n", + "mesh.width = [1.26, 1.26, 20000.]\n", + "\n", + "# Initialize an 20-energy-group and 6-delayed-group MGXS Library\n", + "mgxs_lib = openmc.mgxs.Library(geometry)\n", + "mgxs_lib.energy_groups = energy_groups\n", + "mgxs_lib.delayed_groups = delayed_groups\n", + "\n", + "# Specify multi-group cross section types to compute\n", + "mgxs_lib.mgxs_types = ['total', 'transport', 'nu-scatter matrix', 'kappa-fission', 'inverse-velocity', 'chi-prompt',\n", + " 'prompt-nu-fission', 'chi-delayed', 'delayed-nu-fission', 'beta']\n", + "\n", + "# Specify a \"mesh\" domain type for the cross section tally filters\n", + "mgxs_lib.domain_type = 'mesh'\n", + "\n", + "# Specify the mesh domain over which to compute multi-group cross sections\n", + "mgxs_lib.domains = [mesh]\n", + "\n", + "# Construct all tallies needed for the multi-group cross section library\n", + "mgxs_lib.build_library()\n", + "\n", + "# Create a \"tallies.xml\" file for the MGXS Library\n", + "tallies_file = openmc.Tallies()\n", + "mgxs_lib.add_to_tallies_file(tallies_file, merge=True)\n", + "\n", + "# Instantiate a current tally\n", + "mesh_filter = openmc.Filter()\n", + "mesh_filter.mesh = mesh\n", + "current_tally = openmc.Tally(name='current tally')\n", + "current_tally.scores = ['current']\n", + "current_tally.filters = [mesh_filter]\n", + "\n", + "# Add current tally to the tallies file\n", + "tallies_file.append(current_tally)\n", + "\n", + "# Export to \"tallies.xml\"\n", + "tallies_file.export_to_xml()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now, we can run OpenMC to generate the cross sections." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " .d88888b. 888b d888 .d8888b.\n", + " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", + " 888 888 88888b.d88888 888 888\n", + " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", + " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", + " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", + " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", + " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", + "__________________888______________________________________________________\n", + " 888\n", + " 888\n", + "\n", + " Copyright: 2011-2016 Massachusetts Institute of Technology\n", + " License: http://openmc.readthedocs.io/en/latest/license.html\n", + " Version: 0.8.0\n", + " Git SHA1: e8819e6a77f2e998dcce937e80fbdd8dd430b667\n", + " Date/Time: 2016-08-03 00:11:15\n", + " MPI Processes: 4\n", + "\n", + " ===========================================================================\n", + " ========================> INITIALIZATION <=========================\n", + " ===========================================================================\n", + "\n", + " Reading settings XML file...\n", + " Reading geometry XML file...\n", + " Reading cross sections XML file...\n", + " Reading materials XML file...\n", + " Reading U235.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/U235_71c.h5\n", + " Reading U238.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/U238_71c.h5\n", + " Reading O16.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/O16_71c.h5\n", + " Reading H1.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/H1_71c.h5\n", + " Reading B10.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/B10_71c.h5\n", + " Reading Zr90.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/Zr90_71c.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", + " Reading tallies XML file...\n", + " WARNING: A delayedgroup filter was used on a total nuclide tally. Cross section\n", + " libraries are not guaranteed to have the same delayed group structure\n", + " across all isotopes. In particular, ENDF/B-VII.1 does not have a\n", + " consistent delayed group structure across all isotopes while the JEFF\n", + " 3.1.1 library has the same delayed group structure across all\n", + " isotopes. Use with caution!\n", + " WARNING: A delayedgroup filter was used on a total nuclide tally. Cross section\n", + " libraries are not guaranteed to have the same delayed group structure\n", + " across all isotopes. In particular, ENDF/B-VII.1 does not have a\n", + " consistent delayed group structure across all isotopes while the JEFF\n", + " 3.1.1 library has the same delayed group structure across all\n", + " isotopes. Use with caution!\n", + " WARNING: A delayedgroup filter was used on a total nuclide tally. Cross section\n", + " libraries are not guaranteed to have the same delayed group structure\n", + " across all isotopes. In particular, ENDF/B-VII.1 does not have a\n", + " consistent delayed group structure across all isotopes while the JEFF\n", + " 3.1.1 library has the same delayed group structure across all\n", + " isotopes. Use with caution!\n", + " WARNING: A delayedgroup filter was used on a total nuclide tally. Cross section\n", + " libraries are not guaranteed to have the same delayed group structure\n", + " across all isotopes. In particular, ENDF/B-VII.1 does not have a\n", + " consistent delayed group structure across all isotopes while the JEFF\n", + " 3.1.1 library has the same delayed group structure across all\n", + " isotopes. Use with caution!\n", + " WARNING: A delayedgroup filter was used on a total nuclide tally. Cross section\n", + " libraries are not guaranteed to have the same delayed group structure\n", + " across all isotopes. In particular, ENDF/B-VII.1 does not have a\n", + " consistent delayed group structure across all isotopes while the JEFF\n", + " 3.1.1 library has the same delayed group structure across all\n", + " isotopes. Use with caution!\n", + " WARNING: A delayedgroup filter was used on a total nuclide tally. Cross section\n", + " libraries are not guaranteed to have the same delayed group structure\n", + " across all isotopes. In particular, ENDF/B-VII.1 does not have a\n", + " consistent delayed group structure across all isotopes while the JEFF\n", + " 3.1.1 library has the same delayed group structure across all\n", + " isotopes. Use with caution!\n", + " WARNING: A delayedgroup filter was used on a total nuclide tally. Cross section\n", + " libraries are not guaranteed to have the same delayed group structure\n", + " across all isotopes. In particular, ENDF/B-VII.1 does not have a\n", + " consistent delayed group structure across all isotopes while the JEFF\n", + " 3.1.1 library has the same delayed group structure across all\n", + " isotopes. Use with caution!\n", + " Building neighboring cells lists for each surface...\n", + " WARNING: A delayedgroup filter was used on a total nuclide tally. Cross section\n", + " libraries are not guaranteed to have the same delayed group structure\n", + " across all isotopes. In particular, ENDF/B-VII.1 does not have a\n", + " consistent delayed group structure across all isotopes while the JEFF\n", + " 3.1.1 library has the same delayed group structure across all\n", + " isotopes. Use with caution!\n", + " WARNING: A delayedgroup filter was used on a total nuclide tally. Cross section\n", + " libraries are not guaranteed to have the same delayed group structure\n", + " across all isotopes. In particular, ENDF/B-VII.1 does not have a\n", + " consistent delayed group structure across all isotopes while the JEFF\n", + " 3.1.1 library has the same delayed group structure across all\n", + " isotopes. Use with caution!\n", + " WARNING: A delayedgroup filter was used on a total nuclide tally. Cross section\n", + " libraries are not guaranteed to have the same delayed group structure\n", + " across all isotopes. In particular, ENDF/B-VII.1 does not have a\n", + " consistent delayed group structure across all isotopes while the JEFF\n", + " 3.1.1 library has the same delayed group structure across all\n", + " isotopes. Use with caution!\n", + " WARNING: A delayedgroup filter was used on a total nuclide tally. Cross section\n", + " libraries are not guaranteed to have the same delayed group structure\n", + " across all isotopes. In particular, ENDF/B-VII.1 does not have a\n", + " consistent delayed group structure across all isotopes while the JEFF\n", + " 3.1.1 library has the same delayed group structure across all\n", + " isotopes. Use with caution!\n", + " WARNING: A delayedgroup filter was used on a total nuclide tally. Cross section\n", + " libraries are not guaranteed to have the same delayed group structure\n", + " across all isotopes. In particular, ENDF/B-VII.1 does not have a\n", + " consistent delayed group structure across all isotopes while the JEFF\n", + " 3.1.1 library has the same delayed group structure across all\n", + " isotopes. Use with caution!\n", + " Initializing source particles...\n", + "\n", + " ===========================================================================\n", + " ====================> K EIGENVALUE SIMULATION <====================\n", + " ===========================================================================\n", + "\n", + " Bat./Gen. k Average k \n", + " ========= ======== ==================== \n", + " 1/1 1.03852 \n", + " 2/1 0.99743 \n", + " 3/1 1.02987 \n", + " 4/1 1.04472 \n", + " 5/1 1.02183 \n", + " 6/1 1.05263 \n", + " 7/1 0.99048 \n", + " 8/1 1.02753 \n", + " 9/1 1.03159 \n", + " 10/1 1.04005 \n", + " 11/1 1.05278 \n", + " 12/1 1.02555 1.03917 +/- 0.01362\n", + " 13/1 0.99400 1.02411 +/- 0.01699\n", + " 14/1 1.03508 1.02685 +/- 0.01232\n", + " 15/1 1.00055 1.02159 +/- 0.01090\n", + " 16/1 1.01334 1.02022 +/- 0.00900\n", + " 17/1 0.99822 1.01707 +/- 0.00823\n", + " 18/1 1.01767 1.01715 +/- 0.00713\n", + " 19/1 1.05052 1.02086 +/- 0.00730\n", + " 20/1 1.03133 1.02190 +/- 0.00661\n", + " 21/1 1.04112 1.02365 +/- 0.00623\n", + " 22/1 1.04175 1.02516 +/- 0.00588\n", + " 23/1 1.01909 1.02469 +/- 0.00543\n", + " 24/1 1.07119 1.02801 +/- 0.00603\n", + " 25/1 0.97414 1.02442 +/- 0.00666\n", + " 26/1 1.04709 1.02584 +/- 0.00639\n", + " 27/1 1.05872 1.02777 +/- 0.00631\n", + " 28/1 1.03930 1.02841 +/- 0.00598\n", + " 29/1 1.01488 1.02770 +/- 0.00570\n", + " 30/1 1.04513 1.02857 +/- 0.00548\n", + " 31/1 0.99538 1.02699 +/- 0.00545\n", + " 32/1 1.00106 1.02581 +/- 0.00532\n", + " 33/1 0.99389 1.02442 +/- 0.00527\n", + " 34/1 0.99938 1.02338 +/- 0.00516\n", + " 35/1 1.02161 1.02331 +/- 0.00495\n", + " 36/1 1.04084 1.02398 +/- 0.00480\n", + " 37/1 0.98801 1.02265 +/- 0.00481\n", + " 38/1 1.01348 1.02232 +/- 0.00464\n", + " 39/1 1.06693 1.02386 +/- 0.00474\n", + " 40/1 1.07729 1.02564 +/- 0.00491\n", + " 41/1 1.03191 1.02585 +/- 0.00475\n", + " 42/1 1.05209 1.02667 +/- 0.00468\n", + " 43/1 1.02997 1.02677 +/- 0.00453\n", + " 44/1 1.07288 1.02812 +/- 0.00460\n", + " 45/1 1.01268 1.02768 +/- 0.00449\n", + " 46/1 1.03759 1.02796 +/- 0.00437\n", + " 47/1 1.02620 1.02791 +/- 0.00425\n", + " 48/1 1.02509 1.02783 +/- 0.00414\n", + " 49/1 1.01043 1.02739 +/- 0.00406\n", + " 50/1 1.01457 1.02707 +/- 0.00397\n", + " Creating state point statepoint.50.h5...\n", + "\n", + " ===========================================================================\n", + " ======================> SIMULATION FINISHED <======================\n", + " ===========================================================================\n", + "\n", + "\n", + " =======================> TIMING STATISTICS <=======================\n", + "\n", + " Total time for initialization = 6.4100E-01 seconds\n", + " Reading cross sections = 3.6400E-01 seconds\n", + " Total time in simulation = 2.6284E+01 seconds\n", + " Time in transport only = 2.5289E+01 seconds\n", + " Time in inactive batches = 1.3870E+00 seconds\n", + " Time in active batches = 2.4897E+01 seconds\n", + " Time synchronizing fission bank = 3.9900E-01 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 5.6100E-01 seconds\n", + " Total time for finalization = 1.1000E-02 seconds\n", + " Total time elapsed = 2.6944E+01 seconds\n", + " Calculation Rate (inactive) = 18024.5 neutrons/second\n", + " Calculation Rate (active) = 4016.55 neutrons/second\n", + "\n", + " ============================> RESULTS <============================\n", + "\n", + " k-effective (Collision) = 1.02489 +/- 0.00308\n", + " k-effective (Track-length) = 1.02707 +/- 0.00397\n", + " k-effective (Absorption) = 1.02637 +/- 0.00325\n", + " Combined k-effective = 1.02581 +/- 0.00264\n", + " Leakage Fraction = 0.00000 +/- 0.00000\n", + "\n" + ] + }, + { + "data": { + "text/plain": [ + "0" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Run OpenMC\n", + "openmc.run(mpi_procs=4)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Tally Data Processing" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Our simulation ran successfully and created statepoint and summary output files. We begin our analysis by instantiating a `StatePoint` object. " + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Load the last statepoint file\n", + "sp = openmc.StatePoint('statepoint.50.h5')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The statepoint is now ready to be analyzed by the `Library`. We simply have to load the tallies from the statepoint into the `Library` and our `MGXS` objects will compute the cross sections for us under-the-hood." + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# Initialize MGXS Library with OpenMC statepoint data\n", + "mgxs_lib.load_from_statepoint(sp)\n", + "\n", + "# Extrack the current tally separately\n", + "current_tally = sp.get_tally(name='current tally')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Using Tally Arithmetic to Compute the Delayed Neutron Precursor Concentrations" + ] + }, + { + "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 compute the delayed neutron precursor concentrations using the `Beta` and `DelayedNuFissionXS` objects. The delayed neutron precursor concentrations are modeled using the following equations:\n", + "\n", + "$$\\frac{\\partial}{\\partial t} C_{k,d} (t) = \\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r} \\beta_{k,d} (t) \\nu_d \\sigma_{f,x}(\\mathbf{r},E',t)\\Phi(\\mathbf{r},E',t) - \\lambda_{d} C_{k,d} (t) $$\n", + "\n", + "$$C_{k,d} (t=0) = \\frac{1}{\\lambda_{d}} \\int_{0}^{\\infty}\\mathrm{d}E'\\int_{\\mathbf{r} \\in V_{k}}\\mathrm{d}\\mathbf{r} \\beta_{k,d} (t=0) \\nu_d \\sigma_{f,x}(\\mathbf{r},E',t=0)\\Phi(\\mathbf{r},E',t=0) $$" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1944: RuntimeWarning: invalid value encountered in true_divide\n", + "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1945: RuntimeWarning: invalid value encountered in true_divide\n", + "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1946: RuntimeWarning: divide by zero encountered in true_divide\n", + "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1946: RuntimeWarning: invalid value encountered in true_divide\n", + "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1938: RuntimeWarning: invalid value encountered in true_divide\n", + "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1939: RuntimeWarning: invalid value encountered in true_divide\n" + ] + }, + { + "data": { + "text/html": [ + "
\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", + "
mesh 1delayedgroupnuclidescoremeanstd. dev.
xyz
01111total(((delayed-nu-fission / nu-fission) * (delayed...0.0033810.000837
11112total(((delayed-nu-fission / nu-fission) * (delayed...0.0009600.000074
21113total(((delayed-nu-fission / nu-fission) * (delayed...0.0069460.000771
31114total(((delayed-nu-fission / nu-fission) * (delayed...0.0747210.005119
41115total(((delayed-nu-fission / nu-fission) * (delayed...0.0341060.002235
51116total(((delayed-nu-fission / nu-fission) * (delayed...0.0025000.000358
61211total(((delayed-nu-fission / nu-fission) * (delayed...0.0066420.001718
71212total(((delayed-nu-fission / nu-fission) * (delayed...0.0011570.000075
81213total(((delayed-nu-fission / nu-fission) * (delayed...0.0067080.000578
91214total(((delayed-nu-fission / nu-fission) * (delayed...0.0765150.005032
\n", + "
" + ], + "text/plain": [ + " mesh 1 delayedgroup nuclide \\\n", + " x y z \n", + "0 1 1 1 1 total \n", + "1 1 1 1 2 total \n", + "2 1 1 1 3 total \n", + "3 1 1 1 4 total \n", + "4 1 1 1 5 total \n", + "5 1 1 1 6 total \n", + "6 1 2 1 1 total \n", + "7 1 2 1 2 total \n", + "8 1 2 1 3 total \n", + "9 1 2 1 4 total \n", + "\n", + " score mean std. dev. \n", + " \n", + "0 (((delayed-nu-fission / nu-fission) * (delayed... 0.003381 0.000837 \n", + "1 (((delayed-nu-fission / nu-fission) * (delayed... 0.000960 0.000074 \n", + "2 (((delayed-nu-fission / nu-fission) * (delayed... 0.006946 0.000771 \n", + "3 (((delayed-nu-fission / nu-fission) * (delayed... 0.074721 0.005119 \n", + "4 (((delayed-nu-fission / nu-fission) * (delayed... 0.034106 0.002235 \n", + "5 (((delayed-nu-fission / nu-fission) * (delayed... 0.002500 0.000358 \n", + "6 (((delayed-nu-fission / nu-fission) * (delayed... 0.006642 0.001718 \n", + "7 (((delayed-nu-fission / nu-fission) * (delayed... 0.001157 0.000075 \n", + "8 (((delayed-nu-fission / nu-fission) * (delayed... 0.006708 0.000578 \n", + "9 (((delayed-nu-fission / nu-fission) * (delayed... 0.076515 0.005032 " + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Set the time constants for the delayed precursors (in seconds^-1)\n", + "precursor_halflife = np.array([55.6, 24.5, 16.3, 2.37, 0.424, 0.195])\n", + "precursor_lambda = -np.log(0.5) / precursor_halflife\n", + "\n", + "beta = mgxs_lib.get_mgxs(mesh, 'beta')\n", + "\n", + "# Create a tally object with only the delayed group filter for the time constants\n", + "beta_filters = [f for f in beta.xs_tally.filters if f.type != 'delayedgroup']\n", + "lambda_tally = beta.xs_tally.summation(nuclides=beta.xs_tally.nuclides)\n", + "for f in beta_filters:\n", + " lambda_tally = lambda_tally.summation(filter_type=f.type, remove_filter=True) * 0. + 1.\n", + "\n", + "# Set the mean of the lambda tally and reshape to account for nuclides and scores\n", + "lambda_tally._mean = precursor_lambda\n", + "lambda_tally._mean.shape = lambda_tally.std_dev.shape\n", + "\n", + "# Set a total nuclide and lambda score\n", + "lambda_tally.nuclides = [openmc.Nuclide(name='total')]\n", + "lambda_tally.scores = ['lambda']\n", + "\n", + "delayed_nu_fission = mgxs_lib.get_mgxs(mesh, 'delayed-nu-fission')\n", + "\n", + "# Use tally arithmetic to compute the precursor concentrations\n", + "precursor_conc = beta.xs_tally.summation(filter_type='energy', remove_filter=True) * \\\n", + " delayed_nu_fission.xs_tally.summation(filter_type='energy', remove_filter=True) / lambda_tally\n", + " \n", + "# The difference is a derived tally which can generate Pandas DataFrames for inspection\n", + "precursor_conc.get_pandas_dataframe().head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Another useful feature of the Python API is the ability to extract the surface currents for the interfaces and surfaces of a mesh. We can inspect the currents for the mesh by getting the pandas dataframe." + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + "
mesh 1surfacenuclidescoremeanstd. dev.
xyz
0111x-mintotalcurrent0.000000.000000
1111x-maxtotalcurrent0.029860.000678
2111y-mintotalcurrent0.000000.000000
3111y-maxtotalcurrent0.030910.000636
4111z-mintotalcurrent0.000000.000000
5111z-maxtotalcurrent0.000000.000000
6121x-mintotalcurrent0.000000.000000
7121x-maxtotalcurrent0.031340.000669
8121y-mintotalcurrent0.030550.000605
9121y-maxtotalcurrent0.031130.000634
\n", + "
" + ], + "text/plain": [ + " mesh 1 surface nuclide score mean std. dev.\n", + " x y z \n", + "0 1 1 1 x-min total current 0.00000 0.000000\n", + "1 1 1 1 x-max total current 0.02986 0.000678\n", + "2 1 1 1 y-min total current 0.00000 0.000000\n", + "3 1 1 1 y-max total current 0.03091 0.000636\n", + "4 1 1 1 z-min total current 0.00000 0.000000\n", + "5 1 1 1 z-max total current 0.00000 0.000000\n", + "6 1 2 1 x-min total current 0.00000 0.000000\n", + "7 1 2 1 x-max total current 0.03134 0.000669\n", + "8 1 2 1 y-min total current 0.03055 0.000605\n", + "9 1 2 1 y-max total current 0.03113 0.000634" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "current_tally.get_pandas_dataframe().head(10)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Cross Section Visualizations" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In addition to inspecting the data in the tallies by getting the pandas dataframe, we can also plot the tally data on the domain mesh. Below is the delayed neutron fraction tallied in each mesh cell for each delayed group." + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\nDmZmZmZmZmbW5TzgYGZmZmZmZmZdzgMOZmZmZmZmZtblPOBgZmZmZmZmZl3OAw5mZmZmZmZm1uU8\n4GBmZmZmZmZmXc4DDmZmZmZmZmbW5TzgYGZmZmZmZmZdzgMOZmZmZmZmZtblPOBgZmZmZmZmZl3O\nAw5mZmZmZmZm1uU84GBmZmZmZmZmXc4DDusJSZMlnZlx2ycl7d/dfapqcz9JT/Vkm2ZmPck5bGZW\nPmexWXPxgEMdkuZLelXSy5Kel3S9pJ0y1jpIaouyO9CI9N91ZdZfYmbWGOdwt1gnc7jqZ+FlSTeV\n3Sez3sJZ3C3WySwGkHSKpCck/UvSo5KGlt0na24ecKgvgEMiYnNgB+AfwIUZa8U6HCTNTlJrCW32\nAS4A7u7pts16Medwkyohh1f9LKSP0T3cvllv5ixuUj2dxZI+C3wGOCgiNgU+DPxfT/bB1j0ecOiY\nACLidWAqsOuqFVJfSedKWiDpGUk/krShpI2BG4EdJf0zHQ3uL+ldkv4iaamkpyVdmP4RW6xj0h6S\n7pP0kqQpwEZV6z8s6YG0vTskvb3Ofur2S9JFks6t2n6apC+mz3eQNFXSPyT9XdIXKrbbSNLPJb0g\n6RHgXZ28n1GS5qb9+KGkGZKOTdeNS9/D+ZKeB8Yr8Y101P3ZtK3N0u3XGk2vnDInabyk30iakv77\n/FXS7p185F8GbgbmdrKdmXUt57BzeNUuOllvZt3HWdzLs1iSgG8CX4qIxwAi4smIeLGj92PmAYcM\n0sD8BHBXxeJzgKHA7ul/dwS+GRGvAgcBiyNis/SbmGeBNuC/gH7A3sD+wIkF+7MBcA1wWbq/3wAf\nq1i/JzAJOD5d/xNgWlpXraN+XQaMrdjv1un6K9PQuR54gGS0+wDgFEkfSjefALwxfRwIjOvg/Wyd\nvofTgK2Bx9K+VHo38DdgW+DbJKOrnwL2A94EbAb8sGL7zkbTDwV+DWwF/Aq4VnVGiSUNTts7Ex/w\nmpXCObxqv70yh1NXSFoi6aYMgxNm1g2cxav22xuzeED6eLukhenAyoRO9m0GEeFHjQfwJPAy8AKw\nHFgE7Fax/l/AGyte7w08kT7fD1jYyf5PAa4u2Lf3AYuqlt0JnJk+vxiYWLV+LvC+ive2f5Z+AY8C\nB6TPTwJuSJ+/G5hfVXs6MCl9/nfgQxXrjq/3mQCfBO6sWrYQODZ9Pq5GW7cC/1nx+i3AMpJBtLU+\n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\neuPVxnRsyZiOLXtfXzzliVq7DchEZX2NMUvHOIJsgsgeRwPXR0Q38Likm4E3A0tqfjgzsyGkH+Zw\nMDOzJjmL81MaejdwJ5Ci68FaP07W176qu9y5StTd+sY3ljrXL+I9hWu+1H5yqXM92r1P8XPFfxWu\nmfqtEwvXAHzg5FmFa8ZFuZVVfhUdxWs+/P5S5/rsles1HDZ0/kFnFK55501zCtcAfDr+t3DNR9uu\nISKK/Q+ZSIpbYkyuff9R89c7T/rL/31kk0b+mWy82VEV3b2QdALwhog4QdJE4PCI6Jk08jLgLWRD\nKW4ARkdESPoh8ERETKpxzYcCp0XEARXbTgX2iIjjJW2ermNCRNyb/9vYsJTJYYB2rWq803rnKpff\n83b+h8I1v4x3lzrXf7SfX7hmzROvKH6erc5uvFMN519SPEfGHzez1LneyW8L18yOw0qd6zefKP7n\n5umXTm68U5WvvH9K4RqAg352beGa4+KSwjWv4U0c2HZWqSwuksNQO4utdUrdE5fI4excxbO4TA5D\nuSz+j/avFa5Z88SrCtcAfHar4vdzF15yaqlzlcniMjkM5bJ4sHIYymVxmRyGclncynvijY17OJhZ\nbkNtvFqOMWYTWHc4BcB3gGmSehoYpr6cGxvM7OXFQyrMzFrPWZyfGxzMLLcm1xzu9/FqjcaYRcR6\nM5tHxPP1zmFmNtQ1m8NmZtY8Z3F+bnAws9w8Xs3MrLWcw2Zmrecszs8NDmaWW7Prv5uZWXOcw2Zm\nrecszs/flJnl5vFqZmat5Rw2M2s9Z3F+bnAws9wcrmZmreUcNjNrPWdxfm5wMLPcPF7NzKy1nMNm\nZq3nLM7PDQ5mlpvHq5mZtZZz2Mys9ZzF+fmbMrPc3H3MzKy1nMNmZq3nLM7PDQ5mltsqrzlsZtZS\nzmEzs9ZzFufnBgczy83dx8zMWss5bGbWes7i/PxNmVlu7j5mZtZazmEzs9ZzFufnBgczy83hambW\nWs5hM7PWcxbnNygNDjfv8qZC+4+PGaXOc7WOKlzTdt0fSp1Ls6NwTXeXSp1r2zX3FK5ZOfPvC9d0\nn1S4BID2X36ocM0XDvxyqXN9QV8rXNM2rtz3fsH3Ti9c0/3L4uc5jVuLFwG/VkeJqmtKnauHw3XD\nddsu+xSu+UBcXbhmto4sXAPQNv++wjW6pHgOQ7ks3p6HCtc8celOhWsAuo8rXtP+mwmlzvXl/b9Y\nuGaSvlPqXG1ji3/vX516VuGa7p8WLgHgbH5TuKZMDu/FzoVrKvVHDks6FDgfaAOmRsRXq94fDvwQ\n2Bd4ApgQEY+k984AjgPWACdHxJy0fSrwAWBFROxTcaxzgX8CVgEPAMdGxLMV748C/ghMjohvpG2f\nA44HuoF7Us1LTX/wIaBoFpfJYSiXxW13FM9hAP1wcO6Jy+QwlMviMjkM5bK4TA5DuSwerByGcllc\nJodhw7wnHqAcrnlMSdOAdwHPAAF8IiL+IGkPYBowFjizJ4NTzcnAv6SX34+Ib5X9rG1lC81s47OG\n9lwPMzMbGHlzuF4WS2oDLgTeA+wNHCXp9VW7HQ88FRGjyW5ez021ewEfAfYE3gtcJKnnbzDT0jGr\nzQH2jogxwGLgjKr3vwH8rOL6/h74d2BsargYBkzM8dWYmQ2aoZbDOY55SkS8KSLGRkTPL+5PkuXt\nOr/oSto7nf/NwBjgnyS9rsTXBLjBwcwK6GJYroeZmQ2MvDncRxaPAxZHxMMRsRqYCYyv2mc8cGl6\nPgs4MD0/DJgZEWsiYglZA8I4gIj4HbCy+mQRcWNEdKeXtwIje96TNJ6s18Mfq8ragc0lDQM2Ax7r\n80sxMxtkQzCHGx1zvb/3R8QTEXEnWU+JSnsCt0bEqojoAn4NfLDRd1KPGxzMLLcu2nM9zMxsYOTN\n4T6yeEdgacXrZWlbzX3SzeYzkrauUftojdq+HAf8HEDSZsCpwBSgt593RDwGnAc8ko7/dETcWOAc\nZmYDbgjmcKNjni1pvqTzJG3S4OPdC+wvaauU1e8Dyo0TxZNGmlkBXnPYzKy1+srhhzqX8lDn0rrv\nJ7UGcVcPwq+3T57a2ieVPg+sjuidqGsK8M2IeCGNylDa7+/IfpXbmWy88SxJR1fUmZm1XL0sbmEO\n1+pI0HPM0yNiRWpo+D5wGnB2vYuLiEWSvgrcCPwVmM/6vSByc4ODmeXm4RJmZq3VVw6P6tiVUR27\n9r7+1ZRbau22DBhV8Xok6w9ZWEr2a9ZjktqBERGxUtIy1v2Vq1bteiQdQ/YL2YEVm98CfChNKrkV\n0CXpb8BfgAcj4qlUexXwNsANDmY2ZNTL4hbmsOodMyJWpH+uThNIntLg4xER08jm5kHSf7Nu74lC\nPKTCzHJrdkiFpEMlLZJ0v6TTarw/XNJMSYsl3ZJmL+9574y0faGkQ9K2kZJukrRA0j2STqrYf6ak\neenxkKR5afvRku5K2++S1CWp+BIOZmYt0A9DKuYCu0naOc2CPhGYXbXPtcAx6fmRwE3p+WxgYsrq\nXYHdgNsr6kTVr29p1vRTgcMiYlXP9ojYPyJeGxGvJZsQ7X8i4iKyoRRvlfSKNCHlQcDCAl+RmdmA\nG4I5XPeYknZI/xRwONmQiWrV2b1d+ucosvkbfpTne6nFP1eaWW7NzM9QMXvuQWQtrnMlXRMRiyp2\n652RV9IEshl5J1bNyDsSuFHSaLLuXZMiYr6kLYA7Jc2JiEURMbHi3F8HngZI3XJnpO1vAH5SMVuv\nmdmQ1uw8ORHRJelEstUjepZOWyhpCjA3Iq4DpgLTJS0mm8V8YqpdIOkKYAGwGjghIgJA0gygA9hG\n0iNky1xOA74NDAduSEMnbo2IE/q4vtslzQLuSue4C7i4qQ9tZtbPmsniAcrhmsdMp7xM0rZkjQrz\ngU8DSNoeuAN4FdCdlsLcKyKeA65Mc0b0nOOZsp/XDQ5mlluTN7q9s+dC1gOBbJxuZYPDeGByej6L\n7EYVKmbkBZak8B0XEbcBywEi4jlJC8kmyKk8JmSNFQfUuKajaKLF1sxssPXHxLwRcT2wR9W2yRXP\nV5HlZq3ac4Bzamw/us7+o3Ncz5Qar6fU2d3MrOX6ofF3IHJ4vWOm7QfVOc4K6kwGGRH793H5hbjB\nwcxyq7eecE61Zs8dV2+f1PpbOSNv5SC49WZGl7QL2VrBt1VtfyewPCIeqHFNE8gaM8zMNghN5rCZ\nmfUDZ3F+bnAws9yanDRywGZGT8MpZgEnp25glWr2YpA0Dng+Ihb0ddFmZkOJJ+81M2s9Z3F+/qbM\nLLd63ceWdT7Ao521OhCsuxsDMDO6pGFkjQ3TI+KayoOlYxwBjK1xPRPxcAoz28D0x5AKMzNrjrM4\nPzc4mFlu9cL1NR2785qO3Xtf3z7lxlq79c6eC/yZ7C/8R1Xt0zMj722sPyPvZZK+STaUonJm9EuA\nBRFxQY1zHgwsjIh1GjbSLL1HAu+s+YHMzIYo3+SambWeszi/QWlw2FLPFtr/Ij5T6jztl1f/3SWH\nHWr11G4sPl68rv1fu0uda9g5rypc8+qPLilc0z55l8I1AB+eMr1wzVt/cXepc+l/ShQdX91rP581\n/1j8f4/RFP9cF1HzL+cNPc3fFa5pdprvVWxaunYgZuSV9Hbgo8A9ku4iG2ZxZpo0B7I5Gmr1Ytgf\nWBoRS0p/oA3MZjxfuObyFyY23qlK+++OLFwDwMjimVomhwHaTyuexZt+fovCNa8+ZknhGiiXxR+c\nMqPUufa5b3HhGk0qdSqYUDyL14wtnsNvpOaa5w19k98XrimTw9uzb+GaSs3ksLVe0Swuk8NQMotL\n5DCUvCcepByGcllc9p64TBaXyWEomcWDlMNQLovL5DBsePfEGxv3cDCz3IbajLwRcTPUv6iIOLbO\n9l8Db8t94WZmQ4R/VTMzaz1ncX5ucDCz3ByuZmat5Rw2M2s9Z3F+bnAws9wcrmZmreUcNjNrPWdx\nfm5wMLPcvOawmVlrOYfNzFrPWZyfGxzMLDevOWxm1lrOYTOz1nMW5+dvysxyc/cxM7PWcg6bmbWe\nszg/NziYWW4OVzOz1nIOm5m1nrM4Pzc4mFluXnPYzKy1nMNmZq3nLM7PDQ5mlptbc83MWss5bGbW\nes7i/NpafQFmtuHooj3Xw8zMBkbeHHYWm5kNnGZzWNKhkhZJul/SaTXeHy5ppqTFkm6RNKrivTPS\n9oWSDml0TEnTJD0o6S5J8yTtk7bvIen3kl6UNKnq/CMk/Tid44+S3lL2u3IPBzPLzUsAmZm1lnPY\nzKz1msliSW3AhcBBwGPAXEnXRMSiit2OB56KiNGSJgDnAhMl7QV8BNgTGAncKGk0oAbHPCUirq66\nlCeBfwcOr3GZFwA/i4gjJQ0DNiv7ed3Dwcxy62JYroeZmQ2MvDncVxYP0C9rUyWtkPSHqmOdm/ad\nL+lKSVtWvT9K0l8rf11rdH1mZq3WZA6PAxZHxMMRsRqYCYyv2mc8cGl6Pgs4MD0/DJgZEWsiYgmw\nOB2v0THX+3t/RDwREXcCayq3S3oV8M6ImJb2WxMRz+b4Wmpyg4OZ5eZuvGZmrdXskIqKX9beA+wN\nHCXp9VW79f6yBpxP9ssaVb+svRe4SJJSzbR0zGpzgL0jYgzZjfEZVe9/A/hZweszM2upJu+JdwSW\nVrxelrbV3CciuoBnJG1do/bRtK3RMc9ODb/nSdqkwcd7LfBEGooxT9LFkl7ZoKauQfkp8gf8S6H9\nr9SHSp3n4gn/XLjmk8ddVupc/HMULtnyWytKnepTm15cuOZr//qlwjUHf3d24RqAHx/28eJFP1Xj\nfWqIT5Uo+k7xf1cA3/v4xwrXjNSywjWrGF64BuB8Plui6rpS5+rhxoQN17d1UuGaOZsf0ninKhe/\np3gOA3zy1BJZfHi5/7dHffW+wjXHc0nhmi+ddm7hGoD3f2VW4ZqrjvtoqXNxaQTcZwwAACAASURB\nVPEsjkmN96lpavF/Xxd9/NjCNbvr/sI1AC+VyOLpFP/v/U28Bji7cF2Pfsjh3l/BACT1/ApW2ZV3\nPDA5PZ8FfDs97/1lDVgiqeeXtdsi4neSdq4+WUTcWPHyVqD3Jk/SeOAB4PmC17fBKprFZXIYymVx\nqRyGUlk8WDkM8KVTimfx+79ePIehZBaXyGEomcWDlMNQLovL5DCUy2L4ealz9aiXxX/tnMdfO+9q\nVF7rX3r1v5x6+9TbXqsjQc8xT4+IFamh4fvAafT9B9EwYCzwmYi4Q9L5wOms/XOhEPd9NrPc3OBg\nZtZa/ZDDtX4FG1dvn4joklT5y9otFfv1/LKW13Fk3XyRtBlwKnAw8J8Fr8/MrKXqZfFmHfuxWcd+\nva//PGVard2WAaMqXo8km3eh0lJgJ+AxSe3AiIhYKWlZ2l5dq3rHjIgV6Z+rJU0DTmnw8ZYBSyPi\njvR6FlkjRSkNGxwkTQU+AKyIiJ4ZLbcCLgd2BpYAH4mIZ8pehJltGLzmcOs4i80M+s7h5zvv4IXO\nO+q+nwzEL2sNSfo8sDoiZqRNU4BvRsQLa0dl5L6+lnAOm1mPJu+J5wK7pV5hfwYmAkdV7XMtcAxw\nG3AkcFPaPhu4TNI3yRpodwNuJ+vhUPOYknaIiOVpCNzhwL01rqk3e1NviKWSdo+I+8kmolxQ9sPm\nmcOh1pi804EbI2IPsg9fPR7PzF6GPIdDSzmLzazP7H1Fx1vY+qzP9D7qKPLLGpW/rKXaWr+s9UnS\nMcD7gKMrNr8FOFfSg8BngTMlnZDz+lrFOWxmQHP3xGlOhhPJ5rj5I9lQtYWSpkj6QNptKrBtGrr2\nWbKsISIWAFeQNQD8DDghMjWPmY51maS7gbuBbUjDKSRtL2kp8Dng85IekbRFqjkp1c0H3gj8T9nv\nqmEPhzpj8sYD70rPLwU6SV+Cmb18uTGhdZzFZgb9ksMD8ctaD1HVQ0HSoWRDJ/aPiFU92yNi/4p9\nJgN/jYiLUgNHo+trCeewmfVoNosj4npgj6ptkyueryKbpLdW7TnAOXmOmbYfVOc4K1i3EbnyvbuB\n/Wq9V1TZORxeXTEWZLmk7frjYsxsaPP670OOs9hsI9NsDqc5GXp+BWsDpvb8sgbMjYjryH5Zm55+\nWXuS7C/9RMQCST2/rK0m/bIGIGkG0AFsI+kRYHJaUu3bwHDghjR04taIOKHo9TX1oQeWc9hsI+R7\n4vw8aaSZ5dbXuu55pF+6zmftTeRXq94fDvwQ2Bd4ApgQEY+k984gm3BsDXByRMyRNDLtvwPQBXw/\nIr6V9p8J7J4OvRWwMiLGpvf2Ab4LbJnq9ouIl5r6cGZmg6DZHIYB+2Xt6Bq7k5bWbHQ9Uxpdn5nZ\nUNIfWbyxKPtNrZC0fZpQYgfgL33tfNtZN/Q+37HjtYzseF3J05pZEc90zufZzrv77XjNdB+rWFv9\nILLxuHMlXRMRlUud9a79LmkC2drvE6vWfh8J3ChpNFnjw6SImJ/GnN0paU5ELIqIiRXn/jrwdHre\nDkwHPhoR96YJv1aX/mCtlTuL553Vu8w9r+kYzWs6Gv4dwMz6yROdC3iiM/uR/mm2aLB33zy0bcgp\ndE/sLDZrjcoc7g/O4vzyNjhUj8mbDXwC+CrZGL9r+ip+y1kHl7k2M2vSiI4xjOgY0/t62ZTpTR2v\nyXDt97XfI+I2YDlARDwnaSHZuOLq9do/AhyQnh8C3B0R96a6lc18qEFWOovHnvW+Ab0wM6tv2469\n2LZjLwDexGv49ZQflj6Wb3Jbrql7YmexWWtU5jDAfVOuaup4zuL88iyLud6YPOArwI8lHQc8Qjah\nkJm9zHV1NxWuA7r2u6RdgDFkk5xVbn8nsDwiHkibdk/brwe2BS6PiK+V/lSDxFlsZtB0DlsTnMNm\n1sNZnF+eVSpqjskD3t3P12JmQ9yqF2uvObzmNzfT9dubG5UP2NrvaTjFLLK5HZ6r2u8o4EcVr4cB\nbwfeDLwI/FLSHRHxq74vv7WcxWYG9XPYBp5z2Mx6OIvz82wXZpZb15rarbl62/4Me1vvCmes/p+a\nHQaKrP3+WOXa75Lqrv0uaRhZY8P0iFinK2s6xhHA2Krr+HXPUApJP0vvD+kGBzMzqJ/DZmY2eJzF\n+bW1+gLMbMPRtaY916OO3rXf02oUE8nGvlbqWfsd1l/7faKk4ZJ2Zd213y8BFkTEBTXOeTCwMCIq\nGzZ+Aewj6RWpseJdZEu8mZkNeXlz2DfDZmYDxzmcn9LyyQN3AikY3V2s5qJy19R1UK1e133b7Jly\n88VttvkLhWueGLZj451qaFtQ/Ps4e8//KFxzps4rXAPQ9tXG+1TTmd8qda6urpMK11wcxzTeqYZ/\n+8b/K1zTdUrx/wY/ru8XrgH4Il8uXLOHlhERxS+S7P/ltuXVoxVq695hi5rnSctiXsDaZTG/Urn2\nu6RNyVaQeBNp7feIWJJqzyBbxWI1a5fFfDvwG+AesiEWAZyZllRD0jTgloi4uOo6jgbOBLqBn0bE\nGcW+jQ1LmRwG0CXFs6fr7aX+82KbrurOLo1t2fZsqXM9pNcXrml/sPj3d96unylcA/BZ/W/hmrZa\nzW05aFLx/Onq+mSpc02Pmqss9ukT515euKbrtHL/DR5b4ns/my8WrtmUA3m1ZpXK4iI5DPWz2Fqj\n1D1xiRyGcllcJoehXBYPVg5DuSwuk8NQLovL5DCUy+LBymEol8VlchjgLM4qXLOrHm/pPfHGxEMq\nzCy37q7mIqO/136PiJuh/jTBEXFsne0zgBm5L9zMbIhoNofNzKx5zuL8/E2ZWX7uGmZm1lrOYTOz\n1nMW5+YGBzPLz+FqZtZazmEzs9ZzFufmBgczy2/NRj0Ezcys9ZzDZmat5yzOzQ0OZpbfmlZfgJnZ\nRs45bGbWes7i3Lwsppnl92LOh5mZDYy8OewsNjMbOE3msKRDJS2SdL+k02q8P1zSTEmLJd0iaVTF\ne2ek7QslHdLomJKmSXpQ0l2S5knaJ23fQ9LvJb0oaVLF/ptKui3tf4+k3gney3APBzPLb3WrL8DM\nbCPnHDYza70mslhSG3AhcBDwGDBX0jURsahit+OBpyJitKQJwLnAREl7ka3oticwErhR0mhADY55\nSkRcXXUpTwL/DhxeuTEiVkk6ICJekNQO3Czp5xFxe5nP6x4OZpZfV86HmZkNjLw57Cw2Mxs4zeXw\nOGBxRDwcEauBmcD4qn3GA5em57OAA9Pzw4CZEbEmIpYAi9PxGh1zvb/3R8QTEXEnNQaIRMQL6emm\nZJ0Uou6nacANDmaW35qcDzMzGxh5c9hZbGY2cJrL4R2BpRWvl6VtNfeJiC7gGUlb16h9NG1rdMyz\nJc2XdJ6kTRp9PEltku4ClgM3RMTcRjX1uMHBzPLzTa6ZWWv1Q4PDAI0dnipphaQ/VB3r3LTvfElX\nStoybd8vjQ/ueRyeto+UdJOkBWns8EllvyozswHTXA7XWuKiugdBvX2Kbgc4PSL2BPYDtgHWy/31\nCiO6I+JNZMM23pKGcpTiORzMLD83JpiZtVaTOTwQY4cjIoBpwLeBH1adcg7ZzW63pK8AZ6THPcC+\n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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Extract the energy-condensed delayed neutron fraction tally\n", + "beta_by_group = beta.get_condensed_xs(one_group).xs_tally.summation(filter_type='energy', remove_filter=True)\n", + "beta_by_group.mean.shape = (17, 17, 6)\n", + "beta_by_group.mean[beta_by_group.mean == 0] = np.nan\n", + "\n", + "# Plot the betas\n", + "plt.figure(figsize=(18,9))\n", + "fig = plt.subplot(231)\n", + "plt.imshow(beta_by_group.mean[:,:,0], interpolation='none', cmap='jet')\n", + "plt.colorbar()\n", + "plt.title('Beta - delayed group 1')\n", + "\n", + "fig = plt.subplot(232)\n", + "plt.imshow(beta_by_group.mean[:,:,1], interpolation='none', cmap='jet')\n", + "plt.colorbar()\n", + "plt.title('Beta - delayed group 2')\n", + "\n", + "fig = plt.subplot(233)\n", + "plt.imshow(beta_by_group.mean[:,:,2], interpolation='none', cmap='jet')\n", + "plt.colorbar()\n", + "plt.title('Beta - delayed group 3')\n", + "\n", + "fig = plt.subplot(234)\n", + "plt.imshow(beta_by_group.mean[:,:,3], interpolation='none', cmap='jet')\n", + "plt.colorbar()\n", + "plt.title('Beta - delayed group 4')\n", + "\n", + "fig = plt.subplot(235)\n", + "plt.imshow(beta_by_group.mean[:,:,4], interpolation='none', cmap='jet')\n", + "plt.colorbar()\n", + "plt.title('Beta - delayed group 5')\n", + "\n", + "fig = plt.subplot(236)\n", + "plt.imshow(beta_by_group.mean[:,:,5], interpolation='none', cmap='jet')\n", + "plt.colorbar()\n", + "plt.title('Beta - delayed group 6')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.11" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index df50eee0ba..3be64bd1cf 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -257,6 +257,16 @@ Energy Groups openmc.mgxs.EnergyGroups +Delayed Groups +------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: myclass.rst + + openmc.mgxs.DelayedGroups + Multi-group Cross Sections -------------------------- @@ -284,6 +294,19 @@ Multi-group Cross Sections openmc.mgxs.TotalXS openmc.mgxs.TransportXS +Multi-delayed-group Cross Sections +---------------------------------- + +.. autosummary:: + :toctree: generated + :nosignatures: + :template: myclassinherit.rst + + openmc.mgxs.MDGXS + openmc.mgxs.ChiDelayed + openmc.mgxs.DelayedNuFissionXS + openmc.mgxs.Beta + Multi-group Cross Section Libraries ----------------------------------- From 2fff5cd3d049152d30578befee9d259e70330376 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Tue, 2 Aug 2016 18:18:06 -0500 Subject: [PATCH 026/168] Improve fission energy release documentation --- docs/source/io_formats/fission_energy.rst | 53 +++++++++++++++ docs/source/io_formats/index.rst | 1 + docs/source/io_formats/nuclear_data.rst | 21 ++++++ docs/source/pythonapi/index.rst | 18 ++--- openmc/data/fission_energy.py | 81 ++++++++++++++++++++++- 5 files changed, 164 insertions(+), 10 deletions(-) create mode 100644 docs/source/io_formats/fission_energy.rst diff --git a/docs/source/io_formats/fission_energy.rst b/docs/source/io_formats/fission_energy.rst new file mode 100644 index 0000000000..d73a95f605 --- /dev/null +++ b/docs/source/io_formats/fission_energy.rst @@ -0,0 +1,53 @@ +.. _usersguide_fission_energy: + +================================== +Fission Energy Release File Format +================================== + +This file is a compact HDF5 representation of the ENDF MT=1, MF=458 data (see +ENDF-102_ for details). It gives the information needed to compute the energy +carried away from fission reactions by each reaction product (e.g. fragment +nuclei, neutrons) which depends on the incident neutron energy. OpenMC is +distributed with one of these files under +openmc/data/fission_Q_data_endfb71.h5. More files of this format can be +created from ENDF files with the +``openmc.data.write_compact_458_library`` function. They can be read with the +``openmc.data.FissionEnergyRelease.from_compact_hdf5`` class method. + +:Attributes: - **comment** (*char[]*) -- An optional text comment + - **component order** (*char[][]*) -- An array of strings + specifying the order each reaction product occurs in the data + arrays. The components use the 2-3 letter abbreviations + specified in ENDF-102 e.g. EFR for fission fragments and ENP for + prompt neutrons. + +**//** + Nuclides are named by concatenating their Z and their A numbers. For + example, U235 is named 92235. Metastable nuclides are appended with an + '_m' and their metastable number. For example, the first excited isomer + of Am-242 is named 95242_m1. + +:Datasets: - **data** (*double[][][]*) -- The energy release coefficients. The + first axis indexes the component type. The second axis specifies + values or uncertainties. The third axis indexes the polynomial + order. If the data uses the Sher-Beck format, then the last axis + will have a length of one and ENDF-102 should be consulted for + energy dependence. Otherwise, the data uses the Madland format + which is a polynomial of incident energy. + + For example, if 'EFR' is given first in the **component order** + attribute and the data uses the Madland format, then the energy + released in the form of fission fragments at an incident energy + :math:`E` is given by + + .. math:: + \text{data}[0, 0, 0] + \text{data}[0, 0, 1] \cdot E + + \text{data}[0, 0, 2] \cdot E^2 + \ldots + + And its uncertainty is + + .. math:: + \text{data}[0, 1, 0] + \text{data}[0, 1, 1] \cdot E + + \text{data}[0, 1, 2] \cdot E^2 + \ldots + +.. _ENDF-102: http://www.nndc.bnl.gov/endfdocs/ENDF-102-2012.pdf diff --git a/docs/source/io_formats/index.rst b/docs/source/io_formats/index.rst index acab7e8930..39b38fcf21 100644 --- a/docs/source/io_formats/index.rst +++ b/docs/source/io_formats/index.rst @@ -15,6 +15,7 @@ Data Files nuclear_data mgxs_library data_wmp + fission_energy ------------ Output Files diff --git a/docs/source/io_formats/nuclear_data.rst b/docs/source/io_formats/nuclear_data.rst index ba6a54eb1e..7544ca1f5e 100644 --- a/docs/source/io_formats/nuclear_data.rst +++ b/docs/source/io_formats/nuclear_data.rst @@ -55,6 +55,27 @@ Incident Neutron Data from fission. It is formatted as a reaction product, described in :ref:`product`. +**//fission_energy_release/** + +:Attributes: - **format** (*char[]*) -- The energy-dependence format. Either + 'Madland' or 'Sher-Beck' + +:Datasets: - **fragments** (*double[]*) -- Polynomial coefficients for energy + released in the form of fragments + - **prompt_neutrons** (*double[]* or :ref:`tabulated <1d_tabulated>`) + -- Energy released in the form of prompt neutrons. Polynomial if + the format is Madland or a table if Sher-Beck. + - **delayed_neutrons** (*double[]*) -- Polynomial coefficients for + energy released in the form of delayed neutrons + - **prompt_photons** (*double[]*) -- Polynomial coefficients for + energy released in the form of prompt photons + - **delayed_photons** (*double[]*) -- Polynomial coefficients for + energy released in the form of delayed photons + - **betas** (*double[]*) -- Polynomial coefficients for + energy released in the form of betas + - **neutrinos** (*double[]*) -- Polynomial coefficients for + energy released in the form of neutrinos + ------------------------------- Thermal Neutron Scattering Data ------------------------------- diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 36f161b3c3..5d45c799d7 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -335,6 +335,7 @@ Core Classes openmc.data.Tabulated1D openmc.data.ThermalScattering openmc.data.CoherentElastic + openmc.data.FissionEnergyRelease Angle-Energy Distributions -------------------------- @@ -368,21 +369,22 @@ Classes +++++++ .. autosummary:: - :toctree: generated - :nosignatures: - :template: myclass.rst + :toctree: generated + :nosignatures: + :template: myclass.rst - openmc.data.ace.Library - openmc.data.ace.Table + openmc.data.ace.Library + openmc.data.ace.Table Functions +++++++++ .. autosummary:: - :toctree: generated - :nosignatures: + :toctree: generated + :nosignatures: - openmc.data.ace.ascii_to_binary + openmc.data.ace.ascii_to_binary + openmc.data.write_compact_458_library .. _Jupyter: https://jupyter.org/ .. _NumPy: http://www.numpy.org/ diff --git a/openmc/data/fission_energy.py b/openmc/data/fission_energy.py index c22fef9a9b..d7fe5fa720 100644 --- a/openmc/data/fission_energy.py +++ b/openmc/data/fission_energy.py @@ -1,7 +1,6 @@ from collections import Callable from copy import deepcopy import sys -#from warnings import warn import h5py import numpy as np @@ -199,6 +198,82 @@ def write_compact_458_library(endf_files, output_name=None, comment=None, class FissionEnergyRelease(object): + """Energy relased by fission reactions. + + Energy is carried away from fission reactions by many different particles. + The attributes of this class specify how much energy is released in the form + of fission fragments, neutrons, photons, etc. Each component is also (in + general) a function of the incident neutron energy. + + Following a fission reaction, most of the energy release is carried by the + daughter nuclei fragments. These fragments accelerate apart from the + Coulomb force on the time scale of ~10^-20 s [1]. Those fragments emit + prompt neutrons between ~10^-18 and ~10^-13 s after scission (although some + prompt neutrons may come directly from the scission point) [1]. Prompt + photons follow with a time scale of ~10^-14 to ~10^-7 s [1]. The fission + products then emit delayed neutrons with half lives between 0.1 and 100 s. + The remaining fission energy comes from beta decays of the fission products + which release beta particles, photons, and neutrinos (that escape the + reactor and do not produce usable heat). + + Use the class methods to instantiate this class from an HDF5 or ENDF + dataset. The :meth:`FissionEnergyRelease.from_hdf5` method builds this + class from the usual OpenMC HDF5 data files. + :meth:`FissionEnergyRelease.from_endf` uses ENDF-formatted data. + :meth:`FissionEnergyRelease.from_compact_hdf5` uses a different HDF5 format + that is meant to be compact and store the exact same data as the ENDF + format. Files with this format can be generated with the + :func:`openmc.data.write_compact_458_library` function. + + References + ---------- + [1] D. G. Madland, "Total prompt energy release in the neutron-induced + fission of ^235U, ^238U, and ^239Pu", Nuclear Physics A 772:113--137 (2006). + + + Attributes + ---------- + fragments : Callable + Function that accepts incident neutron energy value(s) and returns the + kinetic energy of the fission daughter nuclides (after prompt neutron + emission). + prompt_neutrons : Callable + Function of energy that returns the kinetic energy of prompt fission + neutrons. + delayed_neutrons : Callable + Function of energy that returns the kinetic energy of delayed neutrons + emitted from fission products. + prompt_photons : Callable + Function of energy that returns the kinetic energy of prompt fission + photons. + delayed_photons : Callable + Function of energy that returns the kinetic energy of delayed photons. + betas : Callable + Function of energy that returns the kinetic energy of delayed beta + particles. + neutrinos : Callable + Function of energy that returns the kinetic energy of neutrinos. + recoverable : Callable + Function of energy that returns the kinetic energy of all products that + can be absorbed in the reactor (all of the energy except for the + neutrinos). + total : Callable + Function of energy that returns the kinetic energy of all products. + q_prompt : Callable + Function of energy that returns the prompt fission Q-value (fragments + + prompt neutrons + prompt photons - incident neutron energy). + q_recoverable : Callable + Function of energy that returns the recoverable fission Q-value + (total release - neutrinos - incident neutron energy). This value is + sometimes referred to as the pseudo-Q-value. + q_total : Callable + Function of energy that returns the total fission Q-value (total release + - incident neutron energy). + form : str + Format used to compute the energy-dependence of the data. Either + 'Sher-Beck' or 'Madland'. + + """ def __init__(self): self._fragments = None self._prompt_neutrons = None @@ -453,8 +528,10 @@ class FissionEnergyRelease(object): obj.neutrinos = Polynomial(group['neutrinos'].value) if group.attrs['format'].decode() == 'Madland': + obj.form = 'Madland' obj.prompt_neutrons = Polynomial(group['prompt_neutrons'].value) elif group.attrs['format'].decode() == 'Sher-Beck': + obj.form = 'Sher-Beck' obj.prompt_neutrons = Tabulated1D.from_hdf5( group['prompt_neutrons']) else: @@ -471,7 +548,7 @@ class FissionEnergyRelease(object): fname : str Path to an HDF5 file containing fission energy release data. This file should have been generated form the - openmc.data.write_compact_458_library function. + :func:`openmc.data.write_compact_458_library` function. incident_neutron : openmc.data.IncidentNeutron Corresponding incident neutron dataset From ef89d40479015f673851020b2749993f771bbe33 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 3 Aug 2016 11:35:42 -0500 Subject: [PATCH 027/168] Add fission energy release test, score docs --- docs/source/usersguide/input.rst | 21 +++++++++++++++++++++ tests/test_tallies/inputs_true.dat | 2 +- tests/test_tallies/results_true.dat | 2 +- tests/test_tallies/test_tallies.py | 5 +++-- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index e530097ded..9ed30afeb8 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1809,6 +1809,27 @@ The ```` element accepts the following sub-elements: | |:math:`\gamma`-rays are assumed to deposit their | | |energy locally. Units are MeV per source particle. | +----------------------+---------------------------------------------------+ + |fission-q-prompt |The prompt fission energy production rate. This | + | |energy comes in the form of fission fragment | + | |nuclei, prompt neutrons, and prompt | + | |:math:`\gamma`-rays. This value depends on the | + | |incident energy and it requires that the nuclear | + | |data library contains the optional fission energy | + | |release data. Energy is assumed to be deposited | + | |locally. Units are MeV per source particle. | + +----------------------+---------------------------------------------------+ + |fission-q-recoverable |The recoverable fission energy production rate. | + | |This energy comes in the form of fission fragment | + | |nuclei, prompt and delayed neutrons, prompt and | + | |delayed :math:`\gamma`-rays, and delayed | + | |:math:`\beta`-rays. This tally differs from the | + | |kappa-fission tally in that it is dependent on | + | |incident neutron energy and it requires that the | + | |nuclear data library contains the optional fission | + | |energy release data. Energy is assumed to be | + | |deposited locally. Units are MeV per source | + | |paticle. | + +----------------------+---------------------------------------------------+ .. note:: The ``analog`` estimator is actually identical to the ``collision`` diff --git a/tests/test_tallies/inputs_true.dat b/tests/test_tallies/inputs_true.dat index 9d67bc0d03..f5390eea12 100644 --- a/tests/test_tallies/inputs_true.dat +++ b/tests/test_tallies/inputs_true.dat @@ -1 +1 @@ -930af242a043f2676a000dbc5a2db6b148edcb31ed8c87dbaa35a8efb37a3be8cff30cdf4dc03f9c5c7eb4021f7e4c3327e64681cdd8fd8722c95c69db850227 \ No newline at end of file +1bef757d276362fdcd9405096b4cdcbd894f9215ed406493486a45193729be446c9a12242c887f89b6e209ec5beaaacb04dee2fd61e72b4f5c6a8712b776ed6e \ No newline at end of file diff --git a/tests/test_tallies/results_true.dat b/tests/test_tallies/results_true.dat index 7aa65e1c19..7d4763f98d 100644 --- a/tests/test_tallies/results_true.dat +++ b/tests/test_tallies/results_true.dat @@ -1 +1 @@ -a51db2a4efc681805f85968e04411dc33beee0532c202f5179b9a82880ab60a75e53fa9141c81045ea1d2842372f2d8da900326f09382ea61dd80a3c9b43bba1 \ No newline at end of file +f8ad60a94994e6b126b64b8a3e10ac3647314fff37558f9e32f174e6baf944aa2e617ad15f3aa6d6b3fc4e4ead944afb3ca2ea606b40e50bf96e7ad86c86a12b \ No newline at end of file diff --git a/tests/test_tallies/test_tallies.py b/tests/test_tallies/test_tallies.py index ba0098513c..387be8af51 100644 --- a/tests/test_tallies/test_tallies.py +++ b/tests/test_tallies/test_tallies.py @@ -123,8 +123,9 @@ class TalliesTestHarness(PyAPITestHarness): t.filters = [cell_filter] t.scores = ['absorption', 'delayed-nu-fission', 'events', 'fission', 'inverse-velocity', 'kappa-fission', '(n,2n)', '(n,n1)', - '(n,gamma)', 'nu-fission', 'scatter', 'elastic', 'total', - 'prompt-nu-fission'] + '(n,gamma)', 'nu-fission', 'scatter', 'elastic', + 'total', 'prompt-nu-fission', 'fission-q-prompt', + 'fission-q-recoverable'] score_tallies[0].estimator = 'tracklength' score_tallies[1].estimator = 'analog' score_tallies[2].estimator = 'collision' From 4ff005b439481439f74b1c5d8e2ae9dda50d07d2 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 3 Aug 2016 15:53:18 -0500 Subject: [PATCH 028/168] Fix incident neutron energy subtraction --- openmc/data/fission_energy.py | 4 ++-- src/endf.F90 | 4 ++++ tests/test_tallies/results_true.dat | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/openmc/data/fission_energy.py b/openmc/data/fission_energy.py index d7fe5fa720..334231a9f6 100644 --- a/openmc/data/fission_energy.py +++ b/openmc/data/fission_energy.py @@ -603,12 +603,12 @@ class FissionEnergyRelease(object): data=self.prompt_neutrons.coef) q_prompt = (self.fragments + self.prompt_neutrons + - self.prompt_photons + Polynomial((-1.0, 0.0))) + self.prompt_photons + Polynomial((0.0, -1.0))) group.create_dataset('q_prompt', data=q_prompt.coef) q_recoverable = (self.fragments + self.prompt_neutrons + self.delayed_neutrons + self.prompt_photons + self.delayed_photons + self.betas + - Polynomial((-1.0, 0.0))) + Polynomial((0.0, -1.0))) group.create_dataset('q_recoverable', data=q_recoverable.coef) elif self.form == 'Sher-Beck': group.attrs['format'] = np.string_('Sher-Beck') diff --git a/src/endf.F90 b/src/endf.F90 index a836a54397..833082e1c7 100644 --- a/src/endf.F90 +++ b/src/endf.F90 @@ -60,6 +60,10 @@ contains string = "events" case (SCORE_INVERSE_VELOCITY) string = "inverse-velocity" + case (SCORE_FISS_Q_PROMPT) + string = "fission-q-prompt" + case (SCORE_FISS_Q_RECOV) + string = "fission-q-recoverable" ! Normal ENDF-based reactions case (TOTAL_XS) diff --git a/tests/test_tallies/results_true.dat b/tests/test_tallies/results_true.dat index 7d4763f98d..818d99a92b 100644 --- a/tests/test_tallies/results_true.dat +++ b/tests/test_tallies/results_true.dat @@ -1 +1 @@ -f8ad60a94994e6b126b64b8a3e10ac3647314fff37558f9e32f174e6baf944aa2e617ad15f3aa6d6b3fc4e4ead944afb3ca2ea606b40e50bf96e7ad86c86a12b \ No newline at end of file +a6e5480c66e6510687bf281983b3f387da45005bb08d8cd0aa629e53c5a42a1b2fa8d76345ad2df497d85f2b273fbc5edc36105a71a73c1107479ca0af8329f6 \ No newline at end of file From d19ea4f68fd4a424271103c0dabf12461870eadd Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 4 Aug 2016 15:03:55 -0400 Subject: [PATCH 029/168] changed mdgxs distribcell test to produce non-zero results --- .../inputs_true.dat | 2 +- .../results_true.dat | 42 +++++++++---------- .../test_mdgxs_library_distribcell.py | 8 +++- 3 files changed, 28 insertions(+), 24 deletions(-) diff --git a/tests/test_mdgxs_library_distribcell/inputs_true.dat b/tests/test_mdgxs_library_distribcell/inputs_true.dat index 9b07e293ee..31a7a7f904 100644 --- a/tests/test_mdgxs_library_distribcell/inputs_true.dat +++ b/tests/test_mdgxs_library_distribcell/inputs_true.dat @@ -1 +1 @@ -2d7ef183881fb47ba66ac4ff60a4e510f7b85361aca6dbbe6df2dc89b8492ad3bacbde747803532670bf207ec586dab910448fc1e49f2e57a3bf93256d24442c \ No newline at end of file +d3cf661e7fd29b0bbd6e6a464bb3b0b48a798dbd5c701246fd3c904f87c0d07ad995fc07f5b0a6c665449b7f5c92f68968e3947690794a0b743ea38a7f43f95f \ No newline at end of file diff --git a/tests/test_mdgxs_library_distribcell/results_true.dat b/tests/test_mdgxs_library_distribcell/results_true.dat index 22aeef3967..67f65fc301 100644 --- a/tests/test_mdgxs_library_distribcell/results_true.dat +++ b/tests/test_mdgxs_library_distribcell/results_true.dat @@ -1,21 +1,21 @@ - avg(distribcell) delayedgroup group in nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 0 0 -1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 2 1 total 0 0 -2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 3 1 total 0 0 -3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 4 1 total 0 0 -4 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 5 1 total 0 0 -5 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 6 1 total 0 0 - avg(distribcell) delayedgroup group out nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 0 0 -1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 2 1 total 0 0 -2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 3 1 total 0 0 -3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 4 1 total 0 0 -4 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 5 1 total 0 0 -5 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 6 1 total 0 0 - avg(distribcell) delayedgroup group in nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 0 0 -1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 2 1 total 0 0 -2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 3 1 total 0 0 -3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 4 1 total 0 0 -4 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 5 1 total 0 0 -5 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 6 1 total 0 0 + avg(distribcell) delayedgroup group in nuclide mean std. dev. +0 (0,) 1 1 total 0.000021 0.000002 +1 (0,) 2 1 total 0.000110 0.000008 +2 (0,) 3 1 total 0.000107 0.000008 +3 (0,) 4 1 total 0.000249 0.000018 +4 (0,) 5 1 total 0.000112 0.000008 +5 (0,) 6 1 total 0.000046 0.000003 + avg(distribcell) delayedgroup group out nuclide mean std. dev. +0 (0,) 1 1 total 0 0.000000 +1 (0,) 2 1 total 1 0.869128 +2 (0,) 3 1 total 1 1.414214 +3 (0,) 4 1 total 1 0.360359 +4 (0,) 5 1 total 0 0.000000 +5 (0,) 6 1 total 0 0.000000 + avg(distribcell) delayedgroup group in nuclide mean std. dev. +0 (0,) 1 1 total 0.000227 0.000022 +1 (0,) 2 1 total 0.001214 0.000115 +2 (0,) 3 1 total 0.001184 0.000111 +3 (0,) 4 1 total 0.002752 0.000257 +4 (0,) 5 1 total 0.001231 0.000113 +5 (0,) 6 1 total 0.000512 0.000047 diff --git a/tests/test_mdgxs_library_distribcell/test_mdgxs_library_distribcell.py b/tests/test_mdgxs_library_distribcell/test_mdgxs_library_distribcell.py index 48b3758715..df4fc184d3 100644 --- a/tests/test_mdgxs_library_distribcell/test_mdgxs_library_distribcell.py +++ b/tests/test_mdgxs_library_distribcell/test_mdgxs_library_distribcell.py @@ -6,12 +6,16 @@ import glob import hashlib sys.path.insert(0, os.pardir) from testing_harness import PyAPITestHarness +from input_set import PinCellInputSet import openmc import openmc.mgxs class MDGXSTestHarness(PyAPITestHarness): def _build_inputs(self): + # Set the input set to use the pincell model + self._input_set = PinCellInputSet() + # Generate inputs using parent class routine super(MDGXSTestHarness, self)._build_inputs() @@ -31,8 +35,8 @@ class MDGXSTestHarness(PyAPITestHarness): self.mgxs_lib.energy_groups = energy_groups self.mgxs_lib.delayed_groups = delayed_groups self.mgxs_lib.domain_type = 'distribcell' - material_cells = self.mgxs_lib.openmc_geometry.get_all_material_cells() - self.mgxs_lib.domains = [material_cells[-1]] + cells = self.mgxs_lib.openmc_geometry.get_all_material_cells() + self.mgxs_lib.domains = [c for c in cells if c.name == 'cell 1'] self.mgxs_lib.build_library() # Initialize a tallies file From ab96c3d874d62604d1efc4957aff88f9d3c88ed0 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 4 Aug 2016 16:37:53 -0400 Subject: [PATCH 030/168] fixed printing of x-min surface current to tallies.out --- src/output.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/output.F90 b/src/output.F90 index 3b0e2c7835..579735007e 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1035,7 +1035,7 @@ contains ! Left Surface matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, (/ i, j, k /)) - matching_bins(i_filter_surf) = OUT_RIGHT + matching_bins(i_filter_surf) = OUT_LEFT filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & From 469c7ff38ef09f3017825120091e4b7e895fecd9 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 5 Aug 2016 08:37:57 -0400 Subject: [PATCH 031/168] added mdgxs tallies to mgxs tests and addressed other PR comments --- openmc/mgxs/groups.py | 12 +- openmc/mgxs/library.py | 7 +- src/cmfd_data.F90 | 2 +- .../inputs_true.dat | 2 +- .../results_true.dat | 63 ++++++++++ .../test_mgxs_library_condense.py | 8 +- .../inputs_true.dat | 2 +- .../results_true.dat | 105 +++++++++------- .../test_mgxs_library_distribcell.py | 16 ++- tests/test_mgxs_library_hdf5/inputs_true.dat | 2 +- tests/test_mgxs_library_hdf5/results_true.dat | 117 ++++++++++++++++++ .../test_mgxs_library_hdf5.py | 8 +- tests/test_mgxs_library_mesh/inputs_true.dat | 2 +- tests/test_mgxs_library_mesh/results_true.dat | 78 ++++++++++++ .../test_mgxs_library_mesh.py | 7 +- .../inputs_true.dat | 2 +- .../results_true.dat | 117 ++++++++++++++++++ .../test_mgxs_library_no_nuclides.py | 8 +- tests/test_score_current/results_true.dat | 2 +- 19 files changed, 493 insertions(+), 67 deletions(-) diff --git a/openmc/mgxs/groups.py b/openmc/mgxs/groups.py index 881597c7b2..c0eaa27c17 100644 --- a/openmc/mgxs/groups.py +++ b/openmc/mgxs/groups.py @@ -376,9 +376,10 @@ class DelayedGroups(object): # Check that the groups are within [1, MAX_DELAYED_GROUPS] for group in groups: cv.check_greater_than('delayed group', group, 0) - cv.check_less_than('delayed group', group, MAX_DELAYED_GROUPS + 1) + cv.check_less_than('delayed group', group, MAX_DELAYED_GROUPS, + equality=True) - self._groups = np.array(groups, dtype=int) + self._groups = np.asarray(groups, dtype=int) def can_merge(self, other): """Determine if delayed groups can be merged with another. @@ -395,10 +396,7 @@ class DelayedGroups(object): """ - if not isinstance(other, DelayedGroups): - return False - else: - return True + return isinstance(other, DelayedGroups) def merge(self, other): """Merge this delayed groups with another. @@ -424,7 +422,7 @@ class DelayedGroups(object): # Merge unique filter bins groups = np.concatenate((self.groups, other.groups)) groups = np.unique(groups) - groups = sorted(groups) + groups.sort() # Assign groups to merged groups merged_groups.groups = list(groups) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 56399ee2f0..5a4e2c94d4 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -255,8 +255,7 @@ class Library(object): @mgxs_types.setter def mgxs_types(self, mgxs_types): - all_mgxs_types = np.append(openmc.mgxs.MGXS_TYPES, - openmc.mgxs.MDGXS_TYPES) + all_mgxs_types = openmc.mgxs.MGXS_TYPES + openmc.mgxs.MDGXS_TYPES if mgxs_types == 'all': self._mgxs_types = all_mgxs_types else: @@ -270,7 +269,7 @@ class Library(object): cv.check_type('by_nuclide', by_nuclide, bool) if by_nuclide == True and self.domain_type == 'mesh': - raise ValueError('Unable to create MGXS library by nuclide with ' + + raise ValueError('Unable to create MGXS library by nuclide with ' 'mesh domain') self._by_nuclide = by_nuclide @@ -280,7 +279,7 @@ class Library(object): cv.check_value('domain type', domain_type, openmc.mgxs.DOMAIN_TYPES) if self.by_nuclide == True and domain_type == 'mesh': - raise ValueError('Unable to create MGXS library by nuclide with ' + + raise ValueError('Unable to create MGXS library by nuclide with ' 'mesh domain') self._domain_type = domain_type diff --git a/src/cmfd_data.F90 b/src/cmfd_data.F90 index bda12f27b4..d74c1b17e0 100644 --- a/src/cmfd_data.F90 +++ b/src/cmfd_data.F90 @@ -254,7 +254,7 @@ contains ! Right surface if (i < nx) then matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i+1, j, k /) ) + (/ i+1, j, k /) ) matching_bins(i_filter_surf) = OUT_LEFT score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 ! incoming diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat index 0c648376e8..e58015868a 100644 --- a/tests/test_mgxs_library_condense/inputs_true.dat +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -1 +1 @@ -e2cdca7ea5b3532050af5b12fac26d7ef212d2696bb1b73cdd00929b2243c40d100ad02438c7b090555b49815d0de6c48cf1b4ebf437a48bc80c2d2b4bad292e \ No newline at end of file +08c5f1c783dd88c5fed51c054718ca09fc4e99aa4560a6f928b3902991948f3a878d055ac46c07548904285c2c5f22dc2a3d8c1bb82b8e73d76dd790820117df \ No newline at end of file diff --git a/tests/test_mgxs_library_condense/results_true.dat b/tests/test_mgxs_library_condense/results_true.dat index ae768cbe67..d1a964a860 100644 --- a/tests/test_mgxs_library_condense/results_true.dat +++ b/tests/test_mgxs_library_condense/results_true.dat @@ -40,6 +40,27 @@ 0 10000 1 total 4.996730e-07 3.650635e-08 material group in nuclide mean std. dev. 0 10000 1 total 0.090004 0.006367 + 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 + 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 + 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 material group in nuclide mean std. dev. 0 10001 1 total 0.311594 0.013793 material group in nuclide mean std. dev. @@ -82,6 +103,27 @@ 0 10001 1 total 5.454760e-07 4.949800e-08 material group in nuclide mean std. dev. 0 10001 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 + 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 + 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 material group in nuclide mean std. dev. 0 10002 1 total 0.904999 0.043964 material group in nuclide mean std. dev. @@ -124,3 +166,24 @@ 0 10002 1 total 5.773006e-07 5.322132e-08 material group in nuclide mean std. dev. 0 10002 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 + 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 + 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 diff --git a/tests/test_mgxs_library_condense/test_mgxs_library_condense.py b/tests/test_mgxs_library_condense/test_mgxs_library_condense.py index 5571b59f2e..b849391690 100644 --- a/tests/test_mgxs_library_condense/test_mgxs_library_condense.py +++ b/tests/test_mgxs_library_condense/test_mgxs_library_condense.py @@ -23,12 +23,18 @@ class MGXSTestHarness(PyAPITestHarness): energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, 20.]) + # Initialize a six-delayed-group structure + delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + # Initialize MGXS Library for a few cross section types self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) self.mgxs_lib.by_nuclide = False + # Test all MGXS types - self.mgxs_lib.mgxs_types = openmc.mgxs.MGXS_TYPES + self.mgxs_lib.mgxs_types = openmc.mgxs.MGXS_TYPES + \ + openmc.mgxs.MDGXS_TYPES self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.delayed_groups = delayed_groups self.mgxs_lib.legendre_order = 3 self.mgxs_lib.domain_type = 'material' self.mgxs_lib.build_library() diff --git a/tests/test_mgxs_library_distribcell/inputs_true.dat b/tests/test_mgxs_library_distribcell/inputs_true.dat index 055ce35a57..64cd6b748d 100644 --- a/tests/test_mgxs_library_distribcell/inputs_true.dat +++ b/tests/test_mgxs_library_distribcell/inputs_true.dat @@ -1 +1 @@ -2d948f3b12293294eaeca231a3df9d51195379e8bb38dd3e68d3bc512a7d08ed52a1109054ca381684ec127268710f6d6e9210ac8154c9b379608e996627624a \ No newline at end of file +5e4bd179eeb955f61e01dc2a486e3fefd2cef7859390f12a817cd5412359766d7bfe0bf3f8553e8d28af0844ee04a4ebaad6510ec6157ee836d631a2a2b3baec \ No newline at end of file diff --git a/tests/test_mgxs_library_distribcell/results_true.dat b/tests/test_mgxs_library_distribcell/results_true.dat index c21ca09e99..fb301be61f 100644 --- a/tests/test_mgxs_library_distribcell/results_true.dat +++ b/tests/test_mgxs_library_distribcell/results_true.dat @@ -1,42 +1,63 @@ - avg(distribcell) group in nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 1.145934 0.553822 - avg(distribcell) group in nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.718919 0.520644 - avg(distribcell) group in nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.718919 0.520644 - avg(distribcell) group in nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.019762 0.010629 - avg(distribcell) group in nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.019762 0.010629 - avg(distribcell) group in nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.0 0.0 - avg(distribcell) group in nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.0 0.0 - avg(distribcell) group in nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.0 0.0 - avg(distribcell) group in nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 1.126172 0.54344 - avg(distribcell) group in nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 1.142547 0.570131 - avg(distribcell) group in group out nuclide moment mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P0 1.142547 0.570131 -1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P1 0.447381 0.216322 -2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P2 0.141202 0.066504 -3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P3 0.039228 0.024621 - avg(distribcell) group in group out nuclide moment mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P0 1.142547 0.570131 -1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P1 0.447381 0.216322 -2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P2 0.141202 0.066504 -3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P3 0.039228 0.024621 - avg(distribcell) group in group out nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 1.0 0.529717 - avg(distribcell) group in group out nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 0.0 0.0 - avg(distribcell) group out nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.0 0.0 - avg(distribcell) group out nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.0 0.0 - avg(distribcell) group in nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.000001 6.946255e-07 - avg(distribcell) group in nuclide mean std. dev. -0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.0 0.0 + avg(distribcell) group in nuclide mean std. dev. +0 (0,) 1 total 0.453624 0.02261 + avg(distribcell) group in nuclide mean std. dev. +0 (0,) 1 total 0.400852 0.024589 + avg(distribcell) group in nuclide mean std. dev. +0 (0,) 1 total 0.400852 0.024589 + avg(distribcell) group in nuclide mean std. dev. +0 (0,) 1 total 0.064903 0.004684 + avg(distribcell) group in nuclide mean std. dev. +0 (0,) 1 total 0.028048 0.004982 + avg(distribcell) group in nuclide mean std. dev. +0 (0,) 1 total 0.036855 0.002749 + avg(distribcell) group in nuclide mean std. dev. +0 (0,) 1 total 0.090649 0.006763 + avg(distribcell) group in nuclide mean std. dev. +0 (0,) 1 total 7.137955 0.532092 + avg(distribcell) group in nuclide mean std. dev. +0 (0,) 1 total 0.388721 0.018415 + avg(distribcell) group in nuclide mean std. dev. +0 (0,) 1 total 0.389304 0.023619 + avg(distribcell) group in group out nuclide moment mean std. dev. +0 (0,) 1 1 total P0 0.389304 0.023619 +1 (0,) 1 1 total P1 0.046224 0.005672 +2 (0,) 1 1 total P2 0.017984 0.002178 +3 (0,) 1 1 total P3 0.006628 0.001620 + avg(distribcell) group in group out nuclide moment mean std. dev. +0 (0,) 1 1 total P0 0.389304 0.023619 +1 (0,) 1 1 total P1 0.046224 0.005672 +2 (0,) 1 1 total P2 0.017984 0.002178 +3 (0,) 1 1 total P3 0.006628 0.001620 + avg(distribcell) group in group out nuclide mean std. dev. +0 (0,) 1 1 total 1.0 0.066327 + avg(distribcell) group in group out nuclide mean std. dev. +0 (0,) 1 1 total 0.085835 0.004328 + avg(distribcell) group out nuclide mean std. dev. +0 (0,) 1 total 1.0 0.046071 + avg(distribcell) group out nuclide mean std. dev. +0 (0,) 1 total 1.0 0.051471 + avg(distribcell) group in nuclide mean std. dev. +0 (0,) 1 total 4.996730e-07 3.741595e-08 + avg(distribcell) group in nuclide mean std. dev. +0 (0,) 1 total 0.090004 0.006717 + avg(distribcell) delayedgroup group in nuclide mean std. dev. +0 (0,) 1 1 total 0.000021 0.000002 +1 (0,) 2 1 total 0.000110 0.000008 +2 (0,) 3 1 total 0.000107 0.000008 +3 (0,) 4 1 total 0.000249 0.000018 +4 (0,) 5 1 total 0.000112 0.000008 +5 (0,) 6 1 total 0.000046 0.000003 + avg(distribcell) delayedgroup group out nuclide mean std. dev. +0 (0,) 1 1 total 0.0 0.000000 +1 (0,) 2 1 total 1.0 0.869128 +2 (0,) 3 1 total 1.0 1.414214 +3 (0,) 4 1 total 1.0 0.360359 +4 (0,) 5 1 total 0.0 0.000000 +5 (0,) 6 1 total 0.0 0.000000 + avg(distribcell) delayedgroup group in nuclide mean std. dev. +0 (0,) 1 1 total 0.000227 0.000022 +1 (0,) 2 1 total 0.001214 0.000115 +2 (0,) 3 1 total 0.001184 0.000111 +3 (0,) 4 1 total 0.002752 0.000257 +4 (0,) 5 1 total 0.001231 0.000113 +5 (0,) 6 1 total 0.000512 0.000047 diff --git a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py index 30593e54b5..d03f003134 100644 --- a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py +++ b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py @@ -6,29 +6,39 @@ import glob import hashlib sys.path.insert(0, os.pardir) from testing_harness import PyAPITestHarness +from input_set import PinCellInputSet import openmc import openmc.mgxs class MGXSTestHarness(PyAPITestHarness): def _build_inputs(self): + # Set the input set to use the pincell model + self._input_set = PinCellInputSet() + # Generate inputs using parent class routine super(MGXSTestHarness, self)._build_inputs() # Initialize a one-group structure energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 20.]) + # Initialize a six-delayed-group structure + delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + # Initialize MGXS Library for a few cross section types # for one material-filled cell in the geometry self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) self.mgxs_lib.by_nuclide = False + # Test all MGXS types - self.mgxs_lib.mgxs_types = openmc.mgxs.MGXS_TYPES + self.mgxs_lib.mgxs_types = openmc.mgxs.MGXS_TYPES + \ + openmc.mgxs.MDGXS_TYPES self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.delayed_groups = delayed_groups self.mgxs_lib.legendre_order = 3 self.mgxs_lib.domain_type = 'distribcell' - material_cells = self.mgxs_lib.openmc_geometry.get_all_material_cells() - self.mgxs_lib.domains = [material_cells[-1]] + cells = self.mgxs_lib.openmc_geometry.get_all_material_cells() + self.mgxs_lib.domains = [c for c in cells if c.name == 'cell 1'] self.mgxs_lib.build_library() # Initialize a tallies file diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat index 0c648376e8..e58015868a 100644 --- a/tests/test_mgxs_library_hdf5/inputs_true.dat +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -1 +1 @@ -e2cdca7ea5b3532050af5b12fac26d7ef212d2696bb1b73cdd00929b2243c40d100ad02438c7b090555b49815d0de6c48cf1b4ebf437a48bc80c2d2b4bad292e \ No newline at end of file +08c5f1c783dd88c5fed51c054718ca09fc4e99aa4560a6f928b3902991948f3a878d055ac46c07548904285c2c5f22dc2a3d8c1bb82b8e73d76dd790820117df \ No newline at end of file diff --git a/tests/test_mgxs_library_hdf5/results_true.dat b/tests/test_mgxs_library_hdf5/results_true.dat index b2bd28f279..3108573b35 100644 --- a/tests/test_mgxs_library_hdf5/results_true.dat +++ b/tests/test_mgxs_library_hdf5/results_true.dat @@ -72,6 +72,45 @@ domain=10000 type=inverse-velocity domain=10000 type=prompt-nu-fission [ 0.01923922 0.46671903] [ 0.00130951 0.04141087] +domain=10000 type=delayed-nu-fission +[[ 2.29808234e-05 1.06974158e-04] + [ 1.43606337e-04 5.52167907e-04] + [ 1.51382216e-04 5.27147681e-04] + [ 7.42603178e-05 2.22018043e-04] + [ 4.14908454e-05 9.10244403e-05] + [ 1.70016000e-05 3.81298119e-05]] +[[ 1.66363133e-06 9.49156242e-06] + [ 1.05907806e-05 4.89925426e-05] + [ 1.12671238e-05 4.67725567e-05] + [ 5.22610273e-06 1.87563195e-05] + [ 2.99830766e-06 7.68984041e-06] + [ 1.22654684e-06 3.22124663e-06]] +domain=10000 type=chi-delayed +[[ 0. 0.] + [ 1. 0.] + [ 1. 0.] + [ 1. 0.] + [ 0. 0.] + [ 0. 0.]] +[[ 0. 0. ] + [ 0.86912776 0. ] + [ 1.41421356 0. ] + [ 0.36035904 0. ] + [ 0. 0. ] + [ 0. 0. ]] +domain=10000 type=beta +[[ 4.89188107e-05 2.27713711e-04] + [ 3.05691886e-04 1.17538858e-03] + [ 3.22244241e-04 1.12212853e-03] + [ 3.82159891e-03 1.14255357e-02] + [ 2.13520995e-03 4.68431744e-03] + [ 8.74939644e-04 1.96224379e-03]] +[[ 4.67388620e-06 2.46946810e-05] + [ 2.95223877e-05 1.27466393e-04] + [ 3.12885004e-05 1.21690543e-04] + [ 3.21434855e-04 1.09939816e-03] + [ 1.82980497e-04 4.50738567e-04] + [ 7.48899920e-05 1.88812772e-04]] domain=10001 type=total [ 0.31373767 0.3008214 ] [ 0.0155819 0.02805245] @@ -146,6 +185,45 @@ domain=10001 type=inverse-velocity domain=10001 type=prompt-nu-fission [ 0. 0.] [ 0. 0.] +domain=10001 type=delayed-nu-fission +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +domain=10001 type=chi-delayed +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +domain=10001 type=beta +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] domain=10002 type=total [ 0.66457226 2.05238401] [ 0.03121475 0.22434291] @@ -220,3 +298,42 @@ domain=10002 type=inverse-velocity domain=10002 type=prompt-nu-fission [ 0. 0.] [ 0. 0.] +domain=10002 type=delayed-nu-fission +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +domain=10002 type=chi-delayed +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +domain=10002 type=beta +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] +[[ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.] + [ 0. 0.]] diff --git a/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py b/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py index 000a1f8cb9..a9d4210479 100644 --- a/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py +++ b/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py @@ -24,12 +24,18 @@ class MGXSTestHarness(PyAPITestHarness): energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, 20.]) + # Initialize a six-delayed-group structure + delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + # Initialize MGXS Library for a few cross section types self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) self.mgxs_lib.by_nuclide = False + # Test all MGXS types - self.mgxs_lib.mgxs_types = openmc.mgxs.MGXS_TYPES + self.mgxs_lib.mgxs_types = openmc.mgxs.MGXS_TYPES + \ + openmc.mgxs.MDGXS_TYPES self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.delayed_groups = delayed_groups self.mgxs_lib.legendre_order = 3 self.mgxs_lib.domain_type = 'material' self.mgxs_lib.build_library() diff --git a/tests/test_mgxs_library_mesh/inputs_true.dat b/tests/test_mgxs_library_mesh/inputs_true.dat index e036b49a26..f62e0aa05e 100644 --- a/tests/test_mgxs_library_mesh/inputs_true.dat +++ b/tests/test_mgxs_library_mesh/inputs_true.dat @@ -1 +1 @@ -a4cd030bea212e45fdb159e75a7fb3d1947e9bf3d0384ac5d37a72298d67dcfdd1b9eb5c6af8ac6e5983bd5b47de9c17a2ea472b467b7222a4909ee070bf1ca3 \ No newline at end of file +5f167bdd4d6ae5873d48483e85aceaec8a934239ed5a50ef6f6500ce204f5851ae330621a5007f3b3d6bdab49f2cd627d011c1f6e6983fec958a6984eb9cb7ca \ No newline at end of file diff --git a/tests/test_mgxs_library_mesh/results_true.dat b/tests/test_mgxs_library_mesh/results_true.dat index 03019cfd3d..2d641cc952 100644 --- a/tests/test_mgxs_library_mesh/results_true.dat +++ b/tests/test_mgxs_library_mesh/results_true.dat @@ -130,3 +130,81 @@ 1 1 2 1 1 total 0.028922 0.006394 2 2 1 1 1 total 0.022467 0.004039 3 2 2 1 1 total 0.024923 0.009632 + mesh 1 delayedgroup group in nuclide mean std. dev. + x y z +0 1 1 1 1 1 total 0.000004 4.432732e-07 +1 1 1 1 2 1 total 0.000026 2.653319e-06 +2 1 1 1 3 1 total 0.000024 2.402270e-06 +3 1 1 1 4 1 total 0.000054 5.464055e-06 +4 1 1 1 5 1 total 0.000026 2.663025e-06 +5 1 1 1 6 1 total 0.000010 1.038005e-06 +6 1 2 1 1 1 total 0.000005 1.098837e-06 +7 1 2 1 2 1 total 0.000029 6.436855e-06 +8 1 2 1 3 1 total 0.000027 5.926286e-06 +9 1 2 1 4 1 total 0.000061 1.359391e-05 +10 1 2 1 5 1 total 0.000029 6.489015e-06 +11 1 2 1 6 1 total 0.000011 2.574270e-06 +12 2 1 1 1 1 total 0.000004 6.987770e-07 +13 2 1 1 2 1 total 0.000023 4.115234e-06 +14 2 1 1 3 1 total 0.000021 3.816392e-06 +15 2 1 1 4 1 total 0.000049 8.885822e-06 +16 2 1 1 5 1 total 0.000024 4.378290e-06 +17 2 1 1 6 1 total 0.000009 1.745695e-06 +18 2 2 1 1 1 total 0.000004 1.660497e-06 +19 2 2 1 2 1 total 0.000025 9.701974e-06 +20 2 2 1 3 1 total 0.000023 9.005217e-06 +21 2 2 1 4 1 total 0.000054 2.084107e-05 +22 2 2 1 5 1 total 0.000026 9.981045e-06 +23 2 2 1 6 1 total 0.000010 3.987979e-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 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 +8 1 2 1 3 1 total 0.0 0.000000 +9 1 2 1 4 1 total 0.0 0.000000 +10 1 2 1 5 1 total 0.0 0.000000 +11 1 2 1 6 1 total 0.0 0.000000 +12 2 1 1 1 1 total 0.0 0.000000 +13 2 1 1 2 1 total 0.0 0.000000 +14 2 1 1 3 1 total 0.0 0.000000 +15 2 1 1 4 1 total 0.0 0.000000 +16 2 1 1 5 1 total 0.0 0.000000 +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 +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.000166 0.000023 +1 1 1 1 2 1 total 0.000989 0.000136 +2 1 1 1 3 1 total 0.000907 0.000123 +3 1 1 1 4 1 total 0.002087 0.000282 +4 1 1 1 5 1 total 0.001014 0.000137 +5 1 1 1 6 1 total 0.000400 0.000054 +6 1 2 1 1 1 total 0.000171 0.000039 +7 1 2 1 2 1 total 0.001003 0.000226 +8 1 2 1 3 1 total 0.000918 0.000208 +9 1 2 1 4 1 total 0.002100 0.000477 +10 1 2 1 5 1 total 0.000996 0.000228 +11 1 2 1 6 1 total 0.000394 0.000090 +12 2 1 1 1 1 total 0.000167 0.000030 +13 2 1 1 2 1 total 0.001002 0.000178 +14 2 1 1 3 1 total 0.000926 0.000165 +15 2 1 1 4 1 total 0.002149 0.000384 +16 2 1 1 5 1 total 0.001056 0.000189 +17 2 1 1 6 1 total 0.000417 0.000076 +18 2 2 1 1 1 total 0.000171 0.000082 +19 2 2 1 2 1 total 0.001007 0.000480 +20 2 2 1 3 1 total 0.000929 0.000445 +21 2 2 1 4 1 total 0.002143 0.001028 +22 2 2 1 5 1 total 0.001026 0.000492 +23 2 2 1 6 1 total 0.000408 0.000196 diff --git a/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py b/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py index df7a0a5ae8..2db57254b4 100644 --- a/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py +++ b/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py @@ -18,14 +18,19 @@ class MGXSTestHarness(PyAPITestHarness): # Initialize a one-group structure energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 20.]) + # Initialize a six-delayed-group structure + delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + # Initialize MGXS Library for a few cross section types # for one material-filled cell in the geometry self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) self.mgxs_lib.by_nuclide = False # Test all MGXS types - self.mgxs_lib.mgxs_types = openmc.mgxs.MGXS_TYPES + self.mgxs_lib.mgxs_types = openmc.mgxs.MGXS_TYPES + \ + openmc.mgxs.MDGXS_TYPES self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.delayed_groups = delayed_groups self.mgxs_lib.legendre_order = 3 self.mgxs_lib.domain_type = 'mesh' diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat index 0c648376e8..e58015868a 100644 --- a/tests/test_mgxs_library_no_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -1 +1 @@ -e2cdca7ea5b3532050af5b12fac26d7ef212d2696bb1b73cdd00929b2243c40d100ad02438c7b090555b49815d0de6c48cf1b4ebf437a48bc80c2d2b4bad292e \ No newline at end of file +08c5f1c783dd88c5fed51c054718ca09fc4e99aa4560a6f928b3902991948f3a878d055ac46c07548904285c2c5f22dc2a3d8c1bb82b8e73d76dd790820117df \ No newline at end of file diff --git a/tests/test_mgxs_library_no_nuclides/results_true.dat b/tests/test_mgxs_library_no_nuclides/results_true.dat index 141143c8c3..edd99b44c5 100644 --- a/tests/test_mgxs_library_no_nuclides/results_true.dat +++ b/tests/test_mgxs_library_no_nuclides/results_true.dat @@ -84,6 +84,45 @@ material group in nuclide mean std. dev. 1 10000 1 total 0.019239 0.001310 0 10000 2 total 0.466719 0.041411 + material delayedgroup group in nuclide mean std. dev. +1 10000 1 1 total 0.000023 0.000002 +3 10000 2 1 total 0.000144 0.000011 +5 10000 3 1 total 0.000151 0.000011 +7 10000 4 1 total 0.000074 0.000005 +9 10000 5 1 total 0.000041 0.000003 +11 10000 6 1 total 0.000017 0.000001 +0 10000 1 2 total 0.000107 0.000009 +2 10000 2 2 total 0.000552 0.000049 +4 10000 3 2 total 0.000527 0.000047 +6 10000 4 2 total 0.000222 0.000019 +8 10000 5 2 total 0.000091 0.000008 +10 10000 6 2 total 0.000038 0.000003 + 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 + material delayedgroup group in nuclide mean std. dev. +1 10000 1 1 total 0.000049 0.000005 +3 10000 2 1 total 0.000306 0.000030 +5 10000 3 1 total 0.000322 0.000031 +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.011426 0.001099 +8 10000 5 2 total 0.004684 0.000451 +10 10000 6 2 total 0.001962 0.000189 material group in nuclide mean std. dev. 1 10001 1 total 0.313738 0.015582 0 10001 2 total 0.300821 0.028052 @@ -170,6 +209,45 @@ material group in nuclide mean std. dev. 1 10001 1 total 0.0 0.0 0 10001 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 + 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 + 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 material group in nuclide mean std. dev. 1 10002 1 total 0.664572 0.031215 0 10002 2 total 2.052384 0.224343 @@ -256,3 +334,42 @@ material group in nuclide mean std. dev. 1 10002 1 total 0.0 0.0 0 10002 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 + 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 + 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 diff --git a/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py b/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py index 2c0a2e278c..d2e61a2da4 100644 --- a/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py +++ b/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py @@ -23,12 +23,18 @@ class MGXSTestHarness(PyAPITestHarness): energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, 20.]) + # Initialize a six-delayed-group structure + delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + # Initialize MGXS Library for a few cross section types self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) self.mgxs_lib.by_nuclide = False + # Test all MGXS types - self.mgxs_lib.mgxs_types = openmc.mgxs.MGXS_TYPES + self.mgxs_lib.mgxs_types = openmc.mgxs.MGXS_TYPES + \ + openmc.mgxs.MDGXS_TYPES self.mgxs_lib.energy_groups = energy_groups + self.mgxs_lib.delayed_groups = delayed_groups self.mgxs_lib.legendre_order = 3 self.mgxs_lib.domain_type = 'material' self.mgxs_lib.build_library() diff --git a/tests/test_score_current/results_true.dat b/tests/test_score_current/results_true.dat index 5d26226ae2..6b3beb4be8 100644 --- a/tests/test_score_current/results_true.dat +++ b/tests/test_score_current/results_true.dat @@ -1 +1 @@ -bafab1921a12146abb2bb29603b52b9cc28a5a950a7a6bb1e3f012c05891c310fad643760d4f148b04d0fef3d1f3e141d146e3a278d81cc6fc8187c37717c5e7 \ No newline at end of file +2800fad5519917ffc985094d3263a3e0aac1abf6acb0c25416264135b36141812cc8d7dafc01585b104b8d6ad03cd44b6ce277fdb7df5a3f859fe26e61244e2a \ No newline at end of file From 3c1dd4075dfde4e8bfc15a5a9d5c9e6207d99e67 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 5 Aug 2016 08:39:55 -0400 Subject: [PATCH 032/168] removed mdgxs tests --- .../inputs_true.dat | 1 - .../results_true.dat | 63 ---------- .../test_mdgxs_library_condense.py | 82 ------------ .../inputs_true.dat | 1 - .../results_true.dat | 21 ---- .../test_mdgxs_library_distribcell.py | 84 ------------- tests/test_mdgxs_library_hdf5/inputs_true.dat | 1 - .../test_mdgxs_library_hdf5/results_true.dat | 117 ------------------ .../test_mdgxs_library_hdf5.py | 93 -------------- tests/test_mdgxs_library_mesh/inputs_true.dat | 1 - .../test_mdgxs_library_mesh/results_true.dat | 78 ------------ .../test_mdgxs_library_mesh.py | 84 ------------- .../inputs_true.dat | 1 - .../results_true.dat | 117 ------------------ .../test_mdgxs_library_no_nuclides.py | 80 ------------ .../inputs_true.dat | 1 - .../results_true.dat | 1 - .../test_mdgxs_library_nuclides.py | 80 ------------ 18 files changed, 906 deletions(-) delete mode 100644 tests/test_mdgxs_library_condense/inputs_true.dat delete mode 100644 tests/test_mdgxs_library_condense/results_true.dat delete mode 100644 tests/test_mdgxs_library_condense/test_mdgxs_library_condense.py delete mode 100644 tests/test_mdgxs_library_distribcell/inputs_true.dat delete mode 100644 tests/test_mdgxs_library_distribcell/results_true.dat delete mode 100644 tests/test_mdgxs_library_distribcell/test_mdgxs_library_distribcell.py delete mode 100644 tests/test_mdgxs_library_hdf5/inputs_true.dat delete mode 100644 tests/test_mdgxs_library_hdf5/results_true.dat delete mode 100644 tests/test_mdgxs_library_hdf5/test_mdgxs_library_hdf5.py delete mode 100644 tests/test_mdgxs_library_mesh/inputs_true.dat delete mode 100644 tests/test_mdgxs_library_mesh/results_true.dat delete mode 100644 tests/test_mdgxs_library_mesh/test_mdgxs_library_mesh.py delete mode 100644 tests/test_mdgxs_library_no_nuclides/inputs_true.dat delete mode 100644 tests/test_mdgxs_library_no_nuclides/results_true.dat delete mode 100644 tests/test_mdgxs_library_no_nuclides/test_mdgxs_library_no_nuclides.py delete mode 100644 tests/test_mdgxs_library_nuclides/inputs_true.dat delete mode 100644 tests/test_mdgxs_library_nuclides/results_true.dat delete mode 100644 tests/test_mdgxs_library_nuclides/test_mdgxs_library_nuclides.py diff --git a/tests/test_mdgxs_library_condense/inputs_true.dat b/tests/test_mdgxs_library_condense/inputs_true.dat deleted file mode 100644 index 49fe693ee4..0000000000 --- a/tests/test_mdgxs_library_condense/inputs_true.dat +++ /dev/null @@ -1 +0,0 @@ -9e8d8b468bdd81d996956d0d43eef5779b7b7d5ca3f6a1e628f10318748086183e45cf221edf7a274ff2dc6aff34f4411e21952740cdb7652477dfa0a1ffb5f2 \ No newline at end of file diff --git a/tests/test_mdgxs_library_condense/results_true.dat b/tests/test_mdgxs_library_condense/results_true.dat deleted file mode 100644 index 20cc048d14..0000000000 --- a/tests/test_mdgxs_library_condense/results_true.dat +++ /dev/null @@ -1,63 +0,0 @@ - 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 - material delayedgroup group out nuclide mean std. dev. -0 10000 1 1 total 0 0.000000 -1 10000 2 1 total 1 0.869128 -2 10000 3 1 total 1 1.414214 -3 10000 4 1 total 1 0.360359 -4 10000 5 1 total 0 0.000000 -5 10000 6 1 total 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 - material delayedgroup group in nuclide mean std. dev. -0 10001 1 1 total 0 0 -1 10001 2 1 total 0 0 -2 10001 3 1 total 0 0 -3 10001 4 1 total 0 0 -4 10001 5 1 total 0 0 -5 10001 6 1 total 0 0 - material delayedgroup group out nuclide mean std. dev. -0 10001 1 1 total 0 0 -1 10001 2 1 total 0 0 -2 10001 3 1 total 0 0 -3 10001 4 1 total 0 0 -4 10001 5 1 total 0 0 -5 10001 6 1 total 0 0 - material delayedgroup group in nuclide mean std. dev. -0 10001 1 1 total 0 0 -1 10001 2 1 total 0 0 -2 10001 3 1 total 0 0 -3 10001 4 1 total 0 0 -4 10001 5 1 total 0 0 -5 10001 6 1 total 0 0 - material delayedgroup group in nuclide mean std. dev. -0 10002 1 1 total 0 0 -1 10002 2 1 total 0 0 -2 10002 3 1 total 0 0 -3 10002 4 1 total 0 0 -4 10002 5 1 total 0 0 -5 10002 6 1 total 0 0 - material delayedgroup group out nuclide mean std. dev. -0 10002 1 1 total 0 0 -1 10002 2 1 total 0 0 -2 10002 3 1 total 0 0 -3 10002 4 1 total 0 0 -4 10002 5 1 total 0 0 -5 10002 6 1 total 0 0 - material delayedgroup group in nuclide mean std. dev. -0 10002 1 1 total 0 0 -1 10002 2 1 total 0 0 -2 10002 3 1 total 0 0 -3 10002 4 1 total 0 0 -4 10002 5 1 total 0 0 -5 10002 6 1 total 0 0 diff --git a/tests/test_mdgxs_library_condense/test_mdgxs_library_condense.py b/tests/test_mdgxs_library_condense/test_mdgxs_library_condense.py deleted file mode 100644 index 75e40be909..0000000000 --- a/tests/test_mdgxs_library_condense/test_mdgxs_library_condense.py +++ /dev/null @@ -1,82 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -import glob -import hashlib -sys.path.insert(0, os.pardir) -from testing_harness import PyAPITestHarness -from input_set import PinCellInputSet -import openmc -import openmc.mgxs - - -class MDGXSTestHarness(PyAPITestHarness): - def _build_inputs(self): - # Set the input set to use the pincell model - self._input_set = PinCellInputSet() - - # Generate inputs using parent class routine - super(MDGXSTestHarness, self)._build_inputs() - - # Initialize a two-group structure - energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, - 20.]) - delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) - - # Initialize MGXS Library for a few cross section types - self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) - self.mgxs_lib.by_nuclide = False - - # Test all MGXS types - self.mgxs_lib.mgxs_types = openmc.mgxs.MDGXS_TYPES - self.mgxs_lib.energy_groups = energy_groups - self.mgxs_lib.delayed_groups = delayed_groups - self.mgxs_lib.domain_type = 'material' - self.mgxs_lib.build_library() - - # Initialize a tallies file - self._input_set.tallies = openmc.Tallies() - self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) - self._input_set.tallies.export_to_xml() - - def _get_results(self, hash_output=False): - """Digest info in the statepoint and return as a string.""" - - # Read the statepoint file. - statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] - sp = openmc.StatePoint(statepoint) - - # Load the MGXS library from the statepoint - self.mgxs_lib.load_from_statepoint(sp) - - # Build a condensed 1-group MGXS Library - one_group = openmc.mgxs.EnergyGroups([0., 20.]) - condense_lib = self.mgxs_lib.get_condensed_library(one_group) - - # Build a string from Pandas Dataframe for each 1-group MGXS - outstr = '' - for domain in condense_lib.domains: - for mgxs_type in condense_lib.mgxs_types: - mgxs = condense_lib.get_mgxs(domain, mgxs_type) - df = mgxs.get_pandas_dataframe() - outstr += df.to_string() + '\n' - - # Hash the results if necessary - if hash_output: - sha512 = hashlib.sha512() - sha512.update(outstr.encode('utf-8')) - outstr = sha512.hexdigest() - - return outstr - - - def _cleanup(self): - super(MDGXSTestHarness, self)._cleanup() - f = os.path.join(os.getcwd(), 'tallies.xml') - if os.path.exists(f): os.remove(f) - - -if __name__ == '__main__': - harness = MDGXSTestHarness('statepoint.10.*', True) - harness.main() diff --git a/tests/test_mdgxs_library_distribcell/inputs_true.dat b/tests/test_mdgxs_library_distribcell/inputs_true.dat deleted file mode 100644 index 31a7a7f904..0000000000 --- a/tests/test_mdgxs_library_distribcell/inputs_true.dat +++ /dev/null @@ -1 +0,0 @@ -d3cf661e7fd29b0bbd6e6a464bb3b0b48a798dbd5c701246fd3c904f87c0d07ad995fc07f5b0a6c665449b7f5c92f68968e3947690794a0b743ea38a7f43f95f \ No newline at end of file diff --git a/tests/test_mdgxs_library_distribcell/results_true.dat b/tests/test_mdgxs_library_distribcell/results_true.dat deleted file mode 100644 index 67f65fc301..0000000000 --- a/tests/test_mdgxs_library_distribcell/results_true.dat +++ /dev/null @@ -1,21 +0,0 @@ - avg(distribcell) delayedgroup group in nuclide mean std. dev. -0 (0,) 1 1 total 0.000021 0.000002 -1 (0,) 2 1 total 0.000110 0.000008 -2 (0,) 3 1 total 0.000107 0.000008 -3 (0,) 4 1 total 0.000249 0.000018 -4 (0,) 5 1 total 0.000112 0.000008 -5 (0,) 6 1 total 0.000046 0.000003 - avg(distribcell) delayedgroup group out nuclide mean std. dev. -0 (0,) 1 1 total 0 0.000000 -1 (0,) 2 1 total 1 0.869128 -2 (0,) 3 1 total 1 1.414214 -3 (0,) 4 1 total 1 0.360359 -4 (0,) 5 1 total 0 0.000000 -5 (0,) 6 1 total 0 0.000000 - avg(distribcell) delayedgroup group in nuclide mean std. dev. -0 (0,) 1 1 total 0.000227 0.000022 -1 (0,) 2 1 total 0.001214 0.000115 -2 (0,) 3 1 total 0.001184 0.000111 -3 (0,) 4 1 total 0.002752 0.000257 -4 (0,) 5 1 total 0.001231 0.000113 -5 (0,) 6 1 total 0.000512 0.000047 diff --git a/tests/test_mdgxs_library_distribcell/test_mdgxs_library_distribcell.py b/tests/test_mdgxs_library_distribcell/test_mdgxs_library_distribcell.py deleted file mode 100644 index df4fc184d3..0000000000 --- a/tests/test_mdgxs_library_distribcell/test_mdgxs_library_distribcell.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -import glob -import hashlib -sys.path.insert(0, os.pardir) -from testing_harness import PyAPITestHarness -from input_set import PinCellInputSet -import openmc -import openmc.mgxs - - -class MDGXSTestHarness(PyAPITestHarness): - def _build_inputs(self): - # Set the input set to use the pincell model - self._input_set = PinCellInputSet() - - # Generate inputs using parent class routine - super(MDGXSTestHarness, self)._build_inputs() - - # Initialize a one-group structure - energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 20.]) - - # Initialize a six-group structure - delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) - - # Initialize MGXS Library for a few cross section types - # for one material-filled cell in the geometry - self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) - self.mgxs_lib.by_nuclide = False - - # Test all MDGXS types - self.mgxs_lib.mgxs_types = openmc.mgxs.MDGXS_TYPES - self.mgxs_lib.energy_groups = energy_groups - self.mgxs_lib.delayed_groups = delayed_groups - self.mgxs_lib.domain_type = 'distribcell' - cells = self.mgxs_lib.openmc_geometry.get_all_material_cells() - self.mgxs_lib.domains = [c for c in cells if c.name == 'cell 1'] - self.mgxs_lib.build_library() - - # Initialize a tallies file - self._input_set.tallies = openmc.Tallies() - self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) - self._input_set.tallies.export_to_xml() - - def _get_results(self, hash_output=False): - """Digest info in the statepoint and return as a string.""" - - # Read the statepoint file. - statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] - sp = openmc.StatePoint(statepoint) - - # Load the MGXS library from the statepoint - self.mgxs_lib.load_from_statepoint(sp) - - # Average the MGXS across distribcell subdomains - avg_lib = self.mgxs_lib.get_subdomain_avg_library() - - # Build a string from Pandas Dataframe for each 1-group MGXS - outstr = '' - for domain in avg_lib.domains: - for mgxs_type in avg_lib.mgxs_types: - mgxs = avg_lib.get_mgxs(domain, mgxs_type) - df = mgxs.get_pandas_dataframe() - outstr += df.to_string() + '\n' - - # Hash the results if necessary - if hash_output: - sha512 = hashlib.sha512() - sha512.update(outstr.encode('utf-8')) - outstr = sha512.hexdigest() - - return outstr - - def _cleanup(self): - super(MDGXSTestHarness, self)._cleanup() - f = os.path.join(os.getcwd(), 'tallies.xml') - if os.path.exists(f): os.remove(f) - - -if __name__ == '__main__': - harness = MDGXSTestHarness('statepoint.10.*', True) - harness.main() diff --git a/tests/test_mdgxs_library_hdf5/inputs_true.dat b/tests/test_mdgxs_library_hdf5/inputs_true.dat deleted file mode 100644 index 49fe693ee4..0000000000 --- a/tests/test_mdgxs_library_hdf5/inputs_true.dat +++ /dev/null @@ -1 +0,0 @@ -9e8d8b468bdd81d996956d0d43eef5779b7b7d5ca3f6a1e628f10318748086183e45cf221edf7a274ff2dc6aff34f4411e21952740cdb7652477dfa0a1ffb5f2 \ No newline at end of file diff --git a/tests/test_mdgxs_library_hdf5/results_true.dat b/tests/test_mdgxs_library_hdf5/results_true.dat deleted file mode 100644 index d1b6358716..0000000000 --- a/tests/test_mdgxs_library_hdf5/results_true.dat +++ /dev/null @@ -1,117 +0,0 @@ -domain=10000 type=delayed-nu-fission -[[ 2.29808234e-05 1.06974158e-04] - [ 1.43606337e-04 5.52167907e-04] - [ 1.51382216e-04 5.27147681e-04] - [ 7.42603178e-05 2.22018043e-04] - [ 4.14908454e-05 9.10244403e-05] - [ 1.70016000e-05 3.81298119e-05]] -[[ 1.66363133e-06 9.49156242e-06] - [ 1.05907806e-05 4.89925426e-05] - [ 1.12671238e-05 4.67725567e-05] - [ 5.22610273e-06 1.87563195e-05] - [ 2.99830766e-06 7.68984041e-06] - [ 1.22654684e-06 3.22124663e-06]] -domain=10000 type=chi-delayed -[[ 0. 0.] - [ 1. 0.] - [ 1. 0.] - [ 1. 0.] - [ 0. 0.] - [ 0. 0.]] -[[ 0. 0. ] - [ 0.86912776 0. ] - [ 1.41421356 0. ] - [ 0.36035904 0. ] - [ 0. 0. ] - [ 0. 0. ]] -domain=10000 type=beta -[[ 4.89188107e-05 2.27713711e-04] - [ 3.05691886e-04 1.17538858e-03] - [ 3.22244241e-04 1.12212853e-03] - [ 3.82159891e-03 1.14255357e-02] - [ 2.13520995e-03 4.68431744e-03] - [ 8.74939644e-04 1.96224379e-03]] -[[ 4.67388620e-06 2.46946810e-05] - [ 2.95223877e-05 1.27466393e-04] - [ 3.12885004e-05 1.21690543e-04] - [ 3.21434855e-04 1.09939816e-03] - [ 1.82980497e-04 4.50738567e-04] - [ 7.48899920e-05 1.88812772e-04]] -domain=10001 type=delayed-nu-fission -[[ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.]] -[[ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.]] -domain=10001 type=chi-delayed -[[ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.]] -[[ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.]] -domain=10001 type=beta -[[ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.]] -[[ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.]] -domain=10002 type=delayed-nu-fission -[[ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.]] -[[ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.]] -domain=10002 type=chi-delayed -[[ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.]] -[[ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.]] -domain=10002 type=beta -[[ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.]] -[[ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.] - [ 0. 0.]] diff --git a/tests/test_mdgxs_library_hdf5/test_mdgxs_library_hdf5.py b/tests/test_mdgxs_library_hdf5/test_mdgxs_library_hdf5.py deleted file mode 100644 index 79e0edf7c2..0000000000 --- a/tests/test_mdgxs_library_hdf5/test_mdgxs_library_hdf5.py +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -import glob -import hashlib -import h5py -sys.path.insert(0, os.pardir) -from testing_harness import PyAPITestHarness -from input_set import PinCellInputSet -import openmc -import openmc.mgxs - - -class MDGXSTestHarness(PyAPITestHarness): - def _build_inputs(self): - # Set the input set to use the pincell model - self._input_set = PinCellInputSet() - - # Generate inputs using parent class routine - super(MDGXSTestHarness, self)._build_inputs() - - # Initialize a two-group structure - energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, - 20.]) - - # Initialize a six-group structure - delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) - - # Initialize MGXS Library for a few cross section types - self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) - self.mgxs_lib.by_nuclide = False - - # Test all MDGXS types - self.mgxs_lib.mgxs_types = openmc.mgxs.MDGXS_TYPES - self.mgxs_lib.energy_groups = energy_groups - self.mgxs_lib.delayed_groups = delayed_groups - self.mgxs_lib.domain_type = 'material' - self.mgxs_lib.build_library() - - # Initialize a tallies file - self._input_set.tallies = openmc.Tallies() - self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) - self._input_set.tallies.export_to_xml() - - def _get_results(self, hash_output=False): - """Digest info in the statepoint and return as a string.""" - - # Read the statepoint file. - statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] - sp = openmc.StatePoint(statepoint) - - # Load the MGXS library from the statepoint - self.mgxs_lib.load_from_statepoint(sp) - - # Export the MGXS Library to an HDF5 file - self.mgxs_lib.build_hdf5_store(directory='.') - - # Open the MGXS HDF5 file - f = h5py.File('mgxs.h5', 'r') - - # Build a string from the datasets in the HDF5 file - outstr = '' - for domain in self.mgxs_lib.domains: - for mgxs_type in self.mgxs_lib.mgxs_types: - outstr += 'domain={0} type={1}\n'.format(domain.id, mgxs_type) - key = 'material/{0}/{1}/average'.format(domain.id, mgxs_type) - outstr += str(f[key][...]) + '\n' - key = 'material/{0}/{1}/std. dev.'.format(domain.id, mgxs_type) - outstr += str(f[key][...]) + '\n' - - # Close the MGXS HDF5 file - f.close() - - # Hash the results if necessary - if hash_output: - sha512 = hashlib.sha512() - sha512.update(outstr.encode('utf-8')) - outstr = sha512.hexdigest() - - return outstr - - def _cleanup(self): - super(MDGXSTestHarness, self)._cleanup() - f = os.path.join(os.getcwd(), 'tallies.xml') - if os.path.exists(f): os.remove(f) - f = os.path.join(os.getcwd(), 'mgxs.h5') - if os.path.exists(f): os.remove(f) - - -if __name__ == '__main__': - harness = MDGXSTestHarness('statepoint.10.*', True) - harness.main() diff --git a/tests/test_mdgxs_library_mesh/inputs_true.dat b/tests/test_mdgxs_library_mesh/inputs_true.dat deleted file mode 100644 index 02a9147f88..0000000000 --- a/tests/test_mdgxs_library_mesh/inputs_true.dat +++ /dev/null @@ -1 +0,0 @@ -f76b5d0cc2dbadd48d51918d8c82e4457e9ce3eafb191cd51394e420ba3ae80eccdff03098b276f7d3eb87f6a4616f1dd0e39e1892244a29d0f486ff2bf4ddbb \ No newline at end of file diff --git a/tests/test_mdgxs_library_mesh/results_true.dat b/tests/test_mdgxs_library_mesh/results_true.dat deleted file mode 100644 index 82f8014f90..0000000000 --- a/tests/test_mdgxs_library_mesh/results_true.dat +++ /dev/null @@ -1,78 +0,0 @@ - mesh 1 delayedgroup group in nuclide mean std. dev. - x y z -0 1 1 1 1 1 total 0.000004 4.432287e-07 -1 1 1 1 2 1 total 0.000026 2.652890e-06 -2 1 1 1 3 1 total 0.000024 2.402024e-06 -3 1 1 1 4 1 total 0.000054 5.463683e-06 -4 1 1 1 5 1 total 0.000026 2.662762e-06 -5 1 1 1 6 1 total 0.000010 1.037947e-06 -6 1 2 1 1 1 total 0.000005 1.099501e-06 -7 1 2 1 2 1 total 0.000029 6.440339e-06 -8 1 2 1 3 1 total 0.000027 5.929275e-06 -9 1 2 1 4 1 total 0.000061 1.359998e-05 -10 1 2 1 5 1 total 0.000029 6.491514e-06 -11 1 2 1 6 1 total 0.000011 2.575232e-06 -12 2 1 1 1 1 total 0.000004 6.988358e-07 -13 2 1 1 2 1 total 0.000023 4.116310e-06 -14 2 1 1 3 1 total 0.000021 3.817611e-06 -15 2 1 1 4 1 total 0.000049 8.889347e-06 -16 2 1 1 5 1 total 0.000024 4.380665e-06 -17 2 1 1 6 1 total 0.000009 1.746558e-06 -18 2 2 1 1 1 total 0.000004 1.661116e-06 -19 2 2 1 2 1 total 0.000025 9.704053e-06 -20 2 2 1 3 1 total 0.000023 9.007295e-06 -21 2 2 1 4 1 total 0.000054 2.084505e-05 -22 2 2 1 5 1 total 0.000026 9.981347e-06 -23 2 2 1 6 1 total 0.000010 3.988280e-06 - mesh 1 delayedgroup group out nuclide mean std. dev. - x y z -0 1 1 1 1 1 total 0 0.000000 -1 1 1 1 2 1 total 0 0.000000 -2 1 1 1 3 1 total 0 0.000000 -3 1 1 1 4 1 total 1 1.414214 -4 1 1 1 5 1 total 0 0.000000 -5 1 1 1 6 1 total 0 0.000000 -6 1 2 1 1 1 total 0 0.000000 -7 1 2 1 2 1 total 0 0.000000 -8 1 2 1 3 1 total 0 0.000000 -9 1 2 1 4 1 total 0 0.000000 -10 1 2 1 5 1 total 0 0.000000 -11 1 2 1 6 1 total 0 0.000000 -12 2 1 1 1 1 total 0 0.000000 -13 2 1 1 2 1 total 0 0.000000 -14 2 1 1 3 1 total 0 0.000000 -15 2 1 1 4 1 total 0 0.000000 -16 2 1 1 5 1 total 0 0.000000 -17 2 1 1 6 1 total 0 0.000000 -18 2 2 1 1 1 total 0 0.000000 -19 2 2 1 2 1 total 0 0.000000 -20 2 2 1 3 1 total 0 0.000000 -21 2 2 1 4 1 total 0 0.000000 -22 2 2 1 5 1 total 0 0.000000 -23 2 2 1 6 1 total 0 0.000000 - mesh 1 delayedgroup group in nuclide mean std. dev. - x y z -0 1 1 1 1 1 total 0.000166 0.000023 -1 1 1 1 2 1 total 0.000990 0.000136 -2 1 1 1 3 1 total 0.000907 0.000123 -3 1 1 1 4 1 total 0.002088 0.000282 -4 1 1 1 5 1 total 0.001014 0.000137 -5 1 1 1 6 1 total 0.000400 0.000054 -6 1 2 1 1 1 total 0.000171 0.000039 -7 1 2 1 2 1 total 0.001003 0.000226 -8 1 2 1 3 1 total 0.000919 0.000208 -9 1 2 1 4 1 total 0.002101 0.000478 -10 1 2 1 5 1 total 0.000997 0.000228 -11 1 2 1 6 1 total 0.000395 0.000090 -12 2 1 1 1 1 total 0.000168 0.000030 -13 2 1 1 2 1 total 0.001003 0.000178 -14 2 1 1 3 1 total 0.000927 0.000165 -15 2 1 1 4 1 total 0.002150 0.000385 -16 2 1 1 5 1 total 0.001057 0.000190 -17 2 1 1 6 1 total 0.000418 0.000076 -18 2 2 1 1 1 total 0.000171 0.000082 -19 2 2 1 2 1 total 0.001010 0.000481 -20 2 2 1 3 1 total 0.000932 0.000445 -21 2 2 1 4 1 total 0.002151 0.001030 -22 2 2 1 5 1 total 0.001030 0.000493 -23 2 2 1 6 1 total 0.000410 0.000197 diff --git a/tests/test_mdgxs_library_mesh/test_mdgxs_library_mesh.py b/tests/test_mdgxs_library_mesh/test_mdgxs_library_mesh.py deleted file mode 100644 index 88ee7213da..0000000000 --- a/tests/test_mdgxs_library_mesh/test_mdgxs_library_mesh.py +++ /dev/null @@ -1,84 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -import glob -import hashlib -sys.path.insert(0, os.pardir) -from testing_harness import PyAPITestHarness -import openmc -import openmc.mgxs - - -class MDGXSTestHarness(PyAPITestHarness): - def _build_inputs(self): - # Generate inputs using parent class routine - super(MDGXSTestHarness, self)._build_inputs() - - # Initialize a one-group structure - energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 20.]) - - # Initialize a six-group structure - delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) - - # Initialize MGXS Library for a few cross section types - # for one material-filled cell in the geometry - self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) - self.mgxs_lib.by_nuclide = False - - # Test all MDGXS types - self.mgxs_lib.mgxs_types = openmc.mgxs.MDGXS_TYPES - self.mgxs_lib.energy_groups = energy_groups - self.mgxs_lib.delayed_groups = delayed_groups - self.mgxs_lib.domain_type = 'mesh' - - # Instantiate a tally mesh - mesh = openmc.Mesh(mesh_id=1) - mesh.type = 'regular' - mesh.dimension = [2, 2] - mesh.lower_left = [-100., -100.] - mesh.width = [100., 100.] - - self.mgxs_lib.domains = [mesh] - self.mgxs_lib.build_library() - - # Initialize a tallies file - self._input_set.tallies = openmc.Tallies() - self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) - self._input_set.tallies.export_to_xml() - - def _get_results(self, hash_output=False): - """Digest info in the statepoint and return as a string.""" - - # Read the statepoint file. - statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] - sp = openmc.StatePoint(statepoint) - - # Load the MGXS library from the statepoint - self.mgxs_lib.load_from_statepoint(sp) - - # Build a string from Pandas Dataframe for each 1-group MGXS - outstr = '' - for domain in self.mgxs_lib.domains: - for mgxs_type in self.mgxs_lib.mgxs_types: - mgxs = self.mgxs_lib.get_mgxs(domain, mgxs_type) - df = mgxs.get_pandas_dataframe() - outstr += df.to_string() + '\n' - - # Hash the results if necessary - if hash_output: - sha512 = hashlib.sha512() - sha512.update(outstr.encode('utf-8')) - outstr = sha512.hexdigest() - - return outstr - - def _cleanup(self): - super(MDGXSTestHarness, self)._cleanup() - f = os.path.join(os.getcwd(), 'tallies.xml') - if os.path.exists(f): os.remove(f) - - -if __name__ == '__main__': - harness = MDGXSTestHarness('statepoint.10.*', True) - harness.main() diff --git a/tests/test_mdgxs_library_no_nuclides/inputs_true.dat b/tests/test_mdgxs_library_no_nuclides/inputs_true.dat deleted file mode 100644 index 49fe693ee4..0000000000 --- a/tests/test_mdgxs_library_no_nuclides/inputs_true.dat +++ /dev/null @@ -1 +0,0 @@ -9e8d8b468bdd81d996956d0d43eef5779b7b7d5ca3f6a1e628f10318748086183e45cf221edf7a274ff2dc6aff34f4411e21952740cdb7652477dfa0a1ffb5f2 \ No newline at end of file diff --git a/tests/test_mdgxs_library_no_nuclides/results_true.dat b/tests/test_mdgxs_library_no_nuclides/results_true.dat deleted file mode 100644 index e3afdcdb6d..0000000000 --- a/tests/test_mdgxs_library_no_nuclides/results_true.dat +++ /dev/null @@ -1,117 +0,0 @@ - material delayedgroup group in nuclide mean std. dev. -1 10000 1 1 total 0.000023 0.000002 -3 10000 2 1 total 0.000144 0.000011 -5 10000 3 1 total 0.000151 0.000011 -7 10000 4 1 total 0.000074 0.000005 -9 10000 5 1 total 0.000041 0.000003 -11 10000 6 1 total 0.000017 0.000001 -0 10000 1 2 total 0.000107 0.000009 -2 10000 2 2 total 0.000552 0.000049 -4 10000 3 2 total 0.000527 0.000047 -6 10000 4 2 total 0.000222 0.000019 -8 10000 5 2 total 0.000091 0.000008 -10 10000 6 2 total 0.000038 0.000003 - material delayedgroup group out nuclide mean std. dev. -1 10000 1 1 total 0 0.000000 -3 10000 2 1 total 1 0.869128 -5 10000 3 1 total 1 1.414214 -7 10000 4 1 total 1 0.360359 -9 10000 5 1 total 0 0.000000 -11 10000 6 1 total 0 0.000000 -0 10000 1 2 total 0 0.000000 -2 10000 2 2 total 0 0.000000 -4 10000 3 2 total 0 0.000000 -6 10000 4 2 total 0 0.000000 -8 10000 5 2 total 0 0.000000 -10 10000 6 2 total 0 0.000000 - material delayedgroup group in nuclide mean std. dev. -1 10000 1 1 total 0.000049 0.000005 -3 10000 2 1 total 0.000306 0.000030 -5 10000 3 1 total 0.000322 0.000031 -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.011426 0.001099 -8 10000 5 2 total 0.004684 0.000451 -10 10000 6 2 total 0.001962 0.000189 - material delayedgroup group in nuclide mean std. dev. -1 10001 1 1 total 0 0 -3 10001 2 1 total 0 0 -5 10001 3 1 total 0 0 -7 10001 4 1 total 0 0 -9 10001 5 1 total 0 0 -11 10001 6 1 total 0 0 -0 10001 1 2 total 0 0 -2 10001 2 2 total 0 0 -4 10001 3 2 total 0 0 -6 10001 4 2 total 0 0 -8 10001 5 2 total 0 0 -10 10001 6 2 total 0 0 - material delayedgroup group out nuclide mean std. dev. -1 10001 1 1 total 0 0 -3 10001 2 1 total 0 0 -5 10001 3 1 total 0 0 -7 10001 4 1 total 0 0 -9 10001 5 1 total 0 0 -11 10001 6 1 total 0 0 -0 10001 1 2 total 0 0 -2 10001 2 2 total 0 0 -4 10001 3 2 total 0 0 -6 10001 4 2 total 0 0 -8 10001 5 2 total 0 0 -10 10001 6 2 total 0 0 - material delayedgroup group in nuclide mean std. dev. -1 10001 1 1 total 0 0 -3 10001 2 1 total 0 0 -5 10001 3 1 total 0 0 -7 10001 4 1 total 0 0 -9 10001 5 1 total 0 0 -11 10001 6 1 total 0 0 -0 10001 1 2 total 0 0 -2 10001 2 2 total 0 0 -4 10001 3 2 total 0 0 -6 10001 4 2 total 0 0 -8 10001 5 2 total 0 0 -10 10001 6 2 total 0 0 - material delayedgroup group in nuclide mean std. dev. -1 10002 1 1 total 0 0 -3 10002 2 1 total 0 0 -5 10002 3 1 total 0 0 -7 10002 4 1 total 0 0 -9 10002 5 1 total 0 0 -11 10002 6 1 total 0 0 -0 10002 1 2 total 0 0 -2 10002 2 2 total 0 0 -4 10002 3 2 total 0 0 -6 10002 4 2 total 0 0 -8 10002 5 2 total 0 0 -10 10002 6 2 total 0 0 - material delayedgroup group out nuclide mean std. dev. -1 10002 1 1 total 0 0 -3 10002 2 1 total 0 0 -5 10002 3 1 total 0 0 -7 10002 4 1 total 0 0 -9 10002 5 1 total 0 0 -11 10002 6 1 total 0 0 -0 10002 1 2 total 0 0 -2 10002 2 2 total 0 0 -4 10002 3 2 total 0 0 -6 10002 4 2 total 0 0 -8 10002 5 2 total 0 0 -10 10002 6 2 total 0 0 - material delayedgroup group in nuclide mean std. dev. -1 10002 1 1 total 0 0 -3 10002 2 1 total 0 0 -5 10002 3 1 total 0 0 -7 10002 4 1 total 0 0 -9 10002 5 1 total 0 0 -11 10002 6 1 total 0 0 -0 10002 1 2 total 0 0 -2 10002 2 2 total 0 0 -4 10002 3 2 total 0 0 -6 10002 4 2 total 0 0 -8 10002 5 2 total 0 0 -10 10002 6 2 total 0 0 diff --git a/tests/test_mdgxs_library_no_nuclides/test_mdgxs_library_no_nuclides.py b/tests/test_mdgxs_library_no_nuclides/test_mdgxs_library_no_nuclides.py deleted file mode 100644 index 6ee8e9adbe..0000000000 --- a/tests/test_mdgxs_library_no_nuclides/test_mdgxs_library_no_nuclides.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -import glob -import hashlib -sys.path.insert(0, os.pardir) -from testing_harness import PyAPITestHarness -from input_set import PinCellInputSet -import openmc -import openmc.mgxs - - -class MDGXSTestHarness(PyAPITestHarness): - def _build_inputs(self): - # Set the input set to use the pincell model - self._input_set = PinCellInputSet() - - # Generate inputs using parent class routine - super(MDGXSTestHarness, self)._build_inputs() - - # Initialize a two-group structure - energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, - 20.]) - - # Initialize a six-group structure - delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) - - # Initialize MGXS Library for a few cross section types - self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) - self.mgxs_lib.by_nuclide = False - - # Test all MDGXS types - self.mgxs_lib.mgxs_types = openmc.mgxs.MDGXS_TYPES - self.mgxs_lib.energy_groups = energy_groups - self.mgxs_lib.delayed_groups = delayed_groups - self.mgxs_lib.domain_type = 'material' - self.mgxs_lib.build_library() - - # Initialize a tallies file - self._input_set.tallies = openmc.Tallies() - self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) - self._input_set.tallies.export_to_xml() - - def _get_results(self, hash_output=False): - """Digest info in the statepoint and return as a string.""" - - # Read the statepoint file. - statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] - sp = openmc.StatePoint(statepoint) - - # Load the MGXS library from the statepoint - self.mgxs_lib.load_from_statepoint(sp) - - # Build a string from Pandas Dataframe for each MGXS - outstr = '' - for domain in self.mgxs_lib.domains: - for mgxs_type in self.mgxs_lib.mgxs_types: - mgxs = self.mgxs_lib.get_mgxs(domain, mgxs_type) - df = mgxs.get_pandas_dataframe() - outstr += df.to_string() + '\n' - - # Hash the results if necessary - if hash_output: - sha512 = hashlib.sha512() - sha512.update(outstr.encode('utf-8')) - outstr = sha512.hexdigest() - - return outstr - - - def _cleanup(self): - super(MDGXSTestHarness, self)._cleanup() - f = os.path.join(os.getcwd(), 'tallies.xml') - if os.path.exists(f): os.remove(f) - - -if __name__ == '__main__': - harness = MDGXSTestHarness('statepoint.10.*', True) - harness.main() diff --git a/tests/test_mdgxs_library_nuclides/inputs_true.dat b/tests/test_mdgxs_library_nuclides/inputs_true.dat deleted file mode 100644 index af136e1ec0..0000000000 --- a/tests/test_mdgxs_library_nuclides/inputs_true.dat +++ /dev/null @@ -1 +0,0 @@ -1cf1a4e8f46f3a5e4bb2824b8b3e4f4af5b43f12e0025ef98f7f54e3212305d8ec4334b3dffeab0e0df94de2eedae2d4aa4d0f15649129264a1cc3e3f9d08b58 \ No newline at end of file diff --git a/tests/test_mdgxs_library_nuclides/results_true.dat b/tests/test_mdgxs_library_nuclides/results_true.dat deleted file mode 100644 index d8cb494c74..0000000000 --- a/tests/test_mdgxs_library_nuclides/results_true.dat +++ /dev/null @@ -1 +0,0 @@ -7a6b9ba8f6289f1dac2d474f88003561a0179b45db58eedd671583eced3952f9ed708c1e35248351e469d511a6d99d33e02a9ba5135a0123f7f9c474c4e55a68 \ No newline at end of file diff --git a/tests/test_mdgxs_library_nuclides/test_mdgxs_library_nuclides.py b/tests/test_mdgxs_library_nuclides/test_mdgxs_library_nuclides.py deleted file mode 100644 index 4e67c23c7f..0000000000 --- a/tests/test_mdgxs_library_nuclides/test_mdgxs_library_nuclides.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -import glob -import hashlib -sys.path.insert(0, os.pardir) -from testing_harness import PyAPITestHarness -from input_set import PinCellInputSet -import openmc -import openmc.mgxs - - -class MDGXSTestHarness(PyAPITestHarness): - def _build_inputs(self): - # Set the input set to use the pincell model - self._input_set = PinCellInputSet() - - # Generate inputs using parent class routine - super(MDGXSTestHarness, self)._build_inputs() - - # Initialize a two-group structure - energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 0.625e-6, - 20.]) - - # Initialize a six-group structure - delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) - - # Initialize MGXS Library for a few cross section types - self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) - self.mgxs_lib.by_nuclide = True - - # Test all MDGXS types - self.mgxs_lib.mgxs_types = openmc.mgxs.MDGXS_TYPES - self.mgxs_lib.energy_groups = energy_groups - self.mgxs_lib.delayed_groups = delayed_groups - self.mgxs_lib.domain_type = 'material' - self.mgxs_lib.build_library() - - # Initialize a tallies file - self._input_set.tallies = openmc.Tallies() - self.mgxs_lib.add_to_tallies_file(self._input_set.tallies, merge=False) - self._input_set.tallies.export_to_xml() - - def _get_results(self, hash_output=True): - """Digest info in the statepoint and return as a string.""" - - # Read the statepoint file. - statepoint = glob.glob(os.path.join(os.getcwd(), self._sp_name))[0] - sp = openmc.StatePoint(statepoint) - - # Load the MGXS library from the statepoint - self.mgxs_lib.load_from_statepoint(sp) - - # Build a string from Pandas Dataframe for each MGXS - outstr = '' - for domain in self.mgxs_lib.domains: - for mgxs_type in self.mgxs_lib.mgxs_types: - mgxs = self.mgxs_lib.get_mgxs(domain, mgxs_type) - df = mgxs.get_pandas_dataframe() - outstr += df.to_string() + '\n' - - # Hash the results if necessary - if hash_output: - sha512 = hashlib.sha512() - sha512.update(outstr.encode('utf-8')) - outstr = sha512.hexdigest() - - return outstr - - - def _cleanup(self): - super(MDGXSTestHarness, self)._cleanup() - f = os.path.join(os.getcwd(), 'tallies.xml') - if os.path.exists(f): os.remove(f) - - -if __name__ == '__main__': - harness = MDGXSTestHarness('statepoint.10.*', True) - harness.main() From 65eca3d841ec9a467dbc33da736ace5eba85e5fc Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 5 Aug 2016 08:58:19 -0400 Subject: [PATCH 033/168] updated results for cmfd tests --- tests/test_cmfd_feed/results_true.dat | 852 ++++++++++++------------ tests/test_cmfd_nofeed/results_true.dat | 852 ++++++++++++------------ 2 files changed, 852 insertions(+), 852 deletions(-) diff --git a/tests/test_cmfd_feed/results_true.dat b/tests/test_cmfd_feed/results_true.dat index 4579fa5459..04103129dd 100644 --- a/tests/test_cmfd_feed/results_true.dat +++ b/tests/test_cmfd_feed/results_true.dat @@ -124,92 +124,8 @@ tally 3: 1.020705E+00 5.413570E-02 tally 4: -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 3.049469E+00 4.677325E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.514939E+00 -1.528899E+00 2.770358E+00 3.879191E-01 0.000000E+00 @@ -220,44 +136,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.294002E+00 -2.675589E+00 +5.514939E+00 +1.528899E+00 5.032131E+00 1.275040E+00 0.000000E+00 @@ -268,44 +148,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.668860E+00 -3.776102E+00 +7.294002E+00 +2.675589E+00 7.036008E+00 2.490719E+00 0.000000E+00 @@ -316,44 +160,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.345868E+00 -4.380719E+00 +8.668860E+00 +3.776102E+00 8.352414E+00 3.501945E+00 0.000000E+00 @@ -364,44 +172,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.223771E+00 -4.270119E+00 +9.345868E+00 +4.380719E+00 9.093766E+00 4.158282E+00 0.000000E+00 @@ -412,44 +184,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.530966E+00 -3.651778E+00 +9.223771E+00 +4.270119E+00 9.219150E+00 4.264346E+00 0.000000E+00 @@ -460,44 +196,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.204424E+00 -2.604203E+00 +8.530966E+00 +3.651778E+00 8.690373E+00 3.785262E+00 0.000000E+00 @@ -508,44 +208,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.326721E+00 -1.426975E+00 +7.204424E+00 +2.604203E+00 7.513640E+00 2.833028E+00 0.000000E+00 @@ -556,44 +220,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.847310E+00 -4.090440E-01 +5.326721E+00 +1.426975E+00 5.661144E+00 1.607138E+00 0.000000E+00 @@ -604,44 +232,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +2.847310E+00 +4.090440E-01 3.025812E+00 4.597241E-01 0.000000E+00 @@ -652,6 +244,414 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 cmfd indices 1.000000E+01 1.000000E+00 diff --git a/tests/test_cmfd_nofeed/results_true.dat b/tests/test_cmfd_nofeed/results_true.dat index d8a17d676b..54825f5db7 100644 --- a/tests/test_cmfd_nofeed/results_true.dat +++ b/tests/test_cmfd_nofeed/results_true.dat @@ -124,92 +124,8 @@ tally 3: 9.213728E-01 4.422001E-02 tally 4: -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 3.090000E+00 4.810640E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.555000E+00 -1.551579E+00 2.833000E+00 4.078910E-01 0.000000E+00 @@ -220,44 +136,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.271000E+00 -2.659755E+00 +5.555000E+00 +1.551579E+00 5.095000E+00 1.310819E+00 0.000000E+00 @@ -268,44 +148,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.577000E+00 -3.703215E+00 +7.271000E+00 +2.659755E+00 7.026000E+00 2.486552E+00 0.000000E+00 @@ -316,44 +160,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.393000E+00 -4.422429E+00 +8.577000E+00 +3.703215E+00 8.572000E+00 3.680852E+00 0.000000E+00 @@ -364,44 +172,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.265000E+00 -4.305625E+00 +9.393000E+00 +4.422429E+00 9.261000E+00 4.304411E+00 0.000000E+00 @@ -412,44 +184,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.535000E+00 -3.659395E+00 +9.265000E+00 +4.305625E+00 9.303000E+00 4.350791E+00 0.000000E+00 @@ -460,44 +196,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.104000E+00 -2.544182E+00 +8.535000E+00 +3.659395E+00 8.693000E+00 3.799545E+00 0.000000E+00 @@ -508,44 +208,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.168000E+00 -1.344390E+00 +7.104000E+00 +2.544182E+00 7.334000E+00 2.700052E+00 0.000000E+00 @@ -556,44 +220,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.724000E+00 -3.745680E-01 +5.168000E+00 +1.344390E+00 5.416000E+00 1.471086E+00 0.000000E+00 @@ -604,44 +232,8 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +2.724000E+00 +3.745680E-01 2.960000E+00 4.397840E-01 0.000000E+00 @@ -652,6 +244,414 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 cmfd indices 1.000000E+01 1.000000E+00 From ad9fe27d26940a7120ed920d37d9cb176bde6402 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Fri, 5 Aug 2016 10:03:26 -0400 Subject: [PATCH 034/168] fixed mesh indexing error in trigger.F90 --- src/trigger.F90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/trigger.F90 b/src/trigger.F90 index 570493a5de..4af03a2dea 100644 --- a/src/trigger.F90 +++ b/src/trigger.F90 @@ -329,7 +329,7 @@ contains end if matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /) + 1) + mesh_indices_to_bin(m, (/ i, j, k /)) ! Left Surface matching_bins(i_filter_surf) = OUT_LEFT From 14b8ef6a1f6bd248a22e6c4cf806d27fcd812fca Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 5 Aug 2016 13:48:12 -0500 Subject: [PATCH 035/168] Make PyAPI Polynomial class, remove Constant1D --- openmc/data/function.py | 91 ++++++++++++++++++++++++++++++++++++++++- openmc/data/product.py | 28 +++---------- openmc/data/reaction.py | 6 +-- src/endf_header.F90 | 30 -------------- src/nuclide_header.F90 | 8 ++-- src/product_header.F90 | 8 ++-- src/tally.F90 | 44 +++++--------------- 7 files changed, 115 insertions(+), 100 deletions(-) diff --git a/openmc/data/function.py b/openmc/data/function.py index bea6f5e9a6..e827e12833 100644 --- a/openmc/data/function.py +++ b/openmc/data/function.py @@ -1,3 +1,4 @@ +from abc import ABCMeta, abstractmethod from collections import Iterable, Callable from numbers import Real, Integral @@ -9,7 +10,53 @@ INTERPOLATION_SCHEME = {1: 'histogram', 2: 'linear-linear', 3: 'linear-log', 4: 'log-linear', 5: 'log-log'} -class Tabulated1D(object): +class Function1D(object): + """A function of one independent variable with HDF5 support.""" + + __meta__class = ABCMeta + + def __init__(self): pass + + @abstractmethod + def __call__(self): pass + + @abstractmethod + def to_hdf5(self, group, name='xy'): + """Write function to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + name : str + Name of the dataset to create + + """ + pass + + @classmethod + def from_hdf5(cls, dataset): + """Generate function from an HDF5 dataset + + Parameters + ---------- + dataset : h5py.Dataset + Dataset to read from + + Returns + ------- + openmc.data.Function1D + Function read from dataset + + """ + for subclass in cls.__subclasses__(): + if dataset.attrs['type'].decode() == subclass.__name__: + return subclass.from_hdf5(dataset) + raise ValueError("Unrecognized Function1D class: '" + + dataset.attrs['type'].decode() + "'") + + +class Tabulated1D(Function1D): """A one-dimensional tabulated function. This class mirrors the TAB1 type from the ENDF-6 format. A tabulated @@ -239,7 +286,7 @@ class Tabulated1D(object): """ dataset = group.create_dataset(name, data=np.vstack( [self.x, self.y])) - dataset.attrs['type'] = np.string_('tab1') + dataset.attrs['type'] = np.string_(type(self).__name__) dataset.attrs['breakpoints'] = self.breakpoints dataset.attrs['interpolation'] = self.interpolation @@ -258,6 +305,10 @@ class Tabulated1D(object): Function read from dataset """ + if dataset.attrs['type'].decode() != cls.__name__: + raise ValueError("Expected an HDF5 attribute 'type' equal to '" + + cls.__name__ + "'") + x = dataset.value[0, :] y = dataset.value[1, :] breakpoints = dataset.attrs['breakpoints'] @@ -304,6 +355,42 @@ class Tabulated1D(object): return Tabulated1D(x, y, breakpoints, interpolation) +class Polynomial(np.polynomial.Polynomial, Function1D): + def to_hdf5(self, group, name='xy'): + """Write polynomial function to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + name : str + Name of the dataset to create + + """ + dataset = group.create_dataset(name, data=self.coef) + dataset.attrs['type'] = np.string_(type(self).__name__) + + @classmethod + def from_hdf5(cls, dataset): + """Generate function from an HDF5 dataset + + Parameters + ---------- + dataset : h5py.Dataset + Dataset to read from + + Returns + ------- + openmc.data.Function1D + Function read from dataset + + """ + if dataset.attrs['type'].decode() != cls.__name__: + raise ValueError("Expected an HDF5 attribute 'type' equal to '" + + cls.__name__ + "'") + return cls(dataset.value) + + class Sum(object): """Sum of multiple functions. diff --git a/openmc/data/product.py b/openmc/data/product.py index dd276daac3..116905f7a3 100644 --- a/openmc/data/product.py +++ b/openmc/data/product.py @@ -3,10 +3,9 @@ from numbers import Real import sys import numpy as np -from numpy.polynomial.polynomial import Polynomial import openmc.checkvalue as cv -from .function import Tabulated1D +from .function import Tabulated1D, Polynomial, Function1D from .angle_energy import AngleEnergy if sys.version_info[0] >= 3: @@ -36,7 +35,7 @@ class Product(object): yield represents particles from prompt and delayed sources. particle : str What particle the reaction product is. - yield_ : float or openmc.data.Tabulated1D or numpy.polynomial.Polynomial + yield_ : float or openmc.data.Tabulated1D or openmc.data.Polynomial Yield of secondary particle in the reaction. """ @@ -47,7 +46,7 @@ class Product(object): self.emission_mode = 'prompt' self.distribution = [] self.applicability = [] - self.yield_ = 1 + self.yield_ = Polynomial((1,)) # 0-order polynomial i.e. a constant def __repr__(self): if isinstance(self.yield_, Real): @@ -120,7 +119,7 @@ class Product(object): @yield_.setter def yield_(self, yield_): cv.check_type('product yield', yield_, - (Real, Tabulated1D, Polynomial)) + (Tabulated1D, Polynomial)) self._yield = yield_ def to_hdf5(self, group): @@ -138,16 +137,7 @@ class Product(object): group.attrs['decay_rate'] = self.decay_rate # Write yield - if isinstance(self.yield_, Tabulated1D): - self.yield_.to_hdf5(group, 'yield') - dset = group['yield'] - dset.attrs['type'] = np.string_('tabulated') - elif isinstance(self.yield_, Polynomial): - dset = group.create_dataset('yield', data=self.yield_.coef) - dset.attrs['type'] = np.string_('polynomial') - else: - dset = group.create_dataset('yield', data=float(self.yield_)) - dset.attrs['type'] = np.string_('constant') + self.yield_.to_hdf5(group, 'yield') # Write applicability/distribution group.attrs['n_distribution'] = len(self.distribution) @@ -180,13 +170,7 @@ class Product(object): p.decay_rate = group.attrs['decay_rate'] # Read yield - yield_type = group['yield'].attrs['type'].decode() - if yield_type == 'constant': - p.yield_ = group['yield'].value - elif yield_type == 'polynomial': - p.yield_ = Polynomial(group['yield'].value) - elif yield_type == 'tabulated': - p.yield_ = Tabulated1D.from_hdf5(group['yield']) + p.yield_ = Function1D.from_hdf5(group['yield']) # Read applicability/distribution n_distribution = group.attrs['n_distribution'] diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index ad707d276e..d35599579d 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -5,13 +5,12 @@ from numbers import Real from warnings import warn import numpy as np -from numpy.polynomial import Polynomial import openmc.checkvalue as cv from openmc.stats import Uniform from .angle_distribution import AngleDistribution from .angle_energy import AngleEnergy -from .function import Tabulated1D +from .function import Tabulated1D, Polynomial from .data import REACTION_NAME from .product import Product from .uncorrelated import UncorrelatedAngleEnergy @@ -465,7 +464,8 @@ class Reaction(object): idx = ace.jxs[11] + abs(ty) - 101 yield_ = Tabulated1D.from_ace(ace, idx) else: - yield_ = abs(ty) + # 0-order polynomial i.e. a constant + yield_ = Polynomial((abs(ty),)) neutron = Product('neutron') neutron.yield_ = yield_ diff --git a/src/endf_header.F90 b/src/endf_header.F90 index c4b4ef3ad8..8d8aefaa3c 100644 --- a/src/endf_header.F90 +++ b/src/endf_header.F90 @@ -30,17 +30,6 @@ module endf_header end subroutine function1d_from_hdf5_ end interface -!=============================================================================== -! CONSTANT1D represents a constant one-dimensional function -!=============================================================================== - - type, extends(Function1D) :: Constant1D - real(8) :: y - contains - procedure :: from_hdf5 => constant1d_from_hdf5 - procedure :: evaluate => constant1d_evaluate - end type Constant1D - !=============================================================================== ! POLYNOMIAL represents a one-dimensional function expressed as a polynomial !=============================================================================== @@ -72,25 +61,6 @@ module endf_header contains -!=============================================================================== -! Constant1D implementation -!=============================================================================== - - subroutine constant1d_from_hdf5(this, dset_id) - class(Constant1D), intent(inout) :: this - integer(HID_T), intent(in) :: dset_id - - call read_dataset(this % y, dset_id) - end subroutine constant1d_from_hdf5 - - pure function constant1d_evaluate(this, x) result(y) - class(Constant1D), intent(in) :: this - real(8), intent(in) :: x - real(8) :: y - - y = this % y - end function constant1d_evaluate - !=============================================================================== ! Polynomial implementation !=============================================================================== diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index 8ff83482e5..514958a07e 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -10,7 +10,7 @@ module nuclide_header use constants use dict_header, only: DictIntInt use endf, only: reaction_name, is_fission, is_disappearance - use endf_header, only: Function1D, Constant1D, Polynomial, Tabulated1D + use endf_header, only: Function1D, Polynomial, Tabulated1D use error, only: fatal_error, warning use hdf5_interface, only: read_attribute, open_group, close_group, & open_dataset, read_dataset, close_dataset, get_shape @@ -283,11 +283,9 @@ module nuclide_header total_nu = open_dataset(nu_group, 'yield') call read_attribute(temp, total_nu, 'type') select case (temp) - case ('constant') - allocate(Constant1D :: this % total_nu) - case ('tabulated') + case ('Tabulated1D') allocate(Tabulated1D :: this % total_nu) - case ('polynomial') + case ('Polynomial') allocate(Polynomial :: this % total_nu) end select call this % total_nu % from_hdf5(total_nu) diff --git a/src/product_header.F90 b/src/product_header.F90 index f20adf0d40..a69929473d 100644 --- a/src/product_header.F90 +++ b/src/product_header.F90 @@ -5,7 +5,7 @@ module product_header use angleenergy_header, only: AngleEnergyContainer use constants, only: ZERO, MAX_WORD_LEN, EMISSION_PROMPT, EMISSION_DELAYED, & EMISSION_TOTAL, NEUTRON, PHOTON - use endf_header, only: Tabulated1D, Function1D, Constant1D, Polynomial + use endf_header, only: Tabulated1D, Function1D, Polynomial use hdf5_interface, only: read_attribute, open_group, close_group, & open_dataset, close_dataset, read_dataset use random_lcg, only: prn @@ -109,11 +109,9 @@ contains yield = open_dataset(group_id, 'yield') call read_attribute(temp, yield, 'type') select case (temp) - case ('constant') - allocate(Constant1D :: this % yield) - case ('tabulated') + case ('Tabulated1D') allocate(Tabulated1D :: this % yield) - case ('polynomial') + case ('Polynomial') allocate(Polynomial :: this % yield) end select call this % yield % from_hdf5(yield) diff --git a/src/tally.F90 b/src/tally.F90 index ec46a61940..0a910a9696 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -1,7 +1,6 @@ module tally use constants - use endf_header, only: Constant1D use error, only: fatal_error use geometry_header use global @@ -247,24 +246,17 @@ contains ! reaction with neutrons in the exit channel if (p % event_MT == ELASTIC .or. p % event_MT == N_LEVEL .or. & (p % event_MT >= N_N1 .and. p % event_MT <= N_NC)) then - ! Don't waste time on very common reactions we know have multiplicities - ! of one. + ! Don't waste time on very common reactions we know have + ! multiplicities of one. score = p % last_wgt * flux else - m = nuclides(p%event_nuclide)%reaction_index% & + m = nuclides(p % event_nuclide) % reaction_index % & get_key(p % event_MT) ! Get yield and apply to score - associate (rxn => nuclides(p%event_nuclide)%reactions(m)) - select type (yield => rxn % products(1) % yield) - type is (Constant1D) - ! Grab the yield from the reaction - score = p % last_wgt * yield % y * flux - class default - ! the yield was already incorporated in to p % wgt per the - ! scattering routine - score = p % wgt * flux - end select + associate (rxn => nuclides(p % event_nuclide) % reactions(m)) + score = p % last_wgt * flux & + * rxn % products(1) % yield % evaluate(p % last_E) end associate end if @@ -289,16 +281,9 @@ contains get_key(p % event_MT) ! Get yield and apply to score - associate (rxn => nuclides(p%event_nuclide)%reactions(m)) - select type (yield => rxn % products(1) % yield) - type is (Constant1D) - ! Grab the yield from the reaction - score = p % last_wgt * yield % y * flux - class default - ! the yield was already incorporated in to p % wgt per the - ! scattering routine - score = p % wgt * flux - end select + associate (rxn => nuclides(p % event_nuclide) % reactions(m)) + score = p % last_wgt * flux & + * rxn % products(1) % yield % evaluate(p % last_E) end associate end if @@ -324,15 +309,8 @@ contains ! Get yield and apply to score associate (rxn => nuclides(p%event_nuclide)%reactions(m)) - select type (yield => rxn % products(1) % yield) - type is (Constant1D) - ! Grab the yield from the reaction - score = p % last_wgt * yield % y * flux - class default - ! the yield was already incorporated in to p % wgt per the - ! scattering routine - score = p % wgt * flux - end select + score = p % last_wgt * flux & + * rxn % products(1) % yield % evaluate(p % last_E) end associate end if From 2025306f9a32cbcc611cbe1f4916d211888ea8e1 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 6 Aug 2016 06:43:25 -0400 Subject: [PATCH 036/168] Added capability to use MGXS with a mesh domain in create_mg_mode and create_mg_library. --- openmc/filter.py | 2 +- openmc/mesh.py | 104 +++++++++++++++ openmc/mgxs/library.py | 285 +++++++++++++++++++++++++++++------------ openmc/mgxs/mgxs.py | 3 +- openmc/mgxs_library.py | 124 ++++++++++++++---- 5 files changed, 403 insertions(+), 115 deletions(-) diff --git a/openmc/filter.py b/openmc/filter.py index 8a54e05cee..f9f4f74766 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -376,7 +376,7 @@ class Filter(object): cell instance ID for 'distribcell' Filters. The bin is a 2-tuple of floats for 'energy' and 'energyout' filters corresponding to the energy boundaries of the bin of interest. The bin is an (x,y,z) - 3-tuple for 'mesh' filters corresponding to the mesh cell + 3-tuple for 'mesh' filters corresponding to the mesh cell of interest. Returns diff --git a/openmc/mesh.py b/openmc/mesh.py index 169e7705cc..9496a06511 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -6,6 +6,8 @@ import sys import numpy as np import openmc.checkvalue as cv +import openmc.surface +import openmc.cell if sys.version_info[0] >= 3: @@ -181,6 +183,21 @@ class Mesh(object): string += '{0: <16}{1}{2}\n'.format('\tPixels', '=\t', self._width) return string + def cell_generator(self): + """Generator function to traverse through every [i,j,k] index + of the mesh. + + """ + if len(self.dimension) == 2: + for x in range(self.dimension[0]): + for y in range(self.dimension[1]): + yield [x + 1, y + 1, 1] + else: + for x in range(self.dimension[0]): + for y in range(self.dimension[1]): + for z in range(self.dimension[2]): + yield [x + 1, y + 1, z + 1] + def get_mesh_xml(self): """Return XML representation of the mesh @@ -210,3 +227,90 @@ class Mesh(object): subelement.text = ' '.join(map(str, self._width)) return element + + def build_cells(self, bc=['reflective'] * 6): + """Generates a list of cells which mimic the mesh geometry. + + Parameters + ---------- + bc : iterable of {'reflective', 'periodic', or 'vacuum'} + Boundary conditions for each of the six faces of a parallelopiped: + North, East, South, West, Up, and Down. + + Returns + ------- + root_cell : openmc.Cell + The cell containing the lattice mimicking the mesh geometry. + cells : iterable of openmc.Cell + The list of cells within each lattice position mimicking the mesh + geometry. + + """ + + cv.check_length('bc', bc, length_min=6, length_max=6) + for entry in bc: + cv.check_value('bc', entry, ['transmission', 'vacuum', + 'reflective', 'periodic']) + + if len(self.dimension) == 2: + twod = True + else: + twod = False + + # Build enclosing cell + xplanes = [openmc.XPlane(x0=self.lower_left[0], + boundary_type=bc[3]), + openmc.XPlane(x0=self.upper_right[0], + boundary_type=bc[1])] + yplanes = [openmc.YPlane(y0=self.lower_left[1], + boundary_type=bc[2]), + openmc.YPlane(y0=self.upper_right[1], + boundary_type=bc[0])] + if twod: + zplanes = [openmc.ZPlane(z0=-1.E50, boundary_type=bc[5]), + openmc.ZPlane(z0=+1.E50, boundary_type=bc[5])] + else: + zplanes = [openmc.ZPlane(z0=self.lower_left[2], + boundary_type=bc[5]), + openmc.ZPlane(z0=self.upper_right[2], + boundary_type=bc[5])] + root_cell = openmc.Cell() + root_cell.region = ((+xplanes[0] & -xplanes[1]) & + (+yplanes[0] & -yplanes[1]) & + (+zplanes[0] & -zplanes[1])) + + # Build our universes + universes = np.ndarray(self.dimension[::-1], dtype=np.object) + cells = [] + for [i, j, k] in self.cell_generator(): + if twod: + universes[j - 1, i - 1] = openmc.Universe() + cells.append(openmc.Cell()) + universes[j - 1, i - 1].add_cells([cells[-1]]) + else: + universes[k - 1, j - 1, i - 1] = openmc.Universe() + cells.append(openmc.Cell()) + universes[k - 1, j - 1, i - 1].add_cells([cells[-1]]) + + lattice = openmc.RectLattice() + lattice.lower_left = self.lower_left + + if self.width is not None: + lattice.pitch = self.width + else: + dx = ((self.upper_right[0] - self.lower_left[0]) / + self.dimension[0]) + dy = ((self.upper_right[1] - self.lower_left[1]) / + self.dimension[1]) + if twod: + lattice.pitch = [dx, dy] + else: + dz = ((self.upper_right[2] - self.lower_left[2]) / + self.dimension[2]) + lattice.pitch = [dx, dy, dz] + lattice.universes = universes + + # Fill Cell with the Lattice + root_cell.fill = lattice + + return root_cell, cells diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 84571ce236..c5e039cea5 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -756,14 +756,14 @@ class Library(object): def get_xsdata(self, domain, xsdata_name, nuclide='total', xs_type='macro', xs_id='1m', order=None, tabular_legendre=None, - tabular_points=33): + tabular_points=33, subdomain=None): """Generates an openmc.XSdata object describing a multi-group cross section data set for eventual combination in to an openmc.MGXSLibrary object (i.e., the library). Parameters ---------- - domain : openmc.Material or openmc.Cell or openmc.Universe + domain : openmc.Material, openmc.Cell, openmc.Universe, or openmc.Mesh The domain for spatial homogenization xsdata_name : str Name to apply to the "xsdata" entry produced by this method @@ -792,6 +792,10 @@ class Library(object): parameter is set to `True`. In this case, this parameter sets the number of equally-spaced points in the domain of [-1,1] to be used in building the tabular distribution. Default is `33`. + subdomain : iterable of int + This parameter is not used unless using a mesh domain. In that + case, the subdomain is an [i,j,k] index (1-based indexing) of the + mesh cell of interest in the openmc.Mesh object. Returns ------- @@ -811,7 +815,7 @@ class Library(object): """ cv.check_type('domain', domain, (openmc.Material, openmc.Cell, - openmc.Cell)) + openmc.Universe, openmc.Mesh)) cv.check_type('xsdata_name', xsdata_name, basestring) cv.check_type('nuclide', nuclide, basestring) cv.check_value('xs_type', xs_type, ['macro', 'micro']) @@ -824,6 +828,9 @@ class Library(object): (type(None), bool)) if tabular_points is not None: cv.check_greater_than('tabular_points', tabular_points, 1) + if subdomain is not None: + cv.check_iterable_type('subdomain', subdomain, Integral, + max_depth=2) # Make sure statepoint has been loaded if self._sp_filename is None: @@ -865,38 +872,43 @@ class Library(object): xsdata.set_total_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide]) elif 'total' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'total') - xsdata.set_total_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide]) + xsdata.set_total_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], + subdomain=subdomain) if 'absorption' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'absorption') xsdata.set_absorption_mgxs(mymgxs, xs_type=xs_type, - nuclide=[nuclide]) + nuclide=[nuclide], subdomain=subdomain) if 'fission' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'fission') xsdata.set_fission_mgxs(mymgxs, xs_type=xs_type, - nuclide=[nuclide]) + nuclide=[nuclide], subdomain=subdomain) if 'kappa-fission' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'kappa-fission') xsdata.set_kappa_fission_mgxs(mymgxs, xs_type=xs_type, - nuclide=[nuclide]) + nuclide=[nuclide], + subdomain=subdomain) # For chi and nu-fission we can either have only a nu-fission matrix # provided, or vectors of chi and nu-fission provided if 'nu-fission matrix' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'nu-fission matrix') xsdata.set_nu_fission_mgxs(mymgxs, xs_type=xs_type, - nuclide=[nuclide]) + nuclide=[nuclide], subdomain=subdomain) else: if 'chi' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'chi') - xsdata.set_chi_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide]) + xsdata.set_chi_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], + subdomain=subdomain) if 'nu-fission' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'nu-fission') xsdata.set_nu_fission_mgxs(mymgxs, xs_type=xs_type, - nuclide=[nuclide]) + nuclide=[nuclide], + subdomain=subdomain) # If multiplicity matrix is available, prefer that if 'multiplicity matrix' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'multiplicity matrix') xsdata.set_multiplicity_mgxs(mymgxs, xs_type=xs_type, - nuclide=[nuclide]) + nuclide=[nuclide], + subdomain=subdomain) using_multiplicity = True # multiplicity wil fall back to using scatter and nu-scatter elif ((('scatter matrix' in self.mgxs_types) and @@ -904,7 +916,8 @@ class Library(object): scatt_mgxs = self.get_mgxs(domain, 'scatter matrix') nuscatt_mgxs = self.get_mgxs(domain, 'nu-scatter matrix') xsdata.set_multiplicity_mgxs(nuscatt_mgxs, scatt_mgxs, - xs_type=xs_type, nuclide=[nuclide]) + xs_type=xs_type, nuclide=[nuclide], + subdomain=subdomain) using_multiplicity = True else: using_multiplicity = False @@ -912,12 +925,12 @@ class Library(object): if using_multiplicity: nuscatt_mgxs = self.get_mgxs(domain, 'nu-scatter matrix') xsdata.set_scatter_mgxs(nuscatt_mgxs, xs_type=xs_type, - nuclide=[nuclide]) + nuclide=[nuclide], subdomain=subdomain) else: if 'nu-scatter matrix' in self.mgxs_types: nuscatt_mgxs = self.get_mgxs(domain, 'nu-scatter matrix') xsdata.set_scatter_mgxs(nuscatt_mgxs, xs_type=xs_type, - nuclide=[nuclide]) + nuclide=[nuclide], subdomain=subdomain) # Since we are not using multiplicity, then # scattering multiplication (nu-scatter) must be @@ -988,15 +1001,6 @@ class Library(object): cv.check_value('xs_type', xs_type, ['macro', 'micro']) if xsdata_names is not None: cv.check_iterable_type('xsdata_names', xsdata_names, basestring) - if xs_ids is not None: - if isinstance(xs_ids, basestring): - # If we only have a string lets convert it now to a list - # of strings. - xs_ids = [xs_ids for i in range(len(self.domains))] - else: - cv.check_iterable_type('xs_ids', xs_ids, basestring) - else: - xs_ids = ['1m' for i in range(len(self.domains))] # If gathering material-specific data, set the xs_type to macro if not self.by_nuclide: @@ -1005,32 +1009,79 @@ class Library(object): # Initialize file mgxs_file = openmc.MGXSLibrary(self.energy_groups) - # Create the xsdata object and add it to the mgxs_file - for i, domain in enumerate(self.domains): - if self.by_nuclide: - nuclides = list(domain.get_all_nuclides().keys()) + if xs_ids is not None: + if isinstance(xs_ids, basestring): + # If we only have a string lets convert it now to a list + # of strings. + xs_id_input = xs_ids + xs_ids = [] + for domain in self.domains: + if self.domain_type is 'mesh': + for subdomain in domain.cell_generator(): + xs_ids.append(xs_id_input) + else: + xs_ids.append(xs_id_input) else: - nuclides = ['total'] - for nuclide in nuclides: - # Build & add metadata to XSdata object - if xsdata_names is None: - xsdata_name = 'set' + str(i + 1) + cv.check_iterable_type('xs_ids', xs_ids, basestring) + else: + xs_ids = [] + for domain in self.domains: + if self.domain_type is 'mesh': + for subdomain in domain.cell_generator(): + xs_ids.append('1m') else: - xsdata_name = xsdata_names[i] - if nuclide is not 'total': - xsdata_name += '_' + nuclide + xs_ids.append('1m') - xsdata = self.get_xsdata(domain, xsdata_name, nuclide=nuclide, - xs_type=xs_type, xs_id=xs_ids[i], - tabular_legendre=tabular_legendre, - tabular_points=tabular_points) + if self.domain_type == 'mesh': + # Create the xsdata objects and add to the mgxs_file + i = 0 + for domain in self.domains: + for subdomain in domain.cell_generator(): + # Build & add metadata to XSdata object + if xsdata_names is None: + xsdata_name = 'set' + str(i + 1) + else: + xsdata_name = xsdata_names[i] - mgxs_file.add_xsdata(xsdata) + # Create XSdata and Macroscopic for this domain + xsdata = self.get_xsdata(domain, xsdata_name, + nuclide='total', + xs_type=xs_type, xs_id=xs_ids[i], + tabular_legendre=tabular_legendre, + tabular_points=tabular_points, + subdomain=subdomain) + mgxs_file.add_xsdata(xsdata) + i += 1 + + else: + # Create the xsdata object and add it to the mgxs_file + for i, domain in enumerate(self.domains): + if self.by_nuclide: + nuclides = list(domain.get_all_nuclides().keys()) + else: + nuclides = ['total'] + for nuclide in nuclides: + # Build & add metadata to XSdata object + if xsdata_names is None: + xsdata_name = 'set' + str(i + 1) + else: + xsdata_name = xsdata_names[i] + if nuclide is not 'total': + xsdata_name += '_' + nuclide + + xsdata = self.get_xsdata(domain, xsdata_name, + nuclide=nuclide, + xs_type=xs_type, xs_id=xs_ids[i], + tabular_legendre=tabular_legendre, + tabular_points=tabular_points) + + mgxs_file.add_xsdata(xsdata) return mgxs_file def create_mg_mode(self, xsdata_names=None, xs_ids=None, - tabular_legendre=None, tabular_points=33): + tabular_legendre=None, tabular_points=33, + bc=['reflective'] * 6): """Creates an openmc.MGXSLibrary object to contain the MGXS data for the Multi-Group mode of OpenMC as well as the associated openmc.Materials and openmc.Geometry objects. The created Geometry is the same as that @@ -1060,6 +1111,9 @@ class Library(object): parameter is set to `True`. In this case, this parameter sets the number of equally-spaced points in the domain of [-1,1] to be used in building the tabular distribution. Default is `33`. + bc : iterable of {'reflective', 'periodic', or 'vacuum'} + Boundary conditions for each of the six faces of a parallelopiped: + North, East, South, Wwest, Up, and Down. Returns ------- @@ -1092,60 +1146,121 @@ class Library(object): if xsdata_names is not None: cv.check_iterable_type('xsdata_names', xsdata_names, basestring) - if xs_ids is not None: - if isinstance(xs_ids, basestring): - # If we only have a string lets convert it now to a list - # of strings. - xs_ids = [xs_ids for i in range(len(self.domains))] - else: - cv.check_iterable_type('xs_ids', xs_ids, basestring) - else: - xs_ids = ['1m' for i in range(len(self.domains))] xs_type = 'macro' # Initialize MGXS File mgxs_file = openmc.MGXSLibrary(self.energy_groups) - # Create a copy of the Geometry to differentiate for these Macroscopics - geometry = copy.deepcopy(self.openmc_geometry) - materials = openmc.Materials() - - # Get all Cells from the Geometry for differentiation - all_cells = geometry.get_all_material_cells() - - # Create the xsdata object and add it to the mgxs_file - for i, domain in enumerate(self.domains): - - # Build & add metadata to XSdata object - if xsdata_names is None: - xsdata_name = 'set' + str(i + 1) + # Set ID names + if xs_ids is not None: + if isinstance(xs_ids, basestring): + # If we only have a string lets convert it now to a list + # of strings. + xs_id_input = xs_ids + xs_ids = [] + for domain in self.domains: + if self.domain_type is 'mesh': + for subdomain in domain.cell_generator(): + xs_ids.append(xs_id_input) + else: + xs_ids.append(xs_id_input) else: - xsdata_name = xsdata_names[i] + cv.check_iterable_type('xs_ids', xs_ids, basestring) + else: + xs_ids = [] + for domain in self.domains: + if self.domain_type is 'mesh': + for subdomain in domain.cell_generator(): + xs_ids.append('1m') + else: + xs_ids.append('1m') - # Create XSdata and Macroscopic for this domain - xsdata = self.get_xsdata(domain, xsdata_name, nuclide='total', - xs_type=xs_type, xs_id=xs_ids[i], - tabular_legendre=tabular_legendre, - tabular_points=tabular_points) - mgxs_file.add_xsdata(xsdata) - macroscopic = openmc.Macroscopic(name=xsdata_name, xs=xs_ids[i]) + if self.domain_type == 'mesh': + # Before continuing, we cant build a model automatically if + # the user provided multiple mesh domains for library generation. + # So check and complain as needed. + cv.check_length("domains", self.domains, 1, 1) - # Create Material and add to collection - material = openmc.Material(name=xsdata_name + '.' + xs_ids[i]) - material.add_macroscopic(macroscopic) - materials.append(material) + # Create the xsdata objects and add to the mgxs_file + # and assign to materials and geometry as we go + materials = openmc.Materials() + root = openmc.Universe(name='root', universe_id=0) + # Add cells representative of the mesh with reflective BC + root_cell, cells = \ + self.domains[0].build_cells(bc) + root.add_cell(root_cell) + geometry = openmc.Geometry() + geometry.root_universe = root - # Differentiate Geometry with new Material - if self.domain_type == 'material': - # Fill all appropriate Cells with new Material - for cell in all_cells: - if cell.fill.id == domain.id: - cell.fill = material + for i, subdomain in enumerate(self.domains[0].cell_generator()): + # Build & add metadata to XSdata object + if xsdata_names is None: + xsdata_name = 'set' + str(i + 1) + else: + xsdata_name = xsdata_names[i] - elif self.domain_type == 'cell': - for cell in all_cells: - if cell.id == domain.id: - cell.fill = material + # Create XSdata and Macroscopic for this domain + xsdata = self.get_xsdata(domain, xsdata_name, + nuclide='total', + xs_type=xs_type, xs_id=xs_ids[i], + tabular_legendre=tabular_legendre, + tabular_points=tabular_points, + subdomain=subdomain) + mgxs_file.add_xsdata(xsdata) + macroscopic = openmc.Macroscopic(name=xsdata_name, + xs=xs_ids[i]) + + # Create Material and add to collection + material = openmc.Material(name=xsdata_name + '.' + + xs_ids[i]) + material.add_macroscopic(macroscopic) + materials.append(material) + + # Set the materials for each of the universes + cells[i].fill = materials[i] + + else: + # Create a copy of the Geometry for these Macroscopics + geometry = copy.deepcopy(self.openmc_geometry) + materials = openmc.Materials() + + # Get all Cells from the Geometry for differentiation + all_cells = geometry.get_all_material_cells() + + # Create the xsdata object and add it to the mgxs_file + for i, domain in enumerate(self.domains): + + # Build & add metadata to XSdata object + if xsdata_names is None: + xsdata_name = 'set' + str(i + 1) + else: + xsdata_name = xsdata_names[i] + + # Create XSdata and Macroscopic for this domain + xsdata = self.get_xsdata(domain, xsdata_name, nuclide='total', + xs_type=xs_type, xs_id=xs_ids[i], + tabular_legendre=tabular_legendre, + tabular_points=tabular_points) + mgxs_file.add_xsdata(xsdata) + macroscopic = openmc.Macroscopic(name=xsdata_name, + xs=xs_ids[i]) + + # Create Material and add to collection + material = openmc.Material(name=xsdata_name + '.' + xs_ids[i]) + material.add_macroscopic(macroscopic) + materials.append(material) + + # Differentiate Geometry with new Material + if self.domain_type == 'material': + # Fill all appropriate Cells with new Material + for cell in all_cells: + if cell.fill.id == domain.id: + cell.fill = material + + elif self.domain_type == 'cell': + for cell in all_cells: + if cell.id == domain.id: + cell.fill = material return mgxs_file, materials, geometry diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index e1c2e62217..608f232b74 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -781,7 +781,8 @@ class MGXS(object): # Construct a collection of the domain filter bins if not isinstance(subdomains, basestring): - cv.check_iterable_type('subdomains', subdomains, Integral, max_depth=3) + cv.check_iterable_type('subdomains', subdomains, Integral, + max_depth=3) for subdomain in subdomains: filters.append(self.domain_type) filter_bins.append((subdomain,)) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index 6f8188b101..fca5f437cf 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -603,7 +603,8 @@ class XSdata(object): if np.sum(self._nu_fission) > 0.0: self._fissionable = True - def set_total_mgxs(self, total, nuclide='total', xs_type='macro'): + def set_total_mgxs(self, total, nuclide='total', xs_type='macro', + subdomain=None): """This method allows for an openmc.mgxs.TotalXS or openmc.mgxs.TransportXS to be used to set the total cross section for this XSdata object. @@ -619,6 +620,9 @@ class XSdata(object): xs_type: {'macro', 'micro'} Provide the macro or micro cross section in units of cm^-1 or barns. Defaults to 'macro'. + subdomain : iterable of int + If the MGXS contains a mesh domain type, the subdomain parameter + specifies which mesh cell ([i, j, k]) to use. See also -------- @@ -631,16 +635,21 @@ class XSdata(object): openmc.mgxs.TransportXS)) check_value('energy_groups', total.energy_groups, [self.energy_groups]) check_value('domain_type', total.domain_type, - ['universe', 'cell', 'material']) + ['universe', 'cell', 'material', 'mesh']) + if subdomain is None: + subdomain_val = None + else: + subdomain_val = [subdomain] if self.representation is 'isotropic': - self._total = total.get_xs(nuclides=nuclide, xs_type=xs_type) + self._total = total.get_xs(nuclides=nuclide, xs_type=xs_type, + subdomains=subdomain_val) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' raise ValueError(msg) def set_absorption_mgxs(self, absorption, nuclide='total', - xs_type='macro'): + xs_type='macro', subdomain=None): """This method allows for an openmc.mgxs.AbsorptionXS to be used to set the absorption cross section for this XSdata object. @@ -655,6 +664,9 @@ class XSdata(object): xs_type: {'macro', 'micro'} Provide the macro or micro cross section in units of cm^-1 or barns. Defaults to 'macro'. + subdomain : iterable of int + If the MGXS contains a mesh domain type, the subdomain parameter + specifies which mesh cell ([i, j, k]) to use. See also -------- @@ -667,16 +679,22 @@ class XSdata(object): check_value('energy_groups', absorption.energy_groups, [self.energy_groups]) check_value('domain_type', absorption.domain_type, - ['universe', 'cell', 'material']) + ['universe', 'cell', 'material', 'mesh']) + if subdomain is None: + subdomain_val = None + else: + subdomain_val = [subdomain] if self.representation is 'isotropic': self._absorption = absorption.get_xs(nuclides=nuclide, - xs_type=xs_type) + xs_type=xs_type, + subdomains=subdomain_val) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' raise ValueError(msg) - def set_fission_mgxs(self, fission, nuclide='total', xs_type='macro'): + def set_fission_mgxs(self, fission, nuclide='total', xs_type='macro', + subdomain=None): """This method allows for an openmc.mgxs.FissionXS to be used to set the fission cross section for this XSdata object. @@ -691,6 +709,9 @@ class XSdata(object): xs_type: {'macro', 'micro'} Provide the macro or micro cross section in units of cm^-1 or barns. Defaults to 'macro'. + subdomain : iterable of int + If the MGXS contains a mesh domain type, the subdomain parameter + specifies which mesh cell ([i, j, k]) to use. See also -------- @@ -703,17 +724,22 @@ class XSdata(object): check_value('energy_groups', fission.energy_groups, [self.energy_groups]) check_value('domain_type', fission.domain_type, - ['universe', 'cell', 'material']) + ['universe', 'cell', 'material', 'mesh']) + if subdomain is None: + subdomain_val = None + else: + subdomain_val = [subdomain] if self.representation is 'isotropic': self._fission = fission.get_xs(nuclides=nuclide, - xs_type=xs_type) + xs_type=xs_type, + subdomains=subdomain_val) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' raise ValueError(msg) def set_nu_fission_mgxs(self, nu_fission, nuclide='total', - xs_type='macro'): + xs_type='macro', subdomain=None): """This method allows for an openmc.mgxs.NuFissionXS to be used to set the nu-fission cross section for this XSdata object. @@ -728,6 +754,9 @@ class XSdata(object): xs_type: {'macro', 'micro'} Provide the macro or micro cross section in units of cm^-1 or barns. Defaults to 'macro'. + subdomain : iterable of int + If the MGXS contains a mesh domain type, the subdomain parameter + specifies which mesh cell ([i, j, k]) to use. See also -------- @@ -741,11 +770,16 @@ class XSdata(object): check_value('energy_groups', nu_fission.energy_groups, [self.energy_groups]) check_value('domain_type', nu_fission.domain_type, - ['universe', 'cell', 'material']) + ['universe', 'cell', 'material', 'mesh']) + if subdomain is None: + subdomain_val = None + else: + subdomain_val = [subdomain] if self.representation is 'isotropic': self._nu_fission = nu_fission.get_xs(nuclides=nuclide, - xs_type=xs_type) + xs_type=xs_type, + subdomains=subdomain_val) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' raise ValueError(msg) @@ -759,7 +793,7 @@ class XSdata(object): self._fissionable = True def set_kappa_fission_mgxs(self, k_fission, nuclide='total', - xs_type='macro'): + xs_type='macro', subdomain=None): """This method allows for an openmc.mgxs.KappaFissionXS to be used to set the kappa-fission cross section for this XSdata object. @@ -775,6 +809,9 @@ class XSdata(object): xs_type: {'macro', 'micro'} Provide the macro or micro cross section in units of cm^-1 or barns. Defaults to 'macro'. + subdomain : iterable of int + If the MGXS contains a mesh domain type, the subdomain parameter + specifies which mesh cell ([i, j, k]) to use. See also -------- @@ -787,16 +824,22 @@ class XSdata(object): check_value('energy_groups', k_fission.energy_groups, [self.energy_groups]) check_value('domain_type', k_fission.domain_type, - ['universe', 'cell', 'material']) + ['universe', 'cell', 'material', 'mesh']) + if subdomain is None: + subdomain_val = None + else: + subdomain_val = [subdomain] if self.representation is 'isotropic': self._kappa_fission = k_fission.get_xs(nuclides=nuclide, - xs_type=xs_type) + xs_type=xs_type, + subdomains=subdomain_val) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' raise ValueError(msg) - def set_chi_mgxs(self, chi, nuclide='total', xs_type='macro'): + def set_chi_mgxs(self, chi, nuclide='total', xs_type='macro', + subdomain=None): """This method allows for an openmc.mgxs.Chi to be used to set chi for this XSdata object. @@ -810,6 +853,9 @@ class XSdata(object): xs_type: {'macro', 'micro'} Provide the macro or micro cross section in units of cm^-1 or barns. Defaults to 'macro'. + subdomain : iterable of int + If the MGXS contains a mesh domain type, the subdomain parameter + specifies which mesh cell ([i, j, k]) to use. See also -------- @@ -827,11 +873,15 @@ class XSdata(object): check_type('chi', chi, openmc.mgxs.Chi) check_value('energy_groups', chi.energy_groups, [self.energy_groups]) check_value('domain_type', chi.domain_type, - ['universe', 'cell', 'material']) + ['universe', 'cell', 'material', 'mesh']) + if subdomain is None: + subdomain_val = None + else: + subdomain_val = [subdomain] if self.representation is 'isotropic': self._chi = chi.get_xs(nuclides=nuclide, - xs_type=xs_type) + xs_type=xs_type, subdomains=subdomain_val) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' raise ValueError(msg) @@ -839,7 +889,8 @@ class XSdata(object): if self.use_chi is not None: self.use_chi = True - def set_scatter_mgxs(self, scatter, nuclide='total', xs_type='macro'): + def set_scatter_mgxs(self, scatter, nuclide='total', xs_type='macro', + subdomain=None): """This method allows for an openmc.mgxs.ScatterMatrixXS to be used to set the scatter matrix cross section for this XSdata object. If the XSdata.order attribute has not yet been set, then @@ -856,6 +907,9 @@ class XSdata(object): xs_type: {'macro', 'micro'} Provide the macro or micro cross section in units of cm^-1 or barns. Defaults to 'macro'. + subdomain : iterable of int + If the MGXS contains a mesh domain type, the subdomain parameter + specifies which mesh cell ([i, j, k]) to use. See also -------- @@ -868,7 +922,7 @@ class XSdata(object): check_value('energy_groups', scatter.energy_groups, [self.energy_groups]) check_value('domain_type', scatter.domain_type, - ['universe', 'cell', 'material']) + ['universe', 'cell', 'material', 'mesh']) if self.scatt_type != 'legendre': msg = 'Anisotropic scattering representations other than ' \ @@ -886,22 +940,27 @@ class XSdata(object): check_value('legendre_order', scatter.legendre_order, [self.order]) + if subdomain is None: + subdomain_val = None + else: + subdomain_val = [subdomain] + if self.representation is 'isotropic': # Get the scattering orders in the outermost dimension self._scatter = np.zeros((self.num_orders, self.energy_groups.num_groups, self.energy_groups.num_groups)) for moment in range(self.num_orders): - self._scatter[moment, :, :] = scatter.get_xs(nuclides=nuclide, - xs_type=xs_type, - moment=moment) + self._scatter[moment, :, :] = \ + scatter.get_xs(nuclides=nuclide, xs_type=xs_type, + moment=moment, subdomains=subdomain_val) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' raise ValueError(msg) def set_multiplicity_mgxs(self, nuscatter, scatter=None, nuclide='total', - xs_type='macro'): + xs_type='macro', subdomain=None): """This method allows for either the direct use of only an openmc.mgxs.MultiplicityMatrixXS OR an openmc.mgxs.NuScatterMatrixXS and openmc.mgxs.ScatterMatrixXS to be used to set the scattering @@ -926,6 +985,9 @@ class XSdata(object): xs_type: {'macro', 'micro'} Provide the macro or micro cross section in units of cm^-1 or barns. Defaults to 'macro'. + subdomain : iterable of int + If the MGXS contains a mesh domain type, the subdomain parameter + specifies which mesh cell ([i, j, k]) to use. See also -------- @@ -939,7 +1001,7 @@ class XSdata(object): check_value('energy_groups', nuscatter.energy_groups, [self.energy_groups]) check_value('domain_type', nuscatter.domain_type, - ['universe', 'cell', 'material']) + ['universe', 'cell', 'material', 'mesh']) if scatter is not None: check_type('scatter', scatter, openmc.mgxs.ScatterMatrixXS) if isinstance(nuscatter, openmc.mgxs.MultiplicityMatrixXS): @@ -950,16 +1012,22 @@ class XSdata(object): check_value('energy_groups', scatter.energy_groups, [self.energy_groups]) check_value('domain_type', scatter.domain_type, - ['universe', 'cell', 'material']) + ['universe', 'cell', 'material', 'mesh']) + if subdomain is None: + subdomain_val = None + else: + subdomain_val = [subdomain] if self.representation is 'isotropic': nuscatt = nuscatter.get_xs(nuclides=nuclide, - xs_type=xs_type, moment=0) + xs_type=xs_type, moment=0, + subdomains=subdomain_val) if isinstance(nuscatter, openmc.mgxs.MultiplicityMatrixXS): self._multiplicity = nuscatt else: scatt = scatter.get_xs(nuclides=nuclide, - xs_type=xs_type, moment=0) + xs_type=xs_type, moment=0, + subdomains=subdomain_val) self._multiplicity = np.divide(nuscatt, scatt) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' From 5c6280b206e031faffb2e068349fc98206d45e9f Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 6 Aug 2016 06:59:17 -0400 Subject: [PATCH 037/168] some cleaning up --- openmc/mgxs/library.py | 33 ++++++++++++++++---------- openmc/mgxs_library.py | 53 ++++++++---------------------------------- 2 files changed, 31 insertions(+), 55 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index c5e039cea5..9372998a0f 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -866,49 +866,57 @@ class Library(object): xsdata.zaid = self._nuclides[nuclide][0] xsdata.awr = self._nuclides[nuclide][1] + if subdomain is None: + subdomain_val = 'all' + else: + subdomain_val = [subdomain] + # Now get xs data itself if 'nu-transport' in self.mgxs_types and self.correction == 'P0': mymgxs = self.get_mgxs(domain, 'nu-transport') - xsdata.set_total_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide]) + xsdata.set_total_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], + subdomains=subdomain_val) elif 'total' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'total') xsdata.set_total_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain) + subdomain=subdomain_val) if 'absorption' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'absorption') xsdata.set_absorption_mgxs(mymgxs, xs_type=xs_type, - nuclide=[nuclide], subdomain=subdomain) + nuclide=[nuclide], + subdomain=subdomain_val) if 'fission' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'fission') xsdata.set_fission_mgxs(mymgxs, xs_type=xs_type, - nuclide=[nuclide], subdomain=subdomain) + nuclide=[nuclide], subdomain=subdomain_val) if 'kappa-fission' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'kappa-fission') xsdata.set_kappa_fission_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain) + subdomain=subdomain_val) # For chi and nu-fission we can either have only a nu-fission matrix # provided, or vectors of chi and nu-fission provided if 'nu-fission matrix' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'nu-fission matrix') xsdata.set_nu_fission_mgxs(mymgxs, xs_type=xs_type, - nuclide=[nuclide], subdomain=subdomain) + nuclide=[nuclide], + subdomain=subdomain_val) else: if 'chi' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'chi') xsdata.set_chi_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain) + subdomain=subdomain_val) if 'nu-fission' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'nu-fission') xsdata.set_nu_fission_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain) + subdomain=subdomain_val) # If multiplicity matrix is available, prefer that if 'multiplicity matrix' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'multiplicity matrix') xsdata.set_multiplicity_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain) + subdomain=subdomain_val) using_multiplicity = True # multiplicity wil fall back to using scatter and nu-scatter elif ((('scatter matrix' in self.mgxs_types) and @@ -917,7 +925,7 @@ class Library(object): nuscatt_mgxs = self.get_mgxs(domain, 'nu-scatter matrix') xsdata.set_multiplicity_mgxs(nuscatt_mgxs, scatt_mgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain) + subdomain=subdomain_val) using_multiplicity = True else: using_multiplicity = False @@ -925,12 +933,13 @@ class Library(object): if using_multiplicity: nuscatt_mgxs = self.get_mgxs(domain, 'nu-scatter matrix') xsdata.set_scatter_mgxs(nuscatt_mgxs, xs_type=xs_type, - nuclide=[nuclide], subdomain=subdomain) + nuclide=[nuclide], subdomain=subdomain_val) else: if 'nu-scatter matrix' in self.mgxs_types: nuscatt_mgxs = self.get_mgxs(domain, 'nu-scatter matrix') xsdata.set_scatter_mgxs(nuscatt_mgxs, xs_type=xs_type, - nuclide=[nuclide], subdomain=subdomain) + nuclide=[nuclide], + subdomain=subdomain_val) # Since we are not using multiplicity, then # scattering multiplication (nu-scatter) must be diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index fca5f437cf..aaea0ce4b7 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -604,7 +604,7 @@ class XSdata(object): self._fissionable = True def set_total_mgxs(self, total, nuclide='total', xs_type='macro', - subdomain=None): + subdomain='all'): """This method allows for an openmc.mgxs.TotalXS or openmc.mgxs.TransportXS to be used to set the total cross section for this XSdata object. @@ -636,14 +636,10 @@ class XSdata(object): check_value('energy_groups', total.energy_groups, [self.energy_groups]) check_value('domain_type', total.domain_type, ['universe', 'cell', 'material', 'mesh']) - if subdomain is None: - subdomain_val = None - else: - subdomain_val = [subdomain] if self.representation is 'isotropic': self._total = total.get_xs(nuclides=nuclide, xs_type=xs_type, - subdomains=subdomain_val) + subdomains=subdomain) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' raise ValueError(msg) @@ -680,15 +676,11 @@ class XSdata(object): [self.energy_groups]) check_value('domain_type', absorption.domain_type, ['universe', 'cell', 'material', 'mesh']) - if subdomain is None: - subdomain_val = None - else: - subdomain_val = [subdomain] if self.representation is 'isotropic': self._absorption = absorption.get_xs(nuclides=nuclide, xs_type=xs_type, - subdomains=subdomain_val) + subdomains=subdomain) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' raise ValueError(msg) @@ -725,15 +717,11 @@ class XSdata(object): [self.energy_groups]) check_value('domain_type', fission.domain_type, ['universe', 'cell', 'material', 'mesh']) - if subdomain is None: - subdomain_val = None - else: - subdomain_val = [subdomain] if self.representation is 'isotropic': self._fission = fission.get_xs(nuclides=nuclide, xs_type=xs_type, - subdomains=subdomain_val) + subdomains=subdomain) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' raise ValueError(msg) @@ -771,15 +759,11 @@ class XSdata(object): [self.energy_groups]) check_value('domain_type', nu_fission.domain_type, ['universe', 'cell', 'material', 'mesh']) - if subdomain is None: - subdomain_val = None - else: - subdomain_val = [subdomain] if self.representation is 'isotropic': self._nu_fission = nu_fission.get_xs(nuclides=nuclide, xs_type=xs_type, - subdomains=subdomain_val) + subdomains=subdomain) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' raise ValueError(msg) @@ -825,15 +809,11 @@ class XSdata(object): [self.energy_groups]) check_value('domain_type', k_fission.domain_type, ['universe', 'cell', 'material', 'mesh']) - if subdomain is None: - subdomain_val = None - else: - subdomain_val = [subdomain] if self.representation is 'isotropic': self._kappa_fission = k_fission.get_xs(nuclides=nuclide, xs_type=xs_type, - subdomains=subdomain_val) + subdomains=subdomain) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' raise ValueError(msg) @@ -874,14 +854,10 @@ class XSdata(object): check_value('energy_groups', chi.energy_groups, [self.energy_groups]) check_value('domain_type', chi.domain_type, ['universe', 'cell', 'material', 'mesh']) - if subdomain is None: - subdomain_val = None - else: - subdomain_val = [subdomain] if self.representation is 'isotropic': self._chi = chi.get_xs(nuclides=nuclide, - xs_type=xs_type, subdomains=subdomain_val) + xs_type=xs_type, subdomains=subdomain) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' raise ValueError(msg) @@ -940,11 +916,6 @@ class XSdata(object): check_value('legendre_order', scatter.legendre_order, [self.order]) - if subdomain is None: - subdomain_val = None - else: - subdomain_val = [subdomain] - if self.representation is 'isotropic': # Get the scattering orders in the outermost dimension self._scatter = np.zeros((self.num_orders, @@ -953,7 +924,7 @@ class XSdata(object): for moment in range(self.num_orders): self._scatter[moment, :, :] = \ scatter.get_xs(nuclides=nuclide, xs_type=xs_type, - moment=moment, subdomains=subdomain_val) + moment=moment, subdomains=subdomain) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' @@ -1013,21 +984,17 @@ class XSdata(object): [self.energy_groups]) check_value('domain_type', scatter.domain_type, ['universe', 'cell', 'material', 'mesh']) - if subdomain is None: - subdomain_val = None - else: - subdomain_val = [subdomain] if self.representation is 'isotropic': nuscatt = nuscatter.get_xs(nuclides=nuclide, xs_type=xs_type, moment=0, - subdomains=subdomain_val) + subdomains=subdomain) if isinstance(nuscatter, openmc.mgxs.MultiplicityMatrixXS): self._multiplicity = nuscatt else: scatt = scatter.get_xs(nuclides=nuclide, xs_type=xs_type, moment=0, - subdomains=subdomain_val) + subdomains=subdomain) self._multiplicity = np.divide(nuscatt, scatt) elif self.representation is 'angle': msg = 'Angular-Dependent MGXS have not yet been implemented' From ef2f6bdc7c36327ccf535780cc07522ccef04c1c Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 6 Aug 2016 11:52:55 -0400 Subject: [PATCH 038/168] Addressing comments --- openmc/macroscopic.py | 2 +- openmc/mesh.py | 56 +++++++++++++++------- openmc/mgxs/library.py | 105 ++++++++++++++++++++++------------------- openmc/mgxs_library.py | 4 ++ 4 files changed, 99 insertions(+), 68 deletions(-) diff --git a/openmc/macroscopic.py b/openmc/macroscopic.py index 1dd087903f..9f55998e3a 100644 --- a/openmc/macroscopic.py +++ b/openmc/macroscopic.py @@ -30,7 +30,7 @@ class Macroscopic(object): self._name = '' self._xs = None - # Set the Material class attributes + # Set the Macroscopic class attributes self.name = name if xs is not None: diff --git a/openmc/mesh.py b/openmc/mesh.py index 9496a06511..c2b23bf1f9 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -187,6 +187,17 @@ class Mesh(object): """Generator function to traverse through every [i,j,k] index of the mesh. + For example the following code: + for mesh_index in mymesh.cell_generator(): + print mesh_index + + will produce the following output for a 3-D 2x2x2 mesh in mymesh: + [1, 1, 1] + [1, 1, 2] + [1, 2, 1] + [1, 2, 2] + ... + """ if len(self.dimension) == 2: for x in range(self.dimension[0]): @@ -229,49 +240,56 @@ class Mesh(object): return element def build_cells(self, bc=['reflective'] * 6): - """Generates a list of cells which mimic the mesh geometry. + """Generates a lattice of universes with the same dimensionality + as the mesh object in self. The individual cells/universes produced + will not have material definitions applied and so downstream code + will have to apply that information. Parameters ---------- - bc : iterable of {'reflective', 'periodic', or 'vacuum'} - Boundary conditions for each of the six faces of a parallelopiped: - North, East, South, West, Up, and Down. + bc : iterable of {'reflective', 'periodic', 'transmission', or 'vacuum'} + Boundary conditions for each of the four faces of a rectangle + (if aplying to a 2D mesh) or six faces of a parallelepiped + (if applying to a 3D mesh) provided in the following order: + [x min, x max, y min, y max, z min, z max]. 2-D cells do not + contain the z min and z max entries. Returns ------- root_cell : openmc.Cell - The cell containing the lattice mimicking the mesh geometry. + The cell containing the lattice representing the mesh geometry; + this cell is a single parallelepiped with boundaries matching + the outermost mesh boundary with the boundary conditions from bc + applied. cells : iterable of openmc.Cell The list of cells within each lattice position mimicking the mesh geometry. """ - cv.check_length('bc', bc, length_min=6, length_max=6) + twod = len(self.dimension) == 2 + cv.check_length('bc', bc, length_min=4, length_max=6) for entry in bc: cv.check_value('bc', entry, ['transmission', 'vacuum', 'reflective', 'periodic']) - if len(self.dimension) == 2: - twod = True - else: - twod = False - - # Build enclosing cell + # Build the cell which will contain the lattice xplanes = [openmc.XPlane(x0=self.lower_left[0], - boundary_type=bc[3]), + boundary_type=bc[0]), openmc.XPlane(x0=self.upper_right[0], boundary_type=bc[1])] yplanes = [openmc.YPlane(y0=self.lower_left[1], boundary_type=bc[2]), openmc.YPlane(y0=self.upper_right[1], - boundary_type=bc[0])] + boundary_type=bc[3])] if twod: - zplanes = [openmc.ZPlane(z0=-1.E50, boundary_type=bc[5]), - openmc.ZPlane(z0=+1.E50, boundary_type=bc[5])] + zplanes = [openmc.ZPlane(z0=np.finfo(np.float).min, + boundary_type='reflective'), + openmc.ZPlane(z0=np.finfo(np.float).max, + boundary_type='reflective')] else: zplanes = [openmc.ZPlane(z0=self.lower_left[2], - boundary_type=bc[5]), + boundary_type=bc[4]), openmc.ZPlane(z0=self.upper_right[2], boundary_type=bc[5])] root_cell = openmc.Cell() @@ -279,7 +297,9 @@ class Mesh(object): (+yplanes[0] & -yplanes[1]) & (+zplanes[0] & -zplanes[1])) - # Build our universes + # Build the universes which will be used for each of the [i,j,k] + # locations within the mesh. + # We will also have to build cells to assign to these universes universes = np.ndarray(self.dimension[::-1], dtype=np.object) cells = [] for [i, j, k] in self.cell_generator(): diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 9372998a0f..c36034bfc5 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -795,7 +795,9 @@ class Library(object): subdomain : iterable of int This parameter is not used unless using a mesh domain. In that case, the subdomain is an [i,j,k] index (1-based indexing) of the - mesh cell of interest in the openmc.Mesh object. + mesh cell of interest in the openmc.Mesh object. Note: + this parameter currently only supports subdomains within a mesh, + and not the subdomains of a distribcell. Returns ------- @@ -918,7 +920,7 @@ class Library(object): nuclide=[nuclide], subdomain=subdomain_val) using_multiplicity = True - # multiplicity wil fall back to using scatter and nu-scatter + # multiplicity will fall back to using scatter and nu-scatter elif ((('scatter matrix' in self.mgxs_types) and ('nu-scatter matrix' in self.mgxs_types))): scatt_mgxs = self.get_mgxs(domain, 'scatter matrix') @@ -1018,33 +1020,33 @@ class Library(object): # Initialize file mgxs_file = openmc.MGXSLibrary(self.energy_groups) + # Get the number of domains to size arrays with + if self.domain_type is 'mesh': + num_domains = np.sum(d.num_mesh_cells for d in self.domains) + else: + num_domains = len(self.domains) + + # Set id names if xs_ids is not None: if isinstance(xs_ids, basestring): # If we only have a string lets convert it now to a list # of strings. - xs_id_input = xs_ids - xs_ids = [] - for domain in self.domains: - if self.domain_type is 'mesh': - for subdomain in domain.cell_generator(): - xs_ids.append(xs_id_input) - else: - xs_ids.append(xs_id_input) + all_xs_ids = [xs_ids] * num_domains else: cv.check_iterable_type('xs_ids', xs_ids, basestring) + cv.check_length('xs_ids', xs_ids, num_domains, num_domains) + all_xs_ids = xs_ids + else: - xs_ids = [] - for domain in self.domains: - if self.domain_type is 'mesh': - for subdomain in domain.cell_generator(): - xs_ids.append('1m') - else: - xs_ids.append('1m') + all_xs_ids = ['1m'] * num_domains if self.domain_type == 'mesh': # Create the xsdata objects and add to the mgxs_file i = 0 for domain in self.domains: + if self.by_nuclide: + raise NotImplementedError("Mesh domains do not currently " + "support nuclidic tallies") for subdomain in domain.cell_generator(): # Build & add metadata to XSdata object if xsdata_names is None: @@ -1055,7 +1057,8 @@ class Library(object): # Create XSdata and Macroscopic for this domain xsdata = self.get_xsdata(domain, xsdata_name, nuclide='total', - xs_type=xs_type, xs_id=xs_ids[i], + xs_type=xs_type, + xs_id=all_xs_ids[i], tabular_legendre=tabular_legendre, tabular_points=tabular_points, subdomain=subdomain) @@ -1079,8 +1082,8 @@ class Library(object): xsdata_name += '_' + nuclide xsdata = self.get_xsdata(domain, xsdata_name, - nuclide=nuclide, - xs_type=xs_type, xs_id=xs_ids[i], + nuclide=nuclide, xs_type=xs_type, + xs_id=all_xs_ids[i], tabular_legendre=tabular_legendre, tabular_points=tabular_points) @@ -1120,9 +1123,12 @@ class Library(object): parameter is set to `True`. In this case, this parameter sets the number of equally-spaced points in the domain of [-1,1] to be used in building the tabular distribution. Default is `33`. - bc : iterable of {'reflective', 'periodic', or 'vacuum'} - Boundary conditions for each of the six faces of a parallelopiped: - North, East, South, Wwest, Up, and Down. + bc : iterable of {'reflective', 'periodic', 'transmission', or 'vacuum'} + Boundary conditions for each of the four faces of a rectangle + (if aplying to a 2D mesh) or six faces of a parallelepiped + (if applying to a 3D mesh) provided in the following order: + [x min, x max, y min, y max, z min, z max]. 2-D cells do not + contain the z min and z max entries. Returns ------- @@ -1160,40 +1166,39 @@ class Library(object): # Initialize MGXS File mgxs_file = openmc.MGXSLibrary(self.energy_groups) - # Set ID names + # Get the number of domains to size arrays with + if self.domain_type is 'mesh': + num_domains = np.sum(d.num_mesh_cells for d in self.domains) + else: + num_domains = len(self.domains) + + # Set id names if xs_ids is not None: if isinstance(xs_ids, basestring): # If we only have a string lets convert it now to a list # of strings. - xs_id_input = xs_ids - xs_ids = [] - for domain in self.domains: - if self.domain_type is 'mesh': - for subdomain in domain.cell_generator(): - xs_ids.append(xs_id_input) - else: - xs_ids.append(xs_id_input) + all_xs_ids = [xs_ids] * num_domains else: cv.check_iterable_type('xs_ids', xs_ids, basestring) + cv.check_length('xs_ids', xs_ids, num_domains, num_domains) + all_xs_ids = xs_ids + else: - xs_ids = [] - for domain in self.domains: - if self.domain_type is 'mesh': - for subdomain in domain.cell_generator(): - xs_ids.append('1m') - else: - xs_ids.append('1m') + all_xs_ids = ['1m'] * num_domains if self.domain_type == 'mesh': - # Before continuing, we cant build a model automatically if - # the user provided multiple mesh domains for library generation. - # So check and complain as needed. + # We cant build a model automatically if the user provided multiple + # mesh domains for library generation since the multiple meshes + # could be overlapping or in disparate regions of the continuous + # energy model. The next step makes sure there is only one before + # continuing. cv.check_length("domains", self.domains, 1, 1) # Create the xsdata objects and add to the mgxs_file # and assign to materials and geometry as we go materials = openmc.Materials() root = openmc.Universe(name='root', universe_id=0) + # Add cells representative of the mesh with reflective BC root_cell, cells = \ self.domains[0].build_cells(bc) @@ -1209,19 +1214,20 @@ class Library(object): xsdata_name = xsdata_names[i] # Create XSdata and Macroscopic for this domain - xsdata = self.get_xsdata(domain, xsdata_name, + xsdata = self.get_xsdata(self.domains[0], xsdata_name, nuclide='total', - xs_type=xs_type, xs_id=xs_ids[i], + xs_type=xs_type, + xs_id=all_xs_ids[i], tabular_legendre=tabular_legendre, tabular_points=tabular_points, subdomain=subdomain) mgxs_file.add_xsdata(xsdata) macroscopic = openmc.Macroscopic(name=xsdata_name, - xs=xs_ids[i]) + xs=all_xs_ids[i]) # Create Material and add to collection material = openmc.Material(name=xsdata_name + '.' + - xs_ids[i]) + all_xs_ids[i]) material.add_macroscopic(macroscopic) materials.append(material) @@ -1247,15 +1253,16 @@ class Library(object): # Create XSdata and Macroscopic for this domain xsdata = self.get_xsdata(domain, xsdata_name, nuclide='total', - xs_type=xs_type, xs_id=xs_ids[i], + xs_type=xs_type, xs_id=all_xs_ids[i], tabular_legendre=tabular_legendre, tabular_points=tabular_points) mgxs_file.add_xsdata(xsdata) macroscopic = openmc.Macroscopic(name=xsdata_name, - xs=xs_ids[i]) + xs=all_xs_ids[i]) # Create Material and add to collection - material = openmc.Material(name=xsdata_name + '.' + xs_ids[i]) + material = openmc.Material(name=xsdata_name + '.' + + all_xs_ids[i]) material.add_macroscopic(macroscopic) materials.append(material) diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index aaea0ce4b7..c9a7debdcd 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -1120,6 +1120,10 @@ class MGXSLibrary(object): def energy_groups(self): return self._energy_groups + @property + def xsdatas(self): + return self._xsdatas + @inverse_velocities.setter def inverse_velocities(self, inverse_velocities): check_type('inverse_velocities', inverse_velocities, Iterable, Real) From 72d4496482b7b3d0dcd44010ccb85f312d29a87c Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 6 Aug 2016 12:02:32 -0400 Subject: [PATCH 039/168] Simplified create_mg_mode by making it call create_mg_library to create mgxs_file, leaving only the material and geometry work for create_mg_mode. Also removed subdomain_val --- openmc/mgxs/library.py | 121 +++++++++++++---------------------------- 1 file changed, 37 insertions(+), 84 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index c36034bfc5..e2964f3faa 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -869,56 +869,56 @@ class Library(object): xsdata.awr = self._nuclides[nuclide][1] if subdomain is None: - subdomain_val = 'all' + subdomain = 'all' else: - subdomain_val = [subdomain] + subdomain = [subdomain] # Now get xs data itself if 'nu-transport' in self.mgxs_types and self.correction == 'P0': mymgxs = self.get_mgxs(domain, 'nu-transport') xsdata.set_total_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], - subdomains=subdomain_val) + subdomains=subdomain) elif 'total' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'total') xsdata.set_total_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain_val) + subdomain=subdomain) if 'absorption' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'absorption') xsdata.set_absorption_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain_val) + subdomain=subdomain) if 'fission' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'fission') xsdata.set_fission_mgxs(mymgxs, xs_type=xs_type, - nuclide=[nuclide], subdomain=subdomain_val) + nuclide=[nuclide], subdomain=subdomain) if 'kappa-fission' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'kappa-fission') xsdata.set_kappa_fission_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain_val) + subdomain=subdomain) # For chi and nu-fission we can either have only a nu-fission matrix # provided, or vectors of chi and nu-fission provided if 'nu-fission matrix' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'nu-fission matrix') xsdata.set_nu_fission_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain_val) + subdomain=subdomain) else: if 'chi' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'chi') xsdata.set_chi_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain_val) + subdomain=subdomain) if 'nu-fission' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'nu-fission') xsdata.set_nu_fission_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain_val) + subdomain=subdomain) # If multiplicity matrix is available, prefer that if 'multiplicity matrix' in self.mgxs_types: mymgxs = self.get_mgxs(domain, 'multiplicity matrix') xsdata.set_multiplicity_mgxs(mymgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain_val) + subdomain=subdomain) using_multiplicity = True # multiplicity will fall back to using scatter and nu-scatter elif ((('scatter matrix' in self.mgxs_types) and @@ -927,7 +927,7 @@ class Library(object): nuscatt_mgxs = self.get_mgxs(domain, 'nu-scatter matrix') xsdata.set_multiplicity_mgxs(nuscatt_mgxs, scatt_mgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain_val) + subdomain=subdomain) using_multiplicity = True else: using_multiplicity = False @@ -935,13 +935,13 @@ class Library(object): if using_multiplicity: nuscatt_mgxs = self.get_mgxs(domain, 'nu-scatter matrix') xsdata.set_scatter_mgxs(nuscatt_mgxs, xs_type=xs_type, - nuclide=[nuclide], subdomain=subdomain_val) + nuclide=[nuclide], subdomain=subdomain) else: if 'nu-scatter matrix' in self.mgxs_types: nuscatt_mgxs = self.get_mgxs(domain, 'nu-scatter matrix') xsdata.set_scatter_mgxs(nuscatt_mgxs, xs_type=xs_type, nuclide=[nuclide], - subdomain=subdomain_val) + subdomain=subdomain) # Since we are not using multiplicity, then # scattering multiplication (nu-scatter) must be @@ -1159,44 +1159,21 @@ class Library(object): # multi-group cross section types self.check_library_for_openmc_mgxs() - if xsdata_names is not None: - cv.check_iterable_type('xsdata_names', xsdata_names, basestring) - xs_type = 'macro' - - # Initialize MGXS File - mgxs_file = openmc.MGXSLibrary(self.energy_groups) - - # Get the number of domains to size arrays with - if self.domain_type is 'mesh': - num_domains = np.sum(d.num_mesh_cells for d in self.domains) - else: - num_domains = len(self.domains) - - # Set id names - if xs_ids is not None: - if isinstance(xs_ids, basestring): - # If we only have a string lets convert it now to a list - # of strings. - all_xs_ids = [xs_ids] * num_domains - else: - cv.check_iterable_type('xs_ids', xs_ids, basestring) - cv.check_length('xs_ids', xs_ids, num_domains, num_domains) - all_xs_ids = xs_ids - - else: - all_xs_ids = ['1m'] * num_domains - + # If the domain type is a mesh, then there can only be one domain for + # this method. Thi is because we can build a model automatically if + # the user provided multiple mesh domains for library generation since + # the multiple meshes could be overlapping or in disparate regions + # of the continuous energy model. The next step makes sure there is + # only one before continuing. if self.domain_type == 'mesh': - # We cant build a model automatically if the user provided multiple - # mesh domains for library generation since the multiple meshes - # could be overlapping or in disparate regions of the continuous - # energy model. The next step makes sure there is only one before - # continuing. cv.check_length("domains", self.domains, 1, 1) - # Create the xsdata objects and add to the mgxs_file - # and assign to materials and geometry as we go - materials = openmc.Materials() + # Get the MGXS File Data + mgxs_file = self.create_mg_library('macro', xsdata_names, xs_ids, + tabular_legendre, tabular_points) + + # Now move on the creating the geometry and assigning materials + if self.domain_type == 'mesh': root = openmc.Universe(name='root', universe_id=0) # Add cells representative of the mesh with reflective BC @@ -1205,29 +1182,17 @@ class Library(object): root.add_cell(root_cell) geometry = openmc.Geometry() geometry.root_universe = root + materials = openmc.Materials() for i, subdomain in enumerate(self.domains[0].cell_generator()): - # Build & add metadata to XSdata object - if xsdata_names is None: - xsdata_name = 'set' + str(i + 1) - else: - xsdata_name = xsdata_names[i] - - # Create XSdata and Macroscopic for this domain - xsdata = self.get_xsdata(self.domains[0], xsdata_name, - nuclide='total', - xs_type=xs_type, - xs_id=all_xs_ids[i], - tabular_legendre=tabular_legendre, - tabular_points=tabular_points, - subdomain=subdomain) - mgxs_file.add_xsdata(xsdata) - macroscopic = openmc.Macroscopic(name=xsdata_name, - xs=all_xs_ids[i]) + xsdata = mgxs_file.xsdatas[i] + [name, id] = xsdata.name.split('.') + # Build the macroscopic and assign it to the cell of + # interest + macroscopic = openmc.Macroscopic(name=name, xs=id) # Create Material and add to collection - material = openmc.Material(name=xsdata_name + '.' + - all_xs_ids[i]) + material = openmc.Material(name=xsdata.name) material.add_macroscopic(macroscopic) materials.append(material) @@ -1244,25 +1209,13 @@ class Library(object): # Create the xsdata object and add it to the mgxs_file for i, domain in enumerate(self.domains): + xsdata = mgxs_file.xsdatas[i] + [name, id] = xsdata.name.split('.') - # Build & add metadata to XSdata object - if xsdata_names is None: - xsdata_name = 'set' + str(i + 1) - else: - xsdata_name = xsdata_names[i] - - # Create XSdata and Macroscopic for this domain - xsdata = self.get_xsdata(domain, xsdata_name, nuclide='total', - xs_type=xs_type, xs_id=all_xs_ids[i], - tabular_legendre=tabular_legendre, - tabular_points=tabular_points) - mgxs_file.add_xsdata(xsdata) - macroscopic = openmc.Macroscopic(name=xsdata_name, - xs=all_xs_ids[i]) + macroscopic = openmc.Macroscopic(name=name, xs=id) # Create Material and add to collection - material = openmc.Material(name=xsdata_name + '.' + - all_xs_ids[i]) + material = openmc.Material(name=xsdata.name) material.add_macroscopic(macroscopic) materials.append(material) From cdca6f3e1a7004dd295268ff29b22a3ec901d653 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sat, 6 Aug 2016 16:44:22 -0400 Subject: [PATCH 040/168] removed DelayedGroups and addressed PR comments --- .../pythonapi/examples/mdgxs-part-i.ipynb | 47 ++-- .../pythonapi/examples/mdgxs-part-ii.ipynb | 37 ++-- openmc/mgxs/__init__.py | 2 +- openmc/mgxs/groups.py | 130 +---------- openmc/mgxs/library.py | 16 +- openmc/mgxs/mdgxs.py | 205 ++++-------------- openmc/mgxs/mgxs.py | 9 +- tests/input_set.py | 153 +++++++++++++ .../test_mgxs_library_condense.py | 2 +- .../inputs_true.dat | 2 +- .../results_true.dat | 126 +++++------ .../test_mgxs_library_distribcell.py | 8 +- .../test_mgxs_library_hdf5.py | 2 +- .../test_mgxs_library_mesh.py | 2 +- .../results_true.dat | 192 ++++++++-------- .../test_mgxs_library_no_nuclides.py | 2 +- .../results_true.dat | 2 +- 17 files changed, 431 insertions(+), 506 deletions(-) diff --git a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb index a7a9598415..94be516fca 100644 --- a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb @@ -356,8 +356,7 @@ "one_group = mgxs.EnergyGroups()\n", "one_group.group_edges = np.array([energy_groups.group_edges[0], energy_groups.group_edges[-1]])\n", "\n", - "delayed_groups = mgxs.DelayedGroups()\n", - "delayed_groups.groups = range(1,7)" + "delayed_groups = range(1,7)" ] }, { @@ -581,8 +580,8 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.8.0\n", - " Git SHA1: c23c1cabfbb8c726ee0b4bd01bb7e74e679edcd0\n", - " Date/Time: 2016-08-03 16:02:28\n", + " Git SHA1: ad9fe27d26940a7120ed920d37d9cb176bde6402\n", + " Date/Time: 2016-08-06 15:47:51\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -669,20 +668,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.3800E-01 seconds\n", - " Reading cross sections = 2.5200E-01 seconds\n", - " Total time in simulation = 8.4618E+01 seconds\n", - " Time in transport only = 8.4594E+01 seconds\n", - " Time in inactive batches = 5.0040E+00 seconds\n", - " Time in active batches = 7.9614E+01 seconds\n", - " Time synchronizing fission bank = 6.0000E-03 seconds\n", - " Sampling source sites = 4.0000E-03 seconds\n", - " SEND/RECV source sites = 2.0000E-03 seconds\n", - " Time accumulating tallies = 4.0000E-03 seconds\n", - " Total time for finalization = 7.5000E-02 seconds\n", - " Total time elapsed = 8.5157E+01 seconds\n", - " Calculation Rate (inactive) = 9992.01 neutrons/second\n", - " Calculation Rate (active) = 2512.12 neutrons/second\n", + " Total time for initialization = 4.7100E-01 seconds\n", + " Reading cross sections = 2.6500E-01 seconds\n", + " Total time in simulation = 8.5400E+01 seconds\n", + " Time in transport only = 8.5378E+01 seconds\n", + " Time in inactive batches = 4.8000E+00 seconds\n", + " Time in active batches = 8.0600E+01 seconds\n", + " Time synchronizing fission bank = 1.0000E-02 seconds\n", + " Sampling source sites = 8.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for finalization = 7.2000E-02 seconds\n", + " Total time elapsed = 8.5969E+01 seconds\n", + " Calculation Rate (inactive) = 10416.7 neutrons/second\n", + " Calculation Rate (active) = 2481.39 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -866,6 +865,14 @@ "collapsed": false }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/lib/shape_base.py:873: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n", + " return c.reshape(shape_out)\n" + ] + }, { "data": { "text/html": [ @@ -1310,7 +1317,7 @@ "data": { "image/png": "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\n771XLz/wwAO55JJLWLBgAfPmzVt9R8qOtPXkVe/EUikFl7+jrW3T5r6SGshKOGdGxNK0+HLggxGx\nK1mp5sftjtisizQ3w9KlVTfr1pYuza7D1rjjjjtYuHAhr7zyCj/72c/o379/m9ufcsopq29XfOGF\nF6617tvf/jZTp07lpptuqrhvv379GDNmDBdccAEvvvgiAP/1X//Fbrvtxq677so+++zD4YcfzoYb\nbsgWW2xRmwusoN5VYbOBYSWvtwHmlm0zC9gWmCupLzAwIt6UNDstX2dfSRuQJZVrI+KOlg0i4l8l\n2/8auKu1wJpLPv1NTU00NTXlviizeih6UmnRna6jM1VXNYuhQulk0003XavEMG/evNXPr7jiCq64\n4op19hk3bhz33Xcfjz76KA0NDW2ec/ny5bz88svsvPPO9O/fn0svvZRLL70UgF/96lfsvvvuuare\nJk2axKRJk6put448dwPr6APoC/w3MBzoBzwH7Fi2zanA5en5WLJ2FYCdgGfTfiPTcVpuTHYNWSN9\n+fm2Knl+FnBDK3FVv4Wa2XqW3aE9exRRV8Xfnf+eR4wYEQ8++OA6y48++ug4+uijY/ny5TF58uQY\nMmRIHHvssa0e5wc/+EGMGjUq5s2bt866J598Mh577LF47733YtmyZXHhhRfGgAED4vXXX4+IiDlz\n5sTcuXMjIuKJJ56IbbfdNh544IE2427tPSXnHSTXx22ADwD+DswAzknLxgOfS883Am5O658ERpTs\ne25KKNOA0WnZ3sDKlKSeBaYAB8SahPNCWvf/gC1bianNN9WsKzixdPS83fcNGzlyZMXE8vLLL8de\ne+0VjY2N8bnPfS7OPPPMNhOLpOjfv380Njauvl3xBRdcEBERjzzySOyyyy4xYMCAGDx4cDQ1NcVj\njz22et9HH300RowYEZtuumnssMMOceONN1aNu7OJxbcmNusmSmsmivjx7Kr4fWvi2vOtic3MrFup\n2ngv6ePAMcAnga2BZcBfgd8D10XEorpGaGZmhdJmVZikP5D1xLoD+AvwT6A/sD2wL3AwWSP6nfUP\ntXZcFWbdkavCOnpeV4XVWmerwqolliERsaBKAFW36W6cWKw7cmLp6HmdWGqtrm0sLQlD0qZp3i8k\nbS/pEEkblm5jZmYG+RvvHwX6SxoK3A8cC/y2XkGZmVlx5R15r4h4R9IJZIMZL5L0bD0DMzPLY/jw\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1373,7 +1380,7 @@ "data": { "image/png": "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\n9erFmWeeyRtvvAFAkyZNgmWqSk5ODjt37mTHjh2AnT5zwoQJFBQU0KZNGyZMmBDTNPTCCy9w3HHH\n0bp1a8aPH1+ts3/wwQc5/vjjadOmDQMHDmTdunUR21m6dCmnnHIKBQUFFBcXh/xIBw8ezF/+8peQ\n+ieddBJPP23/dNasWUP//v1p06YNxx13HE888USw3o4dOzj//PMpKCigd+/eCaU3bciULi8NboaG\nR1IVg6oeAK4Dngc+Bhao6iciUioigwFE5Mcish64CLhPRAKJfYcCfYCxIvK+iLwnIifWpXyW30JK\npdoWzS4bqX5dRJ9cv359sKOMhldzyPfff8/KlSurpfw86aSTaNq0KRdccAFXXHFFMEdDIMxugIMH\nD7JhwwZ2795dre3t27dz0UUXcdttt7Ft2zaOPvpoXnvttWD5U089xe9//3ueeuoptm7dyplnnsmI\nESMiypmXl8fcuXPZtWsXS5Ys4b777gt2/IEcDQFWrVrFpk2bGDRoEHv37qV///6MHDmSbdu2MX/+\nfK699lo++eQTAK699lqaN2/Oli1bmD17tmf/h8FgqCLpsZJU9TlVPUZVu6rq751jJar6rPP5HVXt\nqKotVfVQZ3oqqvqYqjZR1VNU9WTn73+SLW99csEFF1BYWMhZZ51Fv379IialqSlXX301J598Mv37\n9w85vmrVKnbv3s28efM444wzgscHDhzI3XffzbZt2/jqq6+CWeH27t1bre2lS5dywgkn8LOf/YxG\njRpx/fXX065du2D5Aw88wJQpU+jWrRs5OTnceOONfPDBByFJfwKcddZZQeX1ox/9iOHDh7N8+XIA\nhgwZwmeffRZ823/00UcZNmwYjRo14tlnn6Vz586MHj0aEaFHjx5ceOGFLFy4kIMHD/Lkk09yyy23\n0LRpU0444QTGjBmT4BM1GBoeJoheClm8eDE7duzgyy+/5M9//jNNmjSJe84111wTzMXw+9//PqRs\n8uTJrF69Omou58aNGzNs2DBmzJjBhx/aA7OpU6dy8skn06NHD/r06cPPfvYzcnNzOeyww6qdH57y\nEwjZLy8vZ+LEicF0nG3atEFEqmVbA3jrrbc4++yzOeyww2jVqhX3339/MOVn48aNGTp0KI8++iiq\nyvz584O5oMvLy3nzzTdDUn7OmzePLVu2sHXrViorKznyyCOD12mwwfn8JVVbBALO6Ax0z0Uk/F6y\n6d5SQYMOiWH5rBo51mpaPx7RnLEtWrQIeWP/6quvgp/vvfde7r333mrnlJSUsGzZMlasWEFeXl7M\n61ZUVPDFF1/QvXt3mjZtyqxZs5g1axZgv/X37Nkzoumqffv21XwG7tFAx44d+d3vfhfVfOTm0ksv\nZcKECSxbtozc3FxuuOGGkLzRo0ePZtSoUZxxxhm0aNGCXr16Ba/h8/lYtmxZtTYPHjxIbm4u69ev\np1u3bgBRfRxZTxwTp9vvmIkdaLgSMNQtZsSQhvTo0YMFCxZQWVnJO++8w8KFC2PWnzFjBvPnz+eF\nF16gVatWIWVvvfUWr732GhUVFfzwww/cfvvtfP3115x22mmAPQrYvHkzAG+++SbTp0+PmjBn0KBB\nrF69mqeeeooDBw5w9913hyitq6++mttuu43Vq1cDsGvXrqiy79mzh9atW5Obm8vbb7/NvHnzQsp7\n9+5NTk4OkyZNCnG8Dx48mE8//ZRHH32UyspKKioqeOedd/jvf/9LTk4OP//5z7Esi++//57Vq1cH\ns741NEpKqrZand+3JLilM35C12qYrHN1RLScn5mykaE5nzt37qwvvfRSxLIvvvhCTzvtNG3ZsqUO\nHjxYJ06cqKNGjYraloho06ZNtWXLlpqXl6ctW7bUGTNmqKrq8uXL9aSTTtL8/Hxt06aN+nw+/fe/\n/x08d8WKFdqpUydt0aKFHnvssTp//vyYci9btky7deumrVq10vHjx6vP5wvJ4fzoo49q9+7dtaCg\nQIuKivTyyy8PlrnzRi9atEiLi4s1Pz9fzzvvPB0/fny1e5w+fbrm5OTol19+GXL8008/1UGDBumh\nhx6qbdu21XPOOUdXrVqlqqpbt27VwYMHa0FBgZ522mk6bdo0PfPMM6PeT7r/TpIFVG1eKXmlJCSX\ndN5tefrH1/6YPCE9ylTySknUfUN0iJHzuUZB9ESkNdBR08gJbILoZS9z587lb3/7GytWrEjaNRrq\n78RtKfR6+5bfqjZ9Na9xHrunVJ/BVl8ERgcBE29g372Oy29sTRFJKOy2iPiB85267wJfi8hrqvqr\nOpXSYHCxd+9e/vrXv3LdddelWhRDDPbs35OS6/pcnb274w8oCJ8xJyWEF+dzgap+KyK/AB5R1RIR\nSZsRgyH7eP755/n5z39O//79PTmyDdWJt3K5Nr4H9+SLdLfjm1FCYsQ1JTkLzvoDc4CpqrpSRP6j\nqnW62Ky2GFOSIRGy9XdiMrAZ4pFoBrebgWXAvx2lcBSwti4FNBgMhrokmqnJ4I24ikFVnwCecO1/\nAVyYTKEMBoMh0J9H+ms6/uTixfl8KHAF0MldX1UvS55YBoPBEFinUOUnCezHPc8oi4TwYkpaDLwK\nvIide9lgMBhSipeOP9pUVhNGPD5eFENzVf1t0iUxGAx1hztGUoQZSImGlKiPfA2WRcjoIHw/3rnB\nqr4I5SbfREy8KIZnReRcVV2adGkMBkPdkORYSeEZ4uqaeOsUDMnFS6ykidjK4QcR2e1s3yZbsGwn\nUv7jWAl59u/fzy9+8Qs6depEQUEBPXv25LnnnguWf/LJJ5x66qnBqKb9+/cP5igItN24cWPy8/OD\n0VnLysqScm/JJhW5ozONRGMlZTqWZSsUH1aV09pngd9Jc+qsyTCKJjJeZiW1rA9BGhrREu9EO15Z\nWUlRURGvvvoqHTt2ZMmSJQwdOpSPPvqIoqIiOnTowKJFiygqKkJVueeeexg+fDirVq0KtjF8+HAe\neeSROr+XgwcPkpNTf/EYG2IO50hEClEBdgC8TEx368Y4j1OLp/9mETlfRP7obIOTLVRDoKaLqpo3\nb860adOC+Q8GDRpE586deffddwHIz8+nqMhOr33gwAFycnJqndZy+fLldOzYkRkzZnDooYdy1FFH\nhUQ/HTduHNdeey2DBg2iZcuW+P1+vv32W0aPHs1hhx1G586dufXWW4P158yZQ58+ffjVr35F69at\n6dKlC2+88QZz5syhqKiIdu3ahSiscePGcc0119C/f3/y8/Pp169fMLx33759UVVOPPFE8vPzQ9J6\nGgxe8VlWcDNUx8t01d8DpwKPOYcmikgfVb0xqZLVA7HmSdfmb32yZcsW1q5dWy2FZ+vWrfnuu+84\nePAgt9xyS0jZM888Q9u2bWnfvj2//OUvufrqq6O2/9VXX7Fjxw42bdrEG2+8wbnnnsupp54azB89\nf/58/vWvf9G7d2/27dvHFVdcwe7duykrK2Pr1q3079+fI444gnHjxgHw9ttvc+WVV7Jjxw6mTZvG\n8OHDOf/88/n888/x+/1ceOGFXHTRRTRv3hyAefPmsXTpUnr16sXkyZO55JJLePXVV1m+fDk5OTl8\n+OGHdO7cuS4fqSGNqKt1CuGnBvaNBSk2XpzP5wI9VPUggIjMAd4HMl4xZCqVlZWMHDmSsWPHBhPS\nBPjmm2/4/vvvg2/jAYYNG8ZVV13F4YcfzptvvsmFF15I69atGTZsWMRriAi33HILubm5nHXWWQwa\nNIjHH3+HCHyBAAAgAElEQVScqVOnAnb6zd69ewOQm5vL448/zqpVq2jevDnFxcVMmjSJuXPnBhVD\nIB1nQJbbbruNkpIScnNz+elPf0rjxo357LPPOPFEO9LKoEGDgilIb731VgoKCti4cSMdOnQAaj7i\nykYSsZEn6ntI9zwN8TCmqth4zeDWCtjhfC5IkiwNikaNGlFRURFyrKKigtzcXADOPfdcXn31VUSE\n+++/PxhMTlUZOXIkTZo0CeZnDqdZs2ZcddVVHHrooaxZs4a2bdty7LHHBstPP/10Jk6cyMKFC6Mq\nhtatW9O0adPgfnFxMZs2bQruu1N6btu2jYqKihBFVFxcHJLS8/DDDw+RD6Bt27Yhx/bsqYrU6W6/\nRYsWFBYWsmnTpqBiMCRGov1isp22puNOLV4UwwzgfRF5BRDgLCDxrPVpQLRhZm33a0JRURFlZWUc\nc8wxwWNffvllcH/p0sizgy+//HK2bdvG0qVLadSoUdT2Dxw4wN69e9m4cWNIBxwgXvC4wMgj0Imv\nW7eO7t27h5wfoG3btuTm5lJeXh5UQOXl5Ql14u6UoXv27GHHjh1GKdQAk/oyNiakRmxiOp/F/u//\nN9AbeNLZTlfVBfUgW1YzbNgwpk+fzsaNG1FVXnzxRZ599lkuuuiiqOdcffXVrFmzhqeffprGjRuH\nlL344ot88MEHHDx4kG+//ZZf/epXFBYWctxxxwHw9NNPs3PnTsC298+aNYsLLrgg6rVUlZKSEioq\nKnj11VeDs6AikZOTw9ChQ5k6dSp79uyhvLycO++8M+rU20D7sVi6dCmvv/46+/fv56abbqJ3794c\nccQRALRr185MV41DaWnVlokY53BqiTliUFUVkaWq2h14up5kahBMmzaNkpIS+vTpw86dOzn66KOZ\nN28exx9/fMT669at44EHHqBp06ZBs4zbzLRz507Gjx/Pxo0badasGaeeeirPPfdcUIEsWLCAyy67\njP3793PkkUcyZcoURo4cGVW+9u3b07p1a4444ghatGjB/fffH3Q8R5ouOmvWLMaPH89RRx1Fs2bN\nuPLKK4P+hUiEtxG+f8kll2BZFm+88QY9e/bkscceC5ZZlsXo0aP54YcfeOCBB2Iq02zFrNxNDDNK\niI2XfAxzgHtUdWWtLiAyALgLe3QyW1VvDys/0yk/ERimqk+6ysYAUwEFblXVapPwTT6Gumf58uWM\nGjWKdevWpeT648aNo2PHjtx8881Jv1am/k7i5VuoTepOQ8Mi0XwMpwGXikg58B22n0G9JOoRkRzg\nHuAcYBOwUkQWq+oaV7VyYAzw67BzWwPTgFOca77rnLvLg8wGgyEGmRArKZkYH0NsvCiG/02g/V7A\nWlUtBxCRBcAQIKgYVHWdUxb+XvO/wPMBRSAizwMDgH8kII8hAzArm5NPpsZKMtQPXhTDdFUN8SKK\nyFwgumexig7Aetf+Bmxl4YXwczc6xwxJpm/fvikzIwE8+OCDKbt2ttBQYyR5xSib2HhRDCFLa0Wk\nEdDTY/uRXv28Wjw9n+uOC+Pz+fD5fB4vYTBkJ5ne75mOu+7x+/34/X5PdaMqBhGZAvwf0MyJphro\nqPcDD3iUZQNQ5No/EtvX4PVcX9i5r0SqmOkBwwyGmpLpK49TTUM0VYW/NJfGmMscVTGo6gxghojM\nUNXaLmhbCXQRkWJgMzAcGBGjvnuUsAy4VUQKsGc0/RQThsNgADLT4RuOyemcvngxJf1LRM4KP6iq\nK+KdqKoHROQ64Hmqpqt+IiKlwEpVfVZEfgz8EzvsxmARsVS1u6p+IyK3AO9gm5BKVXVnDe7NYDBE\nwcRKslItQlrjZR3DM67dptjO43dV9exkCuYVs47BkAjmd1KFZYXOVsrLs49NmlS7duKdH+ybA6Of\nwBTYQI7mLBgVpTMJrWNQ1fPCGuuIvSDNYDCkKXURK2nPnugdu5f2Y53vPi+Qxzl8P5kYU1VsapN2\nawNwXF0L0tDo1KkTzZs3Jz8/n/bt23PZZZexd+/eWrU1efJkunXrRkFBAccffzxz584Nlm3fvp0+\nffrQtm1bCgsLOeOMM3j99deD5fv37+eGG26gQ4cOtGnThuuuu44DBw4kfH+poF+/fg16qqtl2Sue\nReouVpIr4G0IXtuPdr6JhZTeeEnU82eqponmAD2A95IpVENARFiyZAn9+vVj8+bN9O/fn+nTp3Pb\nbbfVuK28vDyWLFlC165defvttxkwYABdu3ald+/e5OXl8dBDDwXjHC1evJjzzjuPrVu3kpOTw4wZ\nM3jvvfdYvXo1lZWVDB48mOnTp1NSBxPhDxw4EDMCrKH2eF15nJdXgzatukk+FW6Sils/TP76MCGZ\nUUIcVDXmhh2uIrBdCpwR75z63OxbqE604+lCp06d9KWXXgruT548Wc8777yIZZZl6ciRIz23ff75\n5+uf/vSnascPHjyoTz/9tObk5OjWrVtVVfXHP/6xLly4MFhn3rx5WlRUFLVtEdFZs2bpUUcdpYce\neqhOnjw5WPbwww/rGWecoTfccIMWFhbqTTfdpAcPHtRbbrlFi4uL9fDDD9cxY8borl27VFW1rKxM\nRUQfeugh7dixoxYWFup9992nK1eu1BNPPFFbt26t1113XbX2x48frwUFBXrccccFn9PUqVO1UaNG\n2qxZM23ZsqWOHz/e07NK999JNLAIbgFKSlTtyEj2lpen+sc/Jun6ruvUptyQepzffsR+1YuPYY6I\nNAOKVPW/yVJQqSDw1hV4Q0l0v7asX7+epUuXxowS6jVMxPfff8/KlSv55S9/GXL8pJNOYs2aNVRW\nVnLFFVcEczRolYIF4ODBg2zYsIHdu3fTsmXLiNd46qmneO+999i9ezfnnHMOxx57LJdddhkAb731\nFpdccglbt26loqKChx56iEceeYTly5dz6KGHMmrUKK677rqQHM9vv/02n332GStWrOC8885j4MCB\nvPzyy+zbt4+TTz6ZoUOHcuaZZwbbHzp0KNu3b2fRokX8/Oc/p6ysjOnTp/Paa68xatSooCwNDfcb\nf9IJ+c1Xv2i6r7w2PobYeDElnQf8EWgMdBaRHsDNqnp+soXLdi644AIOOeQQCgoKGDx4MFOmJJ7/\n6Oqrr+bkk0+mf//+IcdXrVrF/v37+ec//8n+/fuDxwcOHMjdd9+Nz+ejsrIymBVu7969URXDjTfe\nSEFBAQUFBVx//fXMnz8/2Bl36NCBa6+9FoAmTZowb948fvWrX1FcXAzAjBkz+NGPfsTDDz8M2Apv\n2rRpNG7cmP/5n/+hRYsWjBgxgjZt2gBw5pln8v777wcVw+GHH86ECRMAGDp0KDNnzmTJkiVceuml\nCT87Qw3wuW1FVrXieH1tOnXMyXrhy2S8rGOwsKeo+gFU9QMR6ZQ0iRoQixcvpl+/fjU655prruHR\nRx9FRPi///s/bryxas3f5MmTWb16Na+8EnGBOI0bN2bYsGEcf/zx9OjRg+7duzN16lR27dpFjx49\naNq0KVdccQUffPABhx12WFQZjjzyyODnWCk/ATZt2hRUCoH6lZWVbNmyJXjMfa1mzZpVSwPqTvkZ\nnsUt/PoGgxfcysjtrzHYeFEMlaq6KxsjXsZzetV0v6a4TThuWrRoETJD6auvvgp+vvfee7n33nur\nnVNSUsKyZctYsWIFeXE8jhUVFXzxxRd0796dpk2bMmvWLGbNmgXAAw88QM+ePWOartavXx/MDLdu\n3bpgZjWobvI64ogjKC8vD+6Xl5eTm5vL4YcfHpK+0yvuPNKB6w8ZMiTitQ3pS6pHCYbYeJmu+pGI\nXAI0EpGuziyl1+OdZKg9PXr0YMGCBVRWVvLOO++wcOHCmPVnzJjB/PnzeeGFF2jVqlVI2VtvvcVr\nr71GRUUFP/zwA7fffjtff/01p512GmC/0W/evBmAN998k+nTp8dNkHPHHXewc+dO1q9fz913383w\n4cOj1h0xYgR33nknZWVl7Nmzh6lTpzJ8+HBycuyfXjTlGI2vv/6aP//5z1RWVvLEE0+wZs0azj33\nXMA2MzWYlJ/+kqotCVgWjB1bNf01sGVLfx7wx1iW/YLnfslzm5Qa6mjCy4hhPHYWtX3AfOwYRrck\nU6iGQKy321tuuYURI0ZQWFhI3759ufTSS9mxY0fU+lOnTqVJkyZ07doVVQ0xM+3bt48JEybw5Zdf\nkpubS/fu3Vm6dCnt2rUD4PPPP2f06NFs3bqVjh078oc//IFzzjknpuxDhgyhZ8+efPvtt4wbNy6m\ns/eyyy5j8+bNnHXWWezbt48BAwYERyeRnkO8/dNOO421a9fStm1b2rVrx6JFi2jdujUAEydOZMyY\nMdx7772MGjWKu+7K4nWYSe6wZs6MvgahLkgrH4NV/a8faMhBmuOGxEh3TEiM+iUnJ4fPPvuMo446\nqt6vPWfOHGbPns2KFXHDdHkmU38ndbGyORYzZ9rthiuHkhLnLTvOOop48qW7YnD/zVYSCokhIt2w\n0252ctfXNImVZDA0RJLdaU2aFDtGUjz/WrwMcalWBobYeDElPQHcB/wdyMxYCYY6wzh4DdlGuI4K\nhP2uiu0XVqEB4HVWUvVpMIYGSSrjKI0ZM4YxY8ak7PqGuiOdTEmG6nhRDM+IyLXYORP2BQ6qanRv\nqMFgSCpeYyUZakdDV1Ze8jF8GeGwqmr9ex8jYJzPhkTI1N+JlFaZ9LQk/eR3Wxwz8PE2CBLNx9C5\n7kUyGAyZTLwRS7rHSopHQzd1eTElZSTFxcXGUWqIiztcR6aQDouuSpdXTTuKN101Eg294013slYx\nlJWVpVoEg6HWePYh7KtBwgWDZxq6sspaxWAwZDLx3sgBWymkweihNjT0jjfdiep8FpFTYp2oqmmR\nxS2a89lgyGTiOZdT7dytqfM701YXNwRTV22dzzOdv02BHwOrAAFOBN4BTq9LIQ0GQ2TqNQFPHREv\nJIbfyeFg+c1023QkqmJQ1X4AIvIkcIqqfujs/4hImTkMBkO9kepZPyV9Ywvg99ePHMkiW0cJXvGy\njuFjVT0h3rEY5w8A7sIO8T1bVW8PK28MPAL0BLYBw1R1nYgcgh2G4xSgETBXVX8foX1jSjJkHW5T\nTYlqxo0YUm3qMsQnoXUMwH9E5O/Ao4ACI4H/eLxwDnAPcA6wCVgpIotVdY2r2uXADlXtKiLDgD8A\nw4GLgcaqeqKTc3q1iMxT1XVerm0wZDSuPAtW5IR8hiTSEHwMsfCiGMYB1wATnf0VgNfYSb2Atapa\nDiAiC4AhgFsxDAEC/wULgT87nxVoISKNgObY4Ti+9XhdgyGzydDZRl4xIT3SGy8rn38QkfuApar6\n3xq23wFw52/cgK0sItZR1QMisktECrGVxBBgM9AMuEFVd9bw+gZDRpJqH0JDpyGOEtx4ycdwPnAH\n0BjoLCI9gJtV9XwP7UeyX4VbHMPriFOnF1AJtAPaAK+KyIuqWhbeoOX6En0+H76GnHrJkBVkU78U\nGB24U2a69w31g9/vx+9xVoAXU1IJdiftB1DVD0Skk0dZNgBFrv0jsX0NbtYDHYFNjtkoX1W/cfJM\nP6eqB4GtIvIa9rTZsvCLWNn0X2QwZAAmVlLmEf7SXOrOphSG13wMu2oZd2gl0EVEirFNQsOBEWF1\nngHGAG9hO5xfdo6vA84GHhORFkBv4M7aCGEwGOqWeCuz/a4Z7b7ki2OoY7woho+ct/dGItIVmAC8\n7qVxx2dwHfA8VdNVPxGRUmClqj4LzAbmishaYDu28gD4C/CQiHzk7M9W1Y8wGBoA2eScDZc/E+4n\nW0YJtcXLOobmwFSgv3NoGXCLqu6Lflb9YdYxGLKRtM+3kObyGeKT6DqGQao6FVs5BBq8GDsXtMFg\nMGQd2ehjqAleFMMUqiuBSMcMBoMBMB1rphNVMYjIQOBcoIOIzHIV5WNPIzUYDA2UeLGSMj0dSkNX\nZrHCbp8E9ABuBqa5inYDr6jqN8kXLz7Gx2DIRjLdhm9iJaU/tfIxqOoqYJWIHK6qc8IanAjcXbdi\nGgyGIK5YSWT4moBMpKGbwrz4GIZjB7ZzMxajGAyG5JHpsZJCpqRaUSoZ0pVYPoYRwCXYYTCedhW1\nxF5vYDAYkkSmrxzOdBriKMFNLB9DMdAZmAHc6CraDfxHVdPCAW18DAZD+mF8DOlPbX0M5UA5JoWn\nwWAIw/JblO0sY86qEPcjJX1LsHxWxo94jI8hCiLyb1XtIyK7CY2IKoCqan7SpTMYDGnJzDdmsmf/\nnqjl/hC/ghWlliFdiTVi6OP8bVl/4hgMBkj/WElWXwtruRVTOWQyDXGU4CZurCQAEWmNHRo7qEhU\n9b0kyuUZ42MwZCOZvo4hG8j2PBIJxUoSkVuwp6d+ARx0Dit2SGyDwWCoRrqPeOJhWU4CGogYNzzT\n7y8eXtYxDAWOVtX9yRbGYDBkB6UP+4OfLV/KxDDUEi9htxcB16jq1/UjUs0wpiRDNpIppqSAKT78\nb2mZL1hHXUrCkD4kGnZ7BvC+kzAnmIPBY85ng8HQEOm8PNUSGBLAi2KYA9wOfEiVj8FgMCQTEysp\npbgnJUWaoGR8DLBXVWfFr2YwGOqMNI+VFK3jDJqSoueZN2QAXhTDqyIyA3iaUFNSWkxXNRiykUxf\nOUxZ31RLkBDxljFk4yjBjRfn8ysRDquqpsV0VeN8NmQalhX5jbqkJH6HlCmYWEnpT0LOZ1XtV/ci\nGQzZTTwbdbYRvvirb4n915eh4TDCv7/wWVeBWEo+X3aOHrwscDscuA04QlUHisjxwOmqOjvp0hkM\nGYp7RJCNiiFekDmfz/5r1jBkJl58DA8DDwFTnf1PgX8ARjEYDLXA/QYatU6WzXqJZD7Ly7OPT5qU\nColiE+/7CYyEslXxefExrFTVU0XkfVU92Tn2gar28HQBkQHAXUAOMFtVbw8rbww8AvQEtgHDVHWd\nU3YicB+QDxwATg1fgW18DIZ0JFEbe6YscPNKNL9KXh7s3l3v4hhIfIHbdyLSBif0toj0BnZ5vHAO\ncA9wDrAJWCkii1V1java5cAOVe0qIsOw04gOF5FGwFzgUlX9yAnkV+HlugaDIbV4GfGMGQOdOtWL\nOHVOtudr8KIYfoU9VfVoEXkNOBS4yGP7vYC1TtIfRGQBMARwK4YhVC3hWQj82fncH1ilqh8BqOo3\nHq9pMBiSTLyOsXR51fDA8lmezGeG9MHLrKT3RKQvcAx2kp7/qqrXN/cOwHrX/gZsZRGxjqoeEJFd\nIlIIdAMQkeeAtsA/VPUOj9c1GFJKxq9DMMQkG0cJbryMGHDyO39ci/Yj2a/CDabhdcSpcwhwBvBj\n4AfgJRF5R1WrrauwXF+Sz+fDF5gSYTCkiCzvN7K+Y8xG/H4/fr/fU11PiiEBNgBFrv0jsX0NbtZj\nJwHa5PgV8lX1GxHZACwPmJBEZClwChBTMRgM2UBJXzPkSGcy0ccQ/tJcGiNuSbIVw0qgi4gUA5uB\n4cCIsDrPAGOAt4CLgZed48uAySLSFKgE+gJ/SrK8BkNakO5TVDOxYzR4x5NiEJEOQDGhqT1XxDvP\n8RlcBzxP1XTVT0SkFFipqs9ir4eYKyJrge3YygNV3SkifwLewY7qukRV/1WjuzMY0pSZr8+MmDO5\npG9J2isFL8Qb8WT6yvBsV4Ze1jHcDgwDVmOvJQA7VlJa5GMw6xgMmUjLGS2rKQXIHsUQDxNLKfUk\nuo7hAuAYVd0Xt6bBYADivxFPOn0SZTvLmLNqTn2JZKhDst2U5mXE8C/gYlWt/nqTBpgRgyEdyfY3\n4kQ7xkx/PtmgGBIdMewFPhCRlwjNxzChjuQzGAyGjCJTlYFXvIwYxkQ6rqppMQY2IwZDOpLpb8TJ\nxjyf1JNoPoY5TqC7bs6hmqx8NhgMWUB4PoLwv9Xqx4mVlOkrw7PBlBQLL/kYfMAcoAx7VXJHERnj\nZbqqwWDITOI5z/2BsNP+yB1/eKykWO0b0g8vPoaZQH9V/S+AiHQD5mOHyTYYDBGI90acbfkWGhrZ\nOEpw48XH8B9VPTHesVRhfAyGTCTb8i2Ek+33lw0kOivpHRGZjZ0bAeBS4N26Es5gMKQ/4Tmdw/cb\nGtnuY8jxUOca7MiqE4CJ2Cugr06mUAZDJmBZ9uya8C0b+gmfZQU3Q8PDy6ykfdjB60wAO0ODIRDL\naNLpkyI7T/0WpVIK4UX+EqofbHiYWEmZTbKjqxoMGUkgwF3ZzrJUi5ISwju+cOUYz4QUr9wd8TnL\n+9iMxCgGgyECgQB3c1bN4eELHvZ8XkkJWD4P9Uy+hYwm230McWclpTtmVpIhGTT0WTXJ7vgyfeVz\nNiiGhGYlOesWJlM9H8PZdSahwZBlmHUK2U2mKgOveFnHsAq4D3uKaiAfA6qaFlNWzYjBkAwSHTE0\n9BFHPDJ9xJANJLqOoVJV761jmQyGtCbbZ9UkGxMrKbPxMmKwgK+BfxIadntHUiXziBkxGFJBvDfe\nTB8xJJxvIcPvPx7ZoBgSHTEEwm5Pdh1T4KhEBTMYGirGB5HZZKoy8IqZlWQw1IJERwzZ/kad7feX\nDSQ6KykXOyzGWc4hP3C/yclgMETHrFPIbrLBlBQLL6ake4Fc4K/O/ijn2C+SJZTBkOlkunko2zs+\nQ2y8KIZTVfUk1/7LzhRWgyFryfZZNckm22d1Zbuy9DIr6T3gYlX93Nk/Clioqqd4uoDIAOAu7Eiu\ns1X19rDyxsAj2Il/tgHDVHWdq7wIO7priapWC+RnfAyGZJBsG3lDt8FnwzqGTA9FnuispMnAKyLy\nBXZqz2JgnMcL5wD3AOcAm4CVIrJYVde4ql0O7FDVriIyDPgDMNxV/idgqZfrGQyZgvFBZDaWZTtb\nAfBFKM/wWWdewm6/JCJdgWOwFcMaJxS3F3oBa1W1HEBEFgBDALdiGAIE/ksWYisSnPpDgM+B7zxe\nz2DICNK9szA+hoZNVMUgImer6ssi8vOwoqOdIciTHtrvAKx37W/AVhYR66jqARHZKSKFwA/Ab4Cf\nErqGwmCoVyTCYLukJLZtPFPeGAP3EP7XEBv7OVmhx1zfczp/516INWLoC7wMnBehTAEviiGS/Src\nohheR5w6pcCdqrpX7P/MiLYwAMv1a/b5fPh8Pg+iGQzJo3R5VcKBTOwkzCgh+/D7/fj9fk91oyoG\nVQ2Yd25W1S/dZSLS2aMsG4Ai1/6R2L4GN+uBjsAmEWkE5KvqNyJyGnChiPwBaA0cEJHvVfWvYeeH\nKAaDoS4I+AD8flieWlEykmyf1RVvVlU6jhjDX5pL3dmSwvDifF4EhM9AWog9iygeK4EuIlIMbMZ2\nKo8Iq/MMdtiNt4CLsUcpqGpgQR0iUgLsjqQUDIZkEPxn9pGVmTqjdWxBk1KCHVu8EZN5l0tvYvkY\njgVOAArC/Az5QFMvjTs+g+uA56marvqJiJQCK1X1WWA2MFdE1gLbCZ2RZDBkJenyRunHwvJXn3Jp\niI3bJxPYQo9b9S1SnRJrxHAMMBhoRaifYTdwhdcLqOpzTlvuYyWuz/uAoXHaiD7mMRgykFT7IKpG\nBlHK08T8YUgNsXwMi4HFInK6qr5RjzIZDCkn0ZW5Zp1CbCy/xcw3ZmL1tZj0k0mpFqfOyfTpvl5W\nPs8BJqrqTme/NTBTVS+rB/niYlY+G5JBslfmpnrlc7I7rpYzWrJn/x7GnDSGhy94uFr52KfGMmfV\nHPIa57F7yu46v36qyQTFkOjK5xMDSgHAmTF0cp1JZzCkIyGmFCtKJUM0rL4W1nKLTq06RSyfs2oO\nAHv276lHqeqPdFUGXvGa89mnqt84+4XAclXtXg/yxcWMGAzJwMRKSi4N/f7TgURHDDOB10VkobN/\nMXBrXQlnMDREjA8iu8kEU1IsvMRKekRE3gX6Ya8+/rmqrk66ZAZDFpPqWT+Z3nEZkouXEQOq+rGI\nbMVZvyAiRe7Q2AaDIZR0WaeQtvhdI6YsHDxlurL14mM4H9ucdATwNXbY7U9U9YTkixcf42MwJINE\nbeDGhh6bbMjHkOkk6mO4BegNvKiqJ4tIP2BkXQpoMKQbxgeQXDI9VlI8Mt1U50UxVKjqdhHJEZEc\nVX1FRO5KumQGQwrJBvNPtJDalpX6jisD+8oGhRfFsFNE8oAVwGMi8jUmcY7BkBDGB5HdZOIowY0X\nxTAE+B64AbgUKABuTqZQBkO2k+pYSZnecRmSS0zF4ORHeFZV+wEHgTn1IpXBkGKSFSvJ8lshSiGZ\nhNyD3wJf+iSut/wWZTvLgiugA5T0LcmKEVSqTXWJElMxOGGzD4pIgaruqi+hDIZU485hUpv/a6+d\nW17jvJo37oF075hmvjEza8NhZANeTEl7gA9F5AVcvgVVnZA0qQyGVFMPsZLyGudh9U1O2+nO6fss\nXlGLypxQ5eD3YydHynDSURnXBC/rGMZEOq6qaWFWMusYDMnArENILi1bwp4IA4aSEjNjqb6o1TqG\nwOrmdFEABoMhewhkPYukHCDzZ22luykvHrFMSU/h5HoWkUWqemH9iGQwGBIl3TumSZPsLRqpnrXV\n0ImlGNxDjKOSLYjBYDBkC+mojGtCLMWgUT4bDIY0J9M7JkNqiaUYThKRb7FHDs2czzj7qqr5SZfO\nYEgRJlaSIRHS3ZQXj6iKQVUb1acgBkM6kel27UzvmAypxVM+BoPBYKhXMjxfQ6Yr47jrGBK+gMgA\n4C4gB5itqreHlTcGHgF6AtuAYaq6TkT+B/g9kAvsB36jqq9EaN+sYzA0aGJFUc1UIuVrCA8nElgg\nOOknMaY3GaKSaD6GRC6cA9wDnANsAlaKyGJVXeOqdjmwQ1W7isgw4A/AcGArMFhVvxKRE4BlwJHJ\nlNdgCJBorKT6xo+F5a8ygYXvZxpe8jXs2b8Ha3l6KoZMN+Ul25TUC1irquUAIrIAO1qrWzEMoWqw\nuBBbkaCqqwIVnNSiTUQkV1UrkiyzwZBwrKRk4+54fEkK2ZFKvD7zTIi3FB6wMNUBDL2QbMXQAVjv\n2nOjTe8AAA3mSURBVN+ArSwi1nGC9u0UkUJV3RGoICIXAe8bpWCoN+ohVlJdYVlg+aPvZwuWz6rW\nuaYr7lFCussaiWQrhkj2q3CHQHgdcddxzEgzgJ9Gu4jlfnvy+fD5fDUU02AIw+cOjW2lSoqohJsn\nwt8+0/lttC7I9vtLBn6/H7/f76luUp3PItIbsFR1gLN/I/YaiNtddf7l1HnLyf+wWVUPc8qOBF4C\nxqjqm1GuYZzPhjrHBNEzJEI8H1U6xIKK5XzOSfK1VwJdRKTYmX00HHg6rM4zQCCC68XAywAi0gp4\nFrgxmlIwGGrLzJl2hE+R9PQhxMNnWcEtW7Es+/sJ37L4ltOGpJqSHJ/BdcDzVE1X/URESoGVqvos\nMBuYKyJrge3YygPgl8DRwE0iMg3bvNRfVbclU2ZDwyBWZE+DIVHcU4YDW+hxq75FqhFJX+Cmqs8B\nx4QdK3F93gcMjXDercCtyZbP0DDJdKWQiVMgDZmDWflsaPBE6mNNrKTU437TrlaWBjb6REj3dQ5J\nX/mcbIzz2VAbIq2sTTcCnUeg43Dvp3vHkmwyfXJAOnx/KVv5bDCkK15W1hoMySLdlXmyZyUZMhjL\nbyGlUm2rjwU7M1+fScsZLZN2PcsCfBalkpr7SxS/ZQW3hk4mfF+ZhhkxGNISa7kVM9xBPBvzzJmR\nZx5lUrL58E7fKAEX+/KgSe1/H6kmHUxJsTCKwZCWxIuBEy8ncKZPR033jiPl+C07bEkU5WByRieG\ncT4b0pJ4zkV3OZZWGwlYFpSVwZw5oedlyojBKIbYxJs8kOnO6frAOJ8NDY5AX/rww6mUwhuR8ij4\nsDJCgRmyE6MYDLUi2TZcs47AEItMn1WW7iNCoxgMtSLZNtyatJmJlkTLspPpQFU+hSplawUT7YCx\nkUciDfvSrMIoBkNE0n1WR19N7JUxne4vaELyV+1nYz6F+iTdR5zpOEpwY5zPhojUxPmbic69dJA/\nEzN7GbIH43w2GNKQhpZcJxlYVmga1gDpPvvM+BgMhgaKiXVk8EI6jhyNYshQZr4+M2R1cEnfknr9\nIUWz4Vp+K8Qx7a5fE/nSyQdgMNQ16Z4T2iiGDCVeyIikXz+JnbVlQalk98pVM0qoG2KF5jbUHqMY\nMpR4SiHRN+5kz+pI1JSS6Pl1fX9eFqkZZVB/pPuIM3SVvhWciWZZtrw+y8Lnt/D5UiO/UQxZQKRZ\nNbVZZxDqyHOdUwNHnuWzol4vpH3LbW7y2LiL5ZLY+Yn+s7nXIQQ6/MDaA8tnBcsC+4b6xcRKSgyj\nGDKUVM/TDo9LVNdtR5ppYjBkC/H+Z4KLHn3JliQyRjFkKKl+C3J33PVtIbEsIOLs6+QQbXaRzxcq\nk3tRmjEbGWpC+M8l1T8foxgaKJHe+OvSkRevfYkzIkh0ZXN9YNYhGJJFqqczG8WQQYSbWPLy7GOT\nJtW8rWS/8Sfafn38M3hdZ2DIbMzMpZqTdMUgIgOAu7DTiM5W1dvDyhsDjwA9gW3AMFVd55RNAS4D\nKoGJqvp8suXNJPbsia4Y4vsg/IAvamk6R0+1LMDv7fxIs4UA8FmU7Szz1IZbSfn9fmMmqgV+vx+f\n2/aWZHJfL6Fiv7PTt3p5Mn1kdUHgNzb2rrFYfqveF78lVTGISA5wD3AOsAlYKSKLVXWNq9rlwA5V\n7Soiw4A/AMNF5HhgKHAccCTwooh0NYGRQomWpSz+D8dPLMWQyKwOL/9oCc8Kcp0f680fQmcLBfaX\nLy+FnRF6DIdonX99d3DZQn0/txn9raosfhG+5lT6yLxiWeD3lzG2R6eqfUJ9W8kiJ8nt9wLWqmq5\nqlYAC4AhYXWGAIE8WwuBs53P5wMLVLVSVcuAtU579Yrf70/aebHqWBaMHeuv9majCq+84qdviRXc\norUVfqy29xKJkpKqLTL2tfLyvLXnsyx6jB0bsu8257j3/X5/tXI3O8vKIksUfv+dlwPLq8oty96S\n+NziUZtreT0nXr1o5bX5baX6mU2aBLt32/8v0Tv+6ud5bb+2ZXX13AK//2SZPJNtSuoArHftb6B6\n5x6so6oHRGSXiBQ6x99w1dvoHKtGMFLml86rQbmvKicsUNLXfnvodP1YyneWOR2Cx/p+P/ysvObt\nvwJ0il3/ghuvZ9exraLLU2xBZx+WM3Ut2H7Zcujnqo/9gxr7sJ/ycuxzIXh+377OvP9/FkOPTvb1\n+gKtymBXJwLrAKrNtvky9FXL/SZuWW4HWdj5WICfnLP9HNapenm4Dd/ng+VlfvigrOq7LOtLcatO\nRCL8n6dsZxnlO13nflAMdLKH4JYVnC3k9/uxLB++h/1QHjg5cvvut9v6fNutzbW8nhOvXrTySMfj\nPaN0emYRw7RYwEN9odxfzQdRrf4r2P9v/hLwWyEB+vx+P378EcPABNqPWT/QNoH2oaTEF6zfyRnV\nS6kEzafLpRTK+sLOTrCrE53GWnTqVDXKjdfPFY+x68ciqWG3ReQioL+qXunsjwROVdWJrjofOXU2\nOfuBkcEtwOuqOs85/ndgiar+M+waxrRkMBgMtSBVYbc3AEWu/SOxfQ1u1gMdgU0i0ggoUNVvRGSD\nczzWuVFvzGAwGAy1I9k+hpVAFxEpdmYfDQeeDqvzDDDG+Xwx8LLz+WlsJ3RjEekMdAHeTrK8BoPB\n0OBJ6ojB8RlcBzxP1XTVT0SkFFipqs8Cs4G5jglpO7byQFVXi8jjwGqgArjWzEgyGAyG5JPxqT0N\nBoPBULck25RkMBgMhgzDKAaDwWAwhJC1ikFEjhWRe0XkcRG5OtXyZAoiMkREHhCR+SLy01TLkwmI\nSGcR+bvjEzN4QESai8jDInK/iFySankyhfr6rWW9j0FEBJijqqNTLUsmISKtgDtU9YpUy5IpiMjj\nqjo01XJkAs6apm9UdYmI/H979xciVRnGcfz7s4y1KMIuQpPqIk0qwQrKsCKjMoi9SI2UtJBAKLCL\nsLqoIBKifxQhlheVkqSSlUgq9Ef7QwRBmmVqFKiVEdpfIQ2p7enivOOeM85sO7O7s2dnf5+b2Xnf\n95x99uHsPHvO2fO+ayJi9mDHNJQM9LFW+jMGSS9JOiDpy6r2GyV9LekbSQ/U2bYT2ABsakWsZdKX\nvCUPAUsHNspy6YecDVtN5G4c3bMidLUs0JIp6zFX+sIALAem5xtyk/NNBy4E5kiamPrmSXpG0piI\neCsibgLmtjroEmg2b2MlPQ5siojtrQ56kDV9rFWGtzLYkmkod2RFYVxlaKuCLKFG83Zs2EAGVfrC\nEBEfA79XNdednC8iVkbEvcAESc9JWgZsbGnQJdCHvM0kmw13lqQFrYx5sPUhZ0clvQBMHq5nFI3m\nDlhHdowtJXvIdVhqNG+SRrfiWBuqC/X87+R8EVGcOtOgd3lbAixpZVAl15uc/Qbc1cqghoi6uYuI\nI2RrrdjxespbS4610p8x1FHrNKq976L3D+etcc5Z85y75gx63oZqYejN5Hx2POetcc5Z85y75gx6\n3oZKYRDFKtqbyfnMeWuGc9Y85645pctb6QuDpFXAJ2Q3k7+XND8iuoCFZJPz7SRb6W33YMZZNs5b\n45yz5jl3zSlr3tr+ATczM2tM6c8YzMystVwYzMyswIXBzMwKXBjMzKzAhcHMzApcGMzMrMCFwczM\nClwYrG1J6pK0TdLn6fX+wY6pQtJaSeemr/dJ+rCqf3v1HP019rFH0viqtmclLZJ0kaTl/R23DQ9D\ndXZVs944HBGX9OcOJZ2Qnkztyz4uAEZExL7UFMCpks6KiB/T3Pu9efJ0Ndl0CYvTfgXMAq6IiP2S\nzpI0LiL29yVeG358xmDtrOZiJpL2SnpE0lZJX0iakNpPTitqfZr6OlP7HZLWS9oMvKfM85J2SXpH\n0kZJMyRdK+nN3Pe5TtIbNUK4DVhf1fYa2Yc8wBxgVW4/IyQ9meLaLqmy3OqaNLbiamBvrhBsyO3T\nrNdcGKydjaq6lHRLru9gRFwKLAMWpbYHgc0RcTlwLfC0pFGp72JgRkRMA2YAZ0fEBcA84AqAiNgC\nTJR0RtpmPvByjbimAltz7wN4Hbg5ve+kuHjNncAfKa7LgAWSzomIHUCXpElp3Gyys4iKz4CrekqQ\nWS2+lGTt7EgPl5LWpdetdH8g3wB0SrovvT+J7umP342IQ+nrK4G1ABFxQNL7uf2uBOZKWgFMISsc\n1cYAP1e1/Qb8LulWYBfwV67vBmBSrrCdBowHviM7a5gtaRfZKl8P57Y7CIyt+dOb9cCFwYaro+m1\ni+7fAwEzI+Lb/EBJU4DD+aYe9ruC7K/9o8DaiPi3xpgjQEeN9teApcDtVe0CFkbEuzW2WU02C+dH\nwBcR8Uuur4NigTHrFV9KsnbW6ILpbwP3HNtYmlxn3MfAzHSv4UzgmkpHRPxEtqjKg2RFopbdwHk1\n4lwHPEH2QV8d192STkxxja9c4oqIPcCvwOMULyMBTAC+qhODWV0uDNbOOqruMTyW2uv9x89iYKSk\nLyXtAB6tM+4NslW2dgKvkF2OOpTrfxX4ISK+rrP9JmBa7n0ARMSfEfFURPxTNf5FsstL21Jcyyie\n7a8Gzqf78ljFNGBjnRjM6vJ6DGZNkHRKRByWNBr4FJgaEQdT3xJgW0TUfI5AUgewJW0zIL+AaeWv\nD4Ar61zOMqvLhcGsCemG8+nASOCJiFiZ2j8D/gSuj4i/e9j+emD3QD1jIOk8YGxEfDQQ+7f25sJg\nZmYFvsdgZmYFLgxmZlbgwmBmZgUuDGZmVuDCYGZmBf8BTJpf8CIqdVoAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb index 7df67ce4d5..c6bf077f82 100644 --- a/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb +++ b/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb @@ -456,7 +456,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -512,8 +512,7 @@ "one_group.group_edges = np.array([energy_groups.group_edges[0], energy_groups.group_edges[-1]])\n", "\n", "# Instantiate a 6-group DelayedGroups object\n", - "delayed_groups = openmc.mgxs.DelayedGroups()\n", - "delayed_groups.groups = range(1,7)" + "delayed_groups = range(1,7)" ] }, { @@ -608,8 +607,8 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.8.0\n", - " Git SHA1: c23c1cabfbb8c726ee0b4bd01bb7e74e679edcd0\n", - " Date/Time: 2016-08-03 15:59:52\n", + " Git SHA1: ad9fe27d26940a7120ed920d37d9cb176bde6402\n", + " Date/Time: 2016-08-06 15:52:56\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -714,20 +713,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.1300E-01 seconds\n", - " Reading cross sections = 2.3300E-01 seconds\n", - " Total time in simulation = 7.3036E+01 seconds\n", - " Time in transport only = 7.2812E+01 seconds\n", - " Time in inactive batches = 4.9340E+00 seconds\n", - " Time in active batches = 6.8102E+01 seconds\n", - " Time synchronizing fission bank = 5.0000E-03 seconds\n", + " Total time for initialization = 4.2200E-01 seconds\n", + " Reading cross sections = 2.3800E-01 seconds\n", + " Total time in simulation = 7.5197E+01 seconds\n", + " Time in transport only = 7.4942E+01 seconds\n", + " Time in inactive batches = 4.8400E+00 seconds\n", + " Time in active batches = 7.0357E+01 seconds\n", + " Time synchronizing fission bank = 4.0000E-03 seconds\n", " Sampling source sites = 4.0000E-03 seconds\n", " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 2.0400E-01 seconds\n", - " Total time for finalization = 7.0000E-03 seconds\n", - " Total time elapsed = 7.3477E+01 seconds\n", - " Calculation Rate (inactive) = 5066.88 neutrons/second\n", - " Calculation Rate (active) = 1468.39 neutrons/second\n", + " Time accumulating tallies = 2.1900E-01 seconds\n", + " Total time for finalization = 8.0000E-03 seconds\n", + " Total time elapsed = 7.5653E+01 seconds\n", + " Calculation Rate (inactive) = 5165.29 neutrons/second\n", + " Calculation Rate (active) = 1421.32 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1250,7 +1249,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 24, @@ -1261,7 +1260,7 @@ "data": { "image/png": "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\nDmZmZmZmZmbW5TzgYGZmZmZmZmZdzgMOZmZmZmZmZtblPOBgZmZmZmZmZl3OAw5mZmZmZmZm1uU8\n4GBmZmZmZmZmXc4DDmZmZmZmZmbW5TzgYGZmZmZmZmZdzgMOZmZmZmZmZtblPOBgZmZmZmZmZl3O\nAw5mZmZmZmZm1uU84GBmZmZmZmZmXc4DDusJSZMlnZlx2ycl7d/dfapqcz9JT/Vkm2ZmPck5bGZW\nPmexWXPxgEMdkuZLelXSy5Kel3S9pJ0y1jpIaouyO9CI9N91ZdZfYmbWGOdwt1gnc7jqZ+FlSTeV\n3Sez3sJZ3C3WySwGkHSKpCck/UvSo5KGlt0na24ecKgvgEMiYnNgB+AfwIUZa8U6HCTNTlJrCW32\nAS4A7u7pts16Medwkyohh1f9LKSP0T3cvllv5ixuUj2dxZI+C3wGOCgiNgU+DPxfT/bB1j0ecOiY\nACLidWAqsOuqFVJfSedKWiDpGUk/krShpI2BG4EdJf0zHQ3uL+ldkv4iaamkpyVdmP4RW6xj0h6S\n7pP0kqQpwEZV6z8s6YG0vTskvb3Ofur2S9JFks6t2n6apC+mz3eQNFXSPyT9XdIXKrbbSNLPJb0g\n6RHgXZ28n1GS5qb9+KGkGZKOTdeNS9/D+ZKeB8Yr8Y101P3ZtK3N0u3XGk2vnDInabyk30iakv77\n/FXS7p185F8GbgbmdrKdmXUt57BzeNUuOllvZt3HWdzLs1iSgG8CX4qIxwAi4smIeLGj92PmAYcM\n0sD8BHBXxeJzgKHA7ul/dwS+GRGvAgcBiyNis/SbmGeBNuC/gH7A3sD+wIkF+7MBcA1wWbq/3wAf\nq1i/JzAJOD5d/xNgWlpXraN+XQaMrdjv1un6K9PQuR54gGS0+wDgFEkfSjefALwxfRwIjOvg/Wyd\nvofTgK2Bx9K+VHo38DdgW+DbJKOrnwL2A94EbAb8sGL7zkbTDwV+DWwF/Aq4VnVGiSUNTts7Ex/w\nmpXCObxqv70yh1NXSFoi6aYMgxNm1g2cxav22xuzeED6eLukhenAyoRO9m0GEeFHjQfwJPAy8AKw\nHFgE7Fax/l/AGyte7w08kT7fD1jYyf5PAa4u2Lf3AYuqlt0JnJk+vxiYWLV+LvC+ive2f5Z+AY8C\nB6TPTwJuSJ+/G5hfVXs6MCl9/nfgQxXrjq/3mQCfBO6sWrYQODZ9Pq5GW7cC/1nx+i3AMpJBtLU+\n/8r3DIwH/lKxTsBiYJ86/bsW+Hj6fHL75+yHH35078M5vOq1czj5t92Q5JvL04FngM3L/hn1w4/e\n8HAWr3rdq7M4/XddSTK4shkwmGRA5Liyf0b9aO6HZzh0bExE9AP6Al8A/iRpO0nbAhsD96XTo14A\nfk8yElmTpGFKLrLzjKQXSUYkt6mz7Y8qpp6dXmOTHYGnq5YtqHg+GPhye98kLSUZkdyxQL9+AfxH\n+vw/0tcAg4Cdqto4A9iuoo+L6vSv1vupvqDQoqrX1et3rNrnAmADYPsO2qm5v4iItL1an89HgM0i\nYmrG/ZpZ13IO9/IcTtffFRHLIuK1iPgO8CLJHxpm1jOcxc7if6f//W5E/DMiFpDMGDk4YzvWS3nA\noWPt56tFRFxDMtVqX5KLo7xKMrrbL31sGRFbpHW1pi79CJgDvDkitgS+Tp3p+RHx+Vg99ew7NTZ5\nBqi+OvCgiudPAd+u6NtWEbFpRPy6QL9+CYxJp6/uDFxX0cYTVW1sEREfSdcvBgZW7Gdwrfda8X4G\nVi0bUPW6+jNdXLXPwSSj7kuAV0h++QGrLqizbVX9wIr1SttbXKNv+wPvTH/5PEMyjfC/JF3Twfsx\ns67jHHYO1xL4FDeznuQsdhY/BrzeQd/NavKAQ0aSxgBbArPT0b9LgAvSkV0k7SRpVLr5EmBrSZtX\n7GIz4OWIeFXSzsDnG+jOXcAKSV+Q1CrpcGBExfpLgP+UNCLt2yaSDpa0SY19ddiviHga+CtwOcm0\nsmXpqnuBlyV9VcnFcFol7SZpr3T9b4AzJG0paQBwcgfv53fA2yQdmu7nZDoflf0V8CVJQyRtSjIK\nPSUiVgKPAxtJOkjJxX6+QTIiX+mdkg5Lg/dLwGvUvgPFN0impr0jfUwj+Xw/00n/zKyLOYd7Zw5L\nGijpvZI2UHIhuq+QfHt6Zyf9M7Nu4CzunVkcEf8GpgBflbRp+l6OJznFwqwuDzh07Pp0CtdLwLeA\nT0VE+10KTiO5YMvd6bSr6SR/mBLJlVt/BTyRTq3qD/w/4BhJL5NMP5pStFMRsRw4nOSP3heAI4Cr\nK9bfRxIAFymZ2vY4a16gpnJkNEu/LgPexuqpY6Qh9hFgOMm5YP8gCfX2XygTSc45exK4qbK2xvt5\nPn0P3yMZKd+ZJNCX1asBLiUJ/D+RnBv3KvDFdH8vk1zkZxLJtLB/svZ0tOtIZissBY4BPhoRbTX6\n9kpE/KP9QTKd7JXwFXnNeopzONFrc5jkj4AfkXzOi4BRwOiIWNpB38ysazmLE705iyE5neYVkhkQ\ndwK/jIifd9A3M5QMTJrVJ+l9wOURMaSH2hNJGB4dEbd3w/7Hk0yX+1RX79vMrDs4h83MyucsNsvP\nMxysQ0puG3QKyUhtd7YzStIWkjYkOWcOap/iYGbWqziHzczK5yw2K8YDDlZXev7aUpJzx77fzc3t\nTTIN7B/AISRXQ+5o+piZ2XrPOWxmVj5nsVlxPqXCzMzMzMzMzLqcZziYmZmZmZmZWZfr090NSPIU\nCrMmEhGF7l2/pRQvZd98QU9dUMk65xw2az5FsjhnDoOzuKk4i82ai4+Je0a3n1IhKY6Jn9Zc99CE\naew+4dC1li9iQKG2fhVH5a7Z8cpid9U68+iv5K755o3fq7/yiglwzISaq8495KTcbT0Wb81dc8nC\nYrdBPn7Qj3LX/Pz5T9dd13bO2bR+9Yya615v2zJ3WxybvwRIbkSUU9yYv+Yrs8+su+4vE27jvRP2\nr7nu3Cu+mbstfbJ4uEqKszJu+w2Kt2NdT1J8Ki6uuW7WhBsYPuHDNdctKPD78bq2MblrALb8Q/7T\nU7896tRCbX19+vm1V1w+AT45oeaqnxyY/wLeD8Xbc9cA/PSFE3LXHNdvUqG2Jj1/XM3lXZ7DUHVH\n+4z65S+J3xdoB/jKovxZXCSH2eFA9MGbC2VknhwGZ3GzKZLFRXIYimVxkRyGYllcN4ehbhYXyWEo\nlsVFchiKZXG9HIZuyOIeymEolsVFchh8TNzsGjqlQtJoSXMlPS7ptK7qlJk1pw0yPqxnOYvNeo+s\nOews7lnOYbPexTmcXeFTKiS1ABcBBwCLgZmSrouIuV3VOTNrLt1+Dpbl5iw2612cw83HOWzW+ziL\ns2vksxoBzIuIBQCSpgBjgMzhuv3I/NP+11tvH1l2D5qG9tm37C40jYEj31h2F9bwhrI7YLU0lMX9\nR76lG7u2jtl9ZNk9aBrO4TU1UxY7h5tSw8fEzuIKzuJVnMWrNVMOg7M4j0YGHHYCnqp4vYgkcDPz\ngEMFh+sqLfu8r+wuNI1mC1dPDWtKDWWxD3IrvGNk2T1oGs7hNTVTFjuHm1LDx8TO4grO4lWcxas1\nUw6DsziPRgYcal38ouYVKB+aMG3V8+1HvtUDDWY9ZMac5NFVPH2sKWXK4lkTblj1vP/It/jg1qwH\nrZHFm/6toX05h5tS5mNiZ7FZOXxMXJ5GPqtFwKCK1wNIzltbS607UZhZ9xu5S/JoN/GaxvbX6Giu\npNHABSQXrJ0UEd+tWt8X+AXwTuD/gE9ExMJ03Rkk9xxZAZwSEdMlDUi37w+0AZdExA/S7d8B/BjY\nCFgOnBgRf5X0VmAysCfwtYjo4FLZ64RMWVzvThRm1v3WyOIdhjLx8r8X3ldXfKvW1VmcLp8EfBhY\nEhG7V+zrHOAjwDLg78BnIuJlSX2An5FkcStweUR8J0v/mlDmY2JnsVk5mu2YuDdp5C4VM4Ghkgan\nv5jGAtM6qTGzdVifjI9aKi6qdSCwG3CUpOqbjx4HvBARw0gONs9Ja3cFjgR2AQ4CLpYkkgPeUyNi\nV2Bv4KSKfZ4DjI+IPYDxQPt9aV8AvlDxel3nLDbrRbLmcA9nMSQDuQfWaHI6sFtEDAfmAe33+DsC\n6JsOTuwFnCBpUMb+NRvnsFkv00gO9zaFBxwiog04meQXyaPAlIjowokqZtZsGrwF0KqLakXEcqD9\nolqVxgCXpc+nAu03XD6UJGNWRMR8koPWERHxbETMAoiIfwFzSM6lBVgJbJE+3xJ4Ot3uuYi4j2Sw\nYp3nLDbrXbrgtphdnsUAEXEHsLS6sYi4NSJWpi/vJvn2H5JTDjaR1ApsTDID4uWM/WsqzmGz3se3\nxcyuoYGXiLgJ8AUZzHqJBoMzy0W1Vm0TEW2SXpLUL11+V8V2T7N6YAEASUOA4cA96aIvATdLOo/k\n/Nr3Ntb95uUsNus9uuAAtluzuBPHkgwgQDKQMQZ4huSC71+KiBclNXwBxjI4h816Fw8mZOeZHmaW\nWYOBkeWiWvW26bBW0qYkB6+npDMdAD6fvr5W0seBS4EP5e61mVkT6SiHH0ofnei2LO6wUenrwPKI\nuDJdNIJkpll/YGvgz5JubaQNM7Oe4j+is/NnZWaZ1RvNfTB9dCLLRbWeAgYCi9NptltExFJJi9Ll\na9WmFx6bSnLBsesqthkXEacARMTU9IJmZmbrtI6+VXtn+mh3Ze3NuiWLOyJpHHAwq0/NADgauCk9\n3eI5SXeSXMsh8wUYzczK4hkO2SmieweNJcWK52sNVtd3Rr/xhdrambm5a/aI+wu19X1OyV1z6b0n\nF2rrj+9+T+6aGzk4d82y6Ju7BuBBDc9d87G4ulBb961xKJXNhiwr1NZbeKxAW6/nrhnF9Nw1ANtt\nsCB3zTZtEBH5/odMSYo7Mm67L2u3kx60PgYcQDKF9l7gqMrzXCWdCLwtIk6UNBY4LCLGphcquwJ4\nN8n03VuAYRERkn4B/F9EnFrV3qMkd6a4XdIBwHci4l0V68cD/4qI8/J8DusiSdG2MP8/++kD82fx\nbvFo7hqAdzEzd803ObNQW1f9flzumnsO3r3zjar8peBZPE/FwM43qvKw3laorSJZfAfF7gu/Gf/M\nXfN2Hs5d00Zr7hqAj1Hg91LLC7lLNjzwQLa7+eZCWZwnh6FnszitGwJcHxFvr9jXaOA84P0R8XzF\n8q8Cb42I4yRtkvbjSGBuZ/1bVxXJ4iI5DMWyuEgOQ7EsvuqWAjk8Kn8OQ7EsLpLDALMKHBMfGb8u\n1FaRLO6pHIZiWVwoh6FQFg+kvGPidB/dcbegmvuUNBnYD3iJZMbYpyPiIUmHAt8iue7ZcpJT2+5M\na34PvAf4c0Q0dMtJz3Aws8waCYz0POD2i2q1B+EcSROBmRFxAzAJuFzSPOB5kit9ExGzJV0FzGb1\nLS5D0j7AMcDDkh4gCdGvpefSfg74fnpw/Vr6GknbA38FNgNWSjoF2LXiVAwzs6bV6IFbd2QxgKQr\ngZHA1pIWktwlaDJwIdAXuCW9ocXdEXEi8ENgsqRH0q5Nikj+Sq7VvwbftplZl2okiyvuxnMAyQyu\nmZKui4jKb89X3S1I0idI7hbUPvDbfregAcCtkoaRnI7W0T6/HBHVNwO9NSKmpX16O3BVul/S9jYG\nTmjgrQIecDCzHBqdPlbroloRMb7i+TKSEK1VezZwdtWyO6H2EHq6bq8ay5ew5pRgM7N1RldM4+3q\nLE6XH11n+2F1lr/SQRu+AKOZNbUGs3jV3XgAJLXfjadywGEMyW3dITl1+ML0+aq7BQHz04HhESQD\nDh3tc627U0bEqxUvNyWZ6dC+7o+S9mvkTbYrfFtMM+t9fM9hM7NyZc1hZ7GZWfdpMIdr3Y2n+o4/\na9wtCKi8W1Blbfvdgjrb51mSZkk6T9Kq8RJJh0maA1xPcppGl/PvIzPLzBfIMTMrl3PYzKx89bL4\n3vTRie64W1CtiQTt+zw9IpakAw2XAKcBZwFExLXAtZL2TZd1+R3dPOBgZpk5MMzMyuUcNjMrX70s\nfm/6aHdx7c26425BqrfP9HRiImJ5egHJL1d3KCLukPRmSf0iIv9VODvgUyrMLLMNMj7MzKx7ZM1h\nZ7GZWfdpMIdnAkMlDU7vRjEWmFa1zfVA++1cjgBuS59PI7l4ZF9JbwSGkkyqqLtPSf3T/wo4DHgk\nff3m9sYk7QlsUDXYIGrPqMjFA+VmlpkPYM3MyuUcNjMrXyNZ3E13C6q5z7TJKyRtQzJ4MAv4z3T5\nxyR9Cngd+DcVF/KV9CeSi/dumt556LiIuKXI+/WAg5ll9oasibGiW7thZtZrZc5hcBabmXWTRo+J\nu+luQTXv8BMRB9TZzzkkt7+ste79tXuenwcczCyzPh5wMDMrVeYcBmexmVk38TFxdh5wMLPMNmgt\nuwdmZr2bc9jMrHzO4uw84GBmmeX6Zs3MzLqcc9jMrHzO4uz8UZlZZhs4MczMSuUcNjMrn7M4ux75\nqFr+ELm2n3PELoXaGR4P5K7Z8xNzC7Wlr+V7TwCTR3y+UFt/ia/krvnf076Wu6btu8XuerL5K8/l\nrvnHxtsWamsuw3PXtLQ+X6gtXdIvd03bBwrMrzojfwnAkuWb5y9qeblYY+08fWydpZw5DPDIp9+W\nu2Y4+XMYYLcxT+Su0Zn53xOADvqP3DW3Fsjh8V+ueR2mTrWdlz+LdyT/5wfwAlvnrrmfvQu11VIg\nP3R5/n/jtncVDKoT85e8vDz/YVQftTZ29OUcXqflzeIiOQzFsni3jxXLEX0z//+n+lDP5DAUy+Ii\nOQzFsvjHFPv74EFG5K7pqRyGgln8xUJNFcpiNmjw4grO4sw8NmNm2TkxzMzK5Rw2Myufszgzf1Rm\nlp0Tw8ysXM5hM7PyOYsz80dlZtltWHYHzMx6OeewmVn5nMWZecDBzLJzYpiZlcs5bGZWPmdxZv6o\nzCw7J4aZWbmcw2Zm5XMWZ9ZSdgfMbB3SmvFhZmbdI2sOd5DFkkZLmivpcUmn1VjfV9IUSfMk3SVp\nUMW6M9LlcySNqlg+SdISSQ9V7eucdNtZkq6WtHm6/GhJD0i6P/1vm6TdJb1B0g1pzcOS/qf4h2Vm\n1k18TJyZBxzMLLs+GR9mZtY9suZwnSyW1AJcBBwI7AYcJWnnqs2OA16IiGHABcA5ae2uwJHALsBB\nwMWS2u8fODndZ7XpwG4RMRyYR3oz6Ii4MiL2iIg9gU8CT0ZE+2DF9yJiF2APYF9JtfZrZlYeHxNn\n5gEHM8uuwXDt6m/VJA2QdJuk2ek3YV+s2P4d6T4ekHSvpHdVrPtBuq9ZkoY3+KmYmfWcBgccgBHA\nvIhYEBHLgSnAmKptxgCXpc+nAvunzw8FpkTEioiYTzKAMAIgIu4AllY3FhG3RsTK9OXdwIAafToK\n+FW6/b8j4vb0+Qrg/jo1Zmbl8YBDZh5wMLPsGpg+1k3fqq0ATo2IXYG9gZMq9nkOMD4i9gDGV+zr\nYODNaRsnAD8u/oGYmfWwxk+p2Al4quL1onRZzW0iog14SVK/GrVP16jtyLHA72ss/wTpgEMlSVsC\nHwH+kKMNM7Pu51MqMvOAg5ll12TfqkXEsxExCyAi/gXMYfXB70pgi/T5liQHxu37+kVacw+whaTt\nM38GZmZl6iB7Z/wLJixa/ahDNZZFxm2y1NZuVPo6sDwirqxaPgJ4JSJmVy1vBa4ELkhz38yseTTZ\nrN+O9ilpsqQnKq6bs3u6/GhJD6Yzfu9oX56u+5KkRyQ9JOkKSX0b+ajMzLLZqKHqWt+qjai3TUS0\nSar8Vu2uiu3W+lZN0hBgOHBPuuhLwM2SziM5SH5vnX6072tJkTdlZtajOsjhkf2TR7uJC2putggY\nVPF6ALC4apungIHA4vQP/y0iYqmkRenyjmrXImkccDCrB5ErjaXG7Abgp8BjEXFhZ/s3M+txDRwT\nV8z6PYAkQ2dKui4i5lZstmrWr6RPkMzUHVs163cAcKukYSTHuh3t88sRcU1VV54A3h8RL0kaTZK7\n75G0I/AFYOeIeF3Sr0my+hdF3q8HHMwsuzpTw2Y8nzw60W3fqknalGRGxCnpTAeAz6evr5X0ceBS\n4EMZ+2Fm1pwan6I7ExgqaTDwDMlB5FFV21wPjCMZwD0CuC1dPg24QtL/kgzUDgXuragTVRmbHsR+\nleSgdlnVOqX7f1/V8rOAzSPiuILv0cysezWWxatm/QJIap/1WzngMIbklGBIjnHbB19XzfoF5ktq\nv5aOOtnnWmc2RMTdFS/vZs0v81qBTSStBDYmw+ByPT6lwsyyqzNdbOT2MGHX1Y868nyrRuW3amlt\nzW/VJPUhCeLLI+K6im3GRcS1ABExFWi/aGShb+jMzJpCgxeNTK/JcDLJ3SMeJTlwnSNpoqQPp5tN\nArZJD2T/Czg9rZ0NXAXMBm4EToyIAJB0JfAX4C2SFkr6TLqvC4FNgVvSqbwXV3Tn/cBTladMSNoJ\n+Bqwa8X032OLfFRmZt2msVMquuNaOp3t86z01InzJG1Qo0+fJb3GTkQsBs4DFqb7fzEibq37bjrR\nIzMcLvn4f+Ta/tYXDyjUzu/6bZK7ZmVboaZoaflW7ppW/XehtjZ/9cu5a+LEFblr+jz7eu4agJWL\nt81ds9+etWZPdq71i/lvKKAD+hVqq+3YWl+Ed6z1tvw/UD+Z8qncNQCH6+pCdQ1pLDG661u1S4HZ\nEfH9qn09LWm/iLhd0gEk131o39dJwK8lvYckRNf70ykuGpf/i8I/vjgyd81N/YrNMSySxUVyGKB1\nh/xZvM3TX8hds+E3X8xdA7B9/DN3zXMLB3a+UQ1HD8qfxa0T9y7Ulqqv2JJB29EFcvjeYr/Yp93y\nwdw1I1+/PXdNi1Z2vlFHuuDILSJuAt5atWx8xfNlJFN2a9WeDZxdY/nRdbYf1kE/bmf16W7ty55m\nPf5CLG8WF8lhKJbFPXpM3EM5DMWyuEgOQ7EsLpLDAK0Tq89K7VxP5TAUy+Jrfj+6UFsHvF7CdWUb\ny+LumPVbKzfb93l6RCxJBxouAU4DzlrVkPQB4DPAvunrLUlmRwwGXgKmSjq6+ho8WfmUCjPLroHp\nY+k1Gdq/VWsBJrV/qwbMjIgbSL5Vuzz9Vu15kkEJImK2pPZv1ZaTfqsmaR/gGOBhSQ+QBOvX0oPp\nzwHfT2dKvJa+JiJulHSwpL8Br5AErJnZusFXPTczK1+904z/ATOe67S6O66lo3r7bP9iLSKWS5oM\nrPo2O71Q5E+B0emsYoAPAk9ExAvpNr8lGRz2gIOZdbMGE6Orv1WLiDupE/npur3qrDs5V8fNzJqF\nj9zMzMpXJ4tH7pg82k2cXXOz7pj121Jvn5L6R8Sz6XVzDgMeSZcPAq4GPhkRf69oeyHJxSM3ApaR\nXIhyZgefRof8a8vMsnNimJmVyzlsZla+BrK4O2b9AjX3mTZ5haRtSGZBzAL+M13+30A/4OJ0MGJ5\nRIyIiHslTQUeSNt4gGQWRCH+tWVm2Xkqr5lZuZzDZmblazCLu+laOmvtM11e8wKJEXE8cHyddROB\nifXfQXYecDCz7JwYZmblcg6bmZXPWZyZPyozy67YDQjMzKyrOIfNzMrnLM7MAw5mlp2n8pqZlcs5\nbGZWPmdxZh5wMLPsnBhmZuVyDpuZlc9ZnJk/KjPLzolhZlYu57CZWfmcxZn5ozKz7Dx9zMysXM5h\nM7PyOYsz84CDmWXnxDAzK5dz2MysfM7izPxRmVl2Tgwzs3I5h83MyucszqxHPqoTbvxFru0POWhq\noXZ+FxvmrmktPB3mm7kr4hAVaumlK/rnrvnQsdNy19zy4KG5awD4Uv6SXW+fXaipDb8PWkPuAAAg\nAElEQVT1Qu6avTe/q1BbrRsenLtm9LJrctfsp9tz1wCMYnqBqvcXamsVh+s664vTLsldM/oj+X+e\nb4piPySFsnij/DkMEAfkz+Lnfjsod80hhxf8Xfbox/MXfbVQUwz/3azcNVt94+lCbY1ouTd3TesW\nh+WuOeSlYp/73sr/u+LDfW/IXfMutgFuyl23inN4nZY3i4vkMBTL4sLHxAWyuKdyGIplcaEchkJZ\n/PbfPVyoqSJZ3FM5DMWyeF/9uVBbRbIY8h/nr8FZnJk/KjPLLv+YnpmZdSXnsJlZ+ZzFmXnAwcyy\nc2KYmZXLOWxmVj5ncWb+qMwsO1+R18ysXM5hM7PyOYszaym7A2a2DumT8WFmZt0jaw53kMWSRkua\nK+lxSafVWN9X0hRJ8yTdJWlQxboz0uVzJI2qWD5J0hJJD1Xt65x021mSrpa0ecW63SX9RdIjkh6U\n1Leqdlr1/szMmoKPiTPzgIOZZedwNTMrV4MDDpJagIuAA4HdgKMk7Vy12XHACxExDLgAOCet3RU4\nEtgFOAi4WFL71f8mp/usNh3YLSKGA/OAr6X7agUuBz4XEW8DRgLLK/r5UeDlzj8QM7MS+Jg4Mw84\nmFl2rRkfZmbWPbLmcP0sHgHMi4gFEbEcmAKMqdpmDHBZ+nwqsH/6/FBgSkSsiIj5JAMIIwAi4g5g\naXVjEXFrRKxMX94N7JQ+HwU8GBGPpNstjYgAkLQJyT2wzur4wzAzK4mPiTPzgIOZZddk03glDZB0\nm6TZkh6W9MWK7adIuj99PCnp/nT5BpIulfSQpAck7dcFn4yZWc9o/JSKnYCnKl4vYvUgwFrbREQb\n8JKkfjVqn65R25FjgRvT528BkHSTpL9K+krFdt8CzgX+nWPfZmY9p8mOiTvap6TJkp5Ij3vvl7R7\nuvzo9HS2WZLuaF+erpufrntAUv77qVbwRA8zy66BxKiYxnsAsBiYKem6iJhbsdmqabySPkEyjXds\n1TTeAcCtkoYBK4BTI2KWpE2B+yRNj4i5ETG2ou1zgRfTl8cDERG7S9oW+D2wV/F3ZmbWgzrI4Rmz\nk0cnVGNZZNwmS23tRqWvA8sj4lfpoj7APiT5+xrwB0l/BV4AhkbEqZKG1GnTzKxczXdMrE72+eWI\nuKaqK08A74+IlySNBn4KvCddtxIYGRFrzVzLywMOZpZdY/ccXjWNF5IZCCTTdivDdQwwPn0+Fbgw\nfb5qGi8wX9I8YERE3AM8CxAR/5I0h+Tbtsp9QhLMI9PnuwJ/SGuek/SipL0i4q8NvTszs57QQQ6P\n3CN5tJt4dc3NFgGDKl4PIDk4rfQUMBBYnF5rYYuIWCppUbq8o9q1SBoHHMzqUzPa+3F7+8GspBuB\nPYFXgD0lPQFsAGwn6baI2B8zs2bRZMfEJAMOHe1zrTMbIuLuipeVp7yR7q9LzobwKRVmll0TT+NN\nvwkbDtxTtfx9wLMR8US66EFgjKRWSW8E3smaB9BmZs2r8VMqZgJDJQ1O7woxFphWtc31wLj0+RHA\nbenzaSTfsPVN83MoUDnVVlTNSEi/NfsqcGhELKtYdTOwu6SNJPUB9gNmR8SPI2JARLwJ2Bd4zIMN\nZtZ0mu+YuLN9npWeOnGepA1q9OmzJLN+2wVws6SZko6v+04y8AwHM8vu/7N372FylGX6x7/3TAgK\nSJaT4BICKAEBF2OQ6HrAAQTxsARRTMBVBFbXRRY07HLyELKyi6IoKLKKhvwwSwwYQAIqBsTxgBwC\nIQgmgQgEEjCRQwABCcnM8/uj3pl0Ot3TVdUz0xNyf66rL7qr66mqbuBO5e330FxiDFg33jScYhZw\nckQ8V7XfUcCPKl5fQtYNbS7wMHAz2dAMM7Ohr8k7t4joknQi2eoRbcDUiFgoaQowNyKuA6YC09Mv\nZ0+SNUoQEQskXQEsIFtR4oSKiR5nkPUk20bSI8DkiJhG9qvccOCGtKDFrRFxQkQ8LekbwB1kXXd/\nGhGVN7tmZkNXnSzu/EP2aGAg7olrdSToOebpEbEiNTR8HziNikl5JR0AHEvWyNvjbRGxPA0/vkHS\nwjQ5cGFucDCz/OrMttt5d65wHZBuvOmXsVnA9Ii4pvJg6RhHkHXTBXpbiSdV7HMz2UzrZmZDXz/M\neh4R1wN7VG2bXPF8FdlQtFq15wDn1Nh+dJ39R/dxHTOAGX28/zCwT733zcxapk4Wrze0rXbCDcQ9\nseodMyJWpH+uljQNOKVnpzRR5MXAoZXzNUREz5DlxyVdTTZso1SDg4dUmFl+dbqLdewLZx279lHH\nQHXjvYSsG+4FNc55MLAwInpDXNIrJW2Wnh9MNolZ9ZwPZmZDU/NDKszMrFlDb2hb3WNK2iH9U8Dh\nwL3p9SjgSuBjEfFAz4klbZZ6D/csU3xIT00Zg/LH0Vvf96tC+//szg+VOk93d/GJjLfterTUuSa0\nXV645jua1HinWufih4VrlG/S6HV0v7FwCQBtmxevWciepc71woitC9e0tT9R6lz6ZfH/nn7KEYVr\n2i/9YOEagK6div/M1XQLYxOJMRDdeCW9HfgocI+ku8i6jp2Zfr0DmMC6wykAXk02Jq2LbNzbx8p/\nqg3Hfof9pnDNL24+vHBNmRwG2GrV8sI1/zL8B6XO9TV9oXDNJ/hu4ZoyOQzQvXfxmraSk1fdyxsK\n1zzRXmQVxLXa2p8tXKNfFP/vaTZHFq4BaL/yw4VrurYq0d1g6/fw9eJVa7khYYNWNIvL5DCUy+Iy\nOQzlsrhMDn+Mcpk/jNWFa8rkMJTL4rL3xGWyeLByGMplcZkchnJZ/HK7JwZqHjOd8jJJ25L1gpgP\nfDpt/yKwNXBRaoxYHRHjgO2BqyVF+qSXRcScsp/Xf2yZWX5NduXt7268EXFzX1cVEev1t0hddF9f\n6MLNzIaKfhhSYWZmTRpi98T1jpm2H1TnOJ8kWy6+evtDZBOx94umGhwkLQGeIZvsp6dFxMxertxE\nOSQ5i802Is7hIck5bLaRcRbn1uxX1Q10VE4wYWYvY69o9QVYHc5is42Fc3iocg6bbUycxbk12+Ag\nPPGk2cbDXXmHKmex2cbCOTxUOYfNNibO4tyaDcYgm3xtrqT1xn+Y2cuMZ0YfqpzFZhsLr1IxVDmH\nzTYmzuHcmv0a3hYRyyVtB9wgaWFErLc+59KzLu19vmXHGxnR0W9zUJhZHzrnQ+fd/XhAB+dQ1TCL\nHz1rWu/zV3WMYcvKRaLNbECtk8Wv/FNzB3MOD1W57omdxWat4Xvi1mnqq4qI5emfj0u6GhgHrBeu\nO511TPUmMxsEHWOyR4//Kr7C6rrcfWxIypPFO5613oIdZjZI1snirXfjv773QJ/798k5PCTlvSd2\nFpu1hu+JW6f0kApJm0naIj3fHDgEuLe/LszMhiB3HxtynMVmGxkPqRhynMNmGyHncG7NfA3bA1dL\ninScyyJiTv9clpkNSQ7OochZbLYxcQ4PRc5hs42Nszi30l9VRDwEeDIGs42Jw3XIcRabbWScw0OO\nc9hsI+Qszs1flZnltmbTVl+BmdnGzTlsZtZ6zuL83OBgZrl1OTHMzFrKOWxm1nrO4vwG5avahSWF\n9r/1jyp1nt/uu1/hmo+0H13qXH9it8I17VdGqXMd9qFNCtdc9fg/F67ZfPg/Fa4B2Panzxeuufik\nk0ud6/vbF/8O39i1R6lz/YIRhWtO5T8L1yz7+DcK1wC0ze4uU1XqXD3WtOetL3NtNpCK5jDA3Pv2\nL1zz27cXz2GA4zc9vHDN4hI5DND+0+I58sn3rypc879LJhWuAdjqNR8sXnNFuf/nzj11cuGar5XI\nYYA3rNmrcM1vu19RuOYMzihcA/CXI84tXNN2Z/Hv/T2bQTNZnD+HwVk89BTN4jI5DOWyuEwOQ7ks\nLpPDx73/xcI1ABcvK37PudV2xXMYymVxmRyGclk8WDkM5bK4TA4DtN3me+KhzG0zZpZb17C8kfHS\ngF6HmdnGKn8Og7PYzGxg+J44v+aadsxso9LV3p7rYWZmAyNvDveVxZIOlbRI0v2STqvx/nBJMyUt\nlnSLpFEV752Rti+UdEjF9qmSVkj6Q9Wxzk37zpd0paQt0/adJb0gaV56XFRRs4mk70m6T9ICSeV+\nbjYzGyC+J87PDQ5mllsX7bkeZmY2MPLmcL0sltQGXAi8B9gbOErS66t2Ox54KiJGA+cD56bavYCP\nAHsC7wUuktQzDnZaOma1OcDeETEGWAzr9LP+U0SMTY8TKrZ/HlgREXtExF7Ar3N+PWZmg6LZe+IB\naviteUxJ0yQ9KOmu1MC7T9p+tKS7U4Pw7yT9Q9o+UtJNqcH3HkknNfNdeUiFmeW2xo0JZmYt1Q85\nPA5YHBEPA0iaCYwHFlXsMx7oGVg+C/h2en4YMDMi1gBLJC1Ox7stIn4naefqk0XEjRUvbwU+VPG6\n3qRdxwG9EzBFxFM5P5uZ2aBoJosrGn4PAh4D5kq6JiIqc7i34VfSBLKG34lVDb8jgRsljSbL076O\neUpEXF11KQ8C+0fEM5IOBb4PvBVYA0yKiPmStgDulDSn6vpycw8HM8uti2G5HmZmNjDy5nAfWbwj\nsLTi9bK0reY+EdEFPCNp6xq1j9ao7ctxwM8rXu8i6U5Jv5L0DgBJPTM2n53eu1zSdgXOYWY24JrM\n4d6G34hYDfQ0/FYaD1yans8CDkzPext+I2IJWc+xcTmOud7f+yPi1oh4Jr28lZTnEbE8Iuan588B\nCymW9evw3wzMLDcPlzAza62+cviWzpe4tbPhBGW1ehVUT3dfb588tbVPKn0eWB0RM9Kmx4BREbFS\n0ljgJ+mXu2Fkv9r9NiJOkfQ54Dzg43nOY2Y2GJq8J67V8Duu3j4R0SWpsuH3lor9ehp+1eCYZ0v6\nIvBL4PTUKFHpX1i3QRgASbsAY4Db8nywWtzgYGa5vcTwpupTd63zyVpZp0bEV6veHw78ENgXeAKY\nEBGPpPfOIPt1bA1wckTMkTQy7b8D0AV8PyK+lfafCeyeDr0VsDIixkoaBvwAGAu0A9Mj4itNfTAz\ns0HSVw7v2zGcfTvWvj5/ygu1dlsGjKp4PZLsL/+VlgI7AY9JagdGpIaBZWl7X7XrkXQM8D7W/kJH\nutldmZ7Pk/QAsHt6/nxE/CTt+mOy7DczGzKavCceiIbfWiMXeo55ekSskLQJ2bCJ04Cze08kHQAc\nC7xjnQvIhlPMIrvvfq7G8XNxg4OZ5TYEx6vVHWMWERMrzv114On08khgeETsI+mVwAJJM3oaNszM\nhrJ+mMNhLrBbmm/hz8BE4Kiqfa4FjiH7RetI4Ka0fTZwmaRvkv2ithtwe0WdqLoZTg3Np5KNE15V\nsX1bsrzvlvTadKwHe84v6YCI+BXwbmBBcx/ZzKx/1cvi2ztf5PbOFxuVD0TDr+odMyJWpH+uljQN\nOKVnpzSB5MXAoRGxsmL7MLLGhukRcU2jD9QXNziYWW5Nzs/Q7xOVRcRtwHLIxphJ6hljVj2pzUeA\nA9LzADZP4b0ZsAp4tpkPZmY2WJqdJyd1zT2RbPWInt5mCyVNAeZGxHXAVGB6ytonyRoliIgFkq4g\nawBYDZwQEQEgaQbQAWwj6RFgckRMI8vx4cANaUGLW9OKFPsD/yVpNVkPtX+NiJ6G4dPT+b8JPE72\ny5uZ2ZBRL4v37diCfTu26H39nSnP1NptIBp+2+odU9IOEbE8rSp0OHBv2j4KuBL4WEQ8UHX+S4AF\nEXFBn19EDm5wMLPchuB4tV71xphJeiewvCJIZ5E1bPwZeCXwuYqbXDOzIa0/5tKJiOupWAUibZtc\n8XwVWUNtrdpzgHNqbD+6zv6j62y/CriqznuPAO+qc/lmZi3XTBYPUMNvzWOmU16WepUJmA98Om3/\nIrA1a5c4Xh0R4yS9HfgocI+ku8h+rDsz/dlRmBsczCy3euF6R+fz3NFZc6xwpQGbqKzBGLOjgB9V\nvB5HNhRjB2Ab4LeSbkwz/ZqZDWmevNfMrPWazeIBavhd75hp+0F1jvNJ4JM1tt8M/feHjRsczCy3\neuPVxnRsyZiOLXtfXzzliVq7DchEZX2NMUvHOIJsgsgeRwPXR0Q38Likm4E3A0tqfjgzsyGkH+Zw\nMDOzJjmL81MaejdwJ5Ci68FaP07W176qu9y5StTd+sY3ljrXL+I9hWu+1H5yqXM92r1P8XPFfxWu\nmfqtEwvXAHzg5FmFa8ZFuZVVfhUdxWs+/P5S5/rsles1HDZ0/kFnFK55501zCtcAfDr+t3DNR9uu\nISKK/Q+ZSIpbYkyuff9R89c7T/rL/31kk0b+mWy82VEV3b2QdALwhog4QdJE4PCI6Jk08jLgLWRD\nKW4ARkdESPoh8ERETKpxzYcCp0XEARXbTgX2iIjjJW2ermNCRNyb/9vYsJTJYYB2rWq803rnKpff\n83b+h8I1v4x3lzrXf7SfX7hmzROvKH6erc5uvFMN519SPEfGHzez1LneyW8L18yOw0qd6zefKP7n\n5umXTm68U5WvvH9K4RqAg352beGa4+KSwjWv4U0c2HZWqSwuksNQO4utdUrdE5fI4excxbO4TA5D\nuSz+j/avFa5Z88SrCtcAfHar4vdzF15yaqlzlcniMjkM5bJ4sHIYymVxmRyGclncynvijY17OJhZ\nbkNtvFqOMWYTWHc4BcB3gGmSehoYpr6cGxvM7OXFQyrMzFrPWZyfGxzMLLcm1xzu9/FqjcaYRcR6\nM5tHxPP1zmFmNtQ1m8NmZtY8Z3F+bnAws9w8Xs3MrLWcw2Zmrecszs8NDmaWW7Prv5uZWXOcw2Zm\nrecszs/flJnl5vFqZmat5Rw2M2s9Z3F+bnAws9wcrmZmreUcNjNrPWdxfm5wMLPcPF7NzKy1nMNm\nZq3nLM7PDQ5mlpvHq5mZtZZz2Mys9ZzF+fmbMrPc3H3MzKy1nMNmZq3nLM7PDQ5mltsqrzlsZtZS\nzmEzs9ZzFufnBgczy83dx8zMWss5bGbWes7i/PxNmVlu7j5mZtZazmEzs9ZzFufnBgczy83hambW\nWs5hM7PWcxbnNygNDjfv8qZC+4+PGaXOc7WOKlzTdt0fSp1Ls6NwTXeXSp1r2zX3FK5ZOfPvC9d0\nn1S4BID2X36ocM0XDvxyqXN9QV8rXNM2rtz3fsH3Ti9c0/3L4uc5jVuLFwG/VkeJqmtKnauHw3XD\nddsu+xSu+UBcXbhmto4sXAPQNv++wjW6pHgOQ7ks3p6HCtc8celOhWsAuo8rXtP+mwmlzvXl/b9Y\n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\n+8b/K1zTdUrx/wY/ru8XrgH4Il8uXLOHlhERxS+S7P/ltuXVoxVq695hi5rnSctiXsDaZTG/Urn2\nu6RNyVaQeBNp7feIWJJqzyBbxWI1a5fFfDvwG+AesiEWAZyZllRD0jTgloi4uOo6jgbOBLqBn0bE\nGcW+jQ1LmRwG0CXFs6fr7aX+82KbrurOLo1t2fZsqXM9pNcXrml/sPj3d96unylcA/BZ/W/hmrZa\nzW05aFLx/Onq+mSpc02Pmqss9ukT515euKbrtHL/DR5b4ns/my8WrtmUA3m1ZpXK4iI5DPWz2Fqj\n1D1xiRyGcllcJoehXBYPVg5DuSwuk8NQLovL5DCUy+LBymEol8VlchjgLM4qXLOrHm/pPfHGxEMq\nzCy37q7mIqO/136PiJuh/jTBEXFsne0zgBm5L9zMbIhoNofNzKx5zuL8/E2ZWX7uGmZm1lrOYTOz\n1nMW5+YGBzPLz+FqZtZazmEzs9ZzFufmBgczy2/NRj0Ezcys9ZzDZmat5yzOzQ0OZpbfmlZfgJnZ\nRs45bGbWes7i3Lwsppnl92LOh5mZDYy8OewsNjMbOE3msKRDJS2SdL+k02q8P1zSTEmLJd0iaVTF\ne2ek7QslHdLomJKmSXpQ0l2S5knaJ23fQ9LvJb0oaVLF/ptKui3tf4+k3gney3APBzPLb3WrL8DM\nbCPnHDYza70mslhSG3AhcBDwGDBX0jURsahit+OBpyJitKQJwLnAREl7ka3oticwErhR0mhADY55\nSkRcXXUpTwL/DhxeuTEiVkk6ICJekNQO3Czp5xFxe5nP6x4OZpZfV86HmZkNjLw57Cw2Mxs4zeXw\nOGBxRDwcEauBmcD4qn3GA5em57OAA9Pzw4CZEbEmIpYAi9PxGh1zvb/3R8QTEXEnNQaIRMQL6emm\nZJ0Uou6nacANDmaW35qcDzMzGxh5c9hZbGY2cJrL4R2BpRWvl6VtNfeJiC7gGUlb16h9NG1rdMyz\nJc2XdJ6kTRp9PEltku4ClgM3RMTcRjX1uMHBzPLzTa6ZWWv1Q4PDAI0dnipphaQ/VB3r3LTvfElX\nStoybd8vjQ/ueRyeto+UdJOkBWns8EllvyozswHTXA7XWuKiugdBvX2Kbgc4PSL2BPYDtgHWy/31\nCiO6I+JNZMM23pKGcpTiORzMLD83JpiZtVaTOTwQY4cjIoBpwLeBH1adcg7ZzW63pK8AZ6THPcC+\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/openmc/mgxs/__init__.py b/openmc/mgxs/__init__.py index b41deac843..7fd6e0a692 100644 --- a/openmc/mgxs/__init__.py +++ b/openmc/mgxs/__init__.py @@ -1,4 +1,4 @@ -from openmc.mgxs.groups import EnergyGroups, DelayedGroups +from openmc.mgxs.groups import EnergyGroups from openmc.mgxs.library import Library from openmc.mgxs.mgxs import * from openmc.mgxs.mdgxs import * diff --git a/openmc/mgxs/groups.py b/openmc/mgxs/groups.py index c0eaa27c17..068977d888 100644 --- a/openmc/mgxs/groups.py +++ b/openmc/mgxs/groups.py @@ -1,5 +1,5 @@ from collections import Iterable -from numbers import Real, Integral +from numbers import Real import copy import sys @@ -11,10 +11,6 @@ import openmc.checkvalue as cv if sys.version_info[0] >= 3: basestring = str -# Maximum number of delayed groups -# TODO: Get value from OpenMC -MAX_DELAYED_GROUPS = 8 - class EnergyGroups(object): """An energy groups structure used for multi-group cross-sections. @@ -303,127 +299,3 @@ class EnergyGroups(object): # Assign merged edges to merged groups merged_groups.group_edges = list(merged_edges) return merged_groups - - -class DelayedGroups(object): - """A delayed groups structure used for multi-delayed-group parameters. - - Parameters - ---------- - groups : Iterable of Int - The delayed groups - - Attributes - ---------- - groups : Iterable of Int - The delayed groups - num_groups : int - The number of delayed groups - - """ - - def __init__(self, groups=None): - self._groups = None - - if groups is not None: - self.groups = groups - - def __deepcopy__(self, memo): - existing = memo.get(id(self)) - - # If this is the first time we have tried to copy object, create copy - if existing is None: - clone = type(self).__new__(type(self)) - clone._groups = copy.deepcopy(self.groups, memo) - - memo[id(self)] = clone - - return clone - - # If this object has been copied before, return the first copy made - else: - return existing - - def __eq__(self, other): - if not isinstance(other, DelayedGroups): - return False - elif self.num_groups != other.num_groups: - return False - elif np.allclose(self.groups, other.groups): - return True - else: - return False - - def __ne__(self, other): - return not self == other - - def __hash__(self): - return hash(tuple(self.groups)) - - @property - def groups(self): - return self._groups - - @property - def num_groups(self): - return len(self.groups) - - @groups.setter - def groups(self, groups): - cv.check_type('groups', groups, Iterable, Integral) - cv.check_greater_than('number of delayed groups', len(groups), 0) - - # Check that the groups are within [1, MAX_DELAYED_GROUPS] - for group in groups: - cv.check_greater_than('delayed group', group, 0) - cv.check_less_than('delayed group', group, MAX_DELAYED_GROUPS, - equality=True) - - self._groups = np.asarray(groups, dtype=int) - - def can_merge(self, other): - """Determine if delayed groups can be merged with another. - - Parameters - ---------- - other : openmc.mgxs.DelayedGroups - DelayedGroups to compare with - - Returns - ------- - bool - Whether the delayed groups can be merged - - """ - - return isinstance(other, DelayedGroups) - - def merge(self, other): - """Merge this delayed groups with another. - - Parameters - ---------- - other : openmc.mgxs.DelayedGroups - DelayedGroups to merge with - - Returns - ------- - merged_groups : openmc.mgxs.DelayedGroups - DelayedGroups resulting from the merge - - """ - - if not self.can_merge(other): - raise ValueError('Unable to merge delayed groups') - - # Create deep copy to return as merged delayed groups - merged_groups = copy.deepcopy(self) - - # Merge unique filter bins - groups = np.concatenate((self.groups, other.groups)) - groups = np.unique(groups) - groups.sort() - - # Assign groups to merged groups - merged_groups.groups = list(groups) - return merged_groups diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 5a4e2c94d4..6d2665566b 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -65,7 +65,7 @@ class Library(object): The highest legendre moment in the scattering matrices (default is 0) energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation - delayed_groups : openmc.mgxs.DelayedGroups + delayed_groups : list of int Delayed groups to filter out the xs tally_trigger : openmc.Trigger An (optional) tally precision trigger given to each tally used to @@ -224,7 +224,7 @@ class Library(object): if self.delayed_groups == None: return 0 else: - return self.delayed_groups.num_groups + return len(self.delayed_groups) @property def all_mgxs(self): @@ -327,8 +327,16 @@ class Library(object): @delayed_groups.setter def delayed_groups(self, delayed_groups): - cv.check_type('delayed groups', delayed_groups, - openmc.mgxs.DelayedGroups) + + cv.check_type('delayed groups', delayed_groups, list, int) + cv.check_greater_than('num delayed groups', len(delayed_groups), 0) + + # Check that the groups are within [1, MAX_DELAYED_GROUPS] + for group in delayed_groups: + cv.check_greater_than('delayed group', group, 0) + cv.check_less_than('delayed group', group, + openmc.mgxs.MAX_DELAYED_GROUPS, equality=True) + self._delayed_groups = delayed_groups @correction.setter diff --git a/openmc/mgxs/mdgxs.py b/openmc/mgxs/mdgxs.py index e985b01515..6d57f10a93 100644 --- a/openmc/mgxs/mdgxs.py +++ b/openmc/mgxs/mdgxs.py @@ -10,17 +10,22 @@ import abc import numpy as np -from mgxs import MGXS, MGXS_TYPES, DOMAIN_TYPES, _DOMAINS -from openmc.mgxs import EnergyGroups, DelayedGroups from openmc import Mesh import openmc import openmc.checkvalue as cv +from openmc.mgxs.groups import EnergyGroups +from openmc.mgxs.mgxs import MGXS, MGXS_TYPES, DOMAIN_TYPES, _DOMAINS + # Supported cross section types MDGXS_TYPES = ['delayed-nu-fission', 'chi-delayed', 'beta'] +# Maximum number of delayed groups, from src/constants.F90 +MAX_DELAYED_GROUPS = 8 + + class MDGXS(MGXS): """An abstract multi-delayed-group cross section for some energy and delayed group structures within some spatial domain. @@ -45,7 +50,7 @@ class MDGXS(MGXS): name : str, optional Name of the multi-group cross section. Used as a label to identify tallies in OpenMC 'tallies.xml' file. - delayed_groups : openmc.mgxs.DelayedGroups + delayed_groups : list of int Delayed groups to filter out the xs Attributes @@ -62,7 +67,7 @@ class MDGXS(MGXS): Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation - delayed_groups : openmc.mgxs.DelayedGroups + delayed_groups : list of int Delayed groups to filter out the xs tally_trigger : openmc.Trigger An (optional) tally precision trigger given to each tally used to @@ -118,6 +123,7 @@ class MDGXS(MGXS): delayed_groups=None, by_nuclide=False, name=''): super(MDGXS, self).__init__(domain, domain_type, energy_groups, by_nuclide, name) + self._delayed_groups = None if delayed_groups is not None: @@ -164,12 +170,20 @@ class MDGXS(MGXS): if self.delayed_groups == None: return 0 else: - return self.delayed_groups.num_groups + return len(self.delayed_groups) @delayed_groups.setter def delayed_groups(self, delayed_groups): - cv.check_type('delayed groups', delayed_groups, - openmc.mgxs.DelayedGroups) + + cv.check_type('delayed groups', delayed_groups, list, int) + cv.check_greater_than('num delayed groups', len(delayed_groups), 0) + + # Check that the groups are within [1, MAX_DELAYED_GROUPS] + for group in delayed_groups: + cv.check_greater_than('delayed group', group, 0) + cv.check_less_than('delayed group', group, MAX_DELAYED_GROUPS, + equality=True) + self._delayed_groups = delayed_groups @property @@ -180,8 +194,7 @@ class MDGXS(MGXS): energy_filter = openmc.Filter('energy', group_edges) if self.delayed_groups != None: - delayed_groups = self.delayed_groups.groups - delayed_filter = openmc.Filter('delayedgroup', delayed_groups) + delayed_filter = openmc.Filter('delayedgroup', self.delayed_groups) return [[energy_filter], [delayed_filter, energy_filter]] else: return [[energy_filter], [energy_filter]] @@ -213,7 +226,7 @@ class MDGXS(MGXS): name : str, optional Name of the multi-group cross section. Used as a label to identify tallies in OpenMC 'tallies.xml' file. Defaults to the empty string. - delayed_groups : openmc.mgxs.DelayedGroups + delayed_groups : list of int Delayed groups to filter out the xs Returns @@ -268,7 +281,7 @@ class MDGXS(MGXS): Defaults to 'increasing'. value : {'mean', 'std_dev', 'rel_err'} A string for the type of value to return. Defaults to 'mean'. - delayed_groups : Iterable of Integral or 'all' + delayed_groups : list of int or 'all' Delayed groups of interest. Defaults to 'all'. Returns @@ -316,7 +329,7 @@ class MDGXS(MGXS): # Construct list of delayed group tuples for all requested groups if not isinstance(delayed_groups, basestring): - cv.check_iterable_type('delayed_groups', delayed_groups, Integral) + cv.check_type('delayed groups', delayed_groups, list, int) for delayed_group in delayed_groups: filters.append('delayedgroup') filter_bins.append((delayed_group,)) @@ -402,7 +415,7 @@ class MDGXS(MGXS): cv.check_iterable_type('nuclides', nuclides, basestring) cv.check_iterable_type('energy_groups', groups, Integral) - cv.check_iterable_type('delayed_groups', delayed_groups, Integral) + cv.check_type('delayed groups', delayed_groups, list, int) # Build lists of filters and filter bins to slice filters = [] @@ -447,7 +460,7 @@ class MDGXS(MGXS): # Assign sliced delayed group structure to sliced MDGXS if delayed_groups: - slice_xs.delayed_groups.groups = delayed_groups + slice_xs.delayed_groups = delayed_groups # Assign sliced nuclides to sliced MGXS if nuclides: @@ -456,28 +469,6 @@ class MDGXS(MGXS): slice_xs.sparse = self.sparse return slice_xs - def can_merge(self, other): - """Determine if another MDGXS can be merged with this one - - If results have been loaded from a statepoint, then MGXS are only - mergeable along one and only one of enegy groups or nuclides. - - Parameters - ---------- - other : openmc.mgxs.MGXS - MGXS to check for merging - - """ - - can_merge = super(MDGXS, self).can_merge(other) - - # Compare delayed groups - if not self.delayed_groups.can_merge(other.delayed_groups): - can_merge = False - - # If all conditionals pass then MDGXS are mergeable - return can_merge - def merge(self, other): """Merge another MDGXS with this one @@ -502,9 +493,8 @@ class MDGXS(MGXS): # Merge delayed groups if self.delayed_groups != other.delayed_groups: - merged_delayed_groups = self.delayed_groups.merge( - other.delayed_groups) - merged_mdgxs.delayed_groups = merged_delayed_groups + merged_mdgxs.delayed_groups = list(set(self.delayed_groups + + other.delayed_groups)) return merged_mdgxs @@ -586,7 +576,7 @@ class MDGXS(MGXS): # Add the cross section header string += '{0: <16}\n'.format(xs_header) - for delayed_group in self.delayed_groups.groups: + for delayed_group in self.delayed_groups: template = '{0: <12}Delayed Group {1}:\t' string += template.format('', delayed_group) @@ -635,7 +625,7 @@ class MDGXS(MGXS): xs_type: {'macro', 'micro'} Store the macro or micro cross section in units of cm^-1 or barns. Defaults to 'macro'. - delayed_groups : Iterable of Integral or 'all' + delayed_groups : list of int or 'all' Delayed groups of interest. Defaults to 'all'. """ @@ -715,7 +705,7 @@ class MDGXS(MGXS): The geometric information in the Summary object is embedded into a Multi-index column with a geometric "path" to each distribcell instance. - delayed_groups : Iterable of Integral or 'all' + delayed_groups : list of int or 'all' Delayed groups of interest. Defaults to 'all'. Returns @@ -731,112 +721,11 @@ class MDGXS(MGXS): """ - if not isinstance(groups, basestring): - cv.check_iterable_type('groups', groups, Integral) - if nuclides != 'all' and nuclides != 'sum': - cv.check_iterable_type('nuclides', nuclides, basestring) if not isinstance(delayed_groups, basestring): - cv.check_iterable_type('delayed groups', delayed_groups, Integral) + cv.check_type('delayed groups', delayed_groups, list, int) - cv.check_value('xs_type', xs_type, ['macro', 'micro']) - - num_delayed_groups = 1 - if self.delayed_groups != None: - num_delayed_groups = self.delayed_groups.num_groups - - # Get a Pandas DataFrame from the derived xs tally - if self.by_nuclide and nuclides == 'sum': - - # Use tally summation to sum across all nuclides - query_nuclides = self.get_all_nuclides() - xs_tally = self.xs_tally.summation(nuclides=query_nuclides) - df = xs_tally.get_pandas_dataframe( - distribcell_paths=distribcell_paths) - - # Remove nuclide column since it is homogeneous and redundant - if self.domain_type == 'mesh': - df.drop('nuclide', axis=1, level=0, inplace=True) - else: - df.drop('nuclide', axis=1, inplace=True) - - # If the user requested a specific set of nuclides - elif self.by_nuclide and nuclides != 'all': - xs_tally = self.xs_tally.get_slice(nuclides=nuclides) - df = xs_tally.get_pandas_dataframe( - distribcell_paths=distribcell_paths) - - # If the user requested all nuclides, keep nuclide column in dataframe - else: - df = self.xs_tally.get_pandas_dataframe( - distribcell_paths=distribcell_paths) - - # Remove the score column since it is homogeneous and redundant - if self.domain_type == 'mesh': - df = df.drop('score', axis=1, level=0) - else: - df = df.drop('score', axis=1) - - # Override energy groups bounds with indices - all_groups = np.arange(self.num_groups, 0, -1, dtype=np.int) - all_groups = np.repeat(all_groups, self.num_nuclides) - if 'energy low [MeV]' in df and 'energyout low [MeV]' in df: - df.rename(columns={'energy low [MeV]': 'group in'}, - inplace=True) - in_groups = np.tile(all_groups, self.num_subdomains * num_delayed_groups) - in_groups = np.repeat(in_groups, df.shape[0] / in_groups.size) - df['group in'] = in_groups - del df['energy high [MeV]'] - - df.rename(columns={'energyout low [MeV]': 'group out'}, - inplace=True) - out_groups = np.repeat(all_groups, self.xs_tally.num_scores) - out_groups = np.tile(out_groups, df.shape[0] / out_groups.size * num_delayed_groups) - df['group out'] = out_groups - del df['energyout high [MeV]'] - columns = ['group in', 'group out'] - - elif 'energyout low [MeV]' in df: - df.rename(columns={'energyout low [MeV]': 'group out'}, - inplace=True) - in_groups = np.tile(all_groups, self.num_subdomains * num_delayed_groups) - df['group out'] = in_groups - del df['energyout high [MeV]'] - columns = ['group out'] - - elif 'energy low [MeV]' in df: - df.rename(columns={'energy low [MeV]': 'group in'}, inplace=True) - in_groups = np.tile(all_groups, self.num_subdomains * num_delayed_groups) - df['group in'] = in_groups - del df['energy high [MeV]'] - columns = ['group in'] - - # Select out those groups the user requested - if not isinstance(groups, basestring): - if 'group in' in df: - df = df[df['group in'].isin(groups)] - if 'group out' in df: - df = df[df['group out'].isin(groups)] - - # If user requested micro cross sections, divide out the atom densities - if xs_type == 'micro': - if self.by_nuclide: - densities = self.get_nuclide_densities(nuclides) - else: - densities = self.get_nuclide_densities('sum') - densities = np.repeat(densities, len(self.rxn_rate_tally.scores)) - tile_factor = df.shape[0] / len(densities) - df['mean'] /= np.tile(densities, tile_factor) - df['std. dev.'] /= np.tile(densities, tile_factor) - - # Sort the dataframe by domain type id (e.g., distribcell id) and - # energy groups such that data is from fast to thermal - if self.domain_type == 'mesh': - mesh_str = 'mesh {0}'.format(self.domain.id) - df.sort_values(by=[(mesh_str, 'x'), (mesh_str, 'y'), \ - (mesh_str, 'z')] + columns, inplace=True) - else: - df.sort_values(by=[self.domain_type] + columns, inplace=True) - return df + df = super(MDGXS, self).get_pandas_dataframe(groups, nuclides, xs_type, + distribcell_paths) # Select out those delayed groups the user requested if not isinstance(delayed_groups, basestring): @@ -890,7 +779,7 @@ class ChiDelayed(MDGXS): name : str, optional Name of the multi-group cross section. Used as a label to identify tallies in OpenMC 'tallies.xml' file. - delayed_groups : openmc.mgxs.DelayedGroups + delayed_groups : list of int Delayed groups to filter out the xs Attributes @@ -907,7 +796,7 @@ class ChiDelayed(MDGXS): Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation - delayed_groups : openmc.mgxs.DelayedGroups + delayed_groups : list of int Delayed groups to filter out the xs tally_trigger : openmc.Trigger An (optional) tally precision trigger given to each tally used to @@ -974,8 +863,7 @@ class ChiDelayed(MDGXS): energyout = openmc.Filter('energyout', group_edges) energyin = openmc.Filter('energy', [group_edges[0], group_edges[-1]]) if self.delayed_groups != None: - delayed_groups = self.delayed_groups.groups - delayed_filter = openmc.Filter('delayedgroup', delayed_groups) + delayed_filter = openmc.Filter('delayedgroup', self.delayed_groups) return [[delayed_filter, energyin], [delayed_filter, energyout]] else: return [[energyin], [energyout]] @@ -1120,9 +1008,8 @@ class ChiDelayed(MDGXS): # Merge delayed groups if self.delayed_groups != other.delayed_groups: - merged_delayed_groups = self.delayed_groups.merge\ - (other.delayed_groups) - merged_mdgxs.delayed_groups = merged_delayed_groups + merged_mdgxs.delayed_groups = list(set(self.delayed_groups + + other.delayed_groups)) # Merge nuclides if self.nuclides != other.nuclides: @@ -1157,7 +1044,7 @@ class ChiDelayed(MDGXS): ---------- groups : Iterable of Integral or 'all' Energy groups of interest. Defaults to 'all'. - delayed_groups : Iterable of Integral or 'all' + delayed_groups : list of int or 'all' Delayed groups of interest. Defaults to 'all'. subdomains : Iterable of Integral or 'all' Subdomain IDs of interest. Defaults to 'all'. @@ -1222,7 +1109,7 @@ class ChiDelayed(MDGXS): # Construct list of delayed group tuples for all requested groups if not isinstance(delayed_groups, basestring): - cv.check_iterable_type('delayed_groups', delayed_groups, Integral) + cv.check_type('delayed groups', delayed_groups, list, int) for delayed_group in delayed_groups: filters.append('delayedgroup') filter_bins.append((delayed_group,)) @@ -1344,7 +1231,7 @@ class DelayedNuFissionXS(MDGXS): name : str, optional Name of the multi-group cross section. Used as a label to identify tallies in OpenMC 'tallies.xml' file. - delayed_groups : openmc.mgxs.DelayedGroups + delayed_groups : list of int Delayed groups to filter out the xs Attributes @@ -1361,7 +1248,7 @@ class DelayedNuFissionXS(MDGXS): Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation - delayed_groups : openmc.mgxs.DelayedGroups + delayed_groups : list of int Delayed groups to filter out the xs tally_trigger : openmc.Trigger An (optional) tally precision trigger given to each tally used to @@ -1463,7 +1350,7 @@ class Beta(MDGXS): name : str, optional Name of the multi-group cross section. Used as a label to identify tallies in OpenMC 'tallies.xml' file. - delayed_groups : openmc.mgxs.DelayedGroups + delayed_groups : list of int Delayed groups to filter out the xs Attributes @@ -1480,7 +1367,7 @@ class Beta(MDGXS): Domain type for spatial homogenization energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation - delayed_groups : openmc.mgxs.DelayedGroups + delayed_groups : list of int Delayed groups to filter out the xs tally_trigger : openmc.Trigger An (optional) tally precision trigger given to each tally used to diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index d6f36206ee..4fc4edb38e 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1517,15 +1517,14 @@ class MGXS(object): if 'energy low [MeV]' in df and 'energyout low [MeV]' in df: df.rename(columns={'energy low [MeV]': 'group in'}, inplace=True) - in_groups = np.tile(all_groups, self.num_subdomains) + in_groups = np.tile(all_groups, df.shape[0] / all_groups.size) in_groups = np.repeat(in_groups, df.shape[0] / in_groups.size) df['group in'] = in_groups del df['energy high [MeV]'] df.rename(columns={'energyout low [MeV]': 'group out'}, inplace=True) - out_groups = np.repeat(all_groups, self.xs_tally.num_scores) - out_groups = np.tile(out_groups, df.shape[0] / out_groups.size) + out_groups = np.tile(all_groups, df.shape[0] / all_groups.size) df['group out'] = out_groups del df['energyout high [MeV]'] columns = ['group in', 'group out'] @@ -1533,14 +1532,14 @@ class MGXS(object): elif 'energyout low [MeV]' in df: df.rename(columns={'energyout low [MeV]': 'group out'}, inplace=True) - in_groups = np.tile(all_groups, self.num_subdomains) + in_groups = np.tile(all_groups, df.shape[0] / all_groups.size) df['group out'] = in_groups del df['energyout high [MeV]'] columns = ['group out'] elif 'energy low [MeV]' in df: df.rename(columns={'energy low [MeV]': 'group in'}, inplace=True) - in_groups = np.tile(all_groups, self.num_subdomains) + in_groups = np.tile(all_groups, df.shape[0] / all_groups.size) df['group in'] = in_groups del df['energy high [MeV]'] columns = ['group in'] diff --git a/tests/input_set.py b/tests/input_set.py index 827484022d..8d650cafbc 100644 --- a/tests/input_set.py +++ b/tests/input_set.py @@ -2,6 +2,7 @@ import openmc from openmc.source import Source from openmc.stats import Box +import numpy as np class InputSet(object): def __init__(self): @@ -673,6 +674,158 @@ class PinCellInputSet(object): self.plots.add_plot(plot) +class AssemblyInputSet(object): + def __init__(self): + self.settings = openmc.Settings() + self.materials = openmc.Materials() + self.geometry = openmc.Geometry() + self.tallies = None + self.plots = None + + def export(self): + self.settings.export_to_xml() + self.materials.export_to_xml() + self.geometry.export_to_xml() + if self.tallies is not None: + self.tallies.export_to_xml() + if self.plots is not None: + self.plots.export_to_xml() + + def build_default_materials_and_geometry(self): + # Define materials. + fuel = openmc.Material(name='Fuel') + fuel.set_density('g/cm3', 10.29769) + fuel.add_nuclide("U234", 4.4843e-6) + fuel.add_nuclide("U235", 5.5815e-4) + fuel.add_nuclide("U238", 2.2408e-2) + fuel.add_nuclide("O16", 4.5829e-2) + + clad = openmc.Material(name='Cladding') + clad.set_density('g/cm3', 6.55) + clad.add_nuclide("Zr90", 2.1827e-2) + clad.add_nuclide("Zr91", 4.7600e-3) + clad.add_nuclide("Zr92", 7.2758e-3) + clad.add_nuclide("Zr94", 7.3734e-3) + clad.add_nuclide("Zr96", 1.1879e-3) + + hot_water = openmc.Material(name='Hot borated water') + hot_water.set_density('g/cm3', 0.740582) + hot_water.add_nuclide("H1", 4.9457e-2) + hot_water.add_nuclide("O16", 2.4672e-2) + hot_water.add_nuclide("B10", 8.0042e-6) + hot_water.add_nuclide("B11", 3.2218e-5) + hot_water.add_s_alpha_beta('c_H_in_H2O', '71t') + + # Define the materials file. + self.materials.default_xs = '71c' + self.materials += (fuel, clad, hot_water) + + # Instantiate ZCylinder surfaces + fuel_or = openmc.ZCylinder(x0=0, y0=0, R=0.39218, name='Fuel OR') + clad_or = openmc.ZCylinder(x0=0, y0=0, R=0.45720, name='Clad OR') + + # Create boundary planes to surround the geometry + min_x = openmc.XPlane(x0=-10.71, boundary_type='reflective') + max_x = openmc.XPlane(x0=+10.71, boundary_type='reflective') + min_y = openmc.YPlane(y0=-10.71, boundary_type='reflective') + max_y = openmc.YPlane(y0=+10.71, boundary_type='reflective') + + # Create a Universe to encapsulate a fuel pin + fuel_pin_universe = openmc.Universe(name='Fuel Pin') + + # Create fuel Cell + fuel_cell = openmc.Cell(name='fuel') + fuel_cell.fill = fuel + fuel_cell.region = -fuel_or + fuel_pin_universe.add_cell(fuel_cell) + + # Create a clad Cell + clad_cell = openmc.Cell(name='clad') + clad_cell.fill = clad + clad_cell.region = +fuel_or & -clad_or + fuel_pin_universe.add_cell(clad_cell) + + # Create a moderator Cell + hot_water_cell = openmc.Cell(name='hot water') + hot_water_cell.fill = hot_water + hot_water_cell.region = +clad_or + fuel_pin_universe.add_cell(hot_water_cell) + + # Create a Universe to encapsulate a control rod guide tube + guide_tube_universe = openmc.Universe(name='Guide Tube') + + # Create guide tube inner Cell + gt_inner_cell = openmc.Cell(name='guide tube inner water') + gt_inner_cell.fill = hot_water + gt_inner_cell.region = -fuel_or + guide_tube_universe.add_cell(gt_inner_cell) + + # Create a clad Cell + gt_clad_cell = openmc.Cell(name='guide tube clad') + gt_clad_cell.fill = clad + gt_clad_cell.region = +fuel_or & -clad_or + guide_tube_universe.add_cell(gt_clad_cell) + + # Create a guide tube outer Cell + gt_outer_cell = openmc.Cell(name='guide tube outer water') + gt_outer_cell.fill = hot_water + gt_outer_cell.region = +clad_or + guide_tube_universe.add_cell(gt_outer_cell) + + # Create fuel assembly Lattice + assembly = openmc.RectLattice(name='Fuel Assembly') + assembly.pitch = (1.26, 1.26) + assembly.lower_left = [-1.26 * 17. / 2.0] * 2 + + # Create array indices for guide tube locations in lattice + template_x = np.array([5, 8, 11, 3, 13, 2, 5, 8, 11, 14, 2, 5, 8, + 11, 14, 2, 5, 8, 11, 14, 3, 13, 5, 8, 11]) + template_y = np.array([2, 2, 2, 3, 3, 5, 5, 5, 5, 5, 8, 8, 8, 8, + 8, 11, 11, 11, 11, 11, 13, 13, 14, 14, 14]) + + # Initialize an empty 17x17 array of the lattice universes + universes = np.empty((17, 17), dtype=openmc.Universe) + + # Fill the array with the fuel pin and guide tube universes + universes[:,:] = fuel_pin_universe + universes[template_x, template_y] = guide_tube_universe + + # Store the array of universes in the lattice + assembly.universes = universes + + # Create root Cell + root_cell = openmc.Cell(name='root cell') + root_cell.fill = assembly + + # Add boundary planes + root_cell.region = +min_x & -max_x & +min_y & -max_y + + # Create root Universe + root_universe = openmc.Universe(universe_id=0, name='root universe') + root_universe.add_cell(root_cell) + + # Instantiate a Geometry, register the root Universe, and export to XML + self.geometry.root_universe = root_universe + + def build_default_settings(self): + self.settings.batches = 10 + self.settings.inactive = 5 + self.settings.particles = 100 + self.settings.source = Source(space=Box([-10.71, -10.71, -1], + [10.71, 10.71, 1], + only_fissionable=True)) + + def build_defualt_plots(self): + plot = openmc.Plot() + plot.filename = 'mat' + plot.origin = (0.0, 0.0, 0) + plot.width = (21.42, 21.42) + plot.pixels = (300, 300) + plot.color = 'mat' + + self.plots.add_plot(plot) + + class MGInputSet(InputSet): def build_default_materials_and_geometry(self): # Define materials needed for 1D/1G slab problem diff --git a/tests/test_mgxs_library_condense/test_mgxs_library_condense.py b/tests/test_mgxs_library_condense/test_mgxs_library_condense.py index b849391690..a3e849d6c5 100644 --- a/tests/test_mgxs_library_condense/test_mgxs_library_condense.py +++ b/tests/test_mgxs_library_condense/test_mgxs_library_condense.py @@ -24,7 +24,7 @@ class MGXSTestHarness(PyAPITestHarness): 20.]) # Initialize a six-delayed-group structure - delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + delayed_groups = range(1,7) # Initialize MGXS Library for a few cross section types self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) diff --git a/tests/test_mgxs_library_distribcell/inputs_true.dat b/tests/test_mgxs_library_distribcell/inputs_true.dat index 64cd6b748d..924c53838f 100644 --- a/tests/test_mgxs_library_distribcell/inputs_true.dat +++ b/tests/test_mgxs_library_distribcell/inputs_true.dat @@ -1 +1 @@ -5e4bd179eeb955f61e01dc2a486e3fefd2cef7859390f12a817cd5412359766d7bfe0bf3f8553e8d28af0844ee04a4ebaad6510ec6157ee836d631a2a2b3baec \ No newline at end of file +9ce3d6987d67e92b0924916bb54288429d2bd6dfd12a69f86c5dbefb407f7eb72adb0e44d558c09e9a39610ffeb651aee4aedc629cf3a28a181d62ca4cfbcd5a \ No newline at end of file diff --git a/tests/test_mgxs_library_distribcell/results_true.dat b/tests/test_mgxs_library_distribcell/results_true.dat index fb301be61f..5a996c8fa9 100644 --- a/tests/test_mgxs_library_distribcell/results_true.dat +++ b/tests/test_mgxs_library_distribcell/results_true.dat @@ -1,63 +1,63 @@ - avg(distribcell) group in nuclide mean std. dev. -0 (0,) 1 total 0.453624 0.02261 - avg(distribcell) group in nuclide mean std. dev. -0 (0,) 1 total 0.400852 0.024589 - avg(distribcell) group in nuclide mean std. dev. -0 (0,) 1 total 0.400852 0.024589 - avg(distribcell) group in nuclide mean std. dev. -0 (0,) 1 total 0.064903 0.004684 - avg(distribcell) group in nuclide mean std. dev. -0 (0,) 1 total 0.028048 0.004982 - avg(distribcell) group in nuclide mean std. dev. -0 (0,) 1 total 0.036855 0.002749 - avg(distribcell) group in nuclide mean std. dev. -0 (0,) 1 total 0.090649 0.006763 - avg(distribcell) group in nuclide mean std. dev. -0 (0,) 1 total 7.137955 0.532092 - avg(distribcell) group in nuclide mean std. dev. -0 (0,) 1 total 0.388721 0.018415 - avg(distribcell) group in nuclide mean std. dev. -0 (0,) 1 total 0.389304 0.023619 - avg(distribcell) group in group out nuclide moment mean std. dev. -0 (0,) 1 1 total P0 0.389304 0.023619 -1 (0,) 1 1 total P1 0.046224 0.005672 -2 (0,) 1 1 total P2 0.017984 0.002178 -3 (0,) 1 1 total P3 0.006628 0.001620 - avg(distribcell) group in group out nuclide moment mean std. dev. -0 (0,) 1 1 total P0 0.389304 0.023619 -1 (0,) 1 1 total P1 0.046224 0.005672 -2 (0,) 1 1 total P2 0.017984 0.002178 -3 (0,) 1 1 total P3 0.006628 0.001620 - avg(distribcell) group in group out nuclide mean std. dev. -0 (0,) 1 1 total 1.0 0.066327 - avg(distribcell) group in group out nuclide mean std. dev. -0 (0,) 1 1 total 0.085835 0.004328 - avg(distribcell) group out nuclide mean std. dev. -0 (0,) 1 total 1.0 0.046071 - avg(distribcell) group out nuclide mean std. dev. -0 (0,) 1 total 1.0 0.051471 - avg(distribcell) group in nuclide mean std. dev. -0 (0,) 1 total 4.996730e-07 3.741595e-08 - avg(distribcell) group in nuclide mean std. dev. -0 (0,) 1 total 0.090004 0.006717 - avg(distribcell) delayedgroup group in nuclide mean std. dev. -0 (0,) 1 1 total 0.000021 0.000002 -1 (0,) 2 1 total 0.000110 0.000008 -2 (0,) 3 1 total 0.000107 0.000008 -3 (0,) 4 1 total 0.000249 0.000018 -4 (0,) 5 1 total 0.000112 0.000008 -5 (0,) 6 1 total 0.000046 0.000003 - avg(distribcell) delayedgroup group out nuclide mean std. dev. -0 (0,) 1 1 total 0.0 0.000000 -1 (0,) 2 1 total 1.0 0.869128 -2 (0,) 3 1 total 1.0 1.414214 -3 (0,) 4 1 total 1.0 0.360359 -4 (0,) 5 1 total 0.0 0.000000 -5 (0,) 6 1 total 0.0 0.000000 - avg(distribcell) delayedgroup group in nuclide mean std. dev. -0 (0,) 1 1 total 0.000227 0.000022 -1 (0,) 2 1 total 0.001214 0.000115 -2 (0,) 3 1 total 0.001184 0.000111 -3 (0,) 4 1 total 0.002752 0.000257 -4 (0,) 5 1 total 0.001231 0.000113 -5 (0,) 6 1 total 0.000512 0.000047 + avg(distribcell) group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.457353 0.010474 + avg(distribcell) group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.405649 0.015784 + avg(distribcell) group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.405641 0.015787 + avg(distribcell) group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.066556 0.00251 + avg(distribcell) group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.028979 0.002712 + avg(distribcell) group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.037577 0.001487 + avg(distribcell) group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.092377 0.003628 + avg(distribcell) group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 7.276707 0.287579 + avg(distribcell) group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.390797 0.008717 + avg(distribcell) group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.387332 0.014241 + avg(distribcell) group in group out nuclide moment mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P0 0.387009 0.014230 +1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P1 0.047179 0.004923 +2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P2 0.015713 0.003654 +3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P3 0.005378 0.003137 + avg(distribcell) group in group out nuclide moment mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P0 0.387332 0.014241 +1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P1 0.047187 0.004933 +2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P2 0.015727 0.003654 +3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total P3 0.005387 0.003141 + avg(distribcell) group in group out nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 1.000834 0.037242 + avg(distribcell) group in group out nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 0.094516 0.0059 + avg(distribcell) group out nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 1.0 0.080455 + avg(distribcell) group out nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 1.0 0.080541 + avg(distribcell) group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 5.139437e-07 2.133314e-08 + avg(distribcell) group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 total 0.091725 0.003604 + avg(distribcell) delayedgroup group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 0.000021 8.253907e-07 +1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 2 1 total 0.000112 4.284000e-06 +2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 3 1 total 0.000109 4.105197e-06 +3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 4 1 total 0.000252 9.271420e-06 +4 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 5 1 total 0.000112 3.888625e-06 +5 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 6 1 total 0.000047 1.625563e-06 + avg(distribcell) delayedgroup group out nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 0.0 0.000000 +1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 2 1 total 1.0 1.414214 +2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 3 1 total 1.0 1.414214 +3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 4 1 total 0.0 0.000000 +4 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 5 1 total 0.0 0.000000 +5 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 6 1 total 1.0 1.414214 + avg(distribcell) delayedgroup group in nuclide mean std. dev. +0 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 1 1 total 0.000227 0.000012 +1 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 2 1 total 0.001209 0.000061 +2 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 3 1 total 0.001177 0.000059 +3 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 4 1 total 0.002727 0.000135 +4 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 5 1 total 0.001210 0.000058 +5 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 6 1 total 0.000504 0.000024 diff --git a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py index d03f003134..3103e07382 100644 --- a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py +++ b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py @@ -6,7 +6,7 @@ import glob import hashlib sys.path.insert(0, os.pardir) from testing_harness import PyAPITestHarness -from input_set import PinCellInputSet +from input_set import AssemblyInputSet import openmc import openmc.mgxs @@ -14,7 +14,7 @@ import openmc.mgxs class MGXSTestHarness(PyAPITestHarness): def _build_inputs(self): # Set the input set to use the pincell model - self._input_set = PinCellInputSet() + self._input_set = AssemblyInputSet() # Generate inputs using parent class routine super(MGXSTestHarness, self)._build_inputs() @@ -23,7 +23,7 @@ class MGXSTestHarness(PyAPITestHarness): energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 20.]) # Initialize a six-delayed-group structure - delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + delayed_groups = range(1,7) # Initialize MGXS Library for a few cross section types # for one material-filled cell in the geometry @@ -38,7 +38,7 @@ class MGXSTestHarness(PyAPITestHarness): self.mgxs_lib.legendre_order = 3 self.mgxs_lib.domain_type = 'distribcell' cells = self.mgxs_lib.openmc_geometry.get_all_material_cells() - self.mgxs_lib.domains = [c for c in cells if c.name == 'cell 1'] + self.mgxs_lib.domains = [c for c in cells if c.name == 'fuel'] self.mgxs_lib.build_library() # Initialize a tallies file diff --git a/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py b/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py index a9d4210479..4359b27937 100644 --- a/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py +++ b/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py @@ -25,7 +25,7 @@ class MGXSTestHarness(PyAPITestHarness): 20.]) # Initialize a six-delayed-group structure - delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + delayed_groups = range(1,7) # Initialize MGXS Library for a few cross section types self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) diff --git a/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py b/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py index 2db57254b4..bcf2400108 100644 --- a/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py +++ b/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py @@ -19,7 +19,7 @@ class MGXSTestHarness(PyAPITestHarness): energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 20.]) # Initialize a six-delayed-group structure - delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + delayed_groups = range(1,7) # Initialize MGXS Library for a few cross section types # for one material-filled cell in the geometry diff --git a/tests/test_mgxs_library_no_nuclides/results_true.dat b/tests/test_mgxs_library_no_nuclides/results_true.dat index edd99b44c5..54650970f1 100644 --- a/tests/test_mgxs_library_no_nuclides/results_true.dat +++ b/tests/test_mgxs_library_no_nuclides/results_true.dat @@ -29,49 +29,49 @@ 1 10000 1 total 0.385188 0.026946 0 10000 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 +1 10000 1 1 total P0 0.016482 0.004502 +3 10000 1 1 total P1 -0.010499 0.010438 +5 10000 1 1 total P2 -0.000768 0.000768 +7 10000 1 1 total P3 -0.000171 0.000172 +9 10000 1 1 total P0 -0.000207 0.000149 +11 10000 1 1 total P1 0.000234 0.000128 +13 10000 1 1 total P2 0.051870 0.006983 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 +2 10000 2 2 total P1 0.006371 0.010551 +4 10000 2 2 total P2 0.000925 0.000925 +6 10000 2 2 total P3 0.000494 0.000494 +8 10000 2 2 total P0 0.000989 0.000482 +10 10000 2 2 total P1 -0.000103 0.000184 +12 10000 2 2 total P2 0.384199 0.027001 +14 10000 2 2 total P3 0.020069 0.002846 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 +1 10000 1 1 total P0 0.016482 0.004502 +3 10000 1 1 total P1 -0.010499 0.010438 +5 10000 1 1 total P2 -0.000768 0.000768 +7 10000 1 1 total P3 -0.000171 0.000172 +9 10000 1 1 total P0 -0.000207 0.000149 +11 10000 1 1 total P1 0.000234 0.000128 +13 10000 1 1 total P2 0.051870 0.006983 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 +2 10000 2 2 total P1 0.006371 0.010551 +4 10000 2 2 total P2 0.000925 0.000925 +6 10000 2 2 total P3 0.000494 0.000494 +8 10000 2 2 total P0 0.000989 0.000482 +10 10000 2 2 total P1 -0.000103 0.000184 +12 10000 2 2 total P2 0.384199 0.027001 +14 10000 2 2 total P3 0.020069 0.002846 material group in group out nuclide mean std. dev. +1 10000 1 1 total 1.0 1.414214 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 +2 10000 2 2 total 1.0 0.687184 material group in group out nuclide mean std. dev. +1 10000 1 1 total 0.454366 0.027426 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 +2 10000 2 2 total 0.000000 0.000000 material group out nuclide mean std. dev. 1 10000 1 total 1.0 0.046071 0 10000 2 total 0.0 0.000000 @@ -154,49 +154,49 @@ 1 10001 1 total 0.310121 0.033788 0 10001 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 +1 10001 1 1 total P0 -0.011214 0.016180 +3 10001 1 1 total P1 -0.003270 0.007329 +5 10001 1 1 total P2 0.000000 0.000000 +7 10001 1 1 total P3 0.000000 0.000000 +9 10001 1 1 total P0 0.000000 0.000000 +11 10001 1 1 total P1 0.000000 0.000000 +13 10001 1 1 total P2 0.038230 0.008484 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 +2 10001 2 2 total P1 0.008837 0.011504 +4 10001 2 2 total P2 0.000000 0.000000 +6 10001 2 2 total P3 0.000000 0.000000 +8 10001 2 2 total P0 0.000000 0.000000 +10 10001 2 2 total P1 0.000000 0.000000 +12 10001 2 2 total P2 0.310121 0.033788 +14 10001 2 2 total P3 0.020745 0.004696 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 +1 10001 1 1 total P0 -0.011214 0.016180 +3 10001 1 1 total P1 -0.003270 0.007329 +5 10001 1 1 total P2 0.000000 0.000000 +7 10001 1 1 total P3 0.000000 0.000000 +9 10001 1 1 total P0 0.000000 0.000000 +11 10001 1 1 total P1 0.000000 0.000000 +13 10001 1 1 total P2 0.038230 0.008484 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 +2 10001 2 2 total P1 0.008837 0.011504 +4 10001 2 2 total P2 0.000000 0.000000 +6 10001 2 2 total P3 0.000000 0.000000 +8 10001 2 2 total P0 0.000000 0.000000 +10 10001 2 2 total P1 0.000000 0.000000 +12 10001 2 2 total P2 0.310121 0.033788 +14 10001 2 2 total P3 0.020745 0.004696 material group in group out nuclide mean std. dev. +1 10001 1 1 total 0.0 0.000000 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 +2 10001 2 2 total 0.0 0.000000 material group in group out nuclide mean std. dev. +1 10001 1 1 total 0.0 0.0 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 +2 10001 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 @@ -279,49 +279,49 @@ 1 10002 1 total 0.671269 0.026186 0 10002 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 +1 10002 1 1 total P0 0.509941 0.051236 +3 10002 1 1 total P1 0.024988 0.008312 +5 10002 1 1 total P2 0.000400 0.000401 +7 10002 1 1 total P3 0.000214 0.000215 +9 10002 1 1 total P0 0.008758 0.000926 +11 10002 1 1 total P1 -0.003785 0.000817 +13 10002 1 1 total P2 0.381167 0.016243 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.509941 0.051236 -2 10002 2 2 total P2 0.111175 0.013020 -3 10002 2 2 total P3 0.024988 0.008312 +2 10002 2 2 total P1 0.111175 0.013020 +4 10002 2 2 total P2 0.000443 0.000445 +6 10002 2 2 total P3 0.000320 0.000321 +8 10002 2 2 total P0 0.031368 0.001728 +10 10002 2 2 total P1 -0.002568 0.001014 +12 10002 2 2 total P2 0.639901 0.024709 +14 10002 2 2 total P3 0.152392 0.008156 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 +1 10002 1 1 total P0 0.509941 0.051236 +3 10002 1 1 total P1 0.024988 0.008312 +5 10002 1 1 total P2 0.000400 0.000401 +7 10002 1 1 total P3 0.000214 0.000215 +9 10002 1 1 total P0 0.008758 0.000926 +11 10002 1 1 total P1 -0.003785 0.000817 +13 10002 1 1 total P2 0.381167 0.016243 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.509941 0.051236 -2 10002 2 2 total P2 0.111175 0.013020 -3 10002 2 2 total P3 0.024988 0.008312 +2 10002 2 2 total P1 0.111175 0.013020 +4 10002 2 2 total P2 0.000443 0.000445 +6 10002 2 2 total P3 0.000320 0.000321 +8 10002 2 2 total P0 0.031368 0.001728 +10 10002 2 2 total P1 -0.002568 0.001014 +12 10002 2 2 total P2 0.639901 0.024709 +14 10002 2 2 total P3 0.152392 0.008156 material group in group out nuclide mean std. dev. +1 10002 1 1 total 1.0 1.414214 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 +2 10002 2 2 total 1.0 0.067667 material group in group out nuclide mean std. dev. +1 10002 1 1 total 0.0 0.0 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 +2 10002 2 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 diff --git a/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py b/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py index d2e61a2da4..5ca90875d4 100644 --- a/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py +++ b/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py @@ -24,7 +24,7 @@ class MGXSTestHarness(PyAPITestHarness): 20.]) # Initialize a six-delayed-group structure - delayed_groups = openmc.mgxs.DelayedGroups(range(1,7)) + delayed_groups = range(1,7) # Initialize MGXS Library for a few cross section types self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) diff --git a/tests/test_mgxs_library_nuclides/results_true.dat b/tests/test_mgxs_library_nuclides/results_true.dat index 3da8146042..9671ad7857 100644 --- a/tests/test_mgxs_library_nuclides/results_true.dat +++ b/tests/test_mgxs_library_nuclides/results_true.dat @@ -1 +1 @@ -e494320a213b5704a2ac915a2ba504857be91961ceb6735b6ad05d81eb31c44c9584d5bd9d40baececf1dcb5b030e6ecec63cfbd20639baf69bcb596c5c46591 \ No newline at end of file +cb61db73f66b40ed1a59a59e6f4fd52678e9dc41c7bb8ad327989233c3b8d78a71d84c3cb8ad9bc8b1585b319e1f1d66a8667e7cad2ead4cc574f415f8f7a35d \ No newline at end of file From b400045ded71a7b8af1336c09313f7cfa8138200 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sat, 6 Aug 2016 17:11:37 -0400 Subject: [PATCH 041/168] removed unnecessary imports in mdgx.py --- openmc/mgxs/mdgxs.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/openmc/mgxs/mdgxs.py b/openmc/mgxs/mdgxs.py index 6d57f10a93..c01b0b575b 100644 --- a/openmc/mgxs/mdgxs.py +++ b/openmc/mgxs/mdgxs.py @@ -10,12 +10,9 @@ import abc import numpy as np -from openmc import Mesh import openmc +from openmc.mgxs import MGXS import openmc.checkvalue as cv -from openmc.mgxs.groups import EnergyGroups -from openmc.mgxs.mgxs import MGXS, MGXS_TYPES, DOMAIN_TYPES, _DOMAINS - # Supported cross section types MDGXS_TYPES = ['delayed-nu-fission', From 264cb33b3635e54f8d9958b829c0d0660b25258c Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Sun, 7 Aug 2016 14:31:18 -0500 Subject: [PATCH 042/168] Address #690 comments --- data/fission_Q_data_endfb71.h5 | Bin 67543 -> 67543 bytes docs/source/io_formats/fission_energy.rst | 7 ++--- openmc/data/endf_utils.py | 5 ++-- openmc/data/fission_energy.py | 35 +++++++++------------- src/tally.F90 | 12 ++++---- 5 files changed, 25 insertions(+), 34 deletions(-) diff --git a/data/fission_Q_data_endfb71.h5 b/data/fission_Q_data_endfb71.h5 index 89e51b70783034b40ce4e207fdb3e34b5d5d33cc..7cc5a86b5249c1abacfbf23bf777639825164c9b 100644 GIT binary patch delta 8209 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/** - Nuclides are named by concatenating their Z and their A numbers. For - example, U235 is named 92235. Metastable nuclides are appended with an - '_m' and their metastable number. For example, the first excited isomer - of Am-242 is named 95242_m1. + Nuclides are named by concatenating their atomic symbol and mass number. For + example, 'U235' or 'Pu239'. Metastable nuclides are appended with an + '_m' and their metastable number. For example, 'Am242_m1' :Datasets: - **data** (*double[][][]*) -- The energy release coefficients. The first axis indexes the component type. The second axis specifies diff --git a/openmc/data/endf_utils.py b/openmc/data/endf_utils.py index bfd9ae5c85..1a77c60a5e 100644 --- a/openmc/data/endf_utils.py +++ b/openmc/data/endf_utils.py @@ -12,9 +12,8 @@ import re def read_float(float_string): """Parse ENDF 6E11.0 formatted string into a float.""" assert len(float_string) == 11 - pattern = '([\s\\-]\d+\\.\d+)([\\+\\-]\d+)' - mantissa, exponent = re.match(pattern, float_string).groups() - return float(mantissa + 'e' + exponent) + pattern = r'([\s\-]\d+\.\d+)([\+\-]\d+)' + return float(re.sub(pattern, r'\1e\2', float_string)) def read_CONT_line(line): diff --git a/openmc/data/fission_energy.py b/openmc/data/fission_energy.py index 334231a9f6..60cc435646 100644 --- a/openmc/data/fission_energy.py +++ b/openmc/data/fission_energy.py @@ -6,8 +6,9 @@ import h5py import numpy as np from numpy.polynomial.polynomial import Polynomial -from .function import Tabulated1D, Sum +from .data import ATOMIC_SYMBOL from .endf_utils import read_float, read_CONT_line, identify_nuclide +from .function import Tabulated1D, Sum import openmc.checkvalue as cv if sys.version_info[0] >= 3: @@ -70,11 +71,11 @@ def _extract_458_data(filename): labels = ('EFR', 'ENP', 'END', 'EGP', 'EGD', 'EB', 'ENU', 'ER', 'ET') # Associate each set of values and uncertainties with its label. - value = dict() - uncertainty = dict() - for i in range(len(labels)): - value[labels[i]] = data[2*i::18] - uncertainty[labels[i]] = data[2*i + 1::18] + value = {} + uncertainty = {} + for i, label in enumerate(labels): + value[label] = data[2*i::18] + uncertainty[label] = data[2*i + 1::18] # In ENDF/B-7.1, data for 2nd-order coefficients were mistakenly not # converted from MeV to eV. Check for this error and fix it if present. @@ -94,13 +95,6 @@ def _extract_458_data(filename): for coeffs in value.values(): coeffs[2] *= 1e-6 for coeffs in uncertainty.values(): coeffs[2] *= 1e-6 - # Perform the sanity check again... just in case. - for coeffs in value.values(): - second_order = coeffs[2] - if abs(second_order) * 1e12 > 1e8: - raise ValueError("Encountered a ludicrously large second-" - "order polynomial coefficient.") - # Convert eV to MeV. for coeffs in value.values(): for i in range(len(coeffs)): @@ -112,8 +106,8 @@ def _extract_458_data(filename): return value, uncertainty -def write_compact_458_library(endf_files, output_name=None, comment=None, - verbose=False): +def write_compact_458_library(endf_files, output_name='fission_Q_data.h5', + comment=None, verbose=False): """Read ENDF files, strip the MF=1 MT=458 data and write to small HDF5. Parameters @@ -130,7 +124,6 @@ def write_compact_458_library(endf_files, output_name=None, comment=None, """ # Open the output file. - if output_name is None: output_name = 'fission_Q_data.h5' out = h5py.File(output_name, 'w', libver='latest') # Write comments, if given. This commented out comment is the one used for @@ -179,7 +172,7 @@ def write_compact_458_library(endf_files, output_name=None, comment=None, value, uncertainty = data # Make a group for this isomer. - name = str(ident['Z']) + str(ident['A']) + name = ATOMIC_SYMBOL[ident['Z']] + str(ident['A']) if ident['LISO'] != 0: name += '_m' + str(ident['LISO']) nuclide_group = out.create_group(name) @@ -447,7 +440,7 @@ class FissionEnergyRelease(object): and p.emission_mode == 'prompt'] else: raise ValueError('IncidentNeutron data has no fission ' - 'reaction.') + 'reaction.') if len(nu_prompt) == 0: raise ValueError('Nu data is needed to compute fission energy ' 'release with the Sher-Beck format.') @@ -533,7 +526,7 @@ class FissionEnergyRelease(object): elif group.attrs['format'].decode() == 'Sher-Beck': obj.form = 'Sher-Beck' obj.prompt_neutrons = Tabulated1D.from_hdf5( - group['prompt_neutrons']) + group['prompt_neutrons']) else: raise ValueError('Unrecognized energy release format') @@ -565,14 +558,14 @@ class FissionEnergyRelease(object): components = [s.decode() for s in fin.attrs['component order']] - nuclide_name = str(incident_neutron.atomic_number) + nuclide_name = ATOMIC_SYMBOL[incident_neutron.atomic_number] nuclide_name += str(incident_neutron.mass_number) if incident_neutron.metastable != 0: nuclide_name += '_m' + str(incident_neutron.metastable) if nuclide_name not in fin: return None - data = {c : fin[nuclide_name + '/data'][i, 0, :] + data = {c: fin[nuclide_name + '/data'][i, 0, :] for i, c in enumerate(components)} return cls._from_dictionary(data, incident_neutron) diff --git a/src/tally.F90 b/src/tally.F90 index ab630ceb25..a949313bd3 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -710,7 +710,7 @@ contains score = p % absorb_wgt * & nuc % reactions(nuc % index_fission(1)) % Q_value * & micro_xs(p % event_nuclide) % fission / & - micro_xs(p % event_nuclide) % absorption + micro_xs(p % event_nuclide) % absorption * flux end if end associate else @@ -724,7 +724,7 @@ contains score = p % last_wgt * & nuc % reactions(nuc % index_fission(1)) % Q_value * & micro_xs(p % event_nuclide) % fission / & - micro_xs(p % event_nuclide) % absorption + micro_xs(p % event_nuclide) % absorption * flux end if end associate end if @@ -785,7 +785,7 @@ contains score = p % absorb_wgt & * nuc % fission_q_prompt % evaluate(p % last_E) & * micro_xs(p % event_nuclide) % fission & - / micro_xs(p % event_nuclide) % absorption + / micro_xs(p % event_nuclide) % absorption * flux end if end associate else @@ -799,7 +799,7 @@ contains score = p % last_wgt & * nuc % fission_q_prompt % evaluate(p % last_E) & * micro_xs(p % event_nuclide) % fission & - / micro_xs(p % event_nuclide) % absorption + / micro_xs(p % event_nuclide) % absorption * flux end if end associate end if @@ -844,7 +844,7 @@ contains score = p % absorb_wgt & * nuc % fission_q_recov % evaluate(p % last_E) & * micro_xs(p % event_nuclide) % fission & - / micro_xs(p % event_nuclide) % absorption + / micro_xs(p % event_nuclide) % absorption * flux end if end associate else @@ -858,7 +858,7 @@ contains score = p % last_wgt & * nuc % fission_q_recov % evaluate(p % last_E) & * micro_xs(p % event_nuclide) % fission & - / micro_xs(p % event_nuclide) % absorption + / micro_xs(p % event_nuclide) % absorption * flux end if end associate end if From 75878d583d6b1e0ea158c62226d130238cd552d6 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 8 Aug 2016 10:06:02 -0500 Subject: [PATCH 043/168] Address #695 comments --- openmc/data/function.py | 2 +- openmc/data/product.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/openmc/data/function.py b/openmc/data/function.py index e827e12833..798aa18cdd 100644 --- a/openmc/data/function.py +++ b/openmc/data/function.py @@ -13,7 +13,7 @@ INTERPOLATION_SCHEME = {1: 'histogram', 2: 'linear-linear', 3: 'linear-log', class Function1D(object): """A function of one independent variable with HDF5 support.""" - __meta__class = ABCMeta + __metaclass__ = ABCMeta def __init__(self): pass diff --git a/openmc/data/product.py b/openmc/data/product.py index 116905f7a3..eec47c9560 100644 --- a/openmc/data/product.py +++ b/openmc/data/product.py @@ -35,7 +35,7 @@ class Product(object): yield represents particles from prompt and delayed sources. particle : str What particle the reaction product is. - yield_ : float or openmc.data.Tabulated1D or openmc.data.Polynomial + yield_ : openmc.data.Function1D Yield of secondary particle in the reaction. """ @@ -118,8 +118,7 @@ class Product(object): @yield_.setter def yield_(self, yield_): - cv.check_type('product yield', yield_, - (Tabulated1D, Polynomial)) + cv.check_type('product yield', yield_, Function1D) self._yield = yield_ def to_hdf5(self, group): From d86583c41683d87b9498a1a7095e49017f684f8c Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 8 Aug 2016 10:55:09 -0500 Subject: [PATCH 044/168] Infer Sher-Beck vs. Madland from data type --- docs/source/io_formats/nuclear_data.rst | 51 +++++++++++-------- openmc/data/fission_energy.py | 65 +++++++++---------------- src/nuclide_header.F90 | 14 ++---- tests/test_tallies/results_true.dat | 2 +- 4 files changed, 60 insertions(+), 72 deletions(-) diff --git a/docs/source/io_formats/nuclear_data.rst b/docs/source/io_formats/nuclear_data.rst index 7544ca1f5e..2a16c02cec 100644 --- a/docs/source/io_formats/nuclear_data.rst +++ b/docs/source/io_formats/nuclear_data.rst @@ -57,24 +57,33 @@ Incident Neutron Data **//fission_energy_release/** -:Attributes: - **format** (*char[]*) -- The energy-dependence format. Either - 'Madland' or 'Sher-Beck' - -:Datasets: - **fragments** (*double[]*) -- Polynomial coefficients for energy - released in the form of fragments - - **prompt_neutrons** (*double[]* or :ref:`tabulated <1d_tabulated>`) - -- Energy released in the form of prompt neutrons. Polynomial if - the format is Madland or a table if Sher-Beck. - - **delayed_neutrons** (*double[]*) -- Polynomial coefficients for - energy released in the form of delayed neutrons - - **prompt_photons** (*double[]*) -- Polynomial coefficients for - energy released in the form of prompt photons - - **delayed_photons** (*double[]*) -- Polynomial coefficients for - energy released in the form of delayed photons - - **betas** (*double[]*) -- Polynomial coefficients for - energy released in the form of betas - - **neutrinos** (*double[]*) -- Polynomial coefficients for - energy released in the form of neutrinos +:Datasets: - **fragments** (:ref:`polynomial <1d_polynomial>`) -- Energy + released in the form of fragments as a function of incident + neutron energy. + - **prompt_neutrons** (:ref:`polynomial <1d_polynomial>` or + :ref:`tabulated <1d_tabulated>`) -- Energy released in the form of + prompt neutrons as a function of incident neutron energy. + - **delayed_neutrons** (:ref:`polynomial <1d_polynomial>`) -- Energy + released in the form of delayed neutrons as a function of incident + neutron energy. + - **prompt_photons** (:ref:`polynomial <1d_polynomial>`) -- Energy + released in the form of prompt photons as a function of incident + neutron energy. + - **delayed_photons** (:ref:`polynomial <1d_polynomial>`) -- Energy + released in the form of delayed photons as a function of incident + neutron energy. + - **betas** (:ref:`polynomial <1d_polynomial>`) -- Energy + released in the form of betas as a function of incident + neutron energy. + - **neutrinos** (:ref:`polynomial <1d_polynomial>`) -- Energy + released in the form of neutrinos as a function of incident + neutron energy. + - **q_prompt** (:ref:`polynomial <1d_polynomial>` or + :ref:`tabulated <1d_tabulated>`) -- The prompt fission Q-value + (fragments + prompt neutrons + prompt photons - incident energy) + - **q_recoverable** (:ref:`polynomial <1d_polynomial>` or + :ref:`tabulated <1d_tabulated>`) -- The recoverable fission Q-value + (Q_prompt + delayed neutrons + delayed photons + betas) ------------------------------- Thermal Neutron Scattering Data @@ -163,17 +172,19 @@ Tabulated :Object type: Dataset :Datatype: *double[2][]* :Description: x-values are listed first followed by corresponding y-values -:Attributes: - **type** (*char[]*) -- 'tabulated' +:Attributes: - **type** (*char[]*) -- 'Tabulated1D' - **breakpoints** (*int[]*) -- Region breakpoints - **interpolation** (*int[]*) -- Region interpolation codes +.. _1d_polynomial: + Polynomial ---------- :Object type: Dataset :Datatype: *double[]* :Description: Polynomial coefficients listed in order of increasing power -:Attributes: - **type** (*char[]*) -- 'polynomial' +:Attributes: - **type** (*char[]*) -- 'Polynomial' Coherent elastic scattering --------------------------- diff --git a/openmc/data/fission_energy.py b/openmc/data/fission_energy.py index 60cc435646..24743c19c5 100644 --- a/openmc/data/fission_energy.py +++ b/openmc/data/fission_energy.py @@ -4,11 +4,10 @@ import sys import h5py import numpy as np -from numpy.polynomial.polynomial import Polynomial from .data import ATOMIC_SYMBOL from .endf_utils import read_float, read_CONT_line, identify_nuclide -from .function import Tabulated1D, Sum +from .function import Function1D, Tabulated1D, Polynomial, Sum import openmc.checkvalue as cv if sys.version_info[0] >= 3: @@ -262,9 +261,6 @@ class FissionEnergyRelease(object): q_total : Callable Function of energy that returns the total fission Q-value (total release - incident neutron energy). - form : str - Format used to compute the energy-dependence of the data. Either - 'Sher-Beck' or 'Madland'. """ def __init__(self): @@ -275,7 +271,6 @@ class FissionEnergyRelease(object): self._delayed_photons = None self._betas = None self._neutrinos = None - self._form = None @property def fragments(self): @@ -328,10 +323,6 @@ class FissionEnergyRelease(object): @property def q_total(self): return Sum([self.total, lambda E: -E]) - - @property - def form(self): - return self._form @fragments.setter def fragments(self, energy_release): @@ -368,11 +359,6 @@ class FissionEnergyRelease(object): cv.check_type('neutrinos', energy_release, Callable) self._neutrinos = energy_release - @form.setter - def form(self, form): - cv.check_value('format', form, ('Madland', 'Sher-Beck')) - self._form = form - @classmethod def _from_dictionary(cls, energy_release, incident_neutron): """Generate fission energy release data from a dictionary. @@ -401,7 +387,6 @@ class FissionEnergyRelease(object): # energy dependence. Otherwise, it is a polynomial. n_coeffs = len(energy_release['EFR']) if n_coeffs > 1: - out.form = 'Madland' out.fragments = Polynomial(energy_release['EFR']) out.prompt_neutrons = Polynomial(energy_release['ENP']) out.delayed_neutrons = Polynomial(energy_release['END']) @@ -410,12 +395,9 @@ class FissionEnergyRelease(object): out.betas = Polynomial(energy_release['EB']) out.neutrinos = Polynomial(energy_release['ENU']) else: - out.form = 'Sher-Beck' - - # EFR and ENP are energy independent. Polynomial is used because it - # has a __call__ attribute that handles Iterable inputs. The - # energy-dependence of END is unspecified in ENDF-102 so assume it - # is independent. + # EFR and ENP are energy independent. Use 0-order polynomials to + # make a constant function. The energy-dependence of END is + # unspecified in ENDF-102 so assume it is independent. out.fragments = Polynomial((energy_release['EFR'][0])) out.prompt_photons = Polynomial((energy_release['EGP'][0])) out.delayed_neutrons = Polynomial((energy_release['END'][0])) @@ -580,41 +562,40 @@ class FissionEnergyRelease(object): """ - group.create_dataset('fragments', data=self.fragments.coef) - group.create_dataset('delayed_neutrons', - data=self.delayed_neutrons.coef) - group.create_dataset('prompt_photons', - data=self.prompt_photons.coef) - group.create_dataset('delayed_photons', - data=self.delayed_photons.coef) - group.create_dataset('betas', data=self.betas.coef) - group.create_dataset('neutrinos', data=self.neutrinos.coef) - - if self.form == 'Madland': - group.attrs['format'] = np.string_('Madland') - group.create_dataset('prompt_neutrons', - data=self.prompt_neutrons.coef) - + self.fragments.to_hdf5(group, 'fragments') + self.prompt_neutrons.to_hdf5(group, 'prompt_neutrons') + self.delayed_neutrons.to_hdf5(group, 'delayed_neutrons') + self.prompt_photons.to_hdf5(group, 'prompt_photons') + self.delayed_photons.to_hdf5(group, 'delayed_photons') + self.betas.to_hdf5(group, 'betas') + self.neutrinos.to_hdf5(group, 'neutrinos') + + if isinstance(self.prompt_neutrons, Polynomial): + # Add the polynomials for the relevant components together. Use a + # Polynomial((0.0, -1.0)) to subtract incident energy. q_prompt = (self.fragments + self.prompt_neutrons + self.prompt_photons + Polynomial((0.0, -1.0))) - group.create_dataset('q_prompt', data=q_prompt.coef) + q_prompt.to_hdf5(group, 'q_prompt') q_recoverable = (self.fragments + self.prompt_neutrons + self.delayed_neutrons + self.prompt_photons + self.delayed_photons + self.betas + Polynomial((0.0, -1.0))) - group.create_dataset('q_recoverable', data=q_recoverable.coef) - elif self.form == 'Sher-Beck': - group.attrs['format'] = np.string_('Sher-Beck') - self.prompt_neutrons.to_hdf5(group, 'prompt_neutrons') + q_recoverable.to_hdf5(group, 'q_recoverable') + elif isinstance(self.prompt_neutrons, Tabulated1D): + # Make a Tabulated1D and evaluate the polynomial components at the + # table x points to get new y points. Subtract x from y to remove + # incident energy. q_prompt = deepcopy(self.prompt_neutrons) q_prompt.y += self.fragments(q_prompt.x) q_prompt.y += self.prompt_photons(q_prompt.x) + q_prompt.y -= q_prompt.x q_prompt.to_hdf5(group, 'q_prompt') q_recoverable = q_prompt q_recoverable.y += self.delayed_neutrons(q_recoverable.x) q_recoverable.y += self.delayed_photons(q_recoverable.x) q_recoverable.y += self.betas(q_recoverable.x) q_recoverable.to_hdf5(group, 'q_recoverable') + else: raise ValueError('Unrecognized energy release format') diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index 4fcbf3af85..f32a93030c 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -305,13 +305,13 @@ module nuclide_header hdf5_err) if (exists) then fer_group = open_group(group_id, 'fission_energy_release') - call read_attribute(temp, fer_group, 'format') - if (temp == 'Madland') then - ! The data uses the Madland format, i.e. polynomials + ! Check to see if this is polynomial or tabulated data + fer_dset = open_dataset(fer_group, 'q_prompt') + call read_attribute(temp, fer_dset, 'type') + if (temp == 'Polynomial') then ! Read the prompt Q-value allocate(Polynomial :: this % fission_q_prompt) - fer_dset = open_dataset(fer_group, 'q_prompt') call this % fission_q_prompt % from_hdf5(fer_dset) call close_dataset(fer_dset) @@ -320,13 +320,9 @@ module nuclide_header fer_dset = open_dataset(fer_group, 'q_recoverable') call this % fission_q_recov % from_hdf5(fer_dset) call close_dataset(fer_dset) - else if (temp == 'Sher-Beck') then - ! The data uses the Sher-Beck format. Python has handily converted this - ! format to Tabulated1Ds. - + else if (temp == 'Tabulated1D') then ! Read the prompt Q-value allocate(Tabulated1D :: this % fission_q_prompt) - fer_dset = open_dataset(fer_group, 'q_prompt') call this % fission_q_prompt % from_hdf5(fer_dset) call close_dataset(fer_dset) diff --git a/tests/test_tallies/results_true.dat b/tests/test_tallies/results_true.dat index 818d99a92b..d018a65da9 100644 --- a/tests/test_tallies/results_true.dat +++ b/tests/test_tallies/results_true.dat @@ -1 +1 @@ -a6e5480c66e6510687bf281983b3f387da45005bb08d8cd0aa629e53c5a42a1b2fa8d76345ad2df497d85f2b273fbc5edc36105a71a73c1107479ca0af8329f6 \ No newline at end of file +5a0f3f1ae244ada7d8c9f444d7a98c2589a9720e78174a276cf96162df6728bab6d534f136f65cb0386c3235eb7d5db47a0dd6504636ca77e7eb375e6978a84d \ No newline at end of file From b3c134e9bbef99e48261a18c8d665fdc58228d5a Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 8 Aug 2016 11:09:50 -0500 Subject: [PATCH 045/168] Update FissionEnergyRelease.from_hdf5 --- openmc/data/fission_energy.py | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/openmc/data/fission_energy.py b/openmc/data/fission_energy.py index 24743c19c5..03d3ed84ed 100644 --- a/openmc/data/fission_energy.py +++ b/openmc/data/fission_energy.py @@ -495,22 +495,13 @@ class FissionEnergyRelease(object): obj = cls() - obj.fragments = Polynomial(group['fragments'].value) - obj.delayed_neutrons = Polynomial(group['delayed_neutrons'].value) - obj.prompt_photons = Polynomial(group['prompt_photons'].value) - obj.delayed_photons = Polynomial(group['delayed_photons'].value) - obj.betas = Polynomial(group['betas'].value) - obj.neutrinos = Polynomial(group['neutrinos'].value) - - if group.attrs['format'].decode() == 'Madland': - obj.form = 'Madland' - obj.prompt_neutrons = Polynomial(group['prompt_neutrons'].value) - elif group.attrs['format'].decode() == 'Sher-Beck': - obj.form = 'Sher-Beck' - obj.prompt_neutrons = Tabulated1D.from_hdf5( - group['prompt_neutrons']) - else: - raise ValueError('Unrecognized energy release format') + obj.fragments = Function1D.from_hdf5(group['fragments']) + obj.prompt_neutrons = Function1D.from_hdf5(group['prompt_neutrons']) + obj.delayed_neutrons = Function1D.from_hdf5(group['delayed_neutrons']) + obj.prompt_photons = Function1D.from_hdf5(group['prompt_photons']) + obj.delayed_photons = Function1D.from_hdf5(group['delayed_photons']) + obj.betas = Function1D.from_hdf5(group['betas']) + obj.neutrinos = Function1D.from_hdf5(group['neutrinos']) return obj From 5b0ba57792aca84b8831d5f93fc9edb476a9b229 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 8 Aug 2016 11:23:00 -0500 Subject: [PATCH 046/168] Allow longer score names in statepoint files --- src/endf.F90 | 2 +- src/state_point.F90 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/endf.F90 b/src/endf.F90 index 833082e1c7..07094d5d9b 100644 --- a/src/endf.F90 +++ b/src/endf.F90 @@ -14,7 +14,7 @@ contains pure function reaction_name(MT) result(string) integer, intent(in) :: MT - character(20) :: string + character(MAX_WORD_LEN) :: string select case (MT) ! Special reactions for tallies diff --git a/src/state_point.F90 b/src/state_point.F90 index abe034897a..39532652f1 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -51,7 +51,7 @@ contains integer(HID_T) :: file_id integer(HID_T) :: cmfd_group, tallies_group, tally_group, meshes_group, & mesh_group, filter_group, runtime_group - character(20), allocatable :: str_array(:) + character(MAX_WORD_LEN), allocatable :: str_array(:) character(MAX_FILE_LEN) :: filename type(RegularMesh), pointer :: meshp type(TallyObject), pointer :: tally From 7d23e09710387b0479cccf62eb1117f5c7e11b9f Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Mon, 8 Aug 2016 12:51:30 -0500 Subject: [PATCH 047/168] Update Travis data --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 30708de36a..173af7602c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,7 +42,7 @@ install: true before_script: - if [[ ! -e $HOME/nndc_hdf5/cross_sections.xml ]]; then - wget https://anl.box.com/shared/static/6pwyfjnufam0sb96kqwwrve6vdn8m7u4.xz -O - | tar -C $HOME -xvJ; + wget https://anl.box.com/shared/static/dqkwdl7o4lauo91h3mgrn9qno6a3c8mp.xz -O - | tar -C $HOME -xvJ; fi - export OPENMC_CROSS_SECTIONS=$HOME/nndc_hdf5/cross_sections.xml From a5763ae599eb082daf170d29ab99dbe7fa537ef9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 8 Aug 2016 15:27:46 -0500 Subject: [PATCH 048/168] Refactor volume calculation to allow material/universe volumes as well --- openmc/cell.py | 11 +- openmc/geometry.py | 7 +- openmc/volume.py | 101 ++++++---- src/relaxng/settings.rnc | 6 +- src/relaxng/settings.rng | 16 +- src/volume_calc.F90 | 209 ++++++++++++++------- src/volume_header.F90 | 31 ++- tests/test_volume_calc/inputs_true.dat | 2 +- tests/test_volume_calc/results_true.dat | 24 ++- tests/test_volume_calc/test_volume_calc.py | 31 +-- 10 files changed, 298 insertions(+), 140 deletions(-) diff --git a/openmc/cell.py b/openmc/cell.py index c4a0952e91..fe8b4a52cd 100644 --- a/openmc/cell.py +++ b/openmc/cell.py @@ -369,10 +369,13 @@ class Cell(object): Results from a stochastic volume calculation """ - for cell_id in volume_calc.results: - if cell_id == self.id: - self._volume_information = volume_calc.results[cell_id] - break + if volume_calc.domain_type == 'cell': + for cell_id in volume_calc.results: + if cell_id == self.id: + self._volume_information = volume_calc.results[cell_id] + break + else: + raise ValueError('No volume information found for this cell.') else: raise ValueError('No volume information found for this cell.') diff --git a/openmc/geometry.py b/openmc/geometry.py index c827f4b2a7..b2a9b5e4aa 100644 --- a/openmc/geometry.py +++ b/openmc/geometry.py @@ -59,9 +59,10 @@ class Geometry(object): Results from a stochastic volume calculation """ - for cell in self.get_all_cells(): - if cell.id in volume_calc.results: - cell.add_volume_information(volume_calc) + if volume_calc.domain_type == 'cell': + for cell in self.get_all_cells(): + if cell.id in volume_calc.results: + cell.add_volume_information(volume_calc) def export_to_xml(self): """Create a geometry.xml file that can be used for a simulation. diff --git a/openmc/volume.py b/openmc/volume.py index 167971bdbd..e9b1dac1d3 100644 --- a/openmc/volume.py +++ b/openmc/volume.py @@ -5,7 +5,7 @@ from xml.etree import ElementTree as ET import numpy as np import pandas as pd -from openmc import Cell, Union +import openmc import openmc.checkvalue as cv @@ -14,8 +14,8 @@ class VolumeCalculation(object): Parameters ---------- - cells : Iterable of Cell - Cells to find volumes of + domains : Iterable of openmc.Cell, openmc.Material, or openmc.Universe + Domains to find volumes of samples : int Number of samples used to generate volume estimates lower_left : Iterable of float @@ -29,8 +29,10 @@ class VolumeCalculation(object): Attributes ---------- - cell_ids : Iterable of int - IDs of cells to find volumes of + ids : Iterable of int + IDs of domains to find volumes of + domain_type : {'cell', 'material', 'universe'} + Type of each domain samples : int Number of samples used to generate volume estimates lower_left : Iterable of float @@ -38,23 +40,31 @@ class VolumeCalculation(object): upper_right : Iterable of float Upper-right coordinates of bounding box used to sample points results : dict - Dictionary whose keys are unique IDs of cells and values are + Dictionary whose keys are unique IDs of domains and values are dictionaries with calculated volumes and total number of atoms for each - nuclide present in the cell. + nuclide present in the domain. volumes : dict - Dictionary whose keys are unique IDs of cells and values are the + Dictionary whose keys are unique IDs of domains and values are the estimated volumes atoms_dataframe : pandas.DataFrame DataFrame showing the estimated number of atoms for each nuclide present - in each cell specified. + in each domain specified. """ - def __init__(self, cells, samples, lower_left=None, + def __init__(self, domains, samples, lower_left=None, upper_right=None): self._results = None - cv.check_type('cells', cells, Iterable, Cell) - self.cell_ids = [c.id for c in cells] + cv.check_type('domains', domains, Iterable, + (openmc.Cell, openmc.Material, openmc.Universe)) + if isinstance(domains[0], openmc.Cell): + self._domain_type = 'cell' + elif isinstance(domains[0], openmc.Material): + self._domain_type = 'material' + elif isinstance(domains[0], openmc.Universe): + self._domain_type = 'universe' + self.ids = [d.id for d in domains] + self.samples = samples if lower_left is not None: @@ -64,17 +74,21 @@ class VolumeCalculation(object): 'should be specified') self.upper_right = upper_right else: - ll, ur = Union(*[c.region for c in cells]).bounding_box - if np.any(np.isinf(ll)) or np.any(np.isinf(ur)): + if self.domain_type == 'cell': + 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.') + else: + self.lower_left = ll + self.upper_right = ur + else: raise ValueError('Could not automatically determine bounding box ' 'for stochastic volume calculation.') - else: - self.lower_left = ll - self.upper_right = ur @property - def cell_ids(self): - return self._cell_ids + def ids(self): + return self._ids @property def samples(self): @@ -92,6 +106,10 @@ class VolumeCalculation(object): def results(self): return self._results + @property + def domain_type(self): + return self._domain_type + @property def volumes(self): return {uid: results['volume'] for uid, results in self.results.items()} @@ -99,17 +117,18 @@ class VolumeCalculation(object): @property def atoms_dataframe(self): items = [] - columns = ['Cell', 'Nuclide', 'Atoms', 'Uncertainty'] - for cell_id, results in self.results.items(): + columns = [self.domain_type.capitalize(), 'Nuclide', 'Atoms', + 'Uncertainty'] + for uid, results in self.results.items(): for name, atoms in results['atoms']: - items.append((cell_id, name, atoms[0], atoms[1])) + items.append((uid, name, atoms[0], atoms[1])) return pd.DataFrame.from_records(items, columns=columns) - @cell_ids.setter - def cell_ids(self, cell_ids): - cv.check_type('cell IDs', cell_ids, Iterable, Real) - self._cell_ids = cell_ids + @ids.setter + def ids(self, ids): + cv.check_type('domain IDs', ids, Iterable, Real) + self._ids = ids @samples.setter def samples(self, samples): @@ -154,16 +173,17 @@ class VolumeCalculation(object): import h5py with h5py.File(filename, 'r') as f: + domain_type = f.attrs['domain_type'].decode() samples = f.attrs['samples'] lower_left = f.attrs['lower_left'] upper_right = f.attrs['upper_right'] results = {} - cell_ids = [] + ids = [] for obj_name in f: - if obj_name.startswith('cell_'): - cell_id = int(obj_name[5:]) - cell_ids.append(cell_id) + if obj_name.startswith('domain_'): + domain_id = int(obj_name[7:]) + ids.append(domain_id) group = f[obj_name] volume = tuple(group['volume'].value) nucnames = group['nuclides'].value @@ -172,14 +192,19 @@ class VolumeCalculation(object): atom_list = [] for name_i, atoms_i in zip(nucnames, atoms): atom_list.append((name_i.decode(), tuple(atoms_i))) - results[cell_id] = {'volume': volume, 'atoms': atom_list} + results[domain_id] = {'volume': volume, 'atoms': atom_list} - # Instantiate some throw-away cells that are used by the constructor to - # assign IDs - cells = [Cell(uid) for uid in cell_ids] + # 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] # Instantiate the class and assign results - vol = cls(cells, samples, lower_left, upper_right) + vol = cls(domains, samples, lower_left, upper_right) vol.results = results return vol @@ -193,8 +218,10 @@ class VolumeCalculation(object): """ element = ET.Element("volume_calc") - cell_elem = ET.SubElement(element, "cells") - cell_elem.text = ' '.join(str(uid) for uid in self.cell_ids) + dt_elem = ET.SubElement(element, "domain_type") + dt_elem.text = self.domain_type + id_elem = ET.SubElement(element, "domain_ids") + id_elem.text = ' '.join(str(uid) for uid in self.ids) samples_elem = ET.SubElement(element, "samples") samples_elem.text = str(self.samples) ll_elem = ET.SubElement(element, "lower_left") diff --git a/src/relaxng/settings.rnc b/src/relaxng/settings.rnc index 78a32171b9..e23cbdd6cd 100644 --- a/src/relaxng/settings.rnc +++ b/src/relaxng/settings.rnc @@ -143,8 +143,10 @@ element settings { element verbosity { xsd:positiveInteger }? & element volume_calc { - (element cells { list { xsd:positiveInteger+ } } | - attribute cells { list { xsd:positiveInteger+ } }) & + (element domain_type { xsd:string } | + attribute domain_type { xsd:string }) & + (element domain_ids { list { xsd:integer+ } } | + attribute domain_ids { list { xsd:integer+ } }) & (element samples { xsd:positiveInteger } | attribute samples { xsd:positiveInteger }) & (element lower_left { list { xsd:double+ } } | diff --git a/src/relaxng/settings.rng b/src/relaxng/settings.rng index 64fe42239d..38acea5985 100644 --- a/src/relaxng/settings.rng +++ b/src/relaxng/settings.rng @@ -629,17 +629,25 @@ - + + + + + + + + + - + - + - + diff --git a/src/volume_calc.F90 b/src/volume_calc.F90 index eac96f9ba7..03e241a66b 100644 --- a/src/volume_calc.F90 +++ b/src/volume_calc.F90 @@ -9,7 +9,7 @@ module volume_calc use geometry, only: find_cell use global use hdf5_interface, only: file_create, file_close, write_attribute, & - create_group, close_group, write_dataset + create_group, close_group, write_dataset, write_attribute_string use output, only: write_message, header use message_passing use particle_header, only: Particle @@ -33,7 +33,8 @@ contains subroutine run_volume_calculations() integer :: i, j integer :: n - real(8), allocatable :: volume(:,:) ! volume mean/stdev in each cell + real(8), allocatable :: volume(:,:) ! volume mean/stdev in each domain + character(10) :: domain_type character(MAX_FILE_LEN) :: filename ! filename for HDF5 file type(Timer) :: time_volume ! timer for volume calculation type(VectorInt), allocatable :: nuclide_vec(:) ! indices in nuclides array @@ -46,7 +47,7 @@ contains end if do i = 1, size(volume_calcs) - n = size(volume_calcs(i) % cell_id) + n = size(volume_calcs(i) % domain_id) allocate(nuclide_vec(n)) allocate(atoms_vec(n), uncertainty_vec(n)) allocate(volume(2,n)) @@ -60,11 +61,20 @@ contains uncertainty_vec) if (master) then - ! Display cell volumes - do j = 1, size(volume_calcs(i) % cell_id) - call write_message(" Cell " // trim(to_str(volume_calcs(i) % & - cell_id(j))) // ": " // trim(to_str(volume(1,j))) // " +/- " // & - trim(to_str(volume(2,j))) // " cm^3") + select case (volume_calcs(i) % domain_type) + case (FILTER_CELL) + domain_type = ' Cell' + case (FILTER_MATERIAL) + domain_type = ' Material' + case (FILTER_UNIVERSE) + domain_type = ' Universe' + end select + + ! Display domain volumes + do j = 1, size(volume_calcs(i) % domain_id) + call write_message(trim(domain_type) // " " // trim(to_str(& + volume_calcs(i) % domain_id(j))) // ": " // trim(to_str(& + volume(1,j))) // " +/- " // trim(to_str(volume(2,j))) // " cm^3") end do call write_message("") @@ -85,13 +95,13 @@ contains end subroutine run_volume_calculations !=============================================================================== -! GET_VOLUME stochastically determines the volume of a set of cells along with -! the average number densities of nuclides within the cell +! GET_VOLUME stochastically determines the volume of a set of domains along with +! the average number densities of nuclides within the domain !=============================================================================== subroutine get_volume(this, volume, nuclide_vec, atoms_vec, uncertainty_vec) type(VolumeCalculation), intent(in) :: this - real(8), intent(out) :: volume(:,:) ! volume mean/stdev in each cell + real(8), intent(out) :: volume(:,:) ! volume mean/stdev in each domain type(VectorInt), intent(out) :: nuclide_vec(:) ! indices in nuclides array type(VectorReal), intent(out) :: atoms_vec(:) ! total # of atoms of each nuclide type(VectorReal), intent(out) :: uncertainty_vec(:) ! uncertainty of total # of atoms @@ -99,22 +109,22 @@ contains ! Variables that are private to each thread integer(8) :: i integer :: j, k - integer :: i_cell ! index in cell_id array + integer :: i_domain ! index in domain_id array integer :: i_material ! index in materials array integer :: level ! local coordinate level logical :: found_cell - type(VectorInt) :: indices(size(this % cell_id)) ! List of material indices - type(VectorInt) :: hits(size(this % cell_id)) ! Number of hits for each material + type(VectorInt) :: indices(size(this % domain_id)) ! List of material indices + type(VectorInt) :: hits(size(this % domain_id)) ! Number of hits for each material type(Particle) :: p ! Shared variables integer :: i_start, i_end ! Starting/ending sample for each process - type(VectorInt) :: master_indices(size(this % cell_id)) - type(VectorInt) :: master_hits(size(this % cell_id)) + type(VectorInt) :: master_indices(size(this % domain_id)) + type(VectorInt) :: master_hits(size(this % domain_id)) ! Variables used outside of parallel region integer :: i_nuclide ! index in nuclides array - integer :: total_hits ! total hits for a single cell (summed over materials) + integer :: total_hits ! total hits for a single domain (summed over materials) integer :: min_samples ! minimum number of samples per process integer :: remainder ! leftover samples from uneven divide #ifdef MPI @@ -140,15 +150,15 @@ contains call p % initialize() -!$omp parallel private(i, j, k, i_cell, i_material, level, found_cell, & +!$omp parallel private(i, j, k, i_domain, i_material, level, found_cell, & !$omp& indices, hits) firstprivate(p) ! Reset vectors -- this is really to get around a gfortran 4.6 bug. Ideally, ! indices and hits would just be firstprivate but 4.6 complains because they ! have allocatable components... - do i_cell = 1, size(this % cell_id) - call indices(i_cell) % clear() - call hits(i_cell) % clear() + do i_domain = 1, size(this % domain_id) + call indices(i_domain) % clear() + call hits(i_domain) % clear() end do call prn_set_stream(STREAM_VOLUME) @@ -174,32 +184,89 @@ contains call find_cell(p, found_cell) if (.not. found_cell) cycle - ! Determine if point is within desired cell - LEVEL_LOOP: do level = 1, p % n_coord - CELL_CHECK_LOOP: do i_cell = 1, size(this % cell_id) - if (cells(p % coord(level) % cell) % id == this % cell_id(i_cell)) then - - ! Determine what material this is - i_material = p % material + if (this % domain_type == FILTER_MATERIAL) then + ! ====================================================================== + ! MATERIAL VOLUME + i_material = p % material + MATERIAL_LOOP: do i_domain = 1, size(this % domain_id) + if (i_material == materials(i_domain) % id) then ! Check if we've already had a hit in this material and if so, ! simply add one - do j = 1, indices(i_cell) % size() - if (indices(i_cell) % data(j) == i_material) then - hits(i_cell) % data(j) = hits(i_cell) % data(j) + 1 - cycle CELL_CHECK_LOOP + do j = 1, indices(i_domain) % size() + if (indices(i_domain) % data(j) == i_material) then + hits(i_domain) % data(j) = hits(i_domain) % data(j) + 1 + cycle MATERIAL_LOOP end if end do ! If we make it here, that means we haven't yet had a hit in this ! material. Add an entry to both the indices list and the hits list - call indices(i_cell) % push_back(i_material) - call hits(i_cell) % push_back(1) + call indices(i_domain) % push_back(i_material) + call hits(i_domain) % push_back(1) end if - end do CELL_CHECK_LOOP - end do LEVEL_LOOP + end do MATERIAL_LOOP + + elseif (this % domain_type == FILTER_CELL) THEN + ! ====================================================================== + ! CELL VOLUME + + do level = 1, p % n_coord + CELL_LOOP: do i_domain = 1, size(this % domain_id) + if (cells(p % coord(level) % cell) % id == this % domain_id(i_domain)) then + + ! Determine what material this is + i_material = p % material + + ! Check if we've already had a hit in this material and if so, + ! simply add one + do j = 1, indices(i_domain) % size() + if (indices(i_domain) % data(j) == i_material) then + hits(i_domain) % data(j) = hits(i_domain) % data(j) + 1 + cycle CELL_LOOP + end if + end do + + ! If we make it here, that means we haven't yet had a hit in this + ! material. Add an entry to both the indices list and the hits list + call indices(i_domain) % push_back(i_material) + call hits(i_domain) % push_back(1) + end if + end do CELL_LOOP + end do + + elseif (this % domain_type == FILTER_UNIVERSE) then + ! ====================================================================== + ! UNIVERSE VOLUME + + do level = 1, p % n_coord + UNIVERSE_LOOP: do i_domain = 1, size(this % domain_id) + if (universes(p % coord(level) % universe) % id == & + this % domain_id(i_domain)) then + + ! Determine what material this is + i_material = p % material + + ! Check if we've already had a hit in this material and if so, + ! simply add one + do j = 1, indices(i_domain) % size() + if (indices(i_domain) % data(j) == i_material) then + hits(i_domain) % data(j) = hits(i_domain) % data(j) + 1 + cycle UNIVERSE_LOOP + end if + end do + + ! If we make it here, that means we haven't yet had a hit in this + ! material. Add an entry to both the indices list and the hits list + call indices(i_domain) % push_back(i_material) + call hits(i_domain) % push_back(1) + end if + end do UNIVERSE_LOOP + end do + + end if end do SAMPLE_LOOP - !$omp end do +!$omp end do ! ========================================================================== ! REDUCE HITS ONTO MASTER THREAD @@ -212,14 +279,14 @@ contains !$omp do ordered schedule(static) THREAD_LOOP: do i = 1, omp_get_num_threads() !$omp ordered - do i_cell = 1, size(this % cell_id) - INDEX_LOOP: do j = 1, indices(i_cell) % size() + do i_domain = 1, size(this % domain_id) + INDEX_LOOP: do j = 1, indices(i_domain) % size() ! Check if this material has been added to the master list and if so, ! accumulate the number of hits - do k = 1, master_indices(i_cell) % size() - if (indices(i_cell) % data(j) == master_indices(i_cell) % data(k)) then - master_hits(i_cell) % data(k) = & - master_hits(i_cell) % data(k) + hits(i_cell) % data(j) + do k = 1, master_indices(i_domain) % size() + if (indices(i_domain) % data(j) == master_indices(i_domain) % data(k)) then + master_hits(i_domain) % data(k) = & + master_hits(i_domain) % data(k) + hits(i_domain) % data(j) cycle INDEX_LOOP end if end do @@ -227,8 +294,8 @@ contains ! If we made it here, this means the material hasn't yet been added to ! the master list, so add an entry to both the master indices and master ! hits lists - call master_indices(i_cell) % push_back(indices(i_cell) % data(j)) - call master_hits(i_cell) % push_back(hits(i_cell) % data(j)) + call master_indices(i_domain) % push_back(indices(i_domain) % data(j)) + call master_hits(i_domain) % push_back(hits(i_domain) % data(j)) end do INDEX_LOOP end do !$omp end ordered @@ -247,7 +314,7 @@ contains volume_sample = product(this % upper_right - this % lower_left) - do i_cell = 1, size(this % cell_id) + do i_domain = 1, size(this % domain_id) atoms(:, :) = ZERO total_hits = 0 @@ -261,9 +328,9 @@ contains call MPI_RECV(data, 2*n, MPI_INTEGER, j, 1, MPI_COMM_WORLD, & MPI_STATUS_IGNORE, mpi_err) do k = 0, n - 1 - do m = 1, master_indices(i_cell) % size() - if (data(2*k + 1) == master_indices(i_cell) % data(m)) then - master_hits(i_cell) % data(m) = master_hits(i_cell) % data(m) + & + do m = 1, master_indices(i_domain) % size() + if (data(2*k + 1) == master_indices(i_domain) % data(m)) then + master_hits(i_domain) % data(m) = master_hits(i_domain) % data(m) + & data(2*k + 2) end if end do @@ -272,12 +339,12 @@ contains end do #endif - do j = 1, master_indices(i_cell) % size() - total_hits = total_hits + master_hits(i_cell) % data(j) - f = real(master_hits(i_cell) % data(j), 8) / this % samples + do j = 1, master_indices(i_domain) % size() + total_hits = total_hits + master_hits(i_domain) % data(j) + f = real(master_hits(i_domain) % data(j), 8) / this % samples var_f = f*(ONE - f) / this % samples - i_material = master_indices(i_cell) % data(j) + i_material = master_indices(i_domain) % data(j) if (i_material == MATERIAL_VOID) cycle associate (mat => materials(i_material)) @@ -293,9 +360,9 @@ contains end do ! Determine volume - volume(1, i_cell) = real(total_hits, 8) / this % samples * volume_sample - volume(2, i_cell) = sqrt(volume(1, i_cell) * (volume_sample - & - volume(1, i_cell)) / this % samples) + volume(1, i_domain) = real(total_hits, 8) / this % samples * volume_sample + volume(2, i_domain) = sqrt(volume(1, i_domain) * (volume_sample - & + volume(1, i_domain)) / this % samples) ! Determine total number of atoms. At this point, we have values in ! atoms/b-cm. To get to atoms we multiple by 10^24 V. @@ -307,19 +374,19 @@ contains ! Convert full arrays to vectors do j = 1, size(nuclides) if (atoms(1, j) > ZERO) then - call nuclide_vec(i_cell) % push_back(j) - call atoms_vec(i_cell) % push_back(atoms(1, j)) - call uncertainty_vec(i_cell) % push_back(atoms(2, j)) + call nuclide_vec(i_domain) % push_back(j) + call atoms_vec(i_domain) % push_back(atoms(1, j)) + call uncertainty_vec(i_domain) % push_back(atoms(2, j)) end if end do else #ifdef MPI - n = master_indices(i_cell) % size() + n = master_indices(i_domain) % size() allocate(data(2*n)) do k = 0, n - 1 - data(2*k + 1) = master_indices(i_cell) % data(k + 1) - data(2*k + 2) = master_hits(i_cell) % data(k + 1) + data(2*k + 1) = master_indices(i_domain) % data(k + 1) + data(2*k + 2) = master_hits(i_domain) % data(k + 1) end do call MPI_SEND(n, 1, MPI_INTEGER, 0, 0, MPI_COMM_WORLD, mpi_err) @@ -340,7 +407,7 @@ contains uncertainty_vec) type(VolumeCalculation), intent(in) :: this character(*), intent(in) :: filename ! filename for HDF5 file - real(8), intent(in) :: volume(:,:) ! volume mean/stdev in each cell + real(8), intent(in) :: volume(:,:) ! volume mean/stdev in each domain type(VectorInt), intent(in) :: nuclide_vec(:) ! indices in nuclides array type(VectorReal), intent(in) :: atoms_vec(:) ! total # of atoms of each nuclide type(VectorReal), intent(in) :: uncertainty_vec(:) ! uncertainty of total # of atoms @@ -357,15 +424,23 @@ contains file_id = file_create(filename) ! Write basic metadata + select case (this % domain_type) + case (FILTER_CELL) + call write_attribute_string(file_id, ".", "domain_type", "cell") + case (FILTER_MATERIAL) + call write_attribute_string(file_id, ".", "domain_type", "material") + case (FILTER_UNIVERSE) + call write_attribute_string(file_id, ".", "domain_type", "universe") + end select call write_attribute(file_id, "samples", this % samples) call write_attribute(file_id, "lower_left", this % lower_left) call write_attribute(file_id, "upper_right", this % upper_right) - do i = 1, size(this % cell_id) - group_id = create_group(file_id, "cell_" // trim(to_str(& - this % cell_id(i)))) + do i = 1, size(this % domain_id) + group_id = create_group(file_id, "domain_" // trim(to_str(& + this % domain_id(i)))) - ! Write volume for cell + ! Write volume for domain call write_dataset(group_id, "volume", volume(:, i)) ! Create array of nuclide names from the vector diff --git a/src/volume_header.F90 b/src/volume_header.F90 index 3a34f1231a..c70345f155 100644 --- a/src/volume_header.F90 +++ b/src/volume_header.F90 @@ -1,12 +1,14 @@ module volume_header - use error, only: fatal_error + use constants, only: FILTER_CELL, FILTER_MATERIAL, FILTER_UNIVERSE + use error, only: fatal_error use xml_interface implicit none type VolumeCalculation - integer, allocatable :: cell_id(:) + integer :: domain_type + integer, allocatable :: domain_id(:) real(8) :: lower_left(3) real(8) :: upper_right(3) integer :: samples @@ -20,16 +22,31 @@ contains class(VolumeCalculation), intent(out) :: this type(Node), pointer :: node_vol - integer :: num_cells + integer :: num_domains + character(10) :: temp_str + + ! Check domain type + call get_node_value(node_vol, "domain_type", temp_str) + select case (temp_str) + case ('cell') + this % domain_type = FILTER_CELL + case ('material') + this % domain_type = FILTER_MATERIAL + case ('universe') + this % domain_type = FILTER_UNIVERSE + case default + call fatal_error("Unrecognized domain type for stochastic volume & + &calculation: " // trim(temp_str)) + end select ! Read cell IDs - if (check_for_node(node_vol, "cells")) then - num_cells = get_arraysize_integer(node_vol, "cells") + if (check_for_node(node_vol, "domain_ids")) then + num_domains = get_arraysize_integer(node_vol, "domain_ids") else call fatal_error("Must specify at least one cell for a volume calculation") end if - allocate(this % cell_id(num_cells)) - call get_node_array(node_vol, "cells", this % cell_id) + allocate(this % domain_id(num_domains)) + call get_node_array(node_vol, "domain_ids", this % domain_id) ! Read lower-left and upper-right bounding coordinates call get_node_array(node_vol, "lower_left", this % lower_left) diff --git a/tests/test_volume_calc/inputs_true.dat b/tests/test_volume_calc/inputs_true.dat index 2a3f25e6d0..e146703f31 100644 --- a/tests/test_volume_calc/inputs_true.dat +++ b/tests/test_volume_calc/inputs_true.dat @@ -1 +1 @@ -b2de6ac20ca2ca38b00d61adae707d05519f6130eea25ab050220bac005cb6d23fa5812bf876307e92e90a8806f0b371500c5611ab23f80b7c073f118eb31649 \ No newline at end of file +102569289552d021b6803f404a0c17a9c17a40578fdba43a6ba08b77a731e0368fffa6a8a7abd48555167cb9997c6dba9ec5044c8593b12056957b7e3ec44ed0 \ No newline at end of file diff --git a/tests/test_volume_calc/results_true.dat b/tests/test_volume_calc/results_true.dat index e7a39a9312..da6dfd2afc 100644 --- a/tests/test_volume_calc/results_true.dat +++ b/tests/test_volume_calc/results_true.dat @@ -1,7 +1,8 @@ k-combined: 4.165451e-02 3.582531e-04 -Cell 1: 31.4693 +/- 0.0721 cm^3 -Cell 2: 2.0933 +/- 0.0310 cm^3 -Cell 3: 2.0486 +/- 0.0307 cm^3 +Volume calculation 0 +Domain 1: 31.4693 +/- 0.0721 cm^3 +Domain 2: 2.0933 +/- 0.0310 cm^3 +Domain 3: 2.0486 +/- 0.0307 cm^3 Cell Nuclide Atoms Uncertainty 0 1 U235.71c 3.481769e+23 7.979991e+20 1 1 Mo99.71c 3.481769e+22 7.979991e+19 @@ -11,3 +12,20 @@ Cell 3: 2.0486 +/- 0.0307 cm^3 5 3 H1.71c 1.369920e+23 2.051689e+21 6 3 O16.71c 6.849599e+22 1.025844e+21 7 3 B10.71c 6.849599e+18 1.025844e+17 +Volume calculation 1 +Domain 1: 4.1419 +/- 0.0426 cm^3 +Domain 2: 31.4693 +/- 0.0721 cm^3 + Material Nuclide Atoms Uncertainty +0 1 H1.71c 2.769690e+23 2.850068e+21 +1 1 O16.71c 1.384845e+23 1.425034e+21 +2 1 B10.71c 1.384845e+19 1.425034e+17 +3 2 U235.71c 3.481769e+23 7.979991e+20 +4 2 Mo99.71c 3.481769e+22 7.979991e+19 +Volume calculation 2 +Domain 0: 35.6112 +/- 0.0664 cm^3 + Universe Nuclide Atoms Uncertainty +0 0 H1.71c 2.769690e+23 2.850068e+21 +1 0 O16.71c 1.384845e+23 1.425034e+21 +2 0 B10.71c 1.384845e+19 1.425034e+17 +3 0 U235.71c 3.481769e+23 7.979991e+20 +4 0 Mo99.71c 3.481769e+22 7.979991e+19 diff --git a/tests/test_volume_calc/test_volume_calc.py b/tests/test_volume_calc/test_volume_calc.py index a6d779a25a..e2c3eba797 100644 --- a/tests/test_volume_calc/test_volume_calc.py +++ b/tests/test_volume_calc/test_volume_calc.py @@ -1,6 +1,7 @@ #!/usr/bin/env python import os +import glob import sys sys.path.insert(0, os.pardir) from testing_harness import PyAPITestHarness @@ -43,9 +44,12 @@ class VolumeTest(PyAPITestHarness): geometry.export_to_xml() # Set up stochastic volume calculation - vol_calc = openmc.VolumeCalculation( - [inside_cyl, top_hemisphere, bottom_hemisphere], - 100000) + ll, ur = openmc.Union(*[c.region for c in root.cells.values()]).bounding_box + vol_calcs = [ + openmc.VolumeCalculation(list(root.cells.values()), 100000), + openmc.VolumeCalculation([water, fuel], 100000, ll, ur), + openmc.VolumeCalculation([root], 100000, ll, ur) + ] # Define settings settings = openmc.Settings() @@ -54,7 +58,7 @@ class VolumeTest(PyAPITestHarness): settings.inactive = 0 settings.source = openmc.Source(space=openmc.stats.Box( [-1., -1., -5.], [1., 1., 5.])) - settings.volume_calculations = vol_calc + settings.volume_calculations = vol_calcs settings.export_to_xml() def _get_results(self): @@ -65,15 +69,18 @@ class VolumeTest(PyAPITestHarness): # Write out k-combined. outstr = 'k-combined: {:12.6e} {:12.6e}\n'.format(*sp.k_combined) - # Read volume calculation results - vol = openmc.VolumeCalculation.from_hdf5( - os.path.join(os.getcwd(), 'volume_1.h5')) + for i, filename in enumerate(sorted(glob.glob(os.path.join( + os.getcwd(), 'volume_*.h5')))): + outstr += 'Volume calculation {}\n'.format(i) - # Write cell volumes and total # of atoms for each nuclide - for cell_id, results in sorted(vol.results.items()): - outstr += 'Cell {0}: {1[0]:.4f} +/- {1[1]:.4f} cm^3\n'.format( - cell_id, results['volume']) - outstr += str(vol.atoms_dataframe) + '\n' + # Read volume calculation results + vol = openmc.VolumeCalculation.from_hdf5(filename) + + # Write cell volumes and total # of atoms for each nuclide + for uid, results in sorted(vol.results.items()): + outstr += 'Domain {0}: {1[0]:.4f} +/- {1[1]:.4f} cm^3\n'.format( + uid, results['volume']) + outstr += str(vol.atoms_dataframe) + '\n' return outstr From f85bf914d9013b4109fc377da736a7ce134f3cba Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 9 Aug 2016 09:44:30 -0500 Subject: [PATCH 049/168] Refactor get_volume to not use VectorInt within !$omp parallel --- src/volume_calc.F90 | 163 ++++++++++++++++++++++---------------------- 1 file changed, 83 insertions(+), 80 deletions(-) diff --git a/src/volume_calc.F90 b/src/volume_calc.F90 index 03e241a66b..22647c4da9 100644 --- a/src/volume_calc.F90 +++ b/src/volume_calc.F90 @@ -112,9 +112,10 @@ contains integer :: i_domain ! index in domain_id array integer :: i_material ! index in materials array integer :: level ! local coordinate level + integer :: n_mat(size(this % domain_id)) ! Number of materials for each domain + integer, allocatable :: indices(:,:) ! List of material indices for each domain + integer, allocatable :: hits(:,:) ! Number of hits for each material in each domain logical :: found_cell - type(VectorInt) :: indices(size(this % domain_id)) ! List of material indices - type(VectorInt) :: hits(size(this % domain_id)) ! Number of hits for each material type(Particle) :: p ! Shared variables @@ -123,10 +124,10 @@ contains type(VectorInt) :: master_hits(size(this % domain_id)) ! Variables used outside of parallel region - integer :: i_nuclide ! index in nuclides array - integer :: total_hits ! total hits for a single domain (summed over materials) + integer :: i_nuclide ! index in nuclides array + integer :: total_hits ! total hits for a single domain (summed over materials) integer :: min_samples ! minimum number of samples per process - integer :: remainder ! leftover samples from uneven divide + integer :: remainder ! leftover samples from uneven divide #ifdef MPI integer :: m ! index over materials integer :: n ! number of materials @@ -151,15 +152,12 @@ contains call p % initialize() !$omp parallel private(i, j, k, i_domain, i_material, level, found_cell, & -!$omp& indices, hits) firstprivate(p) +!$omp& indices, hits, n_mat) firstprivate(p) - ! Reset vectors -- this is really to get around a gfortran 4.6 bug. Ideally, - ! indices and hits would just be firstprivate but 4.6 complains because they - ! have allocatable components... - do i_domain = 1, size(this % domain_id) - call indices(i_domain) % clear() - call hits(i_domain) % clear() - end do + ! Create space for material indices and number of hits for each + allocate(indices(size(this % domain_id), 8)) + allocate(hits(size(this % domain_id), 8)) + n_mat(:) = 0 call prn_set_stream(STREAM_VOLUME) @@ -185,83 +183,32 @@ contains if (.not. found_cell) cycle if (this % domain_type == FILTER_MATERIAL) then - ! ====================================================================== - ! MATERIAL VOLUME - i_material = p % material - MATERIAL_LOOP: do i_domain = 1, size(this % domain_id) + do i_domain = 1, size(this % domain_id) if (i_material == materials(i_domain) % id) then - ! Check if we've already had a hit in this material and if so, - ! simply add one - do j = 1, indices(i_domain) % size() - if (indices(i_domain) % data(j) == i_material) then - hits(i_domain) % data(j) = hits(i_domain) % data(j) + 1 - cycle MATERIAL_LOOP - end if - end do - - ! If we make it here, that means we haven't yet had a hit in this - ! material. Add an entry to both the indices list and the hits list - call indices(i_domain) % push_back(i_material) - call hits(i_domain) % push_back(1) + call check_hit(i_domain, i_material, indices, hits, n_mat) end if - end do MATERIAL_LOOP + end do elseif (this % domain_type == FILTER_CELL) THEN - ! ====================================================================== - ! CELL VOLUME - do level = 1, p % n_coord - CELL_LOOP: do i_domain = 1, size(this % domain_id) + do i_domain = 1, size(this % domain_id) if (cells(p % coord(level) % cell) % id == this % domain_id(i_domain)) then - - ! Determine what material this is i_material = p % material - - ! Check if we've already had a hit in this material and if so, - ! simply add one - do j = 1, indices(i_domain) % size() - if (indices(i_domain) % data(j) == i_material) then - hits(i_domain) % data(j) = hits(i_domain) % data(j) + 1 - cycle CELL_LOOP - end if - end do - - ! If we make it here, that means we haven't yet had a hit in this - ! material. Add an entry to both the indices list and the hits list - call indices(i_domain) % push_back(i_material) - call hits(i_domain) % push_back(1) + call check_hit(i_domain, i_material, indices, hits, n_mat) end if - end do CELL_LOOP + end do end do elseif (this % domain_type == FILTER_UNIVERSE) then - ! ====================================================================== - ! UNIVERSE VOLUME - do level = 1, p % n_coord - UNIVERSE_LOOP: do i_domain = 1, size(this % domain_id) + do i_domain = 1, size(this % domain_id) if (universes(p % coord(level) % universe) % id == & this % domain_id(i_domain)) then - - ! Determine what material this is i_material = p % material - - ! Check if we've already had a hit in this material and if so, - ! simply add one - do j = 1, indices(i_domain) % size() - if (indices(i_domain) % data(j) == i_material) then - hits(i_domain) % data(j) = hits(i_domain) % data(j) + 1 - cycle UNIVERSE_LOOP - end if - end do - - ! If we make it here, that means we haven't yet had a hit in this - ! material. Add an entry to both the indices list and the hits list - call indices(i_domain) % push_back(i_material) - call hits(i_domain) % push_back(1) + call check_hit(i_domain, i_material, indices, hits, n_mat) end if - end do UNIVERSE_LOOP + end do end do end if @@ -280,13 +227,13 @@ contains THREAD_LOOP: do i = 1, omp_get_num_threads() !$omp ordered do i_domain = 1, size(this % domain_id) - INDEX_LOOP: do j = 1, indices(i_domain) % size() + INDEX_LOOP: do j = 1, n_mat(i_domain) ! Check if this material has been added to the master list and if so, ! accumulate the number of hits do k = 1, master_indices(i_domain) % size() - if (indices(i_domain) % data(j) == master_indices(i_domain) % data(k)) then + if (indices(i_domain, j) == master_indices(i_domain) % data(k)) then master_hits(i_domain) % data(k) = & - master_hits(i_domain) % data(k) + hits(i_domain) % data(j) + master_hits(i_domain) % data(k) + hits(i_domain, j) cycle INDEX_LOOP end if end do @@ -294,16 +241,20 @@ contains ! If we made it here, this means the material hasn't yet been added to ! the master list, so add an entry to both the master indices and master ! hits lists - call master_indices(i_domain) % push_back(indices(i_domain) % data(j)) - call master_hits(i_domain) % push_back(hits(i_domain) % data(j)) + call master_indices(i_domain) % push_back(indices(i_domain, j)) + call master_hits(i_domain) % push_back(hits(i_domain, j)) end do INDEX_LOOP end do !$omp end ordered end do THREAD_LOOP !$omp end do #else - master_indices = indices - master_hits = hits + do i_domain = 1, size(this % domain_id) + do j = 1, n_mat(i_domain) + call master_indices(i_domain) % push_back(indices(i_domain, j)) + call master_hits(i_domain) % push_back(hits(i_domain, j)) + end do + end do #endif call prn_set_stream(STREAM_TRACKING) @@ -396,6 +347,58 @@ contains end if end do + contains + + !=========================================================================== + ! CHECK_HIT is an internal subroutine that checks for whether a material has + ! already been hit for a given domain. If not, it increases the list size by + ! one (taking care of re-allocation if needed). + !=========================================================================== + + subroutine check_hit(i_domain, i_material, indices, hits, n_mat) + integer :: i_domain + integer :: i_material + integer, allocatable :: indices(:,:) + integer, allocatable :: hits(:,:) + integer :: n_mat(:) + + integer, allocatable :: temp(:,:) + logical :: already_hit + integer :: j, k, nm + + ! Check if we've already had a hit in this material and if so, + ! simply add one + already_hit = .false. + nm = n_mat(i_domain) + do j = 1, nm + if (indices(i_domain, j) == i_material) then + hits(i_domain, j) = hits(i_domain, j) + 1 + already_hit = .true. + end if + end do + + if (.not. already_hit) then + ! If we make it here, that means we haven't yet had a hit in this + ! material. First check if the indices and hits arrays are large enough + ! and if not, double them. + if (nm == size(indices, 2)) then + k = 2*size(indices, 2) + allocate(temp(size(this % domain_id), k)) + temp(:, 1:nm) = indices(:, 1:nm) + call move_alloc(FROM=temp, TO=indices) + + allocate(temp(size(this % domain_id), k)) + temp(:, 1:nm) = hits(:, 1:nm) + call move_alloc(FROM=temp, TO=indices) + end if + + ! Add an entry to both the indices list and the hits list + n_mat(i_domain) = n_mat(i_domain) + 1 + indices(i_domain, n_mat(i_domain)) = i_material + hits(i_domain, n_mat(i_domain)) = 1 + end if + end subroutine check_hit + end subroutine get_volume !=============================================================================== From 651ee4240b24fa476bd8ba47606f9d89f9d317f7 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Wed, 10 Aug 2016 11:29:32 -0500 Subject: [PATCH 050/168] Address #698 comments --- docs/source/io_formats/fission_energy.rst | 4 ++-- openmc/data/function.py | 10 +++++----- scripts/openmc-ace-to-hdf5 | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/source/io_formats/fission_energy.rst b/docs/source/io_formats/fission_energy.rst index 1d3231ee34..768db56ebb 100644 --- a/docs/source/io_formats/fission_energy.rst +++ b/docs/source/io_formats/fission_energy.rst @@ -9,8 +9,8 @@ ENDF-102_ for details). It gives the information needed to compute the energy carried away from fission reactions by each reaction product (e.g. fragment nuclei, neutrons) which depends on the incident neutron energy. OpenMC is distributed with one of these files under -openmc/data/fission_Q_data_endfb71.h5. More files of this format can be -created from ENDF files with the +data/fission_Q_data_endfb71.h5. More files of this format can be created from +ENDF files with the ``openmc.data.write_compact_458_library`` function. They can be read with the ``openmc.data.FissionEnergyRelease.from_compact_hdf5`` class method. diff --git a/openmc/data/function.py b/openmc/data/function.py index 798aa18cdd..0d4fd3b1d8 100644 --- a/openmc/data/function.py +++ b/openmc/data/function.py @@ -13,12 +13,11 @@ INTERPOLATION_SCHEME = {1: 'histogram', 2: 'linear-linear', 3: 'linear-log', class Function1D(object): """A function of one independent variable with HDF5 support.""" - __metaclass__ = ABCMeta - def __init__(self): pass - @abstractmethod - def __call__(self): pass + def __call__(self): + raise NotImplemented('Subclasses of Function1D should overwrite the ' + '__call__ and to_hdf5 methods') @abstractmethod def to_hdf5(self, group, name='xy'): @@ -32,7 +31,8 @@ class Function1D(object): Name of the dataset to create """ - pass + raise NotImplemented('Subclasses of Function1D should overwrite the ' + '__call__ and to_hdf5 methods') @classmethod def from_hdf5(cls, dataset): diff --git a/scripts/openmc-ace-to-hdf5 b/scripts/openmc-ace-to-hdf5 index 90031f0faa..2051de00b6 100755 --- a/scripts/openmc-ace-to-hdf5 +++ b/scripts/openmc-ace-to-hdf5 @@ -124,7 +124,7 @@ for filename in ace_libraries: # Fission energy release data, if available if args.fission_energy_release is not None: fer = openmc.data.FissionEnergyRelease.from_compact_hdf5( - args.fission_energy_release, neutron) + args.fission_energy_release, neutron) if fer is not None: neutron.fission_energy = fer From d6ae522c2a70e980319404304b0a8b4b95a10ffa Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Sat, 6 Aug 2016 17:28:53 -0400 Subject: [PATCH 051/168] updated mgxs tests --- .../pythonapi/examples/mdgxs-part-i.ipynb | 254 ++-- .../pythonapi/examples/mdgxs-part-ii.ipynb | 42 +- .../pythonapi/examples/mgxs-part-ii.ipynb | 1053 ++++++++++------- .../pythonapi/examples/mgxs-part-iii.ipynb | 420 +++---- openmc/mgxs/library.py | 21 +- openmc/mgxs/mdgxs.py | 253 +++- openmc/mgxs/mgxs.py | 219 ++-- .../test_mgxs_library_condense.py | 3 +- .../test_mgxs_library_distribcell.py | 3 +- .../test_mgxs_library_hdf5.py | 2 +- .../test_mgxs_library_mesh.py | 3 +- .../results_true.dat | 120 +- .../test_mgxs_library_no_nuclides.py | 3 +- .../results_true.dat | 2 +- .../test_mgxs_library_nuclides.py | 1 + 15 files changed, 1354 insertions(+), 1045 deletions(-) diff --git a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb index 94be516fca..b180141834 100644 --- a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb @@ -265,7 +265,7 @@ "cell_type": "code", "execution_count": 8, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -308,7 +308,7 @@ "cell_type": "code", "execution_count": 10, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -404,6 +404,7 @@ "prompt_nu_fission = mgxs.PromptNuFissionXS(domain=cell, groups=energy_groups, by_nuclide=True)\n", "chi_delayed = mgxs.ChiDelayed(domain=cell, energy_groups=energy_groups, by_nuclide=True)\n", "delayed_nu_fission = mgxs.DelayedNuFissionXS(domain=cell, energy_groups=energy_groups, delayed_groups=delayed_groups, by_nuclide=True)\n", + "#delayed_nu_fission = mgxs.DelayedNuFissionXS(domain=cell, energy_groups=energy_groups, by_nuclide=True)\n", "beta = mgxs.Beta(domain=cell, energy_groups=energy_groups, delayed_groups=delayed_groups, by_nuclide=True)\n", "\n", "chi_prompt.nuclides = ['U235', 'Pu239']\n", @@ -580,8 +581,8 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.8.0\n", - " Git SHA1: ad9fe27d26940a7120ed920d37d9cb176bde6402\n", - " Date/Time: 2016-08-06 15:47:51\n", + " Git SHA1: be7e6e035d22944a8c80ca32f99935b6822854c9\n", + " Date/Time: 2016-08-10 15:46:45\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -668,20 +669,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.7100E-01 seconds\n", - " Reading cross sections = 2.6500E-01 seconds\n", - " Total time in simulation = 8.5400E+01 seconds\n", - " Time in transport only = 8.5378E+01 seconds\n", - " Time in inactive batches = 4.8000E+00 seconds\n", - " Time in active batches = 8.0600E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-02 seconds\n", - " Sampling source sites = 8.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Total time for initialization = 7.7400E-01 seconds\n", + " Reading cross sections = 4.7500E-01 seconds\n", + " Total time in simulation = 8.9596E+01 seconds\n", + " Time in transport only = 8.9573E+01 seconds\n", + " Time in inactive batches = 4.8730E+00 seconds\n", + " Time in active batches = 8.4723E+01 seconds\n", + " Time synchronizing fission bank = 3.0000E-03 seconds\n", + " Sampling source sites = 1.0000E-03 seconds\n", + " SEND/RECV source sites = 2.0000E-03 seconds\n", " Time accumulating tallies = 1.0000E-03 seconds\n", " Total time for finalization = 7.2000E-02 seconds\n", - " Total time elapsed = 8.5969E+01 seconds\n", - " Calculation Rate (inactive) = 10416.7 neutrons/second\n", - " Calculation Rate (active) = 2481.39 neutrons/second\n", + " Total time elapsed = 9.0468E+01 seconds\n", + " Calculation Rate (inactive) = 10260.6 neutrons/second\n", + " Calculation Rate (active) = 2360.63 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -794,61 +795,28 @@ }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "Multi-Delayed-Group XS\n", - "\tReaction Type =\tdelayed-nu-fission\n", - "\tDomain Type =\tcell\n", - "\tDomain ID =\t1\n", - "\tNuclide =\tU235\n", - "\tCross Sections [cm^-1]:\n", - " Delayed Group 1:\t\n", - " Group 1 [1e-09 - 19.9526231497MeV]:\t5.14e-06 +/- 1.76e-01%\n", - "\n", - " Delayed Group 2:\t\n", - " Group 1 [1e-09 - 19.9526231497MeV]:\t2.65e-05 +/- 1.76e-01%\n", - "\n", - " Delayed Group 3:\t\n", - " Group 1 [1e-09 - 19.9526231497MeV]:\t2.53e-05 +/- 1.76e-01%\n", - "\n", - " Delayed Group 4:\t\n", - " Group 1 [1e-09 - 19.9526231497MeV]:\t5.68e-05 +/- 1.76e-01%\n", - "\n", - " Delayed Group 5:\t\n", - " Group 1 [1e-09 - 19.9526231497MeV]:\t2.33e-05 +/- 1.76e-01%\n", - "\n", - " Delayed Group 6:\t\n", - " Group 1 [1e-09 - 19.9526231497MeV]:\t9.76e-06 +/- 1.76e-01%\n", - "\n", - "\n", - "\tNuclide =\tPu239\n", - "\tCross Sections [cm^-1]:\n", - " Delayed Group 1:\t\n", - " Group 1 [1e-09 - 19.9526231497MeV]:\t1.16e-06 +/- 1.90e-01%\n", - "\n", - " Delayed Group 2:\t\n", - " Group 1 [1e-09 - 19.9526231497MeV]:\t7.58e-06 +/- 1.90e-01%\n", - "\n", - " Delayed Group 3:\t\n", - " Group 1 [1e-09 - 19.9526231497MeV]:\t5.74e-06 +/- 1.90e-01%\n", - "\n", - " Delayed Group 4:\t\n", - " Group 1 [1e-09 - 19.9526231497MeV]:\t1.05e-05 +/- 1.90e-01%\n", - "\n", - " Delayed Group 5:\t\n", - " Group 1 [1e-09 - 19.9526231497MeV]:\t5.46e-06 +/- 1.90e-01%\n", - "\n", - " Delayed Group 6:\t\n", - " Group 1 [1e-09 - 19.9526231497MeV]:\t1.65e-06 +/- 1.90e-01%\n", - "\n", - "\n", - "\n" - ] + "data": { + "text/plain": [ + "array([[[[ 5.14239169e-06, 1.16429778e-06]],\n", + "\n", + " [[ 2.65434434e-05, 7.58244504e-06]],\n", + "\n", + " [[ 2.53406770e-05, 5.73814391e-06]],\n", + "\n", + " [[ 5.68158884e-05, 1.04761254e-05]],\n", + "\n", + " [[ 2.32937121e-05, 5.45676114e-06]],\n", + "\n", + " [[ 9.75765501e-06, 1.65156185e-06]]]])" + ] + }, + "execution_count": 18, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "delayed_nu_fission.get_condensed_xs(one_group).print_xs()" + "delayed_nu_fission.get_condensed_xs(one_group).get_xs()" ] }, { @@ -865,14 +833,6 @@ "collapsed": false }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/lib/shape_base.py:873: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n", - " return c.reshape(shape_out)\n" - ] - }, { "data": { "text/html": [ @@ -891,131 +851,111 @@ " \n", " \n", " \n", - " 0\n", + " 198\n", " 1\n", " 1\n", " 1\n", " U235\n", - " 0.000228\n", - " 4.753468e-07\n", + " 9.533842e-11\n", + " 4.789050e-11\n", " \n", " \n", - " 1\n", + " 199\n", " 1\n", " 1\n", " 1\n", " Pu239\n", - " 0.000081\n", - " 1.885620e-07\n", + " 1.606499e-11\n", + " 8.071081e-12\n", " \n", " \n", - " 2\n", + " 398\n", " 1\n", " 2\n", " 1\n", " U235\n", - " 0.001175\n", - " 2.453594e-06\n", + " 1.224131e-09\n", + " 6.149449e-10\n", " \n", " \n", - " 3\n", + " 399\n", " 1\n", " 2\n", " 1\n", " Pu239\n", - " 0.000531\n", - " 1.228003e-06\n", + " 2.602518e-10\n", + " 1.307590e-10\n", " \n", " \n", - " 4\n", + " 598\n", " 1\n", " 3\n", " 1\n", " U235\n", - " 0.001122\n", - " 2.342414e-06\n", + " 9.033000e-10\n", + " 4.537601e-10\n", " \n", " \n", - " 5\n", + " 599\n", " 1\n", " 3\n", " 1\n", " Pu239\n", - " 0.000402\n", - " 9.293122e-07\n", + " 1.522295e-10\n", + " 7.648264e-11\n", " \n", " \n", - " 6\n", + " 798\n", " 1\n", " 4\n", " 1\n", " U235\n", - " 0.002516\n", - " 5.251885e-06\n", + " 1.749138e-09\n", + " 8.786432e-10\n", " \n", " \n", - " 7\n", + " 799\n", " 1\n", " 4\n", " 1\n", " Pu239\n", - " 0.000733\n", - " 1.696645e-06\n", + " 2.400317e-10\n", + " 1.205943e-10\n", " \n", " \n", - " 8\n", + " 998\n", " 1\n", " 5\n", " 1\n", " U235\n", - " 0.001031\n", - " 2.153199e-06\n", + " 2.724017e-10\n", + " 1.368376e-10\n", " \n", " \n", - " 9\n", + " 999\n", " 1\n", " 5\n", " 1\n", " Pu239\n", - " 0.000382\n", - " 8.837413e-07\n", - " \n", - " \n", - " 10\n", - " 1\n", - " 6\n", - " 1\n", - " U235\n", - " 0.000432\n", - " 9.019675e-07\n", - " \n", - " \n", - " 11\n", - " 1\n", - " 6\n", - " 1\n", - " Pu239\n", - " 0.000116\n", - " 2.674761e-07\n", + " 4.749191e-11\n", + " 2.386080e-11\n", " \n", " \n", "\n", "" ], "text/plain": [ - " cell delayedgroup group in nuclide mean std. dev.\n", - "0 1 1 1 U235 0.000228 4.753468e-07\n", - "1 1 1 1 Pu239 0.000081 1.885620e-07\n", - "2 1 2 1 U235 0.001175 2.453594e-06\n", - "3 1 2 1 Pu239 0.000531 1.228003e-06\n", - "4 1 3 1 U235 0.001122 2.342414e-06\n", - "5 1 3 1 Pu239 0.000402 9.293122e-07\n", - "6 1 4 1 U235 0.002516 5.251885e-06\n", - "7 1 4 1 Pu239 0.000733 1.696645e-06\n", - "8 1 5 1 U235 0.001031 2.153199e-06\n", - "9 1 5 1 Pu239 0.000382 8.837413e-07\n", - "10 1 6 1 U235 0.000432 9.019675e-07\n", - "11 1 6 1 Pu239 0.000116 2.674761e-07" + " cell delayedgroup group in nuclide mean std. dev.\n", + "198 1 1 1 U235 9.533842e-11 4.789050e-11\n", + "199 1 1 1 Pu239 1.606499e-11 8.071081e-12\n", + "398 1 2 1 U235 1.224131e-09 6.149449e-10\n", + "399 1 2 1 Pu239 2.602518e-10 1.307590e-10\n", + "598 1 3 1 U235 9.033000e-10 4.537601e-10\n", + "599 1 3 1 Pu239 1.522295e-10 7.648264e-11\n", + "798 1 4 1 U235 1.749138e-09 8.786432e-10\n", + "799 1 4 1 Pu239 2.400317e-10 1.205943e-10\n", + "998 1 5 1 U235 2.724017e-10 1.368376e-10\n", + "999 1 5 1 Pu239 4.749191e-11 2.386080e-11" ] }, "execution_count": 19, @@ -1024,8 +964,8 @@ } ], "source": [ - "df = beta.get_condensed_xs(one_group).get_pandas_dataframe()\n", - "df.head(12)" + "df = delayed_nu_fission.get_pandas_dataframe()\n", + "df.head(10)" ] }, { @@ -1061,8 +1001,8 @@ }, "outputs": [], "source": [ - "chi_prompt.build_hdf5_store(filename='mgxs', append=True)\n", - "chi_delayed.build_hdf5_store(filename='mgxs', append=True)" + "chi_prompt.build_hdf5_store(filename='mdgxs', append=True)\n", + "chi_delayed.build_hdf5_store(filename='mdgxs', append=True)" ] }, { @@ -1315,9 +1255,9 @@ }, { "data": { - "image/png": "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\n771XLz/wwAO55JJLWLBgAfPmzVt9R8qOtPXkVe/EUikFl7+jrW3T5r6SGshKOGdGxNK0+HLggxGx\nK1mp5sftjtisizQ3w9KlVTfr1pYuza7D1rjjjjtYuHAhr7zyCj/72c/o379/m9ufcsopq29XfOGF\nF6617tvf/jZTp07lpptuqrhvv379GDNmDBdccAEvvvgiAP/1X//Fbrvtxq677so+++zD4YcfzoYb\nbsgWW2xRmwusoN5VYbOBYSWvtwHmlm0zC9gWmCupLzAwIt6UNDstX2dfSRuQJZVrI+KOlg0i4l8l\n2/8auKu1wJpLPv1NTU00NTXlviizeih6UmnRna6jM1VXNYuhQulk0003XavEMG/evNXPr7jiCq64\n4op19hk3bhz33Xcfjz76KA0NDW2ec/ny5bz88svsvPPO9O/fn0svvZRLL70UgF/96lfsvvvuuare\nJk2axKRJk6put448dwPr6APoC/w3MBzoBzwH7Fi2zanA5en5WLJ2FYCdgGfTfiPTcVpuTHYNWSN9\n+fm2Knl+FnBDK3FVv4Wa2XqW3aE9exRRV8Xfnf+eR4wYEQ8++OA6y48++ug4+uijY/ny5TF58uQY\nMmRIHHvssa0e5wc/+EGMGjUq5s2bt866J598Mh577LF47733YtmyZXHhhRfGgAED4vXXX4+IiDlz\n5sTcuXMjIuKJJ56IbbfdNh544IE2427tPSXnHSTXx22ADwD+DswAzknLxgOfS883Am5O658ERpTs\ne25KKNOA0WnZ3sDKlKSeBaYAB8SahPNCWvf/gC1bianNN9WsKzixdPS83fcNGzlyZMXE8vLLL8de\ne+0VjY2N8bnPfS7OPPPMNhOLpOjfv380Njauvl3xBRdcEBERjzzySOyyyy4xYMCAGDx4cDQ1NcVj\njz22et9HH300RowYEZtuumnssMMOceONN1aNu7OJxbcmNusmSmsmivjx7Kr4fWvi2vOtic3MrFup\n2ngv6ePAMcAnga2BZcBfgd8D10XEorpGaGZmhdJmVZikP5D1xLoD+AvwT6A/sD2wL3AwWSP6nfUP\ntXZcFWbdkavCOnpeV4XVWmerwqolliERsaBKAFW36W6cWKw7cmLp6HmdWGqtrm0sLQlD0qZp3i8k\nbS/pEEkblm5jZmYG+RvvHwX6SxoK3A8cC/y2XkGZmVlx5R15r4h4R9IJZIMZL5L0bD0DMzPLY/jw\n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\n", + "image/png": "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\nA9YuP+yww7jqqqtYtGgRCxYsWHtHyra09eRV78RSKQWXv6PNbdPivpL6kJVwzo+I5WnxdcCHI2JP\nslLND1sdsVkHGTMGli+vulmntnx5dh22zr333svixYt59dVXueaaa+jVq1eL25911llrb1d8+eWX\nr7fum9/8JtOmTePXv/51xX179uzJyJEjueyyy3j55ZcB+K//+i/22msv9txzTw488ECOOeYYNtts\nM7bZZpvaXGAF9a4KmwsMLnm9AzC/bJs5wI7AfEmbAP0i4i1Jc9PyDfaVtClZUrk5Iu5t2iAi/lmy\n/S+Aic0FNqbk09/Y2EhjY2PuizKrh6InlSad6TraU3VVsxgqlE569+69XolhwYIFa59ff/31XH/9\n9RvsM3r0aB588EGeeOIJ+vTp0+I5V65cySuvvMLuu+9Or169uPrqq7n66qsB+PnPf87ee++dq+pt\n8uTJTJ48uep2G8hzN7C2PoBNgP8GhgA9gReAXcu2ORu4Lj0fRdauArAb8Hzab1g6TtONyW4ia6Qv\nP992Jc8vAG5rJq7qt1Az28iyO7RnjyLqqPg789/z0KFD45FHHtlg+YknnhgnnnhirFy5MqZMmRID\nBw6Mk08+udnjfO9734vhw4fHggULNlj39NNPx5NPPhnvv/9+rFixIi6//PLo27dvvPHGGxERMW/e\nvJg/f35ERDz11FOx4447xsMPP9xi3M29p+S8g+TGuA3wocDfgFnARWnZWOBz6fnmwB1p/dPA0JJ9\nL04JZTowIi07AFidktTzwFTg0FiXcF5K6/4fsG0zMbX4ppp1BCeWtp63875hw4YNq5hYXnnlldhv\nv/2ioaEhPve5z8X555/fYmKRFL169YqGhoa1tyu+7LLLIiLi8ccfjz322CP69u0bAwYMiMbGxnjy\nySfX7vvEE0/E0KFDo3fv3rHLLrvE7bffXjXu9iYW35rYrJMorZko4sezo+L3rYlrz7cmNjOzTqVq\n472k/YGTgE8C2wMrgL8AvwVuiYgldY3QzMwKpcWqMEm/I+uJdS/wZ+AfQC9gZ+Ag4AiyRvT76h9q\n7bgqzDojV4W19byuCqu19laFVUssAyNiUZUAqm7T2TixWGfkxNLW8zqx1Fpd21iaEoak3mneLyTt\nLOlISZuVbmNmZgb5G++fAHpJGgQ8AnwR+FW9gjIzs+LKO/JeEfGupNOAayLiCknP1zMwM7M8hgwZ\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1378,9 +1318,9 @@ }, { "data": { - "image/png": "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\n9erFmWeeyRtvvAFAkyZNgmWqSk5ODjt37mTHjh2AnT5zwoQJFBQU0KZNGyZMmBDTNPTCCy9w3HHH\n0bp1a8aPH1+ts3/wwQc5/vjjadOmDQMHDmTdunUR21m6dCmnnHIKBQUFFBcXh/xIBw8ezF/+8peQ\n+ieddBJPP23/dNasWUP//v1p06YNxx13HE888USw3o4dOzj//PMpKCigd+/eCaU3bciULi8NboaG\nR1IVg6oeAK4Dngc+Bhao6iciUioigwFE5Mcish64CLhPRAKJfYcCfYCxIvK+iLwnIifWpXyW30JK\npdoWzS4bqX5dRJ9cv359sKOMhldzyPfff8/KlSurpfw86aSTaNq0KRdccAFXXHFFMEdDIMxugIMH\nD7JhwwZ2795dre3t27dz0UUXcdttt7Ft2zaOPvpoXnvttWD5U089xe9//3ueeuoptm7dyplnnsmI\nESMiypmXl8fcuXPZtWsXS5Ys4b777gt2/IEcDQFWrVrFpk2bGDRoEHv37qV///6MHDmSbdu2MX/+\nfK699lo++eQTAK699lqaN2/Oli1bmD17tmf/h8FgqCLpsZJU9TlVPUZVu6rq751jJar6rPP5HVXt\nqKotVfVQZ3oqqvqYqjZR1VNU9WTn73+SLW99csEFF1BYWMhZZ51Fv379IialqSlXX301J598Mv37\n9w85vmrVKnbv3s28efM444wzgscHDhzI3XffzbZt2/jqq6+CWeH27t1bre2lS5dywgkn8LOf/YxG\njRpx/fXX065du2D5Aw88wJQpU+jWrRs5OTnceOONfPDBByFJfwKcddZZQeX1ox/9iOHDh7N8+XIA\nhgwZwmeffRZ823/00UcZNmwYjRo14tlnn6Vz586MHj0aEaFHjx5ceOGFLFy4kIMHD/Lkk09yyy23\n0LRpU0444QTGjBmT4BM1GBoeJoheClm8eDE7duzgyy+/5M9//jNNmjSJe84111wTzMXw+9//PqRs\n8uTJrF69Omou58aNGzNs2DBmzJjBhx/aA7OpU6dy8skn06NHD/r06cPPfvYzcnNzOeyww6qdH57y\nEwjZLy8vZ+LEicF0nG3atEFEqmVbA3jrrbc4++yzOeyww2jVqhX3339/MOVn48aNGTp0KI8++iiq\nyvz584O5oMvLy3nzzTdDUn7OmzePLVu2sHXrViorKznyyCOD12mwwfn8JVVbBALO6Ax0z0Uk/F6y\n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\n", + "image/png": "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\nvPBCdR+hwWCIQFYrhnSlsrKS4cOHM2rUKI4++uigtO+//54dO3bw8MMP06VLl8DxIUOGsHz5cjZv\n3szjjz/OHXfcwT//+c+w5T/33HOMHj2a4447jkMPPRTLsoJ6OH//+9+5//77KSgooHHjxtx6663M\nnDkzbFkXX3wxRxxxBACXXnopnTt35sMPPwTg8ssv55lnDob6nj59OpdffnngGtdeey2nnXYaIsKI\nESNo0KAB77//Pu+//z6VlZWMGTOGevXqcfHFF3P66afX4EmmLyW9SwJbTbB8VmAzGEIx5qpJol69\nelRUVAQdq6iooH79+gCcf/75vPPOO4gIjz32GMOG2WEsVJXhw4fToEEDHnroobBlH3rooVxzzTUc\ndthhrFixgpYtW3LssccG0s8880zGjh3L888/z5AhQ6qcv2HDBk477WCI7cLCwsD3zZs3s2fPHrp1\n6xY4duDAgYhDY0899RT3339/YKL7hx9+YMuWLQB0796dvLw8Fi5cSKtWrfj6668ZOHAgYLs0eeqp\npwL3qKpUVFSwYYMd56lt27ZB13HLmA3UxETVTenC0lory5B5ZLVisKzqDQVVN380OnToQFlZGccc\nc9Aj+TfffBPYnzdvXtjzrrzySrZs2cK8efOoV69exPL379/Pnj17WL9+PS1btqySHs1Ms3Xr1kHm\npuXl5YE5hpYtW9KoUSO+/PJLWrduHfUe16xZw9VXX82CBQs488wzATjllFOCrjty5EimT59Oq1at\nuOSSS8jNzQWgffv2jB8/nttuu61KuYsWLWL9+vVVrtWpU6eo8hgMBm+YoaQkMWTIECZOnMj69etR\nVd58803mzJnDJZdcEvGca6+9lhUrVvDKK68EKlA/b775Jp999hkHDhxg586d3HzzzTRv3pzjjjsO\ngFdeeYXt27cD8OGHHzJlyhQuvPDCsNcZPHgwTz75JMuXL2fPnj1B8wciwlVXXcVNN93E5s2bAVi/\nfj2vv/56lXJ++OEHcnJyaNmyJQcOHOCJJ57giy++CMozfPhwXnrpJZ555pnAMBLAVVddxaOPPhoY\ndvrhhx+YN28eP/zwA2eeeSaHHHIIDz30EPv37+fFF18M5DMYDPFjFEOSmDBhAmeddRY9e/akefPm\n3HrrrcyYMYPjjz8+bP41a9bw+OOP89lnn3HEEUcE1iL4x/a3b9/OsGHDaNq0KZ07d2b16tXMnz8/\n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\nalQgII2f77//nh9//DHQGvczZMgQrrnmGo444gjef/99Lr74Ypo1a8aQIUPCXkNEuPPOO6lfvz5n\nn302/fviYcdKAAAgAElEQVT359lnn2X8+PEADBo0iB49egBQv359nn32WZYuXUqjRo0oLCxk3Lhx\nTJ8+PaAY3OE4hwwZwt13301JSQn169fn5z//Obm5uaxatYqTT7Y9rfTv35+f/exnANx1110UFBSw\nfv162rZtC1S/x5XOhBvWSfc4C4nGDFXFh9cIbk2Bbc73ggTJklXUq1ePioqKoGMVFRXUr18fgPPP\nP5933nkHEeGxxx4LOJNTVYYPH06DBg0C8ZlDOfTQQ7nmmms47LDDWLFiBS1btuTYY48NpJ955pmM\nHTuW559/PqJiaNasGQ0bNgzsFxYWsmHDhsC+O6Tnli1bqKioCFJEhYWFQSE9jzjiiCD5AFq2bBl0\nbPfug61kd/mNGzemefPmbNiwIaAYsp10r/dMxZ3aeFEMk4BPRWQBIMDZQPxR61OASN3Qmu5Xhw4d\nOlBWVsYxxxwTOPbNN98E9ufNC28dfOWVV7JlyxbmzZtHvXr1Ipa/f/9+9uzZw/r164MqYD+xXEH4\nex7+SnzNmjWcdNJJQef7admyJfXr16e8vDyggMrLy+OqxN0hQ3fv3s22bduySinEaw2U6b6SYmFc\nZsRHVMUg9r//30AP7HkGAX6vqt9GO88QmyFDhjBx4kROPPFE2rRpw1tvvcWcOXMCQzXhuPbaa1mx\nYgVvvvkmubm5QWlvvvkmLVu25OSTT2b37t3cfvvtNG/enOOOOw6AV155hbPPPpumTZvy4YcfMmXK\nFO65556I11JVSkpKuOuuu3j//feZO3dulTkLPzk5OQwePJjx48czbdo0tm7dyv3338/vfve7qOVH\nY968ebz33nucdtpp/PGPf6RHjx60adMGgFatWrF69WqOPPLIqGWkM/FWxqWu+Ds1qRcTvbLaVNyp\nTVTFoKoqIi+rajfglTqSKSuYMGECJSUl9OzZk+3bt3PUUUcxY8YMjj/++LD516xZw+OPP07Dhg0D\nwzLuYabt27dz4403sn79eg499FBOP/105s+fH1Ags2bN4oorrmDfvn20a9eO2267jeHDh0eUr3Xr\n1jRr1ow2bdrQuHFjHnvsscDEczhz0SlTpnDjjTdy5JFHcuihh3L11VcH5hfCEVpG6P5ll12GZVks\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1388,21 +1328,15 @@ } ], "source": [ - "chi_d_u235 = chi_delayed.xs_tally.get_values(nuclides=['U235'])\n", - "chi_d_pu239 = chi_delayed.xs_tally.get_values(nuclides=['Pu239'])\n", - "chi_p_u235 = chi_prompt.xs_tally.get_values(nuclides=['U235'])\n", - "chi_p_pu239 = chi_prompt.xs_tally.get_values(nuclides=['Pu239'])\n", + "chi_d_u235 = np.squeeze(chi_delayed.get_xs(nuclides=['U235'], order_groups='decreasing'))\n", + "chi_d_pu239 = np.squeeze(chi_delayed.get_xs(nuclides=['Pu239'], order_groups='decreasing'))\n", + "chi_p_u235 = np.squeeze(chi_prompt.get_xs(nuclides=['U235'], order_groups='decreasing'))\n", + "chi_p_pu239 = np.squeeze(chi_prompt.get_xs(nuclides=['Pu239'], order_groups='decreasing'))\n", "\n", - "# Reshape the betas\n", - "chi_d_u235.shape = (chi_d_u235.shape[0])\n", - "chi_d_pu239.shape = (chi_d_pu239.shape[0])\n", - "chi_p_u235.shape = (chi_p_u235.shape[0])\n", - "chi_p_pu239.shape = (chi_p_pu239.shape[0])\n", - "\n", - "chi_d_u235 = np.append(chi_d_u235[0] , chi_d_u235)\n", - "chi_d_pu239 = np.append(chi_d_pu239[0], chi_d_pu239)\n", - "chi_p_u235 = np.append(chi_p_u235[0] , chi_p_u235)\n", - "chi_p_pu239 = np.append(chi_p_pu239[0], chi_p_pu239)\n", + "chi_d_u235 = np.append(chi_d_u235 , chi_d_u235[0])\n", + "chi_d_pu239 = np.append(chi_d_pu239, chi_d_pu239[0])\n", + "chi_p_u235 = np.append(chi_p_u235 , chi_p_u235[0])\n", + "chi_p_pu239 = np.append(chi_p_pu239, chi_p_pu239[0])\n", "\n", "# Create a step plot for the MGXS\n", "plt.semilogx(energy_groups.group_edges, chi_d_u235 , drawstyle='steps', color='b', linestyle='--', linewidth=3)\n", @@ -1443,7 +1377,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.11" + "version": "2.7.12" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb index c6bf077f82..eb2471e222 100644 --- a/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb +++ b/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb @@ -30,7 +30,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/__init__.py:1350: UserWarning: This call to matplotlib.use() has no effect\n", + "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/__init__.py:1357: UserWarning: This call to matplotlib.use() has no effect\n", "because the backend has already been chosen;\n", "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", "or matplotlib.backends is imported for the first time.\n", @@ -456,7 +456,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -607,8 +607,8 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.8.0\n", - " Git SHA1: ad9fe27d26940a7120ed920d37d9cb176bde6402\n", - " Date/Time: 2016-08-06 15:52:56\n", + " Git SHA1: be7e6e035d22944a8c80ca32f99935b6822854c9\n", + " Date/Time: 2016-08-10 15:48:40\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -713,20 +713,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.2200E-01 seconds\n", - " Reading cross sections = 2.3800E-01 seconds\n", - " Total time in simulation = 7.5197E+01 seconds\n", - " Time in transport only = 7.4942E+01 seconds\n", - " Time in inactive batches = 4.8400E+00 seconds\n", - " Time in active batches = 7.0357E+01 seconds\n", - " Time synchronizing fission bank = 4.0000E-03 seconds\n", - " Sampling source sites = 4.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 2.1900E-01 seconds\n", - " Total time for finalization = 8.0000E-03 seconds\n", - " Total time elapsed = 7.5653E+01 seconds\n", - " Calculation Rate (inactive) = 5165.29 neutrons/second\n", - " Calculation Rate (active) = 1421.32 neutrons/second\n", + " Total time for initialization = 5.2300E-01 seconds\n", + " Reading cross sections = 3.3300E-01 seconds\n", + " Total time in simulation = 7.3672E+01 seconds\n", + " Time in transport only = 7.3396E+01 seconds\n", + " Time in inactive batches = 5.0250E+00 seconds\n", + " Time in active batches = 6.8647E+01 seconds\n", + " Time synchronizing fission bank = 1.3000E-02 seconds\n", + " Sampling source sites = 0.0000E+00 seconds\n", + " SEND/RECV source sites = 3.0000E-03 seconds\n", + " Time accumulating tallies = 2.0800E-01 seconds\n", + " Total time for finalization = 7.0000E-03 seconds\n", + " Total time elapsed = 7.4227E+01 seconds\n", + " Calculation Rate (inactive) = 4975.12 neutrons/second\n", + " Calculation Rate (active) = 1456.73 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -1249,7 +1249,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 24, @@ -1260,7 +1260,7 @@ "data": { "image/png": "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\nDmZmZmZmZmbW5TzgYGZmZmZmZmZdzgMOZmZmZmZmZtblPOBgZmZmZmZmZl3OAw5mZmZmZmZm1uU8\n4GBmZmZmZmZmXc4DDmZmZmZmZmbW5TzgYGZmZmZmZmZdzgMOZmZmZmZmZtblPOBgZmZmZmZmZl3O\nAw5mZmZmZmZm1uU84GBmZmZmZmZmXc4DDusJSZMlnZlx2ycl7d/dfapqcz9JT/Vkm2ZmPck5bGZW\nPmexWXPxgEMdkuZLelXSy5Kel3S9pJ0y1jpIaouyO9CI9N91ZdZfYmbWGOdwt1gnc7jqZ+FlSTeV\n3Sez3sJZ3C3WySwGkHSKpCck/UvSo5KGlt0na24ecKgvgEMiYnNgB+AfwIUZa8U6HCTNTlJrCW32\nAS4A7u7pts16Medwkyohh1f9LKSP0T3cvllv5ixuUj2dxZI+C3wGOCgiNgU+DPxfT/bB1j0ecOiY\nACLidWAqsOuqFVJfSedKWiDpGUk/krShpI2BG4EdJf0zHQ3uL+ldkv4iaamkpyVdmP4RW6xj0h6S\n7pP0kqQpwEZV6z8s6YG0vTskvb3Ofur2S9JFks6t2n6apC+mz3eQNFXSPyT9XdIXKrbbSNLPJb0g\n6RHgXZ28n1GS5qb9+KGkGZKOTdeNS9/D+ZKeB8Yr8Y101P3ZtK3N0u3XGk2vnDInabyk30iakv77\n/FXS7p185F8GbgbmdrKdmXUt57BzeNUuOllvZt3HWdzLs1iSgG8CX4qIxwAi4smIeLGj92PmAYcM\n0sD8BHBXxeJzgKHA7ul/dwS+GRGvAgcBiyNis/SbmGeBNuC/gH7A3sD+wIkF+7MBcA1wWbq/3wAf\nq1i/JzAJOD5d/xNgWlpXraN+XQaMrdjv1un6K9PQuR54gGS0+wDgFEkfSjefALwxfRwIjOvg/Wyd\nvofTgK2Bx9K+VHo38DdgW+DbJKOrnwL2A94EbAb8sGL7zkbTDwV+DWwF/Aq4VnVGiSUNTts7Ex/w\nmpXCObxqv70yh1NXSFoi6aYMgxNm1g2cxav22xuzeED6eLukhenAyoRO9m0GEeFHjQfwJPAy8AKw\nHFgE7Fax/l/AGyte7w08kT7fD1jYyf5PAa4u2Lf3AYuqlt0JnJk+vxiYWLV+LvC+ive2f5Z+AY8C\nB6TPTwJuSJ+/G5hfVXs6MCl9/nfgQxXrjq/3mQCfBO6sWrYQODZ9Pq5GW7cC/1nx+i3AMpJBtLU+\n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\neuPVxnRsyZiOLXtfXzzliVq7DchEZX2NMUvHOIJsgsgeRwPXR0Q38Likm4E3A0tqfjgzsyGkH+Zw\nMDOzJjmL81MaejdwJ5Ci68FaP07W176qu9y5StTd+sY3ljrXL+I9hWu+1H5yqXM92r1P8XPFfxWu\nmfqtEwvXAHzg5FmFa8ZFuZVVfhUdxWs+/P5S5/rsles1HDZ0/kFnFK55501zCtcAfDr+t3DNR9uu\nISKK/Q+ZSIpbYkyuff9R89c7T/rL/31kk0b+mWy82VEV3b2QdALwhog4QdJE4PCI6Jk08jLgLWRD\nKW4ARkdESPoh8ERETKpxzYcCp0XEARXbTgX2iIjjJW2ermNCRNyb/9vYsJTJYYB2rWq803rnKpff\n83b+h8I1v4x3lzrXf7SfX7hmzROvKH6erc5uvFMN519SPEfGHzez1LneyW8L18yOw0qd6zefKP7n\n5umXTm68U5WvvH9K4RqAg352beGa4+KSwjWv4U0c2HZWqSwuksNQO4utdUrdE5fI4excxbO4TA5D\nuSz+j/avFa5Z88SrCtcAfHar4vdzF15yaqlzlcniMjkM5bJ4sHIYymVxmRyGclncynvijY17OJhZ\nbkNtvFqOMWYTWHc4BcB3gGmSehoYpr6cGxvM7OXFQyrMzFrPWZyfGxzMLLcm1xzu9/FqjcaYRcR6\nM5tHxPP1zmFmNtQ1m8NmZtY8Z3F+bnAws9w8Xs3MrLWcw2Zmrecszs8NDmaWW7Prv5uZWXOcw2Zm\nrecszs/flJnl5vFqZmat5Rw2M2s9Z3F+bnAws9wcrmZmreUcNjNrPWdxfm5wMLPcPF7NzKy1nMNm\nZq3nLM7PDQ5mlpvHq5mZtZZz2Mys9ZzF+fmbMrPc3H3MzKy1nMNmZq3nLM7PDQ5mltsqrzlsZtZS\nzmEzs9ZzFufnBgczy83dx8zMWss5bGbWes7i/PxNmVlu7j5mZtZazmEzs9ZzFufnBgczy83hambW\nWs5hM7PWcxbnNygNDjfv8qZC+4+PGaXOc7WOKlzTdt0fSp1Ls6NwTXeXSp1r2zX3FK5ZOfPvC9d0\nn1S4BID2X36ocM0XDvxyqXN9QV8rXNM2rtz3fsH3Ti9c0/3L4uc5jVuLFwG/VkeJqmtKnauHw3XD\nddsu+xSu+UBcXbhmto4sXAPQNv++wjW6pHgOQ7ks3p6HCtc8celOhWsAuo8rXtP+mwmlzvXl/b9Y\n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\n+8b/K1zTdUrx/wY/ru8XrgH4Il8uXLOHlhERxS+S7P/ltuXVoxVq695hi5rnSctiXsDaZTG/Urn2\nu6RNyVaQeBNp7feIWJJqzyBbxWI1a5fFfDvwG+AesiEWAZyZllRD0jTgloi4uOo6jgbOBLqBn0bE\nGcW+jQ1LmRwG0CXFs6fr7aX+82KbrurOLo1t2fZsqXM9pNcXrml/sPj3d96unylcA/BZ/W/hmrZa\nzW05aFLx/Onq+mSpc02Pmqss9ukT515euKbrtHL/DR5b4ns/my8WrtmUA3m1ZpXK4iI5DPWz2Fqj\n1D1xiRyGcllcJoehXBYPVg5DuSwuk8NQLovL5DCUy+LBymEol8VlchjgLM4qXLOrHm/pPfHGxEMq\nzCy37q7mIqO/136PiJuh/jTBEXFsne0zgBm5L9zMbIhoNofNzKx5zuL8/E2ZWX7uGmZm1lrOYTOz\n1nMW5+YGBzPLz+FqZtZazmEzs9ZzFufmBgczy2/NRj0Ezcys9ZzDZmat5yzOzQ0OZpbfmlZfgJnZ\nRs45bGbWes7i3Lwsppnl92LOh5mZDYy8OewsNjMbOE3msKRDJS2SdL+k02q8P1zSTEmLJd0iaVTF\ne2ek7QslHdLomJKmSXpQ0l2S5knaJ23fQ9LvJb0oaVLF/ptKui3tf4+k3gney3APBzPLb3WrL8DM\nbCPnHDYza70mslhSG3AhcBDwGDBX0jURsahit+OBpyJitKQJwLnAREl7ka3oticwErhR0mhADY55\nSkRcXXUpTwL/DhxeuTEiVkk6ICJekNQO3Czp5xFxe5nP6x4OZpZfV86HmZkNjLw57Cw2Mxs4zeXw\nOGBxRDwcEauBmcD4qn3GA5em57OAA9Pzw4CZEbEmIpYAi9PxGh1zvb/3R8QTEXEnNQaIRMQL6emm\nZJ0Uou6nacANDmaW35qcDzMzGxh5c9hZbGY2cJrL4R2BpRWvl6VtNfeJiC7gGUlb16h9NG1rdMyz\nJc2XdJ6kTRp9PEltku4ClgM3RMTcRjX1uMHBzPLzTa6ZWWv1Q4PDAI0dnipphaQ/VB3r3LTvfElX\nStoybd8vjQ/ueRyeto+UdJOkBWns8EllvyozswHTXA7XWuKiugdBvX2Kbgc4PSL2BPYDtgHWy/31\nCiO6I+JNZMM23pKGcpTiORzMLD83JpiZtVaTOTwQY4cjIoBpwLeBH1adcg7ZzW63pK8AZ6THPcC+\nafsOwN2SZqdPOCki5kvaArhT0pyq6zMza616WXx3J/yhs1H1MmBUxeuRZHlcaSmwE/BYmkdhRESs\nlLQsba+uVb1jRsSK9M/VkqYBpzS6wB4R8aykTuBQYEHeukru4WBm+bmHg5lZazXfw2Egxg4TEb8D\nVlafLCJujIju9PJWsptgIuLFiu2vBLrT9uURMT89fw5YyPpdjc3MWqte7u7dAUedtfZR21xgN0k7\nSxoOTARmV+1zLXBMen4kcFN6PpusAXi4pF2B3YDb+zpmatRFksgmiLy3xjX19pCQtK2kEen5K4F3\nA6Ubfd3Dwczyc2OCmVlrNZ/Dtcb5jqu3T0R0SaocO3xLxX49Y4fzOo6sgQMASeOAS8h+lftYRQNE\nz/u7AGOA2wqcw8xs4DWRxSlXTyTrAdYGTI2IhZKmAHMj4jpgKjBd0mKy1SQmptoFkq4g622wGjgh\n9TKrecx0ysskbUvWqDAf+DSApO2BO4BXAd2STgb2Al4DXJp6xLUBl0fEz8p+XmXXN3AkxYNdry5U\n89qfLy91rgvfe1zhmhMf+V6pc/Fkw7k21qOHyn3X//ShywvXrNbwwjVd3e2FawDm/Kj6h5HGXnv0\nH0udaw/uK1zzV72q1LlWxaaFa8pc3zZ6snANwLY8Ubjmi/oGEVFrjFdDkoKZOf8bnqjS57H+Jyke\n6dqmcN2oXz1euOaSA44qXAPwL4//oHBN99OblzpXmSx+33uuLFwzTOXWzOrqLv5bwHVXH1nqXHsf\nUXwOqFHr/F01vxe0WeGaMjEymsWFawBepb8WrtmpxHexM3vxYZ1UKiMb5vAfO2FB59rXV05Z7zyS\nPgwcEhGfSq//GdgvIk6u2OfetM9j6XVPT4YvA7+PiBlp+w+An/YstSZpZ+DaiNinxrV/HhgbER+q\n8d4eZEMx3hkRL6VtWwCdwJcj4pq+vpcNRZksLpPDUC6Ly+QwlMviwcphKJfFZXIYymXx64+YV+pc\nu7KkcM1g5TDArjxYuGYrPV3qXGWy+BR91/fEg8Q9HMwsPy+zZmbWWn3l8Os7skePK6fU2msgxg73\nSdIxwPtYOzRjHRFxn6TngTcA8yQNIxvKMf3l0thgZi8zvifOzXM4mFl+nsPBzKy1mp/DYSDGDvcQ\nVTOlSzoUOBU4LCJWVWzfJTVm9PSM2B16f7K9BFgQERf08U2YmbWO74lzcw8HM8vPwWlm1lpN5vAA\njR1G0gygA9hG0iPA5IjoWbliOHBDNl8Zt0bECcA7gNMlvUQ2YeS/RcRTkt4OfBS4J60BH8CZEXF9\nc5/czKwf+Z44Nzc4mFl+Dlczs9bqhxxOf3nfo2rb5Irnq8iWv6xVew5wTo3tR9fZf3Sd7f8H/F+N\n7TcD5SaVMjMbLL4nzs0NDmaWn8PVzKy1nMNmZq3nLM7NcziYWX5NjleTdKikRZLul3RajfeHS5op\nabGkWySNqnjvjLR9oaRD0raRkm6StEDSPZJOqth/pqR56fGQpHlp+86SXqh476J++GbMzAZH83M4\nmJlZs5zDubmHg5nl10RwprV8LwQOIpvVfK6kayJiUcVuxwNPRcRoSROAc8kmKNuLrHvvnmSzot8o\naXS6okkRMT8toXanpDkRsSgiJlac++tA5VpLf4qIseU/jZlZi/gG1sys9ZzFubnBwczye7Gp6nHA\n4oh4GLIeCMB4oLLBYTzQM454FtlkYwCHATMjYg2wpGdN+Ii4DVgOEBHPSVoI7Fh1TMgaKw6oeL1R\nr4dsZhuw5nLYzMz6g7M4Nw+pMLP8mus+tiPZ2u49lqVtNfeJiC7gGUlb16h9tLpW0i7AGOC2qu3v\nBJZHxAMVm3eRdKekX0l6R90rNjMbajykwsys9ZzDubmHg5nlVy84l3TCw52Nqmv1Koic+/RZm4ZT\nzAJOjojnqvY7CvhRxevHgFERsVLSWOAnkvaqUWdmNvT4BtbMrPWcxbm5wcHM8qsXriM7skeP30yp\ntdcyYFTF65Fkf/mvtBTYCXhMUjswIjUMLEvb16uVNIyssWF6RFxTebB0jCOA3vkaImI1sDI9nyfp\nAWB3YF6dT2dmNnT4JtfMrPWcxbl5SIWZ5bc656O2ucBuaZWI4cBEYHbVPtcCx6TnRwI3peezySaP\nHC5pV2A34Pb03iXAgoi4oMY5DwYWRkRvw4akbdMElkh6bTrWgw0/u5nZUJA3h+tnsZmZNcs5nNug\n9HDY+em/FNp/8fuqh3Xn82s6Ctd077xJqXO1nVe8Jk4p1xT2Nv2+cM3t8ZbCNVc9dHThGoBpR09s\nvFOVWXy41Ll++qnidXpVda/9fLrOKz6vYNsR+xc/0Z7FSwDO+J8vlStsRlf50ojoknQiMIessXNq\nRCyUNAWYGxHXAVOB6WlSyCfJGiWIiAWSrgAWkMX3CRERkt4OfBS4R9JdZMMszoyI69NpJ7DucAqA\n/YH/krQ6faJ/jYineZkb+cSThWsWH1g8i29nXOEagDWv3rxwTdv/lToVmx6/snDNu3Vj4Zo74s2F\nawCuWPmRwjXTjjiq1Lkup/i5fv6pI0qdS9sVz+Ku/y6Rw0e/p3ANAK8vfn1fnXxS452qdDf7W08T\nOWytVzSLy+QwlMviMjkM5bJ4sHIYymVxmRyGcllcJoehXBYPVg4DtJX5a0WJHIZyWdw0Z3FuHlJh\nZvk12X0sNQTsUbVtcsXzVVD7T96IOAc4p2rbzUB7H+c7tsa2q4CrCl24mdlQ4W68Zmat5yzOzQ0O\nZpafw9XMrLWcw2Zmrecszs1zOJhZfi/mfJiZ2cDIm8POYjOzgdNkDks6VNIiSfdLOq3G+8MlzZS0\nWNItkkZVvHdG2r5Q0iGNjilpmqQHJd0laZ6kfdL2PST9XtKLkiYVub4i3MPBzPJza66ZWWs5h83M\nWq+JLE6Tl18IHES26tpcSddExKKK3Y4HnoqI0ZImAOeSTaC+F9nw4z3JVm27UdJosiXk+zrmKRFx\nddWlPAn8O3B4ievLzT0czCy/NTkfZmY2MPLmsLPYzGzgNJfD44DFEfFwWq59JjC+ap/xwKXp+Szg\nwPT8MGBmRKyJiCXA4nS8Rsdc7+/9EfFERNxZ40rzXF9ubnAws/y8BJCZWWt5WUwzs9ZrLod3BJZW\nvF6WttXcJyK6gGckbV2j9tG0rdExz5Y0X9J5khot05jn+nLzkAozy89LAJmZtZZz2Mys9epl8eOd\n8ERno+paa41Wrwlab59622t1JOg55ukRsSI1NHwfOA04u8nry809HMwsP3fjNTNrrX4YUjFAk5VN\nlbRC0h+qjnVu2ne+pCslbZm2v1vSHZLuljRX0gE1rmN29fHMzIaEerm7VQeMPmvto7ZlwKiK1yPJ\n5kqotBTYCUBSOzAiIlam2p1q1NY9ZkSsSP9cDUwjGzLRlzzXl5sbHMwsPzc4mJm1VpMNDhWTgb0H\n2Bs4StLrq3brnawMOJ9ssjKqJit7L3CRpJ5fwqalY1abA+wdEWPIxhqfkbY/DnwgIt4IfAKYXnWd\nHwSe7eurMDNrmebuiecCu0naWdJwYCIwu2qfa4Fj0vMjgZvS89lkk0cOl7QrsBtwe1/HlLRD+qfI\nJoi8t8Y1VfZqyHN9uXlIhZnl5zHBZmat1XwO904GBiCpZzKwytnHxwOT0/NZwLfT897JyoAlknom\nK7stIn4naefqk0XEjRUvbwU+lLbfXbHPHyVtKmmTiFgtaXPgc8CngCua/sRmZv2tiSyOiC5JJ5I1\nyLYBUyNioaQpwNyIuA6YCkxPOfsk2V/6iYgFkq4AFqSrOCEiAqh5zHTKyyRtS9aoMB/4NICk7YE7\ngFcB3ZJOBvaKiOf6OFZhbnAws/xWtfoCzMw2cs3ncK3JwKq7164zWZmkysnKbqnYr2eysryOI5vt\nfB2SPgzclbr7AnwZ+DrwtwLHNjMbPE1mcURcD+xRtW1yxfNVZD3KatWeA5yT55hp+0F1jrOCdYdn\nNDxWGW5wMLP8PFzCzKy1+srhZzrh2c5GRxiIycoakvR5YHVEzKjavjfZjfPB6fUbgd0iYpKkXeqc\n08ystXxPnNugNDicstV/F9r/cP2k1HnGML9wzafi2413qmHeBd8pXDNGixrvVEPbld8qXDP+iB8V\nrul+bbk/09vuXO/HioZ0XbmJTrsvLl7Tdme5zzXi+b8UrtntquWFa0bxSOEagD0p3bOpPA+p2GB9\nabvTC9ccpmsL1+zB/YVrACbFeg31DS3+3IWlzvU6PVq4pu3K7xau+cARPy5cA7Bq6y0L17T9sXjm\nA2hW8Swuk8MAbQ8Ur9mua1nhmn1mFP/3C+WyeBceLlyzPdsUrllHXzm8WUf26LFsSq29ikxW9ljl\nZGWS6k1W1idJxwDvY+068j3bRwJXAR9L68kD/CMwVtKDwCbAqyXdFBHr1G6oPr/dFwrt/0FdXeo8\nZbK4TA5DuSwerByGcllcJoehXBaXyWEoeU9cKofLZereM/5cuKbsPXGZLG6a74lz86SRZpZfV86H\nmZkNjLw5XD+LB2Kysh6iqkeCpEOBU4HDUhfhnu0jgOvIlmu7tWd7RHw3IkZGxGuBdwD3vVwaG8zs\nZcT3xLm5wcHM8vMqFWZmrdXkKhUR0QX0TAb2R7JJIBdKmiLpA2m3qcC2abKyzwKnp9oFZJM4LgB+\nxtrJypA0A/g9sLukRyQdm471bWAL4AZJ8yRdlLafCLwO+KKku9J72zb79ZiZDQrfE+fmORzMLD8H\np5lZa/VDDg/QZGVH19l/dJ3t/w30OeY2raSxT1/7mJm1hO+Jc3ODg5nl5/FqZmat5Rw2M2s9Z3Fu\nbnAws/w8Fs3MrLWcw2Zmrecszs1zOJhZfk2OV5N0qKRFku6XdFqN94dLmilpsaRbJI2qeO+MtH2h\npEPStpGSbpK0QNI9kk6q2H9mGhM8T9JDkuZVnWuUpL9KmtTEN2JmNrianMPBzMz6gXM4N/dwMLP8\n/la+VFIbcCFwENkyanMlXRMRlevFHg88FRGjJU0AziWbEX0vsvHEe5Itw3ajpNFkUT4pIuZL2gK4\nU9KciFgUERMrzv114OmqS/oG2aRnZmYbjiZy2MzM+omzODf3cDCz/JpbAmgcsDgiHo6I1cBMYHzV\nPuOBS9PzWaxds/0wspnU16S12hcD4yJieUTMB4iI54CFwI41zv0RoHdxbEnjgQfIZmg3M9twNL8s\nppmZNcs5nJsbHMwsv+a6j+0ILK14vYz1Gwd690lLtz0jaesatY9W10raBRgD3Fa1/Z3A8oh4IL3e\njGxN+ClUrRdvZjbkeUiFmVnrOYdz85AKM8uvueCs9Zf7yLlPn7VpOMUs4OTU06HSUVT0biBraPhm\nRLwgqd45zcyGJt/Ampm1nrM4Nzc4mFl+9ZYA6u6E6GxUvQwYVfF6JNlcDpWWAjsBj0lqB0ZExEpJ\ny9L29WolDSNrbJgeEddUHiwd4whgbMXmtwAfknQusBXQJelvEXFRow9gZtZyXorNzKz1nMW5ucHB\nzPKrOxatIz16TKm101xgN0k7A38GJpL1Pqh0LXAM2bCII4Gb0vbZwGWSvkk2lGI34Pb03iXAgoi4\noMY5DwYWRkRvw0ZE7N/zXNJk4K9ubDCzDYbHBJuZtZ6zODfP4WBm+UXOR63SbE6GE4E5ZJM1zoyI\nhZKmSPpA2m0qsK2kxcBngdNT7QLgCmAB2coSJ0RESHo78FHgQEl3pSUwD6047QTWHU5hZrZhy5vD\ndbLYzMz6QZM53N9Lxfd1TEnTJD1Yca+8T8V730rHmi9pTNrWUbHvXZL+Jumwsl/VoPRw2J37Cu2/\n//y5pc4z+40HF6753kWfLXWut33ml4VrrokRpc41+4j9CtfsrsWFa3boflvhGoCuv+xauGb1Z8sN\nm2+/u/iAqcvGHlHqXIeNmF245pRnv1G45n/vnlS4BmDGmHKfq5Ui4npgj6ptkyueryJbUaJW7TnA\nOVXbbgba+zjfsQ2up2ZXjJejPbi/cM2bbyq+iMfMA8r9eXTeRV8oXHP4Z8q1JV0Smxeu+dUR/1C4\nZoSqV2LNZ8fusY13qtL9l9GlzhX/VjyLy+QwwKx9PtB4pyofHHV94ZoTl36tcA3AhTf8R+Gaqw95\nb+GaNroL19jLx14sKLR/mRyGcllcJoehXBaXyeEbjxhTuAZgaz1ZuKZMDkO5LC6Tw1Auiwcrh6Fc\nFl/4q+I5DHD1gcWzuJUGaKl4NTjmKRFxddV1vBd4XTrHW4DvAm+NiE7gTWmfrchWh5tT9vO6h4OZ\nmZmZmZnZ4Oj3peJzHLPW3/vHAz8EiIjbgBGStq/a58PAzyPixeIfs/6J1yFpqqQVkv5QsW2ypGWp\nm0V1F2Yze9lanfNh/c1ZbGaZvDnsLO5vzmEzW6upHB6IpeIbHfPsNGziPEmb1LmO9ZadJ5tzranh\nyXl6OEwD3lNj+zciYmx6lOtrY2YbGC863ELOYjMjfw47iweAc9jMkqZyeCCWiu/rmKdHxJ7AfsA2\nQM/8Do2Wnd8BeAPwixr75dZwDoeI+F2aVb6a16432+j4F7NWcRabWcY53CrOYTNbq14W/xb4XaPi\ngVgqXvWOGREr0j9XS5oGnFJxHTWXnU8+AlydeliU1swcDp9J3TJ+IKncbIhmtoHxr2pDkLPYbKPi\nHg5DkHPYbKNTL3f/EfjPikdNvUvFSxpONmyherb6nqXiYf2l4iemVSx2Ze1S8XWPmXoqIEnA4cC9\nFcf6eHrvrcDTPY0TyVH0w2pvZRscLiKb0XIMsBwoPjW/mW2APG54iHEWm210mp/DYYCWY1tvfoO0\n/dy073xJV0raMm3fWtJNkv4q6VtVNZtI+p6k+yQtkPTBwl/T4HEOm22UyufwQCwVX++Y6ViXSbob\nuJtsSMXZ6Vg/Ax6S9Cfge8AJPdeYenONjIhfN/MtQcllMSPi8YqX3ydrganrurPm9z7fvWMHdu/Y\nocxpzayghZ2Ps7Dz8cY75ubGhKGkSBZfddbapdj27NiOPTu2G8ArM7NK93Y+yR87nwJgC55r8mjN\n5fBALMcWEUE2v8G3STOeV5hDNn64W9JXgDPS40XgC2Tjg99QVfN5YEVE7JGueeumPvQAKnpP7Cw2\na43KHO4fzWVxfy8VX++YaftBfVzHiXW2P8y6wy1Ky9vgICrGp0naISKWp5dHsLZbRk0fOKvcurlm\n1pzqm5mrpyzsY+883EW3xUpn8RFn7TXAl2Zm9byhYxve0LENANuzL9Om/LaJozWdw71LpwFI6lk6\nrbLBYTzQc+M7i6whASqWYwOWpF/exgG31ZvfICJurHh5K/ChtP0F4Pdp/fhqx1Fx0xwR/fm3hGY1\ndU/sLDZrjcocBvjxlD81eUTfE+fVsMFB0gygA9hG0iNkfwAdIGkM0A0sI0g+jgAACs1JREFUAf51\nAK/RzIaMv7X6AjZazmIzyzSdw7WWThtXb5+I6JJUuRzbLRX71VpCrS/Hka0NX1fFHAhnS+oA/gSc\nWNWToCWcw2a2lu+J88qzSsXRNTZPG4BrMbMhz0MqWsVZbGaZvnJ4LnBHowMMxHJsDUn6PLA6ImY0\n2HUY2XCN30bEKZI+B5xHmtislZzDZraW74nzKjWHg5ltrNx9zMystfrK4TelR4/v1tppIJZj65Ok\nY4D3AQc22jcinpT0fET8JG36MVnPCDOzIcT3xHk1syymmW10vEqFmVlrNb1KxUAsx9ZjnfkNIFsR\nAzgVOCxNglZLdc+JayUdkJ6/m2w2djOzIcT3xHkpm1h4AE8gRVfBuYVXPlvuXFufXLwmW5ypuO43\n1+pV2Lf/994Jpc71iZV9Dnes6bGti0/o/IM4vnANAO1fK1zyv10PlTrV0md2LVwzrLvUqbhoq+I/\nqISK/3fxYLy2cA3AY/r7wjVX6FgiovhFkv2/DL/Lufc7Sp/H+l+ZHAZ4eGXxml0mFa+Bclkc/1Du\nXD89/IDGO1U55NlfFa55bES52ecvj+J/Vvyt/cJS5yqTxUueL57DAK94oXjNrO3eX7jmURWZUmCt\n+2P3wjUvaXjhmr0ZxSQdXioji+Uw1Mvi1AhwAdkPT1Mj4iuSpgBzI+I6SZsC08m6SzwJTIyIJan2\nDLJVLFYDJ0fEnLS9d34DYAUwOSKmpYklh6fjANwaESekmoeAV6X3nwYOiYhFaRnO6cAI4HHg2IhY\nVuCDD0llsrhMDkO5LC57T1wmiwcrh6FcFs+oOXqmsZfaLyhcU/aeuEwWl8nhmdsdVrwIWKHiqxKW\nyWEol8VTdZLviQeJh1SYWQFuqTUza63mc3iAlmOr+Te0iKi1CkXPezX/xhQRjwDvqldnZtZ6vifO\nyw0OZlaAx6uZmbWWc9jMrPWcxXm5wcHMCnBrrplZazmHzcxaz1mclxsczKwArzlsZtZazmEzs9Zz\nFuflBgczK8CtuWZmreUcNjNrPWdxXl4W08wKWJPzUZukQyUtknS/pNNqvD9c0kxJiyXdkmYq73nv\njLR9oaRD0raRkm6StEDSPZJOqth/pqR56fGQpHlp+36S7qp4HN4f34yZ2eDIm8MeX2xmNnCcw3m5\nh4OZFVC+NVdSG3AhcBDwGDBX0jURsahit+OBpyJitKQJwLlka77vRTZj+p7ASOBGSaPJknxSRMyX\ntAVwp6Q5EbEoIiZWnPvrZEuuAdwD7BsR3ZJ2AO6WNDsiSi6gamY2mPyrmplZ6zmL83IPBzMroKnW\n3HHA4oh4OCJWAzOB8VX7jAcuTc9nAQem54cBMyNiTVoLfjEwLiKWR8R8gIh4DlgI7Fjj3B8BfpT2\ne7GiceGVgBsazGwD4h4OZmat5xzOyz0czKyAplpzdwSWVrxeRtYIUXOfiOiS9IykrdP2Wyr2e5Sq\nhgVJuwBjgNuqtr8TWB4RD1RsGwdcAowCPubeDWa24fCvamZmrecszqulPRw6/e+p16LOFa2+hCHj\npc5bW30JQ8bSzgdbfQlV6rXeLgRmVzxqUo1tkXOfPmvTcIpZwMmpp0Olo0i9G3oLI26PiDcA+wFn\nShpe76Jf7pzDa93TubLVlzBkOIfX9Wjnn1p9CRXcw+HlyFm8lrN4LWfxWkMrh8E5nF9LGxx+7XDt\ndV/nX1p9CUOGw3WtZZ0PtfoSqqyu89gFOLjiUdMysh4FPUaSzeVQaSmwE4CkdmBERKxMtTvVqpU0\njKyxYXpEXFN5sHSMI4DLa11QRNwHPA+8od5Fv9w5h9e6p/PpxjttJJzD63qs84HGOw2aejlc62Eb\nCmfxWs7itZzFaw2tHAbncH6ew8HMCmiqNXcusJuknVOPgoms3x3iWuCY9PxI4Kb0fDbZ5JHDJe0K\n7Abcnt67BFgQERfUOOfBwMKI6G3YkLRLaohA0s7A7sCShh/dzGxIcA8HM7PWcw7nNThzOLxxbO3t\nDz0Gu/79epvbqztE51VrqrhGtih5ri1r9fDu2zbsWve9V7Ks/vvtdb6/PmzCiMI1ryn1BQJji1/f\nPtTvwf4A7byuzvsq8V3U7Iyfw3bsXLimenxAHi+xQ933tmQLRtZ5f1O2KXG2Zv2tdGWak+FEYA5Z\nY+fUiFgoaQowNyKuA6YC0yUtBp4ka5QgIhZIugJYQNZcfEJEhKS3Ax8F7pF0F9m/gjMj4vp02glU\nDacA3gGcLuklsgkj/y0inir9wTYUBXMYYPizJc5TMkZKZfHflTvVCEbX3L4pz9R9T23PFD7PcLYq\nXAOw/TqdefJZVSKHoX4W95nDbeXOVeaO4+94XeGa1by6+ImAv/VRdx+bs1ON91ezSeHzvLrEn8/r\nKp/DNgQUzOJSOQyDe09cIovrZS3Uz+IyOQzlsngHRpY61+rBvCcuk8UlcnirEjkMECXuU8vkMJTL\n4uY5i/NSRJm/IhU4gTSwJzCzQiKiVBOMpCWQuxXm4YjYpcx5rP85h82GnjJZXDCHwVk8pDiLzYYW\n3xMPjgFvcDAzMzMzMzOzjY/ncDAzMzMzMzOzfucGBzMzMzMzMzPrdy1pcJB0qKRFku6XdForrmGo\nkLRE0t2S7pJ0e+OKlxdJUyWtkPSHim1bSZoj6T5Jv5DU7AxbG4Q638VkScskzUuPQ1t5jfby4ixe\na2POYufwWs5hG2zO4bU25hwGZ3ElZ/HLy6A3OEj/v737960pDgMw/rwiBmziR0IYSEgsJXQQAwuJ\nhUgkTEQiBv4AJqupk1gQ6UAkBmFCjDaLQWKw+BVRHfwBwmu4p+452ko0957v7T3PJ2lybjv0zem9\nT5s35/bECuAGcBTYDZyJiF1tzzFCfgGHMnNPZk6WHqaAu/SeC3VXgBeZuZPebRGvtj5VGQudC4Cp\nzNxbfTxd4OvSf7PF83S5xXa4zw6rNXZ4ni53GGxxnS0eIyWucJgE3mXmh8z8ATwAjheYY1QEHX5r\nS2a+BL7/9enjwHR1PA2caHWoQhY5F7DkG3tK/2SLmzrbYjvcZ4fVMjvc1NkOgy2us8XjpcSLejPw\nqfb4M0u/c/s4SOBZRLyKiAulhxkRGzJzBiAzvwLrC89T2qWIeB0Rt7tyKZ1aYYubbHGTHW6ywxoG\nO9xkh+ezxU22eBkqsXBYaDPV5XtzHsjMfcAxei+ig6UH0ki5CWzPzAngKzBVeB6ND1vcZIu1GDus\nYbHDTXZY/2KLl6kSC4fPwNba4y3AlwJzjIRqW0lmzgKP6F1e13UzEbERICI2Ad8Kz1NMZs5m5twf\nH7eA/SXn0VixxTW2eB47XLHDGiI7XGOHF2SLK7Z4+SqxcHgF7IiIbRGxCjgNPCkwR3ERsToi1lbH\na4AjwJuyUxURNLf8T4Bz1fFZ4HHbAxXUOBfVL5c5J+nm80PDYYsrthiww3V2WG2xwxU7/Ict7rPF\nY2Jl298wM39GxGXgOb2Fx53MfNv2HCNiI/AoIpLez+JeZj4vPFOrIuI+cAhYFxEfgWvAdeBhRJwH\nPgKnyk3YnkXOxeGImKD3n5vfAxeLDaixYosbOt1iO9xnh9UmO9zQ6Q6DLa6zxeMl+lemSJIkSZIk\nDUZnbz0jSZIkSZKGx4WDJEmSJEkaOBcOkiRJkiRp4Fw4SJIkSZKkgXPhIEmSJEmSBs6FgyRJkiRJ\nGjgXDpIkSZIkaeBcOEiSJEmSpIH7Db/BFUInlBauAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1332,7 +1332,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.11" + "version": "2.7.12" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb index cb4df0fadf..ca4832809a 100644 --- a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb @@ -34,7 +34,9 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/miniconda3/envs/default/lib/python3.5/site-packages/matplotlib/__init__.py:1350: UserWarning: This call to matplotlib.use() has no effect\n", + "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/__init__.py:878: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.\n", + " warnings.warn(self.msg_depr % (key, alt_key))\n", + "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/__init__.py:1357: UserWarning: This call to matplotlib.use() has no effect\n", "because the backend has already been chosen;\n", "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", "or matplotlib.backends is imported for the first time.\n", @@ -440,9 +442,10 @@ "\n", " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", - " Version: 0.7.1\n", - " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", - " Date/Time: 2016-07-22 21:32:41\n", + " Version: 0.8.0\n", + " Git SHA1: be7e6e035d22944a8c80ca32f99935b6822854c9\n", + " Date/Time: 2016-08-10 15:31:07\n", + " MPI Processes: 1\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -452,11 +455,11 @@ " Reading geometry XML file...\n", " Reading cross sections XML file...\n", " Reading materials XML file...\n", - " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", - " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", - " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", - " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", - " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", + " Reading U235.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/U235_71c.h5\n", + " Reading U238.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/U238_71c.h5\n", + " Reading O16.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/O16_71c.h5\n", + " Reading H1.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/H1_71c.h5\n", + " Reading Zr90.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/Zr90_71c.h5\n", " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", @@ -518,7 +521,7 @@ " 48/1 1.21610 1.22612 +/- 0.00251\n", " 49/1 1.22199 1.22602 +/- 0.00245\n", " 50/1 1.20860 1.22558 +/- 0.00243\n", - " Triggers unsatisfied, max unc./thresh. is 1.25496 for flux in tally 10054\n", + " Triggers unsatisfied, max unc./thresh. is 1.25496 for flux in tally 10052\n", " The estimated number of batches is 73\n", " Creating state point statepoint.050.h5...\n", " 51/1 1.21850 1.22541 +/- 0.00237\n", @@ -544,7 +547,7 @@ " 71/1 1.19720 1.22444 +/- 0.00195\n", " 72/1 1.23770 1.22465 +/- 0.00193\n", " 73/1 1.23894 1.22488 +/- 0.00191\n", - " Triggers unsatisfied, max unc./thresh. is 1.00243 for flux in tally 10054\n", + " Triggers unsatisfied, max unc./thresh. is 1.00243 for flux in tally 10052\n", " The estimated number of batches is 74\n", " 74/1 1.22437 1.22487 +/- 0.00188\n", " Triggers satisfied for batch 74\n", @@ -557,20 +560,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.3000E-01 seconds\n", - " Reading cross sections = 2.6000E-01 seconds\n", - " Total time in simulation = 3.4077E+02 seconds\n", - " Time in transport only = 3.4068E+02 seconds\n", - " Time in inactive batches = 2.3968E+01 seconds\n", - " Time in active batches = 3.1680E+02 seconds\n", - " Time synchronizing fission bank = 3.0000E-02 seconds\n", + " Total time for initialization = 4.0400E-01 seconds\n", + " Reading cross sections = 2.1100E-01 seconds\n", + " Total time in simulation = 2.8243E+02 seconds\n", + " Time in transport only = 2.8236E+02 seconds\n", + " Time in inactive batches = 1.8781E+01 seconds\n", + " Time in active batches = 2.6365E+02 seconds\n", + " Time synchronizing fission bank = 2.7000E-02 seconds\n", " Sampling source sites = 1.7000E-02 seconds\n", - " SEND/RECV source sites = 1.3000E-02 seconds\n", - " Time accumulating tallies = 3.0000E-03 seconds\n", - " Total time for finalization = 1.6000E-02 seconds\n", - " Total time elapsed = 3.4129E+02 seconds\n", - " Calculation Rate (inactive) = 4172.23 neutrons/second\n", - " Calculation Rate (active) = 1262.62 neutrons/second\n", + " SEND/RECV source sites = 8.0000E-03 seconds\n", + " Time accumulating tallies = 2.0000E-03 seconds\n", + " Total time for finalization = 2.4000E-02 seconds\n", + " Total time elapsed = 2.8293E+02 seconds\n", + " Calculation Rate (inactive) = 5324.53 neutrons/second\n", + " Calculation Rate (active) = 1517.17 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -769,6 +772,14 @@ "collapsed": false }, "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/lib/shape_base.py:873: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n", + " return c.reshape(shape_out)\n" + ] + }, { "data": { "text/html": [ @@ -1159,169 +1170,239 @@ "text": [ "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.574672\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.679815\tres = 4.253E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.660826\tres = 1.830E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.658941\tres = 2.793E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.643012\tres = 2.852E-03\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.625810\tres = 2.417E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.606678\tres = 2.675E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.587485\tres = 3.057E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.569029\tres = 3.164E-02\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.551707\tres = 3.142E-02\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.536035\tres = 3.044E-02\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.522274\tres = 2.841E-02\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.510609\tres = 2.567E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.501106\tres = 2.234E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.493831\tres = 1.861E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.488780\tres = 1.452E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.485923\tres = 1.023E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.485210\tres = 5.846E-03\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.486569\tres = 1.467E-03\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.489903\tres = 2.801E-03\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.495103\tres = 6.852E-03\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.502053\tres = 1.061E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.510627\tres = 1.404E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.520693\tres = 1.708E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.532117\tres = 1.971E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.544764\tres = 2.194E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.558501\tres = 2.377E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.573195\tres = 2.522E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.588718\tres = 2.631E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.604946\tres = 2.708E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.621759\tres = 2.756E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.639047\tres = 2.779E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.656702\tres = 2.780E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.674624\tres = 2.763E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.692722\tres = 2.729E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.710910\tres = 2.683E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.729109\tres = 2.625E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.747248\tres = 2.560E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.765263\tres = 2.488E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.783094\tres = 2.411E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.800690\tres = 2.330E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.818005\tres = 2.247E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.834999\tres = 2.163E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.851638\tres = 2.078E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.867892\tres = 1.993E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.883736\tres = 1.909E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.899149\tres = 1.826E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.914115\tres = 1.744E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.928622\tres = 1.664E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.942659\tres = 1.587E-02\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.956221\tres = 1.512E-02\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.969305\tres = 1.439E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.981909\tres = 1.368E-02\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.994035\tres = 1.300E-02\n", - "[ NORMAL ] Iteration 54:\tk_eff = 1.005685\tres = 1.235E-02\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.016866\tres = 1.172E-02\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.027584\tres = 1.112E-02\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.037846\tres = 1.054E-02\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.047661\tres = 9.986E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.057040\tres = 9.457E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.065994\tres = 8.953E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.074533\tres = 8.470E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.082671\tres = 8.011E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.090418\tres = 7.573E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.097790\tres = 7.156E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.104797\tres = 6.760E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.111453\tres = 6.383E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.117770\tres = 6.025E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.123764\tres = 5.684E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.129446\tres = 5.362E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.134828\tres = 5.056E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.139924\tres = 4.765E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.144746\tres = 4.491E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.149306\tres = 4.230E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.153617\tres = 3.983E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.157688\tres = 3.751E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.161534\tres = 3.530E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.165163\tres = 3.322E-03\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.168586\tres = 3.124E-03\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.171813\tres = 2.938E-03\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.174855\tres = 2.762E-03\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.177721\tres = 2.596E-03\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.180419\tres = 2.439E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.182960\tres = 2.291E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.185350\tres = 2.152E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.187599\tres = 2.021E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.189713\tres = 1.897E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.191700\tres = 1.780E-03\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.193567\tres = 1.670E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.195321\tres = 1.567E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.196967\tres = 1.469E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.198513\tres = 1.378E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.199964\tres = 1.291E-03\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.201326\tres = 1.211E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.202602\tres = 1.135E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.203800\tres = 1.062E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.204922\tres = 9.959E-04\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.205974\tres = 9.321E-04\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.206961\tres = 8.732E-04\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.207884\tres = 8.175E-04\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.208748\tres = 7.646E-04\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.209558\tres = 7.159E-04\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.210316\tres = 6.699E-04\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.211025\tres = 6.262E-04\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.211689\tres = 5.864E-04\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.212310\tres = 5.481E-04\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.212891\tres = 5.124E-04\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.213434\tres = 4.792E-04\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.213942\tres = 4.477E-04\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.214416\tres = 4.189E-04\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.214861\tres = 3.907E-04\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.215275\tres = 3.660E-04\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.215663\tres = 3.414E-04\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.216025\tres = 3.188E-04\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.216363\tres = 2.981E-04\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.216679\tres = 2.776E-04\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.216974\tres = 2.599E-04\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.217250\tres = 2.427E-04\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.217507\tres = 2.263E-04\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.217747\tres = 2.115E-04\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.217970\tres = 1.970E-04\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.218180\tres = 1.834E-04\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.218375\tres = 1.718E-04\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.218557\tres = 1.602E-04\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.218726\tres = 1.496E-04\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.218885\tres = 1.387E-04\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.219032\tres = 1.301E-04\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.219169\tres = 1.211E-04\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.219298\tres = 1.127E-04\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.219418\tres = 1.058E-04\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.219529\tres = 9.828E-05\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.219633\tres = 9.100E-05\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.219730\tres = 8.530E-05\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.219820\tres = 7.940E-05\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.219904\tres = 7.409E-05\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.219983\tres = 6.876E-05\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.220056\tres = 6.455E-05\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.220124\tres = 5.969E-05\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.220187\tres = 5.603E-05\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.220246\tres = 5.166E-05\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.220301\tres = 4.829E-05\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.220352\tres = 4.510E-05\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.220400\tres = 4.199E-05\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.220445\tres = 3.939E-05\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.220486\tres = 3.630E-05\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.220525\tres = 3.362E-05\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.220561\tres = 3.181E-05\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.220594\tres = 2.977E-05\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.220626\tres = 2.745E-05\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.220655\tres = 2.569E-05\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.220682\tres = 2.376E-05\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.220707\tres = 2.201E-05\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.220730\tres = 2.071E-05\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.220752\tres = 1.925E-05\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.220772\tres = 1.793E-05\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.220791\tres = 1.669E-05\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.220809\tres = 1.554E-05\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.220826\tres = 1.457E-05\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.220841\tres = 1.372E-05\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.220855\tres = 1.249E-05\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.220868\tres = 1.138E-05\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.220881\tres = 1.104E-05\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.220892\tres = 1.028E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.423123\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.475921\tres = 5.769E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.491443\tres = 1.248E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.487441\tres = 3.261E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.483949\tres = 8.144E-03\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.477326\tres = 7.164E-03\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.469012\tres = 1.369E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.460422\tres = 1.742E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.450721\tres = 1.832E-02\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.441532\tres = 2.107E-02\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.432168\tres = 2.039E-02\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.423131\tres = 2.121E-02\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.414705\tres = 2.091E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.406942\tres = 1.991E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.399627\tres = 1.872E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.393329\tres = 1.798E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.387699\tres = 1.576E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.382948\tres = 1.431E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.379028\tres = 1.225E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.375934\tres = 1.024E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.373784\tres = 8.161E-03\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.372654\tres = 5.719E-03\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.372273\tres = 3.023E-03\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.372879\tres = 1.024E-03\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.374353\tres = 1.629E-03\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.376678\tres = 3.951E-03\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.379854\tres = 6.212E-03\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.383870\tres = 8.432E-03\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.388663\tres = 1.057E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.394216\tres = 1.249E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.400506\tres = 1.429E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.407501\tres = 1.596E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.415145\tres = 1.747E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.423426\tres = 1.876E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.432299\tres = 1.995E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.441713\tres = 2.095E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.451665\tres = 2.178E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.462081\tres = 2.253E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.472951\tres = 2.306E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.484220\tres = 2.352E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.495861\tres = 2.383E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.507836\tres = 2.404E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.520110\tres = 2.415E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.532648\tres = 2.417E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.545418\tres = 2.411E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.558388\tres = 2.398E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.571526\tres = 2.378E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.584802\tres = 2.353E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.598189\tres = 2.323E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.611657\tres = 2.289E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.625182\tres = 2.252E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.638738\tres = 2.211E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.652302\tres = 2.168E-02\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.665851\tres = 2.124E-02\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.679364\tres = 2.077E-02\n", + "[ NORMAL ] Iteration 55:\tk_eff = 0.692821\tres = 2.029E-02\n", + "[ NORMAL ] Iteration 56:\tk_eff = 0.706204\tres = 1.981E-02\n", + "[ NORMAL ] Iteration 57:\tk_eff = 0.719496\tres = 1.932E-02\n", + "[ NORMAL ] Iteration 58:\tk_eff = 0.732679\tres = 1.882E-02\n", + "[ NORMAL ] Iteration 59:\tk_eff = 0.745740\tres = 1.832E-02\n", + "[ NORMAL ] Iteration 60:\tk_eff = 0.758664\tres = 1.783E-02\n", + "[ NORMAL ] Iteration 61:\tk_eff = 0.771439\tres = 1.733E-02\n", + "[ NORMAL ] Iteration 62:\tk_eff = 0.784053\tres = 1.684E-02\n", + "[ NORMAL ] Iteration 63:\tk_eff = 0.796495\tres = 1.635E-02\n", + "[ NORMAL ] Iteration 64:\tk_eff = 0.808756\tres = 1.587E-02\n", + "[ NORMAL ] Iteration 65:\tk_eff = 0.820827\tres = 1.539E-02\n", + "[ NORMAL ] Iteration 66:\tk_eff = 0.832700\tres = 1.493E-02\n", + "[ NORMAL ] Iteration 67:\tk_eff = 0.844370\tres = 1.447E-02\n", + "[ NORMAL ] Iteration 68:\tk_eff = 0.855828\tres = 1.401E-02\n", + "[ NORMAL ] Iteration 69:\tk_eff = 0.867071\tres = 1.357E-02\n", + "[ NORMAL ] Iteration 70:\tk_eff = 0.878094\tres = 1.314E-02\n", + "[ NORMAL ] Iteration 71:\tk_eff = 0.888893\tres = 1.271E-02\n", + "[ NORMAL ] Iteration 72:\tk_eff = 0.899465\tres = 1.230E-02\n", + "[ NORMAL ] Iteration 73:\tk_eff = 0.909807\tres = 1.189E-02\n", + "[ NORMAL ] Iteration 74:\tk_eff = 0.919919\tres = 1.150E-02\n", + "[ NORMAL ] Iteration 75:\tk_eff = 0.929798\tres = 1.111E-02\n", + "[ NORMAL ] Iteration 76:\tk_eff = 0.939444\tres = 1.074E-02\n", + "[ NORMAL ] Iteration 77:\tk_eff = 0.948856\tres = 1.037E-02\n", + "[ NORMAL ] Iteration 78:\tk_eff = 0.958036\tres = 1.002E-02\n", + "[ NORMAL ] Iteration 79:\tk_eff = 0.966983\tres = 9.674E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 0.975698\tres = 9.339E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 0.984184\tres = 9.013E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 0.992441\tres = 8.697E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.000472\tres = 8.390E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.008280\tres = 8.092E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.015866\tres = 7.804E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.023234\tres = 7.524E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.030386\tres = 7.253E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.037327\tres = 6.990E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.044059\tres = 6.736E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.050585\tres = 6.490E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.056911\tres = 6.251E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.063038\tres = 6.021E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.068972\tres = 5.798E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.074716\tres = 5.582E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.080275\tres = 5.373E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.085651\tres = 5.172E-03\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.090850\tres = 4.977E-03\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.095876\tres = 4.789E-03\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.100733\tres = 4.607E-03\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.105424\tres = 4.432E-03\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.109955\tres = 4.262E-03\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.114328\tres = 4.099E-03\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.118550\tres = 3.941E-03\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.122623\tres = 3.788E-03\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.126551\tres = 3.641E-03\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.130339\tres = 3.499E-03\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.133991\tres = 3.363E-03\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.137511\tres = 3.231E-03\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.140902\tres = 3.104E-03\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.144168\tres = 2.981E-03\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.147313\tres = 2.863E-03\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.150342\tres = 2.749E-03\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.153257\tres = 2.640E-03\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.156062\tres = 2.534E-03\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.158761\tres = 2.432E-03\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.161356\tres = 2.334E-03\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.163852\tres = 2.240E-03\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.166252\tres = 2.149E-03\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.168559\tres = 2.062E-03\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.170776\tres = 1.978E-03\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.172906\tres = 1.897E-03\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.174952\tres = 1.819E-03\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.176918\tres = 1.745E-03\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.178805\tres = 1.673E-03\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.180617\tres = 1.603E-03\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.182356\tres = 1.537E-03\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.184025\tres = 1.473E-03\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.185626\tres = 1.412E-03\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.187163\tres = 1.353E-03\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.188637\tres = 1.296E-03\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.190050\tres = 1.241E-03\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.191405\tres = 1.189E-03\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.192704\tres = 1.139E-03\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.193950\tres = 1.091E-03\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.195144\tres = 1.044E-03\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.196287\tres = 9.997E-04\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.197383\tres = 9.571E-04\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.198433\tres = 9.161E-04\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.199439\tres = 8.768E-04\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.200402\tres = 8.391E-04\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.201324\tres = 8.029E-04\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.202207\tres = 7.682E-04\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.203052\tres = 7.349E-04\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.203861\tres = 7.030E-04\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.204635\tres = 6.724E-04\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.205376\tres = 6.431E-04\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.206084\tres = 6.149E-04\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.206762\tres = 5.880E-04\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.207411\tres = 5.622E-04\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.208031\tres = 5.374E-04\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.208624\tres = 5.137E-04\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.209192\tres = 4.910E-04\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.209734\tres = 4.693E-04\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.210252\tres = 4.484E-04\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.210748\tres = 4.285E-04\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.211221\tres = 4.094E-04\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.211674\tres = 3.911E-04\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.212106\tres = 3.736E-04\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.212519\tres = 3.569E-04\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.212914\tres = 3.408E-04\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.213291\tres = 3.255E-04\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.213651\tres = 3.108E-04\n", + "[ NORMAL ] Iteration 163:\tk_eff = 1.213995\tres = 2.968E-04\n", + "[ NORMAL ] Iteration 164:\tk_eff = 1.214323\tres = 2.834E-04\n", + "[ NORMAL ] Iteration 165:\tk_eff = 1.214637\tres = 2.705E-04\n", + "[ NORMAL ] Iteration 166:\tk_eff = 1.214936\tres = 2.582E-04\n", + "[ NORMAL ] Iteration 167:\tk_eff = 1.215222\tres = 2.465E-04\n", + "[ NORMAL ] Iteration 168:\tk_eff = 1.215495\tres = 2.353E-04\n", + "[ NORMAL ] Iteration 169:\tk_eff = 1.215755\tres = 2.245E-04\n", + "[ NORMAL ] Iteration 170:\tk_eff = 1.216004\tres = 2.142E-04\n", + "[ NORMAL ] Iteration 171:\tk_eff = 1.216241\tres = 2.044E-04\n", + "[ NORMAL ] Iteration 172:\tk_eff = 1.216468\tres = 1.951E-04\n", + "[ NORMAL ] Iteration 173:\tk_eff = 1.216683\tres = 1.861E-04\n", + "[ NORMAL ] Iteration 174:\tk_eff = 1.216889\tres = 1.775E-04\n", + "[ NORMAL ] Iteration 175:\tk_eff = 1.217086\tres = 1.693E-04\n", + "[ NORMAL ] Iteration 176:\tk_eff = 1.217274\tres = 1.615E-04\n", + "[ NORMAL ] Iteration 177:\tk_eff = 1.217452\tres = 1.540E-04\n", + "[ NORMAL ] Iteration 178:\tk_eff = 1.217623\tres = 1.469E-04\n", + "[ NORMAL ] Iteration 179:\tk_eff = 1.217786\tres = 1.401E-04\n", + "[ NORMAL ] Iteration 180:\tk_eff = 1.217941\tres = 1.336E-04\n", + "[ NORMAL ] Iteration 181:\tk_eff = 1.218089\tres = 1.274E-04\n", + "[ NORMAL ] Iteration 182:\tk_eff = 1.218230\tres = 1.214E-04\n", + "[ NORMAL ] Iteration 183:\tk_eff = 1.218364\tres = 1.158E-04\n", + "[ NORMAL ] Iteration 184:\tk_eff = 1.218492\tres = 1.104E-04\n", + "[ NORMAL ] Iteration 185:\tk_eff = 1.218614\tres = 1.052E-04\n", + "[ NORMAL ] Iteration 186:\tk_eff = 1.218731\tres = 1.003E-04\n", + "[ NORMAL ] Iteration 187:\tk_eff = 1.218842\tres = 9.556E-05\n", + "[ NORMAL ] Iteration 188:\tk_eff = 1.218948\tres = 9.107E-05\n", + "[ NORMAL ] Iteration 189:\tk_eff = 1.219048\tres = 8.679E-05\n", + "[ NORMAL ] Iteration 190:\tk_eff = 1.219144\tres = 8.270E-05\n", + "[ NORMAL ] Iteration 191:\tk_eff = 1.219236\tres = 7.880E-05\n", + "[ NORMAL ] Iteration 192:\tk_eff = 1.219323\tres = 7.508E-05\n", + "[ NORMAL ] Iteration 193:\tk_eff = 1.219406\tres = 7.152E-05\n", + "[ NORMAL ] Iteration 194:\tk_eff = 1.219485\tres = 6.814E-05\n", + "[ NORMAL ] Iteration 195:\tk_eff = 1.219561\tres = 6.491E-05\n", + "[ NORMAL ] Iteration 196:\tk_eff = 1.219633\tres = 6.183E-05\n", + "[ NORMAL ] Iteration 197:\tk_eff = 1.219701\tres = 5.889E-05\n", + "[ NORMAL ] Iteration 198:\tk_eff = 1.219766\tres = 5.609E-05\n", + "[ NORMAL ] Iteration 199:\tk_eff = 1.219828\tres = 5.341E-05\n", + "[ NORMAL ] Iteration 200:\tk_eff = 1.219887\tres = 5.087E-05\n", + "[ NORMAL ] Iteration 201:\tk_eff = 1.219944\tres = 4.844E-05\n", + "[ NORMAL ] Iteration 202:\tk_eff = 1.219997\tres = 4.612E-05\n", + "[ NORMAL ] Iteration 203:\tk_eff = 1.220048\tres = 4.391E-05\n", + "[ NORMAL ] Iteration 204:\tk_eff = 1.220097\tres = 4.181E-05\n", + "[ NORMAL ] Iteration 205:\tk_eff = 1.220143\tres = 3.981E-05\n", + "[ NORMAL ] Iteration 206:\tk_eff = 1.220187\tres = 3.789E-05\n", + "[ NORMAL ] Iteration 207:\tk_eff = 1.220229\tres = 3.607E-05\n", + "[ NORMAL ] Iteration 208:\tk_eff = 1.220269\tres = 3.434E-05\n", + "[ NORMAL ] Iteration 209:\tk_eff = 1.220307\tres = 3.268E-05\n", + "[ NORMAL ] Iteration 210:\tk_eff = 1.220343\tres = 3.111E-05\n", + "[ NORMAL ] Iteration 211:\tk_eff = 1.220377\tres = 2.961E-05\n", + "[ NORMAL ] Iteration 212:\tk_eff = 1.220410\tres = 2.818E-05\n", + "[ NORMAL ] Iteration 213:\tk_eff = 1.220441\tres = 2.681E-05\n", + "[ NORMAL ] Iteration 214:\tk_eff = 1.220471\tres = 2.552E-05\n", + "[ NORMAL ] Iteration 215:\tk_eff = 1.220499\tres = 2.428E-05\n", + "[ NORMAL ] Iteration 216:\tk_eff = 1.220526\tres = 2.310E-05\n", + "[ NORMAL ] Iteration 217:\tk_eff = 1.220551\tres = 2.198E-05\n", + "[ NORMAL ] Iteration 218:\tk_eff = 1.220576\tres = 2.091E-05\n", + "[ NORMAL ] Iteration 219:\tk_eff = 1.220599\tres = 1.990E-05\n", + "[ NORMAL ] Iteration 220:\tk_eff = 1.220621\tres = 1.893E-05\n", + "[ NORMAL ] Iteration 221:\tk_eff = 1.220642\tres = 1.801E-05\n", + "[ NORMAL ] Iteration 222:\tk_eff = 1.220661\tres = 1.713E-05\n", + "[ NORMAL ] Iteration 223:\tk_eff = 1.220680\tres = 1.629E-05\n", + "[ NORMAL ] Iteration 224:\tk_eff = 1.220698\tres = 1.550E-05\n", + "[ NORMAL ] Iteration 225:\tk_eff = 1.220715\tres = 1.474E-05\n", + "[ NORMAL ] Iteration 226:\tk_eff = 1.220732\tres = 1.402E-05\n", + "[ NORMAL ] Iteration 227:\tk_eff = 1.220747\tres = 1.333E-05\n", + "[ NORMAL ] Iteration 228:\tk_eff = 1.220762\tres = 1.268E-05\n", + "[ NORMAL ] Iteration 229:\tk_eff = 1.220776\tres = 1.206E-05\n", + "[ NORMAL ] Iteration 230:\tk_eff = 1.220789\tres = 1.146E-05\n", + "[ NORMAL ] Iteration 231:\tk_eff = 1.220802\tres = 1.090E-05\n", + "[ NORMAL ] Iteration 232:\tk_eff = 1.220814\tres = 1.036E-05\n" ] } ], @@ -1354,8 +1435,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.223474\n", - "openmoc keff = 1.220892\n", - "bias [pcm]: -258.1\n" + "openmoc keff = 1.220814\n", + "bias [pcm]: -266.0\n" ] } ], @@ -1430,237 +1511,346 @@ "text": [ "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.495816\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.557477\tres = 5.042E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.518301\tres = 1.244E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.509212\tres = 7.027E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.496490\tres = 1.754E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.488581\tres = 2.498E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.482897\tres = 1.593E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.479775\tres = 1.163E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.478834\tres = 6.465E-03\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.479871\tres = 1.960E-03\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.482684\tres = 2.165E-03\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.487084\tres = 5.860E-03\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.492900\tres = 9.116E-03\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.499971\tres = 1.194E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.508153\tres = 1.435E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.517312\tres = 1.637E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.527325\tres = 1.802E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.538079\tres = 1.936E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.549472\tres = 2.039E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.561410\tres = 2.117E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.573807\tres = 2.173E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.586585\tres = 2.208E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.599674\tres = 2.227E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.613007\tres = 2.231E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.626528\tres = 2.223E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.640181\tres = 2.206E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.653920\tres = 2.179E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.667700\tres = 2.146E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.681483\tres = 2.107E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.695234\tres = 2.064E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.708921\tres = 2.018E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.722515\tres = 1.969E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.735993\tres = 1.918E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.749331\tres = 1.865E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.762510\tres = 1.812E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.775514\tres = 1.759E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.788326\tres = 1.705E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.800935\tres = 1.652E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.813328\tres = 1.599E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.825497\tres = 1.547E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.837433\tres = 1.496E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.849130\tres = 1.446E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.860583\tres = 1.397E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.871788\tres = 1.349E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.882742\tres = 1.302E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.893442\tres = 1.256E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.903887\tres = 1.212E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.914077\tres = 1.169E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.924012\tres = 1.127E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.933693\tres = 1.087E-02\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.943122\tres = 1.048E-02\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.952299\tres = 1.010E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.961228\tres = 9.730E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.969911\tres = 9.377E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 0.978351\tres = 9.033E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 0.986552\tres = 8.702E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 0.994517\tres = 8.382E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.002250\tres = 8.074E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.009755\tres = 7.776E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.017037\tres = 7.488E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.024099\tres = 7.211E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.030947\tres = 6.944E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.037584\tres = 6.687E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.044016\tres = 6.438E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.050247\tres = 6.199E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.056282\tres = 5.969E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.062125\tres = 5.746E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.067781\tres = 5.531E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.073255\tres = 5.326E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.078552\tres = 5.126E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.083676\tres = 4.936E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.088632\tres = 4.751E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.093425\tres = 4.573E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.098058\tres = 4.403E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.102537\tres = 4.237E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.106866\tres = 4.079E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.111049\tres = 3.926E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.115090\tres = 3.779E-03\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.118995\tres = 3.638E-03\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.122766\tres = 3.501E-03\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.126408\tres = 3.370E-03\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.129925\tres = 3.244E-03\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.133320\tres = 3.122E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.136597\tres = 3.005E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.139761\tres = 2.892E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.142815\tres = 2.783E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.145761\tres = 2.679E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.148605\tres = 2.579E-03\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.151348\tres = 2.482E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.153994\tres = 2.388E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.156547\tres = 2.299E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.159009\tres = 2.212E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.161384\tres = 2.129E-03\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.163674\tres = 2.049E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.165882\tres = 1.972E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.168012\tres = 1.898E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.170064\tres = 1.827E-03\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.172043\tres = 1.757E-03\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.173951\tres = 1.692E-03\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.175790\tres = 1.628E-03\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.177562\tres = 1.566E-03\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.179269\tres = 1.507E-03\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.180916\tres = 1.450E-03\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.182502\tres = 1.396E-03\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.184030\tres = 1.343E-03\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.185503\tres = 1.292E-03\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.186922\tres = 1.244E-03\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.188288\tres = 1.197E-03\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.189606\tres = 1.151E-03\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.190874\tres = 1.108E-03\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.192096\tres = 1.066E-03\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.193273\tres = 1.026E-03\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.194407\tres = 9.870E-04\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.195499\tres = 9.504E-04\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.196550\tres = 9.140E-04\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.197563\tres = 8.792E-04\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.198538\tres = 8.468E-04\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.199477\tres = 8.140E-04\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.200382\tres = 7.837E-04\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.201253\tres = 7.539E-04\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.202091\tres = 7.257E-04\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.202898\tres = 6.979E-04\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.203676\tres = 6.716E-04\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.204424\tres = 6.465E-04\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.205144\tres = 6.217E-04\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.205838\tres = 5.979E-04\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.206505\tres = 5.760E-04\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.207148\tres = 5.532E-04\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.207767\tres = 5.325E-04\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.208363\tres = 5.125E-04\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.208936\tres = 4.935E-04\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.209487\tres = 4.744E-04\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.210018\tres = 4.559E-04\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.210529\tres = 4.392E-04\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.211021\tres = 4.223E-04\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.211495\tres = 4.060E-04\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.211951\tres = 3.914E-04\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.212390\tres = 3.763E-04\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.212812\tres = 3.623E-04\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.213217\tres = 3.480E-04\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.213608\tres = 3.344E-04\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.213984\tres = 3.223E-04\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.214347\tres = 3.097E-04\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.214695\tres = 2.985E-04\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.215031\tres = 2.869E-04\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.215352\tres = 2.763E-04\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.215663\tres = 2.648E-04\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.215962\tres = 2.552E-04\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.216249\tres = 2.460E-04\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.216526\tres = 2.362E-04\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.216792\tres = 2.279E-04\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.217048\tres = 2.188E-04\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.217294\tres = 2.100E-04\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.217531\tres = 2.024E-04\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.217759\tres = 1.948E-04\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.217978\tres = 1.872E-04\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.218189\tres = 1.799E-04\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.218393\tres = 1.733E-04\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.218588\tres = 1.668E-04\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.218776\tres = 1.600E-04\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.218957\tres = 1.544E-04\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.219131\tres = 1.485E-04\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.219298\tres = 1.428E-04\n", - "[ NORMAL ] Iteration 163:\tk_eff = 1.219459\tres = 1.374E-04\n", - "[ NORMAL ] Iteration 164:\tk_eff = 1.219614\tres = 1.321E-04\n", - "[ NORMAL ] Iteration 165:\tk_eff = 1.219763\tres = 1.270E-04\n", - "[ NORMAL ] Iteration 166:\tk_eff = 1.219906\tres = 1.221E-04\n", - "[ NORMAL ] Iteration 167:\tk_eff = 1.220044\tres = 1.175E-04\n", - "[ NORMAL ] Iteration 168:\tk_eff = 1.220177\tres = 1.130E-04\n", - "[ NORMAL ] Iteration 169:\tk_eff = 1.220304\tres = 1.084E-04\n", - "[ NORMAL ] Iteration 170:\tk_eff = 1.220427\tres = 1.045E-04\n", - "[ NORMAL ] Iteration 171:\tk_eff = 1.220545\tres = 1.007E-04\n", - "[ NORMAL ] Iteration 172:\tk_eff = 1.220659\tres = 9.678E-05\n", - "[ NORMAL ] Iteration 173:\tk_eff = 1.220768\tres = 9.304E-05\n", - "[ NORMAL ] Iteration 174:\tk_eff = 1.220874\tres = 8.984E-05\n", - "[ NORMAL ] Iteration 175:\tk_eff = 1.220975\tres = 8.640E-05\n", - "[ NORMAL ] Iteration 176:\tk_eff = 1.221073\tres = 8.326E-05\n", - "[ NORMAL ] Iteration 177:\tk_eff = 1.221166\tres = 7.985E-05\n", - "[ NORMAL ] Iteration 178:\tk_eff = 1.221256\tres = 7.662E-05\n", - "[ NORMAL ] Iteration 179:\tk_eff = 1.221343\tres = 7.371E-05\n", - "[ NORMAL ] Iteration 180:\tk_eff = 1.221426\tres = 7.091E-05\n", - "[ NORMAL ] Iteration 181:\tk_eff = 1.221506\tres = 6.827E-05\n", - "[ NORMAL ] Iteration 182:\tk_eff = 1.221583\tres = 6.560E-05\n", - "[ NORMAL ] Iteration 183:\tk_eff = 1.221657\tres = 6.320E-05\n", - "[ NORMAL ] Iteration 184:\tk_eff = 1.221729\tres = 6.067E-05\n", - "[ NORMAL ] Iteration 185:\tk_eff = 1.221797\tres = 5.829E-05\n", - "[ NORMAL ] Iteration 186:\tk_eff = 1.221863\tres = 5.641E-05\n", - "[ NORMAL ] Iteration 187:\tk_eff = 1.221927\tres = 5.382E-05\n", - "[ NORMAL ] Iteration 188:\tk_eff = 1.221987\tres = 5.196E-05\n", - "[ NORMAL ] Iteration 189:\tk_eff = 1.222046\tres = 4.968E-05\n", - "[ NORMAL ] Iteration 190:\tk_eff = 1.222102\tres = 4.810E-05\n", - "[ NORMAL ] Iteration 191:\tk_eff = 1.222157\tres = 4.617E-05\n", - "[ NORMAL ] Iteration 192:\tk_eff = 1.222209\tres = 4.456E-05\n", - "[ NORMAL ] Iteration 193:\tk_eff = 1.222260\tres = 4.287E-05\n", - "[ NORMAL ] Iteration 194:\tk_eff = 1.222308\tres = 4.122E-05\n", - "[ NORMAL ] Iteration 195:\tk_eff = 1.222355\tres = 3.971E-05\n", - "[ NORMAL ] Iteration 196:\tk_eff = 1.222399\tres = 3.805E-05\n", - "[ NORMAL ] Iteration 197:\tk_eff = 1.222442\tres = 3.657E-05\n", - "[ NORMAL ] Iteration 198:\tk_eff = 1.222484\tres = 3.521E-05\n", - "[ NORMAL ] Iteration 199:\tk_eff = 1.222523\tres = 3.381E-05\n", - "[ NORMAL ] Iteration 200:\tk_eff = 1.222561\tres = 3.262E-05\n", - "[ NORMAL ] Iteration 201:\tk_eff = 1.222598\tres = 3.107E-05\n", - "[ NORMAL ] Iteration 202:\tk_eff = 1.222634\tres = 2.985E-05\n", - "[ NORMAL ] Iteration 203:\tk_eff = 1.222668\tres = 2.902E-05\n", - "[ NORMAL ] Iteration 204:\tk_eff = 1.222700\tres = 2.804E-05\n", - "[ NORMAL ] Iteration 205:\tk_eff = 1.222732\tres = 2.639E-05\n", - "[ NORMAL ] Iteration 206:\tk_eff = 1.222762\tres = 2.577E-05\n", - "[ NORMAL ] Iteration 207:\tk_eff = 1.222792\tres = 2.487E-05\n", - "[ NORMAL ] Iteration 208:\tk_eff = 1.222820\tres = 2.400E-05\n", - "[ NORMAL ] Iteration 209:\tk_eff = 1.222847\tres = 2.291E-05\n", - "[ NORMAL ] Iteration 210:\tk_eff = 1.222872\tres = 2.200E-05\n", - "[ NORMAL ] Iteration 211:\tk_eff = 1.222897\tres = 2.121E-05\n", - "[ NORMAL ] Iteration 212:\tk_eff = 1.222921\tres = 2.040E-05\n", - "[ NORMAL ] Iteration 213:\tk_eff = 1.222944\tres = 1.964E-05\n", - "[ NORMAL ] Iteration 214:\tk_eff = 1.222967\tres = 1.882E-05\n", - "[ NORMAL ] Iteration 215:\tk_eff = 1.222988\tres = 1.821E-05\n", - "[ NORMAL ] Iteration 216:\tk_eff = 1.223009\tres = 1.763E-05\n", - "[ NORMAL ] Iteration 217:\tk_eff = 1.223029\tres = 1.690E-05\n", - "[ NORMAL ] Iteration 218:\tk_eff = 1.223048\tres = 1.630E-05\n", - "[ NORMAL ] Iteration 219:\tk_eff = 1.223067\tres = 1.572E-05\n", - "[ NORMAL ] Iteration 220:\tk_eff = 1.223084\tres = 1.507E-05\n", - "[ NORMAL ] Iteration 221:\tk_eff = 1.223101\tres = 1.427E-05\n", - "[ NORMAL ] Iteration 222:\tk_eff = 1.223117\tres = 1.394E-05\n", - "[ NORMAL ] Iteration 223:\tk_eff = 1.223133\tres = 1.330E-05\n", - "[ NORMAL ] Iteration 224:\tk_eff = 1.223148\tres = 1.298E-05\n", - "[ NORMAL ] Iteration 225:\tk_eff = 1.223163\tres = 1.241E-05\n", - "[ NORMAL ] Iteration 226:\tk_eff = 1.223177\tres = 1.167E-05\n", - "[ NORMAL ] Iteration 227:\tk_eff = 1.223190\tres = 1.151E-05\n", - "[ NORMAL ] Iteration 228:\tk_eff = 1.223203\tres = 1.073E-05\n", - "[ NORMAL ] Iteration 229:\tk_eff = 1.223215\tres = 1.050E-05\n", - "[ NORMAL ] Iteration 230:\tk_eff = 1.223227\tres = 1.000E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.366907\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.391217\tres = 6.331E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.393027\tres = 6.626E-02\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.381142\tres = 4.627E-03\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.375065\tres = 3.024E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.369645\tres = 1.594E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.365597\tres = 1.445E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.363111\tres = 1.095E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.361532\tres = 6.802E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.361339\tres = 4.349E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.362062\tres = 5.322E-04\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.363777\tres = 2.001E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.366395\tres = 4.735E-03\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.369859\tres = 7.198E-03\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.374042\tres = 9.454E-03\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.378972\tres = 1.131E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.384524\tres = 1.318E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.390678\tres = 1.465E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.397373\tres = 1.600E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.404563\tres = 1.714E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.412207\tres = 1.809E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.420270\tres = 1.890E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.428695\tres = 1.956E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.437463\tres = 2.005E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.446530\tres = 2.045E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.455867\tres = 2.073E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.465442\tres = 2.091E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.475229\tres = 2.101E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.485198\tres = 2.103E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.495327\tres = 2.098E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.505591\tres = 2.088E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.515969\tres = 2.072E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.526440\tres = 2.053E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.536985\tres = 2.029E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.547587\tres = 2.003E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.558228\tres = 1.974E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.568893\tres = 1.943E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.579569\tres = 1.911E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.590241\tres = 1.877E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.600898\tres = 1.841E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.611527\tres = 1.805E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.622118\tres = 1.769E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.632662\tres = 1.732E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.643149\tres = 1.695E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.653571\tres = 1.658E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.663920\tres = 1.620E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.674189\tres = 1.583E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.684372\tres = 1.547E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.694464\tres = 1.510E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.704457\tres = 1.475E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.714349\tres = 1.439E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.724134\tres = 1.404E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.733808\tres = 1.370E-02\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.743369\tres = 1.336E-02\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.752812\tres = 1.303E-02\n", + "[ NORMAL ] Iteration 55:\tk_eff = 0.762135\tres = 1.270E-02\n", + "[ NORMAL ] Iteration 56:\tk_eff = 0.771336\tres = 1.238E-02\n", + "[ NORMAL ] Iteration 57:\tk_eff = 0.780412\tres = 1.207E-02\n", + "[ NORMAL ] Iteration 58:\tk_eff = 0.789362\tres = 1.177E-02\n", + "[ NORMAL ] Iteration 59:\tk_eff = 0.798184\tres = 1.147E-02\n", + "[ NORMAL ] Iteration 60:\tk_eff = 0.806877\tres = 1.118E-02\n", + "[ NORMAL ] Iteration 61:\tk_eff = 0.815440\tres = 1.089E-02\n", + "[ NORMAL ] Iteration 62:\tk_eff = 0.823872\tres = 1.061E-02\n", + "[ NORMAL ] Iteration 63:\tk_eff = 0.832172\tres = 1.034E-02\n", + "[ NORMAL ] Iteration 64:\tk_eff = 0.840340\tres = 1.007E-02\n", + "[ NORMAL ] Iteration 65:\tk_eff = 0.848377\tres = 9.816E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 0.856281\tres = 9.563E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 0.864053\tres = 9.317E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 0.871693\tres = 9.076E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 0.879202\tres = 8.842E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 0.886580\tres = 8.614E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 0.893828\tres = 8.392E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 0.900946\tres = 8.175E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 0.907936\tres = 7.964E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 0.914798\tres = 7.758E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 0.921534\tres = 7.558E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 0.928144\tres = 7.363E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 0.934629\tres = 7.173E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 0.940992\tres = 6.988E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 0.947233\tres = 6.808E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 0.953353\tres = 6.632E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 0.959355\tres = 6.461E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 0.965238\tres = 6.295E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 0.971006\tres = 6.133E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 0.976659\tres = 5.975E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 0.982199\tres = 5.822E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 0.987627\tres = 5.672E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 0.992945\tres = 5.527E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 0.998155\tres = 5.385E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.003258\tres = 5.247E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.008256\tres = 5.113E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.013151\tres = 4.982E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.017943\tres = 4.854E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.022635\tres = 4.730E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.027229\tres = 4.609E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.031726\tres = 4.492E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.036127\tres = 4.377E-03\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.040434\tres = 4.266E-03\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.044649\tres = 4.157E-03\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.048774\tres = 4.051E-03\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.052810\tres = 3.948E-03\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.056759\tres = 3.848E-03\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.060622\tres = 3.751E-03\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.064400\tres = 3.655E-03\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.068096\tres = 3.563E-03\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.071711\tres = 3.473E-03\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.075247\tres = 3.385E-03\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.078705\tres = 3.299E-03\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.082086\tres = 3.216E-03\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.085392\tres = 3.134E-03\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.088624\tres = 3.055E-03\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.091785\tres = 2.978E-03\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.094875\tres = 2.903E-03\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.097895\tres = 2.830E-03\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.100848\tres = 2.759E-03\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.103734\tres = 2.689E-03\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.106555\tres = 2.622E-03\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.109312\tres = 2.556E-03\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.112007\tres = 2.492E-03\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.114641\tres = 2.429E-03\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.117214\tres = 2.368E-03\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.119729\tres = 2.309E-03\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.122187\tres = 2.251E-03\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.124588\tres = 2.195E-03\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.126934\tres = 2.140E-03\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.129226\tres = 2.086E-03\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.131466\tres = 2.034E-03\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.133654\tres = 1.983E-03\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.135791\tres = 1.934E-03\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.137879\tres = 1.885E-03\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.139919\tres = 1.838E-03\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.141911\tres = 1.793E-03\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.143857\tres = 1.748E-03\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.145758\tres = 1.704E-03\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.147615\tres = 1.662E-03\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.149428\tres = 1.620E-03\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.151200\tres = 1.580E-03\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.152929\tres = 1.541E-03\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.154619\tres = 1.503E-03\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.156268\tres = 1.465E-03\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.157879\tres = 1.429E-03\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.159453\tres = 1.393E-03\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.160989\tres = 1.359E-03\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.162489\tres = 1.325E-03\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.163954\tres = 1.292E-03\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.165384\tres = 1.260E-03\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.166781\tres = 1.229E-03\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.168144\tres = 1.198E-03\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.169476\tres = 1.169E-03\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.170776\tres = 1.140E-03\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.172045\tres = 1.112E-03\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.173284\tres = 1.084E-03\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.174494\tres = 1.057E-03\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.175675\tres = 1.031E-03\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.176828\tres = 1.006E-03\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.177953\tres = 9.807E-04\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.179052\tres = 9.565E-04\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.180125\tres = 9.328E-04\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.181172\tres = 9.098E-04\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.182194\tres = 8.873E-04\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.183192\tres = 8.654E-04\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.184166\tres = 8.441E-04\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.185117\tres = 8.232E-04\n", + "[ NORMAL ] Iteration 163:\tk_eff = 1.186045\tres = 8.029E-04\n", + "[ NORMAL ] Iteration 164:\tk_eff = 1.186951\tres = 7.831E-04\n", + "[ NORMAL ] Iteration 165:\tk_eff = 1.187835\tres = 7.638E-04\n", + "[ NORMAL ] Iteration 166:\tk_eff = 1.188698\tres = 7.450E-04\n", + "[ NORMAL ] Iteration 167:\tk_eff = 1.189541\tres = 7.266E-04\n", + "[ NORMAL ] Iteration 168:\tk_eff = 1.190363\tres = 7.087E-04\n", + "[ NORMAL ] Iteration 169:\tk_eff = 1.191166\tres = 6.912E-04\n", + "[ NORMAL ] Iteration 170:\tk_eff = 1.191949\tres = 6.742E-04\n", + "[ NORMAL ] Iteration 171:\tk_eff = 1.192713\tres = 6.576E-04\n", + "[ NORMAL ] Iteration 172:\tk_eff = 1.193460\tres = 6.414E-04\n", + "[ NORMAL ] Iteration 173:\tk_eff = 1.194188\tres = 6.256E-04\n", + "[ NORMAL ] Iteration 174:\tk_eff = 1.194899\tres = 6.102E-04\n", + "[ NORMAL ] Iteration 175:\tk_eff = 1.195592\tres = 5.952E-04\n", + "[ NORMAL ] Iteration 176:\tk_eff = 1.196269\tres = 5.806E-04\n", + "[ NORMAL ] Iteration 177:\tk_eff = 1.196930\tres = 5.663E-04\n", + "[ NORMAL ] Iteration 178:\tk_eff = 1.197575\tres = 5.524E-04\n", + "[ NORMAL ] Iteration 179:\tk_eff = 1.198204\tres = 5.388E-04\n", + "[ NORMAL ] Iteration 180:\tk_eff = 1.198819\tres = 5.255E-04\n", + "[ NORMAL ] Iteration 181:\tk_eff = 1.199418\tres = 5.126E-04\n", + "[ NORMAL ] Iteration 182:\tk_eff = 1.200003\tres = 5.000E-04\n", + "[ NORMAL ] Iteration 183:\tk_eff = 1.200574\tres = 4.877E-04\n", + "[ NORMAL ] Iteration 184:\tk_eff = 1.201131\tres = 4.757E-04\n", + "[ NORMAL ] Iteration 185:\tk_eff = 1.201675\tres = 4.640E-04\n", + "[ NORMAL ] Iteration 186:\tk_eff = 1.202205\tres = 4.526E-04\n", + "[ NORMAL ] Iteration 187:\tk_eff = 1.202723\tres = 4.415E-04\n", + "[ NORMAL ] Iteration 188:\tk_eff = 1.203228\tres = 4.307E-04\n", + "[ NORMAL ] Iteration 189:\tk_eff = 1.203721\tres = 4.201E-04\n", + "[ NORMAL ] Iteration 190:\tk_eff = 1.204202\tres = 4.098E-04\n", + "[ NORMAL ] Iteration 191:\tk_eff = 1.204672\tres = 3.997E-04\n", + "[ NORMAL ] Iteration 192:\tk_eff = 1.205130\tres = 3.899E-04\n", + "[ NORMAL ] Iteration 193:\tk_eff = 1.205577\tres = 3.803E-04\n", + "[ NORMAL ] Iteration 194:\tk_eff = 1.206014\tres = 3.710E-04\n", + "[ NORMAL ] Iteration 195:\tk_eff = 1.206439\tres = 3.619E-04\n", + "[ NORMAL ] Iteration 196:\tk_eff = 1.206855\tres = 3.530E-04\n", + "[ NORMAL ] Iteration 197:\tk_eff = 1.207260\tres = 3.444E-04\n", + "[ NORMAL ] Iteration 198:\tk_eff = 1.207656\tres = 3.359E-04\n", + "[ NORMAL ] Iteration 199:\tk_eff = 1.208042\tres = 3.277E-04\n", + "[ NORMAL ] Iteration 200:\tk_eff = 1.208418\tres = 3.196E-04\n", + "[ NORMAL ] Iteration 201:\tk_eff = 1.208786\tres = 3.118E-04\n", + "[ NORMAL ] Iteration 202:\tk_eff = 1.209144\tres = 3.041E-04\n", + "[ NORMAL ] Iteration 203:\tk_eff = 1.209494\tres = 2.967E-04\n", + "[ NORMAL ] Iteration 204:\tk_eff = 1.209836\tres = 2.894E-04\n", + "[ NORMAL ] Iteration 205:\tk_eff = 1.210169\tres = 2.823E-04\n", + "[ NORMAL ] Iteration 206:\tk_eff = 1.210494\tres = 2.754E-04\n", + "[ NORMAL ] Iteration 207:\tk_eff = 1.210811\tres = 2.686E-04\n", + "[ NORMAL ] Iteration 208:\tk_eff = 1.211121\tres = 2.621E-04\n", + "[ NORMAL ] Iteration 209:\tk_eff = 1.211423\tres = 2.556E-04\n", + "[ NORMAL ] Iteration 210:\tk_eff = 1.211718\tres = 2.494E-04\n", + "[ NORMAL ] Iteration 211:\tk_eff = 1.212005\tres = 2.433E-04\n", + "[ NORMAL ] Iteration 212:\tk_eff = 1.212286\tres = 2.373E-04\n", + "[ NORMAL ] Iteration 213:\tk_eff = 1.212559\tres = 2.315E-04\n", + "[ NORMAL ] Iteration 214:\tk_eff = 1.212827\tres = 2.258E-04\n", + "[ NORMAL ] Iteration 215:\tk_eff = 1.213087\tres = 2.203E-04\n", + "[ NORMAL ] Iteration 216:\tk_eff = 1.213341\tres = 2.149E-04\n", + "[ NORMAL ] Iteration 217:\tk_eff = 1.213590\tres = 2.096E-04\n", + "[ NORMAL ] Iteration 218:\tk_eff = 1.213832\tres = 2.045E-04\n", + "[ NORMAL ] Iteration 219:\tk_eff = 1.214068\tres = 1.995E-04\n", + "[ NORMAL ] Iteration 220:\tk_eff = 1.214298\tres = 1.946E-04\n", + "[ NORMAL ] Iteration 221:\tk_eff = 1.214523\tres = 1.898E-04\n", + "[ NORMAL ] Iteration 222:\tk_eff = 1.214743\tres = 1.852E-04\n", + "[ NORMAL ] Iteration 223:\tk_eff = 1.214957\tres = 1.806E-04\n", + "[ NORMAL ] Iteration 224:\tk_eff = 1.215165\tres = 1.762E-04\n", + "[ NORMAL ] Iteration 225:\tk_eff = 1.215369\tres = 1.719E-04\n", + "[ NORMAL ] Iteration 226:\tk_eff = 1.215568\tres = 1.677E-04\n", + "[ NORMAL ] Iteration 227:\tk_eff = 1.215762\tres = 1.636E-04\n", + "[ NORMAL ] Iteration 228:\tk_eff = 1.215951\tres = 1.596E-04\n", + "[ NORMAL ] Iteration 229:\tk_eff = 1.216136\tres = 1.557E-04\n", + "[ NORMAL ] Iteration 230:\tk_eff = 1.216316\tres = 1.519E-04\n", + "[ NORMAL ] Iteration 231:\tk_eff = 1.216492\tres = 1.482E-04\n", + "[ NORMAL ] Iteration 232:\tk_eff = 1.216663\tres = 1.445E-04\n", + "[ NORMAL ] Iteration 233:\tk_eff = 1.216831\tres = 1.410E-04\n", + "[ NORMAL ] Iteration 234:\tk_eff = 1.216994\tres = 1.375E-04\n", + "[ NORMAL ] Iteration 235:\tk_eff = 1.217153\tres = 1.342E-04\n", + "[ NORMAL ] Iteration 236:\tk_eff = 1.217309\tres = 1.309E-04\n", + "[ NORMAL ] Iteration 237:\tk_eff = 1.217460\tres = 1.277E-04\n", + "[ NORMAL ] Iteration 238:\tk_eff = 1.217608\tres = 1.246E-04\n", + "[ NORMAL ] Iteration 239:\tk_eff = 1.217753\tres = 1.215E-04\n", + "[ NORMAL ] Iteration 240:\tk_eff = 1.217894\tres = 1.185E-04\n", + "[ NORMAL ] Iteration 241:\tk_eff = 1.218031\tres = 1.156E-04\n", + "[ NORMAL ] Iteration 242:\tk_eff = 1.218165\tres = 1.128E-04\n", + "[ NORMAL ] Iteration 243:\tk_eff = 1.218296\tres = 1.101E-04\n", + "[ NORMAL ] Iteration 244:\tk_eff = 1.218423\tres = 1.074E-04\n", + "[ NORMAL ] Iteration 245:\tk_eff = 1.218548\tres = 1.047E-04\n", + "[ NORMAL ] Iteration 246:\tk_eff = 1.218669\tres = 1.022E-04\n", + "[ NORMAL ] Iteration 247:\tk_eff = 1.218788\tres = 9.967E-05\n", + "[ NORMAL ] Iteration 248:\tk_eff = 1.218903\tres = 9.723E-05\n", + "[ NORMAL ] Iteration 249:\tk_eff = 1.219016\tres = 9.486E-05\n", + "[ NORMAL ] Iteration 250:\tk_eff = 1.219126\tres = 9.254E-05\n", + "[ NORMAL ] Iteration 251:\tk_eff = 1.219234\tres = 9.027E-05\n", + "[ NORMAL ] Iteration 252:\tk_eff = 1.219338\tres = 8.806E-05\n", + "[ NORMAL ] Iteration 253:\tk_eff = 1.219441\tres = 8.591E-05\n", + "[ NORMAL ] Iteration 254:\tk_eff = 1.219540\tres = 8.381E-05\n", + "[ NORMAL ] Iteration 255:\tk_eff = 1.219637\tres = 8.176E-05\n", + "[ NORMAL ] Iteration 256:\tk_eff = 1.219732\tres = 7.976E-05\n", + "[ NORMAL ] Iteration 257:\tk_eff = 1.219825\tres = 7.781E-05\n", + "[ NORMAL ] Iteration 258:\tk_eff = 1.219915\tres = 7.591E-05\n", + "[ NORMAL ] Iteration 259:\tk_eff = 1.220003\tres = 7.405E-05\n", + "[ NORMAL ] Iteration 260:\tk_eff = 1.220089\tres = 7.224E-05\n", + "[ NORMAL ] Iteration 261:\tk_eff = 1.220173\tres = 7.047E-05\n", + "[ NORMAL ] Iteration 262:\tk_eff = 1.220255\tres = 6.875E-05\n", + "[ NORMAL ] Iteration 263:\tk_eff = 1.220335\tres = 6.707E-05\n", + "[ NORMAL ] Iteration 264:\tk_eff = 1.220413\tres = 6.543E-05\n", + "[ NORMAL ] Iteration 265:\tk_eff = 1.220489\tres = 6.383E-05\n", + "[ NORMAL ] Iteration 266:\tk_eff = 1.220563\tres = 6.227E-05\n", + "[ NORMAL ] Iteration 267:\tk_eff = 1.220635\tres = 6.075E-05\n", + "[ NORMAL ] Iteration 268:\tk_eff = 1.220706\tres = 5.926E-05\n", + "[ NORMAL ] Iteration 269:\tk_eff = 1.220775\tres = 5.781E-05\n", + "[ NORMAL ] Iteration 270:\tk_eff = 1.220842\tres = 5.640E-05\n", + "[ NORMAL ] Iteration 271:\tk_eff = 1.220907\tres = 5.502E-05\n", + "[ NORMAL ] Iteration 272:\tk_eff = 1.220971\tres = 5.368E-05\n", + "[ NORMAL ] Iteration 273:\tk_eff = 1.221034\tres = 5.236E-05\n", + "[ NORMAL ] Iteration 274:\tk_eff = 1.221095\tres = 5.108E-05\n", + "[ NORMAL ] Iteration 275:\tk_eff = 1.221154\tres = 4.984E-05\n", + "[ NORMAL ] Iteration 276:\tk_eff = 1.221212\tres = 4.862E-05\n", + "[ NORMAL ] Iteration 277:\tk_eff = 1.221268\tres = 4.743E-05\n", + "[ NORMAL ] Iteration 278:\tk_eff = 1.221324\tres = 4.627E-05\n", + "[ NORMAL ] Iteration 279:\tk_eff = 1.221377\tres = 4.514E-05\n", + "[ NORMAL ] Iteration 280:\tk_eff = 1.221430\tres = 4.403E-05\n", + "[ NORMAL ] Iteration 281:\tk_eff = 1.221481\tres = 4.296E-05\n", + "[ NORMAL ] Iteration 282:\tk_eff = 1.221531\tres = 4.191E-05\n", + "[ NORMAL ] Iteration 283:\tk_eff = 1.221580\tres = 4.088E-05\n", + "[ NORMAL ] Iteration 284:\tk_eff = 1.221627\tres = 3.988E-05\n", + "[ NORMAL ] Iteration 285:\tk_eff = 1.221674\tres = 3.891E-05\n", + "[ NORMAL ] Iteration 286:\tk_eff = 1.221719\tres = 3.796E-05\n", + "[ NORMAL ] Iteration 287:\tk_eff = 1.221763\tres = 3.703E-05\n", + "[ NORMAL ] Iteration 288:\tk_eff = 1.221806\tres = 3.613E-05\n", + "[ NORMAL ] Iteration 289:\tk_eff = 1.221848\tres = 3.524E-05\n", + "[ NORMAL ] Iteration 290:\tk_eff = 1.221889\tres = 3.438E-05\n", + "[ NORMAL ] Iteration 291:\tk_eff = 1.221929\tres = 3.354E-05\n", + "[ NORMAL ] Iteration 292:\tk_eff = 1.221968\tres = 3.272E-05\n", + "[ NORMAL ] Iteration 293:\tk_eff = 1.222006\tres = 3.192E-05\n", + "[ NORMAL ] Iteration 294:\tk_eff = 1.222043\tres = 3.114E-05\n", + "[ NORMAL ] Iteration 295:\tk_eff = 1.222079\tres = 3.038E-05\n", + "[ NORMAL ] Iteration 296:\tk_eff = 1.222115\tres = 2.964E-05\n", + "[ NORMAL ] Iteration 297:\tk_eff = 1.222149\tres = 2.891E-05\n", + "[ NORMAL ] Iteration 298:\tk_eff = 1.222183\tres = 2.821E-05\n", + "[ NORMAL ] Iteration 299:\tk_eff = 1.222216\tres = 2.752E-05\n", + "[ NORMAL ] Iteration 300:\tk_eff = 1.222248\tres = 2.685E-05\n", + "[ NORMAL ] Iteration 301:\tk_eff = 1.222279\tres = 2.619E-05\n", + "[ NORMAL ] Iteration 302:\tk_eff = 1.222309\tres = 2.555E-05\n", + "[ NORMAL ] Iteration 303:\tk_eff = 1.222339\tres = 2.492E-05\n", + "[ NORMAL ] Iteration 304:\tk_eff = 1.222368\tres = 2.432E-05\n", + "[ NORMAL ] Iteration 305:\tk_eff = 1.222396\tres = 2.372E-05\n", + "[ NORMAL ] Iteration 306:\tk_eff = 1.222424\tres = 2.314E-05\n", + "[ NORMAL ] Iteration 307:\tk_eff = 1.222451\tres = 2.258E-05\n", + "[ NORMAL ] Iteration 308:\tk_eff = 1.222477\tres = 2.202E-05\n", + "[ NORMAL ] Iteration 309:\tk_eff = 1.222503\tres = 2.149E-05\n", + "[ NORMAL ] Iteration 310:\tk_eff = 1.222528\tres = 2.096E-05\n", + "[ NORMAL ] Iteration 311:\tk_eff = 1.222552\tres = 2.045E-05\n", + "[ NORMAL ] Iteration 312:\tk_eff = 1.222576\tres = 1.995E-05\n", + "[ NORMAL ] Iteration 313:\tk_eff = 1.222599\tres = 1.946E-05\n", + "[ NORMAL ] Iteration 314:\tk_eff = 1.222622\tres = 1.899E-05\n", + "[ NORMAL ] Iteration 315:\tk_eff = 1.222644\tres = 1.852E-05\n", + "[ NORMAL ] Iteration 316:\tk_eff = 1.222665\tres = 1.807E-05\n", + "[ NORMAL ] Iteration 317:\tk_eff = 1.222686\tres = 1.763E-05\n", + "[ NORMAL ] Iteration 318:\tk_eff = 1.222707\tres = 1.720E-05\n", + "[ NORMAL ] Iteration 319:\tk_eff = 1.222727\tres = 1.678E-05\n", + "[ NORMAL ] Iteration 320:\tk_eff = 1.222746\tres = 1.637E-05\n", + "[ NORMAL ] Iteration 321:\tk_eff = 1.222766\tres = 1.597E-05\n", + "[ NORMAL ] Iteration 322:\tk_eff = 1.222784\tres = 1.558E-05\n", + "[ NORMAL ] Iteration 323:\tk_eff = 1.222802\tres = 1.520E-05\n", + "[ NORMAL ] Iteration 324:\tk_eff = 1.222820\tres = 1.483E-05\n", + "[ NORMAL ] Iteration 325:\tk_eff = 1.222837\tres = 1.446E-05\n", + "[ NORMAL ] Iteration 326:\tk_eff = 1.222854\tres = 1.411E-05\n", + "[ NORMAL ] Iteration 327:\tk_eff = 1.222870\tres = 1.377E-05\n", + "[ NORMAL ] Iteration 328:\tk_eff = 1.222886\tres = 1.343E-05\n", + "[ NORMAL ] Iteration 329:\tk_eff = 1.222902\tres = 1.310E-05\n", + "[ NORMAL ] Iteration 330:\tk_eff = 1.222917\tres = 1.278E-05\n", + "[ NORMAL ] Iteration 331:\tk_eff = 1.222932\tres = 1.247E-05\n", + "[ NORMAL ] Iteration 332:\tk_eff = 1.222947\tres = 1.216E-05\n", + "[ NORMAL ] Iteration 333:\tk_eff = 1.222961\tres = 1.187E-05\n", + "[ NORMAL ] Iteration 334:\tk_eff = 1.222975\tres = 1.158E-05\n", + "[ NORMAL ] Iteration 335:\tk_eff = 1.222988\tres = 1.129E-05\n", + "[ NORMAL ] Iteration 336:\tk_eff = 1.223001\tres = 1.102E-05\n", + "[ NORMAL ] Iteration 337:\tk_eff = 1.223014\tres = 1.075E-05\n", + "[ NORMAL ] Iteration 338:\tk_eff = 1.223027\tres = 1.049E-05\n", + "[ NORMAL ] Iteration 339:\tk_eff = 1.223039\tres = 1.023E-05\n" ] } ], @@ -1686,8 +1876,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.223474\n", - "openmoc keff = 1.223227\n", - "bias [pcm]: -24.7\n" + "openmoc keff = 1.223039\n", + "bias [pcm]: -43.5\n" ] } ], @@ -1772,9 +1962,9 @@ }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEeCAYAAABlggnIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd4VGX2wPHvTCYdgoKA4oqC5dgRRcG6oGJbO2IvWFER\nsaFi713URcW6KrrqioqKDUGxLKJrQ7H8jiLqqsgCigTSp/z+uHcmk2QmmQmZmvN5njzJ3LlzzzuT\n5J77lvu+nlAohDHGGAPgzXQBjDHGZA9LCsYYYyIsKRhjjImwpGCMMSbCkoIxxpgISwrGGGMifJku\ngMktIhIE1lLVP6K2jQDOUtVhMfb3ADcD+wEB4DtgtKr+LiJbA/cC5UAQuFRVX3dfdztwGPC7eyhV\n1aPilGe++/qwj1T1NBH5FBiqqpVJvscDgD1U9ZxkXtfGMU8ARgMlQBHwb+AiVV3RUTESLMco4Cyg\nAOf/fy5wQbKfUdTx9gMGq+qVqfjcTPpZUjDJindjS7ztJwEDgW1U1S8iNwO3A6OAx4HLVHW6iGwB\nzBWR7qrqB3YEjlDVDxIoz1BVXd78CVXdtu2305KqTgemt+e1sYjIJcDewIGqukxECoC7gJeAv3ZU\nnATKMQi4HNhWVVe4Cfte9+vYdh52e2BN6PjPzWSGJQWTLE+S+38JjHdP9AAfA2e6Pw9U1fAV/kbA\nciAgIkU4ieQCEdkIWACcq6o/xylPzDKFazVAITAF6OE+9aqqXiEivZttf8W94j0BOExVDxCRdYHJ\nwAbuPlNU9TYRWR94E3gVGIxzYrxUVac2K0MZMAEYoKrLAFQ1ICIXAIeISCFwCU4SXAf4HCeR3gHs\nDviBD933XyUiZ+DUOOqAWpxa1//F297sI1nH/ay6ACtUNSQilwNbRJX3EuBQnKblH4EzVXWx+1nd\nB2yKU+O73y3X6YBXRFbg/J465HMzmWN9CialVPVDVZ0HICJrAlcAz7jPBd3tC4BngZtVNQT0wTlx\nXKyq2wAfAC+2Ema2iHwqIp+539dyt4drL6cC36vqIGA3YCMR6Rpj+8bu9ujX/hN4U1W3BnYBjhWR\nw93n+gOvqepg4GLg1hhl2xSoUtWFzT6XWlV9SlUb3E19cWpTxwOXAWsDW6nqAJymnltFxIuTLPZ2\nYz4A7BJve4yyvAa8D/woIp+IyCRgB1V9B0BEjgO2crdt6+7/sPvayU6xdTNgJ/ezW4aTKP6lqpd3\n8OdmMsSSgklWrGYiL87VY1wisiHwDvCuqk6Ofk5VN8KpKUwQkaGq+qOq7q+qC9znbwM2dK8yYxmq\nqtuq6kD3+zJ3e7gG8TowQkRewbmavlhVV7ayPVzmMmBnnOYV3Hb3R4F93V3qVfU19+dPcZtRmgmS\n2P/ZB25CxD3+fVG1qEnAvu7jZ3Ca2SYBlcDD8bY3D6CqflU9FlgPuA2nBvWoiDzl7rI/ztX7JyLy\nGU7fw8buc3vgJBtUtVJVt26e6MI66HMzGWJJwSRrKY3NLWG9cTuEReSVqCv2/d1tw3CuUB9R1THu\ntkIROSJ8AFX9CZgFDBSRrUSkeRu3B2ggtlabtFT1Y6AfTpPH+sBHIjIk3vaol8b6//DinEwB6qO2\nh+KU42ugUET6R28UkWL3s1rb3bSqlbgF4ZhuTWJ/nA77i4BprW1vFvNEETlAVRe7tZTTge2AkSLS\n3Y1zs5tcBwKDaKxxNBB1QSAi/aJqVc11xOdmMsSSgknWa8DZbidluEnoBJw2YlT1b1FX7C+LyE7A\n88BxqnpH+CBus8l1InKke5w+wFCc2kQQuCtcMxCRM4HPVXVRewosIjcCV6jqS+7ImK+ATeJtjyrj\nKpymq3Ai6wYcD7zh7tL8ZNbi5Kaq9Tijr/4hIr3c4xQDdwKlqro4RpFnAKeLiM9tGjoTeENEeojI\nf4HfVfXvOM1MW8fbHuO4QeAmt70/8vHg9B0sd+OeEnWyvw5nMAA4CfvEqM/hTZzanZ/Gk334Pa/2\n52YyxzqaTbLOwRk99KWINOD8Qz+mqlPi7H+V+/0md+QRwEJVHQEcDNwrIhfhND9doKqfAojIWOBl\n96T4C9BiOKqrtWl+w8/dCTwmIl/gdMR+DjwFdI/aXg/Mc7cfHXWMY4F7ROQknJPfE6o6xU1YzWPH\nLIuq3iQiVcAMEQnhDEt9233/sVyH084+D+fq/T/AWFWtFJFrgbdEpAbn6v1kd3hvi+0xyvGYiJQC\nr7qd+SHgW2Aft9P5IZz+nA/cTvr/4owSAxgLTBaRz3F+59er6mdugntOROpxmoI67HMzmeHJtqmz\nxRm7PglYCDwa7gQzxhiTetnYfDQY+A2nWvpVhstijDGdSlqbj0RkMHCTqg6LunFmAM646lPc0Qz/\nBp7G6bwcj9NpZowxJg3SVlMQkfHAg0Cxu+lgoFhVd8K5uWeiu30bnHbUP93vxhhj0iSdzUcLgEOi\nHu+CM04cVf0QZ2gcOCMhJuGM2JiUxvIZY0ynl7bmI1Wd1uzmowogejKwgIh4VXUuziRdCfH7A6FA\nID2d5T6fF78/2PaOFitr4lms3ItnsdITq7jYF3MocCaHpFYC0Te/eKPu4ExYIBCisrKm40rVioqK\nUouVY/EsVu7Fs1jpidWzZ+x7DzM5+mgOznTKuHeRzs9gWYwxxpDZmsI0YLiIzHEfn5jBshhjjCHN\nScGd32Yn9+cQcEY64xtjjGldNt68ZowxJkMsKRhjjImwpGCMMSbCkoIxxpgImzrbGNPpLVz4Pffd\nN4m6ujqqq6sZMmQnTj55dFLHePfdt9liiy3xeDw8+uhDnHdebk7bZjUFY0yntmrVKq6++lLGjbuA\nu+6azAMPPMoPP3zPiy8+n9Rxpk59iqqqKrp375GzCQGspmCM6eTee+9ttttue9Zd9y8AeDweLrvs\nGnw+H3fffSdffDEPj8fD8OF7c9hhR3LDDVdTWFjIb7/9xh9//M6ll17JsmVL+e67b7nuuiu5/PJr\nuO66K7n//kc44YSjGDhwWxYs+I7CQh/XX38rqv/HCy88x9VX3wDAQQftzYsvzmDx4t+48cZrCAQC\neDwezjlnPBtuuFHkeYArr7yEQw45jB491uKGG67G5/MRCoW48srr6NmzV4d8HlZTMMZ0asuWLaNP\nn3WbbCspKeE///mAxYsX8cADj3LPPQ8yc+YMFi5cAMDaa/dh4sRJjBhxOC++OI0dd9yFjTfehMsv\nv4bCwkI8HmdaoerqKoYP35e7736AXr16MXfu+wCR5x3Oz3fffSeHH340d9/9AGeffT433nhNk+ej\nffTRh2y++Zbceee9nHTSaaxatarFPu1lNQVjTFbZdtsCvv469rw87bHppgHefbc67vNrr702336r\nTbb99tsiVL9h660HAuDz+dh88y354YcfANhkEwGgV6/ezJ//eeR1sVay3HjjTSJx6uvrYpTAec1P\nP/3AgAEDI69ZuvR/TZ6P/nn//Q/in/98jPPOG0vXrl047bQxcd9fsqymYIzJKp9+GmDJkpUd9tVa\nQgDYeedd+c9/5vLrr78A4Pf7mTTpDioqKvjii3mRbV9++Tl9+/YFml/pO7xeb8yk0HzfoqJili1b\nCsDixb9RWVkJwAYb9GfePGeZ6+++U7p37wFAIBCgtraWhoYGfvhhIQDvvfcOAwYM5K677mXo0D34\n5z8fS+zDTYDVFIwxnVpZWTmXXnoVt9xyPaFQiOrqanbZZTdGjDiCxYsXc/rpJ+H3+9l99+FsvLHE\nPc6WW27Nddddwfjxl0RtbdlMtOmmm9G1a1dGjz6R9dffINJ0NWbMOG6++TqefvoJAgE/EyZcAcDI\nkUcxevQo+vRZl7XX7hM5xvXXX0VhYSHBYJCzzz6vwz4PT6zMlkvq6vyhbJqO1mJlVzyLlXvxLFZ6\nYvXs2TXmegrWfGSMMSYi55PCQw95yPHKjjHGZI2cTwr/+IeXo48uZfHimDUhY4wxScj5pPDOOwG2\n3TbA7ruXMW2a9ZsbY8zqyPmkUFgI48fX8+STNdx+exGnnlrCH39kulTGGJObcj4phG2zTZCZM6tZ\ne+0QQ4eWM2tWQaaLZIwxOSdvkgJAaSlce20dkyfXcvHFJZx/fjEdePe3MSZPffbZJ+y66/a8+ebM\nJttPOMGZ6yiW1157mfvvvweAl16aRiAQ4LvvvuXRRx+Kuf8HH8xl3LgzGTPmVMaOHc0NN1xNVVX2\nnaDyKimE7bxzgNmzqwgEYOjQcj74wGoNxpjWrb/+Brz55huRxwsXLqC2tjah1z7++CMEg0E23ngT\nRo06pcXzCxZ8x5133sEVV1zDPfc8yKRJ97PRRpvw5JOPd1j5O0re9sx27Qp33lnHjBl+Tj21hBEj\n/Fx8cR0lJZkumTEmG2244cb8/PN/qa6uoqysnBkzXmOvvfblf/9bHHOm0rCXX36R33//nSuvvISR\nI49sMgNq2AsvPMdpp42mR4+1ItsOP/yoyM/HH38E663Xl8LCIi64YALXXHM51dVVBAIBTj31DLbd\ndhAjRx7Ik08+R2FhIffddzfrr78Ba6+9DlOm/AOPx8vy5b9zwAGHcOihI1frc8jbpBC2994BBg2q\n5sILi9lrrzLuvruWrbcOZrpYxpgYSu+dRNFtN9KzA9t9g+VdqB4/gZozx7a579Chu/POO7PZd9/9\n+eabrzj22FH873+LiTVTadj++x/EY4/9g2uuuZH58z+POS/Sb78tYr31+kZ+vuGGqwmFQoRCIe65\n50Fqamo48cTT2GijjbnnnrvYYYfBHHbYkSxbtpQzzzyFZ555MW78ZcuW8sgjTxIIBDjhhCPZfffh\nVFSUtv3BxJGXzUfN9egR4qGHahk3rp4jjyzl9tuL8PszXSpjTHOlkyfh6eCOQG/VKkonT2pzP2fN\nhH2YOXMG8+Z9GpmxtKVYd8uGmkyG98UX8xg7djRnn306c+fOoXfv3vzyy88ArLNOHyZNup+JE+9m\nyZIlkdeEk4YzW+q2AKy1Vk/Ky8tZvrzpkMroWFtuOQCfz0dxcTH9+m0YmdivvTpFUgDweGDECD+z\nZlXzwQcF7L9/GQsW2A1vxmSTmjPGEurSpUOPGSzvQs0ZbdcSwDlh19bW8Oyz/2LvvfeLnHwDAX+L\nmUqjeb1egsFA5PHWW2/DpEn38/e/38eOO+7MQQeN4MEHH+D335dF9vnkk4+IrlR4vc7peIMN+vH5\n585sqUuXLmHlypV067YGxcXF/P77MkKhEN99923kdd99p4RCIWpra/nxx4Wst956iX84MeR981Fz\nffqEeOaZGh59tJADDijjvPPqOfnkBrydJj0ak71qzhxL4cUXpnWyv+b22GM4M2a8xl/+sl7kqnvk\nyKM47bQTWHfdv0RmKo229dbbMH78OZx44qkxjymyKeeddwHXX38VgUCA6upqevXqxfXX3+Lu0Zgd\njj32RG688Rrefvst6urquOiiS/F6vRx11HFccMHZrLNOHyoqKiL7+/1+zj//bCorVzBq1ClUVHRb\nrfffqWdJXbjQw1lnlVJSEuLvf6/lL39p/bPItlkOczFWuuNZrNyLZ7ES99lnn/Dii89z1VXXJx3L\nZkmNoX//ENOnVzN0aIC99irj6ad9NrmeMaZTy8qkICK9ReSjdMQqKICzz65n6tQa7ruviBNOKGHp\nUutrMMZkv4EDt2tRS1hdWZkUgPHAj+kMuMUWQWbMqEYkyLBhZbz8cqfrbjHGmPR2NIvIYOAmVR0m\nIh7gXmAAUAucoqoLReR04Ang/HSWDaC4GC69tJ7hw/2MHVvKa6/5uOGGWrqtXr+NMcbkjLTVFERk\nPPAgUOxuOhgoVtWdgAnARHf7cGA0sIOIjEhX+aLtsEOQt96qoksXZ3K9d96xaTKMMZ1DOpuPFgCH\nRD3eBXgdQFU/BAa5P49Q1TOAD1X1uTSWr4nycrj55jomTqxl3LgSJkwopro6U6Uxxpj0SOuQVBFZ\nH3hKVXcSkQeBZ1V1hvvcj0B/VU1qDopAIBjy+1M7bcXy5XDeeV4+/tjDQw8FGDw4peEA8Pm8pPp9\nZSJWuuNZrNyLZ7HSE6u42BdzRE0me1Mrga5Rj73JJgQAvz+Y8nHGBQVw113w5ptlHHaYl2OOaeCC\nC+opKkpdzFwfP50t8SxW7sWzWOmJ1bNn15jbMzn6aA6wH4CIDAHmZ7AsCTnkkBBvvVXNN98UsPfe\nZXz9dbYO3jLGmPbJ5FltGlAnInOA24FzM1iWhPXuHWLKlBpOO62eESNKmTSpiECg7dcZY0wuSGvz\nkar+BOzk/hwCzkhn/I7i8cBRR/nZeecA48aVMGNGKZMm1dKvn90ObYzJbdb+sRr69g3x3HM1HHCA\nn/32K+PRRwttmgxjTE6zpLCavF4YPbqBF1+s4cknCznqqFJ++82myTDG5CZLCh1kk02CvPJKNdtt\nF2CPPcp4/nmbXM8Yk3ssKXSgwkIYP76ep56qYeLEIk47rYQ//mj7dcYYky0sKaTAgAFBZs6sZp11\nnGkyZs60aTKMMbnBkkKKlJbCNdfUcd99tUyYUMJ55xXTwUvPGmNMh7OkkGI77RTg7berABg6tJz3\n37dagzEme1lSSIMuXWDixDpuuKGW008v4YoriqmtzXSpjDGmJUsKabTXXgFmz67m1189DB9exuef\n28dvjMkudlZKsx49Qjz0UC3nnFPPUUeVctttRTQ0ZLpUxhjjsKSQAR4PjBjh5803q/noowL+9rcy\nvvvOfhXGmMyzM1EGrbNOiKefruHooxs44IBS7r+/kGD6psg3xpgWLClkmMcDo0Y18Oqr1bz0UiEj\nRpTy8882TYYxJjMsKWSJ/v1DvPRSNbvvHmCvvcp47DGPTZNhjEk7SwpZpKAAxo6t57nnarjnHi/H\nH1/KkiVWazDGpI8lhSy0+eZB/v3vAJttFmDYsDKmT8/kqqnGmM7EkkKWKiqCSy6p59FHa7j++mLO\nPLOEFSsyXSpjTL6zpJDltt8+yJtvVlFREeKvfy3n7bdtmgxjTOpYUsgB5eVw00113HlnLeeeW8JF\nFxVTVZXpUhlj8pElhRwydKgzud7KlR722KOczz6zX58xpmPZWSXHdOsG995by4QJdRxzTCkTJxbh\n92e6VMaYfGFJIUcddJAzTcb77xdw4IFl/PCDDV01xqw+Swo5bJ11QjzzTA0HHdTAfvuV8dRTti60\nMWb1WFLIcV4vjB7dwHPP1XDffUWcdJKtC22MaT9LCnli882DzJhRTd++IYYNK2f2bBu6aoxJniWF\nPFJSAldfXcfdd9dy3nklXHppMTU1mS6VMSaXWFLIQ7vuGmD27CqWLPGw115lzJ9vv2ZjTGKyblId\nEdkWGOs+vFBVl2ayPLlqjTXggQdqefZZH4cfXsqYMfWccUYDBdaqZIxpRTZeQhYD44BXgR0zXJac\n5vHAyJF+3nijmpkzfYwYUcovv9jQVWNMfGlNCiIyWERmuz97RGSyiLwvIm+JSH8AVZ0LbA6cD8xL\nZ/ny1XrrhXj++ZrIWg3PPZd1FURjTJaImxRExCsiZ4nIlu7js0VkvohMEZGKZAOJyHjgQZyaAMDB\nQLGq7gRMACa6+w0CPgH2w0kMpgMUFMDZZ9fz9NM1TJxYxOmnl1BZmelSGWOyTWs1hRuB4cAqEdkZ\nuBY4F+eE/fd2xFoAHBL1eBfgdQBV/RDYzt1eAfwDuAX4ZzvimFZsvXWQmTOr6do1xO67l/Pxx9nY\ngmiMyZTW2hH2Awaqql9EzgGeVdVZwCwR+SbZQKo6TUTWj9pUAUSvEBAQEa+qvgW8lehxfT4vFRWl\nyRanXfIlVkUF3H8/vPhiiFGjyjjrrBDnn1+atk7ofPkcO0usdMezWJmN1VpSCKhqeKq1oTg1h7CO\nuLysBLpGH1NVg8kexO8PUlmZnsH4FRWleRVr2DB44w0PY8eWM2MG3HNPLX36pH6ejHz7HPM9Vrrj\nWaz0xOrZs2vM7a2d3KtFpK+IbAFsBswEEJGtcU7oq2sOTm0EERkCzO+AY5ok9ekT4vXXA+y2W4A9\n9yzj1VetE9qYzqy1M8AlwFycZp6rVPUPETkDuBIY1QGxpwHDRWSO+/jEDjimaYeCAjj33Hp22cXP\nGWeUMnt2AVdfXUdZWaZLZoxJt7hJQVXfFpF+QJmq/ulu/hTYVVW/a08wVf0J2Mn9OQSc0Z7jmNTY\nfvsgb71VxYUXlrD33mXcf38tm2+edIueMSaHtTYkdYyq1kclhPAooSUi8lRaSmfSrqICJk+u5ayz\n6hkxopSHHy606biN6URa61PYS0SeF5E1whtEZChO2/+qVBfMZI7HA0cc4eeVV6r5178KOf74Un7/\n3e6EjqdXr65tfj6XX17MtGnWX2OyX9ykoKoHAe8DH4nIUBG5BXgaOFtVT01XAU3m9O8f4uWXq9l4\n4wC7717GnDk2cVI8y5e3/vz99xdx331F6SmMMauh1UsXVb1NRBbh3DewGNhOVX9NS8kSVLTWmvRc\nlb6KS8+0RcqeWJPcrya3HrYhWN6F6vETqDlzbNs754Fg0GpSJj+0er+BiJwL3IHTIfw2ME1ENkpD\nuRLmSWNCMInzVq2i7NYb294xTwQT6I+3vhmTC1rraH4TOAzYUVXvV9WjgcnAv0Xk5HQVsC2hLl0y\nXQQTh7eq8yTsQKDtfSwpmFzQWvPR28D10XcZq+ojIvI+8BTwcIrLlpD6Zcuz6i7BzhLr5Zd9XHhh\nMeefX89JJzXgiWo96dkr6fkSc14iNYV4li714PVCjx6WNUzmtdbRfG2saSdUVYEhKS2VyXr77+/n\n5ZereeKJQs4+u4Ta2kyXKHf99a9l7Lmn3SloskO75jBS1fqOLojJPeHRSdXVcMghZfzvf523szWR\npqF4+yxb5u3Un53JLjZvslkt5eXw4IO17LGHn332KePzzzvnn1R089HSpXaCN7mrc/4Hmw7l9cIF\nF9Rz7bV1HHlk+qZzzgbhq//opLDFFl2YO7flPR2t1SasE9pkizZvsRSRUcBtwJruJg8QUlW7k8k0\nsf/+fjbYIAi7Z7ok6RMeddR89NHy5VZbMLkpkfvurwCGquqXqS6MyX1bbtl0bILfD748nt0hXEMI\nBDwxtxuTaxJpPvrVEoJpr1GjSqmqynQpUid88m+eBKw5yOSqRK7hPhGRZ4E3gMjAQ1WdkrJSmbzR\no0eIQw8t44knaujZM//OlOFk4Pe3vh9YojC5IZGk0A1YCewYtS0EWFIwbXryKXcSuC2abo+eaymX\n50lqbD5qur0jEsDPP3tYbz3LJCa92mw+UtUTgdOA24G7gFNV9aRUF8zkrmB5clOP5PI8SfGaj2JJ\ndvTRdtt14YcfrMPapFebSUFEtgO+Ax4DHgH+KyKDU10wk7uqx09oV2LIRfFqCh2lrs6SgkmvRDqa\n/w4coarbqepA4FDcmZSNiaXmzLH8/sMili6pbPE14/VV9FknyO231bB0SWWmi7raGvsU2j55L1ni\noTLOWw4GPcycaaO8TeYlkhS6uMtwAqCqHwAlqSuSyWfbbhtk1qwAd99dxE035f6iM+F1FBKpKSxd\n6uWYY5re3DdrVmMiOOYYm//IZF4iSeEPETko/EBEDgZ+T12RTL7bcEN45ZVqZs/O/RsY4vUpeOJU\nHP73v6b/ckcf3TIRrFzpLPEJNmLJpF8i/5WjgcdF5B84dzMvAI5LaalM3uvZM8Tzz1dDv/j7/P67\nh8mTC+nePcTppzfgzcJJWVIx+qiysjGjxEsuxqRKm0lBVb8FBotIOeBV1ZWpL5bpDMrLmz5uvg5D\nT5zhblXeLrzz7mVs//SZaStbolLd0ZyNidDkt7hJQUQeUNXTRGQ2zn0J4e0AqGonmuHGpEqwvEub\nI4/Kg6vY9a3r+PX3MVm3EE28pNBRV/hWUzDp1lpN4X73+1VpKIfppKrHT6Ds1hvbTAxdWcWTTxYy\ndmx2LeURb+6jeFZn3QVj0qG1ldc+cX+cCyxX1XeAdYH9gW/TUDbTCbQ2fLX5kNXHHivMuonmkm0+\nSvaE7/FYhjDplUiL5RPAYSKyA3A1UIlzI5sxadWtW4h33sn8WP5QqOU6CqnsUwgGoa4uNcc3prlE\nkkI/Vb0COAx4SFWvpXFtBWPS5thjG3jiicJMF4Pevbvy0ENOOZKZ5gJgxQoPTz2V3FDce+8tZL31\nuia07/TpPi65pLjJNls/2yQjkaTgE5G1gIOBV0RkbSBld9mIyO4i8oCIPC4iW6Uqjsk9I0Y08O67\nvqxY7nL+fKfGEr55LZFZUsFJCuPGJbc63YIF8f9Nr766mGXLGj+PBx4o5KGHmt4U2LdvV954I/M1\nLJMbEkkKtwIfAq+46yq8C1yTwjKVqmp4Ar69UhjH5JgNN6rgzxVeNt+iKz17VTT56tGvD6X3pm/2\nleY1hCVLUpOo2hp9dM89Rbz9duMJP16fxa+/2thWk5hEZkl9UlU3VNVzRaQCOERV/9WeYCIy2B3i\nioh4RGSyiLwvIm+JSH833isiUgaMxfouOr1EJ9ZrbabVP//syBI5mieFSZOK4+/cQb7/PvM1JJP/\nEpkl9WQR+YeI9AS+Bp4VkeuSDSQi44EHgfB/z8FAsaruBEwAJrr7rYUz4d4Vqros2TgmvyQz42qs\nYa0ffgibbNK1w4d5hm8qa28Hc2UlfPZZ7H+/+qhRtzNnNvY/7LVXOdtsU95i/0WLvKxY4fwcCjmJ\nY/LkwpR1fpv8lkid8kzgAuAo4EVgK2CfdsRaABwS9XgX4HUAd8K97dzttwNrAzeKyKHtiGPySKwh\nq9ddW8NhI+pjDlttbv585yQZ3e7eEcJJob3J5sYbi9l775Yn+IULPQwZ0pgEb721sQaycqWHRYta\n/sted10xJ51U2qQ8V15Z0uHv2XQOCQ2DUNU/RGQ/4O+q6heR5HrKnGNME5H1ozZVACuiHgdExKuq\nJyRzXJ/PS0VF0sVpF4uVHfFOPhm23LKA5ctLWX/9ps81P+5XXzkn0draEiqazqLRqlmzPPz8M5x4\nYuyz/gsv+Bg0qIwdd2x8Pvp9lZYWUVHhjFBqaGj5eo8n9r9efX3LCYgLC5vuW1FR2uIzrKwsiGwP\n69Kl8T0BezfgAAAgAElEQVRfdFEJ48a1fwLCfP17tFgxXpvAPl+JyMtAf2CWiDwDfNyuaE1VAtHj\n7LyqmvStSX5/kMrKmg4oTtsqKkotVhbE8/nguOOKuO46D7ffXtdkac/mx503z7nq/vXXetZbL/H2\nlHPPLeO77woYMSLWVF9dqa31cMEFBbz+ehXhf6PGv8WuzJ3rJxgMsNdeAcaMaXmir6/3Ay2nDq+q\nqiP63zIUAr+/6b6VlTVRn6HzLxQIOLH9/jLA6XhetaqWyspQZJ/V+czz9e+xM8fq2TP2MOdEmo9O\nAm4BhqhqPfC4u211zQH2AxCRIcD8Djim6STOOKOel18uZOHC+E0kwSB8+SVsv30g6c7mggRHcMa7\nP2HSpGKOPbaMe+8tZOrUlvdWTJkSey2JG25o2mEdPWNqIqKbsw44oIxFi6wJySQnblIQkdPcHy8B\nhgJnicgVwEDg0g6IPQ2oE5E5OP0I53bAMU0n0b07jBlTz2WXxV/v6b//9VBRARtsEOTPP5M7OSba\nSdt8zqPmd1xfdVVy61G9917blfepU1vu8+WXBUyf3nT7jz96OeOMpvHPPLOEOXPsngUTX2t/gZ5m\n31ebqv4E7OT+HALO6Khjm87n9NPreeaZ+PdRzp9fwIABIbp1C7FiRXJ/xuGb0trSvKN55MjUr542\nZkwpY8bA7NlNr+k++aTlyX7u3Kb/4s8+W0hJSYidd7ahSSa21pLCpwCqenWaymJMUoqK4Lbb6uDA\n2M9/8kkBO+wQYsWKEKtWJZsUEt9v440D/PFH+ptpvvyyaVK4997cX97UZF5rfQrhqbMRkdvTUBZj\nkjZkSPwr3g8+KGDwYOjaNcTKlalLCkVF0NCQ/qQwdmz6RoyZzqO1pBD9Vz4s1QUxpiOET+Y//ujh\nxx897LJLiK5dnXWPk5Ho/QfhpJDo3EfZ6I47iqiqynQpTLZIdEIUG8JgcsJxx5XywQcFXHRRCaNG\nNVBYmNqaQiAAxcWhlCaFjrob+/nnndbi8HxKgQAcf3wJN95YHLM/wnROrSWFUJyfjclagwYFuOyy\nYvr1C3L++c58EckkhZoa6NWra8JJIRQKNx+1t8Tp88ADTfscqqrg9dczPxW5yS6tdTRvIyLhBltP\n9M9ASFXt0sJknXPPrefcc5su2ZlM81F4lFKiaxD4/U5SgNQttBOez2j1j9P0cXhqDIDx40v44Qcv\nS5Yk2c5m8k7cpKCqNteuyQtduiReUwjfLBbvprHmzUSBgAefL0RhYepqCx3VfBR9nI8+8vLuu43/\n/j/80Pjvruqle/cQPXtaA0FnZCd+k/e6dk18SGqlO7+e3x97/+Y1CL/fmRzP58v+pDBvnlO5f/zx\nIv72t5aT8YXtums5p52W3E13Jn9YUjB5r6Ii8ZpCdXXr+9XWNn0+GHQSQnW1hx13TE2LakdP+52I\nOXN8rGo5E7npBCwpmLzXpYvTp5DIybW6uvXn6+qaPvb7G+dJWrAgvwbp/fijnR46ozYnWhERD3A6\nsIe7/2xgUntmNDUm1Xr2ajk/dh/AD9C77dcf536FBft1oXr8BGrOHAu0bD4KBBKfPK+90llT6NWr\ncebMyZOLOOecerp1C9Grl48lS9JXDpM5iVwK3ALsDUwBHsG5kc3ucDZZI9GV2dqj+TKfNTVNawPp\nSAqZMnVqIQ89VBjpZzGdQyJJYS/gUFV9SVVfBA6jfSuvGZMSySzZ2R7Ry3w2bz4Kjz5KpUz0KZjO\nK5FFdnzuV33UY5ti0WSNmjPHRpp3mgsvNjJ8eBm33FLLwIGtt3pOmlTEtdc6axqEYtzI37yjOTz6\nKJWyJSl8/72HDTfMksKYlEnkz/mfwNsiMlZExgJvAU+mtljGdKxE72quaWNhrFh9Cj6fcy9Eqjz3\nXObuOn722cLItBg77pi62pjJHokkhZuBa4G+wAbA9ap6QyoLZUxHi5UUFi/2cP75TVc6a+t+huY1\nhXCfQnl5fl5Br1zpoaoqv0ZVmdYl0nz0kapuC7yW6sIYkyqxprp4++0CHn+8iNtvb+woWLrUw5pr\nhli+PPaJsGWfgpMUSvL4Xq+5cxt70hct8tCnT4hp03xsskmQLbawQYj5JpGk8D8R2RX4j6rWtbm3\nMVmoW7dQi4VwPDHO+0uWeOjbN8jy5bGHFLW8T8FDQQEUFuZnTQHg8ssbM94BB5SxzTYBpk8vZNdd\n/Tz3XHoWojfpk0hSGAS8AyAiIWxCPJODttoqwFtv+YDGuShiJYWlSz307dvyBB++/+Fs9yvi2g4t\nZvb72f0CeA/o1b7DBMub3v9hskebfQqq2lNVve4EeT73Z0sIJqfssEOADz8saDKSJzw9dvTspkuX\neqiocHZahXWspkrz+z9M9mgzKYjIUBGZ4z7cREQWishOKS6XMR2qX78QDQ3wyy+N1YNwB2p4aouG\nBmfq7LIyJyncVHJlSu9/6Oyi7/8w2SOR5qOJwPEAqqoish/wOLB9KgtmTEfyeJzawn/+U8B66znz\nXzcmBQ9duzp9DmuuGWKLLYL07h3kzlXnM+6H0YAz/cP776/i2WcLmTSpKLIm87nn1lFcDDNn+jr1\n6mXz5q2iT5/E+lViTUViskciQ1JLVPXL8ANV/T/AlmsyOSecFMLCNYTw+sQrVzqjlEaNauD996ta\nrL723/96eeaZQrp1azz5hSfEa6ujeZddcngRZ9OpJJIU/k9EbhaRLd2v64BvU10wYzrarrsGeOMN\nX2QEUbimEP6+apWHLl1CeDxQWNhyJbWXX/bxyy9eevRoTACBgIeCghC+Nurcu+2W35MA/PSTzaia\nLxL5TZ4MdAGewpkUrwtwaioLZUwqbLVVkC23DHLTTc4Na+H1AponBXCu/sNJIdw5HR6ttO660UnB\n2bd379ZrCtGT5l11VYJrfeaQgw4qy5rpOMzqabNPQVWXA2PSUBZjUu6uu2r429/K8flC/PKLc00U\nbkZatcpZewHCScHJAuHk8McfHs49t46KipA7vLVxmovbb69l9mxfi3shwqInzeuSp33XdXX5fRNf\nZxG3piAin7rfgyISiPoKikh+14VN3ureHaZPr+ajjwp4770CBg/2x6wphCe5CwYbk8Ly5c5w1eim\novCEeGVlNEkI337b9Pbp6JpCvk61PX16IuNWTLaL+1t0p7bAvT8h7URkGHC0qlpTlelQa60VYtq0\nGurr4YYbivn+e+dPfNUqT5M5jAoKQgQCTZNCt25NJ8UL1xSi3XlnDWus0XRb06SQn+0s48aVMHKk\nDTPNdXGTgogc39oLVXVKxxcnEntDYCBQ3Na+xrSHxwPFxTBkSIB77inknHOaNh9BY79CeBTS7787\nNYX6+sYaQfQiO19/7WfzzX0cfnjLkUapnl47G/j9NnFePmitvvcosASYhbOWQvRvPITT6Zw0ERkM\n3KSqw9ylPu8FBgC1wCmqulBVvwcmikjKEo8xAMOH+7nssmI+/tjbpPkIGpOC3z3HL1/u3M8QPVle\nfb2HoiLnNf37w6JFK2OORIqeUiPW9BrGZIvWrl+2xVl+c1OcJPAUcLKqnqiqJ7UnmIiMBx6ksQZw\nMFCsqjsBE3BulItm/z4mpXw+GDOmnjvuKKaqyjnphxUUhPsUnD/DhgYP3bo17VOor4eioqbHi8Xj\ngdtuc9qdOkOtweSuuH+eqjpPVSeo6iBgMjAc+I+I3CciQ9sZbwFwSNTjXYDX3Xgf4ky+Fy0/G19N\nVjn66AbmzfMyf763RfOR39/0foWKilCTPoHmSSEer5fInEoVFSHWWsumnDbZKaHhAqr6MfCxO4X2\nTcCxkPxsYao6TUTWj9pUAayIeuwXEa+qBt39W+3XAPD5vFRUlCZblHaxWLkXL5FYFRWw774wZYqP\nM8/0UFHhc18LZWWl1Nc37tunTwnl5Y0V2FCogDXW8FJRUdhqrNLSQsrKnJ/XWKOYX34JUlKSf1WG\nZH+vsfbPtr+Pzhar1aTgtvnvBowE9gXmAZOA6e2K1lIl0DXqcSQhJMrvD1JZmZ453cPr/Vqs3ImX\naKzBg31MmVKKz1dHZaVTNfB4yvnzz1oaGiB8DeT11lBf7wOcf7jq6iANDfVUVgZixGr8066ra6C2\nNgSUUlsbjhH9p58fEvmse7axfzb+feRjrJ49Y//9tTb6aDKwD/AZ8AxwkapWtb+YMc0B9geeFZEh\nwPwOPr4xCdluOycRxO5TaNyvpKRpv0FDQ/zmI2dIqyfyc7iD2TqaTTZrrf46GufyaCBwIzDfnTZ7\noYgs7KD404A6d2ru24FzO+i4xiSlX78QO+7oZ6ONGiuq4dFHzedAiu4obmjwxJ0Mb968xmuoQMAT\nSQbJdDSPHNnQ9k7GdKDWmo/6pSKgqv4E7OT+HALOSEUcY5Lh8cCLLzatbjcmBU+L7WF1dfFrCuGh\nquB0SLeVFCZNqmHsWKdZ6v77a6irc+ZlmjrVJiU26dPaHc0/pbMgxmQbrzd2TSF69FFDgzOjaizR\nzUQNDbTafLRkiTMtxuef1/PQQ0Uccohzc8TDD1tCMOmVf8MfjOkg4T6F6NFH4e1h9fUeiotjNx9F\n1wiiawqt9Sk0f85mHjXpZknBmDjCHcWtJYVEawp+vwevNzzZXuJn+lxLCuEZZ03usqRgTBw+n3Pz\nWniuo803d9qRopNAbW38PoXopHDggQ2Rx4nc7JarBg0qd4fwmlxlScGYOLxep/morg7+8pcgU6Y4\nHdHhYaseT4i6uvijjxoX5QnSv3/jkNR4NYt88eGHjVWpUAgWL7YxuLnEkoIxcYRHH9XUeNhyywB9\n+zon/379ggwe7MfnS6ymEL6vIZGawlZbNe3VzrV7Gk47rYFLLinmmWd87LlnGY8+WsjWW3fh1Vcb\nl0E12c2SgjFxhJPCH3946N69sTZQUQHTp9dQWBi+TyH268NTbj//vNPQ3lhTiN9RcOSR/shIpOjX\n5IoxY+q59NI6Lr+8hAULvFx0kbMU26hRpcyYYYvw5AJLCsbEER6S+uuvHnr1anki79HD2Rbvyr+s\nDM47r4711gs3N9Hq/vmgsBD23jvA449Xc889TdeiXrYsxzJcJ2VJwZg4CgpCBIMe5s4tYPDglivQ\nhmc9jXc17/XCxRc3Dl0KT4hXUpL4kKJcqymE7bBDkL/9zc/LLzfe1X3nnUUt7vkw2ceSgjFxFBTA\nypUwb17spBCr9tCacBLp1i3x1+RqUgjbYYcg8+atYsMNg/ToEWLcuJJMF8m0wZKCMXH4fPDvf/sY\nMCDQZJ2F6OeT0bOnkxSi73PoDPr0CTF3bhUjRzbwzDNNO2B++inHs14esqRgTBzFxfD22wXstFPs\nNo9kr+J79gw16URORK7XFKKdcUYDP/3U9P1vv30XFi3KozeZBywpGBNHWVmIb74pYNCgzDWE51NS\n8HigNMa6L5dfXsyqVXDTTUX88kseveEcZWPEjIkjfALr3z/2uk/BNKyomU9JIZ7p0wv5/nsvX39d\nwKxZPt58M0RlpfP519dDeXmmS9i5WE3BmDhKS50+gN69Y3copyMpNHfjjbVt75RDFixYyaGHNvD1\n105HyxdfFNCzp4+NNurKhRcWM3Bg0qv+mtVkScGYOMIT4YWHkjaXiZrCySfn18RCFRVw/PGN72n9\n9YORCQP/+c8i/vzTQ+/elhjSyZKCMXGsWNF6200magr5aMCAAIce2sA771Tx0UdVVFcH2G03Zz0J\nkQChkIc//gBVL08+6WPpUg+ff26nrlSxPgVj4qiszHxS6NUr/zNPeTncd1/TZrHbb6/l8suLmTKl\nlg026MKmm3alsDBEQ4OHI45oYPFiD1Ontr4wvWkfS7fGxHHggX6OOCJ+c82VV9Zx993tPzFFL9cZ\nz157JTfy6cMPV7W3OFll/fVDTJniJIrp06sZObKBbbZxEuS//lXIO+/4uO++PJ9uNkOspmBMHCec\n0MAJJ8RPCgMGBBkwoP1X8v36BVEt4IUX4q9M09boo9Gj6/n5Zw+vvlroHjPHVuVJwFZbBbn77lqq\nquD99ws49link+eKK0r49Vcve+7pZ/vtA3H7fjq7UAimTvUxdWoha64Z4rzz6tl00/h/t1ZTMCZD\nws1P3bq1/0S+zjrBpO+szkUeD3TpAnvuGWDatGo23jjACSfUU14e4pZbitliiy6MHl3C7NkFNr9S\nMy+84OPOO4s47rgGttwyyIgRpey2W/wMaknBmAwJN4ckei/Clls2nu2+/dYf+bmtJTufeKKxJnLr\nrW0PaT3ppPo298kUrxd23jnAnDnV3HprHRdfXM8rr1Tz6aer2GGHANdfX8ygQeXcdFMRn37qpTa/\nRvAmrboarr++mNtuq+PAA/2cfXY9X3xRxb/+Fb/Z05KCMRkyaZJzxkokKZx0Uj1vvdW+BZCT7ZfY\nZZfcu9Rec01nuO6sWdU88UQNVVUezj+/BJEu7LlnGeefX8ysWQV5O2Ksvh4uuaSYrbYq5+CDSznr\nLC/PPuvj6quLGTgw0GSqloICWGed+FcSnaDiaUx28rqXZIkkhb59m57N2qodjB5dz5AhAU48seW8\nEttsE2DevPiz8nXvHuKpp6o56qjUN9L37FURe/tqHHOo+xXxhfv1eJwyrEasRATLu1A9fgJcfGHK\nYlxzTTHff+/lhReq+fVXLz/9VMzzzxfy22+eVmsFsVhSMCbD2koKd9xRy777xu/wjpUgRo5sYMMN\nY18WDx7cMikUFIQIBJyCDBkS4O23UzeVa7C8C96q/BgllQhv1SrKbr2RhhQlhV9/9TB1aiH//ncV\nPXuG2HDDABUVIY47rn0j46z5yJgMayspHHNMA927N9225pqNr22r1pBMrET3WR3V4ycQLO9cdymn\nMglOnVrIwQc3RKZmX11WUzAmw5I9CS9ZspKKihjTjbbT8cfXs9ZaISZOLG6zPJttFuCbb1avFlFz\n5lhqzhwb9/mKilIqK9NzY1pFRSkrVtTw9ddeZs8uYPZsH598UsCAAQF23jnAvvv62XzzYLvXwIjX\nPNaRXn7Zx9VX13XY8bIuKYjIjsBoIASMU9XKDBfJmJTyeFbvCu/yy+uorPTw3nuN/87xag+xTvi3\n3eacUMJJId5+ANtuG6Cy0sOvv+ZPI4PHA1tsEWSLLYKcdVYD1dUwZ04B777r49RTS6mshOHDAxxz\nTD3bbx/s0JpUZSV89VUB33zjZdEiD717h1h33RAbbBBk002DkX6neH780cOiRR6GDOm4wQFZlxSA\n09yvHYAjgQcyWxxjUmt17zPo3z/EI4/U8MorrR+oW7cQf/2rn2+/LWp3LI8HNt882CIpbLZZgAMP\n9Md5VW4pK3OSwPDhAa69to7PPvMya5aPs88upaoK1lwzhNfrfA5bbRVgyJAAAwe2PaypuKSwRad2\nT2BD4MB2lrUnsBRgndjPtSrOlUNak4KIDAZuUtVhIuIB7gUGALXAKaq6EPCqar2ILAZ2T2f5jEm3\nN9+sYoMNVr8tuKICjjqq9ZPyAw/U0LdviDXWaDtea1fDXbs6rx82zM+ff3r47LMCZs+ubvOqNlcN\nHBhk4MB6Lrignv/+10N1tYf6evjqKy/z5xfw8MNFrLNOkN12C7DBBkHWXjtEeXmI+noP+5R0obA2\ntzrV05YURGQ8cBwQ/oQOBopVdSc3WUx0t1WLSBFO7lucrvIZkwlbbbV6A+djnYjXWivIX/7S8sQf\nPtHvt5+fm28upqwsRHV17LN/a0nh1ltref75QtZYIxSZSTZfE0I0j8eZk8lp2cad4sTPtdfW8dpr\nPr780svMmT6WLHESR1FRiB97X8Epv1xDaSB3EkM6awoLgENoHC28C/A6gKp+KCLbudsfBO53yzY6\njeUzJqc8+2x1zKVCv/66CnDuZo2ltRN+QYFzwisujr9P166w/fYB9t7bzwMPtL8pKl/4fHDAAX4O\nOCDWs6ezitNZRcd1oC9Z4mHSpCKee87HuHH1jB7dcrhyIrHiNS+lLSmo6jQRWT9qUwWwIupxQES8\nqvopcGKix/X5vB06EsNi5Ve8fI61//6tn5DDfRXhMpWXF1NREaJLs9Gg0WUOhZzHw4fDBx/4GTLE\nOcjee4eYMcNDYaGPigov770XAgp5+GFvi2Osrnz+nXVErIoKuOsuuOuuIM4pvOVpfHViZbKjuRLo\nGvXYq6pJ16X9/mBah69ZrNyK15ljOTWFru5+XamurqOyMsCqVV6i//Ubj9O1yeP+/Ru3vfhigFdf\ndWbXrKxsbJrq37+ETz7xdej7zrbPMV9j9ezZNeb2TLYEzgH2AxCRIcD8DJbFmLy31lrOyTzecNWZ\nM6t4442mbU7h5iRw5kQKHyNs4sRavv8+d9rLTdsyWVOYBgwXkTnu44SbjIwxyfn555Wt9hMAMdeG\nWLRoFb17x76iBCgsdL5M/khrUlDVn4Cd3J9DwBnpjG9MZxLdoRwrISQ65cXChSuB9PU5mczKxpvX\njDFpcNddtXFHKEVr3jFt8pslBWPyVEkJTJkS/6yfL3cgm47VCW45MaZz8nhgn31yb8Eck1mWFIzp\nZJKZatt0PpYUjDHGRFhSMMYYE2FJwZhOpk+fIGutlacr2JvVZknBmE5mjTUaJ80zpjlLCsYYYyIs\nKRhjjImwpGCMMSbCkoIxxpgISwrGGGMiLCkYY4yJsKRgjDEmwpKCMcaYCEsKxhhjIiwpGGOMibCk\nYIwxJsKSgjHGmAhLCsYYYyIsKRhjjImwpGCMMSbCkoIxxpgISwrGGGMiLCkYY4yJsKRgjDEmIiuT\ngogME5EHM10OY4zpbLIuKYjIhsBAoDjTZTHGmM7Gl44gIjIYuElVh4mIB7gXGADUAqeo6sLwvqr6\nPTBRRKako2zGGGMapbymICLjgQdpvPI/GChW1Z2ACcBEd79rRORJEVnD3c+T6rIZY4xpKh01hQXA\nIcDj7uNdgNcBVPVDERnk/nxFs9eF0lA2Y4wxUTyhUOrPvSKyPvCUqu7kdiA/q6oz3Od+BPqrajDl\nBTHGGNOqTHQ0VwJdo8tgCcEYY7JDJpLCHGA/ABEZAszPQBmMMcbEkJbRR81MA4aLyBz38YkZKIMx\nxpgY0tKnYIwxJjdk3c1rxhhjMseSgjHGmAhLCsYYYyIsKRhjjInIxOijlBKRYcDRqnpqrMepiCMi\nOwKjce7CHqeqlR0ZKyrmEcBeOPd6XKaqVamI48YahDMyrAK4TVU/T2GsccA2wMbAE6p6XwpjbQaM\nw5l25VZV/TqFsbYGJgELgUdV9Z1UxYqK2Rt4WVW3T3GcbYGx7sMLVXVpCmPtDhwJlAK3qGrKh7Gn\n6rzRLEZazhtR8RJ6T3lVU2g+w2qqZlyNcdzT3K+Hcf54U+UA4FScKUNOSGEcgO2AzYB1gZ9TGUhV\n78L5/L5MZUJwnQL8gjMZ448pjjUY+A3wA1+lOFbYeFL/vsD52x8HvArsmOJYpap6GnA7zkVRSqVx\npuZ0nTeSek9ZX1NYnRlWk5lxdTVnci1Q1XoRWQzsnqr3B9wNPAT8BCR9F3iSsT7F+WPdHdgfSGrW\n2iRjARwFPJ/se2pHrI1wEup27vfJKYz1HvA00BvnZH1RKt+biJwOPAGcn2ycZGOp6lz35tPzgcNT\nHOsVESnDqZkk/Rm2I95qz9ScYDxve88bycZK5j1ldU2hA2dYbXXG1dWIE1YlIkXAOsDiVL0/YG2c\nK91/k+TVe5KxngKuxanWLgO6pzDWkyKyJrCbqr6RTJx2vq+lQDXwB0nOxNuO39c2QAHwp/s91e/t\nMJzmiB1EZEQq35uIbA98gjM7QVJJqB2xeuI0w12hqsuSidXOeKs1U3Oi8YDq9pw32hkrrM33lNVJ\ngcYZVsOazLAKRGZYVdWjVfVPd7/md+S1dYdee+OEPQjcj1MVfCKB99WuuMAK4FFgFPBMEnGSjXUU\nztXG4zhXZ8m8p2RjHa2qy3Hai9sj2fc1Gef3dS7wVApjHY1To5sE3Ox+T1ZS701V91TVM4APVfW5\nFMY6Gmf+sn8AtwD/THGs23AuiG4UkUOTjJV0vFbOIx0Vbzt3e3vPG8nEGtRs/zbfU1Y3H6nqNHeG\n1bAKnBNjmF9EWkyop6rHt/a4o+Oo6qe0Y7qOZOOq6mxgdrJx2hnrJeCldMRyX3NMOmKp6ie0sz+m\nHbHmAnPbE6s98aJe1+rfe0fEUtW3gLeSjdPOWKvVf5bOzzHBeAE3XrvOG0nGav5Ztvmesr2m0Fy6\nZljN1Eyu6YxrsXIrVrrj5WusfI+32rFyLSmka4bVTM3kms64Fiu3YqU7Xr7Gyvd4qx0rq5uPYkjX\nDKuZmsk1nXEtVm7FSne8fI2V7/FWO5bNkmqMMSYi15qPjDHGpJAlBWOMMRGWFIwxxkRYUjDGGBNh\nScEYY0yEJQVjjDERlhSMMcZE5NrNa8YkxJ0P5lucdQzCM0OGgAdVNanpsju4XCfgzFw5HbgS+AG4\n353ILrzPNjhTl49S1ZhTHYvIScDhqrpPs+3/AObh3LS0ObCxqv43Fe/F5CdLCiaf/aqq22a6EDG8\nqKonuYnrd2AfEfGoavhO0iOAJW0c4xngdhFZKzydtIiU4qx9cZ6q/l1Emq9ZYUybLCmYTklEFgHP\n4kw13IBz1f2TOMuQ3oEzlfcyYLS7fTbOGgyb45y0NwWuBqqAz3D+lx4HrlXVnd0YxwODVXVMK0VZ\n5b5+NyC8XOdwYFZUWfdxY/lwahanqupyEZnmluUed9eDgTejpn5u13oApnOzPgWTz9YVkU/dr8/c\n71u4z60NzHRrEu8BZ4lIIc7Kdkep6iCcZp6Hoo73uapuBizCSRzD3P26AyF3OuneItLP3f8EnPUv\n2vIMMBIia2N/DtS7j9cCbgT2UtXtgDdw1jDAPXb0lOPH46xxYEy7WU3B5LPWmo9CwAz35y+BXYFN\ngA2Bl9xlDQG6RL3mQ/f7rsD7qhpeLesxnKt0cJYtPVZEHgV6qepHbZQxhNO/cL37+AjgXzjLk4Kz\nzokqVCIAAAGwSURBVHNfYLZbJi9OkxOq+q6I9HCboWpx+g9mthHPmFZZUjCdlqrWuz+GcJpaCoDv\nw4nEPQn3jnpJjfs9QPzlNR/FWfmqjgTXtVbVKhGZJyK7AsNw1iEOJ4UC4D1VPdgtUxHOQiphj+HU\nFmpo/+pdxkRY85HJZ621qcd67v+A7iKyi/v4FODJGPu9DwwSkd5u4jgSd5lDd6TPL8DpOH0MiZoK\n3AR83GxRlA+BHUVkY/fxlTQ2H4GTeA7FWZ/5kSTiGROT1RRMPltHRD5ttu1dVT2HGGvVqmq9iBwO\n3CUixTirWIWXLwxF7bdMRMbhdAbXAD/SWIsAp/nnkKjmpURMx+m/uDQ6nqr+zx1++oyIeHESzrFR\nZflFRJYCHlX9KYl4xsRk6ykYkyQR6Q6crapXuY/vAr5V1XtExIdz9f6Mqr4Q47UnAENVNeULN4nI\nD8Bf7T4FkwxrPjImSar6B7CGiHwlIp/jrIn7oPv0r4A/VkKIcoDbEZ0SIlIiIp/hjLAyJilWUzDG\nGBNhNQVjjDERlhSMMcZEWFIwxhgTYUnBGGNMhCUFY4wxEZYUjDHGRPw/PCiTIUUUagEAAAAASUVO\nRK5CYII=\n", + "image/png": "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\nYwHYAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1790,6 +1980,7 @@ "energy_groups = nufission.energy_groups\n", "x = energy_groups.group_edges\n", "y = nufission.get_xs(nuclides=['U235'], order_groups='decreasing', xs_type='micro')\n", + "y = np.squeeze(y)\n", "\n", "# Fix low energy bound to the value defined by the ACE library\n", "x[0] = fission.xs.x[0]\n", @@ -1855,9 +2046,9 @@ "outputs": [ { "data": { - "image/png": "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\nfn35+EIOpHUAAAAASUVORK5CYII=\n", + "image/png": "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\nZlZT/x9xJfW8VvykSgAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1897,21 +2088,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 2", "language": "python", - "name": "python3" + "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 3 + "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" + "pygments_lexer": "ipython2", + "version": "2.7.12" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb index a1eaa7ad82..9d2b89c512 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -32,7 +32,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/miniconda3/envs/default/lib/python3.5/site-packages/matplotlib/__init__.py:1350: UserWarning: This call to matplotlib.use() has no effect\n", + "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/__init__.py:1357: UserWarning: This call to matplotlib.use() has no effect\n", "because the backend has already been chosen;\n", "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", "or matplotlib.backends is imported for the first time.\n", @@ -458,7 +458,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -727,9 +727,10 @@ "\n", " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", - " Version: 0.7.1\n", - " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", - " Date/Time: 2016-07-23 16:42:32\n", + " Version: 0.8.0\n", + " Git SHA1: be7e6e035d22944a8c80ca32f99935b6822854c9\n", + " Date/Time: 2016-08-10 18:33:28\n", + " MPI Processes: 1\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -739,12 +740,12 @@ " Reading geometry XML file...\n", " Reading cross sections XML file...\n", " Reading materials XML file...\n", - " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", - " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", - " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", - " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", - " Reading B10.71c from /home/romano/openmc/data/nndc_hdf5/B10_71c.h5\n", - " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", + " Reading U235.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/U235_71c.h5\n", + " Reading U238.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/U238_71c.h5\n", + " Reading O16.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/O16_71c.h5\n", + " Reading H1.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/H1_71c.h5\n", + " Reading B10.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/B10_71c.h5\n", + " Reading Zr90.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/Zr90_71c.h5\n", " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", @@ -780,32 +781,32 @@ " 22/1 1.04175 1.02516 +/- 0.00588\n", " 23/1 1.01909 1.02469 +/- 0.00543\n", " 24/1 1.07119 1.02801 +/- 0.00603\n", - " 25/1 0.97445 1.02444 +/- 0.00665\n", - " 26/1 1.04737 1.02588 +/- 0.00638\n", - " 27/1 1.04656 1.02709 +/- 0.00612\n", - " 28/1 1.03464 1.02751 +/- 0.00578\n", - " 29/1 1.02528 1.02739 +/- 0.00547\n", - " 30/1 1.02799 1.02742 +/- 0.00519\n", - " 31/1 1.05846 1.02890 +/- 0.00516\n", - " 32/1 1.03811 1.02932 +/- 0.00493\n", - " 33/1 1.00894 1.02843 +/- 0.00480\n", - " 34/1 1.02049 1.02810 +/- 0.00460\n", - " 35/1 1.00690 1.02726 +/- 0.00450\n", - " 36/1 1.03129 1.02741 +/- 0.00432\n", - " 37/1 0.98864 1.02597 +/- 0.00440\n", - " 38/1 1.00017 1.02505 +/- 0.00434\n", - " 39/1 1.03635 1.02544 +/- 0.00421\n", - " 40/1 1.07090 1.02696 +/- 0.00434\n", - " 41/1 1.03141 1.02710 +/- 0.00420\n", - " 42/1 1.02624 1.02707 +/- 0.00406\n", - " 43/1 1.02668 1.02706 +/- 0.00394\n", - " 44/1 1.05940 1.02801 +/- 0.00394\n", - " 45/1 1.01149 1.02754 +/- 0.00385\n", - " 46/1 1.06958 1.02871 +/- 0.00392\n", - " 47/1 1.02674 1.02866 +/- 0.00381\n", - " 48/1 1.02542 1.02857 +/- 0.00371\n", - " 49/1 1.03516 1.02874 +/- 0.00362\n", - " 50/1 1.06818 1.02973 +/- 0.00366\n", + " 25/1 0.97414 1.02442 +/- 0.00666\n", + " 26/1 1.04709 1.02584 +/- 0.00639\n", + " 27/1 1.05872 1.02777 +/- 0.00631\n", + " 28/1 1.03930 1.02841 +/- 0.00598\n", + " 29/1 1.01488 1.02770 +/- 0.00570\n", + " 30/1 1.04513 1.02857 +/- 0.00548\n", + " 31/1 0.99538 1.02699 +/- 0.00545\n", + " 32/1 1.00106 1.02581 +/- 0.00532\n", + " 33/1 0.99389 1.02442 +/- 0.00527\n", + " 34/1 0.99938 1.02338 +/- 0.00516\n", + " 35/1 1.02161 1.02331 +/- 0.00495\n", + " 36/1 1.04084 1.02398 +/- 0.00480\n", + " 37/1 0.98801 1.02265 +/- 0.00481\n", + " 38/1 1.01348 1.02232 +/- 0.00464\n", + " 39/1 1.06693 1.02386 +/- 0.00474\n", + " 40/1 1.07729 1.02564 +/- 0.00491\n", + " 41/1 1.03191 1.02585 +/- 0.00475\n", + " 42/1 1.05209 1.02667 +/- 0.00468\n", + " 43/1 1.02997 1.02677 +/- 0.00453\n", + " 44/1 1.07288 1.02812 +/- 0.00460\n", + " 45/1 1.01268 1.02768 +/- 0.00449\n", + " 46/1 1.03759 1.02796 +/- 0.00437\n", + " 47/1 1.02620 1.02791 +/- 0.00425\n", + " 48/1 1.02509 1.02783 +/- 0.00414\n", + " 49/1 1.01043 1.02739 +/- 0.00406\n", + " 50/1 1.01457 1.02707 +/- 0.00397\n", " Creating state point statepoint.50.h5...\n", "\n", " ===========================================================================\n", @@ -815,27 +816,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.3400E-01 seconds\n", - " Reading cross sections = 2.7900E-01 seconds\n", - " Total time in simulation = 6.1121E+01 seconds\n", - " Time in transport only = 6.1101E+01 seconds\n", - " Time in inactive batches = 5.0660E+00 seconds\n", - " Time in active batches = 5.6055E+01 seconds\n", - " Time synchronizing fission bank = 5.0000E-03 seconds\n", - " Sampling source sites = 3.0000E-03 seconds\n", - " SEND/RECV source sites = 2.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", + " Total time for initialization = 4.3000E-01 seconds\n", + " Reading cross sections = 2.2800E-01 seconds\n", + " Total time in simulation = 6.1235E+01 seconds\n", + " Time in transport only = 6.1207E+01 seconds\n", + " Time in inactive batches = 5.0280E+00 seconds\n", + " Time in active batches = 5.6207E+01 seconds\n", + " Time synchronizing fission bank = 7.0000E-03 seconds\n", + " Sampling source sites = 4.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 2.0000E-03 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 6.1576E+01 seconds\n", - " Calculation Rate (inactive) = 4934.86 neutrons/second\n", - " Calculation Rate (active) = 1783.96 neutrons/second\n", + " Total time elapsed = 6.1689E+01 seconds\n", + " Calculation Rate (inactive) = 4972.16 neutrons/second\n", + " Calculation Rate (active) = 1779.14 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.02763 +/- 0.00343\n", - " k-effective (Track-length) = 1.02973 +/- 0.00366\n", - " k-effective (Absorption) = 1.02732 +/- 0.00319\n", - " Combined k-effective = 1.02826 +/- 0.00259\n", + " k-effective (Collision) = 1.02489 +/- 0.00308\n", + " k-effective (Track-length) = 1.02707 +/- 0.00397\n", + " k-effective (Absorption) = 1.02637 +/- 0.00325\n", + " Combined k-effective = 1.02581 +/- 0.00264\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -955,8 +956,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/openmc/openmc/tallies.py:1941: RuntimeWarning: invalid value encountered in true_divide\n", - " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n" + "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1944: RuntimeWarning: invalid value encountered in true_divide\n" ] }, { @@ -980,16 +980,16 @@ " 10000\n", " 1\n", " U235\n", - " 8.055246e-03\n", - " 2.857567e-05\n", + " 8.046809e-03\n", + " 2.697198e-05\n", " \n", " \n", " 4\n", " 10000\n", " 1\n", " U238\n", - " 7.339215e-03\n", - " 4.349466e-05\n", + " 7.366624e-03\n", + " 4.255197e-05\n", " \n", " \n", " 5\n", @@ -1004,16 +1004,16 @@ " 10000\n", " 2\n", " U235\n", - " 3.615565e-01\n", - " 2.050486e-03\n", + " 3.614917e-01\n", + " 2.135233e-03\n", " \n", " \n", " 1\n", " 10000\n", " 2\n", " U238\n", - " 6.742638e-07\n", - " 3.795256e-09\n", + " 6.741607e-07\n", + " 3.924924e-09\n", " \n", " \n", " 2\n", @@ -1029,11 +1029,11 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "3 10000 1 U235 8.055246e-03 2.857567e-05\n", - "4 10000 1 U238 7.339215e-03 4.349466e-05\n", + "3 10000 1 U235 8.046809e-03 2.697198e-05\n", + "4 10000 1 U238 7.366624e-03 4.255197e-05\n", "5 10000 1 O16 0.000000e+00 0.000000e+00\n", - "0 10000 2 U235 3.615565e-01 2.050486e-03\n", - "1 10000 2 U238 6.742638e-07 3.795256e-09\n", + "0 10000 2 U235 3.614917e-01 2.135233e-03\n", + "1 10000 2 U238 6.741607e-07 3.924924e-09\n", "2 10000 2 O16 0.000000e+00 0.000000e+00" ] }, @@ -1071,18 +1071,18 @@ "\tDomain ID =\t10000\n", "\tNuclide =\tU235\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t8.06e-03 +/- 3.55e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t3.62e-01 +/- 5.67e-01%\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t8.05e-03 +/- 3.35e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t3.61e-01 +/- 5.91e-01%\n", "\n", "\tNuclide =\tU238\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t7.34e-03 +/- 5.93e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t6.74e-07 +/- 5.63e-01%\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.37e-03 +/- 5.78e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t6.74e-07 +/- 5.82e-01%\n", "\n", "\tNuclide =\tO16\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t0.00e+00 +/- nan%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t0.00e+00 +/- nan%\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t0.00e+00 +/- 0.00e+00%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t0.00e+00 +/- 0.00e+00%\n", "\n", "\n", "\n" @@ -1193,16 +1193,16 @@ " 10000\n", " 1\n", " U235\n", - " 0.074860\n", - " 0.000303\n", + " 0.074734\n", + " 0.000325\n", " \n", " \n", " 1\n", " 10000\n", " 1\n", " U238\n", - " 0.005952\n", - " 0.000035\n", + " 0.005977\n", + " 0.000034\n", " \n", " \n", " 2\n", @@ -1218,8 +1218,8 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "0 10000 1 U235 0.074860 0.000303\n", - "1 10000 1 U238 0.005952 0.000035\n", + "0 10000 1 U235 0.074734 0.000325\n", + "1 10000 1 U238 0.005977 0.000034\n", "2 10000 1 O16 0.000000 0.000000" ] }, @@ -1300,127 +1300,133 @@ "name": "stdout", "output_type": "stream", "text": [ - "[ NORMAL ] Ray tracing for track segmentation...\n", - "[ NORMAL ] Dumping tracks to file...\n", + "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.854370\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.801922\tres = 1.521E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.761745\tres = 6.349E-02\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.732366\tres = 5.029E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.711073\tres = 3.869E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.696554\tres = 2.912E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.687670\tres = 2.044E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.683465\tres = 1.277E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.683124\tres = 6.142E-03\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.685943\tres = 7.897E-04\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.691322\tres = 4.180E-03\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.698746\tres = 7.873E-03\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.707777\tres = 1.076E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.718039\tres = 1.295E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.729218\tres = 1.452E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.741045\tres = 1.559E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.753296\tres = 1.624E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.765784\tres = 1.655E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.778355\tres = 1.659E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.790879\tres = 1.643E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.803253\tres = 1.610E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.815394\tres = 1.566E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.827235\tres = 1.513E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.838724\tres = 1.453E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.849823\tres = 1.390E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.860502\tres = 1.324E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.870744\tres = 1.258E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.880535\tres = 1.191E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.889869\tres = 1.125E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.898747\tres = 1.061E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.907172\tres = 9.985E-03\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.915150\tres = 9.382E-03\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.922692\tres = 8.802E-03\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.929810\tres = 8.248E-03\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.936517\tres = 7.720E-03\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.942827\tres = 7.219E-03\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.948756\tres = 6.744E-03\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.954321\tres = 6.295E-03\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.959539\tres = 5.871E-03\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.964424\tres = 5.472E-03\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.968995\tres = 5.096E-03\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.973268\tres = 4.744E-03\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.977258\tres = 4.413E-03\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.980981\tres = 4.104E-03\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.984453\tres = 3.814E-03\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.987689\tres = 3.543E-03\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.990701\tres = 3.289E-03\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.993505\tres = 3.053E-03\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.996112\tres = 2.832E-03\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.998536\tres = 2.627E-03\n", - "[ NORMAL ] Iteration 50:\tk_eff = 1.000787\tres = 2.435E-03\n", - "[ NORMAL ] Iteration 51:\tk_eff = 1.002878\tres = 2.257E-03\n", - "[ NORMAL ] Iteration 52:\tk_eff = 1.004818\tres = 2.091E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 1.006618\tres = 1.937E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 1.008287\tres = 1.793E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.009834\tres = 1.660E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.011268\tres = 1.536E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.012595\tres = 1.421E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.013824\tres = 1.314E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.014962\tres = 1.215E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.016015\tres = 1.123E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.016988\tres = 1.038E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.017889\tres = 9.595E-04\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.018721\tres = 8.864E-04\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.019490\tres = 8.187E-04\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.020201\tres = 7.560E-04\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.020857\tres = 6.980E-04\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.021464\tres = 6.443E-04\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.022024\tres = 5.947E-04\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.022540\tres = 5.488E-04\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.023017\tres = 5.063E-04\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.023457\tres = 4.670E-04\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.023863\tres = 4.308E-04\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.024238\tres = 3.972E-04\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.024583\tres = 3.663E-04\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.024902\tres = 3.376E-04\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.025195\tres = 3.112E-04\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.025466\tres = 2.868E-04\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.025715\tres = 2.643E-04\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.025945\tres = 2.435E-04\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.026157\tres = 2.244E-04\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.026352\tres = 2.067E-04\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.026531\tres = 1.904E-04\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.026697\tres = 1.753E-04\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.026849\tres = 1.614E-04\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.026989\tres = 1.487E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.027118\tres = 1.368E-04\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.027237\tres = 1.260E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.027346\tres = 1.159E-04\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.027447\tres = 1.067E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.027540\tres = 9.821E-05\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.027625\tres = 9.040E-05\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.027703\tres = 8.316E-05\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.027775\tres = 7.652E-05\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.027842\tres = 7.039E-05\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.027903\tres = 6.480E-05\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.027959\tres = 5.959E-05\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.028011\tres = 5.479E-05\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.028058\tres = 5.043E-05\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.028102\tres = 4.633E-05\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.028142\tres = 4.265E-05\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.028180\tres = 3.921E-05\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.028214\tres = 3.605E-05\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.028245\tres = 3.315E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.028273\tres = 3.047E-05\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.028300\tres = 2.800E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.028324\tres = 2.575E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.028346\tres = 2.368E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.028367\tres = 2.176E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.028386\tres = 2.003E-05\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.028403\tres = 1.837E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.028419\tres = 1.690E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.028434\tres = 1.553E-05\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.028447\tres = 1.426E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.028459\tres = 1.309E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.028471\tres = 1.202E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.028481\tres = 1.107E-05\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.028491\tres = 1.015E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.823582\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.780361\tres = 1.940E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.739500\tres = 6.545E-02\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.710868\tres = 5.284E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.689663\tres = 3.926E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.675035\tres = 3.007E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.665831\tres = 2.137E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.661179\tres = 1.377E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.660309\tres = 7.167E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.662566\tres = 1.972E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.667383\tres = 3.708E-03\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.674274\tres = 7.412E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.682821\tres = 1.043E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.692664\tres = 1.276E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.703499\tres = 1.449E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.715063\tres = 1.571E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.727136\tres = 1.650E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.739531\tres = 1.694E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.752091\tres = 1.710E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.764686\tres = 1.703E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.777208\tres = 1.679E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.789567\tres = 1.642E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.801692\tres = 1.595E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.813525\tres = 1.540E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.825022\tres = 1.480E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.836147\tres = 1.417E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.846876\tres = 1.352E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.857190\tres = 1.287E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.867079\tres = 1.221E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.876536\tres = 1.157E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.885559\tres = 1.094E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.894153\tres = 1.032E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.902320\tres = 9.731E-03\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.910071\tres = 9.161E-03\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.917414\tres = 8.614E-03\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.924362\tres = 8.092E-03\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.930926\tres = 7.595E-03\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.937121\tres = 7.122E-03\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.942961\tres = 6.674E-03\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.948460\tres = 6.250E-03\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.953633\tres = 5.849E-03\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.958495\tres = 5.471E-03\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.963061\tres = 5.114E-03\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.967346\tres = 4.779E-03\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.971364\tres = 4.463E-03\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.975128\tres = 4.166E-03\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.978653\tres = 3.888E-03\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.981952\tres = 3.627E-03\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.985037\tres = 3.382E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.987921\tres = 3.152E-03\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.990615\tres = 2.937E-03\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.993131\tres = 2.736E-03\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.995479\tres = 2.548E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.997670\tres = 2.373E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.999713\tres = 2.208E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.001618\tres = 2.055E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.003393\tres = 1.912E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.005046\tres = 1.778E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.006586\tres = 1.654E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.008019\tres = 1.537E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.009352\tres = 1.429E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.010593\tres = 1.328E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.011747\tres = 1.234E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.012820\tres = 1.146E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.013818\tres = 1.065E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.014745\tres = 9.887E-04\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.015606\tres = 9.179E-04\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.016406\tres = 8.522E-04\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.017149\tres = 7.909E-04\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.017839\tres = 7.340E-04\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.018480\tres = 6.811E-04\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.019074\tres = 6.319E-04\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.019626\tres = 5.862E-04\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.020138\tres = 5.437E-04\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.020613\tres = 5.042E-04\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.021054\tres = 4.676E-04\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.021462\tres = 4.335E-04\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.021841\tres = 4.019E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.022193\tres = 3.725E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.022518\tres = 3.453E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.022820\tres = 3.200E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.023100\tres = 2.965E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.023359\tres = 2.748E-04\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.023600\tres = 2.546E-04\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.023822\tres = 2.358E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.024028\tres = 2.185E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.024219\tres = 2.023E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.024396\tres = 1.874E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.024560\tres = 1.735E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.024712\tres = 1.607E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.024852\tres = 1.488E-04\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.024983\tres = 1.378E-04\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.025103\tres = 1.275E-04\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.025215\tres = 1.181E-04\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.025318\tres = 1.093E-04\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.025413\tres = 1.012E-04\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.025502\tres = 9.364E-05\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.025584\tres = 8.666E-05\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.025659\tres = 8.020E-05\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.025729\tres = 7.422E-05\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.025794\tres = 6.868E-05\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.025854\tres = 6.355E-05\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.025910\tres = 5.880E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.025961\tres = 5.440E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.026009\tres = 5.033E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.026053\tres = 4.656E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.026093\tres = 4.307E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.026131\tres = 3.984E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.026166\tres = 3.685E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.026198\tres = 3.409E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.026228\tres = 3.153E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.026255\tres = 2.916E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.026281\tres = 2.697E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.026304\tres = 2.494E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.026326\tres = 2.307E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.026346\tres = 2.133E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.026365\tres = 1.973E-05\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.026382\tres = 1.824E-05\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.026398\tres = 1.687E-05\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.026413\tres = 1.560E-05\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.026426\tres = 1.442E-05\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.026439\tres = 1.333E-05\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.026451\tres = 1.233E-05\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.026461\tres = 1.140E-05\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.026471\tres = 1.054E-05\n" ] } ], @@ -1452,9 +1458,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "openmc keff = 1.028263\n", - "openmoc keff = 1.028491\n", - "bias [pcm]: 22.8\n" + "openmc keff = 1.025806\n", + "openmoc keff = 1.026471\n", + "bias [pcm]: 66.5\n" ] } ], @@ -1562,7 +1568,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 43, @@ -1571,9 +1577,9 @@ }, { "data": { - "image/png": "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\nSUVORK5CYII=\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1613,7 +1619,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", - "version": "2.7.11" + "version": "2.7.12" } }, "nbformat": 4, diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 6d2665566b..42cfdd06c5 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -328,16 +328,19 @@ class Library(object): @delayed_groups.setter def delayed_groups(self, delayed_groups): - cv.check_type('delayed groups', delayed_groups, list, int) - cv.check_greater_than('num delayed groups', len(delayed_groups), 0) + if delayed_groups != None: - # Check that the groups are within [1, MAX_DELAYED_GROUPS] - for group in delayed_groups: - cv.check_greater_than('delayed group', group, 0) - cv.check_less_than('delayed group', group, - openmc.mgxs.MAX_DELAYED_GROUPS, equality=True) + cv.check_type('delayed groups', delayed_groups, list, int) + cv.check_greater_than('num delayed groups', len(delayed_groups), 0) - self._delayed_groups = delayed_groups + # Check that the groups are within [1, MAX_DELAYED_GROUPS] + for group in delayed_groups: + cv.check_greater_than('delayed group', group, 0) + cv.check_less_than('delayed group', group, + openmc.mgxs.MAX_DELAYED_GROUPS, + equality=True) + + self._delayed_groups = delayed_groups @correction.setter def correction(self, correction): @@ -508,7 +511,7 @@ class Library(object): ---------- domain : Material or Cell or Universe or Integral The material, cell, or universe object of interest (or its ID) - mgxs_type : {'total', 'transport', 'nu-transport', 'absorption', 'capture', 'fission', 'nu-fission', 'kappa-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'multiplicity matrix', 'nu-fission matrix', chi', 'chi-prompt', 'inverse-velocity', 'prompt-nu-fission'} + mgxs_type : {'total', 'transport', 'nu-transport', 'absorption', 'capture', 'fission', 'nu-fission', 'kappa-fission', 'scatter', 'nu-scatter', 'scatter matrix', 'nu-scatter matrix', 'multiplicity matrix', 'nu-fission matrix', chi', 'chi-prompt', 'inverse-velocity', 'prompt-nu-fission', 'delayed-nu-fission', 'chi-delayed', 'beta'} The type of multi-group cross section object to return Returns diff --git a/openmc/mgxs/mdgxs.py b/openmc/mgxs/mdgxs.py index c01b0b575b..d853ebed34 100644 --- a/openmc/mgxs/mdgxs.py +++ b/openmc/mgxs/mdgxs.py @@ -14,6 +14,9 @@ import openmc from openmc.mgxs import MGXS import openmc.checkvalue as cv +if sys.version_info[0] >= 3: + basestring = str + # Supported cross section types MDGXS_TYPES = ['delayed-nu-fission', 'chi-delayed', @@ -102,12 +105,12 @@ class MDGXS(MGXS): are not specified by the user, all nuclides in the spatial domain are included. This attribute is 'sum' if by_nuclide is false. sparse : bool - Whether or not the MDGXS' tallies use SciPy's LIL sparse matrix format + Whether or not the MGXS' tallies use SciPy's LIL sparse matrix format for compressed data storage loaded_sp : bool Whether or not a statepoint file has been loaded with tally data derived : bool - Whether or not the MDGXS is merged from one or more other MDGXS + Whether or not the MGXS is merged from one or more other MGXS hdf5_key : str The key used to index multi-group cross sections in an HDF5 data store @@ -165,23 +168,25 @@ class MDGXS(MGXS): @property def num_delayed_groups(self): if self.delayed_groups == None: - return 0 + return 1 else: return len(self.delayed_groups) @delayed_groups.setter def delayed_groups(self, delayed_groups): - cv.check_type('delayed groups', delayed_groups, list, int) - cv.check_greater_than('num delayed groups', len(delayed_groups), 0) + if delayed_groups != None: - # Check that the groups are within [1, MAX_DELAYED_GROUPS] - for group in delayed_groups: - cv.check_greater_than('delayed group', group, 0) - cv.check_less_than('delayed group', group, MAX_DELAYED_GROUPS, - equality=True) + cv.check_type('delayed groups', delayed_groups, list, int) + cv.check_greater_than('num delayed groups', len(delayed_groups), 0) - self._delayed_groups = delayed_groups + # Check that the groups are within [1, MAX_DELAYED_GROUPS] + for group in delayed_groups: + cv.check_greater_than('delayed group', group, 0) + cv.check_less_than('delayed group', group, MAX_DELAYED_GROUPS, + equality=True) + + self._delayed_groups = delayed_groups @property def filters(self): @@ -251,12 +256,13 @@ class MDGXS(MGXS): def get_xs(self, groups='all', subdomains='all', nuclides='all', xs_type='macro', order_groups='increasing', - value='mean', delayed_groups='all', **kwargs): + value='mean', delayed_groups='all', squeeze=True, **kwargs): """Returns an array of multi-delayed-group cross sections. - This method constructs a 2D NumPy array for the requested - multi-delayed-group cross section data data for one or more energy - groups, delayed groups, and subdomains. + This method constructs a 4D NumPy array for the requested + multi-delayed-group cross section data for one or more + subdomains (1st dimension), delayed groups (2nd demension), + energy groups (3rd dimension), and nuclides (4th dimension). Parameters ---------- @@ -280,6 +286,10 @@ class MDGXS(MGXS): A string for the type of value to return. Defaults to 'mean'. delayed_groups : list of int or 'all' Delayed groups of interest. Defaults to 'all'. + squeeze : bool + A boolean representing whether to eliminate the extra dimensions + of the multi-dimensional array this is to be retured. Defaults to + True. Returns ------- @@ -359,25 +369,36 @@ class MDGXS(MGXS): if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] + # Eliminate the trivial score dimension + xs = np.squeeze(xs, axis=len(xs.shape) - 1) + xs = np.nan_to_num(xs) + + if groups == 'all': + num_groups = self.num_groups + else: + num_groups = len(groups) + + if delayed_groups == 'all': + num_delayed_groups = self.num_delayed_groups + else: + num_delayed_groups = len(delayed_groups) + + # Reshape tally data array with separate axes for domain, energy groups, + # delayed groups, and nuclides + num_subdomains = int(xs.shape[0] / (num_groups * num_delayed_groups)) + new_shape = (num_subdomains, num_delayed_groups, num_groups) + new_shape += xs.shape[1:] + xs = np.reshape(xs, new_shape) + # Reverse data if user requested increasing energy groups since # tally data is stored in order of increasing energies if order_groups == 'increasing': - if groups == 'all': - num_groups = self.num_groups - else: - num_groups = len(groups) + xs = xs[:, :, ::-1, :] - # Reshape tally data array with separate axes for domain and energy - num_subdomains = int(xs.shape[0] / num_groups) - new_shape = (num_subdomains, num_groups) + xs.shape[1:] - xs = np.reshape(xs, new_shape) + if squeeze: + xs = np.squeeze(xs) + xs = np.atleast_1d(xs) - # Reverse energies to align with increasing energy groups - xs = xs[:, ::-1, :] - - # Eliminate trivial dimensions - xs = np.squeeze(xs) - xs = np.atleast_1d(xs) return xs def get_slice(self, nuclides=[], groups=[], delayed_groups=[]): @@ -467,11 +488,11 @@ class MDGXS(MGXS): return slice_xs def merge(self, other): - """Merge another MDGXS with this one + """Merge another MGXS with this one - MDGXS are only mergeable if their energy groups and nuclides are either + MGXS are only mergeable if their energy groups and nuclides are either identical or mutually exclusive. If results have been loaded from a - statepoint, then MDGXS are only mergeable along one and only one of + statepoint, then MGXS are only mergeable along one and only one of energy groups or nuclides. Parameters @@ -718,9 +739,112 @@ class MDGXS(MGXS): """ + if not isinstance(groups, basestring): + cv.check_iterable_type('groups', groups, Integral) + if nuclides != 'all' and nuclides != 'sum': + cv.check_iterable_type('nuclides', nuclides, basestring) if not isinstance(delayed_groups, basestring): cv.check_type('delayed groups', delayed_groups, list, int) + cv.check_value('xs_type', xs_type, ['macro', 'micro']) + + # Get a Pandas DataFrame from the derived xs tally + if self.by_nuclide and nuclides == 'sum': + + # Use tally summation to sum across all nuclides + query_nuclides = self.get_all_nuclides() + xs_tally = self.xs_tally.summation(nuclides=query_nuclides) + df = xs_tally.get_pandas_dataframe( + distribcell_paths=distribcell_paths) + + # Remove nuclide column since it is homogeneous and redundant + if self.domain_type == 'mesh': + df.drop('nuclide', axis=1, level=0, inplace=True) + else: + df.drop('nuclide', axis=1, inplace=True) + + # If the user requested a specific set of nuclides + elif self.by_nuclide and nuclides != 'all': + xs_tally = self.xs_tally.get_slice(nuclides=nuclides) + df = xs_tally.get_pandas_dataframe( + distribcell_paths=distribcell_paths) + + # If the user requested all nuclides, keep nuclide column in dataframe + else: + df = self.xs_tally.get_pandas_dataframe( + distribcell_paths=distribcell_paths) + + # Remove the score column since it is homogeneous and redundant + if self.domain_type == 'mesh': + df = df.drop('score', axis=1, level=0) + else: + df = df.drop('score', axis=1) + + # Override energy groups bounds with indices + all_groups = np.arange(self.num_groups, 0, -1, dtype=np.int) + all_groups = np.repeat(all_groups, self.num_nuclides) + if 'energy low [MeV]' in df and 'energyout low [MeV]' in df: + df.rename(columns={'energy low [MeV]': 'group in'}, + inplace=True) + in_groups = np.tile(all_groups, int(self.num_subdomains * + self.num_delayed_groups)) + in_groups = np.repeat(in_groups, int(df.shape[0] / in_groups.size)) + df['group in'] = in_groups + del df['energy high [MeV]'] + + df.rename(columns={'energyout low [MeV]': 'group out'}, + inplace=True) + out_groups = np.tile(all_groups, int(df.shape[0] / all_groups.size)) + df['group out'] = out_groups + del df['energyout high [MeV]'] + columns = ['group in', 'group out'] + + elif 'energyout low [MeV]' in df: + df.rename(columns={'energyout low [MeV]': 'group out'}, + inplace=True) + in_groups = np.tile(all_groups, int(df.shape[0] / all_groups.size)) + df['group out'] = in_groups + del df['energyout high [MeV]'] + columns = ['group out'] + + elif 'energy low [MeV]' in df: + df.rename(columns={'energy low [MeV]': 'group in'}, inplace=True) + in_groups = np.tile(all_groups, int(df.shape[0] / all_groups.size)) + df['group in'] = in_groups + del df['energy high [MeV]'] + columns = ['group in'] + + # Select out those groups the user requested + if not isinstance(groups, basestring): + if 'group in' in df: + df = df[df['group in'].isin(groups)] + if 'group out' in df: + df = df[df['group out'].isin(groups)] + + # If user requested micro cross sections, divide out the atom densities + if xs_type == 'micro': + if self.by_nuclide: + densities = self.get_nuclide_densities(nuclides) + else: + densities = self.get_nuclide_densities('sum') + densities = np.repeat(densities, len(self.rxn_rate_tally.scores)) + tile_factor = df.shape[0] / len(densities) + df['mean'] /= np.tile(densities, tile_factor) + df['std. dev.'] /= np.tile(densities, tile_factor) + + # Sort the dataframe by domain type id (e.g., distribcell id) and + # energy groups such that data is from fast to thermal + if self.domain_type == 'mesh': + mesh_str = 'mesh {0}'.format(self.domain.id) + df.sort_values(by=[(mesh_str, 'x'), (mesh_str, 'y'), \ + (mesh_str, 'z')] + columns, inplace=True) + else: + df.sort_values(by=[self.domain_type] + columns, inplace=True) + + return df + + + df = super(MDGXS, self).get_pandas_dataframe(groups, nuclides, xs_type, distribcell_paths) @@ -744,7 +868,7 @@ class ChiDelayed(MDGXS): domain are generated automatically via the :attr:`ChiDelayed.tallies` property, which can then be appended to a :class:`openmc.Tallies` instance. - For post-processing, the :meth:`MDGXS.load_from_statepoint` will pull in the + For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the necessary data to compute multi-group cross sections from a :class:`openmc.StatePoint` instance. The derived multi-group cross section can then be obtained from the :attr:`ChiDelayed.xs_tally` property. @@ -961,7 +1085,7 @@ class ChiDelayed(MDGXS): # Slice nu-fission-out tally along energyout filter delayed_nu_fission_out = slice_xs.tallies['delayed-nu-fission-out'] - tally_slice = delayed_nu_fission_out.get_slice\ + tally_slice = delayed_nu_fission_out.get_slice \ (filters=filters, filter_bins=filter_bins) slice_xs._tallies['delayed-nu-fission-out'] = tally_slice @@ -980,8 +1104,8 @@ class ChiDelayed(MDGXS): Parameters ---------- - other : openmc.mdgxs.MDGXS - MDGXS to merge with this one + other : openmc.mdgxs.MGXS + MGXS to merge with this one Returns ------- @@ -1030,12 +1154,13 @@ class ChiDelayed(MDGXS): def get_xs(self, groups='all', subdomains='all', nuclides='all', xs_type='macro', order_groups='increasing', - value='mean', delayed_groups='all', **kwargs): + value='mean', delayed_groups='all', squeeze=True, **kwargs): """Returns an array of the delayed fission spectrum. - This method constructs a 2D NumPy array for the requested multi-group - and multi-delayed group cross section data data for one or more energy - groups and subdomains. + This method constructs a 4D NumPy array for the requested + multi-delayed-group cross section data for one or more + subdomains (1st dimension), delayed groups (2nd demension), + energy groups (3rd dimension), and nuclides (4th dimension). Parameters ---------- @@ -1052,13 +1177,17 @@ class ChiDelayed(MDGXS): cross section summed over all nuclides. Defaults to 'all'. xs_type: {'macro', 'micro'} This parameter is not relevant for chi but is included here to - mirror the parent MDGXS.get_xs(...) class method + mirror the parent MGXS.get_xs(...) class method order_groups: {'increasing', 'decreasing'} Return the cross section indexed according to increasing or decreasing energy groups (decreasing or increasing energies). Defaults to 'increasing'. value : {'mean', 'std_dev', 'rel_err'} A string for the type of value to return. Defaults to 'mean'. + squeeze : bool + A boolean representing whether to eliminate the extra dimensions + of the multi-dimensional array this is to be retured. Defaults to + True. Returns ------- @@ -1162,27 +1291,37 @@ class ChiDelayed(MDGXS): xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) + # Eliminate the trivial score dimension + xs = np.squeeze(xs, axis=len(xs.shape) - 1) + xs = np.nan_to_num(xs) + + # Reshape tally data array with separate axes for domain and energy + if groups == 'all': + num_groups = self.num_groups + else: + num_groups = len(groups) + + if delayed_groups == 'all': + num_delayed_groups = self.num_delayed_groups + else: + num_delayed_groups = len(delayed_groups) + + # Reshape tally data array with separate axes for domain, energy groups, + # delayed groups, and nuclides + num_subdomains = int(xs.shape[0] / (num_groups * num_delayed_groups)) + new_shape = (num_subdomains, num_delayed_groups, num_groups) + new_shape += xs.shape[1:] + xs = np.reshape(xs, new_shape) + # Reverse data if user requested increasing energy groups since # tally data is stored in order of increasing energies if order_groups == 'increasing': + xs = xs[:, :, ::-1, :] - # Reshape tally data array with separate axes for domain and energy - if groups == 'all': - num_groups = self.num_groups - else: - num_groups = len(groups) - num_subdomains = int(xs.shape[0] / num_groups) - new_shape = (num_subdomains, num_groups) + xs.shape[1:] - xs = np.reshape(xs, new_shape) - - # Reverse energies to align with increasing energy groups - xs = xs[:, ::-1, :] - - # Eliminate trivial dimensions + if squeeze: xs = np.squeeze(xs) xs = np.atleast_1d(xs) - xs = np.nan_to_num(xs) return xs @@ -1199,7 +1338,7 @@ class DelayedNuFissionXS(MDGXS): :attr:`DelayedNuFissionXS.tallies` property, which can then be appended to a :class:`openmc.Tallies` instance. - For post-processing, the :meth:`MDGXS.load_from_statepoint` will pull in the + For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the necessary data to compute multi-group cross sections from a :class:`openmc.StatePoint` instance. The derived multi-group cross section can then be obtained from the :attr:`DelayedNuFissionXS.xs_tally` property. @@ -1315,7 +1454,7 @@ class Beta(MDGXS): generated automatically via the :attr:`Beta.tallies` property, which can then be appended to a :class:`openmc.Tallies` instance. - For post-processing, the :meth:`MDGXS.load_from_statepoint` will pull in the + For post-processing, the :meth:`MGXS.load_from_statepoint` will pull in the necessary data to compute multi-group cross sections from a :class:`openmc.StatePoint` instance. The derived multi-group cross section can then be obtained from the :attr:`Beta.xs_tally` property. diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 4fc4edb38e..5a4c5866b7 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -724,11 +724,13 @@ class MGXS(object): def get_xs(self, groups='all', subdomains='all', nuclides='all', xs_type='macro', order_groups='increasing', - value='mean', **kwargs): + value='mean', squeeze=True, **kwargs): r"""Returns an array of multi-group cross sections. - This method constructs a 2D NumPy array for the requested multi-group - cross section data data for one or more energy groups and subdomains. + This method constructs a 3D NumPy array for the requested + multi-group cross section data for one or more subdomains + (1st dimension), energy groups (2nd dimension), and nuclides + (3rd dimension). Parameters ---------- @@ -750,6 +752,10 @@ class MGXS(object): Defaults to 'increasing'. value : {'mean', 'std_dev', 'rel_err'} A string for the type of value to return. Defaults to 'mean'. + squeeze : bool + A boolean representing whether to eliminate the extra dimensions + of the multi-dimensional array this is to be retured. Defaults to + True. Returns ------- @@ -819,25 +825,29 @@ class MGXS(object): if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] + # Eliminate the trivial score dimension + xs = np.squeeze(xs, axis=len(xs.shape) - 1) + xs = np.nan_to_num(xs) + + if groups == 'all': + num_groups = self.num_groups + else: + num_groups = len(groups) + + # Reshape tally data array with separate axes for domain and energy + num_subdomains = int(xs.shape[0] / num_groups) + new_shape = (num_subdomains, num_groups) + xs.shape[1:] + xs = np.reshape(xs, new_shape) + # Reverse data if user requested increasing energy groups since # tally data is stored in order of increasing energies if order_groups == 'increasing': - if groups == 'all': - num_groups = self.num_groups - else: - num_groups = len(groups) - - # Reshape tally data array with separate axes for domain and energy - num_subdomains = int(xs.shape[0] / num_groups) - new_shape = (num_subdomains, num_groups) + xs.shape[1:] - xs = np.reshape(xs, new_shape) - - # Reverse energies to align with increasing energy groups xs = xs[:, ::-1, :] - # Eliminate trivial dimensions - xs = np.squeeze(xs) - xs = np.atleast_1d(xs) + if squeeze: + xs = np.squeeze(xs) + xs = np.atleast_1d(xs) + return xs def get_condensed_xs(self, coarse_groups): @@ -1350,8 +1360,6 @@ class MGXS(object): std_dev = self.get_xs(subdomains=[subdomain], nuclides=[nuclide], xs_type=xs_type, value='std_dev', row_column=row_column) - average = average.squeeze() - std_dev = std_dev.squeeze() # Add MGXS results data to the HDF5 group nuclide_group.require_dataset('average', dtype=np.float64, @@ -1517,14 +1525,14 @@ class MGXS(object): if 'energy low [MeV]' in df and 'energyout low [MeV]' in df: df.rename(columns={'energy low [MeV]': 'group in'}, inplace=True) - in_groups = np.tile(all_groups, df.shape[0] / all_groups.size) - in_groups = np.repeat(in_groups, df.shape[0] / in_groups.size) + in_groups = np.tile(all_groups, int(self.num_subdomains)) + in_groups = np.repeat(in_groups, int(df.shape[0] / in_groups.size)) df['group in'] = in_groups del df['energy high [MeV]'] df.rename(columns={'energyout low [MeV]': 'group out'}, inplace=True) - out_groups = np.tile(all_groups, df.shape[0] / all_groups.size) + out_groups = np.tile(all_groups, int(df.shape[0] / all_groups.size)) df['group out'] = out_groups del df['energyout high [MeV]'] columns = ['group in', 'group out'] @@ -1532,14 +1540,14 @@ class MGXS(object): elif 'energyout low [MeV]' in df: df.rename(columns={'energyout low [MeV]': 'group out'}, inplace=True) - in_groups = np.tile(all_groups, df.shape[0] / all_groups.size) + in_groups = np.tile(all_groups, int(df.shape[0] / all_groups.size)) df['group out'] = in_groups del df['energyout high [MeV]'] columns = ['group out'] elif 'energy low [MeV]' in df: df.rename(columns={'energy low [MeV]': 'group in'}, inplace=True) - in_groups = np.tile(all_groups, df.shape[0] / all_groups.size) + in_groups = np.tile(all_groups, int(df.shape[0] / all_groups.size)) df['group in'] = in_groups del df['energy high [MeV]'] columns = ['group in'] @@ -1570,6 +1578,7 @@ class MGXS(object): (mesh_str, 'z')] + columns, inplace=True) else: df.sort_values(by=[self.domain_type] + columns, inplace=True) + return df def get_units(self, xs_type='macro'): @@ -1700,11 +1709,13 @@ class MatrixMGXS(MGXS): def get_xs(self, in_groups='all', out_groups='all', subdomains='all', nuclides='all', xs_type='macro', order_groups='increasing', - row_column='inout', value='mean', **kwargs): + row_column='inout', value='mean', squeeze=True, **kwargs): """Returns an array of multi-group cross sections. - This method constructs a 2D NumPy array for the requested multi-group - matrix data for one or more energy groups and subdomains. + This method constructs a 4D NumPy array for the requested + multi-group cross section data for one or more subdomains + (1st dimension), energy groups in (2nd dimension), energy groups out + (3rd dimension), and nuclides (4th dimension). Parameters ---------- @@ -1733,6 +1744,10 @@ class MatrixMGXS(MGXS): Defaults to 'inout'. value : {'mean', 'std_dev', 'rel_err'} A string for the type of value to return. Defaults to 'mean'. + squeeze : bool + A boolean representing whether to eliminate the extra dimensions + of the multi-dimensional array this is to be retured. Defaults to + True. Returns ------- @@ -1804,8 +1819,6 @@ class MatrixMGXS(MGXS): filter_bins=filter_bins, nuclides=query_nuclides, value=value) - xs = np.nan_to_num(xs) - # Divide by atom number densities for microscopic cross sections if xs_type == 'micro': if self.by_nuclide: @@ -1815,33 +1828,36 @@ class MatrixMGXS(MGXS): if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] + # Eliminate the trivial score dimension + xs = np.squeeze(xs, axis=len(xs.shape) - 1) + xs = np.nan_to_num(xs) + + if in_groups == 'all': + num_in_groups = self.num_groups + else: + num_in_groups = len(in_groups) + + if out_groups == 'all': + num_out_groups = self.num_groups + else: + num_out_groups = len(out_groups) + + # Reshape tally data array with separate axes for domain and energy + num_subdomains = int(xs.shape[0] / (num_in_groups * num_out_groups)) + new_shape = (num_subdomains, num_in_groups, num_out_groups) + new_shape += xs.shape[1:] + xs = np.reshape(xs, new_shape) + + # Transpose the matrix if requested by user + if row_column == 'outin': + xs = np.swapaxes(xs, 1, 2) + # Reverse data if user requested increasing energy groups since # tally data is stored in order of increasing energies if order_groups == 'increasing': - if in_groups == 'all': - num_in_groups = self.num_groups - else: - num_in_groups = len(in_groups) - if out_groups == 'all': - num_out_groups = self.num_groups - else: - num_out_groups = len(out_groups) - - # Reshape tally data array with separate axes for domain and energy - num_subdomains = int(xs.shape[0] / - (num_in_groups * num_out_groups)) - new_shape = (num_subdomains, num_in_groups, num_out_groups) - new_shape += xs.shape[1:] - xs = np.reshape(xs, new_shape) - - # Transpose the matrix if requested by user - if row_column == 'outin': - xs = np.swapaxes(xs, 1, 2) - - # Reverse energies to align with increasing energy groups xs = xs[:, ::-1, ::-1, :] - # Eliminate trivial dimensions + if squeeze: xs = np.squeeze(xs) xs = np.atleast_2d(xs) @@ -3518,11 +3534,13 @@ class ScatterMatrixXS(MatrixMGXS): def get_xs(self, in_groups='all', out_groups='all', subdomains='all', nuclides='all', moment='all', xs_type='macro', order_groups='increasing', - row_column='inout', value='mean'): + row_column='inout', value='mean', squeeze=True): r"""Returns an array of multi-group cross sections. - This method constructs a 2D NumPy array for the requested scattering - matrix data data for one or more energy groups and subdomains. + This method constructs a 5D NumPy array for the requested + multi-group cross section data for one or more subdomains + (1st dimension), energy groups in (2nd dimension), energy groups out + (3rd dimension), nuclides (4th dimension), and moments (5th dimension). NOTE: The scattering moments are not multiplied by the :math:`(2l+1)/2` prefactor in the expansion of the scattering source into Legendre @@ -3558,6 +3576,10 @@ class ScatterMatrixXS(MatrixMGXS): Defaults to 'inout'. value : {'mean', 'std_dev', 'rel_err'} A string for the type of value to return. Defaults to 'mean'. + squeeze : bool + A boolean representing whether to eliminate the extra dimensions + of the multi-dimensional array this is to be retured. Defaults to + False. Returns ------- @@ -3636,8 +3658,6 @@ class ScatterMatrixXS(MatrixMGXS): filter_bins=filter_bins, nuclides=query_nuclides, value=value) - xs = np.nan_to_num(xs) - # Divide by atom number densities for microscopic cross sections if xs_type == 'micro': if self.by_nuclide: @@ -3647,32 +3667,35 @@ class ScatterMatrixXS(MatrixMGXS): if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] + # Convert and nans to zero + xs = np.nan_to_num(xs) + + if in_groups == 'all': + num_in_groups = self.num_groups + else: + num_in_groups = len(in_groups) + + if out_groups == 'all': + num_out_groups = self.num_groups + else: + num_out_groups = len(out_groups) + + # Reshape tally data array with separate axes for domain and energy + num_subdomains = int(xs.shape[0] / (num_in_groups * num_out_groups)) + new_shape = (num_subdomains, num_in_groups, num_out_groups) + new_shape += xs.shape[1:] + xs = np.reshape(xs, new_shape) + + # Transpose the scattering matrix if requested by user + if row_column == 'outin': + xs = np.swapaxes(xs, 1, 2) + # Reverse data if user requested increasing energy groups since # tally data is stored in order of increasing energies if order_groups == 'increasing': - if in_groups == 'all': - num_in_groups = self.num_groups - else: - num_in_groups = len(in_groups) - if out_groups == 'all': - num_out_groups = self.num_groups - else: - num_out_groups = len(out_groups) - - # Reshape tally data array with separate axes for domain and energy - num_subdomains = int(xs.shape[0] / (num_in_groups * num_out_groups)) - new_shape = (num_subdomains, num_in_groups, num_out_groups) - new_shape += xs.shape[1:] - xs = np.reshape(xs, new_shape) - - # Transpose the scattering matrix if requested by user - if row_column == 'outin': - xs = np.swapaxes(xs, 1, 2) - - # Reverse energies to align with increasing energy groups xs = xs[:, ::-1, ::-1, :] - # Eliminate trivial dimensions + if squeeze: xs = np.squeeze(xs) xs = np.atleast_2d(xs) @@ -3729,7 +3752,7 @@ class ScatterMatrixXS(MatrixMGXS): if self.legendre_order > 0: # Insert a column corresponding to the Legendre moments moments = ['P{}'.format(i) for i in range(self.legendre_order+1)] - moments = np.tile(moments, df.shape[0] / len(moments)) + moments = np.tile(moments, int(df.shape[0] / len(moments))) df['moment'] = moments # Place the moment column before the mean column @@ -4513,11 +4536,13 @@ class Chi(MGXS): def get_xs(self, groups='all', subdomains='all', nuclides='all', xs_type='macro', order_groups='increasing', - value='mean', **kwargs): + value='mean', squeeze=True, **kwargs): """Returns an array of the fission spectrum. - This method constructs a 2D NumPy array for the requested multi-group - cross section data data for one or more energy groups and subdomains. + This method constructs a 3D NumPy array for the requested + multi-group cross section data for one or more subdomains + (1st dimension), energy groups (2nd dimension), and nuclides + (3rd dimension). Parameters ---------- @@ -4539,6 +4564,10 @@ class Chi(MGXS): Defaults to 'increasing'. value : {'mean', 'std_dev', 'rel_err'} A string for the type of value to return. Defaults to 'mean'. + squeeze : bool + A boolean representing whether to eliminate the extra dimensions + of the multi-dimensional array this is to be retured. Defaults to + True. Returns ------- @@ -4630,27 +4659,29 @@ class Chi(MGXS): xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, value=value) + # Eliminate the trivial score dimension + xs = np.squeeze(xs, axis=len(xs.shape) - 1) + xs = np.nan_to_num(xs) + + # Reshape tally data array with separate axes for domain and energy + if groups == 'all': + num_groups = self.num_groups + else: + num_groups = len(groups) + + num_subdomains = int(xs.shape[0] / num_groups) + new_shape = (num_subdomains, num_groups) + xs.shape[1:] + xs = np.reshape(xs, new_shape) + # Reverse data if user requested increasing energy groups since # tally data is stored in order of increasing energies if order_groups == 'increasing': - - # Reshape tally data array with separate axes for domain and energy - if groups == 'all': - num_groups = self.num_groups - else: - num_groups = len(groups) - num_subdomains = int(xs.shape[0] / num_groups) - new_shape = (num_subdomains, num_groups) + xs.shape[1:] - xs = np.reshape(xs, new_shape) - - # Reverse energies to align with increasing energy groups xs = xs[:, ::-1, :] - # Eliminate trivial dimensions + if squeeze: xs = np.squeeze(xs) xs = np.atleast_1d(xs) - xs = np.nan_to_num(xs) return xs def get_pandas_dataframe(self, groups='all', nuclides='all', diff --git a/tests/test_mgxs_library_condense/test_mgxs_library_condense.py b/tests/test_mgxs_library_condense/test_mgxs_library_condense.py index a3e849d6c5..551229e6b5 100644 --- a/tests/test_mgxs_library_condense/test_mgxs_library_condense.py +++ b/tests/test_mgxs_library_condense/test_mgxs_library_condense.py @@ -9,6 +9,7 @@ from testing_harness import PyAPITestHarness from input_set import PinCellInputSet import openmc import openmc.mgxs +import numpy as np class MGXSTestHarness(PyAPITestHarness): @@ -24,7 +25,7 @@ class MGXSTestHarness(PyAPITestHarness): 20.]) # Initialize a six-delayed-group structure - delayed_groups = range(1,7) + delayed_groups = list(range(1,7)) # Initialize MGXS Library for a few cross section types self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) diff --git a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py index 3103e07382..fe1ca9c0f8 100644 --- a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py +++ b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py @@ -9,6 +9,7 @@ from testing_harness import PyAPITestHarness from input_set import AssemblyInputSet import openmc import openmc.mgxs +import numpy as np class MGXSTestHarness(PyAPITestHarness): @@ -23,7 +24,7 @@ class MGXSTestHarness(PyAPITestHarness): energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 20.]) # Initialize a six-delayed-group structure - delayed_groups = range(1,7) + delayed_groups = list(range(1,7)) # Initialize MGXS Library for a few cross section types # for one material-filled cell in the geometry diff --git a/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py b/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py index 4359b27937..b4d7e5dbbe 100644 --- a/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py +++ b/tests/test_mgxs_library_hdf5/test_mgxs_library_hdf5.py @@ -25,7 +25,7 @@ class MGXSTestHarness(PyAPITestHarness): 20.]) # Initialize a six-delayed-group structure - delayed_groups = range(1,7) + delayed_groups = list(range(1,7)) # Initialize MGXS Library for a few cross section types self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) diff --git a/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py b/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py index bcf2400108..750274b1fd 100644 --- a/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py +++ b/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py @@ -8,6 +8,7 @@ sys.path.insert(0, os.pardir) from testing_harness import PyAPITestHarness import openmc import openmc.mgxs +import numpy as np class MGXSTestHarness(PyAPITestHarness): @@ -19,7 +20,7 @@ class MGXSTestHarness(PyAPITestHarness): energy_groups = openmc.mgxs.EnergyGroups(group_edges=[0, 20.]) # Initialize a six-delayed-group structure - delayed_groups = range(1,7) + delayed_groups = list(range(1,7)) # Initialize MGXS Library for a few cross section types # for one material-filled cell in the geometry diff --git a/tests/test_mgxs_library_no_nuclides/results_true.dat b/tests/test_mgxs_library_no_nuclides/results_true.dat index 54650970f1..3563f141b1 100644 --- a/tests/test_mgxs_library_no_nuclides/results_true.dat +++ b/tests/test_mgxs_library_no_nuclides/results_true.dat @@ -29,49 +29,49 @@ 1 10000 1 total 0.385188 0.026946 0 10000 2 total 0.412389 0.015425 material group in group out nuclide moment mean std. dev. -1 10000 1 1 total P0 0.016482 0.004502 -3 10000 1 1 total P1 -0.010499 0.010438 -5 10000 1 1 total P2 -0.000768 0.000768 -7 10000 1 1 total P3 -0.000171 0.000172 9 10000 1 1 total P0 -0.000207 0.000149 11 10000 1 1 total P1 0.000234 0.000128 13 10000 1 1 total P2 0.051870 0.006983 15 10000 1 1 total P3 0.009478 0.002234 +8 10000 1 2 total P0 0.000989 0.000482 +10 10000 1 2 total P1 -0.000103 0.000184 +12 10000 1 2 total P2 0.384199 0.027001 +14 10000 1 2 total P3 0.020069 0.002846 +1 10000 2 1 total P0 0.016482 0.004502 +3 10000 2 1 total P1 -0.010499 0.010438 +5 10000 2 1 total P2 -0.000768 0.000768 +7 10000 2 1 total P3 -0.000171 0.000172 0 10000 2 2 total P0 0.411465 0.015245 2 10000 2 2 total P1 0.006371 0.010551 4 10000 2 2 total P2 0.000925 0.000925 6 10000 2 2 total P3 0.000494 0.000494 -8 10000 2 2 total P0 0.000989 0.000482 -10 10000 2 2 total P1 -0.000103 0.000184 -12 10000 2 2 total P2 0.384199 0.027001 -14 10000 2 2 total P3 0.020069 0.002846 material group in group out nuclide moment mean std. dev. -1 10000 1 1 total P0 0.016482 0.004502 -3 10000 1 1 total P1 -0.010499 0.010438 -5 10000 1 1 total P2 -0.000768 0.000768 -7 10000 1 1 total P3 -0.000171 0.000172 9 10000 1 1 total P0 -0.000207 0.000149 11 10000 1 1 total P1 0.000234 0.000128 13 10000 1 1 total P2 0.051870 0.006983 15 10000 1 1 total P3 0.009478 0.002234 +8 10000 1 2 total P0 0.000989 0.000482 +10 10000 1 2 total P1 -0.000103 0.000184 +12 10000 1 2 total P2 0.384199 0.027001 +14 10000 1 2 total P3 0.020069 0.002846 +1 10000 2 1 total P0 0.016482 0.004502 +3 10000 2 1 total P1 -0.010499 0.010438 +5 10000 2 1 total P2 -0.000768 0.000768 +7 10000 2 1 total P3 -0.000171 0.000172 0 10000 2 2 total P0 0.411465 0.015245 2 10000 2 2 total P1 0.006371 0.010551 4 10000 2 2 total P2 0.000925 0.000925 6 10000 2 2 total P3 0.000494 0.000494 -8 10000 2 2 total P0 0.000989 0.000482 -10 10000 2 2 total P1 -0.000103 0.000184 -12 10000 2 2 total P2 0.384199 0.027001 -14 10000 2 2 total P3 0.020069 0.002846 material group in group out nuclide mean std. dev. -1 10000 1 1 total 1.0 1.414214 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 -2 10000 2 2 total 1.0 0.687184 material group in group out nuclide mean std. dev. -1 10000 1 1 total 0.454366 0.027426 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 -2 10000 2 2 total 0.000000 0.000000 material group out nuclide mean std. dev. 1 10000 1 total 1.0 0.046071 0 10000 2 total 0.0 0.000000 @@ -154,49 +154,49 @@ 1 10001 1 total 0.310121 0.033788 0 10001 2 total 0.296264 0.043792 material group in group out nuclide moment mean std. dev. -1 10001 1 1 total P0 -0.011214 0.016180 -3 10001 1 1 total P1 -0.003270 0.007329 -5 10001 1 1 total P2 0.000000 0.000000 -7 10001 1 1 total P3 0.000000 0.000000 9 10001 1 1 total P0 0.000000 0.000000 11 10001 1 1 total P1 0.000000 0.000000 13 10001 1 1 total P2 0.038230 0.008484 15 10001 1 1 total P3 0.007964 0.003732 +8 10001 1 2 total P0 0.000000 0.000000 +10 10001 1 2 total P1 0.000000 0.000000 +12 10001 1 2 total P2 0.310121 0.033788 +14 10001 1 2 total P3 0.020745 0.004696 +1 10001 2 1 total P0 -0.011214 0.016180 +3 10001 2 1 total P1 -0.003270 0.007329 +5 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 2 10001 2 2 total P1 0.008837 0.011504 4 10001 2 2 total P2 0.000000 0.000000 6 10001 2 2 total P3 0.000000 0.000000 -8 10001 2 2 total P0 0.000000 0.000000 -10 10001 2 2 total P1 0.000000 0.000000 -12 10001 2 2 total P2 0.310121 0.033788 -14 10001 2 2 total P3 0.020745 0.004696 material group in group out nuclide moment mean std. dev. -1 10001 1 1 total P0 -0.011214 0.016180 -3 10001 1 1 total P1 -0.003270 0.007329 -5 10001 1 1 total P2 0.000000 0.000000 -7 10001 1 1 total P3 0.000000 0.000000 9 10001 1 1 total P0 0.000000 0.000000 11 10001 1 1 total P1 0.000000 0.000000 13 10001 1 1 total P2 0.038230 0.008484 15 10001 1 1 total P3 0.007964 0.003732 +8 10001 1 2 total P0 0.000000 0.000000 +10 10001 1 2 total P1 0.000000 0.000000 +12 10001 1 2 total P2 0.310121 0.033788 +14 10001 1 2 total P3 0.020745 0.004696 +1 10001 2 1 total P0 -0.011214 0.016180 +3 10001 2 1 total P1 -0.003270 0.007329 +5 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 2 10001 2 2 total P1 0.008837 0.011504 4 10001 2 2 total P2 0.000000 0.000000 6 10001 2 2 total P3 0.000000 0.000000 -8 10001 2 2 total P0 0.000000 0.000000 -10 10001 2 2 total P1 0.000000 0.000000 -12 10001 2 2 total P2 0.310121 0.033788 -14 10001 2 2 total P3 0.020745 0.004696 material group in group out nuclide mean std. dev. -1 10001 1 1 total 0.0 0.000000 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 -2 10001 2 2 total 0.0 0.000000 material group in group out nuclide mean std. dev. -1 10001 1 1 total 0.0 0.0 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 -2 10001 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 @@ -279,49 +279,49 @@ 1 10002 1 total 0.671269 0.026186 0 10002 2 total 2.035388 0.258060 material group in group out nuclide moment mean std. dev. -1 10002 1 1 total P0 0.509941 0.051236 -3 10002 1 1 total P1 0.024988 0.008312 -5 10002 1 1 total P2 0.000400 0.000401 -7 10002 1 1 total P3 0.000214 0.000215 9 10002 1 1 total P0 0.008758 0.000926 11 10002 1 1 total P1 -0.003785 0.000817 13 10002 1 1 total P2 0.381167 0.016243 15 10002 1 1 total P3 0.009148 0.003889 +8 10002 1 2 total P0 0.031368 0.001728 +10 10002 1 2 total P1 -0.002568 0.001014 +12 10002 1 2 total P2 0.639901 0.024709 +14 10002 1 2 total P3 0.152392 0.008156 +1 10002 2 1 total P0 0.509941 0.051236 +3 10002 2 1 total P1 0.024988 0.008312 +5 10002 2 1 total P2 0.000400 0.000401 +7 10002 2 1 total P3 0.000214 0.000215 0 10002 2 2 total P0 2.034945 0.257800 2 10002 2 2 total P1 0.111175 0.013020 4 10002 2 2 total P2 0.000443 0.000445 6 10002 2 2 total P3 0.000320 0.000321 -8 10002 2 2 total P0 0.031368 0.001728 -10 10002 2 2 total P1 -0.002568 0.001014 -12 10002 2 2 total P2 0.639901 0.024709 -14 10002 2 2 total P3 0.152392 0.008156 material group in group out nuclide moment mean std. dev. -1 10002 1 1 total P0 0.509941 0.051236 -3 10002 1 1 total P1 0.024988 0.008312 -5 10002 1 1 total P2 0.000400 0.000401 -7 10002 1 1 total P3 0.000214 0.000215 9 10002 1 1 total P0 0.008758 0.000926 11 10002 1 1 total P1 -0.003785 0.000817 13 10002 1 1 total P2 0.381167 0.016243 15 10002 1 1 total P3 0.009148 0.003889 +8 10002 1 2 total P0 0.031368 0.001728 +10 10002 1 2 total P1 -0.002568 0.001014 +12 10002 1 2 total P2 0.639901 0.024709 +14 10002 1 2 total P3 0.152392 0.008156 +1 10002 2 1 total P0 0.509941 0.051236 +3 10002 2 1 total P1 0.024988 0.008312 +5 10002 2 1 total P2 0.000400 0.000401 +7 10002 2 1 total P3 0.000214 0.000215 0 10002 2 2 total P0 2.034945 0.257800 2 10002 2 2 total P1 0.111175 0.013020 4 10002 2 2 total P2 0.000443 0.000445 6 10002 2 2 total P3 0.000320 0.000321 -8 10002 2 2 total P0 0.031368 0.001728 -10 10002 2 2 total P1 -0.002568 0.001014 -12 10002 2 2 total P2 0.639901 0.024709 -14 10002 2 2 total P3 0.152392 0.008156 material group in group out nuclide mean std. dev. -1 10002 1 1 total 1.0 1.414214 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 -2 10002 2 2 total 1.0 0.067667 material group in group out nuclide mean std. dev. -1 10002 1 1 total 0.0 0.0 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 -2 10002 2 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 diff --git a/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py b/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py index 5ca90875d4..5dee9c4076 100644 --- a/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py +++ b/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py @@ -9,6 +9,7 @@ from testing_harness import PyAPITestHarness from input_set import PinCellInputSet import openmc import openmc.mgxs +import numpy as np class MGXSTestHarness(PyAPITestHarness): @@ -24,7 +25,7 @@ class MGXSTestHarness(PyAPITestHarness): 20.]) # Initialize a six-delayed-group structure - delayed_groups = range(1,7) + delayed_groups = list(range(1,7)) # Initialize MGXS Library for a few cross section types self.mgxs_lib = openmc.mgxs.Library(self._input_set.geometry) diff --git a/tests/test_mgxs_library_nuclides/results_true.dat b/tests/test_mgxs_library_nuclides/results_true.dat index 9671ad7857..d3e3235ccc 100644 --- a/tests/test_mgxs_library_nuclides/results_true.dat +++ b/tests/test_mgxs_library_nuclides/results_true.dat @@ -1 +1 @@ -cb61db73f66b40ed1a59a59e6f4fd52678e9dc41c7bb8ad327989233c3b8d78a71d84c3cb8ad9bc8b1585b319e1f1d66a8667e7cad2ead4cc574f415f8f7a35d \ No newline at end of file +8142ae4e107002a835999e4ace85c17376f262a7059fc224f3756a2de19aba6ca4c4fa14ca2085c87d7729aa8d6d6f78fdae21ac6dfe33ca303449c769076074 \ No newline at end of file diff --git a/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py b/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py index da613d78a1..ac24334e48 100644 --- a/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py +++ b/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py @@ -9,6 +9,7 @@ from testing_harness import PyAPITestHarness from input_set import PinCellInputSet import openmc import openmc.mgxs +import numpy as np class MGXSTestHarness(PyAPITestHarness): From 6669e437e21b2bbbc88a142352245b0fb9a54419 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 11 Aug 2016 08:02:44 -0400 Subject: [PATCH 052/168] removed unnecessary imports and fixed comments --- .../pythonapi/examples/mgxs-part-iii.ipynb | 3 +++ openmc/mgxs/mdgxs.py | 18 ++---------------- openmc/mgxs/mgxs.py | 12 ++++-------- .../test_mgxs_library_condense.py | 1 - .../test_mgxs_library_distribcell.py | 1 - .../test_mgxs_library_mesh.py | 1 - .../test_mgxs_library_no_nuclides.py | 1 - .../test_mgxs_library_nuclides.py | 1 - 8 files changed, 9 insertions(+), 29 deletions(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb index 9d2b89c512..af9f2878fe 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -552,6 +552,9 @@ "* `ChiPrompt` (`\"chi prompt\"`)\n", "* `InverseVelocity` (`\"inverse-velocity\"`)\n", "* `PromptNuFissionXS` (`\"prompt-nu-fission\"`)\n", + "* `DelayedNuFissionXS` (`\"delayed-nu-fission\"`)\n", + "* `ChiDelayed` (`\"chi-delayed\"`)\n", + "* `Beta` (`\"beta\"`)\n", "\n", "In this case, let's create the multi-group cross sections needed to run an OpenMOC simulation to verify the accuracy of our cross sections. In particular, we will define `\"transport\"`, `\"nu-fission\"`, `'\"fission\"`, `\"nu-scatter matrix\"` and `\"chi\"` cross sections for our `Library`.\n", "\n", diff --git a/openmc/mgxs/mdgxs.py b/openmc/mgxs/mdgxs.py index d853ebed34..0a2f898c07 100644 --- a/openmc/mgxs/mdgxs.py +++ b/openmc/mgxs/mdgxs.py @@ -288,8 +288,7 @@ class MDGXS(MGXS): Delayed groups of interest. Defaults to 'all'. squeeze : bool A boolean representing whether to eliminate the extra dimensions - of the multi-dimensional array this is to be retured. Defaults to - True. + of the multi-dimensional array to be returned. Defaults to True. Returns ------- @@ -844,18 +843,6 @@ class MDGXS(MGXS): return df - - df = super(MDGXS, self).get_pandas_dataframe(groups, nuclides, xs_type, - distribcell_paths) - - # Select out those delayed groups the user requested - if not isinstance(delayed_groups, basestring): - if 'delayedgroup' in df: - df = df[df['delayedgroup'].isin(delayed_groups)] - - return df - - class ChiDelayed(MDGXS): r"""The delayed fission spectrum. @@ -1186,8 +1173,7 @@ class ChiDelayed(MDGXS): A string for the type of value to return. Defaults to 'mean'. squeeze : bool A boolean representing whether to eliminate the extra dimensions - of the multi-dimensional array this is to be retured. Defaults to - True. + of the multi-dimensional array to be returned. Defaults to True. Returns ------- diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 5a4c5866b7..0a247aeab2 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -754,8 +754,7 @@ class MGXS(object): A string for the type of value to return. Defaults to 'mean'. squeeze : bool A boolean representing whether to eliminate the extra dimensions - of the multi-dimensional array this is to be retured. Defaults to - True. + of the multi-dimensional array to be returned. Defaults to True. Returns ------- @@ -1746,8 +1745,7 @@ class MatrixMGXS(MGXS): A string for the type of value to return. Defaults to 'mean'. squeeze : bool A boolean representing whether to eliminate the extra dimensions - of the multi-dimensional array this is to be retured. Defaults to - True. + of the multi-dimensional array to be returned. Defaults to True. Returns ------- @@ -3578,8 +3576,7 @@ class ScatterMatrixXS(MatrixMGXS): A string for the type of value to return. Defaults to 'mean'. squeeze : bool A boolean representing whether to eliminate the extra dimensions - of the multi-dimensional array this is to be retured. Defaults to - False. + of the multi-dimensional array to be returned. Defaults to True. Returns ------- @@ -4566,8 +4563,7 @@ class Chi(MGXS): A string for the type of value to return. Defaults to 'mean'. squeeze : bool A boolean representing whether to eliminate the extra dimensions - of the multi-dimensional array this is to be retured. Defaults to - True. + of the multi-dimensional array to be returned. Defaults to True. Returns ------- diff --git a/tests/test_mgxs_library_condense/test_mgxs_library_condense.py b/tests/test_mgxs_library_condense/test_mgxs_library_condense.py index 551229e6b5..d3f2bc08e8 100644 --- a/tests/test_mgxs_library_condense/test_mgxs_library_condense.py +++ b/tests/test_mgxs_library_condense/test_mgxs_library_condense.py @@ -9,7 +9,6 @@ from testing_harness import PyAPITestHarness from input_set import PinCellInputSet import openmc import openmc.mgxs -import numpy as np class MGXSTestHarness(PyAPITestHarness): diff --git a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py index fe1ca9c0f8..940985d916 100644 --- a/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py +++ b/tests/test_mgxs_library_distribcell/test_mgxs_library_distribcell.py @@ -9,7 +9,6 @@ from testing_harness import PyAPITestHarness from input_set import AssemblyInputSet import openmc import openmc.mgxs -import numpy as np class MGXSTestHarness(PyAPITestHarness): diff --git a/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py b/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py index 750274b1fd..1f31bd5660 100644 --- a/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py +++ b/tests/test_mgxs_library_mesh/test_mgxs_library_mesh.py @@ -8,7 +8,6 @@ sys.path.insert(0, os.pardir) from testing_harness import PyAPITestHarness import openmc import openmc.mgxs -import numpy as np class MGXSTestHarness(PyAPITestHarness): diff --git a/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py b/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py index 5dee9c4076..edd41f1c56 100644 --- a/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py +++ b/tests/test_mgxs_library_no_nuclides/test_mgxs_library_no_nuclides.py @@ -9,7 +9,6 @@ from testing_harness import PyAPITestHarness from input_set import PinCellInputSet import openmc import openmc.mgxs -import numpy as np class MGXSTestHarness(PyAPITestHarness): diff --git a/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py b/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py index ac24334e48..da613d78a1 100644 --- a/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py +++ b/tests/test_mgxs_library_nuclides/test_mgxs_library_nuclides.py @@ -9,7 +9,6 @@ from testing_harness import PyAPITestHarness from input_set import PinCellInputSet import openmc import openmc.mgxs -import numpy as np class MGXSTestHarness(PyAPITestHarness): From 7def0d51ce27eb58ec3d4581da4fff9aa1a1c6a7 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 11 Aug 2016 08:27:22 -0400 Subject: [PATCH 053/168] updated mdgxs notebooks and added them to documentation --- .../pythonapi/examples/mdgxs-part-i.ipynb | 60 +++++++++---------- .../pythonapi/examples/mdgxs-part-ii.ipynb | 50 +++++++++------- docs/source/pythonapi/index.rst | 12 +--- 3 files changed, 57 insertions(+), 65 deletions(-) diff --git a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb index b180141834..5d65a0a202 100644 --- a/docs/source/pythonapi/examples/mdgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mdgxs-part-i.ipynb @@ -337,7 +337,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we are ready to generate multi-group cross sections! First, let's define a 100-energy-group structure and 1-energy-group structure using the built-in `EnergyGroups` class. We will also create a 6-delayed-group structure using the built-in `DelayedGroups` class." + "Now we are ready to generate multi-group cross sections! First, let's define a 100-energy-group structure and 1-energy-group structure using the built-in `EnergyGroups` class. We will also create a 6-delayed-group list." ] }, { @@ -356,14 +356,14 @@ "one_group = mgxs.EnergyGroups()\n", "one_group.group_edges = np.array([energy_groups.group_edges[0], energy_groups.group_edges[-1]])\n", "\n", - "delayed_groups = range(1,7)" + "delayed_groups = list(range(1,7))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "We can now use the `EnergyGroups` and `DelayedGroups` objects, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", + "We can now use the `EnergyGroups` object and delayed group list, along with our previously created materials and geometry, to instantiate some `MGXS` objects from the `openmc.mgxs` module. In particular, the following are subclasses of the generic and abstract `MGXS` class:\n", "\n", "* `TotalXS`\n", "* `TransportXS`\n", @@ -404,7 +404,6 @@ "prompt_nu_fission = mgxs.PromptNuFissionXS(domain=cell, groups=energy_groups, by_nuclide=True)\n", "chi_delayed = mgxs.ChiDelayed(domain=cell, energy_groups=energy_groups, by_nuclide=True)\n", "delayed_nu_fission = mgxs.DelayedNuFissionXS(domain=cell, energy_groups=energy_groups, delayed_groups=delayed_groups, by_nuclide=True)\n", - "#delayed_nu_fission = mgxs.DelayedNuFissionXS(domain=cell, energy_groups=energy_groups, by_nuclide=True)\n", "beta = mgxs.Beta(domain=cell, energy_groups=energy_groups, delayed_groups=delayed_groups, by_nuclide=True)\n", "\n", "chi_prompt.nuclides = ['U235', 'Pu239']\n", @@ -581,8 +580,8 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.8.0\n", - " Git SHA1: be7e6e035d22944a8c80ca32f99935b6822854c9\n", - " Date/Time: 2016-08-10 15:46:45\n", + " Git SHA1: c21ceb0aea4abc243b84106576c4f9010f608d0b\n", + " Date/Time: 2016-08-11 08:23:44\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -669,20 +668,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 7.7400E-01 seconds\n", - " Reading cross sections = 4.7500E-01 seconds\n", - " Total time in simulation = 8.9596E+01 seconds\n", - " Time in transport only = 8.9573E+01 seconds\n", - " Time in inactive batches = 4.8730E+00 seconds\n", - " Time in active batches = 8.4723E+01 seconds\n", - " Time synchronizing fission bank = 3.0000E-03 seconds\n", - " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 2.0000E-03 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", - " Total time for finalization = 7.2000E-02 seconds\n", - " Total time elapsed = 9.0468E+01 seconds\n", - " Calculation Rate (inactive) = 10260.6 neutrons/second\n", - " Calculation Rate (active) = 2360.63 neutrons/second\n", + " Total time for initialization = 6.1600E-01 seconds\n", + " Reading cross sections = 3.6500E-01 seconds\n", + " Total time in simulation = 8.3297E+01 seconds\n", + " Time in transport only = 8.3256E+01 seconds\n", + " Time in inactive batches = 4.4890E+00 seconds\n", + " Time in active batches = 7.8808E+01 seconds\n", + " Time synchronizing fission bank = 1.6000E-02 seconds\n", + " Sampling source sites = 1.1000E-02 seconds\n", + " SEND/RECV source sites = 3.0000E-03 seconds\n", + " Time accumulating tallies = 5.0000E-03 seconds\n", + " Total time for finalization = 8.0000E-02 seconds\n", + " Total time elapsed = 8.4019E+01 seconds\n", + " Calculation Rate (inactive) = 11138.3 neutrons/second\n", + " Calculation Rate (active) = 2537.81 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -797,17 +796,12 @@ { "data": { "text/plain": [ - "array([[[[ 5.14239169e-06, 1.16429778e-06]],\n", - "\n", - " [[ 2.65434434e-05, 7.58244504e-06]],\n", - "\n", - " [[ 2.53406770e-05, 5.73814391e-06]],\n", - "\n", - " [[ 5.68158884e-05, 1.04761254e-05]],\n", - "\n", - " [[ 2.32937121e-05, 5.45676114e-06]],\n", - "\n", - " [[ 9.75765501e-06, 1.65156185e-06]]]])" + "array([[ 5.14239169e-06, 1.16429778e-06],\n", + " [ 2.65434434e-05, 7.58244504e-06],\n", + " [ 2.53406770e-05, 5.73814391e-06],\n", + " [ 5.68158884e-05, 1.04761254e-05],\n", + " [ 2.32937121e-05, 5.45676114e-06],\n", + " [ 9.75765501e-06, 1.65156185e-06]])" ] }, "execution_count": 18, @@ -1257,7 +1251,7 @@ "data": { "image/png": "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\nA9YuP+yww7jqqqtYtGgRCxYsWHtHyra09eRV78RSKQWXv6PNbdPivpL6kJVwzo+I5WnxdcCHI2JP\nslLND1sdsVkHGTMGli+vulmntnx5dh22zr333svixYt59dVXueaaa+jVq1eL25911llrb1d8+eWX\nr7fum9/8JtOmTePXv/51xX179uzJyJEjueyyy3j55ZcB+K//+i/22msv9txzTw488ECOOeYYNtts\nM7bZZpvaXGAF9a4KmwsMLnm9AzC/bJs5wI7AfEmbAP0i4i1Jc9PyDfaVtClZUrk5Iu5t2iAi/lmy\n/S+Aic0FNqbk09/Y2EhjY2PuizKrh6InlSad6TraU3VVsxgqlE569+69XolhwYIFa59ff/31XH/9\n9RvsM3r0aB588EGeeOIJ+vTp0+I5V65cySuvvMLuu+9Or169uPrqq7n66qsB+PnPf87ee++dq+pt\n8uTJTJ48uep2G8hzN7C2PoBNgP8GhgA9gReAXcu2ORu4Lj0fRdauArAb8Hzab1g6TtONyW4ia6Qv\nP992Jc8vAG5rJq7qt1Az28iyO7RnjyLqqPg789/z0KFD45FHHtlg+YknnhgnnnhirFy5MqZMmRID\nBw6Mk08+udnjfO9734vhw4fHggULNlj39NNPx5NPPhnvv/9+rFixIi6//PLo27dvvPHGGxERMW/e\nvJg/f35ERDz11FOx4447xsMPP9xi3M29p+S8g+TGuA3wocDfgFnARWnZWOBz6fnmwB1p/dPA0JJ9\nL04JZTowIi07AFidktTzwFTg0FiXcF5K6/4fsG0zMbX4ppp1BCeWtp63875hw4YNq5hYXnnlldhv\nv/2ioaEhPve5z8X555/fYmKRFL169YqGhoa1tyu+7LLLIiLi8ccfjz322CP69u0bAwYMiMbGxnjy\nySfX7vvEE0/E0KFDo3fv3rHLLrvE7bffXjXu9iYW35rYrJMorZko4sezo+L3rYlrz7cmNjOzTqVq\n472k/YGTgE8C2wMrgL8AvwVuiYgldY3QzMwKpcWqMEm/I+uJdS/wZ+AfQC9gZ+Ag4AiyRvT76h9q\n7bgqzDojV4W19byuCqu19laFVUssAyNiUZUAqm7T2TixWGfkxNLW8zqx1Fpd21iaEoak3mneLyTt\nLOlISZuVbmNmZgb5G++fAHpJGgQ8AnwR+FW9gjIzs+LKO/JeEfGupNOAayLiCknP1zMwM7M8hgwZ\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1320,7 +1314,7 @@ "data": { "image/png": "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\nvPBCdR+hwWCIQFYrhnSlsrKS4cOHM2rUKI4++uigtO+//54dO3bw8MMP06VLl8DxIUOGsHz5cjZv\n3szjjz/OHXfcwT//+c+w5T/33HOMHj2a4447jkMPPRTLsoJ6OH//+9+5//77KSgooHHjxtx6663M\nnDkzbFkXX3wxRxxxBACXXnopnTt35sMPPwTg8ssv55lnDob6nj59OpdffnngGtdeey2nnXYaIsKI\nESNo0KAB77//Pu+//z6VlZWMGTOGevXqcfHFF3P66afX4EmmLyW9SwJbTbB8VmAzGEIx5qpJol69\nelRUVAQdq6iooH79+gCcf/75vPPOO4gIjz32GMOG2WEsVJXhw4fToEEDHnroobBlH3rooVxzzTUc\ndthhrFixgpYtW3LssccG0s8880zGjh3L888/z5AhQ6qcv2HDBk477WCI7cLCwsD3zZs3s2fPHrp1\n6xY4duDAgYhDY0899RT3339/YKL7hx9+YMuWLQB0796dvLw8Fi5cSKtWrfj6668ZOHAgYLs0eeqp\npwL3qKpUVFSwYYMd56lt27ZB13HLmA3UxETVTenC0lory5B5ZLVisKzqDQVVN380OnToQFlZGccc\nc9Aj+TfffBPYnzdvXtjzrrzySrZs2cK8efOoV69exPL379/Pnj17WL9+PS1btqySHs1Ms3Xr1kHm\npuXl5YE5hpYtW9KoUSO+/PJLWrduHfUe16xZw9VXX82CBQs488wzATjllFOCrjty5EimT59Oq1at\nuOSSS8jNzQWgffv2jB8/nttuu61KuYsWLWL9+vVVrtWpU6eo8hgMBm+YoaQkMWTIECZOnMj69etR\nVd58803mzJnDJZdcEvGca6+9lhUrVvDKK68EKlA/b775Jp999hkHDhxg586d3HzzzTRv3pzjjjsO\ngFdeeYXt27cD8OGHHzJlyhQuvPDCsNcZPHgwTz75JMuXL2fPnj1B8wciwlVXXcVNN93E5s2bAVi/\nfj2vv/56lXJ++OEHcnJyaNmyJQcOHOCJJ57giy++CMozfPhwXnrpJZ555pnAMBLAVVddxaOPPhoY\ndvrhhx+YN28eP/zwA2eeeSaHHHIIDz30EPv37+fFF18M5DMYDPFjFEOSmDBhAmeddRY9e/akefPm\n3HrrrcyYMYPjjz8+bP41a9bw+OOP89lnn3HEEUcE1iL4x/a3b9/OsGHDaNq0KZ07d2b16tXMnz8/\n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\nalQgII2f77//nh9//DHQGvczZMgQrrnmGo444gjef/99Lr74Ypo1a8aQIUPCXkNEuPPOO6lfvz5n\nn302/fviYcdKAAAgAElEQVT359lnn2X8+PEADBo0iB49egBQv359nn32WZYuXUqjRo0oLCxk3Lhx\nTJ8+PaAY3OE4hwwZwt13301JSQn169fn5z//Obm5uaxatYqTT7Y9rfTv35+f/exnANx1110UFBSw\nfv162rZtC1S/x5XOhBvWSfc4C4nGDFXFh9cIbk2Bbc73ggTJklXUq1ePioqKoGMVFRXUr18fgPPP\nP5933nkHEeGxxx4LOJNTVYYPH06DBg0C8ZlDOfTQQ7nmmms47LDDWLFiBS1btuTYY48NpJ955pmM\nHTuW559/PqJiaNasGQ0bNgzsFxYWsmHDhsC+O6Tnli1bqKioCFJEhYWFQSE9jzjiiCD5AFq2bBl0\nbPfug61kd/mNGzemefPmbNiwIaAYsp10r/dMxZ3aeFEMk4BPRWQBIMDZQPxR61OASN3Qmu5Xhw4d\nOlBWVsYxxxwTOPbNN98E9ufNC28dfOWVV7JlyxbmzZtHvXr1Ipa/f/9+9uzZw/r164MqYD+xXEH4\nex7+SnzNmjWcdNJJQef7admyJfXr16e8vDyggMrLy+OqxN0hQ3fv3s22bduySinEaw2U6b6SYmFc\nZsRHVMUg9r//30AP7HkGAX6vqt9GO88QmyFDhjBx4kROPPFE2rRpw1tvvcWcOXMCQzXhuPbaa1mx\nYgVvvvkmubm5QWlvvvkmLVu25OSTT2b37t3cfvvtNG/enOOOOw6AV155hbPPPpumTZvy4YcfMmXK\nFO65556I11JVSkpKuOuuu3j//feZO3dulTkLPzk5OQwePJjx48czbdo0tm7dyv3338/vfve7qOVH\nY968ebz33nucdtpp/PGPf6RHjx60adMGgFatWrF69WqOPPLIqGWkM/FWxqWu+Ds1qRcTvbLaVNyp\nTVTFoKoqIi+rajfglTqSKSuYMGECJSUl9OzZk+3bt3PUUUcxY8YMjj/++LD516xZw+OPP07Dhg0D\nwzLuYabt27dz4403sn79eg499FBOP/105s+fH1Ags2bN4oorrmDfvn20a9eO2267jeHDh0eUr3Xr\n1jRr1ow2bdrQuHFjHnvsscDEczhz0SlTpnDjjTdy5JFHcuihh3L11VcH5hfCEVpG6P5ll12GZVks\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb index eb2471e222..3dea15c501 100644 --- a/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb +++ b/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb @@ -456,7 +456,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -492,7 +492,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we are ready to generate multi-group cross sections! First, let's define 20-energy-group, 1-energy-group, and 6-delayed-group structures using the built-in `EnergyGroups` and `DelayedGroups` classes." + "Now we are ready to generate multi-group cross sections! First, let's define 20-energy-group, 1-energy-group, and 6-delayed-group structures." ] }, { @@ -511,8 +511,8 @@ "one_group = openmc.mgxs.EnergyGroups()\n", "one_group.group_edges = np.array([energy_groups.group_edges[0], energy_groups.group_edges[-1]])\n", "\n", - "# Instantiate a 6-group DelayedGroups object\n", - "delayed_groups = range(1,7)" + "# Instantiate a 6-delayed-group list\n", + "delayed_groups = list(range(1,7))" ] }, { @@ -607,8 +607,8 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.8.0\n", - " Git SHA1: be7e6e035d22944a8c80ca32f99935b6822854c9\n", - " Date/Time: 2016-08-10 15:48:40\n", + " Git SHA1: c21ceb0aea4abc243b84106576c4f9010f608d0b\n", + " Date/Time: 2016-08-11 08:25:23\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -713,20 +713,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 5.2300E-01 seconds\n", - " Reading cross sections = 3.3300E-01 seconds\n", - " Total time in simulation = 7.3672E+01 seconds\n", - " Time in transport only = 7.3396E+01 seconds\n", - " Time in inactive batches = 5.0250E+00 seconds\n", - " Time in active batches = 6.8647E+01 seconds\n", - " Time synchronizing fission bank = 1.3000E-02 seconds\n", - " Sampling source sites = 0.0000E+00 seconds\n", - " SEND/RECV source sites = 3.0000E-03 seconds\n", - " Time accumulating tallies = 2.0800E-01 seconds\n", + " Total time for initialization = 5.7200E-01 seconds\n", + " Reading cross sections = 3.6100E-01 seconds\n", + " Total time in simulation = 7.5373E+01 seconds\n", + " Time in transport only = 7.5119E+01 seconds\n", + " Time in inactive batches = 5.1640E+00 seconds\n", + " Time in active batches = 7.0209E+01 seconds\n", + " Time synchronizing fission bank = 5.0000E-03 seconds\n", + " Sampling source sites = 3.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 2.1900E-01 seconds\n", " Total time for finalization = 7.0000E-03 seconds\n", - " Total time elapsed = 7.4227E+01 seconds\n", - " Calculation Rate (inactive) = 4975.12 neutrons/second\n", - " Calculation Rate (active) = 1456.73 neutrons/second\n", + " Total time elapsed = 7.5973E+01 seconds\n", + " Calculation Rate (inactive) = 4841.21 neutrons/second\n", + " Calculation Rate (active) = 1424.32 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -832,11 +832,17 @@ "output_type": "stream", "text": [ "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1944: RuntimeWarning: invalid value encountered in true_divide\n", + " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1945: RuntimeWarning: invalid value encountered in true_divide\n", + " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1946: RuntimeWarning: divide by zero encountered in true_divide\n", + " new_tally._mean = data['self']['mean'] / data['other']['mean']\n", "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1946: RuntimeWarning: invalid value encountered in true_divide\n", + " new_tally._mean = data['self']['mean'] / data['other']['mean']\n", "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1938: RuntimeWarning: invalid value encountered in true_divide\n", - "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1939: RuntimeWarning: invalid value encountered in true_divide\n" + " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", + "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1939: RuntimeWarning: invalid value encountered in true_divide\n", + " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n" ] }, { @@ -1249,7 +1255,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 24, @@ -1260,7 +1266,7 @@ "data": { "image/png": "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\nDmZmZmZmZmbW5TzgYGZmZmZmZmZdzgMOZmZmZmZmZtblPOBgZmZmZmZmZl3OAw5mZmZmZmZm1uU8\n4GBmZmZmZmZmXc4DDmZmZmZmZmbW5TzgYGZmZmZmZmZdzgMOZmZmZmZmZtblPOBgZmZmZmZmZl3O\nAw5mZmZmZmZm1uU84GBmZmZmZmZmXc4DDusJSZMlnZlx2ycl7d/dfapqcz9JT/Vkm2ZmPck5bGZW\nPmexWXPxgEMdkuZLelXSy5Kel3S9pJ0y1jpIaouyO9CI9N91ZdZfYmbWGOdwt1gnc7jqZ+FlSTeV\n3Sez3sJZ3C3WySwGkHSKpCck/UvSo5KGlt0na24ecKgvgEMiYnNgB+AfwIUZa8U6HCTNTlJrCW32\nAS4A7u7pts16Medwkyohh1f9LKSP0T3cvllv5ixuUj2dxZI+C3wGOCgiNgU+DPxfT/bB1j0ecOiY\nACLidWAqsOuqFVJfSedKWiDpGUk/krShpI2BG4EdJf0zHQ3uL+ldkv4iaamkpyVdmP4RW6xj0h6S\n7pP0kqQpwEZV6z8s6YG0vTskvb3Ofur2S9JFks6t2n6apC+mz3eQNFXSPyT9XdIXKrbbSNLPJb0g\n6RHgXZ28n1GS5qb9+KGkGZKOTdeNS9/D+ZKeB8Yr8Y101P3ZtK3N0u3XGk2vnDInabyk30iakv77\n/FXS7p185F8GbgbmdrKdmXUt57BzeNUuOllvZt3HWdzLs1iSgG8CX4qIxwAi4smIeLGj92PmAYcM\n0sD8BHBXxeJzgKHA7ul/dwS+GRGvAgcBiyNis/SbmGeBNuC/gH7A3sD+wIkF+7MBcA1wWbq/3wAf\nq1i/JzAJOD5d/xNgWlpXraN+XQaMrdjv1un6K9PQuR54gGS0+wDgFEkfSjefALwxfRwIjOvg/Wyd\nvofTgK2Bx9K+VHo38DdgW+DbJKOrnwL2A94EbAb8sGL7zkbTDwV+DWwF/Aq4VnVGiSUNTts7Ex/w\nmpXCObxqv70yh1NXSFoi6aYMgxNm1g2cxav22xuzeED6eLukhenAyoRO9m0GEeFHjQfwJPAy8AKw\nHFgE7Fax/l/AGyte7w08kT7fD1jYyf5PAa4u2Lf3AYuqlt0JnJk+vxiYWLV+LvC+ive2f5Z+AY8C\nB6TPTwJuSJ+/G5hfVXs6MCl9/nfgQxXrjq/3mQCfBO6sWrYQODZ9Pq5GW7cC/1nx+i3AMpJBtLU+\n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\neuPVxnRsyZiOLXtfXzzliVq7DchEZX2NMUvHOIJsgsgeRwPXR0Q38Likm4E3A0tqfjgzsyGkH+Zw\nMDOzJjmL81MaejdwJ5Ci68FaP07W176qu9y5StTd+sY3ljrXL+I9hWu+1H5yqXM92r1P8XPFfxWu\nmfqtEwvXAHzg5FmFa8ZFuZVVfhUdxWs+/P5S5/rsles1HDZ0/kFnFK55501zCtcAfDr+t3DNR9uu\nISKK/Q+ZSIpbYkyuff9R89c7T/rL/31kk0b+mWy82VEV3b2QdALwhog4QdJE4PCI6Jk08jLgLWRD\nKW4ARkdESPoh8ERETKpxzYcCp0XEARXbTgX2iIjjJW2ermNCRNyb/9vYsJTJYYB2rWq803rnKpff\n83b+h8I1v4x3lzrXf7SfX7hmzROvKH6erc5uvFMN519SPEfGHzez1LneyW8L18yOw0qd6zefKP7n\n5umXTm68U5WvvH9K4RqAg352beGa4+KSwjWv4U0c2HZWqSwuksNQO4utdUrdE5fI4excxbO4TA5D\nuSz+j/avFa5Z88SrCtcAfHar4vdzF15yaqlzlcniMjkM5bJ4sHIYymVxmRyGclncynvijY17OJhZ\nbkNtvFqOMWYTWHc4BcB3gGmSehoYpr6cGxvM7OXFQyrMzFrPWZyfGxzMLLcm1xzu9/FqjcaYRcR6\nM5tHxPP1zmFmNtQ1m8NmZtY8Z3F+bnAws9w8Xs3MrLWcw2Zmrecszs8NDmaWW7Prv5uZWXOcw2Zm\nrecszs/flJnl5vFqZmat5Rw2M2s9Z3F+bnAws9wcrmZmreUcNjNrPWdxfm5wMLPcPF7NzKy1nMNm\nZq3nLM7PDQ5mlpvHq5mZtZZz2Mys9ZzF+fmbMrPc3H3MzKy1nMNmZq3nLM7PDQ5mltsqrzlsZtZS\nzmEzs9ZzFufnBgczy83dx8zMWss5bGbWes7i/PxNmVlu7j5mZtZazmEzs9ZzFufnBgczy83hambW\nWs5hM7PWcxbnNygNDjfv8qZC+4+PGaXOc7WOKlzTdt0fSp1Ls6NwTXeXSp1r2zX3FK5ZOfPvC9d0\nn1S4BID2X36ocM0XDvxyqXN9QV8rXNM2rtz3fsH3Ti9c0/3L4uc5jVuLFwG/VkeJqmtKnauHw3XD\nddsu+xSu+UBcXbhmto4sXAPQNv++wjW6pHgOQ7ks3p6HCtc8celOhWsAuo8rXtP+mwmlzvXl/b9Y\n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\n+8b/K1zTdUrx/wY/ru8XrgH4Il8uXLOHlhERxS+S7P/ltuXVoxVq695hi5rnSctiXsDaZTG/Urn2\nu6RNyVaQeBNp7feIWJJqzyBbxWI1a5fFfDvwG+AesiEWAZyZllRD0jTgloi4uOo6jgbOBLqBn0bE\nGcW+jQ1LmRwG0CXFs6fr7aX+82KbrurOLo1t2fZsqXM9pNcXrml/sPj3d96unylcA/BZ/W/hmrZa\nzW05aFLx/Onq+mSpc02Pmqss9ukT515euKbrtHL/DR5b4ns/my8WrtmUA3m1ZpXK4iI5DPWz2Fqj\n1D1xiRyGcllcJoehXBYPVg5DuSwuk8NQLovL5DCUy+LBymEol8VlchjgLM4qXLOrHm/pPfHGxEMq\nzCy37q7mIqO/136PiJuh/jTBEXFsne0zgBm5L9zMbIhoNofNzKx5zuL8/E2ZWX7uGmZm1lrOYTOz\n1nMW5+YGBzPLz+FqZtZazmEzs9ZzFufmBgczy2/NRj0Ezcys9ZzDZmat5yzOzQ0OZpbfmlZfgJnZ\nRs45bGbWes7i3Lwsppnl92LOh5mZDYy8OewsNjMbOE3msKRDJS2SdL+k02q8P1zSTEmLJd0iaVTF\ne2ek7QslHdLomJKmSXpQ0l2S5knaJ23fQ9LvJb0oaVLF/ptKui3tf4+k3gney3APBzPLb3WrL8DM\nbCPnHDYza70mslhSG3AhcBDwGDBX0jURsahit+OBpyJitKQJwLnAREl7ka3oticwErhR0mhADY55\nSkRcXXUpTwL/DhxeuTEiVkk6ICJekNQO3Czp5xFxe5nP6x4OZpZfV86HmZkNjLw57Cw2Mxs4zeXw\nOGBxRDwcEauBmcD4qn3GA5em57OAA9Pzw4CZEbEmIpYAi9PxGh1zvb/3R8QTEXEnNQaIRMQL6emm\nZJ0Uou6nacANDmaW35qcDzMzGxh5c9hZbGY2cJrL4R2BpRWvl6VtNfeJiC7gGUlb16h9NG1rdMyz\nJc2XdJ6kTRp9PEltku4ClgM3RMTcRjX1uMHBzPLzTa6ZWWv1Q4PDAI0dnipphaQ/VB3r3LTvfElX\nStoybd8vjQ/ueRyeto+UdJOkBWns8EllvyozswHTXA7XWuKiugdBvX2Kbgc4PSL2BPYDtgHWy/31\nCiO6I+JNZMM23pKGcpTiORzMLD83JpiZtVaTOTwQY4cjIoBpwLeBH1adcg7ZzW63pK8AZ6THPcC+\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 4371ad0c45..8d5638b6da 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -27,6 +27,8 @@ Example Jupyter Notebooks examples/mgxs-part-ii examples/mgxs-part-iii examples/mgxs-part-iv + examples/mdgxs-part-i + examples/mdgxs-part-ii examples/nuclear-data ------------------------------------ @@ -257,16 +259,6 @@ Energy Groups openmc.mgxs.EnergyGroups -Delayed Groups -------------- - -.. autosummary:: - :toctree: generated - :nosignatures: - :template: myclass.rst - - openmc.mgxs.DelayedGroups - Multi-group Cross Sections -------------------------- From cec3df43d5000f98bbd6a1a49a909876ca73db13 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 11 Aug 2016 10:26:49 -0500 Subject: [PATCH 054/168] If OpenCG cell has no surfaces, don't assign region --- openmc/opencg_compatible.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 93a257f465..d301cf2b5e 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -689,13 +689,14 @@ def get_openmc_cell(opencg_cell): translation = np.asarray(opencg_cell.translation, dtype=np.float64) openmc_cell.translation = translation - surfaces = [] - operators = [] - for surface, halfspace in opencg_cell.surfaces.values(): - surfaces.append(get_openmc_surface(surface)) - operators.append(operator.neg if halfspace == -1 else operator.pos) - openmc_cell.region = openmc.Intersection( - *[op(s) for op, s in zip(operators, surfaces)]) + if opencg_cell.surfaces: + surfaces = [] + operators = [] + for surface, halfspace in opencg_cell.surfaces.values(): + surfaces.append(get_openmc_surface(surface)) + operators.append(operator.neg if halfspace == -1 else operator.pos) + openmc_cell.region = openmc.Intersection( + *[op(s) for op, s in zip(operators, surfaces)]) # Add the OpenMC Cell to the global collection of all OpenMC Cells OPENMC_CELLS[cell_id] = openmc_cell From 043c56f3384e738be9eba41ac1d8e5aa4dd17766 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 11 Aug 2016 11:31:29 -0400 Subject: [PATCH 055/168] Now track OpenCG lattice names. Now strip hyphens on nuclide names --- openmc/nuclide.py | 10 +++++++++- openmc/opencg_compatible.py | 3 ++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 14609161fe..961ab201f4 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -1,5 +1,6 @@ from numbers import Integral import sys +import warnings from openmc.checkvalue import check_type @@ -98,7 +99,14 @@ class Nuclide(object): @name.setter def name(self, name): check_type('name', name, basestring) - self._name = name + + if '-' in name: + new_name = name.strip('-', '') + msg = 'OpenMC nuclide names follow the GND standard. Nuclide ' \ + '"{}" is being transformed to "{}".'.format(name, new_name) + warnings.warn(msg, DeprecationWarning) + + self._name = name.replace('-', '') @xs.setter def xs(self, xs): diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 93a257f465..a3b35e0555 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -911,6 +911,7 @@ def get_openmc_lattice(opencg_lattice): if lattice_id in OPENMC_LATTICES: return OPENMC_LATTICES[lattice_id] + name = opencg_lattice.name dimension = opencg_lattice.dimension width = opencg_lattice.width offset = opencg_lattice.offset @@ -941,7 +942,7 @@ def get_openmc_lattice(opencg_lattice): ((np.array(width, dtype=np.float64) * np.array(dimension, dtype=np.float64))) / -2.0 - openmc_lattice = openmc.RectLattice(lattice_id=lattice_id) + openmc_lattice = openmc.RectLattice(lattice_id=lattice_id, name=name) openmc_lattice.pitch = width openmc_lattice.universes = universe_array openmc_lattice.lower_left = lower_left From 8bc7afe91fe396bb79670221d6a235bf086dfc64 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 11 Aug 2016 11:48:21 -0400 Subject: [PATCH 056/168] Fixed bug in Nuclide hyphen strip --- openmc/nuclide.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 961ab201f4..6f7bd79b8f 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -101,7 +101,7 @@ class Nuclide(object): check_type('name', name, basestring) if '-' in name: - new_name = name.strip('-', '') + new_name = name.replace('-', '') msg = 'OpenMC nuclide names follow the GND standard. Nuclide ' \ '"{}" is being transformed to "{}".'.format(name, new_name) warnings.warn(msg, DeprecationWarning) From 12c8672804b04391cd63d59ff75b3d45d10fb670 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 11 Aug 2016 12:20:02 -0400 Subject: [PATCH 057/168] Reworded nuclide de-hyphen deprecation warning message --- openmc/nuclide.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 6f7bd79b8f..124c86a359 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -102,8 +102,8 @@ class Nuclide(object): if '-' in name: new_name = name.replace('-', '') - msg = 'OpenMC nuclide names follow the GND standard. Nuclide ' \ - '"{}" is being transformed to "{}".'.format(name, new_name) + msg = 'OpenMC nuclides follow the GND naming convention. Nuclide ' \ + '"{}" is being renamed as "{}".'.format(name, new_name) warnings.warn(msg, DeprecationWarning) self._name = name.replace('-', '') From 0bfa509b3c330e46bf07d12f3cc629d1c66eaaa5 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 11 Aug 2016 11:37:11 -0500 Subject: [PATCH 058/168] Remove extra line per PEP8 --- openmc/statepoint.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openmc/statepoint.py b/openmc/statepoint.py index 58a79fa219..b20ea25908 100644 --- a/openmc/statepoint.py +++ b/openmc/statepoint.py @@ -521,7 +521,6 @@ class StatePoint(object): if self.summary is not None: self.summary.add_volume_information(volume_calc) - def get_tally(self, scores=[], filters=[], nuclides=[], name=None, id=None, estimator=None, exact_filters=False, exact_nuclides=False, exact_scores=False): From fe63a59c5b192ec3962586c6173f2b0d4d3e34dc Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 11 Aug 2016 13:38:56 -0400 Subject: [PATCH 059/168] Moved get_thermal_name(...) from scripts to openmc.data.thermal --- openmc/data/thermal.py | 22 +++++++++++++++++++++- openmc/material.py | 3 ++- scripts/openmc-update-inputs | 21 ++------------------- 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 9de39f518d..275836be77 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -40,6 +40,26 @@ _THERMAL_NAMES = {'al': 'c_Al27', 'al27': 'c_Al27', 'zrzrh': 'c_Zr_in_ZrH', 'zr-h': 'c_Zr_in_ZrH', 'zr/h': 'c_Zr_in_ZrH'} +def get_thermal_name(name): + """Get proper S(a,b) table name, e.g. 'HH2O' -> 'c_H_in_H2O'""" + + if name.lower() in _THERMAL_NAMES: + return _THERMAL_NAMES[name.lower()] + else: + # Make an educated guess?? This actually works well for + # JEFF-3.2 which stupidly uses names like lw00.32t, + # lw01.32t, etc. for different temperatures + matches = get_close_matches( + name.lower(), _THERMAL_NAMES.keys(), cutoff=0.5) + if len(matches) > 0: + return _THERMAL_NAMES[matches[0]] + '.' + xs + else: + # OK, we give up. Just use the ACE name. + return 'c_' + name + + return name + + class CoherentElastic(object): r"""Coherent elastic scattering data from a crystalline material @@ -394,4 +414,4 @@ class ThermalScattering(object): pairs = np.fromiter(map(lambda p: p[0], ace.pairs), int) table.zaids = pairs[np.nonzero(pairs)] - return table + return table \ No newline at end of file diff --git a/openmc/material.py b/openmc/material.py index d7ffd04e94..e1f3da97ab 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -6,6 +6,7 @@ from xml.etree import ElementTree as ET import sys import openmc +import openmc.data import openmc.checkvalue as cv from openmc.clean_xml import sort_xml_elements, clean_xml_indentation @@ -484,7 +485,7 @@ class Material(object): 'non-string cross-section identifier "{1}"'.format(self._id, xs) raise ValueError(msg) - self._sab.append((name, xs)) + self._sab.append((openmc.data.get_thermal_name(name), xs)) def make_isotropic_in_lab(self): for nuclide, percent, percent_type in self._nuclides: diff --git a/scripts/openmc-update-inputs b/scripts/openmc-update-inputs index 5b5bf0978f..613e4a2241 100755 --- a/scripts/openmc-update-inputs +++ b/scripts/openmc-update-inputs @@ -253,23 +253,6 @@ def update_geometry(geometry_root): return was_updated -def get_thermal_name(name): - """Get proper S(a,b) table name, e.g. 'HH2O' -> 'c_H_in_H2O'""" - if name.lower() in _THERMAL_NAMES: - return _THERMAL_NAMES[name.lower()] - else: - # Make an educated guess?? This actually works well for - # JEFF-3.2 which stupidly uses names like lw00.32t, - # lw01.32t, etc. for different temperatures - matches = get_close_matches( - name.lower(), _THERMAL_NAMES.keys(), cutoff=0.5) - if len(matches) > 0: - return _THERMAL_NAMES[matches[0]] + '.' + xs - else: - # OK, we give up. Just use the ACE name. - return 'c_' + name - return name - def update_materials(root): """Update the given XML materials tree. Return True if changes were made.""" was_updated = False @@ -298,13 +281,13 @@ def update_materials(root): for sab in material.findall('sab'): if 'name' in sab.attrib: sabname = sab.attrib['name'] - sab.set('name', get_thermal_name(sabname)) + sab.set('name', openmc.data.get_thermal_name(sabname)) was_updated = True elif sab.find('name') is not None: name_elem = sab.find('name') sabname = name_elem.text - name_elem.text = get_thermal(sabname) + name_elem.text = openmc.data.get_thermal_name(sabname) was_updated = True return was_updated From b791450b751a294cd42904b0638cba6b4fe72b9c Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 11 Aug 2016 13:46:07 -0400 Subject: [PATCH 060/168] Added conditional to pass qualifying S(a,b) names through converter method --- openmc/data/thermal.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 275836be77..8b6e35b61a 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -43,7 +43,9 @@ _THERMAL_NAMES = {'al': 'c_Al27', 'al27': 'c_Al27', def get_thermal_name(name): """Get proper S(a,b) table name, e.g. 'HH2O' -> 'c_H_in_H2O'""" - if name.lower() in _THERMAL_NAMES: + if name in _THERMAL_NAMES.values(): + return name + elif name.lower() in _THERMAL_NAMES: return _THERMAL_NAMES[name.lower()] else: # Make an educated guess?? This actually works well for @@ -52,7 +54,7 @@ def get_thermal_name(name): matches = get_close_matches( name.lower(), _THERMAL_NAMES.keys(), cutoff=0.5) if len(matches) > 0: - return _THERMAL_NAMES[matches[0]] + '.' + xs + return _THERMAL_NAMES[matches[0]] else: # OK, we give up. Just use the ACE name. return 'c_' + name From e8ebc74b4f4c33da3edd381d45127df610863da8 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Thu, 11 Aug 2016 19:11:10 -0400 Subject: [PATCH 061/168] added __eq__ to the nuclear data classes and also enabled openmc.data.ThermalScattering.from_hdf5 to use either a group or filename like Neutron can. --- openmc/data/angle_distribution.py | 10 ++++ openmc/data/correlated.py | 13 ++++ openmc/data/energy_distribution.py | 96 ++++++++++++++++++++++++++++++ openmc/data/function.py | 12 ++++ openmc/data/kalbach_mann.py | 14 +++++ openmc/data/nbody.py | 12 ++++ openmc/data/product.py | 14 +++++ openmc/data/thermal.py | 41 ++++++++++++- openmc/data/uncorrelated.py | 10 ++++ openmc/stats/univariate.py | 70 ++++++++++++++++++++++ 10 files changed, 289 insertions(+), 3 deletions(-) diff --git a/openmc/data/angle_distribution.py b/openmc/data/angle_distribution.py index 316559c50d..afb9a05454 100644 --- a/openmc/data/angle_distribution.py +++ b/openmc/data/angle_distribution.py @@ -32,6 +32,16 @@ class AngleDistribution(object): self.energy = energy self.mu = mu + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (not np.array_equal(self.energy, other.energy) or + not np.array_equal(self.mu, other.mu)): + eqval = False + return eqval + @property def energy(self): return self._energy diff --git a/openmc/data/correlated.py b/openmc/data/correlated.py index 97a96c17c1..2415aaab30 100644 --- a/openmc/data/correlated.py +++ b/openmc/data/correlated.py @@ -49,6 +49,19 @@ class CorrelatedAngleEnergy(AngleEnergy): self.energy_out = energy_out self.mu = mu + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (not np.array_equal(self.breakpoints, other.breakpoints) or + not np.array_equal(self.interpolation, other.interpolation) or + not np.array_equal(self.energy, other.energy) or + not np.array_equal(self.energy_out, other.energy_out) or + not np.array_equal(self.mu, other.mu)): + eqval = False + return eqval + @property def breakpoints(self): return self._breakpoints diff --git a/openmc/data/energy_distribution.py b/openmc/data/energy_distribution.py index 2300081c13..4299fc166a 100644 --- a/openmc/data/energy_distribution.py +++ b/openmc/data/energy_distribution.py @@ -84,6 +84,16 @@ class ArbitraryTabulated(EnergyDistribution): self.energy = energy self.pdf = pdf + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (not np.array_equal(self.energy, other.energy) or + not np.array_equal(self.pdf, other.pdf)): + eqval = False + return eqval + def to_hdf5(self, group): raise NotImplementedError @@ -122,6 +132,17 @@ class GeneralEvaporation(EnergyDistribution): self.g = g self.u = u + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self.theta != other.theta or + self.g != other.g or + self.u != other.u): + eqval = False + return eqval + def to_hdf5(self, group): raise NotImplementedError @@ -159,6 +180,16 @@ class MaxwellEnergy(EnergyDistribution): self.theta = theta self.u = u + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self.theta != other.theta or + self.u != other.u): + eqval = False + return eqval + @property def theta(self): return self._theta @@ -267,6 +298,16 @@ class Evaporation(EnergyDistribution): self.theta = theta self.u = u + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self.theta != other.theta or + self.u != other.u): + eqval = False + return eqval + @property def theta(self): return self._theta @@ -379,6 +420,17 @@ class WattEnergy(EnergyDistribution): self.b = b self.u = u + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self.a != other.a or + self.b != other.b or + self.u != other.u): + eqval = False + return eqval + @property def a(self): return self._a @@ -520,6 +572,17 @@ class MadlandNix(EnergyDistribution): self.efh = efh self.tm = tm + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self.efl != other.efl or + self.efh != other.efh or + self.tm != other.tm): + eqval = False + return eqval + @property def efl(self): return self._efl @@ -618,6 +681,17 @@ class DiscretePhoton(EnergyDistribution): self.energy = energy self.atomic_weight_ratio = atomic_weight_ratio + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self.primary_flag != other.primary_flag or + self.energy != other.energy or + self.atomic_weight_ratio != other.atomic_weight_ratio): + eqval = False + return eqval + @property def primary_flag(self): return self._primary_flag @@ -726,6 +800,16 @@ class LevelInelastic(EnergyDistribution): self.threshold = threshold self.mass_ratio = mass_ratio + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self.threshold != other.threshold or + self.mass_ratio != other.mass_ratio): + eqval = False + return eqval + @property def threshold(self): return self._threshold @@ -832,6 +916,18 @@ class ContinuousTabular(EnergyDistribution): self.energy = energy self.energy_out = energy_out + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (not np.array_equal(self.breakpoints, other.breakpoints) or + not np.array_equal(self.interpolation, other.interpolation) or + not np.array_equal(self.energy, other.energy) or + not np.array_equal(self.energy_out, other.energy_out)): + eqval = False + return eqval + @property def breakpoints(self): return self._breakpoints diff --git a/openmc/data/function.py b/openmc/data/function.py index 56a3d4a45f..e0acf9f29d 100644 --- a/openmc/data/function.py +++ b/openmc/data/function.py @@ -65,6 +65,18 @@ class Tabulated1D(object): self.x = np.asarray(x) self.y = np.asarray(y) + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (not np.array_equal(self.x, other.x) or + not np.array_equal(self.y, other.y) or + not np.array_equal(self.breakpoints, other.breakpoints) or + not np.array_equal(self.interpolation, other.interpolation)): + eqval = False + return eqval + def __call__(self, x): # Check if input is array or scalar if isinstance(x, Iterable): diff --git a/openmc/data/kalbach_mann.py b/openmc/data/kalbach_mann.py index 5aca17ba9f..519796ad46 100644 --- a/openmc/data/kalbach_mann.py +++ b/openmc/data/kalbach_mann.py @@ -59,6 +59,20 @@ class KalbachMann(AngleEnergy): self.precompound = precompound self.slope = slope + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (not np.array_equal(self.breakpoints, other.breakpoints) or + not np.array_equal(self.interpolation, other.interpolation) or + not np.array_equal(self.energy, other.energy) or + not np.array_equal(self.energy_out, other.energy_out) or + not np.array_equal(self.precompound, other.precompound) or + not np.array_equal(self.slope, other.slope)): + eqval = False + return eqval + @property def breakpoints(self): return self._breakpoints diff --git a/openmc/data/nbody.py b/openmc/data/nbody.py index a34380dc93..274db48f98 100644 --- a/openmc/data/nbody.py +++ b/openmc/data/nbody.py @@ -38,6 +38,18 @@ class NBodyPhaseSpace(AngleEnergy): self.atomic_weight_ratio = atomic_weight_ratio self.q_value = q_value + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self.total_mass != other.total_mass or + self.n_particles != other.n_particles or + self.atomic_weight_ratio != other.atomic_weight_ratio or + self.q_value != other.q_value): + eqval = False + return eqval + @property def total_mass(self): return self._total_mass diff --git a/openmc/data/product.py b/openmc/data/product.py index dd276daac3..08529f90a1 100644 --- a/openmc/data/product.py +++ b/openmc/data/product.py @@ -49,6 +49,20 @@ class Product(object): self.applicability = [] self.yield_ = 1 + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self.particle != other.particle or + self.decay_rate != other.decay_rate or + self.emission_mode != other.emission_mode or + self.distribution.all() != other.distribution.all() or + self.applicability.all() != other.applicability.all() or + self.yield_ != other.yield_): + eqval = False + return eqval + def __repr__(self): if isinstance(self.yield_, Real): return "".format( diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 9de39f518d..cb61aa7300 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -69,6 +69,16 @@ class CoherentElastic(object): idx = np.searchsorted(self.bragg_edges, E) return self.factors[idx]/E + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (not np.array_equal(self.bragg_edges, other.bragg_edges) or + not np.array_equal(self.factors, other.factors)): + eqval = False + return eqval + def __len__(self): return len(self.bragg_edges) @@ -170,6 +180,23 @@ class ThermalScattering(object): self.secondary_mode = None self.zaids = [] + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self.name != other.name or + self.atomic_weight_ratio != other.atomic_weight_ratio or + self.elastic_xs != other.elastic_xs or + self.elastic_mu_out != other.elastic_mu_out or + self.inelastic_xs != other.inelastic_xs or + self.inelastic_mu_out != other.inelastic_mu_out or + self.temperature != other.temperature or + not np.array_equal(self.zaids, other.zaids) or + self.secondary_mode != other.secondary_mode): + eqval = False + return eqval + def __repr__(self): if hasattr(self, 'name'): return "".format(self.name) @@ -216,13 +243,15 @@ class ThermalScattering(object): self.inelastic_dist.to_hdf5(inelastic_group) @classmethod - def from_hdf5(cls, group): + def from_hdf5(cls, group_or_filename): """Generate thermal scattering data from HDF5 group Parameters ---------- - group : h5py.Group - HDF5 group to read from + group_or_filename : h5py.Group or str + HDF5 group containing interaction data. If given as a string, it is + assumed to be the filename for the HDF5 file, and the first group + is used to read from. Returns ------- @@ -230,6 +259,12 @@ class ThermalScattering(object): Neutron thermal scattering data """ + if isinstance(group_or_filename, h5py.Group): + group = group_or_filename + else: + h5file = h5py.File(group_or_filename, 'r') + group = list(h5file.values())[0] + name = group.name[1:] atomic_weight_ratio = group.attrs['atomic_weight_ratio'] temperature = group.attrs['temperature'] diff --git a/openmc/data/uncorrelated.py b/openmc/data/uncorrelated.py index 0361c9b37a..babe003c02 100644 --- a/openmc/data/uncorrelated.py +++ b/openmc/data/uncorrelated.py @@ -34,6 +34,16 @@ class UncorrelatedAngleEnergy(AngleEnergy): if energy is not None: self.energy = energy + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self.angle != other.angle or + self.energy != other.energy): + eqval = False + return eqval + @property def angle(self): return self._angle diff --git a/openmc/stats/univariate.py b/openmc/stats/univariate.py index 24ab98895d..d7ba945202 100644 --- a/openmc/stats/univariate.py +++ b/openmc/stats/univariate.py @@ -65,6 +65,16 @@ class Discrete(Univariate): self.x = x self.p = p + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (not np.array_equal(self.x, other.x) or + not np.array_equal(self.p, other.p)): + eqval = False + return eqval + def __len__(self): return len(self.x) @@ -126,6 +136,16 @@ class Uniform(Univariate): self.a = a self.b = b + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self.a != other.a or + self.b != other.b): + eqval = False + return eqval + def __len__(self): return 2 @@ -183,6 +203,15 @@ class Maxwell(Univariate): super(Maxwell, self).__init__() self.theta = theta + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self.theta != other.theta): + eqval = False + return eqval + def __len__(self): return 1 @@ -231,6 +260,16 @@ class Watt(Univariate): self.a = a self.b = b + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self.a != other.a or + self.b != other.b): + eqval = False + return eqval + def __len__(self): return 2 @@ -300,6 +339,18 @@ class Tabular(Univariate): self.p = p self.interpolation = interpolation + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (self._ignore_negative != other._ignore_negative or + not np.array_equal(self.x, other.x) or + not np.array_equal(self.p, other.p) or + self.interpolation != other.interpolation): + eqval = False + return eqval + def __len__(self): return len(self.x) @@ -368,6 +419,15 @@ class Legendre(Univariate): def __call__(self, x): return self._legendre_polynomial(x) + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if not np.array_equal(self.coefficients, other.coefficients): + eqval = False + return eqval + def __len__(self): return len(self._legendre_polynomial.coef) @@ -414,6 +474,16 @@ class Mixture(Univariate): self.probability = probability self.distribution = distribution + def __eq__(self, other): + if not isinstance(other, type(self)): + return NotImplemented + else: + eqval = True + if (not np.array_equal(self.probability, other.probability) or + not np.array_equal(self.distribution, other.distribution)): + eqval = False + return eqval + def __len__(self): return sum(len(d) for d in self.distribution) From 11a2c31031eeabe29595ab335716739bc2c24cb1 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 11 Aug 2016 22:12:47 -0400 Subject: [PATCH 062/168] Removed unreachable return in get_thermal_name(...) --- openmc/data/thermal.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 8b6e35b61a..cd44f21f95 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -59,8 +59,6 @@ def get_thermal_name(name): # OK, we give up. Just use the ACE name. return 'c_' + name - return name - class CoherentElastic(object): r"""Coherent elastic scattering data from a crystalline material @@ -416,4 +414,4 @@ class ThermalScattering(object): pairs = np.fromiter(map(lambda p: p[0], ace.pairs), int) table.zaids = pairs[np.nonzero(pairs)] - return table \ No newline at end of file + return table From 531a1726078a4b2d7abacf1752a04187a38805ed Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 11 Aug 2016 22:21:40 -0400 Subject: [PATCH 063/168] Now appending metatable suffix to nuclide names per suggestion by @paulromano --- openmc/nuclide.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 124c86a359..00ae25ac60 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -102,6 +102,10 @@ class Nuclide(object): if '-' in name: new_name = name.replace('-', '') + new_name = new_name.replace('Nat', '0') + if new_name.endswith('m'): + new_name = new_name[:-1] + '_m1' + msg = 'OpenMC nuclides follow the GND naming convention. Nuclide ' \ '"{}" is being renamed as "{}".'.format(name, new_name) warnings.warn(msg, DeprecationWarning) From cdb882648aff932644870f6bd96c45c3c0c032c7 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 11 Aug 2016 22:27:53 -0400 Subject: [PATCH 064/168] Now printing a UserWarning in place of a DeprecationWarning for nuclide renaming --- openmc/nuclide.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 00ae25ac60..2c6998cd5d 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -108,7 +108,7 @@ class Nuclide(object): msg = 'OpenMC nuclides follow the GND naming convention. Nuclide ' \ '"{}" is being renamed as "{}".'.format(name, new_name) - warnings.warn(msg, DeprecationWarning) + warnings.warn(msg) self._name = name.replace('-', '') From 284058319097c4777d0e3d0c7814b7ed6c4ef665 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 11 Aug 2016 23:00:59 -0400 Subject: [PATCH 065/168] Fixed nuclide renaming bug --- openmc/nuclide.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 2c6998cd5d..68f95beb94 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -99,19 +99,18 @@ class Nuclide(object): @name.setter def name(self, name): check_type('name', name, basestring) + self._name = name if '-' in name: - new_name = name.replace('-', '') - new_name = new_name.replace('Nat', '0') - if new_name.endswith('m'): - new_name = new_name[:-1] + '_m1' + self._name = name.replace('-', '') + self._name = self._name.replace('Nat', '0') + if self._name.endswith('m'): + self._name = self._name[:-1] + '_m1' msg = 'OpenMC nuclides follow the GND naming convention. Nuclide ' \ - '"{}" is being renamed as "{}".'.format(name, new_name) + '"{}" is being renamed as "{}".'.format(name, self._name) warnings.warn(msg) - self._name = name.replace('-', '') - @xs.setter def xs(self, xs): check_type('cross-section identifier', xs, basestring) From 6ecf89424e62d65f60f029d83b93645c58762753 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Fri, 12 Aug 2016 10:02:39 -0400 Subject: [PATCH 066/168] Added warning message for S(a,b) table renaming --- openmc/material.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/openmc/material.py b/openmc/material.py index e1f3da97ab..da173c92e7 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -485,7 +485,13 @@ class Material(object): 'non-string cross-section identifier "{1}"'.format(self._id, xs) raise ValueError(msg) - self._sab.append((openmc.data.get_thermal_name(name), xs)) + 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, xs)) def make_isotropic_in_lab(self): for nuclide, percent, percent_type in self._nuclides: From 5b219fd6aa36f58cc5313b259b6f098ccf35a2d1 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 12 Aug 2016 11:32:31 -0500 Subject: [PATCH 067/168] Fix doc build for metaclassed Polynomials --- docs/source/conf.py | 3 +++ openmc/data/function.py | 13 +++++-------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 4aa000f386..1baea2b03c 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -28,6 +28,9 @@ MOCK_MODULES = ['numpy', 'numpy.polynomial', 'numpy.polynomial.polynomial', 'h5py', 'pandas', 'opencg'] sys.modules.update((mod_name, MagicMock()) for mod_name in MOCK_MODULES) +import numpy as np +np.polynomial.Polynomial = MagicMock + # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the diff --git a/openmc/data/function.py b/openmc/data/function.py index 768250259f..88d27ce93d 100644 --- a/openmc/data/function.py +++ b/openmc/data/function.py @@ -1,6 +1,7 @@ from abc import ABCMeta, abstractmethod from collections import Iterable, Callable from numbers import Real, Integral +from six import with_metaclass import numpy as np @@ -10,14 +11,11 @@ INTERPOLATION_SCHEME = {1: 'histogram', 2: 'linear-linear', 3: 'linear-log', 4: 'log-linear', 5: 'log-log'} -class Function1D(object): +class Function1D(with_metaclass(ABCMeta, object)): """A function of one independent variable with HDF5 support.""" - def __init__(self): pass - - def __call__(self): - raise NotImplemented('Subclasses of Function1D should overwrite the ' - '__call__ and to_hdf5 methods') + @abstractmethod + def __call__(self): pass @abstractmethod def to_hdf5(self, group, name='xy'): @@ -31,8 +29,7 @@ class Function1D(object): Name of the dataset to create """ - raise NotImplemented('Subclasses of Function1D should overwrite the ' - '__call__ and to_hdf5 methods') + pass @classmethod def from_hdf5(cls, dataset): From f4e0525a053741fda2e507aa2ca7954e7d1d73d9 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 12 Aug 2016 14:16:46 -0500 Subject: [PATCH 068/168] Remove six dependency --- openmc/data/function.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openmc/data/function.py b/openmc/data/function.py index 88d27ce93d..a7397e7858 100644 --- a/openmc/data/function.py +++ b/openmc/data/function.py @@ -1,7 +1,6 @@ from abc import ABCMeta, abstractmethod from collections import Iterable, Callable from numbers import Real, Integral -from six import with_metaclass import numpy as np @@ -11,9 +10,11 @@ INTERPOLATION_SCHEME = {1: 'histogram', 2: 'linear-linear', 3: 'linear-log', 4: 'log-linear', 5: 'log-log'} -class Function1D(with_metaclass(ABCMeta, object)): +class Function1D(object): """A function of one independent variable with HDF5 support.""" + __metaclass__ = ABCMeta + @abstractmethod def __call__(self): pass From c5df6ce146abeee0d83447aa7a1deccf354b9ade Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 12 Aug 2016 16:40:13 -0500 Subject: [PATCH 069/168] Fix mesh filter max iterator check --- src/tally_filter.F90 | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/tally_filter.F90 b/src/tally_filter.F90 index c0e1c88534..67d0452847 100644 --- a/src/tally_filter.F90 +++ b/src/tally_filter.F90 @@ -295,8 +295,12 @@ contains search_iter = 0 do while (any(ijk0(:m % n_dimension) < 1) & .or. any(ijk0(:m % n_dimension) > m % dimension)) - if (search_iter == MAX_SEARCH_ITER) call fatal_error("Failed to & - &find a mesh intersection on a tally mesh filter.") + if (search_iter == MAX_SEARCH_ITER) then + call warning("Failed to find a mesh intersection on a tally mesh & + &filter.") + next_bin = NO_BIN_FOUND + return + end if do j = 1, m % n_dimension if (abs(uvw(j)) < FP_PRECISION) then @@ -315,6 +319,8 @@ contains else ijk0(j) = ijk0(j) - 1 end if + + search_iter = search_iter + 1 end do distance = d(j) xyz0 = xyz0 + distance * uvw From aca4578f46327e3978f95b9dcfd99d2610b2fff6 Mon Sep 17 00:00:00 2001 From: Sterling Harper Date: Fri, 12 Aug 2016 17:57:54 -0500 Subject: [PATCH 070/168] Fix Sphinx bullet list error --- docs/source/io_formats/fission_energy.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/source/io_formats/fission_energy.rst b/docs/source/io_formats/fission_energy.rst index 768db56ebb..f80db4569a 100644 --- a/docs/source/io_formats/fission_energy.rst +++ b/docs/source/io_formats/fission_energy.rst @@ -26,7 +26,8 @@ ENDF files with the example, 'U235' or 'Pu239'. Metastable nuclides are appended with an '_m' and their metastable number. For example, 'Am242_m1' -:Datasets: - **data** (*double[][][]*) -- The energy release coefficients. The +:Datasets: + - **data** (*double[][][]*) -- The energy release coefficients. The first axis indexes the component type. The second axis specifies values or uncertainties. The third axis indexes the polynomial order. If the data uses the Sher-Beck format, then the last axis From 328c6a0e886d0011f3e88b03a53028e7119d0250 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 13 Aug 2016 17:40:28 -0500 Subject: [PATCH 071/168] Allow estimator to be set for MGXS --- openmc/mgxs/mgxs.py | 74 ++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 7aa12d0418..b942351556 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -47,6 +47,10 @@ DOMAIN_TYPES = ['cell', 'material', 'mesh'] +ESTIMATOR_TYPES = ['tracklength', + 'collision', + 'analog'] + # Supported domain classes _DOMAINS = (openmc.Cell, openmc.Universe, @@ -102,7 +106,7 @@ class MGXS(object): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section @@ -149,6 +153,7 @@ class MGXS(object): self._rxn_type = None self._by_nuclide = None self._nuclides = None + self._estimator = 'tracklength' self._domain = None self._domain_type = None self._energy_groups = None @@ -250,7 +255,7 @@ class MGXS(object): @property def estimator(self): - return 'tracklength' + return self._estimator @property def tallies(self): @@ -368,6 +373,11 @@ class MGXS(object): cv.check_iterable_type('nuclides', nuclides, basestring) self._nuclides = nuclides + @estimator.setter + def estimator(self, estimator): + cv.check_value('estimator', estimator, ESTIMATOR_TYPES) + self._estimator = estimator + @domain.setter def domain(self, domain): cv.check_type('domain', domain, _DOMAINS) @@ -1643,7 +1653,7 @@ class MatrixMGXS(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section @@ -1692,10 +1702,6 @@ class MatrixMGXS(MGXS): return [[energy], [energy, energyout]] - @property - def estimator(self): - return 'analog' - def get_xs(self, in_groups='all', out_groups='all', subdomains='all', nuclides='all', xs_type='macro', order_groups='increasing', @@ -2072,7 +2078,7 @@ class TotalXS(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -2190,7 +2196,7 @@ class TransportXS(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -2233,6 +2239,7 @@ class TransportXS(MGXS): super(TransportXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'transport' + self._estimator = 'analog' @property def scores(self): @@ -2245,10 +2252,6 @@ class TransportXS(MGXS): energyout_filter = openmc.Filter('energyout', group_edges) return [[energy_filter], [energy_filter], [energyout_filter]] - @property - def estimator(self): - return 'analog' - @property def rxn_rate_tally(self): if self._rxn_rate_tally is None: @@ -2320,7 +2323,7 @@ class NuTransportXS(TransportXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -2441,7 +2444,7 @@ class AbsorptionXS(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -2557,7 +2560,7 @@ class CaptureXS(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -2679,7 +2682,7 @@ class FissionXS(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -2790,7 +2793,7 @@ class NuFissionXS(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -2906,7 +2909,7 @@ class KappaFissionXS(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -3019,7 +3022,7 @@ class ScatterXS(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -3134,7 +3137,7 @@ class NuScatterXS(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -3177,10 +3180,7 @@ class NuScatterXS(MGXS): super(NuScatterXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'nu-scatter' - - @property - def estimator(self): - return 'analog' + self._estimator = 'analog' class ScatterMatrixXS(MatrixMGXS): @@ -3268,7 +3268,7 @@ class ScatterMatrixXS(MatrixMGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -3314,6 +3314,7 @@ class ScatterMatrixXS(MatrixMGXS): self._correction = 'P0' self._legendre_order = 0 self._hdf5_key = 'scatter matrix' + self._estimator = 'analog' def __deepcopy__(self, memo): clone = super(ScatterMatrixXS, self).__deepcopy__(memo) @@ -3929,7 +3930,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -4051,7 +4052,7 @@ class MultiplicityMatrixXS(MatrixMGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -4094,6 +4095,7 @@ class MultiplicityMatrixXS(MatrixMGXS): super(MultiplicityMatrixXS, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'multiplicity matrix' + self._estimator = 'analog' @property def scores(self): @@ -4198,7 +4200,7 @@ class NuFissionMatrixXS(MatrixMGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -4242,6 +4244,7 @@ class NuFissionMatrixXS(MatrixMGXS): groups, by_nuclide, name) self._rxn_type = 'nu-fission' self._hdf5_key = 'nu-fission matrix' + self._estimator = 'analog' class Chi(MGXS): @@ -4313,7 +4316,7 @@ class Chi(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -4355,6 +4358,7 @@ class Chi(MGXS): groups=None, by_nuclide=False, name=''): super(Chi, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'chi' + self._estimator = 'analog' @property def scores(self): @@ -4372,10 +4376,6 @@ class Chi(MGXS): def tally_keys(self): return ['nu-fission-in', 'nu-fission-out'] - @property - def estimator(self): - return 'analog' - @property def rxn_rate_tally(self): if self._rxn_rate_tally is None: @@ -4803,7 +4803,7 @@ class ChiPrompt(Chi): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -4918,7 +4918,7 @@ class InverseVelocity(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -5052,7 +5052,7 @@ class PromptNuFissionXS(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'analog'} + estimator : {'tracklength', 'collision', 'analog'} The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys From c91744d2d54adac36beb57074bb8e7bb2463360d Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 14 Aug 2016 12:09:59 -0400 Subject: [PATCH 072/168] testing run to use the dict comparison approach --- openmc/data/product.py | 4 ++-- openmc/data/uncorrelated.py | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/openmc/data/product.py b/openmc/data/product.py index 08529f90a1..a33ee9dfb0 100644 --- a/openmc/data/product.py +++ b/openmc/data/product.py @@ -57,8 +57,8 @@ class Product(object): if (self.particle != other.particle or self.decay_rate != other.decay_rate or self.emission_mode != other.emission_mode or - self.distribution.all() != other.distribution.all() or - self.applicability.all() != other.applicability.all() or + not np.narray_equal(self.distribution, other.distribution) or + not np.narray_equal(self.applicability, other.applicability) or self.yield_ != other.yield_): eqval = False return eqval diff --git a/openmc/data/uncorrelated.py b/openmc/data/uncorrelated.py index babe003c02..19945205ee 100644 --- a/openmc/data/uncorrelated.py +++ b/openmc/data/uncorrelated.py @@ -38,11 +38,10 @@ class UncorrelatedAngleEnergy(AngleEnergy): if not isinstance(other, type(self)): return NotImplemented else: - eqval = True - if (self.angle != other.angle or - self.energy != other.energy): - eqval = False - return eqval + if self.__dict__ != other.__dict__: + return False + else: + return True @property def angle(self): From 8e0f3f4f79fedcbd3892a0164d336f6315f97f45 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 15 Aug 2016 06:47:19 -0500 Subject: [PATCH 073/168] Respond to @wbinventor comments on #704 --- openmc/__init__.py | 2 +- openmc/mgxs/mgxs.py | 32 +++++++++++++++++--------------- openmc/tallies.py | 6 ++++-- 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/openmc/__init__.py b/openmc/__init__.py index 026ccce114..a0492ee408 100644 --- a/openmc/__init__.py +++ b/openmc/__init__.py @@ -13,10 +13,10 @@ from openmc.settings import * from openmc.surface import * from openmc.universe import * from openmc.mesh import * -from openmc.mgxs_library import * from openmc.filter import * from openmc.trigger import * from openmc.tallies import * +from openmc.mgxs_library import * from openmc.cmfd import * from openmc.executor import * from openmc.statepoint import * diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index b942351556..d68dc508f2 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -13,6 +13,7 @@ import numpy as np import openmc import openmc.checkvalue as cv +from openmc.tallies import ESTIMATOR_TYPES from openmc.mgxs import EnergyGroups if sys.version_info[0] >= 3: @@ -39,7 +40,6 @@ MGXS_TYPES = ['total', 'inverse-velocity', 'prompt-nu-fission'] - # Supported domain types DOMAIN_TYPES = ['cell', 'distribcell', @@ -47,10 +47,6 @@ DOMAIN_TYPES = ['cell', 'material', 'mesh'] -ESTIMATOR_TYPES = ['tracklength', - 'collision', - 'analog'] - # Supported domain classes _DOMAINS = (openmc.Cell, openmc.Universe, @@ -148,7 +144,6 @@ class MGXS(object): def __init__(self, domain=None, domain_type=None, energy_groups=None, by_nuclide=False, name=''): - self._name = '' self._rxn_type = None self._by_nuclide = None @@ -165,6 +160,7 @@ class MGXS(object): self._loaded_sp = False self._derived = False self._hdf5_key = None + self._valid_estimators = ESTIMATOR_TYPES self.name = name self.by_nuclide = by_nuclide @@ -375,7 +371,7 @@ class MGXS(object): @estimator.setter def estimator(self, estimator): - cv.check_value('estimator', estimator, ESTIMATOR_TYPES) + cv.check_value('estimator', estimator, self._valid_estimators) self._estimator = estimator @domain.setter @@ -2196,7 +2192,7 @@ class TransportXS(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'collision', 'analog'} + estimator : 'analog' The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -2240,6 +2236,7 @@ class TransportXS(MGXS): groups, by_nuclide, name) self._rxn_type = 'transport' self._estimator = 'analog' + self._valid_estimators = ['analog'] @property def scores(self): @@ -2323,7 +2320,7 @@ class NuTransportXS(TransportXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'collision', 'analog'} + estimator : 'analog' The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -3181,6 +3178,7 @@ class NuScatterXS(MGXS): groups, by_nuclide, name) self._rxn_type = 'nu-scatter' self._estimator = 'analog' + self._valid_estimators = ['analog'] class ScatterMatrixXS(MatrixMGXS): @@ -3268,7 +3266,7 @@ class ScatterMatrixXS(MatrixMGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'collision', 'analog'} + estimator : 'analog' The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -3315,6 +3313,7 @@ class ScatterMatrixXS(MatrixMGXS): self._legendre_order = 0 self._hdf5_key = 'scatter matrix' self._estimator = 'analog' + self._valid_estimators = ['analog'] def __deepcopy__(self, memo): clone = super(ScatterMatrixXS, self).__deepcopy__(memo) @@ -3930,7 +3929,7 @@ class NuScatterMatrixXS(ScatterMatrixXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'collision', 'analog'} + estimator : 'analog' The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -4052,7 +4051,7 @@ class MultiplicityMatrixXS(MatrixMGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'collision', 'analog'} + estimator : 'analog' The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -4096,6 +4095,7 @@ class MultiplicityMatrixXS(MatrixMGXS): by_nuclide, name) self._rxn_type = 'multiplicity matrix' self._estimator = 'analog' + self._valid_estimators = ['analog'] @property def scores(self): @@ -4200,7 +4200,7 @@ class NuFissionMatrixXS(MatrixMGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'collision', 'analog'} + estimator : 'analog' The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -4245,6 +4245,7 @@ class NuFissionMatrixXS(MatrixMGXS): self._rxn_type = 'nu-fission' self._hdf5_key = 'nu-fission matrix' self._estimator = 'analog' + self._valid_estimators = ['analog'] class Chi(MGXS): @@ -4316,7 +4317,7 @@ class Chi(MGXS): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'collision', 'analog'} + estimator : 'analog' The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys @@ -4359,6 +4360,7 @@ class Chi(MGXS): super(Chi, self).__init__(domain, domain_type, groups, by_nuclide, name) self._rxn_type = 'chi' self._estimator = 'analog' + self._valid_estimators = ['analog'] @property def scores(self): @@ -4803,7 +4805,7 @@ class ChiPrompt(Chi): tally_keys : list of str The keys into the tallies dictionary for each tally used to compute the multi-group cross section - estimator : {'tracklength', 'collision', 'analog'} + estimator : 'analog' The tally estimator used to compute the multi-group cross section tallies : collections.OrderedDict OpenMC tallies needed to compute the multi-group cross section. The keys diff --git a/openmc/tallies.py b/openmc/tallies.py index c68b0faacb..f645fa1624 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -40,6 +40,9 @@ _SCORE_CLASSES = (basestring, CrossScore, AggregateScore) _NUCLIDE_CLASSES = (basestring, Nuclide, CrossNuclide, AggregateNuclide) _FILTER_CLASSES = (Filter, CrossFilter, AggregateFilter) +# Valid types of estimators +ESTIMATOR_TYPES = ['tracklength', 'collision', 'analog'] + def reset_auto_tally_id(): """Reset counter for auto-generated tally IDs.""" @@ -387,8 +390,7 @@ class Tally(object): @estimator.setter def estimator(self, estimator): - cv.check_value('estimator', estimator, - ['analog', 'tracklength', 'collision']) + cv.check_value('estimator', estimator, ESTIMATOR_TYPES) self._estimator = estimator @triggers.setter From 6c29c394434e2f5acfb78d7080aca73b9c62c66a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 15 Aug 2016 17:50:03 -0500 Subject: [PATCH 074/168] Add check on user-specified bounding boxes for volume calculations --- openmc/volume.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/openmc/volume.py b/openmc/volume.py index e9b1dac1d3..2a2a92f61e 100644 --- a/openmc/volume.py +++ b/openmc/volume.py @@ -1,6 +1,7 @@ from collections import Iterable, Mapping from numbers import Real, Integral from xml.etree import ElementTree as ET +from warnings import warn import numpy as np import pandas as pd @@ -68,10 +69,26 @@ class VolumeCalculation(object): self.samples = samples if lower_left is not None: - self.lower_left = lower_left if upper_right is None: raise ValueError('Both lower-left and upper-right coordinates ' 'should be specified') + + # For cell domains, try to compute bounding box and make sure + # user-specified one is valid + if self.domain_type == 'cell': + for c in domains: + if c.region is None: + continue + ll, ur = c.region.bounding_box + if np.any(np.isinf(ll)) or np.any(np.isinf(ur)): + 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)) + + self.lower_left = lower_left self.upper_right = upper_right else: if self.domain_type == 'cell': From 1cfa392bb0580b584643927fb3e57f43f28b9f12 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 15 Aug 2016 18:04:22 -0500 Subject: [PATCH 075/168] Reject external source only if 95% of sites are rejected --- src/constants.F90 | 3 ++- src/source.F90 | 23 +++++++++++++++-------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/constants.F90 b/src/constants.F90 index 0a60005532..fca45d1458 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -54,7 +54,8 @@ module constants ! Maximum number of external source spatial resamples to encounter before an ! error is thrown. - integer, parameter :: MAX_EXTSRC_RESAMPLES = 10000 + integer, parameter :: EXTSRC_REJECT_THRESHOLD = 10000 + real(8), parameter :: EXTSRC_REJECT_FRACTION = 0.05 ! ============================================================================ ! PHYSICAL CONSTANTS diff --git a/src/source.F90 b/src/source.F90 index 194c8c6add..fad9ae46af 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -107,7 +107,8 @@ contains real(8) :: r(3) ! sampled coordinates logical :: found ! Does the source particle exist within geometry? type(Particle) :: p ! Temporary particle for using find_cell - integer, save :: num_resamples = 0 ! Number of resamples encountered + integer, save :: n_sample = 0 ! Number of samples + integer, save :: n_reject = 0 ! Number of samples rejected ! Set weight to one by default site % wgt = ONE @@ -143,13 +144,6 @@ contains ! Now search to see if location exists in geometry call find_cell(p, found) - if (.not. found) then - num_resamples = num_resamples + 1 - if (num_resamples == MAX_EXTSRC_RESAMPLES) then - call fatal_error("Maximum number of external source spatial & - &resamples reached!") - end if - end if ! Check if spatial site is in fissionable material select type (space => external_source(i) % space) @@ -162,8 +156,21 @@ contains end if end if end select + + ! Check for rejection + if (.not. found) then + n_reject = n_reject + 1 + if (n_reject >= EXTSRC_REJECT_THRESHOLD .and. & + real(n_sample, 8)/n_reject <= EXTSRC_REJECT_FRACTION) then + call fatal_error("More than 95% of external source sites sampled & + &were rejected. Please check your external source definition.") + end if + end if end do + ! Increment number of samples + n_sample = n_sample + 1 + call p % clear() ! Sample angle From 8474a9c71b909a599f3e9e9f3fbb4f6fa2f521f8 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 15 Aug 2016 18:12:55 -0500 Subject: [PATCH 076/168] Update documentation regarding CC environment variable --- docs/source/usersguide/install.rst | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/source/usersguide/install.rst b/docs/source/usersguide/install.rst index 1a0569148b..457c5efd8f 100644 --- a/docs/source/usersguide/install.rst +++ b/docs/source/usersguide/install.rst @@ -204,20 +204,22 @@ should be used: Compiling with MPI ++++++++++++++++++ -To compile with MPI, set the :envvar:`FC` environment variable to the path to -the MPI Fortran wrapper. For example, in a bash shell: +To compile with MPI, set the :envvar:`FC` and :envvar:`CC` environment variables +to the path to the MPI Fortran and C wrappers, respectively. For example, in a +bash shell: .. code-block:: sh export FC=mpif90 + export CC=mpicc cmake /path/to/openmc -Note that in many shells, an environment variable can be set for a single -command, i.e. +Note that in many shells, environment variables can be set for a single command, +i.e. .. code-block:: sh - FC=mpif90 cmake /path/to/openmc + FC=mpif90 CC=mpicc cmake /path/to/openmc Selecting HDF5 Installation +++++++++++++++++++++++++++ @@ -343,7 +345,7 @@ compiler, it is necessary to specify that all objects be compiled with the .. code-block:: sh mkdir build && cd build - FC=ifort FFLAGS=-mmic cmake -Dopenmp=on .. + FC=ifort CC=icc FFLAGS=-mmic cmake -Dopenmp=on .. make Note that unless an HDF5 build for the Intel Xeon Phi is already on your target From 6cd569fdead72a3fb1f9acf61256eec22ceccaf8 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 15 Aug 2016 21:15:40 -0500 Subject: [PATCH 077/168] Add SiO2 to list of recognized S(a,b) tables --- openmc/data/thermal.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index cd44f21f95..be35da517b 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -33,6 +33,7 @@ _THERMAL_NAMES = {'al': 'c_Al27', 'al27': 'c_Al27', 'orthod': 'c_ortho_D', 'dortho': 'c_ortho_D', 'orthoh': 'c_ortho_H', 'hortho': 'c_ortho_H', 'ouo2': 'c_O_in_UO2', 'o2-u': 'c_O_in_UO2', 'o2/u': 'c_O_in_UO2', + 'sio2': 'c_SiO2', 'parad': 'c_para_D', 'dpara': 'c_para_D', 'parah': 'c_para_H', 'hpara': 'c_para_H', 'sch4': 'c_solid_CH4', 'smeth': 'c_solid_CH4', From 6be762858e14b9e1db69cf1366fbde004dc4cd51 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 16 Aug 2016 09:33:26 -0500 Subject: [PATCH 078/168] Allow estimator to be set for mgxs.Library --- openmc/mgxs/library.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index ee11d0ef64..5685681e43 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -11,6 +11,7 @@ import numpy as np import openmc import openmc.mgxs import openmc.checkvalue as cv +from openmc.tallies import ESTIMATOR_TYPES if sys.version_info[0] >= 3: @@ -39,7 +40,7 @@ class Library(object): mgxs_types : Iterable of str The types of cross sections in the library (e.g., ['total', 'scatter']) name : str, optional - Name of the multi-group cross section. library Used as a label to + Name of the multi-group cross section library. Used as a label to identify tallies in OpenMC 'tallies.xml' file. Attributes @@ -64,6 +65,9 @@ class Library(object): The highest legendre moment in the scattering matrices (default is 0) energy_groups : openmc.mgxs.EnergyGroups Energy group structure for energy condensation + estimator : str or None + The tally estimator used to compute multi-group cross sections. If None, + the default for each MGXS type is used. tally_trigger : openmc.Trigger An (optional) tally precision trigger given to each tally used to compute the cross section @@ -102,6 +106,7 @@ class Library(object): self._sp_filename = None self._keff = None self._sparse = False + self._estimator = None self.name = name self.openmc_geometry = openmc_geometry @@ -206,6 +211,10 @@ class Library(object): def tally_trigger(self): return self._tally_trigger + @property + def estimator(self): + return self._estimator + @property def num_groups(self): return self.energy_groups.num_groups @@ -327,6 +336,11 @@ class Library(object): cv.check_type('tally trigger', tally_trigger, openmc.Trigger) self._tally_trigger = tally_trigger + @estimator.setter + def estimator(self, estimator): + cv.check_value('estimator', estimator, ESTIMATOR_TYPES) + self._estimator = estimator + @sparse.setter def sparse(self, sparse): """Convert tally data from NumPy arrays to SciPy list of lists (LIL) @@ -368,9 +382,11 @@ class Library(object): mgxs.domain_type = self.domain_type mgxs.energy_groups = self.energy_groups mgxs.by_nuclide = self.by_nuclide + if self.estimator is not None: + mgxs.estimator = self.estimator # If a tally trigger was specified, add it to the MGXS - if self.tally_trigger: + if self.tally_trigger is not None: mgxs.tally_trigger = self.tally_trigger # Specify whether to use a transport ('P0') correction From e122535ddc3d672efd8d5b68a5263629273e14ae Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 16 Aug 2016 16:47:50 -0400 Subject: [PATCH 079/168] fixed issue in tally.F90 and updated mdgxs-part-ii.ipynb --- .../pythonapi/examples/mdgxs-part-ii.ipynb | 106 ++++++++---------- src/mesh.F90 | 22 ++-- src/tally.F90 | 14 ++- 3 files changed, 63 insertions(+), 79 deletions(-) diff --git a/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb index 3dea15c501..ee652bc1f4 100644 --- a/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb +++ b/docs/source/pythonapi/examples/mdgxs-part-ii.ipynb @@ -456,7 +456,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -607,8 +607,8 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.8.0\n", - " Git SHA1: c21ceb0aea4abc243b84106576c4f9010f608d0b\n", - " Date/Time: 2016-08-11 08:25:23\n", + " Git SHA1: 2636be6779b4c821dc6fb7a49de391fecb471358\n", + " Date/Time: 2016-08-16 16:45:50\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -713,20 +713,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 5.7200E-01 seconds\n", - " Reading cross sections = 3.6100E-01 seconds\n", - " Total time in simulation = 7.5373E+01 seconds\n", - " Time in transport only = 7.5119E+01 seconds\n", - " Time in inactive batches = 5.1640E+00 seconds\n", - " Time in active batches = 7.0209E+01 seconds\n", - " Time synchronizing fission bank = 5.0000E-03 seconds\n", - " Sampling source sites = 3.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 2.1900E-01 seconds\n", - " Total time for finalization = 7.0000E-03 seconds\n", - " Total time elapsed = 7.5973E+01 seconds\n", - " Calculation Rate (inactive) = 4841.21 neutrons/second\n", - " Calculation Rate (active) = 1424.32 neutrons/second\n", + " Total time for initialization = 4.3700E-01 seconds\n", + " Reading cross sections = 2.3700E-01 seconds\n", + " Total time in simulation = 6.7426E+01 seconds\n", + " Time in transport only = 6.7172E+01 seconds\n", + " Time in inactive batches = 4.8900E+00 seconds\n", + " Time in active batches = 6.2536E+01 seconds\n", + " Time synchronizing fission bank = 7.0000E-03 seconds\n", + " Sampling source sites = 7.0000E-03 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 2.0100E-01 seconds\n", + " Total time for finalization = 6.0000E-03 seconds\n", + " Total time elapsed = 6.7893E+01 seconds\n", + " Calculation Rate (inactive) = 5112.47 neutrons/second\n", + " Calculation Rate (active) = 1599.08 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -827,24 +827,6 @@ "collapsed": false }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1944: RuntimeWarning: invalid value encountered in true_divide\n", - " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1945: RuntimeWarning: invalid value encountered in true_divide\n", - " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1946: RuntimeWarning: divide by zero encountered in true_divide\n", - " new_tally._mean = data['self']['mean'] / data['other']['mean']\n", - "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1946: RuntimeWarning: invalid value encountered in true_divide\n", - " new_tally._mean = data['self']['mean'] / data['other']['mean']\n", - "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1938: RuntimeWarning: invalid value encountered in true_divide\n", - " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1939: RuntimeWarning: invalid value encountered in true_divide\n", - " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n" - ] - }, { "data": { "text/html": [ @@ -947,8 +929,8 @@ " 1\n", " total\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 0.006642\n", - " 0.001718\n", + " 0.011466\n", + " 0.004394\n", " \n", " \n", " 7\n", @@ -958,8 +940,8 @@ " 2\n", " total\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 0.001157\n", - " 0.000075\n", + " 0.000960\n", + " 0.000081\n", " \n", " \n", " 8\n", @@ -969,8 +951,8 @@ " 3\n", " total\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 0.006708\n", - " 0.000578\n", + " 0.007407\n", + " 0.000779\n", " \n", " \n", " 9\n", @@ -980,8 +962,8 @@ " 4\n", " total\n", " (((delayed-nu-fission / nu-fission) * (delayed...\n", - " 0.076515\n", - " 0.005032\n", + " 0.083327\n", + " 0.005229\n", " \n", " \n", "\n", @@ -1009,10 +991,10 @@ "3 (((delayed-nu-fission / nu-fission) * (delayed... 0.074721 0.005119 \n", "4 (((delayed-nu-fission / nu-fission) * (delayed... 0.034106 0.002235 \n", "5 (((delayed-nu-fission / nu-fission) * (delayed... 0.002500 0.000358 \n", - "6 (((delayed-nu-fission / nu-fission) * (delayed... 0.006642 0.001718 \n", - "7 (((delayed-nu-fission / nu-fission) * (delayed... 0.001157 0.000075 \n", - "8 (((delayed-nu-fission / nu-fission) * (delayed... 0.006708 0.000578 \n", - "9 (((delayed-nu-fission / nu-fission) * (delayed... 0.076515 0.005032 " + "6 (((delayed-nu-fission / nu-fission) * (delayed... 0.011466 0.004394 \n", + "7 (((delayed-nu-fission / nu-fission) * (delayed... 0.000960 0.000081 \n", + "8 (((delayed-nu-fission / nu-fission) * (delayed... 0.007407 0.000779 \n", + "9 (((delayed-nu-fission / nu-fission) * (delayed... 0.083327 0.005229 " ] }, "execution_count": 22, @@ -1167,8 +1149,8 @@ " x-min\n", " total\n", " current\n", - " 0.00000\n", - " 0.000000\n", + " 0.03039\n", + " 0.000670\n", " \n", " \n", " 7\n", @@ -1178,8 +1160,8 @@ " x-max\n", " total\n", " current\n", - " 0.03134\n", - " 0.000669\n", + " 0.03067\n", + " 0.000567\n", " \n", " \n", " 8\n", @@ -1189,8 +1171,8 @@ " y-min\n", " total\n", " current\n", - " 0.03055\n", - " 0.000605\n", + " 0.00000\n", + " 0.000000\n", " \n", " \n", " 9\n", @@ -1200,8 +1182,8 @@ " y-max\n", " total\n", " current\n", - " 0.03113\n", - " 0.000634\n", + " 0.03082\n", + " 0.000617\n", " \n", " \n", "\n", @@ -1216,10 +1198,10 @@ "3 1 1 1 y-max total current 0.03091 0.000636\n", "4 1 1 1 z-min total current 0.00000 0.000000\n", "5 1 1 1 z-max total current 0.00000 0.000000\n", - "6 1 2 1 x-min total current 0.00000 0.000000\n", - "7 1 2 1 x-max total current 0.03134 0.000669\n", - "8 1 2 1 y-min total current 0.03055 0.000605\n", - "9 1 2 1 y-max total current 0.03113 0.000634" + "6 1 2 1 x-min total current 0.03039 0.000670\n", + "7 1 2 1 x-max total current 0.03067 0.000567\n", + "8 1 2 1 y-min total current 0.00000 0.000000\n", + "9 1 2 1 y-max total current 0.03082 0.000617" ] }, "execution_count": 23, @@ -1255,7 +1237,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 24, @@ -1264,9 +1246,9 @@ }, { "data": { - "image/png": "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\nDmZmZmZmZmbW5TzgYGZmZmZmZmZdzgMOZmZmZmZmZtblPOBgZmZmZmZmZl3OAw5mZmZmZmZm1uU8\n4GBmZmZmZmZmXc4DDmZmZmZmZmbW5TzgYGZmZmZmZmZdzgMOZmZmZmZmZtblPOBgZmZmZmZmZl3O\nAw5mZmZmZmZm1uU84GBmZmZmZmZmXc4DDusJSZMlnZlx2ycl7d/dfapqcz9JT/Vkm2ZmPck5bGZW\nPmexWXPxgEMdkuZLelXSy5Kel3S9pJ0y1jpIaouyO9CI9N91ZdZfYmbWGOdwt1gnc7jqZ+FlSTeV\n3Sez3sJZ3C3WySwGkHSKpCck/UvSo5KGlt0na24ecKgvgEMiYnNgB+AfwIUZa8U6HCTNTlJrCW32\nAS4A7u7pts16Medwkyohh1f9LKSP0T3cvllv5ixuUj2dxZI+C3wGOCgiNgU+DPxfT/bB1j0ecOiY\nACLidWAqsOuqFVJfSedKWiDpGUk/krShpI2BG4EdJf0zHQ3uL+ldkv4iaamkpyVdmP4RW6xj0h6S\n7pP0kqQpwEZV6z8s6YG0vTskvb3Ofur2S9JFks6t2n6apC+mz3eQNFXSPyT9XdIXKrbbSNLPJb0g\n6RHgXZ28n1GS5qb9+KGkGZKOTdeNS9/D+ZKeB8Yr8Y101P3ZtK3N0u3XGk2vnDInabyk30iakv77\n/FXS7p185F8GbgbmdrKdmXUt57BzeNUuOllvZt3HWdzLs1iSgG8CX4qIxwAi4smIeLGj92PmAYcM\n0sD8BHBXxeJzgKHA7ul/dwS+GRGvAgcBiyNis/SbmGeBNuC/gH7A3sD+wIkF+7MBcA1wWbq/3wAf\nq1i/JzAJOD5d/xNgWlpXraN+XQaMrdjv1un6K9PQuR54gGS0+wDgFEkfSjefALwxfRwIjOvg/Wyd\nvofTgK2Bx9K+VHo38DdgW+DbJKOrnwL2A94EbAb8sGL7zkbTDwV+DWwF/Aq4VnVGiSUNTts7Ex/w\nmpXCObxqv70yh1NXSFoi6aYMgxNm1g2cxav22xuzeED6eLukhenAyoRO9m0GEeFHjQfwJPAy8AKw\nHFgE7Fax/l/AGyte7w08kT7fD1jYyf5PAa4u2Lf3AYuqlt0JnJk+vxiYWLV+LvC+ive2f5Z+AY8C\nB6TPTwJuSJ+/G5hfVXs6MCl9/nfgQxXrjq/3mQCfBO6sWrYQODZ9Pq5GW7cC/1nx+i3AMpJBtLU+\n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\neuPVxnRsyZiOLXtfXzzliVq7DchEZX2NMUvHOIJsgsgeRwPXR0Q38Likm4E3A0tqfjgzsyGkH+Zw\nMDOzJjmL81MaejdwJ5Ci68FaP07W176qu9y5StTd+sY3ljrXL+I9hWu+1H5yqXM92r1P8XPFfxWu\nmfqtEwvXAHzg5FmFa8ZFuZVVfhUdxWs+/P5S5/rsles1HDZ0/kFnFK55501zCtcAfDr+t3DNR9uu\nISKK/Q+ZSIpbYkyuff9R89c7T/rL/31kk0b+mWy82VEV3b2QdALwhog4QdJE4PCI6Jk08jLgLWRD\nKW4ARkdESPoh8ERETKpxzYcCp0XEARXbTgX2iIjjJW2ermNCRNyb/9vYsJTJYYB2rWq803rnKpff\n83b+h8I1v4x3lzrXf7SfX7hmzROvKH6erc5uvFMN519SPEfGHzez1LneyW8L18yOw0qd6zefKP7n\n5umXTm68U5WvvH9K4RqAg352beGa4+KSwjWv4U0c2HZWqSwuksNQO4utdUrdE5fI4excxbO4TA5D\nuSz+j/avFa5Z88SrCtcAfHar4vdzF15yaqlzlcniMjkM5bJ4sHIYymVxmRyGclncynvijY17OJhZ\nbkNtvFqOMWYTWHc4BcB3gGmSehoYpr6cGxvM7OXFQyrMzFrPWZyfGxzMLLcm1xzu9/FqjcaYRcR6\nM5tHxPP1zmFmNtQ1m8NmZtY8Z3F+bnAws9w8Xs3MrLWcw2Zmrecszs8NDmaWW7Prv5uZWXOcw2Zm\nrecszs/flJnl5vFqZmat5Rw2M2s9Z3F+bnAws9wcrmZmreUcNjNrPWdxfm5wMLPcPF7NzKy1nMNm\nZq3nLM7PDQ5mlpvHq5mZtZZz2Mys9ZzF+fmbMrPc3H3MzKy1nMNmZq3nLM7PDQ5mltsqrzlsZtZS\nzmEzs9ZzFufnBgczy83dx8zMWss5bGbWes7i/PxNmVlu7j5mZtZazmEzs9ZzFufnBgczy83hambW\nWs5hM7PWcxbnNygNDjfv8qZC+4+PGaXOc7WOKlzTdt0fSp1Ls6NwTXeXSp1r2zX3FK5ZOfPvC9d0\nn1S4BID2X36ocM0XDvxyqXN9QV8rXNM2rtz3fsH3Ti9c0/3L4uc5jVuLFwG/VkeJqmtKnauHw3XD\nddsu+xSu+UBcXbhmto4sXAPQNv++wjW6pHgOQ7ks3p6HCtc8celOhWsAuo8rXtP+mwmlzvXl/b9Y\n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\n+8b/K1zTdUrx/wY/ru8XrgH4Il8uXLOHlhERxS+S7P/ltuXVoxVq695hi5rnSctiXsDaZTG/Urn2\nu6RNyVaQeBNp7feIWJJqzyBbxWI1a5fFfDvwG+AesiEWAZyZllRD0jTgloi4uOo6jgbOBLqBn0bE\nGcW+jQ1LmRwG0CXFs6fr7aX+82KbrurOLo1t2fZsqXM9pNcXrml/sPj3d96unylcA/BZ/W/hmrZa\nzW05aFLx/Onq+mSpc02Pmqss9ukT515euKbrtHL/DR5b4ns/my8WrtmUA3m1ZpXK4iI5DPWz2Fqj\n1D1xiRyGcllcJoehXBYPVg5DuSwuk8NQLovL5DCUy+LBymEol8VlchjgLM4qXLOrHm/pPfHGxEMq\nzCy37q7mIqO/136PiJuh/jTBEXFsne0zgBm5L9zMbIhoNofNzKx5zuL8/E2ZWX7uGmZm1lrOYTOz\n1nMW5+YGBzPLz+FqZtZazmEzs9ZzFufmBgczy2/NRj0Ezcys9ZzDZmat5yzOzQ0OZpbfmlZfgJnZ\nRs45bGbWes7i3Lwsppnl92LOh5mZDYy8OewsNjMbOE3msKRDJS2SdL+k02q8P1zSTEmLJd0iaVTF\ne2ek7QslHdLomJKmSXpQ0l2S5knaJ23fQ9LvJb0oaVLF/ptKui3tf4+k3gney3APBzPLb3WrL8DM\nbCPnHDYza70mslhSG3AhcBDwGDBX0jURsahit+OBpyJitKQJwLnAREl7ka3oticwErhR0mhADY55\nSkRcXXUpTwL/DhxeuTEiVkk6ICJekNQO3Czp5xFxe5nP6x4OZpZfV86HmZkNjLw57Cw2Mxs4zeXw\nOGBxRDwcEauBmcD4qn3GA5em57OAA9Pzw4CZEbEmIpYAi9PxGh1zvb/3R8QTEXEnNQaIRMQL6emm\nZJ0Uou6nacANDmaW35qcDzMzGxh5c9hZbGY2cJrL4R2BpRWvl6VtNfeJiC7gGUlb16h9NG1rdMyz\nJc2XdJ6kTRp9PEltku4ClgM3RMTcRjX1uMHBzPLzTa6ZWWv1Q4PDAI0dnipphaQ/VB3r3LTvfElX\nStoybd8vjQ/ueRyeto+UdJOkBWns8EllvyozswHTXA7XWuKiugdBvX2Kbgc4PSL2BPYDtgHWy/31\nCiO6I+JNZMM23pKGcpTiORzMLD83JpiZtVaTOTwQY4cjIoBpwLeBH1adcg7ZzW63pK8AZ6THPcC+\n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\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAABBwAAAIhCAYAAADtr6lMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmcHFW5//HPdyYE2beAQcIewnrZQa+CGUE2RQLIrhAB\nwXu5XHC5Pxa3JLggeFUUxSsYEIQYEJBNNhHDvoQ1QAKJaIAQiEBYRDQkk+f3R9UkTad7uk71zPTA\nfN+vV73Sfeo8daorydM1Z06do4jAzMzMzMzMzKwntbX6BMzMzMzMzMzsvccdDmZmZmZmZmbW49zh\nYGZmZmZmZmY9zh0OZmZmZmZmZtbj3OFgZmZmZmZmZj3OHQ5mZmZmZmZm1uPc4fAeIekCSacVrPtX\nSbv09jlVtTlS0nN92aaZWV9yHjYzaz3nYrP+xR0OdUiaKektSW9IekXStZLWKhjrRFJbtPoEypB0\nmqQpkuZL+marz8dsoHAe7hXvujwsaXVJEyQ9L+lVSXdI2rHV52U2UDgX94p3XS4GkHSrpL9Jek3S\nw5L2afU5Wf/nDof6AvhkRKwIrAn8DTi7YKx4lyaSdwNJ7X3c5Azg/wHX9XG7ZgOd83A/1cd5eHng\nfmAbYFXgIuD3kpbtw3MwG8ici/upFtwTnwAMjYiVgS8AF0t6fx+fg73LuMOhewKIiLeBy4HNFu2Q\nBkv6X0nPSHpB0s8lLZ3fAF0PfEDS3/Pe4KGSdpB0d/7bmeclnS1pUOkTk7aR9KCk1yVNBN5XtX/v\nvOfxVUl3Svq3Osepe16Sfirpf6vqXyPphPz1mpIuz3s6n5b03xX13ifpV5LmSnoc2KHB59ld0pP5\nefxM0iRJR+X7Ruef4YeSXgHGKPP1vNf9xbytFfL6S/SmVw6ZkzRG0m8lTcz/fh6QtGW9c4uIX0fE\nTcCb3X0GM+sVzsMDPA9HxF8j4qyI+FtkzgMGAxt393nMrEc5Fw/wXAwQEY9HxMKKokHA2t19HjN3\nOBSQJ8yDgXsqis8EhgNb5n9+APhmRLwF7AXMjogVImLFiHgR6AS+SPbbmX8HdgGOK3k+SwG/Ay7M\nj/db4NMV+7cFxgPH5Pt/AVyTx1Xr7rwuBA6pOO5q+f4JkgRcCzxM1tu9K3CipN3y6mOB9fNtD2B0\nN59ntfwznAysBjyVn0ulDwJ/BlYHvgMcCRwBjAQ2AFYAflZRv1Fv+j7ApcAqwG+AOyXNkTSlQVxD\nkjryL7aH8j//qYJDziQdJulRSY80+FK8OP8ymiLpl6ro4a5o/3FJf8rLhikbBjdV0mNdX5A9QdIK\nkmZJ+klPHdOsmvPwouO+l/PwVSrw2zpJWwNL5ediZn3IuXjRcQdsLlb2SM0/gXuBP0XEAw2ObwNd\nRHirsQF/Bd4A5gLzgVnA5hX73wTWr3j/78Bf8tcjgWcbHP9E4IqS57YzMKuq7C7gtPz1OcC4qv1P\nAjtXfLZdipwX8ASwa/76v4Dr8tcfBGZWxZ4CjM9fPw3sVrHvmHrXBDgcuKuq7FngqPz16Bpt3QL8\nR8X7EcA8sk60Ja5/5WcGxgB3V+wT8HLezpRurvuvyb5AU/6uVsmP/b5a/8ZqlH0IWCl/vSdwb53j\n7lnxegLwhfz1Svnf2Vr5+yH5n0OBrfPXy5N9gW3SQ/9XzgIuBn7SE8fz5q1rcx5e9H6g5OHZwEca\nXPcVgSnASa3+9+nN20DZnIsXvXcuXlyvnazz5MRW//v01v83j3Do3qiIWJVs6OZ/A7dLWkPS6sCy\nwIP58Ki5wA1kPZE1Sdoo7xF8QdJrZD2SQ+rU/bkWDz07pUaVDwDPV5U9U/F6XeArXecm6VVgWB6X\nel4XAZ/NX382fw+wDrBWVRunAmtUnOOsOudX6/NUTyg0q+p99f4PVB3zGbLfeBV9jmzR8SIigL+Q\n/Z0uImkDSTdImizpNrIe41QHADdExL9q7Fuixzki7o2I1/O39wI1J2WKiBsr3t5P9vcLcBjZl+Pz\neb2X8z9fjIhH8tdvAtO6jl39OSWNKPrhJG1H9nd+c9EYs0TOwwMnD8+ixvXpIul9wDVkN8dnFmzD\nzHqGc7FzMRX1OiN73HhPSXsXbMcGKHc4dK/rebWIiN+RDbXaiew31m+R9e6umm8rR8RKeVytoUs/\nJ/shb8PIJlr5Wtfxq0XEf8bioWffq1HlBZb8QXSditfPAd+pOLdVImL5iLi0xHldDIxS9jzXJsDV\nFW38paqNlSLiU/n+2bzzma51a33Wis9T/fzXsKr31dd0dtUx1yXrdZ8D/IOKzoN8WNjqVfFrV+xX\n3t6cqjrnAsdHxA5kk0Z+sJvPUM8hZMPTaqn591/h82Rf2nUpe7bw8Ip6I4BVJf0p70A4vEbMesDW\nwH15UfXn/HmD8+o6joD/zWMafRazspyHB1Yenl3r5CQNBq4CnouI/+jmc5hZ73Audi6uZRCwYcG6\nNkC5w6EgSaOAlYGpee/fecBZec8uktaStHtefQ6wmqQVKw6xAvBGRLwlaRPgP5s4nXuABZL+W1K7\npP2ByiXCzgP+Q/myYZKWk/QJScvVOFa355X/pvwBsscJroiIefmu+4E3JJ2kbDKcdkmbS9o+3/9b\n4FRJK0saBhzfzef5PbCFpH3y4xxP417Z3wBfkrSepOXJeqEnRjaRzXTgfZL2yn8g/zpZj3yl7STt\nmyfeLwH/Inv2DsiuGfBh4LeSHib7oXwZYClJByqbB2FKxfaYpHd0DkgaCmwB3FRR9lNl8ys8DKyp\nbJ6HhySdWhX7MbJn8k5ucB3OAW6LiLvz94OAbcmemdwT+Iak4RXHXZ5ssqcTI+LNGp/zF+TXXtJ+\nDT7nccDvu0ZT4E4H62XOwwMiD99b3UgefwXZDzWjG5yTmfUy5+IBm4s3lrRn/hkHSfos2SMttzU4\nPxvoaj1n4W3R803/IHtm7XWyZ0YPqdg/mOw/9NPAa2TPdR1fsf+XZL2+c8men9+ZrNf0DbL/mGOB\n25s4v22Bh/Jz+02+nVaxf3eyBDiXbKjZpcBy+b6/sPjZrYbnBXyGrCf7o1XlQ8nmD3gBeAW4u+K4\ny5BNsPMq8DjwFbp5hi8/36fy+j8le/7uM/m+0TXOSWRJ81myL7MLyec+yPcfQdY7+yLw5arPPAa4\nLL9mbwAPAluR9QhPyeusADyfv74AWJhfg67tiAJ/RycA/9fN/r/UKd+SbCnODRsc/5vAlVVlJ1Mx\nz0T+7/DT+etBwI1UPG9X+TlL/Bu8GJiZX9uXyP4ffLfV/3e9vXc2nIcr2xoQebjOeX00/+xvAn/P\ntzdo8IyxN2/eemZzLn5HWwM5F29C1hHxen4t7wP2afW/T2/9f1NErZFOZotJ2hn4dUSs10ftiez5\nscMiosd7TSWNIfth/oiq8vWAayPi3/L3dwJnRcTl+fstI6LwKhaS7gFOqfcZJP01ItavKlsH+CNw\neEQs0btcUe/zZCMgdonFPezkPfJnk41uWJrsy+DgiJgq6SLg5Yj4ctWxmvqcecxoYLuI6LHVL8xs\nsYGSh83M+jPnYrN0fqTCuqVs2aATyYak9WY7u0taSdLSZM/MQY3hXL3Y/gSy3ugRkp6VdCRZL/bR\nypaofJxs2aCix1sXGNbgy6FWb983yJZjOid/9OL+imP+Pn9MA7LnDNcA7s0fyfg6QEQ8SfYIxxSy\n63du3tnwkfzz7KLFS3bumR/rs2U/p5n1voGSh83M+jPnYrNyBrX6BKz/yn9b/gDZ3AY/7uXm/p1s\nKNpSwFSy2ZDndR/ScyLisDq79ip5vGdYctKf6job1Cg7hmy5pFr1P1nxutb60V37/pdsMsfKsrvI\nljCqVX8mJT9nxTEuJBvCZ2Y9aCDlYTOz/sq52Kw8P1JhZmZmZmZm1kfykcZnkT1xMD4izqjaP5hs\n6dXtyOZAOTgins33nQocBSwgm5vt5rx8PLA3MCcitqw41pnAp4B5ZHOtHBkRbzQ4Vs3zyx9Bnwis\nQjZ3yuERsaC7z+pHKszMzMwGkHym+SclTZe0xGpIkgZLmihphqR78vmFuvadmpdPq1iJAEnjJc2R\nNKXqWGfmdR+RdEXXagWSPi7pAUmPKlvG+WM1zuOa6uOZmb3bSWojmxB0D2Bz4NB8FE2lo4G5EbER\n2Q/+Z+axmwEHAZuSjVA+J5/rA7KJ7veo0eTNZEvXbk02Mf2p3R2rwfmdAfwgIjYmmyT26Eaft9cf\nqZDkIRRm/UhElFq+cmUpXi9e/Zm+mlDJGnMeNut/yuTixDwMNXJxxY3krmQz10+WdHU+B1CXRTe6\nkg4mu9E9pOrmdBhwi6SNIhsuewHZpMUXVZ3DzWQTKC+U9D2yG91TyVY32jsiXpS0Odn8Q8MqznM/\nslnz3zOci836lxbeE+8IzMgfwUbSRGAUUJmHR5GtIgLZkvZn56/3IVv2dAEwU9KM/Hj3RcSd+Txy\n7xARt1S8vRf4dINjqZvz2wU4NI+/kGw1l190dwH6ZA6HPy3csWb5r8bO4nNjhy1R/rFn7izX0C3p\nHyemlRzk8UqJmG6+NsdOg7Gb1t5X5ttpxpVLXtdGrmPvEi3Bru/4N1zMRiv8ue6+77wNX6teITi3\nzBbJTfHje49NDwJmlvh5+Sdz0hdpiEuWrb/zprGwx9iauzb9ysPJbU3TdskxXV4Hvl2w7tezJUat\nHxkVl9Qsf3LsFWwy9tM19/04TkxuZ50nXk6OAbh6890bV6qy3+03lmpr1Mjf1Czv7loMj6eT2/n+\nE99MjgG4ZYuPJMesyQul2vpTLPFLZQCuH/sQnxi7bc19J2xWbr606VO7ndampjUW/i05Zv/2K5Jj\nANaO5+rue2Ts79l67CeXKP/VsP9Kb6hjDzThpvQ40vIw1M3F/eJGNyIerajzhKSlJS0VEfMlLQd8\nCTiWbMm+94yDFl5Qs/zxsVexxdh9lyg/r7PmtE4NrXBrtyOca7pwt4NKtXXk9ROTY0Z+sn7+njn2\nYtYb+9klyodH/XvH7pz35/R7s9s32qFUWyvxWnLMpXFI3X13jL2NnceOrLnveyPGJbf19PQ1k2PW\nfGtOcgzAsct1+zNoTd39Hf9p7F18bGzt78cxQ7+f3JbSv14W6YF74rWAyi+dWWS5tGadiOiU9Lqk\nVfPyeyrqPZ+XFXUU2TKoXW3UOpZqnZ+k1YBXI2JhRfkHGjXY1CMVjYbkmdl7y1IFN+tbzsVmA0fR\nPNxNLq51o1t9s/qOG12g8ka3MrbMje4N1YWSDgAejoj5edG3yCY//mfCsVvKedhsYKmXd58FJlVs\nddQaWVH9O+Z6dYrE1m5U+howPyK6OhxS21CNfQ3bLj3CoeCQPDN7D/GyNv2Pc7HZwNJdHv4z2Wxg\nDbT6RndCVfnmwOnAbvn7rYDhEfHlfHKyUkOe+5LzsNnAUy8Xb5xvXeqMA58FrFPxfhhZ7qj0HNmK\nd7MltQMrRcSrkmbxzpXwasUuQdJo4BNkj0RUnketY6nW+UXEy5JWltSWj3Io1HYzIxwWDcnLe6S7\nhuQVtnXHik00/97SMaTVZ9B/7Fxz8cYBasOOVp/BO3iEQ7/UVC4e0lHnWa4ByNdisY060ofdvpcN\n7dio1aewSHe5d1Oy6cm7tjpSbnSpvNGl/s1ptypudA+rKh8GXEk2y/nMvPjfgW0l/QW4Axgh6dZG\nbbRY0/fEa3RUzxc3cK3csWXjSgPEOh1+QrXLeh3pj+X1pibviScDwyWtm69GcQhwTVWda4HR+esD\nga48eA3ZnDqDJa0PDAfur4hbYhRCvuLEScA+VUus1jtWrfO7Oo+5NT8f8vO7mgaa6XAoMiSvW+5w\nWKxj9VafQf/xUXc4LDa8o9Vn8A7LFNysTzWVi4d0bNbjJ/Ru5WuxmDsc3mlox4hWn8IiRfNwN7m4\nX9zoSloJuI5sQsl7u8oj4v8iYlhEbADsBDwVEZW/keuPmr4ndofDYu5wWGzdjvVafQr9xvod6zSu\n1IeaycP5o2rHk02q+wTZ3DjTJI2T1NVfPB4Yks+V80XglDx2KtncNlOB64Hj8ol7kTQBuJuso/ZZ\nSUfmxzobWB74g6SHJJ3T3bHqnF/XiK1TgC9Lmg6smp9nt5oZIV14WN2vxs5a9HrrjhXd0WDWR/4x\n6QHemvRgjx3Pj1T0S4Vy8ZNjF0+kN6RjU/9wbdaHJs3LNgCmlJv4rkuzeTiffKzrRrJrffVpksYB\nkyPiOrIbyF/nN7qvkHVKEBFTJXXdnM5nyRvdDmA1Sc8CYyKia+WKwWQ3ugD3RsRxZDezGwLfkPRN\nsry1e0SUm3m2tQrfEz8+9qpFr9fo2MQdDWZ9ZNLb2dZTeiAX38g7n74gIsZUvJ5HtipQrdjTyR5F\nqy4/rEZ18qU1651HvWMtcX55+V+BD9Y7Xi3NXKsiQ/IAaq5EYWa9b7mO7VmuY/tF718ed25Tx/Pj\nEv1SoVxcb/UFM+t9HUtnGwBbDmfc4+mrnnTpiTzcH250I+I7wHcanOczwLvh192F74lrrURhZr2v\nY3C2dRn3VnPH8z1xcc10OCwakge8QNb7fWj3IWb2buYRDv2Sc7HZAOI83C85D5sNMM7FxZW+VvWG\n5PXYmZlZv+Pe3P7HudhsYHEe7n+ch80GHufi4prqnKn3bIeZvTc5ufZPzsVmA4fzcP/kPGw2sDgX\nF+fRIGZWmBOGmVlrOQ+bmbWec3FxvlZmVph7c83MWst52Mys9ZyLi1O+mlHvNSDFwocTg8qe0oXp\nIdqrXFPx3fSYX95erq3Pb5oe86cnPpQc03HDfekNAYNuXJAc88aZ5f6bzlt6cONKVZ7W8FJtbUD6\nLOK7L7w5OebhlXZKjgFgeIn/KI+0ERG1lu9qSFLcWbDuTlC6Het5kmJkXJ8ctzPpSeu5WDs5BuCy\nN2pOiN+tz654Sam2ruhMX7Fj7k1rJcfofeW+zA7c9aLkmM/Fr0q1dei83yTHvH7VmqXa0usLk2Oe\nP3bV5Jg/qSM5BmD7SF9CeMQ2sxpXqvbhPdDPbyqVI1PyMDgX9zdlcvGH4+5SbU1nRHLMNXP3KdXW\nvqte1bhSld8+fXh6Q/eV+6esTdJz8T7bTSzV1rfjG8kxIztvK9XW3BvTVwHUP9Lz8F8OGpocAzCN\n9OW39/xbuWuhEmvZ6G/l86PvidN4hIOZFeaEYWbWWs7DZmat51xcnK+VmRXWzPAxSSOAS8nGMAnY\nAPhGRPykJ87NzGwg8DBeM7PWcy4uzh0OZlZYMwkjIqYD2wBIagNmAb/rifMyMxsofONmZtZ6zsXF\n+VqZWWE92Jv7ceDpiHiu5w5pZvbe59+qmZm1nnNxce5wMLPCejBhHAykz1ZnZjbA+cbNzKz1nIuL\n87Uys8Lq9ebem29FSFoK2Ac4pUdOysxsAPFv1czMWs+5uDh3OJhZYfWS68751uXH3R9mL+DBiHip\nZ87KzGzg8E2umVnrORcX5w4HMytsmaIZY0G3ew/Fj1OYmZVSOA9Do1xsZmYl9dA98YDgDgczK2xQ\nk8lV0jJkE0Ye20OnZGY2oBTOw+AbXTOzXtLsPfFA4g4HMytsqfbm4iPin8DqPXIyZmYDULN52MzM\nmudcXFxbq0/AzN49Bg0qtpmZWe8omoedi83Mek+zeVjSnpKelDRd0sk19g+WNFHSDEn3SFqnYt+p\nefk0SbtXlI+XNEfSlKpjHSDpcUmdkratKF9K0vmSpkh6WNLIvHz5/P1D+Z8vSfphvm+0pL/l+x6S\ndFTDa9WogplZl6WcMczMWsp52Mys9ZrJxZLagJ8CuwKzgcmSro6IJyuqHQ3MjYiNJB0MnAkcImkz\n4CBgU2AYcIukjSIigAuAs4GLqpp8DNgP+EVV+TFARMSWklYHbgC2j4g3gW0qzvcB4IqKuIkRcULR\nz9snX1tbbVV0wbzMSZxZqp3tt3ogOWZ6+7Ol2vrUOkqO+fzCzlJtPcTmyTHf4hvJMR/ba6/kGIAP\n7XVrcsycWKNUWxswOzlmx3iiVFt/nb1BcszvP/CJ5Jg9Vrw9OQZg4kP7JMd8ptkxTR4+9q51Ficm\nx9zBR5NjNmVacgzAhStvlxzzS61Vqq3OzvS4ez6xbeNKVXb6xUPJMQATdxmdHNN+4hGl2jr3rMOT\nY44++OJSbf0P302O+YG+khxzEJclxwCISA/6YImGNi4RU8l5+F1tPA1/GfgON2mPUu1sEY8lx1wx\nZGipti7XcskxCzvT76Pv2HCH5BiAjj9OTo75XRxaqq32Hx6SHPPzL32uVFvHfvLC5JgzS9wLXKlP\nJ8cA7MSdyTG3r1Hu73jkIel/x/ykVFOLNZeLdwRmRMQzAJImAqOAyg6HUcCY/PXlZB0JkC0tPzEi\nFgAzJc3Ij3dfRNwpad3qxiLiqbyd6v94mwF/zOu8JOk1SdtHxKIfqiVtBKweEXdVxCX9B/YjFWZW\n3KCCm5mZ9Y6iedi52Mys9zSXh9cCnqt4Pysvq1knIjqB1yWtWiP2+RqxRT0KjJLULml9YDtg7ao6\nhwCXVpXtL+kRSZdJGtaoEX8dmVlxzhhmZq3lPGxm1np1cvGkf2VbA7VGCFQPs6tXp0hsUeeTPZox\nGXgGuIsl19U4BPhsxftrgAkRMV/SF4ALyR4NqctfW2ZWnDOGmVlrOQ+bmbVenVzcsXy2dRn3Rs1q\ns4B1Kt4PgyWeG3+ObLTBbEntwEoR8aqkWbxzFEKt2ELykRNf7nov6S5gRsX7LYH2iHi4IubVikOc\nB5zRqB0/UmFmxS1dcDMzs95RNA87F5uZ9Z7m8vBkYLikdSUNJhtFcE1VnWuBrkmdDgS6Js27hmzy\nyMH5YxDDgfsr4kT3cyws2idpGUnL5q93A+ZXTVx5KPCbdwRLlZO9jAKmdtMW4H5yM0vhjGFm1lrO\nw2ZmrddELo6ITknHAzeTDQAYHxHTJI0DJkfEdcB44Nf5pJCvkHVKEBFTJV1G9oP+fOC4fIUKJE0A\nOoDVJD0LjImICyTtSzbp5BDgOkmPRMRewBrATZI6yeaCqJ5J+kCgekb8EyTtk7c9F/hco8/rry0z\nK86zo5uZtVYP5GFJewJnsfhG94yq/YPJllXbDngZODgins33nQocRfac74kRcXNePh7YG5gTEVtW\nHOtM4FPAPOBp4MiIeEPSx4HvAUsBbwMnRcSfJC0D/BbYMG/j2oj4avOf2sysBzWZiyPiRqrWLYqI\nMRWv55Etf1kr9nTg9Brlh9WpfxVwVY3yZ4BNujnH4TXKvgok5WQ/UmFmxXlmdDOz1mpylYqK9d/3\nADYHDpVUfcO5aP13so6JM/PYyvXf9wLOqVhm7YL8mNVuBjaPiK3Jng0+NS9/Cdg7IrYi+w3Zryti\nvh8Rm5KtA7+TVHJtSDOz3uJ74sLc4WBmxTm5mpm1VvPLYi5a/z0i5gNd679XGkU28zhk67/vkr9e\ntP57RMwk60DYESAi7gRerToOEXFLRCzM395LNsEZEfFoRLyYv34CWFrSUhHxz4i4LS9fADzUFWNm\n1m/4nrgwdziYWXHtBTczM+sdRfNw/VzcyvXfjwJuqC6UdADwcN4BUlm+MtnjGH9MaMPMrPf5nrgw\n97uYWXHOGGZmrdVNHp70WrY10JL13yV9jWwG9AlV5ZuTPYu8W1V5OzABOCsfTWFm1n/4nrgwXyoz\nK84Zw8ystbrJwx1Dsq3LuGdqVuvz9d8ljSab6XyXqvJhwJXA4TU6Fc4FnoqIsxsd38ysz/meuDBf\nKjMrzuu6m5m1VvN5eNH678ALZEutHVpVp2v99/tYcv33SyT9iOxRiobrv+crYpwEfDSfdb2rfCXg\nOuCUiLi3KubbwIoRcXQTn9PMrPf4nrgwz+FgZsV5ghwzs9ZqctLIfE6GrvXfnyCbBHKapHGS9s6r\njQeG5Ou/fxE4JY+dCnSt/349S67/fjcwQtKzko7Mj3U2sDzwB0kPSTonLz+ebOnLb0h6ON83RNJa\nZEuubVZRflRzF83MrIf5nrgw5d8TvdeAFCv9q+Fou3foGPynUm2Na/9scsyWnZ2l2tIX0/tqFg6u\n9ehjY1t8f3JyzErxenLMfeM6kmMAlv7SEpNSN/TRle4o1dbecV1yzJq8UKqtT5Pe1ipvv5gcc8Dg\ny5NjAP6uFZJjLtORRESpf4iSIvYvWPdKSrdjPU9S6PD0XPeHC3dKjtntxDuTYwA6f5z+z6WtZJf5\n2gunJ8dspPSY4xf+LDkG4NOjl5hTr6FYt+R/twnp9wC6slxTvJbeVufI9M+1U8n5Be8cv1vjSlXU\neL6EJa23BzrwplI5MiUPg3NxfyMp9L20XHzXSduVausjox9Mjum8sNw/lTK5eI2FtZ/36c6uKvd/\n+5g4L72tH99Tqq0YUuIaXlTuZzGdO79xpWqvpf8E3LlVuX8XB71jpdtiLjt3dKm29HKJmK+Xz4++\nJ07jfhczK86z7ZqZtZbzsJlZ6zkXF+YOBzMrzhnDzKy1nIfNzFrPubgwXyozK84Zw8ystZyHzcxa\nz7m4MF8qMyuuyeFj+azkvwS2ABYCR0XEfc2fmJnZAOFhvGZmredcXJg7HMysuOYzxo+B6yPiQEmD\ngGWbPqKZ2UDiOzczs9ZzLi7Ml8rMintf+VBJKwA7R8TnACJiAfBGj5yXmdlA0UQeNjOzHuJcXJg7\nHMysuOaGj20AvCzpAmAr4AHgxIj4Zw+cmZnZwOBhvGZmredcXFjJVczNbEAaVHCrH70t8LOI2BZ4\nCzild0/YzOw9pmge9q+UzMx6j/NwYe5wMLPi6iTTSbNh7L2LtzpmAc9FxAP5+8vJOiDMzKwodziY\nmbVek3lY0p6SnpQ0XdLJNfYPljRR0gxJ90hap2LfqXn5NEm7V5SPlzRH0pSqYx0g6XFJnZK2rShf\nStL5kqZIeljSyIp9f8rP72FJD0ka0ui8urtUZmbF1Bk+1rF+tnUZd9eSdSJijqTnJI2IiOnArsDU\n3jhNM7P3LA/jNTNrvSZysaQ24Kdk98KzgcmSro6IJyuqHQ3MjYiNJB0MnAkcImkz4CBgU2AYcIuk\njSIigAuAs4GLqpp8DNgP+EVV+TFARMSWklYHbgC2r9h/aEQ8XBVT87y6+7we4WBmxTX/W7UTgEsk\nPUI2j8OqSyfyAAAgAElEQVR3e/FszczeezzCwcys9ZrLwzsCMyLimYiYD0wERlXVGQVcmL++HNgl\nf70PMDEiFkTETGBGfjwi4k7g1erGIuKpiJgBqGrXZsAf8zovAa9JquxwqNVXUH1eu9b9lDl/HZlZ\ncU1mjIh4FNihR87FzGwg8p2bmVnrNZeL1wKeq3g/i7zToFadiOiU9LqkVfPyeyrqPZ+XlfEoMErS\npcA6wHbA2mQTuwOcL6kTuDIivl3nvF6TtGpEzK3XSJ98bd201O6NK1W4of3xUu1s+Zv0mEnt5cbD\ndDzZuE61Yzf6cam2/s4KyTEr81pyzIIPl/vn8NcV358cs1pn3X+T3epon5Qcc2xUjx4qpn3/9Jh4\n39DkmPFXH5/eELDq358vFdcU3+i+a33zwlOTYx7j35Jj4sjqzvNi2tu/UyLqv0u1tY0eSo65f4n7\ngMau097JMQCxoMQ13LpUU7BFelvxZsm2Xkxvq33phckxP513cXIMQPsmnckxC5crcQ+R/pX+Ts7D\n72rfPCktF1/KQaXaif8u8f+tfVyptmBMcsSeuiE55nG2SI4BuIG9kmPi0XLfZRxcIuaEck3FoPT8\nyMvpg9vb9yjRDnDDzb9Mjhl67F9LtTXn1vUbV+ppzeXiWv/AomCdIrFFnU/2aMZk4BngLmBBvu+w\niHhB0nLAlZI+GxEX12hfjdr315aZFbd0q0/AzGyAcx42M2u9Orl40p9h0tMNo2eRjSjoMoxsLodK\nz5GNNpgtqR1YKSJelTQrL+8utpCI6AS+3PVe0l1kj2gQES/kf/5D0gSyERgX5+deeV4rRsQSj3FU\ncoeDmRXnjGFm1lrOw2ZmrVcnF3dskm1dxt1cs9pkYLikdYEXyCZdPLSqzrXAaOA+4EDg1rz8GrL5\n0H5E9njDcOD+ijhRexRE5f7shbQMoIh4S9JuwPyIeDLvSFg5Il6RtBSwN/CHivZrnVdd/toys+I8\nO7qZWWs5D5uZtV4TuTif++B44GayiRnHR8Q0SeOAyRFxHTAe+LWkGcAr5CtBRMRUSZeRrfQ2Hzgu\nX6GCfCRCB7CapGeBMRFxgaR9yVavGAJcJ+mRiNgLWAO4KZ+n4Xng8PwUl87LB+Wf9BbgvHxfzfPq\njjsczKw4Zwwzs9ZyHjYza73mJ1K/Edi4qmxMxet5UHsSl4g4HTi9RvlhdepfBVxVo/wZYJMa5W/x\nzuUxK/fVPa96/LVlZsU5Y5iZtZbzsJlZ6zkXF+ZLZWbFeSivmVlrOQ+bmbWec3Fh7nAws+KcMczM\nWst52Mys9ZyLC/OlMrPinDHMzFrLedjMrPWciwvzpTKz4pwxzMxay3nYzKz1nIsL86Uys+KWbvUJ\nmJkNcM7DZmat51xcmDsczKw4Zwwzs9ZyHjYzaz3n4sLaWn0CZvYu0l5wMzOz3lE0D3eTiyXtKelJ\nSdMlnVxj/2BJEyXNkHSPpHUq9p2al0+TtHtF+XhJcyRNqTrWmXndRyRdIWnFvPzjkh6Q9KikyZI+\nVhGzraQp+fmdVeYymZn1Kt8TF+YOBzMrblDBzczMekfRPFwnF0tqA34K7AFsDhwqaZOqakcDcyNi\nI+As4Mw8djPgIGBTYC/gHEnKYy7Ij1ntZmDziNgamAGcmpe/BOwdEVsBnwN+XRHzc+DzETECGCGp\n1nHNzFrH98SFKSJ6twEpOqeoccUKg05bUKqtzsvS2gFYn2ml2joiLk6OGafvlGrraa2VHPObOCw5\n5ut8PzkG4Hw+kxxzzG3p1w+gc2T63/GX9L1SbV2/cK/kmKe0VXLMAXFJcgzAle3DSkR9jIhIv4hk\n/5fjtoJ1R1K6Het5kkITO5Pj/nbQ8skxq/GP5BiAtrYbk2M0tNzPIJ2z0/9ptv0svR2dcF56ENDZ\neUxyTNuHy/1308np9wCdo0o1Rds3089RI0qc32eTQwCYxgbJMf/D/ybHbMf7+XbbzqVyZEoehtq5\nWNKHgDERsVf+/hQgIuKMijo35nXuk9QOvBARa1TXlXQDMDYi7svfrwtcGxFb1jn/fYFPR8ThNfa9\nBHwAWA24NSI2y8sPAUZGxH8W/+T9k6TQ5Wm5eME25X5i0frpOb+t7ZVybX1oteSYzrvT22m7MD0G\nQEfdkRzT2blzqbba9k+P0ZnlfhbrHF7iu+zcEnl4y5Ln96H0mJkaWqqt8+Oo5Jhvt33P98R9xP0u\nZlach4aZmbVW83l4LeC5ivezgB3r1YmITkmvS1o1L7+not7zeVlRRwETqwslHQA8HBHzJa2Vn1Pl\n+aX/5sXMrDf5nriwpjocJM0EXgcWAvMjovoLy8zeS9xF2S85F5sNIN3k4UkPwqSHGh6h1m/aqn+F\nWa9OkdjajUpfI8tPE6rKNwdOB3ZLOL9+x3nYbIDxPXFhzV6qhUBHRLzaEydjZv2ck2t/5VxsNlB0\nk4c7PphtXcaNr1ltFrBOxfthwOyqOs8BawOz80cqVoqIVyXNysu7i12CpNHAJ4BdqsqHAVcCh0fE\nzIrzS26jH3AeNhtIfE9cWLOTRqoHjmFm7xZLF9ysrzkXmw0URfNw/Vw8GRguaV1Jg4FDgGuq6lwL\njM5fHwjcmr++BjgkX8VifWA4cH9FnKgaoSBpT+AkYJ+ImFdRvhJwHXBKRNzbVR4RLwJvSNoxn5Dy\nCODqbq5If+E8bDaQ+J64sGYTYwA35csZpc9yZWbvLp6Rt79yLjYbKJpcpSIiOoHjyVaPeAKYGBHT\nJI2TtHdebTwwRNIM4IvAKXnsVOAyYCpwPXBc5LOPS5oA3E22qsSzko7Mj3U2sDzwB0kPSTonLz8e\n2BD4hqSH831D8n3H5ecwHZgREemzyvY952GzgcT3xIU1exk+HBEvSlqd7ItkWkTcWV1p3DmLH70b\nuQN07DCgJ+o060OP5FsPceLsrxrm4vjtuMVvNhuJNu/o2zM0G8BemfQ4cyc9AcCbpK/+8g49kIfz\nH+A3riobU/F6Htnyl7ViTyebc6G6vObyWPnSmrXKvwPUXL4rIh4E/q3O6fdXhe6J49KKXLz5SLRF\nR9+dodkANnPSMzwz6dmeO6DviQtr6lLlw96IiJck/Y5sluMlkuuY49zBYNYaW+dbl5JrSnVpckZe\nT6rVO4rkYh04plaomfWB1Tq2YLWOLYBsWcw7Trug/ME8M3q/VPSeWAc7F5u1wnod67Jex7qL3t9x\n2l3NHdC5uLDSj1RIWlbS8vnr5YDdgcd76sTMrB9qfvhY16Ra27izoWc4F5sNME0+UmE9z3nYbABq\nMg9L2lPSk5KmSzq5xv7BkiZKmiHpHknrVOw7NS+fJmn3ivLxkuZImlJ1rAMkPS6pU9K2FeVLSTpf\n0pT80baRefkykq7Lj/+YpNMrYkZL+lv+GNxDko4qcqnKej/wO0mRH+eSiLi5ieOZWX/X/A2sJ9Xq\nec7FZgOJOxL6I+dhs4GmiVwsqQ34KbAr2So8kyVdHRFPVlQ7GpgbERtJOhg4k2zS3s3IHnnblGwV\nn1skbZTPp3MB2bw5F1U1+RiwH/CLqvJjgIiILfPHwW4Ats/3fT8ibpM0CLhV0h4RcVO+b2JEnFD0\n85a+VBHxV945VtvM3uuav9HtmlQrgHMj4rymjzjAORebDTDucOh3nIfNBqDmcvGOZBPiPgMgaSIw\nCqjscBgFdD2DdTlZRwLAPmQ/8C8AZuaT++4I3BcRd0palyoR8VTeTvU8B5sBf8zrvCTpNUnbR8QD\nwG15+QJJD5F1bnRJmi/BX1tmVljUeV5t0p0wqdijcIUm1TIzs9rq5WEzM+s7TebitYDnKt7PIus0\nqFknIjolvS5p1bz8nop6z+dlZTwKjJJ0KbAOsB2wNvBAVwVJKwOfAs6qiNtf0s5kKwl9OSJmddeI\nOxzMrLC331e7/MMfz7Yup51Zu17RSbXMzKy2ennYzMz6Tr1cfNvtcPsdDcNrjRCIgnWKxBZ1Ptmj\nGZOBZ4C7gAWLTkBqByYAZ0XEzLz4GmBCRMyX9AWyGel37a6RPulwaF/lH2kBXyu3qkU8kN7VdO0O\nG5Rq6wp9Ojnmmwu/Xqqtb4/ottOoJj39YHLMV94o11W3+3KrJsfEUuX+jp+PIY0rVfnhN14t1db0\nb41Ijolfbtu4UpXr9p+bHAOwcNYqyTFtwxrX6c6C9qLTLyxcokTSskBbRLxZManWuCUqWq848qBz\nkmMm6tDkmH8tPD45BkCzz0iOiTPL5ZGPxY3JMUsd8uHkmHOOm5QcA7Dim/umB/06PTcCfHzDa5Nj\n2u/6VKm2jjjt/5JjVuDvyTHtV/xPcgzAjz69W3LM7/98QHpDy+7Bt9OjFimeh6FWLrbW+ur+afeC\nV7FHqXamxVeSY5aeW+4+dd656TH78NvkmG1Hr5neEHDOEenfS6v866bGlWo5e+XkkCPXGl+qqfYH\nj0uOOfDY6kf7GxvB9OQYgPZLv5Ucc8nBHyrV1mkvfC85ppk8DPVz8Uc+lm1dvvPdmnl4FtmIgi7D\nyOZyqPQc2WiD2fkP/itFxKuSZuXl3cUWEhGdwJe73ku6C5hRUeVc4KmIOLsipvIHq/OAhjdwHuFg\nZoV1DiqaMt6uVehJtczMmlQ8D0OdXGxmZk1q8p54MjA8n2/hBeAQoPq3PNcCo4H7gAOBW/Pya4BL\nJP2I7FGK4cD9FXGi+zkWFu2TtAygiHhL0m5kS9Y/me/7NrBiRBz9jmBpaNeIZbJ5JqZ20xbgDgcz\nS9DZXv6BNU+qZWbWvGbysJmZ9Ywm74k7JR0P3Ey2etv4iJgmaRwwOSKuA8YDv84nhXyFrFOCiJgq\n6TKyH/TnA8flK1QgaQLQAawm6VlgTERcIGlfskknhwDXSXokIvYC1iCbzL2TbC6Iw/PjrAV8FZgm\n6WGyRzZ+GhHnAydI2idvey7wuUaf1x0OZlZYJ77RNTNrJedhM7PWazYXR8SNwMZVZWMqXs8jW/6y\nVuzpwOk1yg+rU/8q4Koa5c8Am9Qof546y9hHxFfJOiMKc4eDmRW2wDe6ZmYt5TxsZtZ6zsXFucPB\nzArrdMowM2sp52Ezs9ZzLi7OV8rMCvNQXjOz1nIeNjNrPefi4tzhYGaFvc3gVp+CmdmA5jxsZtZ6\nzsXFucPBzArz82pmZq3lPGxm1nrOxcW5w8HMCvPzamZmreU8bGbWes7FxflKmVlhfl7NzKy1nIfN\nzFrPubg4dziYWWFOrmZmreU8bGbWes7FxbnDwcwK8/NqZmat5TxsZtZ6zsXFucPBzArz82pmZq3l\nPGxm1nrOxcX1yZW6+gN7J9UftfbOpdrRWpEcs9+s35Vq6wxOTo75QdtXSrW1zvTpyTFvx6rJMcts\nmn79AIZd90pyzCkfHlOqrYN1aXLM0d8aX6qtwcxLjmnrTL+G/xqzSnIMgD5XKqwpHj727jWPpZNj\nxiwYlxwz9wdrJccAMCw9ZIcf3l6qqb9r+eSY51ZbOzlmP8p9v7x59+rJMUN2f65UW3/Yap/kmGMe\n/Umpth7VVskxZX6DdMinL0iOAfjPN85Ljpm3Zno7bU2mUefhd7cXlfaP5oLYulQ7133twPSgfUs1\nxUdPuik5psySgne8NTI5BuCIZS9Mjnn9mqGl2hpyUHouPn/Uf5Vq65Sr0++l79cOyTGTSY8B2P/g\nS5Jjdtadpdp6ec3lSkT9o1RbXZyLi3PXjJkV5uRqZtZazsNmZq3nXFycOxzMrLB5JX4jYWZmPcd5\n2Mys9ZyLi3OHg5kV5ufVzMxay3nYzKz1nIuLa2v1CZjZu0cn7YU2MzPrHUXzcHe5WNKekp6UNF3S\nEpNSSRosaaKkGZLukbROxb5T8/JpknavKB8vaY6kKVXHOjOv+4ikKyStmJevKulWSX+X9JOqmEMl\nTcljrpeUPjGVmVkv8j1xce5wMLPCnFzNzFqr2Q4HSW3AT4E9gM2BQyVtUlXtaGBuRGwEnAWcmcdu\nBhwEbArsBZwjSXnMBfkxq90MbB4RWwMzgFPz8n8BXwfeMaO2pPa8zZF5zGPA8cWujplZ3/A9cXHu\n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\nt+4xU5OXpbvKBMwBPpe2fxXYjFVLHC+PiHGS3gN8Epgr6V6yH+u+kv7uKM0dDmZWWKNwvavnRe7q\nqTtWOG/IJiprMsbsKOAnudfjyIZibAVsDvxW0qw006+ZWUfz5L1mZu3XahYPUcfvGsdM28c3OM4/\nAP9QZ/utMHh/2bjDwcwKazRebY/ujdmje+P+1z+c/FS93YZkorKBxpilYxxKNkFkn6OBGyNiJfCk\npFuBvwUW1f1wZmYdZBDmcDAzsxY5i4sblg6HP2jH5jvlPBF/Xamd8087s3zRibUrghRzwHHXVqqr\n4qon/650zT++qfxwm2euqLa86pZHP1K65puf/Wqltv7lB6c036nGLXpv853quIu9S9ccctj00jU7\namHpGoA/brpphapnm+8ygBbHDg/VRGUDjTE7AJgfEfmOjcfIZkq/TNLrgXcC327lg60N5uqtpWv+\nHG8oXfN/Tvlm6RqA9Sc9U7rmI4fOqNRWFd9bdHLpmlO2O7v5TnU8+eMxzXeqseWny+cwwKTTzi1d\nc/43/qlSWz0qf4f8Pav1FRbzkcOq/XfxRpUfWfXHjbcoXbM+GzffaQCtzuFg7VU2i6vkMFTL4io5\nDNWyuIsVpWt+uOSk0jUAJ41e44fgpqrkMFTL4kmnlM9hgPPPK5/Fw5XDUC2LN9PTldqqksXZYmjV\nOYuL8zdlZoV12ni1AmPMjmT14RQA/wZMlfRAej0lIh7AzGwt4CEVZmbt5ywuzh0OZlZYi2sOD/p4\ntWZjzCJijZnNI+LFRm2YmXW6VnPYzMxa5ywuzh0OZlaYx6uZmbWXc9jMrP2cxcW5w8HMCvN4NTOz\n9nIOm5m1n7O4OH9TZlaYx6uZmbWXc9jMrP2cxcW5w8HMCnO4mpm1l3PYzKz9nMXFucPBzArzeDUz\ns/ZyDpuZtZ+zuDh3OJhZYR6vZmbWXs5hM7P2cxYX52/KzArz7WNmZu3lHDYzaz9ncXHucDCzwl7x\nmsNmZm3lHDYzaz9ncXHucDCzwnz7mJlZezmHzczaz1lcnL8pMyvMt4+ZmbWXc9jMrP2cxcW5w8HM\nCnO4mpm1l3PYzKz9nMXFDUuHww8fPaHU/ieO+XaldlaeW76ma9nySm3Nuu+jpWt6365KbW04qnxb\nr1y4aemalSeVLgFgxKTtS9cc+P1rKrV1BueXrvlgXFupraseOrp0Te/fjChdsxXvLl0DcIIurlD1\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/src/mesh.F90 b/src/mesh.F90 index 137590e65c..cee29aa1ca 100644 --- a/src/mesh.F90 +++ b/src/mesh.F90 @@ -98,16 +98,16 @@ contains integer, intent(in) :: ijk(:) integer :: bin + integer :: n_x ! number of mesh cells in x direction integer :: n_y ! number of mesh cells in y direction - integer :: n_z ! number of mesh cells in z direction + n_x = m % dimension(1) n_y = m % dimension(2) if (m % n_dimension == 2) then - bin = (ijk(1) - 1)*n_y + ijk(2) + bin = (ijk(2) - 1)*n_x + ijk(1) elseif (m % n_dimension == 3) then - n_z = m % dimension(3) - bin = (ijk(1) - 1)*n_y*n_z + (ijk(2) - 1)*n_z + ijk(3) + bin = (ijk(3) - 1)*n_y*n_x + (ijk(2) - 1)*n_x + ijk(1) end if end function mesh_indices_to_bin @@ -122,19 +122,19 @@ contains integer, intent(in) :: bin integer, intent(out) :: ijk(:) + integer :: n_x ! number of mesh cells in x direction integer :: n_y ! number of mesh cells in y direction - integer :: n_z ! number of mesh cells in z direction + n_x = m % dimension(1) n_y = m % dimension(2) if (m % n_dimension == 2) then - ijk(1) = (bin - 1)/n_y + 1 - ijk(2) = mod(bin - 1, n_y) + 1 + ijk(1) = mod(bin - 1, n_x) + 1 + ijk(2) = (bin - 1)/n_x + 1 else if (m % n_dimension == 3) then - n_z = m % dimension(3) - ijk(1) = (bin - 1)/(n_y*n_z) + 1 - ijk(2) = mod(bin - 1, n_y*n_z)/n_z + 1 - ijk(3) = mod(bin - 1, n_z) + 1 + ijk(1) = mod(bin - 1, n_x) + 1 + ijk(2) = mod(bin - 1, n_x*n_y)/n_x + 1 + ijk(3) = (bin - 1)/(n_x*n_y) + 1 end if end subroutine bin_to_mesh_indices diff --git a/src/tally.F90 b/src/tally.F90 index 7bfd908c5f..3c3dc6a693 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -2327,6 +2327,7 @@ contains integer :: filter_index ! index of scoring bin integer :: i_filter_mesh ! index of mesh filter in filters array integer :: i_filter_surf ! index of surface filter in filters + integer :: i_filter_energy ! index of energy filter in filters real(8) :: uvw(3) ! cosine of angle of particle real(8) :: xyz0(3) ! starting/intermediate coordinates real(8) :: xyz1(3) ! ending coordinates of particle @@ -2351,9 +2352,10 @@ contains i_tally = active_current_tallies % get_item(i) t => tallies(i_tally) - ! Get index for mesh and surface filters + ! Get index for mesh, surface, and energy filters i_filter_mesh = t % find_filter(FILTER_MESH) i_filter_surf = t % find_filter(FILTER_SURFACE) + i_filter_energy = t % find_filter(FILTER_ENERGYIN) ! Get pointer to mesh select type(filt => t % filters(i_filter_mesh) % obj) @@ -2386,11 +2388,11 @@ contains ! Determine incoming energy bin. We need to tell the energy filter this ! is a tracklength tally so it uses the pre-collision energy. - j = t % find_filter(FILTER_ENERGYIN) - if (j > 0) then - call t % filters(i) % obj % get_next_bin(p, ESTIMATOR_TRACKLENGTH, & - & NO_BIN_FOUND, matching_bins(j), filt_score) - if (matching_bins(j) == NO_BIN_FOUND) cycle + if (i_filter_energy > 0) then + call t % filters(i_filter_energy) % obj % get_next_bin(p, & + ESTIMATOR_TRACKLENGTH, NO_BIN_FOUND, & + matching_bins(i_filter_energy), filt_score) + if (matching_bins(i_filter_energy) == NO_BIN_FOUND) cycle end if ! ======================================================================= From e5bde6f1c223be15908f9c1c6075460da6e1af17 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 16 Aug 2016 18:01:45 -0400 Subject: [PATCH 080/168] updated test results --- .../test_asymmetric_lattice/results_true.dat | 2 +- tests/test_filter_mesh_2d/results_true.dat | 868 +- tests/test_filter_mesh_3d/results_true.dat | 15332 ++++++++-------- tests/test_mg_tallies/results_true.dat | 2240 +-- tests/test_mgxs_library_mesh/results_true.dat | 144 +- tests/test_quadric_surfaces/results_true.dat | 2 +- tests/test_score_current/results_true.dat | 2 +- .../test_sourcepoint_restart/results_true.dat | 3420 ++-- .../test_statepoint_restart/results_true.dat | 3420 ++-- tests/test_tallies/results_true.dat | 2 +- tests/test_tally_aggregation/results_true.dat | 2 +- tests/test_tally_slice_merge/results_true.dat | 32 +- tests/test_track_output/results_true.dat | 2 +- tests/test_triso/results_true.dat | 2 +- 14 files changed, 12735 insertions(+), 12735 deletions(-) diff --git a/tests/test_asymmetric_lattice/results_true.dat b/tests/test_asymmetric_lattice/results_true.dat index a33b9c9e59..c2014a1912 100644 --- a/tests/test_asymmetric_lattice/results_true.dat +++ b/tests/test_asymmetric_lattice/results_true.dat @@ -1 +1 @@ -bc8bef8121f9b6470e4fea817a4e48eabb1ecba1f42761a4cbd77d71181bf9e1612df4a3d6ddfbcd08a3086ac873e5f3c3e560bf96b2b7c959a2f7aad7e4e08d \ No newline at end of file +280d08e4f4e6768f3100caff91a4c77d3a29ebc05353bdda47e3634f48e2ba2bd1d6a0030a00f97f2ea4c647c93155279697545cf2f951f71b58cfcd400c99de \ No newline at end of file diff --git a/tests/test_filter_mesh_2d/results_true.dat b/tests/test_filter_mesh_2d/results_true.dat index f4c5979526..e223464e5d 100644 --- a/tests/test_filter_mesh_2d/results_true.dat +++ b/tests/test_filter_mesh_2d/results_true.dat @@ -19,6 +19,82 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.486634E-01 +2.561523E-02 +5.574899E-01 +1.049542E-01 +7.713789E-01 +2.948263E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.149324E-01 +1.320945E-02 +2.001407E+00 +1.600000E+00 +9.572791E-01 +8.942065E-01 +0.000000E+00 +0.000000E+00 +2.501129E-02 +6.255649E-04 +1.484996E-01 +2.205214E-02 +3.079994E-03 +9.486363E-06 +1.090478E+00 +5.381842E-01 +4.235354E+00 +5.638989E+00 +3.267703E-01 +4.763836E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.465048E-02 +3.049063E-04 +7.159080E-01 +2.988090E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.984785E-01 +1.486414E-01 +9.889831E-01 +3.657975E-01 +1.492571E+00 +6.318792E-01 +6.314497E-01 +1.552199E-01 +2.034493E+00 +1.162774E+00 +1.252153E+00 +4.563949E-01 +3.452042E-02 +1.191659E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -39,6 +115,186 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.251028E-01 +1.306358E-02 +2.850134E+00 +2.250972E+00 +2.083542E+00 +1.599782E+00 +3.417016E+00 +2.972256E+00 +1.533605E+00 +8.644495E-01 +1.962807E-01 +2.410165E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.131352E-01 +6.756111E-02 +2.677440E+00 +2.382024E+00 +5.709899E+00 +7.095076E+00 +4.663027E+00 +5.641430E+00 +1.357567E+00 +4.362757E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.473499E-01 +1.206520E-01 +5.299733E-01 +2.205463E-01 +4.425042E-01 +5.854257E-02 +9.831996E-01 +4.846833E-01 +8.393183E-03 +7.044551E-05 +4.457483E-01 +5.194318E-02 +1.194169E+00 +4.790398E-01 +1.261505E+00 +7.705206E-01 +2.356462E-01 +3.082678E-02 +3.679762E-01 +1.354065E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.597805E-01 +1.297695E-02 +1.349846E+00 +6.808561E-01 +2.237774E+00 +1.109643E+00 +4.237107E-01 +6.002592E-02 +0.000000E+00 +0.000000E+00 +5.424180E-02 +2.942173E-03 +1.420269E-01 +2.017163E-02 +1.954689E+00 +9.874394E-01 +1.380025E+00 +4.289689E-01 +5.043842E-02 +2.544034E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.438568E-01 +1.597365E-02 +6.874433E-01 +2.287801E-01 +7.495196E-01 +1.939234E-01 +8.922533E-01 +2.835397E-01 +7.462571E-02 +5.568996E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.449729E-01 +2.101714E-02 +1.876891E-01 +1.675278E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.002118E-02 +4.902965E-03 +8.612279E-02 +5.910825E-03 +5.651386E-01 +1.286874E-01 +3.804197E-01 +1.225870E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.355899E-02 +5.550260E-04 +3.214464E-01 +1.033278E-01 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -55,456 +311,200 @@ tally 1: 0.000000E+00 1.474078E-01 2.172907E-02 +5.128548E-01 +1.258296E-01 +9.004671E-01 +2.791173E-01 +5.729905E-01 +2.680764E-01 +1.009880E-01 +9.392497E-03 +3.174349E-01 +1.007649E-01 +2.560771E-01 +6.557550E-02 +3.571813E-02 +1.275785E-03 +2.222160E-02 +4.937996E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 6.386562E-02 4.078817E-03 +1.379070E+00 +4.300261E-01 +6.485841E+00 +1.046238E+01 +5.509254E-01 +1.200498E-01 +2.424177E+00 +1.613025E+00 +1.260449E+00 +5.881747E-01 +9.262861E-03 +8.580060E-05 +6.588191E-01 +2.543824E-01 +2.028040E-01 +4.112944E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.040956E+00 +3.089102E-01 +6.743595E+00 +1.135216E+01 +1.494910E+00 +6.327940E-01 +2.226123E+00 +1.203763E+00 +3.147407E+00 +3.333589E+00 +2.505905E-01 +6.279558E-02 +4.171440E-01 +8.701395E-02 +1.417427E+00 +9.671327E-01 +1.398153E-01 +1.954832E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 2.905797E-02 8.443654E-04 -7.532560E-03 -5.673946E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.149324E-01 -1.320945E-02 -2.465048E-02 -3.049063E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.002118E-02 -4.902965E-03 -5.128548E-01 -1.258296E-01 -1.379070E+00 -4.300261E-01 -1.040956E+00 -3.089102E-01 1.237157E+00 6.284409E-01 -9.539296E-01 -5.206980E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.001407E+00 -1.600000E+00 -7.159080E-01 -2.988090E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.473499E-01 -1.206520E-01 -1.597805E-01 -1.297695E-02 -1.438568E-01 -1.597365E-02 -8.612279E-02 -5.910825E-03 -9.004671E-01 -2.791173E-01 -6.485841E+00 -1.046238E+01 -6.743595E+00 -1.135216E+01 7.681046E-01 1.896252E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.572791E-01 -8.942065E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.299733E-01 -2.205463E-01 -1.349846E+00 -6.808561E-01 -6.874433E-01 -2.287801E-01 -5.651386E-01 -1.286874E-01 -5.729905E-01 -2.680764E-01 -5.509254E-01 -1.200498E-01 -1.494910E+00 -6.327940E-01 2.444256E-01 2.804968E-02 -6.927475E-01 -2.317744E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.425042E-01 -5.854257E-02 -2.237774E+00 -1.109643E+00 -7.495196E-01 -1.939234E-01 -3.804197E-01 -1.225870E-01 -1.009880E-01 -9.392497E-03 -2.424177E+00 -1.613025E+00 -2.226123E+00 -1.203763E+00 1.939766E+00 1.132042E+00 -3.953753E-01 -1.420303E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.501129E-02 -6.255649E-04 -3.984785E-01 -1.486414E-01 -1.251028E-01 -1.306358E-02 -0.000000E+00 -0.000000E+00 -9.831996E-01 -4.846833E-01 -4.237107E-01 -6.002592E-02 -8.922533E-01 -2.835397E-01 -0.000000E+00 -0.000000E+00 -3.174349E-01 -1.007649E-01 -1.260449E+00 -5.881747E-01 -3.147407E+00 -3.333589E+00 2.021896E+00 1.425606E+00 -1.377786E-01 -1.716503E-02 -3.011069E-02 -9.066538E-04 -0.000000E+00 -0.000000E+00 -5.118696E-02 -2.620104E-03 -0.000000E+00 -0.000000E+00 -1.484996E-01 -2.205214E-02 -9.889831E-01 -3.657975E-01 -2.850134E+00 -2.250972E+00 -4.131352E-01 -6.756111E-02 -8.393183E-03 -7.044551E-05 -0.000000E+00 -0.000000E+00 -7.462571E-02 -5.568996E-03 -0.000000E+00 -0.000000E+00 -2.560771E-01 -6.557550E-02 -9.262861E-03 -8.580060E-05 -2.505905E-01 -6.279558E-02 5.136552E-01 2.638417E-01 -1.441275E+00 -5.086865E-01 -2.913901E+00 -1.841912E+00 -6.978650E-01 -2.584000E-01 -1.451562E-02 -2.107031E-04 -0.000000E+00 -0.000000E+00 -3.079994E-03 -9.486363E-06 -1.492571E+00 -6.318792E-01 -2.083542E+00 -1.599782E+00 -2.677440E+00 -2.382024E+00 -4.457483E-01 -5.194318E-02 -5.424180E-02 -2.942173E-03 -0.000000E+00 -0.000000E+00 -2.355899E-02 -5.550260E-04 -3.571813E-02 -1.275785E-03 -6.588191E-01 -2.543824E-01 -4.171440E-01 -8.701395E-02 7.735493E-01 1.575534E-01 -4.033076E-01 -5.492660E-02 -4.513270E+00 -5.611449E+00 -1.653243E+00 -8.369762E-01 -1.045336E-01 -1.092727E-02 -2.486634E-01 -2.561523E-02 -1.090478E+00 -5.381842E-01 -6.314497E-01 -1.552199E-01 -3.417016E+00 -2.972256E+00 -5.709899E+00 -7.095076E+00 -1.194169E+00 -4.790398E-01 -1.420269E-01 -2.017163E-02 -0.000000E+00 -0.000000E+00 -3.214464E-01 -1.033278E-01 -2.222160E-02 -4.937996E-04 -2.028040E-01 -4.112944E-02 -1.417427E+00 -9.671327E-01 1.453489E+00 6.697189E-01 -8.534416E-01 -2.290345E-01 -5.367404E+00 -6.853344E+00 -1.237276E+00 -4.961691E-01 -5.835684E-02 -3.405521E-03 -5.574899E-01 -1.049542E-01 -4.235354E+00 -5.638989E+00 -2.034493E+00 -1.162774E+00 -1.533605E+00 -8.644495E-01 -4.663027E+00 -5.641430E+00 -1.261505E+00 -7.705206E-01 -1.954689E+00 -9.874394E-01 -1.449729E-01 -2.101714E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.398153E-01 -1.954832E-02 5.089636E-01 8.836228E-02 -1.422521E+00 -6.953668E-01 -1.137705E+00 -5.670907E-01 -3.521780E-01 -6.575561E-02 -0.000000E+00 -0.000000E+00 -7.713789E-01 -2.948263E-01 -3.267703E-01 -4.763836E-02 -1.252153E+00 -4.563949E-01 -1.962807E-01 -2.410165E-02 -1.357567E+00 -4.362757E-01 -2.356462E-01 -3.082678E-02 -1.380025E+00 -4.289689E-01 -1.876891E-01 -1.675278E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.940736E-01 -2.763730E-02 -6.059470E-02 -3.671718E-03 -3.479381E-01 -1.210609E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.452042E-02 -1.191659E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.679762E-01 -1.354065E-01 -5.043842E-02 -2.544034E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 1.678278E-01 2.097037E-02 -5.312751E-02 -1.423243E-03 -3.374418E-01 -1.138670E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 5.208007E-01 2.057626E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.532560E-03 +5.673946E-05 +9.539296E-01 +5.206980E-01 +0.000000E+00 +0.000000E+00 +6.927475E-01 +2.317744E-01 +3.953753E-01 +1.420303E-01 +1.377786E-01 +1.716503E-02 +1.441275E+00 +5.086865E-01 +4.033076E-01 +5.492660E-02 +8.534416E-01 +2.290345E-01 +1.422521E+00 +6.953668E-01 +1.940736E-01 +2.763730E-02 +0.000000E+00 +0.000000E+00 +5.312751E-02 +1.423243E-03 1.050464E+00 5.524605E-01 +5.214580E-02 +2.719184E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.011069E-02 +9.066538E-04 +2.913901E+00 +1.841912E+00 +4.513270E+00 +5.611449E+00 +5.367404E+00 +6.853344E+00 +1.137705E+00 +5.670907E-01 +6.059470E-02 +3.671718E-03 +0.000000E+00 +0.000000E+00 +3.374418E-01 +1.138670E-01 7.171591E-02 5.143172E-03 0.000000E+00 @@ -525,24 +525,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.214580E-02 -2.719184E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +6.978650E-01 +2.584000E-01 +1.653243E+00 +8.369762E-01 +1.237276E+00 +4.961691E-01 +3.521780E-01 +6.575561E-02 +3.479381E-01 +1.210609E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -565,6 +557,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +5.118696E-02 +2.620104E-03 +1.451562E-02 +2.107031E-04 +1.045336E-01 +1.092727E-02 +5.835684E-02 +3.405521E-03 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_filter_mesh_3d/results_true.dat b/tests/test_filter_mesh_3d/results_true.dat index 88a5228278..44cd1bcc8c 100644 --- a/tests/test_filter_mesh_3d/results_true.dat +++ b/tests/test_filter_mesh_3d/results_true.dat @@ -19,6 +19,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.784067E-02 +1.431916E-03 +5.718522E-03 +3.270150E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -51,6 +55,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +7.373020E-01 +2.296999E-01 +1.235293E-01 +1.096341E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -81,6 +89,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.646162E-01 +2.722494E-02 +3.297202E-01 +5.369813E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -111,6 +123,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.327761E-01 +1.698166E-02 +4.895403E-02 +2.396497E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -581,6 +597,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.013954E-02 +4.056009E-04 +1.244176E-01 +1.547973E-02 +6.200444E-02 +3.844551E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -609,6 +631,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.919075E-02 +1.535915E-03 +1.076125E+00 +3.620665E-01 +1.895015E-01 +3.591083E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -637,6 +665,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +7.532992E-02 +5.674596E-03 +2.779035E-01 +3.159893E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -865,6 +897,2854 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.849679E-01 +3.421312E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.562052E-01 +1.041492E-01 +9.262861E-03 +8.580060E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.680080E-01 +7.239472E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.211417E-01 +1.467532E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.308558E-02 +1.856368E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.785033E-03 +6.060673E-05 +2.958840E-01 +7.992999E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.470259E-01 +3.094098E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.606674E-02 +7.407483E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.650200E-01 +7.121133E-02 +1.853335E-01 +3.434852E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.409446E-02 +1.944321E-03 +4.226996E-01 +1.360325E-01 +0.000000E+00 +0.000000E+00 +1.324670E-01 +1.754750E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.729718E-01 +2.991925E-02 +8.563908E-02 +4.712912E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.039507E-02 +3.647564E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.254527E-01 +1.810100E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.309308E-01 +5.812760E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.162108E+00 +5.854785E-01 +1.144903E+00 +4.944036E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.206585E-01 +1.455847E-02 +5.987372E-02 +2.032332E-03 +1.257462E-01 +1.456033E-02 +2.157774E-03 +4.655990E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.358169E-02 +5.560962E-04 +1.892565E-01 +3.581801E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.668276E-01 +2.783144E-02 +1.382909E-01 +1.912437E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.553405E-01 +1.453017E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.089221E-02 +2.590017E-03 +2.384503E+00 +1.209500E+00 +4.612134E-01 +1.063957E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.032011E-01 +1.065047E-02 +2.762615E-01 +3.559292E-02 +1.771223E-02 +3.137232E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.465169E-02 +6.077057E-04 +2.812104E-01 +7.907926E-02 +7.317899E-02 +5.355165E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.994456E-02 +8.966764E-04 +9.597166E-01 +3.206571E-01 +2.946064E-02 +8.679293E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.391190E-01 +2.413267E-02 +0.000000E+00 +0.000000E+00 +3.630182E-02 +1.317822E-03 +7.945599E-03 +6.313254E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.640780E-01 +1.059726E-01 +7.558522E-01 +3.387696E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.753697E-01 +3.075454E-02 +9.929647E-02 +9.859789E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.755790E-03 +3.082798E-06 +6.310707E-02 +2.175394E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.071175E-01 +5.415795E-02 +3.663834E-02 +8.107316E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.678545E-02 +1.353169E-03 +4.196949E-01 +8.821556E-02 +6.573174E-01 +3.473163E-01 +1.432122E-01 +1.520012E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.642655E-02 +9.273189E-03 +5.463078E-01 +1.319680E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.214217E-01 +2.168033E-02 +1.223027E-01 +1.495794E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.415665E-01 +2.918471E-02 +8.969160E-01 +4.355459E-01 +1.358408E-01 +1.019608E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.149703E+00 +3.989107E-01 +8.078002E-01 +1.757558E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.449729E-01 +2.101714E-02 +1.354717E-01 +9.718740E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.977770E-03 +9.955590E-05 +3.164476E-01 +5.280988E-02 +1.124256E-01 +1.263950E-02 +1.739446E-01 +3.025673E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.565669E-02 +2.451318E-04 +3.823223E-01 +4.488260E-02 +1.508419E-01 +2.275329E-02 +6.960539E-02 +4.844911E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.052674E-02 +8.195092E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.022426E-01 +9.085949E-03 +2.615062E-01 +3.533945E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.322470E-02 +3.984732E-03 +1.034037E-01 +3.976885E-03 +5.731061E-01 +1.428980E-01 +1.115403E+00 +3.834871E-01 +1.574353E-01 +2.355445E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.580128E-01 +9.575996E-02 +9.766238E-01 +3.187064E-01 +1.641852E+00 +9.021844E-01 +5.073845E-01 +9.507188E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.348043E-02 +2.860156E-03 +2.874488E-01 +4.930982E-02 +1.164369E-01 +1.355756E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.165841E-02 +1.735423E-03 +8.832720E-02 +7.801694E-03 +8.209316E-02 +3.505893E-03 +3.679762E-01 +1.354065E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.049861E-01 +1.599684E-01 +5.722246E-01 +9.204135E-02 +3.727350E-02 +1.389314E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.221740E-02 +2.726657E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.125733E-01 +1.267274E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.396029E-01 +6.352573E-02 +2.073790E+00 +1.188596E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.200689E-01 +2.392978E-01 +4.156041E+00 +4.315163E+00 +2.887905E-01 +4.216084E-02 +3.721224E-03 +1.384751E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.998387E-02 +7.936690E-03 +3.050953E-01 +3.658881E-02 +0.000000E+00 +0.000000E+00 +1.426667E-01 +2.035380E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.137535E-02 +2.639427E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.742414E-01 +7.520835E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.027660E-02 +1.056086E-04 +8.945207E-02 +4.272339E-03 +4.274862E-02 +1.827445E-03 +2.729010E-01 +4.130164E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.011069E-02 +9.066538E-04 +4.871561E-01 +9.900028E-02 +2.263564E+00 +1.440716E+00 +2.844653E+00 +1.857026E+00 +4.871086E-01 +1.359461E-01 +3.788668E-02 +1.435401E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.290530E-02 +1.295592E-03 +2.593320E-01 +3.729386E-02 +2.357411E-01 +2.637254E-02 +8.896790E-03 +7.915287E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.316492E-02 +1.733152E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -899,10 +3779,10 @@ tally 1: 0.000000E+00 1.083669E-01 1.174340E-02 -3.904088E-02 -1.524190E-03 -0.000000E+00 -0.000000E+00 +2.623543E-01 +4.112454E-02 +3.364085E-01 +6.085429E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -933,6 +3813,16 @@ tally 1: 0.000000E+00 6.386562E-02 4.078817E-03 +5.669837E-01 +1.209384E-01 +9.609431E-01 +2.621642E-01 +8.878742E-02 +7.053770E-03 +2.075806E-02 +4.308970E-04 +4.751513E-01 +1.205013E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -957,26 +3847,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +1.748649E-01 +1.584562E-02 +1.009424E+00 +3.060875E-01 +4.015408E-01 +7.884715E-02 +7.406533E-02 +5.485672E-03 +8.567983E-02 +7.341033E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1001,22 +3881,22 @@ tally 1: 0.000000E+00 2.905797E-02 8.443654E-04 +1.089115E+00 +5.614559E-01 +1.622477E-01 +1.848987E-02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +6.715405E-02 +4.509666E-03 +1.001959E-01 +1.003923E-02 +2.054517E-01 +4.221041E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1035,6 +3915,8 @@ tally 1: 0.000000E+00 7.532560E-03 5.673946E-05 +6.796882E-01 +2.348838E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1043,6 +3925,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +7.510694E-01 +2.592974E-01 +1.074496E-01 +1.154542E-02 +7.434457E-03 +5.527115E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1071,8 +3959,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.399012E+00 +6.326649E-01 +6.206466E-01 +1.107636E-01 +3.432563E-02 +1.076561E-03 0.000000E+00 0.000000E+00 +2.270802E-02 +5.156541E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1097,8 +3993,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +4.262772E-01 +9.802530E-02 +8.510644E-02 +4.903433E-03 +5.896045E-03 +3.476335E-05 0.000000E+00 0.000000E+00 +4.847729E-02 +2.350047E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1127,6 +4031,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +5.835684E-02 +3.405521E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1223,6 +4129,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.508012E-02 +1.230615E-03 +1.429072E-01 +2.042247E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1253,46 +4163,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.306116E-02 -1.705939E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +1.491740E-02 +2.225288E-04 +2.985580E-01 +4.742470E-02 +2.715682E-01 +6.930003E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1323,6 +4199,10 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.046129E-01 +1.094386E-02 +3.355127E-01 +7.824603E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1469,16 +4349,26 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.465169E-02 -6.077057E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.623543E-01 -4.112454E-02 +0.000000E+00 +0.000000E+00 +3.904088E-02 +1.524190E-03 2.258489E-01 5.100771E-02 +8.236284E-02 +4.869311E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1501,18 +4391,4616 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.729718E-01 -2.991925E-02 -2.994456E-02 -8.966764E-04 -9.977770E-03 -9.955590E-05 -4.396029E-01 -6.352573E-02 -5.669837E-01 -1.209384E-01 1.423672E-01 1.771243E-02 +4.350509E-01 +1.399885E-01 +0.000000E+00 +0.000000E+00 +8.573314E-01 +2.242082E-01 +2.686970E-01 +3.401364E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.330296E+00 +6.633075E-01 +1.754088E+00 +8.632560E-01 +1.701984E-01 +2.896749E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.805840E-02 +2.309610E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.091381E-02 +5.028768E-03 +0.000000E+00 +0.000000E+00 +4.465012E-01 +1.993633E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.811100E-01 +3.280084E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.954942E-01 +1.916582E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.582984E-01 +2.505838E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.905640E-01 +8.442745E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.016991E-02 +1.613622E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.209188E-02 +1.029889E-03 +1.711788E+00 +1.416936E+00 +1.685770E-02 +2.841820E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.728851E-03 +7.619284E-05 +1.524559E+00 +7.117855E-01 +2.225245E+00 +1.498774E+00 +1.375452E-01 +1.835673E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.457483E-01 +5.194318E-02 +4.628619E-01 +9.960982E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.424180E-02 +2.942173E-03 +1.420269E-01 +2.017163E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.267546E-01 +2.900091E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.862835E-02 +3.470153E-04 +7.547884E-04 +5.697055E-07 +8.039207E-02 +6.462885E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.085624E-02 +1.178580E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.460448E-01 +2.132907E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.385333E-02 +1.919148E-04 +4.750552E-01 +9.493583E-02 +4.475531E-02 +2.003038E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.582575E-01 +2.504545E-02 +7.244018E-01 +2.009724E-01 +1.675068E+00 +7.021248E-01 +1.548403E-01 +2.397552E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.325684E-01 +5.701948E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.326035E-02 +1.758368E-04 +1.155931E-01 +1.336177E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.309870E-02 +1.095524E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.215622E-02 +4.908983E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.890902E-02 +1.513911E-03 +1.333296E-03 +1.777678E-06 +5.545269E-01 +1.316670E-01 +9.183632E-01 +2.857440E-01 +3.452042E-02 +1.191659E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.009713E-01 +3.766430E-02 +4.064749E-01 +9.731066E-02 +7.510889E-01 +3.262838E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.834594E-02 +3.365736E-04 +5.221919E-01 +2.558641E-01 +6.058351E-02 +1.850615E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.075776E-01 +1.157294E-02 +1.408841E-01 +9.930494E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.324866E-01 +1.755269E-02 +2.157489E-01 +2.724501E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.362142E-01 +5.579715E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.171591E-02 +5.143172E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.079994E-03 +9.486363E-06 +2.573597E-01 +5.360516E-02 +7.663116E-02 +5.274654E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.522719E-01 +2.318672E-02 +1.234218E+00 +4.999181E-01 +6.053656E-02 +3.664676E-03 +3.866882E-01 +1.202701E-01 +4.069831E-03 +1.656352E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.099509E-01 +6.290302E-02 +5.245828E-01 +7.576335E-02 +5.521306E-01 +1.121121E-01 +1.518297E-01 +1.402100E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.298371E-01 +1.330104E-02 +1.431856E-01 +2.050213E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.602120E-02 +1.297527E-03 +1.614711E-02 +2.607292E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.367392E-03 +1.869762E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.028040E-01 +4.112944E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.876735E-02 +3.142665E-04 +1.266345E+00 +7.682954E-01 +1.355863E-01 +1.838365E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.894914E-01 +7.732641E-02 +7.546765E-01 +2.070654E-01 +1.481609E-01 +2.195167E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.589438E-01 +2.060098E-02 +4.924729E-01 +2.024222E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.693310E-02 +6.692041E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.901092E-02 +8.416334E-04 +6.926635E-01 +2.428256E-01 +5.214580E-02 +2.719184E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.067391E-01 +1.139323E-02 +2.330690E-01 +5.432115E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.631683E-01 +1.318912E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.948898E-01 +3.798204E-02 +1.473267E-01 +2.170516E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.021145E-01 +1.042738E-02 +5.996351E-01 +1.076802E-01 +7.003137E-01 +2.735252E-01 +3.750187E-01 +1.153951E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.054694E-02 +4.221768E-04 +9.531928E-02 +6.215764E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.231222E-02 +9.616114E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.315614E-02 +2.242266E-03 +9.974406E-01 +3.947626E-01 +6.997755E-01 +1.672455E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.613314E-01 +2.177882E-02 +0.000000E+00 +0.000000E+00 +9.028974E-02 +4.229429E-03 +7.462571E-02 +5.568996E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.683052E-03 +9.376150E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.228981E-03 +1.788428E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.883980E-03 +7.892509E-05 +2.832772E-02 +8.024597E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.591875E-02 +1.290157E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.993460E-03 +3.592156E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.374400E-01 +1.888975E-02 +1.770925E-01 +1.577698E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.699969E-01 +4.178442E-02 +7.084057E-01 +1.536166E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.118696E-02 +2.620104E-03 +1.451562E-02 +2.107031E-04 +5.751275E-02 +3.307717E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.397100E-02 +5.746090E-04 +1.165202E-01 +6.930471E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.230381E-02 +2.735689E-03 +4.899885E-02 +2.400887E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.526715E-02 +2.330858E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.241176E-01 +9.055699E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.715160E-01 +1.827795E-02 +3.979721E-01 +1.307262E-01 +2.136983E-01 +4.566698E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.699789E-01 +1.099867E-01 +2.906510E-01 +2.666266E-02 +4.420414E-02 +1.954006E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.974266E-02 +4.864039E-03 +3.006400E-01 +3.566201E-02 +9.975381E-01 +3.048346E-01 +1.525008E-01 +1.765369E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.896367E-02 +1.518168E-03 +4.750135E-01 +1.508282E-01 +6.670089E-01 +1.688817E-01 +8.019636E-01 +2.406005E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.396759E-03 +5.744454E-06 +3.936907E-01 +7.202022E-02 +3.707367E-01 +1.159281E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.355899E-02 +5.550260E-04 +2.878871E-01 +8.287897E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.524618E-01 +6.373694E-02 +1.453317E-02 +2.112130E-04 +2.222160E-02 +4.937996E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.015914E-02 +2.515940E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.266086E-02 +6.832818E-03 +1.019759E-02 +1.039909E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.927144E-03 +8.568173E-06 +8.685372E-02 +7.543569E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.206602E-02 +8.744271E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.590867E-03 +2.530859E-06 +5.000909E-01 +1.141659E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.702083E-02 +2.210958E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.667122E-01 +1.609363E-02 +2.882401E-01 +4.938325E-02 +1.186127E-01 +1.335481E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.802912E-01 +1.787062E-01 +2.509994E-01 +3.312022E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.071904E-01 +2.889953E-02 +3.636704E-02 +1.322562E-03 +4.636650E-02 +2.149852E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.023202E+00 +7.786623E-01 +3.230798E-01 +3.896399E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.698392E-01 +1.770322E-02 +1.047304E-01 +5.484511E-03 +0.000000E+00 +0.000000E+00 +9.764118E-02 +9.533800E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.319541E-03 +2.829752E-05 +1.034262E-01 +6.886191E-03 +4.038686E-02 +1.631098E-03 +9.389954E-01 +4.408852E-01 +8.393183E-03 +7.044551E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.176521E-02 +2.679637E-03 +5.390926E-01 +9.312562E-02 +2.712099E-01 +3.687123E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.048931E-01 +7.753447E-03 +5.109842E-02 +1.598239E-03 +8.251077E-02 +3.717992E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.372603E-02 +5.869219E-03 +1.714479E-01 +1.505049E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.355929E-02 +1.126226E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.615369E-03 +1.307089E-05 +2.118496E-02 +4.488027E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.411503E-04 +2.928436E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.972802E-01 +2.058844E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.619416E-02 +6.961721E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.164981E-01 +1.357181E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.682268E-01 +7.194562E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.786607E-02 +3.191964E-04 +2.870320E-01 +4.518339E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.501129E-02 +6.255649E-04 +1.484996E-01 +2.205214E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.907152E-02 +7.933735E-03 +1.077088E-01 +1.160118E-02 +0.000000E+00 +0.000000E+00 +1.962851E-01 +3.852783E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.978887E-01 +2.156289E-01 +2.621971E-01 +4.860489E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.630962E-02 +2.320465E-03 +9.867531E-02 +9.736817E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.420304E-01 +1.169848E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.688171E-02 +7.226262E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1529,24 +9017,24 @@ tally 1: 0.000000E+00 1.722215E-02 2.966024E-04 +1.480967E+00 +5.223269E-01 +1.561576E-01 +2.112454E-02 +3.978837E-01 +1.583114E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +1.137979E-02 +1.294997E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.565669E-02 -2.451318E-04 -8.200689E-01 -2.392978E-01 -1.748649E-01 -1.584562E-02 -0.000000E+00 -0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1563,24 +9051,18 @@ tally 1: 0.000000E+00 3.036511E-02 9.220402E-04 +3.308084E-01 +5.110266E-02 +5.595964E-02 +2.146289E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.998387E-02 -7.936690E-03 -1.089115E+00 -5.614559E-01 -4.805840E-02 -2.309610E-03 +1.219441E-01 +1.487035E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1603,16 +9085,22 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +9.373673E-02 +4.377147E-03 +7.403983E-02 +3.220776E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.742414E-01 -7.520835E-02 -6.796882E-01 -2.348838E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1803,582 +9291,6 @@ tally 1: 0.000000E+00 3.448095E-01 5.774877E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.033873E-01 -2.672168E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.319541E-03 -2.829752E-05 -3.420304E-01 -1.169848E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.315614E-02 -2.242266E-03 -6.974266E-02 -4.864039E-03 -0.000000E+00 -0.000000E+00 -2.688171E-02 -7.226262E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.896367E-02 -1.518168E-03 -1.048931E-01 -7.753447E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.396759E-03 -5.744454E-06 -8.372603E-02 -5.869219E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.409446E-02 -1.944321E-03 -2.812104E-01 -7.907926E-02 -0.000000E+00 -0.000000E+00 -1.125733E-01 -1.267274E-02 -3.364085E-01 -6.085429E-02 -8.236284E-02 -4.869311E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.381770E-02 -1.919990E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.563908E-02 -4.712912E-03 -9.597166E-01 -3.206571E-01 -3.164476E-01 -5.280988E-02 -2.073790E+00 -1.188596E+00 -9.609431E-01 -2.621642E-01 -4.350509E-01 -1.399885E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.411503E-04 -2.928436E-07 -1.480967E+00 -5.223269E-01 -1.727443E-01 -1.798769E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.254527E-01 -1.810100E-01 -2.391190E-01 -2.413267E-02 -3.823223E-01 -4.488260E-02 -4.156041E+00 -4.315163E+00 -1.009424E+00 -3.060875E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.308084E-01 -5.110266E-02 -2.004281E-01 -2.595071E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.052674E-02 -8.195092E-03 -3.050953E-01 -3.658881E-02 -1.622477E-01 -1.848987E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.164981E-01 -1.357181E-02 -9.373673E-02 -4.377147E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 1.370265E-01 1.583751E-02 0.000000E+00 @@ -2409,10 +9321,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.306116E-02 +1.705939E-04 +6.033873E-01 +2.672168E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 +3.094070E-01 +8.793386E-02 +4.867319E-01 +8.396510E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2443,6 +9363,12 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.251028E-01 +1.306358E-02 +2.410067E-01 +5.808423E-02 +4.089938E-03 +9.542099E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2505,14 +9431,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.602120E-02 -1.297527E-03 -2.054694E-02 -4.221768E-04 -3.699789E-01 -1.099867E-01 -1.034262E-01 -6.886191E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2541,12 +9459,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -9.974406E-01 -3.947626E-01 -3.006400E-01 -3.566201E-02 -5.176521E-02 -2.679637E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2575,12 +9487,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.613314E-01 -2.177882E-02 -4.750135E-01 -1.508282E-01 -5.109842E-02 -1.598239E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2611,10 +9517,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.936907E-01 -7.202022E-02 -1.714479E-01 -1.505049E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2623,10 +9525,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -4.226996E-01 -1.360325E-01 -7.317899E-02 -5.355165E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2651,22 +9549,24 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.381770E-02 +1.919990E-03 7.711190E-02 5.946245E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.946064E-02 -8.679293E-04 -1.124256E-01 -1.263950E-02 -0.000000E+00 -0.000000E+00 -8.878742E-02 -7.053770E-03 +1.009880E-01 +9.392497E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2683,24 +9583,24 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.561576E-01 -2.112454E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.727443E-01 +1.798769E-02 1.640942E-01 2.692690E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.508419E-01 -2.275329E-02 -2.887905E-01 -4.216084E-02 -4.015408E-01 -7.884715E-02 +7.475045E-01 +2.090484E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2717,10 +9617,24 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.595964E-02 -2.146289E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.004281E-01 +2.595071E-02 3.159701E-01 3.538768E-02 +5.329778E-01 +1.118275E-01 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2751,16 +9665,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -7.403983E-02 -3.220776E-03 1.220497E-01 1.051103E-02 0.000000E+00 0.000000E+00 -4.308558E-02 -1.856368E-03 -1.206585E-01 -1.455847E-02 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2789,582 +9701,6 @@ tally 1: 0.000000E+00 5.069737E-01 1.407934E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.614711E-02 -2.607292E-04 -9.531928E-02 -6.215764E-03 -2.906510E-01 -2.666266E-02 -4.038686E-02 -1.631098E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.367392E-03 -1.869762E-06 -6.997755E-01 -1.672455E-01 -9.975381E-01 -3.048346E-01 -5.390926E-01 -9.312562E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.670089E-01 -1.688817E-01 -8.251077E-02 -3.717992E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.683052E-03 -9.376150E-05 -3.707367E-01 -1.159281E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.009880E-01 -9.392497E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.739446E-01 -3.025673E-02 -0.000000E+00 -0.000000E+00 -2.075806E-02 -4.308970E-04 -8.573314E-01 -2.242082E-01 -2.267546E-01 -2.900091E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.978837E-01 -1.583114E-01 -7.475045E-01 -2.090484E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.630182E-02 -1.317822E-03 -6.960539E-02 -4.844911E-03 -3.721224E-03 -1.384751E-05 -7.406533E-02 -5.485672E-03 -1.330296E+00 -6.633075E-01 -1.862835E-02 -3.470153E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.329778E-01 -1.118275E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.162108E+00 -5.854785E-01 -5.640780E-01 -1.059726E-01 -0.000000E+00 -0.000000E+00 -1.426667E-01 -2.035380E-02 -0.000000E+00 -0.000000E+00 -7.091381E-02 -5.028768E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.987372E-02 -2.032332E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 7.471872E-02 5.582887E-03 0.000000E+00 @@ -3491,6339 +9827,3 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.501129E-02 -6.255649E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.907152E-02 -7.933735E-03 -3.094070E-01 -8.793386E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.251028E-01 -1.306358E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.420414E-02 -1.954006E-03 -9.389954E-01 -4.408852E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.525008E-01 -1.765369E-02 -2.712099E-01 -3.687123E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.028974E-02 -4.229429E-03 -8.019636E-01 -2.406005E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.849679E-01 -3.421312E-02 -1.324670E-01 -1.754750E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.562052E-01 -1.041492E-01 -6.039507E-02 -3.647564E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.751513E-01 -1.205013E-01 -2.686970E-01 -3.401364E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.680080E-01 -7.239472E-02 -9.309308E-01 -5.812760E-01 -7.945599E-03 -6.313254E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.567983E-02 -7.341033E-03 -1.754088E+00 -8.632560E-01 -7.547884E-04 -5.697055E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.211417E-01 -1.467532E-02 -1.144903E+00 -4.944036E-01 -7.558522E-01 -3.387696E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.257462E-01 -1.456033E-02 -1.755790E-03 -3.082798E-06 -0.000000E+00 -0.000000E+00 -1.027660E-02 -1.056086E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.011069E-02 -9.066538E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.118696E-02 -2.620104E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.484996E-01 -2.205214E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.508012E-02 -1.230615E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.522719E-01 -2.318672E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.071904E-01 -2.889953E-02 -1.077088E-01 -1.160118E-02 -4.867319E-01 -8.396510E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.491740E-02 -2.225288E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.099509E-01 -6.290302E-02 -3.631683E-01 -1.318912E-01 -0.000000E+00 -0.000000E+00 -1.023202E+00 -7.786623E-01 -7.978887E-01 -2.156289E-01 -2.410067E-01 -5.808423E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.728851E-03 -7.619284E-05 -1.582575E-01 -2.504545E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.698392E-01 -1.770322E-02 -7.630962E-02 -2.320465E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.393183E-03 -7.044551E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.462571E-02 -5.568996E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.524618E-01 -6.373694E-02 -3.615369E-03 -1.307089E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.262861E-03 -8.580060E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.701984E-01 -2.896749E-02 -8.039207E-02 -6.462885E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.715405E-02 -4.509666E-03 -4.465012E-01 -1.993633E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.157774E-03 -4.655990E-06 -6.310707E-02 -2.175394E-03 -8.322470E-02 -3.984732E-03 -8.945207E-02 -4.272339E-03 -7.510694E-01 -2.592974E-01 -1.811100E-01 -3.280084E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.927144E-03 -8.568173E-06 -2.682268E-01 -7.194562E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.678545E-02 -1.353169E-03 -3.580128E-01 -9.575996E-02 -4.871561E-01 -9.900028E-02 -1.399012E+00 -6.326649E-01 -4.954942E-01 -1.916582E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.374400E-01 -1.888975E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.262772E-01 -9.802530E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.699969E-01 -4.178442E-02 -1.590867E-03 -2.530859E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.451562E-02 -2.107031E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.079994E-03 -9.486363E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.429072E-01 -2.042247E-02 -4.016991E-02 -1.613622E-03 -0.000000E+00 -0.000000E+00 -3.890902E-02 -1.513911E-03 -1.234218E+00 -4.999181E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.636704E-02 -1.322562E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.985580E-01 -4.742470E-02 -3.209188E-02 -1.029889E-03 -1.385333E-02 -1.919148E-04 -2.009713E-01 -3.766430E-02 -5.245828E-01 -7.576335E-02 -0.000000E+00 -0.000000E+00 -4.241176E-01 -9.055699E-02 -3.230798E-01 -3.896399E-02 -2.621971E-01 -4.860489E-02 -4.089938E-03 -9.542099E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.046129E-01 -1.094386E-02 -1.524559E+00 -7.117855E-01 -7.244018E-01 -2.009724E-01 -1.834594E-02 -3.365736E-04 -0.000000E+00 -0.000000E+00 -1.021145E-01 -1.042738E-02 -0.000000E+00 -0.000000E+00 -1.047304E-01 -5.484511E-03 -9.867531E-02 -9.736817E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.457483E-01 -5.194318E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.424180E-02 -2.942173E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.355899E-02 -5.550260E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.453317E-02 -2.112130E-04 -2.118496E-02 -4.488027E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.015914E-02 -2.515940E-03 -5.972802E-01 -2.058844E-01 -1.137979E-02 -1.294997E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.075776E-01 -1.157294E-02 -1.876735E-02 -3.142665E-04 -0.000000E+00 -0.000000E+00 -8.266086E-02 -6.832818E-03 -8.619416E-02 -6.961721E-03 -1.219441E-01 -1.487035E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.137535E-02 -2.639427E-03 -1.001959E-01 -1.003923E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.324866E-01 -1.755269E-02 -4.894914E-01 -7.732641E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.034037E-01 -3.976885E-03 -4.274862E-02 -1.827445E-03 -1.074496E-01 -1.154542E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.693310E-02 -6.692041E-04 -3.591875E-02 -1.290157E-03 -8.685372E-02 -7.543569E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.358169E-02 -5.560962E-04 -4.196949E-01 -8.821556E-02 -9.766238E-01 -3.187064E-01 -2.263564E+00 -1.440716E+00 -6.206466E-01 -1.107636E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.770925E-01 -1.577698E-02 -3.206602E-02 -8.744271E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.668276E-01 -2.783144E-02 -9.642655E-02 -9.273189E-03 -5.348043E-02 -2.860156E-03 -4.290530E-02 -1.295592E-03 -8.510644E-02 -4.903433E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.084057E-01 -1.536166E-01 -5.000909E-01 -1.141659E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.751275E-02 -3.307717E-03 -4.702083E-02 -2.210958E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.784067E-02 -1.431916E-03 -2.013954E-02 -4.056009E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.397100E-02 -5.746090E-04 -1.667122E-01 -1.609363E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.919075E-02 -1.535915E-03 -7.785033E-03 -6.060673E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.573597E-01 -5.360516E-02 -1.067391E-01 -1.139323E-02 -5.230381E-02 -2.735689E-03 -5.802912E-01 -1.787062E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.532992E-02 -5.674596E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.333296E-03 -1.777678E-06 -6.053656E-02 -3.664676E-03 -0.000000E+00 -0.000000E+00 -1.526715E-02 -2.330858E-04 -4.636650E-02 -2.149852E-03 -1.962851E-01 -3.852783E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.715682E-01 -6.930003E-02 -1.711788E+00 -1.416936E+00 -4.750552E-01 -9.493583E-02 -4.064749E-01 -9.731066E-02 -5.521306E-01 -1.121121E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.089221E-02 -2.590017E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.355127E-01 -7.824603E-02 -2.225245E+00 -1.498774E+00 -1.675068E+00 -7.021248E-01 -5.221919E-01 -2.558641E-01 -1.298371E-01 -1.330104E-02 -5.996351E-01 -1.076802E-01 -1.715160E-01 -1.827795E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.032011E-01 -1.065047E-02 -2.415665E-01 -2.918471E-02 -4.165841E-02 -1.735423E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.628619E-01 -9.960982E-02 -3.325684E-01 -5.701948E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.231222E-02 -9.616114E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.420269E-01 -2.017163E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.878871E-01 -8.287897E-02 -3.355929E-02 -1.126226E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.222160E-02 -4.937996E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.028040E-01 -4.112944E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.408841E-01 -9.930494E-03 -1.266345E+00 -7.682954E-01 -0.000000E+00 -0.000000E+00 -1.019759E-02 -1.039909E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.753697E-01 -3.075454E-02 -1.022426E-01 -9.085949E-03 -0.000000E+00 -0.000000E+00 -2.054517E-01 -4.221041E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.157489E-01 -2.724501E-02 -7.546765E-01 -2.070654E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.731061E-01 -1.428980E-01 -2.729010E-01 -4.130164E-02 -7.434457E-03 -5.527115E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.892565E-01 -3.581801E-02 -6.573174E-01 -3.473163E-01 -1.641852E+00 -9.021844E-01 -2.844653E+00 -1.857026E+00 -3.432563E-02 -1.076561E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.382909E-01 -1.912437E-02 -5.463078E-01 -1.319680E-01 -2.874488E-01 -4.930982E-02 -2.593320E-01 -3.729386E-02 -5.896045E-03 -3.476335E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.835684E-02 -3.405521E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.718522E-03 -3.270150E-05 -1.244176E-01 -1.547973E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.165202E-01 -6.930471E-03 -2.882401E-01 -4.938325E-02 -1.786607E-02 -3.191964E-04 -0.000000E+00 -0.000000E+00 -7.373020E-01 -2.296999E-01 -1.076125E+00 -3.620665E-01 -2.958840E-01 -7.992999E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.215622E-02 -4.908983E-04 -7.663116E-02 -5.274654E-03 -2.330690E-01 -5.432115E-02 -4.899885E-02 -2.400887E-03 -2.509994E-01 -3.312022E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.646162E-01 -2.722494E-02 -2.779035E-01 -3.159893E-02 -2.470259E-01 -3.094098E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.545269E-01 -1.316670E-01 -3.866882E-01 -1.202701E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.327761E-01 -1.698166E-02 -0.000000E+00 -0.000000E+00 -8.606674E-02 -7.407483E-03 -1.553405E-01 -1.453017E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.685770E-02 -2.841820E-04 -4.475531E-02 -2.003038E-03 -7.510889E-01 -3.262838E-01 -1.518297E-01 -1.402100E-02 -1.948898E-01 -3.798204E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.650200E-01 -7.121133E-02 -2.384503E+00 -1.209500E+00 -2.214217E-01 -2.168033E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.375452E-01 -1.835673E-02 -1.548403E-01 -2.397552E-02 -6.058351E-02 -1.850615E-03 -1.431856E-01 -2.050213E-02 -7.003137E-01 -2.735252E-01 -3.979721E-01 -1.307262E-01 -9.764118E-02 -9.533800E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.762615E-01 -3.559292E-02 -8.969160E-01 -4.355459E-01 -8.832720E-02 -7.801694E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.149703E+00 -3.989107E-01 -8.049861E-01 -1.599684E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.449729E-01 -2.101714E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.355863E-01 -1.838365E-02 -4.228981E-03 -1.788428E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.929647E-02 -9.859789E-03 -2.615062E-01 -3.533945E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.481609E-01 -2.195167E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.071175E-01 -5.415795E-02 -1.115403E+00 -3.834871E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.432122E-01 -1.520012E-02 -5.073845E-01 -9.507188E-02 -4.871086E-01 -1.359461E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.164369E-01 -1.355756E-02 -2.357411E-01 -2.637254E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.200444E-02 -3.844551E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.186127E-01 -1.335481E-02 -2.870320E-01 -4.518339E-02 -0.000000E+00 -0.000000E+00 -1.235293E-01 -1.096341E-02 -1.895015E-01 -3.591083E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.297202E-01 -5.369813E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.183632E-01 -2.857440E-01 -4.069831E-03 -1.656352E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.895403E-02 -2.396497E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.473267E-01 -2.170516E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.853335E-01 -3.434852E-02 -4.612134E-01 -1.063957E-01 -1.223027E-01 -1.495794E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.750187E-01 -1.153951E-01 -2.136983E-01 -4.566698E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.771223E-02 -3.137232E-04 -1.358408E-01 -1.019608E-02 -8.209316E-02 -3.505893E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.078002E-01 -1.757558E-01 -5.722246E-01 -9.204135E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.354717E-01 -9.718740E-03 -5.221740E-02 -2.726657E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.663834E-02 -8.107316E-04 -1.574353E-01 -2.355445E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.788668E-02 -1.435401E-03 -2.270802E-02 -5.156541E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.896790E-03 -7.915287E-05 -4.847729E-02 -2.350047E-03 -2.905640E-01 -8.442745E-02 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.452042E-02 -1.191659E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.679762E-01 -1.354065E-01 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.727350E-02 -1.389314E-03 -1.316492E-02 -1.733152E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.589438E-01 -2.060098E-02 -8.883980E-03 -7.892509E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.085624E-02 -1.178580E-04 -1.326035E-02 -1.758368E-04 -0.000000E+00 -0.000000E+00 -2.901092E-02 -8.416334E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.582984E-01 -2.505838E-02 -1.460448E-01 -2.132907E-02 -3.309870E-02 -1.095524E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.924729E-01 -2.024222E-01 -2.832772E-02 -8.024597E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.155931E-01 -1.336177E-02 -2.362142E-01 -5.579715E-02 -6.926635E-01 -2.428256E-01 -5.993460E-03 -3.592156E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -7.171591E-02 -5.143172E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.214580E-02 -2.719184E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 diff --git a/tests/test_mg_tallies/results_true.dat b/tests/test_mg_tallies/results_true.dat index 4a654639af..cb0498e511 100644 --- a/tests/test_mg_tallies/results_true.dat +++ b/tests/test_mg_tallies/results_true.dat @@ -11,166 +11,6 @@ tally 1: 3.574150E-04 9.366009E-02 2.196850E-03 -2.410307E+00 -1.211320E+00 -7.104710E-02 -1.056830E-03 -3.619111E+00 -2.712466E+00 -3.046789E-02 -2.019483E-04 -7.553639E-02 -1.241275E-03 -2.616860E+00 -1.407243E+00 -7.221083E-02 -1.059301E-03 -3.719840E+00 -2.827103E+00 -2.963219E-02 -1.775955E-04 -7.346451E-02 -1.091590E-03 -2.383417E+00 -1.171863E+00 -6.968054E-02 -9.924374E-04 -3.486989E+00 -2.493855E+00 -2.962148E-02 -1.817051E-04 -7.343795E-02 -1.116850E-03 -2.177844E+00 -9.998272E-01 -6.808817E-02 -9.543925E-04 -3.302614E+00 -2.268097E+00 -3.001326E-02 -1.847730E-04 -7.440926E-02 -1.135706E-03 -2.585363E+00 -1.416531E+00 -7.208386E-02 -1.068367E-03 -3.721777E+00 -2.868016E+00 -2.981132E-02 -1.871051E-04 -7.390860E-02 -1.150041E-03 -2.740199E+00 -1.663131E+00 -8.719535E-02 -1.596752E-03 -4.146740E+00 -3.682203E+00 -3.870935E-02 -3.136109E-04 -9.596871E-02 -1.927608E-03 -2.212799E+00 -1.000035E+00 -7.449165E-02 -1.135538E-03 -3.466616E+00 -2.419923E+00 -3.399202E-02 -2.463541E-04 -8.427346E-02 -1.514215E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 2.099094E+00 8.919271E-01 7.540489E-02 @@ -181,166 +21,6 @@ tally 1: 2.711517E-04 8.768256E-02 1.666633E-03 -2.413065E+00 -1.186499E+00 -7.505466E-02 -1.154624E-03 -3.609948E+00 -2.664048E+00 -3.294274E-02 -2.242161E-04 -8.167207E-02 -1.378144E-03 -2.536174E+00 -1.301621E+00 -7.790327E-02 -1.242427E-03 -3.836384E+00 -2.980367E+00 -3.409705E-02 -2.443384E-04 -8.453386E-02 -1.501825E-03 -2.666159E+00 -1.492268E+00 -7.417343E-02 -1.141120E-03 -3.912196E+00 -3.186439E+00 -3.075257E-02 -1.953163E-04 -7.624217E-02 -1.200511E-03 -2.459342E+00 -1.286534E+00 -6.409323E-02 -8.519553E-04 -3.511461E+00 -2.568245E+00 -2.550853E-02 -1.387171E-04 -6.324108E-02 -8.526242E-04 -3.227353E+00 -2.189454E+00 -8.161989E-02 -1.366996E-03 -4.465292E+00 -4.143037E+00 -3.169508E-02 -2.069605E-04 -7.857885E-02 -1.272082E-03 -3.006650E+00 -1.972749E+00 -8.846181E-02 -1.643195E-03 -4.449165E+00 -4.222523E+00 -3.779771E-02 -2.999515E-04 -9.370858E-02 -1.843651E-03 -2.591189E+00 -1.530310E+00 -7.305643E-02 -1.114250E-03 -3.732882E+00 -3.031120E+00 -3.039294E-02 -1.919600E-04 -7.535057E-02 -1.179882E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 2.667561E+00 1.528159E+00 6.981409E-02 @@ -351,166 +31,6 @@ tally 1: 1.628195E-04 6.863038E-02 1.000769E-03 -2.579691E+00 -1.399684E+00 -7.252523E-02 -1.085979E-03 -3.762646E+00 -2.966415E+00 -3.021298E-02 -1.872587E-04 -7.490441E-02 -1.150985E-03 -2.326398E+00 -1.111745E+00 -6.380790E-02 -8.422824E-04 -3.373074E+00 -2.338678E+00 -2.619114E-02 -1.463613E-04 -6.493342E-02 -8.996094E-04 -2.689651E+00 -1.483190E+00 -8.007622E-02 -1.328579E-03 -4.015410E+00 -3.294872E+00 -3.443210E-02 -2.525628E-04 -8.536450E-02 -1.552377E-03 -2.712538E+00 -1.496273E+00 -7.040893E-02 -1.033599E-03 -3.801423E+00 -2.967673E+00 -2.785218E-02 -1.687241E-04 -6.905150E-02 -1.037062E-03 -3.101358E+00 -2.022582E+00 -8.316566E-02 -1.469875E-03 -4.433641E+00 -4.167950E+00 -3.363316E-02 -2.428472E-04 -8.338377E-02 -1.492660E-03 -2.669269E+00 -1.482479E+00 -7.250461E-02 -1.097959E-03 -3.815372E+00 -3.039000E+00 -2.952621E-02 -1.837209E-04 -7.320176E-02 -1.129240E-03 -2.719836E+00 -1.670890E+00 -8.176774E-02 -1.472662E-03 -4.030045E+00 -3.607044E+00 -3.530219E-02 -2.721266E-04 -8.752165E-02 -1.672625E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 2.643152E+00 1.461242E+00 7.777503E-02 @@ -521,166 +41,6 @@ tally 1: 2.353505E-04 8.228231E-02 1.446581E-03 -2.707136E+00 -1.528526E+00 -7.153411E-02 -1.046460E-03 -3.793295E+00 -2.976791E+00 -2.857458E-02 -1.671752E-04 -7.084247E-02 -1.027542E-03 -2.745209E+00 -1.561299E+00 -7.557988E-02 -1.164281E-03 -3.914803E+00 -3.154166E+00 -3.099509E-02 -1.948889E-04 -7.684344E-02 -1.197884E-03 -3.141608E+00 -2.000672E+00 -8.238823E-02 -1.366316E-03 -4.442048E+00 -3.976219E+00 -3.282615E-02 -2.177028E-04 -8.138301E-02 -1.338110E-03 -3.078971E+00 -1.928690E+00 -8.927133E-02 -1.655293E-03 -4.508330E+00 -4.154031E+00 -3.778191E-02 -3.038622E-04 -9.366939E-02 -1.867688E-03 -3.342682E+00 -2.353374E+00 -9.542381E-02 -1.892530E-03 -4.916807E+00 -5.068483E+00 -4.010858E-02 -3.330650E-04 -9.943770E-02 -2.047183E-03 -2.906350E+00 -1.760817E+00 -8.559496E-02 -1.527401E-03 -4.338708E+00 -3.888336E+00 -3.663301E-02 -2.834528E-04 -9.082102E-02 -1.742242E-03 -2.201534E+00 -1.026489E+00 -7.361463E-02 -1.156634E-03 -3.444005E+00 -2.510736E+00 -3.352726E-02 -2.491193E-04 -8.312121E-02 -1.531211E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 2.379478E+00 1.220072E+00 7.149541E-02 @@ -691,166 +51,6 @@ tally 1: 1.953397E-04 7.681538E-02 1.200655E-03 -3.155079E+00 -2.066218E+00 -9.171950E-02 -1.711836E-03 -4.700403E+00 -4.503318E+00 -3.904100E-02 -3.167906E-04 -9.679096E-02 -1.947152E-03 -2.737388E+00 -1.515779E+00 -7.304714E-02 -1.077128E-03 -3.854064E+00 -2.996781E+00 -2.937470E-02 -1.746013E-04 -7.282614E-02 -1.073187E-03 -3.294568E+00 -2.201280E+00 -8.370459E-02 -1.449531E-03 -4.567777E+00 -4.247816E+00 -3.258414E-02 -2.266289E-04 -8.078302E-02 -1.392974E-03 -3.040055E+00 -1.908677E+00 -8.543146E-02 -1.469528E-03 -4.395363E+00 -3.943052E+00 -3.551022E-02 -2.539139E-04 -8.803740E-02 -1.560681E-03 -2.733720E+00 -1.608810E+00 -7.575232E-02 -1.234497E-03 -3.955386E+00 -3.353987E+00 -3.126476E-02 -2.114507E-04 -7.751200E-02 -1.299681E-03 -2.633801E+00 -1.566751E+00 -7.851898E-02 -1.276803E-03 -3.867974E+00 -3.237952E+00 -3.370851E-02 -2.331450E-04 -8.357057E-02 -1.433025E-03 -2.649820E+00 -1.500516E+00 -6.849773E-02 -9.733415E-04 -3.744876E+00 -2.926356E+00 -2.706771E-02 -1.530408E-04 -6.710661E-02 -9.406650E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 3.128432E+00 2.123023E+00 8.683081E-02 @@ -861,166 +61,6 @@ tally 1: 2.733665E-04 8.913952E-02 1.680246E-03 -2.955891E+00 -1.796192E+00 -8.526700E-02 -1.464085E-03 -4.355866E+00 -3.839684E+00 -3.605221E-02 -2.663621E-04 -8.938111E-02 -1.637194E-03 -2.731962E+00 -1.617682E+00 -7.685258E-02 -1.239175E-03 -4.057901E+00 -3.505399E+00 -3.210546E-02 -2.150275E-04 -7.959627E-02 -1.321666E-03 -3.058734E+00 -1.911285E+00 -8.780153E-02 -1.572171E-03 -4.531361E+00 -4.177302E+00 -3.703146E-02 -2.828466E-04 -9.180888E-02 -1.738516E-03 -2.854688E+00 -1.652859E+00 -8.501906E-02 -1.459424E-03 -4.215336E+00 -3.600073E+00 -3.650039E-02 -2.691434E-04 -9.049224E-02 -1.654289E-03 -2.532385E+00 -1.341692E+00 -7.908024E-02 -1.289149E-03 -3.816608E+00 -3.020090E+00 -3.480705E-02 -2.494950E-04 -8.629409E-02 -1.533520E-03 -2.946914E+00 -1.857842E+00 -7.586572E-02 -1.217999E-03 -4.089763E+00 -3.522165E+00 -2.980738E-02 -1.901498E-04 -7.389883E-02 -1.168755E-03 -2.788908E+00 -1.667764E+00 -7.477958E-02 -1.148212E-03 -4.029335E+00 -3.403340E+00 -3.033277E-02 -1.914118E-04 -7.520139E-02 -1.176512E-03 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 3.320603E+00 2.324411E+00 9.169756E-02 @@ -1031,166 +71,6 @@ tally 1: 3.050758E-04 9.372640E-02 1.875147E-03 -3.157638E+00 -2.088634E+00 -8.917486E-02 -1.627414E-03 -4.530493E+00 -4.262890E+00 -3.711278E-02 -2.791427E-04 -9.201048E-02 -1.715750E-03 -2.826797E+00 -1.654653E+00 -8.798649E-02 -1.562942E-03 -4.238099E+00 -3.671654E+00 -3.864939E-02 -3.007708E-04 -9.582007E-02 -1.848687E-03 -2.639291E+00 -1.470166E+00 -8.380168E-02 -1.469150E-03 -3.995402E+00 -3.337545E+00 -3.720130E-02 -2.907469E-04 -9.222996E-02 -1.787075E-03 -2.563883E+00 -1.375196E+00 -8.901196E-02 -1.610331E-03 -4.042903E+00 -3.361278E+00 -4.116155E-02 -3.428545E-04 -1.020482E-01 -2.107354E-03 -2.651467E+00 -1.472579E+00 -7.547436E-02 -1.201468E-03 -3.877983E+00 -3.154531E+00 -3.166886E-02 -2.150564E-04 -7.851384E-02 -1.321843E-03 -2.884789E+00 -1.801722E+00 -7.517555E-02 -1.168857E-03 -4.085136E+00 -3.522983E+00 -2.985774E-02 -1.859368E-04 -7.402368E-02 -1.142860E-03 -2.810664E+00 -1.609682E+00 -6.917229E-02 -9.875658E-04 -3.854296E+00 -3.029615E+00 -2.634304E-02 -1.483398E-04 -6.531000E-02 -9.117703E-04 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 3.709821E+00 2.847102E+00 1.037249E-01 @@ -1201,6 +81,166 @@ tally 1: 3.964777E-04 1.065039E-01 2.436949E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.410307E+00 +1.211320E+00 +7.104710E-02 +1.056830E-03 +3.619111E+00 +2.712466E+00 +3.046789E-02 +2.019483E-04 +7.553639E-02 +1.241275E-03 +2.413065E+00 +1.186499E+00 +7.505466E-02 +1.154624E-03 +3.609948E+00 +2.664048E+00 +3.294274E-02 +2.242161E-04 +8.167207E-02 +1.378144E-03 +2.579691E+00 +1.399684E+00 +7.252523E-02 +1.085979E-03 +3.762646E+00 +2.966415E+00 +3.021298E-02 +1.872587E-04 +7.490441E-02 +1.150985E-03 +2.707136E+00 +1.528526E+00 +7.153411E-02 +1.046460E-03 +3.793295E+00 +2.976791E+00 +2.857458E-02 +1.671752E-04 +7.084247E-02 +1.027542E-03 +3.155079E+00 +2.066218E+00 +9.171950E-02 +1.711836E-03 +4.700403E+00 +4.503318E+00 +3.904100E-02 +3.167906E-04 +9.679096E-02 +1.947152E-03 +2.955891E+00 +1.796192E+00 +8.526700E-02 +1.464085E-03 +4.355866E+00 +3.839684E+00 +3.605221E-02 +2.663621E-04 +8.938111E-02 +1.637194E-03 +3.157638E+00 +2.088634E+00 +8.917486E-02 +1.627414E-03 +4.530493E+00 +4.262890E+00 +3.711278E-02 +2.791427E-04 +9.201048E-02 +1.715750E-03 3.237824E+00 2.159909E+00 9.708289E-02 @@ -1211,6 +251,166 @@ tally 1: 3.503645E-04 1.036145E-01 2.153514E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.616860E+00 +1.407243E+00 +7.221083E-02 +1.059301E-03 +3.719840E+00 +2.827103E+00 +2.963219E-02 +1.775955E-04 +7.346451E-02 +1.091590E-03 +2.536174E+00 +1.301621E+00 +7.790327E-02 +1.242427E-03 +3.836384E+00 +2.980367E+00 +3.409705E-02 +2.443384E-04 +8.453386E-02 +1.501825E-03 +2.326398E+00 +1.111745E+00 +6.380790E-02 +8.422824E-04 +3.373074E+00 +2.338678E+00 +2.619114E-02 +1.463613E-04 +6.493342E-02 +8.996094E-04 +2.745209E+00 +1.561299E+00 +7.557988E-02 +1.164281E-03 +3.914803E+00 +3.154166E+00 +3.099509E-02 +1.948889E-04 +7.684344E-02 +1.197884E-03 +2.737388E+00 +1.515779E+00 +7.304714E-02 +1.077128E-03 +3.854064E+00 +2.996781E+00 +2.937470E-02 +1.746013E-04 +7.282614E-02 +1.073187E-03 +2.731962E+00 +1.617682E+00 +7.685258E-02 +1.239175E-03 +4.057901E+00 +3.505399E+00 +3.210546E-02 +2.150275E-04 +7.959627E-02 +1.321666E-03 +2.826797E+00 +1.654653E+00 +8.798649E-02 +1.562942E-03 +4.238099E+00 +3.671654E+00 +3.864939E-02 +3.007708E-04 +9.582007E-02 +1.848687E-03 2.503072E+00 1.321745E+00 6.623202E-02 @@ -1221,6 +421,166 @@ tally 1: 1.469478E-04 6.579875E-02 9.032144E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.383417E+00 +1.171863E+00 +6.968054E-02 +9.924374E-04 +3.486989E+00 +2.493855E+00 +2.962148E-02 +1.817051E-04 +7.343795E-02 +1.116850E-03 +2.666159E+00 +1.492268E+00 +7.417343E-02 +1.141120E-03 +3.912196E+00 +3.186439E+00 +3.075257E-02 +1.953163E-04 +7.624217E-02 +1.200511E-03 +2.689651E+00 +1.483190E+00 +8.007622E-02 +1.328579E-03 +4.015410E+00 +3.294872E+00 +3.443210E-02 +2.525628E-04 +8.536450E-02 +1.552377E-03 +3.141608E+00 +2.000672E+00 +8.238823E-02 +1.366316E-03 +4.442048E+00 +3.976219E+00 +3.282615E-02 +2.177028E-04 +8.138301E-02 +1.338110E-03 +3.294568E+00 +2.201280E+00 +8.370459E-02 +1.449531E-03 +4.567777E+00 +4.247816E+00 +3.258414E-02 +2.266289E-04 +8.078302E-02 +1.392974E-03 +3.058734E+00 +1.911285E+00 +8.780153E-02 +1.572171E-03 +4.531361E+00 +4.177302E+00 +3.703146E-02 +2.828466E-04 +9.180888E-02 +1.738516E-03 +2.639291E+00 +1.470166E+00 +8.380168E-02 +1.469150E-03 +3.995402E+00 +3.337545E+00 +3.720130E-02 +2.907469E-04 +9.222996E-02 +1.787075E-03 2.360183E+00 1.196310E+00 7.336179E-02 @@ -1231,6 +591,166 @@ tally 1: 2.218615E-04 7.989359E-02 1.363671E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.177844E+00 +9.998272E-01 +6.808817E-02 +9.543925E-04 +3.302614E+00 +2.268097E+00 +3.001326E-02 +1.847730E-04 +7.440926E-02 +1.135706E-03 +2.459342E+00 +1.286534E+00 +6.409323E-02 +8.519553E-04 +3.511461E+00 +2.568245E+00 +2.550853E-02 +1.387171E-04 +6.324108E-02 +8.526242E-04 +2.712538E+00 +1.496273E+00 +7.040893E-02 +1.033599E-03 +3.801423E+00 +2.967673E+00 +2.785218E-02 +1.687241E-04 +6.905150E-02 +1.037062E-03 +3.078971E+00 +1.928690E+00 +8.927133E-02 +1.655293E-03 +4.508330E+00 +4.154031E+00 +3.778191E-02 +3.038622E-04 +9.366939E-02 +1.867688E-03 +3.040055E+00 +1.908677E+00 +8.543146E-02 +1.469528E-03 +4.395363E+00 +3.943052E+00 +3.551022E-02 +2.539139E-04 +8.803740E-02 +1.560681E-03 +2.854688E+00 +1.652859E+00 +8.501906E-02 +1.459424E-03 +4.215336E+00 +3.600073E+00 +3.650039E-02 +2.691434E-04 +9.049224E-02 +1.654289E-03 +2.563883E+00 +1.375196E+00 +8.901196E-02 +1.610331E-03 +4.042903E+00 +3.361278E+00 +4.116155E-02 +3.428545E-04 +1.020482E-01 +2.107354E-03 2.353136E+00 1.260383E+00 7.514099E-02 @@ -1241,6 +761,166 @@ tally 1: 2.280172E-04 8.303643E-02 1.401507E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.585363E+00 +1.416531E+00 +7.208386E-02 +1.068367E-03 +3.721777E+00 +2.868016E+00 +2.981132E-02 +1.871051E-04 +7.390860E-02 +1.150041E-03 +3.227353E+00 +2.189454E+00 +8.161989E-02 +1.366996E-03 +4.465292E+00 +4.143037E+00 +3.169508E-02 +2.069605E-04 +7.857885E-02 +1.272082E-03 +3.101358E+00 +2.022582E+00 +8.316566E-02 +1.469875E-03 +4.433641E+00 +4.167950E+00 +3.363316E-02 +2.428472E-04 +8.338377E-02 +1.492660E-03 +3.342682E+00 +2.353374E+00 +9.542381E-02 +1.892530E-03 +4.916807E+00 +5.068483E+00 +4.010858E-02 +3.330650E-04 +9.943770E-02 +2.047183E-03 +2.733720E+00 +1.608810E+00 +7.575232E-02 +1.234497E-03 +3.955386E+00 +3.353987E+00 +3.126476E-02 +2.114507E-04 +7.751200E-02 +1.299681E-03 +2.532385E+00 +1.341692E+00 +7.908024E-02 +1.289149E-03 +3.816608E+00 +3.020090E+00 +3.480705E-02 +2.494950E-04 +8.629409E-02 +1.533520E-03 +2.651467E+00 +1.472579E+00 +7.547436E-02 +1.201468E-03 +3.877983E+00 +3.154531E+00 +3.166886E-02 +2.150564E-04 +7.851384E-02 +1.321843E-03 2.404559E+00 1.241962E+00 6.952417E-02 @@ -1251,6 +931,166 @@ tally 1: 1.929942E-04 7.306514E-02 1.186238E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.740199E+00 +1.663131E+00 +8.719535E-02 +1.596752E-03 +4.146740E+00 +3.682203E+00 +3.870935E-02 +3.136109E-04 +9.596871E-02 +1.927608E-03 +3.006650E+00 +1.972749E+00 +8.846181E-02 +1.643195E-03 +4.449165E+00 +4.222523E+00 +3.779771E-02 +2.999515E-04 +9.370858E-02 +1.843651E-03 +2.669269E+00 +1.482479E+00 +7.250461E-02 +1.097959E-03 +3.815372E+00 +3.039000E+00 +2.952621E-02 +1.837209E-04 +7.320176E-02 +1.129240E-03 +2.906350E+00 +1.760817E+00 +8.559496E-02 +1.527401E-03 +4.338708E+00 +3.888336E+00 +3.663301E-02 +2.834528E-04 +9.082102E-02 +1.742242E-03 +2.633801E+00 +1.566751E+00 +7.851898E-02 +1.276803E-03 +3.867974E+00 +3.237952E+00 +3.370851E-02 +2.331450E-04 +8.357057E-02 +1.433025E-03 +2.946914E+00 +1.857842E+00 +7.586572E-02 +1.217999E-03 +4.089763E+00 +3.522165E+00 +2.980738E-02 +1.901498E-04 +7.389883E-02 +1.168755E-03 +2.884789E+00 +1.801722E+00 +7.517555E-02 +1.168857E-03 +4.085136E+00 +3.522983E+00 +2.985774E-02 +1.859368E-04 +7.402368E-02 +1.142860E-03 2.740499E+00 1.588007E+00 7.592011E-02 @@ -1261,6 +1101,166 @@ tally 1: 2.121705E-04 7.770960E-02 1.304106E-03 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.212799E+00 +1.000035E+00 +7.449165E-02 +1.135538E-03 +3.466616E+00 +2.419923E+00 +3.399202E-02 +2.463541E-04 +8.427346E-02 +1.514215E-03 +2.591189E+00 +1.530310E+00 +7.305643E-02 +1.114250E-03 +3.732882E+00 +3.031120E+00 +3.039294E-02 +1.919600E-04 +7.535057E-02 +1.179882E-03 +2.719836E+00 +1.670890E+00 +8.176774E-02 +1.472662E-03 +4.030045E+00 +3.607044E+00 +3.530219E-02 +2.721266E-04 +8.752165E-02 +1.672625E-03 +2.201534E+00 +1.026489E+00 +7.361463E-02 +1.156634E-03 +3.444005E+00 +2.510736E+00 +3.352726E-02 +2.491193E-04 +8.312121E-02 +1.531211E-03 +2.649820E+00 +1.500516E+00 +6.849773E-02 +9.733415E-04 +3.744876E+00 +2.926356E+00 +2.706771E-02 +1.530408E-04 +6.710661E-02 +9.406650E-04 +2.788908E+00 +1.667764E+00 +7.477958E-02 +1.148212E-03 +4.029335E+00 +3.403340E+00 +3.033277E-02 +1.914118E-04 +7.520139E-02 +1.176512E-03 +2.810664E+00 +1.609682E+00 +6.917229E-02 +9.875658E-04 +3.854296E+00 +3.029615E+00 +2.634304E-02 +1.483398E-04 +6.531000E-02 +9.117703E-04 2.647586E+00 1.416013E+00 7.421099E-02 diff --git a/tests/test_mgxs_library_mesh/results_true.dat b/tests/test_mgxs_library_mesh/results_true.dat index 2d641cc952..b6656d67b4 100644 --- a/tests/test_mgxs_library_mesh/results_true.dat +++ b/tests/test_mgxs_library_mesh/results_true.dat @@ -1,62 +1,62 @@ mesh 1 group in nuclide mean std. dev. x y z 0 1 1 1 1 total 0.640786 0.044177 -1 1 2 1 1 total 0.660597 0.128423 -2 2 1 1 1 total 0.615276 0.104046 +1 1 2 1 1 total 0.615276 0.104046 +2 2 1 1 1 total 0.660597 0.128423 3 2 2 1 1 total 0.646999 0.186709 mesh 1 group in nuclide mean std. dev. x y z 0 1 1 1 1 total 0.36665 0.048814 -1 1 2 1 1 total 0.40784 0.096486 -2 2 1 1 1 total 0.36356 0.074111 +1 1 2 1 1 total 0.36356 0.074111 +2 2 1 1 1 total 0.40784 0.096486 3 2 2 1 1 total 0.41456 0.160443 mesh 1 group in nuclide mean std. dev. x y z 0 1 1 1 1 total 0.366650 0.048814 -1 1 2 1 1 total 0.407840 0.096486 -2 2 1 1 1 total 0.363560 0.074111 +1 1 2 1 1 total 0.363560 0.074111 +2 2 1 1 1 total 0.407840 0.096486 3 2 2 1 1 total 0.414593 0.160436 mesh 1 group in nuclide mean std. dev. x y z 0 1 1 1 1 total 0.025749 0.002863 -1 1 2 1 1 total 0.028400 0.005275 -2 2 1 1 1 total 0.022988 0.004099 +1 1 2 1 1 total 0.022988 0.004099 +2 2 1 1 1 total 0.028400 0.005275 3 2 2 1 1 total 0.027589 0.010350 mesh 1 group in nuclide mean std. dev. x y z 0 1 1 1 1 total 0.015861 0.002876 -1 1 2 1 1 total 0.017280 0.004371 -2 2 1 1 1 total 0.014403 0.003542 +1 1 2 1 1 total 0.014403 0.003542 +2 2 1 1 1 total 0.017280 0.004371 3 2 2 1 1 total 0.018061 0.010110 mesh 1 group in nuclide mean std. dev. x y z 0 1 1 1 1 total 0.009888 0.001077 -1 1 2 1 1 total 0.011121 0.002456 -2 2 1 1 1 total 0.008585 0.001552 +1 1 2 1 1 total 0.008585 0.001552 +2 2 1 1 1 total 0.011121 0.002456 3 2 2 1 1 total 0.009527 0.003659 mesh 1 group in nuclide mean std. dev. x y z 0 1 1 1 1 total 0.026065 0.002907 -1 1 2 1 1 total 0.029084 0.006430 -2 2 1 1 1 total 0.022596 0.004062 +1 1 2 1 1 total 0.022596 0.004062 +2 2 1 1 1 total 0.029084 0.006430 3 2 2 1 1 total 0.025066 0.009687 mesh 1 group in nuclide mean std. dev. x y z 0 1 1 1 1 total 1.938476 0.211550 -1 1 2 1 1 total 2.177360 0.480780 -2 2 1 1 1 total 1.682799 0.303764 +1 1 2 1 1 total 1.682799 0.303764 +2 2 1 1 1 total 2.177360 0.480780 3 2 2 1 1 total 1.864890 0.715661 mesh 1 group in nuclide mean std. dev. x y z 0 1 1 1 1 total 0.615037 0.041754 -1 1 2 1 1 total 0.632196 0.123878 -2 2 1 1 1 total 0.592288 0.100439 +1 1 2 1 1 total 0.592288 0.100439 +2 2 1 1 1 total 0.632196 0.123878 3 2 2 1 1 total 0.619410 0.177190 mesh 1 group in nuclide mean std. dev. x y z 0 1 1 1 1 total 0.584014 0.054315 -1 1 2 1 1 total 0.622514 0.111323 -2 2 1 1 1 total 0.587256 0.084833 +1 1 2 1 1 total 0.587256 0.084833 +2 2 1 1 1 total 0.622514 0.111323 3 2 2 1 1 total 0.613792 0.168612 mesh 1 group in group out nuclide moment mean std. dev. x y z @@ -64,14 +64,14 @@ 1 1 1 1 1 1 total P1 0.243427 0.025488 2 1 1 1 1 1 total P2 0.089236 0.007357 3 1 1 1 1 1 total P3 0.008994 0.005768 -4 1 2 1 1 1 total P0 0.622514 0.111323 -5 1 2 1 1 1 total P1 0.239376 0.042594 -6 1 2 1 1 1 total P2 0.088386 0.017200 -7 1 2 1 1 1 total P3 -0.001243 0.005639 -8 2 1 1 1 1 total P0 0.587256 0.084833 -9 2 1 1 1 1 total P1 0.245120 0.041033 -10 2 1 1 1 1 total P2 0.086784 0.016255 -11 2 1 1 1 1 total P3 0.008660 0.004755 +4 1 2 1 1 1 total P0 0.587256 0.084833 +5 1 2 1 1 1 total P1 0.245120 0.041033 +6 1 2 1 1 1 total P2 0.086784 0.016255 +7 1 2 1 1 1 total P3 0.008660 0.004755 +8 2 1 1 1 1 total P0 0.622514 0.111323 +9 2 1 1 1 1 total P1 0.239376 0.042594 +10 2 1 1 1 1 total P2 0.088386 0.017200 +11 2 1 1 1 1 total P3 -0.001243 0.005639 12 2 2 1 1 1 total P0 0.612950 0.167940 13 2 2 1 1 1 total P1 0.226176 0.061882 14 2 2 1 1 1 total P2 0.086593 0.026126 @@ -82,14 +82,14 @@ 1 1 1 1 1 1 total P1 0.243427 0.025488 2 1 1 1 1 1 total P2 0.089236 0.007357 3 1 1 1 1 1 total P3 0.008994 0.005768 -4 1 2 1 1 1 total P0 0.622514 0.111323 -5 1 2 1 1 1 total P1 0.239376 0.042594 -6 1 2 1 1 1 total P2 0.088386 0.017200 -7 1 2 1 1 1 total P3 -0.001243 0.005639 -8 2 1 1 1 1 total P0 0.587256 0.084833 -9 2 1 1 1 1 total P1 0.245120 0.041033 -10 2 1 1 1 1 total P2 0.086784 0.016255 -11 2 1 1 1 1 total P3 0.008660 0.004755 +4 1 2 1 1 1 total P0 0.587256 0.084833 +5 1 2 1 1 1 total P1 0.245120 0.041033 +6 1 2 1 1 1 total P2 0.086784 0.016255 +7 1 2 1 1 1 total P3 0.008660 0.004755 +8 2 1 1 1 1 total P0 0.622514 0.111323 +9 2 1 1 1 1 total P1 0.239376 0.042594 +10 2 1 1 1 1 total P2 0.088386 0.017200 +11 2 1 1 1 1 total P3 -0.001243 0.005639 12 2 2 1 1 1 total P0 0.613792 0.168612 13 2 2 1 1 1 total P1 0.226142 0.061856 14 2 2 1 1 1 total P2 0.086174 0.025979 @@ -97,38 +97,38 @@ mesh 1 group in group out nuclide mean std. dev. x y z 0 1 1 1 1 1 total 1.000000 0.088094 -1 1 2 1 1 1 total 1.000000 0.160891 -2 2 1 1 1 1 total 1.000000 0.126864 +1 1 2 1 1 1 total 1.000000 0.126864 +2 2 1 1 1 1 total 1.000000 0.160891 3 2 2 1 1 1 total 1.001374 0.305883 mesh 1 group in group out nuclide mean std. dev. x y z 0 1 1 1 1 1 total 0.027395 0.004680 -1 1 2 1 1 1 total 0.022914 0.006025 -2 2 1 1 1 1 total 0.019384 0.002846 +1 1 2 1 1 1 total 0.019384 0.002846 +2 2 1 1 1 1 total 0.022914 0.006025 3 2 2 1 1 1 total 0.029629 0.006292 mesh 1 group out nuclide mean std. dev. x y z 0 1 1 1 1 total 1.0 0.220956 -1 1 2 1 1 total 1.0 0.316565 -2 2 1 1 1 total 1.0 0.132140 +1 1 2 1 1 total 1.0 0.132140 +2 2 1 1 1 total 1.0 0.316565 3 2 2 1 1 total 1.0 0.181577 mesh 1 group out nuclide mean std. dev. x y z 0 1 1 1 1 total 1.0 0.222246 -1 1 2 1 1 total 1.0 0.316565 -2 2 1 1 1 total 1.0 0.132140 +1 1 2 1 1 total 1.0 0.132140 +2 2 1 1 1 total 1.0 0.316565 3 2 2 1 1 total 1.0 0.181577 mesh 1 group in nuclide mean std. dev. x y z 0 1 1 1 1 total 3.610522e-07 3.169931e-08 -1 1 2 1 1 total 3.942353e-07 8.459167e-08 -2 2 1 1 1 total 3.097784e-07 5.252025e-08 +1 1 2 1 1 total 3.097784e-07 5.252025e-08 +2 2 1 1 1 total 3.942353e-07 8.459167e-08 3 2 2 1 1 total 3.799163e-07 1.806470e-07 mesh 1 group in nuclide mean std. dev. x y z 0 1 1 1 1 total 0.025920 0.002893 -1 1 2 1 1 total 0.028922 0.006394 -2 2 1 1 1 total 0.022467 0.004039 +1 1 2 1 1 total 0.022467 0.004039 +2 2 1 1 1 total 0.028922 0.006394 3 2 2 1 1 total 0.024923 0.009632 mesh 1 delayedgroup group in nuclide mean std. dev. x y z @@ -138,18 +138,18 @@ 3 1 1 1 4 1 total 0.000054 5.464055e-06 4 1 1 1 5 1 total 0.000026 2.663025e-06 5 1 1 1 6 1 total 0.000010 1.038005e-06 -6 1 2 1 1 1 total 0.000005 1.098837e-06 -7 1 2 1 2 1 total 0.000029 6.436855e-06 -8 1 2 1 3 1 total 0.000027 5.926286e-06 -9 1 2 1 4 1 total 0.000061 1.359391e-05 -10 1 2 1 5 1 total 0.000029 6.489015e-06 -11 1 2 1 6 1 total 0.000011 2.574270e-06 -12 2 1 1 1 1 total 0.000004 6.987770e-07 -13 2 1 1 2 1 total 0.000023 4.115234e-06 -14 2 1 1 3 1 total 0.000021 3.816392e-06 -15 2 1 1 4 1 total 0.000049 8.885822e-06 -16 2 1 1 5 1 total 0.000024 4.378290e-06 -17 2 1 1 6 1 total 0.000009 1.745695e-06 +6 1 2 1 1 1 total 0.000004 6.987770e-07 +7 1 2 1 2 1 total 0.000023 4.115234e-06 +8 1 2 1 3 1 total 0.000021 3.816392e-06 +9 1 2 1 4 1 total 0.000049 8.885822e-06 +10 1 2 1 5 1 total 0.000024 4.378290e-06 +11 1 2 1 6 1 total 0.000009 1.745695e-06 +12 2 1 1 1 1 total 0.000005 1.098837e-06 +13 2 1 1 2 1 total 0.000029 6.436855e-06 +14 2 1 1 3 1 total 0.000027 5.926286e-06 +15 2 1 1 4 1 total 0.000061 1.359391e-05 +16 2 1 1 5 1 total 0.000029 6.489015e-06 +17 2 1 1 6 1 total 0.000011 2.574270e-06 18 2 2 1 1 1 total 0.000004 1.660497e-06 19 2 2 1 2 1 total 0.000025 9.701974e-06 20 2 2 1 3 1 total 0.000023 9.005217e-06 @@ -190,18 +190,18 @@ 3 1 1 1 4 1 total 0.002087 0.000282 4 1 1 1 5 1 total 0.001014 0.000137 5 1 1 1 6 1 total 0.000400 0.000054 -6 1 2 1 1 1 total 0.000171 0.000039 -7 1 2 1 2 1 total 0.001003 0.000226 -8 1 2 1 3 1 total 0.000918 0.000208 -9 1 2 1 4 1 total 0.002100 0.000477 -10 1 2 1 5 1 total 0.000996 0.000228 -11 1 2 1 6 1 total 0.000394 0.000090 -12 2 1 1 1 1 total 0.000167 0.000030 -13 2 1 1 2 1 total 0.001002 0.000178 -14 2 1 1 3 1 total 0.000926 0.000165 -15 2 1 1 4 1 total 0.002149 0.000384 -16 2 1 1 5 1 total 0.001056 0.000189 -17 2 1 1 6 1 total 0.000417 0.000076 +6 1 2 1 1 1 total 0.000167 0.000030 +7 1 2 1 2 1 total 0.001002 0.000178 +8 1 2 1 3 1 total 0.000926 0.000165 +9 1 2 1 4 1 total 0.002149 0.000384 +10 1 2 1 5 1 total 0.001056 0.000189 +11 1 2 1 6 1 total 0.000417 0.000076 +12 2 1 1 1 1 total 0.000171 0.000039 +13 2 1 1 2 1 total 0.001003 0.000226 +14 2 1 1 3 1 total 0.000918 0.000208 +15 2 1 1 4 1 total 0.002100 0.000477 +16 2 1 1 5 1 total 0.000996 0.000228 +17 2 1 1 6 1 total 0.000394 0.000090 18 2 2 1 1 1 total 0.000171 0.000082 19 2 2 1 2 1 total 0.001007 0.000480 20 2 2 1 3 1 total 0.000929 0.000445 diff --git a/tests/test_quadric_surfaces/results_true.dat b/tests/test_quadric_surfaces/results_true.dat index 1f0dd54262..f7aed43e35 100644 --- a/tests/test_quadric_surfaces/results_true.dat +++ b/tests/test_quadric_surfaces/results_true.dat @@ -1,2 +1,2 @@ k-combined: -9.570770E-01 2.513234E-02 +9.921357E-01 6.763175E-03 diff --git a/tests/test_score_current/results_true.dat b/tests/test_score_current/results_true.dat index 6b3beb4be8..68dbe069cf 100644 --- a/tests/test_score_current/results_true.dat +++ b/tests/test_score_current/results_true.dat @@ -1 +1 @@ -2800fad5519917ffc985094d3263a3e0aac1abf6acb0c25416264135b36141812cc8d7dafc01585b104b8d6ad03cd44b6ce277fdb7df5a3f859fe26e61244e2a \ No newline at end of file +c2921f159dac64099862c1cd9c6d421c977991f621f954f893ec1351cfcea6794ca2c98c9c2dcc3411f1b8dac91ec83bd895788ba33179222c450a7df1d64f1e \ No newline at end of file diff --git a/tests/test_sourcepoint_restart/results_true.dat b/tests/test_sourcepoint_restart/results_true.dat index 49afeb1d52..0e83121c58 100644 --- a/tests/test_sourcepoint_restart/results_true.dat +++ b/tests/test_sourcepoint_restart/results_true.dat @@ -41,16 +41,16 @@ tally 1: 1.416293E-07 0.000000E+00 0.000000E+00 -7.000000E-03 -1.500000E-05 -3.445754E-03 -3.819507E-06 -2.124056E-03 -1.976201E-06 -1.542203E-03 -1.531669E-06 -4.135720E-03 -4.532612E-06 +2.100000E-02 +1.150000E-04 +5.280651E-03 +1.222273E-05 +5.235520E-03 +1.202448E-05 +5.064093E-03 +1.787892E-05 +1.071093E-02 +2.748613E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -59,8 +59,118 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.874391E-04 -1.725424E-07 +8.954046E-04 +2.673852E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.100000E-02 +2.130000E-04 +1.472240E-02 +5.500913E-05 +1.077445E-02 +2.987369E-05 +6.729425E-03 +1.249089E-05 +1.363637E-02 +4.345511E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.182717E-03 +5.268981E-07 +2.000000E-03 +2.000000E-06 +-1.367978E-03 +9.381191E-07 +4.071787E-04 +9.316064E-08 +4.394728E-04 +1.064342E-07 +2.110881E-03 +1.737594E-06 +1.000000E-03 +1.000000E-06 +9.347357E-04 +8.737309E-07 +8.105963E-04 +6.570664E-07 +6.396651E-04 +4.091714E-07 +2.938723E-04 +8.636093E-08 +2.300000E-02 +1.330000E-04 +1.081756E-02 +3.675127E-05 +2.530156E-03 +6.960955E-06 +-1.930911E-03 +4.910249E-06 +1.162826E-02 +3.490280E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.957101E-04 +4.402865E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +3.400000E-05 +4.086838E-03 +5.900874E-06 +1.812330E-03 +3.716159E-06 +2.138941E-03 +3.006748E-06 +5.414129E-03 +8.079335E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -71,76 +181,6 @@ tally 1: 0.000000E+00 3.079655E-04 9.484274E-08 -1.000000E-03 -1.000000E-06 -9.451745E-04 -8.933548E-07 -8.400323E-04 -7.056542E-07 -6.931788E-04 -4.804969E-07 -0.000000E+00 -0.000000E+00 -3.000000E-03 -3.000000E-06 -1.134842E-03 -1.040850E-06 -6.127525E-05 -3.988312E-07 -4.938488E-05 -2.738492E-07 -1.484493E-03 -9.722888E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -201,16 +241,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.200000E-02 -4.600000E-05 -9.302157E-04 -3.853850E-06 -1.874541E-03 -3.092623E-06 --1.511552E-03 -4.053466E-06 -5.941986E-03 -9.853873E-06 +2.700000E-02 +1.670000E-04 +1.789444E-02 +8.260005E-05 +1.049872E-02 +2.774537E-05 +5.665111E-03 +8.560197E-06 +1.100708E-02 +2.835296E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -219,60 +259,38 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.186549E-03 -5.291648E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.935668E-04 -8.618149E-08 +3.079655E-04 +9.484274E-08 1.000000E-03 1.000000E-06 -9.893707E-04 -9.788543E-07 -9.682814E-04 -9.375689E-07 -9.370683E-04 -8.780970E-07 -0.000000E+00 -0.000000E+00 -8.000000E-03 -2.000000E-05 -3.721382E-03 -4.736982E-06 --1.037031E-04 -6.648392E-07 --5.996856E-04 -9.642316E-07 -3.248622E-03 -4.063214E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.938723E-04 -8.636093E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +-2.856031E-04 +8.156913E-08 +-3.776463E-04 +1.426167E-07 +3.701637E-04 +1.370211E-07 +1.203065E-03 +7.240969E-07 +1.000000E-03 +1.000000E-06 +9.705482E-04 +9.419638E-07 +9.129457E-04 +8.334699E-07 +8.297310E-04 +6.884535E-07 0.000000E+00 0.000000E+00 +4.400000E-02 +4.320000E-04 +1.141886E-02 +4.208707E-05 +9.213446E-03 +2.259305E-05 +9.177440E-03 +2.088782E-05 +2.116869E-02 +9.629049E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -281,16 +299,38 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.501009E-03 +6.405023E-07 +1.000000E-03 +1.000000E-06 +5.882614E-04 +3.460515E-07 +1.907719E-05 +3.639390E-10 +-3.734703E-04 +1.394801E-07 +1.472277E-03 +9.506220E-07 2.000000E-03 2.000000E-06 -1.502634E-03 -1.146555E-06 -7.198331E-04 -3.484978E-07 --3.426513E-05 -1.342349E-07 -1.511030E-03 -1.198311E-06 +1.830192E-03 +1.679505E-06 +1.519257E-03 +1.189525E-06 +1.118506E-03 +7.332971E-07 +2.977039E-04 +8.862764E-08 +2.000000E-02 +1.080000E-04 +8.640372E-03 +1.765553E-05 +5.688468E-03 +1.038555E-05 +2.447898E-03 +4.466055E-06 +8.949668E-03 +1.935056E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -299,6 +339,38 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.977039E-04 +8.862764E-08 +1.000000E-03 +1.000000E-06 +-3.805163E-04 +1.447926E-07 +-2.828111E-04 +7.998210E-08 +4.330345E-04 +1.875189E-07 +2.121142E-03 +1.958355E-06 +1.000000E-03 +1.000000E-06 +9.260022E-04 +8.574800E-07 +7.862200E-04 +6.181419E-07 +5.960676E-04 +3.552966E-07 +2.938723E-04 +8.636093E-08 +1.000000E-02 +3.400000E-05 +4.840884E-03 +1.080853E-05 +3.402096E-03 +4.113972E-06 +1.374077E-03 +2.333511E-06 +4.754696E-03 +7.172310E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -307,6 +379,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.079655E-04 +9.484274E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -361,16 +441,136 @@ tally 1: 1.052422E-07 0.000000E+00 0.000000E+00 -1.500000E-02 -5.500000E-05 -2.209492E-03 -2.545503E-06 -5.991182E-03 -1.290780E-05 -1.772063E-03 -2.006265E-06 -5.944487E-03 -1.042417E-05 +2.900000E-02 +2.230000E-04 +6.260565E-03 +1.544092E-05 +7.061757E-03 +2.562385E-05 +3.982541E-03 +7.962565E-06 +1.486928E-02 +5.763902E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.915762E-04 +1.749886E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.954079E-04 +3.545105E-07 +1.000000E-03 +1.000000E-06 +9.938157E-04 +9.876697E-07 +9.815046E-04 +9.633512E-07 +9.631807E-04 +9.277170E-07 +0.000000E+00 +0.000000E+00 +2.900000E-02 +1.990000E-04 +1.237546E-02 +3.198261E-05 +8.287792E-03 +2.747313E-05 +3.254969E-03 +8.653294E-06 +1.189702E-02 +3.303341E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.033083E-04 +2.720593E-07 +3.000000E-03 +3.000000E-06 +3.649225E-04 +1.756075E-06 +1.134112E-03 +8.940601E-07 +-9.392028E-04 +5.872882E-07 +1.484188E-03 +9.721094E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.500000E-02 +1.390000E-04 +1.511834E-02 +5.459835E-05 +7.753447E-03 +2.291820E-05 +6.142979E-03 +1.359405E-05 +1.043467E-02 +2.526769E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.912057E-04 +1.747704E-07 +1.000000E-03 +1.000000E-06 +-1.098110E-04 +1.205846E-08 +-4.819123E-04 +2.322395E-07 +1.614061E-04 +2.605194E-08 +8.813115E-04 +4.316252E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.935668E-04 +8.618149E-08 +1.900000E-02 +1.030000E-04 +1.035735E-02 +3.119381E-05 +6.483551E-03 +1.164471E-05 +3.924334E-03 +6.047577E-06 +9.748673E-03 +2.956634E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -389,120 +589,28 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.190621E-03 -8.859279E-07 -2.000000E-03 -2.000000E-06 -1.908405E-03 -1.821879E-06 -1.732819E-03 -1.508498E-06 -1.487670E-03 -1.131430E-06 -0.000000E+00 -0.000000E+00 -4.000000E-03 -4.000000E-06 -3.379122E-03 -2.880429E-06 -2.320644E-03 -1.498759E-06 -1.119131E-03 -6.212863E-07 -1.494579E-03 -6.241237E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.976389E-04 -8.858892E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.100000E-02 -1.150000E-04 -5.280651E-03 -1.222273E-05 -5.235520E-03 -1.202448E-05 -5.064093E-03 -1.787892E-05 -1.071093E-02 -2.748613E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.954046E-04 -2.673852E-07 +2.935668E-04 +8.618149E-08 +1.000000E-03 +1.000000E-06 +8.623139E-04 +7.435852E-07 +6.153778E-04 +3.786899E-07 +3.095388E-04 +9.581428E-08 0.000000E+00 0.000000E+00 +7.000000E-03 +1.500000E-05 +3.445754E-03 +3.819507E-06 +2.124056E-03 +1.976201E-06 +1.542203E-03 +1.531669E-06 +4.135720E-03 +4.532612E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -511,6 +619,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +5.874391E-04 +1.725424E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -519,6 +629,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.079655E-04 +9.484274E-08 +1.000000E-03 +1.000000E-06 +9.451745E-04 +8.933548E-07 +8.400323E-04 +7.056542E-07 +6.931788E-04 +4.804969E-07 0.000000E+00 0.000000E+00 2.600000E-02 @@ -561,6 +681,566 @@ tally 1: 5.268483E-07 0.000000E+00 0.000000E+00 +2.900000E-02 +1.950000E-04 +8.928267E-03 +2.594547E-05 +4.752762E-03 +1.522378E-05 +5.376579E-03 +1.088620E-05 +1.461149E-02 +4.367386E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.912057E-04 +1.747704E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.900000E-02 +9.700000E-05 +1.046968E-02 +3.828445E-05 +6.704767E-03 +2.668260E-05 +2.659611E-03 +1.143518E-05 +1.099391E-02 +2.847330E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.935668E-04 +8.618149E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.655540E-03 +2.523801E-06 +3.000000E-03 +5.000000E-06 +2.960960E-03 +4.866206E-06 +2.884206E-03 +4.608867E-06 +2.772329E-03 +4.247272E-06 +2.976389E-04 +8.858892E-08 +6.000000E-03 +8.000000E-06 +2.104495E-03 +2.749678E-06 +8.451272E-04 +9.362821E-07 +5.355137E-04 +3.419837E-07 +2.683856E-03 +1.512640E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.976389E-04 +8.858892E-08 +1.000000E-03 +1.000000E-06 +9.374310E-04 +8.787769E-07 +8.181653E-04 +6.693944E-07 +6.533352E-04 +4.268468E-07 +2.976389E-04 +8.858892E-08 +1.200000E-02 +4.600000E-05 +9.302157E-04 +3.853850E-06 +1.874541E-03 +3.092623E-06 +-1.511552E-03 +4.053466E-06 +5.941986E-03 +9.853873E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.186549E-03 +5.291648E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.935668E-04 +8.618149E-08 +1.000000E-03 +1.000000E-06 +9.893707E-04 +9.788543E-07 +9.682814E-04 +9.375689E-07 +9.370683E-04 +8.780970E-07 +0.000000E+00 +0.000000E+00 +2.300000E-02 +1.230000E-04 +5.099566E-03 +9.143616E-06 +4.738751E-03 +7.819254E-06 +3.929250E-03 +6.884420E-06 +1.015650E-02 +2.236950E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.977039E-04 +8.862764E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.912708E-04 +1.748091E-07 +2.000000E-03 +2.000000E-06 +1.762035E-03 +1.552542E-06 +1.328812E-03 +8.839688E-07 +7.771806E-04 +3.049398E-07 +0.000000E+00 +0.000000E+00 +3.100000E-02 +2.250000E-04 +1.389831E-02 +5.927254E-05 +9.999959E-03 +3.379365E-05 +4.584291E-03 +1.665226E-05 +1.729188E-02 +6.078654E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.792523E-03 +8.900699E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.700000E-02 +7.100000E-05 +3.566805E-03 +2.049908E-05 +5.418617E-03 +7.496014E-06 +2.451897E-03 +2.115374E-06 +7.760001E-03 +1.634548E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.977039E-04 +8.862764E-08 +1.000000E-03 +1.000000E-06 +-7.119580E-04 +5.068842E-07 +2.603263E-04 +6.776977E-08 +1.657364E-04 +2.746855E-08 +8.807005E-04 +7.756334E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.900000E-02 +2.030000E-04 +6.527719E-03 +1.422798E-05 +1.560049E-03 +2.934829E-06 +1.548553E-03 +8.929308E-06 +1.108618E-02 +3.019578E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.174573E-03 +8.619943E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.500000E-02 +5.500000E-05 +2.209492E-03 +2.545503E-06 +5.991182E-03 +1.290780E-05 +1.772063E-03 +2.006265E-06 +5.944487E-03 +1.042417E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.079655E-04 +9.484274E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.190621E-03 +8.859279E-07 +2.000000E-03 +2.000000E-06 +1.908405E-03 +1.821879E-06 +1.732819E-03 +1.508498E-06 +1.487670E-03 +1.131430E-06 +0.000000E+00 +0.000000E+00 +2.600000E-02 +1.460000E-04 +7.818547E-03 +3.176773E-05 +5.200193E-03 +1.419001E-05 +3.947828E-03 +8.417104E-06 +9.232714E-03 +1.900222E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.186919E-03 +5.294604E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.600000E-02 +2.740000E-04 +9.407788E-03 +2.403566E-05 +4.480017E-03 +6.102099E-06 +5.941113E-03 +1.265337E-05 +1.462273E-02 +4.551799E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.056694E-04 +1.834704E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.807005E-04 +7.756334E-07 +1.000000E-03 +1.000000E-06 +8.905295E-04 +7.930427E-07 +6.895641E-04 +4.754986E-07 +4.297756E-04 +1.847070E-07 +0.000000E+00 +0.000000E+00 +1.200000E-02 +3.000000E-05 +4.798420E-03 +7.171924E-06 +1.417651E-03 +4.997963E-06 +2.131704E-03 +3.253030E-06 +7.754475E-03 +1.333333E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.938723E-04 +8.636093E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.484383E-03 +1.504224E-06 +3.000000E-03 +5.000000E-06 +2.760812E-03 +4.139104E-06 +2.336063E-03 +2.844690E-06 +1.817042E-03 +1.656152E-06 +0.000000E+00 +0.000000E+00 +1.900000E-02 +9.900000E-05 +7.385212E-03 +2.033270E-05 +6.336514E-03 +2.028060E-05 +3.967026E-03 +1.027239E-05 +1.066281E-02 +2.937591E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.976389E-04 +8.858892E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +3.000000E-06 +1.134842E-03 +1.040850E-06 +6.127525E-05 +3.988312E-07 +4.938488E-05 +2.738492E-07 +1.484493E-03 +9.722888E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 2.300000E-02 1.650000E-04 9.507197E-03 @@ -601,6 +1281,566 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.100000E-02 +2.030000E-04 +1.194795E-02 +4.198084E-05 +8.484089E-03 +1.631808E-05 +5.880364E-03 +1.308096E-05 +1.342551E-02 +3.842917E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.915762E-04 +1.749886E-07 +1.000000E-03 +1.000000E-06 +-5.881991E-05 +3.459782E-09 +-4.948103E-04 +2.448373E-07 +8.772111E-05 +7.694993E-09 +5.871337E-04 +3.447260E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.900000E-02 +8.700000E-05 +5.469796E-03 +1.029265E-05 +4.923561E-04 +2.403244E-06 +2.579361E-03 +5.814745E-06 +8.693503E-03 +1.682274E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.976389E-04 +8.858892E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-03 +1.600000E-05 +5.411154E-03 +8.076329E-06 +3.145940E-03 +4.212660E-06 +2.637510E-03 +3.210372E-06 +3.866944E-03 +3.257876E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.175489E-03 +1.381775E-06 +1.000000E-03 +1.000000E-06 +7.809681E-04 +6.099112E-07 +4.148668E-04 +1.721145E-07 +1.935089E-05 +3.744570E-10 +0.000000E+00 +0.000000E+00 +8.000000E-03 +2.000000E-05 +3.721382E-03 +4.736982E-06 +-1.037031E-04 +6.648392E-07 +-5.996856E-04 +9.642316E-07 +3.248622E-03 +4.063214E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.938723E-04 +8.636093E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.800000E-02 +1.780000E-04 +1.190615E-02 +4.434442E-05 +7.332993E-03 +2.337416E-05 +6.867008E-03 +1.321552E-05 +1.283876E-02 +3.527488E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.954079E-04 +3.545105E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +3.880000E-04 +6.620484E-03 +3.751545E-05 +9.255367E-03 +1.963463E-05 +7.761524E-03 +1.694944E-05 +1.659048E-02 +7.200875E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.976389E-04 +8.858892E-08 +1.000000E-03 +1.000000E-06 +-5.273064E-04 +2.780520E-07 +-8.292201E-05 +6.876059E-09 +4.244131E-04 +1.801265E-07 +8.891501E-04 +4.407166E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.200000E-02 +3.400000E-05 +5.905081E-03 +1.535048E-05 +3.856089E-03 +8.589511E-06 +3.244585E-03 +5.882222E-06 +5.074321E-03 +5.793166E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-03 +8.000000E-06 +1.520286E-03 +4.076900E-06 +2.191143E-03 +3.717004E-06 +1.161623E-03 +3.726099E-06 +3.570376E-03 +5.251427E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-03 +4.000000E-06 +3.379122E-03 +2.880429E-06 +2.320644E-03 +1.498759E-06 +1.119131E-03 +6.212863E-07 +1.494579E-03 +6.241237E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.976389E-04 +8.858892E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.100000E-02 +1.950000E-04 +1.338410E-02 +5.097757E-05 +6.794436E-03 +1.428226E-05 +3.939298E-03 +9.052046E-06 +1.250316E-02 +3.147176E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.953428E-04 +1.772166E-07 +1.000000E-03 +1.000000E-06 +-5.747626E-05 +3.303520E-09 +-4.950447E-04 +2.450693E-07 +8.573970E-05 +7.351297E-09 +5.954079E-04 +3.545105E-07 +1.000000E-03 +1.000000E-06 +9.748367E-04 +9.503066E-07 +9.254598E-04 +8.564759E-07 +8.537292E-04 +7.288535E-07 +0.000000E+00 +0.000000E+00 +2.600000E-02 +1.800000E-04 +1.225587E-02 +3.757196E-05 +7.670283E-03 +2.316758E-05 +5.282346E-03 +1.407031E-05 +1.162837E-02 +3.241151E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.874391E-04 +1.725424E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.900000E-02 +9.900000E-05 +7.244455E-03 +2.708286E-05 +4.601657E-03 +5.366244E-06 +-1.675270E-03 +3.867377E-06 +9.216755E-03 +2.272207E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.079655E-04 +9.484274E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.159310E-04 +3.793709E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.000000E-03 +1.000000E-05 +1.316884E-03 +2.894217E-06 +2.095957E-03 +1.439521E-06 +1.013831E-04 +8.405300E-07 +2.404012E-03 +1.641294E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 1.500000E-02 6.300000E-05 5.790211E-03 @@ -641,16 +1881,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.700000E-02 -1.670000E-04 -1.789444E-02 -8.260005E-05 -1.049872E-02 -2.774537E-05 -5.665111E-03 -8.560197E-06 -1.100708E-02 -2.835296E-05 +1.900000E-02 +1.030000E-04 +3.010784E-03 +6.984061E-06 +5.243839E-03 +8.093978E-06 +-2.502286E-04 +2.564795E-06 +7.760559E-03 +1.654842E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -659,38 +1899,92 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.079655E-04 -9.484274E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.935668E-04 +8.618149E-08 1.000000E-03 1.000000E-06 --2.856031E-04 -8.156913E-08 --3.776463E-04 -1.426167E-07 -3.701637E-04 -1.370211E-07 -1.203065E-03 -7.240969E-07 -1.000000E-03 -1.000000E-06 -9.705482E-04 -9.419638E-07 -9.129457E-04 -8.334699E-07 -8.297310E-04 -6.884535E-07 +9.333938E-04 +8.712239E-07 +8.068359E-04 +6.509841E-07 +6.328968E-04 +4.005583E-07 +0.000000E+00 +0.000000E+00 +1.800000E-02 +1.220000E-04 +6.860987E-03 +2.966806E-05 +4.229750E-03 +1.617998E-05 +1.295452E-03 +8.613003E-07 +7.815193E-03 +2.039363E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.935668E-04 +8.618149E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 -2.300000E-02 -1.230000E-04 -5.099566E-03 -9.143616E-06 -4.738751E-03 -7.819254E-06 -3.929250E-03 -6.884420E-06 -1.015650E-02 -2.236950E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -699,8 +1993,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.977039E-04 -8.862764E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -709,28 +2001,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.912708E-04 -1.748091E-07 2.000000E-03 2.000000E-06 -1.762035E-03 -1.552542E-06 -1.328812E-03 -8.839688E-07 -7.771806E-04 -3.049398E-07 -0.000000E+00 -0.000000E+00 -2.800000E-02 -1.780000E-04 -1.190615E-02 -4.434442E-05 -7.332993E-03 -2.337416E-05 -6.867008E-03 -1.321552E-05 -1.283876E-02 -3.527488E-05 +1.502634E-03 +1.146555E-06 +7.198331E-04 +3.484978E-07 +-3.426513E-05 +1.342349E-07 +1.511030E-03 +1.198311E-06 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -739,8 +2021,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.954079E-04 -3.545105E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -802,446 +2082,6 @@ tally 1: 0.000000E+00 0.000000E+00 2.900000E-02 -2.230000E-04 -6.260565E-03 -1.544092E-05 -7.061757E-03 -2.562385E-05 -3.982541E-03 -7.962565E-06 -1.486928E-02 -5.763902E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.915762E-04 -1.749886E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.954079E-04 -3.545105E-07 -1.000000E-03 -1.000000E-06 -9.938157E-04 -9.876697E-07 -9.815046E-04 -9.633512E-07 -9.631807E-04 -9.277170E-07 -0.000000E+00 -0.000000E+00 -2.600000E-02 -1.460000E-04 -7.818547E-03 -3.176773E-05 -5.200193E-03 -1.419001E-05 -3.947828E-03 -8.417104E-06 -9.232714E-03 -1.900222E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.186919E-03 -5.294604E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.100000E-02 -1.950000E-04 -1.338410E-02 -5.097757E-05 -6.794436E-03 -1.428226E-05 -3.939298E-03 -9.052046E-06 -1.250316E-02 -3.147176E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.953428E-04 -1.772166E-07 -1.000000E-03 -1.000000E-06 --5.747626E-05 -3.303520E-09 --4.950447E-04 -2.450693E-07 -8.573970E-05 -7.351297E-09 -5.954079E-04 -3.545105E-07 -1.000000E-03 -1.000000E-06 -9.748367E-04 -9.503066E-07 -9.254598E-04 -8.564759E-07 -8.537292E-04 -7.288535E-07 -0.000000E+00 -0.000000E+00 -1.000000E-02 -2.600000E-05 -5.875085E-04 -4.563904E-07 --9.207198E-05 -5.154496E-07 -3.674257E-05 -1.178281E-06 -5.048984E-03 -5.880390E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.079655E-04 -9.484274E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.952778E-04 -3.543557E-07 -1.000000E-03 -1.000000E-06 -9.362621E-04 -8.765867E-07 -8.148801E-04 -6.640295E-07 -6.473941E-04 -4.191191E-07 -0.000000E+00 -0.000000E+00 -3.100000E-02 -2.130000E-04 -1.472240E-02 -5.500913E-05 -1.077445E-02 -2.987369E-05 -6.729425E-03 -1.249089E-05 -1.363637E-02 -4.345511E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.182717E-03 -5.268981E-07 -2.000000E-03 -2.000000E-06 --1.367978E-03 -9.381191E-07 -4.071787E-04 -9.316064E-08 -4.394728E-04 -1.064342E-07 -2.110881E-03 -1.737594E-06 -1.000000E-03 -1.000000E-06 -9.347357E-04 -8.737309E-07 -8.105963E-04 -6.570664E-07 -6.396651E-04 -4.091714E-07 -2.938723E-04 -8.636093E-08 -2.900000E-02 -1.950000E-04 -8.928267E-03 -2.594547E-05 -4.752762E-03 -1.522378E-05 -5.376579E-03 -1.088620E-05 -1.461149E-02 -4.367386E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.912057E-04 -1.747704E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.100000E-02 -2.030000E-04 -1.194795E-02 -4.198084E-05 -8.484089E-03 -1.631808E-05 -5.880364E-03 -1.308096E-05 -1.342551E-02 -3.842917E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.915762E-04 -1.749886E-07 -1.000000E-03 -1.000000E-06 --5.881991E-05 -3.459782E-09 --4.948103E-04 -2.448373E-07 -8.772111E-05 -7.694993E-09 -5.871337E-04 -3.447260E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.900000E-02 -1.030000E-04 -3.010784E-03 -6.984061E-06 -5.243839E-03 -8.093978E-06 --2.502286E-04 -2.564795E-06 -7.760559E-03 -1.654842E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.935668E-04 -8.618149E-08 -1.000000E-03 -1.000000E-06 -9.333938E-04 -8.712239E-07 -8.068359E-04 -6.509841E-07 -6.328968E-04 -4.005583E-07 -0.000000E+00 -0.000000E+00 -4.400000E-02 -4.320000E-04 -1.141886E-02 -4.208707E-05 -9.213446E-03 -2.259305E-05 -9.177440E-03 -2.088782E-05 -2.116869E-02 -9.629049E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.501009E-03 -6.405023E-07 -1.000000E-03 -1.000000E-06 -5.882614E-04 -3.460515E-07 -1.907719E-05 -3.639390E-10 --3.734703E-04 -1.394801E-07 -1.472277E-03 -9.506220E-07 -2.000000E-03 -2.000000E-06 -1.830192E-03 -1.679505E-06 -1.519257E-03 -1.189525E-06 -1.118506E-03 -7.332971E-07 -2.977039E-04 -8.862764E-08 -3.100000E-02 -2.250000E-04 -1.389831E-02 -5.927254E-05 -9.999959E-03 -3.379365E-05 -4.584291E-03 -1.665226E-05 -1.729188E-02 -6.078654E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.792523E-03 -8.900699E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -3.880000E-04 -6.620484E-03 -3.751545E-05 -9.255367E-03 -1.963463E-05 -7.761524E-03 -1.694944E-05 -1.659048E-02 -7.200875E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.976389E-04 -8.858892E-08 -1.000000E-03 -1.000000E-06 --5.273064E-04 -2.780520E-07 --8.292201E-05 -6.876059E-09 -4.244131E-04 -1.801265E-07 -8.891501E-04 -4.407166E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.900000E-02 1.970000E-04 4.944370E-03 2.340271E-05 @@ -1281,446 +2121,6 @@ tally 1: 3.184788E-07 0.000000E+00 0.000000E+00 -2.900000E-02 -1.990000E-04 -1.237546E-02 -3.198261E-05 -8.287792E-03 -2.747313E-05 -3.254969E-03 -8.653294E-06 -1.189702E-02 -3.303341E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.033083E-04 -2.720593E-07 -3.000000E-03 -3.000000E-06 -3.649225E-04 -1.756075E-06 -1.134112E-03 -8.940601E-07 --9.392028E-04 -5.872882E-07 -1.484188E-03 -9.721094E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.600000E-02 -2.740000E-04 -9.407788E-03 -2.403566E-05 -4.480017E-03 -6.102099E-06 -5.941113E-03 -1.265337E-05 -1.462273E-02 -4.551799E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.056694E-04 -1.834704E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.807005E-04 -7.756334E-07 -1.000000E-03 -1.000000E-06 -8.905295E-04 -7.930427E-07 -6.895641E-04 -4.754986E-07 -4.297756E-04 -1.847070E-07 -0.000000E+00 -0.000000E+00 -2.600000E-02 -1.800000E-04 -1.225587E-02 -3.757196E-05 -7.670283E-03 -2.316758E-05 -5.282346E-03 -1.407031E-05 -1.162837E-02 -3.241151E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.874391E-04 -1.725424E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -9.000000E-05 -5.358616E-03 -1.697599E-05 -3.060277E-03 -7.132281E-06 -2.485730E-03 -7.247489E-06 -9.248313E-03 -1.738407E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.991712E-04 -2.696131E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.954079E-04 -3.545105E-07 -1.000000E-03 -1.000000E-06 -9.816220E-04 -9.635817E-07 -9.453726E-04 -8.937294E-07 -8.922496E-04 -7.961093E-07 -0.000000E+00 -0.000000E+00 -2.300000E-02 -1.330000E-04 -1.081756E-02 -3.675127E-05 -2.530156E-03 -6.960955E-06 --1.930911E-03 -4.910249E-06 -1.162826E-02 -3.490280E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.957101E-04 -4.402865E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.900000E-02 -9.700000E-05 -1.046968E-02 -3.828445E-05 -6.704767E-03 -2.668260E-05 -2.659611E-03 -1.143518E-05 -1.099391E-02 -2.847330E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.935668E-04 -8.618149E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.655540E-03 -2.523801E-06 -3.000000E-03 -5.000000E-06 -2.960960E-03 -4.866206E-06 -2.884206E-03 -4.608867E-06 -2.772329E-03 -4.247272E-06 -2.976389E-04 -8.858892E-08 -1.900000E-02 -8.700000E-05 -5.469796E-03 -1.029265E-05 -4.923561E-04 -2.403244E-06 -2.579361E-03 -5.814745E-06 -8.693503E-03 -1.682274E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.976389E-04 -8.858892E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.800000E-02 -1.220000E-04 -6.860987E-03 -2.966806E-05 -4.229750E-03 -1.617998E-05 -1.295452E-03 -8.613003E-07 -7.815193E-03 -2.039363E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.935668E-04 -8.618149E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -1.080000E-04 -8.640372E-03 -1.765553E-05 -5.688468E-03 -1.038555E-05 -2.447898E-03 -4.466055E-06 -8.949668E-03 -1.935056E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.977039E-04 -8.862764E-08 -1.000000E-03 -1.000000E-06 --3.805163E-04 -1.447926E-07 --2.828111E-04 -7.998210E-08 -4.330345E-04 -1.875189E-07 -2.121142E-03 -1.958355E-06 -1.000000E-03 -1.000000E-06 -9.260022E-04 -8.574800E-07 -7.862200E-04 -6.181419E-07 -5.960676E-04 -3.552966E-07 -2.938723E-04 -8.636093E-08 -1.700000E-02 -7.100000E-05 -3.566805E-03 -2.049908E-05 -5.418617E-03 -7.496014E-06 -2.451897E-03 -2.115374E-06 -7.760001E-03 -1.634548E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.977039E-04 -8.862764E-08 -1.000000E-03 -1.000000E-06 --7.119580E-04 -5.068842E-07 -2.603263E-04 -6.776977E-08 -1.657364E-04 -2.746855E-08 -8.807005E-04 -7.756334E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.200000E-02 -3.400000E-05 -5.905081E-03 -1.535048E-05 -3.856089E-03 -8.589511E-06 -3.244585E-03 -5.882222E-06 -5.074321E-03 -5.793166E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 1.600000E-02 5.400000E-05 7.937805E-03 @@ -1761,446 +2161,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.500000E-02 -1.390000E-04 -1.511834E-02 -5.459835E-05 -7.753447E-03 -2.291820E-05 -6.142979E-03 -1.359405E-05 -1.043467E-02 -2.526769E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.912057E-04 -1.747704E-07 -1.000000E-03 -1.000000E-06 --1.098110E-04 -1.205846E-08 --4.819123E-04 -2.322395E-07 -1.614061E-04 -2.605194E-08 -8.813115E-04 -4.316252E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.935668E-04 -8.618149E-08 -1.200000E-02 -3.000000E-05 -4.798420E-03 -7.171924E-06 -1.417651E-03 -4.997963E-06 -2.131704E-03 -3.253030E-06 -7.754475E-03 -1.333333E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.938723E-04 -8.636093E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.484383E-03 -1.504224E-06 -3.000000E-03 -5.000000E-06 -2.760812E-03 -4.139104E-06 -2.336063E-03 -2.844690E-06 -1.817042E-03 -1.656152E-06 -0.000000E+00 -0.000000E+00 -1.900000E-02 -9.900000E-05 -7.244455E-03 -2.708286E-05 -4.601657E-03 -5.366244E-06 --1.675270E-03 -3.867377E-06 -9.216755E-03 -2.272207E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.079655E-04 -9.484274E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.159310E-04 -3.793709E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.000000E-03 -1.800000E-05 -4.925975E-03 -6.260377E-06 -3.176938E-03 -2.631319E-06 -2.008278E-03 -1.484516E-06 -3.844641E-03 -4.075869E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.977039E-04 -8.862764E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.238964E-04 -8.535846E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -3.400000E-05 -4.086838E-03 -5.900874E-06 -1.812330E-03 -3.716159E-06 -2.138941E-03 -3.006748E-06 -5.414129E-03 -8.079335E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.079655E-04 -9.484274E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -8.000000E-06 -2.104495E-03 -2.749678E-06 -8.451272E-04 -9.362821E-07 -5.355137E-04 -3.419837E-07 -2.683856E-03 -1.512640E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.976389E-04 -8.858892E-08 -1.000000E-03 -1.000000E-06 -9.374310E-04 -8.787769E-07 -8.181653E-04 -6.693944E-07 -6.533352E-04 -4.268468E-07 -2.976389E-04 -8.858892E-08 -8.000000E-03 -1.600000E-05 -5.411154E-03 -8.076329E-06 -3.145940E-03 -4.212660E-06 -2.637510E-03 -3.210372E-06 -3.866944E-03 -3.257876E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.175489E-03 -1.381775E-06 -1.000000E-03 -1.000000E-06 -7.809681E-04 -6.099112E-07 -4.148668E-04 -1.721145E-07 -1.935089E-05 -3.744570E-10 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -3.400000E-05 -4.840884E-03 -1.080853E-05 -3.402096E-03 -4.113972E-06 -1.374077E-03 -2.333511E-06 -4.754696E-03 -7.172310E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.079655E-04 -9.484274E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.900000E-02 -2.030000E-04 -6.527719E-03 -1.422798E-05 -1.560049E-03 -2.934829E-06 -1.548553E-03 -8.929308E-06 -1.108618E-02 -3.019578E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.174573E-03 -8.619943E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-03 -8.000000E-06 -1.520286E-03 -4.076900E-06 -2.191143E-03 -3.717004E-06 -1.161623E-03 -3.726099E-06 -3.570376E-03 -5.251427E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 2.000000E-03 2.000000E-06 1.447007E-04 @@ -2241,16 +2201,56 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.900000E-02 -1.030000E-04 -1.035735E-02 -3.119381E-05 -6.483551E-03 -1.164471E-05 -3.924334E-03 -6.047577E-06 -9.748673E-03 -2.956634E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +2.600000E-05 +5.875085E-04 +4.563904E-07 +-9.207198E-05 +5.154496E-07 +3.674257E-05 +1.178281E-06 +5.048984E-03 +5.880390E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2269,28 +2269,28 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.935668E-04 -8.618149E-08 +5.952778E-04 +3.543557E-07 1.000000E-03 1.000000E-06 -8.623139E-04 -7.435852E-07 -6.153778E-04 -3.786899E-07 -3.095388E-04 -9.581428E-08 +9.362621E-04 +8.765867E-07 +8.148801E-04 +6.640295E-07 +6.473941E-04 +4.191191E-07 0.000000E+00 0.000000E+00 -1.900000E-02 -9.900000E-05 -7.385212E-03 -2.033270E-05 -6.336514E-03 -2.028060E-05 -3.967026E-03 -1.027239E-05 -1.066281E-02 -2.937591E-05 +2.000000E-02 +9.000000E-05 +5.358616E-03 +1.697599E-05 +3.060277E-03 +7.132281E-06 +2.485730E-03 +7.247489E-06 +9.248313E-03 +1.738407E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2299,8 +2299,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.976389E-04 -8.858892E-08 +8.991712E-04 +2.696131E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2309,6 +2309,28 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +5.954079E-04 +3.545105E-07 +1.000000E-03 +1.000000E-06 +9.816220E-04 +9.635817E-07 +9.453726E-04 +8.937294E-07 +8.922496E-04 +7.961093E-07 +0.000000E+00 +0.000000E+00 +8.000000E-03 +1.800000E-05 +4.925975E-03 +6.260377E-06 +3.176938E-03 +2.631319E-06 +2.008278E-03 +1.484516E-06 +3.844641E-03 +4.075869E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2317,32 +2339,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -1.000000E-05 -1.316884E-03 -2.894217E-06 -2.095957E-03 -1.439521E-06 -1.013831E-04 -8.405300E-07 -2.404012E-03 -1.641294E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +2.977039E-04 +8.862764E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2351,6 +2349,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +9.238964E-04 +8.535846E-07 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_statepoint_restart/results_true.dat b/tests/test_statepoint_restart/results_true.dat index 49afeb1d52..0e83121c58 100644 --- a/tests/test_statepoint_restart/results_true.dat +++ b/tests/test_statepoint_restart/results_true.dat @@ -41,16 +41,16 @@ tally 1: 1.416293E-07 0.000000E+00 0.000000E+00 -7.000000E-03 -1.500000E-05 -3.445754E-03 -3.819507E-06 -2.124056E-03 -1.976201E-06 -1.542203E-03 -1.531669E-06 -4.135720E-03 -4.532612E-06 +2.100000E-02 +1.150000E-04 +5.280651E-03 +1.222273E-05 +5.235520E-03 +1.202448E-05 +5.064093E-03 +1.787892E-05 +1.071093E-02 +2.748613E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -59,8 +59,118 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.874391E-04 -1.725424E-07 +8.954046E-04 +2.673852E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.100000E-02 +2.130000E-04 +1.472240E-02 +5.500913E-05 +1.077445E-02 +2.987369E-05 +6.729425E-03 +1.249089E-05 +1.363637E-02 +4.345511E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.182717E-03 +5.268981E-07 +2.000000E-03 +2.000000E-06 +-1.367978E-03 +9.381191E-07 +4.071787E-04 +9.316064E-08 +4.394728E-04 +1.064342E-07 +2.110881E-03 +1.737594E-06 +1.000000E-03 +1.000000E-06 +9.347357E-04 +8.737309E-07 +8.105963E-04 +6.570664E-07 +6.396651E-04 +4.091714E-07 +2.938723E-04 +8.636093E-08 +2.300000E-02 +1.330000E-04 +1.081756E-02 +3.675127E-05 +2.530156E-03 +6.960955E-06 +-1.930911E-03 +4.910249E-06 +1.162826E-02 +3.490280E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.957101E-04 +4.402865E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +3.400000E-05 +4.086838E-03 +5.900874E-06 +1.812330E-03 +3.716159E-06 +2.138941E-03 +3.006748E-06 +5.414129E-03 +8.079335E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -71,76 +181,6 @@ tally 1: 0.000000E+00 3.079655E-04 9.484274E-08 -1.000000E-03 -1.000000E-06 -9.451745E-04 -8.933548E-07 -8.400323E-04 -7.056542E-07 -6.931788E-04 -4.804969E-07 -0.000000E+00 -0.000000E+00 -3.000000E-03 -3.000000E-06 -1.134842E-03 -1.040850E-06 -6.127525E-05 -3.988312E-07 -4.938488E-05 -2.738492E-07 -1.484493E-03 -9.722888E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -201,16 +241,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.200000E-02 -4.600000E-05 -9.302157E-04 -3.853850E-06 -1.874541E-03 -3.092623E-06 --1.511552E-03 -4.053466E-06 -5.941986E-03 -9.853873E-06 +2.700000E-02 +1.670000E-04 +1.789444E-02 +8.260005E-05 +1.049872E-02 +2.774537E-05 +5.665111E-03 +8.560197E-06 +1.100708E-02 +2.835296E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -219,60 +259,38 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.186549E-03 -5.291648E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.935668E-04 -8.618149E-08 +3.079655E-04 +9.484274E-08 1.000000E-03 1.000000E-06 -9.893707E-04 -9.788543E-07 -9.682814E-04 -9.375689E-07 -9.370683E-04 -8.780970E-07 -0.000000E+00 -0.000000E+00 -8.000000E-03 -2.000000E-05 -3.721382E-03 -4.736982E-06 --1.037031E-04 -6.648392E-07 --5.996856E-04 -9.642316E-07 -3.248622E-03 -4.063214E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.938723E-04 -8.636093E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +-2.856031E-04 +8.156913E-08 +-3.776463E-04 +1.426167E-07 +3.701637E-04 +1.370211E-07 +1.203065E-03 +7.240969E-07 +1.000000E-03 +1.000000E-06 +9.705482E-04 +9.419638E-07 +9.129457E-04 +8.334699E-07 +8.297310E-04 +6.884535E-07 0.000000E+00 0.000000E+00 +4.400000E-02 +4.320000E-04 +1.141886E-02 +4.208707E-05 +9.213446E-03 +2.259305E-05 +9.177440E-03 +2.088782E-05 +2.116869E-02 +9.629049E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -281,16 +299,38 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +1.501009E-03 +6.405023E-07 +1.000000E-03 +1.000000E-06 +5.882614E-04 +3.460515E-07 +1.907719E-05 +3.639390E-10 +-3.734703E-04 +1.394801E-07 +1.472277E-03 +9.506220E-07 2.000000E-03 2.000000E-06 -1.502634E-03 -1.146555E-06 -7.198331E-04 -3.484978E-07 --3.426513E-05 -1.342349E-07 -1.511030E-03 -1.198311E-06 +1.830192E-03 +1.679505E-06 +1.519257E-03 +1.189525E-06 +1.118506E-03 +7.332971E-07 +2.977039E-04 +8.862764E-08 +2.000000E-02 +1.080000E-04 +8.640372E-03 +1.765553E-05 +5.688468E-03 +1.038555E-05 +2.447898E-03 +4.466055E-06 +8.949668E-03 +1.935056E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -299,6 +339,38 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +2.977039E-04 +8.862764E-08 +1.000000E-03 +1.000000E-06 +-3.805163E-04 +1.447926E-07 +-2.828111E-04 +7.998210E-08 +4.330345E-04 +1.875189E-07 +2.121142E-03 +1.958355E-06 +1.000000E-03 +1.000000E-06 +9.260022E-04 +8.574800E-07 +7.862200E-04 +6.181419E-07 +5.960676E-04 +3.552966E-07 +2.938723E-04 +8.636093E-08 +1.000000E-02 +3.400000E-05 +4.840884E-03 +1.080853E-05 +3.402096E-03 +4.113972E-06 +1.374077E-03 +2.333511E-06 +4.754696E-03 +7.172310E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -307,6 +379,14 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.079655E-04 +9.484274E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -361,16 +441,136 @@ tally 1: 1.052422E-07 0.000000E+00 0.000000E+00 -1.500000E-02 -5.500000E-05 -2.209492E-03 -2.545503E-06 -5.991182E-03 -1.290780E-05 -1.772063E-03 -2.006265E-06 -5.944487E-03 -1.042417E-05 +2.900000E-02 +2.230000E-04 +6.260565E-03 +1.544092E-05 +7.061757E-03 +2.562385E-05 +3.982541E-03 +7.962565E-06 +1.486928E-02 +5.763902E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.915762E-04 +1.749886E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.954079E-04 +3.545105E-07 +1.000000E-03 +1.000000E-06 +9.938157E-04 +9.876697E-07 +9.815046E-04 +9.633512E-07 +9.631807E-04 +9.277170E-07 +0.000000E+00 +0.000000E+00 +2.900000E-02 +1.990000E-04 +1.237546E-02 +3.198261E-05 +8.287792E-03 +2.747313E-05 +3.254969E-03 +8.653294E-06 +1.189702E-02 +3.303341E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +9.033083E-04 +2.720593E-07 +3.000000E-03 +3.000000E-06 +3.649225E-04 +1.756075E-06 +1.134112E-03 +8.940601E-07 +-9.392028E-04 +5.872882E-07 +1.484188E-03 +9.721094E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.500000E-02 +1.390000E-04 +1.511834E-02 +5.459835E-05 +7.753447E-03 +2.291820E-05 +6.142979E-03 +1.359405E-05 +1.043467E-02 +2.526769E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.912057E-04 +1.747704E-07 +1.000000E-03 +1.000000E-06 +-1.098110E-04 +1.205846E-08 +-4.819123E-04 +2.322395E-07 +1.614061E-04 +2.605194E-08 +8.813115E-04 +4.316252E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.935668E-04 +8.618149E-08 +1.900000E-02 +1.030000E-04 +1.035735E-02 +3.119381E-05 +6.483551E-03 +1.164471E-05 +3.924334E-03 +6.047577E-06 +9.748673E-03 +2.956634E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -389,120 +589,28 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.190621E-03 -8.859279E-07 -2.000000E-03 -2.000000E-06 -1.908405E-03 -1.821879E-06 -1.732819E-03 -1.508498E-06 -1.487670E-03 -1.131430E-06 -0.000000E+00 -0.000000E+00 -4.000000E-03 -4.000000E-06 -3.379122E-03 -2.880429E-06 -2.320644E-03 -1.498759E-06 -1.119131E-03 -6.212863E-07 -1.494579E-03 -6.241237E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.976389E-04 -8.858892E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.100000E-02 -1.150000E-04 -5.280651E-03 -1.222273E-05 -5.235520E-03 -1.202448E-05 -5.064093E-03 -1.787892E-05 -1.071093E-02 -2.748613E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.954046E-04 -2.673852E-07 +2.935668E-04 +8.618149E-08 +1.000000E-03 +1.000000E-06 +8.623139E-04 +7.435852E-07 +6.153778E-04 +3.786899E-07 +3.095388E-04 +9.581428E-08 0.000000E+00 0.000000E+00 +7.000000E-03 +1.500000E-05 +3.445754E-03 +3.819507E-06 +2.124056E-03 +1.976201E-06 +1.542203E-03 +1.531669E-06 +4.135720E-03 +4.532612E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -511,6 +619,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +5.874391E-04 +1.725424E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -519,6 +629,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.079655E-04 +9.484274E-08 +1.000000E-03 +1.000000E-06 +9.451745E-04 +8.933548E-07 +8.400323E-04 +7.056542E-07 +6.931788E-04 +4.804969E-07 0.000000E+00 0.000000E+00 2.600000E-02 @@ -561,6 +681,566 @@ tally 1: 5.268483E-07 0.000000E+00 0.000000E+00 +2.900000E-02 +1.950000E-04 +8.928267E-03 +2.594547E-05 +4.752762E-03 +1.522378E-05 +5.376579E-03 +1.088620E-05 +1.461149E-02 +4.367386E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.912057E-04 +1.747704E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.900000E-02 +9.700000E-05 +1.046968E-02 +3.828445E-05 +6.704767E-03 +2.668260E-05 +2.659611E-03 +1.143518E-05 +1.099391E-02 +2.847330E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.935668E-04 +8.618149E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.655540E-03 +2.523801E-06 +3.000000E-03 +5.000000E-06 +2.960960E-03 +4.866206E-06 +2.884206E-03 +4.608867E-06 +2.772329E-03 +4.247272E-06 +2.976389E-04 +8.858892E-08 +6.000000E-03 +8.000000E-06 +2.104495E-03 +2.749678E-06 +8.451272E-04 +9.362821E-07 +5.355137E-04 +3.419837E-07 +2.683856E-03 +1.512640E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.976389E-04 +8.858892E-08 +1.000000E-03 +1.000000E-06 +9.374310E-04 +8.787769E-07 +8.181653E-04 +6.693944E-07 +6.533352E-04 +4.268468E-07 +2.976389E-04 +8.858892E-08 +1.200000E-02 +4.600000E-05 +9.302157E-04 +3.853850E-06 +1.874541E-03 +3.092623E-06 +-1.511552E-03 +4.053466E-06 +5.941986E-03 +9.853873E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.186549E-03 +5.291648E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.935668E-04 +8.618149E-08 +1.000000E-03 +1.000000E-06 +9.893707E-04 +9.788543E-07 +9.682814E-04 +9.375689E-07 +9.370683E-04 +8.780970E-07 +0.000000E+00 +0.000000E+00 +2.300000E-02 +1.230000E-04 +5.099566E-03 +9.143616E-06 +4.738751E-03 +7.819254E-06 +3.929250E-03 +6.884420E-06 +1.015650E-02 +2.236950E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.977039E-04 +8.862764E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.912708E-04 +1.748091E-07 +2.000000E-03 +2.000000E-06 +1.762035E-03 +1.552542E-06 +1.328812E-03 +8.839688E-07 +7.771806E-04 +3.049398E-07 +0.000000E+00 +0.000000E+00 +3.100000E-02 +2.250000E-04 +1.389831E-02 +5.927254E-05 +9.999959E-03 +3.379365E-05 +4.584291E-03 +1.665226E-05 +1.729188E-02 +6.078654E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.792523E-03 +8.900699E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.700000E-02 +7.100000E-05 +3.566805E-03 +2.049908E-05 +5.418617E-03 +7.496014E-06 +2.451897E-03 +2.115374E-06 +7.760001E-03 +1.634548E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.977039E-04 +8.862764E-08 +1.000000E-03 +1.000000E-06 +-7.119580E-04 +5.068842E-07 +2.603263E-04 +6.776977E-08 +1.657364E-04 +2.746855E-08 +8.807005E-04 +7.756334E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.900000E-02 +2.030000E-04 +6.527719E-03 +1.422798E-05 +1.560049E-03 +2.934829E-06 +1.548553E-03 +8.929308E-06 +1.108618E-02 +3.019578E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.174573E-03 +8.619943E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.500000E-02 +5.500000E-05 +2.209492E-03 +2.545503E-06 +5.991182E-03 +1.290780E-05 +1.772063E-03 +2.006265E-06 +5.944487E-03 +1.042417E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.079655E-04 +9.484274E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.190621E-03 +8.859279E-07 +2.000000E-03 +2.000000E-06 +1.908405E-03 +1.821879E-06 +1.732819E-03 +1.508498E-06 +1.487670E-03 +1.131430E-06 +0.000000E+00 +0.000000E+00 +2.600000E-02 +1.460000E-04 +7.818547E-03 +3.176773E-05 +5.200193E-03 +1.419001E-05 +3.947828E-03 +8.417104E-06 +9.232714E-03 +1.900222E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.186919E-03 +5.294604E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.600000E-02 +2.740000E-04 +9.407788E-03 +2.403566E-05 +4.480017E-03 +6.102099E-06 +5.941113E-03 +1.265337E-05 +1.462273E-02 +4.551799E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.056694E-04 +1.834704E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.807005E-04 +7.756334E-07 +1.000000E-03 +1.000000E-06 +8.905295E-04 +7.930427E-07 +6.895641E-04 +4.754986E-07 +4.297756E-04 +1.847070E-07 +0.000000E+00 +0.000000E+00 +1.200000E-02 +3.000000E-05 +4.798420E-03 +7.171924E-06 +1.417651E-03 +4.997963E-06 +2.131704E-03 +3.253030E-06 +7.754475E-03 +1.333333E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.938723E-04 +8.636093E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.484383E-03 +1.504224E-06 +3.000000E-03 +5.000000E-06 +2.760812E-03 +4.139104E-06 +2.336063E-03 +2.844690E-06 +1.817042E-03 +1.656152E-06 +0.000000E+00 +0.000000E+00 +1.900000E-02 +9.900000E-05 +7.385212E-03 +2.033270E-05 +6.336514E-03 +2.028060E-05 +3.967026E-03 +1.027239E-05 +1.066281E-02 +2.937591E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.976389E-04 +8.858892E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.000000E-03 +3.000000E-06 +1.134842E-03 +1.040850E-06 +6.127525E-05 +3.988312E-07 +4.938488E-05 +2.738492E-07 +1.484493E-03 +9.722888E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 2.300000E-02 1.650000E-04 9.507197E-03 @@ -601,6 +1281,566 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +3.100000E-02 +2.030000E-04 +1.194795E-02 +4.198084E-05 +8.484089E-03 +1.631808E-05 +5.880364E-03 +1.308096E-05 +1.342551E-02 +3.842917E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.915762E-04 +1.749886E-07 +1.000000E-03 +1.000000E-06 +-5.881991E-05 +3.459782E-09 +-4.948103E-04 +2.448373E-07 +8.772111E-05 +7.694993E-09 +5.871337E-04 +3.447260E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.900000E-02 +8.700000E-05 +5.469796E-03 +1.029265E-05 +4.923561E-04 +2.403244E-06 +2.579361E-03 +5.814745E-06 +8.693503E-03 +1.682274E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.976389E-04 +8.858892E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +8.000000E-03 +1.600000E-05 +5.411154E-03 +8.076329E-06 +3.145940E-03 +4.212660E-06 +2.637510E-03 +3.210372E-06 +3.866944E-03 +3.257876E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.175489E-03 +1.381775E-06 +1.000000E-03 +1.000000E-06 +7.809681E-04 +6.099112E-07 +4.148668E-04 +1.721145E-07 +1.935089E-05 +3.744570E-10 +0.000000E+00 +0.000000E+00 +8.000000E-03 +2.000000E-05 +3.721382E-03 +4.736982E-06 +-1.037031E-04 +6.648392E-07 +-5.996856E-04 +9.642316E-07 +3.248622E-03 +4.063214E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.938723E-04 +8.636093E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.800000E-02 +1.780000E-04 +1.190615E-02 +4.434442E-05 +7.332993E-03 +2.337416E-05 +6.867008E-03 +1.321552E-05 +1.283876E-02 +3.527488E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.954079E-04 +3.545105E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-02 +3.880000E-04 +6.620484E-03 +3.751545E-05 +9.255367E-03 +1.963463E-05 +7.761524E-03 +1.694944E-05 +1.659048E-02 +7.200875E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.976389E-04 +8.858892E-08 +1.000000E-03 +1.000000E-06 +-5.273064E-04 +2.780520E-07 +-8.292201E-05 +6.876059E-09 +4.244131E-04 +1.801265E-07 +8.891501E-04 +4.407166E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.200000E-02 +3.400000E-05 +5.905081E-03 +1.535048E-05 +3.856089E-03 +8.589511E-06 +3.244585E-03 +5.882222E-06 +5.074321E-03 +5.793166E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-03 +8.000000E-06 +1.520286E-03 +4.076900E-06 +2.191143E-03 +3.717004E-06 +1.161623E-03 +3.726099E-06 +3.570376E-03 +5.251427E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +4.000000E-03 +4.000000E-06 +3.379122E-03 +2.880429E-06 +2.320644E-03 +1.498759E-06 +1.119131E-03 +6.212863E-07 +1.494579E-03 +6.241237E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.976389E-04 +8.858892E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.100000E-02 +1.950000E-04 +1.338410E-02 +5.097757E-05 +6.794436E-03 +1.428226E-05 +3.939298E-03 +9.052046E-06 +1.250316E-02 +3.147176E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.953428E-04 +1.772166E-07 +1.000000E-03 +1.000000E-06 +-5.747626E-05 +3.303520E-09 +-4.950447E-04 +2.450693E-07 +8.573970E-05 +7.351297E-09 +5.954079E-04 +3.545105E-07 +1.000000E-03 +1.000000E-06 +9.748367E-04 +9.503066E-07 +9.254598E-04 +8.564759E-07 +8.537292E-04 +7.288535E-07 +0.000000E+00 +0.000000E+00 +2.600000E-02 +1.800000E-04 +1.225587E-02 +3.757196E-05 +7.670283E-03 +2.316758E-05 +5.282346E-03 +1.407031E-05 +1.162837E-02 +3.241151E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +5.874391E-04 +1.725424E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.900000E-02 +9.900000E-05 +7.244455E-03 +2.708286E-05 +4.601657E-03 +5.366244E-06 +-1.675270E-03 +3.867377E-06 +9.216755E-03 +2.272207E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +3.079655E-04 +9.484274E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.159310E-04 +3.793709E-07 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +6.000000E-03 +1.000000E-05 +1.316884E-03 +2.894217E-06 +2.095957E-03 +1.439521E-06 +1.013831E-04 +8.405300E-07 +2.404012E-03 +1.641294E-06 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 1.500000E-02 6.300000E-05 5.790211E-03 @@ -641,16 +1881,16 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.700000E-02 -1.670000E-04 -1.789444E-02 -8.260005E-05 -1.049872E-02 -2.774537E-05 -5.665111E-03 -8.560197E-06 -1.100708E-02 -2.835296E-05 +1.900000E-02 +1.030000E-04 +3.010784E-03 +6.984061E-06 +5.243839E-03 +8.093978E-06 +-2.502286E-04 +2.564795E-06 +7.760559E-03 +1.654842E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -659,38 +1899,92 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.079655E-04 -9.484274E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.935668E-04 +8.618149E-08 1.000000E-03 1.000000E-06 --2.856031E-04 -8.156913E-08 --3.776463E-04 -1.426167E-07 -3.701637E-04 -1.370211E-07 -1.203065E-03 -7.240969E-07 -1.000000E-03 -1.000000E-06 -9.705482E-04 -9.419638E-07 -9.129457E-04 -8.334699E-07 -8.297310E-04 -6.884535E-07 +9.333938E-04 +8.712239E-07 +8.068359E-04 +6.509841E-07 +6.328968E-04 +4.005583E-07 +0.000000E+00 +0.000000E+00 +1.800000E-02 +1.220000E-04 +6.860987E-03 +2.966806E-05 +4.229750E-03 +1.617998E-05 +1.295452E-03 +8.613003E-07 +7.815193E-03 +2.039363E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +2.935668E-04 +8.618149E-08 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 -2.300000E-02 -1.230000E-04 -5.099566E-03 -9.143616E-06 -4.738751E-03 -7.819254E-06 -3.929250E-03 -6.884420E-06 -1.015650E-02 -2.236950E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -699,8 +1993,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.977039E-04 -8.862764E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -709,28 +2001,18 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.912708E-04 -1.748091E-07 2.000000E-03 2.000000E-06 -1.762035E-03 -1.552542E-06 -1.328812E-03 -8.839688E-07 -7.771806E-04 -3.049398E-07 -0.000000E+00 -0.000000E+00 -2.800000E-02 -1.780000E-04 -1.190615E-02 -4.434442E-05 -7.332993E-03 -2.337416E-05 -6.867008E-03 -1.321552E-05 -1.283876E-02 -3.527488E-05 +1.502634E-03 +1.146555E-06 +7.198331E-04 +3.484978E-07 +-3.426513E-05 +1.342349E-07 +1.511030E-03 +1.198311E-06 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 @@ -739,8 +2021,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -5.954079E-04 -3.545105E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -802,446 +2082,6 @@ tally 1: 0.000000E+00 0.000000E+00 2.900000E-02 -2.230000E-04 -6.260565E-03 -1.544092E-05 -7.061757E-03 -2.562385E-05 -3.982541E-03 -7.962565E-06 -1.486928E-02 -5.763902E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.915762E-04 -1.749886E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.954079E-04 -3.545105E-07 -1.000000E-03 -1.000000E-06 -9.938157E-04 -9.876697E-07 -9.815046E-04 -9.633512E-07 -9.631807E-04 -9.277170E-07 -0.000000E+00 -0.000000E+00 -2.600000E-02 -1.460000E-04 -7.818547E-03 -3.176773E-05 -5.200193E-03 -1.419001E-05 -3.947828E-03 -8.417104E-06 -9.232714E-03 -1.900222E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.186919E-03 -5.294604E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.100000E-02 -1.950000E-04 -1.338410E-02 -5.097757E-05 -6.794436E-03 -1.428226E-05 -3.939298E-03 -9.052046E-06 -1.250316E-02 -3.147176E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.953428E-04 -1.772166E-07 -1.000000E-03 -1.000000E-06 --5.747626E-05 -3.303520E-09 --4.950447E-04 -2.450693E-07 -8.573970E-05 -7.351297E-09 -5.954079E-04 -3.545105E-07 -1.000000E-03 -1.000000E-06 -9.748367E-04 -9.503066E-07 -9.254598E-04 -8.564759E-07 -8.537292E-04 -7.288535E-07 -0.000000E+00 -0.000000E+00 -1.000000E-02 -2.600000E-05 -5.875085E-04 -4.563904E-07 --9.207198E-05 -5.154496E-07 -3.674257E-05 -1.178281E-06 -5.048984E-03 -5.880390E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.079655E-04 -9.484274E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.952778E-04 -3.543557E-07 -1.000000E-03 -1.000000E-06 -9.362621E-04 -8.765867E-07 -8.148801E-04 -6.640295E-07 -6.473941E-04 -4.191191E-07 -0.000000E+00 -0.000000E+00 -3.100000E-02 -2.130000E-04 -1.472240E-02 -5.500913E-05 -1.077445E-02 -2.987369E-05 -6.729425E-03 -1.249089E-05 -1.363637E-02 -4.345511E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.182717E-03 -5.268981E-07 -2.000000E-03 -2.000000E-06 --1.367978E-03 -9.381191E-07 -4.071787E-04 -9.316064E-08 -4.394728E-04 -1.064342E-07 -2.110881E-03 -1.737594E-06 -1.000000E-03 -1.000000E-06 -9.347357E-04 -8.737309E-07 -8.105963E-04 -6.570664E-07 -6.396651E-04 -4.091714E-07 -2.938723E-04 -8.636093E-08 -2.900000E-02 -1.950000E-04 -8.928267E-03 -2.594547E-05 -4.752762E-03 -1.522378E-05 -5.376579E-03 -1.088620E-05 -1.461149E-02 -4.367386E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.912057E-04 -1.747704E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.100000E-02 -2.030000E-04 -1.194795E-02 -4.198084E-05 -8.484089E-03 -1.631808E-05 -5.880364E-03 -1.308096E-05 -1.342551E-02 -3.842917E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.915762E-04 -1.749886E-07 -1.000000E-03 -1.000000E-06 --5.881991E-05 -3.459782E-09 --4.948103E-04 -2.448373E-07 -8.772111E-05 -7.694993E-09 -5.871337E-04 -3.447260E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.900000E-02 -1.030000E-04 -3.010784E-03 -6.984061E-06 -5.243839E-03 -8.093978E-06 --2.502286E-04 -2.564795E-06 -7.760559E-03 -1.654842E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.935668E-04 -8.618149E-08 -1.000000E-03 -1.000000E-06 -9.333938E-04 -8.712239E-07 -8.068359E-04 -6.509841E-07 -6.328968E-04 -4.005583E-07 -0.000000E+00 -0.000000E+00 -4.400000E-02 -4.320000E-04 -1.141886E-02 -4.208707E-05 -9.213446E-03 -2.259305E-05 -9.177440E-03 -2.088782E-05 -2.116869E-02 -9.629049E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.501009E-03 -6.405023E-07 -1.000000E-03 -1.000000E-06 -5.882614E-04 -3.460515E-07 -1.907719E-05 -3.639390E-10 --3.734703E-04 -1.394801E-07 -1.472277E-03 -9.506220E-07 -2.000000E-03 -2.000000E-06 -1.830192E-03 -1.679505E-06 -1.519257E-03 -1.189525E-06 -1.118506E-03 -7.332971E-07 -2.977039E-04 -8.862764E-08 -3.100000E-02 -2.250000E-04 -1.389831E-02 -5.927254E-05 -9.999959E-03 -3.379365E-05 -4.584291E-03 -1.665226E-05 -1.729188E-02 -6.078654E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.792523E-03 -8.900699E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-02 -3.880000E-04 -6.620484E-03 -3.751545E-05 -9.255367E-03 -1.963463E-05 -7.761524E-03 -1.694944E-05 -1.659048E-02 -7.200875E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.976389E-04 -8.858892E-08 -1.000000E-03 -1.000000E-06 --5.273064E-04 -2.780520E-07 --8.292201E-05 -6.876059E-09 -4.244131E-04 -1.801265E-07 -8.891501E-04 -4.407166E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.900000E-02 1.970000E-04 4.944370E-03 2.340271E-05 @@ -1281,446 +2121,6 @@ tally 1: 3.184788E-07 0.000000E+00 0.000000E+00 -2.900000E-02 -1.990000E-04 -1.237546E-02 -3.198261E-05 -8.287792E-03 -2.747313E-05 -3.254969E-03 -8.653294E-06 -1.189702E-02 -3.303341E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.033083E-04 -2.720593E-07 -3.000000E-03 -3.000000E-06 -3.649225E-04 -1.756075E-06 -1.134112E-03 -8.940601E-07 --9.392028E-04 -5.872882E-07 -1.484188E-03 -9.721094E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.600000E-02 -2.740000E-04 -9.407788E-03 -2.403566E-05 -4.480017E-03 -6.102099E-06 -5.941113E-03 -1.265337E-05 -1.462273E-02 -4.551799E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.056694E-04 -1.834704E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.807005E-04 -7.756334E-07 -1.000000E-03 -1.000000E-06 -8.905295E-04 -7.930427E-07 -6.895641E-04 -4.754986E-07 -4.297756E-04 -1.847070E-07 -0.000000E+00 -0.000000E+00 -2.600000E-02 -1.800000E-04 -1.225587E-02 -3.757196E-05 -7.670283E-03 -2.316758E-05 -5.282346E-03 -1.407031E-05 -1.162837E-02 -3.241151E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.874391E-04 -1.725424E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -9.000000E-05 -5.358616E-03 -1.697599E-05 -3.060277E-03 -7.132281E-06 -2.485730E-03 -7.247489E-06 -9.248313E-03 -1.738407E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.991712E-04 -2.696131E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.954079E-04 -3.545105E-07 -1.000000E-03 -1.000000E-06 -9.816220E-04 -9.635817E-07 -9.453726E-04 -8.937294E-07 -8.922496E-04 -7.961093E-07 -0.000000E+00 -0.000000E+00 -2.300000E-02 -1.330000E-04 -1.081756E-02 -3.675127E-05 -2.530156E-03 -6.960955E-06 --1.930911E-03 -4.910249E-06 -1.162826E-02 -3.490280E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.957101E-04 -4.402865E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.900000E-02 -9.700000E-05 -1.046968E-02 -3.828445E-05 -6.704767E-03 -2.668260E-05 -2.659611E-03 -1.143518E-05 -1.099391E-02 -2.847330E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.935668E-04 -8.618149E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.655540E-03 -2.523801E-06 -3.000000E-03 -5.000000E-06 -2.960960E-03 -4.866206E-06 -2.884206E-03 -4.608867E-06 -2.772329E-03 -4.247272E-06 -2.976389E-04 -8.858892E-08 -1.900000E-02 -8.700000E-05 -5.469796E-03 -1.029265E-05 -4.923561E-04 -2.403244E-06 -2.579361E-03 -5.814745E-06 -8.693503E-03 -1.682274E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.976389E-04 -8.858892E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.800000E-02 -1.220000E-04 -6.860987E-03 -2.966806E-05 -4.229750E-03 -1.617998E-05 -1.295452E-03 -8.613003E-07 -7.815193E-03 -2.039363E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.935668E-04 -8.618149E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.000000E-02 -1.080000E-04 -8.640372E-03 -1.765553E-05 -5.688468E-03 -1.038555E-05 -2.447898E-03 -4.466055E-06 -8.949668E-03 -1.935056E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.977039E-04 -8.862764E-08 -1.000000E-03 -1.000000E-06 --3.805163E-04 -1.447926E-07 --2.828111E-04 -7.998210E-08 -4.330345E-04 -1.875189E-07 -2.121142E-03 -1.958355E-06 -1.000000E-03 -1.000000E-06 -9.260022E-04 -8.574800E-07 -7.862200E-04 -6.181419E-07 -5.960676E-04 -3.552966E-07 -2.938723E-04 -8.636093E-08 -1.700000E-02 -7.100000E-05 -3.566805E-03 -2.049908E-05 -5.418617E-03 -7.496014E-06 -2.451897E-03 -2.115374E-06 -7.760001E-03 -1.634548E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.977039E-04 -8.862764E-08 -1.000000E-03 -1.000000E-06 --7.119580E-04 -5.068842E-07 -2.603263E-04 -6.776977E-08 -1.657364E-04 -2.746855E-08 -8.807005E-04 -7.756334E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.200000E-02 -3.400000E-05 -5.905081E-03 -1.535048E-05 -3.856089E-03 -8.589511E-06 -3.244585E-03 -5.882222E-06 -5.074321E-03 -5.793166E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 1.600000E-02 5.400000E-05 7.937805E-03 @@ -1761,446 +2161,6 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.500000E-02 -1.390000E-04 -1.511834E-02 -5.459835E-05 -7.753447E-03 -2.291820E-05 -6.142979E-03 -1.359405E-05 -1.043467E-02 -2.526769E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -5.912057E-04 -1.747704E-07 -1.000000E-03 -1.000000E-06 --1.098110E-04 -1.205846E-08 --4.819123E-04 -2.322395E-07 -1.614061E-04 -2.605194E-08 -8.813115E-04 -4.316252E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.935668E-04 -8.618149E-08 -1.200000E-02 -3.000000E-05 -4.798420E-03 -7.171924E-06 -1.417651E-03 -4.997963E-06 -2.131704E-03 -3.253030E-06 -7.754475E-03 -1.333333E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.938723E-04 -8.636093E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.484383E-03 -1.504224E-06 -3.000000E-03 -5.000000E-06 -2.760812E-03 -4.139104E-06 -2.336063E-03 -2.844690E-06 -1.817042E-03 -1.656152E-06 -0.000000E+00 -0.000000E+00 -1.900000E-02 -9.900000E-05 -7.244455E-03 -2.708286E-05 -4.601657E-03 -5.366244E-06 --1.675270E-03 -3.867377E-06 -9.216755E-03 -2.272207E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.079655E-04 -9.484274E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.159310E-04 -3.793709E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -8.000000E-03 -1.800000E-05 -4.925975E-03 -6.260377E-06 -3.176938E-03 -2.631319E-06 -2.008278E-03 -1.484516E-06 -3.844641E-03 -4.075869E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.977039E-04 -8.862764E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -9.238964E-04 -8.535846E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -3.400000E-05 -4.086838E-03 -5.900874E-06 -1.812330E-03 -3.716159E-06 -2.138941E-03 -3.006748E-06 -5.414129E-03 -8.079335E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.079655E-04 -9.484274E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -8.000000E-06 -2.104495E-03 -2.749678E-06 -8.451272E-04 -9.362821E-07 -5.355137E-04 -3.419837E-07 -2.683856E-03 -1.512640E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.976389E-04 -8.858892E-08 -1.000000E-03 -1.000000E-06 -9.374310E-04 -8.787769E-07 -8.181653E-04 -6.693944E-07 -6.533352E-04 -4.268468E-07 -2.976389E-04 -8.858892E-08 -8.000000E-03 -1.600000E-05 -5.411154E-03 -8.076329E-06 -3.145940E-03 -4.212660E-06 -2.637510E-03 -3.210372E-06 -3.866944E-03 -3.257876E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.175489E-03 -1.381775E-06 -1.000000E-03 -1.000000E-06 -7.809681E-04 -6.099112E-07 -4.148668E-04 -1.721145E-07 -1.935089E-05 -3.744570E-10 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.000000E-02 -3.400000E-05 -4.840884E-03 -1.080853E-05 -3.402096E-03 -4.113972E-06 -1.374077E-03 -2.333511E-06 -4.754696E-03 -7.172310E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -3.079655E-04 -9.484274E-08 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -2.900000E-02 -2.030000E-04 -6.527719E-03 -1.422798E-05 -1.560049E-03 -2.934829E-06 -1.548553E-03 -8.929308E-06 -1.108618E-02 -3.019578E-05 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -1.174573E-03 -8.619943E-07 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -4.000000E-03 -8.000000E-06 -1.520286E-03 -4.076900E-06 -2.191143E-03 -3.717004E-06 -1.161623E-03 -3.726099E-06 -3.570376E-03 -5.251427E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 2.000000E-03 2.000000E-06 1.447007E-04 @@ -2241,16 +2201,56 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -1.900000E-02 -1.030000E-04 -1.035735E-02 -3.119381E-05 -6.483551E-03 -1.164471E-05 -3.924334E-03 -6.047577E-06 -9.748673E-03 -2.956634E-05 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +1.000000E-02 +2.600000E-05 +5.875085E-04 +4.563904E-07 +-9.207198E-05 +5.154496E-07 +3.674257E-05 +1.178281E-06 +5.048984E-03 +5.880390E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2269,28 +2269,28 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.935668E-04 -8.618149E-08 +5.952778E-04 +3.543557E-07 1.000000E-03 1.000000E-06 -8.623139E-04 -7.435852E-07 -6.153778E-04 -3.786899E-07 -3.095388E-04 -9.581428E-08 +9.362621E-04 +8.765867E-07 +8.148801E-04 +6.640295E-07 +6.473941E-04 +4.191191E-07 0.000000E+00 0.000000E+00 -1.900000E-02 -9.900000E-05 -7.385212E-03 -2.033270E-05 -6.336514E-03 -2.028060E-05 -3.967026E-03 -1.027239E-05 -1.066281E-02 -2.937591E-05 +2.000000E-02 +9.000000E-05 +5.358616E-03 +1.697599E-05 +3.060277E-03 +7.132281E-06 +2.485730E-03 +7.247489E-06 +9.248313E-03 +1.738407E-05 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2299,8 +2299,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -2.976389E-04 -8.858892E-08 +8.991712E-04 +2.696131E-07 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2309,6 +2309,28 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +5.954079E-04 +3.545105E-07 +1.000000E-03 +1.000000E-06 +9.816220E-04 +9.635817E-07 +9.453726E-04 +8.937294E-07 +8.922496E-04 +7.961093E-07 +0.000000E+00 +0.000000E+00 +8.000000E-03 +1.800000E-05 +4.925975E-03 +6.260377E-06 +3.176938E-03 +2.631319E-06 +2.008278E-03 +1.484516E-06 +3.844641E-03 +4.075869E-06 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2317,32 +2339,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -6.000000E-03 -1.000000E-05 -1.316884E-03 -2.894217E-06 -2.095957E-03 -1.439521E-06 -1.013831E-04 -8.405300E-07 -2.404012E-03 -1.641294E-06 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 -0.000000E+00 +2.977039E-04 +8.862764E-08 0.000000E+00 0.000000E+00 0.000000E+00 @@ -2351,6 +2349,8 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 +9.238964E-04 +8.535846E-07 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_tallies/results_true.dat b/tests/test_tallies/results_true.dat index d018a65da9..108c7ee800 100644 --- a/tests/test_tallies/results_true.dat +++ b/tests/test_tallies/results_true.dat @@ -1 +1 @@ -5a0f3f1ae244ada7d8c9f444d7a98c2589a9720e78174a276cf96162df6728bab6d534f136f65cb0386c3235eb7d5db47a0dd6504636ca77e7eb375e6978a84d \ No newline at end of file +a6afd2f11affce2467d77b8477881ab20091f67df4f632226ec2dd5d4cd7fabb9ac3e182563bb467ed249e4b3fe95b319cb688d653757f8ea154759b8a7f50e1 \ No newline at end of file diff --git a/tests/test_tally_aggregation/results_true.dat b/tests/test_tally_aggregation/results_true.dat index 6c2d7a5193..2d995d91e0 100644 --- a/tests/test_tally_aggregation/results_true.dat +++ b/tests/test_tally_aggregation/results_true.dat @@ -1 +1 @@ -840d2648f9ba782926c71baa84e5a2ad31331e156740a3d1e9d86af8f1f0d301ef8c0f69474975d365dbcf8d229a68c62d3e60286d18045e5254373f4e1010bf \ No newline at end of file +89b550950d4cb4a63647a068bbbeaefca1c459538fb9c4c91b817e7999f09623365894367f318115647614885903a5d19bbb4cc080832beb5f1794a8f89d392e \ No newline at end of file diff --git a/tests/test_tally_slice_merge/results_true.dat b/tests/test_tally_slice_merge/results_true.dat index 89d415b0d6..278d8ee108 100644 --- a/tests/test_tally_slice_merge/results_true.dat +++ b/tests/test_tally_slice_merge/results_true.dat @@ -49,19 +49,19 @@ 14 (500, 5000, 50000) 6.25e-07 2.00e+01 U238 fission 0.00e+00 0.00e+00 15 (500, 5000, 50000) 6.25e-07 2.00e+01 U238 nu-fission 0.00e+00 0.00e+00 sum(mesh) energy low [MeV] energy high [MeV] nuclide score mean std. dev. -0 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U235 fission 9.18e-03 1.62e-03 -1 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U235 nu-fission 2.24e-02 3.94e-03 -2 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U238 fission 1.31e-08 2.08e-09 -3 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U238 nu-fission 3.26e-08 5.19e-09 -4 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U235 fission 8.40e-04 2.13e-04 -5 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U235 nu-fission 2.06e-03 5.17e-04 -6 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U238 fission 7.05e-04 3.42e-04 -7 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U238 nu-fission 1.99e-03 1.01e-03 -8 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U235 fission 8.77e-03 1.30e-03 -9 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U235 nu-fission 2.14e-02 3.18e-03 -10 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U238 fission 1.24e-08 1.74e-09 -11 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U238 nu-fission 3.08e-08 4.33e-09 -12 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U235 fission 2.30e-03 6.20e-04 -13 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U235 nu-fission 5.63e-03 1.52e-03 -14 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U238 fission 1.45e-03 7.19e-04 -15 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U238 nu-fission 3.97e-03 1.98e-03 +0 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U235 fission 8.54e-03 1.30e-03 +1 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U235 nu-fission 2.08e-02 3.17e-03 +2 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U238 fission 1.21e-08 1.74e-09 +3 ((1, 1, 1), (1, 2, 1)) 0.00e+00 6.25e-07 U238 nu-fission 3.01e-08 4.34e-09 +4 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U235 fission 2.20e-03 6.05e-04 +5 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U235 nu-fission 5.38e-03 1.48e-03 +6 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U238 fission 1.40e-03 7.17e-04 +7 ((1, 1, 1), (1, 2, 1)) 6.25e-07 2.00e+01 U238 nu-fission 3.84e-03 1.97e-03 +8 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U235 fission 9.40e-03 1.62e-03 +9 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U235 nu-fission 2.29e-02 3.95e-03 +10 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U238 fission 1.34e-08 2.08e-09 +11 ((2, 1, 1), (2, 2, 1)) 0.00e+00 6.25e-07 U238 nu-fission 3.33e-08 5.18e-09 +12 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U235 fission 9.41e-04 2.52e-04 +13 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U235 nu-fission 2.31e-03 6.13e-04 +14 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U238 fission 7.54e-04 3.45e-04 +15 ((2, 1, 1), (2, 2, 1)) 6.25e-07 2.00e+01 U238 nu-fission 2.12e-03 1.02e-03 diff --git a/tests/test_track_output/results_true.dat b/tests/test_track_output/results_true.dat index 6ded87a0ec..1d0ca80399 100644 --- a/tests/test_track_output/results_true.dat +++ b/tests/test_track_output/results_true.dat @@ -1,5 +1,5 @@ - + diff --git a/tests/test_triso/results_true.dat b/tests/test_triso/results_true.dat index ea7da21edf..e5fafb7f61 100644 --- a/tests/test_triso/results_true.dat +++ b/tests/test_triso/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.662675E+00 1.475968E-02 +1.662675E+00 1.475976E-02 From 9161c399d58b7e784396dd4b66f45a842c177d8c Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 16 Aug 2016 19:07:13 -0400 Subject: [PATCH 081/168] reverted failing tests to previous results --- tests/test_asymmetric_lattice/results_true.dat | 2 +- tests/test_quadric_surfaces/results_true.dat | 2 +- tests/test_tally_aggregation/results_true.dat | 2 +- tests/test_triso/results_true.dat | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/test_asymmetric_lattice/results_true.dat b/tests/test_asymmetric_lattice/results_true.dat index c2014a1912..a33b9c9e59 100644 --- a/tests/test_asymmetric_lattice/results_true.dat +++ b/tests/test_asymmetric_lattice/results_true.dat @@ -1 +1 @@ -280d08e4f4e6768f3100caff91a4c77d3a29ebc05353bdda47e3634f48e2ba2bd1d6a0030a00f97f2ea4c647c93155279697545cf2f951f71b58cfcd400c99de \ No newline at end of file +bc8bef8121f9b6470e4fea817a4e48eabb1ecba1f42761a4cbd77d71181bf9e1612df4a3d6ddfbcd08a3086ac873e5f3c3e560bf96b2b7c959a2f7aad7e4e08d \ No newline at end of file diff --git a/tests/test_quadric_surfaces/results_true.dat b/tests/test_quadric_surfaces/results_true.dat index f7aed43e35..1f0dd54262 100644 --- a/tests/test_quadric_surfaces/results_true.dat +++ b/tests/test_quadric_surfaces/results_true.dat @@ -1,2 +1,2 @@ k-combined: -9.921357E-01 6.763175E-03 +9.570770E-01 2.513234E-02 diff --git a/tests/test_tally_aggregation/results_true.dat b/tests/test_tally_aggregation/results_true.dat index 2d995d91e0..6c2d7a5193 100644 --- a/tests/test_tally_aggregation/results_true.dat +++ b/tests/test_tally_aggregation/results_true.dat @@ -1 +1 @@ -89b550950d4cb4a63647a068bbbeaefca1c459538fb9c4c91b817e7999f09623365894367f318115647614885903a5d19bbb4cc080832beb5f1794a8f89d392e \ No newline at end of file +840d2648f9ba782926c71baa84e5a2ad31331e156740a3d1e9d86af8f1f0d301ef8c0f69474975d365dbcf8d229a68c62d3e60286d18045e5254373f4e1010bf \ No newline at end of file diff --git a/tests/test_triso/results_true.dat b/tests/test_triso/results_true.dat index e5fafb7f61..ea7da21edf 100644 --- a/tests/test_triso/results_true.dat +++ b/tests/test_triso/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.662675E+00 1.475976E-02 +1.662675E+00 1.475968E-02 From f3cfc181f47d959158d5e871209c45b9aa810f33 Mon Sep 17 00:00:00 2001 From: amandalund Date: Tue, 16 Aug 2016 20:14:34 -0500 Subject: [PATCH 082/168] Add packing function for TRISO particles --- openmc/model/triso.py | 851 +++++++++++++++++++++++++++++- tests/test_triso/inputs_true.dat | 2 +- tests/test_triso/results_true.dat | 2 +- tests/test_triso/test_triso.py | 47 +- 4 files changed, 868 insertions(+), 34 deletions(-) diff --git a/openmc/model/triso.py b/openmc/model/triso.py index 89e0d8aa76..c1ed9336ab 100644 --- a/openmc/model/triso.py +++ b/openmc/model/triso.py @@ -1,13 +1,22 @@ +from __future__ import division import copy -from collections import Iterable +from collections import Iterable, defaultdict from numbers import Real import warnings +import itertools +import scipy.spatial +from scipy.spatial.distance import cdist +import random +from random import uniform, gauss +from heapq import heappush, heappop +from math import pi, sin, cos, floor, log10 import numpy as np import openmc import openmc.checkvalue as cv + class TRISO(openmc.Cell): """Tristructural-isotopic (TRISO) micro fuel particle @@ -153,3 +162,843 @@ def create_triso_lattice(trisos, lower_left, pitch, shape, background): lattice.outer = openmc.Universe(cells=[background_cell]) return lattice + + +def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, + domain_radius=None, domain_center=(0., 0., 0.), + n_particles=None, packing_fraction=None, + initial_packing_fraction=0.3, contraction_rate=1/400, seed=1): + """Generate a random, non-overlapping configuration of TRISO particles + within a container. + + Parameters + ---------- + radius : float + Outer radius of TRISO particles. + fill : openmc.Universe + Universe which contains all layers of the TRISO particle. + domain_shape : {'cube', 'cylinder', or 'sphere'} + Geometry of the container in which the TRISO particles are packed. + domain_length : float + Length of the container (if cube or cylinder). + domain_radius : float + Radius of the container (if cylinder or sphere). + domain_center : Iterable of float + Cartesian coordinates of the center of the container. + n_particles : int + Number of TRISO particles to pack in the domain. Exactly one of + 'n_particles' and 'packing_fraction' should be specified -- the other + will be calculated. + packing_fraction : float + Packing fraction of particles. Exactly one of 'n_particles' and + 'packing_fraction' should be specified -- the other will be calculated. + initial_packing_fraction : float, optional + Packing fraction used to initialize the configuration of particles in + the domain. Default value is 0.3. It is not recommended to set the + initial packing fraction much higher than 0.3 as the random sequential + packing algorithm becomes prohibitively slow as it approaches its limit + (~0.38). + contraction_rate : float, optional + Contraction rate of outer diameter. This can affect the speed of the + close random packing algorithm. Default value is 1/400. + seed : int, optional + RNG seed. + + Returns + ------- + trisos : list of openmc.model.TRISO + List of TRISO particles in the domain. + + Notes + ----- + The particle configuration is generated using a combination of random + sequential packing (RSP) and close random packing (CRP). RSP is faster than + CRP for lower packing fractions (pf), but it becomes prohibitively slow as + it approaches its packing limit (~0.38). CRP can achieve higher pf of up to + ~0.64 and scales better with increasing pf. + + If the desired pf is below some threshold for which RSP performs better + than CRP ('initial_packing_fraction'), only RSP is used. If a higher pf is + required, particles with a radius smaller than the desired final radius + (and therefore with a smaller pf) are initialized within the domain using + RSP. This initial configuration of particles is then used as a starting + point for CRP using Jodrey and Tory's algorithm [1]_. + + In RSP, particle centers are placed one by one at rondom, and placement + attempts for a particles are made until the particle is not overlapping any + others. This implementation of the algorithm uses a lattice over the domain + to speed up the nearest neighbor search by only searching for a particle's + neighbors within that lattice cell. + + In CRP, each particle is assigned two diameters, and inner and an outer, + which approach each other during the simulation. The inner diameter, + defined as the minimum center-to-center distance, is the true diameter of + the particles and defines the pf. At each iteration the worst overlap + between particles based on outer diameter is eliminated by moving the + particles apart along the line joining their centers and the outer diameter + is decreased. Iterations continue until the two diameters converge or until + the desired pf is reached. + + References + ---------- + .. [1] W. S. Jodrey and E. M. Tory, "Computer simulation of close random + packing of equal spheres", Phys. Rev. A 32 (1985) 2347-2351. + + """ + + def get_domain_volume(): + """Calculates the volume of the container in which the TRISO particles + are packed. + + Returns + ------- + float + Volume of the domain. + + """ + + if domain_shape is 'cube': + return domain_length**3 + elif domain_shape is 'cylinder': + return domain_length * pi * domain_radius**2 + elif domain_shape is 'sphere': + return 4/3 * pi * domain_radius**3 + + + def get_cell_length(radius): + """Calculates the length of a lattice element in x-, y-, and + z-directions. + + Parameters + ---------- + radius : float + Radius of the particle. + + Returns + ------- + tuple of float + Length of lattice cell in x-, y-, and z-directions. + + """ + + if domain_length: + m = domain_length/int(domain_length/(4*radius)) + if domain_radius: + n = 2*domain_radius/int(domain_radius/(2*radius)) + + if domain_shape is 'cube': + return (m, m, m) + elif domain_shape is 'cylinder': + return (n, n, m) + elif domain_shape is 'sphere': + return (n, n, n) + + + def get_boundary_extremes(): + """Calculates the minimum and maximum positions in x-, y-, and + z-directions where a particle center can be placed within the domain. + + Returns + ------- + llim, ulim : tuple of float + Minimum and maximum position in x-, y-, and z-directions where + particle center can be placed. + + """ + + if domain_length: + x_min = radius + x_max = domain_length - radius + if domain_radius: + r_min = radius - domain_radius + r_max = domain_radius - radius + + if domain_shape is 'cube': + return (x_min, x_min, x_min), (x_max, x_max, x_max) + elif domain_shape is 'cylinder': + return (r_min, r_min, x_min), (r_max, r_max, x_max) + elif domain_shape is 'sphere': + return (r_min, r_min, r_min), (r_max, r_max, r_max) + + + def get_particle_offset(): + """Calculates the offset in x-, y-, and z-directions of the particle + center based on the domain center + + Returns + ------- + tuple of float + Amount to offset particle center in x-, y-, and z-directions + + """ + + if domain_shape is 'cube': + return np.array(domain_center) - 3*(domain_length/2,) + elif domain_shape is 'cylinder': + return np.array(domain_center) - (0, 0, domain_length/2) + elif domain_shape is 'sphere': + return np.array(domain_center) + + + def inner_packing_fraction(): + """Calculates the true packing fraction of the particles based on the + inner diameter. + + Returns + ------- + float + Packing fraction calculated from inner diameter. + + """ + + return (4/3 * pi * (inner_diameter[0]/2)**3 * n_particles / + domain_volume) + + + def outer_packing_fraction(): + """Calculates the nominal packing fraction of the particles based on + the outer diameter. + + Returns + ------- + float + Packing fraction calculated from outer diameter. + + """ + + return (4/3 * pi * (outer_diameter[0]/2)**3 * n_particles / + domain_volume) + + + def random_point_cube(): + """Generate Cartesian coordinates of center of a particle that is + contained entirely within cubic domain with uniform probability. + + Returns + ------- + list of float + Cartesian coordinates of particle center. + + """ + + return [uniform(llim[0], ulim[0]), + uniform(llim[0], ulim[0]), + uniform(llim[0], ulim[0])] + + + def random_point_cylinder(): + """Generate Cartesian coordinates of center of a particle that is + contained entirely within cylindrical domain with uniform probability + (see http://mathworld.wolfram.com/DiskPointPicking.html for generating + random points on a disk). + + Returns + ------- + list of float + Cartesian coordinates of particle center. + + """ + + r = uniform(0, ulim[0]**2)**.5 + t = uniform(0, 2*pi) + return [r*cos(t), r*sin(t), uniform(llim[2], ulim[2])] + + + def random_point_sphere(): + """Generate Cartesian coordinates of center of a particle that is + contained entirely within spherical domain with uniform probability. + + Returns + ------- + list of float + Cartesian coordinates of particle center. + + """ + + x = (gauss(0, 1), gauss(0, 1), gauss(0, 1)) + r = (uniform(0, ulim[0]**3)**(1/3) / (x[0]**2 + x[1]**2 + x[2]**2)**.5) + return [r*i for i in x] + + + def add_rod(d, i, j): + """Add a new rod to the priority queue. + + Parameters + ---------- + d : float + distance between centers of particles i and j. + i, j : int + Index of particles in particles array. + + """ + + rod = [d, i, j] + rods_map[i] = j, rod + rods_map[j] = i, rod + heappush(rods, rod) + + + def remove_rod(i): + """Mark the rod containing particle i as removed. + + Parameters + ---------- + i : int + Index of particle in particles array. + + """ + + if i in rods_map: + j, rod = rods_map.pop(i) + del rods_map[j] + rod[1] = None + rod[2] = None + + + def pop_rod(): + """Remove and return the shortest rod. + + Returns + ------- + d : float + distance between centers of particles i and j. + i, j : int + Index of particles in particles array. + + """ + + while rods: + d, i, j = heappop(rods) + if i is not None and j is not None: + del rods_map[i] + del rods_map[j] + return d, i, j + + + def create_rod_list(): + """Generate sorted list of rods (distances between particle centers). + + Rods are arranged in a heap where each element contains the rod length + and the particle indices. A rod between particles p and q is only + included if the distance between p and q could not be changed by the + elimination of a greater overlap, i.e. q has no nearer neighbors than p. + + A mapping of particle ids to rods is maintained in 'rods_map'. Each key + in the dict is the id of a particle that is in the rod list, and the + value is the id of its nearest neighbor and the rod that contains them. + The dict is used to find rods in the priority queue and to mark removed + rods so rods can be "removed" without breaking the heap structure + invariant. + + """ + + # Create KD tree for quick nearest neighbor search + tree = scipy.spatial.cKDTree(particles) + + # Find distance to nearest neighbor and index of nearest neighbor for + # all particles + d, n = tree.query(particles, k=2) + d = d[:,1] + n = n[:,1] + + # Array of particle indices, indices of nearest neighbors, and + # distances to nearest neighbors + a = np.dstack(([i for i in range(len(n))], n, d))[0] + + # Array of nearest neighbor indices, indices of particles they are + # nearest neighbors of, and distances between them + b = a[a[:,1].argsort()] + b[:,[0, 1]] = b[:,[1, 0]] + + # Find the intersection between 'a' and 'b': a list of particles who + # are each other's nearest neighbors and the distance between them + r = [x for x in {tuple(x) for x in a} & {tuple(x) for x in b}] + + # Remove duplicate rods and sort by distance + r = map(list, set([(x[2], int(min(x[0:2])), int(max(x[0:2]))) + for x in r])) + + # Clear priority queue and add rods + del rods[:] + rods_map.clear() + for d, i, j in r: + add_rod(d, i, j) + + # Inner diameter is set initially to the shortest center-to-center + # distance between any two particles + if rods: + inner_diameter[0] = rods[0][0] + + + def reduce_outer_diameter(): + """Reduce the outer diameter so that at the (i+1)-st iteration it is: + + d_out^(i+1) = d_out^(i) - (1/2)^(j) * d_out0 * k / n, + + where k is the contraction rate, n is the number of particles, and + + j = floor(-log10(pf_out - pf_in)). + + """ + + j = floor(-log10(outer_packing_fraction() - inner_packing_fraction())) + outer_diameter[0] = (outer_diameter[0] - 0.5**j * + initial_outer_diameter * contraction_rate / + n_particles) + + + def update_mesh(i): + """Update which lattice cells the particle is in based on new particle + center coordinates. + + 'mesh'/'mesh_map' is a two way dictionary used to look up which + particles are located within one diameter of a given lattice cell and + which lattice cells a given particle center is within one diameter of. + This is used to speed up the nearest neighbor search. + + Parameters + ---------- + i : int + Index of particle in particles array. + + """ + + # Determine which lattice cells the particle is in and remove the + # particle id from those cells + for idx in mesh_map[i]: + mesh[idx].remove(i) + del mesh_map[i] + + # Determine which lattice cells are within one diameter of particle's + # center and add this particle to the list of particles in those cells + for idx in cell_list(particles[i], diameter): + mesh[idx].add(i) + mesh_map[i].add(idx) + + + def apply_boundary_conditions(i, j): + """Apply reflective boundary conditions to particles i and j. + + Parameters + ---------- + i, j : int + Index of particles in particles array. + + """ + + for k in range(3): + if particles[i][k] < llim[k]: + particles[i][k] = llim[k] + elif particles[i][k] > ulim[k]: + particles[i][k] = ulim[k] + if particles[j][k] < llim[k]: + particles[j][k] = llim[k] + elif particles[j][k] > ulim[k]: + particles[j][k] = ulim[k] + + + def repel_particles(i, j, d): + """Move particles p and q apart according to the following + transformation (accounting for reflective boundary conditions on + domain): + + r_i^(n+1) = r_i^(n) + 1/2(d_out^(n+1) - d^(n)) + r_j^(n+1) = r_j^(n) - 1/2(d_out^(n+1) - d^(n)) + + Parameters + ---------- + i, j : int + Index of particles in particles array. + d : float + distance between centers of particles i and j. + + """ + + # Moving each particle distance 'r' away from the other along the line + # joining the particle centers will ensure their final distance is equal + # to the outer diameter + r = (outer_diameter[0] - d)/2; + + v = (particles[i] - particles[j])/d + particles[i] = particles[i] + r*v + particles[j] = particles[j] - r*v + + # Apply reflective boundary conditions + apply_boundary_conditions(i, j) + + update_mesh(i) + update_mesh(j) + + + def nearest(i): + """Find index of nearest neighbor of particle i. + + Parameters + ---------- + i : int + Index in particles array of particle for which to find nearest + neighbor. + + Returns + ------- + int + Index in particles array of nearest neighbor of i + double + distance between i and nearest neighbor. + + """ + + # Need the second nearest neighbor of i since the nearest neighbor + # will be itself. Using argpartition, the k-th nearest neighbor is + # placed at index k. + idx = list(mesh[cell_index(particles[i])]) + dists = cdist([particles[i]], particles[idx])[0] + if dists.size > 1: + j = dists.argpartition(1)[1] + return idx[j], dists[j] + else: + return None, None + + + def update_rod_list(i, j): + """Update the rod list with the new nearest neighbors of particles i + and j since their overlap was eliminated. + + Parameters + ---------- + i, j : int + Index of particles in particles array. + + """ + + # If the nearest neighbor k of particle i has no nearer neighbors, + # remove the rod currently containing k from the rod list and add rod + # k-i, keeping the rod list sorted + k, d_ik = nearest(i) + if k and nearest(k)[0] == i: + remove_rod(k) + add_rod(d_ik, i, k) + l, d_jl = nearest(j) + if l and nearest(l)[0] == j: + remove_rod(l) + add_rod(d_jl, j, l) + + # Set inner diameter to the shortest distance between two particle + # centers + if rods: + inner_diameter[0] = rods[0][0] + + + def cell_index_cube(p, cl=None): + """Calculate the index of the lattice cell in which the given particle + center falls. + + Parameters + ---------- + p : list of float + Cartesian coordinates of particle center. + cl : list of float + Length of the lattice cells in x-, y-, and z-directions. + + Returns + ------- + tuple of int + Indices of lattice cell. + + """ + + if cl is None: + cl = cell_length + + return tuple(int(p[i]/cl[i]) for i in range(3)) + + + def cell_index_cylinder(p, cl=None): + """Calculate the index of the lattice cell in which the given particle + center falls. + + Parameters + ---------- + p : list of float + Cartesian coordinates of particle center. + cl : list of float + Length of the lattice cells in x-, y-, and z-directions. + + Returns + ------- + tuple of int + Indices of lattice cell. + + """ + + if cl is None: + cl = cell_length + + return tuple([int((p[0] + domain_radius)/cl[0]), + int((p[1] + domain_radius)/cl[1]), int(p[2]/cl[2])]) + + + def cell_index_sphere(p, cl=None): + """Calculate the index of the lattice cell in which the given particle + center falls. + + Parameters + ---------- + p : list of float + Cartesian coordinates of particle center. + cl : list of float + Length of the lattice cells in x-, y-, and z-directions. + + Returns + ------- + tuple of int + Indices of lattice cell. + + """ + + if cl is None: + cl = cell_length + + return tuple(int((p[i] + domain_radius)/cl[i]) for i in range(3)) + + + def cell_list_cube(p, d, cl=None): + """Return the indices of all cells within the given distance of the + point. + + Parameters + ---------- + p : list of float + Cartesian coordinates of particle center. + d : float + Find all lattice cells that are within a radius of length 'd' of + the particle center. + cl : list of float + Length of the lattice cells in x-, y-, and z-directions. + + Returns + ------- + list of tuple of int + Indices of lattice cells. + + """ + + if cl is None: + cl = cell_length + + r = [[a/cl[i] for a in [p[i]-d, p[i], p[i]+d] if a > 0 and + a < domain_length] for i in range(3)] + + return list(itertools.product(*({int(i) for i in j} for j in r))) + + + def cell_list_cylinder(p, d, cl=None): + """Return the indices of all cells within the given distance of the + point. + + Parameters + ---------- + p : list of float + Cartesian coordinates of particle center. + d : float + Find all lattice cells that are within a radius of length 'd' of + the particle center. + cl : list of float + Length of the lattice cells in x-, y-, and z-directions. + + Returns + ------- + list of tuple of int + Indices of lattice cells. + + """ + + if cl is None: + cl = cell_length + + x,y = [[(a + domain_radius)/cl[i] for a in [p[i]-d, p[i], p[i]+d] + if a > -domain_radius and a < domain_radius] for i in range(2)] + + z = [a/cl[2] for a in [p[2]-d, p[2], p[2]+d] if a > 0 + and a < domain_length] + + return list(itertools.product(*({int(i) for i in j} for j in (x,y,z)))) + + + def cell_list_sphere(p, d, cl=None): + """Return the indices of all cells within the given distance of the + point. + + Parameters + ---------- + p : list of float + Cartesian coordinates of particle center. + d : float + Find all lattice cells that are within a radius of length 'd' of + the particle center. + cl : list of float + Length of the lattice cells in x-, y-, and z-directions. + + Returns + ------- + list of tuple of int + Indices of lattice cells. + + """ + + if cl is None: + cl = cell_length + + r = [[(a + domain_radius)/cl[i] for a in [p[i]-d, p[i], p[i]+d] + if a > -domain_radius and a < domain_radius] for i in range(3)] + + return list(itertools.product(*({int(i) for i in j} for j in r))) + + + def random_sequential_pack(): + """Random sequential packing of particles whose radius is determined by + initial packing fraction. + + Returns + ------ + numpy.ndarray + Cartesian coordinates of centers of TRISO particles. + + """ + + # Set parameters for initial random sequential packing of particles. + r = (3/4*initial_packing_fraction*domain_volume/(pi*n_particles))**(1/3) + d = 2*r + sqd = d**2 + cl = get_cell_length(r) + + particles = [] + mesh = defaultdict(list) + + for i in range(n_particles): + # Randomly sample new center coordinates while there are any overlaps + while True: + p = random_point() + idx = cell_index(p, cl) + if any((p[0]-q[0])**2 + (p[1]-q[1])**2 + (p[2]-q[2])**2 < sqd + for q in mesh[idx]): + continue + else: + break + particles.append(p) + + for idx in cell_list(p, d, cl): + mesh[idx].append(p) + + return np.array(particles) + + + def close_random_pack(): + """Close random packing of particles using the Jodrey-Tory algorithm. + + """ + + for i in range(n_particles): + for idx in cell_list(particles[i], diameter): + mesh[idx].add(i) + mesh_map[i].add(idx) + + while True: + create_rod_list() + if inner_diameter[0] >= diameter: + break + while True: + d, i, j = pop_rod() + reduce_outer_diameter() + repel_particles(i, j, d) + update_rod_list(i, j) + if inner_diameter[0] >= diameter or not rods: + break + + + # Check for valid container geometry and dimensions + if domain_shape not in ['cube', 'cylinder', 'sphere']: + raise ValueError('Unable to set domain_shape to "{}". Only "cube", ' + '"cylinder", and "sphere" are ' + 'supported."'.format(domain_shape)) + if not domain_length and domain_shape in ['cube', 'cylinder']: + raise ValueError('"domain_length" must be specified for {} domain ' + 'geometry '.format(domain_shape)) + if not domain_radius and domain_shape in ['cylinder', 'sphere']: + raise ValueError('"domain_radius" must be specified for {} domain ' + 'geometry '.format(domain_shape)) + + domain_volume = get_domain_volume() + llim, ulim = get_boundary_extremes() + offset = get_particle_offset() + + # Calculate the packing fraction if the number of particles is specified; + # otherwise, calculate the number of particles from the packing fraction. + if ((n_particles is None and packing_fraction is None) or + (n_particles is not None and packing_fraction is not None)): + raise ValueError('Exactly one of "n_particles" and "packing_fraction" ' + 'must be specified.') + elif packing_fraction is None: + packing_fraction = 4/3*pi*radius**3*n_particles / domain_volume + elif n_particles is None: + n_particles = int(packing_fraction*domain_volume // (4/3*pi*radius**3)) + + # Check for valid packing fractions for each algorithm + if packing_fraction >= 0.64: + raise ValueError('Packing fraction of {} is greater than the ' + 'packing fraction limit for close random ' + 'packing (0.64)'.format(packing_fraction)) + if initial_packing_fraction >= 0.38: + raise ValueError('Initial packing fraction of {} is greater than the ' + 'packing fraction limit for random sequential' + 'packing (0.38)'.format(initial_packing_fraction)) + if initial_packing_fraction > packing_fraction: + initial_packing_fraction = packing_fraction + if packing_fraction > 0.3: + initial_packing_fraction = 0.3 + + # Set domain dependent functions + if domain_shape is 'cube': + random_point = random_point_cube + cell_list = cell_list_cube + cell_index = cell_index_cube + elif domain_shape is 'cylinder': + random_point = random_point_cylinder + cell_list = cell_list_cylinder + cell_index = cell_index_cylinder + elif domain_shape is 'sphere': + random_point = random_point_sphere + cell_list = cell_list_sphere + cell_index = cell_index_sphere + + random.seed(seed) + + # Generate non-overlapping particles for an initial inner radius using + # random sequential packing algorithm + particles = random_sequential_pack() + + # Use the particle configuration produced in random sequential packing as a + # starting point for close random pack with the desired final particle radius + if initial_packing_fraction != packing_fraction: + diameter = 2*radius + cell_length = get_cell_length(radius) + + # Outer diameter initially set to arbitrary value that yields pf of 1 + initial_outer_diameter = 2*(domain_volume/(n_particles*4/3*pi))**(1/3) + + # Inner and outer diameter of particles will change during packing + outer_diameter = [initial_outer_diameter] + inner_diameter = [0] + + rods = [] + rods_map = {} + mesh = defaultdict(set) + mesh_map = defaultdict(set) + + close_random_pack() + + trisos = [] + for i in range(n_particles): + trisos.append(TRISO(radius, fill, particles[i] + offset)) + + return trisos diff --git a/tests/test_triso/inputs_true.dat b/tests/test_triso/inputs_true.dat index 04119a2dc8..0df6042f6a 100644 --- a/tests/test_triso/inputs_true.dat +++ b/tests/test_triso/inputs_true.dat @@ -1 +1 @@ -f33e6653b883200457df2ff2ba9cf715d5ddaa1296dd71d277c6f1d9d5b7831cc92aaf1e97509d26e5a93235cd9f775c0cfaa5ebc3dfe8fc71469bac166d362b \ No newline at end of file +2285ba99573743929cee590e2ba4d86becbf38d58af765498b73425f2fa3ccc3e0d20a59260d283a3ff39038d87e12142e0156b22152ccecbe2609a291d1d347 \ No newline at end of file diff --git a/tests/test_triso/results_true.dat b/tests/test_triso/results_true.dat index ea7da21edf..15107e8c84 100644 --- a/tests/test_triso/results_true.dat +++ b/tests/test_triso/results_true.dat @@ -1,2 +1,2 @@ k-combined: -1.662675E+00 1.475968E-02 +1.636336E+00 1.154000E-01 diff --git a/tests/test_triso/test_triso.py b/tests/test_triso/test_triso.py index 9a8fb0c3be..8b6296ab5b 100644 --- a/tests/test_triso/test_triso.py +++ b/tests/test_triso/test_triso.py @@ -19,35 +19,35 @@ class TRISOTestHarness(PyAPITestHarness): # Define TRISO matrials fuel = openmc.Material() fuel.set_density('g/cm3', 10.5) - fuel.add_nuclide('U235', 0.14154) - fuel.add_nuclide('U238', 0.85846) - fuel.add_nuclide('C0', 0.5) - fuel.add_nuclide('O16', 1.5) + fuel.add_nuclide('U-235', 0.14154) + fuel.add_nuclide('U-238', 0.85846) + fuel.add_nuclide('C-Nat', 0.5) + fuel.add_nuclide('O-16', 1.5) porous_carbon = openmc.Material() porous_carbon.set_density('g/cm3', 1.0) - porous_carbon.add_nuclide('C0', 1.0) - porous_carbon.add_s_alpha_beta('c_Graphite', '71t') + porous_carbon.add_nuclide('C-Nat', 1.0) + porous_carbon.add_s_alpha_beta('Graph', '71t') ipyc = openmc.Material() ipyc.set_density('g/cm3', 1.90) - ipyc.add_nuclide('C0', 1.0) - ipyc.add_s_alpha_beta('c_Graphite', '71t') + ipyc.add_nuclide('C-Nat', 1.0) + ipyc.add_s_alpha_beta('Graph', '71t') sic = openmc.Material() sic.set_density('g/cm3', 3.20) sic.add_element('Si', 1.0) - sic.add_nuclide('C0', 1.0) + sic.add_nuclide('C-Nat', 1.0) opyc = openmc.Material() opyc.set_density('g/cm3', 1.87) - opyc.add_nuclide('C0', 1.0) - opyc.add_s_alpha_beta('c_Graphite', '71t') + opyc.add_nuclide('C-Nat', 1.0) + opyc.add_s_alpha_beta('Graph', '71t') graphite = openmc.Material() graphite.set_density('g/cm3', 1.1995) - graphite.add_nuclide('C0', 1.0) - graphite.add_s_alpha_beta('c_Graphite', '71t') + graphite.add_nuclide('C-Nat', 1.0) + graphite.add_s_alpha_beta('Graph', '71t') # Create TRISO particles spheres = [openmc.Sphere(R=r*1e-4) @@ -60,24 +60,9 @@ class TRISOTestHarness(PyAPITestHarness): inner_univ = openmc.Universe(cells=[c1, c2, c3, c4, c5]) outer_radius = 422.5*1e-4 - trisos = [] - random.seed(1) - for i in range(100): - # Randomly sample location - lim = 0.5 - outer_radius*1.001 - x = random.uniform(-lim, lim) - y = random.uniform(-lim, lim) - z = random.uniform(-lim, lim) - t = openmc.model.TRISO(outer_radius, inner_univ, (x, y, z)) - - # Make sure TRISO doesn't overlap with another - for tp in trisos: - xp, yp, zp = tp.center - distance = sqrt((x - xp)**2 + (y - yp)**2 + (z - zp)**2) - if distance <= 2*outer_radius: - break - else: - trisos.append(t) + trisos = openmc.model.pack_trisos( + radius=outer_radius, fill=inner_univ, domain_shape='cube', + domain_length=1., domain_center=(0., 0., 0.), n_particles=100) # Define box to contain lattice min_x = openmc.XPlane(x0=-0.5, boundary_type='reflective') From 15aaa15530904b83afd0f7c6444d10f98eca7196 Mon Sep 17 00:00:00 2001 From: amandalund Date: Tue, 16 Aug 2016 20:25:07 -0500 Subject: [PATCH 083/168] Updated trisos test --- tests/test_triso/test_triso.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tests/test_triso/test_triso.py b/tests/test_triso/test_triso.py index 8b6296ab5b..da5deef00d 100644 --- a/tests/test_triso/test_triso.py +++ b/tests/test_triso/test_triso.py @@ -19,35 +19,35 @@ class TRISOTestHarness(PyAPITestHarness): # Define TRISO matrials fuel = openmc.Material() fuel.set_density('g/cm3', 10.5) - fuel.add_nuclide('U-235', 0.14154) - fuel.add_nuclide('U-238', 0.85846) - fuel.add_nuclide('C-Nat', 0.5) - fuel.add_nuclide('O-16', 1.5) + fuel.add_nuclide('U235', 0.14154) + fuel.add_nuclide('U238', 0.85846) + fuel.add_nuclide('C0', 0.5) + fuel.add_nuclide('O16', 1.5) porous_carbon = openmc.Material() porous_carbon.set_density('g/cm3', 1.0) - porous_carbon.add_nuclide('C-Nat', 1.0) - porous_carbon.add_s_alpha_beta('Graph', '71t') + porous_carbon.add_nuclide('C0', 1.0) + porous_carbon.add_s_alpha_beta('c_Graphite', '71t') ipyc = openmc.Material() ipyc.set_density('g/cm3', 1.90) - ipyc.add_nuclide('C-Nat', 1.0) - ipyc.add_s_alpha_beta('Graph', '71t') + ipyc.add_nuclide('C0', 1.0) + ipyc.add_s_alpha_beta('c_Graphite', '71t') sic = openmc.Material() sic.set_density('g/cm3', 3.20) sic.add_element('Si', 1.0) - sic.add_nuclide('C-Nat', 1.0) + sic.add_nuclide('C0', 1.0) opyc = openmc.Material() opyc.set_density('g/cm3', 1.87) - opyc.add_nuclide('C-Nat', 1.0) - opyc.add_s_alpha_beta('Graph', '71t') + opyc.add_nuclide('C0', 1.0) + opyc.add_s_alpha_beta('c_Graphite', '71t') graphite = openmc.Material() graphite.set_density('g/cm3', 1.1995) - graphite.add_nuclide('C-Nat', 1.0) - graphite.add_s_alpha_beta('Graph', '71t') + graphite.add_nuclide('C0', 1.0) + graphite.add_s_alpha_beta('c_Graphite', '71t') # Create TRISO particles spheres = [openmc.Sphere(R=r*1e-4) From f886d2849e664c9e742dc84fa4656e2d46e1d72e Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 17 Aug 2016 05:07:29 -0400 Subject: [PATCH 084/168] Added in a mixin module with an Equality class for mixin use --- openmc/mixin.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 openmc/mixin.py diff --git a/openmc/mixin.py b/openmc/mixin.py new file mode 100644 index 0000000000..f4d5f4c8df --- /dev/null +++ b/openmc/mixin.py @@ -0,0 +1,24 @@ +import numpy as np + + +class Equality(object): + """A Class which provides generic __eq__ and __ne__ functionality which + can easily be inherited by downstream classes. + """ + + def __eq__(self, other): + eqval = True + if isinstance(other, type(self)): + for key, value in self.__dict__.items(): + if key in other.__dict__: + if not np.array_equal(value, other.__dict__.get(key)): + eqval = False + else: + eqval = False + else: + eqval = False + + return eqval + + def __ne__(self, other): + return not self.__eq__(other) From f2fc06d960fc78b2e4a967265143d810631546ea Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 17 Aug 2016 05:15:57 -0400 Subject: [PATCH 085/168] Replaced prior __eq__ classes with the equality mixin --- openmc/data/ace.py | 6 +- openmc/data/angle_distribution.py | 13 +--- openmc/data/angle_energy.py | 3 +- openmc/data/correlated.py | 14 +---- openmc/data/energy_distribution.py | 99 +----------------------------- openmc/data/fission_energy.py | 5 +- openmc/data/function.py | 17 +---- openmc/data/kalbach_mann.py | 15 +---- openmc/data/library.py | 2 +- openmc/data/nbody.py | 12 ---- openmc/data/neutron.py | 3 +- openmc/data/product.py | 17 +---- openmc/data/reaction.py | 3 +- openmc/data/thermal.py | 31 +--------- openmc/data/uncorrelated.py | 10 +-- openmc/data/urr.py | 3 +- openmc/stats/univariate.py | 73 +--------------------- 17 files changed, 33 insertions(+), 293 deletions(-) diff --git a/openmc/data/ace.py b/openmc/data/ace.py index 4085b4222f..867e3767a1 100644 --- a/openmc/data/ace.py +++ b/openmc/data/ace.py @@ -22,6 +22,8 @@ import sys import numpy as np +from openmc.mixin import Equality + if sys.version_info[0] >= 3: basestring = str @@ -131,7 +133,7 @@ def get_table(filename, name=None): .format(name)) -class Library(object): +class Library(Equality): """A Library objects represents an ACE-formatted file which may contain multiple tables with data. @@ -353,7 +355,7 @@ class Library(object): lines = [ace_file.readline() for i in range(13)] -class Table(object): +class Table(Equality): """ACE cross section table Parameters diff --git a/openmc/data/angle_distribution.py b/openmc/data/angle_distribution.py index afb9a05454..81cc068305 100644 --- a/openmc/data/angle_distribution.py +++ b/openmc/data/angle_distribution.py @@ -4,11 +4,12 @@ from numbers import Real import numpy as np import openmc.checkvalue as cv +from openmc.mixin import Equality from openmc.stats import Univariate, Tabular, Uniform from .function import INTERPOLATION_SCHEME -class AngleDistribution(object): +class AngleDistribution(Equality): """Angle distribution as a function of incoming energy Parameters @@ -32,16 +33,6 @@ class AngleDistribution(object): self.energy = energy self.mu = mu - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (not np.array_equal(self.energy, other.energy) or - not np.array_equal(self.mu, other.mu)): - eqval = False - return eqval - @property def energy(self): return self._energy diff --git a/openmc/data/angle_energy.py b/openmc/data/angle_energy.py index 00e049ebcd..21748ab8a4 100644 --- a/openmc/data/angle_energy.py +++ b/openmc/data/angle_energy.py @@ -1,9 +1,10 @@ from abc import ABCMeta, abstractmethod import openmc.data +from openmc.mixin import Equality -class AngleEnergy(object): +class AngleEnergy(Equality): """Distribution in angle and energy of a secondary particle.""" __metaclass = ABCMeta diff --git a/openmc/data/correlated.py b/openmc/data/correlated.py index 2415aaab30..d6ce8ab470 100644 --- a/openmc/data/correlated.py +++ b/openmc/data/correlated.py @@ -49,19 +49,6 @@ class CorrelatedAngleEnergy(AngleEnergy): self.energy_out = energy_out self.mu = mu - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (not np.array_equal(self.breakpoints, other.breakpoints) or - not np.array_equal(self.interpolation, other.interpolation) or - not np.array_equal(self.energy, other.energy) or - not np.array_equal(self.energy_out, other.energy_out) or - not np.array_equal(self.mu, other.mu)): - eqval = False - return eqval - @property def breakpoints(self): return self._breakpoints @@ -69,6 +56,7 @@ class CorrelatedAngleEnergy(AngleEnergy): @property def interpolation(self): return self._interpolation + @property def energy(self): return self._energy diff --git a/openmc/data/energy_distribution.py b/openmc/data/energy_distribution.py index 4299fc166a..ba34abb4f0 100644 --- a/openmc/data/energy_distribution.py +++ b/openmc/data/energy_distribution.py @@ -8,9 +8,10 @@ import numpy as np from .function import Tabulated1D, INTERPOLATION_SCHEME from openmc.stats.univariate import Univariate, Tabular, Discrete, Mixture import openmc.checkvalue as cv +from openmc.mixin import Equality -class EnergyDistribution(object): +class EnergyDistribution(Equality): """Abstract superclass for all energy distributions.""" __metaclass__ = ABCMeta @@ -84,16 +85,6 @@ class ArbitraryTabulated(EnergyDistribution): self.energy = energy self.pdf = pdf - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (not np.array_equal(self.energy, other.energy) or - not np.array_equal(self.pdf, other.pdf)): - eqval = False - return eqval - def to_hdf5(self, group): raise NotImplementedError @@ -132,17 +123,6 @@ class GeneralEvaporation(EnergyDistribution): self.g = g self.u = u - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (self.theta != other.theta or - self.g != other.g or - self.u != other.u): - eqval = False - return eqval - def to_hdf5(self, group): raise NotImplementedError @@ -180,16 +160,6 @@ class MaxwellEnergy(EnergyDistribution): self.theta = theta self.u = u - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (self.theta != other.theta or - self.u != other.u): - eqval = False - return eqval - @property def theta(self): return self._theta @@ -298,16 +268,6 @@ class Evaporation(EnergyDistribution): self.theta = theta self.u = u - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (self.theta != other.theta or - self.u != other.u): - eqval = False - return eqval - @property def theta(self): return self._theta @@ -420,17 +380,6 @@ class WattEnergy(EnergyDistribution): self.b = b self.u = u - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (self.a != other.a or - self.b != other.b or - self.u != other.u): - eqval = False - return eqval - @property def a(self): return self._a @@ -572,17 +521,6 @@ class MadlandNix(EnergyDistribution): self.efh = efh self.tm = tm - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (self.efl != other.efl or - self.efh != other.efh or - self.tm != other.tm): - eqval = False - return eqval - @property def efl(self): return self._efl @@ -681,17 +619,6 @@ class DiscretePhoton(EnergyDistribution): self.energy = energy self.atomic_weight_ratio = atomic_weight_ratio - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (self.primary_flag != other.primary_flag or - self.energy != other.energy or - self.atomic_weight_ratio != other.atomic_weight_ratio): - eqval = False - return eqval - @property def primary_flag(self): return self._primary_flag @@ -800,16 +727,6 @@ class LevelInelastic(EnergyDistribution): self.threshold = threshold self.mass_ratio = mass_ratio - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (self.threshold != other.threshold or - self.mass_ratio != other.mass_ratio): - eqval = False - return eqval - @property def threshold(self): return self._threshold @@ -916,18 +833,6 @@ class ContinuousTabular(EnergyDistribution): self.energy = energy self.energy_out = energy_out - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (not np.array_equal(self.breakpoints, other.breakpoints) or - not np.array_equal(self.interpolation, other.interpolation) or - not np.array_equal(self.energy, other.energy) or - not np.array_equal(self.energy_out, other.energy_out)): - eqval = False - return eqval - @property def breakpoints(self): return self._breakpoints diff --git a/openmc/data/fission_energy.py b/openmc/data/fission_energy.py index 03d3ed84ed..d1023a01a9 100644 --- a/openmc/data/fission_energy.py +++ b/openmc/data/fission_energy.py @@ -9,6 +9,7 @@ from .data import ATOMIC_SYMBOL from .endf_utils import read_float, read_CONT_line, identify_nuclide from .function import Function1D, Tabulated1D, Polynomial, Sum import openmc.checkvalue as cv +from openmc.mixin import Equality if sys.version_info[0] >= 3: basestring = str @@ -189,7 +190,7 @@ def write_compact_458_library(endf_files, output_name='fission_Q_data.h5', out.close() -class FissionEnergyRelease(object): +class FissionEnergyRelease(Equality): """Energy relased by fission reactions. Energy is carried away from fission reactions by many different particles. @@ -560,7 +561,7 @@ class FissionEnergyRelease(object): self.delayed_photons.to_hdf5(group, 'delayed_photons') self.betas.to_hdf5(group, 'betas') self.neutrinos.to_hdf5(group, 'neutrinos') - + if isinstance(self.prompt_neutrons, Polynomial): # Add the polynomials for the relevant components together. Use a # Polynomial((0.0, -1.0)) to subtract incident energy. diff --git a/openmc/data/function.py b/openmc/data/function.py index 98a7f2c5ef..7a4a938d1f 100644 --- a/openmc/data/function.py +++ b/openmc/data/function.py @@ -5,12 +5,13 @@ from numbers import Real, Integral import numpy as np import openmc.checkvalue as cv +from openmc.mixin import Equality INTERPOLATION_SCHEME = {1: 'histogram', 2: 'linear-linear', 3: 'linear-log', 4: 'log-linear', 5: 'log-log'} -class Function1D(object): +class Function1D(Equality): """A function of one independent variable with HDF5 support.""" __metaclass__ = ABCMeta @@ -110,18 +111,6 @@ class Tabulated1D(Function1D): self.x = np.asarray(x) self.y = np.asarray(y) - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (not np.array_equal(self.x, other.x) or - not np.array_equal(self.y, other.y) or - not np.array_equal(self.breakpoints, other.breakpoints) or - not np.array_equal(self.interpolation, other.interpolation)): - eqval = False - return eqval - def __call__(self, x): # Check if input is array or scalar if isinstance(x, Iterable): @@ -401,7 +390,7 @@ class Polynomial(np.polynomial.Polynomial, Function1D): return cls(dataset.value) -class Sum(object): +class Sum(Equality): """Sum of multiple functions. This class allows you to create a callable object which represents the sum diff --git a/openmc/data/kalbach_mann.py b/openmc/data/kalbach_mann.py index 519796ad46..c44c46b654 100644 --- a/openmc/data/kalbach_mann.py +++ b/openmc/data/kalbach_mann.py @@ -5,6 +5,7 @@ from warnings import warn import numpy as np import openmc.checkvalue as cv +from openmc.mixin import Equality from openmc.stats import Tabular, Univariate, Discrete, Mixture from .function import Tabulated1D, INTERPOLATION_SCHEME from .angle_energy import AngleEnergy @@ -59,20 +60,6 @@ class KalbachMann(AngleEnergy): self.precompound = precompound self.slope = slope - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (not np.array_equal(self.breakpoints, other.breakpoints) or - not np.array_equal(self.interpolation, other.interpolation) or - not np.array_equal(self.energy, other.energy) or - not np.array_equal(self.energy_out, other.energy_out) or - not np.array_equal(self.precompound, other.precompound) or - not np.array_equal(self.slope, other.slope)): - eqval = False - return eqval - @property def breakpoints(self): return self._breakpoints diff --git a/openmc/data/library.py b/openmc/data/library.py index dba5eabc16..3fed7598d3 100644 --- a/openmc/data/library.py +++ b/openmc/data/library.py @@ -5,7 +5,7 @@ import h5py from openmc.clean_xml import clean_xml_indentation -class DataLibrary(object): +class DataLibrary(Equality): def __init__(self): self.libraries = [] diff --git a/openmc/data/nbody.py b/openmc/data/nbody.py index 274db48f98..a34380dc93 100644 --- a/openmc/data/nbody.py +++ b/openmc/data/nbody.py @@ -38,18 +38,6 @@ class NBodyPhaseSpace(AngleEnergy): self.atomic_weight_ratio = atomic_weight_ratio self.q_value = q_value - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (self.total_mass != other.total_mass or - self.n_particles != other.n_particles or - self.atomic_weight_ratio != other.atomic_weight_ratio or - self.q_value != other.q_value): - eqval = False - return eqval - @property def total_mass(self): return self._total_mass diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 95f840d64a..66f4b2797f 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -15,12 +15,13 @@ from .product import Product from .reaction import Reaction, _get_photon_products from .urr import ProbabilityTables import openmc.checkvalue as cv +from openmc.mixin import Equality if sys.version_info[0] >= 3: basestring = str -class IncidentNeutron(object): +class IncidentNeutron(Equality): """Continuous-energy neutron interaction data. Instances of this class are not normally instantiated by the user but rather diff --git a/openmc/data/product.py b/openmc/data/product.py index 06875556fc..1f07076d95 100644 --- a/openmc/data/product.py +++ b/openmc/data/product.py @@ -5,6 +5,7 @@ import sys import numpy as np import openmc.checkvalue as cv +from openmc.mixin import Equality from .function import Tabulated1D, Polynomial, Function1D from .angle_energy import AngleEnergy @@ -12,7 +13,7 @@ if sys.version_info[0] >= 3: basestring = str -class Product(object): +class Product(Equality): """Secondary particle emitted in a nuclear reaction Parameters @@ -48,20 +49,6 @@ class Product(object): self.applicability = [] self.yield_ = Polynomial((1,)) # 0-order polynomial i.e. a constant - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (self.particle != other.particle or - self.decay_rate != other.decay_rate or - self.emission_mode != other.emission_mode or - not np.narray_equal(self.distribution, other.distribution) or - not np.narray_equal(self.applicability, other.applicability) or - self.yield_ != other.yield_): - eqval = False - return eqval - def __repr__(self): if isinstance(self.yield_, Real): return "".format( diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index d35599579d..0255a30975 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -7,6 +7,7 @@ from warnings import warn import numpy as np import openmc.checkvalue as cv +from openmc.mixin import Equality from openmc.stats import Uniform from .angle_distribution import AngleDistribution from .angle_energy import AngleEnergy @@ -250,7 +251,7 @@ def _get_photon_products(ace, rx): return photons -class Reaction(object): +class Reaction(Equality): """A nuclear reaction A Reaction object represents a single reaction channel for a nuclide with diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 2232274f4f..d729e41ecc 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -7,6 +7,7 @@ import numpy as np import h5py import openmc.checkvalue as cv +from openmc.mixin import Equality from .ace import Table, get_table from .angle_energy import AngleEnergy from .function import Tabulated1D @@ -60,7 +61,7 @@ def get_thermal_name(name): return 'c_' + name -class CoherentElastic(object): +class CoherentElastic(Equality): r"""Coherent elastic scattering data from a crystalline material Parameters @@ -89,15 +90,6 @@ class CoherentElastic(object): idx = np.searchsorted(self.bragg_edges, E) return self.factors[idx]/E - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (not np.array_equal(self.bragg_edges, other.bragg_edges) or - not np.array_equal(self.factors, other.factors)): - eqval = False - return eqval def __len__(self): return len(self.bragg_edges) @@ -156,7 +148,7 @@ class CoherentElastic(object): return cls(bragg_edges, factors) -class ThermalScattering(object): +class ThermalScattering(Equality): """A ThermalScattering object contains thermal scattering data as represented by an S(alpha, beta) table. @@ -200,23 +192,6 @@ class ThermalScattering(object): self.secondary_mode = None self.zaids = [] - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (self.name != other.name or - self.atomic_weight_ratio != other.atomic_weight_ratio or - self.elastic_xs != other.elastic_xs or - self.elastic_mu_out != other.elastic_mu_out or - self.inelastic_xs != other.inelastic_xs or - self.inelastic_mu_out != other.inelastic_mu_out or - self.temperature != other.temperature or - not np.array_equal(self.zaids, other.zaids) or - self.secondary_mode != other.secondary_mode): - eqval = False - return eqval - def __repr__(self): if hasattr(self, 'name'): return "".format(self.name) diff --git a/openmc/data/uncorrelated.py b/openmc/data/uncorrelated.py index 19945205ee..399db3e7cc 100644 --- a/openmc/data/uncorrelated.py +++ b/openmc/data/uncorrelated.py @@ -1,6 +1,7 @@ import numpy as np import openmc.checkvalue as cv +from openmc.mixin import Equality from .angle_energy import AngleEnergy from .energy_distribution import EnergyDistribution from .angle_distribution import AngleDistribution @@ -34,15 +35,6 @@ class UncorrelatedAngleEnergy(AngleEnergy): if energy is not None: self.energy = energy - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - if self.__dict__ != other.__dict__: - return False - else: - return True - @property def angle(self): return self._angle diff --git a/openmc/data/urr.py b/openmc/data/urr.py index 052da66126..2e6ea355f0 100644 --- a/openmc/data/urr.py +++ b/openmc/data/urr.py @@ -4,9 +4,10 @@ from numbers import Integral, Real import numpy as np import openmc.checkvalue as cv +from openmc.mixin import Equality -class ProbabilityTables(object): +class ProbabilityTables(Equality): r"""Unresolved resonance region probability tables. Parameters diff --git a/openmc/stats/univariate.py b/openmc/stats/univariate.py index c29386046c..2f5b304648 100644 --- a/openmc/stats/univariate.py +++ b/openmc/stats/univariate.py @@ -7,6 +7,7 @@ from xml.etree import ElementTree as ET import numpy as np import openmc.checkvalue as cv +from openmc.mixin import Equality if sys.version_info[0] >= 3: basestring = str @@ -15,7 +16,7 @@ _INTERPOLATION_SCHEMES = ['histogram', 'linear-linear', 'linear-log', 'log-linear', 'log-log'] -class Univariate(object): +class Univariate(Equality): """Probability distribution of a single random variable. The Univariate class is an abstract class that can be derived to implement a @@ -65,16 +66,6 @@ class Discrete(Univariate): self.x = x self.p = p - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (not np.array_equal(self.x, other.x) or - not np.array_equal(self.p, other.p)): - eqval = False - return eqval - def __len__(self): return len(self.x) @@ -149,16 +140,6 @@ class Uniform(Univariate): self.a = a self.b = b - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (self.a != other.a or - self.b != other.b): - eqval = False - return eqval - def __len__(self): return 2 @@ -229,15 +210,6 @@ class Maxwell(Univariate): super(Maxwell, self).__init__() self.theta = theta - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (self.theta != other.theta): - eqval = False - return eqval - def __len__(self): return 1 @@ -299,16 +271,6 @@ class Watt(Univariate): self.a = a self.b = b - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (self.a != other.a or - self.b != other.b): - eqval = False - return eqval - def __len__(self): return 2 @@ -391,18 +353,6 @@ class Tabular(Univariate): self.p = p self.interpolation = interpolation - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (self._ignore_negative != other._ignore_negative or - not np.array_equal(self.x, other.x) or - not np.array_equal(self.p, other.p) or - self.interpolation != other.interpolation): - eqval = False - return eqval - def __len__(self): return len(self.x) @@ -484,15 +434,6 @@ class Legendre(Univariate): def __call__(self, x): return self._legendre_polynomial(x) - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if not np.array_equal(self.coefficients, other.coefficients): - eqval = False - return eqval - def __len__(self): return len(self._legendre_polynomial.coef) @@ -539,16 +480,6 @@ class Mixture(Univariate): self.probability = probability self.distribution = distribution - def __eq__(self, other): - if not isinstance(other, type(self)): - return NotImplemented - else: - eqval = True - if (not np.array_equal(self.probability, other.probability) or - not np.array_equal(self.distribution, other.distribution)): - eqval = False - return eqval - def __len__(self): return sum(len(d) for d in self.distribution) From fcd24cc219b85120c211b8ab4cbb80adaca8f515 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 16 Aug 2016 21:19:01 -0500 Subject: [PATCH 086/168] Return 0.0 from MGXS.get_nuclide_density if nuclide not in list --- openmc/mgxs/mgxs.py | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 7aa12d0418..137ab62f07 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -542,12 +542,6 @@ class MGXS(object): float The atomic number density (atom/b-cm) for the nuclide of interest - Raises - ------- - ValueError - When the density is requested for a nuclide which is not found in - the spatial domain. - """ cv.check_type('nuclide', nuclide, basestring) @@ -555,13 +549,7 @@ class MGXS(object): # Get list of all nuclides in the spatial domain nuclides = self.domain.get_nuclide_densities() - if nuclide not in nuclides: - msg = 'Unable to get density for nuclide "{0}" which is not in ' \ - '{1} "{2}"'.format(nuclide, self.domain_type, self.domain.id) - ValueError(msg) - - density = nuclides[nuclide][1] - return density + return nuclides[nuclide][1] if nuclide in nuclides else 0.0 def get_nuclide_densities(self, nuclides='all'): """Get an array of atomic number densities in units of atom/b-cm for all @@ -816,6 +804,7 @@ class MGXS(object): densities = self.get_nuclide_densities('sum') if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] + xs[np.isnan(xs)] = 0.0 # Reverse data if user requested increasing energy groups since # tally data is stored in order of increasing energies @@ -1561,6 +1550,10 @@ class MGXS(object): df['mean'] /= np.tile(densities, tile_factor) df['std. dev.'] /= np.tile(densities, tile_factor) + # Replace NaNs by zeros (happens if nuclide density is zero) + df['mean'].replace(np.nan, 0.0, inplace=True) + df['std. dev.'].replace(np.nan, 0.0, inplace=True) + # Sort the dataframe by domain type id (e.g., distribcell id) and # energy groups such that data is from fast to thermal if self.domain_type == 'mesh': @@ -1813,6 +1806,7 @@ class MatrixMGXS(MGXS): densities = self.get_nuclide_densities('sum') if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] + xs[np.isnan(xs)] = 0.0 # Reverse data if user requested increasing energy groups since # tally data is stored in order of increasing energies @@ -3645,6 +3639,7 @@ class ScatterMatrixXS(MatrixMGXS): densities = self.get_nuclide_densities('sum') if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] + xs[np.isnan(xs)] = 0.0 # Reverse data if user requested increasing energy groups since # tally data is stored in order of increasing energies From f00461d9550bb1d68f81c162fcc0243936ce2f51 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 17 Aug 2016 06:09:03 -0500 Subject: [PATCH 087/168] Fix RELAX NG schemata for settings.xml --- src/relaxng/settings.rnc | 2 +- src/relaxng/settings.rng | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/relaxng/settings.rnc b/src/relaxng/settings.rnc index e23cbdd6cd..742e137738 100644 --- a/src/relaxng/settings.rnc +++ b/src/relaxng/settings.rnc @@ -153,7 +153,7 @@ element settings { attribute lower_left { list { xsd:double+ } }) & (element upper_right { list { xsd:double+ } } | attribute upper_right { list { xsd:double+ } }) - }+ & + }* & element uniform_fs{ (element dimension { list { xsd:positiveInteger+ } } | diff --git a/src/relaxng/settings.rng b/src/relaxng/settings.rng index 38acea5985..39bed4a62f 100644 --- a/src/relaxng/settings.rng +++ b/src/relaxng/settings.rng @@ -625,7 +625,7 @@
- + @@ -694,7 +694,7 @@ - + From 079f61cd1c8e5cb3da7632b0bfa6ac876d42b72d Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 17 Aug 2016 10:50:33 -0500 Subject: [PATCH 088/168] No need for redundant NaN -> zero (@samuelshaner beat me to it) --- openmc/mgxs/mgxs.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 4b465a19d5..e77685088c 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -815,7 +815,6 @@ class MGXS(object): densities = self.get_nuclide_densities('sum') if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] - xs[np.isnan(xs)] = 0.0 # Eliminate the trivial score dimension xs = np.squeeze(xs, axis=len(xs.shape) - 1) @@ -1818,7 +1817,6 @@ class MatrixMGXS(MGXS): densities = self.get_nuclide_densities('sum') if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] - xs[np.isnan(xs)] = 0.0 # Eliminate the trivial score dimension xs = np.squeeze(xs, axis=len(xs.shape) - 1) @@ -3655,7 +3653,6 @@ class ScatterMatrixXS(MatrixMGXS): densities = self.get_nuclide_densities('sum') if value == 'mean' or value == 'std_dev': xs /= densities[np.newaxis, :, np.newaxis] - xs[np.isnan(xs)] = 0.0 # Convert and nans to zero xs = np.nan_to_num(xs) From 760168a82e1e3ffb4e4024ededdd84249a901f51 Mon Sep 17 00:00:00 2001 From: amandalund Date: Wed, 17 Aug 2016 16:21:10 -0500 Subject: [PATCH 089/168] Address #706 comments --- docs/source/pythonapi/index.rst | 1 + openmc/model/triso.py | 42 ++++++++++++++++----------------- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/docs/source/pythonapi/index.rst b/docs/source/pythonapi/index.rst index 392c2c72df..14f4a2128d 100644 --- a/docs/source/pythonapi/index.rst +++ b/docs/source/pythonapi/index.rst @@ -334,6 +334,7 @@ Functions :nosignatures: openmc.model.create_triso_lattice + openmc.model.pack_trisos -------------------------------------------- :mod:`openmc.data` -- Nuclear Data Interface diff --git a/openmc/model/triso.py b/openmc/model/triso.py index c1ed9336ab..763fc0ddda 100644 --- a/openmc/model/triso.py +++ b/openmc/model/triso.py @@ -4,14 +4,14 @@ from collections import Iterable, defaultdict from numbers import Real import warnings import itertools -import scipy.spatial -from scipy.spatial.distance import cdist import random from random import uniform, gauss from heapq import heappush, heappop from math import pi, sin, cos, floor, log10 import numpy as np +import scipy.spatial +from scipy.spatial.distance import cdist import openmc import openmc.checkvalue as cv @@ -433,8 +433,8 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, """ rod = [d, i, j] - rods_map[i] = j, rod - rods_map[j] = i, rod + rods_map[i] = (j, rod) + rods_map[j] = (i, rod) heappush(rods, rod) @@ -516,7 +516,7 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, # Remove duplicate rods and sort by distance r = map(list, set([(x[2], int(min(x[0:2])), int(max(x[0:2]))) - for x in r])) + for x in r])) # Clear priority queue and add rods del rods[:] @@ -617,7 +617,7 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, # Moving each particle distance 'r' away from the other along the line # joining the particle centers will ensure their final distance is equal # to the outer diameter - r = (outer_diameter[0] - d)/2; + r = (outer_diameter[0] - d)/2 v = (particles[i] - particles[j])/d particles[i] = particles[i] + r*v @@ -735,7 +735,7 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, cl = cell_length return tuple([int((p[0] + domain_radius)/cl[0]), - int((p[1] + domain_radius)/cl[1]), int(p[2]/cl[2])]) + int((p[1] + domain_radius)/cl[1]), int(p[2]/cl[2])]) def cell_index_sphere(p, cl=None): @@ -787,7 +787,7 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, cl = cell_length r = [[a/cl[i] for a in [p[i]-d, p[i], p[i]+d] if a > 0 and - a < domain_length] for i in range(3)] + a < domain_length] for i in range(3)] return list(itertools.product(*({int(i) for i in j} for j in r))) @@ -816,13 +816,13 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, if cl is None: cl = cell_length - x,y = [[(a + domain_radius)/cl[i] for a in [p[i]-d, p[i], p[i]+d] - if a > -domain_radius and a < domain_radius] for i in range(2)] + x, y = [[(a + domain_radius)/cl[i] for a in [p[i]-d, p[i], p[i]+d] + if a > -domain_radius and a < domain_radius] for i in range(2)] z = [a/cl[2] for a in [p[2]-d, p[2], p[2]+d] if a > 0 and a < domain_length] - return list(itertools.product(*({int(i) for i in j} for j in (x,y,z)))) + return list(itertools.product(*({int(i) for i in j} for j in (x, y, z)))) def cell_list_sphere(p, d, cl=None): @@ -850,7 +850,7 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, cl = cell_length r = [[(a + domain_radius)/cl[i] for a in [p[i]-d, p[i], p[i]+d] - if a > -domain_radius and a < domain_radius] for i in range(3)] + if a > -domain_radius and a < domain_radius] for i in range(3)] return list(itertools.product(*({int(i) for i in j} for j in r))) @@ -878,13 +878,13 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, for i in range(n_particles): # Randomly sample new center coordinates while there are any overlaps while True: - p = random_point() - idx = cell_index(p, cl) - if any((p[0]-q[0])**2 + (p[1]-q[1])**2 + (p[2]-q[2])**2 < sqd - for q in mesh[idx]): - continue - else: - break + p = random_point() + idx = cell_index(p, cl) + if any((p[0]-q[0])**2 + (p[1]-q[1])**2 + (p[2]-q[2])**2 < sqd + for q in mesh[idx]): + continue + else: + break particles.append(p) for idx in cell_list(p, d, cl): @@ -998,7 +998,7 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, close_random_pack() trisos = [] - for i in range(n_particles): - trisos.append(TRISO(radius, fill, particles[i] + offset)) + for p in particles: + trisos.append(TRISO(radius, fill, p + offset)) return trisos From 89778d422e966692aaef5fe9c6c9e4322c094f05 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 17 Aug 2016 18:55:08 -0400 Subject: [PATCH 090/168] Missed an import of mixin --- openmc/__init__.py | 1 + openmc/data/kalbach_mann.py | 1 - openmc/data/library.py | 2 ++ openmc/data/uncorrelated.py | 1 - 4 files changed, 3 insertions(+), 2 deletions(-) diff --git a/openmc/__init__.py b/openmc/__init__.py index a0492ee408..2aeacd689b 100644 --- a/openmc/__init__.py +++ b/openmc/__init__.py @@ -22,6 +22,7 @@ from openmc.executor import * from openmc.statepoint import * from openmc.summary import * from openmc.particle_restart import * +from openmc.mixin import * try: from openmc.opencg_compatible import * diff --git a/openmc/data/kalbach_mann.py b/openmc/data/kalbach_mann.py index c44c46b654..5aca17ba9f 100644 --- a/openmc/data/kalbach_mann.py +++ b/openmc/data/kalbach_mann.py @@ -5,7 +5,6 @@ from warnings import warn import numpy as np import openmc.checkvalue as cv -from openmc.mixin import Equality from openmc.stats import Tabular, Univariate, Discrete, Mixture from .function import Tabulated1D, INTERPOLATION_SCHEME from .angle_energy import AngleEnergy diff --git a/openmc/data/library.py b/openmc/data/library.py index 3fed7598d3..6c2600f320 100644 --- a/openmc/data/library.py +++ b/openmc/data/library.py @@ -3,8 +3,10 @@ import xml.etree.ElementTree as ET import h5py +from openmc.mixin import Equality from openmc.clean_xml import clean_xml_indentation + class DataLibrary(Equality): def __init__(self): self.libraries = [] diff --git a/openmc/data/uncorrelated.py b/openmc/data/uncorrelated.py index 399db3e7cc..0361c9b37a 100644 --- a/openmc/data/uncorrelated.py +++ b/openmc/data/uncorrelated.py @@ -1,7 +1,6 @@ import numpy as np import openmc.checkvalue as cv -from openmc.mixin import Equality from .angle_energy import AngleEnergy from .energy_distribution import EnergyDistribution from .angle_distribution import AngleDistribution From 4acfa570629bdf64d959f5f1a5ebaf969cfbc687 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 18 Aug 2016 10:51:22 -0400 Subject: [PATCH 091/168] Added optimization option for OpenCG compatibility module --- openmc/opencg_compatible.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 58ce0d0c29..bca735a812 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -997,13 +997,17 @@ def get_opencg_geometry(openmc_geometry): return opencg_geometry -def get_openmc_geometry(opencg_geometry): +def get_openmc_geometry(opencg_geometry, compatible=True): """Return an OpenMC geometry corresponding to an OpenCG geometry. Parameters ---------- opencg_geometry : opencg.Geometry OpenCG geometry + compatible : bool + Whether the OpenCG geometry is compatible with OpenMOC's geometric + primitives. This should be set to False if the OpenCG geometry + uses SquarePrism surfaces. True by default as an optimization. Returns ------- @@ -1019,9 +1023,6 @@ def get_openmc_geometry(opencg_geometry): opencg_geometry.assign_auto_ids() opencg_geometry = copy.deepcopy(opencg_geometry) - # Update Cell bounding boxes in Geometry - opencg_geometry.update_bounding_boxes() - # Clear dictionaries and auto-generated ID OPENMC_SURFACES.clear() OPENCG_SURFACES.clear() @@ -1033,12 +1034,13 @@ def get_openmc_geometry(opencg_geometry): OPENCG_LATTICES.clear() # Make the entire geometry "compatible" before assigning auto IDs - universes = opencg_geometry.get_all_universes() - for universe in universes.values(): - if not isinstance(universe, opencg.Lattice): - make_opencg_cells_compatible(universe) + if not compatible: + universes = opencg_geometry.get_all_universes() + for universe in universes.values(): + if not isinstance(universe, opencg.Lattice): + make_opencg_cells_compatible(universe) - opencg_geometry.assign_auto_ids() + opencg_geometry.assign_auto_ids() opencg_root_universe = opencg_geometry.root_universe openmc_root_universe = get_openmc_universe(opencg_root_universe) From 3fb36ea9ec5736781d902f09a1b660c2a4f0a4da Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 18 Aug 2016 10:53:23 -0500 Subject: [PATCH 092/168] Hotfix for ScatterMatrixXS.get_pandas_dataframe (parent method doesn't account for multiple scores). --- openmc/mgxs/mgxs.py | 3 +- .../results_true.dat | 144 +++++++++--------- .../results_true.dat | 2 +- 3 files changed, 75 insertions(+), 74 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index e77685088c..c0bc9c2666 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1523,7 +1523,8 @@ class MGXS(object): df.rename(columns={'energyout low [MeV]': 'group out'}, inplace=True) - out_groups = np.tile(all_groups, int(df.shape[0] / all_groups.size)) + out_groups = np.repeat(all_groups, self.xs_tally.num_scores) + out_groups = np.tile(out_groups, int(df.shape[0] / out_groups.size)) df['group out'] = out_groups del df['energyout high [MeV]'] columns = ['group in', 'group out'] diff --git a/tests/test_mgxs_library_no_nuclides/results_true.dat b/tests/test_mgxs_library_no_nuclides/results_true.dat index 3563f141b1..edd99b44c5 100644 --- a/tests/test_mgxs_library_no_nuclides/results_true.dat +++ b/tests/test_mgxs_library_no_nuclides/results_true.dat @@ -29,39 +29,39 @@ 1 10000 1 total 0.385188 0.026946 0 10000 2 total 0.412389 0.015425 material group in group out nuclide moment mean std. dev. -9 10000 1 1 total P0 -0.000207 0.000149 -11 10000 1 1 total P1 0.000234 0.000128 -13 10000 1 1 total P2 0.051870 0.006983 +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 -10 10000 1 2 total P1 -0.000103 0.000184 -12 10000 1 2 total P2 0.384199 0.027001 -14 10000 1 2 total P3 0.020069 0.002846 -1 10000 2 1 total P0 0.016482 0.004502 -3 10000 2 1 total P1 -0.010499 0.010438 -5 10000 2 1 total P2 -0.000768 0.000768 +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 -2 10000 2 2 total P1 0.006371 0.010551 -4 10000 2 2 total P2 0.000925 0.000925 -6 10000 2 2 total P3 0.000494 0.000494 +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 material group in group out nuclide moment mean std. dev. -9 10000 1 1 total P0 -0.000207 0.000149 -11 10000 1 1 total P1 0.000234 0.000128 -13 10000 1 1 total P2 0.051870 0.006983 +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 -10 10000 1 2 total P1 -0.000103 0.000184 -12 10000 1 2 total P2 0.384199 0.027001 -14 10000 1 2 total P3 0.020069 0.002846 -1 10000 2 1 total P0 0.016482 0.004502 -3 10000 2 1 total P1 -0.010499 0.010438 -5 10000 2 1 total P2 -0.000768 0.000768 +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 -2 10000 2 2 total P1 0.006371 0.010551 -4 10000 2 2 total P2 0.000925 0.000925 -6 10000 2 2 total P3 0.000494 0.000494 +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 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 @@ -154,39 +154,39 @@ 1 10001 1 total 0.310121 0.033788 0 10001 2 total 0.296264 0.043792 material group in group out nuclide moment mean std. dev. -9 10001 1 1 total P0 0.000000 0.000000 -11 10001 1 1 total P1 0.000000 0.000000 -13 10001 1 1 total P2 0.038230 0.008484 +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 -10 10001 1 2 total P1 0.000000 0.000000 -12 10001 1 2 total P2 0.310121 0.033788 -14 10001 1 2 total P3 0.020745 0.004696 -1 10001 2 1 total P0 -0.011214 0.016180 -3 10001 2 1 total P1 -0.003270 0.007329 -5 10001 2 1 total P2 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 -2 10001 2 2 total P1 0.008837 0.011504 -4 10001 2 2 total P2 0.000000 0.000000 -6 10001 2 2 total P3 0.000000 0.000000 +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 material group in group out nuclide moment mean std. dev. -9 10001 1 1 total P0 0.000000 0.000000 -11 10001 1 1 total P1 0.000000 0.000000 -13 10001 1 1 total P2 0.038230 0.008484 +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 -10 10001 1 2 total P1 0.000000 0.000000 -12 10001 1 2 total P2 0.310121 0.033788 -14 10001 1 2 total P3 0.020745 0.004696 -1 10001 2 1 total P0 -0.011214 0.016180 -3 10001 2 1 total P1 -0.003270 0.007329 -5 10001 2 1 total P2 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 -2 10001 2 2 total P1 0.008837 0.011504 -4 10001 2 2 total P2 0.000000 0.000000 -6 10001 2 2 total P3 0.000000 0.000000 +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 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 @@ -279,39 +279,39 @@ 1 10002 1 total 0.671269 0.026186 0 10002 2 total 2.035388 0.258060 material group in group out nuclide moment mean std. dev. -9 10002 1 1 total P0 0.008758 0.000926 -11 10002 1 1 total P1 -0.003785 0.000817 -13 10002 1 1 total P2 0.381167 0.016243 +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 -10 10002 1 2 total P1 -0.002568 0.001014 -12 10002 1 2 total P2 0.639901 0.024709 -14 10002 1 2 total P3 0.152392 0.008156 -1 10002 2 1 total P0 0.509941 0.051236 -3 10002 2 1 total P1 0.024988 0.008312 -5 10002 2 1 total P2 0.000400 0.000401 +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 -2 10002 2 2 total P1 0.111175 0.013020 -4 10002 2 2 total P2 0.000443 0.000445 -6 10002 2 2 total P3 0.000320 0.000321 +1 10002 2 2 total P1 0.509941 0.051236 +2 10002 2 2 total P2 0.111175 0.013020 +3 10002 2 2 total P3 0.024988 0.008312 material group in group out nuclide moment mean std. dev. -9 10002 1 1 total P0 0.008758 0.000926 -11 10002 1 1 total P1 -0.003785 0.000817 -13 10002 1 1 total P2 0.381167 0.016243 +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 -10 10002 1 2 total P1 -0.002568 0.001014 -12 10002 1 2 total P2 0.639901 0.024709 -14 10002 1 2 total P3 0.152392 0.008156 -1 10002 2 1 total P0 0.509941 0.051236 -3 10002 2 1 total P1 0.024988 0.008312 -5 10002 2 1 total P2 0.000400 0.000401 +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 -2 10002 2 2 total P1 0.111175 0.013020 -4 10002 2 2 total P2 0.000443 0.000445 -6 10002 2 2 total P3 0.000320 0.000321 +1 10002 2 2 total P1 0.509941 0.051236 +2 10002 2 2 total P2 0.111175 0.013020 +3 10002 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 diff --git a/tests/test_mgxs_library_nuclides/results_true.dat b/tests/test_mgxs_library_nuclides/results_true.dat index d3e3235ccc..3da8146042 100644 --- a/tests/test_mgxs_library_nuclides/results_true.dat +++ b/tests/test_mgxs_library_nuclides/results_true.dat @@ -1 +1 @@ -8142ae4e107002a835999e4ace85c17376f262a7059fc224f3756a2de19aba6ca4c4fa14ca2085c87d7729aa8d6d6f78fdae21ac6dfe33ca303449c769076074 \ No newline at end of file +e494320a213b5704a2ac915a2ba504857be91961ceb6735b6ad05d81eb31c44c9584d5bd9d40baececf1dcb5b030e6ecec63cfbd20639baf69bcb596c5c46591 \ No newline at end of file From a13d5a27480cb4d38a0c1774a07fd8b5696d530c Mon Sep 17 00:00:00 2001 From: amandalund Date: Thu, 18 Aug 2016 10:54:02 -0500 Subject: [PATCH 093/168] Address #706 comments --- openmc/model/triso.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/openmc/model/triso.py b/openmc/model/triso.py index 763fc0ddda..33c955e3be 100644 --- a/openmc/model/triso.py +++ b/openmc/model/triso.py @@ -7,7 +7,7 @@ import itertools import random from random import uniform, gauss from heapq import heappush, heappop -from math import pi, sin, cos, floor, log10 +from math import pi, sin, cos, floor, log10, sqrt import numpy as np import scipy.spatial @@ -224,8 +224,8 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, RSP. This initial configuration of particles is then used as a starting point for CRP using Jodrey and Tory's algorithm [1]_. - In RSP, particle centers are placed one by one at rondom, and placement - attempts for a particles are made until the particle is not overlapping any + In RSP, particle centers are placed one by one at random, and placement + attempts for a particle are made until the particle is not overlapping any others. This implementation of the algorithm uses a lattice over the domain to speed up the nearest neighbor search by only searching for a particle's neighbors within that lattice cell. @@ -333,7 +333,7 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, """ if domain_shape is 'cube': - return np.array(domain_center) - 3*(domain_length/2,) + return np.array(domain_center) - domain_length/2 elif domain_shape is 'cylinder': return np.array(domain_center) - (0, 0, domain_length/2) elif domain_shape is 'sphere': @@ -399,7 +399,7 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, """ - r = uniform(0, ulim[0]**2)**.5 + r = sqrt(uniform(0, ulim[0]**2)) t = uniform(0, 2*pi) return [r*cos(t), r*sin(t), uniform(llim[2], ulim[2])] @@ -416,7 +416,7 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, """ x = (gauss(0, 1), gauss(0, 1), gauss(0, 1)) - r = (uniform(0, ulim[0]**3)**(1/3) / (x[0]**2 + x[1]**2 + x[2]**2)**.5) + r = (uniform(0, ulim[0]**3)**(1/3) / sqrt(x[0]**2 + x[1]**2 + x[2]**2)) return [r*i for i in x] @@ -620,8 +620,8 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, r = (outer_diameter[0] - d)/2 v = (particles[i] - particles[j])/d - particles[i] = particles[i] + r*v - particles[j] = particles[j] - r*v + particles[i] += r*v + particles[j] -= r*v # Apply reflective boundary conditions apply_boundary_conditions(i, j) @@ -643,7 +643,7 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, ------- int Index in particles array of nearest neighbor of i - double + float distance between i and nearest neighbor. """ @@ -734,8 +734,8 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, if cl is None: cl = cell_length - return tuple([int((p[0] + domain_radius)/cl[0]), - int((p[1] + domain_radius)/cl[1]), int(p[2]/cl[2])]) + return (int((p[0] + domain_radius)/cl[0]), + int((p[1] + domain_radius)/cl[1]), int(p[2]/cl[2])) def cell_index_sphere(p, cl=None): @@ -935,7 +935,7 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, # Calculate the packing fraction if the number of particles is specified; # otherwise, calculate the number of particles from the packing fraction. if ((n_particles is None and packing_fraction is None) or - (n_particles is not None and packing_fraction is not None)): + (n_particles is not None and packing_fraction is not None)): raise ValueError('Exactly one of "n_particles" and "packing_fraction" ' 'must be specified.') elif packing_fraction is None: From a265770e7b8221f06afa595c085bd1e8422d7a1c Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 18 Aug 2016 12:38:30 -0400 Subject: [PATCH 094/168] Fixed comment OpenMOC -> OpenMC --- openmc/opencg_compatible.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index bca735a812..501e570a76 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -1005,7 +1005,7 @@ def get_openmc_geometry(opencg_geometry, compatible=True): opencg_geometry : opencg.Geometry OpenCG geometry compatible : bool - Whether the OpenCG geometry is compatible with OpenMOC's geometric + Whether the OpenCG geometry is compatible with OpenMC's geometric primitives. This should be set to False if the OpenCG geometry uses SquarePrism surfaces. True by default as an optimization. From 9e1da7a5bfa9e5cb0d66b66213cb48dd448c7f0a Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Thu, 18 Aug 2016 14:20:33 -0400 Subject: [PATCH 095/168] Changed compatibility parameter to default to False for OpenCG-to-OpenMC conversion --- openmc/opencg_compatible.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index bca735a812..e81538fcf5 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -997,7 +997,7 @@ def get_opencg_geometry(openmc_geometry): return opencg_geometry -def get_openmc_geometry(opencg_geometry, compatible=True): +def get_openmc_geometry(opencg_geometry, compatible=False): """Return an OpenMC geometry corresponding to an OpenCG geometry. Parameters @@ -1007,7 +1007,7 @@ def get_openmc_geometry(opencg_geometry, compatible=True): compatible : bool Whether the OpenCG geometry is compatible with OpenMOC's geometric primitives. This should be set to False if the OpenCG geometry - uses SquarePrism surfaces. True by default as an optimization. + uses SquarePrism surfaces. False by default. Returns ------- From 59d474c1758d84d7e71b7f83276f51f6b62fa7b9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 18 Aug 2016 17:24:30 -0500 Subject: [PATCH 096/168] Respond to comments on #705 --- openmc/mgxs/mdgxs.py | 3 ++- src/source.F90 | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/openmc/mgxs/mdgxs.py b/openmc/mgxs/mdgxs.py index 0a2f898c07..5e5d840b6c 100644 --- a/openmc/mgxs/mdgxs.py +++ b/openmc/mgxs/mdgxs.py @@ -793,7 +793,8 @@ class MDGXS(MGXS): df.rename(columns={'energyout low [MeV]': 'group out'}, inplace=True) - out_groups = np.tile(all_groups, int(df.shape[0] / all_groups.size)) + out_groups = np.repeat(all_groups, self.xs_tally.num_scores) + out_groups = np.tile(out_groups, int(df.shape[0] / out_groups.size)) df['group out'] = out_groups del df['energyout high [MeV]'] columns = ['group in', 'group out'] diff --git a/src/source.F90 b/src/source.F90 index fad9ae46af..452d8ddfce 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -107,7 +107,7 @@ contains real(8) :: r(3) ! sampled coordinates logical :: found ! Does the source particle exist within geometry? type(Particle) :: p ! Temporary particle for using find_cell - integer, save :: n_sample = 0 ! Number of samples + integer, save :: n_accept = 0 ! Number of samples accepted integer, save :: n_reject = 0 ! Number of samples rejected ! Set weight to one by default @@ -161,15 +161,15 @@ contains if (.not. found) then n_reject = n_reject + 1 if (n_reject >= EXTSRC_REJECT_THRESHOLD .and. & - real(n_sample, 8)/n_reject <= EXTSRC_REJECT_FRACTION) then + real(n_accept, 8)/n_reject <= EXTSRC_REJECT_FRACTION) then call fatal_error("More than 95% of external source sites sampled & &were rejected. Please check your external source definition.") end if end if end do - ! Increment number of samples - n_sample = n_sample + 1 + ! Increment number of accepted samples + n_accept = n_accept + 1 call p % clear() From 256f0b93eb411430475255d783301b1adef32d71 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Thu, 18 Aug 2016 19:27:32 -0400 Subject: [PATCH 097/168] Resolving comments from @samuelshaner and @wbinventor --- openmc/mesh.py | 6 +++--- openmc/mgxs/library.py | 8 +++----- openmc/mgxs_library.py | 16 ++++++++-------- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/openmc/mesh.py b/openmc/mesh.py index c2b23bf1f9..58b9c7c0e5 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -6,8 +6,7 @@ import sys import numpy as np import openmc.checkvalue as cv -import openmc.surface -import openmc.cell +import openmc if sys.version_info[0] >= 3: @@ -199,6 +198,7 @@ class Mesh(object): ... """ + if len(self.dimension) == 2: for x in range(self.dimension[0]): for y in range(self.dimension[1]): @@ -241,7 +241,7 @@ class Mesh(object): def build_cells(self, bc=['reflective'] * 6): """Generates a lattice of universes with the same dimensionality - as the mesh object in self. The individual cells/universes produced + as the mesh object. The individual cells/universes produced will not have material definitions applied and so downstream code will have to apply that information. diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index d3d32ee599..9e5dba310c 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -899,7 +899,7 @@ class Library(object): cv.check_greater_than('tabular_points', tabular_points, 1) if subdomain is not None: cv.check_iterable_type('subdomain', subdomain, Integral, - max_depth=2) + max_depth=3) # Make sure statepoint has been loaded if self._sp_filename is None: @@ -1123,8 +1123,6 @@ class Library(object): # Create XSdata and Macroscopic for this domain xsdata = self.get_xsdata(domain, xsdata_name, - nuclide='total', - xs_type=xs_type, xs_id=all_xs_ids[i], tabular_legendre=tabular_legendre, tabular_points=tabular_points, @@ -1192,7 +1190,7 @@ class Library(object): in building the tabular distribution. Default is `33`. bc : iterable of {'reflective', 'periodic', 'transmission', or 'vacuum'} Boundary conditions for each of the four faces of a rectangle - (if aplying to a 2D mesh) or six faces of a parallelepiped + (if applying to a 2D mesh) or six faces of a parallelepiped (if applying to a 3D mesh) provided in the following order: [x min, x max, y min, y max, z min, z max]. 2-D cells do not contain the z min and z max entries. @@ -1227,7 +1225,7 @@ class Library(object): self.check_library_for_openmc_mgxs() # If the domain type is a mesh, then there can only be one domain for - # this method. Thi is because we can build a model automatically if + # this method. This is because we can build a model automatically if # the user provided multiple mesh domains for library generation since # the multiple meshes could be overlapping or in disparate regions # of the continuous energy model. The next step makes sure there is diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index c9a7debdcd..a3a2187b75 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -622,7 +622,7 @@ class XSdata(object): barns. Defaults to 'macro'. subdomain : iterable of int If the MGXS contains a mesh domain type, the subdomain parameter - specifies which mesh cell ([i, j, k]) to use. + specifies which mesh cell (i.e., [i, j, k] index) to use. See also -------- @@ -662,7 +662,7 @@ class XSdata(object): barns. Defaults to 'macro'. subdomain : iterable of int If the MGXS contains a mesh domain type, the subdomain parameter - specifies which mesh cell ([i, j, k]) to use. + specifies which mesh cell (i.e., [i, j, k] index) to use. See also -------- @@ -703,7 +703,7 @@ class XSdata(object): barns. Defaults to 'macro'. subdomain : iterable of int If the MGXS contains a mesh domain type, the subdomain parameter - specifies which mesh cell ([i, j, k]) to use. + specifies which mesh cell (i.e., [i, j, k] index) to use. See also -------- @@ -744,7 +744,7 @@ class XSdata(object): barns. Defaults to 'macro'. subdomain : iterable of int If the MGXS contains a mesh domain type, the subdomain parameter - specifies which mesh cell ([i, j, k]) to use. + specifies which mesh cell (i.e., [i, j, k] index) to use. See also -------- @@ -795,7 +795,7 @@ class XSdata(object): barns. Defaults to 'macro'. subdomain : iterable of int If the MGXS contains a mesh domain type, the subdomain parameter - specifies which mesh cell ([i, j, k]) to use. + specifies which mesh cell (i.e., [i, j, k] index) to use. See also -------- @@ -835,7 +835,7 @@ class XSdata(object): barns. Defaults to 'macro'. subdomain : iterable of int If the MGXS contains a mesh domain type, the subdomain parameter - specifies which mesh cell ([i, j, k]) to use. + specifies which mesh cell (i.e., [i, j, k] index) to use. See also -------- @@ -885,7 +885,7 @@ class XSdata(object): barns. Defaults to 'macro'. subdomain : iterable of int If the MGXS contains a mesh domain type, the subdomain parameter - specifies which mesh cell ([i, j, k]) to use. + specifies which mesh cell (i.e., [i, j, k] index) to use. See also -------- @@ -958,7 +958,7 @@ class XSdata(object): barns. Defaults to 'macro'. subdomain : iterable of int If the MGXS contains a mesh domain type, the subdomain parameter - specifies which mesh cell ([i, j, k]) to use. + specifies which mesh cell (i.e., [i, j, k] index) to use. See also -------- From 64032169117fc57a48ae706855aa38a43ecdb4db Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Fri, 19 Aug 2016 06:58:17 -0400 Subject: [PATCH 098/168] Renamed Equality to EqualityMixin --- openmc/data/ace.py | 6 +++--- openmc/data/angle_distribution.py | 4 ++-- openmc/data/angle_energy.py | 4 ++-- openmc/data/energy_distribution.py | 4 ++-- openmc/data/fission_energy.py | 4 ++-- openmc/data/function.py | 6 +++--- openmc/data/library.py | 4 ++-- openmc/data/neutron.py | 4 ++-- openmc/data/product.py | 4 ++-- openmc/data/reaction.py | 4 ++-- openmc/data/thermal.py | 6 +++--- openmc/data/urr.py | 4 ++-- openmc/mixin.py | 2 +- 13 files changed, 28 insertions(+), 28 deletions(-) diff --git a/openmc/data/ace.py b/openmc/data/ace.py index 867e3767a1..831e40fc81 100644 --- a/openmc/data/ace.py +++ b/openmc/data/ace.py @@ -22,7 +22,7 @@ import sys import numpy as np -from openmc.mixin import Equality +from openmc.mixin import EqualityMixin if sys.version_info[0] >= 3: @@ -133,7 +133,7 @@ def get_table(filename, name=None): .format(name)) -class Library(Equality): +class Library(EqualityMixin): """A Library objects represents an ACE-formatted file which may contain multiple tables with data. @@ -355,7 +355,7 @@ class Library(Equality): lines = [ace_file.readline() for i in range(13)] -class Table(Equality): +class Table(EqualityMixin): """ACE cross section table Parameters diff --git a/openmc/data/angle_distribution.py b/openmc/data/angle_distribution.py index 81cc068305..80b6cdbdb1 100644 --- a/openmc/data/angle_distribution.py +++ b/openmc/data/angle_distribution.py @@ -4,12 +4,12 @@ from numbers import Real import numpy as np import openmc.checkvalue as cv -from openmc.mixin import Equality +from openmc.mixin import EqualityMixin from openmc.stats import Univariate, Tabular, Uniform from .function import INTERPOLATION_SCHEME -class AngleDistribution(Equality): +class AngleDistribution(EqualityMixin): """Angle distribution as a function of incoming energy Parameters diff --git a/openmc/data/angle_energy.py b/openmc/data/angle_energy.py index 21748ab8a4..4a5e391e3f 100644 --- a/openmc/data/angle_energy.py +++ b/openmc/data/angle_energy.py @@ -1,10 +1,10 @@ from abc import ABCMeta, abstractmethod import openmc.data -from openmc.mixin import Equality +from openmc.mixin import EqualityMixin -class AngleEnergy(Equality): +class AngleEnergy(EqualityMixin): """Distribution in angle and energy of a secondary particle.""" __metaclass = ABCMeta diff --git a/openmc/data/energy_distribution.py b/openmc/data/energy_distribution.py index ba34abb4f0..a160906353 100644 --- a/openmc/data/energy_distribution.py +++ b/openmc/data/energy_distribution.py @@ -8,10 +8,10 @@ import numpy as np from .function import Tabulated1D, INTERPOLATION_SCHEME from openmc.stats.univariate import Univariate, Tabular, Discrete, Mixture import openmc.checkvalue as cv -from openmc.mixin import Equality +from openmc.mixin import EqualityMixin -class EnergyDistribution(Equality): +class EnergyDistribution(EqualityMixin): """Abstract superclass for all energy distributions.""" __metaclass__ = ABCMeta diff --git a/openmc/data/fission_energy.py b/openmc/data/fission_energy.py index d1023a01a9..6352915cc6 100644 --- a/openmc/data/fission_energy.py +++ b/openmc/data/fission_energy.py @@ -9,7 +9,7 @@ from .data import ATOMIC_SYMBOL from .endf_utils import read_float, read_CONT_line, identify_nuclide from .function import Function1D, Tabulated1D, Polynomial, Sum import openmc.checkvalue as cv -from openmc.mixin import Equality +from openmc.mixin import EqualityMixin if sys.version_info[0] >= 3: basestring = str @@ -190,7 +190,7 @@ def write_compact_458_library(endf_files, output_name='fission_Q_data.h5', out.close() -class FissionEnergyRelease(Equality): +class FissionEnergyRelease(EqualityMixin): """Energy relased by fission reactions. Energy is carried away from fission reactions by many different particles. diff --git a/openmc/data/function.py b/openmc/data/function.py index 7a4a938d1f..94a2f0911e 100644 --- a/openmc/data/function.py +++ b/openmc/data/function.py @@ -5,13 +5,13 @@ from numbers import Real, Integral import numpy as np import openmc.checkvalue as cv -from openmc.mixin import Equality +from openmc.mixin import EqualityMixin INTERPOLATION_SCHEME = {1: 'histogram', 2: 'linear-linear', 3: 'linear-log', 4: 'log-linear', 5: 'log-log'} -class Function1D(Equality): +class Function1D(EqualityMixin): """A function of one independent variable with HDF5 support.""" __metaclass__ = ABCMeta @@ -390,7 +390,7 @@ class Polynomial(np.polynomial.Polynomial, Function1D): return cls(dataset.value) -class Sum(Equality): +class Sum(EqualityMixin): """Sum of multiple functions. This class allows you to create a callable object which represents the sum diff --git a/openmc/data/library.py b/openmc/data/library.py index 6c2600f320..49d1c78f61 100644 --- a/openmc/data/library.py +++ b/openmc/data/library.py @@ -3,11 +3,11 @@ import xml.etree.ElementTree as ET import h5py -from openmc.mixin import Equality +from openmc.mixin import EqualityMixin from openmc.clean_xml import clean_xml_indentation -class DataLibrary(Equality): +class DataLibrary(EqualityMixin): def __init__(self): self.libraries = [] diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 66f4b2797f..c6621e1b8f 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -15,13 +15,13 @@ from .product import Product from .reaction import Reaction, _get_photon_products from .urr import ProbabilityTables import openmc.checkvalue as cv -from openmc.mixin import Equality +from openmc.mixin import EqualityMixin if sys.version_info[0] >= 3: basestring = str -class IncidentNeutron(Equality): +class IncidentNeutron(EqualityMixin): """Continuous-energy neutron interaction data. Instances of this class are not normally instantiated by the user but rather diff --git a/openmc/data/product.py b/openmc/data/product.py index 1f07076d95..753888f6df 100644 --- a/openmc/data/product.py +++ b/openmc/data/product.py @@ -5,7 +5,7 @@ import sys import numpy as np import openmc.checkvalue as cv -from openmc.mixin import Equality +from openmc.mixin import EqualityMixin from .function import Tabulated1D, Polynomial, Function1D from .angle_energy import AngleEnergy @@ -13,7 +13,7 @@ if sys.version_info[0] >= 3: basestring = str -class Product(Equality): +class Product(EqualityMixin): """Secondary particle emitted in a nuclear reaction Parameters diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index 0255a30975..e7580ec47e 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -7,7 +7,7 @@ from warnings import warn import numpy as np import openmc.checkvalue as cv -from openmc.mixin import Equality +from openmc.mixin import EqualityMixin from openmc.stats import Uniform from .angle_distribution import AngleDistribution from .angle_energy import AngleEnergy @@ -251,7 +251,7 @@ def _get_photon_products(ace, rx): return photons -class Reaction(Equality): +class Reaction(EqualityMixin): """A nuclear reaction A Reaction object represents a single reaction channel for a nuclide with diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 34981e566b..1551e8ac51 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -7,7 +7,7 @@ import numpy as np import h5py import openmc.checkvalue as cv -from openmc.mixin import Equality +from openmc.mixin import EqualityMixin from .ace import Table, get_table from .angle_energy import AngleEnergy from .function import Tabulated1D @@ -62,7 +62,7 @@ def get_thermal_name(name): return 'c_' + name -class CoherentElastic(Equality): +class CoherentElastic(EqualityMixin): r"""Coherent elastic scattering data from a crystalline material Parameters @@ -149,7 +149,7 @@ class CoherentElastic(Equality): return cls(bragg_edges, factors) -class ThermalScattering(Equality): +class ThermalScattering(EqualityMixin): """A ThermalScattering object contains thermal scattering data as represented by an S(alpha, beta) table. diff --git a/openmc/data/urr.py b/openmc/data/urr.py index 2e6ea355f0..05f64e5782 100644 --- a/openmc/data/urr.py +++ b/openmc/data/urr.py @@ -4,10 +4,10 @@ from numbers import Integral, Real import numpy as np import openmc.checkvalue as cv -from openmc.mixin import Equality +from openmc.mixin import EqualityMixin -class ProbabilityTables(Equality): +class ProbabilityTables(EqualityMixin): r"""Unresolved resonance region probability tables. Parameters diff --git a/openmc/mixin.py b/openmc/mixin.py index f4d5f4c8df..3495f0f6fa 100644 --- a/openmc/mixin.py +++ b/openmc/mixin.py @@ -1,7 +1,7 @@ import numpy as np -class Equality(object): +class EqualityMixin(object): """A Class which provides generic __eq__ and __ne__ functionality which can easily be inherited by downstream classes. """ From e79651c60045379345b1fc8942b0c6b8c66854e8 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Fri, 19 Aug 2016 06:59:25 -0400 Subject: [PATCH 099/168] Forgot one in stats, all good --- openmc/stats/univariate.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/stats/univariate.py b/openmc/stats/univariate.py index 2f5b304648..ce0f0fae1d 100644 --- a/openmc/stats/univariate.py +++ b/openmc/stats/univariate.py @@ -7,7 +7,7 @@ from xml.etree import ElementTree as ET import numpy as np import openmc.checkvalue as cv -from openmc.mixin import Equality +from openmc.mixin import EqualityMixin if sys.version_info[0] >= 3: basestring = str @@ -16,7 +16,7 @@ _INTERPOLATION_SCHEMES = ['histogram', 'linear-linear', 'linear-log', 'log-linear', 'log-log'] -class Univariate(Equality): +class Univariate(EqualityMixin): """Probability distribution of a single random variable. The Univariate class is an abstract class that can be derived to implement a From d24aaa8626f38bf752d3e775c7956e44d0742f16 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Fri, 19 Aug 2016 19:24:51 -0400 Subject: [PATCH 100/168] Final changes --- openmc/mixin.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/openmc/mixin.py b/openmc/mixin.py index 3495f0f6fa..dd97e89249 100644 --- a/openmc/mixin.py +++ b/openmc/mixin.py @@ -7,18 +7,14 @@ class EqualityMixin(object): """ def __eq__(self, other): - eqval = True if isinstance(other, type(self)): for key, value in self.__dict__.items(): - if key in other.__dict__: - if not np.array_equal(value, other.__dict__.get(key)): - eqval = False - else: - eqval = False + if not np.array_equal(value, other.__dict__.get(key)): + return False else: - eqval = False + return False - return eqval + return True def __ne__(self, other): return not self.__eq__(other) From 7d07b485b9a79f04fc2d34c2e1d27795befa5be4 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 20 Aug 2016 16:32:42 -0500 Subject: [PATCH 101/168] New OpenMC logo!! --- docs/source/_images/openmc.png | Bin 8862 -> 0 bytes docs/source/_images/openmc200px.png | Bin 6919 -> 0 bytes docs/source/_images/openmc_logo.png | Bin 0 -> 15452 bytes docs/source/_static/theme_overrides.css | 4 ++++ docs/source/conf.py | 2 +- 5 files changed, 5 insertions(+), 1 deletion(-) delete mode 100644 docs/source/_images/openmc.png delete mode 100644 docs/source/_images/openmc200px.png create mode 100644 docs/source/_images/openmc_logo.png diff --git a/docs/source/_images/openmc.png b/docs/source/_images/openmc.png deleted file mode 100644 index 9f5e97cd6e844052caf6e6095a5088922eb89113..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8862 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 N002ovPDHLkV1o1n77PFY diff --git a/docs/source/_images/openmc_logo.png b/docs/source/_images/openmc_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..73d4765387f00dbd0506f0edd38bffec474ac304 GIT binary patch literal 15452 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 literal 0 HcmV?d00001 diff --git a/docs/source/_static/theme_overrides.css b/docs/source/_static/theme_overrides.css index bee03f4150..dea941814d 100644 --- a/docs/source/_static/theme_overrides.css +++ b/docs/source/_static/theme_overrides.css @@ -16,3 +16,7 @@ .wy-table, .rst-content table.docutils, .rst-content table.field-list { margin-bottom: 0px; } + +.wy-side-nav-search { + background-color: #343131; +} diff --git a/docs/source/conf.py b/docs/source/conf.py index 1baea2b03c..75e621bc17 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -129,7 +129,7 @@ if not on_rtd: html_theme = 'sphinx_rtd_theme' html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] -html_logo = '_images/openmc200px.png' +html_logo = '_images/openmc_logo.png' # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". From 08219585f9328968e3ed49e42b89bb2eb3d4796a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Sat, 20 Aug 2016 16:50:14 -0500 Subject: [PATCH 102/168] Fix two documentation issues --- .../pythonapi/examples/mdgxs-part-i.rst | 13 ++++++++++++ .../pythonapi/examples/mdgxs-part-ii.rst | 13 ++++++++++++ openmc/mesh.py | 21 ++++++++++++------- 3 files changed, 39 insertions(+), 8 deletions(-) create mode 100644 docs/source/pythonapi/examples/mdgxs-part-i.rst create mode 100644 docs/source/pythonapi/examples/mdgxs-part-ii.rst diff --git a/docs/source/pythonapi/examples/mdgxs-part-i.rst b/docs/source/pythonapi/examples/mdgxs-part-i.rst new file mode 100644 index 0000000000..953dcf4700 --- /dev/null +++ b/docs/source/pythonapi/examples/mdgxs-part-i.rst @@ -0,0 +1,13 @@ +.. _notebook_mdgxs_part_i: + +========================== +MDGXS Part I: Introduction +========================== + +.. only:: html + + .. notebook:: mdgxs-part-i.ipynb + +.. only:: latex + + IPython notebooks must be viewed in the online HTML documentation. diff --git a/docs/source/pythonapi/examples/mdgxs-part-ii.rst b/docs/source/pythonapi/examples/mdgxs-part-ii.rst new file mode 100644 index 0000000000..a42eb766b7 --- /dev/null +++ b/docs/source/pythonapi/examples/mdgxs-part-ii.rst @@ -0,0 +1,13 @@ +.. _notebook_mdgxs_part_ii: + +================================ +MDGXS Part II: Advanced Features +================================ + +.. only:: html + + .. notebook:: mdgxs-part-ii.ipynb + +.. only:: latex + + IPython notebooks must be viewed in the online HTML documentation. diff --git a/openmc/mesh.py b/openmc/mesh.py index 58b9c7c0e5..7d7b483f73 100644 --- a/openmc/mesh.py +++ b/openmc/mesh.py @@ -187,15 +187,20 @@ class Mesh(object): of the mesh. For example the following code: - for mesh_index in mymesh.cell_generator(): - print mesh_index - will produce the following output for a 3-D 2x2x2 mesh in mymesh: - [1, 1, 1] - [1, 1, 2] - [1, 2, 1] - [1, 2, 2] - ... + .. code-block:: python + + for mesh_index in mymesh.cell_generator(): + print mesh_index + + will produce the following output for a 3-D 2x2x2 mesh in mymesh:: + + [1, 1, 1] + [1, 1, 2] + [1, 2, 1] + [1, 2, 2] + ... + """ From 3b65dde0fd3dace45bfa422d505d1503694d4e77 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 21 Aug 2016 06:05:19 -0400 Subject: [PATCH 103/168] Folded multiple temperatures in to each h5 data file; now im getting 50% less storage required of endf70. yay! Next I think I can get rid of some s(a,b) information, will investigate that and then on to revising openMC so it can read and use this data --- openmc/data/data.py | 4 + openmc/data/neutron.py | 288 +++++++++++++++++++++--------- openmc/data/reaction.py | 141 +++++++++++---- openmc/data/thermal.py | 354 +++++++++++++++++++++++++++++-------- scripts/openmc-ace-to-hdf5 | 92 ++++++---- 5 files changed, 657 insertions(+), 222 deletions(-) diff --git a/openmc/data/data.py b/openmc/data/data.py index ebc2cba432..4eb7860c23 100644 --- a/openmc/data/data.py +++ b/openmc/data/data.py @@ -218,3 +218,7 @@ def atomic_mass(isotope): isotope = isotope[:isotope.find('_')] return _ATOMIC_MASS.get(isotope.lower()) + +def kT_to_K(kT): + K = kT / 8.6173324e-11 + return K \ No newline at end of file diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index c6621e1b8f..8ea8e38e3e 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -7,7 +7,7 @@ from warnings import warn import numpy as np import h5py -from .data import ATOMIC_SYMBOL, SUM_RULES +from .data import ATOMIC_SYMBOL, SUM_RULES, kT_to_K from .ace import Table, get_table from .fission_energy import FissionEnergyRelease from .function import Tabulated1D, Sum @@ -21,6 +21,64 @@ if sys.version_info[0] >= 3: basestring = str +def _get_metadata(zaid, metastable_scheme='nndc'): + """Method to obtain the complete element name, element, Z, mass_number, + and metastable state + + Parameters + ---------- + zaid : int + ZAID (1000*Z + A) obtained from a library + metastable_scheme : {'nndc', 'mcnp'} + Determine how ZAID identifiers are to be interpreted in the case of + a metastable nuclide. Because the normal ZAID (=1000*Z + A) does not + encode metastable information, different conventions are used among + different libraries. In MCNP libraries, the convention is to add 400 + for a metastable nuclide except for Am242m, for which 95242 is + metastable and 95642 (or 1095242 in newer libraries) is the ground + state. For NNDC libraries, ZAID is given as 1000*Z + A + 100*m. + + Returns + ------- + + """ + + cv.check_type('zaid', zaid, int) + cv.check_value('metastable_scheme', metastable_scheme, ['nndc', 'mcnp']) + + Z = zaid // 1000 + mass_number = zaid % 1000 + + if metastable_scheme == 'mcnp': + if zaid > 1000000: + # New SZA format + Z = Z % 1000 + if zaid == 1095242: + metastable = 0 + else: + metastable = zaid // 1000000 + else: + if zaid == 95242: + metastable = 1 + elif zaid == 95642: + metastable = 0 + else: + metastable = 1 if mass_number > 300 else 0 + elif metastable_scheme == 'nndc': + metastable = 1 if mass_number > 300 else 0 + + while mass_number > 3 * Z: + mass_number -= 100 + + # Determine name + element = ATOMIC_SYMBOL[Z] + name = '{}{}'.format(element, mass_number) + if metastable > 0: + name += '_m{}'.format(metastable) + + return (name, element, Z, mass_number, metastable) + + class IncidentNeutron(EqualityMixin): """Continuous-energy neutron interaction data. @@ -40,8 +98,9 @@ class IncidentNeutron(EqualityMixin): Metastable state of the nucleus. A value of zero indicates ground state. atomic_weight_ratio : float Atomic mass ratio of the target nuclide. - temperature : float - Temperature of the target nuclide in MeV. + kTs : Iterable float + List of temperatures of the target nuclide in the data set. + The temperatures have units of MeV. Attributes ---------- @@ -51,8 +110,10 @@ class IncidentNeutron(EqualityMixin): Atomic symbol of the nuclide, e.g., 'Zr' atomic_weight_ratio : float Atomic weight ratio of the target nuclide. - energy : numpy.ndarray + energy : dict of numpy.ndarray The energy values (MeV) at which reaction cross-sections are tabulated. + They keys of the dict are the temperature string ('296.3K') for each + set of energies fission_energy : None or openmc.data.FissionEnergyRelease The energy released by fission, tabulated by component (e.g. prompt neutrons or beta particles) and dependent on incident neutron energy @@ -69,23 +130,28 @@ class IncidentNeutron(EqualityMixin): summed_reactions : collections.OrderedDict Contains summed cross sections, e.g., the total cross section. The keys are the MT values and the values are Reaction objects. - temperature : float - Temperature of the target nuclide in MeV. + temperatures : Iterable of str + List of string representations the temperatures of the target nuclide + in the data set. The temperatures are strings with 1 decimal place, + i.e., '293.6K' + kTs : Iterable of float + List of temperatures of the target nuclide in the data set. + The temperatures have units of MeV. urr : None or openmc.data.ProbabilityTables Unresolved resonance region probability tables """ def __init__(self, name, atomic_number, mass_number, metastable, - atomic_weight_ratio, temperature): + atomic_weight_ratio, kTs): self.name = name self.atomic_number = atomic_number self.mass_number = mass_number self.metastable = metastable self.atomic_weight_ratio = atomic_weight_ratio - self.temperature = temperature - - self._energy = None + self.kTs = kTs + self.temperatures = ["{0:.1f}K".format(kT_to_K(kT)) for kT in kTs] + self.energy = {} self._fission_energy = None self.reactions = OrderedDict() self.summed_reactions = OrderedDict() @@ -128,18 +194,10 @@ class IncidentNeutron(EqualityMixin): def atomic_weight_ratio(self): return self._atomic_weight_ratio - @property - def energy(self): - return self._energy - @property def fission_energy(self): return self._fission_energy - @property - def temperature(self): - return self._temperature - @property def reactions(self): return self._reactions @@ -159,7 +217,7 @@ class IncidentNeutron(EqualityMixin): @property def atomic_symbol(self): - return atomic_symbol[self.atomic_number] + return ATOMIC_SYMBOL[self.atomic_number] @atomic_number.setter def atomic_number(self, atomic_number): @@ -185,17 +243,6 @@ class IncidentNeutron(EqualityMixin): cv.check_greater_than('atomic weight ratio', atomic_weight_ratio, 0.0) self._atomic_weight_ratio = atomic_weight_ratio - @temperature.setter - def temperature(self, temperature): - cv.check_type('temperature', temperature, Real) - cv.check_greater_than('temperature', temperature, 0.0, True) - self._temperature = temperature - - @energy.setter - def energy(self, energy): - cv.check_type('energy grid', energy, Iterable, Real) - self._energy = energy - @fission_energy.setter def fission_energy(self, fission_energy): cv.check_type('fission energy release', fission_energy, @@ -218,6 +265,87 @@ class IncidentNeutron(EqualityMixin): (ProbabilityTables, type(None))) self._urr = urr + def add_temperature_from_ace(self, ace_or_filename, metastable_scheme='nndc'): + """Add data to the IncidentNeutron object from an ACE file at a + different temperature. + + Parameters + ---------- + ace_or_filename : openmc.data.ace.Table or str + ACE table to read from. If given as a string, it is assumed to be + the filename for the ACE file. + metastable_scheme : {'nndc', 'mcnp'} + Determine how ZAID identifiers are to be interpreted in the case of + a metastable nuclide. Because the normal ZAID (=1000*Z + A) does not + encode metastable information, different conventions are used among + different libraries. In MCNP libraries, the convention is to add 400 + for a metastable nuclide except for Am242m, for which 95242 is + metastable and 95642 (or 1095242 in newer libraries) is the ground + state. For NNDC libraries, ZAID is given as 1000*Z + A + 100*m. + + """ + + if isinstance(ace_or_filename, Table): + ace = ace_or_filename + else: + ace = get_table(ace_or_filename) + + # Obtain the information needed to check if this ACE file is for the + # same nuclide. + zaid, xs = ace.name.split('.') + name, element, Z, mass_number, metastable = \ + _get_metadata(int(zaid), metastable_scheme) + + # If this ACE data matches the data within self then get the data + if ace.temperature not in self.kTs: + if name == self.name: + # Add temperature and kTs + strT = "{0:.1f}K".format(kT_to_K(ace.temperature)) + self.temperatures.append(strT) + self.kTs.append(ace.temperature) + # Read energy grid + n_energy = ace.nxs[3] + energy = ace.xss[ace.jxs[1]:ace.jxs[1] + n_energy] + self.energy[strT] = energy + total_xs = \ + Tabulated1D(energy, ace.xss[ace.jxs[1] + + n_energy:ace.jxs[1] + + 2 * n_energy]) + abs_xs = Tabulated1D(energy, ace.xss[ace.jxs[1] + 2 * + n_energy:ace.jxs[1] + + 3 * n_energy]) + + self.summed_reactions[1].add_temperature(strT, 0, total_xs) + if 27 in self.summed_reactions: + self.summed_reactions[27].add_temperature(strT, 0, abs_xs) + + # Read each reaction and get the xs data out of it + n_reaction = ace.nxs[4] + 1 + for i in range(n_reaction): + rx = Reaction.from_ace(ace, i) + + xsdata = list(rx.T_data.values())[0] + self.reactions[rx.mt].add_temperature(strT, + xsdata.threshold_idx, + xsdata.xs) + + # Obtain data for the summed photon reactions + for mt in self.summed_reactions: + if mt not in [1, 27]: + # Create summed appropriate cross section + mts = self.get_reaction_components(mt) + xsdata = Sum([self.reactions[mt_i].T_data[strT].xs + for mt_i in mts]) + + self.summed_reactions[mt].add_temperature(strT, 0, + xsdata) + else: + raise ValueError('Data provided for an incorrect nuclide') + + else: + raise Warning('Temperature data set already within ' + 'IncidentNeutron object') + def get_reaction_components(self, mt): """Determine what reactions make up summed reaction. @@ -271,10 +399,12 @@ class IncidentNeutron(EqualityMixin): g.attrs['A'] = self.mass_number g.attrs['metastable'] = self.metastable g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio - g.attrs['temperature'] = self.temperature + g.attrs['kTs'] = self.kTs # Write energy grid - g.create_dataset('energy', data=self.energy) + eg = g.create_group('energy') + for temperature in self.temperatures: + eg.create_dataset(temperature, data=self.energy[temperature]) # Write reaction data rxs_group = g.create_group('reactions') @@ -327,19 +457,22 @@ class IncidentNeutron(EqualityMixin): mass_number = group.attrs['A'] metastable = group.attrs['metastable'] atomic_weight_ratio = group.attrs['atomic_weight_ratio'] - temperature = group.attrs['temperature'] + kTs = group.attrs['kTs'].tolist() + temperatures = ["{0:.1f}K".format(kT_to_K(kT)) for kT in kTs] data = cls(name, atomic_number, mass_number, metastable, - atomic_weight_ratio, temperature) + atomic_weight_ratio, kTs) # Read energy grid - data.energy = group['energy'].value + e_group = group['energy'] + for temperature in temperatures: + data.energy[temperature] = e_group[temperature].value # Read reaction data rxs_group = group['reactions'] for name, obj in sorted(rxs_group.items()): if name.startswith('reaction_'): - rx = Reaction.from_hdf5(obj, data.energy) + rx = Reaction.from_hdf5(obj, data.energy, temperatures) data.reactions[rx.mt] = rx # Read total nu data if available @@ -351,12 +484,15 @@ class IncidentNeutron(EqualityMixin): # MTs never depend on lower MTs. for mt_sum in sorted(SUM_RULES, reverse=True): if mt_sum not in data: - xs_components = [data[mt].xs for mt in SUM_RULES[mt_sum] - if mt in data] - if len(xs_components) > 0: - rxn = Reaction(mt_sum) - rxn.xs = Sum(xs_components) - data.summed_reactions[mt_sum] = rxn + for it, T in enumerate(data.temperatures): + xs_components = \ + [data[mt].T_data[T].xs for mt in SUM_RULES[mt_sum] + if mt in data] + if len(xs_components) > 0: + if it == 0: + data.summed_reactions[mt_sum] = Reaction(mt_sum) + data.summed_reactions[mt_sum].add_temperature( + T, 0, Sum(xs_components)) # Read unresolved resonance probability tables if 'urr' in group: @@ -376,9 +512,9 @@ class IncidentNeutron(EqualityMixin): Parameters ---------- - ace : openmc.data.ace.Table or str - ACE table to read from. If given as a string, it is assumed to be - the filename for the ACE file. + ace_or_filename : openmc.data.ace.Table or str + ACE table to read from. If the value is a string, it is assumed to + be the filename for the ACE file. metastable_scheme : {'nndc', 'mcnp'} Determine how ZAID identifiers are to be interpreted in the case of a metastable nuclide. Because the normal ZAID (=1000*Z + A) does not @@ -394,6 +530,8 @@ class IncidentNeutron(EqualityMixin): Incident neutron continuous-energy data """ + + # First obtain the data for the first provided ACE table/file if isinstance(ace_or_filename, Table): ace = ace_or_filename else: @@ -401,54 +539,37 @@ class IncidentNeutron(EqualityMixin): # If mass number hasn't been specified, make an educated guess zaid, xs = ace.name.split('.') - zaid = int(zaid) - Z = zaid // 1000 - mass_number = zaid % 1000 + name, element, Z, mass_number, metastable = \ + _get_metadata(int(zaid), metastable_scheme) - if metastable_scheme == 'mcnp': - if zaid > 1000000: - # New SZA format - Z = Z % 1000 - if zaid == 1095242: - metastable = 0 - else: - metastable = zaid // 1000000 - else: - if zaid == 95242: - metastable = 1 - elif zaid == 95642: - metastable = 0 - else: - metastable = 1 if mass_number > 300 else 0 - elif metastable_scheme == 'nndc': - metastable = 1 if mass_number > 300 else 0 + # Assign temperature to the running list + kTs = [ace.temperature] + temperatures = ["{0:.1f}K".format(kT_to_K(ace.temperature))] - while mass_number > 3*Z: - mass_number -= 100 - - # Determine name for group - element = ATOMIC_SYMBOL[Z] - if metastable > 0: - name = '{}{}_m{}.{}'.format(element, mass_number, metastable, xs) - else: - name = '{}{}.{}'.format(element, mass_number, xs) + # 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) data = cls(name, Z, mass_number, metastable, - ace.atomic_weight_ratio, ace.temperature) + ace.atomic_weight_ratio, kTs) # Read energy grid n_energy = ace.nxs[3] energy = ace.xss[ace.jxs[1]:ace.jxs[1] + n_energy] - data.energy = energy - total_xs = ace.xss[ace.jxs[1] + n_energy:ace.jxs[1] + 2*n_energy] - absorption_xs = ace.xss[ace.jxs[1] + 2*n_energy:ace.jxs[1] + 3*n_energy] + data.energy[temperatures[0]] = energy + total_xs = ace.xss[ace.jxs[1] + n_energy:ace.jxs[1] + 2 * n_energy] + absorption_xs = ace.xss[ace.jxs[1] + 2*n_energy:ace.jxs[1] + + 3 * n_energy] # Create summed reactions (total and absorption) total = Reaction(1) - total.xs = Tabulated1D(energy, total_xs) + total.add_temperature(temperatures[-1], 0, + Tabulated1D(energy, total_xs)) data.summed_reactions[1] = total absorption = Reaction(27) - absorption.xs = Tabulated1D(energy, absorption_xs) + absorption.add_temperature(temperatures[-1], 0, + Tabulated1D(energy, absorption_xs)) data.summed_reactions[27] = absorption # Read each reaction @@ -478,7 +599,12 @@ class IncidentNeutron(EqualityMixin): warn('Photon production is present for MT={} but no ' 'reaction components exist.'.format(mt)) continue - rx.xs = Sum([data.reactions[mt_i].xs for mt_i in mts]) + threshold_idx = \ + np.amin([data.reactions[mt_i].T_data[temperatures[-1]].xs.x[0] + for mt_i in mts]) + xsvals = Sum([data.reactions[mt_i].T_data[temperatures[-1]].xs + for mt_i in mts]) + rx.add_temperature(temperatures[-1], threshold_idx, xsvals) # Determine summed cross section rx.products += _get_photon_products(ace, rx) diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index e7580ec47e..741822bf0c 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -1,7 +1,7 @@ from __future__ import division, unicode_literals from collections import Iterable, Callable from copy import deepcopy -from numbers import Real +from numbers import Real, Integral from warnings import warn import numpy as np @@ -12,7 +12,7 @@ from openmc.stats import Uniform from .angle_distribution import AngleDistribution from .angle_energy import AngleEnergy from .function import Tabulated1D, Polynomial -from .data import REACTION_NAME +from .data import REACTION_NAME, kT_to_K from .product import Product from .uncorrelated import UncorrelatedAngleEnergy @@ -211,7 +211,7 @@ def _get_photon_products(ace, rx): # Get photon production cross section photon_prod_xs = ace.xss[idx + 2:idx + 2 + n_energy] - neutron_xs = rx.xs(energy) + neutron_xs = list(rx.T_data.values())[0].xs(energy) idx = np.where(neutron_xs > 0.) # Calculate photon yield @@ -251,6 +251,78 @@ def _get_photon_products(ace, rx): return photons +class XS(EqualityMixin): + """An energy-dependent cross-section for a reaction channel + + Parameters + ---------- + threshold_idx : int + The index on the energy grid corresponding to the threshold of this + reaction. + xs : dict of callable + Microscopic cross section for this reaction as a function of incident + energy; these cross sections are provided in a dictionary where the key + is the temperature of the cross section set. + + Attributes + ---------- + threshold : float + Threshold of the reaction in MeV + threshold_idx : int + The index on the energy grid corresponding to the threshold of this + reaction. + xs : dict of callable + Microscopic cross section for this reaction as a function of incident + energy; these cross sections are provided in a dictionary where the key + is the temperature of the cross section set. + + """ + + def __init__(self, threshold_idx, xs): + self._threshold_idx = threshold_idx + self._xs = xs + + @property + def threshold_idx(self): + return self._threshold_idx + + @property + def threshold(self): + return self.xs.x[0] + + @property + def xs(self): + return self._xs + + @threshold_idx.setter + def threshold_idx(self, threshold_idx): + cv.check_type('threshold_idx', threshold_idx, Integral) + cv.check_greater_than('threshold_idx', threshold_idx, 0, equality=True) + self._threshold_idx = threshold_idx + + @xs.setter + def xs(self, xs): + cv.check_type('reaction cross section', xs, Callable) + if isinstance(xs, Tabulated1D): + for y in xs.y: + cv.check_greater_than('reaction cross section', y, 0.0, True) + self._xs = xs + + def to_hdf5(self, group): + """Write XS to an HDF5 group + + Parameters + ---------- + group : h5py.Group + HDF5 group to write to + + """ + + group.attrs['threshold_idx'] = self.threshold_idx + 1 + if self.xs is not None: + group.create_dataset('xs', data=self.xs.y) + + class Reaction(EqualityMixin): """A nuclear reaction @@ -281,9 +353,10 @@ class Reaction(EqualityMixin): threshold_idx : int The index on the energy grid corresponding to the threshold of this reaction. - xs : callable + T_data : dict of openmc.data.XS Microscopic cross section for this reaction as a function of incident - energy + energy; these cross sections are provided in a dictionary where the key + is the temperature of the cross section set. products : Iterable of openmc.data.Product Reaction products derived_products : Iterable of openmc.data.Product @@ -296,8 +369,7 @@ class Reaction(EqualityMixin): self.center_of_mass = True self.mt = mt self.q_value = 0. - self.threshold_idx = 0 - self._xs = None + self.T_data = {} self.products = [] self.derived_products = [] @@ -319,14 +391,6 @@ class Reaction(EqualityMixin): def products(self): return self._products - @property - def threshold(self): - return self.xs.x[0] - - @property - def xs(self): - return self._xs - @center_of_mass.setter def center_of_mass(self, center_of_mass): cv.check_type('center of mass', center_of_mass, (bool, np.bool_)) @@ -342,13 +406,9 @@ class Reaction(EqualityMixin): cv.check_type('reaction products', products, Iterable, Product) self._products = products - @xs.setter - def xs(self, xs): - cv.check_type('reaction cross section', xs, Callable) - if isinstance(xs, Tabulated1D): - for y in xs.y: - cv.check_greater_than('reaction cross section', y, 0.0, True) - self._xs = xs + def add_temperature(self, temperature, threshold_idx, xs): + cv.check_type('temperature', temperature, str) + self.T_data[temperature] = XS(threshold_idx, xs) def to_hdf5(self, group): """Write reaction to an HDF5 group @@ -366,16 +426,16 @@ class Reaction(EqualityMixin): else: group.attrs['label'] = np.string_(self.mt) group.attrs['Q_value'] = self.q_value - group.attrs['threshold_idx'] = self.threshold_idx + 1 group.attrs['center_of_mass'] = 1 if self.center_of_mass else 0 - if self.xs is not None: - group.create_dataset('xs', data=self.xs.y) + for T in self.T_data: + Tgroup = group.create_group(T) + self.T_data[T].to_hdf5(Tgroup) for i, p in enumerate(self.products): pgroup = group.create_group('product_{}'.format(i)) p.to_hdf5(pgroup) @classmethod - def from_hdf5(cls, group, energy): + def from_hdf5(cls, group, energy, temperatures): """Generate reaction from an HDF5 group Parameters @@ -384,6 +444,8 @@ class Reaction(EqualityMixin): HDF5 group to write to energy : Iterable of float Array of energies at which cross sections are tabulated at + temperatures : Iterable of float + Array of temperatures at which to obtain the cross sections Returns ------- @@ -391,16 +453,19 @@ class Reaction(EqualityMixin): Reaction data """ + mt = group.attrs['mt'] rx = cls(mt) rx.q_value = group.attrs['Q_value'] - rx.threshold_idx = group.attrs['threshold_idx'] - 1 rx.center_of_mass = bool(group.attrs['center_of_mass']) - # Read cross section - if 'xs' in group: - xs = group['xs'].value - rx.xs = Tabulated1D(energy[rx.threshold_idx:], xs) + # Read cross section data + for T in temperatures: + Tgroup = group[T] + if 'xs' in Tgroup: + threshold_idx = Tgroup.attrs['threshold_idx'] - 1 + xs = Tabulated1D(energy[T][threshold_idx:], Tgroup['xs'].value) + rx.T_data[T] = XS(threshold_idx, xs) # Determine number of products n_product = 0 @@ -421,6 +486,10 @@ class Reaction(EqualityMixin): n_grid = ace.nxs[3] grid = ace.xss[ace.jxs[1]:ace.jxs[1] + n_grid] + # Convert data temperature to a "300.0K" number for indexing + # temperature data + strT = "{0:.1f}K".format(kT_to_K(ace.temperature)) + if i_reaction > 0: mt = int(ace.xss[ace.jxs[3] + i_reaction - 1]) rx = cls(mt) @@ -435,11 +504,11 @@ class Reaction(EqualityMixin): loc = int(ace.xss[ace.jxs[6] + i_reaction - 1]) # Determine starting index on energy grid - rx.threshold_idx = int(ace.xss[ace.jxs[7] + loc - 1]) - 1 + threshold_idx = int(ace.xss[ace.jxs[7] + loc - 1]) - 1 # Determine number of energies in reaction n_energy = int(ace.xss[ace.jxs[7] + loc]) - energy = grid[rx.threshold_idx:rx.threshold_idx + n_energy] + energy = grid[threshold_idx:threshold_idx + n_energy] # Read reaction cross section xs = ace.xss[ace.jxs[7] + loc + 1:ace.jxs[7] + loc + 1 + n_energy] @@ -450,7 +519,8 @@ class Reaction(EqualityMixin): "to zero.".format(rx.mt, ace.name)) xs[xs < 0.0] = 0.0 - rx.xs = Tabulated1D(energy, xs) + tabulated_xs = Tabulated1D(energy, xs) + rx.T_data[strT] = XS(threshold_idx, tabulated_xs) # ================================================================== # YIELD AND ANGLE-ENERGY DISTRIBUTION @@ -509,7 +579,8 @@ class Reaction(EqualityMixin): "Setting to zero.".format(ace.name)) elastic_xs[elastic_xs < 0.0] = 0.0 - rx.xs = Tabulated1D(grid, elastic_xs) + tabulated_xs = Tabulated1D(grid, elastic_xs) + rx.T_data[strT] = XS(0, tabulated_xs) # No energy distribution for elastic scattering neutron = Product('neutron') diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 1551e8ac51..27c61e9249 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -8,6 +8,7 @@ import h5py import openmc.checkvalue as cv from openmc.mixin import EqualityMixin +from .data import kT_to_K from .ace import Table, get_table from .angle_energy import AngleEnergy from .function import Tabulated1D @@ -89,7 +90,7 @@ class CoherentElastic(EqualityMixin): if isinstance(E, Iterable): E = np.asarray(E) idx = np.searchsorted(self.bragg_edges, E) - return self.factors[idx]/E + return self.factors[idx] / E def __len__(self): @@ -159,8 +160,9 @@ class ThermalScattering(EqualityMixin): ZAID identifier of the table, e.g. lwtr.10t. atomic_weight_ratio : float Atomic mass ratio of the target nuclide. - temperature : float - Temperature of the target nuclide in eV. + kTs : Iterable of float + List of temperatures of the target nuclide in the data set. + The temperatures have units of MeV. Attributes ---------- @@ -174,22 +176,29 @@ class ThermalScattering(EqualityMixin): approximation name : str Name of the table, e.g. lwtr.20t. - temperature : float - Temperature of the target nuclide in eV. + temperatures : Iterable of str + List of string representations the temperatures of the target nuclide + in the data set. The temperatures are strings with 1 decimal place, + i.e., '293.6K' + kTs : Iterable of float + List of temperatures of the target nuclide in the data set. + The temperatures have units of MeV. zaids : Iterable of int ZAID identifiers that the thermal scattering data applies to """ - def __init__(self, name, atomic_weight_ratio, temperature): + def __init__(self, name, atomic_weight_ratio, kTs): self.name = name self.atomic_weight_ratio = atomic_weight_ratio - self.temperature = temperature - self.elastic_xs = None - self.elastic_mu_out = None - self.inelastic_xs = None - self.inelastic_e_out = None - self.inelastic_mu_out = None + self.kTs = kTs + self.temperatures = ["{0:.1f}K".format(kT_to_K(kT)) for kT in kTs] + self.elastic_xs = {} + self.elastic_mu_out = {} + self.inelastic_xs = {} + self.inelastic_e_out = {} + self.inelastic_mu_out = {} + self.inelastic_dist = {} self.secondary_mode = None self.zaids = [] @@ -217,26 +226,191 @@ class ThermalScattering(EqualityMixin): # Write basic data g = f.create_group(self.name) g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio - g.attrs['temperature'] = self.temperature + g.attrs['kTs'] = self.kTs g.attrs['zaids'] = self.zaids + g.attrs['secondary_mode'] = np.string_(self.secondary_mode) - # Write thermal elastic scattering - if self.elastic_xs is not None: - elastic_group = g.create_group('elastic') - self.elastic_xs.to_hdf5(elastic_group, 'xs') - if self.elastic_mu_out is not None: - elastic_group.create_dataset('mu_out', data=self.elastic_mu_out) + for T in self.temperatures: + Tg = g.create_group(T) + # Write thermal elastic scattering + if self.elastic_xs: + elastic_group = Tg.create_group('elastic') - # Write thermal inelastic scattering - if self.inelastic_xs is not None: - inelastic_group = g.create_group('inelastic') - self.inelastic_xs.to_hdf5(inelastic_group, 'xs') - inelastic_group.attrs['secondary_mode'] = np.string_(self.secondary_mode) - if self.secondary_mode in ('equal', 'skewed'): - inelastic_group.create_dataset('energy_out', data=self.inelastic_e_out) - inelastic_group.create_dataset('mu_out', data=self.inelastic_mu_out) - elif self.secondary_mode == 'continuous': - self.inelastic_dist.to_hdf5(inelastic_group) + self.elastic_xs[T].to_hdf5(elastic_group, 'xs') + if self.elastic_mu_out: + elastic_group.create_dataset('mu_out', + data=self.elastic_mu_out[T]) + + # Write thermal inelastic scattering + if self.inelastic_xs: + inelastic_group = Tg.create_group('inelastic') + self.inelastic_xs[T].to_hdf5(inelastic_group, 'xs') + if self.secondary_mode in ('equal', 'skewed'): + inelastic_group.create_dataset('energy_out', + data=self.inelastic_e_out[T]) + inelastic_group.create_dataset('mu_out', + data=self.inelastic_mu_out[T]) + elif self.secondary_mode == 'continuous': + self.inelastic_dist[T].to_hdf5(inelastic_group) + + f.close() + + def add_temperature_from_ace(self, ace_or_filename, name=None): + """Add data to the ThermalScattering object from an ACE file at a + different temperature. + + Parameters + ---------- + ace_or_filename : openmc.data.ace.Table or str + ACE table to read from. If given as a string, it is assumed to be + the filename for the ACE file. + name : str + GND-conforming name of the material, e.g. c_H_in_H2O. If none is + passed, the appropriate name is guessed based on the name of the ACE + table. + + Returns + ------- + openmc.data.ThermalScattering + Thermal scattering data + + """ + if isinstance(ace_or_filename, Table): + ace = ace_or_filename + else: + ace = get_table(ace_or_filename) + + # Get new name that is GND-consistent + ace_name, xs = ace.name.split('.') + if name is None: + if ace_name.lower() in _THERMAL_NAMES: + name = _THERMAL_NAMES[ace_name.lower()] + else: + # Make an educated guess? This actually works well for JEFF-3.2 + # which stupidly uses names like lw00.32t, lw01.32t, etc. for + # different temperatures + matches = get_close_matches( + ace_name.lower(), _THERMAL_NAMES.keys(), cutoff=0.5) + if len(matches) > 0: + name = _THERMAL_NAMES[matches[0]] + else: + # OK, we give up. Just use the ACE name. + name = 'c_' + ace.name + warn('Thermal scattering material "{}" is not recognized. ' + 'Assigning a name of {}.'.format(ace.name, name)) + + # If this ACE data matches the data within self then get the data + if ace.temperature not in self.kTs: + if name == self.name: + # Add temperature and kTs + strT = "{0:.1f}K".format(kT_to_K(ace.temperature)) + self.temperatures.append(strT) + self.kTs.append(ace.temperature) + + # Incoherent inelastic scattering cross section + idx = ace.jxs[1] + n_energy = int(ace.xss[idx]) + energy = ace.xss[idx + 1: idx + 1 + n_energy] + xs = ace.xss[idx + 1 + n_energy: idx + 1 + 2 * n_energy] + self.inelastic_xs[strT] = Tabulated1D(energy, xs) + + # Make sure secondary_mode is always equal. This should always + # be the case, but to reduce future debugging should something + # change, this will alert the developers to the issue. + if ace.nxs[7] == 0: + secondary_mode = 'equal' + elif ace.nxs[7] == 1: + secondary_mode = 'skewed' + elif ace.nxs[7] == 2: + secondary_mode = 'continuous' + + if secondary_mode != self.secondary_mode: + raise ValueError('Secondary Modes are inconsistent.') + + n_energy_out = ace.nxs[4] + if self.secondary_mode in ('equal', 'skewed'): + n_mu = ace.nxs[3] + idx = ace.jxs[3] + self.inelastic_e_out[strT] = \ + ace.xss[idx:idx + n_energy * n_energy_out * (n_mu + 2): + n_mu + 2] + self.inelastic_e_out[strT].shape = \ + (n_energy, n_energy_out) + + self.inelastic_mu_out[strT] = \ + ace.xss[idx:idx + n_energy * n_energy_out * (n_mu + 2)] + self.inelastic_mu_out[strT].shape = \ + (n_energy, n_energy_out, n_mu + 2) + self.inelastic_mu_out[strT] = \ + self.inelastic_mu_out[strT][:, :, 1:] + else: + n_mu = ace.nxs[3] - 1 + idx = ace.jxs[3] + locc = ace.xss[idx:idx + n_energy].astype(int) + n_energy_out = \ + ace.xss[idx + n_energy:idx + 2 * n_energy].astype(int) + energy_out = [] + mu_out = [] + for i in range(n_energy): + idx = locc[i] + + # Outgoing energy distribution for incoming energy i + e = ace.xss[idx + 1:idx + 1 + n_energy_out[i]*(n_mu + 3): + n_mu + 3] + p = ace.xss[idx + 2:idx + 2 + n_energy_out[i]*(n_mu + 3): + n_mu + 3] + c = ace.xss[idx + 3:idx + 3 + n_energy_out[i]*(n_mu + 3): + n_mu + 3] + eout_i = Tabular(e, p, 'linear-linear', ignore_negative=True) + eout_i.c = c + + # Outgoing angle distribution for each + # (incoming, outgoing) energy pair + mu_i = [] + for j in range(n_energy_out[i]): + mu = ace.xss[idx + 4:idx + 4 + n_mu] + p_mu = 1. / n_mu * np.ones(n_mu) + mu_ij = Discrete(mu, p_mu) + mu_ij.c = np.cumsum(p_mu) + mu_i.append(mu_ij) + idx += 3 + n_mu + + energy_out.append(eout_i) + mu_out.append(mu_i) + + # Create correlated angle-energy distribution + breakpoints = [n_energy] + interpolation = [2] + energy = self.inelastic_xs[strT].x + self.inelastic_dist[strT] = CorrelatedAngleEnergy( + breakpoints, interpolation, energy, energy_out, mu_out) + + # Incoherent/coherent elastic scattering cross section + idx = ace.jxs[4] + if idx != 0: + n_energy = int(ace.xss[idx]) + energy = ace.xss[idx + 1: idx + 1 + n_energy] + P = ace.xss[idx + 1 + n_energy: idx + 1 + 2 * n_energy] + + if ace.nxs[5] == 4: + self.elastic_xs[strT] = CoherentElastic(energy, P) + else: + self.elastic_xs[strT] = Tabulated1D(energy, P) + + # Angular distribution + n_mu = ace.nxs[6] + if n_mu != -1: + idx = ace.jxs[6] + self.elastic_mu_out[strT] = \ + ace.xss[idx:idx + n_energy * n_mu] + self.elastic_mu_out[strT].shape = \ + (n_energy, n_mu) + + else: + raise ValueError('Data provided for an incorrect library') + else: + raise Warning('Temperature data set already within ' + 'IncidentNeutron object') @classmethod def from_hdf5(cls, group_or_filename): @@ -263,35 +437,46 @@ class ThermalScattering(EqualityMixin): name = group.name[1:] atomic_weight_ratio = group.attrs['atomic_weight_ratio'] - temperature = group.attrs['temperature'] - table = cls(name, atomic_weight_ratio, temperature) + kTs = group.attrs['kTs'].tolist() + temperatures = ["{0:.1f}K".format(kT_to_K(kT)) for kT in kTs] + + table = cls(name, atomic_weight_ratio, kTs) table.zaids = group.attrs['zaids'] + table.secondary_mode = group.attrs['secondary_mode'].decode() # Read thermal elastic scattering - if 'elastic' in group: - elastic_group = group['elastic'] + for T in temperatures: + Tgroup = group[T] + if 'elastic' in Tgroup: + elastic_group = Tgroup['elastic'] - # Cross section - elastic_xs_type = elastic_group['xs'].attrs['type'].decode() - if elastic_xs_type == 'tab1': - table.elastic_xs = Tabulated1D.from_hdf5(elastic_group['xs']) - elif elastic_xs_type == 'bragg': - table.elastic_xs = CoherentElastic.from_hdf5(elastic_group['xs']) + # Cross section + elastic_xs_type = elastic_group['xs'].attrs['type'].decode() + if elastic_xs_type == 'Tabulated1D': + table.elastic_xs[T] = \ + Tabulated1D.from_hdf5(elastic_group['xs']) + elif elastic_xs_type == 'bragg': + table.elastic_xs[T] = \ + CoherentElastic.from_hdf5(elastic_group['xs']) - # Angular distribution - if 'mu_out' in elastic_group: - table.elastic_mu_out = elastic_group['mu_out'].value + # Angular distribution + if 'mu_out' in elastic_group: + table.elastic_mu_out[T] = \ + elastic_group['mu_out'].value - # Read thermal inelastic scattering - if 'inelastic' in group: - inelastic_group = group['inelastic'] - table.secondary_mode = inelastic_group.attrs['secondary_mode'].decode() - table.inelastic_xs = Tabulated1D.from_hdf5(inelastic_group['xs']) - if table.secondary_mode in ('equal', 'skewed'): - table.inelastic_e_out = inelastic_group['energy_out'] - table.inelastic_mu_out = inelastic_group['mu_out'] - elif table.secondary_mode == 'continuous': - table.inelastic_dist = AngleEnergy.from_hdf5(inelastic_group) + # Read thermal inelastic scattering + if 'inelastic' in Tgroup: + inelastic_group = Tgroup['inelastic'] + table.inelastic_xs[T] = \ + Tabulated1D.from_hdf5(inelastic_group['xs']) + if table.secondary_mode in ('equal', 'skewed'): + table.inelastic_e_out[T] = \ + inelastic_group['energy_out'] + table.inelastic_mu_out[T] = \ + inelastic_group['mu_out'] + elif table.secondary_mode == 'continuous': + table.inelastic_dist[T] = \ + AngleEnergy.from_hdf5(inelastic_group) return table @@ -301,7 +486,7 @@ class ThermalScattering(EqualityMixin): Parameters ---------- - ace : openmc.data.ace.Table or str + ace_or_filename : openmc.data.ace.Table or str ACE table to read from. If given as a string, it is assumed to be the filename for the ACE file. name : str @@ -324,7 +509,7 @@ class ThermalScattering(EqualityMixin): ace_name, xs = ace.name.split('.') if name is None: if ace_name.lower() in _THERMAL_NAMES: - name = _THERMAL_NAMES[ace_name.lower()] + '.' + xs + name = _THERMAL_NAMES[ace_name.lower()] else: # Make an educated guess?? This actually works well for JEFF-3.2 # which stupidly uses names like lw00.32t, lw01.32t, etc. for @@ -332,21 +517,25 @@ class ThermalScattering(EqualityMixin): matches = get_close_matches( ace_name.lower(), _THERMAL_NAMES.keys(), cutoff=0.5) if len(matches) > 0: - name = _THERMAL_NAMES[matches[0]] + '.' + xs + name = _THERMAL_NAMES[matches[0]] else: # OK, we give up. Just use the ACE name. name = 'c_' + ace.name warn('Thermal scattering material "{}" is not recognized. ' 'Assigning a name of {}.'.format(ace.name, name)) - table = cls(name, ace.atomic_weight_ratio, ace.temperature) + # Assign temperature to the running list + kTs = [ace.temperature] + temperatures = ["{0:.1f}K".format(kT_to_K(ace.temperature))] + + table = cls(name, ace.atomic_weight_ratio, kTs) # Incoherent inelastic scattering cross section idx = ace.jxs[1] n_energy = int(ace.xss[idx]) energy = ace.xss[idx+1 : idx+1+n_energy] xs = ace.xss[idx+1+n_energy : idx+1+2*n_energy] - table.inelastic_xs = Tabulated1D(energy, xs) + table.inelastic_xs[temperatures[0]] = Tabulated1D(energy, xs) if ace.nxs[7] == 0: table.secondary_mode = 'equal' @@ -359,34 +548,45 @@ class ThermalScattering(EqualityMixin): if table.secondary_mode in ('equal', 'skewed'): n_mu = ace.nxs[3] idx = ace.jxs[3] - table.inelastic_e_out = ace.xss[idx:idx+n_energy*n_energy_out*(n_mu+2):n_mu+2] - table.inelastic_e_out.shape = (n_energy, n_energy_out) + table.inelastic_e_out[temperatures[0]] = \ + ace.xss[idx:idx + n_energy * n_energy_out * (n_mu + 2): + n_mu + 2] + table.inelastic_e_out[temperatures[0]].shape = \ + (n_energy, n_energy_out) - table.inelastic_mu_out = ace.xss[idx:idx+n_energy*n_energy_out*(n_mu+2)] - table.inelastic_mu_out.shape = (n_energy, n_energy_out, n_mu+2) - table.inelastic_mu_out = table.inelastic_mu_out[:, :, 1:] + table.inelastic_mu_out[temperatures[0]] = \ + ace.xss[idx:idx + n_energy * n_energy_out * (n_mu + 2)] + table.inelastic_mu_out[temperatures[0]].shape = \ + (n_energy, n_energy_out, n_mu+2) + table.inelastic_mu_out[temperatures[0]] = \ + table.inelastic_mu_out[temperatures[0]][:, :, 1:] else: n_mu = ace.nxs[3] - 1 idx = ace.jxs[3] locc = ace.xss[idx:idx + n_energy].astype(int) - n_energy_out = ace.xss[idx + n_energy:idx + 2*n_energy].astype(int) + n_energy_out = \ + ace.xss[idx + n_energy:idx + 2 * n_energy].astype(int) energy_out = [] mu_out = [] for i in range(n_energy): idx = locc[i] # Outgoing energy distribution for incoming energy i - e = ace.xss[idx + 1:idx + 1 + n_energy_out[i]*(n_mu + 3):n_mu + 3] - p = ace.xss[idx + 2:idx + 2 + n_energy_out[i]*(n_mu + 3):n_mu + 3] - c = ace.xss[idx + 3:idx + 3 + n_energy_out[i]*(n_mu + 3):n_mu + 3] + e = ace.xss[idx + 1:idx + 1 + n_energy_out[i]*(n_mu + 3): + n_mu + 3] + p = ace.xss[idx + 2:idx + 2 + n_energy_out[i]*(n_mu + 3): + n_mu + 3] + c = ace.xss[idx + 3:idx + 3 + n_energy_out[i]*(n_mu + 3): + n_mu + 3] eout_i = Tabular(e, p, 'linear-linear', ignore_negative=True) eout_i.c = c - # Outgoing angle distribution for each (incoming, outgoing) energy pair + # Outgoing angle distribution for each + # (incoming, outgoing) energy pair mu_i = [] for j in range(n_energy_out[i]): mu = ace.xss[idx + 4:idx + 4 + n_mu] - p_mu = 1./n_mu*np.ones(n_mu) + p_mu = 1. / n_mu * np.ones(n_mu) mu_ij = Discrete(mu, p_mu) mu_ij.c = np.cumsum(p_mu) mu_i.append(mu_ij) @@ -398,28 +598,30 @@ class ThermalScattering(EqualityMixin): # Create correlated angle-energy distribution breakpoints = [n_energy] interpolation = [2] - energy = table.inelastic_xs.x - table.inelastic_dist = CorrelatedAngleEnergy( + energy = table.inelastic_xs[temperatures[0]].x + table.inelastic_dist[temperatures[0]] = CorrelatedAngleEnergy( breakpoints, interpolation, energy, energy_out, mu_out) # Incoherent/coherent elastic scattering cross section idx = ace.jxs[4] if idx != 0: n_energy = int(ace.xss[idx]) - energy = ace.xss[idx+1 : idx+1+n_energy] - P = ace.xss[idx+1+n_energy : idx+1+2*n_energy] + energy = ace.xss[idx + 1: idx + 1 + n_energy] + P = ace.xss[idx + 1 + n_energy: idx + 1 + 2 * n_energy] if ace.nxs[5] == 4: - table.elastic_xs = CoherentElastic(energy, P) + table.elastic_xs[temperatures[0]] = CoherentElastic(energy, P) else: - table.elastic_xs = Tabulated1D(energy, P) + table.elastic_xs[temperatures[0]] = Tabulated1D(energy, P) # Angular distribution n_mu = ace.nxs[6] if n_mu != -1: idx = ace.jxs[6] - table.elastic_mu_out = ace.xss[idx:idx + n_energy*n_mu] - table.elastic_mu_out.shape = (n_energy, n_mu) + table.elastic_mu_out[temperatures[0]] = \ + ace.xss[idx:idx + n_energy * n_mu] + table.elastic_mu_out[temperatures[0]].shape = \ + (n_energy, n_mu) # Get relevant ZAIDs pairs = np.fromiter(map(lambda p: p[0], ace.pairs), int) diff --git a/scripts/openmc-ace-to-hdf5 b/scripts/openmc-ace-to-hdf5 index 05e3aff322..a21fc9001a 100755 --- a/scripts/openmc-ace-to-hdf5 +++ b/scripts/openmc-ace-to-hdf5 @@ -124,47 +124,79 @@ for filename in ace_libraries: continue lib = openmc.data.ace.Library(filename) + nuclides = {} for table in lib.tables: - if table.name.endswith('c'): + name, xs = table.name.split('.') + if xs.endswith('c'): # Continuous-energy neutron data - try: + if name not in nuclides: neutron = openmc.data.IncidentNeutron.from_ace( - table, args.metastable) - except Exception as e: - print('Failed to convert {}: {}'.format(table.name, e)) - continue + table, args.metastable) + # try: + # neutron = openmc.data.IncidentNeutron.from_ace( + # table, args.metastable) + # except Exception as e: + # print('Failed to convert {}: {}'.format(table.name, e)) + # continue - # Fission energy release data, if available - if args.fission_energy_release is not None: - fer = openmc.data.FissionEnergyRelease.from_compact_hdf5( - args.fission_energy_release, neutron) - if fer is not None: - neutron.fission_energy = fer + # Fission energy release data, if available + if args.fission_energy_release is not None: + fer = openmc.data.FissionEnergyRelease.from_compact_hdf5( + args.fission_energy_release, neutron) + if fer is not None: + neutron.fission_energy = fer - print('Converting {} (ACE) to {} (HDF5)'.format(table.name, - neutron.name)) + print('Converting {} (ACE) to {} (HDF5)'.format(table.name, + neutron.name)) - # Determine filename - outfile = os.path.join(args.destination, - neutron.name.replace('.', '_') + '.h5') - neutron.export_to_hdf5(outfile, 'w') + # Determine filename + outfile = os.path.join(args.destination, + neutron.name.replace('.', '_') + '.h5') + neutron.export_to_hdf5(outfile, 'w') - # Register with library - library.register_file(outfile) + # Register with library + library.register_file(outfile) - elif table.name.endswith('t'): + # Add nuclide to list + nuclides[name] = outfile + else: + # Then we only need to append the data + print('Converting {} (ACE) to {} (HDF5)'.format(table.name, + neutron.name)) + neutron = \ + openmc.data.IncidentNeutron.from_hdf5(nuclides[name]) + neutron.add_temperature_from_ace(table, args.metastable) + neutron.export_to_hdf5(outfile + '_1', 'w') + os.rename(outfile + '_1', outfile) + + elif xs.endswith('t'): # Thermal scattering data - thermal = openmc.data.ThermalScattering.from_ace(table) - print('Converting {} (ACE) to {} (HDF5)'.format(table.name, - thermal.name)) + if name not in nuclides: + thermal = openmc.data.ThermalScattering.from_ace(table) + print('Converting {} (ACE) to {} (HDF5)'.format(table.name, + thermal.name)) - # Determine filename - outfile = os.path.join(args.destination, - thermal.name.replace('.', '_') + '.h5') - thermal.export_to_hdf5(outfile, 'w') + # Determine filename + outfile = os.path.join(args.destination, + thermal.name.replace('.', '_') + '.h5') + thermal.export_to_hdf5(outfile, 'w') - # Register with library - library.register_file(outfile, 'thermal') + # Register with library + library.register_file(outfile, 'thermal') + + # Add data to list + nuclides[name] = outfile + + else: + # Then we only need to append the data + print('Converting {} (ACE) to {} (HDF5)'.format(table.name, + thermal.name)) + # if table.name == 'poly.11t': + # import pdb; pdb.set_trace() + thermal = openmc.data.ThermalScattering.from_hdf5(nuclides[name]) + thermal.add_temperature_from_ace(table) + thermal.export_to_hdf5(outfile + '_1', 'w') + os.rename(outfile + '_1', outfile) # Write cross_sections.xml libpath = os.path.join(args.destination, 'cross_sections.xml') From 63b3c6dbd07c51d64210aec7ac95dd9af0f768bc Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 21 Aug 2016 11:37:39 -0400 Subject: [PATCH 104/168] Updated openmc-ace-to-hdf5 to generate the libraries for us and fixed bugs as found when developing that script. Also updated the Format description in nuclear_data.rst --- docs/source/io_formats/nuclear_data.rst | 56 +++++++++++++++---------- openmc/data/neutron.py | 9 ++-- openmc/data/reaction.py | 2 +- openmc/data/thermal.py | 9 ++-- scripts/openmc-ace-to-hdf5 | 18 ++++---- 5 files changed, 55 insertions(+), 39 deletions(-) diff --git a/docs/source/io_formats/nuclear_data.rst b/docs/source/io_formats/nuclear_data.rst index 7ad80b2fcd..bb87bd5b95 100644 --- a/docs/source/io_formats/nuclear_data.rst +++ b/docs/source/io_formats/nuclear_data.rst @@ -16,7 +16,7 @@ Incident Neutron Data - **metastable** (*int*) -- Metastable state (0=ground, 1=first excited, etc.) - **atomic_weight_ratio** (*double*) -- Mass in units of neutron masses - - **temperature** (*double*) -- Temperature in MeV + - **kTs** (*double[]*) -- Temperatures (in MeV) contained in the library - **n_reaction** (*int*) -- Number of reactions :Datasets: - **energy** (*double[]*) -- Energy points at which cross sections are tabulated @@ -26,13 +26,20 @@ Incident Neutron Data :Attributes: - **mt** (*int*) -- ENDF MT reaction number - **label** (*char[]*) -- Name of the reaction - **Q_value** (*double*) -- Q value in MeV - - **threshold_idx** (*int*) -- Index on the energy grid that the - reaction threshold corresponds to - **center_of_mass** (*int*) -- Whether the reference frame for scattering is center-of-mass (1) or laboratory (0) - **n_product** (*int*) -- Number of reaction products -:Datasets: - **xs** (*double[]*) -- Cross section values tabulated against the nuclide energy grid +**//reactions/reaction_//** + + is the temperature in Kelvin, rounded to the nearest integer, of the +temperature-dependent data set. For example, the data set corresponding to +300 Kelvin would be located at `300K`. + +:Attributes: - **threshold_idx** (*int*) -- Index on the energy grid that the + reaction threshold corresponds to for temperature TTT (in Kelvin) + +:Datasets: - **xs** (*double[]*) -- Cross section values tabulated against the nuclide energy grid for temperature TTT (in Kelvin) **//reactions/reaction_/product_/** @@ -92,32 +99,39 @@ Thermal Neutron Scattering Data **//** :Attributes: - **atomic_weight_ratio** (*double*) -- Mass in units of neutron masses - - **temperature** (*double*) -- Temperature in MeV + - **kTs** (*double[]*) -- Temperatures (in MeV) contained in the library - **zaids** (*int[]*) -- ZAID identifiers for which the thermal scattering data applies to - -**//elastic/** - -:Datasets: - **xs** (:ref:`tabulated <1d_tabulated>`) -- Thermal inelastic - scattering cross section - - **mu_out** (*double[][]*) -- Distribution of outgoing energies - and angles for coherent elastic scattering - -**//inelastic/** - -:Attributes: - **secondary_mode** (*char[]*) -- Indicates how the inelastic outgoing angle-energy distributions are represented ('equal', 'skewed', or 'continuous'). +**//elastic//** + + is the temperature in Kelvin, rounded to the nearest integer, of the +temperature-dependent data set. For example, the data set corresponding to +300 Kelvin would be located at `300K`. + :Datasets: - **xs** (:ref:`tabulated <1d_tabulated>`) -- Thermal inelastic - scattering cross section + scattering cross section for temperature TTT (in Kelvin) + - **mu_out** (*double[][]*) -- Distribution of outgoing energies + and angles for coherent elastic scattering for temperature TTT + (in Kelvin) + +**//inelastic//** + + is the temperature in Kelvin, rounded to the nearest integer, of the +temperature-dependent data set. For example, the data set corresponding to +300 Kelvin would be located at `300K`. + +:Datasets: - **xs** (:ref:`tabulated <1d_tabulated>`) -- Thermal inelastic + scattering cross section for temperature TTT (in Kelvin) - **energy_out** (*double[][]*) -- Distribution of outgoing - energies for each incoming energy. Only present if secondary mode - is not continuous. + energies for each incoming energy for temperature TTT (in Kelvin). + Only present if secondary mode is not continuous. - **mu_out** (*double[][][]*) -- Distribution of scattering cosines - for each pair of incoming and outgoing energies. Only present if - secondary mode is not continuous. + for each pair of incoming and outgoing energies. for temperature + TTT (in Kelvin). Only present if secondary mode is not continuous. If the secondary mode is continuous, the outgoing energy-angle distribution is given as a :ref:`correlated angle-energy distribution diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 8ea8e38e3e..0419787422 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -150,7 +150,7 @@ class IncidentNeutron(EqualityMixin): self.metastable = metastable self.atomic_weight_ratio = atomic_weight_ratio self.kTs = kTs - self.temperatures = ["{0:.1f}K".format(kT_to_K(kT)) for kT in kTs] + self.temperatures = [str(int(round(kT_to_K(kT)))) + "K" for kT in kTs] self.energy = {} self._fission_energy = None self.reactions = OrderedDict() @@ -300,7 +300,7 @@ class IncidentNeutron(EqualityMixin): if ace.temperature not in self.kTs: if name == self.name: # Add temperature and kTs - strT = "{0:.1f}K".format(kT_to_K(ace.temperature)) + strT = str(int(round(kT_to_K(ace.temperature)))) + "K" self.temperatures.append(strT) self.kTs.append(ace.temperature) # Read energy grid @@ -458,7 +458,7 @@ class IncidentNeutron(EqualityMixin): metastable = group.attrs['metastable'] atomic_weight_ratio = group.attrs['atomic_weight_ratio'] kTs = group.attrs['kTs'].tolist() - temperatures = ["{0:.1f}K".format(kT_to_K(kT)) for kT in kTs] + temperatures = [str(int(round(kT_to_K(kT)))) + "K" for kT in kTs] data = cls(name, atomic_number, mass_number, metastable, atomic_weight_ratio, kTs) @@ -544,7 +544,8 @@ class IncidentNeutron(EqualityMixin): # Assign temperature to the running list kTs = [ace.temperature] - temperatures = ["{0:.1f}K".format(kT_to_K(ace.temperature))] + + temperatures = [str(int(round(kT_to_K(ace.temperature)))) + "K"] # If mass number hasn't been specified, make an educated guess zaid, xs = ace.name.split('.') diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index 741822bf0c..5d3b8daf59 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -488,7 +488,7 @@ class Reaction(EqualityMixin): # Convert data temperature to a "300.0K" number for indexing # temperature data - strT = "{0:.1f}K".format(kT_to_K(ace.temperature)) + strT = str(int(round(kT_to_K(ace.temperature)))) + "K" if i_reaction > 0: mt = int(ace.xss[ace.jxs[3] + i_reaction - 1]) diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 27c61e9249..a28dcb504c 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -92,7 +92,6 @@ class CoherentElastic(EqualityMixin): idx = np.searchsorted(self.bragg_edges, E) return self.factors[idx] / E - def __len__(self): return len(self.bragg_edges) @@ -192,7 +191,7 @@ class ThermalScattering(EqualityMixin): self.name = name self.atomic_weight_ratio = atomic_weight_ratio self.kTs = kTs - self.temperatures = ["{0:.1f}K".format(kT_to_K(kT)) for kT in kTs] + self.temperatures = [str(int(round(kT_to_K(kT)))) + "K" for kT in kTs] self.elastic_xs = {} self.elastic_mu_out = {} self.inelastic_xs = {} @@ -303,7 +302,7 @@ class ThermalScattering(EqualityMixin): if ace.temperature not in self.kTs: if name == self.name: # Add temperature and kTs - strT = "{0:.1f}K".format(kT_to_K(ace.temperature)) + strT = str(int(round(kT_to_K(ace.temperature)))) + "K" self.temperatures.append(strT) self.kTs.append(ace.temperature) @@ -438,7 +437,7 @@ class ThermalScattering(EqualityMixin): name = group.name[1:] atomic_weight_ratio = group.attrs['atomic_weight_ratio'] kTs = group.attrs['kTs'].tolist() - temperatures = ["{0:.1f}K".format(kT_to_K(kT)) for kT in kTs] + temperatures = [str(int(round(kT_to_K(kT)))) + "K" for kT in kTs] table = cls(name, atomic_weight_ratio, kTs) table.zaids = group.attrs['zaids'] @@ -526,7 +525,7 @@ class ThermalScattering(EqualityMixin): # Assign temperature to the running list kTs = [ace.temperature] - temperatures = ["{0:.1f}K".format(kT_to_K(ace.temperature))] + temperatures = [str(int(round(kT_to_K(ace.temperature)))) + "K"] table = cls(name, ace.atomic_weight_ratio, kTs) diff --git a/scripts/openmc-ace-to-hdf5 b/scripts/openmc-ace-to-hdf5 index a21fc9001a..9a55ca7493 100755 --- a/scripts/openmc-ace-to-hdf5 +++ b/scripts/openmc-ace-to-hdf5 @@ -130,14 +130,12 @@ for filename in ace_libraries: if xs.endswith('c'): # Continuous-energy neutron data if name not in nuclides: - neutron = openmc.data.IncidentNeutron.from_ace( + try: + neutron = openmc.data.IncidentNeutron.from_ace( table, args.metastable) - # try: - # neutron = openmc.data.IncidentNeutron.from_ace( - # table, args.metastable) - # except Exception as e: - # print('Failed to convert {}: {}'.format(table.name, e)) - # continue + except Exception as e: + print('Failed to convert {}: {}'.format(table.name, e)) + continue # Fission energy release data, if available if args.fission_energy_release is not None: @@ -172,7 +170,11 @@ for filename in ace_libraries: elif xs.endswith('t'): # Thermal scattering data if name not in nuclides: - thermal = openmc.data.ThermalScattering.from_ace(table) + try: + thermal = openmc.data.ThermalScattering.from_ace(table) + except Exception as e: + print('Failed to convert {}: {}'.format(table.name, e)) + continue print('Converting {} (ACE) to {} (HDF5)'.format(table.name, thermal.name)) From 8fbd41eaf47d5b5ebeb5620fbfbf75d979433be6 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 21 Aug 2016 13:43:07 -0400 Subject: [PATCH 105/168] Seem to be able to read the new hdf5 files and run at least an example problem (!!!!) --- examples/xml/basic/materials.xml | 4 +- openmc/data/neutron.py | 9 +++- openmc/data/thermal.py | 9 +++- src/global.F90 | 3 -- src/input_xml.F90 | 75 ++++++++------------------------ src/material_header.F90 | 5 ++- src/nuclide_header.F90 | 21 ++++++--- src/reaction_header.F90 | 13 +++--- 8 files changed, 61 insertions(+), 78 deletions(-) diff --git a/examples/xml/basic/materials.xml b/examples/xml/basic/materials.xml index 2f88731ffc..573b96cb2b 100644 --- a/examples/xml/basic/materials.xml +++ b/examples/xml/basic/materials.xml @@ -6,13 +6,15 @@ + 294K - + + 294K diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 0419787422..87415d427f 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -399,7 +399,9 @@ class IncidentNeutron(EqualityMixin): g.attrs['A'] = self.mass_number g.attrs['metastable'] = self.metastable g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio - g.attrs['kTs'] = self.kTs + ktg = g.create_group('kTs') + for i, temperature in enumerate(self.temperatures): + ktg.create_dataset(temperature, data=self.kTs[i]) # Write energy grid eg = g.create_group('energy') @@ -457,7 +459,10 @@ class IncidentNeutron(EqualityMixin): mass_number = group.attrs['A'] metastable = group.attrs['metastable'] atomic_weight_ratio = group.attrs['atomic_weight_ratio'] - kTs = group.attrs['kTs'].tolist() + kTg = group['kTs'] + kTs = [] + for temp in kTg: + kTs.append(temp.value) temperatures = [str(int(round(kT_to_K(kT)))) + "K" for kT in kTs] data = cls(name, atomic_number, mass_number, metastable, diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index a28dcb504c..6f4aadd749 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -225,9 +225,11 @@ class ThermalScattering(EqualityMixin): # Write basic data g = f.create_group(self.name) g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio - g.attrs['kTs'] = self.kTs g.attrs['zaids'] = self.zaids g.attrs['secondary_mode'] = np.string_(self.secondary_mode) + ktg = g.create_group('kTs') + for i, temperature in enumerate(self.temperatures): + ktg.create_dataset(temperature, data=self.kTs[i]) for T in self.temperatures: Tg = g.create_group(T) @@ -436,7 +438,10 @@ class ThermalScattering(EqualityMixin): name = group.name[1:] atomic_weight_ratio = group.attrs['atomic_weight_ratio'] - kTs = group.attrs['kTs'].tolist() + kTg = group['kTs'] + kTs = [] + for temp in kTg: + kTs.append(temp.value) temperatures = [str(int(round(kT_to_K(kT)))) + "K" for kT in kTs] table = cls(name, atomic_weight_ratio, kTs) diff --git a/src/global.F90 b/src/global.F90 index c22fec25c4..0fc1bc0c52 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -77,9 +77,6 @@ module global ! Dictionaries to look up cross sections and listings type(DictCharInt) :: nuclide_dict - ! Default xs identifier (e.g. 70c or 300K) - character(5):: default_xs - ! ============================================================================ ! CONTINUOUS-ENERGY CROSS SECTION RELATED VARIABLES diff --git a/src/input_xml.F90 b/src/input_xml.F90 index a60d8196ea..b20927743e 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2159,16 +2159,9 @@ contains &exist!") end if - ! Initialize default cross section variable - default_xs = "" - ! Parse materials.xml file call open_xmldoc(doc, filename) - ! Copy default cross section if present - if (check_for_node(doc, "default_xs")) & - call get_node_value(doc, "default_xs", default_xs) - ! Get pointer to list of XML call get_node_list(doc, "material", node_mat_list) @@ -2204,6 +2197,11 @@ contains call get_node_value(node_mat, "name", mat % name) end if + ! Copy material temperature + if (check_for_node(node_mat, "temperature")) then + call get_node_value(node_mat, "temperature", mat % temperature) + end if + ! ======================================================================= ! READ AND PARSE TAG @@ -2301,22 +2299,9 @@ contains // trim(to_str(mat % id))) end if - ! Check for cross section - if (.not. check_for_node(node_nuc, "xs")) then - if (default_xs == '') then - call fatal_error("No cross section specified for macroscopic data & - & in material " // trim(to_str(mat % id))) - else - name = to_lower(trim(default_xs)) - end if - end if - - ! store full name - call get_node_value(node_nuc, "name", temp_str) - if (check_for_node(node_nuc, "xs")) & - call get_node_value(node_nuc, "xs", name) - name = trim(temp_str) // "." // trim(name) - name = to_lower(name) + ! store nuclide name + call get_node_value(node_nuc, "name", name) + name = trim(name) ! save name and density to list call names % push_back(name) @@ -2345,16 +2330,6 @@ contains // trim(to_str(mat % id))) end if - ! Check for cross section - if (.not. check_for_node(node_nuc, "xs")) then - if (default_xs == '') then - call fatal_error("No cross section specified for nuclide in & - &material " // trim(to_str(mat % id))) - else - name = to_lower(trim(default_xs)) - end if - end if - ! Check enforced isotropic lab scattering if (run_CE) then if (check_for_node(node_nuc, "scattering")) then @@ -2372,11 +2347,9 @@ contains end if end if - ! store full name - call get_node_value(node_nuc, "name", temp_str) - if (check_for_node(node_nuc, "xs")) & - call get_node_value(node_nuc, "xs", name) - name = trim(temp_str) // "." // trim(name) + ! store nuclide name + call get_node_value(node_nuc, "name", name) + name = trim(name) ! save name and density to list call names % push_back(name) @@ -2424,18 +2397,6 @@ contains end if call get_node_value(node_ele, "name", name) - ! Check for cross section - if (check_for_node(node_ele, "xs")) then - call get_node_value(node_ele, "xs", temp_str) - else - if (default_xs == '') then - call fatal_error("No cross section specified for nuclide in & - &material " // trim(to_str(mat % id))) - else - temp_str = to_lower(trim(default_xs)) - end if - end if - ! Check if no atom/weight percents were specified or if both atom and ! weight percents were specified if (.not. check_for_node(node_ele, "ao") .and. & @@ -2581,14 +2542,11 @@ contains call get_list_item(node_sab_list, j, node_sab) ! Determine name of S(a,b) table - if (.not. check_for_node(node_sab, "name") .or. & - .not. check_for_node(node_sab, "xs")) then - call fatal_error("Need to specify and for S(a,b) & - &table.") + if (.not. check_for_node(node_sab, "name")) then + call fatal_error("Need to specify for S(a,b) table.") end if call get_node_value(node_sab, "name", name) - call get_node_value(node_sab, "xs", temp_str) - name = trim(name) // "." // trim(temp_str) + name = trim(name) mat % sab_names(j) = name ! Check that this nuclide is listed in the cross_sections.xml file @@ -5856,7 +5814,8 @@ contains ! Read nuclide data from HDF5 file_id = file_open(libraries(i_library) % path, 'r') group_id = open_group(file_id, name) - call nuclides(i_nuclide) % from_hdf5(group_id) + call nuclides(i_nuclide) % from_hdf5(group_id, & + materials(i) % temperature) call close_group(group_id) call file_close(file_id) @@ -5988,7 +5947,7 @@ contains ! Read nuclide data from HDF5 file_id = file_open(libraries(i_library) % path, 'r') group_id = open_group(file_id, name) - call resonant_nuc % from_hdf5(group_id) + call resonant_nuc % from_hdf5(group_id, '0K') call close_group(group_id) call file_close(file_id) diff --git a/src/material_header.F90 b/src/material_header.F90 index be4c860e22..27a0e61fea 100644 --- a/src/material_header.F90 +++ b/src/material_header.F90 @@ -8,11 +8,14 @@ module material_header type Material integer :: id ! unique identifier - character(len=104) :: name = "" ! User-defined name + character(len=104) :: name = "" ! User-defined name integer :: n_nuclides ! number of nuclides integer, allocatable :: nuclide(:) ! index in nuclides array real(8) :: density ! total atom density in atom/b-cm real(8), allocatable :: atom_density(:) ! nuclide atom density in atom/b-cm + character(6) :: temperature ! Temperature of the material + ! as presented in the HDF5 library; + ! e.g., "300K" ! Energy grid information integer :: n_grid ! # of union material grid points diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index f32a93030c..fd043d789c 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -180,9 +180,10 @@ module nuclide_header end subroutine nuclide_clear - subroutine nuclide_from_hdf5(this, group_id) + subroutine nuclide_from_hdf5(this, group_id, temperature) class(Nuclide), intent(inout) :: this - integer(HID_T), intent(in) :: group_id + integer(HID_T), intent(in) :: group_id + character(6), intent(in) :: temperature integer :: i integer :: Z @@ -192,12 +193,14 @@ module nuclide_header integer :: n_links integer :: hdf5_err integer(HID_T) :: urr_group, nu_group - integer(HID_T) :: energy_dset + integer(HID_T) :: energy_group, energy_dset + integer(HID_T) :: kT_group, kT_dset integer(HID_T) :: rxs_group integer(HID_T) :: rx_group integer(HID_T) :: total_nu integer(HID_T) :: fer_group ! fission_energy_release group integer(HID_T) :: fer_dset + integer(HID_T) :: temp_dset integer(SIZE_T) :: name_len, name_file_len integer(HSIZE_T) :: j integer(HSIZE_T) :: dims(1) @@ -217,15 +220,21 @@ module nuclide_header call read_attribute(this % metastable, group_id, 'metastable') this % zaid = 1000*Z + A + 400*this % metastable call read_attribute(this % awr, group_id, 'atomic_weight_ratio') - call read_attribute(this % kT, group_id, 'temperature') + kT_group = open_group(group_id, 'kTs') + kT_dset = open_dataset(kT_group, temperature) + call read_dataset(this % kT, kT_dset) + call close_dataset(kT_dset) + call close_group(kT_group) ! Read energy grid - energy_dset = open_dataset(group_id, 'energy') + energy_group = open_group(group_id, 'energy') + energy_dset = open_dataset(energy_group, temperature) call get_shape(energy_dset, dims) this % n_grid = int(dims(1), 4) allocate(this % energy(this % n_grid)) call read_dataset(this % energy, energy_dset) call close_dataset(energy_dset) + call close_group(energy_group) ! Get MT values based on group names rxs_group = open_group(group_id, 'reactions') @@ -243,7 +252,7 @@ module nuclide_header do i = 1, size(this % reactions) rx_group = open_group(rxs_group, 'reaction_' // trim(& zero_padded(MTs % data(i), 3))) - call this % reactions(i) % from_hdf5(rx_group) + call this % reactions(i) % from_hdf5(rx_group, temperature) call close_group(rx_group) end do call close_group(rxs_group) diff --git a/src/reaction_header.F90 b/src/reaction_header.F90 index 055dcb3923..4289e2160c 100644 --- a/src/reaction_header.F90 +++ b/src/reaction_header.F90 @@ -29,9 +29,10 @@ module reaction_header contains - subroutine reaction_from_hdf5(this, group_id) + subroutine reaction_from_hdf5(this, group_id, temperature) class(Reaction), intent(inout) :: this integer(HID_T), intent(in) :: group_id + character(6), intent(in) :: temperature integer :: i integer :: cm @@ -41,7 +42,7 @@ contains integer :: n_links integer :: hdf5_err integer(HID_T) :: pgroup - integer(HID_T) :: xs + integer(HID_T) :: xs, xs_group integer(SIZE_T) :: name_len integer(HSIZE_T) :: dims(1) integer(HSIZE_T) :: j @@ -49,16 +50,18 @@ contains call read_attribute(this % Q_value, group_id, 'Q_value') call read_attribute(this % MT, group_id, 'mt') - call read_attribute(this % threshold, group_id, 'threshold_idx') call read_attribute(cm, group_id, 'center_of_mass') this % scatter_in_cm = (cm == 1) - ! Read cross section - xs = open_dataset(group_id, 'xs') + ! Read cross section and threshold_idx data + xs_group = open_group(group_id, temperature) + call read_attribute(this % threshold, xs_group, 'threshold_idx') + xs = open_dataset(xs_group, 'xs') call get_shape(xs, dims) allocate(this % sigma(dims(1))) call read_dataset(this % sigma, xs) call close_dataset(xs) + call close_group(xs_group) ! Determine number of products call h5gget_info_f(group_id, storage_type, n_links, max_corder, hdf5_err) From 2f8afd291b785a47aad8e45bdbb0cb2cd46d9162 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 21 Aug 2016 14:00:40 -0400 Subject: [PATCH 106/168] Finished up the thermal side as well. Now I just need to update examples, etc --- src/input_xml.F90 | 3 ++- src/sab_header.F90 | 41 ++++++++++++++++++++++++++--------------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index b20927743e..af6737de60 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -5869,7 +5869,8 @@ contains ! Read S(a,b) data from HDF5 file_id = file_open(libraries(i_library) % path, 'r') group_id = open_group(file_id, name) - call sab_tables(i_sab) % from_hdf5(group_id) + call sab_tables(i_sab) % from_hdf5(group_id, & + materials(i) % temperature) call close_group(group_id) call file_close(file_id) diff --git a/src/sab_header.F90 b/src/sab_header.F90 index 3e9e18fab3..86b72740cf 100644 --- a/src/sab_header.F90 +++ b/src/sab_header.F90 @@ -154,16 +154,19 @@ contains end subroutine salphabeta_print - subroutine salphabeta_from_hdf5(this, group_id) + subroutine salphabeta_from_hdf5(this, group_id, temperature) class(SAlphaBeta), intent(inout) :: this integer(HID_T), intent(in) :: group_id + character(6), intent(in) :: temperature integer :: i, j integer :: n_energy, n_energy_out, n_mu integer :: hdf5_err + integer(HID_T) :: T_group integer(HID_T) :: elastic_group integer(HID_T) :: inelastic_group integer(HID_T) :: dset_id + integer(HID_T) :: kT_group, kT_dset integer(HSIZE_T) :: dims2(2) integer(HSIZE_T) :: dims3(3) real(8), allocatable :: temp(:,:) @@ -172,15 +175,31 @@ contains type(CorrelatedAngleEnergy) :: correlated_dist call read_attribute(this % awr, group_id, 'atomic_weight_ratio') - call read_attribute(this % kT, group_id, 'temperature') call read_attribute(this % zaid, group_id, 'zaids') + call read_attribute(type, group_id, 'secondary_mode') + select case (type) + case ('equal') + this % secondary_mode = SAB_SECONDARY_EQUAL + case ('skewed') + this % secondary_mode = SAB_SECONDARY_SKEWED + case ('continuous') + this % secondary_mode = SAB_SECONDARY_CONT + end select this % n_zaid = size(this % zaid) + kT_group = open_group(group_id, 'kTs') + kT_dset = open_dataset(kT_group, temperature) + call read_dataset(this % kT, kT_dset) + call close_dataset(kT_dset) + call close_group(kT_group) + + ! Open temperature group + T_group = open_group(group_id, temperature) ! Coherent elastic data - call h5ltpath_valid_f(group_id, 'elastic', .true., exists, hdf5_err) + call h5ltpath_valid_f(T_group, 'elastic', .true., exists, hdf5_err) if (exists) then ! Read cross section data - elastic_group = open_group(group_id, 'elastic') + elastic_group = open_group(T_group, 'elastic') dset_id = open_dataset(elastic_group, 'xs') call read_attribute(type, dset_id, 'type') call get_shape(dset_id, dims2) @@ -219,19 +238,10 @@ contains end if ! Inelastic data - call h5ltpath_valid_f(group_id, 'inelastic', .true., exists, hdf5_err) + call h5ltpath_valid_f(T_group, 'inelastic', .true., exists, hdf5_err) if (exists) then ! Read type of inelastic data - inelastic_group = open_group(group_id, 'inelastic') - call read_attribute(type, inelastic_group, 'secondary_mode') - select case (type) - case ('equal') - this % secondary_mode = SAB_SECONDARY_EQUAL - case ('skewed') - this % secondary_mode = SAB_SECONDARY_SKEWED - case ('continuous') - this % secondary_mode = SAB_SECONDARY_CONT - end select + inelastic_group = open_group(T_group, 'inelastic') ! Read cross section data dset_id = open_dataset(inelastic_group, 'xs') @@ -308,6 +318,7 @@ contains call close_group(inelastic_group) end if + call close_group(T_group) end subroutine salphabeta_from_hdf5 end module sab_header From dfe2420b4a7e835cf53ebf78cb4db34deb4a4ad0 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 21 Aug 2016 14:36:58 -0400 Subject: [PATCH 107/168] Updated pyapi and docs to support new default_temperature/temperature and lack of default_xs/xs --- docs/source/usersguide/input.rst | 54 +++++++++++---------- examples/python/basic/build-xml.py | 4 +- openmc/element.py | 24 +-------- openmc/macroscopic.py | 20 +------- openmc/material.py | 78 +++++++++++++++++------------- openmc/nuclide.py | 22 +-------- src/input_xml.F90 | 13 +++++ 7 files changed, 93 insertions(+), 122 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 4bbc96cf86..27a9d36435 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -1295,6 +1295,13 @@ Each ``material`` element can have the following attributes or sub-elements: *Default*: "" + :temperature: + + An element with no attributes which is used to set the temperature of the + material. This element accepts a maximum 6-character string that indicates + the default temperature rounded to the nearest integer in units of Kelvin, + e.g. "294K". + :density: An element with attributes/sub-elements called ``value`` and ``units``. The ``value`` attribute is the numeric value of the density while the ``units`` @@ -1315,17 +1322,16 @@ Each ``material`` element can have the following attributes or sub-elements: ``nuclide``, ``element``, or ``sab`` quantity. :nuclide: - An element with attributes/sub-elements called ``name``, ``xs``, and ``ao`` + An element with attributes/sub-elements called ``name``, and ``ao`` or ``wo``. The ``name`` attribute is the name of the cross-section for a - desired nuclide while the ``xs`` attribute is the cross-section - identifier. Finally, the ``ao`` and ``wo`` attributes specify the atom or + desired nuclide. Finally, the ``ao`` and ``wo`` attributes specify the atom or weight percent of that nuclide within the material, respectively. One example would be as follows: .. code-block:: xml - - + + .. note:: If one nuclide is specified in atom percent, all others must also be given in atom percent. The same applies for weight percentages. @@ -1349,11 +1355,10 @@ Each ``material`` element can have the following attributes or sub-elements: Specifies that a natural element is present in the material. The natural element is split up into individual isotopes based on `IUPAC Isotopic Compositions of the Elements 2009`_. This element has - attributes/sub-elements called ``name``, ``xs``, and ``ao``. The ``name`` - attribute is the atomic symbol of the element while the ``xs`` attribute is - the cross-section identifier. Finally, the ``ao`` attribute specifies the - atom percent of the element within the material, respectively. One example - would be as follows: + attributes/sub-elements called ``name``, and ``ao``. The ``name`` + attribute is the atomic symbol of the element. Finally, the ``ao`` + attribute specifies the atom percent of the element within the material, + respectively. One example would be as follows: .. code-block:: xml @@ -1383,10 +1388,9 @@ 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 - attributes/sub-elements called ``name`` and ``xs``. The ``name`` attribute - is the name of the S(a,b) table that should be associated with the material, - and ``xs`` is the cross-section identifier for the table. + Associates an S(a,b) table with the material. This element has one + attribute/sub-element called ``name``. The ``name`` attribute + is the name of the S(a,b) table that should be associated with the material. *Default*: None @@ -1397,14 +1401,13 @@ Each ``material`` element can have the following attributes or sub-elements: recognizes that some multi-group libraries may be providing material specific macroscopic cross sections instead of always providing nuclide specific data like in the continuous-energy case. To that end, the - macroscopic element has attributes/sub-elements called ``name``, and ``xs``. + macroscopic element has one attribute/sub-element called ``name``. The ``name`` attribute is the name of the cross-section for a - desired nuclide while the ``xs`` attribute is the cross-section - identifier. One example would be as follows: + desired nuclide. One example would be as follows: .. code-block:: xml - + .. note:: This element is only used in the multi-group :ref:`energy_mode`. @@ -1413,15 +1416,16 @@ Each ``material`` element can have the following attributes or sub-elements: .. _IUPAC Isotopic Compositions of the Elements 2009: http://pac.iupac.org/publications/pac/pdf/2011/pdf/8302x0397.pdf -```` Element +```` Element ------------------------ -In some circumstances, the cross-section identifier may be the same for many or -all nuclides in a given problem. In this case, rather than specifying the -``xs=...`` attribute on every nuclide, a ```` element can be used to -set the default cross-section identifier for any nuclide without an identifier -explicitly listed. This element has no attributes and accepts a 3-letter string -that indicates the default cross-section identifier, e.g. "70c". +In some circumstances, the temperature may be the same for many or +all materials in a given problem. In this case, rather than specifying the +```` element on every material, a ```` +element can be used to set the default material temperature for any material +without an explicitly provided temperature. This element has no attributes and +accepts a maximum 6-character string that indicates the default temperature +rounded to the nearest integer in units of Kelvin, e.g. "294K". *Default*: None diff --git a/examples/python/basic/build-xml.py b/examples/python/basic/build-xml.py index 1bfe50b2e3..802debf8cd 100644 --- a/examples/python/basic/build-xml.py +++ b/examples/python/basic/build-xml.py @@ -25,7 +25,7 @@ moderator = openmc.Material(material_id=41, name='moderator') moderator.set_density('g/cc', 1.0) moderator.add_nuclide(h1, 2.) moderator.add_nuclide(o16, 1.) -moderator.add_s_alpha_beta('c_H_in_H2O', '71t') +moderator.add_s_alpha_beta('c_H_in_H2O') fuel = openmc.Material(material_id=40, name='fuel') fuel.set_density('g/cc', 4.5) @@ -33,7 +33,7 @@ fuel.add_nuclide(u235, 1.) # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([moderator, fuel]) -materials_file.default_xs = '71c' +materials_file.default_temperature = '294K' materials_file.export_to_xml() diff --git a/openmc/element.py b/openmc/element.py index ada5726b44..1b16806148 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -19,38 +19,28 @@ class Element(object): ---------- name : str Chemical symbol of the element, e.g. Pu - xs : str - Cross section identifier, e.g. 71c Attributes ---------- name : str Chemical symbol of the element, e.g. Pu - xs : str - Cross section identifier, e.g. 71c scattering : {'data', 'iso-in-lab', None} The type of angular scattering distribution to use """ - def __init__(self, name='', xs=None): + def __init__(self, name=''): # Initialize class attributes self._name = '' - self._xs = None self._scattering = None # Set class attributes self.name = name - if xs is not None: - self.xs = xs - def __eq__(self, other): if isinstance(other, Element): if self.name != other.name: return False - elif self.xs != other.xs: - return False else: return True elif isinstance(other, basestring) and other == self.name: @@ -72,17 +62,12 @@ class Element(object): def __repr__(self): string = 'Element - {0}\n'.format(self._name) - string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs) if self.scattering is not None: string += '{0: <16}{1}{2}\n'.format('\tscattering', '=\t', self.scattering) return string - @property - def xs(self): - return self._xs - @property def name(self): return self._name @@ -91,11 +76,6 @@ class Element(object): def scattering(self): return self._scattering - @xs.setter - def xs(self, xs): - check_type('cross section identifier', xs, basestring) - self._xs = xs - @name.setter def name(self, name): check_type('element name', name, basestring) @@ -127,6 +107,6 @@ class Element(object): isotopes = [] for isotope, abundance in sorted(NATURAL_ABUNDANCE.items()): if re.match(r'{}\d+'.format(self.name), isotope): - nuc = openmc.Nuclide(isotope, self.xs) + nuc = openmc.Nuclide(isotope) isotopes.append((nuc, abundance)) return isotopes diff --git a/openmc/macroscopic.py b/openmc/macroscopic.py index 9f55998e3a..e47baf9fba 100644 --- a/openmc/macroscopic.py +++ b/openmc/macroscopic.py @@ -13,29 +13,21 @@ class Macroscopic(object): ---------- name : str Name of the macroscopic data, e.g. UO2 - xs : str - Cross section identifier, e.g. 71c Attributes ---------- name : str Name of the nuclide, e.g. UO2 - xs : str - Cross section identifier, e.g. 71c """ - def __init__(self, name='', xs=None): + def __init__(self, name=''): # Initialize class attributes self._name = '' - self._xs = None # Set the Macroscopic class attributes self.name = name - if xs is not None: - self.xs = xs - def __eq__(self, other): if isinstance(other, Macroscopic): if self.name != other.name: @@ -57,23 +49,13 @@ class Macroscopic(object): def __repr__(self): string = 'Nuclide - {0}\n'.format(self._name) - string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self._xs) return string @property def name(self): return self._name - @property - def xs(self): - return self._xs - @name.setter def name(self, name): check_type('name', name, basestring) self._name = name - - @xs.setter - def xs(self, xs): - check_type('cross-section identifier', xs, basestring) - self._xs = xs diff --git a/openmc/material.py b/openmc/material.py index 40dfc1a9b0..d30487e2f6 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -41,11 +41,19 @@ class Material(object): name : str, optional Name of the material. If not specified, the name will be the empty string. + temperature : str, optional + The temperature identifier applied to this material. The units are + in Kelvin and the temperature rounded to the nearest integer. + For example, a tempreature of 293.6K would be provided as '294K' Attributes ---------- id : int Unique identifier for the material + temperature : str + The temperature identifier applied to this material. The units are + in Kelvin and the temperature rounded to the nearest integer. + For example, a tempreature of 293.6K would be provided as '294K' density : float Density of the material (units defined separately) density_units : str @@ -63,10 +71,11 @@ class Material(object): """ - def __init__(self, material_id=None, name=''): + def __init__(self, material_id=None, name='', temperature=None): # Initialize class attributes self.id = material_id self.name = name + self.temperature = temperature self._density = None self._density_units = '' @@ -133,7 +142,7 @@ class Material(object): string += '{0: <16}\n'.format('\tNuclides') for nuclide, percent, percent_type in self._nuclides: - string += '{0: <16}'.format('\t{0.name}.{0.xs}'.format(nuclide)) + string += '{0: <16}'.format('\t{0.name}'.format(nuclide)) string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type) if self._macroscopic is not None: @@ -143,7 +152,7 @@ class Material(object): string += '{0: <16}\n'.format('\tElements') for element, percent, percent_type in self._elements: - string += '{0: <16}'.format('\t{0.name}.{0.xs}'.format(element)) + string += '{0: <16}'.format('\t{0.name}'.format(element)) string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type) return string @@ -156,6 +165,10 @@ class Material(object): def name(self): return self._name + @property + def temperature(self): + return self._temperature + @property def density(self): return self._density @@ -201,6 +214,15 @@ class Material(object): else: self._name = '' + @temperature.setter + def temperature(self, temperature): + if temperature is not None: + cv.check_type('Temperature for Material ID="{0}"'.format(self._id), + temperature, basestring) + self._temperature = temperature + else: + self._temperature = '' + def set_density(self, units, density=None): """Set the density of the material @@ -458,15 +480,13 @@ class Material(object): if element == elm: self._nuclides.remove(elm) - def add_s_alpha_beta(self, name, xs): + def add_s_alpha_beta(self, name): r"""Add an :math:`S(\alpha,\beta)` table to the material Parameters ---------- name : str Name of the :math:`S(\alpha,\beta)` table - xs : str - Cross section identifier, e.g. '71t' """ @@ -480,18 +500,14 @@ class Material(object): 'non-string table name "{1}"'.format(self._id, name) raise ValueError(msg) - if not isinstance(xs, basestring): - msg = 'Unable to add an S(a,b) table to Material ID="{0}" with a ' \ - 'non-string cross-section identifier "{1}"'.format(self._id, xs) - raise ValueError(msg) - 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, xs)) + self._sab.append((new_name)) + def make_isotropic_in_lab(self): for nuclide, percent, percent_type in self._nuclides: @@ -554,9 +570,6 @@ class Material(object): else: xml_element.set("wo", str(nuclide[1])) - if nuclide[0].xs is not None: - xml_element.set("xs", nuclide[0].xs) - if not nuclide[0].scattering is None: xml_element.set("scattering", nuclide[0].scattering) @@ -581,9 +594,6 @@ class Material(object): else: xml_element.set("wo", str(element[1])) - if element[0].xs is not None: - xml_element.set("xs", element[0].xs) - if not element[0].scattering is None: xml_element.set("scattering", element[0].scattering) @@ -686,8 +696,7 @@ class Material(object): if len(self._sab) > 0: for sab in self._sab: subelement = ET.SubElement(element, "sab") - subelement.set("name", sab[0]) - subelement.set("xs", sab[1]) + subelement.set("name", sab) return element @@ -714,27 +723,29 @@ class Materials(cv.CheckedList): Attributes ---------- - default_xs : str - The default cross section identifier applied to a nuclide when none is - specified + default_temperature : str + The default temperature identifier applied to a material when none is + specified. The units are in Kelvin and the temperature rounded to the + nearest integer. For example, a tempreature of 293.6K would be + provided as '294K' """ def __init__(self, materials=None): super(Materials, self).__init__(Material, 'materials collection') - self._default_xs = None + self._default_temperature = None self._materials_file = ET.Element("materials") if materials is not None: self += materials @property - def default_xs(self): - return self._default_xs + def default_temperature(self): + return self._default_temperature - @default_xs.setter - def default_xs(self, xs): - cv.check_type('default xs', xs, basestring) - self._default_xs = xs + @default_temperature.setter + def default_temperature(self, temperature): + cv.check_type('default_temperature', temperature, basestring) + self._default_temperature = temperature def add_material(self, material): """Append material to collection @@ -817,9 +828,10 @@ class Materials(cv.CheckedList): material.make_isotropic_in_lab() def _create_material_subelements(self): - if self._default_xs is not None: - subelement = ET.SubElement(self._materials_file, "default_xs") - subelement.text = self._default_xs + if self._default_temperature is not None: + subelement = ET.SubElement(self._materials_file, + "default_temperature") + subelement.text = self._default_temperature for material in self: xml_element = material.get_material_xml() diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 68f95beb94..186292a873 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -15,15 +15,11 @@ class Nuclide(object): ---------- name : str Name of the nuclide, e.g. U235 - xs : str - Cross section identifier, e.g. 71c Attributes ---------- name : str Name of the nuclide, e.g. U235 - xs : str - Cross section identifier, e.g. 71c zaid : int 1000*(atomic number) + mass number. As an example, the zaid of U235 would be 92235. @@ -32,25 +28,19 @@ class Nuclide(object): """ - def __init__(self, name='', xs=None): + def __init__(self, name=''): # Initialize class attributes self._name = '' - self._xs = None self._zaid = None self._scattering = None # Set the Material class attributes self.name = name - if xs is not None: - self.xs = xs - def __eq__(self, other): if isinstance(other, Nuclide): if self.name != other.name: return False - elif self.xs != other.xs: - return False else: return True elif isinstance(other, basestring) and other == self.name: @@ -72,7 +62,6 @@ class Nuclide(object): def __repr__(self): string = 'Nuclide - {0}\n'.format(self._name) - string += '{0: <16}{1}{2}\n'.format('\tXS', '=\t', self.xs) if self.zaid is not None: string += '{0: <16}{1}{2}\n'.format('\tZAID', '=\t', self.zaid) if self.scattering is not None: @@ -84,10 +73,6 @@ class Nuclide(object): def name(self): return self._name - @property - def xs(self): - return self._xs - @property def zaid(self): return self._zaid @@ -111,11 +96,6 @@ class Nuclide(object): '"{}" is being renamed as "{}".'.format(name, self._name) warnings.warn(msg) - @xs.setter - def xs(self, xs): - check_type('cross-section identifier', xs, basestring) - self._xs = xs - @zaid.setter def zaid(self, zaid): check_type('zaid', zaid, Integral) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index af6737de60..d827cfad10 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2129,6 +2129,7 @@ contains logical :: file_exists ! does materials.xml exist? logical :: sum_density ! density is taken to be sum of nuclide densities character(20) :: name ! name of isotope, e.g. 92235.03c + character(6) :: default_temperature ! Default temperature, e.g., '300K' character(MAX_WORD_LEN) :: units ! units on density character(MAX_LINE_LEN) :: filename ! absolute path to materials.xml character(MAX_LINE_LEN) :: temp_str ! temporary string when reading @@ -2162,6 +2163,13 @@ contains ! Parse materials.xml file call open_xmldoc(doc, filename) + ! Copy default temperature + if (check_for_node(doc, "default_temperature")) then + call get_node_value(doc, "default_temperature", default_temperature) + else + default_temperature = '' + end if + ! Get pointer to list of XML call get_node_list(doc, "material", node_mat_list) @@ -2200,6 +2208,11 @@ contains ! Copy material temperature if (check_for_node(node_mat, "temperature")) then call get_node_value(node_mat, "temperature", mat % temperature) + else if (default_temperature /= '') then + mat % temperature = default_temperature + else + call fatal_error("Must specify eithe a material temperature or a & + &default temperature") end if ! ======================================================================= From 6a44a68975b9cabc30c4d73075b261f10b1da6e5 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 21 Aug 2016 14:39:50 -0400 Subject: [PATCH 108/168] updated python testing harness settings for new data format --- tests/input_set.py | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/tests/input_set.py b/tests/input_set.py index 8d650cafbc..ae2876480a 100644 --- a/tests/input_set.py +++ b/tests/input_set.py @@ -74,7 +74,7 @@ class InputSet(object): cold_water.add_nuclide("O16", 1.0) cold_water.add_nuclide("B10", 6.490e-4) cold_water.add_nuclide("B11", 2.689e-3) - cold_water.add_s_alpha_beta('c_H_in_H2O', '71t') + cold_water.add_s_alpha_beta('c_H_in_H2O') hot_water = openmc.Material(name='Hot borated water', material_id=4) hot_water.set_density('atom/b-cm', 0.06614) @@ -82,7 +82,7 @@ class InputSet(object): hot_water.add_nuclide("O16", 1.0) hot_water.add_nuclide("B10", 6.490e-4) hot_water.add_nuclide("B11", 2.689e-3) - hot_water.add_s_alpha_beta('c_H_in_H2O', '71t') + hot_water.add_s_alpha_beta('c_H_in_H2O') rpv_steel = openmc.Material(name='Reactor pressure vessel steel', material_id=5) @@ -139,7 +139,7 @@ class InputSet(object): lower_rad_ref.add_nuclide("Cr52", 0.145407678031, 'wo') lower_rad_ref.add_nuclide("Cr53", 0.016806340306, 'wo') lower_rad_ref.add_nuclide("Cr54", 0.004261520857, 'wo') - lower_rad_ref.add_s_alpha_beta('c_H_in_H2O', '71t') + lower_rad_ref.add_s_alpha_beta('c_H_in_H2O') upper_rad_ref = openmc.Material(name='Upper radial reflector /' 'Top plate region', material_id=7) @@ -165,7 +165,7 @@ class InputSet(object): upper_rad_ref.add_nuclide("Cr52", 0.146766614995, 'wo') upper_rad_ref.add_nuclide("Cr53", 0.01696340737, 'wo') upper_rad_ref.add_nuclide("Cr54", 0.004301347765, 'wo') - upper_rad_ref.add_s_alpha_beta('c_H_in_H2O', '71t') + upper_rad_ref.add_s_alpha_beta('c_H_in_H2O') bot_plate = openmc.Material(name='Bottom plate region', material_id=8) bot_plate.set_density('g/cm3', 7.184) @@ -190,7 +190,7 @@ class InputSet(object): bot_plate.add_nuclide("Cr52", 0.157390026871, 'wo') bot_plate.add_nuclide("Cr53", 0.018191270146, 'wo') bot_plate.add_nuclide("Cr54", 0.004612692337, 'wo') - bot_plate.add_s_alpha_beta('c_H_in_H2O', '71t') + bot_plate.add_s_alpha_beta('c_H_in_H2O') bot_nozzle = openmc.Material(name='Bottom nozzle region', material_id=9) @@ -216,7 +216,7 @@ class InputSet(object): bot_nozzle.add_nuclide("Cr52", 0.124142524198, 'wo') bot_nozzle.add_nuclide("Cr53", 0.014348496148, 'wo') bot_nozzle.add_nuclide("Cr54", 0.003638294506, 'wo') - bot_nozzle.add_s_alpha_beta('c_H_in_H2O', '71t') + bot_nozzle.add_s_alpha_beta('c_H_in_H2O') top_nozzle = openmc.Material(name='Top nozzle region', material_id=10) top_nozzle.set_density('g/cm3', 1.746) @@ -241,7 +241,7 @@ class InputSet(object): top_nozzle.add_nuclide("Cr52", 0.107931450781, 'wo') top_nozzle.add_nuclide("Cr53", 0.012474806806, 'wo') top_nozzle.add_nuclide("Cr54", 0.003163190107, 'wo') - top_nozzle.add_s_alpha_beta('c_H_in_H2O', '71t') + top_nozzle.add_s_alpha_beta('c_H_in_H2O') top_fa = openmc.Material(name='Top of fuel assemblies', material_id=11) top_fa.set_density('g/cm3', 3.044) @@ -254,7 +254,7 @@ class InputSet(object): top_fa.add_nuclide("Zr92", 0.14759527104, 'wo') top_fa.add_nuclide("Zr94", 0.15280552077, 'wo') top_fa.add_nuclide("Zr96", 0.02511169542, 'wo') - top_fa.add_s_alpha_beta('c_H_in_H2O', '71t') + top_fa.add_s_alpha_beta('c_H_in_H2O') bot_fa = openmc.Material(name='Bottom of fuel assemblies', material_id=12) @@ -268,10 +268,10 @@ class InputSet(object): bot_fa.add_nuclide("Zr92", 0.1274914944, 'wo') bot_fa.add_nuclide("Zr94", 0.1319920622, 'wo') bot_fa.add_nuclide("Zr96", 0.0216912612, 'wo') - bot_fa.add_s_alpha_beta('c_H_in_H2O', '71t') + bot_fa.add_s_alpha_beta('c_H_in_H2O') # Define the materials file. - self.materials.default_xs = '71c' + self.materials.default_temperature = '294K' self.materials += (fuel, clad, cold_water, hot_water, rpv_steel, lower_rad_ref, upper_rad_ref, bot_plate, bot_nozzle, top_nozzle, top_fa, bot_fa) @@ -612,10 +612,10 @@ class PinCellInputSet(object): hot_water.add_nuclide("O16", 2.4672e-2) hot_water.add_nuclide("B10", 8.0042e-6) hot_water.add_nuclide("B11", 3.2218e-5) - hot_water.add_s_alpha_beta('c_H_in_H2O', '71t') + hot_water.add_s_alpha_beta('c_H_in_H2O') # Define the materials file. - self.materials.default_xs = '71c' + self.materials.default_temperature = '294K' self.materials += (fuel, clad, hot_water) # Instantiate ZCylinder surfaces @@ -714,10 +714,10 @@ class AssemblyInputSet(object): hot_water.add_nuclide("O16", 2.4672e-2) hot_water.add_nuclide("B10", 8.0042e-6) hot_water.add_nuclide("B11", 3.2218e-5) - hot_water.add_s_alpha_beta('c_H_in_H2O', '71t') + hot_water.add_s_alpha_beta('c_H_in_H2O') # Define the materials file. - self.materials.default_xs = '71c' + self.materials.default_temperature = '294K' self.materials += (fuel, clad, hot_water) # Instantiate ZCylinder surfaces @@ -845,7 +845,7 @@ class MGInputSet(InputSet): water.add_macroscopic(water_data) # Define the materials file. - self.materials.default_xs = '71c' + self.materials.default_temperature = '294K' self.materials += (uo2, clad, water) # Define surfaces. From cd95667292ed23efaff5597204376b1e3f6f272b Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 21 Aug 2016 20:40:47 -0400 Subject: [PATCH 109/168] Updated to get significantly higher tets passage rate. Still have more work to do in a few key areas. --- examples/python/boxes/build-xml.py | 4 +- .../python/lattice/hexagonal/build-xml.py | 4 +- examples/python/lattice/nested/build-xml.py | 4 +- examples/python/lattice/simple/build-xml.py | 4 +- examples/python/pincell/build-xml.py | 4 +- examples/python/reflective/build-xml.py | 2 +- examples/xml/basic/materials.xml | 4 +- examples/xml/boxes/materials.xml | 4 +- examples/xml/lattice/nested/materials.xml | 4 +- examples/xml/lattice/simple/materials.xml | 4 +- examples/xml/pincell/materials.xml | 6 +- examples/xml/reflective/materials.xml | 2 +- openmc/summary.py | 12 +- src/input_xml.F90 | 2 +- src/summary.F90 | 15 +- tests/test_asymmetric_lattice/inputs_true.dat | 2 +- tests/test_cmfd_feed/materials.xml | 8 +- tests/test_cmfd_nofeed/materials.xml | 8 +- tests/test_complex_cell/materials.xml | 2 +- tests/test_confidence_intervals/materials.xml | 3 +- tests/test_density/materials.xml | 14 +- tests/test_distribmat/inputs_true.dat | 2 +- tests/test_distribmat/test_distribmat.py | 2 +- .../test_eigenvalue_genperbatch/materials.xml | 4 +- .../test_eigenvalue_no_inactive/materials.xml | 4 +- tests/test_energy_grid/materials.xml | 8 +- tests/test_energy_laws/materials.xml | 2 +- tests/test_entropy/materials.xml | 4 +- .../case-1/materials.xml | 2 +- .../case-2/materials.xml | 2 +- .../case-3/materials.xml | 2 +- .../case-4/materials.xml | 27 ++-- tests/test_filter_mesh_2d/materials.xml | 20 +-- tests/test_filter_mesh_3d/materials.xml | 20 +-- tests/test_fixed_source/materials.xml | 6 +- tests/test_infinite_cell/materials.xml | 6 +- tests/test_iso_in_lab/inputs_true.dat | 2 +- tests/test_lattice/materials.xml | 14 +- tests/test_lattice_hex/materials.xml | 38 ++--- tests/test_lattice_mixed/materials.xml | 38 ++--- tests/test_lattice_multiple/materials.xml | 20 +-- tests/test_mg_nuclide/inputs_true.dat | 2 +- .../inputs_true.dat | 2 +- .../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 | 2 +- .../inputs_true.dat | 2 +- .../inputs_true.dat | 2 +- tests/test_multipole/inputs_true.dat | 2 +- tests/test_multipole/test_multipole.py | 2 +- tests/test_natural_element/materials.xml | 2 +- tests/test_output/materials.xml | 4 +- .../materials.xml | 4 +- .../test_particle_restart_fixed/materials.xml | 4 +- tests/test_periodic/test_periodic.py | 4 +- tests/test_plot/materials.xml | 8 +- tests/test_ptables_off/materials.xml | 4 +- tests/test_quadric_surfaces/materials.xml | 6 +- tests/test_reflective_plane/materials.xml | 4 +- tests/test_rotation/materials.xml | 4 +- tests/test_salphabeta/materials.xml | 14 +- tests/test_score_current/materials.xml | 20 +-- tests/test_seed/materials.xml | 4 +- tests/test_source/test_source.py | 4 +- tests/test_source_file/materials.xml | 4 +- tests/test_sourcepoint_batch/materials.xml | 4 +- tests/test_sourcepoint_interval/materials.xml | 4 +- tests/test_sourcepoint_latest/materials.xml | 4 +- tests/test_sourcepoint_restart/materials.xml | 4 +- tests/test_statepoint_batch/materials.xml | 4 +- tests/test_statepoint_interval/materials.xml | 4 +- tests/test_statepoint_restart/materials.xml | 4 +- tests/test_statepoint_sourcesep/materials.xml | 4 +- tests/test_survival_biasing/materials.xml | 6 +- tests/test_tallies/inputs_true.dat | 2 +- tests/test_tally_aggregation/inputs_true.dat | 2 +- tests/test_tally_arithmetic/inputs_true.dat | 2 +- tests/test_tally_assumesep/materials.xml | 20 +-- tests/test_tally_nuclides/materials.xml | 2 +- tests/test_tally_slice_merge/inputs_true.dat | 2 +- tests/test_trace/materials.xml | 4 +- tests/test_track_output/materials.xml | 136 +++++++++--------- tests/test_translation/materials.xml | 4 +- .../test_trigger_batch_interval/materials.xml | 2 +- .../materials.xml | 2 +- tests/test_trigger_no_status/materials.xml | 2 +- tests/test_trigger_tallies/materials.xml | 2 +- tests/test_triso/test_triso.py | 10 +- tests/test_uniform_fs/materials.xml | 4 +- tests/test_union_energy_grids/materials.xml | 8 +- tests/test_universe/materials.xml | 4 +- tests/test_void/materials.xml | 4 +- tests/test_volume_calc/test_volume_calc.py | 4 +- 94 files changed, 385 insertions(+), 314 deletions(-) diff --git a/examples/python/boxes/build-xml.py b/examples/python/boxes/build-xml.py index 3eed4059c1..175d3f5113 100644 --- a/examples/python/boxes/build-xml.py +++ b/examples/python/boxes/build-xml.py @@ -34,11 +34,11 @@ moderator = openmc.Material(material_id=3, name='moderator') moderator.set_density('g/cc', 1.0) moderator.add_nuclide(h1, 2.) moderator.add_nuclide(o16, 1.) -moderator.add_s_alpha_beta('c_H_in_H2O', '71t') +moderator.add_s_alpha_beta('c_H_in_H2O') # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([fuel1, fuel2, moderator]) -materials_file.default_xs = '71c' +materials_file.default_temperature = '294K' materials_file.export_to_xml() diff --git a/examples/python/lattice/hexagonal/build-xml.py b/examples/python/lattice/hexagonal/build-xml.py index ba2cac3670..b131e9dea2 100644 --- a/examples/python/lattice/hexagonal/build-xml.py +++ b/examples/python/lattice/hexagonal/build-xml.py @@ -29,7 +29,7 @@ moderator = openmc.Material(material_id=2, name='moderator') moderator.set_density('g/cc', 1.0) moderator.add_nuclide(h1, 2.) moderator.add_nuclide(o16, 1.) -moderator.add_s_alpha_beta('c_H_in_H2O', '71t') +moderator.add_s_alpha_beta('c_H_in_H2O') iron = openmc.Material(material_id=3, name='iron') iron.set_density('g/cc', 7.9) @@ -37,7 +37,7 @@ iron.add_nuclide(fe56, 1.) # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([moderator, fuel, iron]) -materials_file.default_xs = '71c' +materials_file.default_temperature = '294K' materials_file.export_to_xml() diff --git a/examples/python/lattice/nested/build-xml.py b/examples/python/lattice/nested/build-xml.py index edf3ad7b19..59962c2c30 100644 --- a/examples/python/lattice/nested/build-xml.py +++ b/examples/python/lattice/nested/build-xml.py @@ -28,11 +28,11 @@ moderator = openmc.Material(material_id=2, name='moderator') moderator.set_density('g/cc', 1.0) moderator.add_nuclide(h1, 2.) moderator.add_nuclide(o16, 1.) -moderator.add_s_alpha_beta('c_H_in_H2O', '71t') +moderator.add_s_alpha_beta('c_H_in_H2O') # Instantiate a Materials collection and export to XML materials_file = openmc.Materials((moderator, fuel)) -materials_file.default_xs = '71c' +materials_file.default_temperature = '294K' materials_file.export_to_xml() diff --git a/examples/python/lattice/simple/build-xml.py b/examples/python/lattice/simple/build-xml.py index 5ec1b7ee9f..ad1c465d43 100644 --- a/examples/python/lattice/simple/build-xml.py +++ b/examples/python/lattice/simple/build-xml.py @@ -28,11 +28,11 @@ moderator = openmc.Material(material_id=2, name='moderator') moderator.set_density('g/cc', 1.0) moderator.add_nuclide(h1, 2.) moderator.add_nuclide(o16, 1.) -moderator.add_s_alpha_beta('c_H_in_H2O', '71t') +moderator.add_s_alpha_beta('c_H_in_H2O') # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([moderator, fuel]) -materials_file.default_xs = '71c' +materials_file.default_temperature = '294K' materials_file.export_to_xml() diff --git a/examples/python/pincell/build-xml.py b/examples/python/pincell/build-xml.py index 3bda050276..a11ddb7cdc 100644 --- a/examples/python/pincell/build-xml.py +++ b/examples/python/pincell/build-xml.py @@ -98,11 +98,11 @@ borated_water.add_nuclide(h1, 4.9457e-2) borated_water.add_nuclide(h2, 7.4196e-6) borated_water.add_nuclide(o16, 2.4672e-2) borated_water.add_nuclide(o17, 6.0099e-5) -borated_water.add_s_alpha_beta('c_H_in_H2O', '71t') +borated_water.add_s_alpha_beta('c_H_in_H2O') # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([uo2, helium, zircaloy, borated_water]) -materials_file.default_xs = '71c' +materials_file.default_temperature = '294K' materials_file.export_to_xml() diff --git a/examples/python/reflective/build-xml.py b/examples/python/reflective/build-xml.py index 0e064ab610..098fa8620e 100644 --- a/examples/python/reflective/build-xml.py +++ b/examples/python/reflective/build-xml.py @@ -25,7 +25,7 @@ fuel.add_nuclide(u235, 1.) # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([fuel]) -materials_file.default_xs = '71c' +materials_file.default_temperature = '294K' materials_file.export_to_xml() diff --git a/examples/xml/basic/materials.xml b/examples/xml/basic/materials.xml index 573b96cb2b..b7bc2e4e5a 100644 --- a/examples/xml/basic/materials.xml +++ b/examples/xml/basic/materials.xml @@ -1,12 +1,11 @@ - 71c + 294K - 294K @@ -14,7 +13,6 @@ - 294K diff --git a/examples/xml/boxes/materials.xml b/examples/xml/boxes/materials.xml index c74714a085..417fb83ba5 100644 --- a/examples/xml/boxes/materials.xml +++ b/examples/xml/boxes/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K @@ -17,7 +17,7 @@ - + diff --git a/examples/xml/lattice/nested/materials.xml b/examples/xml/lattice/nested/materials.xml index 7f8b06bb10..ddd932fcbc 100644 --- a/examples/xml/lattice/nested/materials.xml +++ b/examples/xml/lattice/nested/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K @@ -13,7 +13,7 @@ - + diff --git a/examples/xml/lattice/simple/materials.xml b/examples/xml/lattice/simple/materials.xml index 7f8b06bb10..ddd932fcbc 100644 --- a/examples/xml/lattice/simple/materials.xml +++ b/examples/xml/lattice/simple/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K @@ -13,7 +13,7 @@ - + diff --git a/examples/xml/pincell/materials.xml b/examples/xml/pincell/materials.xml index b6af486d14..020c0e676b 100644 --- a/examples/xml/pincell/materials.xml +++ b/examples/xml/pincell/materials.xml @@ -1,8 +1,8 @@ - - 71c + + 294K - - - + + + diff --git a/tests/test_cmfd_nofeed/materials.xml b/tests/test_cmfd_nofeed/materials.xml index 8f32169d92..f773d83d04 100644 --- a/tests/test_cmfd_nofeed/materials.xml +++ b/tests/test_cmfd_nofeed/materials.xml @@ -1,12 +1,14 @@ +294K + - - - + + + diff --git a/tests/test_complex_cell/materials.xml b/tests/test_complex_cell/materials.xml index a9e69b8bc6..857626d5a6 100644 --- a/tests/test_complex_cell/materials.xml +++ b/tests/test_complex_cell/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K diff --git a/tests/test_confidence_intervals/materials.xml b/tests/test_confidence_intervals/materials.xml index 23d7f969db..e1124a3038 100644 --- a/tests/test_confidence_intervals/materials.xml +++ b/tests/test_confidence_intervals/materials.xml @@ -2,8 +2,9 @@ + 294K - + diff --git a/tests/test_density/materials.xml b/tests/test_density/materials.xml index c474c5c65c..53a7b0fcbb 100644 --- a/tests/test_density/materials.xml +++ b/tests/test_density/materials.xml @@ -1,26 +1,28 @@ + 294K + - + - + - + - - - + + + diff --git a/tests/test_distribmat/inputs_true.dat b/tests/test_distribmat/inputs_true.dat index 1212a28e59..d21da2f894 100644 --- a/tests/test_distribmat/inputs_true.dat +++ b/tests/test_distribmat/inputs_true.dat @@ -1 +1 @@ -46df57157980545d90b482acfb01f525b84c0e623fa93a5d9c08a65723d677ef1c092360219a3c7fcf5110c6ba32f1eacbd5c5eaed40be4bfe154f302400c0a4 \ No newline at end of file +6ae54c198e7659503d297e40be746a5bd72b35909fceed4b3ef357876b781946c0ea5021342556ef21f4034fa9e42b2c6014077c0efd3459dc063e6da4b12b59 \ No newline at end of file diff --git a/tests/test_distribmat/test_distribmat.py b/tests/test_distribmat/test_distribmat.py index a8d013996e..29c5d638f3 100644 --- a/tests/test_distribmat/test_distribmat.py +++ b/tests/test_distribmat/test_distribmat.py @@ -29,7 +29,7 @@ class DistribmatTestHarness(PyAPITestHarness): light_fuel.add_nuclide('U235', 1.0) mats_file = openmc.Materials([moderator, dense_fuel, light_fuel]) - mats_file.default_xs = '71c' + mats_file.default_temperature = '294K' mats_file.export_to_xml() diff --git a/tests/test_eigenvalue_genperbatch/materials.xml b/tests/test_eigenvalue_genperbatch/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_eigenvalue_genperbatch/materials.xml +++ b/tests/test_eigenvalue_genperbatch/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_eigenvalue_no_inactive/materials.xml b/tests/test_eigenvalue_no_inactive/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_eigenvalue_no_inactive/materials.xml +++ b/tests/test_eigenvalue_no_inactive/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_energy_grid/materials.xml b/tests/test_energy_grid/materials.xml index ed9b38d901..2946a8d609 100644 --- a/tests/test_energy_grid/materials.xml +++ b/tests/test_energy_grid/materials.xml @@ -1,11 +1,13 @@ + 294K + - - - + + + diff --git a/tests/test_energy_laws/materials.xml b/tests/test_energy_laws/materials.xml index c70e071cff..e7acd32e2b 100644 --- a/tests/test_energy_laws/materials.xml +++ b/tests/test_energy_laws/materials.xml @@ -1,6 +1,6 @@ - 71c + 294K diff --git a/tests/test_entropy/materials.xml b/tests/test_entropy/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_entropy/materials.xml +++ b/tests/test_entropy/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_filter_distribcell/case-1/materials.xml b/tests/test_filter_distribcell/case-1/materials.xml index 891cc9fd0e..afd4b05b76 100644 --- a/tests/test_filter_distribcell/case-1/materials.xml +++ b/tests/test_filter_distribcell/case-1/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K diff --git a/tests/test_filter_distribcell/case-2/materials.xml b/tests/test_filter_distribcell/case-2/materials.xml index 891cc9fd0e..afd4b05b76 100644 --- a/tests/test_filter_distribcell/case-2/materials.xml +++ b/tests/test_filter_distribcell/case-2/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K diff --git a/tests/test_filter_distribcell/case-3/materials.xml b/tests/test_filter_distribcell/case-3/materials.xml index 6a5916a837..f03693e524 100644 --- a/tests/test_filter_distribcell/case-3/materials.xml +++ b/tests/test_filter_distribcell/case-3/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K diff --git a/tests/test_filter_distribcell/case-4/materials.xml b/tests/test_filter_distribcell/case-4/materials.xml index ab9f8688ed..15cf0c54b9 100644 --- a/tests/test_filter_distribcell/case-4/materials.xml +++ b/tests/test_filter_distribcell/case-4/materials.xml @@ -1,18 +1,21 @@ - 71c - - - + 294K + + + + - - - - - + + + + + + - - - + + + + diff --git a/tests/test_filter_mesh_2d/materials.xml b/tests/test_filter_mesh_2d/materials.xml index f5a9e61bea..bead58f8b2 100644 --- a/tests/test_filter_mesh_2d/materials.xml +++ b/tests/test_filter_mesh_2d/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K @@ -59,7 +59,7 @@ - + @@ -69,7 +69,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -155,7 +155,7 @@ - + @@ -182,7 +182,7 @@ - + @@ -209,7 +209,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + diff --git a/tests/test_filter_mesh_3d/materials.xml b/tests/test_filter_mesh_3d/materials.xml index f5a9e61bea..bead58f8b2 100644 --- a/tests/test_filter_mesh_3d/materials.xml +++ b/tests/test_filter_mesh_3d/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K @@ -59,7 +59,7 @@ - + @@ -69,7 +69,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -155,7 +155,7 @@ - + @@ -182,7 +182,7 @@ - + @@ -209,7 +209,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + diff --git a/tests/test_fixed_source/materials.xml b/tests/test_fixed_source/materials.xml index 6c52b25015..cfd0efd6c3 100644 --- a/tests/test_fixed_source/materials.xml +++ b/tests/test_fixed_source/materials.xml @@ -1,10 +1,12 @@ + 294K + - - + + diff --git a/tests/test_infinite_cell/materials.xml b/tests/test_infinite_cell/materials.xml index 1c2d649420..8bd6c820b3 100644 --- a/tests/test_infinite_cell/materials.xml +++ b/tests/test_infinite_cell/materials.xml @@ -1,14 +1,16 @@ + 294K + - + - + diff --git a/tests/test_iso_in_lab/inputs_true.dat b/tests/test_iso_in_lab/inputs_true.dat index 34f522872e..0298e581c6 100644 --- a/tests/test_iso_in_lab/inputs_true.dat +++ b/tests/test_iso_in_lab/inputs_true.dat @@ -1 +1 @@ -c05fdb7815ccc1dcd2f260429b9139ad96ad4a7d1643e2bb938e3cd61268451363538ef4e41c5eaf73a64dbace43b2bd4489d5ff012a33104c2c1d6fa61146eb \ No newline at end of file +a84e601e6ba0891aaeaa37b1aa55076fecee598bb46be2b99dcdedab597b5d7e1731e2a0dc265df2ad6f475e33dae91a3cc27bc23d0c37be25a097ea83e74fd6 \ No newline at end of file diff --git a/tests/test_lattice/materials.xml b/tests/test_lattice/materials.xml index 67240c4c9d..91772da798 100644 --- a/tests/test_lattice/materials.xml +++ b/tests/test_lattice/materials.xml @@ -10,7 +10,7 @@ =============================================================== --> - 71c + 294K @@ -27,7 +27,7 @@ - + @@ -37,7 +37,7 @@ - + @@ -75,7 +75,7 @@ - + @@ -88,9 +88,9 @@ - + - + @@ -128,7 +128,7 @@ - + diff --git a/tests/test_lattice_hex/materials.xml b/tests/test_lattice_hex/materials.xml index 92d10fa815..90b79b7b49 100644 --- a/tests/test_lattice_hex/materials.xml +++ b/tests/test_lattice_hex/materials.xml @@ -1,42 +1,44 @@ + 294K + - - - + + + - - - + + + - - - - - + + + + + - - - - - - - + + + + + + + diff --git a/tests/test_lattice_mixed/materials.xml b/tests/test_lattice_mixed/materials.xml index 92d10fa815..90b79b7b49 100644 --- a/tests/test_lattice_mixed/materials.xml +++ b/tests/test_lattice_mixed/materials.xml @@ -1,42 +1,44 @@ + 294K + - - - + + + - - - + + + - - - - - + + + + + - - - - - - - + + + + + + + diff --git a/tests/test_lattice_multiple/materials.xml b/tests/test_lattice_multiple/materials.xml index f5a9e61bea..bead58f8b2 100644 --- a/tests/test_lattice_multiple/materials.xml +++ b/tests/test_lattice_multiple/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K @@ -59,7 +59,7 @@ - + @@ -69,7 +69,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -155,7 +155,7 @@ - + @@ -182,7 +182,7 @@ - + @@ -209,7 +209,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + diff --git a/tests/test_mg_nuclide/inputs_true.dat b/tests/test_mg_nuclide/inputs_true.dat index e0af3352b2..18811f2854 100644 --- a/tests/test_mg_nuclide/inputs_true.dat +++ b/tests/test_mg_nuclide/inputs_true.dat @@ -1 +1 @@ -0efba3dd7882fdd38756d0a8f01ff00d7a1abdaab6430b3f090f3339e552448453bbb733852b6bd6ff09608d923c282f168320f942fc2eb3a45610873c588734 \ No newline at end of file +be296da93031694b2915e1a10e3e6fd663d612cdd29a84745e3ccb0065c088b4bcda45f6919962f6ee784efe52ebe178bf7d3ce019859637ae57c2da1e240a04 \ 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 332c2df5fd..e48c50d0a0 100644 --- a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat +++ b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat @@ -1 +1 @@ -fb9c9180f692198548ca14543b29a8b623b382a19932999b2140ca4dd440f2102ba2fdbcb500ede3b8829aa85e1b4498151d280f1422d2d6b1bb5789aff34d71 \ No newline at end of file +a33f770307b365103c5d71aa3e70deebd78d3a2fa90e88632641c1a40d64d19de0ce3c95c858aedf3beccc5de64cac434e1cd55b2b162ed315c78450c53a24a4 \ No newline at end of file diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat index e58015868a..c261a0edea 100644 --- a/tests/test_mgxs_library_condense/inputs_true.dat +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -1 +1 @@ -08c5f1c783dd88c5fed51c054718ca09fc4e99aa4560a6f928b3902991948f3a878d055ac46c07548904285c2c5f22dc2a3d8c1bb82b8e73d76dd790820117df \ No newline at end of file +df2e5370925785e061e094561e9d2048c3104aaecf533ee9590a187d4597e53b489fb6e8cc54ed878f7d313bcf00586edceae4ff712c837faaa5ddab0ad378b3 \ No newline at end of file diff --git a/tests/test_mgxs_library_distribcell/inputs_true.dat b/tests/test_mgxs_library_distribcell/inputs_true.dat index 924c53838f..2ca1810e97 100644 --- a/tests/test_mgxs_library_distribcell/inputs_true.dat +++ b/tests/test_mgxs_library_distribcell/inputs_true.dat @@ -1 +1 @@ -9ce3d6987d67e92b0924916bb54288429d2bd6dfd12a69f86c5dbefb407f7eb72adb0e44d558c09e9a39610ffeb651aee4aedc629cf3a28a181d62ca4cfbcd5a \ No newline at end of file +687358da3e7d658b6187e1d76280437d5b1a97a7ca3920483792e74de6fa9556fa86f4d55150c03d8628b3aa424afa187d8745f087f252ad0fca44ccc2a85f4c \ No newline at end of file diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat index e58015868a..c261a0edea 100644 --- a/tests/test_mgxs_library_hdf5/inputs_true.dat +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -1 +1 @@ -08c5f1c783dd88c5fed51c054718ca09fc4e99aa4560a6f928b3902991948f3a878d055ac46c07548904285c2c5f22dc2a3d8c1bb82b8e73d76dd790820117df \ No newline at end of file +df2e5370925785e061e094561e9d2048c3104aaecf533ee9590a187d4597e53b489fb6e8cc54ed878f7d313bcf00586edceae4ff712c837faaa5ddab0ad378b3 \ No newline at end of file diff --git a/tests/test_mgxs_library_mesh/inputs_true.dat b/tests/test_mgxs_library_mesh/inputs_true.dat index f62e0aa05e..4cebb274ec 100644 --- a/tests/test_mgxs_library_mesh/inputs_true.dat +++ b/tests/test_mgxs_library_mesh/inputs_true.dat @@ -1 +1 @@ -5f167bdd4d6ae5873d48483e85aceaec8a934239ed5a50ef6f6500ce204f5851ae330621a5007f3b3d6bdab49f2cd627d011c1f6e6983fec958a6984eb9cb7ca \ No newline at end of file +7f3aec9cedab76262de3706427ccba88b4c81fd4c9a033ff5467671ca21abe13b3981100d688502818bdd0534db22438970b02d652ca9d105557276de2d2a550 \ No newline at end of file diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat index e58015868a..c261a0edea 100644 --- a/tests/test_mgxs_library_no_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -1 +1 @@ -08c5f1c783dd88c5fed51c054718ca09fc4e99aa4560a6f928b3902991948f3a878d055ac46c07548904285c2c5f22dc2a3d8c1bb82b8e73d76dd790820117df \ No newline at end of file +df2e5370925785e061e094561e9d2048c3104aaecf533ee9590a187d4597e53b489fb6e8cc54ed878f7d313bcf00586edceae4ff712c837faaa5ddab0ad378b3 \ No newline at end of file diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat index a15bbee4c8..f3c25d4d50 100644 --- a/tests/test_mgxs_library_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_nuclides/inputs_true.dat @@ -1 +1 @@ -e4a5f03ab6167e96462c4ef537533fe33b98d7878ae00824c5619356bda8d548b3c71af01ba8c88d5a9b46dd1471d331e6f678a164af922200f2ee3642be6340 \ No newline at end of file +332fd9ff1ca576410ffc6c0f3f03c00618fc863509dc3725f2f3a82134e2400de9c1edf2adc68cb8bce528789094f8eb468371e65cbc13efe76d76467ef291d9 \ No newline at end of file diff --git a/tests/test_multipole/inputs_true.dat b/tests/test_multipole/inputs_true.dat index 801536d07e..f99b29e8ed 100644 --- a/tests/test_multipole/inputs_true.dat +++ b/tests/test_multipole/inputs_true.dat @@ -1 +1 @@ -c727431ebef7a5987dade28f4cd940c566142f97b5ce01fbf9343d680caf9056623f0fac550db64f8f1043fa2cd8230155cfcbbcaffd1ae92cede723974596d7 \ No newline at end of file +54044104d26e9aa90abcdb62290b598bd6ef0d46c3a9e509726ae7b20a7155471edd3e942b71f07b5c855ac1e451d58913a2f43fa971a8c4d56e569ae3b401ed \ No newline at end of file diff --git a/tests/test_multipole/test_multipole.py b/tests/test_multipole/test_multipole.py index bd6822bdf5..812f5b6d0f 100644 --- a/tests/test_multipole/test_multipole.py +++ b/tests/test_multipole/test_multipole.py @@ -24,7 +24,7 @@ class MultipoleTestHarness(PyAPITestHarness): dense_fuel.add_nuclide('U235', 1.0) mats_file = openmc.Materials([moderator, dense_fuel]) - mats_file.default_xs = '71c' + mats_file.default_temperature = '294K' mats_file.export_to_xml() diff --git a/tests/test_natural_element/materials.xml b/tests/test_natural_element/materials.xml index 60d60b81ff..543b5351d8 100644 --- a/tests/test_natural_element/materials.xml +++ b/tests/test_natural_element/materials.xml @@ -3,7 +3,7 @@ - 71c + 294K diff --git a/tests/test_output/materials.xml b/tests/test_output/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_output/materials.xml +++ b/tests/test_output/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_particle_restart_eigval/materials.xml b/tests/test_particle_restart_eigval/materials.xml index 5ff4b736f5..301efd2bd1 100644 --- a/tests/test_particle_restart_eigval/materials.xml +++ b/tests/test_particle_restart_eigval/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_particle_restart_fixed/materials.xml b/tests/test_particle_restart_fixed/materials.xml index f132f97630..95afc39990 100644 --- a/tests/test_particle_restart_fixed/materials.xml +++ b/tests/test_particle_restart_fixed/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_periodic/test_periodic.py b/tests/test_periodic/test_periodic.py index 0260711043..3883654c13 100644 --- a/tests/test_periodic/test_periodic.py +++ b/tests/test_periodic/test_periodic.py @@ -13,7 +13,7 @@ class PeriodicTest(PyAPITestHarness): water = openmc.Material(1) water.add_nuclide('H1', 2.0) water.add_nuclide('O16', 1.0) - water.add_s_alpha_beta('c_H_in_H2O', '71t') + water.add_s_alpha_beta('c_H_in_H2O') water.set_density('g/cc', 1.0) fuel = openmc.Material(2) @@ -21,7 +21,7 @@ class PeriodicTest(PyAPITestHarness): fuel.set_density('g/cc', 4.5) materials = openmc.Materials((water, fuel)) - materials.default_xs = '71c' + materials.default_temperature = '294K' materials.export_to_xml() # Define geometry diff --git a/tests/test_plot/materials.xml b/tests/test_plot/materials.xml index 826f670a48..0d5ee77cef 100644 --- a/tests/test_plot/materials.xml +++ b/tests/test_plot/materials.xml @@ -1,19 +1,21 @@ + 294K + - + - + - + diff --git a/tests/test_ptables_off/materials.xml b/tests/test_ptables_off/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_ptables_off/materials.xml +++ b/tests/test_ptables_off/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_quadric_surfaces/materials.xml b/tests/test_quadric_surfaces/materials.xml index 606253bec0..baf523b34c 100644 --- a/tests/test_quadric_surfaces/materials.xml +++ b/tests/test_quadric_surfaces/materials.xml @@ -1,10 +1,12 @@ + 294K + - - + + diff --git a/tests/test_reflective_plane/materials.xml b/tests/test_reflective_plane/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_reflective_plane/materials.xml +++ b/tests/test_reflective_plane/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_rotation/materials.xml b/tests/test_rotation/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_rotation/materials.xml +++ b/tests/test_rotation/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_salphabeta/materials.xml b/tests/test_salphabeta/materials.xml index 2bc401e49c..0d250e7b47 100644 --- a/tests/test_salphabeta/materials.xml +++ b/tests/test_salphabeta/materials.xml @@ -1,20 +1,20 @@ - 71c + 294K - + - + @@ -22,8 +22,8 @@ - - + + @@ -36,8 +36,8 @@ - - + + diff --git a/tests/test_score_current/materials.xml b/tests/test_score_current/materials.xml index f5a9e61bea..bead58f8b2 100644 --- a/tests/test_score_current/materials.xml +++ b/tests/test_score_current/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K @@ -59,7 +59,7 @@ - + @@ -69,7 +69,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -155,7 +155,7 @@ - + @@ -182,7 +182,7 @@ - + @@ -209,7 +209,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + diff --git a/tests/test_seed/materials.xml b/tests/test_seed/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_seed/materials.xml +++ b/tests/test_seed/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_source/test_source.py b/tests/test_source/test_source.py index 09a13efaae..f83e39974c 100644 --- a/tests/test_source/test_source.py +++ b/tests/test_source/test_source.py @@ -13,9 +13,9 @@ import openmc class SourceTestHarness(PyAPITestHarness): def _build_inputs(self): - mat1 = openmc.Material(material_id=1) + mat1 = openmc.Material(material_id=1, temperature='294K') mat1.set_density('g/cm3', 4.5) - mat1.add_nuclide(openmc.Nuclide('U235', '71c'), 1.0) + mat1.add_nuclide(openmc.Nuclide('U235'), 1.0) materials = openmc.Materials([mat1]) materials.export_to_xml() diff --git a/tests/test_source_file/materials.xml b/tests/test_source_file/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_source_file/materials.xml +++ b/tests/test_source_file/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_sourcepoint_batch/materials.xml b/tests/test_sourcepoint_batch/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_sourcepoint_batch/materials.xml +++ b/tests/test_sourcepoint_batch/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_sourcepoint_interval/materials.xml b/tests/test_sourcepoint_interval/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_sourcepoint_interval/materials.xml +++ b/tests/test_sourcepoint_interval/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_sourcepoint_latest/materials.xml b/tests/test_sourcepoint_latest/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_sourcepoint_latest/materials.xml +++ b/tests/test_sourcepoint_latest/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_sourcepoint_restart/materials.xml b/tests/test_sourcepoint_restart/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_sourcepoint_restart/materials.xml +++ b/tests/test_sourcepoint_restart/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_statepoint_batch/materials.xml b/tests/test_statepoint_batch/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_statepoint_batch/materials.xml +++ b/tests/test_statepoint_batch/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_statepoint_interval/materials.xml b/tests/test_statepoint_interval/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_statepoint_interval/materials.xml +++ b/tests/test_statepoint_interval/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_statepoint_restart/materials.xml b/tests/test_statepoint_restart/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_statepoint_restart/materials.xml +++ b/tests/test_statepoint_restart/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_statepoint_sourcesep/materials.xml b/tests/test_statepoint_sourcesep/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_statepoint_sourcesep/materials.xml +++ b/tests/test_statepoint_sourcesep/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_survival_biasing/materials.xml b/tests/test_survival_biasing/materials.xml index facad016bf..03b2162b3b 100644 --- a/tests/test_survival_biasing/materials.xml +++ b/tests/test_survival_biasing/materials.xml @@ -1,10 +1,12 @@ + 294K + - - + + diff --git a/tests/test_tallies/inputs_true.dat b/tests/test_tallies/inputs_true.dat index f5390eea12..196925c387 100644 --- a/tests/test_tallies/inputs_true.dat +++ b/tests/test_tallies/inputs_true.dat @@ -1 +1 @@ -1bef757d276362fdcd9405096b4cdcbd894f9215ed406493486a45193729be446c9a12242c887f89b6e209ec5beaaacb04dee2fd61e72b4f5c6a8712b776ed6e \ No newline at end of file +11adb9111f20950e28b1c1929ee4ca0c9a6b2524de89bef44a495b2fe8cda3a2acac9e87d64ddb5eba591c8d22289956cb1f024d31e05da3c9a4162b8c589d85 \ 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 9c79787555..fa61e20b78 100644 --- a/tests/test_tally_aggregation/inputs_true.dat +++ b/tests/test_tally_aggregation/inputs_true.dat @@ -1 +1 @@ -67daf0d74cddb40ecbbc7e3793a3302866adcb1617fe2dc454dd161c06105e65027523f5e5954d80b961ba6c6abf14114b8be5c4d5b7682eaddffc1288d3e7c8 \ No newline at end of file +bc17ba12ee5de7e6b0226e589be9044af725ff4e27683b765a9c75e5629176b5ca51d1e0306028ae90185d64644babf9ac22e4753f092b4b836790f4e162f9d0 \ 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 b56c17b6b6..56798828c6 100644 --- a/tests/test_tally_arithmetic/inputs_true.dat +++ b/tests/test_tally_arithmetic/inputs_true.dat @@ -1 +1 @@ -c8772a174e2162030f0315a318991085f1a5c0b054883a5f071d520e34f9ecf7d309f25700067bea8685e2b6324a19a003bd6f6ab38161ee87c95257b5a6ae69 \ No newline at end of file +6b59ea3a0dc0d25c590f724b8c051a54e8d7836467ba31b7da72b0574398e6c73160a180524952ea983b0e7a7de776d2d7102d280d5a4e7e3624bd76f6f42a09 \ No newline at end of file diff --git a/tests/test_tally_assumesep/materials.xml b/tests/test_tally_assumesep/materials.xml index f5a9e61bea..bead58f8b2 100644 --- a/tests/test_tally_assumesep/materials.xml +++ b/tests/test_tally_assumesep/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K @@ -59,7 +59,7 @@ - + @@ -69,7 +69,7 @@ - + @@ -128,7 +128,7 @@ - + @@ -155,7 +155,7 @@ - + @@ -182,7 +182,7 @@ - + @@ -209,7 +209,7 @@ - + @@ -236,7 +236,7 @@ - + @@ -251,7 +251,7 @@ - + @@ -266,7 +266,7 @@ - + diff --git a/tests/test_tally_nuclides/materials.xml b/tests/test_tally_nuclides/materials.xml index e9667b41f4..5ac4f69424 100644 --- a/tests/test_tally_nuclides/materials.xml +++ b/tests/test_tally_nuclides/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K diff --git a/tests/test_tally_slice_merge/inputs_true.dat b/tests/test_tally_slice_merge/inputs_true.dat index 16d11b6d2b..a40c0a01df 100644 --- a/tests/test_tally_slice_merge/inputs_true.dat +++ b/tests/test_tally_slice_merge/inputs_true.dat @@ -1 +1 @@ -a17354ce54bcb5ce93e861ae95fd932c45fe60c733d999aa180d5dee636f43130fac5b003c615e23c65d44fe55f376ef4c86596b78603ab217d7e37fd694074d \ No newline at end of file +6d9ebab08ccce003e6128c6346ffd80e69a957fab15e9a0e211771efa68b24f276e62781f8471c72072f9017380d7e821c38002c03689993efed45db9590c039 \ No newline at end of file diff --git a/tests/test_trace/materials.xml b/tests/test_trace/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_trace/materials.xml +++ b/tests/test_trace/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_track_output/materials.xml b/tests/test_track_output/materials.xml index 017797aa1e..f31f61fc3c 100644 --- a/tests/test_track_output/materials.xml +++ b/tests/test_track_output/materials.xml @@ -1,95 +1,97 @@ + 294K + - - - - - + + + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - + diff --git a/tests/test_translation/materials.xml b/tests/test_translation/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_translation/materials.xml +++ b/tests/test_translation/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_trigger_batch_interval/materials.xml b/tests/test_trigger_batch_interval/materials.xml index e9667b41f4..5ac4f69424 100644 --- a/tests/test_trigger_batch_interval/materials.xml +++ b/tests/test_trigger_batch_interval/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K diff --git a/tests/test_trigger_no_batch_interval/materials.xml b/tests/test_trigger_no_batch_interval/materials.xml index e9667b41f4..5ac4f69424 100644 --- a/tests/test_trigger_no_batch_interval/materials.xml +++ b/tests/test_trigger_no_batch_interval/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K diff --git a/tests/test_trigger_no_status/materials.xml b/tests/test_trigger_no_status/materials.xml index e9667b41f4..5ac4f69424 100644 --- a/tests/test_trigger_no_status/materials.xml +++ b/tests/test_trigger_no_status/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K diff --git a/tests/test_trigger_tallies/materials.xml b/tests/test_trigger_tallies/materials.xml index e9667b41f4..5ac4f69424 100644 --- a/tests/test_trigger_tallies/materials.xml +++ b/tests/test_trigger_tallies/materials.xml @@ -1,7 +1,7 @@ - 71c + 294K diff --git a/tests/test_triso/test_triso.py b/tests/test_triso/test_triso.py index 9a8fb0c3be..04bd1322a9 100644 --- a/tests/test_triso/test_triso.py +++ b/tests/test_triso/test_triso.py @@ -27,12 +27,12 @@ class TRISOTestHarness(PyAPITestHarness): porous_carbon = openmc.Material() porous_carbon.set_density('g/cm3', 1.0) porous_carbon.add_nuclide('C0', 1.0) - porous_carbon.add_s_alpha_beta('c_Graphite', '71t') + porous_carbon.add_s_alpha_beta('c_Graphite') ipyc = openmc.Material() ipyc.set_density('g/cm3', 1.90) ipyc.add_nuclide('C0', 1.0) - ipyc.add_s_alpha_beta('c_Graphite', '71t') + ipyc.add_s_alpha_beta('c_Graphite') sic = openmc.Material() sic.set_density('g/cm3', 3.20) @@ -42,12 +42,12 @@ class TRISOTestHarness(PyAPITestHarness): opyc = openmc.Material() opyc.set_density('g/cm3', 1.87) opyc.add_nuclide('C0', 1.0) - opyc.add_s_alpha_beta('c_Graphite', '71t') + opyc.add_s_alpha_beta('c_Graphite') graphite = openmc.Material() graphite.set_density('g/cm3', 1.1995) graphite.add_nuclide('C0', 1.0) - graphite.add_s_alpha_beta('c_Graphite', '71t') + graphite.add_s_alpha_beta('c_Graphite') # Create TRISO particles spheres = [openmc.Sphere(R=r*1e-4) @@ -108,7 +108,7 @@ class TRISOTestHarness(PyAPITestHarness): settings.export_to_xml() mats = openmc.Materials([fuel, porous_carbon, ipyc, sic, opyc, graphite]) - mats.default_xs = '71c' + mats.default_temperature = '294K' mats.export_to_xml() diff --git a/tests/test_uniform_fs/materials.xml b/tests/test_uniform_fs/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_uniform_fs/materials.xml +++ b/tests/test_uniform_fs/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_union_energy_grids/materials.xml b/tests/test_union_energy_grids/materials.xml index ed9b38d901..2946a8d609 100644 --- a/tests/test_union_energy_grids/materials.xml +++ b/tests/test_union_energy_grids/materials.xml @@ -1,11 +1,13 @@ + 294K + - - - + + + diff --git a/tests/test_universe/materials.xml b/tests/test_universe/materials.xml index 23d7f969db..37cfcdc6ed 100644 --- a/tests/test_universe/materials.xml +++ b/tests/test_universe/materials.xml @@ -1,9 +1,11 @@ + 294K + - + diff --git a/tests/test_void/materials.xml b/tests/test_void/materials.xml index 4768bad0bc..2a578e0ed4 100644 --- a/tests/test_void/materials.xml +++ b/tests/test_void/materials.xml @@ -3,7 +3,7 @@ - 71c + 294K @@ -41,7 +41,7 @@ - + diff --git a/tests/test_volume_calc/test_volume_calc.py b/tests/test_volume_calc/test_volume_calc.py index e2c3eba797..656f4654a0 100644 --- a/tests/test_volume_calc/test_volume_calc.py +++ b/tests/test_volume_calc/test_volume_calc.py @@ -15,7 +15,7 @@ class VolumeTest(PyAPITestHarness): water.add_nuclide('H1', 2.0) water.add_nuclide('O16', 1.0) water.add_nuclide('B10', 0.0001) - water.add_s_alpha_beta('c_H_in_H2O', '71t') + water.add_s_alpha_beta('c_H_in_H2O') water.set_density('g/cc', 1.0) fuel = openmc.Material(2) @@ -24,7 +24,7 @@ class VolumeTest(PyAPITestHarness): fuel.set_density('g/cc', 4.5) materials = openmc.Materials((water, fuel)) - materials.default_xs = '71c' + materials.default_temperature = '294K' materials.export_to_xml() cyl = openmc.ZCylinder(1, R=1.0, boundary_type='vacuum') From 1d551037ce1204284b90be9bcb304053b329b8e4 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Mon, 22 Aug 2016 21:25:47 -0400 Subject: [PATCH 110/168] updating tests and setting it so the closest temperature is used --- openmc/material.py | 5 + openmc/settings.py | 4 +- src/hdf5_interface.F90 | 78 +++ src/input_xml.F90 | 607 +++++++++--------- src/mgxs_data.F90 | 2 +- src/nuclide_header.F90 | 40 +- src/sab_header.F90 | 54 +- tests/test_distribmat/inputs_true.dat | 2 +- tests/test_periodic/inputs_true.dat | 2 +- .../test_resonance_scattering.py | 8 +- tests/test_source/inputs_true.dat | 2 +- tests/test_triso/inputs_true.dat | 2 +- tests/test_volume_calc/inputs_true.dat | 2 +- tests/test_volume_calc/results_true.dat | 42 +- 14 files changed, 501 insertions(+), 349 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index d30487e2f6..d922c685f9 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -129,6 +129,7 @@ class Material(object): string = 'Material\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) + string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._temperature) string += '{0: <16}{1}{2}'.format('\tDensity', '=\t', self._density) string += ' [{0}]\n'.format(self._density_units) @@ -632,6 +633,10 @@ class Material(object): if len(self._name) > 0: element.set("name", str(self._name)) + # Create temperature XML subelement + subelement = ET.SubElement(element, "temperature") + subelement.text = self.temperature + # Create density XML subelement subelement = ET.SubElement(element, "density") if self._density_units is not 'sum': diff --git a/openmc/settings.py b/openmc/settings.py index eb56381b07..79f3606441 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -1265,9 +1265,9 @@ class ResonanceScattering(object): subelement = ET.SubElement(scatterer, 'method') subelement.text = self.method subelement = ET.SubElement(scatterer, 'xs_label') - subelement.text = '{0.name}.{0.xs}'.format(self.nuclide) + subelement.text = self.nuclide.name subelement = ET.SubElement(scatterer, 'xs_label_0K') - subelement.text = '{0.name}.{0.xs}'.format(self.nuclide_0K) + subelement.text = self.nuclide_0K.name if self.E_min is not None: subelement = ET.SubElement(scatterer, 'E_min') subelement.text = str(self.E_min) diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 6d1c87d7f5..36195d1190 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -95,6 +95,8 @@ module hdf5_interface public :: close_dataset public :: get_shape public :: write_attribute_string + public :: get_groups + public :: get_datasets contains @@ -204,6 +206,82 @@ contains call h5fclose_f(file_id, hdf5_err) end subroutine file_close +!=============================================================================== +! GET_GROUPS Gets a list of all the groups in a given location. +!=============================================================================== + + subroutine get_groups(object_id, names) + integer(HID_T), intent(in) :: object_id + character(len=255), allocatable, intent(out) :: names(:) + + integer :: n_members, i, group_count, type + integer :: hdf5_err + character(len=255) :: name + + + ! Get number of members in this location + call h5gn_members_f(object_id, './', n_members, hdf5_err) + + ! Get the number of groups + group_count = 0 + do i = 0, n_members - 1 + call h5gget_obj_info_idx_f(object_id, "./", i, name, type, hdf5_err) + if (type == H5G_GROUP_F) then + group_count = group_count + 1 + end if + end do + + ! Now we can allocate the storage for the ids + allocate(names(group_count)) + group_count = 0 + do i = 0, n_members - 1 + call h5gget_obj_info_idx_f(object_id, "./", i, name, type, hdf5_err) + if (type == H5G_GROUP_F) then + group_count = group_count + 1 + names(group_count) = trim(name) + end if + end do + + end subroutine get_groups + +!=============================================================================== +! GET_DATASETS Gets a list of all the datasets in a given location. +!=============================================================================== + + subroutine get_datasets(object_id, names) + integer(HID_T), intent(in) :: object_id + character(len=255), allocatable, intent(out) :: names(:) + + integer :: n_members, i, dset_count, type + integer :: hdf5_err + character(len=255) :: name + + + ! Get number of members in this location + call h5gn_members_f(object_id, './', n_members, hdf5_err) + + ! Get the number of datasets + dset_count = 0 + do i = 0, n_members - 1 + call h5gget_obj_info_idx_f(object_id, "./", i, name, type, hdf5_err) + if (type == H5G_DATASET_F ) then + dset_count = dset_count + 1 + end if + end do + + ! Now we can allocate the storage for the ids + allocate(names(dset_count)) + dset_count = 0 + do i = 0, n_members - 1 + call h5gget_obj_info_idx_f(object_id, "./", i, name, type, hdf5_err) + if (type == H5G_DATASET_F ) then + dset_count = dset_count + 1 + names(dset_count) = trim(name) + end if + end do + + end subroutine get_datasets + !=============================================================================== ! OPEN_GROUP opens an existing HDF5 group !=============================================================================== diff --git a/src/input_xml.F90 b/src/input_xml.F90 index ef927c35e9..5fc38c7419 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2428,7 +2428,7 @@ contains ! Expand element into naturally-occurring isotopes if (check_for_node(node_ele, "ao")) then call get_node_value(node_ele, "ao", temp_dble) - call expand_natural_element(name, temp_str, temp_dble, names, & + call expand_natural_element(name, temp_dble, names, & densities) else call fatal_error("The ability to expand a natural element based on & @@ -4733,9 +4733,8 @@ contains ! evaluations of particular isotopes don't exist. !=============================================================================== - subroutine expand_natural_element(name, xs, density, names, densities) + subroutine expand_natural_element(name, density, names, densities) character(*), intent(in) :: name - character(*), intent(in) :: xs real(8), intent(in) :: density type(VectorChar), intent(inout) :: names type(VectorReal), intent(inout) :: densities @@ -4746,669 +4745,669 @@ contains select case (to_lower(element_name)) case ('h') - call names % push_back('H1.' // xs) + call names % push_back('H1') call densities % push_back(density * 0.999885_8) - call names % push_back('H2.' // xs) + call names % push_back('H2') call densities % push_back(density * 0.000115_8) case ('he') - call names % push_back('He3.' // xs) + call names % push_back('He3') call densities % push_back(density * 0.00000134_8) - call names % push_back('He4.' // xs) + call names % push_back('He4') call densities % push_back(density * 0.99999866_8) case ('li') - call names % push_back('Li6.' // xs) + call names % push_back('Li6') call densities % push_back(density * 0.0759_8) - call names % push_back('Li7.' // xs) + call names % push_back('Li7') call densities % push_back(density * 0.9241_8) case ('be') - call names % push_back('Be9.' // xs) + call names % push_back('Be9') call densities % push_back(density) case ('b') - call names % push_back('B10.' // xs) + call names % push_back('B10') call densities % push_back(density * 0.199_8) - call names % push_back('B11.' // xs) + call names % push_back('B11') call densities % push_back(density * 0.801_8) case ('c') ! No evaluations split up Carbon into isotopes yet - call names % push_back('C0.' // xs) + call names % push_back('C0') call densities % push_back(density) case ('n') - call names % push_back('N14.' // xs) + call names % push_back('N14') call densities % push_back(density * 0.99636_8) - call names % push_back('N15.' // xs) + call names % push_back('N15') call densities % push_back(density * 0.00364_8) case ('o') if (default_expand == JEFF_32) then - call names % push_back('O16.' // xs) + call names % push_back('O16') call densities % push_back(density * 0.99757_8) - call names % push_back('O17.' // xs) + call names % push_back('O17') call densities % push_back(density * 0.00038_8) - call names % push_back('O18.' // xs) + call names % push_back('O18') call densities % push_back(density * 0.00205_8) elseif (default_expand >= JENDL_32 .and. default_expand <= JENDL_40) then - call names % push_back('O16.' // xs) + call names % push_back('O16') call densities % push_back(density) else - call names % push_back('O16.' // xs) + call names % push_back('O16') call densities % push_back(density * 0.99962_8) - call names % push_back('O17.' // xs) + call names % push_back('O17') call densities % push_back(density * 0.00038_8) end if case ('f') - call names % push_back('F19.' // xs) + call names % push_back('F19') call densities % push_back(density) case ('ne') - call names % push_back('Ne20.' // xs) + call names % push_back('Ne20') call densities % push_back(density * 0.9048_8) - call names % push_back('Ne21.' // xs) + call names % push_back('Ne21') call densities % push_back(density * 0.0027_8) - call names % push_back('Ne22.' // xs) + call names % push_back('Ne22') call densities % push_back(density * 0.0925_8) case ('na') - call names % push_back('Na23.' // xs) + call names % push_back('Na23') call densities % push_back(density) case ('mg') - call names % push_back('Mg24.' // xs) + call names % push_back('Mg24') call densities % push_back(density * 0.7899_8) - call names % push_back('Mg25.' // xs) + call names % push_back('Mg25') call densities % push_back(density * 0.1000_8) - call names % push_back('Mg26.' // xs) + call names % push_back('Mg26') call densities % push_back(density * 0.1101_8) case ('al') - call names % push_back('Al27.' // xs) + call names % push_back('Al27') call densities % push_back(density) case ('si') - call names % push_back('Si28.' // xs) + call names % push_back('Si28') call densities % push_back(density * 0.92223_8) - call names % push_back('Si29.' // xs) + call names % push_back('Si29') call densities % push_back(density * 0.04685_8) - call names % push_back('Si30.' // xs) + call names % push_back('Si30') call densities % push_back(density * 0.03092_8) case ('p') - call names % push_back('P31.' // xs) + call names % push_back('P31') call densities % push_back(density) case ('s') - call names % push_back('S32.' // xs) + call names % push_back('S32') call densities % push_back(density * 0.9499_8) - call names % push_back('S33.' // xs) + call names % push_back('S33') call densities % push_back(density * 0.0075_8) - call names % push_back('S34.' // xs) + call names % push_back('S34') call densities % push_back(density * 0.0425_8) - call names % push_back('S36.' // xs) + call names % push_back('S36') call densities % push_back(density * 0.0001_8) case ('cl') - call names % push_back('Cl35.' // xs) + call names % push_back('Cl35') call densities % push_back(density * 0.7576_8) - call names % push_back('Cl37.' // xs) + call names % push_back('Cl37') call densities % push_back(density * 0.2424_8) case ('ar') - call names % push_back('Ar36.' // xs) + call names % push_back('Ar36') call densities % push_back(density * 0.003336_8) - call names % push_back('Ar38.' // xs) + call names % push_back('Ar38') call densities % push_back(density * 0.000629_8) - call names % push_back('Ar40.' // xs) + call names % push_back('Ar40') call densities % push_back(density * 0.996035_8) case ('k') - call names % push_back('K39.' // xs) + call names % push_back('K39') call densities % push_back(density * 0.932581_8) - call names % push_back('K40.' // xs) + call names % push_back('K40') call densities % push_back(density * 0.000117_8) - call names % push_back('K41.' // xs) + call names % push_back('K41') call densities % push_back(density * 0.067302_8) case ('ca') - call names % push_back('Ca40.' // xs) + call names % push_back('Ca40') call densities % push_back(density * 0.96941_8) - call names % push_back('Ca42.' // xs) + call names % push_back('Ca42') call densities % push_back(density * 0.00647_8) - call names % push_back('Ca43.' // xs) + call names % push_back('Ca43') call densities % push_back(density * 0.00135_8) - call names % push_back('Ca44.' // xs) + call names % push_back('Ca44') call densities % push_back(density * 0.02086_8) - call names % push_back('Ca46.' // xs) + call names % push_back('Ca46') call densities % push_back(density * 0.00004_8) - call names % push_back('Ca48.' // xs) + call names % push_back('Ca48') call densities % push_back(density * 0.00187_8) case ('sc') - call names % push_back('Sc45.' // xs) + call names % push_back('Sc45') call densities % push_back(density) case ('ti') - call names % push_back('Ti46.' // xs) + call names % push_back('Ti46') call densities % push_back(density * 0.0825_8) - call names % push_back('Ti47.' // xs) + call names % push_back('Ti47') call densities % push_back(density * 0.0744_8) - call names % push_back('Ti48.' // xs) + call names % push_back('Ti48') call densities % push_back(density * 0.7372_8) - call names % push_back('Ti49.' // xs) + call names % push_back('Ti49') call densities % push_back(density * 0.0541_8) - call names % push_back('Ti50.' // xs) + call names % push_back('Ti50') call densities % push_back(density * 0.0518_8) case ('v') if (default_expand == ENDF_BVII0 .or. default_expand == JEFF_311 & .or. default_expand == JEFF_32 .or. & (default_expand >= JENDL_32 .and. default_expand <= JENDL_33)) then - call names % push_back('V0.' // xs) + call names % push_back('V0') call densities % push_back(density) else - call names % push_back('V50.' // xs) + call names % push_back('V50') call densities % push_back(density * 0.0025_8) - call names % push_back('V51.' // xs) + call names % push_back('V51') call densities % push_back(density * 0.9975_8) end if case ('cr') - call names % push_back('Cr50.' // xs) + call names % push_back('Cr50') call densities % push_back(density * 0.04345_8) - call names % push_back('Cr52.' // xs) + call names % push_back('Cr52') call densities % push_back(density * 0.83789_8) - call names % push_back('Cr53.' // xs) + call names % push_back('Cr53') call densities % push_back(density * 0.09501_8) - call names % push_back('Cr54.' // xs) + call names % push_back('Cr54') call densities % push_back(density * 0.02365_8) case ('mn') - call names % push_back('Mn55.' // xs) + call names % push_back('Mn55') call densities % push_back(density) case ('fe') - call names % push_back('Fe54.' // xs) + call names % push_back('Fe54') call densities % push_back(density * 0.05845_8) - call names % push_back('Fe56.' // xs) + call names % push_back('Fe56') call densities % push_back(density * 0.91754_8) - call names % push_back('Fe57.' // xs) + call names % push_back('Fe57') call densities % push_back(density * 0.02119_8) - call names % push_back('Fe58.' // xs) + call names % push_back('Fe58') call densities % push_back(density * 0.00282_8) case ('co') - call names % push_back('Co59.' // xs) + call names % push_back('Co59') call densities % push_back(density) case ('ni') - call names % push_back('Ni58.' // xs) + call names % push_back('Ni58') call densities % push_back(density * 0.68077_8) - call names % push_back('Ni60.' // xs) + call names % push_back('Ni60') call densities % push_back(density * 0.26223_8) - call names % push_back('Ni61.' // xs) + call names % push_back('Ni61') call densities % push_back(density * 0.011399_8) - call names % push_back('Ni62.' // xs) + call names % push_back('Ni62') call densities % push_back(density * 0.036346_8) - call names % push_back('Ni64.' // xs) + call names % push_back('Ni64') call densities % push_back(density * 0.009255_8) case ('cu') - call names % push_back('Cu63.' // xs) + call names % push_back('Cu63') call densities % push_back(density * 0.6915_8) - call names % push_back('Cu65.' // xs) + call names % push_back('Cu65') call densities % push_back(density * 0.3085_8) case ('zn') if (default_expand == ENDF_BVII0 .or. default_expand == & JEFF_311 .or. default_expand == JEFF_312) then - call names % push_back('Zn0.' // xs) + call names % push_back('Zn0') call densities % push_back(density) else - call names % push_back('Zn64.' // xs) + call names % push_back('Zn64') call densities % push_back(density * 0.4917_8) - call names % push_back('Zn66.' // xs) + call names % push_back('Zn66') call densities % push_back(density * 0.2773_8) - call names % push_back('Zn67.' // xs) + call names % push_back('Zn67') call densities % push_back(density * 0.0404_8) - call names % push_back('Zn68.' // xs) + call names % push_back('Zn68') call densities % push_back(density * 0.1845_8) - call names % push_back('Zn70.' // xs) + call names % push_back('Zn70') call densities % push_back(density * 0.0061_8) end if case ('ga') if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then - call names % push_back('Ga0.' // xs) + call names % push_back('Ga0') call densities % push_back(density) else - call names % push_back('Ha69.' // xs) + call names % push_back('Ha69') call densities % push_back(density * 0.60108_8) - call names % push_back('Ga71.' // xs) + call names % push_back('Ga71') call densities % push_back(density * 0.39892_8) end if case ('ge') - call names % push_back('Ge70.' // xs) + call names % push_back('Ge70') call densities % push_back(density * 0.2057_8) - call names % push_back('Ge72.' // xs) + call names % push_back('Ge72') call densities % push_back(density * 0.2745_8) - call names % push_back('Ge73.' // xs) + call names % push_back('Ge73') call densities % push_back(density * 0.0775_8) - call names % push_back('Ge74.' // xs) + call names % push_back('Ge74') call densities % push_back(density * 0.3650_8) - call names % push_back('Ge76.' // xs) + call names % push_back('Ge76') call densities % push_back(density * 0.0773_8) case ('as') - call names % push_back('As75.' // xs) + call names % push_back('As75') call densities % push_back(density) case ('se') - call names % push_back('Se74.' // xs) + call names % push_back('Se74') call densities % push_back(density * 0.0089_8) - call names % push_back('Se76.' // xs) + call names % push_back('Se76') call densities % push_back(density * 0.0937_8) - call names % push_back('Se77.' // xs) + call names % push_back('Se77') call densities % push_back(density * 0.0763_8) - call names % push_back('Se78.' // xs) + call names % push_back('Se78') call densities % push_back(density * 0.2377_8) - call names % push_back('Se80.' // xs) + call names % push_back('Se80') call densities % push_back(density * 0.4961_8) - call names % push_back('Se82.' // xs) + call names % push_back('Se82') call densities % push_back(density * 0.0873_8) case ('br') - call names % push_back('Br79.' // xs) + call names % push_back('Br79') call densities % push_back(density * 0.5069_8) - call names % push_back('Br81.' // xs) + call names % push_back('Br81') call densities % push_back(density * 0.4931_8) case ('kr') - call names % push_back('Kr78.' // xs) + call names % push_back('Kr78') call densities % push_back(density * 0.00355_8) - call names % push_back('Kr80.' // xs) + call names % push_back('Kr80') call densities % push_back(density * 0.02286_8) - call names % push_back('Kr82.' // xs) + call names % push_back('Kr82') call densities % push_back(density * 0.11593_8) - call names % push_back('Kr83.' // xs) + call names % push_back('Kr83') call densities % push_back(density * 0.11500_8) - call names % push_back('Kr84.' // xs) + call names % push_back('Kr84') call densities % push_back(density * 0.56987_8) - call names % push_back('Kr86.' // xs) + call names % push_back('Kr86') call densities % push_back(density * 0.17279_8) case ('rb') - call names % push_back('Rb85.' // xs) + call names % push_back('Rb85') call densities % push_back(density * 0.7217_8) - call names % push_back('Rb87.' // xs) + call names % push_back('Rb87') call densities % push_back(density * 0.2783_8) case ('sr') - call names % push_back('Sr84.' // xs) + call names % push_back('Sr84') call densities % push_back(density * 0.0056_8) - call names % push_back('Sr86.' // xs) + call names % push_back('Sr86') call densities % push_back(density * 0.0986_8) - call names % push_back('Sr87.' // xs) + call names % push_back('Sr87') call densities % push_back(density * 0.0700_8) - call names % push_back('Sr88.' // xs) + call names % push_back('Sr88') call densities % push_back(density * 0.8258_8) case ('y') - call names % push_back('Y89.' // xs) + call names % push_back('Y89') call densities % push_back(density) case ('zr') - call names % push_back('Zr90.' // xs) + call names % push_back('Zr90') call densities % push_back(density * 0.5145_8) - call names % push_back('Zr91.' // xs) + call names % push_back('Zr91') call densities % push_back(density * 0.1122_8) - call names % push_back('Zr92.' // xs) + call names % push_back('Zr92') call densities % push_back(density * 0.1715_8) - call names % push_back('Zr94.' // xs) + call names % push_back('Zr94') call densities % push_back(density * 0.1738_8) - call names % push_back('Zr96.' // xs) + call names % push_back('Zr96') call densities % push_back(density * 0.0280_8) case ('nb') - call names % push_back('Nb93.' // xs) + call names % push_back('Nb93') call densities % push_back(density) case ('mo') - call names % push_back('Mo92.' // xs) + call names % push_back('Mo92') call densities % push_back(density * 0.1453_8) - call names % push_back('Mo94.' // xs) + call names % push_back('Mo94') call densities % push_back(density * 0.0915_8) - call names % push_back('Mo95.' // xs) + call names % push_back('Mo95') call densities % push_back(density * 0.1584_8) - call names % push_back('Mo96.' // xs) + call names % push_back('Mo96') call densities % push_back(density * 0.1667_8) - call names % push_back('Mo97.' // xs) + call names % push_back('Mo97') call densities % push_back(density * 0.0960_8) - call names % push_back('Mo98.' // xs) + call names % push_back('Mo98') call densities % push_back(density * 0.2439_8) - call names % push_back('Mo100.' // xs) + call names % push_back('Mo100') call densities % push_back(density * 0.0982_8) case ('ru') - call names % push_back('Ru96.' // xs) + call names % push_back('Ru96') call densities % push_back(density * 0.0554_8) - call names % push_back('Ru98.' // xs) + call names % push_back('Ru98') call densities % push_back(density * 0.0187_8) - call names % push_back('Ru99.' // xs) + call names % push_back('Ru99') call densities % push_back(density * 0.1276_8) - call names % push_back('Ru100.' // xs) + call names % push_back('Ru100') call densities % push_back(density * 0.1260_8) - call names % push_back('Ru101.' // xs) + call names % push_back('Ru101') call densities % push_back(density * 0.1706_8) - call names % push_back('Ru102.' // xs) + call names % push_back('Ru102') call densities % push_back(density * 0.3155_8) - call names % push_back('Ru104.' // xs) + call names % push_back('Ru104') call densities % push_back(density * 0.1862_8) case ('rh') - call names % push_back('Rh103.' // xs) + call names % push_back('Rh103') call densities % push_back(density) case ('pd') - call names % push_back('Pd102.' // xs) + call names % push_back('Pd102') call densities % push_back(density * 0.0102_8) - call names % push_back('Pd104.' // xs) + call names % push_back('Pd104') call densities % push_back(density * 0.1114_8) - call names % push_back('Pd105.' // xs) + call names % push_back('Pd105') call densities % push_back(density * 0.2233_8) - call names % push_back('Pd106.' // xs) + call names % push_back('Pd106') call densities % push_back(density * 0.2733_8) - call names % push_back('Pd108.' // xs) + call names % push_back('Pd108') call densities % push_back(density * 0.2646_8) - call names % push_back('Pd110.' // xs) + call names % push_back('Pd110') call densities % push_back(density * 0.1172_8) case ('ag') - call names % push_back('Ag107.' // xs) + call names % push_back('Ag107') call densities % push_back(density * 0.51839_8) - call names % push_back('Ag109.' // xs) + call names % push_back('Ag109') call densities % push_back(density * 0.48161_8) case ('cd') - call names % push_back('Cd106.' // xs) + call names % push_back('Cd106') call densities % push_back(density * 0.0125_8) - call names % push_back('Cd108.' // xs) + call names % push_back('Cd108') call densities % push_back(density * 0.0089_8) - call names % push_back('Cd110.' // xs) + call names % push_back('Cd110') call densities % push_back(density * 0.1249_8) - call names % push_back('Cd111.' // xs) + call names % push_back('Cd111') call densities % push_back(density * 0.1280_8) - call names % push_back('Cd112.' // xs) + call names % push_back('Cd112') call densities % push_back(density * 0.2413_8) - call names % push_back('Cd113.' // xs) + call names % push_back('Cd113') call densities % push_back(density * 0.1222_8) - call names % push_back('Cd114.' // xs) + call names % push_back('Cd114') call densities % push_back(density * 0.2873_8) - call names % push_back('Cd116.' // xs) + call names % push_back('Cd116') call densities % push_back(density * 0.0749_8) case ('in') - call names % push_back('In113.' // xs) + call names % push_back('In113') call densities % push_back(density * 0.0429_8) - call names % push_back('In115.' // xs) + call names % push_back('In115') call densities % push_back(density * 0.9571_8) case ('sn') - call names % push_back('Sn112.' // xs) + call names % push_back('Sn112') call densities % push_back(density * 0.0097_8) - call names % push_back('Sn114.' // xs) + call names % push_back('Sn114') call densities % push_back(density * 0.0066_8) - call names % push_back('Sn115.' // xs) + call names % push_back('Sn115') call densities % push_back(density * 0.0034_8) - call names % push_back('Sn116.' // xs) + call names % push_back('Sn116') call densities % push_back(density * 0.1454_8) - call names % push_back('Sn117.' // xs) + call names % push_back('Sn117') call densities % push_back(density * 0.0768_8) - call names % push_back('Sn118.' // xs) + call names % push_back('Sn118') call densities % push_back(density * 0.2422_8) - call names % push_back('Sn119.' // xs) + call names % push_back('Sn119') call densities % push_back(density * 0.0859_8) - call names % push_back('Sn120.' // xs) + call names % push_back('Sn120') call densities % push_back(density * 0.3258_8) - call names % push_back('Sn122.' // xs) + call names % push_back('Sn122') call densities % push_back(density * 0.0463_8) - call names % push_back('Sn124.' // xs) + call names % push_back('Sn124') call densities % push_back(density * 0.0579_8) case ('sb') - call names % push_back('Sb121.' // xs) + call names % push_back('Sb121') call densities % push_back(density * 0.5721_8) - call names % push_back('Sb123.' // xs) + call names % push_back('Sb123') call densities % push_back(density * 0.4279_8) case ('te') - call names % push_back('Te120.' // xs) + call names % push_back('Te120') call densities % push_back(density * 0.0009_8) - call names % push_back('Te122.' // xs) + call names % push_back('Te122') call densities % push_back(density * 0.0255_8) - call names % push_back('Te123.' // xs) + call names % push_back('Te123') call densities % push_back(density * 0.0089_8) - call names % push_back('Te124.' // xs) + call names % push_back('Te124') call densities % push_back(density * 0.0474_8) - call names % push_back('Te125.' // xs) + call names % push_back('Te125') call densities % push_back(density * 0.0707_8) - call names % push_back('Te126.' // xs) + call names % push_back('Te126') call densities % push_back(density * 0.1884_8) - call names % push_back('Te128.' // xs) + call names % push_back('Te128') call densities % push_back(density * 0.3174_8) - call names % push_back('Te130.' // xs) + call names % push_back('Te130') call densities % push_back(density * 0.3408_8) case ('i') - call names % push_back('I127.' // xs) + call names % push_back('I127') call densities % push_back(density) case ('xe') - call names % push_back('Xe124.' // xs) + call names % push_back('Xe124') call densities % push_back(density * 0.000952_8) - call names % push_back('Xe126.' // xs) + call names % push_back('Xe126') call densities % push_back(density * 0.000890_8) - call names % push_back('Xe128.' // xs) + call names % push_back('Xe128') call densities % push_back(density * 0.019102_8) - call names % push_back('Xe129.' // xs) + call names % push_back('Xe129') call densities % push_back(density * 0.264006_8) - call names % push_back('Xe130.' // xs) + call names % push_back('Xe130') call densities % push_back(density * 0.040710_8) - call names % push_back('Xe131.' // xs) + call names % push_back('Xe131') call densities % push_back(density * 0.212324_8) - call names % push_back('Xe132.' // xs) + call names % push_back('Xe132') call densities % push_back(density * 0.269086_8) - call names % push_back('Xe134.' // xs) + call names % push_back('Xe134') call densities % push_back(density * 0.104357_8) - call names % push_back('Xe136.' // xs) + call names % push_back('Xe136') call densities % push_back(density * 0.088573_8) case ('cs') - call names % push_back('Cs133.' // xs) + call names % push_back('Cs133') call densities % push_back(density) case ('ba') - call names % push_back('Ba130.' // xs) + call names % push_back('Ba130') call densities % push_back(density * 0.00106_8) - call names % push_back('Ba132.' // xs) + call names % push_back('Ba132') call densities % push_back(density * 0.00101_8) - call names % push_back('Ba134.' // xs) + call names % push_back('Ba134') call densities % push_back(density * 0.02417_8) - call names % push_back('Ba135.' // xs) + call names % push_back('Ba135') call densities % push_back(density * 0.06592_8) - call names % push_back('Ba136.' // xs) + call names % push_back('Ba136') call densities % push_back(density * 0.07854_8) - call names % push_back('Ba137.' // xs) + call names % push_back('Ba137') call densities % push_back(density * 0.11232_8) - call names % push_back('Ba138.' // xs) + call names % push_back('Ba138') call densities % push_back(density * 0.71698_8) case ('la') - call names % push_back('La138.' // xs) + call names % push_back('La138') call densities % push_back(density * 0.0008881_8) - call names % push_back('La139.' // xs) + call names % push_back('La139') call densities % push_back(density * 0.9991119_8) case ('ce') - call names % push_back('Ce136.' // xs) + call names % push_back('Ce136') call densities % push_back(density * 0.00185_8) - call names % push_back('Ce138.' // xs) + call names % push_back('Ce138') call densities % push_back(density * 0.00251_8) - call names % push_back('Ce140.' // xs) + call names % push_back('Ce140') call densities % push_back(density * 0.88450_8) - call names % push_back('Ce142.' // xs) + call names % push_back('Ce142') call densities % push_back(density * 0.11114_8) case ('pr') - call names % push_back('Pr141.' // xs) + call names % push_back('Pr141') call densities % push_back(density) case ('nd') - call names % push_back('Nd142.' // xs) + call names % push_back('Nd142') call densities % push_back(density * 0.27152_8) - call names % push_back('Nd143.' // xs) + call names % push_back('Nd143') call densities % push_back(density * 0.12174_8) - call names % push_back('Nd144.' // xs) + call names % push_back('Nd144') call densities % push_back(density * 0.23798_8) - call names % push_back('Nd145.' // xs) + call names % push_back('Nd145') call densities % push_back(density * 0.08293_8) - call names % push_back('Nd146.' // xs) + call names % push_back('Nd146') call densities % push_back(density * 0.17189_8) - call names % push_back('Nd148.' // xs) + call names % push_back('Nd148') call densities % push_back(density * 0.05756_8) - call names % push_back('Nd150.' // xs) + call names % push_back('Nd150') call densities % push_back(density * 0.05638_8) case ('sm') - call names % push_back('Sm144.' // xs) + call names % push_back('Sm144') call densities % push_back(density * 0.0307_8) - call names % push_back('Sm147.' // xs) + call names % push_back('Sm147') call densities % push_back(density * 0.1499_8) - call names % push_back('Sm148.' // xs) + call names % push_back('Sm148') call densities % push_back(density * 0.1124_8) - call names % push_back('Sm149.' // xs) + call names % push_back('Sm149') call densities % push_back(density * 0.1382_8) - call names % push_back('Sm150.' // xs) + call names % push_back('Sm150') call densities % push_back(density * 0.0738_8) - call names % push_back('Sm152.' // xs) + call names % push_back('Sm152') call densities % push_back(density * 0.2675_8) - call names % push_back('Sm154.' // xs) + call names % push_back('Sm154') call densities % push_back(density * 0.2275_8) case ('eu') - call names % push_back('Eu151.' // xs) + call names % push_back('Eu151') call densities % push_back(density * 0.4781_8) - call names % push_back('Eu153.' // xs) + call names % push_back('Eu153') call densities % push_back(density * 0.5219_8) case ('gd') - call names % push_back('Gd152.' // xs) + call names % push_back('Gd152') call densities % push_back(density * 0.0020_8) - call names % push_back('Gd154.' // xs) + call names % push_back('Gd154') call densities % push_back(density * 0.0218_8) - call names % push_back('Gd155.' // xs) + call names % push_back('Gd155') call densities % push_back(density * 0.1480_8) - call names % push_back('Gd156.' // xs) + call names % push_back('Gd156') call densities % push_back(density * 0.2047_8) - call names % push_back('Gd157.' // xs) + call names % push_back('Gd157') call densities % push_back(density * 0.1565_8) - call names % push_back('Gd158.' // xs) + call names % push_back('Gd158') call densities % push_back(density * 0.2484_8) - call names % push_back('Gd160.' // xs) + call names % push_back('Gd160') call densities % push_back(density * 0.2186_8) case ('tb') - call names % push_back('Tb159.' // xs) + call names % push_back('Tb159') call densities % push_back(density) case ('dy') - call names % push_back('Dy156.' // xs) + call names % push_back('Dy156') call densities % push_back(density * 0.00056_8) - call names % push_back('Dy158.' // xs) + call names % push_back('Dy158') call densities % push_back(density * 0.00095_8) - call names % push_back('Dy160.' // xs) + call names % push_back('Dy160') call densities % push_back(density * 0.02329_8) - call names % push_back('Dy161.' // xs) + call names % push_back('Dy161') call densities % push_back(density * 0.18889_8) - call names % push_back('Dy162.' // xs) + call names % push_back('Dy162') call densities % push_back(density * 0.25475_8) - call names % push_back('Dy163.' // xs) + call names % push_back('Dy163') call densities % push_back(density * 0.24896_8) - call names % push_back('Dy164.' // xs) + call names % push_back('Dy164') call densities % push_back(density * 0.28260_8) case ('ho') - call names % push_back('Ho165.' // xs) + call names % push_back('Ho165') call densities % push_back(density) case ('er') - call names % push_back('Er162.' // xs) + call names % push_back('Er162') call densities % push_back(density * 0.00139_8) - call names % push_back('Er164.' // xs) + call names % push_back('Er164') call densities % push_back(density * 0.01601_8) - call names % push_back('Er166.' // xs) + call names % push_back('Er166') call densities % push_back(density * 0.33503_8) - call names % push_back('Er167.' // xs) + call names % push_back('Er167') call densities % push_back(density * 0.22869_8) - call names % push_back('Er168.' // xs) + call names % push_back('Er168') call densities % push_back(density * 0.26978_8) - call names % push_back('Er170.' // xs) + call names % push_back('Er170') call densities % push_back(density * 0.14910_8) case ('tm') - call names % push_back('Tm169.' // xs) + call names % push_back('Tm169') call densities % push_back(density) case ('yb') - call names % push_back('Yb168.' // xs) + call names % push_back('Yb168') call densities % push_back(density * 0.00123_8) - call names % push_back('Yb170.' // xs) + call names % push_back('Yb170') call densities % push_back(density * 0.02982_8) - call names % push_back('Yb171.' // xs) + call names % push_back('Yb171') call densities % push_back(density * 0.1409_8) - call names % push_back('Yb172.' // xs) + call names % push_back('Yb172') call densities % push_back(density * 0.2168_8) - call names % push_back('Yb173.' // xs) + call names % push_back('Yb173') call densities % push_back(density * 0.16103_8) - call names % push_back('Yb174.' // xs) + call names % push_back('Yb174') call densities % push_back(density * 0.32026_8) - call names % push_back('Yb176.' // xs) + call names % push_back('Yb176') call densities % push_back(density * 0.12996_8) case ('lu') - call names % push_back('Lu175.' // xs) + call names % push_back('Lu175') call densities % push_back(density * 0.97401_8) - call names % push_back('Lu176.' // xs) + call names % push_back('Lu176') call densities % push_back(density * 0.02599_8) case ('hf') - call names % push_back('Hf174.' // xs) + call names % push_back('Hf174') call densities % push_back(density * 0.0016_8) - call names % push_back('Hf176.' // xs) + call names % push_back('Hf176') call densities % push_back(density * 0.0526_8) - call names % push_back('Hf177.' // xs) + call names % push_back('Hf177') call densities % push_back(density * 0.1860_8) - call names % push_back('Hf178.' // xs) + call names % push_back('Hf178') call densities % push_back(density * 0.2728_8) - call names % push_back('Hf179.' // xs) + call names % push_back('Hf179') call densities % push_back(density * 0.1362_8) - call names % push_back('Hf180.' // xs) + call names % push_back('Hf180') call densities % push_back(density * 0.3508_8) case ('ta') if (default_expand == ENDF_BVII0 .or. & (default_expand >= JEFF_311 .and. default_expand <= JEFF_312) .or. & (default_expand >= JENDL_32 .and. default_expand <= JENDL_40)) then - call names % push_back('Ta181.' // xs) + call names % push_back('Ta181') call densities % push_back(density) else - call names % push_back('Ta180.' // xs) + call names % push_back('Ta180') call densities % push_back(density * 0.0001201_8) - call names % push_back('Ta181.' // xs) + call names % push_back('Ta181') call densities % push_back(density * 0.9998799_8) end if @@ -5417,138 +5416,138 @@ contains .or. default_expand == JEFF_312 .or. & (default_expand >= JENDL_32 .and. default_expand <= JENDL_33)) then ! Combine W-180 with W-182 - call names % push_back('W182.' // xs) + call names % push_back('W182') call densities % push_back(density * 0.2662_8) - call names % push_back('W183.' // xs) + call names % push_back('W183') call densities % push_back(density * 0.1431_8) - call names % push_back('W184.' // xs) + call names % push_back('W184') call densities % push_back(density * 0.3064_8) - call names % push_back('W186.' // xs) + call names % push_back('W186') call densities % push_back(density * 0.2843_8) else - call names % push_back('W180.' // xs) + call names % push_back('W180') call densities % push_back(density * 0.0012_8) - call names % push_back('W182.' // xs) + call names % push_back('W182') call densities % push_back(density * 0.2650_8) - call names % push_back('W183.' // xs) + call names % push_back('W183') call densities % push_back(density * 0.1431_8) - call names % push_back('W184.' // xs) + call names % push_back('W184') call densities % push_back(density * 0.3064_8) - call names % push_back('W186.' // xs) + call names % push_back('W186') call densities % push_back(density * 0.2843_8) end if case ('re') - call names % push_back('Re185.' // xs) + call names % push_back('Re185') call densities % push_back(density * 0.3740_8) - call names % push_back('Re187.' // xs) + call names % push_back('Re187') call densities % push_back(density * 0.6260_8) case ('os') if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then - call names % push_back('Os0.' // xs) + call names % push_back('Os0') call densities % push_back(density) else - call names % push_back('Os184.' // xs) + call names % push_back('Os184') call densities % push_back(density * 0.0002_8) - call names % push_back('Os186.' // xs) + call names % push_back('Os186') call densities % push_back(density * 0.0159_8) - call names % push_back('Os187.' // xs) + call names % push_back('Os187') call densities % push_back(density * 0.0196_8) - call names % push_back('Os188.' // xs) + call names % push_back('Os188') call densities % push_back(density * 0.1324_8) - call names % push_back('Os189.' // xs) + call names % push_back('Os189') call densities % push_back(density * 0.1615_8) - call names % push_back('Os190.' // xs) + call names % push_back('Os190') call densities % push_back(density * 0.2626_8) - call names % push_back('Os192.' // xs) + call names % push_back('Os192') call densities % push_back(density * 0.4078_8) end if case ('ir') - call names % push_back('Ir191.' // xs) + call names % push_back('Ir191') call densities % push_back(density * 0.373_8) - call names % push_back('Ir193.' // xs) + call names % push_back('Ir193') call densities % push_back(density * 0.627_8) case ('pt') if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then - call names % push_back('Pt0.' // xs) + call names % push_back('Pt0') call densities % push_back(density) else - call names % push_back('Pt190.' // xs) + call names % push_back('Pt190') call densities % push_back(density * 0.00012_8) - call names % push_back('Pt192.' // xs) + call names % push_back('Pt192') call densities % push_back(density * 0.00782_8) - call names % push_back('Pt194.' // xs) + call names % push_back('Pt194') call densities % push_back(density * 0.3286_8) - call names % push_back('Pt195.' // xs) + call names % push_back('Pt195') call densities % push_back(density * 0.3378_8) - call names % push_back('Pt196.' // xs) + call names % push_back('Pt196') call densities % push_back(density * 0.2521_8) - call names % push_back('Pt198.' // xs) + call names % push_back('Pt198') call densities % push_back(density * 0.07356_8) end if case ('au') - call names % push_back('Au197.' // xs) + call names % push_back('Au197') call densities % push_back(density) case ('hg') - call names % push_back('Hg196.' // xs) + call names % push_back('Hg196') call densities % push_back(density * 0.0015_8) - call names % push_back('Hg198.' // xs) + call names % push_back('Hg198') call densities % push_back(density * 0.0997_8) - call names % push_back('Hg199.' // xs) + call names % push_back('Hg199') call densities % push_back(density * 0.1687_8) - call names % push_back('Hg200.' // xs) + call names % push_back('Hg200') call densities % push_back(density * 0.2310_8) - call names % push_back('Hg201.' // xs) + call names % push_back('Hg201') call densities % push_back(density * 0.1318_8) - call names % push_back('Hg202.' // xs) + call names % push_back('Hg202') call densities % push_back(density * 0.2986_8) - call names % push_back('Hg204.' // xs) + call names % push_back('Hg204') call densities % push_back(density * 0.0687_8) case ('tl') if (default_expand == JEFF_311 .or. default_expand == JEFF_312) then - call names % push_back('Tl0.' // xs) + call names % push_back('Tl0') call densities % push_back(density) else - call names % push_back('Tl203.' // xs) + call names % push_back('Tl203') call densities % push_back(density * 0.2952_8) - call names % push_back('Tl205.' // xs) + call names % push_back('Tl205') call densities % push_back(density * 0.7048_8) end if case ('pb') - call names % push_back('Pb204.' // xs) + call names % push_back('Pb204') call densities % push_back(density * 0.014_8) - call names % push_back('Pb206.' // xs) + call names % push_back('Pb206') call densities % push_back(density * 0.241_8) - call names % push_back('Pb207.' // xs) + call names % push_back('Pb207') call densities % push_back(density * 0.221_8) - call names % push_back('Pb208.' // xs) + call names % push_back('Pb208') call densities % push_back(density * 0.524_8) case ('bi') - call names % push_back('Bi209.' // xs) + call names % push_back('Bi209') call densities % push_back(density) case ('th') - call names % push_back('Th232.' // xs) + call names % push_back('Th232') call densities % push_back(density) case ('pa') - call names % push_back('Pa231.' // xs) + call names % push_back('Pa231') call densities % push_back(density) case ('u') - call names % push_back('U234.' // xs) + call names % push_back('U234') call densities % push_back(density * 0.000054_8) - call names % push_back('U235.' // xs) + call names % push_back('U235') call densities % push_back(density * 0.007204_8) - call names % push_back('U238.' // xs) + call names % push_back('U238') call densities % push_back(density * 0.992742_8) case default diff --git a/src/mgxs_data.F90 b/src/mgxs_data.F90 index 491bd84091..05d6eb5ec6 100644 --- a/src/mgxs_data.F90 +++ b/src/mgxs_data.F90 @@ -89,7 +89,7 @@ contains end do ! ========================================================================== - ! READ ALL ACE CROSS SECTION TABLES + ! READ ALL MGXS CROSS SECTION TABLES ! Loop over all files MATERIAL_LOOP: do i = 1, n_materials diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index fd043d789c..e7c6c48243 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -13,7 +13,7 @@ module nuclide_header use endf_header, only: Function1D, Polynomial, Tabulated1D use error, only: fatal_error, warning use hdf5_interface, only: read_attribute, open_group, close_group, & - open_dataset, read_dataset, close_dataset, get_shape + open_dataset, read_dataset, close_dataset, get_shape, get_datasets use list_header, only: ListInt use math, only: evaluate_legendre use multipole_header, only: MultipoleArray @@ -205,6 +205,11 @@ module nuclide_header integer(HSIZE_T) :: j integer(HSIZE_T) :: dims(1) character(MAX_WORD_LEN) :: temp + character(MAX_FILE_LEN), allocatable :: temperatures(:) + integer, allocatable :: temperatures_integer(:) + integer :: temperature_delta + character(6) :: my_temperature + integer :: temperature_integer type(VectorInt) :: MTs logical :: exists @@ -218,17 +223,42 @@ module nuclide_header call read_attribute(Z, group_id, 'Z') call read_attribute(A, group_id, 'A') call read_attribute(this % metastable, group_id, 'metastable') - this % zaid = 1000*Z + A + 400*this % metastable + this % zaid = 1000 * Z + A + 400 * this % metastable call read_attribute(this % awr, group_id, 'atomic_weight_ratio') kT_group = open_group(group_id, 'kTs') - kT_dset = open_dataset(kT_group, temperature) + ! Before accessing the temperature data, see if the user-provied temperature + ! exists. We can find this out by looking at the datasets within kT_group + temp = adjustr(trim(temperature)) + temperature_integer = str_to_int(temp(1:len(temp) - 1)) + call get_datasets(kT_group, temperatures) + allocate(temperatures_integer(size(temperatures))) + do i = 1, size(temperatures) + temp = adjustr(trim(temperatures(i))) + temperatures_integer(i) = str_to_int(temp(1:len(temp) - 1)) + end do + j = 1 + temperature_delta = temperature_integer - temperatures_integer(j) + do i = 2, size(temperatures) + if (abs(temperature_integer - temperatures_integer(i)) < temperature_delta) & + j = i + end do + ! Now print a warning if there is no matching temperature and then use the + ! closest temperature + my_temperature = temperatures(j) + if (temperature /= my_temperature) then + call warning(trim(this % name) // " does not contain data at a & + &temperature of " // trim(temperature) // "; using the & + &nearest available temperature of " // trim(my_temperature)) + end if + + kT_dset = open_dataset(kT_group, my_temperature) call read_dataset(this % kT, kT_dset) call close_dataset(kT_dset) call close_group(kT_group) ! Read energy grid energy_group = open_group(group_id, 'energy') - energy_dset = open_dataset(energy_group, temperature) + energy_dset = open_dataset(energy_group, my_temperature) call get_shape(energy_dset, dims) this % n_grid = int(dims(1), 4) allocate(this % energy(this % n_grid)) @@ -252,7 +282,7 @@ module nuclide_header do i = 1, size(this % reactions) rx_group = open_group(rxs_group, 'reaction_' // trim(& zero_padded(MTs % data(i), 3))) - call this % reactions(i) % from_hdf5(rx_group, temperature) + call this % reactions(i) % from_hdf5(rx_group, my_temperature) call close_group(rx_group) end do call close_group(rxs_group) diff --git a/src/sab_header.F90 b/src/sab_header.F90 index 86b72740cf..d12b75a32b 100644 --- a/src/sab_header.F90 +++ b/src/sab_header.F90 @@ -4,12 +4,13 @@ module sab_header use constants use distribution_univariate, only: Tabular - use hdf5, only: HID_T, HSIZE_T - use h5lt, only: h5ltpath_valid_f + use error, only: warning + use hdf5, only: HID_T, HSIZE_T, SIZE_T + use h5lt, only: h5ltpath_valid_f, h5iget_name_f use hdf5_interface, only: read_attribute, get_shape, open_group, close_group, & - open_dataset, read_dataset, close_dataset + open_dataset, read_dataset, close_dataset, get_datasets use secondary_correlated, only: CorrelatedAngleEnergy - use string, only: to_str + use string, only: to_str, str_to_int implicit none @@ -162,6 +163,7 @@ contains integer :: i, j integer :: n_energy, n_energy_out, n_mu integer :: hdf5_err + integer(SIZE_T) :: name_len, name_file_len integer(HID_T) :: T_group integer(HID_T) :: elastic_group integer(HID_T) :: inelastic_group @@ -173,6 +175,19 @@ contains character(20) :: type logical :: exists type(CorrelatedAngleEnergy) :: correlated_dist + character(MAX_FILE_LEN), allocatable :: temperatures(:) + character(MAX_FILE_LEN) :: temp_str + integer, allocatable :: temperatures_integer(:) + integer :: temperature_delta + character(6) :: my_temperature + integer :: temperature_integer + + ! Get name of table from group + name_len = len(this % name) + call h5iget_name_f(group_id, this % name, name_len, name_file_len, hdf5_err) + + ! Get rid of leading '/' + this % name = trim(this % name(2:)) call read_attribute(this % awr, group_id, 'atomic_weight_ratio') call read_attribute(this % zaid, group_id, 'zaids') @@ -187,13 +202,38 @@ contains end select this % n_zaid = size(this % zaid) kT_group = open_group(group_id, 'kTs') - kT_dset = open_dataset(kT_group, temperature) + ! Before accessing the temperature data, see if the user-provied temperature + ! exists. We can find this out by looking at the datasets within kT_group + temp_str = adjustr(trim(temperature)) + temperature_integer = str_to_int(temp_str(1:len(temp_str) - 1)) + call get_datasets(kT_group, temperatures) + allocate(temperatures_integer(size(temperatures))) + do i = 1, size(temperatures) + temp_str = adjustr(trim(temperatures(i))) + temperatures_integer(i) = str_to_int(temp_str(1:len(temp_str) - 1)) + end do + j = 1 + temperature_delta = temperature_integer - temperatures_integer(j) + do i = 2, size(temperatures) + if (abs(temperature_integer - temperatures_integer(i)) < temperature_delta) & + j = i + end do + ! Now print a warning if there is no matching temperature and then use the + ! closest temperature + my_temperature = temperatures(j) + if (temperature /= my_temperature) then + call warning(trim(this % name) // " does not contain data at a & + &temperature of " // trim(temperature) // "; using the & + &nearest available temperature of " // trim(my_temperature)) + end if + + kT_dset = open_dataset(kT_group, my_temperature) call read_dataset(this % kT, kT_dset) call close_dataset(kT_dset) call close_group(kT_group) - ! Open temperature group - T_group = open_group(group_id, temperature) + ! Open my_temperature group + T_group = open_group(group_id, my_temperature) ! Coherent elastic data call h5ltpath_valid_f(T_group, 'elastic', .true., exists, hdf5_err) diff --git a/tests/test_distribmat/inputs_true.dat b/tests/test_distribmat/inputs_true.dat index d21da2f894..2ba50f7e8c 100644 --- a/tests/test_distribmat/inputs_true.dat +++ b/tests/test_distribmat/inputs_true.dat @@ -1 +1 @@ -6ae54c198e7659503d297e40be746a5bd72b35909fceed4b3ef357876b781946c0ea5021342556ef21f4034fa9e42b2c6014077c0efd3459dc063e6da4b12b59 \ No newline at end of file +dd0b1228d264dd3c24ca3082de9839080f727a137c77bed74b7637cc16d1564ce7500e3bb61a88224926f1d837079702f304247efdf9e52dedf779e17cd14550 \ No newline at end of file diff --git a/tests/test_periodic/inputs_true.dat b/tests/test_periodic/inputs_true.dat index 56d3e01bfe..0b49ac2aea 100644 --- a/tests/test_periodic/inputs_true.dat +++ b/tests/test_periodic/inputs_true.dat @@ -1 +1 @@ -0766f3e0ac9b3d26bf5529eb3c92e0337698994d663b6a68dd8c1340807d6941c7589d777430782bc7b78590adced55f0f55b1de71a7c70d453f78d4ca469d8d \ No newline at end of file +f427510feb8a63ee2246613e65c9e9a488b6b7df11ce5f5ab0c61b23f299e150a27068ee110f77c64b5bb82882b6d0a428e06de681df2bd83facb9ebc46fb54c \ No newline at end of file diff --git a/tests/test_resonance_scattering/test_resonance_scattering.py b/tests/test_resonance_scattering/test_resonance_scattering.py index 0d70c0d8d6..0e34a4a4cd 100644 --- a/tests/test_resonance_scattering/test_resonance_scattering.py +++ b/tests/test_resonance_scattering/test_resonance_scattering.py @@ -18,7 +18,7 @@ class ResonanceScatteringTestHarness(PyAPITestHarness): mat.add_nuclide('H1', 20.0) mats_file = openmc.Materials([mat]) - mats_file.default_xs = '71c' + mats_file.default_temperature = '294K' mats_file.export_to_xml() # Geometry @@ -37,7 +37,7 @@ class ResonanceScatteringTestHarness(PyAPITestHarness): geometry.export_to_xml() # Settings - nuclide = openmc.Nuclide('U238', '71c') + nuclide = openmc.Nuclide('U238') res_scatt_dbrc = openmc.ResonanceScattering() res_scatt_dbrc.nuclide = nuclide res_scatt_dbrc.nuclide_0K = nuclide # This is a bad idea! Just for tests @@ -45,7 +45,7 @@ class ResonanceScatteringTestHarness(PyAPITestHarness): res_scatt_dbrc.E_min = 1e-6 res_scatt_dbrc.E_max = 210e-6 - nuclide = openmc.Nuclide('U235', '71c') + nuclide = openmc.Nuclide('U235') res_scatt_wcm = openmc.ResonanceScattering() res_scatt_wcm.nuclide = nuclide res_scatt_wcm.nuclide_0K = nuclide @@ -53,7 +53,7 @@ class ResonanceScatteringTestHarness(PyAPITestHarness): res_scatt_wcm.E_min = 1e-6 res_scatt_wcm.E_max = 210e-6 - nuclide = openmc.Nuclide('Pu239', '71c') + nuclide = openmc.Nuclide('Pu239') res_scatt_ares = openmc.ResonanceScattering() res_scatt_ares.nuclide = nuclide res_scatt_ares.nuclide_0K = nuclide diff --git a/tests/test_source/inputs_true.dat b/tests/test_source/inputs_true.dat index f11998e6cf..5744adeebc 100644 --- a/tests/test_source/inputs_true.dat +++ b/tests/test_source/inputs_true.dat @@ -1 +1 @@ -27ceb546499a4134eac08ffb22d02ce21d67f12617d43a02991b443e9aca7b7eca818d03e146676c0b352abaef6505423e48edef24cfd7a8fdb148cb3dbcdb1f \ No newline at end of file +29498faa9496b8eeeab79f6cb5a966cb03a54e9c3c7e9178e7cc132df575f1377aa780fa2684201c4becdf199f89c3e7c36a824a495e60359bc6fd30b02cad6f \ No newline at end of file diff --git a/tests/test_triso/inputs_true.dat b/tests/test_triso/inputs_true.dat index 04119a2dc8..fb9d6893c0 100644 --- a/tests/test_triso/inputs_true.dat +++ b/tests/test_triso/inputs_true.dat @@ -1 +1 @@ -f33e6653b883200457df2ff2ba9cf715d5ddaa1296dd71d277c6f1d9d5b7831cc92aaf1e97509d26e5a93235cd9f775c0cfaa5ebc3dfe8fc71469bac166d362b \ No newline at end of file +c844cc920677037d22e6075780ab3e419f6ded19ea08c6f205df1773caa1a0ee53c605b7794415a24d9f0dbf6bd21d40daa9fcc89497b2abccabb1a6c81a506c \ No newline at end of file diff --git a/tests/test_volume_calc/inputs_true.dat b/tests/test_volume_calc/inputs_true.dat index e146703f31..c9515085a1 100644 --- a/tests/test_volume_calc/inputs_true.dat +++ b/tests/test_volume_calc/inputs_true.dat @@ -1 +1 @@ -102569289552d021b6803f404a0c17a9c17a40578fdba43a6ba08b77a731e0368fffa6a8a7abd48555167cb9997c6dba9ec5044c8593b12056957b7e3ec44ed0 \ No newline at end of file +aeacdb4aabfdfba0ee06cb4e5b21e95c48b1db57cb1301a1798f9b2f37eb56032ea7e94d88d8eacd17988809059b2da2500c2496c2859e5b656b641440545722 \ No newline at end of file diff --git a/tests/test_volume_calc/results_true.dat b/tests/test_volume_calc/results_true.dat index da6dfd2afc..efd6395c3c 100644 --- a/tests/test_volume_calc/results_true.dat +++ b/tests/test_volume_calc/results_true.dat @@ -3,29 +3,29 @@ Volume calculation 0 Domain 1: 31.4693 +/- 0.0721 cm^3 Domain 2: 2.0933 +/- 0.0310 cm^3 Domain 3: 2.0486 +/- 0.0307 cm^3 - Cell Nuclide Atoms Uncertainty -0 1 U235.71c 3.481769e+23 7.979991e+20 -1 1 Mo99.71c 3.481769e+22 7.979991e+19 -2 2 H1.71c 1.399770e+23 2.072914e+21 -3 2 O16.71c 6.998852e+22 1.036457e+21 -4 2 B10.71c 6.998852e+18 1.036457e+17 -5 3 H1.71c 1.369920e+23 2.051689e+21 -6 3 O16.71c 6.849599e+22 1.025844e+21 -7 3 B10.71c 6.849599e+18 1.025844e+17 + Cell Nuclide Atoms Uncertainty +0 1 U235 3.481769e+23 7.979991e+20 +1 1 Mo99 3.481769e+22 7.979991e+19 +2 2 H1 1.399770e+23 2.072914e+21 +3 2 O16 6.998852e+22 1.036457e+21 +4 2 B10 6.998852e+18 1.036457e+17 +5 3 H1 1.369920e+23 2.051689e+21 +6 3 O16 6.849599e+22 1.025844e+21 +7 3 B10 6.849599e+18 1.025844e+17 Volume calculation 1 Domain 1: 4.1419 +/- 0.0426 cm^3 Domain 2: 31.4693 +/- 0.0721 cm^3 - Material Nuclide Atoms Uncertainty -0 1 H1.71c 2.769690e+23 2.850068e+21 -1 1 O16.71c 1.384845e+23 1.425034e+21 -2 1 B10.71c 1.384845e+19 1.425034e+17 -3 2 U235.71c 3.481769e+23 7.979991e+20 -4 2 Mo99.71c 3.481769e+22 7.979991e+19 + Material Nuclide Atoms Uncertainty +0 1 H1 2.769690e+23 2.850068e+21 +1 1 O16 1.384845e+23 1.425034e+21 +2 1 B10 1.384845e+19 1.425034e+17 +3 2 U235 3.481769e+23 7.979991e+20 +4 2 Mo99 3.481769e+22 7.979991e+19 Volume calculation 2 Domain 0: 35.6112 +/- 0.0664 cm^3 - Universe Nuclide Atoms Uncertainty -0 0 H1.71c 2.769690e+23 2.850068e+21 -1 0 O16.71c 1.384845e+23 1.425034e+21 -2 0 B10.71c 1.384845e+19 1.425034e+17 -3 0 U235.71c 3.481769e+23 7.979991e+20 -4 0 Mo99.71c 3.481769e+22 7.979991e+19 + Universe Nuclide Atoms Uncertainty +0 0 H1 2.769690e+23 2.850068e+21 +1 0 O16 1.384845e+23 1.425034e+21 +2 0 B10 1.384845e+19 1.425034e+17 +3 0 U235 3.481769e+23 7.979991e+20 +4 0 Mo99 3.481769e+22 7.979991e+19 From aaa80eb98926a271b59df6b992a90c48df88d637 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 23 Aug 2016 06:26:20 -0500 Subject: [PATCH 111/168] Update title() subroutine with ASCII logo --- src/output.F90 | 60 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 40 insertions(+), 20 deletions(-) diff --git a/src/output.F90 b/src/output.F90 index 9e23f11d88..29950a0bc2 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -38,43 +38,63 @@ contains use omp_lib #endif - write(UNIT=OUTPUT_UNIT, FMT='(/11(A/))') & - ' .d88888b. 888b d888 .d8888b.', & - ' d88P" "Y88b 8888b d8888 d88P Y88b', & - ' 888 888 88888b.d88888 888 888', & - ' 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 ', & - ' 888 888 888 "88b d8P Y8b 888 "88b 888 Y888P 888 888 ', & - ' 888 888 888 888 88888888 888 888 888 Y8P 888 888 888', & - ' Y88b. .d88P 888 d88P Y8b. 888 888 888 " 888 Y88b d88P', & - ' "Y88888P" 88888P" "Y8888 888 888 888 888 "Y8888P"', & - '__________________888______________________________________________________', & - ' 888', & - ' 888' + write(UNIT=OUTPUT_UNIT, FMT='(/29(A/))') & + ' %%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' ################### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' ###################### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' ####################### %%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' ######################## %%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' ######################### %%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' ########################## %%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' ############################ %%%%%%%%%%%%%%%%%%%%%%%%', & + ' ############################# %%%%%%%%%%%%%%%%%%%%%%%', & + ' ############################## %%%%%%%%%%%%%%%%%%%%%', & + ' ############################# %%%%%%%%%%%%%%%%%%%%', & + ' ########################### %%%%%%%%%%%%%%%%%%%%', & + ' ######################### %%%%%%%%%%%%%%%%%%%%%', & + ' ###################### %%%%%%%%%%%%%%%%%%%%%', & + ' #################### %%%%%%%%%%%%%%%%%%%%%', & + ' ################# %%%%%%%%%%%%%%%%%%%%', & + ' ############## %%%%%%%%%%%%%%%%%%%', & + ' ########### %%%%%%%%%%%%%%%%%%', & + ' ####### %%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%' + ! Write version information write(UNIT=OUTPUT_UNIT, FMT=*) & - ' Copyright: 2011-2016 Massachusetts Institute of Technology' + ' | The OpenMC Monte Carlo Code' write(UNIT=OUTPUT_UNIT, FMT=*) & - ' License: http://openmc.readthedocs.io/en/latest/license.html' - write(UNIT=OUTPUT_UNIT, FMT='(6X,"Version:",8X,I1,".",I1,".",I1)') & + ' Copyright | 2011-2016 Massachusetts Institute of Technology' + write(UNIT=OUTPUT_UNIT, FMT=*) & + ' License | http://openmc.readthedocs.io/en/latest/license.html' + write(UNIT=OUTPUT_UNIT, FMT='(11X,"Version | ",I1,".",I1,".",I1)') & VERSION_MAJOR, VERSION_MINOR, VERSION_RELEASE #ifdef GIT_SHA1 - write(UNIT=OUTPUT_UNIT, FMT='(6X,"Git SHA1:",7X,A)') GIT_SHA1 + write(UNIT=OUTPUT_UNIT, FMT='(10X,"Git SHA1 | ",A)') GIT_SHA1 #endif ! Write the date and time - write(UNIT=OUTPUT_UNIT, FMT='(6X,"Date/Time:",6X,A)') & - time_stamp() + write(UNIT=OUTPUT_UNIT, FMT='(9X,"Date/Time | ",A)') time_stamp() #ifdef MPI ! Write number of processors - write(UNIT=OUTPUT_UNIT, FMT='(6X,"MPI Processes:",2X,A)') & + write(UNIT=OUTPUT_UNIT, FMT='(5X,"MPI Processes | ",A)') & trim(to_str(n_procs)) #endif #ifdef _OPENMP ! Write number of OpenMP threads - write(UNIT=OUTPUT_UNIT, FMT='(6X,"OpenMP Threads:",1X,A)') & + write(UNIT=OUTPUT_UNIT, FMT='(4X,"OpenMP Threads | ",A)') & trim(to_str(omp_get_max_threads())) #endif From bc387186ba6b08ce87685dbd7116e29310ce0f74 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 23 Aug 2016 09:41:53 -0400 Subject: [PATCH 112/168] changed partial current tallies to net current tallies --- examples/xml/pincell/geometry.xml | 14 +- examples/xml/pincell/settings.xml | 12 +- examples/xml/pincell/tallies.xml | 11 +- src/cmfd_data.F90 | 28 +-- src/cmfd_input.F90 | 5 +- src/constants.F90 | 12 +- src/input_xml.F90 | 5 +- src/output.F90 | 24 +- src/tally.F90 | 351 +++++++++++++++++++++++++----- src/trigger.F90 | 12 +- 10 files changed, 356 insertions(+), 118 deletions(-) diff --git a/examples/xml/pincell/geometry.xml b/examples/xml/pincell/geometry.xml index f67f9e74c2..f4e1bf1dd4 100644 --- a/examples/xml/pincell/geometry.xml +++ b/examples/xml/pincell/geometry.xml @@ -8,16 +8,16 @@ --> - - - + + + - - - - + + + + diff --git a/examples/xml/pincell/settings.xml b/examples/xml/pincell/settings.xml index 443af9cde2..9402b979a9 100644 --- a/examples/xml/pincell/settings.xml +++ b/examples/xml/pincell/settings.xml @@ -3,7 +3,7 @@ - 100 + 20 10 1000 @@ -14,8 +14,8 @@ - -0.62992 -0.62992 -1. - 0.62992 0.62992 1. + -8.62992 -8.62992 -1. + 8.62992 8.62992 1. @@ -24,9 +24,9 @@ bounds for a mesh over which the Shannon entropy should be calculated. The extent in the z direction is made arbitrarily large. --> - -0.39218 -0.39218 -1.e50 - 0.39218 0.39218 1.e50 + -3.39218 -3.39218 -1.e50 + 3.39218 3.39218 1.e50 10 10 1 - \ No newline at end of file + diff --git a/examples/xml/pincell/tallies.xml b/examples/xml/pincell/tallies.xml index 73242b9136..2e39c083d4 100644 --- a/examples/xml/pincell/tallies.xml +++ b/examples/xml/pincell/tallies.xml @@ -2,9 +2,9 @@ - 100 100 1 - -0.62992 -0.62992 -1.e50 - 0.62992 0.62992 1.e50 + 2 2 1 + -8.62992 -8.62992 -1.e50 + 8.62992 8.62992 1.e50 @@ -13,4 +13,9 @@ flux fission nu-fission + + + current + + diff --git a/src/cmfd_data.F90 b/src/cmfd_data.F90 index d74c1b17e0..0a1490bb97 100644 --- a/src/cmfd_data.F90 +++ b/src/cmfd_data.F90 @@ -51,8 +51,8 @@ contains subroutine compute_xs() use constants, only: FILTER_MESH, FILTER_ENERGYIN, FILTER_ENERGYOUT, & - FILTER_SURFACE, OUT_LEFT, OUT_RIGHT, OUT_BACK, & - OUT_FRONT, OUT_BOTTOM, OUT_TOP, CMFD_NOACCEL, & + FILTER_SURFACE, LEFT, RIGHT, BACK, & + FRONT, BOTTOM, TOP, CMFD_NOACCEL, & ZERO, ONE, TINY_BIT use error, only: fatal_error use global, only: cmfd, n_cmfd_tallies, cmfd_tallies, meshes,& @@ -237,7 +237,7 @@ contains ! Left surface matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & (/ i, j, k /)) - matching_bins(i_filter_surf) = OUT_LEFT + matching_bins(i_filter_surf) = LEFT score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t%stride) + 1 ! outgoing cmfd % current(1,h,i,j,k) = t % results(1,score_index) % sum @@ -245,7 +245,7 @@ contains if (i > 1) then matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & (/ i-1, j, k /)) - matching_bins(i_filter_surf) = OUT_RIGHT + matching_bins(i_filter_surf) = RIGHT score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 ! incoming cmfd % current(2,h,i,j,k) = t % results(1,score_index) % sum @@ -255,7 +255,7 @@ contains if (i < nx) then matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & (/ i+1, j, k /) ) - matching_bins(i_filter_surf) = OUT_LEFT + matching_bins(i_filter_surf) = LEFT score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 ! incoming cmfd % current(3,h,i,j,k) = t % results(1,score_index) % sum @@ -263,7 +263,7 @@ contains matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & (/ i, j, k /) ) - matching_bins(i_filter_surf) = OUT_RIGHT + matching_bins(i_filter_surf) = RIGHT score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 ! outgoing cmfd % current(4,h,i,j,k) = t % results(1,score_index) % sum @@ -271,7 +271,7 @@ contains ! Back surface matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & (/ i, j, k /)) - matching_bins(i_filter_surf) = OUT_BACK + matching_bins(i_filter_surf) = BACK score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 ! outgoing cmfd % current(5,h,i,j,k) = t % results(1,score_index) % sum @@ -279,7 +279,7 @@ contains if (j > 1) then matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & (/ i, j-1, k /)) - matching_bins(i_filter_surf) = OUT_FRONT + matching_bins(i_filter_surf) = FRONT score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 ! incoming cmfd % current(6,h,i,j,k) = t % results(1,score_index) % sum @@ -289,7 +289,7 @@ contains if (j < ny) then matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & (/ i, j+1, k /)) - matching_bins(i_filter_surf) = OUT_BACK + matching_bins(i_filter_surf) = BACK score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 ! incoming cmfd % current(7,h,i,j,k) = t % results(1,score_index) % sum @@ -297,7 +297,7 @@ contains matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & (/ i, j, k /)) - matching_bins(i_filter_surf) = OUT_FRONT + matching_bins(i_filter_surf) = FRONT score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 ! outgoing cmfd % current(8,h,i,j,k) = t % results(1,score_index) % sum @@ -305,7 +305,7 @@ contains ! Bottom surface matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & (/ i, j, k /)) - matching_bins(i_filter_surf) = OUT_BOTTOM + matching_bins(i_filter_surf) = BOTTOM score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 ! outgoing cmfd % current(9,h,i,j,k) = t % results(1,score_index) % sum @@ -313,7 +313,7 @@ contains if (k > 1) then matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & (/ i, j, k-1 /)) - matching_bins(i_filter_surf) = OUT_TOP + matching_bins(i_filter_surf) = TOP score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 ! incoming cmfd % current(10,h,i,j,k) = t % results(1,score_index) % sum @@ -323,7 +323,7 @@ contains if (k < nz) then matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & (/ i, j, k+1 /)) - matching_bins(i_filter_surf) = OUT_BOTTOM + matching_bins(i_filter_surf) = BOTTOM score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 ! incoming cmfd % current(11,h,i,j,k) = t % results(1,score_index) % sum @@ -331,7 +331,7 @@ contains matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & (/ i, j, k /)) - matching_bins(i_filter_surf) = OUT_TOP + matching_bins(i_filter_surf) = TOP score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 ! outgoing cmfd % current(12,h,i,j,k) = t % results(1,score_index) % sum diff --git a/src/cmfd_input.F90 b/src/cmfd_input.F90 index 5fe44ad436..77e8f4348c 100644 --- a/src/cmfd_input.F90 +++ b/src/cmfd_input.F90 @@ -534,10 +534,9 @@ contains filt % n_bins = 2 * m % n_dimension allocate(filt % surfaces(2 * m % n_dimension)) if (m % n_dimension == 2) then - filt % surfaces = (/ OUT_LEFT, OUT_RIGHT, OUT_BACK, OUT_FRONT /) + filt % surfaces = (/ LEFT, RIGHT, BACK, FRONT /) elseif (m % n_dimension == 3) then - filt % surfaces = (/ OUT_LEFT, OUT_RIGHT, OUT_BACK, OUT_FRONT, & - OUT_BOTTOM, OUT_TOP /) + filt % surfaces = (/ LEFT, RIGHT, BACK, FRONT, BOTTOM, TOP /) end if end select t % find_filter(FILTER_SURFACE) = n_filters diff --git a/src/constants.F90 b/src/constants.F90 index 6d5f2fc107..ceb68b9e2d 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -359,12 +359,12 @@ module constants ! Tally surface current directions integer, parameter :: & - OUT_LEFT = 1, & ! x min - OUT_RIGHT = 2, & ! x max - OUT_BACK = 3, & ! y min - OUT_FRONT = 4, & ! y max - OUT_BOTTOM = 5, & ! z min - OUT_TOP = 6 ! z max + LEFT = 1, & ! x min + RIGHT = 2, & ! x max + BACK = 3, & ! y min + FRONT = 4, & ! y max + BOTTOM = 5, & ! z min + TOP = 6 ! z max ! Tally trigger types and threshold integer, parameter :: & diff --git a/src/input_xml.F90 b/src/input_xml.F90 index a60d8196ea..8de1983865 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -3701,10 +3701,9 @@ contains filt % n_bins = 2 * m % n_dimension allocate(filt % surfaces(2 * m % n_dimension)) if (m % n_dimension == 2) then - filt % surfaces = (/ OUT_LEFT, OUT_RIGHT, OUT_BACK, OUT_FRONT /) + filt % surfaces = (/ LEFT, RIGHT, BACK, FRONT /) elseif (m % n_dimension == 3) then - filt % surfaces = (/ OUT_LEFT, OUT_RIGHT, OUT_BACK, OUT_FRONT,& - OUT_BOTTOM, OUT_TOP /) + filt % surfaces = (/ LEFT, RIGHT, BACK, FRONT, BOTTOM, TOP /) end if end select t % find_filter(FILTER_SURFACE) = size(t % filters) diff --git a/src/output.F90 b/src/output.F90 index 9e23f11d88..7aacd67136 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1037,66 +1037,66 @@ contains ! Left Surface matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, (/ i, j, k /)) - matching_bins(i_filter_surf) = OUT_LEFT + matching_bins(i_filter_surf) = LEFT filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current to Left", & + "Net Current on Left", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) ! Right Surface matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, (/ i, j, k /)) - matching_bins(i_filter_surf) = OUT_RIGHT + matching_bins(i_filter_surf) = RIGHT filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current to Right", & + "Net Current on Right", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) ! Back Surface matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, (/ i, j, k /)) - matching_bins(i_filter_surf) = OUT_BACK + matching_bins(i_filter_surf) = BACK filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current to Back", & + "Net Current on Back", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) ! Front Surface matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, (/ i, j, k /)) - matching_bins(i_filter_surf) = OUT_FRONT + matching_bins(i_filter_surf) = FRONT filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current to Front", & + "Net Current on Front", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) ! Bottom Surface matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, (/ i, j, k /)) - matching_bins(i_filter_surf) = OUT_BOTTOM + matching_bins(i_filter_surf) = BOTTOM filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current to Bottom", & + "Net Current on Bottom", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) ! Top Surface matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, (/ i, j, k /)) - matching_bins(i_filter_surf) = OUT_TOP + matching_bins(i_filter_surf) = TOP filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Outgoing Current to Top", & + "Net Current on Top", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) end do diff --git a/src/tally.F90 b/src/tally.F90 index 3c3dc6a693..6bb36d9ce1 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -2367,7 +2367,7 @@ contains call get_mesh_indices(m, xyz0, ijk0(:m % n_dimension), start_in_mesh) call get_mesh_indices(m, xyz1, ijk1(:m % n_dimension), end_in_mesh) - ! Check to if start or end is in mesh -- if not, check if track still + ! Check to see if start or end is in mesh -- if not, check if track still ! intersects with mesh if ((.not. start_in_mesh) .and. (.not. end_in_mesh)) then if (m % n_dimension == 2) then @@ -2407,8 +2407,10 @@ contains if (uvw(3) > 0) then do j = ijk0(3), ijk1(3) - 1 ijk0(3) = j + + ! OUT_TOP if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_TOP + matching_bins(i_filter_surf) = TOP matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2417,12 +2419,14 @@ contains t % results(1, filter_index) % value = & t % results(1, filter_index) % value + p % wgt end if - end do - else - do j = ijk0(3), ijk1(3) + 1, -1 - ijk0(3) = j - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_BOTTOM + + ! IN_BOTTOM + if (ijk0(1) >= 1 .and. ijk0(2) >= 1 .and. ijk0(3) >= 0 .and. & + ijk0(1) <= m % dimension(1) .and. & + ijk0(2) <= m % dimension(2) .and. & + ijk0(3) < m % dimension(3)) then + ijk0(3) = ijk0(3) + 1 + matching_bins(i_filter_surf) = BOTTOM matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2430,6 +2434,40 @@ contains !$omp atomic t % results(1, filter_index) % value = & t % results(1, filter_index) % value + p % wgt + ijk0(3) = ijk0(3) - 1 + end if + end do + else + do j = ijk0(3), ijk1(3) + 1, -1 + ijk0(3) = j + + ! OUT_BOTTOM + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then + matching_bins(i_filter_surf) = BOTTOM + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value - p % wgt + end if + + ! IN_TOP + if (ijk0(1) >= 1 .and. ijk0(2) >= 1 .and. ijk0(3) > 1 .and. & + ijk0(1) <= m % dimension(1) .and. & + ijk0(2) <= m % dimension(2) .and. & + ijk0(3) <= m % dimension(3) + 1) then + ijk0(3) = ijk0(3) - 1 + matching_bins(i_filter_surf) = TOP + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value - p % wgt + ijk0(3) = ijk0(3) + 1 end if end do end if @@ -2439,8 +2477,10 @@ contains if (uvw(2) > 0) then do j = ijk0(2), ijk1(2) - 1 ijk0(2) = j + + ! OUT_FRONT if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_FRONT + matching_bins(i_filter_surf) = FRONT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2449,12 +2489,14 @@ contains t % results(1, filter_index) % value = & t % results(1, filter_index) % value + p % wgt end if - end do - else - do j = ijk0(2), ijk1(2) + 1, -1 - ijk0(2) = j - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_BACK + + ! IN_BACK + if (ijk0(1) >= 1 .and. ijk0(2) >= 0 .and. ijk0(3) >= 1 .and. & + ijk0(1) <= m % dimension(1) .and. & + ijk0(2) < m % dimension(2) .and. & + ijk0(3) <= m % dimension(3)) then + ijk0(2) = ijk0(2) + 1 + matching_bins(i_filter_surf) = BACK matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2462,6 +2504,40 @@ contains !$omp atomic t % results(1, filter_index) % value = & t % results(1, filter_index) % value + p % wgt + ijk0(2) = ijk0(2) - 1 + end if + end do + else + do j = ijk0(2), ijk1(2) + 1, -1 + ijk0(2) = j + + ! OUT_BACK + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then + matching_bins(i_filter_surf) = BACK + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value - p % wgt + end if + + ! IN_FRONT + if (ijk0(1) >= 1 .and. ijk0(2) > 1 .and. ijk0(3) >= 1 .and. & + ijk0(1) <= m % dimension(1) .and. & + ijk0(2) <= m % dimension(2) + 1 .and. & + ijk0(3) <= m % dimension(3)) then + ijk0(2) = ijk0(2) - 1 + matching_bins(i_filter_surf) = FRONT + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value - p % wgt + ijk0(2) = ijk0(2) + 1 end if end do end if @@ -2471,8 +2547,10 @@ contains if (uvw(1) > 0) then do j = ijk0(1), ijk1(1) - 1 ijk0(1) = j + + ! OUT_RIGHT if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_RIGHT + matching_bins(i_filter_surf) = RIGHT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2481,12 +2559,14 @@ contains t % results(1, filter_index) % value = & t % results(1, filter_index) % value + p % wgt end if - end do - else - do j = ijk0(1), ijk1(1) + 1, -1 - ijk0(1) = j - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_LEFT + + ! IN_LEFT + if (ijk0(1) >= 0 .and. ijk0(2) >= 1 .and. ijk0(3) >= 1 .and. & + ijk0(1) < m % dimension(1) .and. & + ijk0(2) <= m % dimension(2) .and. & + ijk0(3) <= m % dimension(3)) then + ijk0(1) = ijk0(1) + 1 + matching_bins(i_filter_surf) = LEFT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2494,6 +2574,40 @@ contains !$omp atomic t % results(1, filter_index) % value = & t % results(1, filter_index) % value + p % wgt + ijk0(1) = ijk0(1) - 1 + end if + end do + else + do j = ijk0(1), ijk1(1) + 1, -1 + ijk0(1) = j + + ! OUT_LEFT + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then + matching_bins(i_filter_surf) = LEFT + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value - p % wgt + end if + + ! IN_RIGHT + if (ijk0(1) > 1 .and. ijk0(2) >= 1 .and. ijk0(3) >= 1 .and. & + ijk0(1) <= m % dimension(1) + 1 .and. & + ijk0(2) <= m % dimension(2) .and. & + ijk0(3) <= m % dimension(3)) then + ijk0(1) = ijk0(1) - 1 + matching_bins(i_filter_surf) = RIGHT + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value - p % wgt + ijk0(1) = ijk0(1) + 1 end if end do end if @@ -2533,94 +2647,215 @@ contains distance = minval(d) - ! Now use the minimum distance and diretion of the particle to + ! Now use the minimum distance and direction of the particle to ! determine which surface was crossed if (distance == d(1)) then if (uvw(1) > 0) then - ! Crossing into right mesh cell -- this is treated as outgoing - ! current from (i,j,k) + + ! OUT_RIGHT if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_RIGHT + matching_bins(i_filter_surf) = RIGHT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt end if + + ! IN_LEFT + if (ijk0(1) >= 0 .and. ijk0(2) >= 1 .and. ijk0(3) >= 1 .and. & + ijk0(1) < m % dimension(1) .and. & + ijk0(2) <= m % dimension(2) .and. & + ijk0(3) <= m % dimension(3)) then + ijk0(1) = ijk0(1) + 1 + matching_bins(i_filter_surf) = LEFT + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt + ijk0(1) = ijk0(1) - 1 + end if + ijk0(1) = ijk0(1) + 1 xyz_cross(1) = xyz_cross(1) + m % width(1) else - ! Crossing into left mesh cell -- this is treated as outgoing - ! current in (i,j,k) + + ! OUT_LEFT if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_LEFT + matching_bins(i_filter_surf) = LEFT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value - p % wgt end if + + ! IN_RIGHT + if (ijk0(1) > 1 .and. ijk0(2) >= 1 .and. ijk0(3) >= 1 .and. & + ijk0(1) <= m % dimension(1) + 1 .and. & + ijk0(2) <= m % dimension(2) .and. & + ijk0(3) <= m % dimension(3)) then + ijk0(1) = ijk0(1) - 1 + matching_bins(i_filter_surf) = RIGHT + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value - p % wgt + ijk0(1) = ijk0(1) + 1 + end if + ijk0(1) = ijk0(1) - 1 xyz_cross(1) = xyz_cross(1) - m % width(1) end if elseif (distance == d(2)) then if (uvw(2) > 0) then - ! Crossing into front mesh cell -- this is treated as outgoing - ! current in (i,j,k) + + ! OUT_FRONT if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_FRONT + matching_bins(i_filter_surf) = FRONT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt end if + + ! IN_BACK + if (ijk0(1) >= 1 .and. ijk0(2) >= 0 .and. ijk0(3) >= 1 .and. & + ijk0(1) <= m % dimension(1) .and. & + ijk0(2) < m % dimension(2) .and. & + ijk0(3) <= m % dimension(3)) then + ijk0(2) = ijk0(2) + 1 + matching_bins(i_filter_surf) = BACK + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt + ijk0(2) = ijk0(2) - 1 + end if + ijk0(2) = ijk0(2) + 1 xyz_cross(2) = xyz_cross(2) + m % width(2) else - ! Crossing into back mesh cell -- this is treated as outgoing - ! current in (i,j,k) + + ! OUT_BACK if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_BACK + matching_bins(i_filter_surf) = BACK matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value - p % wgt end if + + ! IN_FRONT + if (ijk0(1) >= 1 .and. ijk0(2) > 1 .and. ijk0(3) >= 1 .and. & + ijk0(1) <= m % dimension(1) .and. & + ijk0(2) <= m % dimension(2) + 1 .and. & + ijk0(3) <= m % dimension(3)) then + ijk0(2) = ijk0(2) - 1 + matching_bins(i_filter_surf) = FRONT + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value - p % wgt + ijk0(2) = ijk0(2) + 1 + end if + ijk0(2) = ijk0(2) - 1 xyz_cross(2) = xyz_cross(2) - m % width(2) end if else if (distance == d(3)) then if (uvw(3) > 0) then - ! Crossing into top mesh cell -- this is treated as outgoing - ! current in (i,j,k) + + ! OUT_TOP if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_TOP + matching_bins(i_filter_surf) = TOP matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt end if + + ! IN_BOTTOM + if (ijk0(1) >= 1 .and. ijk0(2) >= 1 .and. ijk0(3) >= 0 .and. & + ijk0(1) <= m % dimension(1) .and. & + ijk0(2) <= m % dimension(2) .and. & + ijk0(3) < m % dimension(3)) then + ijk0(3) = ijk0(3) + 1 + matching_bins(i_filter_surf) = BOTTOM + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt + ijk0(3) = ijk0(3) - 1 + end if + ijk0(3) = ijk0(3) + 1 xyz_cross(3) = xyz_cross(3) + m % width(3) else - ! Crossing into bottom mesh cell -- this is treated as outgoing - ! current in (i,j,k) + + ! OUT_BOTTOM if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_BOTTOM + matching_bins(i_filter_surf) = BOTTOM matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value - p % wgt end if + + ! IN_TOP + if (ijk0(1) >= 1 .and. ijk0(2) >= 1 .and. ijk0(3) > 1 .and. & + ijk0(1) <= m % dimension(1) .and. & + ijk0(2) <= m % dimension(2) .and. & + ijk0(3) <= m % dimension(3) + 1) then + ijk0(3) = ijk0(3) - 1 + matching_bins(i_filter_surf) = TOP + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value - p % wgt + ijk0(3) = ijk0(3) + 1 + end if + ijk0(3) = ijk0(3) - 1 xyz_cross(3) = xyz_cross(3) - m % width(3) end if end if - ! Determine scoring index - if (matching_bins(i_filter_surf) > 0) then - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 - - ! Check for errors - if (filter_index <= 0 .or. filter_index > & - t % total_filter_bins) then - call fatal_error("Score index outside range.") - end if - - ! Add to surface current tally -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if - ! Calculate new coordinates xyz0 = xyz0 + distance * uvw end do diff --git a/src/trigger.F90 b/src/trigger.F90 index 4af03a2dea..6f886cd8e0 100644 --- a/src/trigger.F90 +++ b/src/trigger.F90 @@ -332,7 +332,7 @@ contains mesh_indices_to_bin(m, (/ i, j, k /)) ! Left Surface - matching_bins(i_filter_surf) = OUT_LEFT + matching_bins(i_filter_surf) = LEFT filter_index = & sum((matching_bins(1:size(t % filters)) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) @@ -345,7 +345,7 @@ contains trigger % variance = std_dev**2 ! Right Surface - matching_bins(i_filter_surf) = OUT_RIGHT + matching_bins(i_filter_surf) = RIGHT filter_index = & sum((matching_bins(1:size(t % filters)) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) @@ -358,7 +358,7 @@ contains trigger % variance = trigger % std_dev**2 ! Back Surface - matching_bins(i_filter_surf) = OUT_BACK + matching_bins(i_filter_surf) = BACK filter_index = & sum((matching_bins(1:size(t % filters)) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) @@ -371,7 +371,7 @@ contains trigger % variance = trigger % std_dev**2 ! Front Surface - matching_bins(i_filter_surf) = OUT_FRONT + matching_bins(i_filter_surf) = FRONT filter_index = & sum((matching_bins(1:size(t % filters)) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) @@ -384,7 +384,7 @@ contains trigger % variance = trigger % std_dev**2 ! Bottom Surface - matching_bins(i_filter_surf) = OUT_BOTTOM + matching_bins(i_filter_surf) = BOTTOM filter_index = & sum((matching_bins(1:size(t % filters)) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) @@ -397,7 +397,7 @@ contains trigger % variance = trigger % std_dev**2 ! Top Surface - matching_bins(i_filter_surf) = OUT_TOP + matching_bins(i_filter_surf) = TOP filter_index = & sum((matching_bins(1:size(t % filters)) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) From 75a7986bb792115295a55ee6f25b40dec962b76e Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 23 Aug 2016 06:26:20 -0500 Subject: [PATCH 113/168] Make ASCII logo a little smaller --- src/output.F90 | 55 ++++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/src/output.F90 b/src/output.F90 index 29950a0bc2..dc007aab61 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -38,37 +38,30 @@ contains use omp_lib #endif - write(UNIT=OUTPUT_UNIT, FMT='(/29(A/))') & - ' %%%%%%%%%%%%%%%%%%', & - ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' ################### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' ###################### %%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' ####################### %%%%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' ######################## %%%%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' ######################### %%%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' ########################## %%%%%%%%%%%%%%%%%%%%%%%%%%', & - ' ############################ %%%%%%%%%%%%%%%%%%%%%%%%', & - ' ############################# %%%%%%%%%%%%%%%%%%%%%%%', & - ' ############################## %%%%%%%%%%%%%%%%%%%%%', & - ' ############################# %%%%%%%%%%%%%%%%%%%%', & - ' ########################### %%%%%%%%%%%%%%%%%%%%', & - ' ######################### %%%%%%%%%%%%%%%%%%%%%', & - ' ###################### %%%%%%%%%%%%%%%%%%%%%', & - ' #################### %%%%%%%%%%%%%%%%%%%%%', & - ' ################# %%%%%%%%%%%%%%%%%%%%', & - ' ############## %%%%%%%%%%%%%%%%%%%', & - ' ########### %%%%%%%%%%%%%%%%%%', & - ' ####### %%%%%%%%%%%%%%%%', & - ' %%%%%%%%%%%%%%' - + write(UNIT=OUTPUT_UNIT, FMT='(/23(A/))') & + ' %%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%%%%%%%%%%%%%', & + ' ############### %%%%%%%%%%%%%%%%%%%%%%%%', & + ' ################## %%%%%%%%%%%%%%%%%%%%%%%', & + ' ################### %%%%%%%%%%%%%%%%%%%%%%%', & + ' #################### %%%%%%%%%%%%%%%%%%%%%%', & + ' ##################### %%%%%%%%%%%%%%%%%%%%%', & + ' ###################### %%%%%%%%%%%%%%%%%%%%', & + ' ####################### %%%%%%%%%%%%%%%%%%', & + ' ######################## %%%%%%%%%%%%%%%%%', & + ' ###################### %%%%%%%%%%%%%%%%%', & + ' #################### %%%%%%%%%%%%%%%%%', & + ' ################# %%%%%%%%%%%%%%%%%', & + ' ############## %%%%%%%%%%%%%%%%', & + ' ########### %%%%%%%%%%%%%%%', & + ' ####### %%%%%%%%%%%%%%', & + ' %%%%%%%%%%%%' ! Write version information write(UNIT=OUTPUT_UNIT, FMT=*) & From 6b64cc7783e86fd3c2bc993921ca40a9e06dd8df Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 23 Aug 2016 10:23:52 -0500 Subject: [PATCH 114/168] Add SVG version of logo (thanks @samuelshaner!) --- docs/source/_images/openmc_logo.svg | 60 +++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 docs/source/_images/openmc_logo.svg diff --git a/docs/source/_images/openmc_logo.svg b/docs/source/_images/openmc_logo.svg new file mode 100644 index 0000000000..a7352b79ab --- /dev/null +++ b/docs/source/_images/openmc_logo.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + From 93862cea249e4441beb714e719120da3bd2b7d0a Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 23 Aug 2016 11:33:23 -0400 Subject: [PATCH 115/168] changed current tallying so in/out partial currents are tallies separately --- src/cmfd_data.F90 | 122 ++++++++++++++++---------------------------- src/cmfd_header.F90 | 2 +- src/cmfd_input.F90 | 7 ++- src/constants.F90 | 18 ++++--- src/input_xml.F90 | 11 ++-- src/output.F90 | 85 +++++++++++++++++++++++++----- src/tally.F90 | 72 +++++++++++++------------- src/trigger.F90 | 12 ++--- 8 files changed, 185 insertions(+), 144 deletions(-) diff --git a/src/cmfd_data.F90 b/src/cmfd_data.F90 index 0a1490bb97..befdc9c465 100644 --- a/src/cmfd_data.F90 +++ b/src/cmfd_data.F90 @@ -51,8 +51,9 @@ contains subroutine compute_xs() use constants, only: FILTER_MESH, FILTER_ENERGYIN, FILTER_ENERGYOUT, & - FILTER_SURFACE, LEFT, RIGHT, BACK, & - FRONT, BOTTOM, TOP, CMFD_NOACCEL, & + FILTER_SURFACE, OUT_LEFT, OUT_RIGHT, OUT_BACK, & + OUT_FRONT, OUT_BOTTOM, OUT_TOP, IN_LEFT, IN_RIGHT, & + IN_BACK, IN_FRONT, IN_BOTTOM, IN_TOP, CMFD_NOACCEL, & ZERO, ONE, TINY_BIT use error, only: fatal_error use global, only: cmfd, n_cmfd_tallies, cmfd_tallies, meshes,& @@ -234,106 +235,74 @@ contains matching_bins(i_filter_ein) = ng - h + 1 end if - ! Left surface + ! Get the bin for this mesh cell matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & (/ i, j, k /)) - matching_bins(i_filter_surf) = LEFT + + ! Left surface + matching_bins(i_filter_surf) = OUT_LEFT score_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t%stride) + 1 ! outgoing + * t % stride) + 1 cmfd % current(1,h,i,j,k) = t % results(1,score_index) % sum - if (i > 1) then - matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i-1, j, k /)) - matching_bins(i_filter_surf) = RIGHT - score_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 ! incoming - cmfd % current(2,h,i,j,k) = t % results(1,score_index) % sum - end if + matching_bins(i_filter_surf) = IN_LEFT + score_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 + cmfd % current(2,h,i,j,k) = t % results(1,score_index) % sum ! Right surface - if (i < nx) then - matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i+1, j, k /) ) - matching_bins(i_filter_surf) = LEFT - score_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 ! incoming - cmfd % current(3,h,i,j,k) = t % results(1,score_index) % sum - end if - - matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i, j, k /) ) - matching_bins(i_filter_surf) = RIGHT + matching_bins(i_filter_surf) = OUT_RIGHT score_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 ! outgoing + * t % stride) + 1 + cmfd % current(3,h,i,j,k) = t % results(1,score_index) % sum + + matching_bins(i_filter_surf) = IN_RIGHT + score_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 cmfd % current(4,h,i,j,k) = t % results(1,score_index) % sum ! Back surface - matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i, j, k /)) - matching_bins(i_filter_surf) = BACK + matching_bins(i_filter_surf) = OUT_BACK score_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 ! outgoing + * t % stride) + 1 cmfd % current(5,h,i,j,k) = t % results(1,score_index) % sum - if (j > 1) then - matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i, j-1, k /)) - matching_bins(i_filter_surf) = FRONT - score_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 ! incoming - cmfd % current(6,h,i,j,k) = t % results(1,score_index) % sum - end if + matching_bins(i_filter_surf) = IN_BACK + score_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 + cmfd % current(6,h,i,j,k) = t % results(1,score_index) % sum ! Front surface - if (j < ny) then - matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i, j+1, k /)) - matching_bins(i_filter_surf) = BACK - score_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 ! incoming - cmfd % current(7,h,i,j,k) = t % results(1,score_index) % sum - end if - - matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i, j, k /)) - matching_bins(i_filter_surf) = FRONT + matching_bins(i_filter_surf) = OUT_FRONT score_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 ! outgoing + * t % stride) + 1 + cmfd % current(7,h,i,j,k) = t % results(1,score_index) % sum + + matching_bins(i_filter_surf) = IN_FRONT + score_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 cmfd % current(8,h,i,j,k) = t % results(1,score_index) % sum ! Bottom surface - matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i, j, k /)) - matching_bins(i_filter_surf) = BOTTOM + matching_bins(i_filter_surf) = OUT_BOTTOM score_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 ! outgoing + * t % stride) + 1 cmfd % current(9,h,i,j,k) = t % results(1,score_index) % sum - if (k > 1) then - matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i, j, k-1 /)) - matching_bins(i_filter_surf) = TOP - score_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 ! incoming - cmfd % current(10,h,i,j,k) = t % results(1,score_index) % sum - end if + matching_bins(i_filter_surf) = IN_BOTTOM + score_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 + cmfd % current(10,h,i,j,k) = t % results(1,score_index) % sum ! Top surface - if (k < nz) then - matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i, j, k+1 /)) - matching_bins(i_filter_surf) = BOTTOM - score_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 ! incoming - cmfd % current(11,h,i,j,k) = t % results(1,score_index) % sum - end if - - matching_bins(i_filter_mesh) = mesh_indices_to_bin(m, & - (/ i, j, k /)) - matching_bins(i_filter_surf) = TOP + matching_bins(i_filter_surf) = OUT_TOP score_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 ! outgoing + * t % stride) + 1 + cmfd % current(11,h,i,j,k) = t % results(1,score_index) % sum + + matching_bins(i_filter_surf) = IN_TOP + score_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 cmfd % current(12,h,i,j,k) = t % results(1,score_index) % sum end if TALLY @@ -478,7 +447,6 @@ contains ! Get leakage leakage = ZERO LEAK: do l = 1, 3 - leakage = leakage + ((cmfd % current(4*l,g,i,j,k) - & cmfd % current(4*l-1,g,i,j,k))) - & ((cmfd % current(4*l-2,g,i,j,k) - & diff --git a/src/cmfd_header.F90 b/src/cmfd_header.F90 index e743cc928e..7d253c3081 100644 --- a/src/cmfd_header.F90 +++ b/src/cmfd_header.F90 @@ -126,7 +126,7 @@ contains if (.not. allocated(this % hxyz)) allocate(this % hxyz(3,nx,ny,nz)) ! Allocate surface currents - if (.not. allocated(this % current)) allocate(this % current(12,ng,nx,ny,nz)) + if (.not. allocated(this % current)) allocate(this % current(6,ng,nx,ny,nz)) ! Allocate source distributions if (.not. allocated(this % cmfd_src)) allocate(this % cmfd_src(ng,nx,ny,nz)) diff --git a/src/cmfd_input.F90 b/src/cmfd_input.F90 index 77e8f4348c..50f078a182 100644 --- a/src/cmfd_input.F90 +++ b/src/cmfd_input.F90 @@ -534,9 +534,12 @@ contains filt % n_bins = 2 * m % n_dimension allocate(filt % surfaces(2 * m % n_dimension)) if (m % n_dimension == 2) then - filt % surfaces = (/ LEFT, RIGHT, BACK, FRONT /) + filt % surfaces = (/ OUT_LEFT, OUT_RIGHT, OUT_BACK, OUT_FRONT, & + IN_LEFT, IN_RIGHT, IN_BACK, IN_FRONT /) elseif (m % n_dimension == 3) then - filt % surfaces = (/ LEFT, RIGHT, BACK, FRONT, BOTTOM, TOP /) + filt % surfaces = (/ OUT_LEFT, OUT_RIGHT, OUT_BACK, OUT_FRONT, & + OUT_BOTTOM, OUT_TOP, IN_LEFT, IN_RIGHT, IN_BACK, IN_FRONT, & + IN_BOTTOM, IN_TOP /) end if end select t % find_filter(FILTER_SURFACE) = n_filters diff --git a/src/constants.F90 b/src/constants.F90 index ceb68b9e2d..481ca8e033 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -359,12 +359,18 @@ module constants ! Tally surface current directions integer, parameter :: & - LEFT = 1, & ! x min - RIGHT = 2, & ! x max - BACK = 3, & ! y min - FRONT = 4, & ! y max - BOTTOM = 5, & ! z min - TOP = 6 ! z max + OUT_LEFT = 1, & ! x min + OUT_RIGHT = 2, & ! x max + OUT_BACK = 3, & ! y min + OUT_FRONT = 4, & ! y max + OUT_BOTTOM = 5, & ! z min + OUT_TOP = 6, & ! z max + IN_LEFT = 7, & ! x min + IN_RIGHT = 8, & ! x max + IN_BACK = 9, & ! y min + IN_FRONT = 10, & ! y max + IN_BOTTOM = 11, & ! z min + IN_TOP = 12 ! z max ! Tally trigger types and threshold integer, parameter :: & diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 8de1983865..bcdf310e80 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -3698,12 +3698,15 @@ contains allocate(SurfaceFilter :: t % filters(n_filters) % obj) select type (filt => t % filters(size(t % filters)) % obj) type is (SurfaceFilter) - filt % n_bins = 2 * m % n_dimension - allocate(filt % surfaces(2 * m % n_dimension)) + filt % n_bins = 4 * m % n_dimension + allocate(filt % surfaces(4 * m % n_dimension)) if (m % n_dimension == 2) then - filt % surfaces = (/ LEFT, RIGHT, BACK, FRONT /) + filt % surfaces = (/ OUT_LEFT, OUT_RIGHT, OUT_BACK, OUT_FRONT, & + IN_LEFT, IN_RIGHT, IN_BACK, IN_FRONT /) elseif (m % n_dimension == 3) then - filt % surfaces = (/ LEFT, RIGHT, BACK, FRONT, BOTTOM, TOP /) + filt % surfaces = (/ OUT_LEFT, OUT_RIGHT, OUT_BACK, OUT_FRONT, & + OUT_BOTTOM, OUT_TOP, IN_LEFT, IN_RIGHT, IN_BACK, & + IN_FRONT, IN_BOTTOM, IN_TOP /) end if end select t % find_filter(FILTER_SURFACE) = size(t % filters) diff --git a/src/output.F90 b/src/output.F90 index 7aacd67136..eae6547872 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1034,43 +1034,85 @@ contains matching_bins(i_filter_ein))) end if + ! Get the bin for this mesh cell + ! Left Surface matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, (/ i, j, k /)) - matching_bins(i_filter_surf) = LEFT + matching_bins(i_filter_surf) = OUT_LEFT filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Net Current on Left", & + "Outgoing Current on Left", & + to_str(t % results(1,filter_index) % sum), & + trim(to_str(t % results(1,filter_index) % sum_sq)) + + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, (/ i, j, k /)) + matching_bins(i_filter_surf) = IN_LEFT + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & + "Incoming Current on Left", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) ! Right Surface matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, (/ i, j, k /)) - matching_bins(i_filter_surf) = RIGHT + matching_bins(i_filter_surf) = OUT_RIGHT filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Net Current on Right", & + "Outgoing Current on Right", & + to_str(t % results(1,filter_index) % sum), & + trim(to_str(t % results(1,filter_index) % sum_sq)) + + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, (/ i, j, k /)) + matching_bins(i_filter_surf) = IN_RIGHT + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & + "Incoming Current on Right", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) ! Back Surface matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, (/ i, j, k /)) - matching_bins(i_filter_surf) = BACK + matching_bins(i_filter_surf) = OUT_BACK filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Net Current on Back", & + "Outgoing Current on Back", & + to_str(t % results(1,filter_index) % sum), & + trim(to_str(t % results(1,filter_index) % sum_sq)) + + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, (/ i, j, k /)) + matching_bins(i_filter_surf) = IN_BACK + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & + "Incoming Current on Back", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) ! Front Surface matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, (/ i, j, k /)) - matching_bins(i_filter_surf) = FRONT + matching_bins(i_filter_surf) = OUT_FRONT + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & + "Net Current on Front", & + to_str(t % results(1,filter_index) % sum), & + trim(to_str(t % results(1,filter_index) % sum_sq)) + + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, (/ i, j, k /)) + matching_bins(i_filter_surf) = IN_FRONT filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & @@ -1081,26 +1123,45 @@ contains ! Bottom Surface matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, (/ i, j, k /)) - matching_bins(i_filter_surf) = BOTTOM + matching_bins(i_filter_surf) = OUT_BOTTOM filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Net Current on Bottom", & + "Outgoing Current on Bottom", & + to_str(t % results(1,filter_index) % sum), & + trim(to_str(t % results(1,filter_index) % sum_sq)) + + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, (/ i, j, k /)) + matching_bins(i_filter_surf) = IN_BOTTOM + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & + "Incoming Current on Bottom", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) ! Top Surface matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, (/ i, j, k /)) - matching_bins(i_filter_surf) = TOP + matching_bins(i_filter_surf) = OUT_TOP filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & - "Net Current on Top", & + "Outgoing Current on Top", & + to_str(t % results(1,filter_index) % sum), & + trim(to_str(t % results(1,filter_index) % sum_sq)) + + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, (/ i, j, k /)) + matching_bins(i_filter_surf) = IN_TOP + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 + write(UNIT=unit_tally, FMT='(5X,A,T35,A,"+/- ",A)') & + "Incoming Current on Top", & to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) end do - end do end do end do diff --git a/src/tally.F90 b/src/tally.F90 index 6bb36d9ce1..7f743d134b 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -2410,7 +2410,7 @@ contains ! OUT_TOP if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = TOP + matching_bins(i_filter_surf) = OUT_TOP matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2426,7 +2426,7 @@ contains ijk0(2) <= m % dimension(2) .and. & ijk0(3) < m % dimension(3)) then ijk0(3) = ijk0(3) + 1 - matching_bins(i_filter_surf) = BOTTOM + matching_bins(i_filter_surf) = IN_BOTTOM matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2443,14 +2443,14 @@ contains ! OUT_BOTTOM if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = BOTTOM + matching_bins(i_filter_surf) = OUT_BOTTOM matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & - t % results(1, filter_index) % value - p % wgt + t % results(1, filter_index) % value + p % wgt end if ! IN_TOP @@ -2459,14 +2459,14 @@ contains ijk0(2) <= m % dimension(2) .and. & ijk0(3) <= m % dimension(3) + 1) then ijk0(3) = ijk0(3) - 1 - matching_bins(i_filter_surf) = TOP + matching_bins(i_filter_surf) = IN_TOP matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & - t % results(1, filter_index) % value - p % wgt + t % results(1, filter_index) % value + p % wgt ijk0(3) = ijk0(3) + 1 end if end do @@ -2480,7 +2480,7 @@ contains ! OUT_FRONT if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = FRONT + matching_bins(i_filter_surf) = OUT_FRONT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2496,7 +2496,7 @@ contains ijk0(2) < m % dimension(2) .and. & ijk0(3) <= m % dimension(3)) then ijk0(2) = ijk0(2) + 1 - matching_bins(i_filter_surf) = BACK + matching_bins(i_filter_surf) = IN_BACK matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2513,14 +2513,14 @@ contains ! OUT_BACK if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = BACK + matching_bins(i_filter_surf) = OUT_BACK matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & - t % results(1, filter_index) % value - p % wgt + t % results(1, filter_index) % value + p % wgt end if ! IN_FRONT @@ -2529,14 +2529,14 @@ contains ijk0(2) <= m % dimension(2) + 1 .and. & ijk0(3) <= m % dimension(3)) then ijk0(2) = ijk0(2) - 1 - matching_bins(i_filter_surf) = FRONT + matching_bins(i_filter_surf) = IN_FRONT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & - t % results(1, filter_index) % value - p % wgt + t % results(1, filter_index) % value + p % wgt ijk0(2) = ijk0(2) + 1 end if end do @@ -2550,7 +2550,7 @@ contains ! OUT_RIGHT if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = RIGHT + matching_bins(i_filter_surf) = OUT_RIGHT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2566,7 +2566,7 @@ contains ijk0(2) <= m % dimension(2) .and. & ijk0(3) <= m % dimension(3)) then ijk0(1) = ijk0(1) + 1 - matching_bins(i_filter_surf) = LEFT + matching_bins(i_filter_surf) = IN_LEFT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2583,14 +2583,14 @@ contains ! OUT_LEFT if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = LEFT + matching_bins(i_filter_surf) = OUT_LEFT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & - t % results(1, filter_index) % value - p % wgt + t % results(1, filter_index) % value + p % wgt end if ! IN_RIGHT @@ -2599,14 +2599,14 @@ contains ijk0(2) <= m % dimension(2) .and. & ijk0(3) <= m % dimension(3)) then ijk0(1) = ijk0(1) - 1 - matching_bins(i_filter_surf) = RIGHT + matching_bins(i_filter_surf) = IN_RIGHT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & - t % results(1, filter_index) % value - p % wgt + t % results(1, filter_index) % value + p % wgt ijk0(1) = ijk0(1) + 1 end if end do @@ -2655,7 +2655,7 @@ contains ! OUT_RIGHT if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = RIGHT + matching_bins(i_filter_surf) = OUT_RIGHT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2671,7 +2671,7 @@ contains ijk0(2) <= m % dimension(2) .and. & ijk0(3) <= m % dimension(3)) then ijk0(1) = ijk0(1) + 1 - matching_bins(i_filter_surf) = LEFT + matching_bins(i_filter_surf) = IN_LEFT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2688,14 +2688,14 @@ contains ! OUT_LEFT if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = LEFT + matching_bins(i_filter_surf) = OUT_LEFT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & - t % results(1, filter_index) % value - p % wgt + t % results(1, filter_index) % value + p % wgt end if ! IN_RIGHT @@ -2704,14 +2704,14 @@ contains ijk0(2) <= m % dimension(2) .and. & ijk0(3) <= m % dimension(3)) then ijk0(1) = ijk0(1) - 1 - matching_bins(i_filter_surf) = RIGHT + matching_bins(i_filter_surf) = IN_RIGHT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & - t % results(1, filter_index) % value - p % wgt + t % results(1, filter_index) % value + p % wgt ijk0(1) = ijk0(1) + 1 end if @@ -2723,7 +2723,7 @@ contains ! OUT_FRONT if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = FRONT + matching_bins(i_filter_surf) = OUT_FRONT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2739,7 +2739,7 @@ contains ijk0(2) < m % dimension(2) .and. & ijk0(3) <= m % dimension(3)) then ijk0(2) = ijk0(2) + 1 - matching_bins(i_filter_surf) = BACK + matching_bins(i_filter_surf) = IN_BACK matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2756,14 +2756,14 @@ contains ! OUT_BACK if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = BACK + matching_bins(i_filter_surf) = OUT_BACK matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & - t % results(1, filter_index) % value - p % wgt + t % results(1, filter_index) % value + p % wgt end if ! IN_FRONT @@ -2772,14 +2772,14 @@ contains ijk0(2) <= m % dimension(2) + 1 .and. & ijk0(3) <= m % dimension(3)) then ijk0(2) = ijk0(2) - 1 - matching_bins(i_filter_surf) = FRONT + matching_bins(i_filter_surf) = IN_FRONT matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & - t % results(1, filter_index) % value - p % wgt + t % results(1, filter_index) % value + p % wgt ijk0(2) = ijk0(2) + 1 end if @@ -2791,7 +2791,7 @@ contains ! OUT_TOP if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = TOP + matching_bins(i_filter_surf) = OUT_TOP matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2807,7 +2807,7 @@ contains ijk0(2) <= m % dimension(2) .and. & ijk0(3) < m % dimension(3)) then ijk0(3) = ijk0(3) + 1 - matching_bins(i_filter_surf) = BOTTOM + matching_bins(i_filter_surf) = IN_BOTTOM matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & @@ -2824,14 +2824,14 @@ contains ! OUT_BOTTOM if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = BOTTOM + matching_bins(i_filter_surf) = OUT_BOTTOM matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & - t % results(1, filter_index) % value - p % wgt + t % results(1, filter_index) % value + p % wgt end if ! IN_TOP @@ -2840,14 +2840,14 @@ contains ijk0(2) <= m % dimension(2) .and. & ijk0(3) <= m % dimension(3) + 1) then ijk0(3) = ijk0(3) - 1 - matching_bins(i_filter_surf) = TOP + matching_bins(i_filter_surf) = IN_TOP matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 !$omp atomic t % results(1, filter_index) % value = & - t % results(1, filter_index) % value - p % wgt + t % results(1, filter_index) % value + p % wgt ijk0(3) = ijk0(3) + 1 end if diff --git a/src/trigger.F90 b/src/trigger.F90 index 6f886cd8e0..4af03a2dea 100644 --- a/src/trigger.F90 +++ b/src/trigger.F90 @@ -332,7 +332,7 @@ contains mesh_indices_to_bin(m, (/ i, j, k /)) ! Left Surface - matching_bins(i_filter_surf) = LEFT + matching_bins(i_filter_surf) = OUT_LEFT filter_index = & sum((matching_bins(1:size(t % filters)) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) @@ -345,7 +345,7 @@ contains trigger % variance = std_dev**2 ! Right Surface - matching_bins(i_filter_surf) = RIGHT + matching_bins(i_filter_surf) = OUT_RIGHT filter_index = & sum((matching_bins(1:size(t % filters)) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) @@ -358,7 +358,7 @@ contains trigger % variance = trigger % std_dev**2 ! Back Surface - matching_bins(i_filter_surf) = BACK + matching_bins(i_filter_surf) = OUT_BACK filter_index = & sum((matching_bins(1:size(t % filters)) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) @@ -371,7 +371,7 @@ contains trigger % variance = trigger % std_dev**2 ! Front Surface - matching_bins(i_filter_surf) = FRONT + matching_bins(i_filter_surf) = OUT_FRONT filter_index = & sum((matching_bins(1:size(t % filters)) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) @@ -384,7 +384,7 @@ contains trigger % variance = trigger % std_dev**2 ! Bottom Surface - matching_bins(i_filter_surf) = BOTTOM + matching_bins(i_filter_surf) = OUT_BOTTOM filter_index = & sum((matching_bins(1:size(t % filters)) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) @@ -397,7 +397,7 @@ contains trigger % variance = trigger % std_dev**2 ! Top Surface - matching_bins(i_filter_surf) = TOP + matching_bins(i_filter_surf) = OUT_TOP filter_index = & sum((matching_bins(1:size(t % filters)) - 1) * t % stride) + 1 call get_trigger_uncertainty(std_dev, rel_err, 1, filter_index, t) From ba42547eb3a0bb06c83094f5b21f26530eaf3098 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 23 Aug 2016 15:26:24 -0400 Subject: [PATCH 116/168] added tally-arithmetic.ipynb with six-factor formula --- .../pythonapi/examples/tally-arithmetic.ipynb | 533 ++++++++++++------ openmc/filter.py | 18 +- 2 files changed, 360 insertions(+), 191 deletions(-) diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index dfd493f168..088af07b30 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -136,8 +136,8 @@ "max_x = openmc.XPlane(x0=+0.63, boundary_type='reflective')\n", "min_y = openmc.YPlane(y0=-0.63, boundary_type='reflective')\n", "max_y = openmc.YPlane(y0=+0.63, boundary_type='reflective')\n", - "min_z = openmc.ZPlane(z0=-0.63, boundary_type='reflective')\n", - "max_z = openmc.ZPlane(z0=+0.63, boundary_type='reflective')" + "min_z = openmc.ZPlane(z0=-100., boundary_type='vacuum')\n", + "max_z = openmc.ZPlane(z0=+100., boundary_type='vacuum')" ] }, { @@ -264,7 +264,7 @@ "settings_file.output = {'tallies': True}\n", "\n", "# Create an initial uniform spatial source distribution over fissionable zones\n", - "bounds = [-0.63, -0.63, -0.63, 0.63, 0.63, 0.63]\n", + "bounds = [-0.63, -0.63, -100., 0.63, 0.63, 100.]\n", "uniform_dist = openmc.stats.Box(bounds[:3], bounds[3:], only_fissionable=True)\n", "settings_file.source = openmc.source.Source(space=uniform_dist)\n", "\n", @@ -339,7 +339,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AHFwInLqDpadAAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMjJUMjE6Mzk6\nNDYtMDU6MDBOOEOsAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTIyVDIxOjM5OjQ2LTA1OjAw\nP2X7EAAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIFw8YNfjajoIAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDgtMjNUMTU6MjQ6\nNTMtMDQ6MDANSReSAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA4LTIzVDE1OjI0OjUzLTA0OjAw\nfBSvLgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -410,7 +410,32 @@ "tally.filters.append(energy_filter)\n", "tally.scores = ['absorption', 'total']\n", "tally.nuclides = [o16, h1]\n", - "tallies_file.append(tally)" + "tallies_file.append(tally)\n", + "\n", + "# Instantiate a tally mesh \n", + "mesh = openmc.Mesh(mesh_id=1)\n", + "mesh.type = 'regular'\n", + "mesh.dimension = [1, 1, 1]\n", + "mesh.lower_left = [-0.63, -0.63, -100.]\n", + "mesh.width = [1.26, 1.26, 200.]\n", + "mesh_filter = openmc.Filter(type='mesh', bins=[mesh.id])\n", + "mesh_filter.mesh = mesh\n", + "\n", + "# Instantiate thermal, fast, and total leakage tallies\n", + "leak = openmc.Tally(name='leakage')\n", + "leak.filters = [mesh_filter]\n", + "leak.scores = ['current']\n", + "tallies_file.append(leak)\n", + "\n", + "thermal_leak = openmc.Tally(name='thermal leakage')\n", + "thermal_leak.filters = [mesh_filter, openmc.Filter(type='energy', bins=[0., 0.625e-6])]\n", + "thermal_leak.scores = ['current']\n", + "tallies_file.append(thermal_leak)\n", + "\n", + "fast_leak = openmc.Tally(name='fast leakage')\n", + "fast_leak.filters = [mesh_filter, openmc.Filter(type='energy', bins=[0.625e-6, 20.])]\n", + "fast_leak.scores = ['current']\n", + "tallies_file.append(fast_leak)" ] }, { @@ -484,12 +509,12 @@ "outputs": [], "source": [ "# Instantiate energy filter to illustrate Tally slicing\n", - "energy_filter = openmc.Filter(type='energy', bins=np.logspace(np.log10(1e-8), np.log10(20), 10))\n", + "fine_energy_filter = openmc.Filter(type='energy', bins=np.logspace(np.log10(1e-8), np.log10(20), 10))\n", "\n", "# Instantiate flux Tally in moderator and fuel\n", "tally = openmc.Tally(name='need-to-slice')\n", "tally.filters = [openmc.Filter(type='cell', bins=[fuel_cell.id, moderator_cell.id])]\n", - "tally.filters.append(energy_filter)\n", + "tally.filters.append(fine_energy_filter)\n", "tally.scores = ['nu-fission', 'scatter']\n", "tally.nuclides = [h1, u238]\n", "tallies_file.append(tally)" @@ -541,9 +566,10 @@ "\n", " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", - " Version: 0.7.1\n", - " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", - " Date/Time: 2016-07-22 21:39:46\n", + " Version: 0.8.0\n", + " Git SHA1: 93862cea249e4441beb714e719120da3bd2b7d0a\n", + " Date/Time: 2016-08-23 15:24:53\n", + " MPI Processes: 1\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -553,12 +579,12 @@ " Reading geometry XML file...\n", " Reading cross sections XML file...\n", " Reading materials XML file...\n", - " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", - " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", - " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", - " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", - " Reading B10.71c from /home/romano/openmc/data/nndc_hdf5/B10_71c.h5\n", - " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", + " Reading U235.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/U235_71c.h5\n", + " Reading U238.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/U238_71c.h5\n", + " Reading O16.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/O16_71c.h5\n", + " Reading H1.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/H1_71c.h5\n", + " Reading B10.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/B10_71c.h5\n", + " Reading Zr90.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/Zr90_71c.h5\n", " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", @@ -570,26 +596,26 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 1.03471 \n", - " 2/1 1.03257 \n", - " 3/1 1.00600 \n", - " 4/1 1.04547 \n", - " 5/1 1.02287 \n", - " 6/1 1.05752 \n", - " 7/1 1.04283 1.05017 +/- 0.00734\n", - " 8/1 1.05189 1.05074 +/- 0.00428\n", - " 9/1 1.01645 1.04217 +/- 0.00909\n", - " 10/1 1.04978 1.04369 +/- 0.00721\n", - " 11/1 1.03459 1.04218 +/- 0.00608\n", - " 12/1 1.04019 1.04189 +/- 0.00514\n", - " 13/1 1.05985 1.04414 +/- 0.00499\n", - " 14/1 1.02111 1.04158 +/- 0.00509\n", - " 15/1 1.04774 1.04219 +/- 0.00459\n", - " 16/1 1.00733 1.03902 +/- 0.00523\n", - " 17/1 1.02224 1.03763 +/- 0.00497\n", - " 18/1 1.03263 1.03724 +/- 0.00459\n", - " 19/1 1.01611 1.03573 +/- 0.00451\n", - " 20/1 1.04692 1.03648 +/- 0.00426\n", + " 1/1 0.96168 \n", + " 2/1 0.96651 \n", + " 3/1 1.00678 \n", + " 4/1 0.98773 \n", + " 5/1 1.01883 \n", + " 6/1 1.02959 \n", + " 7/1 0.99859 1.01409 +/- 0.01550\n", + " 8/1 1.03441 1.02086 +/- 0.01123\n", + " 9/1 1.06097 1.03089 +/- 0.01279\n", + " 10/1 1.06094 1.03690 +/- 0.01159\n", + " 11/1 1.04687 1.03856 +/- 0.00961\n", + " 12/1 1.02982 1.03731 +/- 0.00821\n", + " 13/1 1.03520 1.03705 +/- 0.00712\n", + " 14/1 0.99508 1.03239 +/- 0.00782\n", + " 15/1 1.03973 1.03312 +/- 0.00703\n", + " 16/1 1.03807 1.03357 +/- 0.00638\n", + " 17/1 1.03091 1.03335 +/- 0.00583\n", + " 18/1 1.01421 1.03188 +/- 0.00556\n", + " 19/1 0.99339 1.02913 +/- 0.00583\n", + " 20/1 1.04827 1.03040 +/- 0.00558\n", " Creating state point statepoint.20.h5...\n", "\n", " ===========================================================================\n", @@ -599,28 +625,28 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.5600E-01 seconds\n", - " Reading cross sections = 2.3400E-01 seconds\n", - " Total time in simulation = 1.8333E+01 seconds\n", - " Time in transport only = 1.8325E+01 seconds\n", - " Time in inactive batches = 2.6950E+00 seconds\n", - " Time in active batches = 1.5638E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", - " Sampling source sites = 0.0000E+00 seconds\n", + " Total time for initialization = 5.4300E-01 seconds\n", + " Reading cross sections = 3.5400E-01 seconds\n", + " Total time in simulation = 1.8555E+01 seconds\n", + " Time in transport only = 1.8464E+01 seconds\n", + " Time in inactive batches = 2.4600E+00 seconds\n", + " Time in active batches = 1.6095E+01 seconds\n", + " Time synchronizing fission bank = 1.1000E-02 seconds\n", + " Sampling source sites = 4.0000E-03 seconds\n", " SEND/RECV source sites = 1.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 1.0000E-03 seconds\n", - " Total time elapsed = 1.8711E+01 seconds\n", - " Calculation Rate (inactive) = 4638.22 neutrons/second\n", - " Calculation Rate (active) = 2398.00 neutrons/second\n", + " Total time for finalization = 3.0000E-03 seconds\n", + " Total time elapsed = 1.9120E+01 seconds\n", + " Calculation Rate (inactive) = 5081.30 neutrons/second\n", + " Calculation Rate (active) = 2329.92 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.03296 +/- 0.00669\n", - " k-effective (Track-length) = 1.03648 +/- 0.00426\n", - " k-effective (Absorption) = 1.03431 +/- 0.00702\n", - " Combined k-effective = 1.03621 +/- 0.00456\n", - " Leakage Fraction = 0.00000 +/- 0.00000\n", + " k-effective (Collision) = 1.02791 +/- 0.00553\n", + " k-effective (Track-length) = 1.03040 +/- 0.00558\n", + " k-effective (Absorption) = 1.02011 +/- 0.00491\n", + " Combined k-effective = 1.02461 +/- 0.00398\n", + " Leakage Fraction = 0.01677 +/- 0.00109\n", "\n" ] }, @@ -674,8 +700,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "We have a tally of the total fission rate and the total absorption rate, so we can calculate k-infinity as:\n", - "$$k_\\infty = \\frac{\\langle \\nu \\Sigma_f \\phi \\rangle}{\\langle \\Sigma_a \\phi \\rangle}$$\n", + "We have a tally of the total fission rate and the total absorption rate, so we can calculate k-eff as:\n", + "$$k_{eff} = \\frac{\\langle \\nu \\Sigma_f \\phi \\rangle}{\\langle \\Sigma_a \\phi \\rangle + \\langle L \\rangle}$$\n", "In this notation, $\\langle \\cdot \\rangle^a_b$ represents an OpenMC that is integrated over region $a$ and energy range $b$. If $a$ or $b$ is not reported, it means the value represents an integral over all space or all energy, respectively." ] }, @@ -704,17 +730,17 @@ " \n", " 0\n", " total\n", - " (nu-fission / absorption)\n", - " 1.038387\n", - " 0.006141\n", + " (nu-fission / (absorption + current))\n", + " 1.02431\n", + " 0.00704\n", " \n", " \n", "\n", "" ], "text/plain": [ - " nuclide score mean std. dev.\n", - "0 total (nu-fission / absorption) 1.04e+00 6.14e-03" + " nuclide score mean std. dev.\n", + "0 total (nu-fission / (absorption + current)) 1.02e+00 7.04e-03" ] }, "execution_count": 24, @@ -723,10 +749,17 @@ } ], "source": [ - "# Compute k-infinity using tally arithmetic\n", + "# Get the fission and absorption rate tallies\n", "fiss_rate = sp.get_tally(name='fiss. rate')\n", "abs_rate = sp.get_tally(name='abs. rate')\n", - "keff = fiss_rate / abs_rate\n", + "\n", + "# Get the leakage tally\n", + "leak = sp.get_tally(name='leakage')\n", + "leak = leak.summation(filter_type='surface', remove_filter=True)\n", + "leak = leak.summation(filter_type='mesh', remove_filter=True)\n", + "\n", + "# Compute k-infinity using tally arithmetic\n", + "keff = fiss_rate / (abs_rate + leak)\n", "keff.get_pandas_dataframe()" ] }, @@ -734,9 +767,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Notice that even though the neutron production rate and absorption rate are separate tallies, we still get a first-order estimate of the uncertainty on the quotient of them automatically!\n", + "Notice that even though the neutron production rate, absorption rate, and current are separate tallies, we still get a first-order estimate of the uncertainty on the quotient of them automatically!\n", "\n", - "Often in textbooks you'll see k-infinity represented using the four-factor formula $$k_\\infty = p \\epsilon f \\eta.$$ Let's analyze each of these factors, starting with the resonance escape probability which is defined as $$p=\\frac{\\langle\\Sigma_a\\phi\\rangle_T}{\\langle\\Sigma_a\\phi\\rangle}$$ where the subscript $T$ means thermal energies." + "Often in textbooks you'll see k-eff represented using the six-factor formula $$k_{eff} = p \\epsilon f \\eta P_{FNL} P_{TNL}.$$ Let's analyze each of these factors, starting with the resonance escape probability which is defined as $$p=\\frac{\\langle\\Sigma_a\\phi\\rangle_T + \\langle L \\rangle_T}{\\langle\\Sigma_a\\phi\\rangle + \\langle L \\rangle_T}$$ where the subscript $T$ means thermal energies." ] }, { @@ -768,17 +801,20 @@ " 0.0\n", " 6.250000e-07\n", " total\n", - " absorption\n", - " 0.693337\n", - " 0.004109\n", + " (absorption + current)\n", + " 0.695303\n", + " 0.005091\n", " \n", " \n", "\n", "" ], "text/plain": [ - " energy low [MeV] energy high [MeV] nuclide score mean std. dev.\n", - "0 0.00e+00 6.25e-07 total absorption 6.93e-01 4.11e-03" + " energy low [MeV] energy high [MeV] nuclide score \\\n", + "0 0.00e+00 6.25e-07 total (absorption + current) \n", + "\n", + " mean std. dev. \n", + "0 6.95e-01 5.09e-03 " ] }, "execution_count": 25, @@ -789,7 +825,10 @@ "source": [ "# Compute resonance escape probability using tally arithmetic\n", "therm_abs_rate = sp.get_tally(name='therm. abs. rate')\n", - "res_esc = therm_abs_rate / abs_rate\n", + "thermal_leak = sp.get_tally(name='thermal leakage')\n", + "thermal_leak = thermal_leak.summation(filter_type='surface', remove_filter=True)\n", + "thermal_leak = thermal_leak.summation(filter_type='mesh', remove_filter=True)\n", + "res_esc = (therm_abs_rate + thermal_leak) / (abs_rate + thermal_leak)\n", "res_esc.get_pandas_dataframe()" ] }, @@ -831,8 +870,8 @@ " 6.250000e-07\n", " total\n", " nu-fission\n", - " 1.203042\n", - " 0.0076\n", + " 1.202639\n", + " 0.010348\n", " \n", " \n", "\n", @@ -840,7 +879,7 @@ ], "text/plain": [ " energy low [MeV] energy high [MeV] nuclide score mean std. dev.\n", - "0 0.00e+00 6.25e-07 total nu-fission 1.20e+00 7.60e-03" + "0 0.00e+00 6.25e-07 total nu-fission 1.20e+00 1.03e-02" ] }, "execution_count": 26, @@ -896,8 +935,8 @@ " 10000\n", " total\n", " absorption\n", - " 0.748413\n", - " 0.004723\n", + " 0.749349\n", + " 0.006731\n", " \n", " \n", "\n", @@ -905,10 +944,10 @@ ], "text/plain": [ " energy low [MeV] energy high [MeV] cell nuclide score mean \\\n", - "0 0.00e+00 6.25e-07 10000 total absorption 7.48e-01 \n", + "0 0.00e+00 6.25e-07 10000 total absorption 7.49e-01 \n", "\n", " std. dev. \n", - "0 4.72e-03 " + "0 6.73e-03 " ] }, "execution_count": 27, @@ -927,7 +966,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The final factor is the number of fission neutrons produced per absorption in fuel, calculated as $$\\eta = \\frac{\\langle \\nu\\Sigma_f\\phi \\rangle_T}{\\langle \\Sigma_a \\phi \\rangle^F_T}$$" + "The next factor is the number of fission neutrons produced per absorption in fuel, calculated as $$\\eta = \\frac{\\langle \\nu\\Sigma_f\\phi \\rangle_T}{\\langle \\Sigma_a \\phi \\rangle^F_T}$$" ] }, { @@ -962,8 +1001,8 @@ " 10000\n", " total\n", " (nu-fission / absorption)\n", - " 1.663385\n", - " 0.011253\n", + " 1.663736\n", + " 0.015707\n", " \n", " \n", "\n", @@ -974,7 +1013,7 @@ "0 0.00e+00 6.25e-07 10000 total \n", "\n", " score mean std. dev. \n", - "0 (nu-fission / absorption) 1.66e+00 1.13e-02 " + "0 (nu-fission / absorption) 1.66e+00 1.57e-02 " ] }, "execution_count": 28, @@ -992,7 +1031,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Now we can calculate $k_\\infty$ using the product of the factors form the four-factor formula." + "There are two leakage factors to account for fast and thermal leakage. The fast non-leakage probability is computed as $$P_{FNL} = \\frac{\\langle \\Sigma_a\\phi \\rangle + \\langle L \\rangle_T}{\\langle \\Sigma_a \\phi \\rangle + \\langle L \\rangle}$$" ] }, { @@ -1001,6 +1040,130 @@ "metadata": { "collapsed": false }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
energy low [MeV]energy high [MeV]nuclidescoremeanstd. dev.
00.06.250000e-07total(absorption + current)0.9851020.005855
\n", + "
" + ], + "text/plain": [ + " energy low [MeV] energy high [MeV] nuclide score \\\n", + "0 0.00e+00 6.25e-07 total (absorption + current) \n", + "\n", + " mean std. dev. \n", + "0 9.85e-01 5.86e-03 " + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p_fnl = (abs_rate + thermal_leak) / (abs_rate + leak)\n", + "p_fnl.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The final factor is the thermalnon-leakage probability and is computed as $$P_{TNL} = \\frac{\\langle \\Sigma_a\\phi \\rangle_T}{\\langle \\Sigma_a \\phi \\rangle_T + \\langle L \\rangle_T}$$" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
energy low [MeV]energy high [MeV]nuclidescoremeanstd. dev.
00.06.250000e-07total(absorption / (absorption + current))0.9974070.008492
\n", + "
" + ], + "text/plain": [ + " energy low [MeV] energy high [MeV] nuclide \\\n", + "0 0.00e+00 6.25e-07 total \n", + "\n", + " score mean std. dev. \n", + "0 (absorption / (absorption + current)) 9.97e-01 8.49e-03 " + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p_tnl = therm_abs_rate / (therm_abs_rate + thermal_leak)\n", + "p_tnl.get_pandas_dataframe()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can calculate $k_{eff}$ using the product of the factors form the four-factor formula." + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "collapsed": false + }, "outputs": [ { "data": { @@ -1026,9 +1189,9 @@ " 6.250000e-07\n", " 10000\n", " total\n", - " (((absorption * nu-fission) * absorption) * (n...\n", - " 1.038387\n", - " 0.01316\n", + " ((((((absorption + current) * nu-fission) * ab...\n", + " 1.02431\n", + " 0.02062\n", " \n", " \n", "\n", @@ -1039,16 +1202,16 @@ "0 0.00e+00 6.25e-07 10000 total \n", "\n", " score mean std. dev. \n", - "0 (((absorption * nu-fission) * absorption) * (n... 1.04e+00 1.32e-02 " + "0 ((((((absorption + current) * nu-fission) * ab... 1.02e+00 2.06e-02 " ] }, - "execution_count": 29, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "keff = res_esc * fast_fiss * therm_util * eta\n", + "keff = res_esc * fast_fiss * therm_util * eta * p_fnl * p_tnl\n", "keff.get_pandas_dataframe()" ] }, @@ -1063,7 +1226,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 32, "metadata": { "collapsed": false, "scrolled": true @@ -1079,7 +1242,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 33, "metadata": { "collapsed": false }, @@ -1109,8 +1272,8 @@ " 6.250000e-07\n", " (U238 / total)\n", " (nu-fission / flux)\n", - " 6.636968e-07\n", - " 4.132875e-09\n", + " 6.662479e-07\n", + " 6.039323e-09\n", " \n", " \n", " 1\n", @@ -1119,8 +1282,8 @@ " 6.250000e-07\n", " (U238 / total)\n", " (scatter / flux)\n", - " 2.099856e-01\n", - " 1.232455e-03\n", + " 2.099897e-01\n", + " 1.843251e-03\n", " \n", " \n", " 2\n", @@ -1129,8 +1292,8 @@ " 6.250000e-07\n", " (U235 / total)\n", " (nu-fission / flux)\n", - " 3.552458e-01\n", - " 2.252681e-03\n", + " 3.568130e-01\n", + " 3.255144e-03\n", " \n", " \n", " 3\n", @@ -1139,8 +1302,8 @@ " 6.250000e-07\n", " (U235 / total)\n", " (scatter / flux)\n", - " 5.554345e-03\n", - " 3.265385e-05\n", + " 5.555326e-03\n", + " 4.893022e-05\n", " \n", " \n", " 4\n", @@ -1149,8 +1312,8 @@ " 2.000000e+01\n", " (U238 / total)\n", " (nu-fission / flux)\n", - " 7.126668e-03\n", - " 5.296883e-05\n", + " 7.215044e-03\n", + " 4.968448e-05\n", " \n", " \n", " 5\n", @@ -1159,8 +1322,8 @@ " 2.000000e+01\n", " (U238 / total)\n", " (scatter / flux)\n", - " 2.277460e-01\n", - " 1.003558e-03\n", + " 2.273966e-01\n", + " 8.969811e-04\n", " \n", " \n", " 6\n", @@ -1169,8 +1332,8 @@ " 2.000000e+01\n", " (U235 / total)\n", " (nu-fission / flux)\n", - " 8.010911e-03\n", - " 6.802256e-05\n", + " 7.969615e-03\n", + " 5.374119e-05\n", " \n", " \n", " 7\n", @@ -1179,8 +1342,8 @@ " 2.000000e+01\n", " (U235 / total)\n", " (scatter / flux)\n", - " 3.367794e-03\n", - " 1.443644e-05\n", + " 3.362798e-03\n", + " 1.286767e-05\n", " \n", " \n", "\n", @@ -1198,17 +1361,17 @@ "7 10000 6.25e-07 2.00e+01 (U235 / total) \n", "\n", " score mean std. dev. \n", - "0 (nu-fission / flux) 6.64e-07 4.13e-09 \n", - "1 (scatter / flux) 2.10e-01 1.23e-03 \n", - "2 (nu-fission / flux) 3.55e-01 2.25e-03 \n", - "3 (scatter / flux) 5.55e-03 3.27e-05 \n", - "4 (nu-fission / flux) 7.13e-03 5.30e-05 \n", - "5 (scatter / flux) 2.28e-01 1.00e-03 \n", - "6 (nu-fission / flux) 8.01e-03 6.80e-05 \n", - "7 (scatter / flux) 3.37e-03 1.44e-05 " + "0 (nu-fission / flux) 6.66e-07 6.04e-09 \n", + "1 (scatter / flux) 2.10e-01 1.84e-03 \n", + "2 (nu-fission / flux) 3.57e-01 3.26e-03 \n", + "3 (scatter / flux) 5.56e-03 4.89e-05 \n", + "4 (nu-fission / flux) 7.22e-03 4.97e-05 \n", + "5 (scatter / flux) 2.27e-01 8.97e-04 \n", + "6 (nu-fission / flux) 7.97e-03 5.37e-05 \n", + "7 (scatter / flux) 3.36e-03 1.29e-05 " ] }, - "execution_count": 31, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" } @@ -1227,7 +1390,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 34, "metadata": { "collapsed": false }, @@ -1236,11 +1399,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 6.63696783e-07]\n", - " [ 3.55245846e-01]]\n", + "[[[ 6.66247898e-07]\n", + " [ 3.56812954e-01]]\n", "\n", - " [[ 7.12666800e-03]\n", - " [ 8.01091088e-03]]]\n" + " [[ 7.21504433e-03]\n", + " [ 7.96961502e-03]]]\n" ] } ], @@ -1259,7 +1422,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 35, "metadata": { "collapsed": false }, @@ -1268,9 +1431,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.00555435]]\n", + "[[[ 0.00555533]]\n", "\n", - " [[ 0.00336779]]]\n" + " [[ 0.0033628 ]]]\n" ] } ], @@ -1283,7 +1446,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 36, "metadata": { "collapsed": false }, @@ -1292,8 +1455,8 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[[ 0.22774598]\n", - " [ 0.00336779]]]\n" + "[[[ 0.22739657]\n", + " [ 0.0033628 ]]]\n" ] } ], @@ -1314,7 +1477,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 37, "metadata": { "collapsed": false }, @@ -1345,7 +1508,7 @@ " U238\n", " nu-fission\n", " 0.000002\n", - " 7.473789e-09\n", + " 1.057199e-08\n", " \n", " \n", " 1\n", @@ -1354,8 +1517,8 @@ " 6.250000e-07\n", " U235\n", " nu-fission\n", - " 0.861547\n", - " 4.131310e-03\n", + " 0.856784\n", + " 5.730044e-03\n", " \n", " \n", " 2\n", @@ -1364,8 +1527,8 @@ " 2.000000e+01\n", " U238\n", " nu-fission\n", - " 0.082356\n", - " 5.560461e-04\n", + " 0.082495\n", + " 5.176027e-04\n", " \n", " \n", " 3\n", @@ -1374,8 +1537,8 @@ " 2.000000e+01\n", " U235\n", " nu-fission\n", - " 0.092574\n", - " 7.315442e-04\n", + " 0.091123\n", + " 5.574052e-04\n", " \n", " \n", "\n", @@ -1383,19 +1546,19 @@ ], "text/plain": [ " cell energy low [MeV] energy high [MeV] nuclide score mean \\\n", - "0 10000 0.00e+00 6.25e-07 U238 nu-fission 1.61e-06 \n", - "1 10000 0.00e+00 6.25e-07 U235 nu-fission 8.62e-01 \n", - "2 10000 6.25e-07 2.00e+01 U238 nu-fission 8.24e-02 \n", - "3 10000 6.25e-07 2.00e+01 U235 nu-fission 9.26e-02 \n", + "0 10000 0.00e+00 6.25e-07 U238 nu-fission 1.60e-06 \n", + "1 10000 0.00e+00 6.25e-07 U235 nu-fission 8.57e-01 \n", + "2 10000 6.25e-07 2.00e+01 U238 nu-fission 8.25e-02 \n", + "3 10000 6.25e-07 2.00e+01 U235 nu-fission 9.11e-02 \n", "\n", " std. dev. \n", - "0 7.47e-09 \n", - "1 4.13e-03 \n", - "2 5.56e-04 \n", - "3 7.32e-04 " + "0 1.06e-08 \n", + "1 5.73e-03 \n", + "2 5.18e-04 \n", + "3 5.57e-04 " ] }, - "execution_count": 35, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -1408,7 +1571,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 38, "metadata": { "collapsed": false }, @@ -1438,8 +1601,8 @@ " 1.080060e-07\n", " H1\n", " scatter\n", - " 4.599225\n", - " 0.015973\n", + " 4.547947\n", + " 0.028000\n", " \n", " \n", " 1\n", @@ -1448,8 +1611,8 @@ " 1.166529e-06\n", " H1\n", " scatter\n", - " 2.037260\n", - " 0.011236\n", + " 2.003068\n", + " 0.008587\n", " \n", " \n", " 2\n", @@ -1458,8 +1621,8 @@ " 1.259921e-05\n", " H1\n", " scatter\n", - " 1.662552\n", - " 0.010280\n", + " 1.647225\n", + " 0.011136\n", " \n", " \n", " 3\n", @@ -1468,8 +1631,8 @@ " 1.360790e-04\n", " H1\n", " scatter\n", - " 1.872201\n", - " 0.012136\n", + " 1.831367\n", + " 0.010196\n", " \n", " \n", " 4\n", @@ -1478,8 +1641,8 @@ " 1.469734e-03\n", " H1\n", " scatter\n", - " 2.080459\n", - " 0.013155\n", + " 2.039613\n", + " 0.008059\n", " \n", " \n", " 5\n", @@ -1488,8 +1651,8 @@ " 1.587401e-02\n", " H1\n", " scatter\n", - " 2.154996\n", - " 0.011975\n", + " 2.137523\n", + " 0.012885\n", " \n", " \n", " 6\n", @@ -1498,8 +1661,8 @@ " 1.714488e-01\n", " H1\n", " scatter\n", - " 2.218740\n", - " 0.008528\n", + " 2.170725\n", + " 0.012669\n", " \n", " \n", " 7\n", @@ -1508,8 +1671,8 @@ " 1.851749e+00\n", " H1\n", " scatter\n", - " 2.010517\n", - " 0.009187\n", + " 2.002724\n", + " 0.010768\n", " \n", " \n", " 8\n", @@ -1518,8 +1681,8 @@ " 2.000000e+01\n", " H1\n", " scatter\n", - " 0.372022\n", - " 0.003196\n", + " 0.371624\n", + " 0.002959\n", " \n", " \n", "\n", @@ -1527,29 +1690,29 @@ ], "text/plain": [ " cell energy low [MeV] energy high [MeV] nuclide score mean \\\n", - "0 10002 1.00e-08 1.08e-07 H1 scatter 4.60e+00 \n", - "1 10002 1.08e-07 1.17e-06 H1 scatter 2.04e+00 \n", - "2 10002 1.17e-06 1.26e-05 H1 scatter 1.66e+00 \n", - "3 10002 1.26e-05 1.36e-04 H1 scatter 1.87e+00 \n", - "4 10002 1.36e-04 1.47e-03 H1 scatter 2.08e+00 \n", - "5 10002 1.47e-03 1.59e-02 H1 scatter 2.15e+00 \n", - "6 10002 1.59e-02 1.71e-01 H1 scatter 2.22e+00 \n", - "7 10002 1.71e-01 1.85e+00 H1 scatter 2.01e+00 \n", + "0 10002 1.00e-08 1.08e-07 H1 scatter 4.55e+00 \n", + "1 10002 1.08e-07 1.17e-06 H1 scatter 2.00e+00 \n", + "2 10002 1.17e-06 1.26e-05 H1 scatter 1.65e+00 \n", + "3 10002 1.26e-05 1.36e-04 H1 scatter 1.83e+00 \n", + "4 10002 1.36e-04 1.47e-03 H1 scatter 2.04e+00 \n", + "5 10002 1.47e-03 1.59e-02 H1 scatter 2.14e+00 \n", + "6 10002 1.59e-02 1.71e-01 H1 scatter 2.17e+00 \n", + "7 10002 1.71e-01 1.85e+00 H1 scatter 2.00e+00 \n", "8 10002 1.85e+00 2.00e+01 H1 scatter 3.72e-01 \n", "\n", " std. dev. \n", - "0 1.60e-02 \n", - "1 1.12e-02 \n", - "2 1.03e-02 \n", - "3 1.21e-02 \n", - "4 1.32e-02 \n", - "5 1.20e-02 \n", - "6 8.53e-03 \n", - "7 9.19e-03 \n", - "8 3.20e-03 " + "0 2.80e-02 \n", + "1 8.59e-03 \n", + "2 1.11e-02 \n", + "3 1.02e-02 \n", + "4 8.06e-03 \n", + "5 1.29e-02 \n", + "6 1.27e-02 \n", + "7 1.08e-02 \n", + "8 2.96e-03 " ] }, - "execution_count": 36, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -1565,21 +1728,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 2", "language": "python", - "name": "python3" + "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 3 + "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.5.2" + "pygments_lexer": "ipython2", + "version": "2.7.12" } }, "nbformat": 4, diff --git a/openmc/filter.py b/openmc/filter.py index 9b4eb67dd2..771d40401c 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -781,12 +781,18 @@ class Filter(object): filter_bins = np.repeat(self.bins, self.stride) tile_factor = data_size / len(filter_bins) filter_bins = np.tile(filter_bins, tile_factor) - filter_bins = [x if x != 1 else 'x-min' for x in filter_bins] - filter_bins = [x if x != 2 else 'x-max' for x in filter_bins] - filter_bins = [x if x != 3 else 'y-min' for x in filter_bins] - filter_bins = [x if x != 4 else 'y-max' for x in filter_bins] - filter_bins = [x if x != 5 else 'z-min' for x in filter_bins] - filter_bins = [x if x != 6 else 'z-max' for x in filter_bins] + filter_bins = [x if x != 1 else 'x-min out' for x in filter_bins] + filter_bins = [x if x != 2 else 'x-max out' for x in filter_bins] + filter_bins = [x if x != 3 else 'y-min out' for x in filter_bins] + filter_bins = [x if x != 4 else 'y-max out' for x in filter_bins] + filter_bins = [x if x != 5 else 'z-min out' for x in filter_bins] + filter_bins = [x if x != 6 else 'z-max out' for x in filter_bins] + filter_bins = [x if x != 7 else 'x-min in' for x in filter_bins] + filter_bins = [x if x != 8 else 'x-max in' for x in filter_bins] + filter_bins = [x if x != 9 else 'y-min in' for x in filter_bins] + filter_bins = [x if x != 10 else 'y-max in' for x in filter_bins] + filter_bins = [x if x != 11 else 'z-min in' for x in filter_bins] + filter_bins = [x if x != 12 else 'z-max in' for x in filter_bins] df = pd.concat([df, pd.DataFrame({self.type : filter_bins})]) # universe, material, surface, cell, and cellborn filters From ac17ca4e612babd0e6509b2d94a3d4319dce9896 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 23 Aug 2016 15:27:34 -0400 Subject: [PATCH 117/168] reverted pincell xml example --- examples/xml/pincell/geometry.xml | 14 +++++++------- examples/xml/pincell/settings.xml | 12 ++++++------ examples/xml/pincell/tallies.xml | 11 +++-------- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/examples/xml/pincell/geometry.xml b/examples/xml/pincell/geometry.xml index f4e1bf1dd4..f67f9e74c2 100644 --- a/examples/xml/pincell/geometry.xml +++ b/examples/xml/pincell/geometry.xml @@ -8,16 +8,16 @@ --> - - - + + + - - - - + + + + diff --git a/examples/xml/pincell/settings.xml b/examples/xml/pincell/settings.xml index 9402b979a9..443af9cde2 100644 --- a/examples/xml/pincell/settings.xml +++ b/examples/xml/pincell/settings.xml @@ -3,7 +3,7 @@ - 20 + 100 10 1000 @@ -14,8 +14,8 @@ - -8.62992 -8.62992 -1. - 8.62992 8.62992 1. + -0.62992 -0.62992 -1. + 0.62992 0.62992 1. @@ -24,9 +24,9 @@ bounds for a mesh over which the Shannon entropy should be calculated. The extent in the z direction is made arbitrarily large. --> - -3.39218 -3.39218 -1.e50 - 3.39218 3.39218 1.e50 + -0.39218 -0.39218 -1.e50 + 0.39218 0.39218 1.e50 10 10 1 - + \ No newline at end of file diff --git a/examples/xml/pincell/tallies.xml b/examples/xml/pincell/tallies.xml index 2e39c083d4..73242b9136 100644 --- a/examples/xml/pincell/tallies.xml +++ b/examples/xml/pincell/tallies.xml @@ -2,9 +2,9 @@ - 2 2 1 - -8.62992 -8.62992 -1.e50 - 8.62992 8.62992 1.e50 + 100 100 1 + -0.62992 -0.62992 -1.e50 + 0.62992 0.62992 1.e50 @@ -13,9 +13,4 @@ flux fission nu-fission - - - current - - From 28f50a635a6365bbf365858e07046680b82798f4 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 23 Aug 2016 15:31:44 -0400 Subject: [PATCH 118/168] removed unnecessary repeated filter mesh bin look up in output.F90 --- src/cmfd_header.F90 | 2 +- src/output.F90 | 26 ++------------------------ 2 files changed, 3 insertions(+), 25 deletions(-) diff --git a/src/cmfd_header.F90 b/src/cmfd_header.F90 index 7d253c3081..e743cc928e 100644 --- a/src/cmfd_header.F90 +++ b/src/cmfd_header.F90 @@ -126,7 +126,7 @@ contains if (.not. allocated(this % hxyz)) allocate(this % hxyz(3,nx,ny,nz)) ! Allocate surface currents - if (.not. allocated(this % current)) allocate(this % current(6,ng,nx,ny,nz)) + if (.not. allocated(this % current)) allocate(this % current(12,ng,nx,ny,nz)) ! Allocate source distributions if (.not. allocated(this % cmfd_src)) allocate(this % cmfd_src(ng,nx,ny,nz)) diff --git a/src/output.F90 b/src/output.F90 index eae6547872..2ee213e8eb 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -1035,10 +1035,10 @@ contains end if ! Get the bin for this mesh cell - - ! Left Surface matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, (/ i, j, k /)) + + ! Left Surface matching_bins(i_filter_surf) = OUT_LEFT filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 @@ -1047,8 +1047,6 @@ contains to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /)) matching_bins(i_filter_surf) = IN_LEFT filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 @@ -1058,8 +1056,6 @@ contains trim(to_str(t % results(1,filter_index) % sum_sq)) ! Right Surface - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /)) matching_bins(i_filter_surf) = OUT_RIGHT filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 @@ -1068,8 +1064,6 @@ contains to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /)) matching_bins(i_filter_surf) = IN_RIGHT filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 @@ -1079,8 +1073,6 @@ contains trim(to_str(t % results(1,filter_index) % sum_sq)) ! Back Surface - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /)) matching_bins(i_filter_surf) = OUT_BACK filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 @@ -1089,8 +1081,6 @@ contains to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /)) matching_bins(i_filter_surf) = IN_BACK filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 @@ -1100,8 +1090,6 @@ contains trim(to_str(t % results(1,filter_index) % sum_sq)) ! Front Surface - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /)) matching_bins(i_filter_surf) = OUT_FRONT filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 @@ -1110,8 +1098,6 @@ contains to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /)) matching_bins(i_filter_surf) = IN_FRONT filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 @@ -1121,8 +1107,6 @@ contains trim(to_str(t % results(1,filter_index) % sum_sq)) ! Bottom Surface - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /)) matching_bins(i_filter_surf) = OUT_BOTTOM filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 @@ -1131,8 +1115,6 @@ contains to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /)) matching_bins(i_filter_surf) = IN_BOTTOM filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 @@ -1142,8 +1124,6 @@ contains trim(to_str(t % results(1,filter_index) % sum_sq)) ! Top Surface - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /)) matching_bins(i_filter_surf) = OUT_TOP filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 @@ -1152,8 +1132,6 @@ contains to_str(t % results(1,filter_index) % sum), & trim(to_str(t % results(1,filter_index) % sum_sq)) - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, (/ i, j, k /)) matching_bins(i_filter_surf) = IN_TOP filter_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 From 11dea6f26aaa07794a484b8d009a75cce36a8784 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 23 Aug 2016 16:01:33 -0400 Subject: [PATCH 119/168] fixed error in cmfd surface filter allocation and updated cmfd test results --- src/cmfd_data.F90 | 12 +- src/cmfd_input.F90 | 14 +- tests/test_cmfd_feed/results_true.dat | 528 ++++++++++++++++++++++ tests/test_cmfd_nofeed/results_true.dat | 528 ++++++++++++++++++++++ tests/test_score_current/results_true.dat | 2 +- 5 files changed, 1070 insertions(+), 14 deletions(-) diff --git a/src/cmfd_data.F90 b/src/cmfd_data.F90 index befdc9c465..e1bf1f9c35 100644 --- a/src/cmfd_data.F90 +++ b/src/cmfd_data.F90 @@ -251,12 +251,12 @@ contains cmfd % current(2,h,i,j,k) = t % results(1,score_index) % sum ! Right surface - matching_bins(i_filter_surf) = OUT_RIGHT + matching_bins(i_filter_surf) = IN_RIGHT score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 cmfd % current(3,h,i,j,k) = t % results(1,score_index) % sum - matching_bins(i_filter_surf) = IN_RIGHT + matching_bins(i_filter_surf) = OUT_RIGHT score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 cmfd % current(4,h,i,j,k) = t % results(1,score_index) % sum @@ -273,12 +273,12 @@ contains cmfd % current(6,h,i,j,k) = t % results(1,score_index) % sum ! Front surface - matching_bins(i_filter_surf) = OUT_FRONT + matching_bins(i_filter_surf) = IN_FRONT score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 cmfd % current(7,h,i,j,k) = t % results(1,score_index) % sum - matching_bins(i_filter_surf) = IN_FRONT + matching_bins(i_filter_surf) = OUT_FRONT score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 cmfd % current(8,h,i,j,k) = t % results(1,score_index) % sum @@ -295,12 +295,12 @@ contains cmfd % current(10,h,i,j,k) = t % results(1,score_index) % sum ! Top surface - matching_bins(i_filter_surf) = OUT_TOP + matching_bins(i_filter_surf) = IN_TOP score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 cmfd % current(11,h,i,j,k) = t % results(1,score_index) % sum - matching_bins(i_filter_surf) = IN_TOP + matching_bins(i_filter_surf) = OUT_TOP score_index = sum((matching_bins(1:size(t % filters)) - 1) & * t % stride) + 1 cmfd % current(12,h,i,j,k) = t % results(1,score_index) % sum diff --git a/src/cmfd_input.F90 b/src/cmfd_input.F90 index 50f078a182..327b55b42a 100644 --- a/src/cmfd_input.F90 +++ b/src/cmfd_input.F90 @@ -531,15 +531,15 @@ contains allocate(SurfaceFilter :: filters(n_filters) % obj) select type(filt => filters(n_filters) % obj) type is(SurfaceFilter) - filt % n_bins = 2 * m % n_dimension - allocate(filt % surfaces(2 * m % n_dimension)) + filt % n_bins = 4 * m % n_dimension + allocate(filt % surfaces(4 * m % n_dimension)) if (m % n_dimension == 2) then - filt % surfaces = (/ OUT_LEFT, OUT_RIGHT, OUT_BACK, OUT_FRONT, & - IN_LEFT, IN_RIGHT, IN_BACK, IN_FRONT /) + filt % surfaces = (/ OUT_LEFT, IN_LEFT, IN_RIGHT, OUT_RIGHT, & + OUT_BACK, IN_BACK, IN_FRONT, OUT_FRONT /) elseif (m % n_dimension == 3) then - filt % surfaces = (/ OUT_LEFT, OUT_RIGHT, OUT_BACK, OUT_FRONT, & - OUT_BOTTOM, OUT_TOP, IN_LEFT, IN_RIGHT, IN_BACK, IN_FRONT, & - IN_BOTTOM, IN_TOP /) + filt % surfaces = (/ OUT_LEFT, IN_LEFT, IN_RIGHT, OUT_RIGHT, & + OUT_BACK, IN_BACK, IN_FRONT, OUT_FRONT, & + OUT_BOTTOM, IN_BOTTOM, IN_TOP, OUT_TOP /) end if end select t % find_filter(FILTER_SURFACE) = n_filters diff --git a/tests/test_cmfd_feed/results_true.dat b/tests/test_cmfd_feed/results_true.dat index 04103129dd..5fb87e5a3d 100644 --- a/tests/test_cmfd_feed/results_true.dat +++ b/tests/test_cmfd_feed/results_true.dat @@ -136,6 +136,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +0.000000E+00 +0.000000E+00 +5.514939E+00 +1.528899E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 5.514939E+00 1.528899E+00 5.032131E+00 @@ -148,6 +160,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +2.770358E+00 +3.879191E-01 +7.294002E+00 +2.675589E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 7.294002E+00 2.675589E+00 7.036008E+00 @@ -160,6 +184,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +5.032131E+00 +1.275040E+00 +8.668860E+00 +3.776102E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 8.668860E+00 3.776102E+00 8.352414E+00 @@ -172,6 +208,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +7.036008E+00 +2.490719E+00 +9.345868E+00 +4.380719E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 9.345868E+00 4.380719E+00 9.093766E+00 @@ -184,6 +232,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +8.352414E+00 +3.501945E+00 +9.223771E+00 +4.270119E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 9.223771E+00 4.270119E+00 9.219150E+00 @@ -196,6 +256,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +9.093766E+00 +4.158282E+00 +8.530966E+00 +3.651778E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 8.530966E+00 3.651778E+00 8.690373E+00 @@ -208,6 +280,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +9.219150E+00 +4.264346E+00 +7.204424E+00 +2.604203E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 7.204424E+00 2.604203E+00 7.513640E+00 @@ -220,6 +304,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +8.690373E+00 +3.785262E+00 +5.326721E+00 +1.426975E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 5.326721E+00 1.426975E+00 5.661144E+00 @@ -232,6 +328,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +7.513640E+00 +2.833028E+00 +2.847310E+00 +4.090440E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 2.847310E+00 4.090440E-01 3.025812E+00 @@ -244,6 +352,426 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +5.661144E+00 +1.607138E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_cmfd_nofeed/results_true.dat b/tests/test_cmfd_nofeed/results_true.dat index 54825f5db7..91da28751f 100644 --- a/tests/test_cmfd_nofeed/results_true.dat +++ b/tests/test_cmfd_nofeed/results_true.dat @@ -136,6 +136,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +0.000000E+00 +0.000000E+00 +5.555000E+00 +1.551579E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 5.555000E+00 1.551579E+00 5.095000E+00 @@ -148,6 +160,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +2.833000E+00 +4.078910E-01 +7.271000E+00 +2.659755E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 7.271000E+00 2.659755E+00 7.026000E+00 @@ -160,6 +184,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +5.095000E+00 +1.310819E+00 +8.577000E+00 +3.703215E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 8.577000E+00 3.703215E+00 8.572000E+00 @@ -172,6 +208,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +7.026000E+00 +2.486552E+00 +9.393000E+00 +4.422429E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 9.393000E+00 4.422429E+00 9.261000E+00 @@ -184,6 +232,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +8.572000E+00 +3.680852E+00 +9.265000E+00 +4.305625E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 9.265000E+00 4.305625E+00 9.303000E+00 @@ -196,6 +256,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +9.261000E+00 +4.304411E+00 +8.535000E+00 +3.659395E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 8.535000E+00 3.659395E+00 8.693000E+00 @@ -208,6 +280,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +9.303000E+00 +4.350791E+00 +7.104000E+00 +2.544182E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 7.104000E+00 2.544182E+00 7.334000E+00 @@ -220,6 +304,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +8.693000E+00 +3.799545E+00 +5.168000E+00 +1.344390E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 5.168000E+00 1.344390E+00 5.416000E+00 @@ -232,6 +328,18 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +7.334000E+00 +2.700052E+00 +2.724000E+00 +3.745680E-01 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 2.724000E+00 3.745680E-01 2.960000E+00 @@ -244,6 +352,426 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 +5.416000E+00 +1.471086E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_score_current/results_true.dat b/tests/test_score_current/results_true.dat index 68dbe069cf..cf139cce24 100644 --- a/tests/test_score_current/results_true.dat +++ b/tests/test_score_current/results_true.dat @@ -1 +1 @@ -c2921f159dac64099862c1cd9c6d421c977991f621f954f893ec1351cfcea6794ca2c98c9c2dcc3411f1b8dac91ec83bd895788ba33179222c450a7df1d64f1e \ No newline at end of file +6e432700c1fb8641d106471f1fd19a0bf0f00f8b03a97131f2d73732c5a8eea48edf910c7b27b83058a7914c47c29dc7e7899b7dbb83485309b4f7d9f20471d2 \ No newline at end of file From 6ff1d758c3f782d9b3a2f587e81b28c3d32098aa Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Tue, 23 Aug 2016 19:17:42 -0400 Subject: [PATCH 120/168] Changes to modify resonance scattering with 0K data and getting some tests passing --- openmc/material.py | 5 ++-- src/input_xml.F90 | 28 +++---------------- src/nuclide_header.F90 | 17 ++++++----- tests/test_multipole/inputs_true.dat | 2 +- .../test_resonance_scattering/inputs_true.dat | 2 +- tests/test_triso/inputs_true.dat | 2 +- tests/test_volume_calc/inputs_true.dat | 2 +- 7 files changed, 21 insertions(+), 37 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index d922c685f9..15c0451872 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -634,8 +634,9 @@ class Material(object): element.set("name", str(self._name)) # Create temperature XML subelement - subelement = ET.SubElement(element, "temperature") - subelement.text = self.temperature + if len(self.temperature) > 0: + subelement = ET.SubElement(element, "temperature") + subelement.text = self.temperature # Create density XML subelement subelement = ET.SubElement(element, "density") diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 5fc38c7419..8e48131932 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -1032,23 +1032,6 @@ contains nuclides_0K(i) % scheme) end if - ! check to make sure xs name for which method is applied is given - if (.not. check_for_node(node_scatterer, "xs_label")) then - call fatal_error("Must specify the temperature dependent name of & - &scatterer " // trim(to_str(i)) & - // " given in cross_sections.xml") - end if - call get_node_value(node_scatterer, "xs_label", & - nuclides_0K(i) % name) - - ! check to make sure 0K xs name for which method is applied is given - if (.not. check_for_node(node_scatterer, "xs_label_0K")) then - call fatal_error("Must specify the 0K name of scatterer " & - // trim(to_str(i)) // " given in cross_sections.xml") - end if - call get_node_value(node_scatterer, "xs_label_0K", & - nuclides_0K(i) % name_0K) - if (check_for_node(node_scatterer, "E_min")) then call get_node_value(node_scatterer, "E_min", & nuclides_0K(i) % E_min) @@ -1073,8 +1056,6 @@ contains nuclides_0K(i) % nuclide = trim(nuclides_0K(i) % nuclide) nuclides_0K(i) % scheme = to_lower(trim(nuclides_0K(i) % scheme)) - nuclides_0K(i) % name = trim(nuclides_0K(i) % name) - nuclides_0K(i) % name_0K = trim(nuclides_0K(i) % name_0K) end do else call fatal_error("No resonant scatterers are specified within the & @@ -2086,9 +2067,9 @@ contains ! Check that 0K nuclides are listed in the cross_sections.xml file if (allocated(nuclides_0K)) then do i = 1, size(nuclides_0K) - if (.not. library_dict % has_key(to_lower(nuclides_0K(i) % name_0K))) then + if (.not. library_dict % has_key(to_lower(nuclides_0K(i) % nuclide))) then call fatal_error("Could not find resonant scatterer " & - // trim(nuclides_0K(i) % name_0K) & + // trim(nuclides_0K(i) % nuclide) & // " in cross_sections.xml file!") end if end do @@ -5942,16 +5923,15 @@ contains type(Nuclide) :: resonant_nuc do i = 1, size(nuclides_0K) - if (nuc % name == nuclides_0K(i) % name) then + if (nuc % name == nuclides_0K(i) % nuclide) then ! Copy basic information from settings.xml nuc % resonant = .true. - nuc % name_0K = trim(nuclides_0K(i) % name_0K) nuc % scheme = trim(nuclides_0K(i) % scheme) nuc % E_min = nuclides_0K(i) % E_min nuc % E_max = nuclides_0K(i) % E_max ! Get index in libraries array - name = nuc % name_0K + name = nuc % name i_library = library_dict % get_key(to_lower(name)) call write_message('Reading ' // trim(name) // ' 0K data from ' // & diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index e7c6c48243..5b66a09bc2 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -106,10 +106,8 @@ module nuclide_header !=============================================================================== type Nuclide0K - character(10) :: nuclide ! name of nuclide, e.g. U-238 + character(10) :: nuclide ! name of nuclide, e.g. U238 character(16) :: scheme = 'ares' ! target velocity sampling scheme - character(10) :: name ! name of nuclide, e.g. 92235.03c - character(10) :: name_0K ! name of 0K nuclide, e.g. 92235.00c real(8) :: E_min = 0.01e-6_8 ! lower cutoff energy for res scattering real(8) :: E_max = 1000.0e-6_8 ! upper cutoff energy for res scattering end type Nuclide0K @@ -183,7 +181,7 @@ module nuclide_header subroutine nuclide_from_hdf5(this, group_id, temperature) class(Nuclide), intent(inout) :: this integer(HID_T), intent(in) :: group_id - character(6), intent(in) :: temperature + character(len=*), intent(in) :: temperature integer :: i integer :: Z @@ -246,9 +244,14 @@ module nuclide_header ! closest temperature my_temperature = temperatures(j) if (temperature /= my_temperature) then - call warning(trim(this % name) // " does not contain data at a & - &temperature of " // trim(temperature) // "; using the & - &nearest available temperature of " // trim(my_temperature)) + if (temperature == '0K') then + call fatal_error(trim(this % name) // " does not contain 0K data & + &needed for the resonance scattering options selected") + else + call warning(trim(this % name) // " does not contain data at a & + &temperature of " // trim(temperature) // "; using the & + &nearest available temperature of " // trim(my_temperature)) + end if end if kT_dset = open_dataset(kT_group, my_temperature) diff --git a/tests/test_multipole/inputs_true.dat b/tests/test_multipole/inputs_true.dat index f99b29e8ed..5498e68738 100644 --- a/tests/test_multipole/inputs_true.dat +++ b/tests/test_multipole/inputs_true.dat @@ -1 +1 @@ -54044104d26e9aa90abcdb62290b598bd6ef0d46c3a9e509726ae7b20a7155471edd3e942b71f07b5c855ac1e451d58913a2f43fa971a8c4d56e569ae3b401ed \ No newline at end of file +2ad86dbb798ab68b45ca535fed3bd848625e0a2b79c68d11db91b14c74b8a48ed4d0129de7e6f6b6b7e9cb47a55d45aadca5ef535dc8a18cb881dddfc74d0bbb \ No newline at end of file diff --git a/tests/test_resonance_scattering/inputs_true.dat b/tests/test_resonance_scattering/inputs_true.dat index fdfb2b84e3..a1149a1ba5 100644 --- a/tests/test_resonance_scattering/inputs_true.dat +++ b/tests/test_resonance_scattering/inputs_true.dat @@ -1 +1 @@ -a97844ec7ab45b9e8c1d5849c99414dfa1408956fd951fa783ffa99f78770cd4644a3fb5abe038b0f835ef233ccea2b014e8bd7448f06769944383035ef38ac6 \ No newline at end of file +647cb9773dea9e27ec53ecb5029ab983ecc15cdd5d9551185906a61529452f3966e2b72bcf04c6a09f66810c29934357085343ecc3b888268fae85a100a907e3 \ No newline at end of file diff --git a/tests/test_triso/inputs_true.dat b/tests/test_triso/inputs_true.dat index fb9d6893c0..3e29529450 100644 --- a/tests/test_triso/inputs_true.dat +++ b/tests/test_triso/inputs_true.dat @@ -1 +1 @@ -c844cc920677037d22e6075780ab3e419f6ded19ea08c6f205df1773caa1a0ee53c605b7794415a24d9f0dbf6bd21d40daa9fcc89497b2abccabb1a6c81a506c \ No newline at end of file +b59af664a4db28471fbf7a19514eb1d61c9c890d2bfa83d23ed186ad0f23d8fa2115fb56c18212476183bcab78622622d8394ba97a19e300e0ed84acecdce3ca \ No newline at end of file diff --git a/tests/test_volume_calc/inputs_true.dat b/tests/test_volume_calc/inputs_true.dat index c9515085a1..3a2d9c4747 100644 --- a/tests/test_volume_calc/inputs_true.dat +++ b/tests/test_volume_calc/inputs_true.dat @@ -1 +1 @@ -aeacdb4aabfdfba0ee06cb4e5b21e95c48b1db57cb1301a1798f9b2f37eb56032ea7e94d88d8eacd17988809059b2da2500c2496c2859e5b656b641440545722 \ No newline at end of file +8dc4641e35f7770b8297eab9f71080c62a1c9607f36f7671cc61d47e0714887dea2f4c2ee515b23f39c38b1ea256c695d7c4d0ad95f5d7497a52d15f2ead33a5 \ No newline at end of file From 766c93e4f79a5f558fde875f7c3acf0e0ce9f6be Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Tue, 23 Aug 2016 20:06:14 -0400 Subject: [PATCH 121/168] Got all the tests passing! --- openmc/macroscopic.py | 4 +- openmc/material.py | 13 ++--- openmc/mgxs/library.py | 55 +++---------------- src/input_xml.F90 | 6 ++ src/nuclide_header.F90 | 4 +- src/sab_header.F90 | 11 +++- tests/1d_mgxs.xml | 48 ++++++++-------- tests/input_set.py | 6 +- tests/test_mg_basic/inputs_true.dat | 2 +- tests/test_mg_max_order/inputs_true.dat | 2 +- tests/test_mg_max_order/test_mg_max_order.py | 7 +-- tests/test_mg_tallies/inputs_true.dat | 2 +- .../test_mgxs_library_ce_to_mg.py | 1 + 13 files changed, 65 insertions(+), 96 deletions(-) diff --git a/openmc/macroscopic.py b/openmc/macroscopic.py index e47baf9fba..a1ca62c9ab 100644 --- a/openmc/macroscopic.py +++ b/openmc/macroscopic.py @@ -32,8 +32,6 @@ class Macroscopic(object): if isinstance(other, Macroscopic): if self.name != other.name: return False - elif self.xs != other.xs: - return False else: return True elif isinstance(other, basestring) and other == self.name: @@ -45,7 +43,7 @@ class Macroscopic(object): return not self == other def __hash__(self): - return hash((self._name, self._xs)) + return hash((self._name)) def __repr__(self): string = 'Nuclide - {0}\n'.format(self._name) diff --git a/openmc/material.py b/openmc/material.py index 15c0451872..2b52995738 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -89,7 +89,7 @@ class Material(object): # A list of tuples (element, percent, percent type) self._elements = [] - # If specified, a list of tuples of (table name, xs identifier) + # If specified, a list of table names self._sab = [] # If true, the material will be initialized as distributed @@ -129,7 +129,8 @@ class Material(object): string = 'Material\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._name) - string += '{0: <16}{1}{2}\n'.format('\tName', '=\t', self._temperature) + string += '{0: <16}{1}{2}\n'.format('\Temperature', '=\t', + self._temperature) string += '{0: <16}{1}{2}'.format('\tDensity', '=\t', self._density) string += ' [{0}]\n'.format(self._density_units) @@ -137,8 +138,7 @@ class Material(object): string += '{0: <16}\n'.format('\tS(a,b) Tables') for sab in self._sab: - string += '{0: <16}{1}[{2}{3}]\n'.format('\tS(a,b)', '=\t', - sab[0], sab[1]) + string += '{0: <16}{1}{2}\n'.format('\tS(a,b)', '=\t', sab) string += '{0: <16}\n'.format('\tNuclides') @@ -507,7 +507,7 @@ class Material(object): 'Table "{}" is being renamed as "{}".'.format(name, new_name) warnings.warn(msg) - self._sab.append((new_name)) + self._sab.append(new_name) def make_isotropic_in_lab(self): @@ -580,9 +580,6 @@ class Material(object): xml_element = ET.Element("macroscopic") xml_element.set("name", macroscopic.name) - if macroscopic.xs is not None: - xml_element.set("xs", macroscopic.xs) - return xml_element def _get_element_xml(self, element, distrib=False): diff --git a/openmc/mgxs/library.py b/openmc/mgxs/library.py index 9e5dba310c..4b68952a67 100644 --- a/openmc/mgxs/library.py +++ b/openmc/mgxs/library.py @@ -822,8 +822,8 @@ class Library(object): return pickle.load(open(full_filename, 'rb')) def get_xsdata(self, domain, xsdata_name, nuclide='total', xs_type='macro', - xs_id='1m', order=None, tabular_legendre=None, - tabular_points=33, subdomain=None): + order=None, tabular_legendre=None, tabular_points=33, + subdomain=None): """Generates an openmc.XSdata object describing a multi-group cross section data set for eventual combination in to an openmc.MGXSLibrary object (i.e., the library). @@ -841,8 +841,6 @@ class Library(object): Provide the macro or micro cross section in units of cm^-1 or barns. Defaults to 'macro'. If the Library object is not tallied by nuclide this will be set to 'macro' regardless. - xs_ids : str - Cross section set identifier. Defaults to '1m'. order : int Scattering order for this data entry. Default is None, which will set the XSdata object to use the order of the @@ -888,7 +886,6 @@ class Library(object): cv.check_type('xsdata_name', xsdata_name, basestring) cv.check_type('nuclide', nuclide, basestring) cv.check_value('xs_type', xs_type, ['macro', 'micro']) - cv.check_type('xs_id', xs_id, basestring) cv.check_type('order', order, (type(None), Integral)) if order is not None: cv.check_greater_than('order', order, 0, equality=True) @@ -915,7 +912,6 @@ class Library(object): name = xsdata_name if nuclide is not 'total': name += '_' + nuclide - name += '.' + xs_id xsdata = openmc.XSdata(name, self.energy_groups) if order is None: @@ -1022,8 +1018,7 @@ class Library(object): return xsdata def create_mg_library(self, xs_type='macro', xsdata_names=None, - xs_ids=None, tabular_legendre=None, - tabular_points=33): + tabular_legendre=None, tabular_points=33): """Creates an openmc.MGXSLibrary object to contain the MGXS data for the Multi-Group mode of OpenMC. @@ -1036,10 +1031,6 @@ class Library(object): xsdata_names : Iterable of str List of names to apply to the "xsdata" entries in the resultant mgxs data file. Defaults to 'set1', 'set2', ... - xs_ids : str or Iterable of str - Cross section set identifier (i.e., '71c') for all - data sets (if only str) or for each individual one - (if iterable of str). Defaults to '1m'. tabular_legendre : None or bool Flag to denote whether or not the Legendre expansion of the scattering angular distribution is to be converted to a tabular @@ -1087,26 +1078,6 @@ class Library(object): # Initialize file mgxs_file = openmc.MGXSLibrary(self.energy_groups) - # Get the number of domains to size arrays with - if self.domain_type is 'mesh': - num_domains = np.sum(d.num_mesh_cells for d in self.domains) - else: - num_domains = len(self.domains) - - # Set id names - if xs_ids is not None: - if isinstance(xs_ids, basestring): - # If we only have a string lets convert it now to a list - # of strings. - all_xs_ids = [xs_ids] * num_domains - else: - cv.check_iterable_type('xs_ids', xs_ids, basestring) - cv.check_length('xs_ids', xs_ids, num_domains, num_domains) - all_xs_ids = xs_ids - - else: - all_xs_ids = ['1m'] * num_domains - if self.domain_type == 'mesh': # Create the xsdata objects and add to the mgxs_file i = 0 @@ -1123,7 +1094,6 @@ class Library(object): # Create XSdata and Macroscopic for this domain xsdata = self.get_xsdata(domain, xsdata_name, - xs_id=all_xs_ids[i], tabular_legendre=tabular_legendre, tabular_points=tabular_points, subdomain=subdomain) @@ -1148,7 +1118,6 @@ class Library(object): xsdata = self.get_xsdata(domain, xsdata_name, nuclide=nuclide, xs_type=xs_type, - xs_id=all_xs_ids[i], tabular_legendre=tabular_legendre, tabular_points=tabular_points) @@ -1156,9 +1125,8 @@ class Library(object): return mgxs_file - def create_mg_mode(self, xsdata_names=None, xs_ids=None, - tabular_legendre=None, tabular_points=33, - bc=['reflective'] * 6): + def create_mg_mode(self, xsdata_names=None, tabular_legendre=None, + tabular_points=33, bc=['reflective'] * 6): """Creates an openmc.MGXSLibrary object to contain the MGXS data for the Multi-Group mode of OpenMC as well as the associated openmc.Materials and openmc.Geometry objects. The created Geometry is the same as that @@ -1172,10 +1140,6 @@ class Library(object): xsdata_names : Iterable of str List of names to apply to the "xsdata" entries in the resultant mgxs data file. Defaults to 'set1', 'set2', ... - xs_ids : str or Iterable of str - Cross section set identifier (i.e., '71c') for all - data sets (if only str) or for each individual one - (if iterable of str). Defaults to '1m'. tabular_legendre : None or bool Flag to denote whether or not the Legendre expansion of the scattering angular distribution is to be converted to a tabular @@ -1234,7 +1198,7 @@ class Library(object): cv.check_length("domains", self.domains, 1, 1) # Get the MGXS File Data - mgxs_file = self.create_mg_library('macro', xsdata_names, xs_ids, + mgxs_file = self.create_mg_library('macro', xsdata_names, tabular_legendre, tabular_points) # Now move on the creating the geometry and assigning materials @@ -1251,10 +1215,10 @@ class Library(object): for i, subdomain in enumerate(self.domains[0].cell_generator()): xsdata = mgxs_file.xsdatas[i] - [name, id] = xsdata.name.split('.') + # Build the macroscopic and assign it to the cell of # interest - macroscopic = openmc.Macroscopic(name=name, xs=id) + macroscopic = openmc.Macroscopic(name=xsdata.name) # Create Material and add to collection material = openmc.Material(name=xsdata.name) @@ -1275,9 +1239,8 @@ class Library(object): # Create the xsdata object and add it to the mgxs_file for i, domain in enumerate(self.domains): xsdata = mgxs_file.xsdatas[i] - [name, id] = xsdata.name.split('.') - macroscopic = openmc.Macroscopic(name=name, xs=id) + macroscopic = openmc.Macroscopic(name=xsdata.name) # Create Material and add to collection material = openmc.Material(name=xsdata.name) diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 8e48131932..1cb0dc0fd4 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2147,6 +2147,12 @@ contains ! Copy default temperature if (check_for_node(doc, "default_temperature")) then call get_node_value(doc, "default_temperature", default_temperature) + else if (.not. run_CE) then + ! FIXME This is only necessary while MG mode does not have a + ! temperature dependent library implementation. + ! Set a default for MG mode to allow MG libraries to not include + ! temperatures + default_temperature = '294K' else default_temperature = '' end if diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index 5b66a09bc2..5b3dd31fe5 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -245,8 +245,8 @@ module nuclide_header my_temperature = temperatures(j) if (temperature /= my_temperature) then if (temperature == '0K') then - call fatal_error(trim(this % name) // " does not contain 0K data & - &needed for the resonance scattering options selected") + call warning(trim(this % name) // " does not contain 0K data & + &needed for the resonance scattering options selected") else call warning(trim(this % name) // " does not contain data at a & &temperature of " // trim(temperature) // "; using the & diff --git a/src/sab_header.F90 b/src/sab_header.F90 index d12b75a32b..59e336a38d 100644 --- a/src/sab_header.F90 +++ b/src/sab_header.F90 @@ -222,9 +222,14 @@ contains ! closest temperature my_temperature = temperatures(j) if (temperature /= my_temperature) then - call warning(trim(this % name) // " does not contain data at a & - &temperature of " // trim(temperature) // "; using the & - &nearest available temperature of " // trim(my_temperature)) + if (temperature == '0K') then + call warning(trim(this % name) // " does not contain 0K data & + &needed for the resonance scattering options selected") + else + call warning(trim(this % name) // " does not contain data at a & + &temperature of " // trim(temperature) // "; using the & + &nearest available temperature of " // trim(my_temperature)) + end if end if kT_dset = open_dataset(kT_group, my_temperature) diff --git a/tests/1d_mgxs.xml b/tests/1d_mgxs.xml index 33b20464b6..8704b49ad4 100644 --- a/tests/1d_mgxs.xml +++ b/tests/1d_mgxs.xml @@ -4,8 +4,8 @@ 0.0000000E+00 2.0000000E+01 - uo2_iso.71c - uo2_iso.71c + uo2_iso + uo2_iso 2.5300000E-08 5 true @@ -44,8 +44,8 @@ - clad_iso.71c - clad_iso.71c + clad_iso + clad_iso 2.5300000E-08 5 false @@ -75,8 +75,8 @@ - lwtr_iso.71c - lwtr_iso.71c + lwtr_iso + lwtr_iso 2.5300000E-08 5 false @@ -106,8 +106,8 @@ - uo2_iso_mu.71c - uo2_iso_mu.71c + uo2_iso_mu + uo2_iso_mu 2.5300000E-08 32 true @@ -199,8 +199,8 @@ - clad_iso_mu.71c - clad_iso_mu.71c + clad_iso_mu + clad_iso_mu 2.5300000E-08 32 false @@ -283,8 +283,8 @@ - lwtr_iso_mu.71c - lwtr_iso_mu.71c + lwtr_iso_mu + lwtr_iso_mu 2.5300000E-08 32 false @@ -367,8 +367,8 @@ - uo2_ang.71c - uo2_ang.71c + uo2_ang + uo2_ang 2.5300000E-08 5 true @@ -1246,8 +1246,8 @@ - clad_ang.71c - clad_ang.71c + clad_ang + clad_ang 2.5300000E-08 5 false @@ -1930,8 +1930,8 @@ - lwtr_ang.71c - lwtr_ang.71c + lwtr_ang + lwtr_ang 2.5300000E-08 5 false @@ -2614,8 +2614,8 @@ - uo2_ang_mu.71c - uo2_ang_mu.71c + uo2_ang_mu + uo2_ang_mu 2.5300000E-08 32 true @@ -5158,8 +5158,8 @@ - clad_ang_mu.71c - clad_ang_mu.71c + clad_ang_mu + clad_ang_mu 2.5300000E-08 32 false @@ -7507,8 +7507,8 @@ - lwtr_ang_mu.71c - lwtr_ang_mu.71c + lwtr_ang_mu + lwtr_ang_mu 2.5300000E-08 32 false diff --git a/tests/input_set.py b/tests/input_set.py index ae2876480a..e409fba58f 100644 --- a/tests/input_set.py +++ b/tests/input_set.py @@ -829,17 +829,17 @@ class AssemblyInputSet(object): class MGInputSet(InputSet): def build_default_materials_and_geometry(self): # Define materials needed for 1D/1G slab problem - uo2_data = openmc.Macroscopic('uo2_iso', '71c') + uo2_data = openmc.Macroscopic('uo2_iso') uo2 = openmc.Material(name='UO2', material_id=1) uo2.set_density('macro', 1.0) uo2.add_macroscopic(uo2_data) - clad_data = openmc.Macroscopic('clad_ang_mu', '71c') + clad_data = openmc.Macroscopic('clad_ang_mu') clad = openmc.Material(name='Clad', material_id=2) clad.set_density('macro', 1.0) clad.add_macroscopic(clad_data) - water_data = openmc.Macroscopic('lwtr_iso_mu', '71c') + water_data = openmc.Macroscopic('lwtr_iso_mu') water = openmc.Material(name='LWTR', material_id=3) water.set_density('macro', 1.0) water.add_macroscopic(water_data) diff --git a/tests/test_mg_basic/inputs_true.dat b/tests/test_mg_basic/inputs_true.dat index 3f83de7600..bfb0cc09e9 100644 --- a/tests/test_mg_basic/inputs_true.dat +++ b/tests/test_mg_basic/inputs_true.dat @@ -1 +1 @@ -2fdba76bad058eec6e43657692ef759de79c934076067d4ec5c9f2bdb131877e001f67e16b16bb14889e5e0a1ba84c780979b9d6772573aa6f82d979774c2af8 \ No newline at end of file +d90692c6bf8db3672d70103ded682326d7f14d416e79e18ec055bdeafe1dbc1dbe642e8410cad95bf247f27c907b10b1567127bd2868d466ce2586aacff0411f \ No newline at end of file diff --git a/tests/test_mg_max_order/inputs_true.dat b/tests/test_mg_max_order/inputs_true.dat index 63bdaab03e..d827cfaa49 100644 --- a/tests/test_mg_max_order/inputs_true.dat +++ b/tests/test_mg_max_order/inputs_true.dat @@ -1 +1 @@ -60a35864ad71646309d7f1687ba0826d4d53a5b2e8babf73614362645205484bad3c0e7bf605ec0b11cadf58474b2e3d0a97bf2d9297f9118682c37ff0269afd \ No newline at end of file +7d508b1f3a2661566b8e8cb76fee61aecb96e8b60d633b06f13c4600bd854ea3366cdebd033c0a71ffb8adb90a9aeb64fe5ac0ef3235260921f5689c93e54305 \ No newline at end of file diff --git a/tests/test_mg_max_order/test_mg_max_order.py b/tests/test_mg_max_order/test_mg_max_order.py index 088f6914ba..da699316ca 100644 --- a/tests/test_mg_max_order/test_mg_max_order.py +++ b/tests/test_mg_max_order/test_mg_max_order.py @@ -10,23 +10,22 @@ import openmc class MGNuclideInputSet(MGInputSet): def build_default_materials_and_geometry(self): # Define materials needed for 1D/1G slab problem - uo2_data = openmc.Macroscopic('uo2_iso', '71c') + uo2_data = openmc.Macroscopic('uo2_iso') uo2 = openmc.Material(name='UO2', material_id=1) uo2.set_density('macro', 1.0) uo2.add_macroscopic(uo2_data) - clad_data = openmc.Macroscopic('clad_iso', '71c') + clad_data = openmc.Macroscopic('clad_iso') clad = openmc.Material(name='Clad', material_id=2) clad.set_density('macro', 1.0) clad.add_macroscopic(clad_data) - water_data = openmc.Macroscopic('lwtr_iso', '71c') + water_data = openmc.Macroscopic('lwtr_iso') water = openmc.Material(name='LWTR', material_id=3) water.set_density('macro', 1.0) water.add_macroscopic(water_data) # Define the materials file. - self.materials.default_xs = '71c' self.materials += (uo2, clad, water) # Define surfaces. diff --git a/tests/test_mg_tallies/inputs_true.dat b/tests/test_mg_tallies/inputs_true.dat index 41bbd2136e..c74d7759f7 100644 --- a/tests/test_mg_tallies/inputs_true.dat +++ b/tests/test_mg_tallies/inputs_true.dat @@ -1 +1 @@ -6c437c3f9281c52a80a9b166971aa0f5db7ff8b6cf65c79b6d7bf294fad30cc7044f6a665cd9059f8580441bcbb581f7152ff5bccbc21fbcc407847ea6fe3306 \ No newline at end of file +707285b77a091904a69720e78bf87a6779f2223c0fa2a3725353d00ca30f2624c7d53af016d78c7ad30b70a24bb53eda7dea2f592499b098f541591825b67143 \ No newline at end of file diff --git a/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py b/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py index 0f7cba4a87..baa54b018b 100644 --- a/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py +++ b/tests/test_mgxs_library_ce_to_mg/test_mgxs_library_ce_to_mg.py @@ -83,6 +83,7 @@ class MGXSTestHarness(PyAPITestHarness): returncode = openmc.run(openmc_exec=self._opts.exe) def _cleanup(self): + return super(MGXSTestHarness, self)._cleanup() f = os.path.join(os.getcwd(), 'mgxs.xml') if os.path.exists(f): From 3e83ee6767e768aa548351ef9f55f5a432253150 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Tue, 23 Aug 2016 20:28:34 -0400 Subject: [PATCH 122/168] Cleaned up xs_label usage and updated rnc/rng files --- openmc/settings.py | 4 -- src/relaxng/materials.rnc | 16 ++---- src/relaxng/materials.rng | 101 ++++++++++---------------------------- src/relaxng/settings.rnc | 4 -- src/relaxng/settings.rng | 24 --------- 5 files changed, 30 insertions(+), 119 deletions(-) diff --git a/openmc/settings.py b/openmc/settings.py index 79f3606441..c1d4adc24c 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -1264,10 +1264,6 @@ class ResonanceScattering(object): if self.method is not None: subelement = ET.SubElement(scatterer, 'method') subelement.text = self.method - subelement = ET.SubElement(scatterer, 'xs_label') - subelement.text = self.nuclide.name - subelement = ET.SubElement(scatterer, 'xs_label_0K') - subelement.text = self.nuclide_0K.name if self.E_min is not None: subelement = ET.SubElement(scatterer, 'E_min') subelement.text = str(self.E_min) diff --git a/src/relaxng/materials.rnc b/src/relaxng/materials.rnc index 1b5b7c705a..4d1b217db0 100644 --- a/src/relaxng/materials.rnc +++ b/src/relaxng/materials.rnc @@ -4,6 +4,8 @@ element materials { (element name { xsd:string { maxLength="52" } } | attribute name { xsd:string { maxLength="52" } })? & + element temperature { xsd:string { maxLength = "6" } }? & + element density { (element value { xsd:double } | attribute value { xsd:double })? & (element units { xsd:string { maxLength = "10" } } | @@ -12,8 +14,6 @@ element materials { element nuclide { (element name { xsd:string } | attribute name { xsd:string }) & - (element xs { xsd:string { maxLength = "5" } } | - attribute xs { xsd:string { maxLength = "5" } })? & (element scattering { ( "data" | "iso-in-lab" ) } | attribute scattering { ( "data" | "iso-in-lab" ) })? & ( @@ -24,16 +24,12 @@ element materials { element macroscopic { (element name { xsd:string } | - attribute name { xsd:string }) & - (element xs { xsd:string { maxLength = "5" } } | - attribute xs { xsd:string { maxLength = "5" } }) + attribute name { xsd:string }) }* & element element { (element name { xsd:string { maxLength = "2" } } | attribute name { xsd:string { maxLength = "2" } }) & - (element xs { xsd:string { maxLength = "5" } } | - attribute xs { xsd:string { maxLength = "5" } })? & (element scattering { ( "data" | "iso-in-lab" ) } | attribute scattering { ( "data" | "iso-in-lab" ) })? & ( @@ -43,11 +39,9 @@ element materials { }* & element sab { - (element name { xsd:string } | attribute name { xsd:string }) & - (element xs { xsd:string { maxLength = "5" } } | - attribute xs { xsd:string { maxLength = "5" } })? + (element name { xsd:string } | attribute name { xsd:string }) }* }+ & - element default_xs { xsd:string { maxLength = "5" } }? + element default_temperature { xsd:string { maxLength = "6" } }? } diff --git a/src/relaxng/materials.rng b/src/relaxng/materials.rng index e93f201655..20b7b86ecb 100644 --- a/src/relaxng/materials.rng +++ b/src/relaxng/materials.rng @@ -26,6 +26,13 @@ + + + + 6 + + + @@ -63,20 +70,6 @@ - - - - - 5 - - - - - 5 - - - - @@ -116,28 +109,14 @@ - - - - - - - - - - - - - 5 - - - - - 5 - - - - + + + + + + + + @@ -155,20 +134,6 @@ - - - - - 5 - - - - - 5 - - - - @@ -208,39 +173,23 @@ - - - - - - - - - - - - - - 5 - - - - - 5 - - - - - + + + + + + + + - + - 5 + 6 diff --git a/src/relaxng/settings.rnc b/src/relaxng/settings.rnc index 742e137738..c554dfa753 100644 --- a/src/relaxng/settings.rnc +++ b/src/relaxng/settings.rnc @@ -170,10 +170,6 @@ element settings { attribute nuclide { xsd:string { maxLength = "12" } }) & (element method { xsd:string { maxLength = "16" } } | attribute method { xsd:string { maxLength = "16" } }) & - (element xs_label { xsd:string { maxLength = "12" } } | - attribute xs_label { xsd:string { maxLength = "12" } }) & - (element xs_label_0K { xsd:string { maxLength = "12" } } | - attribute xs_label_0K { xsd:string { maxLength = "12" } }) & (element E_min { xsd:double } | attribute E_min { xsd:double }) & (element E_max { xsd:double } | diff --git a/src/relaxng/settings.rng b/src/relaxng/settings.rng index 39bed4a62f..0719bcbc66 100644 --- a/src/relaxng/settings.rng +++ b/src/relaxng/settings.rng @@ -778,30 +778,6 @@
- - - - 12 - - - - - 12 - - - - - - - 12 - - - - - 12 - - - From fe43bd77905c5644d4a4be0f9db110c2f86cf660 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Tue, 23 Aug 2016 20:36:52 -0400 Subject: [PATCH 123/168] finished updating manual --- docs/source/io_formats/nuclear_data.rst | 12 +++++++++++- docs/source/usersguide/input.rst | 19 ++++++------------- 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/docs/source/io_formats/nuclear_data.rst b/docs/source/io_formats/nuclear_data.rst index bb87bd5b95..18d36528fa 100644 --- a/docs/source/io_formats/nuclear_data.rst +++ b/docs/source/io_formats/nuclear_data.rst @@ -21,6 +21,15 @@ Incident Neutron Data :Datasets: - **energy** (*double[]*) -- Energy points at which cross sections are tabulated +**//kTs/** + + is the temperature in Kelvin, rounded to the nearest integer, of the +temperature-dependent data set. For example, the data set corresponding to +300 Kelvin would be located at `300K`. + +:Datasets: - **** (*double[]*) -- kT values (in MeV) for each Temperature + TTT (in Kelvin) + **//reactions/reaction_/** :Attributes: - **mt** (*int*) -- ENDF MT reaction number @@ -39,7 +48,8 @@ temperature-dependent data set. For example, the data set corresponding to :Attributes: - **threshold_idx** (*int*) -- Index on the energy grid that the reaction threshold corresponds to for temperature TTT (in Kelvin) -:Datasets: - **xs** (*double[]*) -- Cross section values tabulated against the nuclide energy grid for temperature TTT (in Kelvin) +:Datasets: - **xs** (*double[]*) -- Cross section values tabulated against the + nuclide energy grid for temperature TTT (in Kelvin) **//reactions/reaction_/product_/** diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 27a9d36435..57663594d5 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -395,19 +395,16 @@ attributes or sub-elements: :scatterer: An element with attributes/sub-elements called ``nuclide``, ``method``, - ``xs_label``, ``xs_label_0K``, ``E_min``, and ``E_max``. The ``nuclide`` - attribute is the name, as given by the ``name`` attribute within the - ``nuclide`` sub-element of the ``material`` element in ``materials.xml``, - of the nuclide to which a resonance scattering treatment is to be applied. + ``E_min``, and ``E_max``. The ``nuclide`` attribute is the name, as given + by the ``name`` attribute within the ``nuclide`` sub-element of the + ``material`` element in ``materials.xml``, of the nuclide to which a + resonance scattering treatment is to be applied. The ``method`` attribute gives the type of resonance scattering treatment that is to be applied to the ``nuclide``. Acceptable inputs - none of which are case-sensitive - for the ``method`` attribute are ``ARES``, ``CXS``, ``WCM``, and ``DBRC``. Descriptions of each of these methods - are documented here_. The ``xs_label`` attribute gives the label for the - cross section data of the ``nuclide`` at a given temperature. The - ``xs_label_0K`` gives the label for the 0 K cross section data for the - ``nuclide``. The ``E_min`` attribute gives the minimum energy above - which the ``method`` is applied. The ``E_max`` attribute gives the + are documented here_. The ``E_min`` attribute gives the minimum energy + above which the ``method`` is applied. The ``E_max`` attribute gives the maximum energy below which the ``method`` is applied. One example would be as follows: @@ -419,16 +416,12 @@ attributes or sub-elements: U-238 ARES - 92238.72c - 92238.00c 5.0e-6 40.0e-6 Pu-239 dbrc - 94239.72c - 94239.00c 0.01e-6 210.0e-6 From d83f8930c67a183c21b0722c2e6c9a7098248eed Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 24 Aug 2016 05:07:22 -0400 Subject: [PATCH 124/168] updated the travis.yaml to poing to data --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 173af7602c..f243a1c5a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,7 +42,7 @@ install: true before_script: - if [[ ! -e $HOME/nndc_hdf5/cross_sections.xml ]]; then - wget https://anl.box.com/shared/static/dqkwdl7o4lauo91h3mgrn9qno6a3c8mp.xz -O - | tar -C $HOME -xvJ; + wget https://www.dropbox.com/s/6cvzl80lpkar87f/nndc_hdf5.tar.xz -O - | tar -C $HOME -xvJ; fi - export OPENMC_CROSS_SECTIONS=$HOME/nndc_hdf5/cross_sections.xml From 07d62fc9aefb643e8c009dc0b056d3dc156d56fb Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 24 Aug 2016 05:26:42 -0400 Subject: [PATCH 125/168] Fixed a bug in reading kTs from HDF5 library on the python side --- openmc/data/neutron.py | 2 +- openmc/data/thermal.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 87415d427f..bf8020b72a 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -462,7 +462,7 @@ class IncidentNeutron(EqualityMixin): kTg = group['kTs'] kTs = [] for temp in kTg: - kTs.append(temp.value) + kTs.append(kTg[temp].value) temperatures = [str(int(round(kT_to_K(kT)))) + "K" for kT in kTs] data = cls(name, atomic_number, mass_number, metastable, diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 6f4aadd749..8e4ab8ea57 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -441,7 +441,7 @@ class ThermalScattering(EqualityMixin): kTg = group['kTs'] kTs = [] for temp in kTg: - kTs.append(temp.value) + kTs.append(kTg[temp].value) temperatures = [str(int(round(kT_to_K(kT)))) + "K" for kT in kTs] table = cls(name, atomic_weight_ratio, kTs) From 262554d53d968315bdc5691aa5deaef4aac1dae5 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 24 Aug 2016 06:53:56 -0400 Subject: [PATCH 126/168] Apparently i never committed the new inputs for test_resonance_scattering. Now I did! --- tests/test_resonance_scattering/inputs_true.dat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_resonance_scattering/inputs_true.dat b/tests/test_resonance_scattering/inputs_true.dat index a1149a1ba5..ba59e03f59 100644 --- a/tests/test_resonance_scattering/inputs_true.dat +++ b/tests/test_resonance_scattering/inputs_true.dat @@ -1 +1 @@ -647cb9773dea9e27ec53ecb5029ab983ecc15cdd5d9551185906a61529452f3966e2b72bcf04c6a09f66810c29934357085343ecc3b888268fae85a100a907e3 \ No newline at end of file +dea135e820f605cf7a7f8d184330d2dd093cbcd2d53a71198819cb4dc7c455809dbb37eff79538d9b35d19932bd88b555ba833f32d01fa8d5289840b2250f72a \ No newline at end of file From c91480e56c46f65f0e8ca3a4cc5e3035df524a4b Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 24 Aug 2016 10:10:52 -0500 Subject: [PATCH 127/168] Will this one satisfy @nelsonag? We shall see. --- src/output.F90 | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/output.F90 b/src/output.F90 index dc007aab61..ee5aeeaf1c 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -54,14 +54,14 @@ contains ' ##################### %%%%%%%%%%%%%%%%%%%%%', & ' ###################### %%%%%%%%%%%%%%%%%%%%', & ' ####################### %%%%%%%%%%%%%%%%%%', & - ' ######################## %%%%%%%%%%%%%%%%%', & + ' ####################### %%%%%%%%%%%%%%%%%', & ' ###################### %%%%%%%%%%%%%%%%%', & ' #################### %%%%%%%%%%%%%%%%%', & ' ################# %%%%%%%%%%%%%%%%%', & - ' ############## %%%%%%%%%%%%%%%%', & - ' ########### %%%%%%%%%%%%%%%', & - ' ####### %%%%%%%%%%%%%%', & - ' %%%%%%%%%%%%' + ' ############### %%%%%%%%%%%%%%%%', & + ' ############ %%%%%%%%%%%%%%%', & + ' ######## %%%%%%%%%%%%%%', & + ' %%%%%%%%%%%' ! Write version information write(UNIT=OUTPUT_UNIT, FMT=*) & From 0351ed96f026d7a4ccd2e763243a14ef9ebb9d8c Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 24 Aug 2016 19:57:16 -0400 Subject: [PATCH 128/168] resolving first round of @paulromano comments --- docs/source/io_formats/nuclear_data.rst | 17 +++++++------- openmc/data/data.py | 7 +++--- openmc/data/neutron.py | 31 +++++++++++++++++-------- openmc/data/reaction.py | 10 ++++---- openmc/data/thermal.py | 15 ++++++------ 5 files changed, 47 insertions(+), 33 deletions(-) diff --git a/docs/source/io_formats/nuclear_data.rst b/docs/source/io_formats/nuclear_data.rst index 18d36528fa..39fcdfd325 100644 --- a/docs/source/io_formats/nuclear_data.rst +++ b/docs/source/io_formats/nuclear_data.rst @@ -16,18 +16,17 @@ Incident Neutron Data - **metastable** (*int*) -- Metastable state (0=ground, 1=first excited, etc.) - **atomic_weight_ratio** (*double*) -- Mass in units of neutron masses - - **kTs** (*double[]*) -- Temperatures (in MeV) contained in the library - **n_reaction** (*int*) -- Number of reactions :Datasets: - **energy** (*double[]*) -- Energy points at which cross sections are tabulated **//kTs/** - is the temperature in Kelvin, rounded to the nearest integer, of the +K is the temperature in Kelvin, rounded to the nearest integer, of the temperature-dependent data set. For example, the data set corresponding to 300 Kelvin would be located at `300K`. -:Datasets: - **** (*double[]*) -- kT values (in MeV) for each Temperature +:Datasets: - **K** (*double*) -- kT values (in MeV) for each Temperature TTT (in Kelvin) **//reactions/reaction_/** @@ -39,9 +38,9 @@ temperature-dependent data set. For example, the data set corresponding to scattering is center-of-mass (1) or laboratory (0) - **n_product** (*int*) -- Number of reaction products -**//reactions/reaction_//** +**//reactions/reaction_/K/** - is the temperature in Kelvin, rounded to the nearest integer, of the +K is the temperature in Kelvin, rounded to the nearest integer, of the temperature-dependent data set. For example, the data set corresponding to 300 Kelvin would be located at `300K`. @@ -116,9 +115,9 @@ Thermal Neutron Scattering Data outgoing angle-energy distributions are represented ('equal', 'skewed', or 'continuous'). -**//elastic//** +**//elastic/K/** - is the temperature in Kelvin, rounded to the nearest integer, of the +K is the temperature in Kelvin, rounded to the nearest integer, of the temperature-dependent data set. For example, the data set corresponding to 300 Kelvin would be located at `300K`. @@ -128,9 +127,9 @@ temperature-dependent data set. For example, the data set corresponding to and angles for coherent elastic scattering for temperature TTT (in Kelvin) -**//inelastic//** +**//inelastic/K/** - is the temperature in Kelvin, rounded to the nearest integer, of the +K is the temperature in Kelvin, rounded to the nearest integer, of the temperature-dependent data set. For example, the data set corresponding to 300 Kelvin would be located at `300K`. diff --git a/openmc/data/data.py b/openmc/data/data.py index 4eb7860c23..574ae541aa 100644 --- a/openmc/data/data.py +++ b/openmc/data/data.py @@ -219,6 +219,7 @@ def atomic_mass(isotope): return _ATOMIC_MASS.get(isotope.lower()) -def kT_to_K(kT): - K = kT / 8.6173324e-11 - return K \ No newline at end of file +# The value of the Boltzman constant in units of MeV / K +# Values here are from the Committee on Data for Science and Technology +# (CODATA) 2010 recommendation (doi:10.1103/RevModPhys.84.1527). +K_BOLTZMANN = 8.6173324E-11 diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index bf8020b72a..dbf2da23ca 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -7,7 +7,7 @@ from warnings import warn import numpy as np import h5py -from .data import ATOMIC_SYMBOL, SUM_RULES, kT_to_K +from .data import ATOMIC_SYMBOL, SUM_RULES, K_BOLTZMANN from .ace import Table, get_table from .fission_energy import FissionEnergyRelease from .function import Tabulated1D, Sum @@ -40,6 +40,16 @@ def _get_metadata(zaid, metastable_scheme='nndc'): Returns ------- + name : str + Name of the table + element : str + The atomic symbol of the isotope in the table; e.g., Zr. + Z : int + Number of protons in the nucleus + mass_number : int + Number of nucleons in the nucleus + metastable : int + Metastable state of the nucleus. A value of zero indicates ground state. """ @@ -98,7 +108,7 @@ class IncidentNeutron(EqualityMixin): Metastable state of the nucleus. A value of zero indicates ground state. atomic_weight_ratio : float Atomic mass ratio of the target nuclide. - kTs : Iterable float + kTs : Iterable of float List of temperatures of the target nuclide in the data set. The temperatures have units of MeV. @@ -112,7 +122,7 @@ class IncidentNeutron(EqualityMixin): Atomic weight ratio of the target nuclide. energy : dict of numpy.ndarray The energy values (MeV) at which reaction cross-sections are tabulated. - They keys of the dict are the temperature string ('296.3K') for each + They keys of the dict are the temperature string ('294K') for each set of energies fission_energy : None or openmc.data.FissionEnergyRelease The energy released by fission, tabulated by component (e.g. prompt @@ -122,7 +132,7 @@ class IncidentNeutron(EqualityMixin): metastable : int Metastable state of the nucleus. A value of zero indicates ground state. name : str - ZAID identifier of the table, e.g. 92235.70c. + ZAID identifier of the table, e.g. 92235. reactions : collections.OrderedDict Contains the cross sections, secondary angle and energy distributions, and other associated data for each reaction. The keys are the MT values @@ -132,8 +142,8 @@ class IncidentNeutron(EqualityMixin): are the MT values and the values are Reaction objects. temperatures : Iterable of str List of string representations the temperatures of the target nuclide - in the data set. The temperatures are strings with 1 decimal place, - i.e., '293.6K' + in the data set. The temperatures are strings of the temperature, + rounded to the nearest integer; e.g., '294K' kTs : Iterable of float List of temperatures of the target nuclide in the data set. The temperatures have units of MeV. @@ -150,7 +160,8 @@ class IncidentNeutron(EqualityMixin): self.metastable = metastable self.atomic_weight_ratio = atomic_weight_ratio self.kTs = kTs - self.temperatures = [str(int(round(kT_to_K(kT)))) + "K" for kT in kTs] + self.temperatures = [str(int(round(kT / K_BOLTZMANN))) + "K" + for kT in kTs] self.energy = {} self._fission_energy = None self.reactions = OrderedDict() @@ -300,7 +311,7 @@ class IncidentNeutron(EqualityMixin): if ace.temperature not in self.kTs: if name == self.name: # Add temperature and kTs - strT = str(int(round(kT_to_K(ace.temperature)))) + "K" + strT = str(int(round(ace.temperature / K_BOLTZMANN))) + "K" self.temperatures.append(strT) self.kTs.append(ace.temperature) # Read energy grid @@ -463,7 +474,7 @@ class IncidentNeutron(EqualityMixin): kTs = [] for temp in kTg: kTs.append(kTg[temp].value) - temperatures = [str(int(round(kT_to_K(kT)))) + "K" for kT in kTs] + temperatures = [str(int(round(kT / K_BOLTZMANN))) + "K" for kT in kTs] data = cls(name, atomic_number, mass_number, metastable, atomic_weight_ratio, kTs) @@ -550,7 +561,7 @@ class IncidentNeutron(EqualityMixin): # Assign temperature to the running list kTs = [ace.temperature] - temperatures = [str(int(round(kT_to_K(ace.temperature)))) + "K"] + temperatures = [str(int(round(ace.temperature / K_BOLTZMANN))) + "K"] # If mass number hasn't been specified, make an educated guess zaid, xs = ace.name.split('.') diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index 5d3b8daf59..9dc0d26a4d 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -12,7 +12,7 @@ from openmc.stats import Uniform from .angle_distribution import AngleDistribution from .angle_energy import AngleEnergy from .function import Tabulated1D, Polynomial -from .data import REACTION_NAME, kT_to_K +from .data import REACTION_NAME, K_BOLTZMANN from .product import Product from .uncorrelated import UncorrelatedAngleEnergy @@ -444,8 +444,10 @@ class Reaction(EqualityMixin): HDF5 group to write to energy : Iterable of float Array of energies at which cross sections are tabulated at - temperatures : Iterable of float - Array of temperatures at which to obtain the cross sections + temperatures : Iterable of str + List of string representations the temperatures of the target + nuclide in the data set. The temperatures are strings of the + temperature, rounded to the nearest integer; e.g., '294K' Returns ------- @@ -488,7 +490,7 @@ class Reaction(EqualityMixin): # Convert data temperature to a "300.0K" number for indexing # temperature data - strT = str(int(round(kT_to_K(ace.temperature)))) + "K" + strT = str(int(round(ace.temperature / K_BOLTZMANN))) + "K" if i_reaction > 0: mt = int(ace.xss[ace.jxs[3] + i_reaction - 1]) diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 8e4ab8ea57..21edab6868 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -8,7 +8,7 @@ import h5py import openmc.checkvalue as cv from openmc.mixin import EqualityMixin -from .data import kT_to_K +from .data import K_BOLTZMANN from .ace import Table, get_table from .angle_energy import AngleEnergy from .function import Tabulated1D @@ -177,8 +177,8 @@ class ThermalScattering(EqualityMixin): Name of the table, e.g. lwtr.20t. temperatures : Iterable of str List of string representations the temperatures of the target nuclide - in the data set. The temperatures are strings with 1 decimal place, - i.e., '293.6K' + in the data set. The temperatures are strings of the temperature, + rounded to the nearest integer; e.g., '294K' kTs : Iterable of float List of temperatures of the target nuclide in the data set. The temperatures have units of MeV. @@ -191,7 +191,8 @@ class ThermalScattering(EqualityMixin): self.name = name self.atomic_weight_ratio = atomic_weight_ratio self.kTs = kTs - self.temperatures = [str(int(round(kT_to_K(kT)))) + "K" for kT in kTs] + self.temperatures = [str(int(round(kT / K_BOLTZMANN))) + "K" + for kT in kTs] self.elastic_xs = {} self.elastic_mu_out = {} self.inelastic_xs = {} @@ -304,7 +305,7 @@ class ThermalScattering(EqualityMixin): if ace.temperature not in self.kTs: if name == self.name: # Add temperature and kTs - strT = str(int(round(kT_to_K(ace.temperature)))) + "K" + strT = str(int(round(ace.temperature / K_BOLTZMANN))) + "K" self.temperatures.append(strT) self.kTs.append(ace.temperature) @@ -442,7 +443,7 @@ class ThermalScattering(EqualityMixin): kTs = [] for temp in kTg: kTs.append(kTg[temp].value) - temperatures = [str(int(round(kT_to_K(kT)))) + "K" for kT in kTs] + temperatures = [str(int(round(kT / K_BOLTZMANN))) + "K" for kT in kTs] table = cls(name, atomic_weight_ratio, kTs) table.zaids = group.attrs['zaids'] @@ -530,7 +531,7 @@ class ThermalScattering(EqualityMixin): # Assign temperature to the running list kTs = [ace.temperature] - temperatures = [str(int(round(kT_to_K(ace.temperature)))) + "K"] + temperatures = [str(int(round(ace.temperature / K_BOLTZMANN))) + "K"] table = cls(name, ace.atomic_weight_ratio, kTs) From ced87d82560197af61f21ba02bb64ac1f02a51e3 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 24 Aug 2016 19:59:37 -0400 Subject: [PATCH 129/168] one more --- docs/source/io_formats/nuclear_data.rst | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/source/io_formats/nuclear_data.rst b/docs/source/io_formats/nuclear_data.rst index 39fcdfd325..c834059b75 100644 --- a/docs/source/io_formats/nuclear_data.rst +++ b/docs/source/io_formats/nuclear_data.rst @@ -108,13 +108,21 @@ Thermal Neutron Scattering Data **//** :Attributes: - **atomic_weight_ratio** (*double*) -- Mass in units of neutron masses - - **kTs** (*double[]*) -- Temperatures (in MeV) contained in the library - **zaids** (*int[]*) -- ZAID identifiers for which the thermal scattering data applies to - **secondary_mode** (*char[]*) -- Indicates how the inelastic outgoing angle-energy distributions are represented ('equal', 'skewed', or 'continuous'). +**//kTs/** + +K is the temperature in Kelvin, rounded to the nearest integer, of the +temperature-dependent data set. For example, the data set corresponding to +300 Kelvin would be located at `300K`. + +:Datasets: - **K** (*double*) -- kT values (in MeV) for each Temperature + TTT (in Kelvin) + **//elastic/K/** K is the temperature in Kelvin, rounded to the nearest integer, of the From 6eb5bcd2e46472e3f6d60d510a585824bd526455 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Thu, 25 Aug 2016 20:36:29 -0400 Subject: [PATCH 130/168] Fixed identification of closest temperature --- src/nuclide_header.F90 | 21 ++++++++------------- src/sab_header.F90 | 22 +++++++++------------- 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index 5b3dd31fe5..c7ab6d233a 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -198,14 +198,12 @@ module nuclide_header integer(HID_T) :: total_nu integer(HID_T) :: fer_group ! fission_energy_release group integer(HID_T) :: fer_dset - integer(HID_T) :: temp_dset integer(SIZE_T) :: name_len, name_file_len integer(HSIZE_T) :: j integer(HSIZE_T) :: dims(1) character(MAX_WORD_LEN) :: temp character(MAX_FILE_LEN), allocatable :: temperatures(:) integer, allocatable :: temperatures_integer(:) - integer :: temperature_delta character(6) :: my_temperature integer :: temperature_integer type(VectorInt) :: MTs @@ -224,25 +222,22 @@ module nuclide_header this % zaid = 1000 * Z + A + 400 * this % metastable call read_attribute(this % awr, group_id, 'atomic_weight_ratio') kT_group = open_group(group_id, 'kTs') + ! Before accessing the temperature data, see if the user-provied temperature ! exists. We can find this out by looking at the datasets within kT_group - temp = adjustr(trim(temperature)) - temperature_integer = str_to_int(temp(1:len(temp) - 1)) + temperature_integer = & + str_to_int(temperature(1: len_trim(adjustl(temperature)) - 1)) call get_datasets(kT_group, temperatures) allocate(temperatures_integer(size(temperatures))) do i = 1, size(temperatures) - temp = adjustr(trim(temperatures(i))) - temperatures_integer(i) = str_to_int(temp(1:len(temp) - 1)) - end do - j = 1 - temperature_delta = temperature_integer - temperatures_integer(j) - do i = 2, size(temperatures) - if (abs(temperature_integer - temperatures_integer(i)) < temperature_delta) & - j = i + temperatures_integer(i) = & + str_to_int(temperatures(i)(1: len_trim(adjustl(temperatures(i))) - 1)) end do + my_temperature = & + temperatures(minloc(abs(temperature_integer - temperatures_integer), & + dim=1)) ! Now print a warning if there is no matching temperature and then use the ! closest temperature - my_temperature = temperatures(j) if (temperature /= my_temperature) then if (temperature == '0K') then call warning(trim(this % name) // " does not contain 0K data & diff --git a/src/sab_header.F90 b/src/sab_header.F90 index 59e336a38d..5facd3fc3f 100644 --- a/src/sab_header.F90 +++ b/src/sab_header.F90 @@ -176,9 +176,7 @@ contains logical :: exists type(CorrelatedAngleEnergy) :: correlated_dist character(MAX_FILE_LEN), allocatable :: temperatures(:) - character(MAX_FILE_LEN) :: temp_str integer, allocatable :: temperatures_integer(:) - integer :: temperature_delta character(6) :: my_temperature integer :: temperature_integer @@ -202,25 +200,23 @@ contains end select this % n_zaid = size(this % zaid) kT_group = open_group(group_id, 'kTs') + ! Before accessing the temperature data, see if the user-provied temperature ! exists. We can find this out by looking at the datasets within kT_group - temp_str = adjustr(trim(temperature)) - temperature_integer = str_to_int(temp_str(1:len(temp_str) - 1)) + temperature_integer = & + str_to_int(temperature(1: len_trim(adjustl(temperature)) - 1)) call get_datasets(kT_group, temperatures) allocate(temperatures_integer(size(temperatures))) do i = 1, size(temperatures) - temp_str = adjustr(trim(temperatures(i))) - temperatures_integer(i) = str_to_int(temp_str(1:len(temp_str) - 1)) - end do - j = 1 - temperature_delta = temperature_integer - temperatures_integer(j) - do i = 2, size(temperatures) - if (abs(temperature_integer - temperatures_integer(i)) < temperature_delta) & - j = i + temperatures_integer(i) = & + str_to_int(temperatures(i)(1: len_trim(adjustl(temperatures(i))) - 1)) end do + my_temperature = & + temperatures(minloc(abs(temperature_integer - temperatures_integer), & + dim=1)) + ! Now print a warning if there is no matching temperature and then use the ! closest temperature - my_temperature = temperatures(j) if (temperature /= my_temperature) then if (temperature == '0K') then call warning(trim(this % name) // " does not contain 0K data & From 68625ca314a722bf02e994b9aba5f4d74c9a412e Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 25 Aug 2016 11:17:37 -0500 Subject: [PATCH 131/168] Improve storage of temperature-dependent cross sections. - Got rid of XS class - Renamed Reaction.T_data to Reaction.xs - Got rid of Reaction.add_temperature() - Simplified IncidentNeutron.add_temperature_from_ace() --- openmc/data/neutron.py | 118 +++++++++------------------ openmc/data/reaction.py | 172 +++++++++++++++------------------------- 2 files changed, 102 insertions(+), 188 deletions(-) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index dbf2da23ca..6020f09624 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -1,6 +1,7 @@ from __future__ import division, unicode_literals import sys from collections import OrderedDict, Iterable, Mapping +from itertools import chain from numbers import Integral, Real from warnings import warn @@ -160,8 +161,6 @@ class IncidentNeutron(EqualityMixin): self.metastable = metastable self.atomic_weight_ratio = atomic_weight_ratio self.kTs = kTs - self.temperatures = [str(int(round(kT / K_BOLTZMANN))) + "K" - for kT in kTs] self.energy = {} self._fission_energy = None self.reactions = OrderedDict() @@ -221,6 +220,10 @@ class IncidentNeutron(EqualityMixin): def urr(self): return self._urr + @property + def temperatures(self): + return ["{}K".format(int(round(kT / K_BOLTZMANN))) for kT in self.kTs] + @name.setter def name(self, name): cv.check_type('name', name, basestring) @@ -296,66 +299,31 @@ class IncidentNeutron(EqualityMixin): """ - if isinstance(ace_or_filename, Table): - ace = ace_or_filename - else: - ace = get_table(ace_or_filename) + data = IncidentNeutron.from_ace(ace_or_filename, metastable_scheme) - # Obtain the information needed to check if this ACE file is for the - # same nuclide. - zaid, xs = ace.name.split('.') - name, element, Z, mass_number, metastable = \ - _get_metadata(int(zaid), metastable_scheme) + # Check if temprature already exists + strT = data.temperatures[0] + if strT in self.temperatures: + warn('Cross sections at T={} already exist.'.format(strT)) + return - # If this ACE data matches the data within self then get the data - if ace.temperature not in self.kTs: - if name == self.name: - # Add temperature and kTs - strT = str(int(round(ace.temperature / K_BOLTZMANN))) + "K" - self.temperatures.append(strT) - self.kTs.append(ace.temperature) - # Read energy grid - n_energy = ace.nxs[3] - energy = ace.xss[ace.jxs[1]:ace.jxs[1] + n_energy] - self.energy[strT] = energy - total_xs = \ - Tabulated1D(energy, ace.xss[ace.jxs[1] + - n_energy:ace.jxs[1] + - 2 * n_energy]) - abs_xs = Tabulated1D(energy, ace.xss[ace.jxs[1] + 2 * - n_energy:ace.jxs[1] + - 3 * n_energy]) + # Check that name matches + if data.name != self.name: + raise ValueError('Data provided for an incorrect nuclide.') - self.summed_reactions[1].add_temperature(strT, 0, total_xs) - if 27 in self.summed_reactions: - self.summed_reactions[27].add_temperature(strT, 0, abs_xs) + # Add temperature + self.kTs += data.kTs - # Read each reaction and get the xs data out of it - n_reaction = ace.nxs[4] + 1 - for i in range(n_reaction): - rx = Reaction.from_ace(ace, i) + # Add energy grid + self.energy[strT] = data.energy[strT] - xsdata = list(rx.T_data.values())[0] - self.reactions[rx.mt].add_temperature(strT, - xsdata.threshold_idx, - xsdata.xs) - - # Obtain data for the summed photon reactions - for mt in self.summed_reactions: - if mt not in [1, 27]: - # Create summed appropriate cross section - mts = self.get_reaction_components(mt) - xsdata = Sum([self.reactions[mt_i].T_data[strT].xs - for mt_i in mts]) - - self.summed_reactions[mt].add_temperature(strT, 0, - xsdata) - else: - raise ValueError('Data provided for an incorrect nuclide') - - else: - raise Warning('Temperature data set already within ' - 'IncidentNeutron object') + # Add normal and summed reactions + for mt in chain(data.reactions, data.summed_reactions): + if mt not in self: + raise ValueError("Tried to add cross sections for MT={} at T={}" + " but this reaction doesn't exist.".format( + mt, strT)) + self[mt].xs[strT] = data[mt].xs[strT] def get_reaction_components(self, mt): """Determine what reactions make up summed reaction. @@ -474,7 +442,6 @@ class IncidentNeutron(EqualityMixin): kTs = [] for temp in kTg: kTs.append(kTg[temp].value) - temperatures = [str(int(round(kT / K_BOLTZMANN))) + "K" for kT in kTs] data = cls(name, atomic_number, mass_number, metastable, atomic_weight_ratio, kTs) @@ -500,15 +467,12 @@ class IncidentNeutron(EqualityMixin): # MTs never depend on lower MTs. for mt_sum in sorted(SUM_RULES, reverse=True): if mt_sum not in data: - for it, T in enumerate(data.temperatures): - xs_components = \ - [data[mt].T_data[T].xs for mt in SUM_RULES[mt_sum] - if mt in data] + data.summed_reactions[mt_sum] = rx = Reaction(mt_sum) + for T in data.temperatures: + xs_components = [data[mt].xs[T] for mt in SUM_RULES[mt_sum] + if mt in data] if len(xs_components) > 0: - if it == 0: - data.summed_reactions[mt_sum] = Reaction(mt_sum) - data.summed_reactions[mt_sum].add_temperature( - T, 0, Sum(xs_components)) + rx.xs[T] = Sum(xs_components) # Read unresolved resonance probability tables if 'urr' in group: @@ -561,8 +525,6 @@ class IncidentNeutron(EqualityMixin): # Assign temperature to the running list kTs = [ace.temperature] - temperatures = [str(int(round(ace.temperature / K_BOLTZMANN))) + "K"] - # If mass number hasn't been specified, make an educated guess zaid, xs = ace.name.split('.') name, element, Z, mass_number, metastable = \ @@ -571,22 +533,24 @@ class IncidentNeutron(EqualityMixin): data = cls(name, Z, mass_number, metastable, ace.atomic_weight_ratio, kTs) + # Get string of temperature to use as a dictionary key + strT = data.temperatures[0] + # Read energy grid n_energy = ace.nxs[3] energy = ace.xss[ace.jxs[1]:ace.jxs[1] + n_energy] - data.energy[temperatures[0]] = energy + data.energy[strT] = energy total_xs = ace.xss[ace.jxs[1] + n_energy:ace.jxs[1] + 2 * n_energy] absorption_xs = ace.xss[ace.jxs[1] + 2*n_energy:ace.jxs[1] + 3 * n_energy] # Create summed reactions (total and absorption) total = Reaction(1) - total.add_temperature(temperatures[-1], 0, - Tabulated1D(energy, total_xs)) + total.xs[strT] = Tabulated1D(energy, total_xs) data.summed_reactions[1] = total + absorption = Reaction(27) - absorption.add_temperature(temperatures[-1], 0, - Tabulated1D(energy, absorption_xs)) + absorption.xs[strT] = Tabulated1D(energy, absorption_xs) data.summed_reactions[27] = absorption # Read each reaction @@ -616,12 +580,8 @@ class IncidentNeutron(EqualityMixin): warn('Photon production is present for MT={} but no ' 'reaction components exist.'.format(mt)) continue - threshold_idx = \ - np.amin([data.reactions[mt_i].T_data[temperatures[-1]].xs.x[0] - for mt_i in mts]) - xsvals = Sum([data.reactions[mt_i].T_data[temperatures[-1]].xs - for mt_i in mts]) - rx.add_temperature(temperatures[-1], threshold_idx, xsvals) + rx.xs[strT] = Sum([data.reactions[mt_i].xs[strT] + for mt_i in mts]) # Determine summed cross section rx.products += _get_photon_products(ace, rx) diff --git a/openmc/data/reaction.py b/openmc/data/reaction.py index 9dc0d26a4d..45d668b92f 100644 --- a/openmc/data/reaction.py +++ b/openmc/data/reaction.py @@ -1,5 +1,5 @@ from __future__ import division, unicode_literals -from collections import Iterable, Callable +from collections import Iterable, Callable, MutableMapping from copy import deepcopy from numbers import Real, Integral from warnings import warn @@ -11,7 +11,7 @@ from openmc.mixin import EqualityMixin from openmc.stats import Uniform from .angle_distribution import AngleDistribution from .angle_energy import AngleEnergy -from .function import Tabulated1D, Polynomial +from .function import Tabulated1D, Polynomial, Function1D from .data import REACTION_NAME, K_BOLTZMANN from .product import Product from .uncorrelated import UncorrelatedAngleEnergy @@ -211,7 +211,7 @@ def _get_photon_products(ace, rx): # Get photon production cross section photon_prod_xs = ace.xss[idx + 2:idx + 2 + n_energy] - neutron_xs = list(rx.T_data.values())[0].xs(energy) + neutron_xs = list(rx.xs.values())[0](energy) idx = np.where(neutron_xs > 0.) # Calculate photon yield @@ -251,78 +251,6 @@ def _get_photon_products(ace, rx): return photons -class XS(EqualityMixin): - """An energy-dependent cross-section for a reaction channel - - Parameters - ---------- - threshold_idx : int - The index on the energy grid corresponding to the threshold of this - reaction. - xs : dict of callable - Microscopic cross section for this reaction as a function of incident - energy; these cross sections are provided in a dictionary where the key - is the temperature of the cross section set. - - Attributes - ---------- - threshold : float - Threshold of the reaction in MeV - threshold_idx : int - The index on the energy grid corresponding to the threshold of this - reaction. - xs : dict of callable - Microscopic cross section for this reaction as a function of incident - energy; these cross sections are provided in a dictionary where the key - is the temperature of the cross section set. - - """ - - def __init__(self, threshold_idx, xs): - self._threshold_idx = threshold_idx - self._xs = xs - - @property - def threshold_idx(self): - return self._threshold_idx - - @property - def threshold(self): - return self.xs.x[0] - - @property - def xs(self): - return self._xs - - @threshold_idx.setter - def threshold_idx(self, threshold_idx): - cv.check_type('threshold_idx', threshold_idx, Integral) - cv.check_greater_than('threshold_idx', threshold_idx, 0, equality=True) - self._threshold_idx = threshold_idx - - @xs.setter - def xs(self, xs): - cv.check_type('reaction cross section', xs, Callable) - if isinstance(xs, Tabulated1D): - for y in xs.y: - cv.check_greater_than('reaction cross section', y, 0.0, True) - self._xs = xs - - def to_hdf5(self, group): - """Write XS to an HDF5 group - - Parameters - ---------- - group : h5py.Group - HDF5 group to write to - - """ - - group.attrs['threshold_idx'] = self.threshold_idx + 1 - if self.xs is not None: - group.create_dataset('xs', data=self.xs.y) - - class Reaction(EqualityMixin): """A nuclear reaction @@ -333,8 +261,7 @@ class Reaction(EqualityMixin): Parameters ---------- mt : int - The ENDF MT number for this reaction. On occasion, MCNP uses MT numbers - that don't correspond exactly to the ENDF specification. + The ENDF MT number for this reaction. Attributes ---------- @@ -346,14 +273,9 @@ class Reaction(EqualityMixin): The ENDF MT number for this reaction. q_value : float The Q-value of this reaction in MeV. - table : openmc.data.ace.Table - The ACE table which contains this reaction. threshold : float Threshold of the reaction in MeV - threshold_idx : int - The index on the energy grid corresponding to the threshold of this - reaction. - T_data : dict of openmc.data.XS + xs : dict of str to openmc.data.Function1D Microscopic cross section for this reaction as a function of incident energy; these cross sections are provided in a dictionary where the key is the temperature of the cross section set. @@ -366,12 +288,13 @@ class Reaction(EqualityMixin): """ def __init__(self, mt): - self.center_of_mass = True + self._center_of_mass = True + self._q_value = 0. + self._xs = {} + self._products = [] + self._derived_products = [] + self.mt = mt - self.q_value = 0. - self.T_data = {} - self.products = [] - self.derived_products = [] def __repr__(self): if self.mt in REACTION_NAME: @@ -391,6 +314,14 @@ class Reaction(EqualityMixin): def products(self): return self._products + @property + def derived_products(self): + return self._derived_products + + @property + def xs(self): + return self._xs + @center_of_mass.setter def center_of_mass(self, center_of_mass): cv.check_type('center of mass', center_of_mass, (bool, np.bool_)) @@ -406,9 +337,19 @@ class Reaction(EqualityMixin): cv.check_type('reaction products', products, Iterable, Product) self._products = products - def add_temperature(self, temperature, threshold_idx, xs): - cv.check_type('temperature', temperature, str) - self.T_data[temperature] = XS(threshold_idx, xs) + @derived_products.setter + def derived_products(self, derived_products): + cv.check_type('reaction derived products', derived_products, + Iterable, Product) + self._derived_products = derived_products + + @xs.setter + def xs(self, xs): + cv.check_type('reaction cross section dictionary', xs, MutableMapping) + for key, value in xs.items(): + cv.check_type('reaction cross section temperature', key, basestring) + cv.check_type('reaction cross section', value, Function1D) + self._xs = xs def to_hdf5(self, group): """Write reaction to an HDF5 group @@ -427,27 +368,30 @@ class Reaction(EqualityMixin): group.attrs['label'] = np.string_(self.mt) group.attrs['Q_value'] = self.q_value group.attrs['center_of_mass'] = 1 if self.center_of_mass else 0 - for T in self.T_data: + for T in self.xs: Tgroup = group.create_group(T) - self.T_data[T].to_hdf5(Tgroup) + if self.xs[T] is not None: + dset = Tgroup.create_dataset('xs', data=self.xs[T].y) + if hasattr(self.xs[T], '_threshold_idx'): + threshold_idx = self.xs[T]._threshold_idx + 1 + else: + threshold_idx = 1 + dset.attrs['threshold_idx'] = threshold_idx for i, p in enumerate(self.products): pgroup = group.create_group('product_{}'.format(i)) p.to_hdf5(pgroup) @classmethod - def from_hdf5(cls, group, energy, temperatures): + def from_hdf5(cls, group, energy): """Generate reaction from an HDF5 group Parameters ---------- group : h5py.Group HDF5 group to write to - energy : Iterable of float - Array of energies at which cross sections are tabulated at - temperatures : Iterable of str - List of string representations the temperatures of the target - nuclide in the data set. The temperatures are strings of the - temperature, rounded to the nearest integer; e.g., '294K' + energy : dict + Dictionary whose keys are temperatures (e.g., '300K') and values are + arrays of energies at which cross sections are tabulated at. Returns ------- @@ -461,13 +405,21 @@ class Reaction(EqualityMixin): rx.q_value = group.attrs['Q_value'] rx.center_of_mass = bool(group.attrs['center_of_mass']) - # Read cross section data - for T in temperatures: - Tgroup = group[T] - if 'xs' in Tgroup: - threshold_idx = Tgroup.attrs['threshold_idx'] - 1 - xs = Tabulated1D(energy[T][threshold_idx:], Tgroup['xs'].value) - rx.T_data[T] = XS(threshold_idx, xs) + # Read cross section at each temperature + for T, Tgroup in group.items(): + if T.endswith('K'): + if 'xs' in Tgroup: + # Make sure temperature has associated energy grid + if T not in energy: + raise ValueError( + 'Could not create reaction cross section for MT={} ' + 'at T={} because no corresponding energy grid ' + 'exists.'.format(mt, T)) + xs = Tgroup['xs'].value + threshold_idx = Tgroup['xs'].attrs['threshold_idx'] - 1 + tabulated_xs = Tabulated1D(energy[T][threshold_idx:], xs) + tabulated_xs._threshold_idx = threshold_idx + rx.xs[T] = tabulated_xs # Determine number of products n_product = 0 @@ -522,7 +474,8 @@ class Reaction(EqualityMixin): xs[xs < 0.0] = 0.0 tabulated_xs = Tabulated1D(energy, xs) - rx.T_data[strT] = XS(threshold_idx, tabulated_xs) + tabulated_xs._threshold_idx = threshold_idx + rx.xs[strT] = tabulated_xs # ================================================================== # YIELD AND ANGLE-ENERGY DISTRIBUTION @@ -582,7 +535,8 @@ class Reaction(EqualityMixin): elastic_xs[elastic_xs < 0.0] = 0.0 tabulated_xs = Tabulated1D(grid, elastic_xs) - rx.T_data[strT] = XS(0, tabulated_xs) + tabulated_xs._threshold_idx = 0 + rx.xs[strT] = tabulated_xs # No energy distribution for elastic scattering neutron = Product('neutron') From 19c8a1159d6d6089faf6fda4efb4decc742fbbe9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 25 Aug 2016 13:58:53 -0500 Subject: [PATCH 132/168] Make probability tables temperature-dependent --- openmc/data/neutron.py | 51 +++++++++++++++++++++++++---------------- src/nuclide_header.F90 | 3 ++- src/reaction_header.F90 | 2 +- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 6020f09624..c629dbc2ad 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -1,6 +1,6 @@ from __future__ import division, unicode_literals import sys -from collections import OrderedDict, Iterable, Mapping +from collections import OrderedDict, Iterable, Mapping, MutableMapping from itertools import chain from numbers import Integral, Real from warnings import warn @@ -141,15 +141,16 @@ class IncidentNeutron(EqualityMixin): summed_reactions : collections.OrderedDict Contains summed cross sections, e.g., the total cross section. The keys are the MT values and the values are Reaction objects. - temperatures : Iterable of str + temperatures : list of str List of string representations the temperatures of the target nuclide in the data set. The temperatures are strings of the temperature, rounded to the nearest integer; e.g., '294K' kTs : Iterable of float List of temperatures of the target nuclide in the data set. The temperatures have units of MeV. - urr : None or openmc.data.ProbabilityTables - Unresolved resonance region probability tables + urr : dict + Dictionary whose keys are temperatures (e.g., '294K') and values are + unresolved resonance region probability tables. """ @@ -165,7 +166,7 @@ class IncidentNeutron(EqualityMixin): self._fission_energy = None self.reactions = OrderedDict() self.summed_reactions = OrderedDict() - self.urr = None + self._urr = {} def __contains__(self, mt): return mt in self.reactions or mt in self.summed_reactions @@ -275,8 +276,10 @@ class IncidentNeutron(EqualityMixin): @urr.setter def urr(self, urr): - cv.check_type('probability tables', urr, - (ProbabilityTables, type(None))) + cv.check_type('probability table dictionary', urr, MutableMapping) + for key, value in urr: + cv.check_type('probability table temperature', key, basestring) + cv.check_type('probability tables', value, ProbabilityTables) self._urr = urr def add_temperature_from_ace(self, ace_or_filename, metastable_scheme='nndc'): @@ -325,6 +328,10 @@ class IncidentNeutron(EqualityMixin): mt, strT)) self[mt].xs[strT] = data[mt].xs[strT] + # Add probability tables + if strT in data.urr: + self.urr[strT] = data.urr[strT] + def get_reaction_components(self, mt): """Determine what reactions make up summed reaction. @@ -399,9 +406,11 @@ class IncidentNeutron(EqualityMixin): rx.derived_products[0].to_hdf5(tgroup) # Write unresolved resonance probability tables - if self.urr is not None: + if self.urr: urr_group = g.create_group('urr') - self.urr.to_hdf5(urr_group) + for temperature, urr in self.urr.items(): + tgroup = urr_group.create_group(temperature) + urr.to_hdf5(tgroup) # Write fission energy release data if self.fission_energy is not None: @@ -448,14 +457,14 @@ class IncidentNeutron(EqualityMixin): # Read energy grid e_group = group['energy'] - for temperature in temperatures: - data.energy[temperature] = e_group[temperature].value + for temperature, dset in e_group.items(): + data.energy[temperature] = dset.value # Read reaction data rxs_group = group['reactions'] for name, obj in sorted(rxs_group.items()): if name.startswith('reaction_'): - rx = Reaction.from_hdf5(obj, data.energy, temperatures) + rx = Reaction.from_hdf5(obj, data.energy) data.reactions[rx.mt] = rx # Read total nu data if available @@ -467,17 +476,17 @@ class IncidentNeutron(EqualityMixin): # MTs never depend on lower MTs. for mt_sum in sorted(SUM_RULES, reverse=True): if mt_sum not in data: - data.summed_reactions[mt_sum] = rx = Reaction(mt_sum) - for T in data.temperatures: - xs_components = [data[mt].xs[T] for mt in SUM_RULES[mt_sum] - if mt in data] - if len(xs_components) > 0: - rx.xs[T] = Sum(xs_components) + rxs = [data[mt] for mt in SUM_RULES[mt_sum] if mt in data] + if len(rxs) > 0: + data.summed_reactions[mt_sum] = rx = Reaction(mt_sum) + for T in data.temperatures: + rx.xs[T] = Sum([rx.xs[T] for rx in rxs]) # Read unresolved resonance probability tables if 'urr' in group: urr_group = group['urr'] - data.urr = ProbabilityTables.from_hdf5(urr_group) + for temperature, tgroup in urr_group.items(): + data.urr[temperature] = ProbabilityTables.from_hdf5(tgroup) # Read fission energy release data if 'fission_energy_release' in group: @@ -588,6 +597,8 @@ class IncidentNeutron(EqualityMixin): data.summed_reactions[mt] = rx # Read unresolved resonance probability tables - data.urr = ProbabilityTables.from_ace(ace) + urr = ProbabilityTables.from_ace(ace) + if urr is not None: + data.urr[strT] = urr return data diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index c7ab6d233a..3fffb76f3d 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -280,6 +280,7 @@ module nuclide_header do i = 1, size(this % reactions) rx_group = open_group(rxs_group, 'reaction_' // trim(& zero_padded(MTs % data(i), 3))) + call this % reactions(i) % from_hdf5(rx_group, my_temperature) call close_group(rx_group) end do @@ -290,7 +291,7 @@ module nuclide_header if (exists) then this % urr_present = .true. allocate(this % urr_data) - urr_group = open_group(group_id, 'urr') + urr_group = open_group(group_id, 'urr/' // trim(my_temperature)) call this % urr_data % from_hdf5(urr_group) ! if the inelastic competition flag indicates that the inelastic cross diff --git a/src/reaction_header.F90 b/src/reaction_header.F90 index 4289e2160c..c0501d43ea 100644 --- a/src/reaction_header.F90 +++ b/src/reaction_header.F90 @@ -55,8 +55,8 @@ contains ! Read cross section and threshold_idx data xs_group = open_group(group_id, temperature) - call read_attribute(this % threshold, xs_group, 'threshold_idx') xs = open_dataset(xs_group, 'xs') + call read_attribute(this % threshold, xs, 'threshold_idx') call get_shape(xs, dims) allocate(this % sigma(dims(1))) call read_dataset(this % sigma, xs) From 94e8538ebd1ebad5bd1bda168211b6fc514fc0b9 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 25 Aug 2016 20:55:02 -0500 Subject: [PATCH 133/168] Mention urr change in documentation --- docs/source/io_formats/nuclear_data.rst | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/source/io_formats/nuclear_data.rst b/docs/source/io_formats/nuclear_data.rst index c834059b75..8d8da8edae 100644 --- a/docs/source/io_formats/nuclear_data.rst +++ b/docs/source/io_formats/nuclear_data.rst @@ -54,7 +54,11 @@ temperature-dependent data set. For example, the data set corresponding to Reaction product data is described in :ref:`product`. -**//urr** +**//urr/K/** + +K is the temperature in Kelvin, rounded to the nearest integer, of the +temperature-dependent data set. For example, the data set corresponding to +300 Kelvin would be located at `300K`. :Attributes: - **interpolation** (*int*) -- interpolation scheme - **inelastic** (*int*) -- flag indicating inelastic scattering From 50042b4fe3a12b7a98359b236c073b482e2646f3 Mon Sep 17 00:00:00 2001 From: amandalund Date: Thu, 25 Aug 2016 22:39:40 -0500 Subject: [PATCH 134/168] Added domain classes; Moved packing algorithms into separate functions --- openmc/model/triso.py | 1121 +++++++++++++++--------------- tests/test_triso/inputs_true.dat | 2 +- 2 files changed, 570 insertions(+), 553 deletions(-) diff --git a/openmc/model/triso.py b/openmc/model/triso.py index 33c955e3be..d0d67b6878 100644 --- a/openmc/model/triso.py +++ b/openmc/model/triso.py @@ -1,13 +1,14 @@ from __future__ import division import copy -from collections import Iterable, defaultdict -from numbers import Real import warnings import itertools import random +from collections import Iterable, defaultdict +from numbers import Real from random import uniform, gauss from heapq import heappush, heappop from math import pi, sin, cos, floor, log10, sqrt +from abc import ABCMeta, abstractproperty, abstractmethod import numpy as np import scipy.spatial @@ -91,6 +92,363 @@ class TRISO(openmc.Cell): k_min:k_max+1, j_min:j_max+1, i_min:i_max+1])) +class _Domain(object): + """Container in which to pack particles. + + Parameters + ---------- + particle_radius : float + Radius of particles to be packed in container. + center : Iterable of float + Cartesian coordinates of the center of the container. Default is + [0., 0., 0.] + + Attributes + ---------- + particle_radius : float + Radius of particles to be packed in container. + center : list of float + Cartesian coordinates of the center of the container. Default is + [0., 0., 0.] + cell_length : list of float + Length in x-, y-, and z- directions of each cell in mesh overlaid on + domain. + limits : list of float + Minimum and maximum position in x-, y-, and z-directions where particle + center can be placed. + volume : float + Volume of the container. + + """ + + __metaclass__ = ABCMeta + + def __init__(self, particle_radius, center=[0., 0., 0.]): + self._particle_radius = None + self._center = None + self._cell_length = None + self._limits = None + + self.particle_radius = particle_radius + self.center = center + + @property + def particle_radius(self): + return self._particle_radius + + @property + def center(self): + return self._center + + @property + def cell_length(self): + return self._cell_length + + @property + def limits(self): + return self._limits + + @abstractproperty + def volume(self): + pass + + @particle_radius.setter + def particle_radius(self, particle_radius): + self._particle_radius = float(particle_radius) + self.reset() + + @center.setter + def center(self, center): + if np.asarray(center).size != 3: + raise ValueError('Unable to set domain center to {} since it must ' + 'be of length 3'.format(center)) + self._center = [float(x) for x in center] + self.reset() + + @cell_length.setter + def cell_length(self, cell_length): + self._cell_length = cell_length + + @limits.setter + def limits(self, limits): + self._limits = limits + + def mesh_cell(self, p): + """Calculate the index of the cell in a mesh overlaid on the domain in + which the given particle center falls. + + Parameters + ---------- + p : Iterable of float + Cartesian coordinates of particle center. + + Returns + ------- + tuple of int + Indices of mesh cell. + + """ + return tuple(int(p[i]/self.cell_length[i]) for i in range(3)) + + def nearby_mesh_cells(self, p): + """Calculates the indices of all cells in a mesh overlaid on the domain + within one diameter of the given particle. + + Parameters + ---------- + p : Iterable of float + Cartesian coordinates of particle center. + + Returns + ------- + list of tuple of int + Indices of mesh cells. + + """ + d = 2*self.particle_radius + r = [[a/self.cell_length[i] for a in [p[i]-d, p[i], p[i]+d]] + for i in range(3)] + return list(itertools.product(*({int(x) for x in y} for y in r))) + + @abstractmethod + def reset(self): + """Recalculate attributes that depend on input parameters if any of the + parameters are modified. + + """ + pass + + @abstractmethod + def random_point(self): + """Generate Cartesian coordinates of center of a particle that is + contained entirely within the domain with uniform probability. + + Returns + ------- + list of float + Cartesian coordinates of particle center. + + """ + pass + + +class _CubicDomain(_Domain): + """Cubic container in which to pack particles. + + Parameters + ---------- + length : float + Length of each side of the cubic container. + particle_radius : float + Radius of particles to be packed in container. + center : Iterable of float + Cartesian coordinates of the center of the container. Default is + [0., 0., 0.] + + Attributes + ---------- + length : float + Length of each side of the cubic container. + particle_radius : float + Radius of particles to be packed in container. + center : list of float + Cartesian coordinates of the center of the container. Default is + [0., 0., 0.] + cell_length : list of float + Length in x-, y-, and z- directions of each cell in mesh overlaid on + domain. + limits : list of float + Minimum and maximum position in x-, y-, and z-directions where particle + center can be placed. + volume : float + Volume of the container. + + """ + + def __init__(self, length, particle_radius, center=[0., 0., 0.]): + self._length = None + super(_CubicDomain, self).__init__(particle_radius, center) + self.length = length + + @property + def volume(self): + return self.length**3 + + @property + def length(self): + return self._length + + @length.setter + def length(self, length): + self._length = float(length) + self.reset() + + def reset(self): + if (self.particle_radius is not None and self.center is not None + and self.length is not None): + xlim = self.length/2 - self.particle_radius + self.limits = [[x - xlim for x in self.center], + [x + xlim for x in self.center]] + mesh_length = [self.length, self.length, self.length] + self.cell_length = [x/int(x/(4*self.particle_radius)) + for x in mesh_length] + + def random_point(self): + return [uniform(self.limits[0][0], self.limits[1][0]), + uniform(self.limits[0][1], self.limits[1][1]), + uniform(self.limits[0][2], self.limits[1][2])] + + +class _CylindricalDomain(_Domain): + """Cylindrical container in which to pack particles. + + Parameters + ---------- + length : float + Length along z-axis of the cylindrical container. + radius : float + Radius of the cylindrical container. + center : Iterable of float + Cartesian coordinates of the center of the container. Default is + [0., 0., 0.] + + Attributes + ---------- + length : float + Length along z-axis of the cylindrical container. + radius : float + Radius of the cylindrical container. + particle_radius : float + Radius of particles to be packed in container. + center : list of float + Cartesian coordinates of the center of the container. Default is + [0., 0., 0.] + cell_length : list of float + Length in x-, y-, and z- directions of each cell in mesh overlaid on + domain. + limits : list of float + Minimum and maximum position in x-, y-, and z-directions where particle + center can be placed. + volume : float + Volume of the container. + + """ + + def __init__(self, length, radius, particle_radius, center=[0., 0., 0.]): + self._length = None + self._radius = None + super(_CylindricalDomain, self).__init__(particle_radius, center) + self.length = length + self.radius = radius + + @property + def volume(self): + return self.length * pi * self.radius**2 + + @property + def length(self): + return self._length + + @property + def radius(self): + return self._radius + + @length.setter + def length(self, length): + self._length = float(length) + self.reset() + + @radius.setter + def radius(self, radius): + self._radius = float(radius) + self.reset() + + def reset(self): + if (self.particle_radius is not None and self.center is not None + and self.length is not None and self.radius is not None): + xlim = self.length/2 - self.particle_radius + rlim = self.radius - self.particle_radius + self.limits = [[self.center[0] - rlim, self.center[1] - rlim, + self.center[2] - xlim], + [self.center[0] + rlim, self.center[1] + rlim, + self.center[2] + xlim]] + mesh_length = [2*self.radius, 2*self.radius, self.length] + self.cell_length = [x/int(x/(4*self.particle_radius)) + for x in mesh_length] + + def random_point(self): + r = sqrt(uniform(0, (self.radius - self.particle_radius)**2)) + t = uniform(0, 2*pi) + return [r*cos(t) + self.center[0], r*sin(t) + self.center[1], + uniform(self.limits[0][2], self.limits[1][2])] + + +class _SphericalDomain(_Domain): + """Spherical container in which to pack particles. + + Parameters + ---------- + radius : float + Radius of the spherical container. + center : Iterable of float + Cartesian coordinates of the center of the container. Default is + [0., 0., 0.] + + Attributes + ---------- + radius : float + Radius of the spherical container. + particle_radius : float + Radius of particles to be packed in container. + center : list of float + Cartesian coordinates of the center of the container. Default is + [0., 0., 0.] + cell_length : list of float + Length in x-, y-, and z- directions of each cell in mesh overlaid on + domain. + limits : list of float + Minimum and maximum position in x-, y-, and z-directions where particle + center can be placed. + volume : float + Volume of the container. + + """ + + def __init__(self, radius, particle_radius, center=[0., 0., 0.]): + self._radius = None + super(_SphericalDomain, self).__init__(particle_radius, center) + self.radius = radius + + @property + def volume(self): + return 4/3 * pi * self.radius**3 + + @property + def radius(self): + return self._radius + + @radius.setter + def radius(self, radius): + self._radius = float(radius) + self.reset() + + def reset(self): + if (self.particle_radius is not None and self.center is not None + and self.radius is not None): + rlim = self.radius - self.particle_radius + self.limits = [[x - rlim for x in self.center], + [x + rlim for x in self.center]] + mesh_length = [2*self.radius, 2*self.radius, 2*self.radius] + self.cell_length = [x/int(x/(4*self.particle_radius)) + for x in mesh_length] + + def random_point(self): + x = (gauss(0, 1), gauss(0, 1), gauss(0, 1)) + r = (uniform(0, (self.radius - self.particle_radius)**3)**(1/3) / + sqrt(x[0]**2 + x[1]**2 + x[2]**2)) + return [r*x[i] + self.center[i] for i in range(3)] + + def create_triso_lattice(trisos, lower_left, pitch, shape, background): """Create a lattice containing TRISO particles for optimized tracking. @@ -164,261 +522,58 @@ def create_triso_lattice(trisos, lower_left, pitch, shape, background): return lattice -def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, - domain_radius=None, domain_center=(0., 0., 0.), - n_particles=None, packing_fraction=None, - initial_packing_fraction=0.3, contraction_rate=1/400, seed=1): - """Generate a random, non-overlapping configuration of TRISO particles - within a container. +def _random_sequential_pack(domain, n_particles): + """Random sequential packing of particles within a container. Parameters ---------- - radius : float - Outer radius of TRISO particles. - fill : openmc.Universe - Universe which contains all layers of the TRISO particle. - domain_shape : {'cube', 'cylinder', or 'sphere'} - Geometry of the container in which the TRISO particles are packed. - domain_length : float - Length of the container (if cube or cylinder). - domain_radius : float - Radius of the container (if cylinder or sphere). - domain_center : Iterable of float - Cartesian coordinates of the center of the container. + domain : openmc.model._Domain + Container in which to pack particles. n_particles : int - Number of TRISO particles to pack in the domain. Exactly one of - 'n_particles' and 'packing_fraction' should be specified -- the other - will be calculated. - packing_fraction : float - Packing fraction of particles. Exactly one of 'n_particles' and - 'packing_fraction' should be specified -- the other will be calculated. - initial_packing_fraction : float, optional - Packing fraction used to initialize the configuration of particles in - the domain. Default value is 0.3. It is not recommended to set the - initial packing fraction much higher than 0.3 as the random sequential - packing algorithm becomes prohibitively slow as it approaches its limit - (~0.38). - contraction_rate : float, optional - Contraction rate of outer diameter. This can affect the speed of the - close random packing algorithm. Default value is 1/400. - seed : int, optional - RNG seed. + Number of particles to pack. Returns - ------- - trisos : list of openmc.model.TRISO - List of TRISO particles in the domain. - - Notes - ----- - The particle configuration is generated using a combination of random - sequential packing (RSP) and close random packing (CRP). RSP is faster than - CRP for lower packing fractions (pf), but it becomes prohibitively slow as - it approaches its packing limit (~0.38). CRP can achieve higher pf of up to - ~0.64 and scales better with increasing pf. - - If the desired pf is below some threshold for which RSP performs better - than CRP ('initial_packing_fraction'), only RSP is used. If a higher pf is - required, particles with a radius smaller than the desired final radius - (and therefore with a smaller pf) are initialized within the domain using - RSP. This initial configuration of particles is then used as a starting - point for CRP using Jodrey and Tory's algorithm [1]_. - - In RSP, particle centers are placed one by one at random, and placement - attempts for a particle are made until the particle is not overlapping any - others. This implementation of the algorithm uses a lattice over the domain - to speed up the nearest neighbor search by only searching for a particle's - neighbors within that lattice cell. - - In CRP, each particle is assigned two diameters, and inner and an outer, - which approach each other during the simulation. The inner diameter, - defined as the minimum center-to-center distance, is the true diameter of - the particles and defines the pf. At each iteration the worst overlap - between particles based on outer diameter is eliminated by moving the - particles apart along the line joining their centers and the outer diameter - is decreased. Iterations continue until the two diameters converge or until - the desired pf is reached. - - References - ---------- - .. [1] W. S. Jodrey and E. M. Tory, "Computer simulation of close random - packing of equal spheres", Phys. Rev. A 32 (1985) 2347-2351. + ------ + numpy.ndarray + Cartesian coordinates of centers of particles. """ - def get_domain_volume(): - """Calculates the volume of the container in which the TRISO particles - are packed. + sqd = (2*domain.particle_radius)**2 + particles = [] + mesh = defaultdict(list) - Returns - ------- - float - Volume of the domain. + for i in range(n_particles): + # Randomly sample new center coordinates while there are any overlaps + while True: + p = domain.random_point() + idx = domain.mesh_cell(p) + if any((p[0]-q[0])**2 + (p[1]-q[1])**2 + (p[2]-q[2])**2 < sqd + for q in mesh[idx]): + continue + else: + break + particles.append(p) - """ + for idx in domain.nearby_mesh_cells(p): + mesh[idx].append(p) - if domain_shape is 'cube': - return domain_length**3 - elif domain_shape is 'cylinder': - return domain_length * pi * domain_radius**2 - elif domain_shape is 'sphere': - return 4/3 * pi * domain_radius**3 + return np.array(particles) - def get_cell_length(radius): - """Calculates the length of a lattice element in x-, y-, and - z-directions. +def _close_random_pack(domain, particles, contraction_rate): + """Close random packing of particles using the Jodrey-Tory algorithm. - Parameters - ---------- - radius : float - Radius of the particle. - - Returns - ------- - tuple of float - Length of lattice cell in x-, y-, and z-directions. - - """ - - if domain_length: - m = domain_length/int(domain_length/(4*radius)) - if domain_radius: - n = 2*domain_radius/int(domain_radius/(2*radius)) - - if domain_shape is 'cube': - return (m, m, m) - elif domain_shape is 'cylinder': - return (n, n, m) - elif domain_shape is 'sphere': - return (n, n, n) - - - def get_boundary_extremes(): - """Calculates the minimum and maximum positions in x-, y-, and - z-directions where a particle center can be placed within the domain. - - Returns - ------- - llim, ulim : tuple of float - Minimum and maximum position in x-, y-, and z-directions where - particle center can be placed. - - """ - - if domain_length: - x_min = radius - x_max = domain_length - radius - if domain_radius: - r_min = radius - domain_radius - r_max = domain_radius - radius - - if domain_shape is 'cube': - return (x_min, x_min, x_min), (x_max, x_max, x_max) - elif domain_shape is 'cylinder': - return (r_min, r_min, x_min), (r_max, r_max, x_max) - elif domain_shape is 'sphere': - return (r_min, r_min, r_min), (r_max, r_max, r_max) - - - def get_particle_offset(): - """Calculates the offset in x-, y-, and z-directions of the particle - center based on the domain center - - Returns - ------- - tuple of float - Amount to offset particle center in x-, y-, and z-directions - - """ - - if domain_shape is 'cube': - return np.array(domain_center) - domain_length/2 - elif domain_shape is 'cylinder': - return np.array(domain_center) - (0, 0, domain_length/2) - elif domain_shape is 'sphere': - return np.array(domain_center) - - - def inner_packing_fraction(): - """Calculates the true packing fraction of the particles based on the - inner diameter. - - Returns - ------- - float - Packing fraction calculated from inner diameter. - - """ - - return (4/3 * pi * (inner_diameter[0]/2)**3 * n_particles / - domain_volume) - - - def outer_packing_fraction(): - """Calculates the nominal packing fraction of the particles based on - the outer diameter. - - Returns - ------- - float - Packing fraction calculated from outer diameter. - - """ - - return (4/3 * pi * (outer_diameter[0]/2)**3 * n_particles / - domain_volume) - - - def random_point_cube(): - """Generate Cartesian coordinates of center of a particle that is - contained entirely within cubic domain with uniform probability. - - Returns - ------- - list of float - Cartesian coordinates of particle center. - - """ - - return [uniform(llim[0], ulim[0]), - uniform(llim[0], ulim[0]), - uniform(llim[0], ulim[0])] - - - def random_point_cylinder(): - """Generate Cartesian coordinates of center of a particle that is - contained entirely within cylindrical domain with uniform probability - (see http://mathworld.wolfram.com/DiskPointPicking.html for generating - random points on a disk). - - Returns - ------- - list of float - Cartesian coordinates of particle center. - - """ - - r = sqrt(uniform(0, ulim[0]**2)) - t = uniform(0, 2*pi) - return [r*cos(t), r*sin(t), uniform(llim[2], ulim[2])] - - - def random_point_sphere(): - """Generate Cartesian coordinates of center of a particle that is - contained entirely within spherical domain with uniform probability. - - Returns - ------- - list of float - Cartesian coordinates of particle center. - - """ - - x = (gauss(0, 1), gauss(0, 1), gauss(0, 1)) - r = (uniform(0, ulim[0]**3)**(1/3) / sqrt(x[0]**2 + x[1]**2 + x[2]**2)) - return [r*i for i in x] + Parameters + ---------- + domain : openmc.model._Domain + Container in which to pack particles. + particles : numpy.ndarray + Initial Cartesian coordinates of centers of particles. + contraction_rate : float + Contraction rate of outer diameter. + """ def add_rod(d, i, j): """Add a new rod to the priority queue. @@ -530,6 +685,35 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, inner_diameter[0] = rods[0][0] + def update_mesh(i): + """Update which mesh cells the particle is in based on new particle + center coordinates. + + 'mesh'/'mesh_map' is a two way dictionary used to look up which + particles are located within one diameter of a given mesh cell and + which mesh cells a given particle center is within one diameter of. + This is used to speed up the nearest neighbor search. + + Parameters + ---------- + i : int + Index of particle in particles array. + + """ + + # Determine which mesh cells the particle is in and remove the + # particle id from those cells + for idx in mesh_map[i]: + mesh[idx].remove(i) + del mesh_map[i] + + # Determine which mesh cells are within one diameter of particle's + # center and add this particle to the list of particles in those cells + for idx in domain.nearby_mesh_cells(particles[i]): + mesh[idx].add(i) + mesh_map[i].add(idx) + + def reduce_outer_diameter(): """Reduce the outer diameter so that at the (i+1)-st iteration it is: @@ -541,60 +725,14 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, """ - j = floor(-log10(outer_packing_fraction() - inner_packing_fraction())) - outer_diameter[0] = (outer_diameter[0] - 0.5**j * - initial_outer_diameter * contraction_rate / - n_particles) + inner_pf = (4/3 * pi * (inner_diameter[0]/2)**3 * n_particles / + domain.volume) + outer_pf = (4/3 * pi * (outer_diameter[0]/2)**3 * n_particles / + domain.volume) - - def update_mesh(i): - """Update which lattice cells the particle is in based on new particle - center coordinates. - - 'mesh'/'mesh_map' is a two way dictionary used to look up which - particles are located within one diameter of a given lattice cell and - which lattice cells a given particle center is within one diameter of. - This is used to speed up the nearest neighbor search. - - Parameters - ---------- - i : int - Index of particle in particles array. - - """ - - # Determine which lattice cells the particle is in and remove the - # particle id from those cells - for idx in mesh_map[i]: - mesh[idx].remove(i) - del mesh_map[i] - - # Determine which lattice cells are within one diameter of particle's - # center and add this particle to the list of particles in those cells - for idx in cell_list(particles[i], diameter): - mesh[idx].add(i) - mesh_map[i].add(idx) - - - def apply_boundary_conditions(i, j): - """Apply reflective boundary conditions to particles i and j. - - Parameters - ---------- - i, j : int - Index of particles in particles array. - - """ - - for k in range(3): - if particles[i][k] < llim[k]: - particles[i][k] = llim[k] - elif particles[i][k] > ulim[k]: - particles[i][k] = ulim[k] - if particles[j][k] < llim[k]: - particles[j][k] = llim[k] - elif particles[j][k] > ulim[k]: - particles[j][k] = ulim[k] + j = floor(-log10(outer_pf - inner_pf)) + outer_diameter[0] = (outer_diameter[0] - 0.5**j * contraction_rate * + initial_outer_diameter / n_particles) def repel_particles(i, j, d): @@ -624,7 +762,15 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, particles[j] -= r*v # Apply reflective boundary conditions - apply_boundary_conditions(i, j) + for k in range(3): + if particles[i][k] < domain.limits[0][k]: + particles[i][k] = domain.limits[0][k] + elif particles[i][k] > domain.limits[1][k]: + particles[i][k] = domain.limits[1][k] + if particles[j][k] < domain.limits[0][k]: + particles[j][k] = domain.limits[0][k] + elif particles[j][k] > domain.limits[1][k]: + particles[j][k] = domain.limits[1][k] update_mesh(i) update_mesh(j) @@ -651,7 +797,7 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, # Need the second nearest neighbor of i since the nearest neighbor # will be itself. Using argpartition, the k-th nearest neighbor is # placed at index k. - idx = list(mesh[cell_index(particles[i])]) + idx = list(mesh[domain.mesh_cell(particles[i])]) dists = cdist([particles[i]], particles[idx])[0] if dists.size > 1: j = dists.argpartition(1)[1] @@ -689,233 +835,120 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, inner_diameter[0] = rods[0][0] - def cell_index_cube(p, cl=None): - """Calculate the index of the lattice cell in which the given particle - center falls. + n_particles = len(particles) + diameter = 2*domain.particle_radius - Parameters - ---------- - p : list of float - Cartesian coordinates of particle center. - cl : list of float - Length of the lattice cells in x-, y-, and z-directions. + # Outer diameter initially set to arbitrary value that yields pf of 1 + initial_outer_diameter = 2*(domain.volume/(n_particles*4/3*pi))**(1/3) - Returns - ------- - tuple of int - Indices of lattice cell. + # Inner and outer diameter of particles will change during packing + outer_diameter = [initial_outer_diameter] + inner_diameter = [0] - """ + rods = [] + rods_map = {} + mesh = defaultdict(set) + mesh_map = defaultdict(set) - if cl is None: - cl = cell_length - - return tuple(int(p[i]/cl[i]) for i in range(3)) - - - def cell_index_cylinder(p, cl=None): - """Calculate the index of the lattice cell in which the given particle - center falls. - - Parameters - ---------- - p : list of float - Cartesian coordinates of particle center. - cl : list of float - Length of the lattice cells in x-, y-, and z-directions. - - Returns - ------- - tuple of int - Indices of lattice cell. - - """ - - if cl is None: - cl = cell_length - - return (int((p[0] + domain_radius)/cl[0]), - int((p[1] + domain_radius)/cl[1]), int(p[2]/cl[2])) - - - def cell_index_sphere(p, cl=None): - """Calculate the index of the lattice cell in which the given particle - center falls. - - Parameters - ---------- - p : list of float - Cartesian coordinates of particle center. - cl : list of float - Length of the lattice cells in x-, y-, and z-directions. - - Returns - ------- - tuple of int - Indices of lattice cell. - - """ - - if cl is None: - cl = cell_length - - return tuple(int((p[i] + domain_radius)/cl[i]) for i in range(3)) - - - def cell_list_cube(p, d, cl=None): - """Return the indices of all cells within the given distance of the - point. - - Parameters - ---------- - p : list of float - Cartesian coordinates of particle center. - d : float - Find all lattice cells that are within a radius of length 'd' of - the particle center. - cl : list of float - Length of the lattice cells in x-, y-, and z-directions. - - Returns - ------- - list of tuple of int - Indices of lattice cells. - - """ - - if cl is None: - cl = cell_length - - r = [[a/cl[i] for a in [p[i]-d, p[i], p[i]+d] if a > 0 and - a < domain_length] for i in range(3)] - - return list(itertools.product(*({int(i) for i in j} for j in r))) - - - def cell_list_cylinder(p, d, cl=None): - """Return the indices of all cells within the given distance of the - point. - - Parameters - ---------- - p : list of float - Cartesian coordinates of particle center. - d : float - Find all lattice cells that are within a radius of length 'd' of - the particle center. - cl : list of float - Length of the lattice cells in x-, y-, and z-directions. - - Returns - ------- - list of tuple of int - Indices of lattice cells. - - """ - - if cl is None: - cl = cell_length - - x, y = [[(a + domain_radius)/cl[i] for a in [p[i]-d, p[i], p[i]+d] - if a > -domain_radius and a < domain_radius] for i in range(2)] - - z = [a/cl[2] for a in [p[2]-d, p[2], p[2]+d] if a > 0 - and a < domain_length] - - return list(itertools.product(*({int(i) for i in j} for j in (x, y, z)))) - - - def cell_list_sphere(p, d, cl=None): - """Return the indices of all cells within the given distance of the - point. - - Parameters - ---------- - p : list of float - Cartesian coordinates of particle center. - d : float - Find all lattice cells that are within a radius of length 'd' of - the particle center. - cl : list of float - Length of the lattice cells in x-, y-, and z-directions. - - Returns - ------- - list of tuple of int - Indices of lattice cells. - - """ - - if cl is None: - cl = cell_length - - r = [[(a + domain_radius)/cl[i] for a in [p[i]-d, p[i], p[i]+d] - if a > -domain_radius and a < domain_radius] for i in range(3)] - - return list(itertools.product(*({int(i) for i in j} for j in r))) - - - def random_sequential_pack(): - """Random sequential packing of particles whose radius is determined by - initial packing fraction. - - Returns - ------ - numpy.ndarray - Cartesian coordinates of centers of TRISO particles. - - """ - - # Set parameters for initial random sequential packing of particles. - r = (3/4*initial_packing_fraction*domain_volume/(pi*n_particles))**(1/3) - d = 2*r - sqd = d**2 - cl = get_cell_length(r) - - particles = [] - mesh = defaultdict(list) - - for i in range(n_particles): - # Randomly sample new center coordinates while there are any overlaps - while True: - p = random_point() - idx = cell_index(p, cl) - if any((p[0]-q[0])**2 + (p[1]-q[1])**2 + (p[2]-q[2])**2 < sqd - for q in mesh[idx]): - continue - else: - break - particles.append(p) - - for idx in cell_list(p, d, cl): - mesh[idx].append(p) - - return np.array(particles) - - - def close_random_pack(): - """Close random packing of particles using the Jodrey-Tory algorithm. - - """ - - for i in range(n_particles): - for idx in cell_list(particles[i], diameter): - mesh[idx].add(i) - mesh_map[i].add(idx) + for i in range(n_particles): + for idx in domain.nearby_mesh_cells(particles[i]): + mesh[idx].add(i) + mesh_map[i].add(idx) + while True: + create_rod_list() + if inner_diameter[0] >= diameter: + break while True: - create_rod_list() - if inner_diameter[0] >= diameter: + d, i, j = pop_rod() + reduce_outer_diameter() + repel_particles(i, j, d) + update_rod_list(i, j) + if inner_diameter[0] >= diameter or not rods: break - while True: - d, i, j = pop_rod() - reduce_outer_diameter() - repel_particles(i, j, d) - update_rod_list(i, j) - if inner_diameter[0] >= diameter or not rods: - break +def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, + domain_radius=None, domain_center=[0., 0., 0.], + n_particles=None, packing_fraction=None, + initial_packing_fraction=0.3, contraction_rate=1/400, seed=1): + """Generate a random, non-overlapping configuration of TRISO particles + within a container. + + Parameters + ---------- + radius : float + Outer radius of TRISO particles. + fill : openmc.Universe + Universe which contains all layers of the TRISO particle. + domain_shape : {'cube', 'cylinder', or 'sphere'} + Geometry of the container in which the TRISO particles are packed. + domain_length : float + Length of the container (if cube or cylinder). + domain_radius : float + Radius of the container (if cylinder or sphere). + domain_center : Iterable of float + Cartesian coordinates of the center of the container. + n_particles : int + Number of TRISO particles to pack in the domain. Exactly one of + 'n_particles' and 'packing_fraction' should be specified -- the other + will be calculated. + packing_fraction : float + Packing fraction of particles. Exactly one of 'n_particles' and + 'packing_fraction' should be specified -- the other will be calculated. + initial_packing_fraction : float, optional + Packing fraction used to initialize the configuration of particles in + the domain. Default value is 0.3. It is not recommended to set the + initial packing fraction much higher than 0.3 as the random sequential + packing algorithm becomes prohibitively slow as it approaches its limit + (~0.38). + contraction_rate : float, optional + Contraction rate of outer diameter. This can affect the speed of the + close random packing algorithm. Default value is 1/400. + seed : int, optional + RNG seed. + + Returns + ------- + trisos : list of openmc.model.TRISO + List of TRISO particles in the domain. + + Notes + ----- + The particle configuration is generated using a combination of random + sequential packing (RSP) and close random packing (CRP). RSP performs + better than CRP for lower packing fractions (pf), but it becomes + prohibitively slow as it approaches its packing limit (~0.38). CRP can + achieve higher pf of up to ~0.64 and scales better with increasing pf. + + If the desired pf is below some threshold for which RSP will be faster than + CRP ('initial_packing_fraction'), only RSP is used. If a higher pf is + required, particles with a radius smaller than the desired final radius + (and therefore with a smaller pf) are initialized within the domain using + RSP. This initial configuration of particles is then used as a starting + point for CRP using Jodrey and Tory's algorithm [1]_. + + In RSP, particle centers are placed one by one at random, and placement + attempts for a particle are made until the particle is not overlapping any + others. This implementation of the algorithm uses a mesh over the domain + to speed up the nearest neighbor search by only searching for a particle's + neighbors within that mesh cell. + + In CRP, each particle is assigned two diameters, and inner and an outer, + which approach each other during the simulation. The inner diameter, + defined as the minimum center-to-center distance, is the true diameter of + the particles and defines the pf. At each iteration the worst overlap + between particles based on outer diameter is eliminated by moving the + particles apart along the line joining their centers. Iterations continue + until the two diameters converge or until the desired pf is reached. + + References + ---------- + .. [1] W. S. Jodrey and E. M. Tory, "Computer simulation of close random + packing of equal spheres", Phys. Rev. A 32 (1985) 2347-2351. + + """ + # Check for valid container geometry and dimensions if domain_shape not in ['cube', 'cylinder', 'sphere']: raise ValueError('Unable to set domain_shape to "{}". Only "cube", ' @@ -928,9 +961,15 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, raise ValueError('"domain_radius" must be specified for {} domain ' 'geometry '.format(domain_shape)) - domain_volume = get_domain_volume() - llim, ulim = get_boundary_extremes() - offset = get_particle_offset() + if domain_shape is 'cube': + domain = _CubicDomain(length=domain_length, particle_radius=radius, + center=domain_center) + elif domain_shape is 'cylinder': + domain = _CylindricalDomain(length=domain_length, radius=domain_radius, + particle_radius=radius, center=domain_center) + elif domain_shape is 'sphere': + domain = _SphericalDomain(radius=domain_radius, particle_radius=radius, + center=domain_center) # Calculate the packing fraction if the number of particles is specified; # otherwise, calculate the number of particles from the packing fraction. @@ -939,9 +978,9 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, raise ValueError('Exactly one of "n_particles" and "packing_fraction" ' 'must be specified.') elif packing_fraction is None: - packing_fraction = 4/3*pi*radius**3*n_particles / domain_volume + packing_fraction = 4/3*pi*radius**3*n_particles / domain.volume elif n_particles is None: - n_particles = int(packing_fraction*domain_volume // (4/3*pi*radius**3)) + n_particles = int(packing_fraction*domain.volume // (4/3*pi*radius**3)) # Check for valid packing fractions for each algorithm if packing_fraction >= 0.64: @@ -957,48 +996,26 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, if packing_fraction > 0.3: initial_packing_fraction = 0.3 - # Set domain dependent functions - if domain_shape is 'cube': - random_point = random_point_cube - cell_list = cell_list_cube - cell_index = cell_index_cube - elif domain_shape is 'cylinder': - random_point = random_point_cylinder - cell_list = cell_list_cylinder - cell_index = cell_index_cylinder - elif domain_shape is 'sphere': - random_point = random_point_sphere - cell_list = cell_list_sphere - cell_index = cell_index_sphere - random.seed(seed) + # Set parameters for initial random sequential packing of particles. + initial_radius = (3/4 * initial_packing_fraction * domain.volume / + (pi * n_particles))**(1/3) + domain.particle_radius = initial_radius + domain.limits = [[x - initial_radius + radius for x in domain.limits[0]], + [x + initial_radius - radius for x in domain.limits[1]]] + # Generate non-overlapping particles for an initial inner radius using # random sequential packing algorithm - particles = random_sequential_pack() + particles = _random_sequential_pack(domain, n_particles) # Use the particle configuration produced in random sequential packing as a # starting point for close random pack with the desired final particle radius if initial_packing_fraction != packing_fraction: - diameter = 2*radius - cell_length = get_cell_length(radius) - - # Outer diameter initially set to arbitrary value that yields pf of 1 - initial_outer_diameter = 2*(domain_volume/(n_particles*4/3*pi))**(1/3) - - # Inner and outer diameter of particles will change during packing - outer_diameter = [initial_outer_diameter] - inner_diameter = [0] - - rods = [] - rods_map = {} - mesh = defaultdict(set) - mesh_map = defaultdict(set) - - close_random_pack() + domain.particle_radius = radius + _close_random_pack(domain, particles, contraction_rate) trisos = [] for p in particles: - trisos.append(TRISO(radius, fill, p + offset)) - + trisos.append(TRISO(radius, fill, p)) return trisos diff --git a/tests/test_triso/inputs_true.dat b/tests/test_triso/inputs_true.dat index 0df6042f6a..aed053263e 100644 --- a/tests/test_triso/inputs_true.dat +++ b/tests/test_triso/inputs_true.dat @@ -1 +1 @@ -2285ba99573743929cee590e2ba4d86becbf38d58af765498b73425f2fa3ccc3e0d20a59260d283a3ff39038d87e12142e0156b22152ccecbe2609a291d1d347 \ No newline at end of file +792d82b08d5fa6ac19df668d84cb90cbbe178e8769c87b732e9616ffeb70d8cfb4096607e58cda749cb800bb48139ac72f6983e84f38237d7d55711bdd1c6d4d \ No newline at end of file From 6b151e356367a1d06b8da6c11e3b14a9dca09dda Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 26 Aug 2016 09:11:01 -0500 Subject: [PATCH 135/168] Update data for Travis --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index f243a1c5a1..845c103906 100644 --- a/.travis.yml +++ b/.travis.yml @@ -42,7 +42,7 @@ install: true before_script: - if [[ ! -e $HOME/nndc_hdf5/cross_sections.xml ]]; then - wget https://www.dropbox.com/s/6cvzl80lpkar87f/nndc_hdf5.tar.xz -O - | tar -C $HOME -xvJ; + wget https://anl.box.com/shared/static/68b2yhu8e6mx1f6hnbzz9mxsgg42d9ls.xz -O - | tar -C $HOME -xvJ; fi - export OPENMC_CROSS_SECTIONS=$HOME/nndc_hdf5/cross_sections.xml From 6d82c7b48b9a83f0b6ad7f73c57562e920954e97 Mon Sep 17 00:00:00 2001 From: amandalund Date: Fri, 26 Aug 2016 12:08:13 -0500 Subject: [PATCH 136/168] Address #706 comments --- openmc/model/triso.py | 190 +++++++++++++++++++++--------------------- 1 file changed, 97 insertions(+), 93 deletions(-) diff --git a/openmc/model/triso.py b/openmc/model/triso.py index d0d67b6878..83be99a33a 100644 --- a/openmc/model/triso.py +++ b/openmc/model/triso.py @@ -124,8 +124,6 @@ class _Domain(object): __metaclass__ = ABCMeta def __init__(self, particle_radius, center=[0., 0., 0.]): - self._particle_radius = None - self._center = None self._cell_length = None self._limits = None @@ -140,13 +138,13 @@ class _Domain(object): def center(self): return self._center - @property - def cell_length(self): - return self._cell_length - - @property + @abstractproperty def limits(self): - return self._limits + pass + + @abstractproperty + def cell_length(self): + pass @abstractproperty def volume(self): @@ -155,7 +153,8 @@ class _Domain(object): @particle_radius.setter def particle_radius(self, particle_radius): self._particle_radius = float(particle_radius) - self.reset() + self._limits = None + self._cell_length = None @center.setter def center(self, center): @@ -163,15 +162,8 @@ class _Domain(object): raise ValueError('Unable to set domain center to {} since it must ' 'be of length 3'.format(center)) self._center = [float(x) for x in center] - self.reset() - - @cell_length.setter - def cell_length(self, cell_length): - self._cell_length = cell_length - - @limits.setter - def limits(self, limits): - self._limits = limits + self._limits = None + self._cell_length = None def mesh_cell(self, p): """Calculate the index of the cell in a mesh overlaid on the domain in @@ -210,14 +202,6 @@ class _Domain(object): for i in range(3)] return list(itertools.product(*({int(x) for x in y} for y in r))) - @abstractmethod - def reset(self): - """Recalculate attributes that depend on input parameters if any of the - parameters are modified. - - """ - pass - @abstractmethod def random_point(self): """Generate Cartesian coordinates of center of a particle that is @@ -270,28 +254,39 @@ class _CubicDomain(_Domain): super(_CubicDomain, self).__init__(particle_radius, center) self.length = length - @property - def volume(self): - return self.length**3 - @property def length(self): return self._length + @property + def limits(self): + if self._limits is None: + xlim = self.length/2 - self.particle_radius + self._limits = [[x - xlim for x in self.center], + [x + xlim for x in self.center]] + return self._limits + + @property + def cell_length(self): + if self._cell_length is None: + mesh_length = [self.length, self.length, self.length] + self._cell_length = [x/int(x/(4*self.particle_radius)) + for x in mesh_length] + return self._cell_length + + @property + def volume(self): + return self.length**3 + @length.setter def length(self, length): self._length = float(length) - self.reset() + self._limits = None + self._cell_length = None - def reset(self): - if (self.particle_radius is not None and self.center is not None - and self.length is not None): - xlim = self.length/2 - self.particle_radius - self.limits = [[x - xlim for x in self.center], - [x + xlim for x in self.center]] - mesh_length = [self.length, self.length, self.length] - self.cell_length = [x/int(x/(4*self.particle_radius)) - for x in mesh_length] + @limits.setter + def limits(self, limits): + self._limits = limits def random_point(self): return [uniform(self.limits[0][0], self.limits[1][0]), @@ -341,10 +336,6 @@ class _CylindricalDomain(_Domain): self.length = length self.radius = radius - @property - def volume(self): - return self.length * pi * self.radius**2 - @property def length(self): return self._length @@ -353,28 +344,44 @@ class _CylindricalDomain(_Domain): def radius(self): return self._radius + @property + def limits(self): + if self._limits is None: + xlim = self.length/2 - self.particle_radius + rlim = self.radius - self.particle_radius + self._limits = [[self.center[0] - rlim, self.center[1] - rlim, + self.center[2] - xlim], + [self.center[0] + rlim, self.center[1] + rlim, + self.center[2] + xlim]] + return self._limits + + @property + def cell_length(self): + if self._cell_length is None: + mesh_length = [2*self.radius, 2*self.radius, self.length] + self._cell_length = [x/int(x/(4*self.particle_radius)) + for x in mesh_length] + return self._cell_length + + @property + def volume(self): + return self.length * pi * self.radius**2 + @length.setter def length(self, length): self._length = float(length) - self.reset() + self._limits = None + self._cell_length = None @radius.setter def radius(self, radius): self._radius = float(radius) - self.reset() + self._limits = None + self._cell_length = None - def reset(self): - if (self.particle_radius is not None and self.center is not None - and self.length is not None and self.radius is not None): - xlim = self.length/2 - self.particle_radius - rlim = self.radius - self.particle_radius - self.limits = [[self.center[0] - rlim, self.center[1] - rlim, - self.center[2] - xlim], - [self.center[0] + rlim, self.center[1] + rlim, - self.center[2] + xlim]] - mesh_length = [2*self.radius, 2*self.radius, self.length] - self.cell_length = [x/int(x/(4*self.particle_radius)) - for x in mesh_length] + @limits.setter + def limits(self, limits): + self._limits = limits def random_point(self): r = sqrt(uniform(0, (self.radius - self.particle_radius)**2)) @@ -419,28 +426,39 @@ class _SphericalDomain(_Domain): super(_SphericalDomain, self).__init__(particle_radius, center) self.radius = radius - @property - def volume(self): - return 4/3 * pi * self.radius**3 - @property def radius(self): return self._radius + @property + def limits(self): + if self._limits is None: + rlim = self.radius - self.particle_radius + self._limits = [[x - rlim for x in self.center], + [x + rlim for x in self.center]] + return self._limits + + @property + def cell_length(self): + if self._cell_length is None: + mesh_length = [2*self.radius, 2*self.radius, 2*self.radius] + self._cell_length = [x/int(x/(4*self.particle_radius)) + for x in mesh_length] + return self._cell_length + + @property + def volume(self): + return 4/3 * pi * self.radius**3 + @radius.setter def radius(self, radius): self._radius = float(radius) - self.reset() + self._limits = None + self._cell_length = None - def reset(self): - if (self.particle_radius is not None and self.center is not None - and self.radius is not None): - rlim = self.radius - self.particle_radius - self.limits = [[x - rlim for x in self.center], - [x + rlim for x in self.center]] - mesh_length = [2*self.radius, 2*self.radius, 2*self.radius] - self.cell_length = [x/int(x/(4*self.particle_radius)) - for x in mesh_length] + @limits.setter + def limits(self, limits): + self._limits = limits def random_point(self): x = (gauss(0, 1), gauss(0, 1), gauss(0, 1)) @@ -592,7 +610,6 @@ def _close_random_pack(domain, particles, contraction_rate): rods_map[j] = (i, rod) heappush(rods, rod) - def remove_rod(i): """Mark the rod containing particle i as removed. @@ -609,7 +626,6 @@ def _close_random_pack(domain, particles, contraction_rate): rod[1] = None rod[2] = None - def pop_rod(): """Remove and return the shortest rod. @@ -629,7 +645,6 @@ def _close_random_pack(domain, particles, contraction_rate): del rods_map[j] return d, i, j - def create_rod_list(): """Generate sorted list of rods (distances between particle centers). @@ -660,14 +675,15 @@ def _close_random_pack(domain, particles, contraction_rate): # distances to nearest neighbors a = np.dstack(([i for i in range(len(n))], n, d))[0] - # Array of nearest neighbor indices, indices of particles they are + # Sort along second column and swap first and second columns to create + # array of nearest neighbor indices, indices of particles they are # nearest neighbors of, and distances between them b = a[a[:,1].argsort()] b[:,[0, 1]] = b[:,[1, 0]] # Find the intersection between 'a' and 'b': a list of particles who # are each other's nearest neighbors and the distance between them - r = [x for x in {tuple(x) for x in a} & {tuple(x) for x in b}] + r = list([x for x in {tuple(x) for x in a} & {tuple(x) for x in b}]) # Remove duplicate rods and sort by distance r = map(list, set([(x[2], int(min(x[0:2])), int(max(x[0:2]))) @@ -684,7 +700,6 @@ def _close_random_pack(domain, particles, contraction_rate): if rods: inner_diameter[0] = rods[0][0] - def update_mesh(i): """Update which mesh cells the particle is in based on new particle center coordinates. @@ -713,7 +728,6 @@ def _close_random_pack(domain, particles, contraction_rate): mesh[idx].add(i) mesh_map[i].add(idx) - def reduce_outer_diameter(): """Reduce the outer diameter so that at the (i+1)-st iteration it is: @@ -725,9 +739,9 @@ def _close_random_pack(domain, particles, contraction_rate): """ - inner_pf = (4/3 * pi * (inner_diameter[0]/2)**3 * n_particles / + inner_pf = (4/3 * pi * (inner_diameter[0]/2)**3 * n_particles / domain.volume) - outer_pf = (4/3 * pi * (outer_diameter[0]/2)**3 * n_particles / + outer_pf = (4/3 * pi * (outer_diameter[0]/2)**3 * n_particles / domain.volume) j = floor(-log10(outer_pf - inner_pf)) @@ -762,20 +776,12 @@ def _close_random_pack(domain, particles, contraction_rate): particles[j] -= r*v # Apply reflective boundary conditions - for k in range(3): - if particles[i][k] < domain.limits[0][k]: - particles[i][k] = domain.limits[0][k] - elif particles[i][k] > domain.limits[1][k]: - particles[i][k] = domain.limits[1][k] - if particles[j][k] < domain.limits[0][k]: - particles[j][k] = domain.limits[0][k] - elif particles[j][k] > domain.limits[1][k]: - particles[j][k] = domain.limits[1][k] + particles[i] = particles[i].clip(domain.limits[0], domain.limits[1]) + particles[j] = particles[j].clip(domain.limits[0], domain.limits[1]) update_mesh(i) update_mesh(j) - def nearest(i): """Find index of nearest neighbor of particle i. @@ -805,7 +811,6 @@ def _close_random_pack(domain, particles, contraction_rate): else: return None, None - def update_rod_list(i, j): """Update the rod list with the new nearest neighbors of particles i and j since their overlap was eliminated. @@ -834,7 +839,6 @@ def _close_random_pack(domain, particles, contraction_rate): if rods: inner_diameter[0] = rods[0][0] - n_particles = len(particles) diameter = 2*domain.particle_radius From 19eca29642bf0cbe7d4bc024e9fc93ecce3fe71e Mon Sep 17 00:00:00 2001 From: amandalund Date: Fri, 26 Aug 2016 16:19:12 -0500 Subject: [PATCH 137/168] Address #706 comments --- openmc/model/triso.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/model/triso.py b/openmc/model/triso.py index 83be99a33a..b75ffd88fb 100644 --- a/openmc/model/triso.py +++ b/openmc/model/triso.py @@ -673,7 +673,7 @@ def _close_random_pack(domain, particles, contraction_rate): # Array of particle indices, indices of nearest neighbors, and # distances to nearest neighbors - a = np.dstack(([i for i in range(len(n))], n, d))[0] + a = np.vstack((list(range(n.size)), n, d)).T # Sort along second column and swap first and second columns to create # array of nearest neighbor indices, indices of particles they are From 56f85323b84d9b15e31fc9934bc217230723f843 Mon Sep 17 00:00:00 2001 From: amandalund Date: Fri, 26 Aug 2016 17:13:09 -0500 Subject: [PATCH 138/168] Make sure input parameters are native Python types --- openmc/model/triso.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openmc/model/triso.py b/openmc/model/triso.py index b75ffd88fb..e8ed04e3a0 100644 --- a/openmc/model/triso.py +++ b/openmc/model/triso.py @@ -982,8 +982,10 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, raise ValueError('Exactly one of "n_particles" and "packing_fraction" ' 'must be specified.') elif packing_fraction is None: + n_particles = int(n_particles) packing_fraction = 4/3*pi*radius**3*n_particles / domain.volume elif n_particles is None: + packing_fraction = float(packing_fraction) n_particles = int(packing_fraction*domain.volume // (4/3*pi*radius**3)) # Check for valid packing fractions for each algorithm From 203f64023c48be5c6434d8bb939e7630e53bd152 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Fri, 26 Aug 2016 21:04:26 -0400 Subject: [PATCH 139/168] Fixed a problem where in openmc-ace-to-hdf5 was over-writing h5 files instead of appending temperatures --- scripts/openmc-ace-to-hdf5 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/openmc-ace-to-hdf5 b/scripts/openmc-ace-to-hdf5 index 9a55ca7493..3b5721972f 100755 --- a/scripts/openmc-ace-to-hdf5 +++ b/scripts/openmc-ace-to-hdf5 @@ -115,6 +115,7 @@ elif args.xsdata is not None: else: ace_libraries = args.libraries +nuclides = {} library = openmc.data.DataLibrary() for filename in ace_libraries: @@ -124,11 +125,11 @@ for filename in ace_libraries: continue lib = openmc.data.ace.Library(filename) - nuclides = {} for table in lib.tables: name, xs = table.name.split('.') if xs.endswith('c'): # Continuous-energy neutron data + if name not in nuclides: try: neutron = openmc.data.IncidentNeutron.from_ace( From 771f2770f44c6e60018a03ed46aa8669ec4ebf11 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sat, 27 Aug 2016 12:35:12 -0400 Subject: [PATCH 140/168] updated openmc-ace-to-hdf5 to work for JEFF --- scripts/openmc-ace-to-hdf5 | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/scripts/openmc-ace-to-hdf5 b/scripts/openmc-ace-to-hdf5 index 3b5721972f..b926698c99 100755 --- a/scripts/openmc-ace-to-hdf5 +++ b/scripts/openmc-ace-to-hdf5 @@ -129,7 +129,6 @@ for filename in ace_libraries: name, xs = table.name.split('.') if xs.endswith('c'): # Continuous-energy neutron data - if name not in nuclides: try: neutron = openmc.data.IncidentNeutron.from_ace( @@ -160,13 +159,17 @@ for filename in ace_libraries: nuclides[name] = outfile else: # Then we only need to append the data - print('Converting {} (ACE) to {} (HDF5)'.format(table.name, - neutron.name)) - neutron = \ - openmc.data.IncidentNeutron.from_hdf5(nuclides[name]) - neutron.add_temperature_from_ace(table, args.metastable) - neutron.export_to_hdf5(outfile + '_1', 'w') - os.rename(outfile + '_1', outfile) + try: + neutron = \ + openmc.data.IncidentNeutron.from_hdf5(nuclides[name]) + print('Converting {} (ACE) to {} (HDF5)'.format(table.name, + neutron.name)) + neutron.add_temperature_from_ace(table, args.metastable) + neutron.export_to_hdf5(nuclides[name] + '_1', 'w') + os.rename(nuclides[name] + '_1', nuclides[name]) + except Exception as e: + print('Failed to convert {}: {}'.format(table.name, e)) + continue elif xs.endswith('t'): # Thermal scattering data @@ -192,14 +195,16 @@ for filename in ace_libraries: else: # Then we only need to append the data - print('Converting {} (ACE) to {} (HDF5)'.format(table.name, - thermal.name)) - # if table.name == 'poly.11t': - # import pdb; pdb.set_trace() - thermal = openmc.data.ThermalScattering.from_hdf5(nuclides[name]) - thermal.add_temperature_from_ace(table) - thermal.export_to_hdf5(outfile + '_1', 'w') - os.rename(outfile + '_1', outfile) + try: + thermal = openmc.data.ThermalScattering.from_hdf5(nuclides[name]) + print('Converting {} (ACE) to {} (HDF5)'.format(table.name, + thermal.name)) + thermal.add_temperature_from_ace(table) + thermal.export_to_hdf5(nuclides[name] + '_1', 'w') + os.rename(nuclides[name] + '_1', nuclides[name]) + except Exception as e: + print('Failed to convert {}: {}'.format(table.name, e)) + continue # Write cross_sections.xml libpath = os.path.join(args.destination, 'cross_sections.xml') From 6eaf6e04d0b739aab40f1f382761fb7b8b220cc2 Mon Sep 17 00:00:00 2001 From: jingang Date: Sun, 28 Aug 2016 17:28:23 -0400 Subject: [PATCH 141/168] openmc.plot can now set 'meshlines' and 'level' --- docs/source/usersguide/input.rst | 4 +- openmc/plots.py | 102 +++++++++++++++++++++++++++++-- 2 files changed, 99 insertions(+), 7 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 4bbc96cf86..2ab823e6ed 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -2105,8 +2105,8 @@ attributes or sub-elements. These are not used in "voxel" plots: *Default*: None :meshlines: - The ``meshlines`` sub-element allows for plotting the boundaries of - a tally mesh on top of a plot. Only one ``meshlines`` element is allowed per + The ``meshlines`` sub-element allows for plotting the boundaries of a + regular mesh on top of a plot. Only one ``meshlines`` element is allowed per ``plot`` element, and it must contain as attributes or sub-elements a mesh type and a linewidth. Optionally, a color may be specified for the overlay: diff --git a/openmc/plots.py b/openmc/plots.py index 73b51da5e8..4dacabf288 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -67,6 +67,16 @@ class Plot(object): col_spec : dict Dictionary indicating that certain cells/materials (keys) should be colored with a specific RGB (values) + level : int + Universe depth to plot at + meshlines_type : {'tally', 'entropy', 'ufs', 'cmfd'} + The type of the mesh to be plotted + meshlines_id : int + ID for the mesh specified on ``tallies.xml`` that should be plotted + meshlines_linewidth : int + Pixels of linewidth to specify for the mesh boundaries + meshlines_color : Iterable of int + Color for the meshlines boundaries by RGB. """ @@ -85,6 +95,11 @@ class Plot(object): self._mask_components = None self._mask_background = None self._col_spec = None + self._level = None + self._meshlines_type = None + self._meshlines_id = None + self._meshlines_linewidth = None + self._meshlines_color = None @property def id(self): @@ -138,6 +153,26 @@ class Plot(object): def col_spec(self): return self._col_spec + @property + def level(self): + return self._level + + @property + def meshlines_type(self): + return self._meshlines_type + + @property + def meshlines_id(self): + return self._meshlines_id + + @property + def meshlines_linewidth(self): + return self._meshlines_linewidth + + @property + def meshlines_color(self): + return self._meshlines_color + @id.setter def id(self, plot_id): if plot_id is None: @@ -231,9 +266,9 @@ class Plot(object): @mask_components.setter def mask_components(self, mask_components): - cv.check_type('plot mask_components', mask_components, Iterable, Integral) + cv.check_type('plot mask components', mask_components, Iterable, Integral) for component in mask_components: - cv.check_greater_than('plot mask_components', component, 0, True) + cv.check_greater_than('plot mask components', component, 0, True) self._mask_components = mask_components @mask_background.setter @@ -245,6 +280,40 @@ class Plot(object): cv.check_less_than('plot mask background', rgb, 256) self._mask_background = mask_background + @level.setter + def level(self, plot_level): + cv.check_type('plot level', plot_level, Integral) + cv.check_greater_than('plot level', plot_level, 0, equality=True) + self._level = plot_level + + @meshlines_type.setter + def meshlines_type(self, meshlines_type): + cv.check_type('plot meshlines type', meshlines_type, basestring) + cv.check_value('plot meshlines type', meshlines_type, + ['tally', 'entropy', 'ufs', 'cmfd']) + self._meshlines_type = meshlines_type + + @meshlines_id.setter + def meshlines_id(self, mesh_id): + cv.check_type('plot meshlines id', mesh_id, Integral) + cv.check_greater_than('plot meshlines id', mesh_id, 0, equality=True) + self._meshlines_id = mesh_id + + @meshlines_linewidth.setter + def meshlines_linewidth(self, linewidth): + cv.check_type('plot mesh linewidth', linewidth, Integral) + cv.check_greater_than('plot mesh linewidth', linewidth, 0, equality=True) + self._meshlines_linewidth = linewidth + + @meshlines_color.setter + def meshlines_color(self, color): + cv.check_type('plot meshlines color', color, Iterable, Integral) + cv.check_length('plot meshlines color', color, 3) + for rgb in color: + cv.check_greater_than('plot meshlines color', rgb, 0, True) + cv.check_less_than('plot meshlines color', rgb, 256) + self._meshlines_color = color + def __repr__(self): string = 'Plot\n' string += '{0: <16}{1}{2}\n'.format('\tID', '=\t', self._id) @@ -256,11 +325,20 @@ class Plot(object): string += '{0: <16}{1}{2}\n'.format('\tOrigin', '=\t', self._origin) string += '{0: <16}{1}{2}\n'.format('\tPixels', '=\t', self._origin) string += '{0: <16}{1}{2}\n'.format('\tColor', '=\t', self._color) - string += '{0: <16}{1}{2}\n'.format('\tMask', '=\t', + string += '{0: <16}{1}{2}\n'.format('\tMask components', '=\t', self._mask_components) - string += '{0: <16}{1}{2}\n'.format('\tMask', '=\t', + string += '{0: <16}{1}{2}\n'.format('\tMask background', '=\t', self._mask_background) string += '{0: <16}{1}{2}\n'.format('\tCol Spec', '=\t', self._col_spec) + string += '{0: <16}{1}{2}\n'.format('\tLevel', '=\t', self._level) + string += '{0: <16}{1}{2}\n'.format('\tMeshlines type', '=\t', + self._meshlines_type) + string += '{0: <16}{1}{2}\n'.format('\tMeshlines id', '=\t', + self._meshlines_id) + string += '{0: <16}{1}{2}\n'.format('\tMeshlines color', '=\t', + self._meshlines_color) + string += '{0: <16}{1}{2}\n'.format('\tMeshlines linewidth', '=\t', + self._meshlines_linewidth) return string def colorize(self, geometry, seed=1): @@ -382,7 +460,7 @@ class Plot(object): subelement = ET.SubElement(element, "pixels") subelement.text = ' '.join(map(str, self._pixels)) - if self._mask_background is not None: + if self._background is not None: subelement = ET.SubElement(element, "background") subelement.text = ' '.join(map(str, self._background)) @@ -400,6 +478,20 @@ class Plot(object): subelement.set("background", ' '.join(map( str, self._mask_background))) + if self._level is not None: + subelement = ET.SubElement(element, "level") + subelement.text = ' '.join(str(self._level)) + + if self._meshlines_type is not None: + subelement = ET.SubElement(element, "meshlines") + subelement.set("meshtype", self._meshlines_type) + if self._meshlines_id is not None: + subelement.set("id", str(self._meshlines_id)) + if self._meshlines_linewidth is not None: + subelement.set("linewidth", str(self._meshlines_linewidth)) + if self._meshlines_color is not None: + subelement.set("color", ' '.join(map(str, self._meshlines_color))) + return element From 26bdadd79aac3712450d8c0612ac3edcb68e720f Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 29 Aug 2016 10:05:00 -0400 Subject: [PATCH 142/168] removed redundant code in tally.F90 and addressed other PR comments --- .../pythonapi/examples/tally-arithmetic.ipynb | 64 +- openmc/filter.py | 20 +- src/tally.F90 | 556 +++++------------- 3 files changed, 188 insertions(+), 452 deletions(-) diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index 088af07b30..b4b41f8d28 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -339,7 +339,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIFw8YNfjajoIAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDgtMjNUMTU6MjQ6\nNTMtMDQ6MDANSReSAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA4LTIzVDE1OjI0OjUzLTA0OjAw\nfBSvLgAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIHQoDEQSZg0YAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDgtMjlUMTA6MDM6\nMTctMDQ6MDAuYJb8AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA4LTI5VDEwOjAzOjE3LTA0OjAw\nXz0uQAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -567,8 +567,8 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.8.0\n", - " Git SHA1: 93862cea249e4441beb714e719120da3bd2b7d0a\n", - " Date/Time: 2016-08-23 15:24:53\n", + " Git SHA1: 11dea6f26aaa07794a484b8d009a75cce36a8784\n", + " Date/Time: 2016-08-29 10:03:18\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -625,20 +625,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 5.4300E-01 seconds\n", - " Reading cross sections = 3.5400E-01 seconds\n", - " Total time in simulation = 1.8555E+01 seconds\n", - " Time in transport only = 1.8464E+01 seconds\n", - " Time in inactive batches = 2.4600E+00 seconds\n", - " Time in active batches = 1.6095E+01 seconds\n", - " Time synchronizing fission bank = 1.1000E-02 seconds\n", - " Sampling source sites = 4.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Total time for initialization = 4.6700E-01 seconds\n", + " Reading cross sections = 2.8600E-01 seconds\n", + " Total time in simulation = 1.9770E+01 seconds\n", + " Time in transport only = 1.9753E+01 seconds\n", + " Time in inactive batches = 2.4920E+00 seconds\n", + " Time in active batches = 1.7278E+01 seconds\n", + " Time synchronizing fission bank = 0.0000E+00 seconds\n", + " Sampling source sites = 0.0000E+00 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 3.0000E-03 seconds\n", - " Total time elapsed = 1.9120E+01 seconds\n", - " Calculation Rate (inactive) = 5081.30 neutrons/second\n", - " Calculation Rate (active) = 2329.92 neutrons/second\n", + " Total time for finalization = 2.0000E-03 seconds\n", + " Total time elapsed = 2.0257E+01 seconds\n", + " Calculation Rate (inactive) = 5016.05 neutrons/second\n", + " Calculation Rate (active) = 2170.39 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -731,8 +731,8 @@ " 0\n", " total\n", " (nu-fission / (absorption + current))\n", - " 1.02431\n", - " 0.00704\n", + " 1.007511\n", + " 0.007114\n", " \n", " \n", "\n", @@ -740,7 +740,7 @@ ], "text/plain": [ " nuclide score mean std. dev.\n", - "0 total (nu-fission / (absorption + current)) 1.02e+00 7.04e-03" + "0 total (nu-fission / (absorption + current)) 1.01e+00 7.11e-03" ] }, "execution_count": 24, @@ -802,8 +802,8 @@ " 6.250000e-07\n", " total\n", " (absorption + current)\n", - " 0.695303\n", - " 0.005091\n", + " 0.695851\n", + " 0.00511\n", " \n", " \n", "\n", @@ -814,7 +814,7 @@ "0 0.00e+00 6.25e-07 total (absorption + current) \n", "\n", " mean std. dev. \n", - "0 6.95e-01 5.09e-03 " + "0 6.96e-01 5.11e-03 " ] }, "execution_count": 25, @@ -1064,8 +1064,8 @@ " 6.250000e-07\n", " total\n", " (absorption + current)\n", - " 0.985102\n", - " 0.005855\n", + " 0.970693\n", + " 0.005989\n", " \n", " \n", "\n", @@ -1076,7 +1076,7 @@ "0 0.00e+00 6.25e-07 total (absorption + current) \n", "\n", " mean std. dev. \n", - "0 9.85e-01 5.86e-03 " + "0 9.71e-01 5.99e-03 " ] }, "execution_count": 29, @@ -1093,7 +1093,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "The final factor is the thermalnon-leakage probability and is computed as $$P_{TNL} = \\frac{\\langle \\Sigma_a\\phi \\rangle_T}{\\langle \\Sigma_a \\phi \\rangle_T + \\langle L \\rangle_T}$$" + "The final factor is the thermal non-leakage probability and is computed as $$P_{TNL} = \\frac{\\langle \\Sigma_a\\phi \\rangle_T}{\\langle \\Sigma_a \\phi \\rangle_T + \\langle L \\rangle_T}$$" ] }, { @@ -1126,8 +1126,8 @@ " 6.250000e-07\n", " total\n", " (absorption / (absorption + current))\n", - " 0.997407\n", - " 0.008492\n", + " 0.994827\n", + " 0.008481\n", " \n", " \n", "\n", @@ -1138,7 +1138,7 @@ "0 0.00e+00 6.25e-07 total \n", "\n", " score mean std. dev. \n", - "0 (absorption / (absorption + current)) 9.97e-01 8.49e-03 " + "0 (absorption / (absorption + current)) 9.95e-01 8.48e-03 " ] }, "execution_count": 30, @@ -1190,8 +1190,8 @@ " 10000\n", " total\n", " ((((((absorption + current) * nu-fission) * ab...\n", - " 1.02431\n", - " 0.02062\n", + " 1.007511\n", + " 0.020364\n", " \n", " \n", "\n", @@ -1202,7 +1202,7 @@ "0 0.00e+00 6.25e-07 10000 total \n", "\n", " score mean std. dev. \n", - "0 ((((((absorption + current) * nu-fission) * ab... 1.02e+00 2.06e-02 " + "0 ((((((absorption + current) * nu-fission) * ab... 1.01e+00 2.04e-02 " ] }, "execution_count": 31, diff --git a/openmc/filter.py b/openmc/filter.py index 771d40401c..4961ce7252 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -17,6 +17,13 @@ _FILTER_TYPES = ['universe', 'material', 'cell', 'cellborn', 'surface', 'mesh', 'energy', 'energyout', 'mu', 'polar', 'azimuthal', 'distribcell', 'delayedgroup'] +_CURRENT_NAMES = {1: 'x-min out', 2: 'x-max out', + 3: 'y-min out', 4: 'y-max out', + 5: 'z-min out', 6: 'z-max out', + 7: 'x-min in', 8: 'x-max in', + 9: 'y-min in', 10: 'y-max in', + 11: 'z-min in', 12: 'z-max in'} + class Filter(object): """A filter used to constrain a tally to a specific criterion, e.g. only tally events when the particle is in a certain cell and energy range. @@ -781,18 +788,7 @@ class Filter(object): filter_bins = np.repeat(self.bins, self.stride) tile_factor = data_size / len(filter_bins) filter_bins = np.tile(filter_bins, tile_factor) - filter_bins = [x if x != 1 else 'x-min out' for x in filter_bins] - filter_bins = [x if x != 2 else 'x-max out' for x in filter_bins] - filter_bins = [x if x != 3 else 'y-min out' for x in filter_bins] - filter_bins = [x if x != 4 else 'y-max out' for x in filter_bins] - filter_bins = [x if x != 5 else 'z-min out' for x in filter_bins] - filter_bins = [x if x != 6 else 'z-max out' for x in filter_bins] - filter_bins = [x if x != 7 else 'x-min in' for x in filter_bins] - filter_bins = [x if x != 8 else 'x-max in' for x in filter_bins] - filter_bins = [x if x != 9 else 'y-min in' for x in filter_bins] - filter_bins = [x if x != 10 else 'y-max in' for x in filter_bins] - filter_bins = [x if x != 11 else 'z-min in' for x in filter_bins] - filter_bins = [x if x != 12 else 'z-max in' for x in filter_bins] + filter_bins = [_CURRENT_NAMES[x] for x in filter_bins] df = pd.concat([df, pd.DataFrame({self.type : filter_bins})]) # universe, material, surface, cell, and cellborn filters diff --git a/src/tally.F90 b/src/tally.F90 index 7f743d134b..e34fecd148 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -2321,6 +2321,9 @@ contains integer :: i_tally integer :: j ! loop indices integer :: k ! loop indices + integer :: d1 ! dimension index + integer :: d2 ! dimension index + integer :: d3 ! dimension index integer :: ijk0(3) ! indices of starting coordinates integer :: ijk1(3) ! indices of ending coordinates integer :: n_cross ! number of surface crossings @@ -2398,231 +2401,96 @@ contains ! ======================================================================= ! SPECIAL CASES WHERE TWO INDICES ARE THE SAME - x_same = (ijk0(1) == ijk1(1)) - y_same = (ijk0(2) == ijk1(2)) - z_same = (ijk0(3) == ijk1(3)) + ! Loop over the dimensions + do d1 = 1, 3 - if (x_same .and. y_same) then - ! Only z crossings - if (uvw(3) > 0) then - do j = ijk0(3), ijk1(3) - 1 - ijk0(3) = j + ! Get the other dimensions + d2 = mod(d1, 3) + 1 + d3 = mod(d1 + 1, 3) + 1 - ! OUT_TOP - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_TOP - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 + ! If cell index in dimension d1 and d2 are the same and the cells is + ! within the mesh bounds + if (ijk0(d1) == ijk1(d1) .and. ijk0(d2) == ijk1(d2) .and. & + ijk0(d1) >= 1 .and. ijk0(d1) <= m % dimension(d1) .and. & + ijk0(d2) >= 1 .and. ijk0(d2) <= m % dimension(d2)) then + + ! Only d3 crossings + if (uvw(d3) > 0) then + + ! Loop over d3 cells + do j = ijk0(d3), ijk1(d3) - 1 + + ! Outward current on d3 max surface + if (j >= 1 .and. j <= m % dimension(d3)) then + ijk0(d3) = j + matching_bins(i_filter_surf) = d3 * 2 + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 !$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt + end if - ! IN_BOTTOM - if (ijk0(1) >= 1 .and. ijk0(2) >= 1 .and. ijk0(3) >= 0 .and. & - ijk0(1) <= m % dimension(1) .and. & - ijk0(2) <= m % dimension(2) .and. & - ijk0(3) < m % dimension(3)) then - ijk0(3) = ijk0(3) + 1 - matching_bins(i_filter_surf) = IN_BOTTOM - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 + ! Inward current on d3 min surface + if (j >= 0 .and. j < m % dimension(d3)) then + ijk0(d3) = j + 1 + matching_bins(i_filter_surf) = d3 * 2 + 5 + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 !$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(3) = ijk0(3) - 1 - end if - end do - else - do j = ijk0(3), ijk1(3) + 1, -1 - ijk0(3) = j + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt + end if + end do + else - ! OUT_BOTTOM - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_BOTTOM - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if + do j = ijk0(d3), ijk1(d3) + 1, -1 - ! IN_TOP - if (ijk0(1) >= 1 .and. ijk0(2) >= 1 .and. ijk0(3) > 1 .and. & - ijk0(1) <= m % dimension(1) .and. & - ijk0(2) <= m % dimension(2) .and. & - ijk0(3) <= m % dimension(3) + 1) then - ijk0(3) = ijk0(3) - 1 - matching_bins(i_filter_surf) = IN_TOP - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 + + ! Outward current on d3 min surface + if (j >= 1 .and. j <= m % dimension(d3)) then + ijk0(d3) = j + matching_bins(i_filter_surf) = d3 * 2 - 1 + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 !$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(3) = ijk0(3) + 1 - end if - end do + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt + end if + + ! Inward current on d3 max surface + if (j > 1 .and. j <= m % dimension(d3) + 1) then + ijk0(d3) = j - 1 + matching_bins(i_filter_surf) = d3 * 2 + 6 + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt + end if + end do + end if + cycle end if - cycle - elseif (x_same .and. z_same) then - ! Only y crossings - if (uvw(2) > 0) then - do j = ijk0(2), ijk1(2) - 1 - ijk0(2) = j - - ! OUT_FRONT - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_FRONT - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if - - ! IN_BACK - if (ijk0(1) >= 1 .and. ijk0(2) >= 0 .and. ijk0(3) >= 1 .and. & - ijk0(1) <= m % dimension(1) .and. & - ijk0(2) < m % dimension(2) .and. & - ijk0(3) <= m % dimension(3)) then - ijk0(2) = ijk0(2) + 1 - matching_bins(i_filter_surf) = IN_BACK - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(2) = ijk0(2) - 1 - end if - end do - else - do j = ijk0(2), ijk1(2) + 1, -1 - ijk0(2) = j - - ! OUT_BACK - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_BACK - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if - - ! IN_FRONT - if (ijk0(1) >= 1 .and. ijk0(2) > 1 .and. ijk0(3) >= 1 .and. & - ijk0(1) <= m % dimension(1) .and. & - ijk0(2) <= m % dimension(2) + 1 .and. & - ijk0(3) <= m % dimension(3)) then - ijk0(2) = ijk0(2) - 1 - matching_bins(i_filter_surf) = IN_FRONT - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(2) = ijk0(2) + 1 - end if - end do - end if - cycle - elseif (y_same .and. z_same) then - ! Only x crossings - if (uvw(1) > 0) then - do j = ijk0(1), ijk1(1) - 1 - ijk0(1) = j - - ! OUT_RIGHT - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_RIGHT - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if - - ! IN_LEFT - if (ijk0(1) >= 0 .and. ijk0(2) >= 1 .and. ijk0(3) >= 1 .and. & - ijk0(1) < m % dimension(1) .and. & - ijk0(2) <= m % dimension(2) .and. & - ijk0(3) <= m % dimension(3)) then - ijk0(1) = ijk0(1) + 1 - matching_bins(i_filter_surf) = IN_LEFT - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(1) = ijk0(1) - 1 - end if - end do - else - do j = ijk0(1), ijk1(1) + 1, -1 - ijk0(1) = j - - ! OUT_LEFT - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_LEFT - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if - - ! IN_RIGHT - if (ijk0(1) > 1 .and. ijk0(2) >= 1 .and. ijk0(3) >= 1 .and. & - ijk0(1) <= m % dimension(1) + 1 .and. & - ijk0(2) <= m % dimension(2) .and. & - ijk0(3) <= m % dimension(3)) then - ijk0(1) = ijk0(1) - 1 - matching_bins(i_filter_surf) = IN_RIGHT - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(1) = ijk0(1) + 1 - end if - end do - end if - cycle - end if + end do ! ======================================================================= ! GENERIC CASE ! Bounding coordinates - do j = 1, 3 - if (uvw(j) > 0) then - xyz_cross(j) = m % lower_left(j) + ijk0(j) * m % width(j) + do d1 = 1, 3 + if (uvw(d1) > 0) then + xyz_cross(d1) = m % lower_left(d1) + ijk0(d1) * m % width(d1) else - xyz_cross(j) = m % lower_left(j) + (ijk0(j) - 1) * m % width(j) + xyz_cross(d1) = m % lower_left(d1) + (ijk0(d1) - 1) * m % width(d1) end if end do @@ -2634,11 +2502,11 @@ contains ! special case where the cosine of the angle is zero since this would ! result in a divide-by-zero. - do j = 1, 3 - if (uvw(j) == 0) then - d(j) = INFINITY + do d1 = 1, 3 + if (uvw(d1) == 0) then + d(d1) = INFINITY else - d(j) = (xyz_cross(j) - xyz0(j))/uvw(j) + d(d1) = (xyz_cross(d1) - xyz0(d1))/uvw(d1) end if end do @@ -2650,211 +2518,83 @@ contains ! Now use the minimum distance and direction of the particle to ! determine which surface was crossed - if (distance == d(1)) then - if (uvw(1) > 0) then + ! Loop over the dimensions + do d1 = 1, 3 - ! OUT_RIGHT - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_RIGHT - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 + ! Get the other dimensions + d2 = mod(d1, 3) + 1 + d3 = mod(d1 + 1, 3) + 1 + + if (distance == d(d1)) then + + ! Check dimension d2 and d3 indices + if (ijk0(d2) >= 1 .and. ijk0(d2) <= m % dimension(d2) .and. & + ijk0(d3) >= 1 .and. ijk0(d3) <= m % dimension(d3)) then + + if (uvw(d1) > 0) then + + ! Outward current on d1 max surface + if (ijk0(d1) >= 1 .and. ijk0(d1) <= m % dimension(d1)) then + matching_bins(i_filter_surf) = d1 * 2 + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 !$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt + end if - ! IN_LEFT - if (ijk0(1) >= 0 .and. ijk0(2) >= 1 .and. ijk0(3) >= 1 .and. & - ijk0(1) < m % dimension(1) .and. & - ijk0(2) <= m % dimension(2) .and. & - ijk0(3) <= m % dimension(3)) then - ijk0(1) = ijk0(1) + 1 - matching_bins(i_filter_surf) = IN_LEFT - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 + ! Inward current on d1 min surface + if (ijk0(d1) >= 0 .and. ijk0(d1) < m % dimension(d1)) then + ijk0(d1) = ijk0(d1) + 1 + matching_bins(i_filter_surf) = d1 * 2 + 5 + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 !$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(1) = ijk0(1) - 1 - end if + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt + ijk0(d1) = ijk0(d1) - 1 + end if - ijk0(1) = ijk0(1) + 1 - xyz_cross(1) = xyz_cross(1) + m % width(1) - else + ijk0(d1) = ijk0(d1) + 1 + xyz_cross(d1) = xyz_cross(d1) + m % width(d1) + else - ! OUT_LEFT - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_LEFT - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 + ! Outward current on d1 min surface + if (ijk0(d1) >= 1 .and. ijk0(d1) <= m % dimension(d1)) then + matching_bins(i_filter_surf) = d1 * 2 - 1 + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 !$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt + end if - ! IN_RIGHT - if (ijk0(1) > 1 .and. ijk0(2) >= 1 .and. ijk0(3) >= 1 .and. & - ijk0(1) <= m % dimension(1) + 1 .and. & - ijk0(2) <= m % dimension(2) .and. & - ijk0(3) <= m % dimension(3)) then - ijk0(1) = ijk0(1) - 1 - matching_bins(i_filter_surf) = IN_RIGHT - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 + ! Inward current on d1 max surface + if (ijk0(d1) > 1 .and. ijk0(d1) <= m % dimension(d1) + 1) then + ijk0(d1) = ijk0(d1) - 1 + matching_bins(i_filter_surf) = d1 * 2 + 6 + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 !$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(1) = ijk0(1) + 1 - end if + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt + ijk0(d1) = ijk0(d1) + 1 + end if - ijk0(1) = ijk0(1) - 1 - xyz_cross(1) = xyz_cross(1) - m % width(1) + ijk0(d1) = ijk0(d1) - 1 + xyz_cross(d1) = xyz_cross(d1) - m % width(d1) + end if + end if end if - elseif (distance == d(2)) then - if (uvw(2) > 0) then - - ! OUT_FRONT - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_FRONT - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if - - ! IN_BACK - if (ijk0(1) >= 1 .and. ijk0(2) >= 0 .and. ijk0(3) >= 1 .and. & - ijk0(1) <= m % dimension(1) .and. & - ijk0(2) < m % dimension(2) .and. & - ijk0(3) <= m % dimension(3)) then - ijk0(2) = ijk0(2) + 1 - matching_bins(i_filter_surf) = IN_BACK - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(2) = ijk0(2) - 1 - end if - - ijk0(2) = ijk0(2) + 1 - xyz_cross(2) = xyz_cross(2) + m % width(2) - else - - ! OUT_BACK - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_BACK - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if - - ! IN_FRONT - if (ijk0(1) >= 1 .and. ijk0(2) > 1 .and. ijk0(3) >= 1 .and. & - ijk0(1) <= m % dimension(1) .and. & - ijk0(2) <= m % dimension(2) + 1 .and. & - ijk0(3) <= m % dimension(3)) then - ijk0(2) = ijk0(2) - 1 - matching_bins(i_filter_surf) = IN_FRONT - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(2) = ijk0(2) + 1 - end if - - ijk0(2) = ijk0(2) - 1 - xyz_cross(2) = xyz_cross(2) - m % width(2) - end if - else if (distance == d(3)) then - if (uvw(3) > 0) then - - ! OUT_TOP - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_TOP - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if - - ! IN_BOTTOM - if (ijk0(1) >= 1 .and. ijk0(2) >= 1 .and. ijk0(3) >= 0 .and. & - ijk0(1) <= m % dimension(1) .and. & - ijk0(2) <= m % dimension(2) .and. & - ijk0(3) < m % dimension(3)) then - ijk0(3) = ijk0(3) + 1 - matching_bins(i_filter_surf) = IN_BOTTOM - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(3) = ijk0(3) - 1 - end if - - ijk0(3) = ijk0(3) + 1 - xyz_cross(3) = xyz_cross(3) + m % width(3) - else - - ! OUT_BOTTOM - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = OUT_BOTTOM - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if - - ! IN_TOP - if (ijk0(1) >= 1 .and. ijk0(2) >= 1 .and. ijk0(3) > 1 .and. & - ijk0(1) <= m % dimension(1) .and. & - ijk0(2) <= m % dimension(2) .and. & - ijk0(3) <= m % dimension(3) + 1) then - ijk0(3) = ijk0(3) - 1 - matching_bins(i_filter_surf) = IN_TOP - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(3) = ijk0(3) + 1 - end if - - ijk0(3) = ijk0(3) - 1 - xyz_cross(3) = xyz_cross(3) - m % width(3) - end if - end if + end do ! Calculate new coordinates xyz0 = xyz0 + distance * uvw From b01a8972504edb17b20d6cd91fc9cf776448389b Mon Sep 17 00:00:00 2001 From: jingang Date: Mon, 29 Aug 2016 11:02:29 -0400 Subject: [PATCH 143/168] make meshlines a dict as a single attribute of plot --- openmc/plots.py | 118 ++++++++++++++++++++---------------------------- 1 file changed, 50 insertions(+), 68 deletions(-) diff --git a/openmc/plots.py b/openmc/plots.py index 4dacabf288..cc5c0d44b3 100644 --- a/openmc/plots.py +++ b/openmc/plots.py @@ -69,14 +69,9 @@ class Plot(object): colored with a specific RGB (values) level : int Universe depth to plot at - meshlines_type : {'tally', 'entropy', 'ufs', 'cmfd'} - The type of the mesh to be plotted - meshlines_id : int - ID for the mesh specified on ``tallies.xml`` that should be plotted - meshlines_linewidth : int - Pixels of linewidth to specify for the mesh boundaries - meshlines_color : Iterable of int - Color for the meshlines boundaries by RGB. + meshlines : dict + Dictionary defining type, id, linewidth and color of a regular mesh + to be plotted on top of a plot """ @@ -91,15 +86,12 @@ class Plot(object): self._color = 'cell' self._type = 'slice' self._basis = 'xy' - self._background = [0, 0, 0] + self._background = None self._mask_components = None self._mask_background = None self._col_spec = None self._level = None - self._meshlines_type = None - self._meshlines_id = None - self._meshlines_linewidth = None - self._meshlines_color = None + self._meshlines = None @property def id(self): @@ -158,20 +150,8 @@ class Plot(object): return self._level @property - def meshlines_type(self): - return self._meshlines_type - - @property - def meshlines_id(self): - return self._meshlines_id - - @property - def meshlines_linewidth(self): - return self._meshlines_linewidth - - @property - def meshlines_color(self): - return self._meshlines_color + def meshlines(self): + return self._meshlines @id.setter def id(self, plot_id): @@ -286,33 +266,38 @@ class Plot(object): cv.check_greater_than('plot level', plot_level, 0, equality=True) self._level = plot_level - @meshlines_type.setter - def meshlines_type(self, meshlines_type): - cv.check_type('plot meshlines type', meshlines_type, basestring) - cv.check_value('plot meshlines type', meshlines_type, - ['tally', 'entropy', 'ufs', 'cmfd']) - self._meshlines_type = meshlines_type + @meshlines.setter + def meshlines(self, meshlines): + cv.check_type('plot meshlines', meshlines, dict) + if 'type' not in meshlines: + msg = 'Unable to set on plot the meshlines "{0}" which ' \ + 'does not have a "type" key'.format(meshlines) + raise ValueError(msg) - @meshlines_id.setter - def meshlines_id(self, mesh_id): - cv.check_type('plot meshlines id', mesh_id, Integral) - cv.check_greater_than('plot meshlines id', mesh_id, 0, equality=True) - self._meshlines_id = mesh_id + elif meshlines['type'] not in ['tally', 'entropy', 'ufs', 'cmfd']: + msg = 'Unable to set the meshlines with ' \ + 'type "{0}"'.format(meshlines['type']) + raise ValueError(msg) - @meshlines_linewidth.setter - def meshlines_linewidth(self, linewidth): - cv.check_type('plot mesh linewidth', linewidth, Integral) - cv.check_greater_than('plot mesh linewidth', linewidth, 0, equality=True) - self._meshlines_linewidth = linewidth + if 'id' in meshlines: + cv.check_type('plot meshlines id', meshlines['id'], Integral) + cv.check_greater_than('plot meshlines id', meshlines['id'], 0, + equality=True) - @meshlines_color.setter - def meshlines_color(self, color): - cv.check_type('plot meshlines color', color, Iterable, Integral) - cv.check_length('plot meshlines color', color, 3) - for rgb in color: - cv.check_greater_than('plot meshlines color', rgb, 0, True) - cv.check_less_than('plot meshlines color', rgb, 256) - self._meshlines_color = color + if 'linewidth' in meshlines: + cv.check_type('plot mesh linewidth', meshlines['linewidth'], Integral) + cv.check_greater_than('plot mesh linewidth', meshlines['linewidth'], + 0, equality=True) + + if 'color' in meshlines: + cv.check_type('plot meshlines color', meshlines['color'], Iterable, + Integral) + cv.check_length('plot meshlines color', meshlines['color'], 3) + for rgb in meshlines['color']: + cv.check_greater_than('plot meshlines color', rgb, 0, True) + cv.check_less_than('plot meshlines color', rgb, 256) + + self._meshlines = meshlines def __repr__(self): string = 'Plot\n' @@ -325,20 +310,16 @@ class Plot(object): string += '{0: <16}{1}{2}\n'.format('\tOrigin', '=\t', self._origin) string += '{0: <16}{1}{2}\n'.format('\tPixels', '=\t', self._origin) string += '{0: <16}{1}{2}\n'.format('\tColor', '=\t', self._color) + string += '{0: <16}{1}{2}\n'.format('\tBackground', '=\t', + self._background) string += '{0: <16}{1}{2}\n'.format('\tMask components', '=\t', self._mask_components) string += '{0: <16}{1}{2}\n'.format('\tMask background', '=\t', self._mask_background) string += '{0: <16}{1}{2}\n'.format('\tCol Spec', '=\t', self._col_spec) string += '{0: <16}{1}{2}\n'.format('\tLevel', '=\t', self._level) - string += '{0: <16}{1}{2}\n'.format('\tMeshlines type', '=\t', - self._meshlines_type) - string += '{0: <16}{1}{2}\n'.format('\tMeshlines id', '=\t', - self._meshlines_id) - string += '{0: <16}{1}{2}\n'.format('\tMeshlines color', '=\t', - self._meshlines_color) - string += '{0: <16}{1}{2}\n'.format('\tMeshlines linewidth', '=\t', - self._meshlines_linewidth) + string += '{0: <16}{1}{2}\n'.format('\tMeshlines', '=\t', + self._meshlines) return string def colorize(self, geometry, seed=1): @@ -480,17 +461,18 @@ class Plot(object): if self._level is not None: subelement = ET.SubElement(element, "level") - subelement.text = ' '.join(str(self._level)) + subelement.text = str(self._level) - if self._meshlines_type is not None: + if self._meshlines is not None: subelement = ET.SubElement(element, "meshlines") - subelement.set("meshtype", self._meshlines_type) - if self._meshlines_id is not None: - subelement.set("id", str(self._meshlines_id)) - if self._meshlines_linewidth is not None: - subelement.set("linewidth", str(self._meshlines_linewidth)) - if self._meshlines_color is not None: - subelement.set("color", ' '.join(map(str, self._meshlines_color))) + subelement.set("meshtype", self._meshlines['type']) + if self._meshlines['id'] is not None: + subelement.set("id", str(self._meshlines['id'])) + if self._meshlines['linewidth'] is not None: + subelement.set("linewidth", str(self._meshlines['linewidth'])) + if self._meshlines['color'] is not None: + subelement.set("color", ' '.join(map( + str, self._meshlines['color']))) return element From 813efa3b66dd9b89378621bd0057c2520287b152 Mon Sep 17 00:00:00 2001 From: amandalund Date: Mon, 29 Aug 2016 10:45:34 -0500 Subject: [PATCH 144/168] Address #706 comments --- openmc/model/triso.py | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/openmc/model/triso.py b/openmc/model/triso.py index e8ed04e3a0..76293051b0 100644 --- a/openmc/model/triso.py +++ b/openmc/model/triso.py @@ -11,8 +11,11 @@ from math import pi, sin, cos, floor, log10, sqrt from abc import ABCMeta, abstractproperty, abstractmethod import numpy as np -import scipy.spatial -from scipy.spatial.distance import cdist +try: + import scipy.spatial + _SCIPY_AVAILABLE = True +except ImportError: + _SCIPY_AVAILABLE = False import openmc import openmc.checkvalue as cv @@ -250,7 +253,6 @@ class _CubicDomain(_Domain): """ def __init__(self, length, particle_radius, center=[0., 0., 0.]): - self._length = None super(_CubicDomain, self).__init__(particle_radius, center) self.length = length @@ -330,8 +332,6 @@ class _CylindricalDomain(_Domain): """ def __init__(self, length, radius, particle_radius, center=[0., 0., 0.]): - self._length = None - self._radius = None super(_CylindricalDomain, self).__init__(particle_radius, center) self.length = length self.radius = radius @@ -422,7 +422,6 @@ class _SphericalDomain(_Domain): """ def __init__(self, radius, particle_radius, center=[0., 0., 0.]): - self._radius = None super(_SphericalDomain, self).__init__(particle_radius, center) self.radius = radius @@ -435,7 +434,7 @@ class _SphericalDomain(_Domain): if self._limits is None: rlim = self.radius - self.particle_radius self._limits = [[x - rlim for x in self.center], - [x + rlim for x in self.center]] + [x + rlim for x in self.center]] return self._limits @property @@ -443,7 +442,7 @@ class _SphericalDomain(_Domain): if self._cell_length is None: mesh_length = [2*self.radius, 2*self.radius, 2*self.radius] self._cell_length = [x/int(x/(4*self.particle_radius)) - for x in mesh_length] + for x in mesh_length] return self._cell_length @property @@ -683,7 +682,7 @@ def _close_random_pack(domain, particles, contraction_rate): # Find the intersection between 'a' and 'b': a list of particles who # are each other's nearest neighbors and the distance between them - r = list([x for x in {tuple(x) for x in a} & {tuple(x) for x in b}]) + r = list({tuple(x) for x in a} & {tuple(x) for x in b}) # Remove duplicate rods and sort by distance r = map(list, set([(x[2], int(min(x[0:2])), int(max(x[0:2]))) @@ -804,7 +803,7 @@ def _close_random_pack(domain, particles, contraction_rate): # will be itself. Using argpartition, the k-th nearest neighbor is # placed at index k. idx = list(mesh[domain.mesh_cell(particles[i])]) - dists = cdist([particles[i]], particles[idx])[0] + dists = scipy.spatial.distance.cdist([particles[i]], particles[idx])[0] if dists.size > 1: j = dists.argpartition(1)[1] return idx[j], dists[j] @@ -839,6 +838,10 @@ def _close_random_pack(domain, particles, contraction_rate): if rods: inner_diameter[0] = rods[0][0] + if not _SCIPY_AVAILABLE: + raise ImportError('SciPy must be installed to perform ' + 'close random packing.') + n_particles = len(particles) diameter = 2*domain.particle_radius @@ -1004,10 +1007,15 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, random.seed(seed) - # Set parameters for initial random sequential packing of particles. + # Calculate the particle radius used in the initial random sequential + # packing from the initial packing fraction initial_radius = (3/4 * initial_packing_fraction * domain.volume / (pi * n_particles))**(1/3) domain.particle_radius = initial_radius + + # Recalculate the limits for the initial random sequential packing using + # the desired final particle radius to ensure particles are fully contained + # within the domain during the close random pack domain.limits = [[x - initial_radius + radius for x in domain.limits[0]], [x + initial_radius - radius for x in domain.limits[1]]] @@ -1016,7 +1024,8 @@ def pack_trisos(radius, fill, domain_shape='cylinder', domain_length=None, particles = _random_sequential_pack(domain, n_particles) # Use the particle configuration produced in random sequential packing as a - # starting point for close random pack with the desired final particle radius + # starting point for close random pack with the desired final particle + # radius if initial_packing_fraction != packing_fraction: domain.particle_radius = radius _close_random_pack(domain, particles, contraction_rate) From 329f7d452a91c4276d598490e6877f1249ffedfe Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 29 Aug 2016 12:17:51 -0400 Subject: [PATCH 145/168] fixed bug in using cycle in nested do loop in tally.F90 --- src/tally.F90 | 149 +++++++++++++++++++++++++------------------------- 1 file changed, 76 insertions(+), 73 deletions(-) diff --git a/src/tally.F90 b/src/tally.F90 index e34fecd148..b9d945778a 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -2410,19 +2410,17 @@ contains ! If cell index in dimension d1 and d2 are the same and the cells is ! within the mesh bounds - if (ijk0(d1) == ijk1(d1) .and. ijk0(d2) == ijk1(d2) .and. & - ijk0(d1) >= 1 .and. ijk0(d1) <= m % dimension(d1) .and. & - ijk0(d2) >= 1 .and. ijk0(d2) <= m % dimension(d2)) then + if (ijk0(d1) == ijk1(d1) .and. ijk0(d2) == ijk1(d2)) then ! Only d3 crossings if (uvw(d3) > 0) then ! Loop over d3 cells do j = ijk0(d3), ijk1(d3) - 1 + ijk0(d3) = j ! Outward current on d3 max surface - if (j >= 1 .and. j <= m % dimension(d3)) then - ijk0(d3) = j + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then matching_bins(i_filter_surf) = d3 * 2 matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) @@ -2434,7 +2432,9 @@ contains end if ! Inward current on d3 min surface - if (j >= 0 .and. j < m % dimension(d3)) then + if (ijk0(d1) >= 1 .and. ijk0(d1) <= m % dimension(d1) .and. & + ijk0(d2) >= 1 .and. ijk0(d2) <= m % dimension(d2) .and. & + j >= 0 .and. j < m % dimension(d3)) then ijk0(d3) = j + 1 matching_bins(i_filter_surf) = d3 * 2 + 5 matching_bins(i_filter_mesh) = & @@ -2444,16 +2444,16 @@ contains !$omp atomic t % results(1, filter_index) % value = & t % results(1, filter_index) % value + p % wgt + ijk0(d3) = j end if end do else do j = ijk0(d3), ijk1(d3) + 1, -1 - + ijk0(d3) = j ! Outward current on d3 min surface - if (j >= 1 .and. j <= m % dimension(d3)) then - ijk0(d3) = j + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then matching_bins(i_filter_surf) = d3 * 2 - 1 matching_bins(i_filter_mesh) = & mesh_indices_to_bin(m, ijk0) @@ -2465,7 +2465,9 @@ contains end if ! Inward current on d3 max surface - if (j > 1 .and. j <= m % dimension(d3) + 1) then + if (ijk0(d1) >= 1 .and. ijk0(d1) <= m % dimension(d1) .and. & + ijk0(d2) >= 1 .and. ijk0(d2) <= m % dimension(d2) .and. & + j > 1 .and. j <= m % dimension(d3) + 1) then ijk0(d3) = j - 1 matching_bins(i_filter_surf) = d3 * 2 + 6 matching_bins(i_filter_mesh) = & @@ -2475,10 +2477,11 @@ contains !$omp atomic t % results(1, filter_index) % value = & t % results(1, filter_index) % value + p % wgt + ijk0(d3) = j end if end do end if - cycle + cycle TALLY_LOOP end if end do @@ -2525,73 +2528,73 @@ contains d2 = mod(d1, 3) + 1 d3 = mod(d1 + 1, 3) + 1 + ! Check distance and dimension d2 and d3 indices if (distance == d(d1)) then - ! Check dimension d2 and d3 indices - if (ijk0(d2) >= 1 .and. ijk0(d2) <= m % dimension(d2) .and. & - ijk0(d3) >= 1 .and. ijk0(d3) <= m % dimension(d3)) then + if (uvw(d1) > 0) then - if (uvw(d1) > 0) then - - ! Outward current on d1 max surface - if (ijk0(d1) >= 1 .and. ijk0(d1) <= m % dimension(d1)) then - matching_bins(i_filter_surf) = d1 * 2 - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 + ! Outward current on d1 max surface + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then + matching_bins(i_filter_surf) = d1 * 2 + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 !$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if - - ! Inward current on d1 min surface - if (ijk0(d1) >= 0 .and. ijk0(d1) < m % dimension(d1)) then - ijk0(d1) = ijk0(d1) + 1 - matching_bins(i_filter_surf) = d1 * 2 + 5 - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(d1) = ijk0(d1) - 1 - end if - - ijk0(d1) = ijk0(d1) + 1 - xyz_cross(d1) = xyz_cross(d1) + m % width(d1) - else - - ! Outward current on d1 min surface - if (ijk0(d1) >= 1 .and. ijk0(d1) <= m % dimension(d1)) then - matching_bins(i_filter_surf) = d1 * 2 - 1 - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if - - ! Inward current on d1 max surface - if (ijk0(d1) > 1 .and. ijk0(d1) <= m % dimension(d1) + 1) then - ijk0(d1) = ijk0(d1) - 1 - matching_bins(i_filter_surf) = d1 * 2 + 6 - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(d1) = ijk0(d1) + 1 - end if - - ijk0(d1) = ijk0(d1) - 1 - xyz_cross(d1) = xyz_cross(d1) - m % width(d1) + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt end if + + ! Inward current on d1 min surface + if (ijk0(d1) >= 0 .and. ijk0(d1) < m % dimension(d1) .and. & + ijk0(d2) >= 1 .and. ijk0(d2) <= m % dimension(d2) .and. & + ijk0(d3) >= 1 .and. ijk0(d3) <= m % dimension(d3)) then + ijk0(d1) = ijk0(d1) + 1 + matching_bins(i_filter_surf) = d1 * 2 + 5 + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt + ijk0(d1) = ijk0(d1) - 1 + end if + + ijk0(d1) = ijk0(d1) + 1 + xyz_cross(d1) = xyz_cross(d1) + m % width(d1) + else + + ! Outward current on d1 min surface + if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then + matching_bins(i_filter_surf) = d1 * 2 - 1 + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt + end if + + ! Inward current on d1 max surface + if (ijk0(d1) > 1 .and. ijk0(d1) <= m % dimension(d1) + 1 .and. & + ijk0(d2) >= 1 .and. ijk0(d2) <= m % dimension(d2) .and. & + ijk0(d3) >= 1 .and. ijk0(d3) <= m % dimension(d3)) then + ijk0(d1) = ijk0(d1) - 1 + matching_bins(i_filter_surf) = d1 * 2 + 6 + matching_bins(i_filter_mesh) = & + mesh_indices_to_bin(m, ijk0) + filter_index = sum((matching_bins(1:size(t % filters)) - 1) & + * t % stride) + 1 +!$omp atomic + t % results(1, filter_index) % value = & + t % results(1, filter_index) % value + p % wgt + ijk0(d1) = ijk0(d1) + 1 + end if + + ijk0(d1) = ijk0(d1) - 1 + xyz_cross(d1) = xyz_cross(d1) - m % width(d1) end if end if end do From bc49c74d88aa5794a38a77afdd3fe98e725bfea7 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Mon, 29 Aug 2016 12:20:41 -0400 Subject: [PATCH 146/168] updated tally-arithmetic.ipynb --- .../pythonapi/examples/tally-arithmetic.ipynb | 62 +++++++++---------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index b4b41f8d28..2fecc3c29d 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -339,7 +339,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIHQoDEQSZg0YAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDgtMjlUMTA6MDM6\nMTctMDQ6MDAuYJb8AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA4LTI5VDEwOjAzOjE3LTA0OjAw\nXz0uQAAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIHQwUARggawYAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDgtMjlUMTI6MjA6\nMDEtMDQ6MDBSHRTRAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA4LTI5VDEyOjIwOjAxLTA0OjAw\nI0CsbQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -567,8 +567,8 @@ " Copyright: 2011-2016 Massachusetts Institute of Technology\n", " License: http://openmc.readthedocs.io/en/latest/license.html\n", " Version: 0.8.0\n", - " Git SHA1: 11dea6f26aaa07794a484b8d009a75cce36a8784\n", - " Date/Time: 2016-08-29 10:03:18\n", + " Git SHA1: 26bdadd79aac3712450d8c0612ac3edcb68e720f\n", + " Date/Time: 2016-08-29 12:20:02\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -625,20 +625,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.6700E-01 seconds\n", - " Reading cross sections = 2.8600E-01 seconds\n", - " Total time in simulation = 1.9770E+01 seconds\n", - " Time in transport only = 1.9753E+01 seconds\n", - " Time in inactive batches = 2.4920E+00 seconds\n", - " Time in active batches = 1.7278E+01 seconds\n", - " Time synchronizing fission bank = 0.0000E+00 seconds\n", + " Total time for initialization = 4.6800E-01 seconds\n", + " Reading cross sections = 2.8200E-01 seconds\n", + " Total time in simulation = 1.8453E+01 seconds\n", + " Time in transport only = 1.8432E+01 seconds\n", + " Time in inactive batches = 2.5060E+00 seconds\n", + " Time in active batches = 1.5947E+01 seconds\n", + " Time synchronizing fission bank = 2.0000E-03 seconds\n", " Sampling source sites = 0.0000E+00 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 2.0000E-03 seconds\n", - " Total time elapsed = 2.0257E+01 seconds\n", - " Calculation Rate (inactive) = 5016.05 neutrons/second\n", - " Calculation Rate (active) = 2170.39 neutrons/second\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for finalization = 3.0000E-03 seconds\n", + " Total time elapsed = 1.8947E+01 seconds\n", + " Calculation Rate (inactive) = 4988.03 neutrons/second\n", + " Calculation Rate (active) = 2351.54 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -731,8 +731,8 @@ " 0\n", " total\n", " (nu-fission / (absorption + current))\n", - " 1.007511\n", - " 0.007114\n", + " 1.02431\n", + " 0.00704\n", " \n", " \n", "\n", @@ -740,7 +740,7 @@ ], "text/plain": [ " nuclide score mean std. dev.\n", - "0 total (nu-fission / (absorption + current)) 1.01e+00 7.11e-03" + "0 total (nu-fission / (absorption + current)) 1.02e+00 7.04e-03" ] }, "execution_count": 24, @@ -802,8 +802,8 @@ " 6.250000e-07\n", " total\n", " (absorption + current)\n", - " 0.695851\n", - " 0.00511\n", + " 0.695303\n", + " 0.005091\n", " \n", " \n", "\n", @@ -814,7 +814,7 @@ "0 0.00e+00 6.25e-07 total (absorption + current) \n", "\n", " mean std. dev. \n", - "0 6.96e-01 5.11e-03 " + "0 6.95e-01 5.09e-03 " ] }, "execution_count": 25, @@ -1064,8 +1064,8 @@ " 6.250000e-07\n", " total\n", " (absorption + current)\n", - " 0.970693\n", - " 0.005989\n", + " 0.985102\n", + " 0.005855\n", " \n", " \n", "\n", @@ -1076,7 +1076,7 @@ "0 0.00e+00 6.25e-07 total (absorption + current) \n", "\n", " mean std. dev. \n", - "0 9.71e-01 5.99e-03 " + "0 9.85e-01 5.86e-03 " ] }, "execution_count": 29, @@ -1126,8 +1126,8 @@ " 6.250000e-07\n", " total\n", " (absorption / (absorption + current))\n", - " 0.994827\n", - " 0.008481\n", + " 0.997407\n", + " 0.008492\n", " \n", " \n", "\n", @@ -1138,7 +1138,7 @@ "0 0.00e+00 6.25e-07 total \n", "\n", " score mean std. dev. \n", - "0 (absorption / (absorption + current)) 9.95e-01 8.48e-03 " + "0 (absorption / (absorption + current)) 9.97e-01 8.49e-03 " ] }, "execution_count": 30, @@ -1190,8 +1190,8 @@ " 10000\n", " total\n", " ((((((absorption + current) * nu-fission) * ab...\n", - " 1.007511\n", - " 0.020364\n", + " 1.02431\n", + " 0.02062\n", " \n", " \n", "\n", @@ -1202,7 +1202,7 @@ "0 0.00e+00 6.25e-07 10000 total \n", "\n", " score mean std. dev. \n", - "0 ((((((absorption + current) * nu-fission) * ab... 1.01e+00 2.04e-02 " + "0 ((((((absorption + current) * nu-fission) * ab... 1.02e+00 2.06e-02 " ] }, "execution_count": 31, From ce6b893dd4889dc3de202a2bf96cb21e92fc2898 Mon Sep 17 00:00:00 2001 From: amandalund Date: Mon, 29 Aug 2016 14:24:52 -0500 Subject: [PATCH 147/168] Changed flag marking removed rods to integer to fix unorderable type error --- openmc/model/triso.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/openmc/model/triso.py b/openmc/model/triso.py index 76293051b0..0c372aeefd 100644 --- a/openmc/model/triso.py +++ b/openmc/model/triso.py @@ -622,8 +622,8 @@ def _close_random_pack(domain, particles, contraction_rate): if i in rods_map: j, rod = rods_map.pop(i) del rods_map[j] - rod[1] = None - rod[2] = None + rod[1] = removed + rod[2] = removed def pop_rod(): """Remove and return the shortest rod. @@ -639,7 +639,7 @@ def _close_random_pack(domain, particles, contraction_rate): while rods: d, i, j = heappop(rods) - if i is not None and j is not None: + if i is not removed and j is not removed: del rods_map[i] del rods_map[j] return d, i, j @@ -845,6 +845,9 @@ def _close_random_pack(domain, particles, contraction_rate): n_particles = len(particles) diameter = 2*domain.particle_radius + # Flag for marking rods that have been removed from priority queue + removed = -1 + # Outer diameter initially set to arbitrary value that yields pf of 1 initial_outer_diameter = 2*(domain.volume/(n_particles*4/3*pi))**(1/3) From 4631c5c7df44395536cf2d5bef2f4f7976f6c404 Mon Sep 17 00:00:00 2001 From: amandalund Date: Mon, 29 Aug 2016 14:27:53 -0500 Subject: [PATCH 148/168] is not -> != --- openmc/model/triso.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/model/triso.py b/openmc/model/triso.py index 0c372aeefd..5525ea559c 100644 --- a/openmc/model/triso.py +++ b/openmc/model/triso.py @@ -639,7 +639,7 @@ def _close_random_pack(domain, particles, contraction_rate): while rods: d, i, j = heappop(rods) - if i is not removed and j is not removed: + if i != removed and j != removed: del rods_map[i] del rods_map[j] return d, i, j From 4448d17ee1769c19873d6c96d2d28205d4348414 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 26 Aug 2016 13:32:36 -0500 Subject: [PATCH 149/168] Add procedures for sorting and finding --- src/algorithm.F90 | 275 +++++++++++++++++++++++++++++++++++ src/angle_distribution.F90 | 2 +- src/cmfd_execute.F90 | 2 +- src/cross_section.F90 | 2 +- src/eigenvalue.F90 | 2 +- src/endf_header.F90 | 2 +- src/energy_distribution.F90 | 2 +- src/mesh.F90 | 10 +- src/physics.F90 | 2 +- src/scattdata_header.F90 | 2 +- src/search.F90 | 143 ------------------ src/secondary_correlated.F90 | 2 +- src/secondary_kalbach.F90 | 2 +- src/source.F90 | 13 +- src/tally.F90 | 10 +- src/tally_filter.F90 | 2 +- 16 files changed, 302 insertions(+), 171 deletions(-) create mode 100644 src/algorithm.F90 delete mode 100644 src/search.F90 diff --git a/src/algorithm.F90 b/src/algorithm.F90 new file mode 100644 index 0000000000..101b11b9a7 --- /dev/null +++ b/src/algorithm.F90 @@ -0,0 +1,275 @@ +module algorithm + + use constants + use stl_vector, only: VectorInt, VectorReal + + implicit none + + integer, parameter :: MAX_ITERATION = 64 + + interface binary_search + module procedure binary_search_real, binary_search_int4, binary_search_int8 + end interface binary_search + + interface sort + module procedure sort_int, sort_real, sort_vector_int, sort_vector_real + end interface sort + + interface find + module procedure find_int, find_real, find_vector_int, find_vector_real + end interface find + +contains + +!=============================================================================== +! BINARY_SEARCH performs a binary search of an array to find where a specific +! value lies in the array. This is used extensively for energy grid searching +!=============================================================================== + + pure function binary_search_real(array, n, val) result(array_index) + + integer, intent(in) :: n + real(8), intent(in) :: array(n) + real(8), intent(in) :: val + integer :: array_index + + integer :: L + integer :: R + integer :: n_iteration + + L = 1 + R = n + + if (val < array(L) .or. val > array(R)) then + array_index = -1 + return + end if + + n_iteration = 0 + do while (R - L > 1) + ! Find values at midpoint + array_index = L + (R - L)/2 + if (val >= array(array_index)) then + L = array_index + else + R = array_index + end if + + ! check for large number of iterations + n_iteration = n_iteration + 1 + if (n_iteration == MAX_ITERATION) then + array_index = -2 + return + end if + end do + + array_index = L + + end function binary_search_real + + pure function binary_search_int4(array, n, val) result(array_index) + + integer, intent(in) :: n + integer, intent(in) :: array(n) + integer, intent(in) :: val + integer :: array_index + + integer :: L + integer :: R + integer :: n_iteration + + L = 1 + R = n + + if (val < array(L) .or. val > array(R)) then + array_index = -1 + return + end if + + n_iteration = 0 + do while (R - L > 1) + ! Find values at midpoint + array_index = L + (R - L)/2 + if (val >= array(array_index)) then + L = array_index + else + R = array_index + end if + + ! check for large number of iterations + n_iteration = n_iteration + 1 + if (n_iteration == MAX_ITERATION) then + array_index = -2 + return + end if + end do + + array_index = L + + end function binary_search_int4 + + pure function binary_search_int8(array, n, val) result(array_index) + + integer, intent(in) :: n + integer(8), intent(in) :: array(n) + integer(8), intent(in) :: val + integer :: array_index + + integer :: L + integer :: R + integer :: n_iteration + + L = 1 + R = n + + if (val < array(L) .or. val > array(R)) then + array_index = -1 + return + end if + + n_iteration = 0 + do while (R - L > 1) + ! Find values at midpoint + array_index = L + (R - L)/2 + if (val >= array(array_index)) then + L = array_index + else + R = array_index + end if + + ! check for large number of iterations + n_iteration = n_iteration + 1 + if (n_iteration == MAX_ITERATION) then + array_index = -2 + return + end if + end do + + array_index = L + + end function binary_search_int8 + +!=============================================================================== +! SORT sorts an array in place using an insertion sort. +!=============================================================================== + + pure subroutine sort_int(array) + integer, intent(inout) :: array(:) + + integer :: k, m + integer :: temp + + if (size(array) > 1) then + SORT: do k = 2, size(array) + ! Save value to move + m = k + temp = array(k) + + MOVE_OVER: do while (m > 1) + ! Check if insertion value is greater than (m-1)th value + if (temp >= array(m - 1)) exit + + ! Move values over until hitting one that's not larger + array(m) = array(m - 1) + m = m - 1 + end do MOVE_OVER + + ! Put the original value into its new position + array(m) = temp + end do SORT + end if + end subroutine sort_int + + pure subroutine sort_real(array) + real(8), intent(inout) :: array(:) + + integer :: k, m + real(8) :: temp + + if (size(array) > 1) then + SORT: do k = 2, size(array) + ! Save value to move + m = k + temp = array(k) + + MOVE_OVER: do while (m > 1) + ! Check if insertion value is greater than (m-1)th value + if (temp >= array(m - 1)) exit + + ! Move values over until hitting one that's not larger + array(m) = array(m - 1) + m = m - 1 + end do MOVE_OVER + + ! Put the original value into its new position + array(m) = temp + end do SORT + end if + end subroutine sort_real + + pure subroutine sort_vector_int(vec) + type(VectorInt), intent(inout) :: vec + + call sort_int(vec % data(1:vec%size())) + end subroutine sort_vector_int + + pure subroutine sort_vector_real(vec) + type(VectorReal), intent(inout) :: vec + + call sort_real(vec % data(1:vec%size())) + end subroutine sort_vector_real + +!=============================================================================== +! FIND determines the index of the first occurrence of a value in an array. If +! the value does not appear in the array, -1 is returned. +!=============================================================================== + + pure function find_int(array, val) result(index) + integer, intent(in) :: array(:) + integer, intent(in) :: val + integer :: index + + integer :: i + + index = -1 + do i = 1, size(array) + if (array(i) == val) then + index = i + exit + end if + end do + end function find_int + + pure function find_real(array, val) result(index) + real(8), intent(in) :: array(:) + real(8), intent(in) :: val + integer :: index + + integer :: i + + index = -1 + do i = 1, size(array) + if (array(i) == val) then + index = i + exit + end if + end do + end function find_real + + pure function find_vector_int(vec, val) result(index) + type(VectorInt), intent(in) :: vec + integer, intent(in) :: val + integer :: index + + index = find_int(vec % data(1:vec % size()), val) + end function find_vector_int + + pure function find_vector_real(vec, val) result(index) + type(VectorReal), intent(in) :: vec + real(8), intent(in) :: val + integer :: index + + index = find_real(vec % data(1:vec % size()), val) + end function find_vector_real + +end module algorithm diff --git a/src/angle_distribution.F90 b/src/angle_distribution.F90 index a4fea6ff77..5d16f74242 100644 --- a/src/angle_distribution.F90 +++ b/src/angle_distribution.F90 @@ -2,12 +2,12 @@ module angle_distribution use hdf5, only: HID_T, HSIZE_T + use algorithm, only: binary_search use constants, only: ZERO, ONE, HISTOGRAM, LINEAR_LINEAR use distribution_univariate, only: DistributionContainer, Tabular use hdf5_interface, only: read_attribute, get_shape, read_dataset, & open_dataset, close_dataset use random_lcg, only: prn - use search, only: binary_search implicit none private diff --git a/src/cmfd_execute.F90 b/src/cmfd_execute.F90 index b7d0cc3879..d2631254b1 100644 --- a/src/cmfd_execute.F90 +++ b/src/cmfd_execute.F90 @@ -213,13 +213,13 @@ contains subroutine cmfd_reweight(new_weights) + use algorithm, only: binary_search use constants, only: ZERO, ONE use error, only: warning, fatal_error use global, only: meshes, source_bank, work, n_user_meshes, cmfd, & master use mesh_header, only: RegularMesh use mesh, only: count_bank_sites, get_mesh_indices - use search, only: binary_search use string, only: to_str #ifdef MPI diff --git a/src/cross_section.F90 b/src/cross_section.F90 index a8acb25a83..b67226a1b8 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -1,5 +1,6 @@ module cross_section + use algorithm, only: binary_search use constants use energy_grid, only: grid_method, log_spacing use error, only: fatal_error @@ -14,7 +15,6 @@ module cross_section use particle_header, only: Particle use random_lcg, only: prn, future_prn, prn_set_stream use sab_header, only: SAlphaBeta - use search, only: binary_search implicit none diff --git a/src/eigenvalue.F90 b/src/eigenvalue.F90 index 9befbe3c3d..713bbc351a 100644 --- a/src/eigenvalue.F90 +++ b/src/eigenvalue.F90 @@ -4,6 +4,7 @@ module eigenvalue use message_passing #endif + use algorithm, only: binary_search use constants, only: ZERO use error, only: fatal_error, warning use global @@ -11,7 +12,6 @@ module eigenvalue use mesh, only: count_bank_sites use mesh_header, only: RegularMesh use random_lcg, only: prn, set_particle_seed, advance_prn_seed - use search, only: binary_search use string, only: to_str implicit none diff --git a/src/endf_header.F90 b/src/endf_header.F90 index 8d8aefaa3c..e9e45ab751 100644 --- a/src/endf_header.F90 +++ b/src/endf_header.F90 @@ -2,10 +2,10 @@ module endf_header use hdf5, only: HID_T, HSIZE_T + use algorithm, only: binary_search use constants, only: ZERO, HISTOGRAM, LINEAR_LINEAR, LINEAR_LOG, & LOG_LINEAR, LOG_LOG use hdf5_interface - use search, only: binary_search implicit none diff --git a/src/energy_distribution.F90 b/src/energy_distribution.F90 index c45762bb0a..770da617cc 100644 --- a/src/energy_distribution.F90 +++ b/src/energy_distribution.F90 @@ -2,12 +2,12 @@ module energy_distribution use hdf5 + use algorithm, only: binary_search use constants, only: ZERO, ONE, HALF, TWO, PI, HISTOGRAM, LINEAR_LINEAR use endf_header, only: Tabulated1D use hdf5_interface use math, only: maxwell_spectrum, watt_spectrum use random_lcg, only: prn - use search, only: binary_search !=============================================================================== ! ENERGYDISTRIBUTION (abstract) defines an energy distribution that is a diff --git a/src/mesh.F90 b/src/mesh.F90 index cee29aa1ca..4a3def4282 100644 --- a/src/mesh.F90 +++ b/src/mesh.F90 @@ -1,14 +1,14 @@ module mesh - use constants - use global - use mesh_header - use search, only: binary_search - #ifdef MPI use message_passing #endif + use algorithm, only: binary_search + use constants + use global + use mesh_header + implicit none contains diff --git a/src/physics.F90 b/src/physics.F90 index a9f2263955..00bd2c20c9 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -1,5 +1,6 @@ module physics + use algorithm, only: binary_search use constants use cross_section, only: elastic_xs_0K use endf, only: reaction_name @@ -15,7 +16,6 @@ module physics use physics_common use random_lcg, only: prn, advance_prn_seed, prn_set_stream use reaction_header, only: Reaction - use search, only: binary_search use secondary_uncorrelated, only: UncorrelatedAngleEnergy use string, only: to_str diff --git a/src/scattdata_header.F90 b/src/scattdata_header.F90 index 2066b36b92..d4643a0721 100644 --- a/src/scattdata_header.F90 +++ b/src/scattdata_header.F90 @@ -1,10 +1,10 @@ module scattdata_header + use algorithm, only: binary_search use constants use error, only: fatal_error use math use random_lcg, only: prn - use search, only: binary_search implicit none diff --git a/src/search.F90 b/src/search.F90 deleted file mode 100644 index f338105f4d..0000000000 --- a/src/search.F90 +++ /dev/null @@ -1,143 +0,0 @@ -module search - - use constants - - implicit none - - integer, parameter :: MAX_ITERATION = 64 - - interface binary_search - module procedure binary_search_real, binary_search_int4, binary_search_int8 - end interface binary_search - -contains - -!=============================================================================== -! BINARY_SEARCH performs a binary search of an array to find where a specific -! value lies in the array. This is used extensively for energy grid searching -!=============================================================================== - - pure function binary_search_real(array, n, val) result(array_index) - - integer, intent(in) :: n - real(8), intent(in) :: array(n) - real(8), intent(in) :: val - integer :: array_index - - integer :: L - integer :: R - integer :: n_iteration - - L = 1 - R = n - - if (val < array(L) .or. val > array(R)) then - array_index = -1 - return - end if - - n_iteration = 0 - do while (R - L > 1) - ! Find values at midpoint - array_index = L + (R - L)/2 - if (val >= array(array_index)) then - L = array_index - else - R = array_index - end if - - ! check for large number of iterations - n_iteration = n_iteration + 1 - if (n_iteration == MAX_ITERATION) then - array_index = -2 - return - end if - end do - - array_index = L - - end function binary_search_real - - pure function binary_search_int4(array, n, val) result(array_index) - - integer, intent(in) :: n - integer, intent(in) :: array(n) - integer, intent(in) :: val - integer :: array_index - - integer :: L - integer :: R - integer :: n_iteration - - L = 1 - R = n - - if (val < array(L) .or. val > array(R)) then - array_index = -1 - return - end if - - n_iteration = 0 - do while (R - L > 1) - ! Find values at midpoint - array_index = L + (R - L)/2 - if (val >= array(array_index)) then - L = array_index - else - R = array_index - end if - - ! check for large number of iterations - n_iteration = n_iteration + 1 - if (n_iteration == MAX_ITERATION) then - array_index = -2 - return - end if - end do - - array_index = L - - end function binary_search_int4 - - pure function binary_search_int8(array, n, val) result(array_index) - - integer, intent(in) :: n - integer(8), intent(in) :: array(n) - integer(8), intent(in) :: val - integer :: array_index - - integer :: L - integer :: R - integer :: n_iteration - - L = 1 - R = n - - if (val < array(L) .or. val > array(R)) then - array_index = -1 - return - end if - - n_iteration = 0 - do while (R - L > 1) - ! Find values at midpoint - array_index = L + (R - L)/2 - if (val >= array(array_index)) then - L = array_index - else - R = array_index - end if - - ! check for large number of iterations - n_iteration = n_iteration + 1 - if (n_iteration == MAX_ITERATION) then - array_index = -2 - return - end if - end do - - array_index = L - - end function binary_search_int8 - -end module search diff --git a/src/secondary_correlated.F90 b/src/secondary_correlated.F90 index e163fdcc24..a0e203f33d 100644 --- a/src/secondary_correlated.F90 +++ b/src/secondary_correlated.F90 @@ -2,13 +2,13 @@ module secondary_correlated use hdf5, only: HID_T, HSIZE_T + use algorithm, only: binary_search use angleenergy_header, only: AngleEnergy use constants, only: ZERO, ONE, HALF, TWO, HISTOGRAM, LINEAR_LINEAR use distribution_univariate, only: DistributionContainer, Tabular use hdf5_interface, only: get_shape, read_attribute, open_dataset, & read_dataset, close_dataset use random_lcg, only: prn - use search, only: binary_search !=============================================================================== ! CORRELATEDANGLEENERGY represents a correlated angle-energy distribution. This diff --git a/src/secondary_kalbach.F90 b/src/secondary_kalbach.F90 index 4b5e690b5d..f963cff3ff 100644 --- a/src/secondary_kalbach.F90 +++ b/src/secondary_kalbach.F90 @@ -2,12 +2,12 @@ module secondary_kalbach use hdf5, only: HID_T, HSIZE_T + use algorithm, only: binary_search use angleenergy_header, only: AngleEnergy use constants, only: ZERO, HALF, ONE, TWO, HISTOGRAM, LINEAR_LINEAR use hdf5_interface, only: read_attribute, read_dataset, open_dataset, & close_dataset, get_shape use random_lcg, only: prn - use search, only: binary_search !=============================================================================== ! KalbachMann represents a correlated angle-energy distribution with the angular diff --git a/src/source.F90 b/src/source.F90 index 452d8ddfce..9aeccde156 100644 --- a/src/source.F90 +++ b/src/source.F90 @@ -1,5 +1,11 @@ module source + use hdf5, only: HID_T +#ifdef MPI + use message_passing +#endif + + use algorithm, only: binary_search use bank_header, only: Bank use constants use distribution_univariate, only: Discrete @@ -12,17 +18,10 @@ module source use output, only: write_message use particle_header, only: Particle use random_lcg, only: prn, set_particle_seed, prn_set_stream - use search, only: binary_search use string, only: to_str use math use state_point, only: read_source_bank, write_source_bank -#ifdef MPI - use message_passing -#endif - - use hdf5, only: HID_T - implicit none contains diff --git a/src/tally.F90 b/src/tally.F90 index 3c3dc6a693..3ee4702e2f 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -1,5 +1,10 @@ module tally +#ifdef MPI + use message_passing +#endif + + use algorithm, only: binary_search use constants use error, only: fatal_error use geometry_header @@ -11,15 +16,10 @@ module tally use mesh_header, only: RegularMesh use output, only: header use particle_header, only: LocalCoord, Particle - use search, only: binary_search use string, only: to_str use tally_header, only: TallyResult use tally_filter -#ifdef MPI - use message_passing -#endif - implicit none integer :: position(N_FILTER_TYPES - 3) = 0 ! Tally map positioning array diff --git a/src/tally_filter.F90 b/src/tally_filter.F90 index 67d0452847..bd568e29ae 100644 --- a/src/tally_filter.F90 +++ b/src/tally_filter.F90 @@ -1,5 +1,6 @@ module tally_filter + use algorithm, only: binary_search use constants, only: ONE, NO_BIN_FOUND, FP_PRECISION use dict_header, only: DictIntInt use geometry_header, only: BASE_UNIVERSE, RectLattice, HexLattice @@ -10,7 +11,6 @@ module tally_filter get_mesh_indices, mesh_indices_to_bin, & mesh_intersects_2d, mesh_intersects_3d use particle_header, only: Particle - use search, only: binary_search use string, only: to_str use tally_filter_header, only: TallyFilter, TallyFilterContainer From f63cad37bf8ff9c41aa30f8b17b92e301639a1b7 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Tue, 30 Aug 2016 08:09:03 -0400 Subject: [PATCH 150/168] removed special case for tally surface current --- src/tally.F90 | 109 ++++---------------------------------------------- 1 file changed, 7 insertions(+), 102 deletions(-) diff --git a/src/tally.F90 b/src/tally.F90 index b9d945778a..d5af4ddc1f 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -2320,7 +2320,6 @@ contains integer :: i integer :: i_tally integer :: j ! loop indices - integer :: k ! loop indices integer :: d1 ! dimension index integer :: d2 ! dimension index integer :: d3 ! dimension index @@ -2340,9 +2339,6 @@ contains real(8) :: filt_score ! score applied by filters logical :: start_in_mesh ! particle's starting xyz in mesh? logical :: end_in_mesh ! particle's ending xyz in mesh? - logical :: x_same ! same starting/ending x index (i) - logical :: y_same ! same starting/ending y index (j) - logical :: z_same ! same starting/ending z index (k) type(TallyObject), pointer :: t type(RegularMesh), pointer :: m @@ -2398,96 +2394,6 @@ contains if (matching_bins(i_filter_energy) == NO_BIN_FOUND) cycle end if - ! ======================================================================= - ! SPECIAL CASES WHERE TWO INDICES ARE THE SAME - - ! Loop over the dimensions - do d1 = 1, 3 - - ! Get the other dimensions - d2 = mod(d1, 3) + 1 - d3 = mod(d1 + 1, 3) + 1 - - ! If cell index in dimension d1 and d2 are the same and the cells is - ! within the mesh bounds - if (ijk0(d1) == ijk1(d1) .and. ijk0(d2) == ijk1(d2)) then - - ! Only d3 crossings - if (uvw(d3) > 0) then - - ! Loop over d3 cells - do j = ijk0(d3), ijk1(d3) - 1 - ijk0(d3) = j - - ! Outward current on d3 max surface - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = d3 * 2 - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if - - ! Inward current on d3 min surface - if (ijk0(d1) >= 1 .and. ijk0(d1) <= m % dimension(d1) .and. & - ijk0(d2) >= 1 .and. ijk0(d2) <= m % dimension(d2) .and. & - j >= 0 .and. j < m % dimension(d3)) then - ijk0(d3) = j + 1 - matching_bins(i_filter_surf) = d3 * 2 + 5 - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(d3) = j - end if - end do - else - - do j = ijk0(d3), ijk1(d3) + 1, -1 - ijk0(d3) = j - - ! Outward current on d3 min surface - if (all(ijk0 >= 1) .and. all(ijk0 <= m % dimension)) then - matching_bins(i_filter_surf) = d3 * 2 - 1 - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - end if - - ! Inward current on d3 max surface - if (ijk0(d1) >= 1 .and. ijk0(d1) <= m % dimension(d1) .and. & - ijk0(d2) >= 1 .and. ijk0(d2) <= m % dimension(d2) .and. & - j > 1 .and. j <= m % dimension(d3) + 1) then - ijk0(d3) = j - 1 - matching_bins(i_filter_surf) = d3 * 2 + 6 - matching_bins(i_filter_mesh) = & - mesh_indices_to_bin(m, ijk0) - filter_index = sum((matching_bins(1:size(t % filters)) - 1) & - * t % stride) + 1 -!$omp atomic - t % results(1, filter_index) % value = & - t % results(1, filter_index) % value + p % wgt - ijk0(d3) = j - end if - end do - end if - cycle TALLY_LOOP - end if - end do - - ! ======================================================================= - ! GENERIC CASE - ! Bounding coordinates do d1 = 1, 3 if (uvw(d1) > 0) then @@ -2497,14 +2403,13 @@ contains end if end do - do k = 1, n_cross + do j = 1, n_cross ! Reset scoring bin index matching_bins(i_filter_surf) = 0 ! Calculate distance to each bounding surface. We need to treat ! special case where the cosine of the angle is zero since this would ! result in a divide-by-zero. - do d1 = 1, 3 if (uvw(d1) == 0) then d(d1) = INFINITY @@ -2514,13 +2419,10 @@ contains end do ! Determine the closest bounding surface of the mesh cell by - ! calculating the minimum distance - + ! calculating the minimum distance. Then use the minimum distance and + ! direction of the particle to determine which surface was crossed. distance = minval(d) - ! Now use the minimum distance and direction of the particle to - ! determine which surface was crossed - ! Loop over the dimensions do d1 = 1, 3 @@ -2528,9 +2430,10 @@ contains d2 = mod(d1, 3) + 1 d3 = mod(d1 + 1, 3) + 1 - ! Check distance and dimension d2 and d3 indices + ! Check whether distance is the shortest distance if (distance == d(d1)) then + ! Check whether particle is moving in positive d1 direction if (uvw(d1) > 0) then ! Outward current on d1 max surface @@ -2563,6 +2466,8 @@ contains ijk0(d1) = ijk0(d1) + 1 xyz_cross(d1) = xyz_cross(d1) + m % width(d1) + + ! The particle is moving in the negative d1 direction else ! Outward current on d1 min surface From 0fbe8e72f1dcf09178e5647e93797c2c866f3fa3 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 30 Aug 2016 12:04:34 -0600 Subject: [PATCH 151/168] Bug fix for MGXS Pandas DataFrames with selected nuclides --- openmc/mgxs/mgxs.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index de7475308c..d0bc07987c 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1496,12 +1496,14 @@ class MGXS(object): # If the user requested a specific set of nuclides elif self.by_nuclide and nuclides != 'all': + query_nuclides = nuclides xs_tally = self.xs_tally.get_slice(nuclides=nuclides) df = xs_tally.get_pandas_dataframe( distribcell_paths=distribcell_paths) # If the user requested all nuclides, keep nuclide column in dataframe else: + query_nuclides = self.get_nuclides() df = self.xs_tally.get_pandas_dataframe( distribcell_paths=distribcell_paths) @@ -1513,7 +1515,7 @@ class MGXS(object): # Override energy groups bounds with indices all_groups = np.arange(self.num_groups, 0, -1, dtype=np.int) - all_groups = np.repeat(all_groups, self.num_nuclides) + all_groups = np.repeat(all_groups, len(query_nuclides)) if 'energy low [MeV]' in df and 'energyout low [MeV]' in df: df.rename(columns={'energy low [MeV]': 'group in'}, inplace=True) From b80b0fae835e920e1fc2a7686265cc37cd200cb1 Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 30 Aug 2016 14:29:19 -0400 Subject: [PATCH 152/168] Fixed isue with MGXS Pandas DataFrame with total nuclides --- openmc/mgxs/mgxs.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index d0bc07987c..dd5c2056c6 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -337,7 +337,7 @@ class MGXS(object): if self.by_nuclide: return self.get_nuclides() else: - return 'sum' + return ['sum'] @property def loaded_sp(self): @@ -1483,7 +1483,7 @@ class MGXS(object): if self.by_nuclide and nuclides == 'sum': # Use tally summation to sum across all nuclides - query_nuclides = self.get_nuclides() + query_nuclides = [nuclides] xs_tally = self.xs_tally.summation(nuclides=query_nuclides) df = xs_tally.get_pandas_dataframe( distribcell_paths=distribcell_paths) @@ -1503,7 +1503,7 @@ class MGXS(object): # If the user requested all nuclides, keep nuclide column in dataframe else: - query_nuclides = self.get_nuclides() + query_nuclides = self.nuclides df = self.xs_tally.get_pandas_dataframe( distribcell_paths=distribcell_paths) From 627057d87717411c94475e53ac097a33a3dddadf Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 30 Aug 2016 16:03:29 -0400 Subject: [PATCH 153/168] Fixed query_nuclides for sum in MGXS Pandas DataFrames --- openmc/mgxs/mgxs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index dd5c2056c6..543caf088a 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1484,7 +1484,7 @@ class MGXS(object): # Use tally summation to sum across all nuclides query_nuclides = [nuclides] - xs_tally = self.xs_tally.summation(nuclides=query_nuclides) + xs_tally = self.xs_tally.summation(nuclides=self.get_nuclides()) df = xs_tally.get_pandas_dataframe( distribcell_paths=distribcell_paths) From 96acab8ba1f8e34200a72a66fd768d9bcaed15aa Mon Sep 17 00:00:00 2001 From: Will Boyd Date: Tue, 30 Aug 2016 21:40:50 -0400 Subject: [PATCH 154/168] Fixed bug in nuclide summation for MGXS Pandas DataFrame --- openmc/mgxs/mgxs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openmc/mgxs/mgxs.py b/openmc/mgxs/mgxs.py index 543caf088a..1d2e9098d3 100644 --- a/openmc/mgxs/mgxs.py +++ b/openmc/mgxs/mgxs.py @@ -1490,9 +1490,9 @@ class MGXS(object): # Remove nuclide column since it is homogeneous and redundant if self.domain_type == 'mesh': - df.drop('nuclide', axis=1, level=0, inplace=True) + df.drop('sum(nuclide)', axis=1, level=0, inplace=True) else: - df.drop('nuclide', axis=1, inplace=True) + df.drop('sum(nuclide)', axis=1, inplace=True) # If the user requested a specific set of nuclides elif self.by_nuclide and nuclides != 'all': From 368e5cc87a5ad705c992f9b907f262163c960483 Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Wed, 31 Aug 2016 07:24:31 -0400 Subject: [PATCH 155/168] fixed issue in mdgxs.get_pandas_dataframe(...) --- openmc/mgxs/mdgxs.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/openmc/mgxs/mdgxs.py b/openmc/mgxs/mdgxs.py index 5e5d840b6c..7a76a6c9d9 100644 --- a/openmc/mgxs/mdgxs.py +++ b/openmc/mgxs/mdgxs.py @@ -343,7 +343,7 @@ class MDGXS(MGXS): # Construct a collection of the nuclides to retrieve from the xs tally if self.by_nuclide: if nuclides == 'all' or nuclides == 'sum' or nuclides == ['sum']: - query_nuclides = self.get_all_nuclides() + query_nuclides = self.get_nuclides() else: query_nuclides = nuclides else: @@ -553,7 +553,7 @@ class MDGXS(MGXS): # Construct a collection of the nuclides to report if self.by_nuclide: if nuclides == 'all': - nuclides = self.get_all_nuclides() + nuclides = self.get_nuclides() elif nuclides == 'sum': nuclides = ['sum'] else: @@ -751,25 +751,27 @@ class MDGXS(MGXS): if self.by_nuclide and nuclides == 'sum': # Use tally summation to sum across all nuclides - query_nuclides = self.get_all_nuclides() - xs_tally = self.xs_tally.summation(nuclides=query_nuclides) + query_nuclides = [nuclides] + xs_tally = self.xs_tally.summation(nuclides=self.get_nuclides()) df = xs_tally.get_pandas_dataframe( distribcell_paths=distribcell_paths) # Remove nuclide column since it is homogeneous and redundant if self.domain_type == 'mesh': - df.drop('nuclide', axis=1, level=0, inplace=True) + df.drop('sum(nuclide)', axis=1, level=0, inplace=True) else: - df.drop('nuclide', axis=1, inplace=True) + df.drop('sum(nuclide)', axis=1, inplace=True) # If the user requested a specific set of nuclides elif self.by_nuclide and nuclides != 'all': + query_nuclides = nuclides xs_tally = self.xs_tally.get_slice(nuclides=nuclides) df = xs_tally.get_pandas_dataframe( distribcell_paths=distribcell_paths) # If the user requested all nuclides, keep nuclide column in dataframe else: + query_nuclides = nuclides df = self.xs_tally.get_pandas_dataframe( distribcell_paths=distribcell_paths) @@ -781,7 +783,7 @@ class MDGXS(MGXS): # Override energy groups bounds with indices all_groups = np.arange(self.num_groups, 0, -1, dtype=np.int) - all_groups = np.repeat(all_groups, self.num_nuclides) + all_groups = np.repeat(all_groups, len(query_nuclides)) if 'energy low [MeV]' in df and 'energyout low [MeV]' in df: df.rename(columns={'energy low [MeV]': 'group in'}, inplace=True) @@ -1239,7 +1241,7 @@ class ChiDelayed(MDGXS): delayed_nu_fission_out = self.tallies['delayed-nu-fission-out'] # Sum out all nuclides - nuclides = self.get_all_nuclides() + nuclides = self.get_nuclides() delayed_nu_fission_in = delayed_nu_fission_in.summation\ (nuclides=nuclides) delayed_nu_fission_out = delayed_nu_fission_out.summation\ @@ -1261,7 +1263,7 @@ class ChiDelayed(MDGXS): # Get chi delayed for all nuclides in the domain elif nuclides == 'all': - nuclides = self.get_all_nuclides() + nuclides = self.get_nuclides() xs = self.xs_tally.get_values(filters=filters, filter_bins=filter_bins, nuclides=nuclides, value=value) From a95266ab2208f15d1b1af29d23509dcfd8fb3e39 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Mon, 29 Aug 2016 10:16:59 -0500 Subject: [PATCH 156/168] Major refactor to include cross sections at multiple temperatures within the Nuclide and SAlphaData derived types. --- docs/source/io_formats/nuclear_data.rst | 23 +- docs/source/methods/cross_sections.rst | 37 +- docs/source/usersguide/input.rst | 73 ++- examples/python/basic/build-xml.py | 1 - examples/python/boxes/build-xml.py | 1 - .../python/lattice/hexagonal/build-xml.py | 1 - examples/python/lattice/nested/build-xml.py | 1 - examples/python/lattice/simple/build-xml.py | 1 - examples/python/pincell/build-xml.py | 1 - .../python/pincell_multigroup/build-xml.py | 9 +- examples/python/reflective/build-xml.py | 1 - examples/xml/basic/materials.xml | 2 - examples/xml/boxes/materials.xml | 2 - examples/xml/lattice/nested/materials.xml | 2 - examples/xml/lattice/simple/materials.xml | 2 - examples/xml/pincell/materials.xml | 3 - examples/xml/pincell_multigroup/materials.xml | 3 - .../pincell_multigroup/mg_cross_sections.xml | 32 +- examples/xml/reflective/materials.xml | 2 - openmc/data/neutron.py | 9 +- openmc/data/thermal.py | 24 +- openmc/mgxs_library.py | 23 - openmc/nuclide.py | 16 - openmc/settings.py | 122 ++-- openmc/summary.py | 4 +- src/constants.F90 | 12 +- src/cross_section.F90 | 511 +++++++++-------- src/energy_grid.F90 | 176 +----- src/geometry.F90 | 52 +- src/global.F90 | 12 +- src/hdf5_interface.F90 | 62 +++ src/initialize.F90 | 76 +-- src/input_xml.F90 | 291 ++++++---- src/material_header.F90 | 3 - src/mgxs_header.F90 | 12 - src/multipole.F90 | 110 +--- src/nuclide_header.F90 | 524 +++++++++--------- src/output.F90 | 51 -- src/particle_header.F90 | 2 + src/physics.F90 | 454 +++++++-------- src/reaction_header.F90 | 36 +- src/relaxng/materials.rnc | 6 +- src/relaxng/materials.rng | 307 +++++----- src/relaxng/settings.rnc | 6 + src/relaxng/settings.rng | 15 + src/sab_header.F90 | 428 +++++++------- src/summary.F90 | 14 +- src/tally.F90 | 42 +- src/tracking.F90 | 7 +- tests/test_cmfd_feed/materials.xml | 4 +- tests/test_cmfd_nofeed/materials.xml | 4 +- tests/test_complex_cell/materials.xml | 2 - tests/test_confidence_intervals/materials.xml | 2 +- tests/test_density/materials.xml | 2 - .../test_eigenvalue_genperbatch/materials.xml | 2 - .../test_eigenvalue_no_inactive/materials.xml | 2 - tests/test_energy_grid/materials.xml | 2 - tests/test_energy_grid/settings.xml | 2 +- tests/test_energy_laws/materials.xml | 1 - tests/test_entropy/materials.xml | 2 - .../case-1/materials.xml | 2 - .../case-2/materials.xml | 3 - .../case-3/materials.xml | 2 - .../case-4/materials.xml | 2 - tests/test_filter_mesh_2d/materials.xml | 2 - tests/test_filter_mesh_3d/materials.xml | 2 - tests/test_fixed_source/materials.xml | 2 - tests/test_fixed_source/settings.xml | 2 + tests/test_infinite_cell/materials.xml | 2 - tests/test_lattice/materials.xml | 2 - tests/test_lattice_hex/materials.xml | 10 +- tests/test_lattice_mixed/materials.xml | 10 +- tests/test_lattice_multiple/materials.xml | 2 - tests/test_multipole/inputs_true.dat | 2 +- tests/test_multipole/results_true.dat | 2 +- tests/test_multipole/test_multipole.py | 34 +- tests/test_natural_element/materials.xml | 2 - tests/test_output/materials.xml | 2 - tests/test_output/settings.xml | 2 +- tests/test_output/test_output.py | 4 - .../materials.xml | 2 - .../test_particle_restart_fixed/materials.xml | 2 - tests/test_plot/materials.xml | 2 - tests/test_ptables_off/materials.xml | 2 - tests/test_quadric_surfaces/materials.xml | 2 - tests/test_reflective_plane/materials.xml | 2 - .../test_resonance_scattering/inputs_true.dat | 2 +- .../test_resonance_scattering.py | 41 +- tests/test_rotation/materials.xml | 2 - tests/test_salphabeta/materials.xml | 2 - tests/test_score_current/materials.xml | 2 - tests/test_seed/materials.xml | 2 - tests/test_source/inputs_true.dat | 2 +- tests/test_source/test_source.py | 2 +- tests/test_source_file/materials.xml | 2 - tests/test_sourcepoint_batch/materials.xml | 2 - tests/test_sourcepoint_interval/materials.xml | 2 - tests/test_sourcepoint_latest/materials.xml | 2 - tests/test_sourcepoint_restart/materials.xml | 2 - tests/test_statepoint_batch/materials.xml | 2 - tests/test_statepoint_interval/materials.xml | 2 - tests/test_statepoint_restart/materials.xml | 2 - tests/test_statepoint_sourcesep/materials.xml | 2 - tests/test_survival_biasing/materials.xml | 2 - tests/test_tally_assumesep/materials.xml | 2 - tests/test_tally_nuclides/materials.xml | 2 - tests/test_trace/materials.xml | 2 - tests/test_track_output/materials.xml | 2 - tests/test_translation/materials.xml | 2 - .../test_trigger_batch_interval/materials.xml | 2 - .../materials.xml | 2 - tests/test_trigger_no_status/materials.xml | 2 - tests/test_trigger_tallies/materials.xml | 2 - tests/test_uniform_fs/materials.xml | 2 - tests/test_union_energy_grids/geometry.xml | 8 - tests/test_union_energy_grids/materials.xml | 13 - .../test_union_energy_grids/results_true.dat | 2 - tests/test_union_energy_grids/settings.xml | 18 - .../test_union_energy_grids.py | 11 - tests/test_universe/materials.xml | 2 - tests/test_void/materials.xml | 2 - 121 files changed, 1670 insertions(+), 2213 deletions(-) delete mode 100644 tests/test_union_energy_grids/geometry.xml delete mode 100644 tests/test_union_energy_grids/materials.xml delete mode 100644 tests/test_union_energy_grids/results_true.dat delete mode 100644 tests/test_union_energy_grids/settings.xml delete mode 100644 tests/test_union_energy_grids/test_union_energy_grids.py diff --git a/docs/source/io_formats/nuclear_data.rst b/docs/source/io_formats/nuclear_data.rst index 8d8da8edae..060e96c0c9 100644 --- a/docs/source/io_formats/nuclear_data.rst +++ b/docs/source/io_formats/nuclear_data.rst @@ -26,8 +26,9 @@ Incident Neutron Data temperature-dependent data set. For example, the data set corresponding to 300 Kelvin would be located at `300K`. -:Datasets: - **K** (*double*) -- kT values (in MeV) for each Temperature - TTT (in Kelvin) +:Datasets: + - **K** (*double*) -- kT values (in MeV) for each Temperature + TTT (in Kelvin) **//reactions/reaction_/** @@ -44,11 +45,14 @@ temperature-dependent data set. For example, the data set corresponding to temperature-dependent data set. For example, the data set corresponding to 300 Kelvin would be located at `300K`. -:Attributes: - **threshold_idx** (*int*) -- Index on the energy grid that the - reaction threshold corresponds to for temperature TTT (in Kelvin) +:Datasets: + - **xs** (*double[]*) -- Cross section values tabulated against the + nuclide energy grid for temperature TTT (in Kelvin) -:Datasets: - **xs** (*double[]*) -- Cross section values tabulated against the - nuclide energy grid for temperature TTT (in Kelvin) + :Attributes: + - **threshold_idx** (*int*) -- Index on the energy + grid that the reaction threshold corresponds to for + temperature TTT (in Kelvin) **//reactions/reaction_/product_/** @@ -112,7 +116,7 @@ Thermal Neutron Scattering Data **//** :Attributes: - **atomic_weight_ratio** (*double*) -- Mass in units of neutron masses - - **zaids** (*int[]*) -- ZAID identifiers for which the thermal + - **nuclides** (*char[][]*) -- Names of nuclides for which the thermal scattering data applies to - **secondary_mode** (*char[]*) -- Indicates how the inelastic outgoing angle-energy distributions are represented ('equal', @@ -124,8 +128,9 @@ Thermal Neutron Scattering Data temperature-dependent data set. For example, the data set corresponding to 300 Kelvin would be located at `300K`. -:Datasets: - **K** (*double*) -- kT values (in MeV) for each Temperature - TTT (in Kelvin) +:Datasets: + - **K** (*double*) -- kT values (in MeV) for each Temperature + TTT (in Kelvin) **//elastic/K/** diff --git a/docs/source/methods/cross_sections.rst b/docs/source/methods/cross_sections.rst index 4ed7775367..a4d0f7d248 100644 --- a/docs/source/methods/cross_sections.rst +++ b/docs/source/methods/cross_sections.rst @@ -53,12 +53,12 @@ speed up the calculation. Logarithmic Mapping +++++++++++++++++++ -To speed up energy grid searches, OpenMC uses logarithmic mapping technique -[Brown]_ to limit the range of energies that must be searched for each -nuclide. The entire energy range is divided up into equal-lethargy segments, and -the bounding energies of each segment are mapped to bounding indices on each of -the nuclide energy grids. By default, OpenMC uses 8000 equal-lethargy segments -as recommended by Brown. +To speed up energy grid searches, OpenMC uses a `logarithmic mapping technique`_ +to limit the range of energies that must be searched for each nuclide. The +entire energy range is divided up into equal-lethargy segments, and the bounding +energies of each segment are mapped to bounding indices on each of the nuclide +energy grids. By default, OpenMC uses 8000 equal-lethargy segments as +recommended by Brown. Other Methods +++++++++++++ @@ -74,9 +74,9 @@ offers support for an experimental data format called windowed multipole (WMP). This data format requires less memory than pointwise cross sections, and it allows on-the-fly Doppler broadening to arbitrary temperature. -The multipole method was introduced by [Hwang]_ and the faster windowed -multipole method by [Josey]_. In the multipole format, cross section resonances -are represented by poles, :math:`p_j`, and residues, :math:`r_j`, in the complex +The multipole method was introduced by Hwang_ and the faster windowed multipole +method by Josey_. In the multipole format, cross section resonances are +represented by poles, :math:`p_j`, and residues, :math:`r_j`, in the complex plane. The 0K cross sections in the resolved resonance region can be computed by summing up a contribution from each pole: @@ -232,21 +232,10 @@ sections. This allows flexibility for the model to use highly anisotropic scattering information in the water while the fuel can be simulated with linear or even isotropic scattering. -.. only:: html - - .. rubric:: References - -.. [Brown] Forrest B. Brown, "New Hash-based Energy Lookup Algorithm for Monte - Carlo codes," LA-UR-14-24530, Los Alamos National Laboratory (2014). - -.. [Hwang] R. N. Hwang, "A Rigorous Pole Representation of Multilevel Cross - Sections and Its Practical Application," *Nucl. Sci. Eng.*, **96**, - 192-209 (1987). - -.. [Josey] Colin Josey, Pablo Ducru, Benoit Forget, and Kord Smith, "Windowed - Multipole for Cross Section Doppler Broadening," *J. Comp. Phys*, - **307**, 715-727 (2016). http://dx.doi.org/10.1016/j.jcp.2015.08.013 - +.. _logarithmic mapping technique: + https://laws.lanl.gov/vhosts/mcnp.lanl.gov/pdf_files/la-ur-14-24530.pdf +.. _Hwang: http://www.ans.org/pubs/journals/nse/a_16381 +.. _Josey: http://dx.doi.org/10.1016/j.jcp.2015.08.013 .. _MCNP: http://mcnp.lanl.gov .. _Serpent: http://montecarlo.vtt.fi .. _NJOY: http://t2.lanl.gov/codes.shtml diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index 57663594d5..41623b6a16 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -281,6 +281,8 @@ based on the recommended value in LA-UR-14-24530_. .. note:: This element is not used in the multi-group :ref:`energy_mode`. +.. _multipole_library: + ```` Element ------------------------------- @@ -290,8 +292,8 @@ OpenMC can use it for on-the-fly Doppler-broadening of resolved resonance range cross sections. If this element is absent from the settings.xml file, the :envvar:`OPENMC_MULTIPOLE_LIBRARY` environment variable will be used. - .. note:: The element must also be set to "true" - for windowed multipole functionality. + .. note:: The :ref:`temperature_method` must also be set to "multipole" for + windowed multipole functionality. ```` Element --------------------------- @@ -707,6 +709,47 @@ survival biasing, otherwise known as implicit capture or absorption. *Default*: false +.. _temperature_default: + +```` Element +--------------------------------- + +The ```` element specifies a default temperature in Kelvin +that is to be applied to cells in the absence of an explicit cell temperature or +a material default temperature. + + *Default*: 293.6 K + +.. _temperature_method: + +```` Element +-------------------------------- + +The ```` element has an accepted value of "nearest" or +"interpolation". A value of "nearest" indicates that for each cell, the nearest +temperature at which cross sections are given is to be applied, within a given +tolerance (see :ref:`temperature_tolerance`). A value of "interpolation" +indicates that cross sections are to be interpolated between temperatures at +which nuclear data are present. A value of "multipole" indicates that the +windowed multipole method should be used to evaluate temperature-dependent cross +sections in the resolved resonance range (a :ref:`windowed multipole library +` must also be available). + + *Default*: "nearest" + +.. _temperature_tolerance: + +```` Element +----------------------------------- + +The ```` element specifies a tolerance in Kelvin that is +to be applied when the "nearest" temperature method is used. For example, if a +cell temperature is 340 K and the tolerance is 15 K, then the closest +temperature in the range of 325 K to 355 K will be used to evaluate cross +sections. + + *Default*: 10 K + ```` Element --------------------- @@ -1083,7 +1126,9 @@ Each ```` element can have the following attributes or sub-elements: specified for the "distributed temperature" feature. This will give each unique instance of the cell its own temperature. - *Default*: The temperature of the coldest nuclide in the cell's material(s) + *Default*: If a material default temperature is supplied, it is used. In the + absence of a material default temperature, the :ref:`global default + temperature ` is used. :rotation: If the cell is filled with a universe, this element specifies the angles in @@ -1289,11 +1334,12 @@ Each ``material`` element can have the following attributes or sub-elements: *Default*: "" :temperature: + An element with no attributes which is used to set the default temperature + of the material in Kelvin. - An element with no attributes which is used to set the temperature of the - material. This element accepts a maximum 6-character string that indicates - the default temperature rounded to the nearest integer in units of Kelvin, - e.g. "294K". + *Default*: If a material default temperature is not given and a cell + temperature is not specified, the :ref:`global default temperature + ` is used. :density: An element with attributes/sub-elements called ``value`` and ``units``. The @@ -1409,19 +1455,6 @@ Each ``material`` element can have the following attributes or sub-elements: .. _IUPAC Isotopic Compositions of the Elements 2009: http://pac.iupac.org/publications/pac/pdf/2011/pdf/8302x0397.pdf -```` Element ------------------------- - -In some circumstances, the temperature may be the same for many or -all materials in a given problem. In this case, rather than specifying the -```` element on every material, a ```` -element can be used to set the default material temperature for any material -without an explicitly provided temperature. This element has no attributes and -accepts a maximum 6-character string that indicates the default temperature -rounded to the nearest integer in units of Kelvin, e.g. "294K". - - *Default*: None - ------------------------------------ Tallies Specification -- tallies.xml ------------------------------------ diff --git a/examples/python/basic/build-xml.py b/examples/python/basic/build-xml.py index 802debf8cd..022737fdb0 100644 --- a/examples/python/basic/build-xml.py +++ b/examples/python/basic/build-xml.py @@ -33,7 +33,6 @@ fuel.add_nuclide(u235, 1.) # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([moderator, fuel]) -materials_file.default_temperature = '294K' materials_file.export_to_xml() diff --git a/examples/python/boxes/build-xml.py b/examples/python/boxes/build-xml.py index 175d3f5113..308019e7dc 100644 --- a/examples/python/boxes/build-xml.py +++ b/examples/python/boxes/build-xml.py @@ -38,7 +38,6 @@ moderator.add_s_alpha_beta('c_H_in_H2O') # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([fuel1, fuel2, moderator]) -materials_file.default_temperature = '294K' materials_file.export_to_xml() diff --git a/examples/python/lattice/hexagonal/build-xml.py b/examples/python/lattice/hexagonal/build-xml.py index b131e9dea2..cca072ba72 100644 --- a/examples/python/lattice/hexagonal/build-xml.py +++ b/examples/python/lattice/hexagonal/build-xml.py @@ -37,7 +37,6 @@ iron.add_nuclide(fe56, 1.) # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([moderator, fuel, iron]) -materials_file.default_temperature = '294K' materials_file.export_to_xml() diff --git a/examples/python/lattice/nested/build-xml.py b/examples/python/lattice/nested/build-xml.py index 59962c2c30..3189641e77 100644 --- a/examples/python/lattice/nested/build-xml.py +++ b/examples/python/lattice/nested/build-xml.py @@ -32,7 +32,6 @@ moderator.add_s_alpha_beta('c_H_in_H2O') # Instantiate a Materials collection and export to XML materials_file = openmc.Materials((moderator, fuel)) -materials_file.default_temperature = '294K' materials_file.export_to_xml() diff --git a/examples/python/lattice/simple/build-xml.py b/examples/python/lattice/simple/build-xml.py index ad1c465d43..2f1f8e76e3 100644 --- a/examples/python/lattice/simple/build-xml.py +++ b/examples/python/lattice/simple/build-xml.py @@ -32,7 +32,6 @@ moderator.add_s_alpha_beta('c_H_in_H2O') # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([moderator, fuel]) -materials_file.default_temperature = '294K' materials_file.export_to_xml() diff --git a/examples/python/pincell/build-xml.py b/examples/python/pincell/build-xml.py index a11ddb7cdc..fc91ae6931 100644 --- a/examples/python/pincell/build-xml.py +++ b/examples/python/pincell/build-xml.py @@ -102,7 +102,6 @@ borated_water.add_s_alpha_beta('c_H_in_H2O') # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([uo2, helium, zircaloy, borated_water]) -materials_file.default_temperature = '294K' materials_file.export_to_xml() diff --git a/examples/python/pincell_multigroup/build-xml.py b/examples/python/pincell_multigroup/build-xml.py index 6dbfa336bb..2b08e82748 100644 --- a/examples/python/pincell_multigroup/build-xml.py +++ b/examples/python/pincell_multigroup/build-xml.py @@ -19,7 +19,7 @@ groups = openmc.mgxs.EnergyGroups(group_edges=[1E-11, 0.0635E-6, 10.0E-6, 1.0E-4, 1.0E-3, 0.5, 1.0, 20.0]) # Instantiate the 7-group (C5G7) cross section data -uo2_xsdata = openmc.XSdata('UO2.300K', groups) +uo2_xsdata = openmc.XSdata('UO2', groups) uo2_xsdata.order = 0 uo2_xsdata.total = [0.1779492, 0.3298048, 0.4803882, 0.5543674, 0.3118013, 0.3951678, 0.5644058] @@ -41,7 +41,7 @@ uo2_xsdata.nu_fission = [2.005998E-02, 2.027303E-03, 1.570599E-02, uo2_xsdata.chi = [5.8791E-01, 4.1176E-01, 3.3906E-04, 1.1761E-07, 0.0000E+00, 0.0000E+00, 0.0000E+00] -h2o_xsdata = openmc.XSdata('LWTR.300K', groups) +h2o_xsdata = openmc.XSdata('LWTR', groups) h2o_xsdata.order = 0 h2o_xsdata.total = [0.15920605, 0.412969593, 0.59030986, 0.58435, 0.718, 1.2544497, 2.650379] @@ -66,8 +66,8 @@ mg_cross_sections_file.export_to_xml() ############################################################################### # Instantiate some Macroscopic Data -uo2_data = openmc.Macroscopic('UO2', '300K') -h2o_data = openmc.Macroscopic('LWTR', '300K') +uo2_data = openmc.Macroscopic('UO2') +h2o_data = openmc.Macroscopic('LWTR') # Instantiate some Materials and register the appropriate Macroscopic objects uo2 = openmc.Material(material_id=1, name='UO2 fuel') @@ -80,7 +80,6 @@ water.add_macroscopic(h2o_data) # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([uo2, water]) -materials_file.default_xs = '300K' materials_file.export_to_xml() diff --git a/examples/python/reflective/build-xml.py b/examples/python/reflective/build-xml.py index 098fa8620e..af86e446ab 100644 --- a/examples/python/reflective/build-xml.py +++ b/examples/python/reflective/build-xml.py @@ -25,7 +25,6 @@ fuel.add_nuclide(u235, 1.) # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([fuel]) -materials_file.default_temperature = '294K' materials_file.export_to_xml() diff --git a/examples/xml/basic/materials.xml b/examples/xml/basic/materials.xml index b7bc2e4e5a..606c676df8 100644 --- a/examples/xml/basic/materials.xml +++ b/examples/xml/basic/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/examples/xml/boxes/materials.xml b/examples/xml/boxes/materials.xml index 417fb83ba5..1d0ab4a1ca 100644 --- a/examples/xml/boxes/materials.xml +++ b/examples/xml/boxes/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/examples/xml/lattice/nested/materials.xml b/examples/xml/lattice/nested/materials.xml index ddd932fcbc..2222721959 100644 --- a/examples/xml/lattice/nested/materials.xml +++ b/examples/xml/lattice/nested/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/examples/xml/lattice/simple/materials.xml b/examples/xml/lattice/simple/materials.xml index ddd932fcbc..2222721959 100644 --- a/examples/xml/lattice/simple/materials.xml +++ b/examples/xml/lattice/simple/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/examples/xml/pincell/materials.xml b/examples/xml/pincell/materials.xml index 020c0e676b..9f9afa3843 100644 --- a/examples/xml/pincell/materials.xml +++ b/examples/xml/pincell/materials.xml @@ -1,9 +1,6 @@ - - 294K - - 300K - diff --git a/examples/xml/pincell_multigroup/mg_cross_sections.xml b/examples/xml/pincell_multigroup/mg_cross_sections.xml index 3c671a1922..af1f0072b4 100644 --- a/examples/xml/pincell_multigroup/mg_cross_sections.xml +++ b/examples/xml/pincell_multigroup/mg_cross_sections.xml @@ -11,8 +11,8 @@ --> - UO2.300K - UO2.300K + UO2 + UO2 2.53E-8 0 true @@ -67,8 +67,8 @@ - MOX1.300K - MOX1.300K + MOX1 + MOX1 2.53E-8 0 true @@ -124,8 +124,8 @@ - MOX2.300K - MOX2.300K + MOX2 + MOX2 2.53E-8 0 true @@ -180,8 +180,8 @@ - MOX3.300K - MOX3.300K + MOX3 + MOX3 2.53E-8 0 true @@ -236,8 +236,8 @@ - FC.300K - FC.300K + FC + FC 2.53E-8 0 true @@ -286,8 +286,8 @@ - GT.300K - GT.300K + GT + GT 2.53E-8 0 false @@ -318,8 +318,8 @@ - LWTR.300K - LWTR.300K + LWTR + LWTR 2.53E-8 0 false @@ -351,8 +351,8 @@ - CR.300K - CR.300K + CR + CR 2.53E-8 0 false diff --git a/examples/xml/reflective/materials.xml b/examples/xml/reflective/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/examples/xml/reflective/materials.xml +++ b/examples/xml/reflective/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index c629dbc2ad..7568a24ba8 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -100,7 +100,7 @@ class IncidentNeutron(EqualityMixin): Parameters ---------- name : str - Name of the table + Name of the nuclide using the GND naming convention atomic_number : int Number of protons in the nucleus mass_number : int @@ -133,7 +133,7 @@ class IncidentNeutron(EqualityMixin): metastable : int Metastable state of the nucleus. A value of zero indicates ground state. name : str - ZAID identifier of the table, e.g. 92235. + Name of the nuclide using the GND naming convention reactions : collections.OrderedDict Contains the cross sections, secondary angle and energy distributions, and other associated data for each reaction. The keys are the MT values @@ -534,11 +534,6 @@ class IncidentNeutron(EqualityMixin): # Assign temperature to the running list kTs = [ace.temperature] - # 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) - data = cls(name, Z, mass_number, metastable, ace.atomic_weight_ratio, kTs) diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 21edab6868..58c5276052 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -8,7 +8,7 @@ import h5py import openmc.checkvalue as cv from openmc.mixin import EqualityMixin -from .data import K_BOLTZMANN +from .data import K_BOLTZMANN, ATOMIC_SYMBOL from .ace import Table, get_table from .angle_energy import AngleEnergy from .function import Tabulated1D @@ -156,7 +156,7 @@ class ThermalScattering(EqualityMixin): Parameters ---------- name : str - ZAID identifier of the table, e.g. lwtr.10t. + Name of the material using GND convention, e.g. c_H_in_H2O atomic_weight_ratio : float Atomic mass ratio of the target nuclide. kTs : Iterable of float @@ -174,7 +174,7 @@ class ThermalScattering(EqualityMixin): Inelastic scattering cross section derived in the incoherent approximation name : str - Name of the table, e.g. lwtr.20t. + Name of the material using GND convention, e.g. c_H_in_H2O temperatures : Iterable of str List of string representations the temperatures of the target nuclide in the data set. The temperatures are strings of the temperature, @@ -182,8 +182,8 @@ class ThermalScattering(EqualityMixin): kTs : Iterable of float List of temperatures of the target nuclide in the data set. The temperatures have units of MeV. - zaids : Iterable of int - ZAID identifiers that the thermal scattering data applies to + nuclides : Iterable of str + Nuclide names that the thermal scattering data applies to """ @@ -200,7 +200,7 @@ class ThermalScattering(EqualityMixin): self.inelastic_mu_out = {} self.inelastic_dist = {} self.secondary_mode = None - self.zaids = [] + self.nuclides = [] def __repr__(self): if hasattr(self, 'name'): @@ -226,7 +226,7 @@ class ThermalScattering(EqualityMixin): # Write basic data g = f.create_group(self.name) g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio - g.attrs['zaids'] = self.zaids + g.attrs['nuclides'] = np.string_(self.nuclides) g.attrs['secondary_mode'] = np.string_(self.secondary_mode) ktg = g.create_group('kTs') for i, temperature in enumerate(self.temperatures): @@ -446,7 +446,7 @@ class ThermalScattering(EqualityMixin): temperatures = [str(int(round(kT / K_BOLTZMANN))) + "K" for kT in kTs] table = cls(name, atomic_weight_ratio, kTs) - table.zaids = group.attrs['zaids'] + table.nuclides = [nuc.decode() for nuc in group.attrs['nuclides']] table.secondary_mode = group.attrs['secondary_mode'].decode() # Read thermal elastic scattering @@ -628,8 +628,10 @@ class ThermalScattering(EqualityMixin): table.elastic_mu_out[temperatures[0]].shape = \ (n_energy, n_mu) - # Get relevant ZAIDs - pairs = np.fromiter(map(lambda p: p[0], ace.pairs), int) - table.zaids = pairs[np.nonzero(pairs)] + # Get relevant nuclides + for zaid, awr in ace.pairs: + if zaid > 0: + Z, A = divmod(zaid, 1000) + table.nuclides.append(ATOMIC_SYMBOL[Z] + str(A)) return table diff --git a/openmc/mgxs_library.py b/openmc/mgxs_library.py index a3a2187b75..37ad6c1be4 100644 --- a/openmc/mgxs_library.py +++ b/openmc/mgxs_library.py @@ -99,9 +99,6 @@ class XSdata(object): Unique identifier for the xsdata object alias : str Separate unique identifier for the xsdata object - zaid : int - 1000*(atomic number) + mass number. As an example, the zaid of U235 - would be 92235. awr : float Atomic weight ratio of an isotope. That is, the ratio of the mass of the isotope to the mass of a single neutron. @@ -227,7 +224,6 @@ class XSdata(object): self._energy_groups = energy_groups self._representation = representation self._alias = None - self._zaid = None self._awr = None self._kT = None self._fissionable = False @@ -262,10 +258,6 @@ class XSdata(object): def alias(self): return self._alias - @property - def zaid(self): - return self._zaid - @property def awr(self): return self._awr @@ -396,13 +388,6 @@ class XSdata(object): else: self._alias = self._name - @zaid.setter - def zaid(self, zaid): - # Check type and value - check_type('zaid', zaid, Integral) - check_greater_than('zaid', zaid, 0) - self._zaid = zaid - @awr.setter def awr(self, awr): # Check validity of type and that the awr value is > 0 @@ -1013,18 +998,10 @@ class XSdata(object): subelement = ET.SubElement(element, 'kT') subelement.text = str(self._kT) - if self._zaid is not None: - subelement = ET.SubElement(element, 'zaid') - subelement.text = str(self._zaid) - if self._awr is not None: subelement = ET.SubElement(element, 'awr') subelement.text = str(self._awr) - if self._kT is not None: - subelement = ET.SubElement(element, 'kT') - subelement.text = str(self._kT) - if self._fissionable is not None: subelement = ET.SubElement(element, 'fissionable') subelement.text = str(self._fissionable) diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 186292a873..11c59e6879 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -20,9 +20,6 @@ class Nuclide(object): ---------- name : str Name of the nuclide, e.g. U235 - zaid : int - 1000*(atomic number) + mass number. As an example, the zaid of U235 - would be 92235. scattering : 'data' or 'iso-in-lab' or None The type of angular scattering distribution to use @@ -31,7 +28,6 @@ class Nuclide(object): def __init__(self, name=''): # Initialize class attributes self._name = '' - self._zaid = None self._scattering = None # Set the Material class attributes @@ -62,8 +58,6 @@ class Nuclide(object): def __repr__(self): string = 'Nuclide - {0}\n'.format(self._name) - if self.zaid is not None: - string += '{0: <16}{1}{2}\n'.format('\tZAID', '=\t', self.zaid) if self.scattering is not None: string += '{0: <16}{1}{2}\n'.format('\tscattering', '=\t', self.scattering) @@ -73,10 +67,6 @@ class Nuclide(object): def name(self): return self._name - @property - def zaid(self): - return self._zaid - @property def scattering(self): return self._scattering @@ -96,14 +86,8 @@ class Nuclide(object): '"{}" is being renamed as "{}".'.format(name, self._name) warnings.warn(msg) - @zaid.setter - def zaid(self, zaid): - check_type('zaid', zaid, Integral) - self._zaid = zaid - @scattering.setter def scattering(self, scattering): - if not scattering in ['data', 'iso-in-lab']: msg = 'Unable to set scattering for Nuclide to {0} ' \ 'which is not "data" or "iso-in-lab"'.format(scattering) diff --git a/openmc/settings.py b/openmc/settings.py index c1d4adc24c..86aac94712 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -1,4 +1,4 @@ -from collections import Iterable, MutableSequence +from collections import Iterable, MutableSequence, Mapping from numbers import Real, Integral import warnings from xml.etree import ElementTree as ET @@ -78,8 +78,6 @@ class Settings(object): cross section library. If it is not set, the :envvar:`OPENMC_MULTIPOLE_LIBRARY` environment variable will be used. A multipole library is optional. - energy_grid : {'nuclide', 'logarithm', 'material-union'} - Set the method used to search energy grids. energy_mode : {'continuous-energy', 'multi-group'} Set whether the calculation should be continuous-energy or multi-group. max_order : int @@ -103,6 +101,14 @@ class Settings(object): Coordinates of the lower-left point of the Shannon entropy mesh entropy_upper_right : tuple or list Coordinates of the upper-right point of the Shannon entropy mesh + temperature : dict + Defines a default temperature and method for treating intermediate + temperatures at which nuclear data doesn't exist. Accepted keys are + 'default', 'method', and 'tolerance'. 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. trigger_active : bool Indicate whether tally triggers are used trigger_max_batches : int @@ -130,9 +136,6 @@ class Settings(object): Coordinates of the lower-left point of the UFS mesh ufs_upper_right : tuple or list Coordinates of the upper-right point of the UFS mesh - use_windowed_multipole : bool - Whether or not windowed multipole can be used to evaluate resolved - resonance cross sections. resonance_scattering : ResonanceScattering or iterable of ResonanceScattering The elastic scattering model to use for resonant isotopes volume_calculations : VolumeCalculation or iterable of VolumeCalculation @@ -160,7 +163,6 @@ class Settings(object): self._confidence_intervals = None self._cross_sections = None self._multipole_library = None - self._energy_grid = None self._ptables = None self._run_cmfd = None self._seed = None @@ -197,6 +199,8 @@ class Settings(object): self._trace = None self._track = None + self._temperature = {} + # Cutoff subelement self._weight = None self._weight_avg = None @@ -216,7 +220,6 @@ class Settings(object): self._settings_file = ET.Element("settings") self._run_mode_subelement = None - self._multipole_active = None self._resonance_scattering = cv.CheckedList( ResonanceScattering, 'resonance scattering models') @@ -271,10 +274,6 @@ class Settings(object): def multipole_library(self): return self._multipole_library - @property - def energy_grid(self): - return self._energy_grid - @property def ptables(self): return self._ptables @@ -363,6 +362,10 @@ class Settings(object): def verbosity(self): return self._verbosity + @property + def temperature(self): + return self._temperature + @property def trace(self): return self._trace @@ -415,10 +418,6 @@ class Settings(object): def dd_count_interactions(self): return self._dd_count_interactions - @property - def use_windowed_multipole(self): - return self._multipole_active - @property def resonance_scattering(self): return self._resonance_scattering @@ -593,12 +592,6 @@ class Settings(object): cv.check_type('cross sections', multipole_library, basestring) self._multipole_library = multipole_library - @energy_grid.setter - def energy_grid(self, energy_grid): - cv.check_value('energy grid', energy_grid, - ['nuclide', 'logarithm', 'material-union']) - self._energy_grid = energy_grid - @ptables.setter def ptables(self, ptables): cv.check_type('probability tables', ptables, bool) @@ -674,6 +667,21 @@ class Settings(object): cv.check_type('no reduction option', no_reduce, bool) self._no_reduce = no_reduce + @temperature.setter + def temperature(self, temperature): + cv.check_type('temperature settings', temperature, Mapping) + for key, value in temperature.items(): + cv.check_value('temperature key', key, + ['default', 'method', 'tolerance']) + if key == 'default': + cv.check_type('default temperature', value, Real) + elif key == 'method': + cv.check_value('temperature method', value, + ['nearest', 'interpolation', 'multipole']) + elif key == 'tolerance': + cv.check_type('temperature tolerance', value, Real) + self._temperature = temperature + @threads.setter def threads(self, threads): cv.check_type('number of threads', threads, Integral) @@ -801,11 +809,6 @@ class Settings(object): self._dd_count_interactions = interactions - @use_windowed_multipole.setter - def use_windowed_multipole(self, active): - cv.check_type('use_windowed_multipole', active, bool) - self._multipole_active = active - @resonance_scattering.setter def resonance_scattering(self, res): if not isinstance(res, MutableSequence): @@ -963,11 +966,6 @@ class Settings(object): element = ET.SubElement(self._settings_file, "multipole_library") element.text = str(self._multipole_library) - def _create_energy_grid_subelement(self): - if self._energy_grid is not None: - element = ET.SubElement(self._settings_file, "energy_grid") - element.text = str(self._energy_grid) - def _create_ptables_subelement(self): if self._ptables is not None: element = ET.SubElement(self._settings_file, "ptables") @@ -1050,6 +1048,13 @@ class Settings(object): element = ET.SubElement(self._settings_file, "no_reduce") element.text = str(self._no_reduce).lower() + def _create_temperature_subelements(self): + if self.temperature: + for key, value in self.temperature.items(): + element = ET.SubElement(self._settings_file, + "temperature_{}".format(key)) + element.text = str(value) + def _create_threads_subelement(self): if self._threads is not None: element = ET.SubElement(self._settings_file, "threads") @@ -1107,20 +1112,10 @@ class Settings(object): subelement = ET.SubElement(element, "count_interactions") subelement.text = str(self._dd_count_interactions).lower() - def _create_use_multipole_subelement(self): - if self._multipole_active is not None: - element = ET.SubElement(self._settings_file, - "use_windowed_multipole") - element.text = str(self._multipole_active) - def _create_resonance_scattering_subelement(self): if len(self.resonance_scattering) > 0: elem = ET.SubElement(self._settings_file, 'resonance_scattering') for r in self.resonance_scattering: - if r.nuclide.name != r.nuclide_0K.name: - raise ValueError("The nuclide and nuclide_0K attributes of " - "a ResonantScattering object must have " - "identical names.") elem.append(r.to_xml_element()) def export_to_xml(self): @@ -1142,7 +1137,6 @@ class Settings(object): self._create_confidence_intervals() self._create_cross_sections_subelement() self._create_multipole_library_subelement() - self._create_energy_grid_subelement() self._create_energy_mode_subelement() self._create_max_order_subelement() self._create_ptables_subelement() @@ -1155,11 +1149,11 @@ class Settings(object): self._create_no_reduce_subelement() self._create_threads_subelement() self._create_verbosity_subelement() + self._create_temperature_subelements() self._create_trace_subelement() self._create_track_subelement() self._create_ufs_subelement() self._create_dd_subelement() - self._create_use_multipole_subelement() self._create_resonance_scattering_subelement() self._create_volume_calcs_subelement() @@ -1175,14 +1169,26 @@ class Settings(object): class ResonanceScattering(object): """Specification of the elastic scattering model for resonant isotopes + Parameters + ---------- + nuclide : openmc.Nuclide + The nuclide affected by this resonance scattering treatment. + method : {'ARES', 'CXS', 'DBRC', 'WCM'} + The method used to sample outgoing scattering energies. Valid options + are 'ARES', 'CXS' (constant cross section), 'DBRC' (Doppler broadening + rejection correction), and 'WCM' (weight correction method). + E_min : float + The minimum energy above which the specified method is applied. By + default, CXS will be used below E_min. + E_max : float + The maximum energy below which the specified method is applied. By + default, the asymptotic target-at-rest model is applied above E_max. + Attributes ---------- nuclide : openmc.Nuclide The nuclide affected by this resonance scattering treatment. - nuclide_0K : openmc.Nuclide - This should be the same isotope as the nuclide attribute above, but it - should have an xs attribute that identifies 0 Kelvin data. - method : str + method : {'ARES', 'CXS', 'DBRC', 'WCM'} The method used to sample outgoing scattering energies. Valid options are 'ARES', 'CXS' (constant cross section), 'DBRC' (Doppler broadening rejection correction), and 'WCM' (weight correction method). @@ -1195,21 +1201,20 @@ class ResonanceScattering(object): """ - def __init__(self): - self._nuclide = None - self._nuclide_0K = None - self._method = None + def __init__(self, nuclide, method='CXS', E_min=None, E_max=None): self._E_min = None self._E_max = None + self.nuclide = nuclide + self.method = method + if E_min is not None: + self.E_min = E_min + if E_max is not None: + self.E_max = E_max @property def nuclide(self): return self._nuclide - @property - def nuclide_0K(self): - return self._nuclide_0K - @property def method(self): return self._method @@ -1227,11 +1232,6 @@ class ResonanceScattering(object): cv.check_type('nuclide', nuc, Nuclide) self._nuclide = nuc - @nuclide_0K.setter - def nuclide_0K(self, nuc): - cv.check_type('nuclide_0K', nuc, Nuclide) - self._nuclide_0K = nuc - @method.setter def method(self, m): cv.check_value('method', m, ('ARES', 'CXS', 'DBRC', 'WCM')) diff --git a/openmc/summary.py b/openmc/summary.py index 3e25f2c26a..38c0e335c7 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -83,11 +83,10 @@ class Summary(object): n_nuclides = self._f['nuclides/n_nuclides_total'].value names = self._f['nuclides/names'].value awrs = self._f['nuclides/awrs'].value - zaids = self._f['nuclides/zaids'].value for n in range(n_nuclides): name = names[n].decode() name = name[:name.find('.')] - self.nuclides[name] = (zaids[n], awrs[n]) + self.nuclides[name] = awrs[n] def _read_geometry(self): # Read in and initialize the Materials and Geometry @@ -113,7 +112,6 @@ class Summary(object): material_id = int(key.lstrip('material ')) index = self._f['materials'][key]['index'].value name = self._f['materials'][key]['name'].value.decode() - temperature = self._f['materials'][key]['temperature'].value.decode() density = self._f['materials'][key]['atom_density'].value nuc_densities = self._f['materials'][key]['nuclide_densities'][...] nuclides = self._f['materials'][key]['nuclides'].value diff --git a/src/constants.F90 b/src/constants.F90 index 6d5f2fc107..ff2bd37107 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -268,6 +268,12 @@ module constants JENDL_33 = 7, & JENDL_40 = 8 + ! Temperature treatment method + integer, parameter :: & + TEMPERATURE_NEAREST = 1, & + TEMPERATURE_INTERPOLATION = 2, & + TEMPERATURE_MULTIPOLE = 3 + ! ============================================================================ ! TALLY-RELATED CONSTANTS @@ -401,12 +407,6 @@ module constants integer, parameter :: ERROR_INT = -huge(0) real(8), parameter :: ERROR_REAL = -huge(0.0_8) * 0.917826354_8 - ! Energy grid methods - integer, parameter :: & - GRID_NUCLIDE = 1, & ! unique energy grid for each nuclide - GRID_MAT_UNION = 2, & ! material union grids with pointers - GRID_LOGARITHM = 3 ! lethargy mapping - ! Running modes integer, parameter :: & MODE_FIXEDSOURCE = 1, & ! Fixed source mode diff --git a/src/cross_section.F90 b/src/cross_section.F90 index b67226a1b8..43e8544960 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -2,7 +2,7 @@ module cross_section use algorithm, only: binary_search use constants - use energy_grid, only: grid_method, log_spacing + use energy_grid, only: log_spacing use error, only: fatal_error use global use list_header, only: ListElemInt @@ -37,7 +37,6 @@ contains ! union grid real(8) :: atom_density ! atom density of a nuclide logical :: check_sab ! should we check for S(a,b) table? - type(Material), pointer :: mat ! current material ! Set all material macroscopic cross sections to zero material_xs % total = ZERO @@ -49,89 +48,83 @@ contains ! Exit subroutine if material is void if (p % material == MATERIAL_VOID) return - mat => materials(p % material) - - ! Find energy index on energy grid - if (grid_method == GRID_MAT_UNION) then - i_grid = find_energy_index(mat, p % E) - else if (grid_method == GRID_LOGARITHM) then + associate (mat => materials(p % material)) + ! Find energy index on energy grid i_grid = int(log(p % E/energy_min_neutron)/log_spacing) - end if - ! Determine if this material has S(a,b) tables - check_sab = (mat % n_sab > 0) + ! Determine if this material has S(a,b) tables + check_sab = (mat % n_sab > 0) - ! Initialize position in i_sab_nuclides - j = 1 + ! Initialize position in i_sab_nuclides + j = 1 - ! Add contribution from each nuclide in material - do i = 1, mat % n_nuclides - ! ======================================================================== - ! CHECK FOR S(A,B) TABLE + ! Add contribution from each nuclide in material + do i = 1, mat % n_nuclides + ! ======================================================================== + ! CHECK FOR S(A,B) TABLE - i_sab = 0 + 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 - if (check_sab) then - if (i == mat % i_sab_nuclides(j)) then - ! Get index in sab_tables - i_sab = mat % i_sab_tables(j) + ! 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) - ! 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) % threshold_inelastic) i_sab = 0 + ! 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 - ! Increment position in i_sab_nuclides - j = j + 1 + ! Increment position in i_sab_nuclides + j = j + 1 - ! Don't check for S(a,b) tables if there are no more left - if (j > mat % n_sab) check_sab = .false. + ! Don't check for S(a,b) tables if there are no more left + if (j > mat % n_sab) check_sab = .false. + end if end if - end if - ! ======================================================================== - ! CALCULATE MICROSCOPIC CROSS SECTION + ! ======================================================================== + ! CALCULATE MICROSCOPIC CROSS SECTION - ! Determine microscopic cross sections for this nuclide - i_nuclide = mat % nuclide(i) + ! Determine microscopic cross sections for this nuclide + i_nuclide = mat % nuclide(i) - ! 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, p % material, i, & - i_grid, p % sqrtkT) - else if (i_sab /= micro_xs(i_nuclide) % last_index_sab) then - call calculate_nuclide_xs(i_nuclide, i_sab, p % E, p % material, i, & - i_grid, p % sqrtkT) - end if + ! 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) + 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) + end if - ! ======================================================================== - ! ADD TO MACROSCOPIC CROSS SECTION + ! ======================================================================== + ! ADD TO MACROSCOPIC CROSS SECTION - ! Copy atom density of nuclide in material - atom_density = mat % atom_density(i) + ! Copy atom density of nuclide in material + atom_density = mat % atom_density(i) - ! Add contributions to material macroscopic total cross section - material_xs % total = material_xs % total + & - atom_density * micro_xs(i_nuclide) % total + ! Add contributions to material macroscopic total cross section + material_xs % total = material_xs % total + & + atom_density * micro_xs(i_nuclide) % total - ! Add contributions to material macroscopic scattering cross section - material_xs % elastic = material_xs % elastic + & - atom_density * micro_xs(i_nuclide) % elastic + ! Add contributions to material macroscopic scattering cross section + material_xs % elastic = material_xs % elastic + & + atom_density * micro_xs(i_nuclide) % elastic - ! Add contributions to material macroscopic absorption cross section - material_xs % absorption = material_xs % absorption + & - atom_density * micro_xs(i_nuclide) % absorption + ! Add contributions to material macroscopic absorption cross section + material_xs % absorption = material_xs % absorption + & + atom_density * micro_xs(i_nuclide) % absorption - ! Add contributions to material macroscopic fission cross section - material_xs % fission = material_xs % fission + & - atom_density * micro_xs(i_nuclide) % fission + ! Add contributions to material macroscopic fission cross section + material_xs % fission = material_xs % fission + & + atom_density * micro_xs(i_nuclide) % fission - ! Add contributions to material macroscopic nu-fission cross section - material_xs % nu_fission = material_xs % nu_fission + & - atom_density * micro_xs(i_nuclide) % nu_fission - end do + ! Add contributions to material macroscopic nu-fission cross section + material_xs % nu_fission = material_xs % nu_fission + & + atom_density * micro_xs(i_nuclide) % nu_fission + end do + end associate end subroutine calculate_xs @@ -140,169 +133,160 @@ contains ! given index in the nuclides array at the energy of the given particle !=============================================================================== - subroutine calculate_nuclide_xs(i_nuclide, i_sab, E, i_mat, i_nuc_mat, & - i_log_union, sqrtkT) + 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 - integer, intent(in) :: i_mat ! index into materials array - integer, intent(in) :: i_nuc_mat ! index into nuclides array for a material 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 logical :: use_mp ! true if XS can be calculated with windowed multipole + integer :: i_temp ! index for temperature integer :: i_grid ! index on nuclide energy grid integer :: i_low ! lower logarithmic mapping index integer :: i_high ! upper logarithmic mapping index real(8) :: f ! interp factor on nuclide energy grid + real(8) :: kT ! temperature in MeV real(8) :: sigT, sigA, sigF ! Intermediate multipole variables - type(Nuclide), pointer :: nuc - type(Material), pointer :: mat - ! Set pointer to nuclide and material - nuc => nuclides(i_nuclide) - mat => materials(i_mat) - - ! Check to see if there is multipole data present at this energy - use_mp = .false. - if (nuc % mp_present) then - if (E >= nuc % multipole % start_E/1.0e6_8 .and. & - E <= nuc % multipole % end_E/1.0e6_8) then - use_mp = .true. - end if - end if - - ! Evaluate multipole or interpolate - if (use_mp) then - ! Call multipole kernel - call multipole_eval(nuc % multipole, E, sqrtkT, sigT, sigA, sigF) - - micro_xs(i_nuclide) % total = sigT - micro_xs(i_nuclide) % absorption = sigA - micro_xs(i_nuclide) % elastic = sigT - sigA - - if (nuc % fissionable) then - micro_xs(i_nuclide) % fission = sigF - micro_xs(i_nuclide) % nu_fission = sigF * nuc % nu(E, EMISSION_TOTAL) + associate (nuc => nuclides(i_nuclide)) + ! Check to see if there is multipole data present at this energy + use_mp = .false. + if (nuc % mp_present) then + if (E >= nuc % multipole % start_E/1.0e6_8 .and. & + E <= nuc % multipole % end_E/1.0e6_8) then + use_mp = .true. + else + ! If using multipole data but outside the RRR, just pick the first + ! temperature + i_temp = 1 + end if else - micro_xs(i_nuclide) % fission = ZERO - micro_xs(i_nuclide) % nu_fission = ZERO + ! If not using multipole data, do a linear search on temperature + kT = sqrtkT**2 + do i_temp = 1, size(nuclides(i_nuclide) % kTs) + if (abs(nuclides(i_nuclide) % kTs(i_temp) - kT) < & + K_BOLTZMANN*temperature_tolerance) exit + end do end if - ! Ensure these values are set - ! Note, the only time either is used is in one of 4 places: - ! 1. physics.F90 - scatter - For inelastic scatter. - ! 2. physics.F90 - sample_fission - For partial fissions. - ! 3. tally.F90 - score_general - For tallying on MTxxx reactions. - ! 4. cross_section.F90 - calculate_urr_xs - For unresolved purposes. - ! It is worth noting that none of these occur in the resolved - ! resonance range, so the value here does not matter. - micro_xs(i_nuclide) % index_grid = 0 - micro_xs(i_nuclide) % interp_factor = ZERO - else - ! Determine index on nuclide energy grid - select case (grid_method) - case (GRID_MAT_UNION) + ! Evaluate multipole or interpolate + if (use_mp) then + ! Call multipole kernel + call multipole_eval(nuc % multipole, E, sqrtkT, sigT, sigA, sigF) - i_grid = mat % nuclide_grid_index(i_nuc_mat, i_log_union) + micro_xs(i_nuclide) % total = sigT + micro_xs(i_nuclide) % absorption = sigA + micro_xs(i_nuclide) % elastic = sigT - sigA - case (GRID_LOGARITHM) - ! Determine the energy grid index using a logarithmic mapping to reduce - ! the energy range over which a binary search needs to be performed - - if (E < nuc % energy(1)) then - i_grid = 1 - elseif (E > nuc % energy(nuc % n_grid)) then - i_grid = nuc % n_grid - 1 + if (nuc % fissionable) then + micro_xs(i_nuclide) % fission = sigF + micro_xs(i_nuclide) % nu_fission = sigF * nuc % nu(E, EMISSION_TOTAL) else - ! Determine bounding indices based on which equal log-spaced interval - ! the energy is in - i_low = nuc % grid_index(i_log_union) - i_high = nuc % grid_index(i_log_union + 1) + 1 - - ! Perform binary search over reduced range - i_grid = binary_search(nuc % energy(i_low:i_high), & - i_high - i_low + 1, E) + i_low - 1 + micro_xs(i_nuclide) % fission = ZERO + micro_xs(i_nuclide) % nu_fission = ZERO end if - case (GRID_NUCLIDE) - ! Perform binary search on the nuclide energy grid in order to determine - ! which points to interpolate between + ! Ensure these values are set + ! Note, the only time either is used is in one of 4 places: + ! 1. physics.F90 - scatter - For inelastic scatter. + ! 2. physics.F90 - sample_fission - For partial fissions. + ! 3. tally.F90 - score_general - For tallying on MTxxx reactions. + ! 4. cross_section.F90 - calculate_urr_xs - For unresolved purposes. + ! It is worth noting that none of these occur in the resolved + ! resonance range, so the value here does not matter. + micro_xs(i_nuclide) % index_temp = i_temp + micro_xs(i_nuclide) % index_grid = 0 + micro_xs(i_nuclide) % interp_factor = ZERO + else + associate (grid => nuc % grid(i_temp), xs => nuc % sum_xs(i_temp)) + ! Determine the energy grid index using a logarithmic mapping to reduce + ! the energy range over which a binary search needs to be performed - if (E <= nuc % energy(1)) then - i_grid = 1 - elseif (E > nuc % energy(nuc % n_grid)) then - i_grid = nuc % n_grid - 1 - else - i_grid = binary_search(nuc % energy, nuc % n_grid, E) + if (E < grid % energy(1)) then + i_grid = 1 + elseif (E > grid % energy(size(grid % energy))) then + i_grid = size(grid % energy) - 1 + else + ! Determine bounding indices based on which equal log-spaced interval + ! the energy is in + i_low = grid % grid_index(i_log_union) + i_high = grid % grid_index(i_log_union + 1) + 1 + + ! Perform binary search over reduced range + i_grid = binary_search(grid % energy(i_low:i_high), & + i_high - i_low + 1, E) + i_low - 1 + end if + + ! check for rare case where two energy points are the same + if (grid % energy(i_grid) == grid % energy(i_grid + 1)) & + i_grid = i_grid + 1 + + ! calculate interpolation factor + f = (E - grid % energy(i_grid)) / & + (grid % energy(i_grid + 1) - grid % energy(i_grid)) + + micro_xs(i_nuclide) % index_temp = i_temp + micro_xs(i_nuclide) % index_grid = i_grid + 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 + + ! Calculate microscopic nuclide total cross section + micro_xs(i_nuclide) % total = (ONE - f) * xs % total(i_grid) & + + f * xs % total(i_grid + 1) + + ! Calculate microscopic nuclide elastic cross section + micro_xs(i_nuclide) % elastic = (ONE - f) * xs % elastic(i_grid) & + + f * xs % elastic(i_grid + 1) + + ! Calculate microscopic nuclide absorption cross section + micro_xs(i_nuclide) % absorption = (ONE - f) * xs % absorption( & + i_grid) + f * xs % absorption(i_grid + 1) + + if (nuc % fissionable) then + ! Calculate microscopic nuclide total cross section + micro_xs(i_nuclide) % fission = (ONE - f) * xs % fission(i_grid) & + + f * xs % fission(i_grid + 1) + + ! Calculate microscopic nuclide nu-fission cross section + micro_xs(i_nuclide) % nu_fission = (ONE - f) * xs % nu_fission( & + i_grid) + f * xs % nu_fission(i_grid + 1) + end if + end associate + end if + + ! Initialize sab treatment to false + micro_xs(i_nuclide) % index_sab = NONE + micro_xs(i_nuclide) % elastic_sab = ZERO + + ! 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 (i_sab > 0) call calculate_sab_xs(i_nuclide, i_sab, E, sqrtkT) + + ! 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 + if (E > nuc % urr_data(i_temp) % energy(1) .and. E < nuc % & + urr_data(i_temp) % energy(nuc % urr_data(i_temp) % n_energy)) then + call calculate_urr_xs(i_nuclide, i_temp, E) end if - - end select - - ! check for rare case where two energy points are the same - if (nuc % energy(i_grid) == nuc % energy(i_grid+1)) i_grid = i_grid + 1 - - ! calculate interpolation factor - f = (E - nuc%energy(i_grid))/(nuc%energy(i_grid+1) - nuc%energy(i_grid)) - - micro_xs(i_nuclide) % index_grid = i_grid - 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 - - ! Calculate microscopic nuclide total cross section - micro_xs(i_nuclide) % total = (ONE - f) * nuc % total(i_grid) & - + f * nuc % total(i_grid+1) - - ! Calculate microscopic nuclide elastic cross section - micro_xs(i_nuclide) % elastic = (ONE - f) * nuc % elastic(i_grid) & - + f * nuc % elastic(i_grid+1) - - ! Calculate microscopic nuclide absorption cross section - micro_xs(i_nuclide) % absorption = (ONE - f) * nuc % absorption( & - i_grid) + f * nuc % absorption(i_grid+1) - - if (nuc % fissionable) then - ! Calculate microscopic nuclide total cross section - micro_xs(i_nuclide) % fission = (ONE - f) * nuc % fission(i_grid) & - + f * nuc % fission(i_grid+1) - - ! Calculate microscopic nuclide nu-fission cross section - micro_xs(i_nuclide) % nu_fission = (ONE - f) * nuc % nu_fission( & - i_grid) + f * nuc % nu_fission(i_grid+1) end if - end if - ! Initialize sab treatment to false - micro_xs(i_nuclide) % index_sab = NONE - micro_xs(i_nuclide) % elastic_sab = ZERO - - ! 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 (i_sab > 0) call calculate_sab_xs(i_nuclide, i_sab, E) - - ! 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) then - if (E > nuc % urr_data % energy(1) .and. & - E < nuc % urr_data % energy(nuc % urr_data % n_energy)) then - call calculate_urr_xs(i_nuclide, E) - end if - 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 + 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 end subroutine calculate_nuclide_xs @@ -312,75 +296,85 @@ contains ! whatever data were taken from the normal Nuclide table. !=============================================================================== - subroutine calculate_sab_xs(i_nuclide, i_sab, E) + subroutine calculate_sab_xs(i_nuclide, i_sab, E, 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 + real(8), intent(in) :: sqrtkT ! temperature integer :: i_grid ! index on S(a,b) energy grid + integer :: i_temp ! temperature index real(8) :: f ! interp factor on S(a,b) energy grid real(8) :: inelastic ! S(a,b) inelastic cross section real(8) :: elastic ! S(a,b) elastic cross section - type(SAlphaBeta), pointer :: sab + real(8) :: kT ! Set flag that S(a,b) treatment should be used for scattering micro_xs(i_nuclide) % index_sab = i_sab + ! Determine temperature for S(a,b) table + kT = sqrtkT**2 + do i_temp = 1, size(sab_tables(i_sab) % kTs) + if (abs(sab_tables(i_sab) % kTs(i_temp) - kT) < & + K_BOLTZMANN*temperature_tolerance) exit + end do + ! Get pointer to S(a,b) table - sab => sab_tables(i_sab) + associate (sab => sab_tables(i_sab) % data(i_temp)) - ! Get index and interpolation factor for inelastic grid - if (E < sab % inelastic_e_in(1)) then - i_grid = 1 - f = ZERO - else - i_grid = binary_search(sab % inelastic_e_in, sab % n_inelastic_e_in, E) - f = (E - sab%inelastic_e_in(i_grid)) / & - (sab%inelastic_e_in(i_grid+1) - sab%inelastic_e_in(i_grid)) - end if + ! Get index and interpolation factor for inelastic grid + if (E < sab % inelastic_e_in(1)) then + i_grid = 1 + f = ZERO + else + i_grid = binary_search(sab % inelastic_e_in, sab % n_inelastic_e_in, E) + f = (E - sab%inelastic_e_in(i_grid)) / & + (sab%inelastic_e_in(i_grid+1) - sab%inelastic_e_in(i_grid)) + end if - ! Calculate S(a,b) inelastic scattering cross section - inelastic = (ONE - f) * sab % inelastic_sigma(i_grid) + & - f * sab % inelastic_sigma(i_grid + 1) + ! Calculate S(a,b) inelastic scattering cross section + inelastic = (ONE - f) * sab % inelastic_sigma(i_grid) + & + f * sab % inelastic_sigma(i_grid + 1) - ! Check for elastic data - if (E < sab % threshold_elastic) then - ! Determine whether elastic scattering is given in the coherent or - ! incoherent approximation. For coherent, the cross section is - ! represented as P/E whereas for incoherent, it is simply P + ! Check for elastic data + if (E < sab % threshold_elastic) then + ! Determine whether elastic scattering is given in the coherent or + ! incoherent approximation. For coherent, the cross section is + ! represented as P/E whereas for incoherent, it is simply P - if (sab % elastic_mode == SAB_ELASTIC_EXACT) then - if (E < sab % elastic_e_in(1)) then - ! If energy is below that of the lowest Bragg peak, the elastic - ! cross section will be zero - elastic = ZERO + if (sab % elastic_mode == SAB_ELASTIC_EXACT) then + if (E < sab % elastic_e_in(1)) then + ! If energy is below that of the lowest Bragg peak, the elastic + ! cross section will be zero + elastic = ZERO + else + i_grid = binary_search(sab % elastic_e_in, & + sab % n_elastic_e_in, E) + elastic = sab % elastic_P(i_grid) / E + end if else - i_grid = binary_search(sab % elastic_e_in, & - sab % n_elastic_e_in, E) - elastic = sab % elastic_P(i_grid) / E + ! Determine index on elastic energy grid + if (E < sab % elastic_e_in(1)) then + i_grid = 1 + else + i_grid = binary_search(sab % elastic_e_in, & + sab % n_elastic_e_in, E) + end if + + ! Get interpolation factor for elastic grid + f = (E - sab%elastic_e_in(i_grid))/(sab%elastic_e_in(i_grid+1) - & + sab%elastic_e_in(i_grid)) + + ! Calculate S(a,b) elastic scattering cross section + elastic = (ONE - f) * sab % elastic_P(i_grid) + & + f * sab % elastic_P(i_grid + 1) end if else - ! Determine index on elastic energy grid - if (E < sab % elastic_e_in(1)) then - i_grid = 1 - else - i_grid = binary_search(sab % elastic_e_in, & - sab % n_elastic_e_in, E) - end if - - ! Get interpolation factor for elastic grid - f = (E - sab%elastic_e_in(i_grid))/(sab%elastic_e_in(i_grid+1) - & - sab%elastic_e_in(i_grid)) - - ! Calculate S(a,b) elastic scattering cross section - elastic = (ONE - f) * sab % elastic_P(i_grid) + & - f * sab % elastic_P(i_grid + 1) + ! No elastic data + elastic = ZERO end if - else - ! No elastic data - elastic = ZERO - end if + end associate ! Correct total and elastic cross sections micro_xs(i_nuclide) % total = micro_xs(i_nuclide) % total - & @@ -390,6 +384,9 @@ contains ! Store S(a,b) elastic cross section for sampling later micro_xs(i_nuclide) % elastic_sab = elastic + ! Save temperature index + micro_xs(i_nuclide) % index_temp_sab = i_temp + end subroutine calculate_sab_xs !=============================================================================== @@ -397,9 +394,9 @@ contains ! from probability tables !=============================================================================== - subroutine calculate_urr_xs(i_nuclide, E) - + subroutine calculate_urr_xs(i_nuclide, i_temp, E) integer, intent(in) :: i_nuclide ! index into nuclides array + integer, intent(in) :: i_temp ! temperature index real(8), intent(in) :: E ! energy integer :: i_energy ! index for energy @@ -414,7 +411,7 @@ contains micro_xs(i_nuclide) % use_ptable = .true. - associate (nuc => nuclides(i_nuclide), urr => nuclides(i_nuclide) % urr_data) + associate (nuc => nuclides(i_nuclide), urr => nuclides(i_nuclide) % urr_data(i_temp)) ! determine energy table i_energy = 1 do @@ -433,7 +430,7 @@ contains ! random number for the same nuclide at different temperatures, therefore ! preserving correlation of temperature in probability tables. call prn_set_stream(STREAM_URR_PTABLE) - r = future_prn(int(nuc_zaid_dict % get_key(nuc % zaid), 8)) + r = future_prn(int(i_nuclide, 8)) call prn_set_stream(STREAM_TRACKING) i_low = 1 @@ -497,10 +494,10 @@ contains f = micro_xs(i_nuclide) % interp_factor ! Determine inelastic scattering cross section - associate (rxn => nuc % reactions(nuc % urr_inelastic)) - if (i_energy >= rxn % threshold) then - inelastic = (ONE - f) * rxn % sigma(i_energy - rxn%threshold + 1) + & - f * rxn % sigma(i_energy - rxn%threshold + 2) + associate (xs => nuc % reactions(nuc % urr_inelastic) % xs(i_temp)) + if (i_energy >= xs % threshold) then + inelastic = (ONE - f) * xs % value(i_energy - xs % threshold + 1) + & + f * xs % value(i_energy - xs % threshold + 2) end if end associate end if diff --git a/src/energy_grid.F90 b/src/energy_grid.F90 index 66419f83cc..47408943e3 100644 --- a/src/energy_grid.F90 +++ b/src/energy_grid.F90 @@ -13,64 +13,18 @@ module energy_grid contains -!=============================================================================== -! UNIONIZED_GRID creates a unionized energy grid, for the entire problem or for -! each material, composed of the grids from each nuclide in the entire problem, -! or each material, respectively. Right now, the grid for each nuclide is added -! into a linked list one at a time with an effective insertion sort. Could be -! done with a hash for all energy points and then a quicksort at the end (what -! hash function to use?) -!=============================================================================== - - subroutine unionized_grid() - - integer :: i ! index in nuclides array - integer :: j ! index in materials array - type(ListReal) :: list - type(Nuclide), pointer :: nuc - type(Material), pointer :: mat - - call write_message("Creating unionized energy grid...", 5) - - ! add grid points for each nuclide in the material - do j = 1, n_materials - mat => materials(j) - do i = 1, mat % n_nuclides - nuc => nuclides(mat % nuclide(i)) - call add_grid_points(list, nuc % energy) - end do - - ! set size of unionized material energy grid - mat % n_grid = list % size() - - ! create allocated array from linked list - allocate(mat % e_grid(mat % n_grid)) - do i = 1, mat % n_grid - mat % e_grid(i) = list % get_item(i) - end do - - ! delete linked list and dictionary - call list % clear() - end do - - ! Set pointers to unionized energy grid for each nuclide - call grid_pointers() - - end subroutine unionized_grid - !=============================================================================== ! 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 - type(Nuclide), pointer :: nuc ! Set minimum/maximum energies E_max = energy_max_neutron @@ -85,123 +39,29 @@ contains umesh(:) = [(i*log_spacing, i=0, M)] do i = 1, n_nuclides_total - ! Allocate logarithmic mapping for nuclide - nuc => nuclides(i) - allocate(nuc % grid_index(0:M)) + 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%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 == nuc % n_grid) then - exit - end if - j = j + 1 + ! 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 - nuc % grid_index(k) = j - end do + end associate end do deallocate(umesh) end subroutine logarithmic_grid -!=============================================================================== -! ADD_GRID_POINTS adds energy points from the 'energy' array into a linked list -! of points already stored from previous arrays. -!=============================================================================== - - subroutine add_grid_points(list, energy) - - type(ListReal) :: list - real(8), intent(in) :: energy(:) - - integer :: i ! index in energy array - integer :: n ! size of energy array - integer :: current ! current index - real(8) :: E ! actual energy value - - i = 1 - n = size(energy) - - ! Set current index to beginning of the list - current = 1 - - do while (i <= n) - E = energy(i) - - ! If we've reached the end of the grid energy list, add the remaining - ! energy points to the end - if (current > list % size()) then - ! Finish remaining energies - do while (i <= n) - call list % append(energy(i)) - i = i + 1 - end do - exit - end if - - if (E < list % get_item(current)) then - - ! Insert new energy in this position - call list % insert(current, E) - - ! Advance index in linked list and in new energy grid - i = i + 1 - current = current + 1 - - elseif (E == list % get_item(current)) then - ! Found the exact same energy, no need to store duplicates so just - ! skip and move to next index - i = i + 1 - current = current + 1 - else - current = current + 1 - end if - - end do - - end subroutine add_grid_points - -!=============================================================================== -! GRID_POINTERS creates an array of pointers (ints) for each nuclide to link -! each point on the nuclide energy grid to one on a unionized energy grid -!=============================================================================== - - subroutine grid_pointers() - - integer :: i ! loop index for nuclides - integer :: j ! loop index for nuclide energy grid - integer :: k ! loop index for materials - integer :: index_e ! index on union energy grid - real(8) :: union_energy ! energy on union grid - real(8) :: energy ! energy on nuclide grid - type(Nuclide), pointer :: nuc - type(Material), pointer :: mat - - do k = 1, n_materials - mat => materials(k) - allocate(mat % nuclide_grid_index(mat % n_nuclides, mat % n_grid)) - do i = 1, mat % n_nuclides - nuc => nuclides(mat % nuclide(i)) - - index_e = 1 - energy = nuc % energy(index_e) - - do j = 1, mat % n_grid - union_energy = mat % e_grid(j) - if (union_energy >= energy .and. index_e < nuc % n_grid) then - index_e = index_e + 1 - energy = nuc % energy(index_e) - end if - mat % nuclide_grid_index(i,j) = index_e - 1 - end do - end do - end do - - end subroutine grid_pointers - end module energy_grid diff --git a/src/geometry.F90 b/src/geometry.F90 index 6d4ca77671..d41ca14475 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -248,14 +248,15 @@ contains ! ====================================================================== ! AT LOWEST UNIVERSE, TERMINATE SEARCH - ! Set the particle material + ! Save previous material and temperature p % last_material = p % material - if (size(c % material) == 1) then - ! Only one material for this cell; assign that one to the particle. - p % material = c % material(1) - else - ! Distributed instances of this cell have different materials. - ! Determine which instance this is and assign the matching 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 @@ -276,37 +277,20 @@ contains end if end if end do - p % material = c % material(offset + 1) end if - ! Set the particle temperature - if (size(c % sqrtkT) == 1) then - ! Only one temperature for this cell; assign that one to the particle. - p % sqrtkT = c % sqrtkT(1) + ! Save the material + if (size(c % material) > 1) then + p % material = c % material(offset + 1) else - ! Distributed instances of this cell have different temperatures. - ! Determine which instance this is and assign the matching temp. - distribcell_index = c % distribcell_index - offset = 0 - do k = 1, p % n_coord - if (cells(p % coord(k) % cell) % type == CELL_FILL) then - offset = offset + cells(p % coord(k) % cell) % & - offset(distribcell_index) - elseif (cells(p % coord(k) % cell) % type == CELL_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, & - p % coord(k + 1) % lattice_x, & - p % coord(k + 1) % lattice_y, & - p % coord(k + 1) % lattice_z) - end if - end if - end do + 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 == CELL_FILL) then CELL_TYPE diff --git a/src/global.F90 b/src/global.F90 index 0fc1bc0c52..bea5f61a83 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -99,13 +99,10 @@ module global ! What to assume for expanding natural elements integer :: default_expand = ENDF_BVII1 - ! Whether or not windowed multipole cross sections should be used. - logical :: multipole_active = .false. - - ! Total amount of nuclide ZAID and dictionary of nuclide ZAID and index -- - ! this is used when sampling unresolved resonance probability tables - integer(8) :: n_nuc_zaid_total - type(DictIntInt) :: nuc_zaid_dict + ! Default temperature and method for choosing temperatures + integer :: temperature_method = TEMPERATURE_NEAREST + real(8) :: temperature_tolerance = 10.0_8 + real(8) :: temperature_default = 293.6_8 ! ============================================================================ ! MULTI-GROUP CROSS SECTION RELATED VARIABLES @@ -430,7 +427,6 @@ module global ! Various output options logical :: output_summary = .true. - logical :: output_xs = .false. logical :: output_tallies = .true. ! ============================================================================ diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 36195d1190..415ec55c9e 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -73,6 +73,7 @@ module hdf5_interface module procedure read_attribute_integer_1D module procedure read_attribute_integer_2D module procedure read_attribute_string + module procedure read_attribute_string_1D end interface read_attribute interface write_attribute @@ -2425,6 +2426,67 @@ contains call h5tclose_f(memtype, hdf5_err) end subroutine read_attribute_string + subroutine read_attribute_string_1D(buffer, obj_id, name) + character(*), target, allocatable, intent(inout) :: buffer(:) + integer(HID_T), intent(in) :: obj_id + character(*), intent(in) :: name + + integer :: hdf5_err + integer(HID_T) :: space_id + integer(HID_T) :: attr_id + integer(HSIZE_T) :: dims(1) + integer(HSIZE_T) :: maxdims(1) + + call h5aopen_f(obj_id, trim(name), attr_id, hdf5_err) + + if (allocated(buffer)) then + dims(:) = shape(buffer) + else + call h5aget_space_f(attr_id, space_id, hdf5_err) + call h5sget_simple_extent_dims_f(space_id, dims, maxdims, hdf5_err) + allocate(buffer(dims(1))) + call h5sclose_f(space_id, hdf5_err) + end if + + call read_attribute_string_1D_explicit(attr_id, dims, buffer) + call h5aclose_f(attr_id, hdf5_err) + end subroutine read_attribute_string_1D + + subroutine read_attribute_string_1D_explicit(attr_id, dims, buffer) + integer(HID_T), intent(in) :: attr_id + integer(HSIZE_T), intent(in) :: dims(1) + character(*), target, intent(inout) :: buffer(dims(1)) + + integer :: hdf5_err + integer(HID_T) :: filetype + integer(HID_T) :: memtype + integer(SIZE_T) :: size + integer(SIZE_T) :: n + type(c_ptr) :: f_ptr + + ! Make sure buffer is large enough + call h5aget_type_f(attr_id, filetype, hdf5_err) + call h5tget_size_f(filetype, size, hdf5_err) + if (size > len(buffer(1)) + 1) then + print *, size, len(buffer(1)) + call fatal_error("Character buffer is not long enough to & + &read HDF5 string array.") + end if + + ! Get datatype in memory based on Fortran character + n = len(buffer(1)) + call h5tcopy_f(H5T_FORTRAN_S1, memtype, hdf5_err) + call h5tset_size_f(memtype, n, hdf5_err) + + ! Get pointer to start of string + f_ptr = c_loc(buffer(1)(1:1)) + + call h5aread_f(attr_id, memtype, f_ptr, hdf5_err) + + call h5tclose_f(filetype, hdf5_err) + call h5tclose_f(memtype, hdf5_err) + end subroutine read_attribute_string_1D_explicit + subroutine get_shape(obj_id, dims) integer(HID_T), intent(in) :: obj_id integer(HSIZE_T), intent(out) :: dims(:) diff --git a/src/initialize.F90 b/src/initialize.F90 index 99adf967f0..f05b4f2b99 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -4,7 +4,7 @@ module initialize use constants use dict_header, only: DictIntInt, ElemKeyValueII use set_header, only: SetInt - use energy_grid, only: logarithmic_grid, grid_method, unionized_grid + use energy_grid, only: logarithmic_grid, grid_method ! , unionized_grid use error, only: fatal_error, warning use geometry, only: neighbor_lists, count_instance, calc_offsets, & maximum_levels @@ -17,7 +17,7 @@ module initialize use material_header, only: Material use mgxs_data, only: read_mgxs, create_macro_xs use output, only: title, header, print_version, write_message, & - print_usage, write_xs_summary, print_plot + print_usage, print_plot use random_lcg, only: initialize_prng use state_point, only: load_state_point use string, only: to_str, starts_with, ends_with, str_to_int @@ -111,20 +111,8 @@ contains if (run_mode /= MODE_PLOTTING) then ! Construct information needed for nuclear data if (run_CE) then - ! Set undefined cell temperatures to match the material data. - call lookup_material_temperatures() - - ! Construct unionized or log energy grid for cross-sections - select case (grid_method) - case (GRID_NUCLIDE) - continue - case (GRID_MAT_UNION) - call time_unionize%start() - call unionized_grid() - call time_unionize%stop() - case (GRID_LOGARITHM) - call logarithmic_grid() - end select + ! Construct log energy grid for cross-sections + call logarithmic_grid() else ! Create material macroscopic data for MGXS call time_read_xs%start() @@ -158,9 +146,6 @@ contains else ! Write summary information if (output_summary) call write_summary() - - ! Write cross section information - if (output_xs) call write_xs_summary() end if end if @@ -1005,57 +990,4 @@ contains end subroutine allocate_offsets -!=============================================================================== -! LOOKUP_MATERIAL_TEMPERATURES If any cells have undefined temperatures, try to -! find their temperatures from material data. -!=============================================================================== - - subroutine lookup_material_temperatures() - integer :: i, j, k - real(8) :: min_temp - logical :: warning_given - - warning_given = .false. - do i = 1, n_cells - ! Ignore non-normal cells and cells with defined temperature. - if (cells(i) % type /= CELL_NORMAL) cycle - if (cells(i) % sqrtkT(1) /= ERROR_REAL) cycle - - ! Set the number of temperatures equal to the number of materials. - deallocate(cells(i) % sqrtkT) - allocate(cells(i) % sqrtkT(size(cells(i) % material))) - - ! Check each of the cell materials for temperature data. - do j = 1, size(cells(i) % material) - ! Arbitrarily set void regions to 0K. - if (cells(i) % material(j) == MATERIAL_VOID) then - cells(i) % sqrtkT(j) = ZERO - cycle - end if - - associate (mat => materials(cells(i) % material(j))) - ! Find the temperature of the coldest nuclide. - min_temp = nuclides(mat % nuclide(1)) % kT - do k = 2, mat % n_nuclides - ! Warn the user if the nuclides don't have identical temperatues. - if (nuclides(mat % nuclide(k)) % kT /= min_temp & - .and. .not. warning_given .and. multipole_active) then - call warning("OpenMC cannot & - &identify the temperature of at least one cell. For the & - &purposes of multipole cross section evaluations, all cells & - &with unknown temperature will be set to the coldest & - &temperature found in the nuclear data for that cell's & - &material") - warning_given = .true. - end if - min_temp = min(min_temp, nuclides(mat % nuclide(k)) % kT) - end do - - ! Set the temperature for this cell instance. - cells(i) % sqrtkT(j) = sqrt(min_temp) - end associate - end do - end do - end subroutine lookup_material_temperatures - end module initialize diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 1cb0dc0fd4..6ef8751a0e 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -2,6 +2,7 @@ module input_xml use hdf5 + use algorithm, only: find use cmfd_input, only: configure_cmfd use constants use dict_header, only: DictIntInt, ElemKeyValueCI @@ -23,7 +24,8 @@ module input_xml use set_header, only: SetChar use stl_vector, only: VectorInt, VectorReal, VectorChar use string, only: to_lower, to_str, str_to_int, str_to_real, & - starts_with, ends_with, tokenize, split_string + starts_with, ends_with, tokenize, split_string, & + zero_padded use tally_header, only: TallyObject use tally_filter use tally_initialize, only: add_tallies @@ -359,26 +361,6 @@ contains ! Copy random number seed if specified if (check_for_node(doc, "seed")) call get_node_value(doc, "seed", seed) - ! Energy grid methods - if (check_for_node(doc, "energy_grid")) then - call get_node_value(doc, "energy_grid", temp_str) - else - temp_str = 'logarithm' - end if - select case (trim(temp_str)) - case ('nuclide') - grid_method = GRID_NUCLIDE - case ('material-union', 'union') - grid_method = GRID_MAT_UNION - if (trim(temp_str) == 'union') & - call warning('Energy grids will be unionized by material. Global& - & energy grid unionization is no longer an allowed option.') - case ('logarithm', 'logarithmic', 'log') - grid_method = GRID_LOGARITHM - case default - call fatal_error("Unknown energy grid method: " // trim(temp_str)) - end select - ! Number of bins for logarithmic grid if (check_for_node(doc, "log_grid_bins")) then call get_node_value(doc, "log_grid_bins", n_log_bins) @@ -978,14 +960,6 @@ contains trim(temp_str) == '0') output_summary = .false. end if - ! Check for cross sections option - if (check_for_node(node_output, "cross_sections")) then - call get_node_value(node_output, "cross_sections", temp_str) - temp_str = to_lower(temp_str) - if (trim(temp_str) == 'true' .or. & - trim(temp_str) == '1') output_xs = .true. - end if - ! Check for ASCII tallies output option if (check_for_node(node_output, "tallies")) then call get_node_value(node_output, "tallies", temp_str) @@ -1089,20 +1063,6 @@ contains end select end if - ! Check to see if windowed multipole functionality is requested - if (check_for_node(doc, "use_windowed_multipole")) then - call get_node_value(doc, "use_windowed_multipole", temp_str) - select case (to_lower(temp_str)) - case ('true', '1') - multipole_active = .true. - case ('false', '0') - multipole_active = .false. - case default - call fatal_error("Unrecognized value for in & - &settings.xml") - end select - end if - call get_node_list(doc, "volume_calc", node_vol_list) n = get_list_size(node_vol_list) allocate(volume_calcs(n)) @@ -1111,6 +1071,27 @@ contains call volume_calcs(i) % from_xml(node_vol) end do + ! Get temperature settings + if (check_for_node(doc, "temperature_default")) then + call get_node_value(doc, "temperature_default", temperature_default) + end if + if (check_for_node(doc, "temperature_method")) then + call get_node_value(doc, "temperature_method", temp_str) + select case (to_lower(temp_str)) + case ('nearest') + temperature_method = TEMPERATURE_NEAREST + case ('interpolation') + temperature_method = TEMPERATURE_INTERPOLATION + case ('multipole') + temperature_method = TEMPERATURE_MULTIPOLE + case default + call fatal_error("Unknown temperature method: " // trim(temp_str)) + end select + end if + if (check_for_node(doc, "temperature_tolerance")) then + call get_node_value(doc, "temperature_tolerance", temperature_tolerance) + end if + ! Close settings XML file call close_xmldoc(doc) @@ -2050,6 +2031,9 @@ contains 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(:) if (run_CE) then call read_ce_cross_sections_xml(libraries) @@ -2076,12 +2060,18 @@ contains end if ! Parse data from materials.xml - call read_materials_xml(libraries, library_dict) + call read_materials_xml(libraries, library_dict, material_temps) + + ! Assign temperatures to cells that don't have temperatures already assigned + call assign_temperatures(material_temps) + + ! Determine desired temperatures for each nuclide and S(a,b) table + call get_temperatures(nuc_temps, sab_temps) ! 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) + call read_ce_cross_sections(libraries, library_dict, nuc_temps, sab_temps) call time_read_xs%stop() end if @@ -2092,9 +2082,10 @@ contains call library_dict % clear() end subroutine read_materials - subroutine read_materials_xml(libraries, library_dict) + subroutine read_materials_xml(libraries, library_dict, material_temps) type(Library), intent(in) :: libraries(:) type(DictCharInt), intent(inout) :: library_dict + real(8), allocatable, intent(out) :: material_temps(:) integer :: i ! loop index for materials integer :: j ! loop index for nuclides @@ -2110,7 +2101,6 @@ contains logical :: file_exists ! does materials.xml exist? logical :: sum_density ! density is taken to be sum of nuclide densities character(20) :: name ! name of isotope, e.g. 92235.03c - character(6) :: default_temperature ! Default temperature, e.g., '300K' character(MAX_WORD_LEN) :: units ! units on density character(MAX_LINE_LEN) :: filename ! absolute path to materials.xml character(MAX_LINE_LEN) :: temp_str ! temporary string when reading @@ -2144,25 +2134,13 @@ contains ! Parse materials.xml file call open_xmldoc(doc, filename) - ! Copy default temperature - if (check_for_node(doc, "default_temperature")) then - call get_node_value(doc, "default_temperature", default_temperature) - else if (.not. run_CE) then - ! FIXME This is only necessary while MG mode does not have a - ! temperature dependent library implementation. - ! Set a default for MG mode to allow MG libraries to not include - ! temperatures - default_temperature = '294K' - else - default_temperature = '' - end if - ! Get pointer to list of XML call get_node_list(doc, "material", node_mat_list) ! Allocate cells array n_materials = get_list_size(node_mat_list) allocate(materials(n_materials)) + allocate(material_temps(n_materials)) ! Initialize count for number of nuclides/S(a,b) tables index_nuclide = 0 @@ -2192,14 +2170,11 @@ contains call get_node_value(node_mat, "name", mat % name) end if - ! Copy material temperature + ! Get material default temperature if (check_for_node(node_mat, "temperature")) then - call get_node_value(node_mat, "temperature", mat % temperature) - else if (default_temperature /= '') then - mat % temperature = default_temperature + call get_node_value(node_mat, "temperature", material_temps(i)) else - call fatal_error("Must specify either a material temperature or a & - &default temperature") + material_temps(i) = ERROR_REAL end if ! ======================================================================= @@ -5719,10 +5694,10 @@ contains 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 - ! zaid + ! name associate (sab => sab_tables(mat % i_sab_tables(k))) FIND_NUCLIDE: do j = 1, size(mat % nuclide) - if (any(sab % zaid == nuclides(mat % nuclide(j)) % zaid)) then + if (any(sab % nuclides == nuclides(mat % nuclide(j)) % name)) then mat % i_sab_nuclides(k) = j exit FIND_NUCLIDE end if @@ -5774,16 +5749,16 @@ contains end do end subroutine assign_sab_tables - subroutine read_ce_cross_sections(libraries, library_dict) + subroutine read_ce_cross_sections(libraries, library_dict, nuc_temps, sab_temps) type(Library), intent(in) :: libraries(:) type(DictCharInt), intent(inout) :: library_dict + type(VectorReal), intent(in) :: nuc_temps(:) + type(VectorReal), intent(in) :: sab_temps(:) integer :: i, j integer :: i_library integer :: i_nuclide integer :: i_sab - integer :: index_nuc_zaid ! index in nuclide ZAID - integer :: zaid ! ZAID of nuclide integer(HID_T) :: file_id integer(HID_T) :: group_id logical :: mp_found ! if windowed multipole libraries were found @@ -5796,8 +5771,6 @@ contains allocate(micro_xs(n_nuclides_total)) !$omp end parallel - index_nuc_zaid = 0 - ! Read cross sections do i = 1, size(materials) do j = 1, size(materials(i) % names) @@ -5813,8 +5786,8 @@ contains ! Read nuclide data from HDF5 file_id = file_open(libraries(i_library) % path, 'r') group_id = open_group(file_id, name) - call nuclides(i_nuclide) % from_hdf5(group_id, & - materials(i) % temperature) + call nuclides(i_nuclide) % from_hdf5(group_id, nuc_temps(i_nuclide), & + temperature_method, temperature_tolerance) call close_group(group_id) call file_close(file_id) @@ -5824,23 +5797,19 @@ contains ! Determine if minimum/maximum energy for this nuclide is greater/less ! than the previous - energy_min_neutron = max(energy_min_neutron, nuclides(i_nuclide) % energy(1)) - energy_max_neutron = min(energy_max_neutron, nuclides(i_nuclide) % energy(& - size(nuclides(i_nuclide) % energy))) + if (size(nuclides(i_nuclide) % grid) >= 1) then + energy_min_neutron = max(energy_min_neutron, & + nuclides(i_nuclide) % grid(1) % energy(1)) + energy_max_neutron = min(energy_max_neutron, nuclides(i_nuclide) % & + grid(1) % energy(size(nuclides(i_nuclide) % grid(1) % energy))) + end if ! Add name and alias to dictionary call already_read % add(name) - ! Construct dictionary mapping nuclide zaids to [1,N] -- used for - ! unresolved resonance probability tables - zaid = nuclides(i_nuclide) % zaid - if (.not. nuc_zaid_dict % has_key(zaid)) then - index_nuc_zaid = index_nuc_zaid + 1 - call nuc_zaid_dict % add_key(zaid, index_nuc_zaid) - end if - ! Read multipole file into the appropriate entry on the nuclides array - if (multipole_active) call read_multipole_data(i_nuclide) + if (temperature_method == TEMPERATURE_MULTIPOLE) & + call read_multipole_data(i_nuclide) end if ! Check if material is fissionable @@ -5868,8 +5837,8 @@ contains ! Read S(a,b) data from HDF5 file_id = file_open(libraries(i_library) % path, 'r') group_id = open_group(file_id, name) - call sab_tables(i_sab) % from_hdf5(group_id, & - materials(i) % temperature) + call sab_tables(i_sab) % from_hdf5(group_id, sab_temps(i_sab), & + temperature_tolerance) call close_group(group_id) call file_close(file_id) @@ -5879,14 +5848,13 @@ contains end do end do - n_nuc_zaid_total = index_nuc_zaid - ! Associate S(a,b) tables with specific nuclides call assign_sab_tables() ! Show which nuclide results in lowest energy for neutron transport do i = 1, size(nuclides) - if (nuclides(i) % energy(nuclides(i) % n_grid) == energy_max_neutron) then + if (nuclides(i) % grid(1) % energy(size(nuclides(i) % grid(1) % energy)) & + == energy_max_neutron) then call write_message("Maximum neutron transport energy: " // & trim(to_str(energy_max_neutron)) // " MeV for " // & trim(adjustl(nuclides(i) % name)), 6) @@ -5895,7 +5863,7 @@ contains end do ! If the user wants multipole, make sure we found a multipole library. - if (multipole_active) then + if (temperature_method == TEMPERATURE_MULTIPOLE) then mp_found = .false. do i = 1, size(nuclides) if (nuclides(i) % mp_present) then @@ -5911,6 +5879,107 @@ contains end subroutine read_ce_cross_sections +!=============================================================================== +! ASSIGN_TEMPERATURES If any cells have undefined temperatures, try to find +! their temperatures from material or global default temperatures +!=============================================================================== + + subroutine assign_temperatures(material_temps) + real(8), intent(in) :: material_temps(:) + + integer :: i, j + integer :: i_material + + do i = 1, n_cells + ! Ignore non-normal cells and cells with defined temperature. + if (cells(i) % material(1) == NONE) cycle + if (cells(i) % sqrtkT(1) /= ERROR_REAL) cycle + + ! Set the number of temperatures equal to the number of materials. + deallocate(cells(i) % sqrtkT) + allocate(cells(i) % sqrtkT(size(cells(i) % material))) + + ! Check each of the cell materials for temperature data. + do j = 1, size(cells(i) % material) + ! Arbitrarily set void regions to 0K. + if (cells(i) % material(j) == MATERIAL_VOID) then + cells(i) % sqrtkT(j) = ZERO + cycle + end if + + ! Use material default or global default temperature + i_material = material_dict % get_key(cells(i) % material(j)) + if (material_temps(i_material) /= ERROR_REAL) then + cells(i) % sqrtkT(j) = sqrt(K_BOLTZMANN * & + material_temps(i_material)) + else + cells(i) % sqrtkT(j) = sqrt(K_BOLTZMANN * temperature_default) + end if + end do + end do + end subroutine assign_temperatures + +!=============================================================================== +! GET_TEMPERATURES returns a list of temperatures that each nuclide/S(a,b) table +! appears at in the model. Later, this list is used to determine the actual +! temperatures to read (which may be different if interpolation is used) +!=============================================================================== + + subroutine get_temperatures(nuc_temps, sab_temps) + type(VectorReal), allocatable, intent(out) :: nuc_temps(:) + type(VectorReal), allocatable, intent(out) :: sab_temps(:) + + integer :: i, j, k + integer :: i_nuclide ! index in nuclides array + integer :: i_sab ! index in S(a,b) array + integer :: i_material + real(8) :: temperature ! temperature in Kelvin + + allocate(nuc_temps(n_nuclides_total)) + allocate(sab_temps(n_sab_tables)) + + do i = 1, size(cells) + do j = 1, size(cells(i) % material) + ! Skip any non-material cells and void materials + if (cells(i) % material(j) == NONE .or. & + cells(i) % material(j) == MATERIAL_VOID) cycle + + ! Get temperature of cell (rounding to nearest integer) + if (size(cells(i) % sqrtkT) > 1) then + temperature = cells(i) % sqrtkT(j)**2 / K_BOLTZMANN + else + temperature = cells(i) % sqrtkT(1)**2 / K_BOLTZMANN + end if + + i_material = material_dict % get_key(cells(i) % material(j)) + associate (mat => materials(i_material)) + NUC_NAMES_LOOP: do k = 1, size(mat % names) + ! Get index in nuc_temps array + i_nuclide = nuclide_dict % get_key(to_lower(mat % names(k))) + + ! Add temperature if it hasn't already been added + if (find(nuc_temps(i_nuclide), temperature) == -1) then + call nuc_temps(i_nuclide) % push_back(temperature) + end if + end do NUC_NAMES_LOOP + + if (mat % n_sab > 0) then + SAB_NAMES_LOOP: do k = 1, size(mat % sab_names) + ! Get index in nuc_temps array + i_sab = sab_dict % get_key(to_lower(mat % sab_names(k))) + + ! Add temperature if it hasn't already been added + if (find(sab_temps(i_sab), temperature) == -1) then + call sab_temps(i_sab) % push_back(temperature) + end if + end do SAB_NAMES_LOOP + end if + end associate + end do + end do + + end subroutine get_temperatures + !=============================================================================== ! READ_0K_ELASTIC_SCATTERING !=============================================================================== @@ -5927,6 +5996,9 @@ contains real(8) :: xs_cdf_sum character(MAX_WORD_LEN) :: name type(Nuclide) :: resonant_nuc + type(VectorReal) :: temperature + + call temperature % push_back(ZERO) do i = 1, size(nuclides_0K) if (nuc % name == nuclides_0K(i) % nuclide) then @@ -5946,13 +6018,14 @@ contains ! Read nuclide data from HDF5 file_id = file_open(libraries(i_library) % path, 'r') group_id = open_group(file_id, name) - call resonant_nuc % from_hdf5(group_id, '0K') + call resonant_nuc % from_hdf5(group_id, temperature, & + TEMPERATURE_NEAREST, 1000.0_8) call close_group(group_id) call file_close(file_id) ! Copy 0K energy grid and elastic scattering cross section - call move_alloc(TO=nuc % energy_0K, FROM=resonant_nuc % energy) - call move_alloc(TO=nuc % elastic_0K, FROM=resonant_nuc % elastic) + call move_alloc(TO=nuc % energy_0K, FROM=resonant_nuc % grid(1) % energy) + call move_alloc(TO=nuc % elastic_0K, FROM=resonant_nuc % sum_xs(1) % elastic) nuc % n_grid_0K = size(nuc % energy_0K) ! Build CDF for 0K elastic scattering @@ -5987,18 +6060,22 @@ contains integer, intent(in) :: i_table ! index in nuclides/sab_tables - integer :: i logical :: file_exists ! Does multipole library exist? character(7) :: readable ! Is multipole library readable? - character(6) :: zaid_string ! String of the ZAID - character(MAX_FILE_LEN+9) :: filename ! Path to multipole xs library + character(MAX_FILE_LEN) :: filename ! Path to multipole xs library ! For the time being, and I know this is a bit hacky, we just assume - ! that the file will be zaid.h5. + ! that the file will be ZZZAAAmM.h5. associate (nuc => nuclides(i_table)) - write(zaid_string, '(I6.6)') nuc % zaid - filename = trim(path_multipole) // zaid_string // ".h5" + if (nuc % metastable > 0) then + filename = trim(path_multipole) // trim(zero_padded(nuc % Z, 3)) // & + trim(zero_padded(nuc % A, 3)) // 'm' // & + trim(to_str(nuc % metastable)) // ".h5" + else + filename = trim(path_multipole) // trim(zero_padded(nuc % Z, 3)) // & + trim(zero_padded(nuc % A, 3)) // ".h5" + end if ! Check if Multipole library exists and is readable inquire(FILE=filename, EXIST=file_exists, READ=readable) @@ -6019,16 +6096,6 @@ contains call multipole_read(filename, nuc % multipole, i_table) nuc % mp_present = .true. - ! Recreate nu-fission cross section - if (nuc % fissionable) then - do i = 1, size(nuc % energy) - nuc % nu_fission(i) = nuc % nu(nuc % energy(i), EMISSION_TOTAL) * & - nuc % fission(i) - end do - else - nuc % nu_fission(:) = ZERO - end if - end associate end subroutine read_multipole_data diff --git a/src/material_header.F90 b/src/material_header.F90 index 27a0e61fea..772e3a415d 100644 --- a/src/material_header.F90 +++ b/src/material_header.F90 @@ -13,9 +13,6 @@ module material_header integer, allocatable :: nuclide(:) ! index in nuclides array real(8) :: density ! total atom density in atom/b-cm real(8), allocatable :: atom_density(:) ! nuclide atom density in atom/b-cm - character(6) :: temperature ! Temperature of the material - ! as presented in the HDF5 library; - ! e.g., "300K" ! Energy grid information integer :: n_grid ! # of union material grid points diff --git a/src/mgxs_header.F90 b/src/mgxs_header.F90 index 06dd1e2138..5947d2562d 100644 --- a/src/mgxs_header.F90 +++ b/src/mgxs_header.F90 @@ -19,7 +19,6 @@ module mgxs_header type, abstract :: Mgxs character(len=104) :: name ! name of dataset, e.g. 92235.03c - integer :: zaid ! Z and A identifier, e.g. 92235 real(8) :: awr ! Atomic Weight Ratio real(8) :: kT ! temperature in MeV (k*T) @@ -211,11 +210,6 @@ module mgxs_header else this % kT = ZERO end if - if (check_for_node(node_xsdata, "zaid")) then - call get_node_value(node_xsdata, "zaid", this % zaid) - else - this % zaid = 0 - end if if (check_for_node(node_xsdata, "awr")) then call get_node_value(node_xsdata, "awr", this % awr) else @@ -970,11 +964,6 @@ module mgxs_header ! Basic nuclide information write(unit_,*) 'MGXS Entry: ' // trim(this % name) - if (this % zaid > 0) then - write(unit_,*) ' ZAID = ' // trim(to_str(this % zaid)) - else if (this % zaid < 0) then - write(unit_,*) ' Material id = ' // trim(to_str(-this % zaid)) - end if if (this % awr > ZERO) then write(unit_,*) ' AWR = ' // trim(to_str(this % awr)) end if @@ -1319,7 +1308,6 @@ module mgxs_header else this % name = mat % name end if - this % zaid = -mat % id this % fissionable = mat % fissionable this % scatt_type = scatt_type diff --git a/src/multipole.F90 b/src/multipole.F90 index 770121b9d5..a099e50476 100644 --- a/src/multipole.F90 +++ b/src/multipole.F90 @@ -28,13 +28,8 @@ contains integer(HID_T) :: group_id ! Intermediate loading components - character(len=10) :: version - integer :: NMT - integer :: i, j - integer, allocatable :: MT(:) - logical :: accumulated_fission - character(len=24) :: MT_n ! Takes the form '/nuclide/reactions/MT???' integer :: is_fissionable + character(len=10) :: version associate (nuc => nuclides(i_table)) @@ -80,111 +75,8 @@ contains call read_dataset(multipole % curvefit, group_id, "curvefit") - ! Delete ACE pointwise data - call read_dataset(nuc % n_grid, group_id, "n_grid") - - deallocate(nuc % energy) - deallocate(nuc % total) - deallocate(nuc % elastic) - deallocate(nuc % fission) - deallocate(nuc % nu_fission) - deallocate(nuc % absorption) - - allocate(nuc % energy(nuc % n_grid)) - allocate(nuc % total(nuc % n_grid)) - allocate(nuc % elastic(nuc % n_grid)) - allocate(nuc % fission(nuc % n_grid)) - allocate(nuc % nu_fission(nuc % n_grid)) - allocate(nuc % absorption(nuc % n_grid)) - - nuc % total(:) = ZERO - nuc % absorption(:) = ZERO - nuc % fission(:) = ZERO - - ! Read in new energy axis (converting eV to MeV) - call read_dataset(nuc % energy, group_id, "energy_points") - nuc % energy = nuc % energy / 1.0e6_8 - - ! Get count and list of MT tables - call read_dataset(NMT, group_id, "MT_count") - allocate(MT(NMT)) - - call read_dataset(MT, group_id, "MT_list") - call close_group(group_id) - accumulated_fission = .false. - - ! Loop over each MT entry and load it into a reaction. - do i = 1, NMT - write(MT_n, '(A, I3.3)') '/nuclide/reactions/MT', MT(i) - - group_id = open_group(file_id, MT_n) - - ! Each MT needs to be treated slightly differently. - select case (MT(i)) - case(ELASTIC) - call read_dataset(nuc % elastic, group_id, "MT_sigma") - nuc % total(:) = nuc % total + nuc % elastic - case(N_FISSION) - call read_dataset(nuc % fission, group_id, "MT_sigma") - nuc % total(:) = nuc % total + nuc % fission - nuc % absorption(:) = nuc % absorption + nuc % fission - accumulated_fission = .true. - case default - ! Search through all of our secondary reactions - do j = 1, size(nuc % reactions) - if (nuc % reactions(j) % MT == MT(i)) then - ! Match found - - ! Individual Fission components exist, so remove the combined - ! fission cross section. - if ( (MT(i) == N_F .or. MT(i) == N_NF .or. MT(i) == N_2NF & - .or. MT(i) == N_3NF) .and. accumulated_fission) then - nuc % total(:) = nuc % total - nuc % fission - nuc % absorption(:) = nuc % absorption - nuc % fission - nuc % fission(:) = ZERO - accumulated_fission = .false. - end if - - deallocate(nuc % reactions(j) % sigma) - allocate(nuc % reactions(j) % sigma(nuc % n_grid)) - - call read_dataset(nuc % reactions(j) % sigma, & - group_id, "MT_sigma") - call read_dataset(nuc % reactions(j) % Q_value, & - group_id, "Q_value") - call read_dataset(nuc % reactions(j) % threshold, & - group_id, "threshold") - nuc % reactions(j) % threshold = 1 ! TODO: reconsider implications. - nuc % reactions(j) % Q_value = nuc % reactions(j) % Q_value & - / 1.0e6_8 - - ! Accumulate total - if (MT(i) /= N_LEVEL .and. MT(i) <= N_DA) then - nuc % total(:) = nuc % total + nuc % reactions(j) % sigma - end if - - ! Accumulate absorption - if (MT(i) >= N_GAMMA .and. MT(i) <= N_DA) then - nuc % absorption(:) = nuc % absorption & - + nuc % reactions(j) % sigma - end if - - ! Accumulate fission (if needed) - if ( (MT(i) == N_F .or. MT(i) == N_NF .or. MT(i) == N_2NF & - .or. MT(i) == N_3NF) ) then - nuc % fission(:) = nuc % fission + nuc % reactions(j) % sigma - nuc % absorption(:) = nuc % absorption & - + nuc % reactions(j) % sigma - end if - end if - end do - end select - - call close_group(group_id) - end do - ! Close file call file_close(file_id) diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index 3fffb76f3d..f9e473f45c 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -7,6 +7,7 @@ module nuclide_header h5lget_name_by_idx_f, H5_INDEX_NAME_F, H5_ITER_INC_F use h5lt, only: h5ltpath_valid_f + use algorithm, only: sort, find use constants use dict_header, only: DictIntInt use endf, only: reaction_name, is_fission, is_disappearance @@ -20,7 +21,7 @@ module nuclide_header use product_header, only: AngleEnergyContainer use reaction_header, only: Reaction use secondary_uncorrelated, only: UncorrelatedAngleEnergy - use stl_vector, only: VectorInt + use stl_vector, only: VectorInt, VectorReal use string use urr_header, only: UrrData use xml_interface @@ -32,29 +33,37 @@ module nuclide_header ! for continuous-energy neutron transport. !=============================================================================== - type :: Nuclide - ! Nuclide meta-data - character(20) :: name ! name of nuclide, e.g. U235.71c - integer :: zaid ! Z and A identifier, e.g. 92235 - integer :: metastable ! metastable state - real(8) :: awr ! Atomic Weight Ratio - real(8) :: kT ! temperature in MeV (k*T) - - ! Fission information - logical :: fissionable = .false. ! nuclide is fissionable? - - ! Energy grid information - integer :: n_grid ! # of nuclide grid points + type EnergyGrid integer, allocatable :: grid_index(:) ! log grid mapping indices real(8), allocatable :: energy(:) ! energy values corresponding to xs + end type EnergyGrid - ! Microscopic cross sections + type SumXS real(8), allocatable :: total(:) ! total cross section real(8), allocatable :: elastic(:) ! elastic scattering real(8), allocatable :: fission(:) ! fission real(8), allocatable :: nu_fission(:) ! neutron production real(8), allocatable :: absorption(:) ! absorption (MT > 100) real(8), allocatable :: heating(:) ! heating + end type SumXS + + type :: Nuclide + ! Nuclide meta-data + character(20) :: name ! name of nuclide, e.g. U235.71c + integer :: Z ! atomic number + integer :: A ! mass number + integer :: metastable ! metastable state + real(8) :: awr ! Atomic Weight Ratio + real(8), allocatable :: kTs(:) ! temperature in MeV (k*T) + + ! Fission information + logical :: fissionable = .false. ! nuclide is fissionable? + + ! Energy grid for each temperature + type(EnergyGrid), allocatable :: grid(:) + + ! Microscopic cross sections + type(SumXS), allocatable :: sum_xs(:) ! Resonance scattering info logical :: resonant = .false. ! resonant scatterer? @@ -77,7 +86,7 @@ module nuclide_header ! Unresolved resonance data logical :: urr_present = .false. integer :: urr_inelastic - type(UrrData), pointer :: urr_data => null() + type(UrrData), allocatable :: urr_data(:) ! Multipole data logical :: mp_present = .false. @@ -94,7 +103,6 @@ module nuclide_header contains procedure :: clear => nuclide_clear - procedure :: print => nuclide_print procedure :: from_hdf5 => nuclide_from_hdf5 procedure :: nu => nuclide_nu procedure, private :: create_derived => nuclide_create_derived @@ -131,6 +139,7 @@ module nuclide_header ! 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 ! Information for URR probability table use @@ -173,23 +182,25 @@ module nuclide_header subroutine nuclide_clear(this) class(Nuclide), intent(inout) :: this ! The Nuclide object to clear - if (associated(this % urr_data)) deallocate(this % urr_data) if (associated(this % multipole)) deallocate(this % multipole) end subroutine nuclide_clear - subroutine nuclide_from_hdf5(this, group_id, temperature) - class(Nuclide), intent(inout) :: this - integer(HID_T), intent(in) :: group_id - character(len=*), intent(in) :: temperature + subroutine nuclide_from_hdf5(this, group_id, temperature, method, tolerance) + class(Nuclide), intent(inout) :: this + integer(HID_T), intent(in) :: group_id + type(VectorReal), intent(in) :: temperature ! list of desired temperatures + integer, intent(in) :: method + real(8), intent(in) :: tolerance integer :: i - integer :: Z - integer :: A + integer :: n integer :: storage_type integer :: max_corder integer :: n_links integer :: hdf5_err + integer :: i_closest + integer :: n_temperature integer(HID_T) :: urr_group, nu_group integer(HID_T) :: energy_group, energy_dset integer(HID_T) :: kT_group, kT_dset @@ -201,13 +212,14 @@ module nuclide_header integer(SIZE_T) :: name_len, name_file_len integer(HSIZE_T) :: j integer(HSIZE_T) :: dims(1) - character(MAX_WORD_LEN) :: temp - character(MAX_FILE_LEN), allocatable :: temperatures(:) - integer, allocatable :: temperatures_integer(:) - character(6) :: my_temperature - integer :: temperature_integer - type(VectorInt) :: MTs + character(MAX_WORD_LEN) :: temp_str + character(MAX_FILE_LEN), allocatable :: dset_names(:) + real(8), allocatable :: temps_available(:) ! temperatures available + real(8) :: temp_desired + real(8) :: temp_actual logical :: exists + type(VectorInt) :: MTs + type(VectorInt) :: temps_to_read ! Get name of nuclide from group name_len = len(this % name) @@ -216,62 +228,90 @@ module nuclide_header ! Get rid of leading '/' this % name = trim(this % name(2:)) - call read_attribute(Z, group_id, 'Z') - call read_attribute(A, group_id, 'A') + call read_attribute(this % Z, group_id, 'Z') + call read_attribute(this % A, group_id, 'A') call read_attribute(this % metastable, group_id, 'metastable') - this % zaid = 1000 * Z + A + 400 * this % metastable call read_attribute(this % awr, group_id, 'atomic_weight_ratio') kT_group = open_group(group_id, 'kTs') - ! Before accessing the temperature data, see if the user-provied temperature - ! exists. We can find this out by looking at the datasets within kT_group - temperature_integer = & - str_to_int(temperature(1: len_trim(adjustl(temperature)) - 1)) - call get_datasets(kT_group, temperatures) - allocate(temperatures_integer(size(temperatures))) - do i = 1, size(temperatures) - temperatures_integer(i) = & - str_to_int(temperatures(i)(1: len_trim(adjustl(temperatures(i))) - 1)) + ! Determine temperatures available + call get_datasets(kT_group, dset_names) + allocate(temps_available(size(dset_names))) + do i = 1, size(dset_names) + ! Read temperature value + call read_dataset(temps_available(i), kT_group, trim(dset_names(i))) + temps_available(i) = temps_available(i) / K_BOLTZMANN + end do + + select case (method) + case (TEMPERATURE_NEAREST) + ! Determine actual temperatures to read + TEMP_LOOP: do i = 1, temperature % size() + temp_desired = temperature % data(i) + i_closest = minloc(abs(temps_available - temp_desired), dim=1) + temp_actual = temps_available(i_closest) + if (abs(temp_actual - temp_desired) < tolerance) then + if (find(temps_to_read, nint(temp_actual)) == -1) then + call temps_to_read % push_back(nint(temp_actual)) + + ! Write warning for resonance scattering data if 0K is not available + if (abs(temp_actual - temp_desired) > 0 .and. temp_desired == 0) then + call warning(trim(this % name) // " does not contain 0K data & + &needed for resonance scattering options selected. Using & + &data at " // trim(to_str(nint(temp_actual))) // " K instead.") + end if + end if + else + call fatal_error("Nuclear data library does not contain cross sections & + &for " // trim(this % name) // " at or near " // & + trim(to_str(nint(temp_desired))) // " K.") + end if + end do TEMP_LOOP + + case (TEMPERATURE_INTERPOLATION) + ! TODO: Get bounding temperatures + call fatal_error("Temperature interpolation not yet implemented") + + case (TEMPERATURE_MULTIPOLE) + ! Add first available temperature + call temps_to_read % push_back(nint(temps_available(1))) + + end select + + ! Sort temperatures to read + call sort(temps_to_read) + + n_temperature = temps_to_read % size() + allocate(this % kTs(n_temperature)) + allocate(this % grid(n_temperature)) + + do i = 1, n_temperature + ! Get temperature as a string + temp_str = trim(to_str(temps_to_read % data(i))) // "K" + + ! Read exact temperature value + call read_dataset(this % kTs(i), kT_group, trim(temp_str)) + + ! Read energy grid + energy_group = open_group(group_id, 'energy') + energy_dset = open_dataset(energy_group, temp_str) + call get_shape(energy_dset, dims) + allocate(this % grid(i) % energy(int(dims(1), 4))) + call read_dataset(this % grid(i) % energy, energy_dset) + call close_dataset(energy_dset) + call close_group(energy_group) end do - my_temperature = & - temperatures(minloc(abs(temperature_integer - temperatures_integer), & - dim=1)) - ! Now print a warning if there is no matching temperature and then use the - ! closest temperature - if (temperature /= my_temperature) then - if (temperature == '0K') then - call warning(trim(this % name) // " does not contain 0K data & - &needed for the resonance scattering options selected") - else - call warning(trim(this % name) // " does not contain data at a & - &temperature of " // trim(temperature) // "; using the & - &nearest available temperature of " // trim(my_temperature)) - end if - end if - kT_dset = open_dataset(kT_group, my_temperature) - call read_dataset(this % kT, kT_dset) - call close_dataset(kT_dset) call close_group(kT_group) - ! Read energy grid - energy_group = open_group(group_id, 'energy') - energy_dset = open_dataset(energy_group, my_temperature) - call get_shape(energy_dset, dims) - this % n_grid = int(dims(1), 4) - allocate(this % energy(this % n_grid)) - call read_dataset(this % energy, energy_dset) - call close_dataset(energy_dset) - call close_group(energy_group) - ! Get MT values based on group names rxs_group = open_group(group_id, 'reactions') call h5gget_info_f(rxs_group, storage_type, n_links, max_corder, hdf5_err) do j = 0, n_links - 1 call h5lget_name_by_idx_f(rxs_group, ".", H5_INDEX_NAME_F, H5_ITER_INC_F, & - j, temp, hdf5_err, name_len) - if (starts_with(temp, "reaction_")) then - call MTs % push_back(int(str_to_int(temp(10:12)))) + j, temp_str, hdf5_err, name_len) + if (starts_with(temp_str, "reaction_")) then + call MTs % push_back(int(str_to_int(temp_str(10:12)))) end if end do @@ -281,7 +321,7 @@ module nuclide_header rx_group = open_group(rxs_group, 'reaction_' // trim(& zero_padded(MTs % data(i), 3))) - call this % reactions(i) % from_hdf5(rx_group, my_temperature) + call this % reactions(i) % from_hdf5(rx_group, temps_to_read) call close_group(rx_group) end do call close_group(rxs_group) @@ -290,32 +330,42 @@ module nuclide_header call h5ltpath_valid_f(group_id, 'urr', .true., exists, hdf5_err) if (exists) then this % urr_present = .true. - allocate(this % urr_data) - urr_group = open_group(group_id, 'urr/' // trim(my_temperature)) - call this % urr_data % from_hdf5(urr_group) + allocate(this % urr_data(n_temperature)) + + do i = 1, n_temperature + ! Get temperature as a string + temp_str = trim(to_str(temps_to_read % data(i))) // "K" + + ! Read probability tables for i-th temperature + urr_group = open_group(group_id, 'urr/' // trim(temp_str)) + call this % urr_data(i) % from_hdf5(urr_group) + call close_group(urr_group) + + ! Check for negative values + if (any(this % urr_data(i) % prob < ZERO)) then + call warning("Negative value(s) found on probability table & + &for nuclide " // this % name // " at " // trim(temp_str)) + end if + end do ! if the inelastic competition flag indicates that the inelastic cross ! section should be determined from a normal reaction cross section, we ! need to get the index of the reaction - if (this % urr_data % inelastic_flag > 0) then - do i = 1, size(this % reactions) - if (this % reactions(i) % MT == this % urr_data % inelastic_flag) then - this % urr_inelastic = i + if (n_temperature > 0) then + if (this % urr_data(1) % inelastic_flag > 0) then + do i = 1, size(this % reactions) + if (this % reactions(i) % MT == this % urr_data(1) % inelastic_flag) then + this % urr_inelastic = i + end if + end do + + ! Abort if no corresponding inelastic reaction was found + if (this % urr_inelastic == NONE) then + call fatal_error("Could not find inelastic reaction specified on & + &unresolved resonance probability table.") end if - end do - - ! Abort if no corresponding inelastic reaction was found - if (this % urr_inelastic == NONE) then - call fatal_error("Could not find inelastic reaction specified on & - &unresolved resonance probability table.") end if end if - - ! Check for negative values - if (any(this % urr_data % prob < ZERO)) then - call warning("Negative value(s) found on probability table & - &for nuclide " // this % name) - end if end if ! Check for nu-total @@ -325,8 +375,8 @@ module nuclide_header ! Read total nu data total_nu = open_dataset(nu_group, 'yield') - call read_attribute(temp, total_nu, 'type') - select case (temp) + call read_attribute(temp_str, total_nu, 'type') + select case (temp_str) case ('Tabulated1D') allocate(Tabulated1D :: this % total_nu) case ('Polynomial') @@ -346,8 +396,8 @@ module nuclide_header ! Check to see if this is polynomial or tabulated data fer_dset = open_dataset(fer_group, 'q_prompt') - call read_attribute(temp, fer_dset, 'type') - if (temp == 'Polynomial') then + call read_attribute(temp_str, fer_dset, 'type') + if (temp_str == 'Polynomial') then ! Read the prompt Q-value allocate(Polynomial :: this % fission_q_prompt) call this % fission_q_prompt % from_hdf5(fer_dset) @@ -358,7 +408,7 @@ module nuclide_header fer_dset = open_dataset(fer_group, 'q_recoverable') call this % fission_q_recov % from_hdf5(fer_dset) call close_dataset(fer_dset) - else if (temp == 'Tabulated1D') then + else if (temp_str == 'Tabulated1D') then ! Read the prompt Q-value allocate(Tabulated1D :: this % fission_q_prompt) call this % fission_q_prompt % from_hdf5(fer_dset) @@ -383,108 +433,125 @@ module nuclide_header subroutine nuclide_create_derived(this) class(Nuclide), intent(inout) :: this - integer :: i - integer :: j - integer :: k + integer :: i, j, k + integer :: t integer :: m integer :: n + integer :: n_grid integer :: i_fission - type(ListInt) :: MTs + integer :: n_temperature + type(VectorInt) :: MTs - ! Allocate and initialize derived cross sections - allocate(this % total(this % n_grid)) - allocate(this % elastic(this % n_grid)) - allocate(this % fission(this % n_grid)) - allocate(this % nu_fission(this % n_grid)) - allocate(this % absorption(this % n_grid)) - this % total(:) = ZERO - this % elastic(:) = ZERO - this % fission(:) = ZERO - this % nu_fission(:) = ZERO - this % absorption(:) = ZERO + n_temperature = size(this % kTs) + allocate(this % sum_xs(n_temperature)) + + do i = 1, n_temperature + ! Allocate and initialize derived cross sections + n_grid = size(this % grid(i) % energy) + allocate(this % sum_xs(i) % total(n_grid)) + allocate(this % sum_xs(i) % elastic(n_grid)) + allocate(this % sum_xs(i) % fission(n_grid)) + allocate(this % sum_xs(i) % nu_fission(n_grid)) + allocate(this % sum_xs(i) % absorption(n_grid)) + this % sum_xs(i) % total(:) = ZERO + this % sum_xs(i) % elastic(:) = ZERO + this % sum_xs(i) % fission(:) = ZERO + this % sum_xs(i) % nu_fission(:) = ZERO + this % sum_xs(i) % absorption(:) = ZERO + end do i_fission = 0 do i = 1, size(this % reactions) - call MTs % append(this % reactions(i) % MT) + call MTs % push_back(this % reactions(i) % MT) call this % reaction_index % add_key(this % reactions(i) % MT, i) associate (rx => this % reactions(i)) - j = rx % threshold - n = size(rx % sigma) - ! Skip total inelastic level scattering, gas production cross sections ! (MT=200+), etc. if (rx % MT == N_LEVEL .or. rx % MT == N_NONELASTIC) cycle if (rx % MT > N_5N2P .and. rx % MT < N_P0) cycle ! Skip level cross sections if total is available - if (rx % MT >= N_P0 .and. rx % MT <= N_PC .and. MTs % contains(N_P)) cycle - if (rx % MT >= N_D0 .and. rx % MT <= N_DC .and. MTs % contains(N_D)) cycle - if (rx % MT >= N_T0 .and. rx % MT <= N_TC .and. MTs % contains(N_T)) cycle - if (rx % MT >= N_3HE0 .and. rx % MT <= N_3HEC .and. MTs % contains(N_3HE)) cycle - if (rx % MT >= N_A0 .and. rx % MT <= N_AC .and. MTs % contains(N_A)) cycle - if (rx % MT >= N_2N0 .and. rx % MT <= N_2NC .and. MTs % contains(N_2N)) cycle + if (rx % MT >= N_P0 .and. rx % MT <= N_PC .and. find(MTs, N_P) /= -1) cycle + if (rx % MT >= N_D0 .and. rx % MT <= N_DC .and. find(MTs, N_D) /= -1) cycle + if (rx % MT >= N_T0 .and. rx % MT <= N_TC .and. find(MTs, N_T) /= -1) cycle + if (rx % MT >= N_3HE0 .and. rx % MT <= N_3HEC .and. find(MTs, N_3HE) /= -1) cycle + if (rx % MT >= N_A0 .and. rx % MT <= N_AC .and. find(MTs, N_A) /= -1) cycle + if (rx % MT >= N_2N0 .and. rx % MT <= N_2NC .and. find(MTs, N_2N) /= -1) cycle - ! Copy elastic - if (rx % MT == ELASTIC) this % elastic(:) = rx % sigma + do t = 1, n_temperature + j = rx % xs(t) % threshold + n = size(rx % xs(t) % value) - ! Add contribution to total cross section - this % total(j:j+n-1) = this % total(j:j+n-1) + rx % sigma + ! Copy elastic + if (rx % MT == ELASTIC) this % sum_xs(t) % elastic(:) = rx % xs(t) % value - ! Add contribution to absorption cross section - if (is_disappearance(rx % MT)) then - this % absorption(j:j+n-1) = this % absorption(j:j+n-1) + rx % sigma - end if + ! Add contribution to total cross section + this % sum_xs(t) % total(j:j+n-1) = this % sum_xs(t) % total(j:j+n-1) + & + rx % xs(t) % value - ! Information about fission reactions - if (rx % MT == N_FISSION) then - allocate(this % index_fission(1)) - elseif (rx % MT == N_F) then - allocate(this % index_fission(PARTIAL_FISSION_MAX)) - this % has_partial_fission = .true. - end if + ! Add contribution to absorption cross section + if (is_disappearance(rx % MT)) then + this % sum_xs(t) % absorption(j:j+n-1) = this % sum_xs(t) % & + absorption(j:j+n-1) + rx % xs(t) % value + end if - ! Add contribution to fission cross section - if (is_fission(rx % MT)) then - this % fissionable = .true. - this % fission(j:j+n-1) = this % fission(j:j+n-1) + rx % sigma - - ! Also need to add fission cross sections to absorption - this % absorption(j:j+n-1) = this % absorption(j:j+n-1) + rx % sigma - - ! If total fission reaction is present, there's no need to store the - ! reaction cross-section since it was copied to this % fission - if (rx % MT == N_FISSION) deallocate(rx % sigma) - - ! Keep track of this reaction for easy searching later - i_fission = i_fission + 1 - this % index_fission(i_fission) = i - this % n_fission = this % n_fission + 1 - - ! <<<<<<<<<<<<<<<<<<<<<<<<<<<< REMOVE THIS <<<<<<<<<<<<<<<<<<<<<<<<<<< - ! Before the secondary distribution refactor, when the angle/energy - ! distribution was uncorrelated, no angle was actually sampled. With - ! the refactor, an angle is always sampled for an uncorrelated - ! distribution even when no angle distribution exists in the ACE file - ! (isotropic is assumed). To preserve the RNG stream, we explicitly - ! mark fission reactions so that we avoid the angle sampling. - do k = 1, size(rx % products) - if (rx % products(k) % particle == NEUTRON) then - do m = 1, size(rx % products(k) % distribution) - associate (aedist => rx % products(k) % distribution(m) % obj) - select type (aedist) - type is (UncorrelatedAngleEnergy) - aedist % fission = .true. - end select - end associate - end do + ! Information about fission reactions + if (t == 1) then + if (rx % MT == N_FISSION) then + allocate(this % index_fission(1)) + elseif (rx % MT == N_F) then + allocate(this % index_fission(PARTIAL_FISSION_MAX)) + this % has_partial_fission = .true. end if - end do - ! <<<<<<<<<<<<<<<<<<<<<<<<<<<< REMOVE THIS <<<<<<<<<<<<<<<<<<<<<<<<<<< - end if - end associate - end do + end if + + ! Add contribution to fission cross section + if (is_fission(rx % MT)) then + this % fissionable = .true. + this % sum_xs(t) % fission(j:j+n-1) = this % sum_xs(t) % & + fission(j:j+n-1) + rx % xs(t) % value + + ! Also need to add fission cross sections to absorption + this % sum_xs(t) % absorption(j:j+n-1) = this % sum_xs(t) % & + absorption(j:j+n-1) + rx % xs(t) % value + + ! If total fission reaction is present, there's no need to store the + ! reaction cross-section since it was copied to this % fission + if (rx % MT == N_FISSION) deallocate(rx % xs(t) % value) + + ! Keep track of this reaction for easy searching later + if (t == 1) then + i_fission = i_fission + 1 + this % index_fission(i_fission) = i + this % n_fission = this % n_fission + 1 + + ! <<<<<<<<<<<<<<<<<<<<<<<<<<<< REMOVE THIS <<<<<<<<<<<<<<<<<<<<<<<<< + ! Before the secondary distribution refactor, when the angle/energy + ! distribution was uncorrelated, no angle was actually sampled. With + ! the refactor, an angle is always sampled for an uncorrelated + ! distribution even when no angle distribution exists in the ACE file + ! (isotropic is assumed). To preserve the RNG stream, we explicitly + ! mark fission reactions so that we avoid the angle sampling. + do k = 1, size(rx % products) + if (rx % products(k) % particle == NEUTRON) then + do m = 1, size(rx % products(k) % distribution) + associate (aedist => rx % products(k) % distribution(m) % obj) + select type (aedist) + type is (UncorrelatedAngleEnergy) + aedist % fission = .true. + end select + end associate + end do + end if + end do + ! <<<<<<<<<<<<<<<<<<<<<<<<<<<< REMOVE THIS <<<<<<<<<<<<<<<<<<<<<<<<< + end if + end if ! fission + end do ! temperature + end associate ! rx + end do ! reactions ! Determine number of delayed neutron precursors if (this % fissionable) then @@ -497,17 +564,16 @@ module nuclide_header end if ! Calculate nu-fission cross section - if (this % fissionable) then - do i = 1, size(this % energy) - this % nu_fission(i) = this % nu(this % energy(i), EMISSION_TOTAL) * & - this % fission(i) - end do - else - this % nu_fission(:) = ZERO - end if - - ! Clear MTs set - call MTs % clear() + do t = 1, n_temperature + if (this % fissionable) then + do i = 1, size(this % sum_xs(t) % fission) + this % sum_xs(t) % nu_fission(i) = this % nu(this % grid(t) % energy(i), & + EMISSION_TOTAL) * this % sum_xs(t) % fission(i) + end do + else + this % sum_xs(t) % nu_fission(:) = ZERO + end if + end do end subroutine nuclide_create_derived !=============================================================================== @@ -575,86 +641,4 @@ module nuclide_header end function nuclide_nu - -!=============================================================================== -! NUCLIDE*_PRINT displays information about a continuous-energy neutron -! cross_section table and its reactions and secondary angle/energy distributions -!=============================================================================== - - subroutine nuclide_print(this, unit) - class(Nuclide), intent(in) :: this - integer, intent(in), optional :: unit - - integer :: i ! loop index over nuclides - integer :: unit_ ! unit to write to - integer :: size_xs ! memory used for cross-sections (bytes) - integer :: size_urr ! memory used for probability tables (bytes) - - ! set default unit for writing information - if (present(unit)) then - unit_ = unit - else - unit_ = OUTPUT_UNIT - end if - - ! Initialize totals - size_urr = 0 - size_xs = 0 - - ! Basic nuclide information - write(unit_,*) 'Nuclide ' // trim(this % name) - write(unit_,*) ' zaid = ' // trim(to_str(this % zaid)) - write(unit_,*) ' awr = ' // trim(to_str(this % awr)) - write(unit_,*) ' kT = ' // trim(to_str(this % kT)) - write(unit_,*) ' # of grid points = ' // trim(to_str(this % n_grid)) - write(unit_,*) ' Fissionable = ', this % fissionable - write(unit_,*) ' # of fission reactions = ' // trim(to_str(this % n_fission)) - write(unit_,*) ' # of reactions = ' // trim(to_str(size(this % reactions))) - - ! Information on each reaction - write(unit_,*) ' Reaction Q-value COM IE' - do i = 1, size(this % reactions) - associate (rxn => this % reactions(i)) - write(unit_,'(3X,A11,1X,F8.3,3X,L1,3X,I6)') & - reaction_name(rxn % MT), rxn % Q_value, rxn % scatter_in_cm, & - rxn % threshold - - ! Accumulate data size - size_xs = size_xs + (this % n_grid - rxn%threshold + 1) * 8 - end associate - end do - - ! Add memory required for summary reactions (total, absorption, fission, - ! nu-fission) - size_xs = 8 * this % n_grid * 4 - - ! Write information about URR probability tables - size_urr = 0 - if (this % urr_present) then - associate(urr => this % urr_data) - write(unit_,*) ' Unresolved resonance probability table:' - write(unit_,*) ' # of energies = ' // trim(to_str(urr % n_energy)) - write(unit_,*) ' # of probabilities = ' // trim(to_str(urr % n_prob)) - write(unit_,*) ' Interpolation = ' // trim(to_str(urr % interp)) - write(unit_,*) ' Inelastic flag = ' // trim(to_str(urr % inelastic_flag)) - write(unit_,*) ' Absorption flag = ' // trim(to_str(urr % absorption_flag)) - write(unit_,*) ' Multiply by smooth? ', urr % multiply_smooth - write(unit_,*) ' Min energy = ', trim(to_str(urr % energy(1))) - write(unit_,*) ' Max energy = ', trim(to_str(urr % energy(urr % n_energy))) - - ! Calculate memory used by probability tables and add to total - size_urr = urr % n_energy * (urr % n_prob * 6 + 1) * 8 - end associate - end if - - ! Write memory used - write(unit_,*) ' Memory Requirements' - write(unit_,*) ' Cross sections = ' // trim(to_str(size_xs)) // ' bytes' - write(unit_,*) ' Probability Tables = ' // & - trim(to_str(size_urr)) // ' bytes' - - ! Blank line at end of nuclide - write(unit_,*) - end subroutine nuclide_print - end module nuclide_header diff --git a/src/output.F90 b/src/output.F90 index 9e23f11d88..f8b0c5ab09 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -317,57 +317,6 @@ contains end subroutine print_particle -!=============================================================================== -! WRITE_XS_SUMMARY writes information about each nuclide and S(a,b) table to a -! file called cross_sections.out. This file shows the list of reactions as well -! as information about their secondary angle/energy distributions, how much -! memory is consumed, thresholds, etc. -!=============================================================================== - - subroutine write_xs_summary() - - integer :: i ! loop index - integer :: unit_xs ! cross_sections.out file unit - character(MAX_FILE_LEN) :: path ! path of summary file - - ! Create filename for log file - path = trim(path_output) // "cross_sections.out" - - ! Open log file for writing - open(NEWUNIT=unit_xs, FILE=path, STATUS='replace', ACTION='write') - - if (run_CE) then - ! Write header - call header("CROSS SECTION TABLES", unit=unit_xs) - - NUCLIDE_LOOP: do i = 1, n_nuclides_total - ! Print information about nuclide - call nuclides(i) % print(unit=unit_xs) - end do NUCLIDE_LOOP - - SAB_TABLES_LOOP: do i = 1, n_sab_tables - ! Print information about S(a,b) table - call sab_tables(i) % print(unit=unit_xs) - end do SAB_TABLES_LOOP - else - ! Write header - call header("MGXS LIBRARY TABLES", unit=unit_xs) - NuclideMG_LOOP: do i = 1, n_nuclides_total - ! Print information about nuclide - call nuclides_mg(i) % obj % print(unit=unit_xs) - end do NuclideMG_LOOP - call header("MATERIAL MGXS TABLES", unit=unit_xs) - MATERIAL_LOOP: do i = 1, n_materials - ! Print information about Materials - call macro_xs(i) % obj % print(unit=unit_xs) - end do MATERIAL_LOOP - end if - - ! Close cross section summary file - close(unit_xs) - - end subroutine write_xs_summary - !=============================================================================== ! PRINT_COLUMNS displays a header listing what physical values will displayed ! below them diff --git a/src/particle_header.F90 b/src/particle_header.F90 index ee854aea37..53a503ce2e 100644 --- a/src/particle_header.F90 +++ b/src/particle_header.F90 @@ -88,6 +88,7 @@ module particle_header ! Temperature of the current cell real(8) :: sqrtkT ! sqrt(k_Boltzmann * temperature) in MeV + real(8) :: last_sqrtKT ! last temperature ! Statistical data integer :: n_collision ! # of collisions @@ -129,6 +130,7 @@ contains this % cell_born = NONE this % material = NONE this % last_material = NONE + this % last_sqrtkT = NONE this % wgt = ONE this % last_wgt = ONE this % absorb_wgt = ZERO diff --git a/src/physics.F90 b/src/physics.F90 index 00bd2c20c9..f1f6733097 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -59,7 +59,7 @@ contains ! Advance URR seed stream 'N' times after energy changes if (p % E /= p % last_E) then call prn_set_stream(STREAM_URR_PTABLE) - call advance_prn_seed(n_nuc_zaid_total) + call advance_prn_seed(size(nuclides, kind=8)) call prn_set_stream(STREAM_TRACKING) endif @@ -200,6 +200,7 @@ contains integer :: i integer :: i_grid + integer :: i_temp real(8) :: f real(8) :: prob real(8) :: cutoff @@ -219,6 +220,7 @@ contains end if ! Get grid index and interpolatoin factor and sample fission cdf + i_temp = micro_xs(i_nuclide) % index_temp i_grid = micro_xs(i_nuclide) % index_grid f = micro_xs(i_nuclide) % interp_factor cutoff = prn() * micro_xs(i_nuclide) % fission @@ -229,13 +231,13 @@ contains FISSION_REACTION_LOOP: do i = 1, nuc % n_fission i_reaction = nuc % index_fission(i) - associate (rxn => nuc % reactions(i_reaction)) + associate (xs => nuc % reactions(i_reaction) % xs(i_temp)) ! if energy is below threshold for this reaction, skip it - if (i_grid < rxn % threshold) cycle + if (i_grid < xs % threshold) cycle ! add to cumulative probability - prob = prob + ((ONE - f)*rxn%sigma(i_grid - rxn%threshold + 1) & - + f*(rxn%sigma(i_grid - rxn%threshold + 2))) + prob = prob + ((ONE - f) * xs % value(i_grid - xs % threshold + 1) & + + f*(xs % value(i_grid - xs % threshold + 2))) end associate ! Create fission bank sites if fission occurs @@ -294,6 +296,7 @@ contains integer, intent(in) :: i_nuc_mat integer :: i + integer :: i_temp integer :: i_grid real(8) :: f real(8) :: prob @@ -301,6 +304,7 @@ contains real(8) :: uvw_new(3) ! outgoing uvw for iso-in-lab scattering 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 MeV type(Nuclide), pointer :: nuc ! copy incoming direction @@ -308,6 +312,7 @@ contains ! Get pointer to nuclide and grid index/interpolation factor nuc => nuclides(i_nuclide) + i_temp = micro_xs(i_nuclide) % index_temp i_grid = micro_xs(i_nuclide) % index_grid f = micro_xs(i_nuclide) % interp_factor @@ -328,8 +333,15 @@ contains p % E, p % coord(1) % uvw, p % mu) else + ! Determine temperature +!!$ if (temperature_method == TEMPERATURE_MULTIPOLE) 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), & + call elastic_scatter(i_nuclide, nuc % reactions(1), kT, & p % E, p % coord(1) % uvw, p % mu, p % wgt) end if @@ -352,22 +364,24 @@ contains &// trim(nuc % name)) end if - associate (rxn => nuc % reactions(i)) + associate (rx => nuc % reactions(i)) ! Skip fission reactions - if (rxn % MT == N_FISSION .or. rxn % MT == N_F .or. rxn % MT == N_NF & - .or. rxn % MT == N_2NF .or. rxn % MT == N_3NF) cycle + 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 ! are duplicates. Also MT=4 is total level inelastic scattering which ! should be skipped - if (rxn % MT >= 200 .or. rxn % MT == N_LEVEL) cycle + if (rx % MT >= 200 .or. rx % MT == N_LEVEL) cycle - ! if energy is below threshold for this reaction, skip it - if (i_grid < rxn % threshold) cycle + associate (xs => rx % xs(i_temp)) + ! if energy is below threshold for this reaction, skip it + if (i_grid < xs % threshold) cycle - ! add to cumulative probability - prob = prob + ((ONE - f)*rxn%sigma(i_grid - rxn%threshold + 1) & - + f*(rxn%sigma(i_grid - rxn%threshold + 2))) + ! add to cumulative probability + prob = prob + ((ONE - f)*xs % value(i_grid - xs % threshold + 1) & + + f*(xs % value(i_grid - xs % threshold + 2))) + end associate end associate end do @@ -401,9 +415,10 @@ contains ! target. !=============================================================================== - subroutine elastic_scatter(i_nuclide, rxn, E, uvw, mu_lab, wgt) + subroutine elastic_scatter(i_nuclide, rxn, kT, E, uvw, mu_lab, wgt) integer, intent(in) :: i_nuclide type(Reaction), intent(in) :: rxn + real(8), intent(in) :: kT ! temperature in MeV real(8), intent(inout) :: E real(8), intent(inout) :: uvw(3) real(8), intent(out) :: mu_lab @@ -430,7 +445,7 @@ contains ! Sample velocity of target nucleus if (.not. micro_xs(i_nuclide) % use_ptable) then call sample_target_velocity(nuc, v_t, E, uvw, v_n, wgt, & - & micro_xs(i_nuclide) % elastic) + micro_xs(i_nuclide) % elastic, kT) else v_t = ZERO end if @@ -494,6 +509,7 @@ contains integer :: i ! incoming energy bin integer :: j ! outgoing energy bin integer :: k ! outgoing cosine bin + integer :: i_temp ! temperature index integer :: n_energy_out ! number of outgoing energy bins real(8) :: f ! interpolation factor real(8) :: r ! used for skewed sampling & continuous @@ -502,7 +518,6 @@ contains real(8) :: mu_ijk ! outgoing cosine k for E_in(i) and E_out(j) real(8) :: mu_i1jk ! outgoing cosine k for E_in(i+1) and E_out(j) real(8) :: prob ! probability for sampling Bragg edge - type(SAlphaBeta), pointer :: sab ! Following are needed only for SAB_SECONDARY_CONT scattering integer :: l ! sampled incoming E bin (is i or i + 1) real(8) :: E_i_1, E_i_J ! endpoints on outgoing grid i @@ -514,213 +529,216 @@ contains real(8) :: frac ! interpolation factor on outgoing energy real(8) :: r1 ! RNG for outgoing energy + i_temp = micro_xs(i_nuclide) % index_temp_sab + ! Get pointer to S(a,b) table - sab => sab_tables(i_sab) + 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) % elastic) then - ! elastic scattering + ! Determine whether inelastic or elastic scattering will occur + if (prn() < micro_xs(i_nuclide) % elastic_sab / & + micro_xs(i_nuclide) % elastic) then + ! elastic scattering - ! Get index and interpolation factor for elastic grid - if (E < sab % elastic_e_in(1)) then - i = 1 - f = ZERO - else - i = binary_search(sab % elastic_e_in, sab % n_elastic_e_in, E) - f = (E - sab%elastic_e_in(i)) / & - (sab%elastic_e_in(i+1) - sab%elastic_e_in(i)) - end if - - ! Select treatment based on elastic mode - if (sab % elastic_mode == SAB_ELASTIC_DISCRETE) then - ! With this treatment, we interpolate between two discrete cosines - ! corresponding to neighboring incoming energies. This is used for - ! data derived in the incoherent approximation - - ! Sample outgoing cosine bin - k = 1 + int(prn() * sab % n_elastic_mu) - - ! Determine outgoing cosine corresponding to E_in(i) and E_in(i+1) - mu_ijk = sab % elastic_mu(k,i) - mu_i1jk = sab % elastic_mu(k,i+1) - - ! Cosine of angle between incoming and outgoing neutron - mu = (1 - f)*mu_ijk + f*mu_i1jk - - elseif (sab % elastic_mode == SAB_ELASTIC_EXACT) then - ! This treatment is used for data derived in the coherent - ! approximation, i.e. for crystalline structures that have Bragg - ! edges. - - ! Sample a Bragg edge between 1 and i - prob = prn() * sab % elastic_P(i+1) - if (prob < sab % elastic_P(1)) then - k = 1 + ! Get index and interpolation factor for elastic grid + if (E < sab % elastic_e_in(1)) then + i = 1 + f = ZERO else - k = binary_search(sab % elastic_P(1:i+1), i+1, prob) + i = binary_search(sab % elastic_e_in, sab % n_elastic_e_in, E) + f = (E - sab%elastic_e_in(i)) / & + (sab%elastic_e_in(i+1) - sab%elastic_e_in(i)) end if - ! Characteristic scattering cosine for this Bragg edge - mu = ONE - TWO*sab % elastic_e_in(k) / E + ! Select treatment based on elastic mode + if (sab % elastic_mode == SAB_ELASTIC_DISCRETE) then + ! With this treatment, we interpolate between two discrete cosines + ! corresponding to neighboring incoming energies. This is used for + ! data derived in the incoherent approximation - end if + ! Sample outgoing cosine bin + k = 1 + int(prn() * sab % n_elastic_mu) - ! Outgoing energy is same as incoming energy -- no need to do anything + ! Determine outgoing cosine corresponding to E_in(i) and E_in(i+1) + mu_ijk = sab % elastic_mu(k,i) + mu_i1jk = sab % elastic_mu(k,i+1) - else - ! Perform inelastic calculations + ! Cosine of angle between incoming and outgoing neutron + mu = (1 - f)*mu_ijk + f*mu_i1jk - ! Get index and interpolation factor for inelastic grid - if (E < sab % inelastic_e_in(1)) then - i = 1 - f = ZERO - else - i = binary_search(sab % inelastic_e_in, sab % n_inelastic_e_in, E) - f = (E - sab%inelastic_e_in(i)) / & - (sab%inelastic_e_in(i+1) - sab%inelastic_e_in(i)) - end if + elseif (sab % elastic_mode == SAB_ELASTIC_EXACT) then + ! This treatment is used for data derived in the coherent + ! approximation, i.e. for crystalline structures that have Bragg + ! edges. - ! Now that we have an incoming energy bin, we need to determine the - ! outgoing energy bin. This will depend on the "secondary energy - ! mode". If the mode is 0, then the outgoing energy bin is chosen from a - ! set of equally-likely bins. If the mode is 1, then the first - ! two and last two bins are skewed to have lower probabilities than the - ! other bins (0.1 for the first and last bins and 0.4 for the second and - ! second to last bins, relative to a normal bin probability of 1). - ! Finally, if the mode is 2, then a continuous distribution (with - ! accompanying PDF and CDF is utilized) - - if ((sab % secondary_mode == SAB_SECONDARY_EQUAL) .or. & - (sab % secondary_mode == SAB_SECONDARY_SKEWED)) then - if (sab % secondary_mode == SAB_SECONDARY_EQUAL) then - ! All bins equally likely - - j = 1 + int(prn() * sab % n_inelastic_e_out) - elseif (sab % secondary_mode == SAB_SECONDARY_SKEWED) then - ! Distribution skewed away from edge points - - ! Determine number of outgoing energy and angle bins - n_energy_out = sab % n_inelastic_e_out - - r = prn() * (n_energy_out - 3) - if (r > ONE) then - ! equally likely N-4 middle bins - j = int(r) + 2 - elseif (r > 0.6_8) then - ! second to last bin has relative probability of 0.4 - j = n_energy_out - 1 - elseif (r > HALF) then - ! last bin has relative probability of 0.1 - j = n_energy_out - elseif (r > 0.1_8) then - ! second bin has relative probability of 0.4 - j = 2 + ! Sample a Bragg edge between 1 and i + prob = prn() * sab % elastic_P(i+1) + if (prob < sab % elastic_P(1)) then + k = 1 else - ! first bin has relative probability of 0.1 - j = 1 + k = binary_search(sab % elastic_P(1:i+1), i+1, prob) end if + + ! Characteristic scattering cosine for this Bragg edge + mu = ONE - TWO*sab % elastic_e_in(k) / E + end if - ! Determine outgoing energy corresponding to E_in(i) and E_in(i+1) - E_ij = sab % inelastic_e_out(j,i) - E_i1j = sab % inelastic_e_out(j,i+1) - - ! Outgoing energy - E = (1 - f)*E_ij + f*E_i1j - - ! Sample outgoing cosine bin - k = 1 + int(prn() * sab % n_inelastic_mu) - - ! Determine outgoing cosine corresponding to E_in(i) and E_in(i+1) - mu_ijk = sab % inelastic_mu(k,j,i) - mu_i1jk = sab % inelastic_mu(k,j,i+1) - - ! Cosine of angle between incoming and outgoing neutron - mu = (1 - f)*mu_ijk + f*mu_i1jk - - else if (sab % secondary_mode == SAB_SECONDARY_CONT) then - ! Continuous secondary energy - this is to be similar to - ! Law 61 interpolation on outgoing energy - - ! Sample between ith and (i+1)th bin - r = prn() - if (f > r) then - l = i + 1 - else - l = i - end if - - ! Determine endpoints on grid i - n_energy_out = sab % inelastic_data(i) % n_e_out - E_i_1 = sab % inelastic_data(i) % e_out(1) - E_i_J = sab % inelastic_data(i) % e_out(n_energy_out) - - ! Determine endpoints on grid i + 1 - n_energy_out = sab % inelastic_data(i + 1) % n_e_out - E_i1_1 = sab % inelastic_data(i + 1) % e_out(1) - E_i1_J = sab % inelastic_data(i + 1) % e_out(n_energy_out) - - E_1 = E_i_1 + f * (E_i1_1 - E_i_1) - E_J = E_i_J + f * (E_i1_J - E_i_J) - - ! Determine outgoing energy bin - ! (First reset n_energy_out to the right value) - n_energy_out = sab % inelastic_data(l) % n_e_out - r1 = prn() - c_j = sab % inelastic_data(l) % e_out_cdf(1) - do j = 1, n_energy_out - 1 - c_j1 = sab % inelastic_data(l) % e_out_cdf(j + 1) - if (r1 < c_j1) exit - c_j = c_j1 - end do - - ! check to make sure k is <= n_energy_out - 1 - j = min(j, n_energy_out - 1) - - ! Get the data to interpolate between - E_l_j = sab % inelastic_data(l) % e_out(j) - p_l_j = sab % inelastic_data(l) % e_out_pdf(j) - - ! Next part assumes linear-linear interpolation in standard - E_l_j1 = sab % inelastic_data(l) % e_out(j + 1) - p_l_j1 = sab % inelastic_data(l) % e_out_pdf(j + 1) - - ! Find secondary energy (variable E) - frac = (p_l_j1 - p_l_j) / (E_l_j1 - E_l_j) - if (frac == ZERO) then - E = E_l_j + (r1 - c_j) / p_l_j - else - E = E_l_j + (sqrt(max(ZERO, p_l_j * p_l_j + & - TWO * frac * (r1 - c_j))) - p_l_j) / frac - end if - - ! Now interpolate between incident energy bins i and i + 1 - if (l == i) then - E = E_1 + (E - E_i_1) * (E_J - E_1) / (E_i_J - E_i_1) - else - E = E_1 + (E - E_i1_1) * (E_J - E_1) / (E_i1_J - E_i1_1) - end if - - ! Find angular distribution for closest outgoing energy bin - if (r1 - c_j < c_j1 - r1) then - j = j - else - j = j + 1 - end if - - ! Sample outgoing cosine bin - k = 1 + int(prn() * sab % n_inelastic_mu) - - ! Will use mu from the randomly chosen incoming and closest outgoing - ! energy bins - mu = sab % inelastic_data(l) % mu(k, j) + ! Outgoing energy is same as incoming energy -- no need to do anything else - call fatal_error("Invalid secondary energy mode on S(a,b) table " & - &// trim(sab % name)) - end if ! (inelastic secondary energy treatment) - end if ! (elastic or inelastic) + ! Perform inelastic calculations + + ! Get index and interpolation factor for inelastic grid + if (E < sab % inelastic_e_in(1)) then + i = 1 + f = ZERO + else + i = binary_search(sab % inelastic_e_in, sab % n_inelastic_e_in, E) + f = (E - sab%inelastic_e_in(i)) / & + (sab%inelastic_e_in(i+1) - sab%inelastic_e_in(i)) + end if + + ! Now that we have an incoming energy bin, we need to determine the + ! outgoing energy bin. This will depend on the "secondary energy + ! mode". If the mode is 0, then the outgoing energy bin is chosen from a + ! set of equally-likely bins. If the mode is 1, then the first + ! two and last two bins are skewed to have lower probabilities than the + ! other bins (0.1 for the first and last bins and 0.4 for the second and + ! second to last bins, relative to a normal bin probability of 1). + ! Finally, if the mode is 2, then a continuous distribution (with + ! accompanying PDF and CDF is utilized) + + if ((sab_tables(i_sab) % secondary_mode == SAB_SECONDARY_EQUAL) .or. & + (sab_tables(i_sab) % secondary_mode == SAB_SECONDARY_SKEWED)) then + if (sab_tables(i_sab) % secondary_mode == SAB_SECONDARY_EQUAL) then + ! All bins equally likely + + j = 1 + int(prn() * sab % n_inelastic_e_out) + elseif (sab_tables(i_sab) % secondary_mode == SAB_SECONDARY_SKEWED) then + ! Distribution skewed away from edge points + + ! Determine number of outgoing energy and angle bins + n_energy_out = sab % n_inelastic_e_out + + r = prn() * (n_energy_out - 3) + if (r > ONE) then + ! equally likely N-4 middle bins + j = int(r) + 2 + elseif (r > 0.6_8) then + ! second to last bin has relative probability of 0.4 + j = n_energy_out - 1 + elseif (r > HALF) then + ! last bin has relative probability of 0.1 + j = n_energy_out + elseif (r > 0.1_8) then + ! second bin has relative probability of 0.4 + j = 2 + else + ! first bin has relative probability of 0.1 + j = 1 + end if + end if + + ! Determine outgoing energy corresponding to E_in(i) and E_in(i+1) + E_ij = sab % inelastic_e_out(j,i) + E_i1j = sab % inelastic_e_out(j,i+1) + + ! Outgoing energy + E = (1 - f)*E_ij + f*E_i1j + + ! Sample outgoing cosine bin + k = 1 + int(prn() * sab % n_inelastic_mu) + + ! Determine outgoing cosine corresponding to E_in(i) and E_in(i+1) + mu_ijk = sab % inelastic_mu(k,j,i) + mu_i1jk = sab % inelastic_mu(k,j,i+1) + + ! Cosine of angle between incoming and outgoing neutron + mu = (1 - f)*mu_ijk + f*mu_i1jk + + else if (sab_tables(i_sab) % secondary_mode == SAB_SECONDARY_CONT) then + ! Continuous secondary energy - this is to be similar to + ! Law 61 interpolation on outgoing energy + + ! Sample between ith and (i+1)th bin + r = prn() + if (f > r) then + l = i + 1 + else + l = i + end if + + ! Determine endpoints on grid i + n_energy_out = sab % inelastic_data(i) % n_e_out + E_i_1 = sab % inelastic_data(i) % e_out(1) + E_i_J = sab % inelastic_data(i) % e_out(n_energy_out) + + ! Determine endpoints on grid i + 1 + n_energy_out = sab % inelastic_data(i + 1) % n_e_out + E_i1_1 = sab % inelastic_data(i + 1) % e_out(1) + E_i1_J = sab % inelastic_data(i + 1) % e_out(n_energy_out) + + E_1 = E_i_1 + f * (E_i1_1 - E_i_1) + E_J = E_i_J + f * (E_i1_J - E_i_J) + + ! Determine outgoing energy bin + ! (First reset n_energy_out to the right value) + n_energy_out = sab % inelastic_data(l) % n_e_out + r1 = prn() + c_j = sab % inelastic_data(l) % e_out_cdf(1) + do j = 1, n_energy_out - 1 + c_j1 = sab % inelastic_data(l) % e_out_cdf(j + 1) + if (r1 < c_j1) exit + c_j = c_j1 + end do + + ! check to make sure k is <= n_energy_out - 1 + j = min(j, n_energy_out - 1) + + ! Get the data to interpolate between + E_l_j = sab % inelastic_data(l) % e_out(j) + p_l_j = sab % inelastic_data(l) % e_out_pdf(j) + + ! Next part assumes linear-linear interpolation in standard + E_l_j1 = sab % inelastic_data(l) % e_out(j + 1) + p_l_j1 = sab % inelastic_data(l) % e_out_pdf(j + 1) + + ! Find secondary energy (variable E) + frac = (p_l_j1 - p_l_j) / (E_l_j1 - E_l_j) + if (frac == ZERO) then + E = E_l_j + (r1 - c_j) / p_l_j + else + E = E_l_j + (sqrt(max(ZERO, p_l_j * p_l_j + & + TWO * frac * (r1 - c_j))) - p_l_j) / frac + end if + + ! Now interpolate between incident energy bins i and i + 1 + if (l == i) then + E = E_1 + (E - E_i_1) * (E_J - E_1) / (E_i_J - E_i_1) + else + E = E_1 + (E - E_i1_1) * (E_J - E_1) / (E_i1_J - E_i1_1) + end if + + ! Find angular distribution for closest outgoing energy bin + if (r1 - c_j < c_j1 - r1) then + j = j + else + j = j + 1 + end if + + ! Sample outgoing cosine bin + k = 1 + int(prn() * sab % n_inelastic_mu) + + ! Will use mu from the randomly chosen incoming and closest outgoing + ! energy bins + mu = sab % inelastic_data(l) % mu(k, j) + + else + call fatal_error("Invalid secondary energy mode on S(a,b) table " & + // trim(sab_tables(i_sab) % name)) + end if ! (inelastic secondary energy treatment) + end if ! (elastic or inelastic) + end associate ! Because of floating-point roundoff, it may be possible for mu to be ! outside of the range [-1,1). In these cases, we just set mu to exactly @@ -741,19 +759,19 @@ contains ! implemented here. !=============================================================================== - subroutine sample_target_velocity(nuc, v_target, E, uvw, v_neut, wgt, xs_eff) + subroutine sample_target_velocity(nuc, v_target, E, uvw, v_neut, wgt, xs_eff, kT) type(Nuclide), intent(in) :: nuc ! target nuclide at temperature T real(8), intent(out) :: v_target(3) ! target velocity - real(8), intent(in) :: v_neut(3) ! neutron velocity real(8), intent(in) :: E ! particle energy real(8), intent(in) :: uvw(3) ! direction cosines + real(8), intent(in) :: v_neut(3) ! neutron velocity real(8), intent(inout) :: wgt ! particle weight + real(8), intent(in) :: xs_eff ! effective elastic xs at temperature T + real(8), intent(in) :: kT ! equilibrium temperature of target in MeV real(8) :: awr ! target/neutron mass ratio - real(8) :: kT ! equilibrium temperature of target in MeV real(8) :: E_rel ! trial relative energy real(8) :: xs_0K ! 0K xs at E_rel - real(8) :: xs_eff ! effective elastic xs at temperature T real(8) :: wcf ! weight correction factor real(8) :: E_red ! reduced energy (same as used by Cullen in SIGMA1) real(8) :: E_low ! lowest practical relative energy @@ -782,7 +800,6 @@ contains character(80) :: sampling_scheme ! method of target velocity sampling - kT = nuc % kT awr = nuc % awr ! check if nuclide is a resonant scatterer @@ -817,12 +834,12 @@ contains case ('cxs') ! sample target velocity with the constant cross section (cxs) approx. - call sample_cxs_target_velocity(nuc, v_target, E, uvw) + call sample_cxs_target_velocity(nuc, v_target, E, uvw, kT) case ('wcm') ! sample target velocity with the constant cross section (cxs) approx. - call sample_cxs_target_velocity(nuc, v_target, E, uvw) + call sample_cxs_target_velocity(nuc, v_target, E, uvw, kT) ! adjust weight as prescribed by the weight correction method (wcm) E_rel = dot_product((v_neut - v_target), (v_neut - v_target)) @@ -874,7 +891,7 @@ contains do ! sample target velocity with the constant cross section (cxs) approx. - call sample_cxs_target_velocity(nuc, v_target, E, uvw) + call sample_cxs_target_velocity(nuc, v_target, E, uvw, kT) ! perform Doppler broadening rejection correction (dbrc) E_rel = dot_product((v_neut - v_target), (v_neut - v_target)) @@ -986,13 +1003,13 @@ contains ! can be found in FRA-TM-123. !=============================================================================== - subroutine sample_cxs_target_velocity(nuc, v_target, E, uvw) + subroutine sample_cxs_target_velocity(nuc, v_target, E, uvw, kT) type(Nuclide), intent(in) :: nuc ! target nuclide at temperature real(8), intent(out) :: v_target(3) real(8), intent(in) :: E real(8), intent(in) :: uvw(3) + real(8), intent(in) :: kT ! equilibrium temperature of target in MeV - real(8) :: kT ! equilibrium temperature of target in MeV real(8) :: awr ! target/neutron mass ratio real(8) :: alpha ! probability of sampling f2 over f1 real(8) :: mu ! cosine of angle between neutron and target vel @@ -1004,7 +1021,6 @@ contains real(8) :: beta_vt_sq ! (beta * speed of target)^2 real(8) :: vt ! speed of target - kT = nuc % kT awr = nuc % awr beta_vn = sqrt(awr * E / kT) diff --git a/src/reaction_header.F90 b/src/reaction_header.F90 index c0501d43ea..a7896e9ff3 100644 --- a/src/reaction_header.F90 +++ b/src/reaction_header.F90 @@ -7,6 +7,7 @@ module reaction_header use hdf5_interface, only: read_attribute, open_group, close_group, & open_dataset, read_dataset, close_dataset, get_shape use product_header, only: ReactionProduct + use stl_vector, only: VectorInt use string, only: to_str, starts_with implicit none @@ -16,12 +17,16 @@ module reaction_header ! distributions for a single reaction in a continuous-energy ACE-format table !=============================================================================== + type TemperatureXS + integer :: threshold ! Energy grid index of threshold + real(8), allocatable :: value(:) ! Cross section values + end type TemperatureXS + type Reaction integer :: MT ! ENDF MT value real(8) :: Q_value ! Reaction Q value - integer :: threshold ! Energy grid index of threshold logical :: scatter_in_cm ! scattering system in center-of-mass? - real(8), allocatable :: sigma(:) ! Cross section values + type(TemperatureXS), allocatable :: xs(:) type(ReactionProduct), allocatable :: products(:) contains procedure :: from_hdf5 => reaction_from_hdf5 @@ -29,10 +34,10 @@ module reaction_header contains - subroutine reaction_from_hdf5(this, group_id, temperature) + subroutine reaction_from_hdf5(this, group_id, temperatures) class(Reaction), intent(inout) :: this integer(HID_T), intent(in) :: group_id - character(6), intent(in) :: temperature + type(VectorInt), intent(in) :: temperatures integer :: i integer :: cm @@ -42,11 +47,12 @@ contains integer :: n_links integer :: hdf5_err integer(HID_T) :: pgroup - integer(HID_T) :: xs, xs_group + integer(HID_T) :: xs, temp_group integer(SIZE_T) :: name_len integer(HSIZE_T) :: dims(1) integer(HSIZE_T) :: j character(MAX_WORD_LEN) :: name + character(MAX_WORD_LEN) :: temp_str ! temperature dataset name, e.g. '294K' call read_attribute(this % Q_value, group_id, 'Q_value') call read_attribute(this % MT, group_id, 'mt') @@ -54,14 +60,18 @@ contains this % scatter_in_cm = (cm == 1) ! Read cross section and threshold_idx data - xs_group = open_group(group_id, temperature) - xs = open_dataset(xs_group, 'xs') - call read_attribute(this % threshold, xs, 'threshold_idx') - call get_shape(xs, dims) - allocate(this % sigma(dims(1))) - call read_dataset(this % sigma, xs) - call close_dataset(xs) - call close_group(xs_group) + allocate(this % xs(temperatures % size())) + do i = 1, temperatures % size() + temp_str = trim(to_str(temperatures % data(i))) // "K" + temp_group = open_group(group_id, temp_str) + xs = open_dataset(temp_group, 'xs') + call read_attribute(this % xs(i) % threshold, xs, 'threshold_idx') + call get_shape(xs, dims) + allocate(this % xs(i) % value(dims(1))) + call read_dataset(this % xs(i) % value, xs) + call close_dataset(xs) + call close_group(temp_group) + end do ! Determine number of products call h5gget_info_f(group_id, storage_type, n_links, max_corder, hdf5_err) diff --git a/src/relaxng/materials.rnc b/src/relaxng/materials.rnc index 4d1b217db0..c5f4efd6f3 100644 --- a/src/relaxng/materials.rnc +++ b/src/relaxng/materials.rnc @@ -4,7 +4,7 @@ element materials { (element name { xsd:string { maxLength="52" } } | attribute name { xsd:string { maxLength="52" } })? & - element temperature { xsd:string { maxLength = "6" } }? & + element temperature { xsd:double }? & element density { (element value { xsd:double } | attribute value { xsd:double })? & @@ -41,7 +41,5 @@ element materials { element sab { (element name { xsd:string } | attribute name { xsd:string }) }* - }+ & - - element default_temperature { xsd:string { maxLength = "6" } }? + }+ } diff --git a/src/relaxng/materials.rng b/src/relaxng/materials.rng index 20b7b86ecb..3c92dc94a4 100644 --- a/src/relaxng/materials.rng +++ b/src/relaxng/materials.rng @@ -1,197 +1,186 @@ - - - - + + + + + + + + + + + + - - + + + 52 + - - + + + 52 + - + + + + + + + + + + + + + + + + + + - + - 52 + 10 - + - 52 + 10 - - - - - 6 - - - - + + + + + + + + + + + + - - + + + data + iso-in-lab + - - + + + data + iso-in-lab + - - - 10 - - - - - 10 - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - data - iso-in-lab - - - - - data - iso-in-lab - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - + + 2 + - + + 2 + - - - - - + - - - 2 - + + + data + iso-in-lab + - - - 2 - + + + data + iso-in-lab + - - - - - data - iso-in-lab - - - - - data - iso-in-lab - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - 6 - - - - + + + + + + + + + + + + + + + + + + diff --git a/src/relaxng/settings.rnc b/src/relaxng/settings.rnc index c554dfa753..70550a40f7 100644 --- a/src/relaxng/settings.rnc +++ b/src/relaxng/settings.rnc @@ -128,6 +128,12 @@ element settings { element survival_biasing { xsd:boolean }? & + element temperature_default { xsd:double }? & + + element temperature_method { xsd:string }? & + + element temperature_tolerance { xsd:double }? & + element threads { xsd:positiveInteger }? & element trace { list { xsd:positiveInteger+ } }? & diff --git a/src/relaxng/settings.rng b/src/relaxng/settings.rng index 0719bcbc66..246c78e68d 100644 --- a/src/relaxng/settings.rng +++ b/src/relaxng/settings.rng @@ -565,6 +565,21 @@ + + + + + + + + + + + + + + + diff --git a/src/sab_header.F90 b/src/sab_header.F90 index 5facd3fc3f..c8619efa32 100644 --- a/src/sab_header.F90 +++ b/src/sab_header.F90 @@ -2,14 +2,17 @@ module sab_header use, intrinsic :: ISO_FORTRAN_ENV + use algorithm, only: find, sort use constants + use dict_header, only: DictIntInt use distribution_univariate, only: Tabular - use error, only: warning + use error, only: warning, fatal_error use hdf5, only: HID_T, HSIZE_T, SIZE_T use h5lt, only: h5ltpath_valid_f, h5iget_name_f use hdf5_interface, only: read_attribute, get_shape, open_group, close_group, & open_dataset, read_dataset, close_dataset, get_datasets use secondary_correlated, only: CorrelatedAngleEnergy + use stl_vector, only: VectorInt, VectorReal use string, only: to_str, str_to_int implicit none @@ -33,13 +36,7 @@ module sab_header ! of light isotopes such as water, graphite, Be, etc !=============================================================================== - type SAlphaBeta - character(100) :: name ! name of table, e.g. lwtr.10t - real(8) :: awr ! weight of nucleus in neutron masses - real(8) :: kT ! temperature in MeV (k*T) - integer :: n_zaid ! Number of valid zaids - integer, allocatable :: zaid(:) ! List of valid Z and A identifiers, e.g. 6012 - + type SabData ! threshold for S(a,b) treatment (usually ~4 eV) real(8) :: threshold_inelastic real(8) :: threshold_elastic = ZERO @@ -48,7 +45,6 @@ module sab_header integer :: n_inelastic_e_in ! # of incoming E for inelastic integer :: n_inelastic_e_out ! # of outgoing E for inelastic integer :: n_inelastic_mu ! # of outgoing angles for inelastic - integer :: secondary_mode ! secondary mode (equal/skewed/continuous) real(8), allocatable :: inelastic_e_in(:) real(8), allocatable :: inelastic_sigma(:) ! The following are used only if secondary_mode is 0 or 1 @@ -67,101 +63,35 @@ module sab_header real(8), allocatable :: elastic_e_in(:) real(8), allocatable :: elastic_P(:) real(8), allocatable :: elastic_mu(:,:) + end type SabData + + type SAlphaBeta + character(100) :: name ! name of table, e.g. lwtr.10t + real(8) :: awr ! weight of nucleus in neutron masses + real(8), allocatable :: kTs(:) ! temperatures in MeV (k*T) + character(10), allocatable :: nuclides(:) ! List of valid nuclides + integer :: secondary_mode ! secondary mode (equal/skewed/continuous) + + ! cross sections and distributions at each temperature + type(SabData), allocatable :: data(:) contains - procedure :: print => salphabeta_print procedure :: from_hdf5 => salphabeta_from_hdf5 end type SAlphaBeta contains -!=============================================================================== -! PRINT_SAB_TABLE displays information about a S(a,b) table containing data -! describing thermal scattering from bound materials such as hydrogen in water. -!=============================================================================== - - subroutine salphabeta_print(this, unit) - class(SAlphaBeta), intent(in) :: this - integer, intent(in), optional :: unit - - integer :: size_sab ! memory used by S(a,b) table - integer :: unit_ ! unit to write to - integer :: i ! Loop counter for parsing through this % zaid - integer :: char_count ! Counter for the number of characters on a line - - ! set default unit for writing information - if (present(unit)) then - unit_ = unit - else - unit_ = OUTPUT_UNIT - end if - - ! Basic S(a,b) table information - write(unit_,*) 'S(a,b) Table ' // trim(this % name) - write(unit_,'(A)',advance="no") ' zaids = ' - ! Initialize the counter based on the above string - char_count = 11 - do i = 1, this % n_zaid - ! Deal with a line thats too long - if (char_count >= 73) then ! 73 = 80 - (5 ZAID chars + 1 space + 1 comma) - ! End the line - write(unit_,*) "" - ! Add 11 leading blanks - write(unit_,'(A)', advance="no") " " - ! reset the counter to 11 - char_count = 11 - end if - if (i < this % n_zaid) then - ! Include a comma - write(unit_,'(A)',advance="no") trim(to_str(this % zaid(i))) // ", " - char_count = char_count + len(trim(to_str(this % zaid(i)))) + 2 - else - ! Don't include a comma, since we are all done - write(unit_,'(A)',advance="no") trim(to_str(this % zaid(i))) - end if - - end do - write(unit_,*) "" ! Move to next line - write(unit_,*) ' awr = ' // trim(to_str(this % awr)) - write(unit_,*) ' kT = ' // trim(to_str(this % kT)) - - ! Inelastic data - write(unit_,*) ' # of Incoming Energies (Inelastic) = ' // & - trim(to_str(this % n_inelastic_e_in)) - write(unit_,*) ' # of Outgoing Energies (Inelastic) = ' // & - trim(to_str(this % n_inelastic_e_out)) - write(unit_,*) ' # of Outgoing Angles (Inelastic) = ' // & - trim(to_str(this % n_inelastic_mu)) - write(unit_,*) ' Threshold for Inelastic = ' // & - trim(to_str(this % threshold_inelastic)) - - ! Elastic data - if (this % n_elastic_e_in > 0) then - write(unit_,*) ' # of Incoming Energies (Elastic) = ' // & - trim(to_str(this % n_elastic_e_in)) - write(unit_,*) ' # of Outgoing Angles (Elastic) = ' // & - trim(to_str(this % n_elastic_mu)) - write(unit_,*) ' Threshold for Elastic = ' // & - trim(to_str(this % threshold_elastic)) - end if - - ! Determine memory used by S(a,b) table and write out - size_sab = 8 * (this % n_inelastic_e_in * (2 + this % n_inelastic_e_out * & - (1 + this % n_inelastic_mu)) + this % n_elastic_e_in * & - (2 + this % n_elastic_mu)) - write(unit_,*) ' Memory Used = ' // trim(to_str(size_sab)) // ' bytes' - - ! Blank line at end - write(unit_,*) - - end subroutine salphabeta_print - - subroutine salphabeta_from_hdf5(this, group_id, temperature) + subroutine salphabeta_from_hdf5(this, group_id, temperature, tolerance) class(SAlphaBeta), intent(inout) :: this integer(HID_T), intent(in) :: group_id - character(6), intent(in) :: temperature + type(VectorReal), intent(in) :: temperature ! list of temperatures + real(8), intent(in) :: tolerance integer :: i, j + integer :: n + integer :: t integer :: n_energy, n_energy_out, n_mu + integer :: i_closest + integer :: n_temperature integer :: hdf5_err integer(SIZE_T) :: name_len, name_file_len integer(HID_T) :: T_group @@ -175,10 +105,13 @@ contains character(20) :: type logical :: exists type(CorrelatedAngleEnergy) :: correlated_dist - character(MAX_FILE_LEN), allocatable :: temperatures(:) - integer, allocatable :: temperatures_integer(:) - character(6) :: my_temperature - integer :: temperature_integer + + character(MAX_WORD_LEN) :: temp_str + character(MAX_FILE_LEN), allocatable :: dset_names(:) + real(8), allocatable :: temps_available(:) ! temperatures available + real(8) :: temp_desired + real(8) :: temp_actual + type(VectorInt) :: temps_to_read ! Get name of table from group name_len = len(this % name) @@ -188,7 +121,7 @@ contains this % name = trim(this % name(2:)) call read_attribute(this % awr, group_id, 'atomic_weight_ratio') - call read_attribute(this % zaid, group_id, 'zaids') + call read_attribute(this % nuclides, group_id, 'nuclides') call read_attribute(type, group_id, 'secondary_mode') select case (type) case ('equal') @@ -198,168 +131,185 @@ contains case ('continuous') this % secondary_mode = SAB_SECONDARY_CONT end select - this % n_zaid = size(this % zaid) + + ! Read temperatures kT_group = open_group(group_id, 'kTs') - ! Before accessing the temperature data, see if the user-provied temperature - ! exists. We can find this out by looking at the datasets within kT_group - temperature_integer = & - str_to_int(temperature(1: len_trim(adjustl(temperature)) - 1)) - call get_datasets(kT_group, temperatures) - allocate(temperatures_integer(size(temperatures))) - do i = 1, size(temperatures) - temperatures_integer(i) = & - str_to_int(temperatures(i)(1: len_trim(adjustl(temperatures(i))) - 1)) + ! Determine temperatures available + call get_datasets(kT_group, dset_names) + allocate(temps_available(size(dset_names))) + do i = 1, size(dset_names) + ! Read temperature value + call read_dataset(temps_available(i), kT_group, trim(dset_names(i))) + temps_available(i) = temps_available(i) / K_BOLTZMANN end do - my_temperature = & - temperatures(minloc(abs(temperature_integer - temperatures_integer), & - dim=1)) - ! Now print a warning if there is no matching temperature and then use the - ! closest temperature - if (temperature /= my_temperature) then - if (temperature == '0K') then - call warning(trim(this % name) // " does not contain 0K data & - &needed for the resonance scattering options selected") + ! Determine actual temperatures to read + TEMP_LOOP: do i = 1, temperature % size() + temp_desired = temperature % data(i) + i_closest = minloc(abs(temps_available - temp_desired), dim=1) + temp_actual = temps_available(i_closest) + if (abs(temp_actual - temp_desired) < tolerance) then + if (find(temps_to_read, nint(temp_actual)) == -1) then + call temps_to_read % push_back(nint(temp_actual)) + end if else - call warning(trim(this % name) // " does not contain data at a & - &temperature of " // trim(temperature) // "; using the & - &nearest available temperature of " // trim(my_temperature)) + call fatal_error("Nuclear data library does not contain cross sections & + &for " // trim(this % name) // " at or near " // & + trim(to_str(nint(temp_desired))) // " K.") end if - end if + end do TEMP_LOOP - kT_dset = open_dataset(kT_group, my_temperature) - call read_dataset(this % kT, kT_dset) - call close_dataset(kT_dset) - call close_group(kT_group) + ! TODO: If using interpolation, add a block to add bounding temperatures for + ! each - ! Open my_temperature group - T_group = open_group(group_id, my_temperature) + ! Sort temperatures to read + call sort(temps_to_read) - ! Coherent elastic data - call h5ltpath_valid_f(T_group, 'elastic', .true., exists, hdf5_err) - if (exists) then - ! Read cross section data - elastic_group = open_group(T_group, 'elastic') - dset_id = open_dataset(elastic_group, 'xs') - call read_attribute(type, dset_id, 'type') - call get_shape(dset_id, dims2) - allocate(temp(dims2(1), dims2(2))) - call read_dataset(temp, dset_id) - call close_dataset(dset_id) + n_temperature = temps_to_read % size() + allocate(this % kTs(n_temperature)) + allocate(this % data(n_temperature)) - ! Set cross section data and type - this % n_elastic_e_in = int(dims2(1), 4) - allocate(this % elastic_e_in(this % n_elastic_e_in)) - allocate(this % elastic_P(this % n_elastic_e_in)) - this % elastic_e_in(:) = temp(:, 1) - this % elastic_P(:) = temp(:, 2) - select case (type) - case ('tab1') - this % elastic_mode = SAB_ELASTIC_DISCRETE - case ('bragg') - this % elastic_mode = SAB_ELASTIC_EXACT - end select - deallocate(temp) + do t = 1, n_temperature + ! Get temperature as a string + temp_str = trim(to_str(temps_to_read % data(t))) // "K" - ! Set elastic threshold - this % threshold_elastic = this % elastic_e_in(this % n_elastic_e_in) + ! Read exact temperature value + call read_dataset(this % kTs(t), kT_group, temp_str) - ! Read angle distribution - if (this % elastic_mode /= SAB_ELASTIC_EXACT) then - dset_id = open_dataset(elastic_group, 'mu_out') + ! Open group for temperature i + T_group = open_group(group_id, temp_str) + + ! Coherent elastic data + call h5ltpath_valid_f(T_group, 'elastic', .true., exists, hdf5_err) + if (exists) then + ! Read cross section data + elastic_group = open_group(T_group, 'elastic') + dset_id = open_dataset(elastic_group, 'xs') + call read_attribute(type, dset_id, 'type') call get_shape(dset_id, dims2) - this % n_elastic_mu = int(dims2(1), 4) - allocate(this % elastic_mu(dims2(1), dims2(2))) - call read_dataset(this % elastic_mu, dset_id) + allocate(temp(dims2(1), dims2(2))) + call read_dataset(temp, dset_id) call close_dataset(dset_id) - end if - call close_group(elastic_group) - end if + ! Set cross section data and type + this % data(t) % n_elastic_e_in = int(dims2(1), 4) + allocate(this % data(t) % elastic_e_in(this % data(t) % n_elastic_e_in)) + allocate(this % data(t) % elastic_P(this % data(t) % n_elastic_e_in)) + this % data(t) % elastic_e_in(:) = temp(:, 1) + this % data(t) % elastic_P(:) = temp(:, 2) + select case (type) + case ('tab1') + this % data(t) % elastic_mode = SAB_ELASTIC_DISCRETE + case ('bragg') + this % data(t) % elastic_mode = SAB_ELASTIC_EXACT + end select + deallocate(temp) - ! Inelastic data - call h5ltpath_valid_f(T_group, 'inelastic', .true., exists, hdf5_err) - if (exists) then - ! Read type of inelastic data - inelastic_group = open_group(T_group, 'inelastic') - - ! Read cross section data - dset_id = open_dataset(inelastic_group, 'xs') - call get_shape(dset_id, dims2) - allocate(temp(dims2(1), dims2(2))) - call read_dataset(temp, dset_id) - call close_dataset(dset_id) - - ! Set cross section data - this % n_inelastic_e_in = int(dims2(1), 4) - allocate(this % inelastic_e_in(this % n_inelastic_e_in)) - allocate(this % inelastic_sigma(this % n_inelastic_e_in)) - this % inelastic_e_in(:) = temp(:, 1) - this % inelastic_sigma(:) = temp(:, 2) - deallocate(temp) - - ! Set inelastic threshold - this % threshold_inelastic = this % inelastic_e_in(this % n_inelastic_e_in) - - if (this % secondary_mode /= SAB_SECONDARY_CONT) then - ! Read energy distribution - dset_id = open_dataset(inelastic_group, 'energy_out') - call get_shape(dset_id, dims2) - this % n_inelastic_e_out = int(dims2(1), 4) - allocate(this % inelastic_e_out(dims2(1), dims2(2))) - call read_dataset(this % inelastic_e_out, dset_id) - call close_dataset(dset_id) + ! Set elastic threshold + this % data(t) % threshold_elastic = this % data(t) % elastic_e_in(& + this % data(t) % n_elastic_e_in) ! Read angle distribution - dset_id = open_dataset(inelastic_group, 'mu_out') - call get_shape(dset_id, dims3) - this % n_inelastic_mu = int(dims3(1), 4) - allocate(this % inelastic_mu(dims3(1), dims3(2), dims3(3))) - call read_dataset(this % inelastic_mu, dset_id) - call close_dataset(dset_id) - else - ! Read correlated angle-energy distribution - call correlated_dist % from_hdf5(inelastic_group) + if (this % data(t) % elastic_mode /= SAB_ELASTIC_EXACT) then + dset_id = open_dataset(elastic_group, 'mu_out') + call get_shape(dset_id, dims2) + this % data(t) % n_elastic_mu = int(dims2(1), 4) + allocate(this % data(t) % elastic_mu(dims2(1), dims2(2))) + call read_dataset(this % data(t) % elastic_mu, dset_id) + call close_dataset(dset_id) + end if - ! Convert to S(a,b) native format - n_energy = size(correlated_dist % energy) - allocate(this % inelastic_data(n_energy)) - do i = 1, n_energy - associate (edist => correlated_dist % distribution(i)) - ! Get number of outgoing energies for incoming energy i - n_energy_out = size(edist % e_out) - this % inelastic_data(i) % n_e_out = n_energy_out - allocate(this % inelastic_data(i) % e_out(n_energy_out)) - allocate(this % inelastic_data(i) % e_out_pdf(n_energy_out)) - allocate(this % inelastic_data(i) % e_out_cdf(n_energy_out)) - - ! Copy outgoing energy distribution - this % inelastic_data(i) % e_out(:) = edist % e_out - this % inelastic_data(i) % e_out_pdf(:) = edist % p - this % inelastic_data(i) % e_out_cdf(:) = edist % c - - do j = 1, n_energy_out - select type (adist => edist % angle(j) % obj) - type is (Tabular) - ! On first pass, allocate space for angles - if (j == 1) then - n_mu = size(adist % x) - this % n_inelastic_mu = n_mu - allocate(this % inelastic_data(i) % mu(n_mu, n_energy_out)) - end if - - ! Copy outgoing angles - this % inelastic_data(i) % mu(:, j) = adist % x - end select - end do - end associate - end do + call close_group(elastic_group) end if - call close_group(inelastic_group) - end if - call close_group(T_group) + ! Inelastic data + call h5ltpath_valid_f(T_group, 'inelastic', .true., exists, hdf5_err) + if (exists) then + ! Read type of inelastic data + inelastic_group = open_group(T_group, 'inelastic') + + ! Read cross section data + dset_id = open_dataset(inelastic_group, 'xs') + call get_shape(dset_id, dims2) + allocate(temp(dims2(1), dims2(2))) + call read_dataset(temp, dset_id) + call close_dataset(dset_id) + + ! Set cross section data + this % data(t) % n_inelastic_e_in = int(dims2(1), 4) + allocate(this % data(t) % inelastic_e_in(this % data(t) % n_inelastic_e_in)) + allocate(this % data(t) % inelastic_sigma(this % data(t) % n_inelastic_e_in)) + this % data(t) % inelastic_e_in(:) = temp(:, 1) + this % data(t) % inelastic_sigma(:) = temp(:, 2) + deallocate(temp) + + ! Set inelastic threshold + this % data(t) % threshold_inelastic = this % data(t) % inelastic_e_in(& + this % data(t) % n_inelastic_e_in) + + if (this % secondary_mode /= SAB_SECONDARY_CONT) then + ! Read energy distribution + dset_id = open_dataset(inelastic_group, 'energy_out') + call get_shape(dset_id, dims2) + this % data(t) % n_inelastic_e_out = int(dims2(1), 4) + allocate(this % data(t) % inelastic_e_out(dims2(1), dims2(2))) + call read_dataset(this % data(t) % inelastic_e_out, dset_id) + call close_dataset(dset_id) + + ! Read angle distribution + dset_id = open_dataset(inelastic_group, 'mu_out') + call get_shape(dset_id, dims3) + this % data(t) % n_inelastic_mu = int(dims3(1), 4) + allocate(this % data(t) % inelastic_mu(dims3(1), dims3(2), dims3(3))) + call read_dataset(this % data(t) % inelastic_mu, dset_id) + call close_dataset(dset_id) + else + ! Read correlated angle-energy distribution + call correlated_dist % from_hdf5(inelastic_group) + + ! Convert to S(a,b) native format + n_energy = size(correlated_dist % energy) + allocate(this % data(t) % inelastic_data(n_energy)) + do i = 1, n_energy + associate (edist => correlated_dist % distribution(i)) + ! Get number of outgoing energies for incoming energy i + n_energy_out = size(edist % e_out) + this % data(t) % inelastic_data(i) % n_e_out = n_energy_out + allocate(this % data(t) % inelastic_data(i) % e_out(n_energy_out)) + allocate(this % data(t) % inelastic_data(i) % e_out_pdf(n_energy_out)) + allocate(this % data(t) % inelastic_data(i) % e_out_cdf(n_energy_out)) + + ! Copy outgoing energy distribution + this % data(t) % inelastic_data(i) % e_out(:) = edist % e_out + this % data(t) % inelastic_data(i) % e_out_pdf(:) = edist % p + this % data(t) % inelastic_data(i) % e_out_cdf(:) = edist % c + + do j = 1, n_energy_out + select type (adist => edist % angle(j) % obj) + type is (Tabular) + ! On first pass, allocate space for angles + if (j == 1) then + n_mu = size(adist % x) + this % data(t) % n_inelastic_mu = n_mu + allocate(this % data(t) % inelastic_data(i) % mu(& + n_mu, n_energy_out)) + end if + + ! Copy outgoing angles + this % data(t) % inelastic_data(i) % mu(:, j) = adist % x + end select + end do + end associate + end do + end if + + call close_group(inelastic_group) + end if + call close_group(T_group) + end do + + call close_group(kT_group) end subroutine salphabeta_from_hdf5 end module sab_header diff --git a/src/summary.F90 b/src/summary.F90 index 5bd440ff31..cc0c517588 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -115,36 +115,31 @@ contains integer :: i character(12), allocatable :: nucnames(:) real(8), allocatable :: awrs(:) - integer, allocatable :: zaids(:) ! Write useful data from nuclide objects nuclide_group = create_group(file_id, "nuclides") call write_dataset(nuclide_group, "n_nuclides_total", n_nuclides_total) - ! Build array of nuclide names, awrs, and zaids + ! Build array of nuclide names and awrs allocate(nucnames(n_nuclides_total)) allocate(awrs(n_nuclides_total)) - allocate(zaids(n_nuclides_total)) do i = 1, n_nuclides_total if (run_CE) then nucnames(i) = nuclides(i) % name awrs(i) = nuclides(i) % awr - zaids(i) = nuclides(i) % zaid else nucnames(i) = nuclides_MG(i) % obj % name awrs(i) = nuclides_MG(i) % obj % awr - zaids(i) = nuclides_MG(i) % obj % zaid end if end do - ! Write nuclide names, awrs and zaids + ! Write nuclide names and awrs call write_dataset(nuclide_group, "names", nucnames) call write_dataset(nuclide_group, "awrs", awrs) - call write_dataset(nuclide_group, "zaids", zaids) call close_group(nuclide_group) - deallocate(nucnames, awrs, zaids) + deallocate(nucnames, awrs) end subroutine write_nuclides @@ -529,9 +524,6 @@ contains ! Write name for this material call write_dataset(material_group, "name", m % name) - ! Write temperature for this material - call write_dataset(material_group, "temperature", m % temperature) - ! Write atom density with units call write_dataset(material_group, "atom_density", m % density) call write_attribute_string(material_group, "atom_density", "units", & diff --git a/src/tally.F90 b/src/tally.F90 index 3ee4702e2f..3cee65b965 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -88,6 +88,7 @@ contains integer :: l ! loop index for nuclides in material integer :: m ! loop index for reactions integer :: q ! loop index for scoring bins + integer :: i_temp ! temperature index integer :: i_nuc ! index in nuclides array (from material) integer :: i_energy ! index in nuclide energy grid integer :: score_bin ! scoring bin, e.g. SCORE_FLUX @@ -887,16 +888,18 @@ contains if (i_nuclide > 0) then if (nuclides(i_nuclide)%reaction_index%has_key(score_bin)) then m = nuclides(i_nuclide)%reaction_index%get_key(score_bin) - associate (rxn => nuclides(i_nuclide) % reactions(m)) - ! Retrieve index on nuclide energy grid and interpolation - ! factor - i_energy = micro_xs(i_nuclide) % index_grid - f = micro_xs(i_nuclide) % interp_factor - if (i_energy >= rxn % threshold) then - score = ((ONE - f) * rxn % sigma(i_energy - & - rxn%threshold + 1) + f * rxn % sigma(i_energy - & - rxn%threshold + 2)) * atom_density * flux + ! Retrieve temperature and energy grid index and interpolation + ! factor + i_temp = micro_xs(i_nuclide) % index_temp + i_energy = micro_xs(i_nuclide) % index_grid + f = micro_xs(i_nuclide) % interp_factor + + associate (xs => nuclides(i_nuclide) % reactions(m) % xs(i_temp)) + if (i_energy >= xs % threshold) then + score = ((ONE - f) * xs % value(i_energy - & + xs % threshold + 1) + f * xs % value(i_energy - & + xs % threshold + 2)) * atom_density * flux end if end associate end if @@ -911,15 +914,18 @@ contains if (nuclides(i_nuc)%reaction_index%has_key(score_bin)) then m = nuclides(i_nuc)%reaction_index%get_key(score_bin) - associate (rxn => nuclides(i_nuc) % reactions(m)) - ! Retrieve index on nuclide energy grid and interpolation - ! factor - i_energy = micro_xs(i_nuc) % index_grid - f = micro_xs(i_nuc) % interp_factor - if (i_energy >= rxn % threshold) then - score = score + ((ONE - f) * rxn % sigma(i_energy - & - rxn%threshold + 1) + f * rxn % sigma(i_energy - & - rxn%threshold + 2)) * atom_density_ * flux + + ! Retrieve temperature and energy grid index and interpolation + ! factor + i_temp = micro_xs(i_nuc) % index_temp + i_energy = micro_xs(i_nuc) % index_grid + f = micro_xs(i_nuc) % interp_factor + + associate (xs => nuclides(i_nuc) % reactions(m) % xs(i_temp)) + if (i_energy >= xs % threshold) then + score = score + ((ONE - f) * xs % value(i_energy - & + xs % threshold + 1) + f * xs % value(i_energy - & + xs % threshold + 2)) * atom_density_ * flux end if end associate end if diff --git a/src/tracking.F90 b/src/tracking.F90 index 69fb78c354..f2613146e4 100644 --- a/src/tracking.F90 +++ b/src/tracking.F90 @@ -84,9 +84,10 @@ contains ! Calculate microscopic and macroscopic cross sections if (run_CE) then - ! If the material is the same as the last material and the energy of the - ! particle hasn't changed, we don't need to lookup cross sections again. - if (p % material /= p % last_material) call calculate_xs(p) + ! If the material is the same as the last material and the temperature + ! hasn't changed, we don't need to lookup cross sections again. + if (p % material /= p % last_material .or. & + p % sqrtkT /= p % last_sqrtkT) call calculate_xs(p) else ! Since the MGXS can be angle dependent, this needs to be done ! After every collision for the MGXS mode diff --git a/tests/test_cmfd_feed/materials.xml b/tests/test_cmfd_feed/materials.xml index f773d83d04..70580e3a8d 100644 --- a/tests/test_cmfd_feed/materials.xml +++ b/tests/test_cmfd_feed/materials.xml @@ -1,9 +1,7 @@ -294K - - + diff --git a/tests/test_cmfd_nofeed/materials.xml b/tests/test_cmfd_nofeed/materials.xml index f773d83d04..70580e3a8d 100644 --- a/tests/test_cmfd_nofeed/materials.xml +++ b/tests/test_cmfd_nofeed/materials.xml @@ -1,9 +1,7 @@ -294K - - + diff --git a/tests/test_complex_cell/materials.xml b/tests/test_complex_cell/materials.xml index 857626d5a6..6edf0a5f9c 100644 --- a/tests/test_complex_cell/materials.xml +++ b/tests/test_complex_cell/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_confidence_intervals/materials.xml b/tests/test_confidence_intervals/materials.xml index e1124a3038..0965c8783c 100644 --- a/tests/test_confidence_intervals/materials.xml +++ b/tests/test_confidence_intervals/materials.xml @@ -2,7 +2,7 @@ - 294K + 294 diff --git a/tests/test_density/materials.xml b/tests/test_density/materials.xml index 53a7b0fcbb..7b49233ed7 100644 --- a/tests/test_density/materials.xml +++ b/tests/test_density/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_eigenvalue_genperbatch/materials.xml b/tests/test_eigenvalue_genperbatch/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_eigenvalue_genperbatch/materials.xml +++ b/tests/test_eigenvalue_genperbatch/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_eigenvalue_no_inactive/materials.xml b/tests/test_eigenvalue_no_inactive/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_eigenvalue_no_inactive/materials.xml +++ b/tests/test_eigenvalue_no_inactive/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_energy_grid/materials.xml b/tests/test_energy_grid/materials.xml index 2946a8d609..87a3b8fe1c 100644 --- a/tests/test_energy_grid/materials.xml +++ b/tests/test_energy_grid/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_energy_grid/settings.xml b/tests/test_energy_grid/settings.xml index f925356a91..1e4b5937b8 100644 --- a/tests/test_energy_grid/settings.xml +++ b/tests/test_energy_grid/settings.xml @@ -1,7 +1,7 @@ - nuclide + 20000 10 diff --git a/tests/test_energy_laws/materials.xml b/tests/test_energy_laws/materials.xml index e7acd32e2b..e63f4018c3 100644 --- a/tests/test_energy_laws/materials.xml +++ b/tests/test_energy_laws/materials.xml @@ -1,6 +1,5 @@ - 294K diff --git a/tests/test_entropy/materials.xml b/tests/test_entropy/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_entropy/materials.xml +++ b/tests/test_entropy/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_filter_distribcell/case-1/materials.xml b/tests/test_filter_distribcell/case-1/materials.xml index afd4b05b76..e7108b477f 100644 --- a/tests/test_filter_distribcell/case-1/materials.xml +++ b/tests/test_filter_distribcell/case-1/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_filter_distribcell/case-2/materials.xml b/tests/test_filter_distribcell/case-2/materials.xml index afd4b05b76..794d410a32 100644 --- a/tests/test_filter_distribcell/case-2/materials.xml +++ b/tests/test_filter_distribcell/case-2/materials.xml @@ -1,9 +1,6 @@ - 294K - - diff --git a/tests/test_filter_distribcell/case-3/materials.xml b/tests/test_filter_distribcell/case-3/materials.xml index f03693e524..5889122717 100644 --- a/tests/test_filter_distribcell/case-3/materials.xml +++ b/tests/test_filter_distribcell/case-3/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_filter_distribcell/case-4/materials.xml b/tests/test_filter_distribcell/case-4/materials.xml index 15cf0c54b9..2eb744fe64 100644 --- a/tests/test_filter_distribcell/case-4/materials.xml +++ b/tests/test_filter_distribcell/case-4/materials.xml @@ -1,7 +1,5 @@ - 294K - diff --git a/tests/test_filter_mesh_2d/materials.xml b/tests/test_filter_mesh_2d/materials.xml index bead58f8b2..8021f5f99e 100644 --- a/tests/test_filter_mesh_2d/materials.xml +++ b/tests/test_filter_mesh_2d/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_filter_mesh_3d/materials.xml b/tests/test_filter_mesh_3d/materials.xml index bead58f8b2..8021f5f99e 100644 --- a/tests/test_filter_mesh_3d/materials.xml +++ b/tests/test_filter_mesh_3d/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_fixed_source/materials.xml b/tests/test_fixed_source/materials.xml index cfd0efd6c3..6e4249da32 100644 --- a/tests/test_fixed_source/materials.xml +++ b/tests/test_fixed_source/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_fixed_source/settings.xml b/tests/test_fixed_source/settings.xml index 8a0ddb251e..1e9b85d5a8 100644 --- a/tests/test_fixed_source/settings.xml +++ b/tests/test_fixed_source/settings.xml @@ -6,6 +6,8 @@ 100 + 294 + diff --git a/tests/test_infinite_cell/materials.xml b/tests/test_infinite_cell/materials.xml index 8bd6c820b3..6acd8df74b 100644 --- a/tests/test_infinite_cell/materials.xml +++ b/tests/test_infinite_cell/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_lattice/materials.xml b/tests/test_lattice/materials.xml index 91772da798..971f5c5480 100644 --- a/tests/test_lattice/materials.xml +++ b/tests/test_lattice/materials.xml @@ -10,8 +10,6 @@ =============================================================== --> - 294K - diff --git a/tests/test_lattice_hex/materials.xml b/tests/test_lattice_hex/materials.xml index 90b79b7b49..c7649fcf9a 100644 --- a/tests/test_lattice_hex/materials.xml +++ b/tests/test_lattice_hex/materials.xml @@ -1,9 +1,7 @@ - 294K - - + @@ -11,7 +9,7 @@ - + @@ -19,7 +17,7 @@ - + @@ -29,7 +27,7 @@ - + diff --git a/tests/test_lattice_mixed/materials.xml b/tests/test_lattice_mixed/materials.xml index 90b79b7b49..c7649fcf9a 100644 --- a/tests/test_lattice_mixed/materials.xml +++ b/tests/test_lattice_mixed/materials.xml @@ -1,9 +1,7 @@ - 294K - - + @@ -11,7 +9,7 @@ - + @@ -19,7 +17,7 @@ - + @@ -29,7 +27,7 @@ - + diff --git a/tests/test_lattice_multiple/materials.xml b/tests/test_lattice_multiple/materials.xml index bead58f8b2..8021f5f99e 100644 --- a/tests/test_lattice_multiple/materials.xml +++ b/tests/test_lattice_multiple/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_multipole/inputs_true.dat b/tests/test_multipole/inputs_true.dat index 5498e68738..930be95361 100644 --- a/tests/test_multipole/inputs_true.dat +++ b/tests/test_multipole/inputs_true.dat @@ -1 +1 @@ -2ad86dbb798ab68b45ca535fed3bd848625e0a2b79c68d11db91b14c74b8a48ed4d0129de7e6f6b6b7e9cb47a55d45aadca5ef535dc8a18cb881dddfc74d0bbb \ No newline at end of file +8462e17d102259b3a48a7e908bc75038a28a19d4a5e8bd38f26579e5baf3998bc2d05d1d3055ac1ed478d0c01bd64868d654919c2e6ca3fea86d79f03eda25ef \ No newline at end of file diff --git a/tests/test_multipole/results_true.dat b/tests/test_multipole/results_true.dat index d138fa16a9..9555a2d536 100644 --- a/tests/test_multipole/results_true.dat +++ b/tests/test_multipole/results_true.dat @@ -1,5 +1,5 @@ k-combined: -1.457760E+00 1.119659E-02 +1.457760E+00 1.119656E-02 Cell ID = 11 Name = diff --git a/tests/test_multipole/test_multipole.py b/tests/test_multipole/test_multipole.py index 812f5b6d0f..a44489aa5a 100644 --- a/tests/test_multipole/test_multipole.py +++ b/tests/test_multipole/test_multipole.py @@ -7,7 +7,6 @@ import openmc from openmc.stats import Box from openmc.source import Source - class MultipoleTestHarness(PyAPITestHarness): def _build_inputs(self): #################### @@ -24,29 +23,20 @@ class MultipoleTestHarness(PyAPITestHarness): dense_fuel.add_nuclide('U235', 1.0) mats_file = openmc.Materials([moderator, dense_fuel]) - mats_file.default_temperature = '294K' mats_file.export_to_xml() - #################### # Geometry #################### - c1 = openmc.Cell(cell_id=1) - c1.fill = moderator - mod_univ = openmc.Universe(universe_id=1) - mod_univ.add_cell(c1) + c1 = openmc.Cell(cell_id=1, fill=moderator) + mod_univ = openmc.Universe(universe_id=1, cells=(c1,)) r0 = openmc.ZCylinder(R=0.3) - c11 = openmc.Cell(cell_id=11) - c11.region = -r0 - c11.fill = dense_fuel + c11 = openmc.Cell(cell_id=11, fill=dense_fuel, region=-r0) c11.temperature = [500, 0, 700, 800] - c12 = openmc.Cell(cell_id=12) - c12.region = +r0 - c12.fill = moderator - fuel_univ = openmc.Universe(universe_id=11) - fuel_univ.add_cells((c11, c12)) + c12 = openmc.Cell(cell_id=12, fill=moderator, region=+r0) + fuel_univ = openmc.Universe(universe_id=11, cells=(c11, c12)) lat = openmc.RectLattice(lattice_id=101) lat.dimension = [2, 2] @@ -61,17 +51,12 @@ class MultipoleTestHarness(PyAPITestHarness): y1 = openmc.YPlane(y0=3.0) for s in [x0, x1, y0, y1]: s.boundary_type = 'reflective' - c101 = openmc.Cell(cell_id=101) - c101.region = +x0 & -x1 & +y0 & -y1 - c101.fill = lat - root_univ = openmc.Universe(universe_id=0) - root_univ.add_cell(c101) + c101 = openmc.Cell(cell_id=101, fill=lat, region=+x0 & -x1 & +y0 & -y1) + root_univ = openmc.Universe(universe_id=0, cells=(c101,)) - geometry = openmc.Geometry() - geometry.root_universe = root_univ + geometry = openmc.Geometry(root_univ) geometry.export_to_xml() - #################### # Settings #################### @@ -82,10 +67,9 @@ class MultipoleTestHarness(PyAPITestHarness): sets_file.particles = 1000 sets_file.source = Source(space=Box([-1, -1, -1], [1, 1, 1])) sets_file.output = {'summary': True} - sets_file.use_windowed_multipole=True + sets_file.temperature = {'method': 'multipole'} sets_file.export_to_xml() - #################### # Plots #################### diff --git a/tests/test_natural_element/materials.xml b/tests/test_natural_element/materials.xml index 543b5351d8..6568951f43 100644 --- a/tests/test_natural_element/materials.xml +++ b/tests/test_natural_element/materials.xml @@ -3,8 +3,6 @@ - 294K - diff --git a/tests/test_output/materials.xml b/tests/test_output/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_output/materials.xml +++ b/tests/test_output/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_output/settings.xml b/tests/test_output/settings.xml index fef5e2fcf1..e2f3fc0186 100644 --- a/tests/test_output/settings.xml +++ b/tests/test_output/settings.xml @@ -1,7 +1,7 @@ - + 10 diff --git a/tests/test_output/test_output.py b/tests/test_output/test_output.py index 8e36ead808..81f8f42c8a 100644 --- a/tests/test_output/test_output.py +++ b/tests/test_output/test_output.py @@ -19,10 +19,6 @@ class OutputTestHarness(TestHarness): assert summary[0].endswith('h5'),\ 'Summary file is not a HDF5 file.' - # Check for the cross sections. - assert os.path.exists(os.path.join(os.getcwd(), 'cross_sections.out')),\ - 'Cross section output file does not exist.' - def _cleanup(self): TestHarness._cleanup(self) output = glob.glob(os.path.join(os.getcwd(), 'summary.*')) diff --git a/tests/test_particle_restart_eigval/materials.xml b/tests/test_particle_restart_eigval/materials.xml index 301efd2bd1..3aa37fca6c 100644 --- a/tests/test_particle_restart_eigval/materials.xml +++ b/tests/test_particle_restart_eigval/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_particle_restart_fixed/materials.xml b/tests/test_particle_restart_fixed/materials.xml index 95afc39990..f3851d7ef1 100644 --- a/tests/test_particle_restart_fixed/materials.xml +++ b/tests/test_particle_restart_fixed/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_plot/materials.xml b/tests/test_plot/materials.xml index 0d5ee77cef..90b3542675 100644 --- a/tests/test_plot/materials.xml +++ b/tests/test_plot/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_ptables_off/materials.xml b/tests/test_ptables_off/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_ptables_off/materials.xml +++ b/tests/test_ptables_off/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_quadric_surfaces/materials.xml b/tests/test_quadric_surfaces/materials.xml index baf523b34c..f687683837 100644 --- a/tests/test_quadric_surfaces/materials.xml +++ b/tests/test_quadric_surfaces/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_reflective_plane/materials.xml b/tests/test_reflective_plane/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_reflective_plane/materials.xml +++ b/tests/test_reflective_plane/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_resonance_scattering/inputs_true.dat b/tests/test_resonance_scattering/inputs_true.dat index ba59e03f59..7b515cd1cc 100644 --- a/tests/test_resonance_scattering/inputs_true.dat +++ b/tests/test_resonance_scattering/inputs_true.dat @@ -1 +1 @@ -dea135e820f605cf7a7f8d184330d2dd093cbcd2d53a71198819cb4dc7c455809dbb37eff79538d9b35d19932bd88b555ba833f32d01fa8d5289840b2250f72a \ No newline at end of file +15d4ce20d34fbafc757689f1a1f014c42b25efd1cac6bbefdd284c5c1af8bca264c75055fef719441655a61201d0ef098c82cacaa2aeea2b410d3006e983a942 \ No newline at end of file diff --git a/tests/test_resonance_scattering/test_resonance_scattering.py b/tests/test_resonance_scattering/test_resonance_scattering.py index 0e34a4a4cd..3daf5a3870 100644 --- a/tests/test_resonance_scattering/test_resonance_scattering.py +++ b/tests/test_resonance_scattering/test_resonance_scattering.py @@ -9,16 +9,21 @@ import openmc class ResonanceScatteringTestHarness(PyAPITestHarness): def _build_inputs(self): + # Nuclides + u238 = openmc.Nuclide('U238') + u235 = openmc.Nuclide('U235') + pu239 = openmc.Nuclide('Pu239') + h1 = openmc.Nuclide('H1') + # Materials mat = openmc.Material(material_id=1) mat.set_density('g/cc', 1.0) - mat.add_nuclide('U238', 1.0) - mat.add_nuclide('U235', 0.02) - mat.add_nuclide('Pu239', 0.02) - mat.add_nuclide('H1', 20.0) + mat.add_nuclide(u238, 1.0) + mat.add_nuclide(u235, 0.02) + mat.add_nuclide(pu239, 0.02) + mat.add_nuclide(h1, 20.0) mats_file = openmc.Materials([mat]) - mats_file.default_temperature = '294K' mats_file.export_to_xml() # Geometry @@ -37,29 +42,9 @@ class ResonanceScatteringTestHarness(PyAPITestHarness): geometry.export_to_xml() # Settings - nuclide = openmc.Nuclide('U238') - res_scatt_dbrc = openmc.ResonanceScattering() - res_scatt_dbrc.nuclide = nuclide - res_scatt_dbrc.nuclide_0K = nuclide # This is a bad idea! Just for tests - res_scatt_dbrc.method = 'DBRC' - res_scatt_dbrc.E_min = 1e-6 - res_scatt_dbrc.E_max = 210e-6 - - nuclide = openmc.Nuclide('U235') - res_scatt_wcm = openmc.ResonanceScattering() - res_scatt_wcm.nuclide = nuclide - res_scatt_wcm.nuclide_0K = nuclide - res_scatt_wcm.method = 'WCM' - res_scatt_wcm.E_min = 1e-6 - res_scatt_wcm.E_max = 210e-6 - - nuclide = openmc.Nuclide('Pu239') - res_scatt_ares = openmc.ResonanceScattering() - res_scatt_ares.nuclide = nuclide - res_scatt_ares.nuclide_0K = nuclide - res_scatt_ares.method = 'ARES' - res_scatt_ares.E_min = 1e-6 - res_scatt_ares.E_max = 210e-6 + res_scatt_dbrc = openmc.ResonanceScattering(u238, 'DBRC', 1e-6, 210e-6) + res_scatt_wcm = openmc.ResonanceScattering(u235, 'WCM', 1e-6, 210e-6) + res_scatt_ares = openmc.ResonanceScattering(pu239, 'ARES', 1e-6, 210e-6) sets_file = openmc.Settings() sets_file.batches = 10 diff --git a/tests/test_rotation/materials.xml b/tests/test_rotation/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_rotation/materials.xml +++ b/tests/test_rotation/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_salphabeta/materials.xml b/tests/test_salphabeta/materials.xml index 0d250e7b47..bfe0a6224d 100644 --- a/tests/test_salphabeta/materials.xml +++ b/tests/test_salphabeta/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_score_current/materials.xml b/tests/test_score_current/materials.xml index bead58f8b2..8021f5f99e 100644 --- a/tests/test_score_current/materials.xml +++ b/tests/test_score_current/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_seed/materials.xml b/tests/test_seed/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_seed/materials.xml +++ b/tests/test_seed/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_source/inputs_true.dat b/tests/test_source/inputs_true.dat index 5744adeebc..0c8f18194a 100644 --- a/tests/test_source/inputs_true.dat +++ b/tests/test_source/inputs_true.dat @@ -1 +1 @@ -29498faa9496b8eeeab79f6cb5a966cb03a54e9c3c7e9178e7cc132df575f1377aa780fa2684201c4becdf199f89c3e7c36a824a495e60359bc6fd30b02cad6f \ No newline at end of file +b791dc4a37d20599afe375d91a9c6da123d6579cdc3ae7093a4a464c82bce43f2349fc6828f0b5d9f6b11b8a1aa1031459cd19f2771277ef40d775fedb68c00f \ No newline at end of file diff --git a/tests/test_source/test_source.py b/tests/test_source/test_source.py index f83e39974c..ce9012bc26 100644 --- a/tests/test_source/test_source.py +++ b/tests/test_source/test_source.py @@ -13,7 +13,7 @@ import openmc class SourceTestHarness(PyAPITestHarness): def _build_inputs(self): - mat1 = openmc.Material(material_id=1, temperature='294K') + mat1 = openmc.Material(material_id=1, temperature='294') mat1.set_density('g/cm3', 4.5) mat1.add_nuclide(openmc.Nuclide('U235'), 1.0) materials = openmc.Materials([mat1]) diff --git a/tests/test_source_file/materials.xml b/tests/test_source_file/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_source_file/materials.xml +++ b/tests/test_source_file/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_sourcepoint_batch/materials.xml b/tests/test_sourcepoint_batch/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_sourcepoint_batch/materials.xml +++ b/tests/test_sourcepoint_batch/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_sourcepoint_interval/materials.xml b/tests/test_sourcepoint_interval/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_sourcepoint_interval/materials.xml +++ b/tests/test_sourcepoint_interval/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_sourcepoint_latest/materials.xml b/tests/test_sourcepoint_latest/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_sourcepoint_latest/materials.xml +++ b/tests/test_sourcepoint_latest/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_sourcepoint_restart/materials.xml b/tests/test_sourcepoint_restart/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_sourcepoint_restart/materials.xml +++ b/tests/test_sourcepoint_restart/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_statepoint_batch/materials.xml b/tests/test_statepoint_batch/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_statepoint_batch/materials.xml +++ b/tests/test_statepoint_batch/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_statepoint_interval/materials.xml b/tests/test_statepoint_interval/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_statepoint_interval/materials.xml +++ b/tests/test_statepoint_interval/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_statepoint_restart/materials.xml b/tests/test_statepoint_restart/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_statepoint_restart/materials.xml +++ b/tests/test_statepoint_restart/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_statepoint_sourcesep/materials.xml b/tests/test_statepoint_sourcesep/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_statepoint_sourcesep/materials.xml +++ b/tests/test_statepoint_sourcesep/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_survival_biasing/materials.xml b/tests/test_survival_biasing/materials.xml index 03b2162b3b..f271ddee22 100644 --- a/tests/test_survival_biasing/materials.xml +++ b/tests/test_survival_biasing/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_tally_assumesep/materials.xml b/tests/test_tally_assumesep/materials.xml index bead58f8b2..8021f5f99e 100644 --- a/tests/test_tally_assumesep/materials.xml +++ b/tests/test_tally_assumesep/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_tally_nuclides/materials.xml b/tests/test_tally_nuclides/materials.xml index 5ac4f69424..1f89c7df61 100644 --- a/tests/test_tally_nuclides/materials.xml +++ b/tests/test_tally_nuclides/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_trace/materials.xml b/tests/test_trace/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_trace/materials.xml +++ b/tests/test_trace/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_track_output/materials.xml b/tests/test_track_output/materials.xml index f31f61fc3c..5dc9a64755 100644 --- a/tests/test_track_output/materials.xml +++ b/tests/test_track_output/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_translation/materials.xml b/tests/test_translation/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_translation/materials.xml +++ b/tests/test_translation/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_trigger_batch_interval/materials.xml b/tests/test_trigger_batch_interval/materials.xml index 5ac4f69424..1f89c7df61 100644 --- a/tests/test_trigger_batch_interval/materials.xml +++ b/tests/test_trigger_batch_interval/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_trigger_no_batch_interval/materials.xml b/tests/test_trigger_no_batch_interval/materials.xml index 5ac4f69424..1f89c7df61 100644 --- a/tests/test_trigger_no_batch_interval/materials.xml +++ b/tests/test_trigger_no_batch_interval/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_trigger_no_status/materials.xml b/tests/test_trigger_no_status/materials.xml index 5ac4f69424..1f89c7df61 100644 --- a/tests/test_trigger_no_status/materials.xml +++ b/tests/test_trigger_no_status/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_trigger_tallies/materials.xml b/tests/test_trigger_tallies/materials.xml index 5ac4f69424..1f89c7df61 100644 --- a/tests/test_trigger_tallies/materials.xml +++ b/tests/test_trigger_tallies/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_uniform_fs/materials.xml b/tests/test_uniform_fs/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_uniform_fs/materials.xml +++ b/tests/test_uniform_fs/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_union_energy_grids/geometry.xml b/tests/test_union_energy_grids/geometry.xml deleted file mode 100644 index bc56030e18..0000000000 --- a/tests/test_union_energy_grids/geometry.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/tests/test_union_energy_grids/materials.xml b/tests/test_union_energy_grids/materials.xml deleted file mode 100644 index 2946a8d609..0000000000 --- a/tests/test_union_energy_grids/materials.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - 294K - - - - - - - - - diff --git a/tests/test_union_energy_grids/results_true.dat b/tests/test_union_energy_grids/results_true.dat deleted file mode 100644 index 0a607592c8..0000000000 --- a/tests/test_union_energy_grids/results_true.dat +++ /dev/null @@ -1,2 +0,0 @@ -k-combined: -3.330789E-01 2.216495E-03 diff --git a/tests/test_union_energy_grids/settings.xml b/tests/test_union_energy_grids/settings.xml deleted file mode 100644 index 1eb22241cc..0000000000 --- a/tests/test_union_energy_grids/settings.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - union - - - 10 - 5 - 1000 - - - - - -4 -4 -4 4 4 4 - - - - diff --git a/tests/test_union_energy_grids/test_union_energy_grids.py b/tests/test_union_energy_grids/test_union_energy_grids.py deleted file mode 100644 index 2a595f3e66..0000000000 --- a/tests/test_union_energy_grids/test_union_energy_grids.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python - -import os -import sys -sys.path.insert(0, os.pardir) -from testing_harness import TestHarness - - -if __name__ == '__main__': - harness = TestHarness('statepoint.10.*') - harness.main() diff --git a/tests/test_universe/materials.xml b/tests/test_universe/materials.xml index 37cfcdc6ed..2472a74717 100644 --- a/tests/test_universe/materials.xml +++ b/tests/test_universe/materials.xml @@ -1,8 +1,6 @@ - 294K - diff --git a/tests/test_void/materials.xml b/tests/test_void/materials.xml index 2a578e0ed4..f70c3a40f2 100644 --- a/tests/test_void/materials.xml +++ b/tests/test_void/materials.xml @@ -3,8 +3,6 @@ - 294K - From fbebf7bf709fe2fe1813af95bff9b29c0d59312c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 30 Aug 2016 21:49:22 -0500 Subject: [PATCH 157/168] Fix cell temperature bug for multipole. Results change a bit. --- src/physics.F90 | 8 ++++---- tests/test_multipole/results_true.dat | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/physics.F90 b/src/physics.F90 index f1f6733097..23fb6f1df2 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -334,11 +334,11 @@ contains else ! Determine temperature -!!$ if (temperature_method == TEMPERATURE_MULTIPOLE) then -!!$ kT = p % sqrtkT**2 -!!$ else + if (temperature_method == TEMPERATURE_MULTIPOLE) then + kT = p % sqrtkT**2 + else kT = nuc % kTs(micro_xs(i_nuclide) % index_temp) -!!$ end if + end if ! Perform collision physics for elastic scattering call elastic_scatter(i_nuclide, nuc % reactions(1), kT, & diff --git a/tests/test_multipole/results_true.dat b/tests/test_multipole/results_true.dat index 9555a2d536..4d379b3f40 100644 --- a/tests/test_multipole/results_true.dat +++ b/tests/test_multipole/results_true.dat @@ -1,5 +1,5 @@ k-combined: -1.457760E+00 1.119656E-02 +1.425673E+00 1.779969E-02 Cell ID = 11 Name = From 3d29075022d64823d7fd08940e76da01c7ad2d21 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Wed, 31 Aug 2016 10:59:21 -0500 Subject: [PATCH 158/168] Update Jupyter notebooks --- .../pythonapi/examples/mgxs-part-i.ipynb | 101 +- .../pythonapi/examples/mgxs-part-ii.ipynb | 1099 +++++++---------- .../pythonapi/examples/mgxs-part-iii.ipynb | 466 ++++--- .../pythonapi/examples/mgxs-part-iv.ipynb | 316 ++--- .../examples/pandas-dataframes.ipynb | 235 ++-- .../pythonapi/examples/post-processing.ipynb | 129 +- .../pythonapi/examples/tally-arithmetic.ipynb | 87 +- 7 files changed, 1159 insertions(+), 1274 deletions(-) diff --git a/docs/source/pythonapi/examples/mgxs-part-i.ipynb b/docs/source/pythonapi/examples/mgxs-part-i.ipynb index 7c5132100e..4477e323d7 100644 --- a/docs/source/pythonapi/examples/mgxs-part-i.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-i.ipynb @@ -214,7 +214,6 @@ "source": [ "# Instantiate a Materials collection and export to XML\n", "materials_file = openmc.Materials([inf_medium])\n", - "materials_file.default_xs = '71c'\n", "materials_file.export_to_xml()" ] }, @@ -499,23 +498,37 @@ "output_type": "stream", "text": [ "\n", - " .d88888b. 888b d888 .d8888b.\n", - " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", - " 888 888 88888b.d88888 888 888\n", - " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", - " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", - " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", - " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", - " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", - "__________________888______________________________________________________\n", - " 888\n", - " 888\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", - " Copyright: 2011-2016 Massachusetts Institute of Technology\n", - " License: http://openmc.readthedocs.io/en/latest/license.html\n", - " Version: 0.7.1\n", - " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", - " Date/Time: 2016-07-22 21:03:18\n", + " | The OpenMC Monte Carlo Code\n", + " Copyright | 2011-2016 Massachusetts Institute of Technology\n", + " License | http://openmc.readthedocs.io/en/latest/license.html\n", + " Version | 0.8.0\n", + " Git SHA1 | fbebf7bf709fe2fe1813af95bff9b29c0d59312c\n", + " Date/Time | 2016-08-31 10:40:13\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -525,12 +538,12 @@ " Reading geometry XML file...\n", " Reading cross sections XML file...\n", " Reading materials XML file...\n", - " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", - " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", - " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", - " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", - " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", - " Maximum neutron transport energy: 20.0000 MeV for H1.71c\n", + " Reading H1 from /home/romano/openmc/data/nndc_hdf5/H1.h5\n", + " Reading O16 from /home/romano/openmc/data/nndc_hdf5/O16.h5\n", + " Reading U235 from /home/romano/openmc/data/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/romano/openmc/data/nndc_hdf5/U238.h5\n", + " Reading Zr90 from /home/romano/openmc/data/nndc_hdf5/Zr90.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for H1\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", " Initializing source particles...\n", @@ -600,20 +613,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.2300E-01 seconds\n", - " Reading cross sections = 1.6900E-01 seconds\n", - " Total time in simulation = 1.9882E+01 seconds\n", - " Time in transport only = 1.9869E+01 seconds\n", - " Time in inactive batches = 2.6590E+00 seconds\n", - " Time in active batches = 1.7223E+01 seconds\n", + " Total time for initialization = 3.9900E-01 seconds\n", + " Reading cross sections = 2.6500E-01 seconds\n", + " Total time in simulation = 1.1488E+01 seconds\n", + " Time in transport only = 1.1152E+01 seconds\n", + " Time in inactive batches = 1.2180E+00 seconds\n", + " Time in active batches = 1.0270E+01 seconds\n", " Time synchronizing fission bank = 4.0000E-03 seconds\n", - " Sampling source sites = 4.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Sampling source sites = 3.0000E-03 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", - " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 2.0217E+01 seconds\n", - " Calculation Rate (inactive) = 9402.03 neutrons/second\n", - " Calculation Rate (active) = 5806.19 neutrons/second\n", + " Total time for finalization = 1.0000E-03 seconds\n", + " Total time elapsed = 1.1901E+01 seconds\n", + " Calculation Rate (inactive) = 20525.5 neutrons/second\n", + " Calculation Rate (active) = 9737.10 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -894,7 +907,7 @@ " 6.250000e-07\n", " total\n", " (((total / flux) - (absorption / flux)) - (sca...\n", - " -3.774758e-15\n", + " -2.886580e-15\n", " 0.011292\n", " \n", " \n", @@ -904,7 +917,7 @@ " 2.000000e+01\n", " total\n", " (((total / flux) - (absorption / flux)) - (sca...\n", - " 1.443290e-15\n", + " -5.551115e-16\n", " 0.002570\n", " \n", " \n", @@ -917,8 +930,8 @@ "1 1 6.25e-07 2.00e+01 total \n", "\n", " score mean std. dev. \n", - "0 (((total / flux) - (absorption / flux)) - (sca... -3.77e-15 1.13e-02 \n", - "1 (((total / flux) - (absorption / flux)) - (sca... 1.44e-15 2.57e-03 " + "0 (((total / flux) - (absorption / flux)) - (sca... -2.89e-15 1.13e-02 \n", + "1 (((total / flux) - (absorption / flux)) - (sca... -5.55e-16 2.57e-03 " ] }, "execution_count": 22, @@ -1167,21 +1180,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.5.2" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb index ca4832809a..341969fbdd 100644 --- a/docs/source/pythonapi/examples/mgxs-part-ii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-ii.ipynb @@ -34,9 +34,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/__init__.py:878: UserWarning: axes.color_cycle is deprecated and replaced with axes.prop_cycle; please use the latter.\n", - " warnings.warn(self.msg_depr % (key, alt_key))\n", - "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/__init__.py:1357: UserWarning: This call to matplotlib.use() has no effect\n", + "/home/romano/miniconda3/envs/default/lib/python3.5/site-packages/matplotlib/__init__.py:1350: UserWarning: This call to matplotlib.use() has no effect\n", "because the backend has already been chosen;\n", "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", "or matplotlib.backends is imported for the first time.\n", @@ -134,7 +132,6 @@ "source": [ "# Instantiate a Materials collection\n", "materials_file = openmc.Materials((fuel, water, zircaloy))\n", - "materials_file.default_xs = '71c'\n", "\n", "# Export to \"materials.xml\"\n", "materials_file.export_to_xml()" @@ -428,24 +425,37 @@ "output_type": "stream", "text": [ "\n", - " .d88888b. 888b d888 .d8888b.\n", - " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", - " 888 888 88888b.d88888 888 888\n", - " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", - " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", - " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", - " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", - " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", - "__________________888______________________________________________________\n", - " 888\n", - " 888\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", - " Copyright: 2011-2016 Massachusetts Institute of Technology\n", - " License: http://openmc.readthedocs.io/en/latest/license.html\n", - " Version: 0.8.0\n", - " Git SHA1: be7e6e035d22944a8c80ca32f99935b6822854c9\n", - " Date/Time: 2016-08-10 15:31:07\n", - " MPI Processes: 1\n", + " | The OpenMC Monte Carlo Code\n", + " Copyright | 2011-2016 Massachusetts Institute of Technology\n", + " License | http://openmc.readthedocs.io/en/latest/license.html\n", + " Version | 0.8.0\n", + " Git SHA1 | fbebf7bf709fe2fe1813af95bff9b29c0d59312c\n", + " Date/Time | 2016-08-31 10:55:07\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -455,12 +465,12 @@ " Reading geometry XML file...\n", " Reading cross sections XML file...\n", " Reading materials XML file...\n", - " Reading U235.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/U235_71c.h5\n", - " Reading U238.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/U238_71c.h5\n", - " Reading O16.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/O16_71c.h5\n", - " Reading H1.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/H1_71c.h5\n", - " Reading Zr90.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/Zr90_71c.h5\n", - " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", + " Reading U235 from /home/romano/openmc/data/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/romano/openmc/data/nndc_hdf5/U238.h5\n", + " Reading O16 from /home/romano/openmc/data/nndc_hdf5/O16.h5\n", + " Reading H1 from /home/romano/openmc/data/nndc_hdf5/H1.h5\n", + " Reading Zr90 from /home/romano/openmc/data/nndc_hdf5/Zr90.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", " Initializing source particles...\n", @@ -521,7 +531,7 @@ " 48/1 1.21610 1.22612 +/- 0.00251\n", " 49/1 1.22199 1.22602 +/- 0.00245\n", " 50/1 1.20860 1.22558 +/- 0.00243\n", - " Triggers unsatisfied, max unc./thresh. is 1.25496 for flux in tally 10052\n", + " Triggers unsatisfied, max unc./thresh. is 1.25496 for flux in tally 10057\n", " The estimated number of batches is 73\n", " Creating state point statepoint.050.h5...\n", " 51/1 1.21850 1.22541 +/- 0.00237\n", @@ -547,7 +557,7 @@ " 71/1 1.19720 1.22444 +/- 0.00195\n", " 72/1 1.23770 1.22465 +/- 0.00193\n", " 73/1 1.23894 1.22488 +/- 0.00191\n", - " Triggers unsatisfied, max unc./thresh. is 1.00243 for flux in tally 10052\n", + " Triggers unsatisfied, max unc./thresh. is 1.00243 for flux in tally 10057\n", " The estimated number of batches is 74\n", " 74/1 1.22437 1.22487 +/- 0.00188\n", " Triggers satisfied for batch 74\n", @@ -560,20 +570,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.0400E-01 seconds\n", - " Reading cross sections = 2.1100E-01 seconds\n", - " Total time in simulation = 2.8243E+02 seconds\n", - " Time in transport only = 2.8236E+02 seconds\n", - " Time in inactive batches = 1.8781E+01 seconds\n", - " Time in active batches = 2.6365E+02 seconds\n", - " Time synchronizing fission bank = 2.7000E-02 seconds\n", - " Sampling source sites = 1.7000E-02 seconds\n", + " Total time for initialization = 4.0300E-01 seconds\n", + " Reading cross sections = 2.6000E-01 seconds\n", + " Total time in simulation = 1.3275E+02 seconds\n", + " Time in transport only = 1.3260E+02 seconds\n", + " Time in inactive batches = 8.2130E+00 seconds\n", + " Time in active batches = 1.2454E+02 seconds\n", + " Time synchronizing fission bank = 3.0000E-02 seconds\n", + " Sampling source sites = 2.2000E-02 seconds\n", " SEND/RECV source sites = 8.0000E-03 seconds\n", - " Time accumulating tallies = 2.0000E-03 seconds\n", - " Total time for finalization = 2.4000E-02 seconds\n", - " Total time elapsed = 2.8293E+02 seconds\n", - " Calculation Rate (inactive) = 5324.53 neutrons/second\n", - " Calculation Rate (active) = 1517.17 neutrons/second\n", + " Time accumulating tallies = 3.0000E-03 seconds\n", + " Total time for finalization = 1.5000E-02 seconds\n", + " Total time elapsed = 1.3324E+02 seconds\n", + " Calculation Rate (inactive) = 12175.8 neutrons/second\n", + " Calculation Rate (active) = 3211.92 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -772,14 +782,6 @@ "collapsed": false }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/numpy/lib/shape_base.py:873: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future\n", - " return c.reshape(shape_out)\n" - ] - }, { "data": { "text/html": [ @@ -1170,239 +1172,169 @@ "text": [ "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.423123\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.475921\tres = 5.769E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.491443\tres = 1.248E-01\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.487441\tres = 3.261E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.483949\tres = 8.144E-03\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.477326\tres = 7.164E-03\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.469012\tres = 1.369E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.460422\tres = 1.742E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.450721\tres = 1.832E-02\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.441532\tres = 2.107E-02\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.432168\tres = 2.039E-02\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.423131\tres = 2.121E-02\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.414705\tres = 2.091E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.406942\tres = 1.991E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.399627\tres = 1.872E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.393329\tres = 1.798E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.387699\tres = 1.576E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.382948\tres = 1.431E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.379028\tres = 1.225E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.375934\tres = 1.024E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.373784\tres = 8.161E-03\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.372654\tres = 5.719E-03\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.372273\tres = 3.023E-03\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.372879\tres = 1.024E-03\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.374353\tres = 1.629E-03\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.376678\tres = 3.951E-03\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.379854\tres = 6.212E-03\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.383870\tres = 8.432E-03\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.388663\tres = 1.057E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.394216\tres = 1.249E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.400506\tres = 1.429E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.407501\tres = 1.596E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.415145\tres = 1.747E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.423426\tres = 1.876E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.432299\tres = 1.995E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.441713\tres = 2.095E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.451665\tres = 2.178E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.462081\tres = 2.253E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.472951\tres = 2.306E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.484220\tres = 2.352E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.495861\tres = 2.383E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.507836\tres = 2.404E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.520110\tres = 2.415E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.532648\tres = 2.417E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.545418\tres = 2.411E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.558388\tres = 2.398E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.571526\tres = 2.378E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.584802\tres = 2.353E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.598189\tres = 2.323E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.611657\tres = 2.289E-02\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.625182\tres = 2.252E-02\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.638738\tres = 2.211E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.652302\tres = 2.168E-02\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.665851\tres = 2.124E-02\n", - "[ NORMAL ] Iteration 54:\tk_eff = 0.679364\tres = 2.077E-02\n", - "[ NORMAL ] Iteration 55:\tk_eff = 0.692821\tres = 2.029E-02\n", - "[ NORMAL ] Iteration 56:\tk_eff = 0.706204\tres = 1.981E-02\n", - "[ NORMAL ] Iteration 57:\tk_eff = 0.719496\tres = 1.932E-02\n", - "[ NORMAL ] Iteration 58:\tk_eff = 0.732679\tres = 1.882E-02\n", - "[ NORMAL ] Iteration 59:\tk_eff = 0.745740\tres = 1.832E-02\n", - "[ NORMAL ] Iteration 60:\tk_eff = 0.758664\tres = 1.783E-02\n", - "[ NORMAL ] Iteration 61:\tk_eff = 0.771439\tres = 1.733E-02\n", - "[ NORMAL ] Iteration 62:\tk_eff = 0.784053\tres = 1.684E-02\n", - "[ NORMAL ] Iteration 63:\tk_eff = 0.796495\tres = 1.635E-02\n", - "[ NORMAL ] Iteration 64:\tk_eff = 0.808756\tres = 1.587E-02\n", - "[ NORMAL ] Iteration 65:\tk_eff = 0.820827\tres = 1.539E-02\n", - "[ NORMAL ] Iteration 66:\tk_eff = 0.832700\tres = 1.493E-02\n", - "[ NORMAL ] Iteration 67:\tk_eff = 0.844370\tres = 1.447E-02\n", - "[ NORMAL ] Iteration 68:\tk_eff = 0.855828\tres = 1.401E-02\n", - "[ NORMAL ] Iteration 69:\tk_eff = 0.867071\tres = 1.357E-02\n", - "[ NORMAL ] Iteration 70:\tk_eff = 0.878094\tres = 1.314E-02\n", - "[ NORMAL ] Iteration 71:\tk_eff = 0.888893\tres = 1.271E-02\n", - "[ NORMAL ] Iteration 72:\tk_eff = 0.899465\tres = 1.230E-02\n", - "[ NORMAL ] Iteration 73:\tk_eff = 0.909807\tres = 1.189E-02\n", - "[ NORMAL ] Iteration 74:\tk_eff = 0.919919\tres = 1.150E-02\n", - "[ NORMAL ] Iteration 75:\tk_eff = 0.929798\tres = 1.111E-02\n", - "[ NORMAL ] Iteration 76:\tk_eff = 0.939444\tres = 1.074E-02\n", - "[ NORMAL ] Iteration 77:\tk_eff = 0.948856\tres = 1.037E-02\n", - "[ NORMAL ] Iteration 78:\tk_eff = 0.958036\tres = 1.002E-02\n", - "[ NORMAL ] Iteration 79:\tk_eff = 0.966983\tres = 9.674E-03\n", - "[ NORMAL ] Iteration 80:\tk_eff = 0.975698\tres = 9.339E-03\n", - "[ NORMAL ] Iteration 81:\tk_eff = 0.984184\tres = 9.013E-03\n", - "[ NORMAL ] Iteration 82:\tk_eff = 0.992441\tres = 8.697E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.000472\tres = 8.390E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.008280\tres = 8.092E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.015866\tres = 7.804E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.023234\tres = 7.524E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.030386\tres = 7.253E-03\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.037327\tres = 6.990E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.044059\tres = 6.736E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.050585\tres = 6.490E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.056911\tres = 6.251E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.063038\tres = 6.021E-03\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.068972\tres = 5.798E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.074716\tres = 5.582E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.080275\tres = 5.373E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.085651\tres = 5.172E-03\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.090850\tres = 4.977E-03\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.095876\tres = 4.789E-03\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.100733\tres = 4.607E-03\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.105424\tres = 4.432E-03\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.109955\tres = 4.262E-03\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.114328\tres = 4.099E-03\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.118550\tres = 3.941E-03\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.122623\tres = 3.788E-03\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.126551\tres = 3.641E-03\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.130339\tres = 3.499E-03\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.133991\tres = 3.363E-03\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.137511\tres = 3.231E-03\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.140902\tres = 3.104E-03\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.144168\tres = 2.981E-03\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.147313\tres = 2.863E-03\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.150342\tres = 2.749E-03\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.153257\tres = 2.640E-03\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.156062\tres = 2.534E-03\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.158761\tres = 2.432E-03\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.161356\tres = 2.334E-03\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.163852\tres = 2.240E-03\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.166252\tres = 2.149E-03\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.168559\tres = 2.062E-03\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.170776\tres = 1.978E-03\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.172906\tres = 1.897E-03\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.174952\tres = 1.819E-03\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.176918\tres = 1.745E-03\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.178805\tres = 1.673E-03\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.180617\tres = 1.603E-03\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.182356\tres = 1.537E-03\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.184025\tres = 1.473E-03\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.185626\tres = 1.412E-03\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.187163\tres = 1.353E-03\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.188637\tres = 1.296E-03\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.190050\tres = 1.241E-03\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.191405\tres = 1.189E-03\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.192704\tres = 1.139E-03\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.193950\tres = 1.091E-03\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.195144\tres = 1.044E-03\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.196287\tres = 9.997E-04\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.197383\tres = 9.571E-04\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.198433\tres = 9.161E-04\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.199439\tres = 8.768E-04\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.200402\tres = 8.391E-04\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.201324\tres = 8.029E-04\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.202207\tres = 7.682E-04\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.203052\tres = 7.349E-04\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.203861\tres = 7.030E-04\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.204635\tres = 6.724E-04\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.205376\tres = 6.431E-04\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.206084\tres = 6.149E-04\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.206762\tres = 5.880E-04\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.207411\tres = 5.622E-04\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.208031\tres = 5.374E-04\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.208624\tres = 5.137E-04\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.209192\tres = 4.910E-04\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.209734\tres = 4.693E-04\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.210252\tres = 4.484E-04\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.210748\tres = 4.285E-04\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.211221\tres = 4.094E-04\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.211674\tres = 3.911E-04\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.212106\tres = 3.736E-04\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.212519\tres = 3.569E-04\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.212914\tres = 3.408E-04\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.213291\tres = 3.255E-04\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.213651\tres = 3.108E-04\n", - "[ NORMAL ] Iteration 163:\tk_eff = 1.213995\tres = 2.968E-04\n", - "[ NORMAL ] Iteration 164:\tk_eff = 1.214323\tres = 2.834E-04\n", - "[ NORMAL ] Iteration 165:\tk_eff = 1.214637\tres = 2.705E-04\n", - "[ NORMAL ] Iteration 166:\tk_eff = 1.214936\tres = 2.582E-04\n", - "[ NORMAL ] Iteration 167:\tk_eff = 1.215222\tres = 2.465E-04\n", - "[ NORMAL ] Iteration 168:\tk_eff = 1.215495\tres = 2.353E-04\n", - "[ NORMAL ] Iteration 169:\tk_eff = 1.215755\tres = 2.245E-04\n", - "[ NORMAL ] Iteration 170:\tk_eff = 1.216004\tres = 2.142E-04\n", - "[ NORMAL ] Iteration 171:\tk_eff = 1.216241\tres = 2.044E-04\n", - "[ NORMAL ] Iteration 172:\tk_eff = 1.216468\tres = 1.951E-04\n", - "[ NORMAL ] Iteration 173:\tk_eff = 1.216683\tres = 1.861E-04\n", - "[ NORMAL ] Iteration 174:\tk_eff = 1.216889\tres = 1.775E-04\n", - "[ NORMAL ] Iteration 175:\tk_eff = 1.217086\tres = 1.693E-04\n", - "[ NORMAL ] Iteration 176:\tk_eff = 1.217274\tres = 1.615E-04\n", - "[ NORMAL ] Iteration 177:\tk_eff = 1.217452\tres = 1.540E-04\n", - "[ NORMAL ] Iteration 178:\tk_eff = 1.217623\tres = 1.469E-04\n", - "[ NORMAL ] Iteration 179:\tk_eff = 1.217786\tres = 1.401E-04\n", - "[ NORMAL ] Iteration 180:\tk_eff = 1.217941\tres = 1.336E-04\n", - "[ NORMAL ] Iteration 181:\tk_eff = 1.218089\tres = 1.274E-04\n", - "[ NORMAL ] Iteration 182:\tk_eff = 1.218230\tres = 1.214E-04\n", - "[ NORMAL ] Iteration 183:\tk_eff = 1.218364\tres = 1.158E-04\n", - "[ NORMAL ] Iteration 184:\tk_eff = 1.218492\tres = 1.104E-04\n", - "[ NORMAL ] Iteration 185:\tk_eff = 1.218614\tres = 1.052E-04\n", - "[ NORMAL ] Iteration 186:\tk_eff = 1.218731\tres = 1.003E-04\n", - "[ NORMAL ] Iteration 187:\tk_eff = 1.218842\tres = 9.556E-05\n", - "[ NORMAL ] Iteration 188:\tk_eff = 1.218948\tres = 9.107E-05\n", - "[ NORMAL ] Iteration 189:\tk_eff = 1.219048\tres = 8.679E-05\n", - "[ NORMAL ] Iteration 190:\tk_eff = 1.219144\tres = 8.270E-05\n", - "[ NORMAL ] Iteration 191:\tk_eff = 1.219236\tres = 7.880E-05\n", - "[ NORMAL ] Iteration 192:\tk_eff = 1.219323\tres = 7.508E-05\n", - "[ NORMAL ] Iteration 193:\tk_eff = 1.219406\tres = 7.152E-05\n", - "[ NORMAL ] Iteration 194:\tk_eff = 1.219485\tres = 6.814E-05\n", - "[ NORMAL ] Iteration 195:\tk_eff = 1.219561\tres = 6.491E-05\n", - "[ NORMAL ] Iteration 196:\tk_eff = 1.219633\tres = 6.183E-05\n", - "[ NORMAL ] Iteration 197:\tk_eff = 1.219701\tres = 5.889E-05\n", - "[ NORMAL ] Iteration 198:\tk_eff = 1.219766\tres = 5.609E-05\n", - "[ NORMAL ] Iteration 199:\tk_eff = 1.219828\tres = 5.341E-05\n", - "[ NORMAL ] Iteration 200:\tk_eff = 1.219887\tres = 5.087E-05\n", - "[ NORMAL ] Iteration 201:\tk_eff = 1.219944\tres = 4.844E-05\n", - "[ NORMAL ] Iteration 202:\tk_eff = 1.219997\tres = 4.612E-05\n", - "[ NORMAL ] Iteration 203:\tk_eff = 1.220048\tres = 4.391E-05\n", - "[ NORMAL ] Iteration 204:\tk_eff = 1.220097\tres = 4.181E-05\n", - "[ NORMAL ] Iteration 205:\tk_eff = 1.220143\tres = 3.981E-05\n", - "[ NORMAL ] Iteration 206:\tk_eff = 1.220187\tres = 3.789E-05\n", - "[ NORMAL ] Iteration 207:\tk_eff = 1.220229\tres = 3.607E-05\n", - "[ NORMAL ] Iteration 208:\tk_eff = 1.220269\tres = 3.434E-05\n", - "[ NORMAL ] Iteration 209:\tk_eff = 1.220307\tres = 3.268E-05\n", - "[ NORMAL ] Iteration 210:\tk_eff = 1.220343\tres = 3.111E-05\n", - "[ NORMAL ] Iteration 211:\tk_eff = 1.220377\tres = 2.961E-05\n", - "[ NORMAL ] Iteration 212:\tk_eff = 1.220410\tres = 2.818E-05\n", - "[ NORMAL ] Iteration 213:\tk_eff = 1.220441\tres = 2.681E-05\n", - "[ NORMAL ] Iteration 214:\tk_eff = 1.220471\tres = 2.552E-05\n", - "[ NORMAL ] Iteration 215:\tk_eff = 1.220499\tres = 2.428E-05\n", - "[ NORMAL ] Iteration 216:\tk_eff = 1.220526\tres = 2.310E-05\n", - "[ NORMAL ] Iteration 217:\tk_eff = 1.220551\tres = 2.198E-05\n", - "[ NORMAL ] Iteration 218:\tk_eff = 1.220576\tres = 2.091E-05\n", - "[ NORMAL ] Iteration 219:\tk_eff = 1.220599\tres = 1.990E-05\n", - "[ NORMAL ] Iteration 220:\tk_eff = 1.220621\tres = 1.893E-05\n", - "[ NORMAL ] Iteration 221:\tk_eff = 1.220642\tres = 1.801E-05\n", - "[ NORMAL ] Iteration 222:\tk_eff = 1.220661\tres = 1.713E-05\n", - "[ NORMAL ] Iteration 223:\tk_eff = 1.220680\tres = 1.629E-05\n", - "[ NORMAL ] Iteration 224:\tk_eff = 1.220698\tres = 1.550E-05\n", - "[ NORMAL ] Iteration 225:\tk_eff = 1.220715\tres = 1.474E-05\n", - "[ NORMAL ] Iteration 226:\tk_eff = 1.220732\tres = 1.402E-05\n", - "[ NORMAL ] Iteration 227:\tk_eff = 1.220747\tres = 1.333E-05\n", - "[ NORMAL ] Iteration 228:\tk_eff = 1.220762\tres = 1.268E-05\n", - "[ NORMAL ] Iteration 229:\tk_eff = 1.220776\tres = 1.206E-05\n", - "[ NORMAL ] Iteration 230:\tk_eff = 1.220789\tres = 1.146E-05\n", - "[ NORMAL ] Iteration 231:\tk_eff = 1.220802\tres = 1.090E-05\n", - "[ NORMAL ] Iteration 232:\tk_eff = 1.220814\tres = 1.036E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.574672\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.679815\tres = 4.253E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.660826\tres = 1.830E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.658941\tres = 2.793E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.643012\tres = 2.852E-03\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.625810\tres = 2.417E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.606678\tres = 2.675E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.587485\tres = 3.057E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.569029\tres = 3.164E-02\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.551707\tres = 3.142E-02\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.536035\tres = 3.044E-02\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.522274\tres = 2.841E-02\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.510609\tres = 2.567E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.501106\tres = 2.234E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.493831\tres = 1.861E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.488780\tres = 1.452E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.485923\tres = 1.023E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.485210\tres = 5.846E-03\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.486569\tres = 1.467E-03\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.489903\tres = 2.801E-03\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.495103\tres = 6.852E-03\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.502053\tres = 1.061E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.510627\tres = 1.404E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.520693\tres = 1.708E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.532117\tres = 1.971E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.544764\tres = 2.194E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.558501\tres = 2.377E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.573195\tres = 2.522E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.588718\tres = 2.631E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.604946\tres = 2.708E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.621759\tres = 2.756E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.639047\tres = 2.779E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.656702\tres = 2.780E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.674624\tres = 2.763E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.692722\tres = 2.729E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.710910\tres = 2.683E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.729109\tres = 2.625E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.747248\tres = 2.560E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.765263\tres = 2.488E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.783094\tres = 2.411E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.800690\tres = 2.330E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.818005\tres = 2.247E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.834999\tres = 2.163E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.851638\tres = 2.078E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.867892\tres = 1.993E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.883736\tres = 1.909E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.899149\tres = 1.826E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.914115\tres = 1.744E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.928622\tres = 1.664E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.942659\tres = 1.587E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.956221\tres = 1.512E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.969305\tres = 1.439E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.981909\tres = 1.368E-02\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.994035\tres = 1.300E-02\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.005685\tres = 1.235E-02\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.016866\tres = 1.172E-02\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.027584\tres = 1.112E-02\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.037846\tres = 1.054E-02\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.047661\tres = 9.986E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.057040\tres = 9.457E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.065994\tres = 8.953E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.074533\tres = 8.470E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.082671\tres = 8.011E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.090418\tres = 7.573E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.097790\tres = 7.156E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.104797\tres = 6.760E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.111453\tres = 6.383E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.117770\tres = 6.025E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.123764\tres = 5.684E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.129446\tres = 5.362E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.134828\tres = 5.056E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.139924\tres = 4.765E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.144746\tres = 4.491E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.149306\tres = 4.230E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.153617\tres = 3.983E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.157688\tres = 3.751E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.161534\tres = 3.530E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.165163\tres = 3.322E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.168586\tres = 3.124E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.171813\tres = 2.938E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.174855\tres = 2.762E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.177721\tres = 2.596E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.180419\tres = 2.439E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.182960\tres = 2.291E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.185350\tres = 2.152E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.187599\tres = 2.021E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.189713\tres = 1.897E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.191700\tres = 1.780E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.193567\tres = 1.670E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.195321\tres = 1.567E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.196967\tres = 1.469E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.198513\tres = 1.378E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.199964\tres = 1.291E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.201326\tres = 1.211E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.202602\tres = 1.135E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.203800\tres = 1.062E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.204922\tres = 9.959E-04\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.205974\tres = 9.321E-04\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.206961\tres = 8.732E-04\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.207884\tres = 8.175E-04\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.208748\tres = 7.646E-04\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.209558\tres = 7.159E-04\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.210316\tres = 6.699E-04\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.211025\tres = 6.262E-04\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.211689\tres = 5.864E-04\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.212310\tres = 5.481E-04\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.212891\tres = 5.124E-04\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.213434\tres = 4.792E-04\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.213942\tres = 4.477E-04\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.214416\tres = 4.189E-04\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.214861\tres = 3.907E-04\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.215275\tres = 3.660E-04\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.215663\tres = 3.414E-04\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.216025\tres = 3.188E-04\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.216363\tres = 2.981E-04\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.216679\tres = 2.776E-04\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.216974\tres = 2.599E-04\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.217250\tres = 2.427E-04\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.217507\tres = 2.263E-04\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.217747\tres = 2.115E-04\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.217970\tres = 1.970E-04\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.218180\tres = 1.834E-04\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.218375\tres = 1.718E-04\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.218557\tres = 1.602E-04\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.218726\tres = 1.496E-04\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.218885\tres = 1.387E-04\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.219032\tres = 1.301E-04\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.219169\tres = 1.211E-04\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.219298\tres = 1.127E-04\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.219418\tres = 1.058E-04\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.219529\tres = 9.828E-05\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.219633\tres = 9.100E-05\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.219730\tres = 8.530E-05\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.219820\tres = 7.940E-05\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.219904\tres = 7.409E-05\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.219983\tres = 6.876E-05\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.220056\tres = 6.455E-05\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.220124\tres = 5.969E-05\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.220187\tres = 5.603E-05\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.220246\tres = 5.166E-05\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.220301\tres = 4.829E-05\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.220352\tres = 4.510E-05\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.220400\tres = 4.199E-05\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.220445\tres = 3.939E-05\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.220486\tres = 3.630E-05\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.220525\tres = 3.362E-05\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.220561\tres = 3.181E-05\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.220594\tres = 2.977E-05\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.220626\tres = 2.745E-05\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.220655\tres = 2.569E-05\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.220682\tres = 2.376E-05\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.220707\tres = 2.201E-05\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.220730\tres = 2.071E-05\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.220752\tres = 1.925E-05\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.220772\tres = 1.793E-05\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.220791\tres = 1.669E-05\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.220809\tres = 1.554E-05\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.220826\tres = 1.457E-05\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.220841\tres = 1.372E-05\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.220855\tres = 1.249E-05\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.220868\tres = 1.138E-05\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.220881\tres = 1.104E-05\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.220892\tres = 1.028E-05\n" ] } ], @@ -1435,8 +1367,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.223474\n", - "openmoc keff = 1.220814\n", - "bias [pcm]: -266.0\n" + "openmoc keff = 1.220892\n", + "bias [pcm]: -258.1\n" ] } ], @@ -1511,346 +1443,237 @@ "text": [ "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.366907\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.391217\tres = 6.331E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.393027\tres = 6.626E-02\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.381142\tres = 4.627E-03\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.375065\tres = 3.024E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.369645\tres = 1.594E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.365597\tres = 1.445E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.363111\tres = 1.095E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.361532\tres = 6.802E-03\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.361339\tres = 4.349E-03\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.362062\tres = 5.322E-04\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.363777\tres = 2.001E-03\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.366395\tres = 4.735E-03\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.369859\tres = 7.198E-03\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.374042\tres = 9.454E-03\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.378972\tres = 1.131E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.384524\tres = 1.318E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.390678\tres = 1.465E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.397373\tres = 1.600E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.404563\tres = 1.714E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.412207\tres = 1.809E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.420270\tres = 1.890E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.428695\tres = 1.956E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.437463\tres = 2.005E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.446530\tres = 2.045E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.455867\tres = 2.073E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.465442\tres = 2.091E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.475229\tres = 2.101E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.485198\tres = 2.103E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.495327\tres = 2.098E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.505591\tres = 2.088E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.515969\tres = 2.072E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.526440\tres = 2.053E-02\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.536985\tres = 2.029E-02\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.547587\tres = 2.003E-02\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.558228\tres = 1.974E-02\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.568893\tres = 1.943E-02\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.579569\tres = 1.911E-02\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.590241\tres = 1.877E-02\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.600898\tres = 1.841E-02\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.611527\tres = 1.805E-02\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.622118\tres = 1.769E-02\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.632662\tres = 1.732E-02\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.643149\tres = 1.695E-02\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.653571\tres = 1.658E-02\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.663920\tres = 1.620E-02\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.674189\tres = 1.583E-02\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.684372\tres = 1.547E-02\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.694464\tres = 1.510E-02\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.704457\tres = 1.475E-02\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.714349\tres = 1.439E-02\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.724134\tres = 1.404E-02\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.733808\tres = 1.370E-02\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.743369\tres = 1.336E-02\n", - "[ NORMAL ] Iteration 54:\tk_eff = 0.752812\tres = 1.303E-02\n", - "[ NORMAL ] Iteration 55:\tk_eff = 0.762135\tres = 1.270E-02\n", - "[ NORMAL ] Iteration 56:\tk_eff = 0.771336\tres = 1.238E-02\n", - "[ NORMAL ] Iteration 57:\tk_eff = 0.780412\tres = 1.207E-02\n", - "[ NORMAL ] Iteration 58:\tk_eff = 0.789362\tres = 1.177E-02\n", - "[ NORMAL ] Iteration 59:\tk_eff = 0.798184\tres = 1.147E-02\n", - "[ NORMAL ] Iteration 60:\tk_eff = 0.806877\tres = 1.118E-02\n", - "[ NORMAL ] Iteration 61:\tk_eff = 0.815440\tres = 1.089E-02\n", - "[ NORMAL ] Iteration 62:\tk_eff = 0.823872\tres = 1.061E-02\n", - "[ NORMAL ] Iteration 63:\tk_eff = 0.832172\tres = 1.034E-02\n", - "[ NORMAL ] Iteration 64:\tk_eff = 0.840340\tres = 1.007E-02\n", - "[ NORMAL ] Iteration 65:\tk_eff = 0.848377\tres = 9.816E-03\n", - "[ NORMAL ] Iteration 66:\tk_eff = 0.856281\tres = 9.563E-03\n", - "[ NORMAL ] Iteration 67:\tk_eff = 0.864053\tres = 9.317E-03\n", - "[ NORMAL ] Iteration 68:\tk_eff = 0.871693\tres = 9.076E-03\n", - "[ NORMAL ] Iteration 69:\tk_eff = 0.879202\tres = 8.842E-03\n", - "[ NORMAL ] Iteration 70:\tk_eff = 0.886580\tres = 8.614E-03\n", - "[ NORMAL ] Iteration 71:\tk_eff = 0.893828\tres = 8.392E-03\n", - "[ NORMAL ] Iteration 72:\tk_eff = 0.900946\tres = 8.175E-03\n", - "[ NORMAL ] Iteration 73:\tk_eff = 0.907936\tres = 7.964E-03\n", - "[ NORMAL ] Iteration 74:\tk_eff = 0.914798\tres = 7.758E-03\n", - "[ NORMAL ] Iteration 75:\tk_eff = 0.921534\tres = 7.558E-03\n", - "[ NORMAL ] Iteration 76:\tk_eff = 0.928144\tres = 7.363E-03\n", - "[ NORMAL ] Iteration 77:\tk_eff = 0.934629\tres = 7.173E-03\n", - "[ NORMAL ] Iteration 78:\tk_eff = 0.940992\tres = 6.988E-03\n", - "[ NORMAL ] Iteration 79:\tk_eff = 0.947233\tres = 6.808E-03\n", - "[ NORMAL ] Iteration 80:\tk_eff = 0.953353\tres = 6.632E-03\n", - "[ NORMAL ] Iteration 81:\tk_eff = 0.959355\tres = 6.461E-03\n", - "[ NORMAL ] Iteration 82:\tk_eff = 0.965238\tres = 6.295E-03\n", - "[ NORMAL ] Iteration 83:\tk_eff = 0.971006\tres = 6.133E-03\n", - "[ NORMAL ] Iteration 84:\tk_eff = 0.976659\tres = 5.975E-03\n", - "[ NORMAL ] Iteration 85:\tk_eff = 0.982199\tres = 5.822E-03\n", - "[ NORMAL ] Iteration 86:\tk_eff = 0.987627\tres = 5.672E-03\n", - "[ NORMAL ] Iteration 87:\tk_eff = 0.992945\tres = 5.527E-03\n", - "[ NORMAL ] Iteration 88:\tk_eff = 0.998155\tres = 5.385E-03\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.003258\tres = 5.247E-03\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.008256\tres = 5.113E-03\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.013151\tres = 4.982E-03\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.017943\tres = 4.854E-03\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.022635\tres = 4.730E-03\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.027229\tres = 4.609E-03\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.031726\tres = 4.492E-03\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.036127\tres = 4.377E-03\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.040434\tres = 4.266E-03\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.044649\tres = 4.157E-03\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.048774\tres = 4.051E-03\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.052810\tres = 3.948E-03\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.056759\tres = 3.848E-03\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.060622\tres = 3.751E-03\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.064400\tres = 3.655E-03\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.068096\tres = 3.563E-03\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.071711\tres = 3.473E-03\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.075247\tres = 3.385E-03\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.078705\tres = 3.299E-03\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.082086\tres = 3.216E-03\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.085392\tres = 3.134E-03\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.088624\tres = 3.055E-03\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.091785\tres = 2.978E-03\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.094875\tres = 2.903E-03\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.097895\tres = 2.830E-03\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.100848\tres = 2.759E-03\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.103734\tres = 2.689E-03\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.106555\tres = 2.622E-03\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.109312\tres = 2.556E-03\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.112007\tres = 2.492E-03\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.114641\tres = 2.429E-03\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.117214\tres = 2.368E-03\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.119729\tres = 2.309E-03\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.122187\tres = 2.251E-03\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.124588\tres = 2.195E-03\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.126934\tres = 2.140E-03\n", - "[ NORMAL ] Iteration 125:\tk_eff = 1.129226\tres = 2.086E-03\n", - "[ NORMAL ] Iteration 126:\tk_eff = 1.131466\tres = 2.034E-03\n", - "[ NORMAL ] Iteration 127:\tk_eff = 1.133654\tres = 1.983E-03\n", - "[ NORMAL ] Iteration 128:\tk_eff = 1.135791\tres = 1.934E-03\n", - "[ NORMAL ] Iteration 129:\tk_eff = 1.137879\tres = 1.885E-03\n", - "[ NORMAL ] Iteration 130:\tk_eff = 1.139919\tres = 1.838E-03\n", - "[ NORMAL ] Iteration 131:\tk_eff = 1.141911\tres = 1.793E-03\n", - "[ NORMAL ] Iteration 132:\tk_eff = 1.143857\tres = 1.748E-03\n", - "[ NORMAL ] Iteration 133:\tk_eff = 1.145758\tres = 1.704E-03\n", - "[ NORMAL ] Iteration 134:\tk_eff = 1.147615\tres = 1.662E-03\n", - "[ NORMAL ] Iteration 135:\tk_eff = 1.149428\tres = 1.620E-03\n", - "[ NORMAL ] Iteration 136:\tk_eff = 1.151200\tres = 1.580E-03\n", - "[ NORMAL ] Iteration 137:\tk_eff = 1.152929\tres = 1.541E-03\n", - "[ NORMAL ] Iteration 138:\tk_eff = 1.154619\tres = 1.503E-03\n", - "[ NORMAL ] Iteration 139:\tk_eff = 1.156268\tres = 1.465E-03\n", - "[ NORMAL ] Iteration 140:\tk_eff = 1.157879\tres = 1.429E-03\n", - "[ NORMAL ] Iteration 141:\tk_eff = 1.159453\tres = 1.393E-03\n", - "[ NORMAL ] Iteration 142:\tk_eff = 1.160989\tres = 1.359E-03\n", - "[ NORMAL ] Iteration 143:\tk_eff = 1.162489\tres = 1.325E-03\n", - "[ NORMAL ] Iteration 144:\tk_eff = 1.163954\tres = 1.292E-03\n", - "[ NORMAL ] Iteration 145:\tk_eff = 1.165384\tres = 1.260E-03\n", - "[ NORMAL ] Iteration 146:\tk_eff = 1.166781\tres = 1.229E-03\n", - "[ NORMAL ] Iteration 147:\tk_eff = 1.168144\tres = 1.198E-03\n", - "[ NORMAL ] Iteration 148:\tk_eff = 1.169476\tres = 1.169E-03\n", - "[ NORMAL ] Iteration 149:\tk_eff = 1.170776\tres = 1.140E-03\n", - "[ NORMAL ] Iteration 150:\tk_eff = 1.172045\tres = 1.112E-03\n", - "[ NORMAL ] Iteration 151:\tk_eff = 1.173284\tres = 1.084E-03\n", - "[ NORMAL ] Iteration 152:\tk_eff = 1.174494\tres = 1.057E-03\n", - "[ NORMAL ] Iteration 153:\tk_eff = 1.175675\tres = 1.031E-03\n", - "[ NORMAL ] Iteration 154:\tk_eff = 1.176828\tres = 1.006E-03\n", - "[ NORMAL ] Iteration 155:\tk_eff = 1.177953\tres = 9.807E-04\n", - "[ NORMAL ] Iteration 156:\tk_eff = 1.179052\tres = 9.565E-04\n", - "[ NORMAL ] Iteration 157:\tk_eff = 1.180125\tres = 9.328E-04\n", - "[ NORMAL ] Iteration 158:\tk_eff = 1.181172\tres = 9.098E-04\n", - "[ NORMAL ] Iteration 159:\tk_eff = 1.182194\tres = 8.873E-04\n", - "[ NORMAL ] Iteration 160:\tk_eff = 1.183192\tres = 8.654E-04\n", - "[ NORMAL ] Iteration 161:\tk_eff = 1.184166\tres = 8.441E-04\n", - "[ NORMAL ] Iteration 162:\tk_eff = 1.185117\tres = 8.232E-04\n", - "[ NORMAL ] Iteration 163:\tk_eff = 1.186045\tres = 8.029E-04\n", - "[ NORMAL ] Iteration 164:\tk_eff = 1.186951\tres = 7.831E-04\n", - "[ NORMAL ] Iteration 165:\tk_eff = 1.187835\tres = 7.638E-04\n", - "[ NORMAL ] Iteration 166:\tk_eff = 1.188698\tres = 7.450E-04\n", - "[ NORMAL ] Iteration 167:\tk_eff = 1.189541\tres = 7.266E-04\n", - "[ NORMAL ] Iteration 168:\tk_eff = 1.190363\tres = 7.087E-04\n", - "[ NORMAL ] Iteration 169:\tk_eff = 1.191166\tres = 6.912E-04\n", - "[ NORMAL ] Iteration 170:\tk_eff = 1.191949\tres = 6.742E-04\n", - "[ NORMAL ] Iteration 171:\tk_eff = 1.192713\tres = 6.576E-04\n", - "[ NORMAL ] Iteration 172:\tk_eff = 1.193460\tres = 6.414E-04\n", - "[ NORMAL ] Iteration 173:\tk_eff = 1.194188\tres = 6.256E-04\n", - "[ NORMAL ] Iteration 174:\tk_eff = 1.194899\tres = 6.102E-04\n", - "[ NORMAL ] Iteration 175:\tk_eff = 1.195592\tres = 5.952E-04\n", - "[ NORMAL ] Iteration 176:\tk_eff = 1.196269\tres = 5.806E-04\n", - "[ NORMAL ] Iteration 177:\tk_eff = 1.196930\tres = 5.663E-04\n", - "[ NORMAL ] Iteration 178:\tk_eff = 1.197575\tres = 5.524E-04\n", - "[ NORMAL ] Iteration 179:\tk_eff = 1.198204\tres = 5.388E-04\n", - "[ NORMAL ] Iteration 180:\tk_eff = 1.198819\tres = 5.255E-04\n", - "[ NORMAL ] Iteration 181:\tk_eff = 1.199418\tres = 5.126E-04\n", - "[ NORMAL ] Iteration 182:\tk_eff = 1.200003\tres = 5.000E-04\n", - "[ NORMAL ] Iteration 183:\tk_eff = 1.200574\tres = 4.877E-04\n", - "[ NORMAL ] Iteration 184:\tk_eff = 1.201131\tres = 4.757E-04\n", - "[ NORMAL ] Iteration 185:\tk_eff = 1.201675\tres = 4.640E-04\n", - "[ NORMAL ] Iteration 186:\tk_eff = 1.202205\tres = 4.526E-04\n", - "[ NORMAL ] Iteration 187:\tk_eff = 1.202723\tres = 4.415E-04\n", - "[ NORMAL ] Iteration 188:\tk_eff = 1.203228\tres = 4.307E-04\n", - "[ NORMAL ] Iteration 189:\tk_eff = 1.203721\tres = 4.201E-04\n", - "[ NORMAL ] Iteration 190:\tk_eff = 1.204202\tres = 4.098E-04\n", - "[ NORMAL ] Iteration 191:\tk_eff = 1.204672\tres = 3.997E-04\n", - "[ NORMAL ] Iteration 192:\tk_eff = 1.205130\tres = 3.899E-04\n", - "[ NORMAL ] Iteration 193:\tk_eff = 1.205577\tres = 3.803E-04\n", - "[ NORMAL ] Iteration 194:\tk_eff = 1.206014\tres = 3.710E-04\n", - "[ NORMAL ] Iteration 195:\tk_eff = 1.206439\tres = 3.619E-04\n", - "[ NORMAL ] Iteration 196:\tk_eff = 1.206855\tres = 3.530E-04\n", - "[ NORMAL ] Iteration 197:\tk_eff = 1.207260\tres = 3.444E-04\n", - "[ NORMAL ] Iteration 198:\tk_eff = 1.207656\tres = 3.359E-04\n", - "[ NORMAL ] Iteration 199:\tk_eff = 1.208042\tres = 3.277E-04\n", - "[ NORMAL ] Iteration 200:\tk_eff = 1.208418\tres = 3.196E-04\n", - "[ NORMAL ] Iteration 201:\tk_eff = 1.208786\tres = 3.118E-04\n", - "[ NORMAL ] Iteration 202:\tk_eff = 1.209144\tres = 3.041E-04\n", - "[ NORMAL ] Iteration 203:\tk_eff = 1.209494\tres = 2.967E-04\n", - "[ NORMAL ] Iteration 204:\tk_eff = 1.209836\tres = 2.894E-04\n", - "[ NORMAL ] Iteration 205:\tk_eff = 1.210169\tres = 2.823E-04\n", - "[ NORMAL ] Iteration 206:\tk_eff = 1.210494\tres = 2.754E-04\n", - "[ NORMAL ] Iteration 207:\tk_eff = 1.210811\tres = 2.686E-04\n", - "[ NORMAL ] Iteration 208:\tk_eff = 1.211121\tres = 2.621E-04\n", - "[ NORMAL ] Iteration 209:\tk_eff = 1.211423\tres = 2.556E-04\n", - "[ NORMAL ] Iteration 210:\tk_eff = 1.211718\tres = 2.494E-04\n", - "[ NORMAL ] Iteration 211:\tk_eff = 1.212005\tres = 2.433E-04\n", - "[ NORMAL ] Iteration 212:\tk_eff = 1.212286\tres = 2.373E-04\n", - "[ NORMAL ] Iteration 213:\tk_eff = 1.212559\tres = 2.315E-04\n", - "[ NORMAL ] Iteration 214:\tk_eff = 1.212827\tres = 2.258E-04\n", - "[ NORMAL ] Iteration 215:\tk_eff = 1.213087\tres = 2.203E-04\n", - "[ NORMAL ] Iteration 216:\tk_eff = 1.213341\tres = 2.149E-04\n", - "[ NORMAL ] Iteration 217:\tk_eff = 1.213590\tres = 2.096E-04\n", - "[ NORMAL ] Iteration 218:\tk_eff = 1.213832\tres = 2.045E-04\n", - "[ NORMAL ] Iteration 219:\tk_eff = 1.214068\tres = 1.995E-04\n", - "[ NORMAL ] Iteration 220:\tk_eff = 1.214298\tres = 1.946E-04\n", - "[ NORMAL ] Iteration 221:\tk_eff = 1.214523\tres = 1.898E-04\n", - "[ NORMAL ] Iteration 222:\tk_eff = 1.214743\tres = 1.852E-04\n", - "[ NORMAL ] Iteration 223:\tk_eff = 1.214957\tres = 1.806E-04\n", - "[ NORMAL ] Iteration 224:\tk_eff = 1.215165\tres = 1.762E-04\n", - "[ NORMAL ] Iteration 225:\tk_eff = 1.215369\tres = 1.719E-04\n", - "[ NORMAL ] Iteration 226:\tk_eff = 1.215568\tres = 1.677E-04\n", - "[ NORMAL ] Iteration 227:\tk_eff = 1.215762\tres = 1.636E-04\n", - "[ NORMAL ] Iteration 228:\tk_eff = 1.215951\tres = 1.596E-04\n", - "[ NORMAL ] Iteration 229:\tk_eff = 1.216136\tres = 1.557E-04\n", - "[ NORMAL ] Iteration 230:\tk_eff = 1.216316\tres = 1.519E-04\n", - "[ NORMAL ] Iteration 231:\tk_eff = 1.216492\tres = 1.482E-04\n", - "[ NORMAL ] Iteration 232:\tk_eff = 1.216663\tres = 1.445E-04\n", - "[ NORMAL ] Iteration 233:\tk_eff = 1.216831\tres = 1.410E-04\n", - "[ NORMAL ] Iteration 234:\tk_eff = 1.216994\tres = 1.375E-04\n", - "[ NORMAL ] Iteration 235:\tk_eff = 1.217153\tres = 1.342E-04\n", - "[ NORMAL ] Iteration 236:\tk_eff = 1.217309\tres = 1.309E-04\n", - "[ NORMAL ] Iteration 237:\tk_eff = 1.217460\tres = 1.277E-04\n", - "[ NORMAL ] Iteration 238:\tk_eff = 1.217608\tres = 1.246E-04\n", - "[ NORMAL ] Iteration 239:\tk_eff = 1.217753\tres = 1.215E-04\n", - "[ NORMAL ] Iteration 240:\tk_eff = 1.217894\tres = 1.185E-04\n", - "[ NORMAL ] Iteration 241:\tk_eff = 1.218031\tres = 1.156E-04\n", - "[ NORMAL ] Iteration 242:\tk_eff = 1.218165\tres = 1.128E-04\n", - "[ NORMAL ] Iteration 243:\tk_eff = 1.218296\tres = 1.101E-04\n", - "[ NORMAL ] Iteration 244:\tk_eff = 1.218423\tres = 1.074E-04\n", - "[ NORMAL ] Iteration 245:\tk_eff = 1.218548\tres = 1.047E-04\n", - "[ NORMAL ] Iteration 246:\tk_eff = 1.218669\tres = 1.022E-04\n", - "[ NORMAL ] Iteration 247:\tk_eff = 1.218788\tres = 9.967E-05\n", - "[ NORMAL ] Iteration 248:\tk_eff = 1.218903\tres = 9.723E-05\n", - "[ NORMAL ] Iteration 249:\tk_eff = 1.219016\tres = 9.486E-05\n", - "[ NORMAL ] Iteration 250:\tk_eff = 1.219126\tres = 9.254E-05\n", - "[ NORMAL ] Iteration 251:\tk_eff = 1.219234\tres = 9.027E-05\n", - "[ NORMAL ] Iteration 252:\tk_eff = 1.219338\tres = 8.806E-05\n", - "[ NORMAL ] Iteration 253:\tk_eff = 1.219441\tres = 8.591E-05\n", - "[ NORMAL ] Iteration 254:\tk_eff = 1.219540\tres = 8.381E-05\n", - "[ NORMAL ] Iteration 255:\tk_eff = 1.219637\tres = 8.176E-05\n", - "[ NORMAL ] Iteration 256:\tk_eff = 1.219732\tres = 7.976E-05\n", - "[ NORMAL ] Iteration 257:\tk_eff = 1.219825\tres = 7.781E-05\n", - "[ NORMAL ] Iteration 258:\tk_eff = 1.219915\tres = 7.591E-05\n", - "[ NORMAL ] Iteration 259:\tk_eff = 1.220003\tres = 7.405E-05\n", - "[ NORMAL ] Iteration 260:\tk_eff = 1.220089\tres = 7.224E-05\n", - "[ NORMAL ] Iteration 261:\tk_eff = 1.220173\tres = 7.047E-05\n", - "[ NORMAL ] Iteration 262:\tk_eff = 1.220255\tres = 6.875E-05\n", - "[ NORMAL ] Iteration 263:\tk_eff = 1.220335\tres = 6.707E-05\n", - "[ NORMAL ] Iteration 264:\tk_eff = 1.220413\tres = 6.543E-05\n", - "[ NORMAL ] Iteration 265:\tk_eff = 1.220489\tres = 6.383E-05\n", - "[ NORMAL ] Iteration 266:\tk_eff = 1.220563\tres = 6.227E-05\n", - "[ NORMAL ] Iteration 267:\tk_eff = 1.220635\tres = 6.075E-05\n", - "[ NORMAL ] Iteration 268:\tk_eff = 1.220706\tres = 5.926E-05\n", - "[ NORMAL ] Iteration 269:\tk_eff = 1.220775\tres = 5.781E-05\n", - "[ NORMAL ] Iteration 270:\tk_eff = 1.220842\tres = 5.640E-05\n", - "[ NORMAL ] Iteration 271:\tk_eff = 1.220907\tres = 5.502E-05\n", - "[ NORMAL ] Iteration 272:\tk_eff = 1.220971\tres = 5.368E-05\n", - "[ NORMAL ] Iteration 273:\tk_eff = 1.221034\tres = 5.236E-05\n", - "[ NORMAL ] Iteration 274:\tk_eff = 1.221095\tres = 5.108E-05\n", - "[ NORMAL ] Iteration 275:\tk_eff = 1.221154\tres = 4.984E-05\n", - "[ NORMAL ] Iteration 276:\tk_eff = 1.221212\tres = 4.862E-05\n", - "[ NORMAL ] Iteration 277:\tk_eff = 1.221268\tres = 4.743E-05\n", - "[ NORMAL ] Iteration 278:\tk_eff = 1.221324\tres = 4.627E-05\n", - "[ NORMAL ] Iteration 279:\tk_eff = 1.221377\tres = 4.514E-05\n", - "[ NORMAL ] Iteration 280:\tk_eff = 1.221430\tres = 4.403E-05\n", - "[ NORMAL ] Iteration 281:\tk_eff = 1.221481\tres = 4.296E-05\n", - "[ NORMAL ] Iteration 282:\tk_eff = 1.221531\tres = 4.191E-05\n", - "[ NORMAL ] Iteration 283:\tk_eff = 1.221580\tres = 4.088E-05\n", - "[ NORMAL ] Iteration 284:\tk_eff = 1.221627\tres = 3.988E-05\n", - "[ NORMAL ] Iteration 285:\tk_eff = 1.221674\tres = 3.891E-05\n", - "[ NORMAL ] Iteration 286:\tk_eff = 1.221719\tres = 3.796E-05\n", - "[ NORMAL ] Iteration 287:\tk_eff = 1.221763\tres = 3.703E-05\n", - "[ NORMAL ] Iteration 288:\tk_eff = 1.221806\tres = 3.613E-05\n", - "[ NORMAL ] Iteration 289:\tk_eff = 1.221848\tres = 3.524E-05\n", - "[ NORMAL ] Iteration 290:\tk_eff = 1.221889\tres = 3.438E-05\n", - "[ NORMAL ] Iteration 291:\tk_eff = 1.221929\tres = 3.354E-05\n", - "[ NORMAL ] Iteration 292:\tk_eff = 1.221968\tres = 3.272E-05\n", - "[ NORMAL ] Iteration 293:\tk_eff = 1.222006\tres = 3.192E-05\n", - "[ NORMAL ] Iteration 294:\tk_eff = 1.222043\tres = 3.114E-05\n", - "[ NORMAL ] Iteration 295:\tk_eff = 1.222079\tres = 3.038E-05\n", - "[ NORMAL ] Iteration 296:\tk_eff = 1.222115\tres = 2.964E-05\n", - "[ NORMAL ] Iteration 297:\tk_eff = 1.222149\tres = 2.891E-05\n", - "[ NORMAL ] Iteration 298:\tk_eff = 1.222183\tres = 2.821E-05\n", - "[ NORMAL ] Iteration 299:\tk_eff = 1.222216\tres = 2.752E-05\n", - "[ NORMAL ] Iteration 300:\tk_eff = 1.222248\tres = 2.685E-05\n", - "[ NORMAL ] Iteration 301:\tk_eff = 1.222279\tres = 2.619E-05\n", - "[ NORMAL ] Iteration 302:\tk_eff = 1.222309\tres = 2.555E-05\n", - "[ NORMAL ] Iteration 303:\tk_eff = 1.222339\tres = 2.492E-05\n", - "[ NORMAL ] Iteration 304:\tk_eff = 1.222368\tres = 2.432E-05\n", - "[ NORMAL ] Iteration 305:\tk_eff = 1.222396\tres = 2.372E-05\n", - "[ NORMAL ] Iteration 306:\tk_eff = 1.222424\tres = 2.314E-05\n", - "[ NORMAL ] Iteration 307:\tk_eff = 1.222451\tres = 2.258E-05\n", - "[ NORMAL ] Iteration 308:\tk_eff = 1.222477\tres = 2.202E-05\n", - "[ NORMAL ] Iteration 309:\tk_eff = 1.222503\tres = 2.149E-05\n", - "[ NORMAL ] Iteration 310:\tk_eff = 1.222528\tres = 2.096E-05\n", - "[ NORMAL ] Iteration 311:\tk_eff = 1.222552\tres = 2.045E-05\n", - "[ NORMAL ] Iteration 312:\tk_eff = 1.222576\tres = 1.995E-05\n", - "[ NORMAL ] Iteration 313:\tk_eff = 1.222599\tres = 1.946E-05\n", - "[ NORMAL ] Iteration 314:\tk_eff = 1.222622\tres = 1.899E-05\n", - "[ NORMAL ] Iteration 315:\tk_eff = 1.222644\tres = 1.852E-05\n", - "[ NORMAL ] Iteration 316:\tk_eff = 1.222665\tres = 1.807E-05\n", - "[ NORMAL ] Iteration 317:\tk_eff = 1.222686\tres = 1.763E-05\n", - "[ NORMAL ] Iteration 318:\tk_eff = 1.222707\tres = 1.720E-05\n", - "[ NORMAL ] Iteration 319:\tk_eff = 1.222727\tres = 1.678E-05\n", - "[ NORMAL ] Iteration 320:\tk_eff = 1.222746\tres = 1.637E-05\n", - "[ NORMAL ] Iteration 321:\tk_eff = 1.222766\tres = 1.597E-05\n", - "[ NORMAL ] Iteration 322:\tk_eff = 1.222784\tres = 1.558E-05\n", - "[ NORMAL ] Iteration 323:\tk_eff = 1.222802\tres = 1.520E-05\n", - "[ NORMAL ] Iteration 324:\tk_eff = 1.222820\tres = 1.483E-05\n", - "[ NORMAL ] Iteration 325:\tk_eff = 1.222837\tres = 1.446E-05\n", - "[ NORMAL ] Iteration 326:\tk_eff = 1.222854\tres = 1.411E-05\n", - "[ NORMAL ] Iteration 327:\tk_eff = 1.222870\tres = 1.377E-05\n", - "[ NORMAL ] Iteration 328:\tk_eff = 1.222886\tres = 1.343E-05\n", - "[ NORMAL ] Iteration 329:\tk_eff = 1.222902\tres = 1.310E-05\n", - "[ NORMAL ] Iteration 330:\tk_eff = 1.222917\tres = 1.278E-05\n", - "[ NORMAL ] Iteration 331:\tk_eff = 1.222932\tres = 1.247E-05\n", - "[ NORMAL ] Iteration 332:\tk_eff = 1.222947\tres = 1.216E-05\n", - "[ NORMAL ] Iteration 333:\tk_eff = 1.222961\tres = 1.187E-05\n", - "[ NORMAL ] Iteration 334:\tk_eff = 1.222975\tres = 1.158E-05\n", - "[ NORMAL ] Iteration 335:\tk_eff = 1.222988\tres = 1.129E-05\n", - "[ NORMAL ] Iteration 336:\tk_eff = 1.223001\tres = 1.102E-05\n", - "[ NORMAL ] Iteration 337:\tk_eff = 1.223014\tres = 1.075E-05\n", - "[ NORMAL ] Iteration 338:\tk_eff = 1.223027\tres = 1.049E-05\n", - "[ NORMAL ] Iteration 339:\tk_eff = 1.223039\tres = 1.023E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.495816\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.557477\tres = 5.042E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.518301\tres = 1.244E-01\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.509212\tres = 7.027E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.496490\tres = 1.754E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.488581\tres = 2.498E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.482897\tres = 1.593E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.479775\tres = 1.163E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.478834\tres = 6.465E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.479871\tres = 1.960E-03\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.482684\tres = 2.165E-03\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.487084\tres = 5.860E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.492900\tres = 9.116E-03\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.499971\tres = 1.194E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.508153\tres = 1.435E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.517312\tres = 1.637E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.527325\tres = 1.802E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.538079\tres = 1.936E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.549472\tres = 2.039E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.561410\tres = 2.117E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.573807\tres = 2.173E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.586585\tres = 2.208E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.599674\tres = 2.227E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.613007\tres = 2.231E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.626528\tres = 2.223E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.640181\tres = 2.206E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.653920\tres = 2.179E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.667700\tres = 2.146E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.681483\tres = 2.107E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.695234\tres = 2.064E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.708921\tres = 2.018E-02\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.722515\tres = 1.969E-02\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.735993\tres = 1.918E-02\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.749331\tres = 1.865E-02\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.762510\tres = 1.812E-02\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.775514\tres = 1.759E-02\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.788326\tres = 1.705E-02\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.800935\tres = 1.652E-02\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.813328\tres = 1.599E-02\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.825497\tres = 1.547E-02\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.837433\tres = 1.496E-02\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.849130\tres = 1.446E-02\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.860583\tres = 1.397E-02\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.871788\tres = 1.349E-02\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.882742\tres = 1.302E-02\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.893442\tres = 1.256E-02\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.903887\tres = 1.212E-02\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.914077\tres = 1.169E-02\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.924012\tres = 1.127E-02\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.933693\tres = 1.087E-02\n", + "[ NORMAL ] Iteration 50:\tk_eff = 0.943122\tres = 1.048E-02\n", + "[ NORMAL ] Iteration 51:\tk_eff = 0.952299\tres = 1.010E-02\n", + "[ NORMAL ] Iteration 52:\tk_eff = 0.961228\tres = 9.730E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 0.969911\tres = 9.377E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 0.978351\tres = 9.033E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 0.986552\tres = 8.702E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 0.994517\tres = 8.382E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.002250\tres = 8.074E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.009755\tres = 7.776E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.017037\tres = 7.488E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.024099\tres = 7.211E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.030947\tres = 6.944E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.037584\tres = 6.687E-03\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.044016\tres = 6.438E-03\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.050247\tres = 6.199E-03\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.056282\tres = 5.969E-03\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.062125\tres = 5.746E-03\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.067781\tres = 5.531E-03\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.073255\tres = 5.326E-03\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.078552\tres = 5.126E-03\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.083676\tres = 4.936E-03\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.088632\tres = 4.751E-03\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.093425\tres = 4.573E-03\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.098058\tres = 4.403E-03\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.102537\tres = 4.237E-03\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.106866\tres = 4.079E-03\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.111049\tres = 3.926E-03\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.115090\tres = 3.779E-03\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.118995\tres = 3.638E-03\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.122766\tres = 3.501E-03\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.126408\tres = 3.370E-03\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.129925\tres = 3.244E-03\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.133320\tres = 3.122E-03\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.136597\tres = 3.005E-03\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.139761\tres = 2.892E-03\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.142815\tres = 2.783E-03\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.145761\tres = 2.679E-03\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.148605\tres = 2.579E-03\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.151348\tres = 2.482E-03\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.153994\tres = 2.388E-03\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.156547\tres = 2.299E-03\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.159009\tres = 2.212E-03\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.161384\tres = 2.129E-03\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.163674\tres = 2.049E-03\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.165882\tres = 1.972E-03\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.168012\tres = 1.898E-03\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.170064\tres = 1.827E-03\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.172043\tres = 1.757E-03\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.173951\tres = 1.692E-03\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.175790\tres = 1.628E-03\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.177562\tres = 1.566E-03\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.179269\tres = 1.507E-03\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.180916\tres = 1.450E-03\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.182502\tres = 1.396E-03\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.184030\tres = 1.343E-03\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.185503\tres = 1.292E-03\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.186922\tres = 1.244E-03\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.188288\tres = 1.197E-03\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.189606\tres = 1.151E-03\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.190874\tres = 1.108E-03\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.192096\tres = 1.066E-03\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.193273\tres = 1.026E-03\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.194407\tres = 9.870E-04\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.195499\tres = 9.504E-04\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.196550\tres = 9.140E-04\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.197563\tres = 8.792E-04\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.198538\tres = 8.468E-04\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.199477\tres = 8.140E-04\n", + "[ NORMAL ] Iteration 118:\tk_eff = 1.200382\tres = 7.837E-04\n", + "[ NORMAL ] Iteration 119:\tk_eff = 1.201253\tres = 7.539E-04\n", + "[ NORMAL ] Iteration 120:\tk_eff = 1.202091\tres = 7.257E-04\n", + "[ NORMAL ] Iteration 121:\tk_eff = 1.202898\tres = 6.979E-04\n", + "[ NORMAL ] Iteration 122:\tk_eff = 1.203676\tres = 6.716E-04\n", + "[ NORMAL ] Iteration 123:\tk_eff = 1.204424\tres = 6.465E-04\n", + "[ NORMAL ] Iteration 124:\tk_eff = 1.205144\tres = 6.217E-04\n", + "[ NORMAL ] Iteration 125:\tk_eff = 1.205838\tres = 5.979E-04\n", + "[ NORMAL ] Iteration 126:\tk_eff = 1.206505\tres = 5.760E-04\n", + "[ NORMAL ] Iteration 127:\tk_eff = 1.207148\tres = 5.532E-04\n", + "[ NORMAL ] Iteration 128:\tk_eff = 1.207767\tres = 5.325E-04\n", + "[ NORMAL ] Iteration 129:\tk_eff = 1.208363\tres = 5.125E-04\n", + "[ NORMAL ] Iteration 130:\tk_eff = 1.208936\tres = 4.935E-04\n", + "[ NORMAL ] Iteration 131:\tk_eff = 1.209487\tres = 4.744E-04\n", + "[ NORMAL ] Iteration 132:\tk_eff = 1.210018\tres = 4.559E-04\n", + "[ NORMAL ] Iteration 133:\tk_eff = 1.210529\tres = 4.392E-04\n", + "[ NORMAL ] Iteration 134:\tk_eff = 1.211021\tres = 4.223E-04\n", + "[ NORMAL ] Iteration 135:\tk_eff = 1.211495\tres = 4.060E-04\n", + "[ NORMAL ] Iteration 136:\tk_eff = 1.211951\tres = 3.914E-04\n", + "[ NORMAL ] Iteration 137:\tk_eff = 1.212390\tres = 3.763E-04\n", + "[ NORMAL ] Iteration 138:\tk_eff = 1.212812\tres = 3.623E-04\n", + "[ NORMAL ] Iteration 139:\tk_eff = 1.213217\tres = 3.480E-04\n", + "[ NORMAL ] Iteration 140:\tk_eff = 1.213608\tres = 3.344E-04\n", + "[ NORMAL ] Iteration 141:\tk_eff = 1.213984\tres = 3.223E-04\n", + "[ NORMAL ] Iteration 142:\tk_eff = 1.214347\tres = 3.097E-04\n", + "[ NORMAL ] Iteration 143:\tk_eff = 1.214695\tres = 2.985E-04\n", + "[ NORMAL ] Iteration 144:\tk_eff = 1.215031\tres = 2.869E-04\n", + "[ NORMAL ] Iteration 145:\tk_eff = 1.215352\tres = 2.763E-04\n", + "[ NORMAL ] Iteration 146:\tk_eff = 1.215663\tres = 2.648E-04\n", + "[ NORMAL ] Iteration 147:\tk_eff = 1.215962\tres = 2.552E-04\n", + "[ NORMAL ] Iteration 148:\tk_eff = 1.216249\tres = 2.460E-04\n", + "[ NORMAL ] Iteration 149:\tk_eff = 1.216526\tres = 2.362E-04\n", + "[ NORMAL ] Iteration 150:\tk_eff = 1.216792\tres = 2.279E-04\n", + "[ NORMAL ] Iteration 151:\tk_eff = 1.217048\tres = 2.188E-04\n", + "[ NORMAL ] Iteration 152:\tk_eff = 1.217294\tres = 2.100E-04\n", + "[ NORMAL ] Iteration 153:\tk_eff = 1.217531\tres = 2.024E-04\n", + "[ NORMAL ] Iteration 154:\tk_eff = 1.217759\tres = 1.948E-04\n", + "[ NORMAL ] Iteration 155:\tk_eff = 1.217978\tres = 1.872E-04\n", + "[ NORMAL ] Iteration 156:\tk_eff = 1.218189\tres = 1.799E-04\n", + "[ NORMAL ] Iteration 157:\tk_eff = 1.218393\tres = 1.733E-04\n", + "[ NORMAL ] Iteration 158:\tk_eff = 1.218588\tres = 1.668E-04\n", + "[ NORMAL ] Iteration 159:\tk_eff = 1.218776\tres = 1.600E-04\n", + "[ NORMAL ] Iteration 160:\tk_eff = 1.218957\tres = 1.544E-04\n", + "[ NORMAL ] Iteration 161:\tk_eff = 1.219131\tres = 1.485E-04\n", + "[ NORMAL ] Iteration 162:\tk_eff = 1.219298\tres = 1.428E-04\n", + "[ NORMAL ] Iteration 163:\tk_eff = 1.219459\tres = 1.374E-04\n", + "[ NORMAL ] Iteration 164:\tk_eff = 1.219614\tres = 1.321E-04\n", + "[ NORMAL ] Iteration 165:\tk_eff = 1.219763\tres = 1.270E-04\n", + "[ NORMAL ] Iteration 166:\tk_eff = 1.219906\tres = 1.221E-04\n", + "[ NORMAL ] Iteration 167:\tk_eff = 1.220044\tres = 1.175E-04\n", + "[ NORMAL ] Iteration 168:\tk_eff = 1.220177\tres = 1.130E-04\n", + "[ NORMAL ] Iteration 169:\tk_eff = 1.220304\tres = 1.084E-04\n", + "[ NORMAL ] Iteration 170:\tk_eff = 1.220427\tres = 1.045E-04\n", + "[ NORMAL ] Iteration 171:\tk_eff = 1.220545\tres = 1.007E-04\n", + "[ NORMAL ] Iteration 172:\tk_eff = 1.220659\tres = 9.678E-05\n", + "[ NORMAL ] Iteration 173:\tk_eff = 1.220768\tres = 9.304E-05\n", + "[ NORMAL ] Iteration 174:\tk_eff = 1.220874\tres = 8.984E-05\n", + "[ NORMAL ] Iteration 175:\tk_eff = 1.220975\tres = 8.640E-05\n", + "[ NORMAL ] Iteration 176:\tk_eff = 1.221073\tres = 8.326E-05\n", + "[ NORMAL ] Iteration 177:\tk_eff = 1.221166\tres = 7.985E-05\n", + "[ NORMAL ] Iteration 178:\tk_eff = 1.221256\tres = 7.662E-05\n", + "[ NORMAL ] Iteration 179:\tk_eff = 1.221343\tres = 7.371E-05\n", + "[ NORMAL ] Iteration 180:\tk_eff = 1.221426\tres = 7.091E-05\n", + "[ NORMAL ] Iteration 181:\tk_eff = 1.221506\tres = 6.827E-05\n", + "[ NORMAL ] Iteration 182:\tk_eff = 1.221583\tres = 6.560E-05\n", + "[ NORMAL ] Iteration 183:\tk_eff = 1.221657\tres = 6.320E-05\n", + "[ NORMAL ] Iteration 184:\tk_eff = 1.221729\tres = 6.067E-05\n", + "[ NORMAL ] Iteration 185:\tk_eff = 1.221797\tres = 5.829E-05\n", + "[ NORMAL ] Iteration 186:\tk_eff = 1.221863\tres = 5.641E-05\n", + "[ NORMAL ] Iteration 187:\tk_eff = 1.221927\tres = 5.382E-05\n", + "[ NORMAL ] Iteration 188:\tk_eff = 1.221987\tres = 5.196E-05\n", + "[ NORMAL ] Iteration 189:\tk_eff = 1.222046\tres = 4.968E-05\n", + "[ NORMAL ] Iteration 190:\tk_eff = 1.222102\tres = 4.810E-05\n", + "[ NORMAL ] Iteration 191:\tk_eff = 1.222157\tres = 4.617E-05\n", + "[ NORMAL ] Iteration 192:\tk_eff = 1.222209\tres = 4.456E-05\n", + "[ NORMAL ] Iteration 193:\tk_eff = 1.222260\tres = 4.287E-05\n", + "[ NORMAL ] Iteration 194:\tk_eff = 1.222308\tres = 4.122E-05\n", + "[ NORMAL ] Iteration 195:\tk_eff = 1.222355\tres = 3.971E-05\n", + "[ NORMAL ] Iteration 196:\tk_eff = 1.222399\tres = 3.805E-05\n", + "[ NORMAL ] Iteration 197:\tk_eff = 1.222442\tres = 3.657E-05\n", + "[ NORMAL ] Iteration 198:\tk_eff = 1.222484\tres = 3.521E-05\n", + "[ NORMAL ] Iteration 199:\tk_eff = 1.222523\tres = 3.381E-05\n", + "[ NORMAL ] Iteration 200:\tk_eff = 1.222561\tres = 3.262E-05\n", + "[ NORMAL ] Iteration 201:\tk_eff = 1.222598\tres = 3.107E-05\n", + "[ NORMAL ] Iteration 202:\tk_eff = 1.222634\tres = 2.985E-05\n", + "[ NORMAL ] Iteration 203:\tk_eff = 1.222668\tres = 2.902E-05\n", + "[ NORMAL ] Iteration 204:\tk_eff = 1.222700\tres = 2.804E-05\n", + "[ NORMAL ] Iteration 205:\tk_eff = 1.222732\tres = 2.639E-05\n", + "[ NORMAL ] Iteration 206:\tk_eff = 1.222762\tres = 2.577E-05\n", + "[ NORMAL ] Iteration 207:\tk_eff = 1.222792\tres = 2.487E-05\n", + "[ NORMAL ] Iteration 208:\tk_eff = 1.222820\tres = 2.400E-05\n", + "[ NORMAL ] Iteration 209:\tk_eff = 1.222847\tres = 2.291E-05\n", + "[ NORMAL ] Iteration 210:\tk_eff = 1.222872\tres = 2.200E-05\n", + "[ NORMAL ] Iteration 211:\tk_eff = 1.222897\tres = 2.121E-05\n", + "[ NORMAL ] Iteration 212:\tk_eff = 1.222921\tres = 2.040E-05\n", + "[ NORMAL ] Iteration 213:\tk_eff = 1.222944\tres = 1.964E-05\n", + "[ NORMAL ] Iteration 214:\tk_eff = 1.222967\tres = 1.882E-05\n", + "[ NORMAL ] Iteration 215:\tk_eff = 1.222988\tres = 1.821E-05\n", + "[ NORMAL ] Iteration 216:\tk_eff = 1.223009\tres = 1.763E-05\n", + "[ NORMAL ] Iteration 217:\tk_eff = 1.223029\tres = 1.690E-05\n", + "[ NORMAL ] Iteration 218:\tk_eff = 1.223048\tres = 1.630E-05\n", + "[ NORMAL ] Iteration 219:\tk_eff = 1.223067\tres = 1.572E-05\n", + "[ NORMAL ] Iteration 220:\tk_eff = 1.223084\tres = 1.507E-05\n", + "[ NORMAL ] Iteration 221:\tk_eff = 1.223101\tres = 1.427E-05\n", + "[ NORMAL ] Iteration 222:\tk_eff = 1.223117\tres = 1.394E-05\n", + "[ NORMAL ] Iteration 223:\tk_eff = 1.223133\tres = 1.330E-05\n", + "[ NORMAL ] Iteration 224:\tk_eff = 1.223148\tres = 1.298E-05\n", + "[ NORMAL ] Iteration 225:\tk_eff = 1.223163\tres = 1.241E-05\n", + "[ NORMAL ] Iteration 226:\tk_eff = 1.223177\tres = 1.167E-05\n", + "[ NORMAL ] Iteration 227:\tk_eff = 1.223190\tres = 1.151E-05\n", + "[ NORMAL ] Iteration 228:\tk_eff = 1.223203\tres = 1.073E-05\n", + "[ NORMAL ] Iteration 229:\tk_eff = 1.223215\tres = 1.050E-05\n", + "[ NORMAL ] Iteration 230:\tk_eff = 1.223227\tres = 1.000E-05\n" ] } ], @@ -1876,8 +1699,8 @@ "output_type": "stream", "text": [ "openmc keff = 1.223474\n", - "openmoc keff = 1.223039\n", - "bias [pcm]: -43.5\n" + "openmoc keff = 1.223227\n", + "bias [pcm]: -24.7\n" ] } ], @@ -1962,9 +1785,9 @@ }, { "data": { - "image/png": "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\nYwHYAAAAAElFTkSuQmCC\n", + "image/png": "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\nRK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1973,7 +1796,7 @@ ], "source": [ "# Create a loglog plot of the U-235 continuous-energy fission cross section \n", - "plt.loglog(fission.xs.x, fission.xs.y, color='b', linewidth=1)\n", + "plt.loglog(fission.xs['294K'].x, fission.xs['294K'].y, color='b', linewidth=1)\n", "\n", "# Extract energy group bounds and MGXS values to plot\n", "nufission = xs_library[fuel_cell.id]['fission']\n", @@ -1983,7 +1806,7 @@ "y = np.squeeze(y)\n", "\n", "# Fix low energy bound to the value defined by the ACE library\n", - "x[0] = fission.xs.x[0]\n", + "x[0] = fission.xs['294K'].x[0]\n", "\n", "# Extend the mgxs values array for matplotlib's step plot\n", "y = np.insert(y, 0, y[0])\n", @@ -2046,9 +1869,9 @@ "outputs": [ { "data": { - "image/png": "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\nZlZT/x9xJfW8VvykSgAAAABJRU5ErkJggg==\n", + "image/png": "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\nfn35+EIOpHUAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2088,21 +1911,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" + "pygments_lexer": "ipython3", + "version": "3.5.2" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb index af9f2878fe..0c8b843be1 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iii.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iii.ipynb @@ -32,7 +32,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/__init__.py:1357: UserWarning: This call to matplotlib.use() has no effect\n", + "/home/romano/miniconda3/envs/default/lib/python3.5/site-packages/matplotlib/__init__.py:1350: UserWarning: This call to matplotlib.use() has no effect\n", "because the backend has already been chosen;\n", "matplotlib.use() must be called *before* pylab, matplotlib.pyplot,\n", "or matplotlib.backends is imported for the first time.\n", @@ -135,7 +135,6 @@ "source": [ "# Instantiate a Materials object\n", "materials_file = openmc.Materials((fuel, water, zircaloy))\n", - "materials_file.default_xs = '71c'\n", "\n", "# Export to \"materials.xml\"\n", "materials_file.export_to_xml()" @@ -458,7 +457,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -716,24 +715,37 @@ "output_type": "stream", "text": [ "\n", - " .d88888b. 888b d888 .d8888b.\n", - " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", - " 888 888 88888b.d88888 888 888\n", - " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", - " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", - " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", - " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", - " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", - "__________________888______________________________________________________\n", - " 888\n", - " 888\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", - " Copyright: 2011-2016 Massachusetts Institute of Technology\n", - " License: http://openmc.readthedocs.io/en/latest/license.html\n", - " Version: 0.8.0\n", - " Git SHA1: be7e6e035d22944a8c80ca32f99935b6822854c9\n", - " Date/Time: 2016-08-10 18:33:28\n", - " MPI Processes: 1\n", + " | The OpenMC Monte Carlo Code\n", + " Copyright | 2011-2016 Massachusetts Institute of Technology\n", + " License | http://openmc.readthedocs.io/en/latest/license.html\n", + " Version | 0.8.0\n", + " Git SHA1 | fbebf7bf709fe2fe1813af95bff9b29c0d59312c\n", + " Date/Time | 2016-08-31 10:44:00\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -743,13 +755,13 @@ " Reading geometry XML file...\n", " Reading cross sections XML file...\n", " Reading materials XML file...\n", - " Reading U235.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/U235_71c.h5\n", - " Reading U238.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/U238_71c.h5\n", - " Reading O16.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/O16_71c.h5\n", - " Reading H1.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/H1_71c.h5\n", - " Reading B10.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/B10_71c.h5\n", - " Reading Zr90.71c from /Users/sam/git/openmc-sam/data/nndc_hdf5/Zr90_71c.h5\n", - " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", + " Reading U235 from /home/romano/openmc/data/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/romano/openmc/data/nndc_hdf5/U238.h5\n", + " Reading O16 from /home/romano/openmc/data/nndc_hdf5/O16.h5\n", + " Reading H1 from /home/romano/openmc/data/nndc_hdf5/H1.h5\n", + " Reading B10 from /home/romano/openmc/data/nndc_hdf5/B10.h5\n", + " Reading Zr90 from /home/romano/openmc/data/nndc_hdf5/Zr90.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", " Initializing source particles...\n", @@ -784,32 +796,32 @@ " 22/1 1.04175 1.02516 +/- 0.00588\n", " 23/1 1.01909 1.02469 +/- 0.00543\n", " 24/1 1.07119 1.02801 +/- 0.00603\n", - " 25/1 0.97414 1.02442 +/- 0.00666\n", - " 26/1 1.04709 1.02584 +/- 0.00639\n", - " 27/1 1.05872 1.02777 +/- 0.00631\n", - " 28/1 1.03930 1.02841 +/- 0.00598\n", - " 29/1 1.01488 1.02770 +/- 0.00570\n", - " 30/1 1.04513 1.02857 +/- 0.00548\n", - " 31/1 0.99538 1.02699 +/- 0.00545\n", - " 32/1 1.00106 1.02581 +/- 0.00532\n", - " 33/1 0.99389 1.02442 +/- 0.00527\n", - " 34/1 0.99938 1.02338 +/- 0.00516\n", - " 35/1 1.02161 1.02331 +/- 0.00495\n", - " 36/1 1.04084 1.02398 +/- 0.00480\n", - " 37/1 0.98801 1.02265 +/- 0.00481\n", - " 38/1 1.01348 1.02232 +/- 0.00464\n", - " 39/1 1.06693 1.02386 +/- 0.00474\n", - " 40/1 1.07729 1.02564 +/- 0.00491\n", - " 41/1 1.03191 1.02585 +/- 0.00475\n", - " 42/1 1.05209 1.02667 +/- 0.00468\n", - " 43/1 1.02997 1.02677 +/- 0.00453\n", - " 44/1 1.07288 1.02812 +/- 0.00460\n", - " 45/1 1.01268 1.02768 +/- 0.00449\n", - " 46/1 1.03759 1.02796 +/- 0.00437\n", - " 47/1 1.02620 1.02791 +/- 0.00425\n", - " 48/1 1.02509 1.02783 +/- 0.00414\n", - " 49/1 1.01043 1.02739 +/- 0.00406\n", - " 50/1 1.01457 1.02707 +/- 0.00397\n", + " 25/1 0.97445 1.02444 +/- 0.00665\n", + " 26/1 1.04737 1.02588 +/- 0.00638\n", + " 27/1 1.04656 1.02709 +/- 0.00612\n", + " 28/1 1.03464 1.02751 +/- 0.00578\n", + " 29/1 1.02528 1.02739 +/- 0.00547\n", + " 30/1 1.02799 1.02742 +/- 0.00519\n", + " 31/1 1.05846 1.02890 +/- 0.00516\n", + " 32/1 1.03811 1.02932 +/- 0.00493\n", + " 33/1 1.00894 1.02843 +/- 0.00480\n", + " 34/1 1.02049 1.02810 +/- 0.00460\n", + " 35/1 1.00690 1.02726 +/- 0.00450\n", + " 36/1 1.03129 1.02741 +/- 0.00432\n", + " 37/1 0.98864 1.02597 +/- 0.00440\n", + " 38/1 1.00017 1.02505 +/- 0.00434\n", + " 39/1 1.03635 1.02544 +/- 0.00421\n", + " 40/1 1.07090 1.02696 +/- 0.00434\n", + " 41/1 1.03141 1.02710 +/- 0.00420\n", + " 42/1 1.02624 1.02707 +/- 0.00406\n", + " 43/1 1.02668 1.02706 +/- 0.00394\n", + " 44/1 1.05940 1.02801 +/- 0.00394\n", + " 45/1 1.01149 1.02754 +/- 0.00385\n", + " 46/1 1.06958 1.02871 +/- 0.00392\n", + " 47/1 1.02674 1.02866 +/- 0.00381\n", + " 48/1 1.02542 1.02857 +/- 0.00371\n", + " 49/1 1.03516 1.02874 +/- 0.00362\n", + " 50/1 1.06818 1.02973 +/- 0.00366\n", " Creating state point statepoint.50.h5...\n", "\n", " ===========================================================================\n", @@ -819,27 +831,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.3000E-01 seconds\n", - " Reading cross sections = 2.2800E-01 seconds\n", - " Total time in simulation = 6.1235E+01 seconds\n", - " Time in transport only = 6.1207E+01 seconds\n", - " Time in inactive batches = 5.0280E+00 seconds\n", - " Time in active batches = 5.6207E+01 seconds\n", - " Time synchronizing fission bank = 7.0000E-03 seconds\n", + " Total time for initialization = 6.4800E-01 seconds\n", + " Reading cross sections = 4.8000E-01 seconds\n", + " Total time in simulation = 3.2830E+01 seconds\n", + " Time in transport only = 3.2659E+01 seconds\n", + " Time in inactive batches = 2.7510E+00 seconds\n", + " Time in active batches = 3.0079E+01 seconds\n", + " Time synchronizing fission bank = 9.0000E-03 seconds\n", " Sampling source sites = 4.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 2.0000E-03 seconds\n", + " SEND/RECV source sites = 5.0000E-03 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 6.1689E+01 seconds\n", - " Calculation Rate (inactive) = 4972.16 neutrons/second\n", - " Calculation Rate (active) = 1779.14 neutrons/second\n", + " Total time elapsed = 3.3498E+01 seconds\n", + " Calculation Rate (inactive) = 9087.60 neutrons/second\n", + " Calculation Rate (active) = 3324.58 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.02489 +/- 0.00308\n", - " k-effective (Track-length) = 1.02707 +/- 0.00397\n", - " k-effective (Absorption) = 1.02637 +/- 0.00325\n", - " Combined k-effective = 1.02581 +/- 0.00264\n", + " k-effective (Collision) = 1.02763 +/- 0.00343\n", + " k-effective (Track-length) = 1.02973 +/- 0.00366\n", + " k-effective (Absorption) = 1.02732 +/- 0.00319\n", + " Combined k-effective = 1.02826 +/- 0.00259\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -955,13 +967,6 @@ "collapsed": false }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7.egg/openmc/tallies.py:1944: RuntimeWarning: invalid value encountered in true_divide\n" - ] - }, { "data": { "text/html": [ @@ -983,16 +988,16 @@ " 10000\n", " 1\n", " U235\n", - " 8.046809e-03\n", - " 2.697198e-05\n", + " 8.055246e-03\n", + " 2.857567e-05\n", " \n", " \n", " 4\n", " 10000\n", " 1\n", " U238\n", - " 7.366624e-03\n", - " 4.255197e-05\n", + " 7.339215e-03\n", + " 4.349466e-05\n", " \n", " \n", " 5\n", @@ -1007,16 +1012,16 @@ " 10000\n", " 2\n", " U235\n", - " 3.614917e-01\n", - " 2.135233e-03\n", + " 3.615565e-01\n", + " 2.050486e-03\n", " \n", " \n", " 1\n", " 10000\n", " 2\n", " U238\n", - " 6.741607e-07\n", - " 3.924924e-09\n", + " 6.742638e-07\n", + " 3.795256e-09\n", " \n", " \n", " 2\n", @@ -1032,11 +1037,11 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "3 10000 1 U235 8.046809e-03 2.697198e-05\n", - "4 10000 1 U238 7.366624e-03 4.255197e-05\n", + "3 10000 1 U235 8.055246e-03 2.857567e-05\n", + "4 10000 1 U238 7.339215e-03 4.349466e-05\n", "5 10000 1 O16 0.000000e+00 0.000000e+00\n", - "0 10000 2 U235 3.614917e-01 2.135233e-03\n", - "1 10000 2 U238 6.741607e-07 3.924924e-09\n", + "0 10000 2 U235 3.615565e-01 2.050486e-03\n", + "1 10000 2 U238 6.742638e-07 3.795256e-09\n", "2 10000 2 O16 0.000000e+00 0.000000e+00" ] }, @@ -1074,13 +1079,13 @@ "\tDomain ID =\t10000\n", "\tNuclide =\tU235\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t8.05e-03 +/- 3.35e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t3.61e-01 +/- 5.91e-01%\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t8.06e-03 +/- 3.55e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t3.62e-01 +/- 5.67e-01%\n", "\n", "\tNuclide =\tU238\n", "\tCross Sections [cm^-1]:\n", - " Group 1 [6.25e-07 - 20.0 MeV]:\t7.37e-03 +/- 5.78e-01%\n", - " Group 2 [0.0 - 6.25e-07 MeV]:\t6.74e-07 +/- 5.82e-01%\n", + " Group 1 [6.25e-07 - 20.0 MeV]:\t7.34e-03 +/- 5.93e-01%\n", + " Group 2 [0.0 - 6.25e-07 MeV]:\t6.74e-07 +/- 5.63e-01%\n", "\n", "\tNuclide =\tO16\n", "\tCross Sections [cm^-1]:\n", @@ -1196,16 +1201,16 @@ " 10000\n", " 1\n", " U235\n", - " 0.074734\n", - " 0.000325\n", + " 0.074860\n", + " 0.000303\n", " \n", " \n", " 1\n", " 10000\n", " 1\n", " U238\n", - " 0.005977\n", - " 0.000034\n", + " 0.005952\n", + " 0.000035\n", " \n", " \n", " 2\n", @@ -1221,8 +1226,8 @@ ], "text/plain": [ " cell group in nuclide mean std. dev.\n", - "0 10000 1 U235 0.074734 0.000325\n", - "1 10000 1 U238 0.005977 0.000034\n", + "0 10000 1 U235 0.074860 0.000303\n", + "1 10000 1 U238 0.005952 0.000035\n", "2 10000 1 O16 0.000000 0.000000" ] }, @@ -1305,131 +1310,124 @@ "text": [ "[ NORMAL ] Importing ray tracing data from file...\n", "[ NORMAL ] Computing the eigenvalue...\n", - "[ NORMAL ] Iteration 0:\tk_eff = 0.823582\tres = 0.000E+00\n", - "[ NORMAL ] Iteration 1:\tk_eff = 0.780361\tres = 1.940E-01\n", - "[ NORMAL ] Iteration 2:\tk_eff = 0.739500\tres = 6.545E-02\n", - "[ NORMAL ] Iteration 3:\tk_eff = 0.710868\tres = 5.284E-02\n", - "[ NORMAL ] Iteration 4:\tk_eff = 0.689663\tres = 3.926E-02\n", - "[ NORMAL ] Iteration 5:\tk_eff = 0.675035\tres = 3.007E-02\n", - "[ NORMAL ] Iteration 6:\tk_eff = 0.665831\tres = 2.137E-02\n", - "[ NORMAL ] Iteration 7:\tk_eff = 0.661179\tres = 1.377E-02\n", - "[ NORMAL ] Iteration 8:\tk_eff = 0.660309\tres = 7.167E-03\n", - "[ NORMAL ] Iteration 9:\tk_eff = 0.662566\tres = 1.972E-03\n", - "[ NORMAL ] Iteration 10:\tk_eff = 0.667383\tres = 3.708E-03\n", - "[ NORMAL ] Iteration 11:\tk_eff = 0.674274\tres = 7.412E-03\n", - "[ NORMAL ] Iteration 12:\tk_eff = 0.682821\tres = 1.043E-02\n", - "[ NORMAL ] Iteration 13:\tk_eff = 0.692664\tres = 1.276E-02\n", - "[ NORMAL ] Iteration 14:\tk_eff = 0.703499\tres = 1.449E-02\n", - "[ NORMAL ] Iteration 15:\tk_eff = 0.715063\tres = 1.571E-02\n", - "[ NORMAL ] Iteration 16:\tk_eff = 0.727136\tres = 1.650E-02\n", - "[ NORMAL ] Iteration 17:\tk_eff = 0.739531\tres = 1.694E-02\n", - "[ NORMAL ] Iteration 18:\tk_eff = 0.752091\tres = 1.710E-02\n", - "[ NORMAL ] Iteration 19:\tk_eff = 0.764686\tres = 1.703E-02\n", - "[ NORMAL ] Iteration 20:\tk_eff = 0.777208\tres = 1.679E-02\n", - "[ NORMAL ] Iteration 21:\tk_eff = 0.789567\tres = 1.642E-02\n", - "[ NORMAL ] Iteration 22:\tk_eff = 0.801692\tres = 1.595E-02\n", - "[ NORMAL ] Iteration 23:\tk_eff = 0.813525\tres = 1.540E-02\n", - "[ NORMAL ] Iteration 24:\tk_eff = 0.825022\tres = 1.480E-02\n", - "[ NORMAL ] Iteration 25:\tk_eff = 0.836147\tres = 1.417E-02\n", - "[ NORMAL ] Iteration 26:\tk_eff = 0.846876\tres = 1.352E-02\n", - "[ NORMAL ] Iteration 27:\tk_eff = 0.857190\tres = 1.287E-02\n", - "[ NORMAL ] Iteration 28:\tk_eff = 0.867079\tres = 1.221E-02\n", - "[ NORMAL ] Iteration 29:\tk_eff = 0.876536\tres = 1.157E-02\n", - "[ NORMAL ] Iteration 30:\tk_eff = 0.885559\tres = 1.094E-02\n", - "[ NORMAL ] Iteration 31:\tk_eff = 0.894153\tres = 1.032E-02\n", - "[ NORMAL ] Iteration 32:\tk_eff = 0.902320\tres = 9.731E-03\n", - "[ NORMAL ] Iteration 33:\tk_eff = 0.910071\tres = 9.161E-03\n", - "[ NORMAL ] Iteration 34:\tk_eff = 0.917414\tres = 8.614E-03\n", - "[ NORMAL ] Iteration 35:\tk_eff = 0.924362\tres = 8.092E-03\n", - "[ NORMAL ] Iteration 36:\tk_eff = 0.930926\tres = 7.595E-03\n", - "[ NORMAL ] Iteration 37:\tk_eff = 0.937121\tres = 7.122E-03\n", - "[ NORMAL ] Iteration 38:\tk_eff = 0.942961\tres = 6.674E-03\n", - "[ NORMAL ] Iteration 39:\tk_eff = 0.948460\tres = 6.250E-03\n", - "[ NORMAL ] Iteration 40:\tk_eff = 0.953633\tres = 5.849E-03\n", - "[ NORMAL ] Iteration 41:\tk_eff = 0.958495\tres = 5.471E-03\n", - "[ NORMAL ] Iteration 42:\tk_eff = 0.963061\tres = 5.114E-03\n", - "[ NORMAL ] Iteration 43:\tk_eff = 0.967346\tres = 4.779E-03\n", - "[ NORMAL ] Iteration 44:\tk_eff = 0.971364\tres = 4.463E-03\n", - "[ NORMAL ] Iteration 45:\tk_eff = 0.975128\tres = 4.166E-03\n", - "[ NORMAL ] Iteration 46:\tk_eff = 0.978653\tres = 3.888E-03\n", - "[ NORMAL ] Iteration 47:\tk_eff = 0.981952\tres = 3.627E-03\n", - "[ NORMAL ] Iteration 48:\tk_eff = 0.985037\tres = 3.382E-03\n", - "[ NORMAL ] Iteration 49:\tk_eff = 0.987921\tres = 3.152E-03\n", - "[ NORMAL ] Iteration 50:\tk_eff = 0.990615\tres = 2.937E-03\n", - "[ NORMAL ] Iteration 51:\tk_eff = 0.993131\tres = 2.736E-03\n", - "[ NORMAL ] Iteration 52:\tk_eff = 0.995479\tres = 2.548E-03\n", - "[ NORMAL ] Iteration 53:\tk_eff = 0.997670\tres = 2.373E-03\n", - "[ NORMAL ] Iteration 54:\tk_eff = 0.999713\tres = 2.208E-03\n", - "[ NORMAL ] Iteration 55:\tk_eff = 1.001618\tres = 2.055E-03\n", - "[ NORMAL ] Iteration 56:\tk_eff = 1.003393\tres = 1.912E-03\n", - "[ NORMAL ] Iteration 57:\tk_eff = 1.005046\tres = 1.778E-03\n", - "[ NORMAL ] Iteration 58:\tk_eff = 1.006586\tres = 1.654E-03\n", - "[ NORMAL ] Iteration 59:\tk_eff = 1.008019\tres = 1.537E-03\n", - "[ NORMAL ] Iteration 60:\tk_eff = 1.009352\tres = 1.429E-03\n", - "[ NORMAL ] Iteration 61:\tk_eff = 1.010593\tres = 1.328E-03\n", - "[ NORMAL ] Iteration 62:\tk_eff = 1.011747\tres = 1.234E-03\n", - "[ NORMAL ] Iteration 63:\tk_eff = 1.012820\tres = 1.146E-03\n", - "[ NORMAL ] Iteration 64:\tk_eff = 1.013818\tres = 1.065E-03\n", - "[ NORMAL ] Iteration 65:\tk_eff = 1.014745\tres = 9.887E-04\n", - "[ NORMAL ] Iteration 66:\tk_eff = 1.015606\tres = 9.179E-04\n", - "[ NORMAL ] Iteration 67:\tk_eff = 1.016406\tres = 8.522E-04\n", - "[ NORMAL ] Iteration 68:\tk_eff = 1.017149\tres = 7.909E-04\n", - "[ NORMAL ] Iteration 69:\tk_eff = 1.017839\tres = 7.340E-04\n", - "[ NORMAL ] Iteration 70:\tk_eff = 1.018480\tres = 6.811E-04\n", - "[ NORMAL ] Iteration 71:\tk_eff = 1.019074\tres = 6.319E-04\n", - "[ NORMAL ] Iteration 72:\tk_eff = 1.019626\tres = 5.862E-04\n", - "[ NORMAL ] Iteration 73:\tk_eff = 1.020138\tres = 5.437E-04\n", - "[ NORMAL ] Iteration 74:\tk_eff = 1.020613\tres = 5.042E-04\n", - "[ NORMAL ] Iteration 75:\tk_eff = 1.021054\tres = 4.676E-04\n", - "[ NORMAL ] Iteration 76:\tk_eff = 1.021462\tres = 4.335E-04\n", - "[ NORMAL ] Iteration 77:\tk_eff = 1.021841\tres = 4.019E-04\n", - "[ NORMAL ] Iteration 78:\tk_eff = 1.022193\tres = 3.725E-04\n", - "[ NORMAL ] Iteration 79:\tk_eff = 1.022518\tres = 3.453E-04\n", - "[ NORMAL ] Iteration 80:\tk_eff = 1.022820\tres = 3.200E-04\n", - "[ NORMAL ] Iteration 81:\tk_eff = 1.023100\tres = 2.965E-04\n", - "[ NORMAL ] Iteration 82:\tk_eff = 1.023359\tres = 2.748E-04\n", - "[ NORMAL ] Iteration 83:\tk_eff = 1.023600\tres = 2.546E-04\n", - "[ NORMAL ] Iteration 84:\tk_eff = 1.023822\tres = 2.358E-04\n", - "[ NORMAL ] Iteration 85:\tk_eff = 1.024028\tres = 2.185E-04\n", - "[ NORMAL ] Iteration 86:\tk_eff = 1.024219\tres = 2.023E-04\n", - "[ NORMAL ] Iteration 87:\tk_eff = 1.024396\tres = 1.874E-04\n", - "[ NORMAL ] Iteration 88:\tk_eff = 1.024560\tres = 1.735E-04\n", - "[ NORMAL ] Iteration 89:\tk_eff = 1.024712\tres = 1.607E-04\n", - "[ NORMAL ] Iteration 90:\tk_eff = 1.024852\tres = 1.488E-04\n", - "[ NORMAL ] Iteration 91:\tk_eff = 1.024983\tres = 1.378E-04\n", - "[ NORMAL ] Iteration 92:\tk_eff = 1.025103\tres = 1.275E-04\n", - "[ NORMAL ] Iteration 93:\tk_eff = 1.025215\tres = 1.181E-04\n", - "[ NORMAL ] Iteration 94:\tk_eff = 1.025318\tres = 1.093E-04\n", - "[ NORMAL ] Iteration 95:\tk_eff = 1.025413\tres = 1.012E-04\n", - "[ NORMAL ] Iteration 96:\tk_eff = 1.025502\tres = 9.364E-05\n", - "[ NORMAL ] Iteration 97:\tk_eff = 1.025584\tres = 8.666E-05\n", - "[ NORMAL ] Iteration 98:\tk_eff = 1.025659\tres = 8.020E-05\n", - "[ NORMAL ] Iteration 99:\tk_eff = 1.025729\tres = 7.422E-05\n", - "[ NORMAL ] Iteration 100:\tk_eff = 1.025794\tres = 6.868E-05\n", - "[ NORMAL ] Iteration 101:\tk_eff = 1.025854\tres = 6.355E-05\n", - "[ NORMAL ] Iteration 102:\tk_eff = 1.025910\tres = 5.880E-05\n", - "[ NORMAL ] Iteration 103:\tk_eff = 1.025961\tres = 5.440E-05\n", - "[ NORMAL ] Iteration 104:\tk_eff = 1.026009\tres = 5.033E-05\n", - "[ NORMAL ] Iteration 105:\tk_eff = 1.026053\tres = 4.656E-05\n", - "[ NORMAL ] Iteration 106:\tk_eff = 1.026093\tres = 4.307E-05\n", - "[ NORMAL ] Iteration 107:\tk_eff = 1.026131\tres = 3.984E-05\n", - "[ NORMAL ] Iteration 108:\tk_eff = 1.026166\tres = 3.685E-05\n", - "[ NORMAL ] Iteration 109:\tk_eff = 1.026198\tres = 3.409E-05\n", - "[ NORMAL ] Iteration 110:\tk_eff = 1.026228\tres = 3.153E-05\n", - "[ NORMAL ] Iteration 111:\tk_eff = 1.026255\tres = 2.916E-05\n", - "[ NORMAL ] Iteration 112:\tk_eff = 1.026281\tres = 2.697E-05\n", - "[ NORMAL ] Iteration 113:\tk_eff = 1.026304\tres = 2.494E-05\n", - "[ NORMAL ] Iteration 114:\tk_eff = 1.026326\tres = 2.307E-05\n", - "[ NORMAL ] Iteration 115:\tk_eff = 1.026346\tres = 2.133E-05\n", - "[ NORMAL ] Iteration 116:\tk_eff = 1.026365\tres = 1.973E-05\n", - "[ NORMAL ] Iteration 117:\tk_eff = 1.026382\tres = 1.824E-05\n", - "[ NORMAL ] Iteration 118:\tk_eff = 1.026398\tres = 1.687E-05\n", - "[ NORMAL ] Iteration 119:\tk_eff = 1.026413\tres = 1.560E-05\n", - "[ NORMAL ] Iteration 120:\tk_eff = 1.026426\tres = 1.442E-05\n", - "[ NORMAL ] Iteration 121:\tk_eff = 1.026439\tres = 1.333E-05\n", - "[ NORMAL ] Iteration 122:\tk_eff = 1.026451\tres = 1.233E-05\n", - "[ NORMAL ] Iteration 123:\tk_eff = 1.026461\tres = 1.140E-05\n", - "[ NORMAL ] Iteration 124:\tk_eff = 1.026471\tres = 1.054E-05\n" + "[ NORMAL ] Iteration 0:\tk_eff = 0.854370\tres = 0.000E+00\n", + "[ NORMAL ] Iteration 1:\tk_eff = 0.801922\tres = 1.521E-01\n", + "[ NORMAL ] Iteration 2:\tk_eff = 0.761745\tres = 6.349E-02\n", + "[ NORMAL ] Iteration 3:\tk_eff = 0.732366\tres = 5.029E-02\n", + "[ NORMAL ] Iteration 4:\tk_eff = 0.711073\tres = 3.869E-02\n", + "[ NORMAL ] Iteration 5:\tk_eff = 0.696554\tres = 2.912E-02\n", + "[ NORMAL ] Iteration 6:\tk_eff = 0.687670\tres = 2.044E-02\n", + "[ NORMAL ] Iteration 7:\tk_eff = 0.683465\tres = 1.277E-02\n", + "[ NORMAL ] Iteration 8:\tk_eff = 0.683124\tres = 6.142E-03\n", + "[ NORMAL ] Iteration 9:\tk_eff = 0.685943\tres = 7.897E-04\n", + "[ NORMAL ] Iteration 10:\tk_eff = 0.691322\tres = 4.180E-03\n", + "[ NORMAL ] Iteration 11:\tk_eff = 0.698746\tres = 7.873E-03\n", + "[ NORMAL ] Iteration 12:\tk_eff = 0.707777\tres = 1.076E-02\n", + "[ NORMAL ] Iteration 13:\tk_eff = 0.718039\tres = 1.295E-02\n", + "[ NORMAL ] Iteration 14:\tk_eff = 0.729218\tres = 1.452E-02\n", + "[ NORMAL ] Iteration 15:\tk_eff = 0.741045\tres = 1.559E-02\n", + "[ NORMAL ] Iteration 16:\tk_eff = 0.753296\tres = 1.624E-02\n", + "[ NORMAL ] Iteration 17:\tk_eff = 0.765784\tres = 1.655E-02\n", + "[ NORMAL ] Iteration 18:\tk_eff = 0.778355\tres = 1.659E-02\n", + "[ NORMAL ] Iteration 19:\tk_eff = 0.790879\tres = 1.643E-02\n", + "[ NORMAL ] Iteration 20:\tk_eff = 0.803253\tres = 1.610E-02\n", + "[ NORMAL ] Iteration 21:\tk_eff = 0.815394\tres = 1.566E-02\n", + "[ NORMAL ] Iteration 22:\tk_eff = 0.827235\tres = 1.513E-02\n", + "[ NORMAL ] Iteration 23:\tk_eff = 0.838724\tres = 1.453E-02\n", + "[ NORMAL ] Iteration 24:\tk_eff = 0.849823\tres = 1.390E-02\n", + "[ NORMAL ] Iteration 25:\tk_eff = 0.860502\tres = 1.324E-02\n", + "[ NORMAL ] Iteration 26:\tk_eff = 0.870744\tres = 1.258E-02\n", + "[ NORMAL ] Iteration 27:\tk_eff = 0.880535\tres = 1.191E-02\n", + "[ NORMAL ] Iteration 28:\tk_eff = 0.889869\tres = 1.125E-02\n", + "[ NORMAL ] Iteration 29:\tk_eff = 0.898747\tres = 1.061E-02\n", + "[ NORMAL ] Iteration 30:\tk_eff = 0.907172\tres = 9.985E-03\n", + "[ NORMAL ] Iteration 31:\tk_eff = 0.915150\tres = 9.382E-03\n", + "[ NORMAL ] Iteration 32:\tk_eff = 0.922692\tres = 8.802E-03\n", + "[ NORMAL ] Iteration 33:\tk_eff = 0.929810\tres = 8.248E-03\n", + "[ NORMAL ] Iteration 34:\tk_eff = 0.936517\tres = 7.720E-03\n", + "[ NORMAL ] Iteration 35:\tk_eff = 0.942827\tres = 7.219E-03\n", + "[ NORMAL ] Iteration 36:\tk_eff = 0.948756\tres = 6.744E-03\n", + "[ NORMAL ] Iteration 37:\tk_eff = 0.954321\tres = 6.295E-03\n", + "[ NORMAL ] Iteration 38:\tk_eff = 0.959539\tres = 5.871E-03\n", + "[ NORMAL ] Iteration 39:\tk_eff = 0.964424\tres = 5.472E-03\n", + "[ NORMAL ] Iteration 40:\tk_eff = 0.968995\tres = 5.096E-03\n", + "[ NORMAL ] Iteration 41:\tk_eff = 0.973268\tres = 4.744E-03\n", + "[ NORMAL ] Iteration 42:\tk_eff = 0.977258\tres = 4.413E-03\n", + "[ NORMAL ] Iteration 43:\tk_eff = 0.980981\tres = 4.104E-03\n", + "[ NORMAL ] Iteration 44:\tk_eff = 0.984453\tres = 3.814E-03\n", + "[ NORMAL ] Iteration 45:\tk_eff = 0.987689\tres = 3.543E-03\n", + "[ NORMAL ] Iteration 46:\tk_eff = 0.990701\tres = 3.289E-03\n", + "[ NORMAL ] Iteration 47:\tk_eff = 0.993505\tres = 3.053E-03\n", + "[ NORMAL ] Iteration 48:\tk_eff = 0.996112\tres = 2.832E-03\n", + "[ NORMAL ] Iteration 49:\tk_eff = 0.998536\tres = 2.627E-03\n", + "[ NORMAL ] Iteration 50:\tk_eff = 1.000787\tres = 2.435E-03\n", + "[ NORMAL ] Iteration 51:\tk_eff = 1.002878\tres = 2.257E-03\n", + "[ NORMAL ] Iteration 52:\tk_eff = 1.004818\tres = 2.091E-03\n", + "[ NORMAL ] Iteration 53:\tk_eff = 1.006618\tres = 1.937E-03\n", + "[ NORMAL ] Iteration 54:\tk_eff = 1.008287\tres = 1.793E-03\n", + "[ NORMAL ] Iteration 55:\tk_eff = 1.009834\tres = 1.660E-03\n", + "[ NORMAL ] Iteration 56:\tk_eff = 1.011268\tres = 1.536E-03\n", + "[ NORMAL ] Iteration 57:\tk_eff = 1.012595\tres = 1.421E-03\n", + "[ NORMAL ] Iteration 58:\tk_eff = 1.013824\tres = 1.314E-03\n", + "[ NORMAL ] Iteration 59:\tk_eff = 1.014962\tres = 1.215E-03\n", + "[ NORMAL ] Iteration 60:\tk_eff = 1.016015\tres = 1.123E-03\n", + "[ NORMAL ] Iteration 61:\tk_eff = 1.016988\tres = 1.038E-03\n", + "[ NORMAL ] Iteration 62:\tk_eff = 1.017889\tres = 9.595E-04\n", + "[ NORMAL ] Iteration 63:\tk_eff = 1.018721\tres = 8.864E-04\n", + "[ NORMAL ] Iteration 64:\tk_eff = 1.019490\tres = 8.187E-04\n", + "[ NORMAL ] Iteration 65:\tk_eff = 1.020201\tres = 7.560E-04\n", + "[ NORMAL ] Iteration 66:\tk_eff = 1.020857\tres = 6.980E-04\n", + "[ NORMAL ] Iteration 67:\tk_eff = 1.021464\tres = 6.443E-04\n", + "[ NORMAL ] Iteration 68:\tk_eff = 1.022024\tres = 5.947E-04\n", + "[ NORMAL ] Iteration 69:\tk_eff = 1.022540\tres = 5.488E-04\n", + "[ NORMAL ] Iteration 70:\tk_eff = 1.023017\tres = 5.063E-04\n", + "[ NORMAL ] Iteration 71:\tk_eff = 1.023457\tres = 4.670E-04\n", + "[ NORMAL ] Iteration 72:\tk_eff = 1.023863\tres = 4.308E-04\n", + "[ NORMAL ] Iteration 73:\tk_eff = 1.024238\tres = 3.972E-04\n", + "[ NORMAL ] Iteration 74:\tk_eff = 1.024583\tres = 3.663E-04\n", + "[ NORMAL ] Iteration 75:\tk_eff = 1.024902\tres = 3.376E-04\n", + "[ NORMAL ] Iteration 76:\tk_eff = 1.025195\tres = 3.112E-04\n", + "[ NORMAL ] Iteration 77:\tk_eff = 1.025466\tres = 2.868E-04\n", + "[ NORMAL ] Iteration 78:\tk_eff = 1.025715\tres = 2.643E-04\n", + "[ NORMAL ] Iteration 79:\tk_eff = 1.025945\tres = 2.435E-04\n", + "[ NORMAL ] Iteration 80:\tk_eff = 1.026157\tres = 2.244E-04\n", + "[ NORMAL ] Iteration 81:\tk_eff = 1.026352\tres = 2.067E-04\n", + "[ NORMAL ] Iteration 82:\tk_eff = 1.026531\tres = 1.904E-04\n", + "[ NORMAL ] Iteration 83:\tk_eff = 1.026697\tres = 1.753E-04\n", + "[ NORMAL ] Iteration 84:\tk_eff = 1.026849\tres = 1.614E-04\n", + "[ NORMAL ] Iteration 85:\tk_eff = 1.026989\tres = 1.487E-04\n", + "[ NORMAL ] Iteration 86:\tk_eff = 1.027118\tres = 1.368E-04\n", + "[ NORMAL ] Iteration 87:\tk_eff = 1.027237\tres = 1.260E-04\n", + "[ NORMAL ] Iteration 88:\tk_eff = 1.027346\tres = 1.159E-04\n", + "[ NORMAL ] Iteration 89:\tk_eff = 1.027447\tres = 1.067E-04\n", + "[ NORMAL ] Iteration 90:\tk_eff = 1.027540\tres = 9.821E-05\n", + "[ NORMAL ] Iteration 91:\tk_eff = 1.027625\tres = 9.040E-05\n", + "[ NORMAL ] Iteration 92:\tk_eff = 1.027703\tres = 8.316E-05\n", + "[ NORMAL ] Iteration 93:\tk_eff = 1.027775\tres = 7.652E-05\n", + "[ NORMAL ] Iteration 94:\tk_eff = 1.027842\tres = 7.039E-05\n", + "[ NORMAL ] Iteration 95:\tk_eff = 1.027903\tres = 6.480E-05\n", + "[ NORMAL ] Iteration 96:\tk_eff = 1.027959\tres = 5.959E-05\n", + "[ NORMAL ] Iteration 97:\tk_eff = 1.028011\tres = 5.479E-05\n", + "[ NORMAL ] Iteration 98:\tk_eff = 1.028058\tres = 5.043E-05\n", + "[ NORMAL ] Iteration 99:\tk_eff = 1.028102\tres = 4.633E-05\n", + "[ NORMAL ] Iteration 100:\tk_eff = 1.028142\tres = 4.265E-05\n", + "[ NORMAL ] Iteration 101:\tk_eff = 1.028180\tres = 3.921E-05\n", + "[ NORMAL ] Iteration 102:\tk_eff = 1.028214\tres = 3.605E-05\n", + "[ NORMAL ] Iteration 103:\tk_eff = 1.028245\tres = 3.315E-05\n", + "[ NORMAL ] Iteration 104:\tk_eff = 1.028273\tres = 3.047E-05\n", + "[ NORMAL ] Iteration 105:\tk_eff = 1.028300\tres = 2.800E-05\n", + "[ NORMAL ] Iteration 106:\tk_eff = 1.028324\tres = 2.575E-05\n", + "[ NORMAL ] Iteration 107:\tk_eff = 1.028346\tres = 2.368E-05\n", + "[ NORMAL ] Iteration 108:\tk_eff = 1.028367\tres = 2.176E-05\n", + "[ NORMAL ] Iteration 109:\tk_eff = 1.028386\tres = 2.003E-05\n", + "[ NORMAL ] Iteration 110:\tk_eff = 1.028403\tres = 1.837E-05\n", + "[ NORMAL ] Iteration 111:\tk_eff = 1.028419\tres = 1.690E-05\n", + "[ NORMAL ] Iteration 112:\tk_eff = 1.028434\tres = 1.553E-05\n", + "[ NORMAL ] Iteration 113:\tk_eff = 1.028447\tres = 1.426E-05\n", + "[ NORMAL ] Iteration 114:\tk_eff = 1.028459\tres = 1.309E-05\n", + "[ NORMAL ] Iteration 115:\tk_eff = 1.028471\tres = 1.202E-05\n", + "[ NORMAL ] Iteration 116:\tk_eff = 1.028481\tres = 1.107E-05\n", + "[ NORMAL ] Iteration 117:\tk_eff = 1.028491\tres = 1.015E-05\n" ] } ], @@ -1461,9 +1459,9 @@ "name": "stdout", "output_type": "stream", "text": [ - "openmc keff = 1.025806\n", - "openmoc keff = 1.026471\n", - "bias [pcm]: 66.5\n" + "openmc keff = 1.028263\n", + "openmoc keff = 1.028491\n", + "bias [pcm]: 22.8\n" ] } ], @@ -1571,7 +1569,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 43, @@ -1580,9 +1578,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\nQkiM+D/axcWYV0AhpgAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1608,21 +1606,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" + "pygments_lexer": "ipython3", + "version": "3.5.2" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/mgxs-part-iv.ipynb b/docs/source/pythonapi/examples/mgxs-part-iv.ipynb index eaae92f7c9..301bbf0155 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iv.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iv.ipynb @@ -119,7 +119,6 @@ "source": [ "# Instantiate a Materials object\n", "materials_file = openmc.Materials((fuel, zircaloy, water))\n", - "materials_file.default_xs = '71c'\n", "\n", "# Export to \"materials.xml\"\n", "materials_file.export_to_xml()" @@ -432,7 +431,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -578,7 +577,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/romano/openmc/openmc/mgxs/library.py:312: RuntimeWarning: The P0 correction will be ignored since the scattering order 0 is greater than zero\n", + "/home/romano/openmc/openmc/mgxs/library.py:373: RuntimeWarning: The P0 correction will be ignored since the scattering order 0 is greater than zero\n", " warn(msg, RuntimeWarning)\n" ] } @@ -707,23 +706,37 @@ "output_type": "stream", "text": [ "\n", - " .d88888b. 888b d888 .d8888b.\n", - " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", - " 888 888 88888b.d88888 888 888\n", - " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", - " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", - " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", - " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", - " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", - "__________________888______________________________________________________\n", - " 888\n", - " 888\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", - " Copyright: 2011-2016 Massachusetts Institute of Technology\n", - " License: http://openmc.readthedocs.io/en/latest/license.html\n", - " Version: 0.7.1\n", - " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", - " Date/Time: 2016-07-23 16:50:57\n", + " | The OpenMC Monte Carlo Code\n", + " Copyright | 2011-2016 Massachusetts Institute of Technology\n", + " License | http://openmc.readthedocs.io/en/latest/license.html\n", + " Version | 0.8.0\n", + " Git SHA1 | fbebf7bf709fe2fe1813af95bff9b29c0d59312c\n", + " Date/Time | 2016-08-31 10:48:01\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -733,13 +746,13 @@ " Reading geometry XML file...\n", " Reading cross sections XML file...\n", " Reading materials XML file...\n", - " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", - " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", - " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", - " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", - " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", - " Reading B10.71c from /home/romano/openmc/data/nndc_hdf5/B10_71c.h5\n", - " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", + " Reading U235 from /home/romano/openmc/data/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/romano/openmc/data/nndc_hdf5/U238.h5\n", + " Reading O16 from /home/romano/openmc/data/nndc_hdf5/O16.h5\n", + " Reading Zr90 from /home/romano/openmc/data/nndc_hdf5/Zr90.h5\n", + " Reading H1 from /home/romano/openmc/data/nndc_hdf5/H1.h5\n", + " Reading B10 from /home/romano/openmc/data/nndc_hdf5/B10.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", " Initializing source particles...\n", @@ -809,20 +822,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.6600E-01 seconds\n", - " Reading cross sections = 2.1400E-01 seconds\n", - " Total time in simulation = 7.0360E+01 seconds\n", - " Time in transport only = 7.0341E+01 seconds\n", - " Time in inactive batches = 9.6400E+00 seconds\n", - " Time in active batches = 6.0720E+01 seconds\n", - " Time synchronizing fission bank = 7.0000E-03 seconds\n", - " Sampling source sites = 5.0000E-03 seconds\n", - " SEND/RECV source sites = 2.0000E-03 seconds\n", + " Total time for initialization = 4.2200E-01 seconds\n", + " Reading cross sections = 2.8800E-01 seconds\n", + " Total time in simulation = 4.1409E+01 seconds\n", + " Time in transport only = 4.1265E+01 seconds\n", + " Time in inactive batches = 4.6120E+00 seconds\n", + " Time in active batches = 3.6797E+01 seconds\n", + " Time synchronizing fission bank = 9.0000E-03 seconds\n", + " Sampling source sites = 6.0000E-03 seconds\n", + " SEND/RECV source sites = 3.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 7.0764E+01 seconds\n", - " Calculation Rate (inactive) = 5186.72 neutrons/second\n", - " Calculation Rate (active) = 3293.81 neutrons/second\n", + " Total time elapsed = 4.1869E+01 seconds\n", + " Calculation Rate (inactive) = 10841.3 neutrons/second\n", + " Calculation Rate (active) = 5435.23 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -960,24 +973,10 @@ "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/romano/openmc/openmc/tallies.py:1941: RuntimeWarning: invalid value encountered in true_divide\n", - " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/romano/openmc/openmc/tallies.py:1942: RuntimeWarning: invalid value encountered in true_divide\n", - " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/romano/openmc/openmc/tallies.py:1943: RuntimeWarning: invalid value encountered in true_divide\n", - " new_tally._mean = data['self']['mean'] / data['other']['mean']\n" - ] - } - ], + "outputs": [], "source": [ "# Create a MGXS File which can then be written to disk\n", - "mgxs_file = mgxs_lib.create_mg_library(xs_type='macro', xsdata_names=['fuel', 'zircaloy', 'water'],\n", - " xs_ids='2m')\n", + "mgxs_file = mgxs_lib.create_mg_library(xs_type='macro', xsdata_names=['fuel', 'zircaloy', 'water'])\n", "\n", "# Write the file to disk using the default filename of `mgxs.xml`\n", "mgxs_file.export_to_xml()" @@ -991,7 +990,7 @@ "\n", "Since this example is using material-wise macroscopic cross sections without considering that the neutron energy spectra and thus cross sections may be changing in space, we only need to modify the materials.xml and settings.xml files. If the material names and ids are not otherwise changed, then the geometry.xml file does not need to be modified from its continuous-energy form. The tallies.xml file will be left untouched as it currently contains the tally types that we will need to perform our comparison. \n", "\n", - "First we will create the new materials.xml file. Continuous-energy cross section nuclidic data sets are named with the nuclide name followed by a cross section identifier. For example, the data for hydrogen is accessed in OpenMC by the name `H-1.71c`. The cross-section identifier (in this case, `71c`) can be used to distinguish between different variants of `H-1` data, such as for different evaluations or temperatures. OpenMC multi-group libraries use the same convention of a name followed by a xs identifier. We will use a cross section identifier here of `2m`. Similar to how continuous-energy cross section libraries are named, the `openmc.Macroscopic` quantities below can either have their `xs_id` included (i.e., `'fuel.2m'`). An alternative is to leave this extension off and simply change the `default_xs` parameter to `.2m`." + "First we will create the new materials.xml file." ] }, { @@ -1023,7 +1022,6 @@ "\n", "# Finally, instantiate our Materials object\n", "materials_file = openmc.Materials((fuel, zircaloy, water))\n", - "materials_file.default_xs = '2m'\n", "\n", "# Export to \"materials.xml\"\n", "materials_file.export_to_xml()\n" @@ -1082,23 +1080,37 @@ "output_type": "stream", "text": [ "\n", - " .d88888b. 888b d888 .d8888b.\n", - " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", - " 888 888 88888b.d88888 888 888\n", - " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", - " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", - " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", - " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", - " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", - "__________________888______________________________________________________\n", - " 888\n", - " 888\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", - " Copyright: 2011-2016 Massachusetts Institute of Technology\n", - " License: http://openmc.readthedocs.io/en/latest/license.html\n", - " Version: 0.7.1\n", - " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", - " Date/Time: 2016-07-23 16:52:09\n", + " | The OpenMC Monte Carlo Code\n", + " Copyright | 2011-2016 Massachusetts Institute of Technology\n", + " License | http://openmc.readthedocs.io/en/latest/license.html\n", + " Version | 0.8.0\n", + " Git SHA1 | fbebf7bf709fe2fe1813af95bff9b29c0d59312c\n", + " Date/Time | 2016-08-31 10:48:43\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -1111,9 +1123,9 @@ " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", " Loading Cross Section Data...\n", - " Loading fuel.2m Data...\n", - " Loading zircaloy.2m Data...\n", - " Loading water.2m Data...\n", + " Loading fuel Data...\n", + " Loading zircaloy Data...\n", + " Loading water Data...\n", " Initializing source particles...\n", "\n", " ===========================================================================\n", @@ -1122,56 +1134,56 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 0.99367 \n", - " 2/1 1.03173 \n", - " 3/1 1.01999 \n", - " 4/1 1.01421 \n", - " 5/1 1.03980 \n", - " 6/1 1.04540 \n", - " 7/1 1.04199 \n", - " 8/1 1.02680 \n", - " 9/1 1.01267 \n", - " 10/1 1.03420 \n", - " 11/1 1.05773 \n", - " 12/1 1.03475 1.04624 +/- 0.01149\n", - " 13/1 1.03632 1.04293 +/- 0.00741\n", - " 14/1 0.99297 1.03044 +/- 0.01355\n", - " 15/1 1.02413 1.02918 +/- 0.01057\n", - " 16/1 1.02359 1.02825 +/- 0.00868\n", - " 17/1 0.99913 1.02409 +/- 0.00843\n", - " 18/1 1.01493 1.02294 +/- 0.00739\n", - " 19/1 1.03010 1.02374 +/- 0.00657\n", - " 20/1 1.04890 1.02626 +/- 0.00639\n", - " 21/1 1.01267 1.02502 +/- 0.00591\n", - " 22/1 1.02637 1.02513 +/- 0.00540\n", - " 23/1 1.01374 1.02426 +/- 0.00504\n", - " 24/1 1.06661 1.02728 +/- 0.00556\n", - " 25/1 1.03212 1.02760 +/- 0.00519\n", - " 26/1 1.05433 1.02927 +/- 0.00513\n", - " 27/1 0.99891 1.02749 +/- 0.00514\n", - " 28/1 1.00616 1.02630 +/- 0.00499\n", - " 29/1 1.04583 1.02733 +/- 0.00483\n", - " 30/1 1.01512 1.02672 +/- 0.00462\n", - " 31/1 0.98104 1.02455 +/- 0.00491\n", - " 32/1 1.04202 1.02534 +/- 0.00474\n", - " 33/1 1.00779 1.02458 +/- 0.00460\n", - " 34/1 1.02450 1.02457 +/- 0.00440\n", - " 35/1 0.98882 1.02314 +/- 0.00446\n", - " 36/1 1.01541 1.02285 +/- 0.00429\n", - " 37/1 1.02050 1.02276 +/- 0.00413\n", - " 38/1 1.03573 1.02322 +/- 0.00401\n", - " 39/1 1.03649 1.02368 +/- 0.00389\n", - " 40/1 1.01434 1.02337 +/- 0.00378\n", - " 41/1 1.02345 1.02337 +/- 0.00365\n", - " 42/1 1.01900 1.02323 +/- 0.00354\n", - " 43/1 1.01450 1.02297 +/- 0.00344\n", - " 44/1 1.03127 1.02321 +/- 0.00335\n", - " 45/1 1.01598 1.02301 +/- 0.00326\n", - " 46/1 1.00851 1.02260 +/- 0.00319\n", - " 47/1 1.03406 1.02291 +/- 0.00312\n", - " 48/1 1.02373 1.02294 +/- 0.00303\n", - " 49/1 1.04066 1.02339 +/- 0.00299\n", - " 50/1 1.02011 1.02331 +/- 0.00292\n", + " 1/1 0.99122 \n", + " 2/1 1.03963 \n", + " 3/1 1.01551 \n", + " 4/1 1.03582 \n", + " 5/1 0.99023 \n", + " 6/1 1.00419 \n", + " 7/1 1.02047 \n", + " 8/1 1.05456 \n", + " 9/1 1.01063 \n", + " 10/1 1.03370 \n", + " 11/1 1.04616 \n", + " 12/1 1.04458 1.04537 +/- 0.00079\n", + " 13/1 1.02171 1.03748 +/- 0.00790\n", + " 14/1 1.02060 1.03326 +/- 0.00700\n", + " 15/1 1.01653 1.02992 +/- 0.00637\n", + " 16/1 1.02956 1.02986 +/- 0.00520\n", + " 17/1 1.01145 1.02723 +/- 0.00512\n", + " 18/1 1.03774 1.02854 +/- 0.00463\n", + " 19/1 1.00829 1.02629 +/- 0.00466\n", + " 20/1 1.03624 1.02729 +/- 0.00429\n", + " 21/1 1.03296 1.02780 +/- 0.00391\n", + " 22/1 0.99315 1.02491 +/- 0.00459\n", + " 23/1 0.99628 1.02271 +/- 0.00476\n", + " 24/1 1.04034 1.02397 +/- 0.00459\n", + " 25/1 1.02523 1.02406 +/- 0.00427\n", + " 26/1 1.07905 1.02749 +/- 0.00527\n", + " 27/1 1.01678 1.02686 +/- 0.00499\n", + " 28/1 1.01817 1.02638 +/- 0.00473\n", + " 29/1 1.03293 1.02672 +/- 0.00449\n", + " 30/1 1.01224 1.02600 +/- 0.00432\n", + " 31/1 1.01524 1.02549 +/- 0.00414\n", + " 32/1 1.00996 1.02478 +/- 0.00401\n", + " 33/1 1.05545 1.02612 +/- 0.00406\n", + " 34/1 1.02082 1.02589 +/- 0.00389\n", + " 35/1 0.99120 1.02451 +/- 0.00398\n", + " 36/1 1.03012 1.02472 +/- 0.00383\n", + " 37/1 1.01179 1.02424 +/- 0.00372\n", + " 38/1 1.04023 1.02481 +/- 0.00363\n", + " 39/1 1.05876 1.02598 +/- 0.00369\n", + " 40/1 0.99332 1.02490 +/- 0.00373\n", + " 41/1 1.05319 1.02581 +/- 0.00372\n", + " 42/1 1.03381 1.02606 +/- 0.00361\n", + " 43/1 1.00607 1.02545 +/- 0.00355\n", + " 44/1 1.03957 1.02587 +/- 0.00347\n", + " 45/1 1.02472 1.02584 +/- 0.00337\n", + " 46/1 1.00948 1.02538 +/- 0.00331\n", + " 47/1 1.02380 1.02534 +/- 0.00322\n", + " 48/1 1.05392 1.02609 +/- 0.00322\n", + " 49/1 1.01171 1.02572 +/- 0.00316\n", + " 50/1 1.03942 1.02606 +/- 0.00310\n", " Creating state point statepoint.50.h5...\n", "\n", " ===========================================================================\n", @@ -1181,27 +1193,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.6000E-02 seconds\n", - " Reading cross sections = 8.0000E-03 seconds\n", - " Total time in simulation = 5.5889E+01 seconds\n", - " Time in transport only = 5.5863E+01 seconds\n", - " Time in inactive batches = 7.1040E+00 seconds\n", - " Time in active batches = 4.8785E+01 seconds\n", - " Time synchronizing fission bank = 1.6000E-02 seconds\n", - " Sampling source sites = 1.0000E-02 seconds\n", - " SEND/RECV source sites = 6.0000E-03 seconds\n", - " Time accumulating tallies = 1.0000E-03 seconds\n", + " Total time for initialization = 4.1000E-02 seconds\n", + " Reading cross sections = 4.0000E-03 seconds\n", + " Total time in simulation = 3.1713E+01 seconds\n", + " Time in transport only = 3.1522E+01 seconds\n", + " Time in inactive batches = 3.8940E+00 seconds\n", + " Time in active batches = 2.7819E+01 seconds\n", + " Time synchronizing fission bank = 2.1000E-02 seconds\n", + " Sampling source sites = 1.2000E-02 seconds\n", + " SEND/RECV source sites = 9.0000E-03 seconds\n", + " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 5.5976E+01 seconds\n", - " Calculation Rate (inactive) = 7038.29 neutrons/second\n", - " Calculation Rate (active) = 4099.62 neutrons/second\n", + " Total time elapsed = 3.1791E+01 seconds\n", + " Calculation Rate (inactive) = 12840.3 neutrons/second\n", + " Calculation Rate (active) = 7189.33 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.02638 +/- 0.00260\n", - " k-effective (Track-length) = 1.02331 +/- 0.00292\n", - " k-effective (Absorption) = 1.02579 +/- 0.00132\n", - " Combined k-effective = 1.02558 +/- 0.00136\n", + " k-effective (Collision) = 1.02474 +/- 0.00282\n", + " k-effective (Track-length) = 1.02606 +/- 0.00310\n", + " k-effective (Absorption) = 1.02589 +/- 0.00165\n", + " Combined k-effective = 1.02601 +/- 0.00170\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -1283,8 +1295,8 @@ "output_type": "stream", "text": [ "Continuous-Energy keff = 1.024295\n", - "Multi-Group keff = 1.025577\n", - "bias [pcm]: -128.2\n" + "Multi-Group keff = 1.026013\n", + "bias [pcm]: -171.8\n" ] } ], @@ -1381,7 +1393,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 40, @@ -1390,9 +1402,9 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1437,21 +1449,21 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.11" + "pygments_lexer": "ipython3", + "version": "3.5.2" } }, "nbformat": 4, diff --git a/docs/source/pythonapi/examples/pandas-dataframes.ipynb b/docs/source/pythonapi/examples/pandas-dataframes.ipynb index 412013f2f4..f913e941af 100644 --- a/docs/source/pythonapi/examples/pandas-dataframes.ipynb +++ b/docs/source/pythonapi/examples/pandas-dataframes.ipynb @@ -111,7 +111,6 @@ "source": [ "# Instantiate a Materials collection\n", "materials_file = openmc.Materials((fuel, water, zircaloy))\n", - "materials_file.default_xs = '71c'\n", "\n", "# Export to \"materials.xml\"\n", "materials_file.export_to_xml()" @@ -370,7 +369,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AHFxUkA9dy05MAAAPZSURBVGje7Zs7buMwEIZ9iey5\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+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA3LTIzVDE2OjM2OjAzLTA1OjAwxjuLbgAA\nACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wNy0yM1QxNjozNjowMy0wNTowMLdmM9IAAAAASUVORK5C\nYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIHw8nG7lmgZ4AAAPZSURBVGje7Zs7buMwEIZ9iey5\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+4PhbRAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA4LTMxVDEwOjM5OjI3LTA1OjAwYiZUvgAA\nACV0RVh0ZGF0ZTptb2RpZnkAMjAxNi0wOC0zMVQxMDozOToyNy0wNTowMBN77AIAAAAASUVORK5C\nYII=\n", "text/plain": [ "" ] @@ -539,23 +538,37 @@ "output_type": "stream", "text": [ "\n", - " .d88888b. 888b d888 .d8888b.\n", - " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", - " 888 888 88888b.d88888 888 888\n", - " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", - " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", - " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", - " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", - " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", - "__________________888______________________________________________________\n", - " 888\n", - " 888\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", - " Copyright: 2011-2016 Massachusetts Institute of Technology\n", - " License: http://openmc.readthedocs.io/en/latest/license.html\n", - " Version: 0.7.1\n", - " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", - " Date/Time: 2016-07-23 16:36:04\n", + " | The OpenMC Monte Carlo Code\n", + " Copyright | 2011-2016 Massachusetts Institute of Technology\n", + " License | http://openmc.readthedocs.io/en/latest/license.html\n", + " Version | 0.8.0\n", + " Git SHA1 | fbebf7bf709fe2fe1813af95bff9b29c0d59312c\n", + " Date/Time | 2016-08-31 10:39:27\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -565,13 +578,13 @@ " Reading geometry XML file...\n", " Reading cross sections XML file...\n", " Reading materials XML file...\n", - " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", - " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", - " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", - " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", - " Reading B10.71c from /home/romano/openmc/data/nndc_hdf5/B10_71c.h5\n", - " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", - " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", + " Reading U235 from /home/romano/openmc/data/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/romano/openmc/data/nndc_hdf5/U238.h5\n", + " Reading O16 from /home/romano/openmc/data/nndc_hdf5/O16.h5\n", + " Reading H1 from /home/romano/openmc/data/nndc_hdf5/H1.h5\n", + " Reading B10 from /home/romano/openmc/data/nndc_hdf5/B10.h5\n", + " Reading Zr90 from /home/romano/openmc/data/nndc_hdf5/Zr90.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", " Initializing source particles...\n", @@ -618,20 +631,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.2600E-01 seconds\n", - " Reading cross sections = 2.9500E-01 seconds\n", - " Total time in simulation = 1.1986E+01 seconds\n", - " Time in transport only = 1.1977E+01 seconds\n", - " Time in inactive batches = 1.8370E+00 seconds\n", - " Time in active batches = 1.0149E+01 seconds\n", - " Time synchronizing fission bank = 2.0000E-03 seconds\n", + " Total time for initialization = 4.4100E-01 seconds\n", + " Reading cross sections = 3.1500E-01 seconds\n", + " Total time in simulation = 5.7690E+00 seconds\n", + " Time in transport only = 5.7370E+00 seconds\n", + " Time in inactive batches = 7.9400E-01 seconds\n", + " Time in active batches = 4.9750E+00 seconds\n", + " Time synchronizing fission bank = 1.0000E-03 seconds\n", " Sampling source sites = 1.0000E-03 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", - " Time accumulating tallies = 0.0000E+00 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Time accumulating tallies = 1.0000E-03 seconds\n", " Total time for finalization = 0.0000E+00 seconds\n", - " Total time elapsed = 1.2431E+01 seconds\n", - " Calculation Rate (inactive) = 6804.57 neutrons/second\n", - " Calculation Rate (active) = 3694.95 neutrons/second\n", + " Total time elapsed = 6.2280E+00 seconds\n", + " Calculation Rate (inactive) = 15743.1 neutrons/second\n", + " Calculation Rate (active) = 7537.69 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -744,10 +757,10 @@ "text": [ "[[[ 0.1501735 ]]\n", "\n", - " [[ 0.05936257]]\n", - "\n", " [[ 0.21402727]]\n", "\n", + " [[ 0.05936257]]\n", + "\n", " [[ 0.13436703]]]\n" ] } @@ -848,8 +861,8 @@ " 0.00e+00\n", " 6.25e-07\n", " fission\n", - " 3.52e-04\n", - " 3.39e-05\n", + " 2.32e-04\n", + " 4.97e-05\n", " \n", " \n", " 5\n", @@ -859,8 +872,8 @@ " 0.00e+00\n", " 6.25e-07\n", " nu-fission\n", - " 8.57e-04\n", - " 8.26e-05\n", + " 5.65e-04\n", + " 1.21e-04\n", " \n", " \n", " 6\n", @@ -870,8 +883,8 @@ " 6.25e-07\n", " 2.00e+01\n", " fission\n", - " 1.02e-04\n", - " 6.16e-06\n", + " 6.96e-05\n", + " 6.90e-06\n", " \n", " \n", " 7\n", @@ -881,8 +894,8 @@ " 6.25e-07\n", " 2.00e+01\n", " nu-fission\n", - " 2.70e-04\n", - " 1.61e-05\n", + " 1.86e-04\n", + " 1.90e-05\n", " \n", " \n", " 8\n", @@ -892,8 +905,8 @@ " 0.00e+00\n", " 6.25e-07\n", " fission\n", - " 6.09e-04\n", - " 6.55e-05\n", + " 2.43e-04\n", + " 3.24e-05\n", " \n", " \n", " 9\n", @@ -903,8 +916,8 @@ " 0.00e+00\n", " 6.25e-07\n", " nu-fission\n", - " 1.48e-03\n", - " 1.60e-04\n", + " 5.91e-04\n", + " 7.90e-05\n", " \n", " \n", " 10\n", @@ -914,8 +927,8 @@ " 6.25e-07\n", " 2.00e+01\n", " fission\n", - " 1.38e-04\n", - " 6.74e-06\n", + " 7.27e-05\n", + " 4.76e-06\n", " \n", " \n", " 11\n", @@ -925,8 +938,8 @@ " 6.25e-07\n", " 2.00e+01\n", " nu-fission\n", - " 3.65e-04\n", - " 1.88e-05\n", + " 1.93e-04\n", + " 1.14e-05\n", " \n", " \n", " 12\n", @@ -936,8 +949,8 @@ " 0.00e+00\n", " 6.25e-07\n", " fission\n", - " 6.23e-04\n", - " 5.16e-05\n", + " 2.61e-04\n", + " 4.48e-05\n", " \n", " \n", " 13\n", @@ -947,8 +960,8 @@ " 0.00e+00\n", " 6.25e-07\n", " nu-fission\n", - " 1.52e-03\n", - " 1.26e-04\n", + " 6.35e-04\n", + " 1.09e-04\n", " \n", " \n", " 14\n", @@ -958,8 +971,8 @@ " 6.25e-07\n", " 2.00e+01\n", " fission\n", - " 1.74e-04\n", - " 9.99e-06\n", + " 6.00e-05\n", + " 4.53e-06\n", " \n", " \n", " 15\n", @@ -969,8 +982,8 @@ " 6.25e-07\n", " 2.00e+01\n", " nu-fission\n", - " 4.58e-04\n", - " 2.68e-05\n", + " 1.59e-04\n", + " 1.17e-05\n", " \n", " \n", " 16\n", @@ -980,8 +993,8 @@ " 0.00e+00\n", " 6.25e-07\n", " fission\n", - " 6.94e-04\n", - " 8.68e-05\n", + " 2.23e-04\n", + " 2.89e-05\n", " \n", " \n", " 17\n", @@ -991,8 +1004,8 @@ " 0.00e+00\n", " 6.25e-07\n", " nu-fission\n", - " 1.69e-03\n", - " 2.12e-04\n", + " 5.43e-04\n", + " 7.04e-05\n", " \n", " \n", " 18\n", @@ -1002,8 +1015,8 @@ " 6.25e-07\n", " 2.00e+01\n", " fission\n", - " 1.75e-04\n", - " 1.10e-05\n", + " 7.93e-05\n", + " 7.77e-06\n", " \n", " \n", " 19\n", @@ -1013,8 +1026,8 @@ " 6.25e-07\n", " 2.00e+01\n", " nu-fission\n", - " 4.55e-04\n", - " 2.80e-05\n", + " 2.07e-04\n", + " 1.94e-05\n", " \n", " \n", "\n", @@ -1027,22 +1040,22 @@ "1 1 1 1 0.00e+00 6.25e-07 nu-fission 5.37e-04 \n", "2 1 1 1 6.25e-07 2.00e+01 fission 7.43e-05 \n", "3 1 1 1 6.25e-07 2.00e+01 nu-fission 1.97e-04 \n", - "4 1 2 1 0.00e+00 6.25e-07 fission 3.52e-04 \n", - "5 1 2 1 0.00e+00 6.25e-07 nu-fission 8.57e-04 \n", - "6 1 2 1 6.25e-07 2.00e+01 fission 1.02e-04 \n", - "7 1 2 1 6.25e-07 2.00e+01 nu-fission 2.70e-04 \n", - "8 1 3 1 0.00e+00 6.25e-07 fission 6.09e-04 \n", - "9 1 3 1 0.00e+00 6.25e-07 nu-fission 1.48e-03 \n", - "10 1 3 1 6.25e-07 2.00e+01 fission 1.38e-04 \n", - "11 1 3 1 6.25e-07 2.00e+01 nu-fission 3.65e-04 \n", - "12 1 4 1 0.00e+00 6.25e-07 fission 6.23e-04 \n", - "13 1 4 1 0.00e+00 6.25e-07 nu-fission 1.52e-03 \n", - "14 1 4 1 6.25e-07 2.00e+01 fission 1.74e-04 \n", - "15 1 4 1 6.25e-07 2.00e+01 nu-fission 4.58e-04 \n", - "16 1 5 1 0.00e+00 6.25e-07 fission 6.94e-04 \n", - "17 1 5 1 0.00e+00 6.25e-07 nu-fission 1.69e-03 \n", - "18 1 5 1 6.25e-07 2.00e+01 fission 1.75e-04 \n", - "19 1 5 1 6.25e-07 2.00e+01 nu-fission 4.55e-04 \n", + "4 1 2 1 0.00e+00 6.25e-07 fission 2.32e-04 \n", + "5 1 2 1 0.00e+00 6.25e-07 nu-fission 5.65e-04 \n", + "6 1 2 1 6.25e-07 2.00e+01 fission 6.96e-05 \n", + "7 1 2 1 6.25e-07 2.00e+01 nu-fission 1.86e-04 \n", + "8 1 3 1 0.00e+00 6.25e-07 fission 2.43e-04 \n", + "9 1 3 1 0.00e+00 6.25e-07 nu-fission 5.91e-04 \n", + "10 1 3 1 6.25e-07 2.00e+01 fission 7.27e-05 \n", + "11 1 3 1 6.25e-07 2.00e+01 nu-fission 1.93e-04 \n", + "12 1 4 1 0.00e+00 6.25e-07 fission 2.61e-04 \n", + "13 1 4 1 0.00e+00 6.25e-07 nu-fission 6.35e-04 \n", + "14 1 4 1 6.25e-07 2.00e+01 fission 6.00e-05 \n", + "15 1 4 1 6.25e-07 2.00e+01 nu-fission 1.59e-04 \n", + "16 1 5 1 0.00e+00 6.25e-07 fission 2.23e-04 \n", + "17 1 5 1 0.00e+00 6.25e-07 nu-fission 5.43e-04 \n", + "18 1 5 1 6.25e-07 2.00e+01 fission 7.93e-05 \n", + "19 1 5 1 6.25e-07 2.00e+01 nu-fission 2.07e-04 \n", "\n", " std. dev. \n", " \n", @@ -1050,22 +1063,22 @@ "1 8.06e-05 \n", "2 7.91e-06 \n", "3 1.96e-05 \n", - "4 3.39e-05 \n", - "5 8.26e-05 \n", - "6 6.16e-06 \n", - "7 1.61e-05 \n", - "8 6.55e-05 \n", - "9 1.60e-04 \n", - "10 6.74e-06 \n", - "11 1.88e-05 \n", - "12 5.16e-05 \n", - "13 1.26e-04 \n", - "14 9.99e-06 \n", - "15 2.68e-05 \n", - "16 8.68e-05 \n", - "17 2.12e-04 \n", - "18 1.10e-05 \n", - "19 2.80e-05 " + "4 4.97e-05 \n", + "5 1.21e-04 \n", + "6 6.90e-06 \n", + "7 1.90e-05 \n", + "8 3.24e-05 \n", + "9 7.90e-05 \n", + "10 4.76e-06 \n", + "11 1.14e-05 \n", + "12 4.48e-05 \n", + "13 1.09e-04 \n", + "14 4.53e-06 \n", + "15 1.17e-05 \n", + "16 2.89e-05 \n", + "17 7.04e-05 \n", + "18 7.77e-06 \n", + "19 1.94e-05 " ] }, "execution_count": 24, @@ -1095,7 +1108,7 @@ "data": { "image/png": "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\n/wf1F+RhutXrZwAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1118,7 +1131,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 26, @@ -1127,9 +1140,9 @@ }, { "data": { - "image/png": "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\nJ/KLgSwAAAAASUVORK5CYII=\n", + "image/png": "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\nAAAAAElFTkSuQmCC\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2124,7 +2137,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 36, @@ -2135,7 +2148,7 @@ "data": { "image/png": "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\nSUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -2162,7 +2175,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 37, @@ -2173,7 +2186,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index 19182aa7aa..a68ebb6046 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -106,7 +106,6 @@ "source": [ "# Instantiate a Materials collection\n", "materials_file = openmc.Materials((fuel, water, zircaloy))\n", - "materials_file.default_xs = '71c'\n", "\n", "# Export to \"materials.xml\"\n", "materials_file.export_to_xml()" @@ -339,7 +338,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AHFwIoGZ/M0BAAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMjJUMjE6NDA6\nMjUtMDU6MDBskW7/AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTIyVDIxOjQwOjI1LTA1OjAw\nHczWQwAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIHw8eOWKCTcAAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDgtMzFUMTA6MzA6\nNTctMDU6MDCU9nZtAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA4LTMxVDEwOjMwOjU3LTA1OjAw\n5avO0QAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -433,23 +432,37 @@ "output_type": "stream", "text": [ "\n", - " .d88888b. 888b d888 .d8888b.\n", - " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", - " 888 888 88888b.d88888 888 888\n", - " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", - " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", - " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", - " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", - " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", - "__________________888______________________________________________________\n", - " 888\n", - " 888\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", - " Copyright: 2011-2016 Massachusetts Institute of Technology\n", - " License: http://openmc.readthedocs.io/en/latest/license.html\n", - " Version: 0.7.1\n", - " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", - " Date/Time: 2016-07-22 21:40:25\n", + " | The OpenMC Monte Carlo Code\n", + " Copyright | 2011-2016 Massachusetts Institute of Technology\n", + " License | http://openmc.readthedocs.io/en/latest/license.html\n", + " Version | 0.8.0\n", + " Git SHA1 | fbebf7bf709fe2fe1813af95bff9b29c0d59312c\n", + " Date/Time | 2016-08-31 10:30:57\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -459,13 +472,13 @@ " Reading geometry XML file...\n", " Reading cross sections XML file...\n", " Reading materials XML file...\n", - " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", - " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", - " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", - " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", - " Reading B10.71c from /home/romano/openmc/data/nndc_hdf5/B10_71c.h5\n", - " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", - " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", + " Reading U235 from /home/romano/openmc/data/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/romano/openmc/data/nndc_hdf5/U238.h5\n", + " Reading O16 from /home/romano/openmc/data/nndc_hdf5/O16.h5\n", + " Reading H1 from /home/romano/openmc/data/nndc_hdf5/H1.h5\n", + " Reading B10 from /home/romano/openmc/data/nndc_hdf5/B10.h5\n", + " Reading Zr90 from /home/romano/openmc/data/nndc_hdf5/Zr90.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", " Initializing source particles...\n", @@ -585,20 +598,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.5100E-01 seconds\n", - " Reading cross sections = 1.8600E-01 seconds\n", - " Total time in simulation = 3.1672E+02 seconds\n", - " Time in transport only = 3.1667E+02 seconds\n", - " Time in inactive batches = 1.0782E+01 seconds\n", - " Time in active batches = 3.0594E+02 seconds\n", - " Time synchronizing fission bank = 2.1000E-02 seconds\n", - " Sampling source sites = 1.2000E-02 seconds\n", - " SEND/RECV source sites = 9.0000E-03 seconds\n", - " Time accumulating tallies = 1.7000E-02 seconds\n", - " Total time for finalization = 1.8100E-01 seconds\n", - " Total time elapsed = 3.1729E+02 seconds\n", - " Calculation Rate (inactive) = 4637.36 neutrons/second\n", - " Calculation Rate (active) = 1470.89 neutrons/second\n", + " Total time for initialization = 4.4800E-01 seconds\n", + " Reading cross sections = 3.1000E-01 seconds\n", + " Total time in simulation = 3.4103E+02 seconds\n", + " Time in transport only = 3.4086E+02 seconds\n", + " Time in inactive batches = 4.8890E+00 seconds\n", + " Time in active batches = 3.3614E+02 seconds\n", + " Time synchronizing fission bank = 1.5000E-02 seconds\n", + " Sampling source sites = 1.1000E-02 seconds\n", + " SEND/RECV source sites = 4.0000E-03 seconds\n", + " Time accumulating tallies = 1.9000E-02 seconds\n", + " Total time for finalization = 1.8200E-01 seconds\n", + " Total time elapsed = 3.4170E+02 seconds\n", + " Calculation Rate (inactive) = 10227.0 neutrons/second\n", + " Calculation Rate (active) = 1338.71 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -707,14 +720,14 @@ "text/plain": [ "array([[[ 0.40945685, 0. ]],\n", "\n", - " [[ 0.40939021, 0. ]],\n", + " [[ 0.41078582, 0. ]],\n", "\n", - " [[ 0.410625 , 0. ]],\n", + " [[ 0.40926432, 0. ]],\n", "\n", " ..., \n", - " [[ 0.41130501, 0. ]],\n", + " [[ 0.41362317, 0. ]],\n", "\n", - " [[ 0.41228849, 0. ]],\n", + " [[ 0.41335428, 0. ]],\n", "\n", " [[ 0.41420317, 0. ]]])" ] @@ -754,26 +767,26 @@ "text/plain": [ "(array([[[ 0.00454952, 0. ]],\n", " \n", - " [[ 0.00454878, 0. ]],\n", + " [[ 0.00456429, 0. ]],\n", " \n", - " [[ 0.0045625 , 0. ]],\n", + " [[ 0.00454738, 0. ]],\n", " \n", " ..., \n", - " [[ 0.00457006, 0. ]],\n", + " [[ 0.00459581, 0. ]],\n", " \n", - " [[ 0.00458098, 0. ]],\n", + " [[ 0.00459283, 0. ]],\n", " \n", " [[ 0.00460226, 0. ]]]),\n", " array([[[ 1.64748193e-05, 0.00000000e+00]],\n", " \n", - " [[ 1.70922989e-05, 0.00000000e+00]],\n", + " [[ 1.74996463e-05, 0.00000000e+00]],\n", " \n", - " [[ 1.67622385e-05, 0.00000000e+00]],\n", + " [[ 1.74392771e-05, 0.00000000e+00]],\n", " \n", " ..., \n", - " [[ 1.69274948e-05, 0.00000000e+00]],\n", + " [[ 1.73541566e-05, 0.00000000e+00]],\n", " \n", - " [[ 1.57842763e-05, 0.00000000e+00]],\n", + " [[ 1.67854889e-05, 0.00000000e+00]],\n", " \n", " [[ 2.06590062e-05, 0.00000000e+00]]]))" ] @@ -855,7 +868,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 24, @@ -864,9 +877,9 @@ }, { "data": { - "image/png": "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\nAElFTkSuQmCC\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -898,7 +911,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYwAAAEACAYAAACgS0HpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAEupJREFUeJzt3X+IZWd9x/H3N5sfatQ1WnZuuxszsSFxprSVgNHWlhZc\ntkkKmzQLQXegSVNoIf5CRczaUrEUNgpiLXYFq7WrZBo2Lm0CtSaEFKELNmp+aWaMY3U3m9G5sRoC\nUZruut/+cc/u3p25M/Ps/X1m3y+45Mxzz7nnO8/ezWef8+M5kZlIkrSe80ZdgCSpHgwMSVIRA0OS\nVMTAkCQVMTAkSUUMDElSkXUDIyI+FxHNiHiire2SiHggIp6KiPsjYnPbe3siYiEi5iNiR1v71RHx\nRER8NyL+tv+/iiRpkEpGGJ8H/mBZ2x3Ag5l5FfAQsAcgIqaBm4Ep4DpgX0REtc2ngT/NzCuBKyNi\n+WdKksbYuoGRmf8JPLes+QZgf7W8H7ixWt4J3J2ZxzPzMLAAXBMRDeAVmfn1ar0vtG0jSaqBbs9h\nbMnMJkBmLgFbqvatwNG29Rartq3AM23tz1RtkqSa6NdJb+cXkaQN7vwut2tGxERmNqvDTc9W7YvA\npW3rbavaVmvvKCIMIEnqQmbG+mt1p3SEEdXrpPuAW6vlW4B729rfFhEXRsTlwBXAw9Vhq+cj4prq\nJPgft23TUWbW9nXTTTeNvIZzsXbrH/3L+kf7GrR1RxgRMQv8PvCaiHga+DBwJ3BPRNwGHKF1ZRSZ\nORcRB4A54Bhwe57+Ld4B/BPwEuDLmfmV/v4qkqRBWjcwMnP3Km9tX2X9vcDeDu3fBH79rKqTJI0N\n7/QegKmpqVGX0LU61w7WP2rWv7EZGAMwPT096hK6VufawfpHzfo3NgNDklTEwJAkFTEwJElFDAxJ\nUhEDQ5JUxMBQsUZjkohY8Wo0JkddmqQhMDBUrNk8QmueyTNfzeaSQSKdA7qdfFBq8yKdJixuNgc2\nB5qkEXCEIUkqYmBIkooYGJKkIgaGJKmIgSFJKmJgSJKKGBiSpCIGhjrqdFe3pHObN+6po9N3dbcz\nNKRzmSMMSVIRA0OSVMTAkCQVMTAkSUUMDElSEQNDklTEwJAkFTEwJElFDAxJUhEDQ5JUxMCQJBUx\nMCRJRQwMSVIRA0OSVMTAkCQVMTAkSUUMDA3QRSue2tdoTI66KEld6ikwIuK9EfHtiHgiIu6KiAsj\n4pKIeCAinoqI+yNic9v6eyJiISLmI2JH7+VrvL1I66l9p1+tJ/lJqqOuAyMifgV4F3B1Zv4Grce9\nvh24A3gwM68CHgL2VOtPAzcDU8B1wL7wQdGSVBu9HpLaBFwcEecDLwUWgRuA/dX7+4Ebq+WdwN2Z\neTwzDwMLwDU97l+SNCRdB0Zm/hD4OPA0raB4PjMfBCYys1mtswRsqTbZChxt+4jFqk0j1GhMnnGO\nYWZmBgd+kjo5v9sNI+JVtEYTlwHPA/dExAytg9Xtlv9cZNeuXaeWp6ammJ6e7rLS4Tt06NCoSyjW\nOqfQ6Y9ocKExOzs7sM+uU993Yv2jVbf65+bmmJ+fH9r+ug4MYDvw/cz8KUBE/Avw20AzIiYysxkR\nDeDZav1F4NK27bdVbR0dPHiwh9JGb/fu3aMuocjMzMzQ9znovqlL36/G+kerzvUP+uhAL+cwngbe\nHBEvqU5evxWYA+4Dbq3WuQW4t1q+D3hbdSXV5cAVwMM97F+SNERdjzAy8+GI+BLwKHCs+u9ngFcA\nByLiNuAIrSujyMy5iDhAK1SOAbdnZleHqyRJw9fLISky8yPAR5Y1/5TW4apO6+8F9vayT0nSaHin\ntySpiIEhSSpiYEiSihgYkqQiBoYkqYiBIUkqYmCcQ5bPG+WcUZLORk/3YaheOs8bZWhIKuMIQ5JU\nxMCQJBUxMCRJRQwMSVIRA0OSVMTAkCQVMTAkSUUMDElSEQNDklTEwJAkFTEwJElFDAwN2UUrJkCM\nCBqNyVEXJmkdTj6oIXuRlRMgQrPpJIjSuHOEIUkqYmBIkooYGJKkIgaGJKmIgSFJKmJgSJKKGBiS\npCIGhiSpiIEhSSpiYEiSihgYkqQiBoYkqYiBIUkqYmBIkor0FBgRsTki7omI+Yh4MiLeFBGXRMQD\nEfFURNwfEZvb1t8TEQvV+jt6L1+SNCy9jjA+CXw5M6eA3wS+A9wBPJiZVwEPAXsAImIauBmYAq4D\n9kWED0GQpJroOjAi4pXA72bm5wEy83hmPg/cAOyvVtsP3Fgt7wTurtY7DCwA13S7f0nScPUywrgc\n+J+I+HxEPBIRn4mIlwETmdkEyMwlYEu1/lbgaNv2i1WbJKkGegmM84Grgb/PzKuBn9E6HLX8+Zsr\nn8cpSaqdXp7p/QxwNDO/Uf18kFZgNCNiIjObEdEAnq3eXwQubdt+W9XW0a5du04tT01NMT093UOp\nw3Xo0KFRl1BLs7OzPX9G3fve+kerbvXPzc0xPz8/tP11HRhVIByNiCsz87vAW4Enq9etwEeBW4B7\nq03uA+6KiE/QOhR1BfDwap9/8ODBbksbC7t37x51CSvMzMyMuoQ19avPxrHvz4b1j1ad6x/0dUS9\njDAA3k0rBC4Avg/8CbAJOBARtwFHaF0ZRWbORcQBYA44BtyemR6uUuWiFV/2iYnLWFo6PJpyJK3Q\nU2Bk5uPAGzu8tX2V9fcCe3vZpzaqF1l+uqvZ9KpraZx4p7ckqYiBIUkqYmBIkooYGJKkIgaGJKmI\ngSFJKmJgSJKKGBiSpCIGxgbUaEwSEStektSLXqcG0RhqNo/QeZJgQ0NS9xxhSJKKGBiSpCIGhiSp\niIEhSSpiYEiSihgYkqQiBoYkqYiBIUkqYmBIkooYGJKkIgaGJKmIgSFJKmJgaIxd1HHW3UZjctSF\nSeckZ6vVGHuRTrPuNpvOuiuNgiMMSVIRA0OSVMTAkCQVMTAkSUUMDElSEQNDklTEwJAkFTEwJElF\nDAxJUhEDQ5JUxMCQJBUxMGqu0ZhcMTmfJA1Cz4EREedFxCMRcV/18yUR8UBEPBUR90fE5rZ190TE\nQkTMR8SOXvctaDaP0Jqgr/0lSf3XjxHGe4C5tp/vAB7MzKuAh4A9ABExDdwMTAHXAfvCfw5LUm30\nFBgRsQ24HvhsW/MNwP5qeT9wY7W8E7g7M49n5mFgAbiml/1Lkoan1xHGJ4APcOZxkInMbAJk5hKw\npWrfChxtW2+xapMk1UDXgRERfwg0M/MxYK1DSx5Ul6QNoJcn7r0F2BkR1wMvBV4REV8EliJiIjOb\nEdEAnq3WXwQubdt+W9XW0a5du04tT01NMT093UOpw3Xo0KFRl7Dhzc7Odmyve99b/2jVrf65uTnm\n5+eHt8PM7PkF/B5wX7X8MeCD1fIHgTur5WngUeBC4HLge0Cs8nlZZ3fdddfQ9gUk5LJXp7ZhrzvY\n/Y1D3w+C9Y9W3euv/m705f/rnV6DeKb3ncCBiLgNOELryigycy4iDtC6ouoYcHv1C0qSaqAvgZGZ\nXwW+Wi3/FNi+ynp7gb392Kckabi801uSVMTAkCQVMTAkSUUMDElSEQNDNXTRihl6G43JURclbXiD\nuKxWGrAXWT6BQLPpPJbSoDnCkCQVMTAkSUUMDElSEQNDklTEwJAkFTEwJElFDAxJUhEDQ5JUxMCQ\nJBUxMCRJRQwMSVIRA0OSVMTAkCQVMTAkSUUMDElSEQNDklTEwKiJRmNyxVPmInxokKTh8Yl7NdFs\nHmH5U+ZaDA1Jw+EIQ5JUxMDQBnEREcHMzMwZh+wajclRFyZtGB6S0gbxIp0O2TWbHrKT+sURhiSp\niIEhSSpiYEiSihgYkqQiBoYkqYiBIUkqYmBog7toxXQq3pshdcf7MLTBrbw/w3szpO44wpAkFek6\nMCJiW0Q8FBFPRsS3IuLdVfslEfFARDwVEfdHxOa2bfZExEJEzEfEjn78ApKk4ehlhHEceF9m/hrw\nW8A7IuL1wB3Ag5l5FfAQsAcgIqaBm4Ep4DpgXzg/tyTVRteBkZlLmflYtfwCMA9sA24A9ler7Qdu\nrJZ3Andn5vHMPAwsANd0u39J0nD15RxGREwCbwC+BkxkZhNaoQJsqVbbChxt22yxatMynR6WJEmj\n1vNVUhHxcuBLwHsy84WIWD5laKen/qxr165dp5anpqaYnp7uvsghO3ToUE/bd35YkqHRT7Ozs6Mu\noaNevzujZv3DNTc3x/z8/ND211NgRMT5tMLii5l5b9XcjIiJzGxGRAN4tmpfBC5t23xb1dbRwYMH\neylt5Hbv3t31tjMzM32sRJ308uczaONcWwnrH51BH43o9ZDUPwJzmfnJtrb7gFur5VuAe9va3xYR\nF0bE5cAVwMM97l+SNCRdjzAi4i3ADPCtiHiU1jGUDwEfBQ5ExG3AEVpXRpGZcxFxAJgDjgG3Z2ZX\nh6skScPXdWBk5iFg0ypvb19lm73A3m73KUkaHe/0liQVMTAkSUUMDElSEQNDklTEwJAkFTEwJElF\nDAydg1Y+hc8n8Unr84l7OgetfAof+CQ+aT2OMCRJRQwMSVIRA0OSVMTAkCQVMTAkSUUMjBHq9ChW\nH8cqaVx5We0IdX4UK/g4VknjyBGGJKmIgSFJKmJgSJKKGBiSpCIGhnTKykkJnZBQOs2rpKRTVk5K\n6ISE0mmOMCRJRQwMSVIRA0OSVMTAGAKnAKkzn84nneRJ7yFwCpA68+l80kmOMCRJRQwMSVIRA0OS\nVMTAkCQVMTCkrnS+emrTpou9okoblldJSV3pfPXUiROxot0rqrRROMLos0ZjkpmZGe+3kLThOMLo\ns873XBgakurPEYYkqcjQAyMiro2I70TEdyPig8Pef7843YfKOb2INoahHpKKiPOATwFvBX4IfD0i\n7s3M7wyzjn5wug+VW216kZes+EfGxRe/ht27dw+prv6bm5sbdQk9qXv9gzbsEcY1wEJmHsnMY8Dd\nwA1DrkEaEyeD5PTrZz97odajkfn5+VGX0JO61z9owz7pvRU42vbzM7RCZOSWlpbYvv2PeOGFn5/R\nfsEFm3juuWf5yU8WR1SZzi3lo5GJictYWjo8nLIkvErqlMXFRebnv8mmTY0z2n/xix9z4sT/4pVP\nGq1Oj49dGSIA5533Mk6c+Pm6bWu1G0bqZNiBsQi8tu3nbVXbCqM6gXzixNFV3ulUz2o19rrusPfn\n79G/dUexvzN1CoBObWu1N5tHuv47WPeLP+pe/yBFZqcTtwPaWcQm4ClaJ71/BDwMvD0zPXAoSWNu\nqCOMzPxFRLwTeIDWCffPGRaSVA9DHWFIkuprIJfVltycFxF/FxELEfFYRLxhvW0j4mMRMV+tfzAi\nXtn23p7qs+YjYked6o+IyyLi5xHxSPXaN4a1/3VEPB4Rj0bEVyKi0fZeHfq+Y/397vtB1d/2/vsj\n4kREvLqtbez7f7X669L/EfHhiHimrc5r294b+/5frf6u+j8z+/qiFULfAy4DLgAeA16/bJ3rgH+r\nlt8EfG29bYHtwHnV8p3A3mp5GniU1uG1yWr7qFH9lwFPjHnfv7xt+3cBn65Z369Wf9/6fpD1V+9v\nA74C/AB4ddU2VYf+X6P+WvQ/8GHgfR32V4v+X6P+s+7/QYwwSm7OuwH4AkBm/hewOSIm1to2Mx/M\nzBPV9l+j9QUE2AncnZnHM/MwsEBv93YMu37o3zW6g6r9hbbtLwZO/h516fvV6of+Xh89kPornwA+\n0OGzxr7/16gf6tP/neqsU//3duldZRCB0enmvK2F65RsC3Ab8OVVPmtxlW1KDav+f2/7ebIaEv5H\nRPxOt4UX7r+r2iPibyLiaWA38FerfNbY9v0q9UP/+n5g9UfETuBoZn5rnc8ay/5fo36oQf9X3lkd\nAvpsRGxe5bPGsv8r7fW/qq39rPp/XGarLU65iPgL4Fhm/vMA6zlb3dQ/WzX9EHhtZl4NvB+YjYiX\nD6DGVUsqWSkz/zIzXwvcReuwzrjopf4fMdq+h3Xqj4iXAh+idVhhHHVT/8ltRv3db69lLfuA12Xm\nG4Al4OODLems9FL/WX//BxEYJTfnLQKXdlhnzW0j4lbgelr/Slzvs7o11Poz81hmPlctPwL8N3Dl\nuNXeZha4aZ3P6taw6t8FkJn/18e+H1T9v0rr+PjjEfGDqv2RiNhSuL9xrP+bEbGlz9/9QdVPZv44\nq4P+wD9w+rBTLb7/Hep/Y9V+9t//bk/QrHHiZhOnT75cSOvky9Syda7n9ImbN3P6xM2q2wLXAk8C\nr1n2WSdPvF4IXE7vJ56GXf8vcfpk+OtoDStfNWa1X9G2/buAAzXr+9Xq71vfD7L+Zdv/ALikTv2/\nRv216H+g0bb9e4HZOvX/GvWfdf939YsV/OLX0rqjewG4o2r7c+DP2tb5VPULPg5cvda2VfsCcAR4\npHrta3tvT/VZ88COOtVP61/r367avgFcP4a1fwl4ovoS3gv8cs36vmP9/e77QdW/7PO/T3WVUV36\nf7X669L/tE4yn/z+/CswUaf+X63+bvrfG/ckSUXG5aS3JGnMGRiSpCIGhiSpiIEhSSpiYEiSihgY\nkqQiBoYkqYiBIUkq8v85hnCHzxMbMwAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1012,7 +1025,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 28, @@ -1023,7 +1036,7 @@ "data": { "image/png": "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\nrkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1074,7 +1087,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index dfd493f168..763e80d204 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -105,7 +105,6 @@ "source": [ "# Instantiate a Materials collection\n", "materials_file = openmc.Materials((fuel, water, zircaloy))\n", - "materials_file.default_xs = '71c'\n", "\n", "# Export to \"materials.xml\"\n", "materials_file.export_to_xml()" @@ -339,7 +338,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AHFwInLqDpadAAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDctMjJUMjE6Mzk6\nNDYtMDU6MDBOOEOsAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA3LTIyVDIxOjM5OjQ2LTA1OjAw\nP2X7EAAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAACBjSFJN\nAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAADFBMVEX///9yEhLpgJFNv8Tq\nQYT7AAAAAWJLR0QAiAUdSAAAAAd0SU1FB+AIHw8dMt59x4sAAALKSURBVGje7dpLcqQwDAbgHHE2\nYeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmNP+HDhw8fPnz48Kf6VH9G\n+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4zPji99z0/AJ4n1lfvJ6f\nnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6pA0wfln+ho/fwgYYn19C\n/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tNDbSGz7T0SBEWw4vLXzbQ\n6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X58wZaxWd1+fMGiuFvir8b\nvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV873hB8UnM3xzANtf8nb4\ndwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7T/ppARBvp48UwJnelT5S\nACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4//Jve+fhsH6Ctv7n8PTzj\nvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V32/o9+fl389Xnx+g5x/o\n+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6/4Le/6D3T/D9V67Y/ZsV\nQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/gPs/0P4TtP8F7r9J3AIO\n9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTuf4X7b+H+X7T/+BPuf3aM\n8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTYtMDgtMzFUMTA6Mjk6\nNTAtMDU6MDBsyrzpAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE2LTA4LTMxVDEwOjI5OjUwLTA1OjAw\nHZcEVQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -527,23 +526,37 @@ "output_type": "stream", "text": [ "\n", - " .d88888b. 888b d888 .d8888b.\n", - " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", - " 888 888 88888b.d88888 888 888\n", - " 888 888 88888b. .d88b. 88888b. 888Y88888P888 888 \n", - " 888 888 888 \"88b d8P Y8b 888 \"88b 888 Y888P 888 888 \n", - " 888 888 888 888 88888888 888 888 888 Y8P 888 888 888\n", - " Y88b. .d88P 888 d88P Y8b. 888 888 888 \" 888 Y88b d88P\n", - " \"Y88888P\" 88888P\" \"Y8888 888 888 888 888 \"Y8888P\"\n", - "__________________888______________________________________________________\n", - " 888\n", - " 888\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", - " Copyright: 2011-2016 Massachusetts Institute of Technology\n", - " License: http://openmc.readthedocs.io/en/latest/license.html\n", - " Version: 0.7.1\n", - " Git SHA1: 3d68c07625e33cd64188df03ee03e9c31b3d4b74\n", - " Date/Time: 2016-07-22 21:39:46\n", + " | The OpenMC Monte Carlo Code\n", + " Copyright | 2011-2016 Massachusetts Institute of Technology\n", + " License | http://openmc.readthedocs.io/en/latest/license.html\n", + " Version | 0.8.0\n", + " Git SHA1 | fbebf7bf709fe2fe1813af95bff9b29c0d59312c\n", + " Date/Time | 2016-08-31 10:29:51\n", + " OpenMP Threads | 4\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -553,13 +566,13 @@ " Reading geometry XML file...\n", " Reading cross sections XML file...\n", " Reading materials XML file...\n", - " Reading U235.71c from /home/romano/openmc/data/nndc_hdf5/U235_71c.h5\n", - " Reading U238.71c from /home/romano/openmc/data/nndc_hdf5/U238_71c.h5\n", - " Reading O16.71c from /home/romano/openmc/data/nndc_hdf5/O16_71c.h5\n", - " Reading H1.71c from /home/romano/openmc/data/nndc_hdf5/H1_71c.h5\n", - " Reading B10.71c from /home/romano/openmc/data/nndc_hdf5/B10_71c.h5\n", - " Reading Zr90.71c from /home/romano/openmc/data/nndc_hdf5/Zr90_71c.h5\n", - " Maximum neutron transport energy: 20.0000 MeV for U235.71c\n", + " Reading U235 from /home/romano/openmc/data/nndc_hdf5/U235.h5\n", + " Reading U238 from /home/romano/openmc/data/nndc_hdf5/U238.h5\n", + " Reading O16 from /home/romano/openmc/data/nndc_hdf5/O16.h5\n", + " Reading H1 from /home/romano/openmc/data/nndc_hdf5/H1.h5\n", + " Reading B10 from /home/romano/openmc/data/nndc_hdf5/B10.h5\n", + " Reading Zr90 from /home/romano/openmc/data/nndc_hdf5/Zr90.h5\n", + " Maximum neutron transport energy: 20.0000 MeV for U235\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", " Initializing source particles...\n", @@ -599,20 +612,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 3.5600E-01 seconds\n", - " Reading cross sections = 2.3400E-01 seconds\n", - " Total time in simulation = 1.8333E+01 seconds\n", - " Time in transport only = 1.8325E+01 seconds\n", - " Time in inactive batches = 2.6950E+00 seconds\n", - " Time in active batches = 1.5638E+01 seconds\n", - " Time synchronizing fission bank = 1.0000E-03 seconds\n", - " Sampling source sites = 0.0000E+00 seconds\n", - " SEND/RECV source sites = 1.0000E-03 seconds\n", + " Total time for initialization = 4.3100E-01 seconds\n", + " Reading cross sections = 3.0500E-01 seconds\n", + " Total time in simulation = 8.9870E+00 seconds\n", + " Time in transport only = 8.9500E+00 seconds\n", + " Time in inactive batches = 1.1950E+00 seconds\n", + " Time in active batches = 7.7920E+00 seconds\n", + " Time synchronizing fission bank = 5.0000E-03 seconds\n", + " Sampling source sites = 5.0000E-03 seconds\n", + " SEND/RECV source sites = 0.0000E+00 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 1.0000E-03 seconds\n", - " Total time elapsed = 1.8711E+01 seconds\n", - " Calculation Rate (inactive) = 4638.22 neutrons/second\n", - " Calculation Rate (active) = 2398.00 neutrons/second\n", + " Total time elapsed = 9.4370E+00 seconds\n", + " Calculation Rate (inactive) = 10460.3 neutrons/second\n", + " Calculation Rate (active) = 4812.63 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", From c4357ba177bd8d8c7a410629ef48e3d9f76b7f29 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Thu, 1 Sep 2016 06:34:01 -0500 Subject: [PATCH 159/168] Remove comment and mgxs print routines --- src/initialize.F90 | 2 +- src/mgxs_header.F90 | 162 -------------------------------------------- 2 files changed, 1 insertion(+), 163 deletions(-) diff --git a/src/initialize.F90 b/src/initialize.F90 index f05b4f2b99..2bcf2e01f2 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -4,7 +4,7 @@ module initialize use constants use dict_header, only: DictIntInt, ElemKeyValueII use set_header, only: SetInt - use energy_grid, only: logarithmic_grid, grid_method ! , unionized_grid + 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 diff --git a/src/mgxs_header.F90 b/src/mgxs_header.F90 index 5947d2562d..9409398b3e 100644 --- a/src/mgxs_header.F90 +++ b/src/mgxs_header.F90 @@ -28,7 +28,6 @@ module mgxs_header contains procedure(mgxs_init_file_), deferred :: init_file ! Initialize the data - procedure(mgxs_print_), deferred :: print ! Writes object info procedure(mgxs_get_xs_), deferred :: get_xs ! Get the requested xs procedure(mgxs_combine_), deferred :: combine ! initializes object ! Sample the outgoing energy from a fission event @@ -63,12 +62,6 @@ module mgxs_header integer, intent(in) :: max_order ! Maximum requested order end subroutine mgxs_init_file_ - subroutine mgxs_print_(this, unit) - import Mgxs - class(Mgxs),intent(in) :: this - integer, optional, intent(in) :: unit - end subroutine mgxs_print_ - pure function mgxs_get_xs_(this,xstype,gin,gout,uvw,mu) result(xs) import Mgxs class(Mgxs), intent(in) :: this @@ -149,7 +142,6 @@ module mgxs_header contains procedure :: init_file => mgxsiso_init_file ! Initialize Nuclidic MGXS Data - procedure :: print => mgxsiso_print ! Writes nuclide info procedure :: get_xs => mgxsiso_get_xs ! Gets Size of Data w/in Object procedure :: combine => mgxsiso_combine ! inits object procedure :: sample_fission_energy => mgxsiso_sample_fission_energy @@ -180,7 +172,6 @@ module mgxs_header contains procedure :: init_file => mgxsang_init_file ! Initialize Nuclidic MGXS Data - procedure :: print => mgxsang_print ! Writes nuclide info procedure :: get_xs => mgxsang_get_xs ! Gets Size of Data w/in Object procedure :: combine => mgxsang_combine ! inits object procedure :: sample_fission_energy => mgxsang_sample_fission_energy @@ -951,159 +942,6 @@ module mgxs_header end subroutine mgxsang_init_file -!=============================================================================== -! MGXS*_PRINT displays information about a continuous-energy neutron -! cross_section table and its reactions and secondary angle/energy distributions -!=============================================================================== - - subroutine mgxs_print(this, unit_) - class(Mgxs), intent(in) :: this - integer, intent(in) :: unit_ - - character(MAX_LINE_LEN) :: temp_str - - ! Basic nuclide information - write(unit_,*) 'MGXS Entry: ' // trim(this % name) - if (this % awr > ZERO) then - write(unit_,*) ' AWR = ' // trim(to_str(this % awr)) - end if - if (this % kT > ZERO) then - write(unit_,*) ' kT = ' // trim(to_str(this % kT)) - end if - if (this % scatt_type == ANGLE_LEGENDRE) then - temp_str = "Legendre" - write(unit_,*) ' Scattering Type = ' // trim(temp_str) - select type(this) - type is (MgxsIso) - temp_str = to_str(size(this % scatter % dist(1) % data,dim=1) - 1) - end select - write(unit_,*) ' Scattering Order = ' // trim(temp_str) - else if (this % scatt_type == ANGLE_HISTOGRAM) then - temp_str = "Histogram" - write(unit_,*) ' Scattering Type = ' // trim(temp_str) - select type(this) - type is (MgxsIso) - temp_str = to_str(size(this % scatter % dist(1) % data,dim=1)) - end select - write(unit_,*) ' Num. Distribution Bins = ' // trim(temp_str) - else if (this % scatt_type == ANGLE_TABULAR) then - temp_str = "Tabular" - write(unit_,*) ' Scattering Type = ' // trim(temp_str) - select type(this) - type is (MgxsIso) - temp_str = to_str(size(this % scatter % dist(1) % data,dim=1)) - end select - write(unit_,*) ' Num. Distribution Points = ' // trim(temp_str) - end if - write(unit_,*) ' Fissionable = ', this % fissionable - - end subroutine mgxs_print - - subroutine mgxsiso_print(this, unit) - - class(MgxsIso), intent(in) :: this - integer, optional, intent(in) :: unit - - integer :: unit_ ! unit to write to - integer :: size_total, size_scattmat, size_mgxs - integer :: gin - - ! set default unit for writing information - if (present(unit)) then - unit_ = unit - else - unit_ = OUTPUT_UNIT - end if - - ! Write Basic Nuclide Information - call mgxs_print(this, unit_) - - ! Determine size of mgxs and scattering matrices - size_scattmat = 0 - do gin = 1, size(this % scatter % energy) - size_scattmat = size_scattmat + & - 2 * size(this % scatter % energy(gin) % data) + & - size(this % scatter % dist(gin) % data) - end do - size_scattmat = size_scattmat + size(this % scatter % scattxs) - size_scattmat = size_scattmat * 8 - - size_mgxs = size(this % total) + size(this % absorption) + & - size(this % nu_fission) + size(this % k_fission) + & - size(this % fission) + size(this % chi) - size_mgxs = size_mgxs * 8 - - ! Calculate total memory - size_total = size_scattmat + size_mgxs - - ! Write memory used - write(unit_,*) ' Memory Requirements' - write(unit_,*) ' Cross sections = ' // trim(to_str(size_mgxs)) // ' bytes' - write(unit_,*) ' Scattering Matrices = ' // & - trim(to_str(size_scattmat)) // ' bytes' - write(unit_,*) ' Total = ' // trim(to_str(size_total)) // ' bytes' - - ! Blank line at end of nuclide - write(unit_,*) - - end subroutine mgxsiso_print - - subroutine mgxsang_print(this, unit) - - class(MgxsAngle), intent(in) :: this - integer, optional, intent(in) :: unit - - integer :: unit_ ! unit to write to - integer :: size_total, size_scattmat, size_mgxs - integer :: ipol, iazi, gin - - ! set default unit for writing information - if (present(unit)) then - unit_ = unit - else - unit_ = OUTPUT_UNIT - end if - - ! Write Basic Nuclide Information - call mgxs_print(this, unit_) - - write(unit_,*) ' # of Polar Angles = ' // trim(to_str(this % n_pol)) - write(unit_,*) ' # of Azimuthal Angles = ' // trim(to_str(this % n_azi)) - - ! Determine size of mgxs and scattering matrices - size_scattmat = 0 - do ipol = 1, this % n_pol - do iazi = 1, this % n_azi - do gin = 1, size(this % scatter(iazi, ipol) % obj % energy) - size_scattmat = size_scattmat + & - 2 * size(this % scatter(iazi, ipol) % obj % energy(gin) % data) + & - size(this % scatter(iazi, ipol) % obj % dist(gin) % data) - end do - size_scattmat = size_scattmat + & - size(this % scatter(iazi, ipol) % obj % scattxs) - end do - end do - size_scattmat = size_scattmat * 8 - - size_mgxs = size(this % total) + size(this % absorption) + & - size(this % nu_fission) + size(this % k_fission) + & - size(this % fission) + size(this % chi) - size_mgxs = size_mgxs * 8 - - ! Calculate total memory - size_total = size_scattmat + size_mgxs - - ! Write memory used - write(unit_,*) ' Memory Requirements' - write(unit_,*) ' Cross sections = ' // trim(to_str(size_mgxs)) // ' bytes' - write(unit_,*) ' Scattering Matrices = ' // & - trim(to_str(size_scattmat)) // ' bytes' - write(unit_,*) ' Total = ' // trim(to_str(size_total)) // ' bytes' - - ! Blank line at end of nuclide - write(unit_,*) - end subroutine mgxsang_print - !=============================================================================== ! MGXS*_GET_XS returns the requested data cross section data !=============================================================================== From fc1d856cf85cbd9918f0f5c2c9be887afa9abd3a Mon Sep 17 00:00:00 2001 From: Sam Shaner Date: Thu, 1 Sep 2016 10:29:48 -0400 Subject: [PATCH 160/168] fixed bug in MDGXS.get_pandas_dataframe(...) --- openmc/mgxs/mdgxs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openmc/mgxs/mdgxs.py b/openmc/mgxs/mdgxs.py index 7a76a6c9d9..8941d4c6f9 100644 --- a/openmc/mgxs/mdgxs.py +++ b/openmc/mgxs/mdgxs.py @@ -771,7 +771,7 @@ class MDGXS(MGXS): # If the user requested all nuclides, keep nuclide column in dataframe else: - query_nuclides = nuclides + query_nuclides = self.nuclides df = self.xs_tally.get_pandas_dataframe( distribcell_paths=distribcell_paths) From 176b92538946d82a0c9001fdd8a8bbd61a94668c Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Fri, 2 Sep 2016 12:57:01 -0500 Subject: [PATCH 161/168] Pick nearest URR temperature when using multipole --- src/cross_section.F90 | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 43e8544960..800552f891 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -158,9 +158,10 @@ contains E <= nuc % multipole % end_E/1.0e6_8) then use_mp = .true. else - ! If using multipole data but outside the RRR, just pick the first - ! temperature - i_temp = 1 + ! If using multipole data but outside the RRR, pick the nearest + ! temperature. Note that there is no tolerance here, so this + ! temperature could be very far off! + i_temp = minloc(abs(nuclides(i_nuclide) % kTs - kT), dim=1) end if else ! If not using multipole data, do a linear search on temperature From c4744ec638bf353a57338337f667e89f9ae4488c Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Fri, 2 Sep 2016 17:12:43 -0400 Subject: [PATCH 162/168] Fixed He4 and H3 issue where temperatures were not being added. This was due to an issue where when the different temperatures were reading the absorption xs from ACE, it was being stored even if it was a 0. array. At the same time, the base h5 file was read by from_hdf5 which never had the derived absorption xs created for these nuclides --- 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 7568a24ba8..064cc4199a 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -472,8 +472,8 @@ class IncidentNeutron(EqualityMixin): tgroup = group['total_nu'] rx.derived_products.append(Product.from_hdf5(tgroup)) - # Build summed reactions. Start from the highest MT number because high - # MTs never depend on lower MTs. + # Build summed reactions. Start from the highest MT number because + # high MTs never depend on lower MTs. for mt_sum in sorted(SUM_RULES, reverse=True): if mt_sum not in data: rxs = [data[mt] for mt in SUM_RULES[mt_sum] if mt in data] @@ -545,7 +545,7 @@ class IncidentNeutron(EqualityMixin): energy = ace.xss[ace.jxs[1]:ace.jxs[1] + n_energy] data.energy[strT] = energy total_xs = ace.xss[ace.jxs[1] + n_energy:ace.jxs[1] + 2 * n_energy] - absorption_xs = ace.xss[ace.jxs[1] + 2*n_energy:ace.jxs[1] + + absorption_xs = ace.xss[ace.jxs[1] + 2 * n_energy:ace.jxs[1] + 3 * n_energy] # Create summed reactions (total and absorption) @@ -553,9 +553,10 @@ class IncidentNeutron(EqualityMixin): total.xs[strT] = Tabulated1D(energy, total_xs) data.summed_reactions[1] = total - absorption = Reaction(27) - absorption.xs[strT] = Tabulated1D(energy, absorption_xs) - data.summed_reactions[27] = absorption + if np.count_nonzero(absorption_xs) > 0: + absorption = Reaction(27) + absorption.xs[strT] = Tabulated1D(energy, absorption_xs) + data.summed_reactions[27] = absorption # Read each reaction n_reaction = ace.nxs[4] + 1 From 623b705a399f16c8e5063732bc6e6a357611542d Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Fri, 2 Sep 2016 18:27:55 -0400 Subject: [PATCH 163/168] now fixed the thermal scattering side --- scripts/openmc-ace-to-hdf5 | 2 ++ 1 file changed, 2 insertions(+) diff --git a/scripts/openmc-ace-to-hdf5 b/scripts/openmc-ace-to-hdf5 index b926698c99..ff8c19962b 100755 --- a/scripts/openmc-ace-to-hdf5 +++ b/scripts/openmc-ace-to-hdf5 @@ -172,6 +172,8 @@ for filename in ace_libraries: continue elif xs.endswith('t'): + # Adjust name to be the new thermal scattering name + name = openmc.data.get_thermal_name(name) # Thermal scattering data if name not in nuclides: try: From 6c70391973d61f6eb9e8c025de5242c9d59ee80a Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Sun, 4 Sep 2016 06:35:21 -0400 Subject: [PATCH 164/168] Fixed uninitialized value bug in calculate_nuclide_xs --- src/cross_section.F90 | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cross_section.F90 b/src/cross_section.F90 index 800552f891..e2cc31d5ea 100644 --- a/src/cross_section.F90 +++ b/src/cross_section.F90 @@ -161,6 +161,7 @@ contains ! If using multipole data but outside the RRR, pick the nearest ! temperature. Note that there is no tolerance here, so this ! temperature could be very far off! + kT = sqrtkT**2 i_temp = minloc(abs(nuclides(i_nuclide) % kTs - kT), dim=1) end if else From bed0b4487ebc5355b5a68355bed92abb8d4534d8 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Tue, 6 Sep 2016 19:16:05 -0400 Subject: [PATCH 165/168] Fixed docstring and unused variable issues pointed out by @smharper --- openmc/data/neutron.py | 6 ++---- src/nuclide_header.F90 | 3 +-- src/sab_header.F90 | 3 +-- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/openmc/data/neutron.py b/openmc/data/neutron.py index 064cc4199a..456ccee7bc 100644 --- a/openmc/data/neutron.py +++ b/openmc/data/neutron.py @@ -23,8 +23,7 @@ if sys.version_info[0] >= 3: def _get_metadata(zaid, metastable_scheme='nndc'): - """Method to obtain the complete element name, element, Z, mass_number, - and metastable state + """Return basic identifying data for a nuclide with a given ZAID. Parameters ---------- @@ -283,8 +282,7 @@ class IncidentNeutron(EqualityMixin): self._urr = urr def add_temperature_from_ace(self, ace_or_filename, metastable_scheme='nndc'): - """Add data to the IncidentNeutron object from an ACE file at a - different temperature. + """Append data from an ACE file at a different temperature. Parameters ---------- diff --git a/src/nuclide_header.F90 b/src/nuclide_header.F90 index f9e473f45c..1fbd691ee8 100644 --- a/src/nuclide_header.F90 +++ b/src/nuclide_header.F90 @@ -194,7 +194,6 @@ module nuclide_header real(8), intent(in) :: tolerance integer :: i - integer :: n integer :: storage_type integer :: max_corder integer :: n_links @@ -203,7 +202,7 @@ module nuclide_header integer :: n_temperature integer(HID_T) :: urr_group, nu_group integer(HID_T) :: energy_group, energy_dset - integer(HID_T) :: kT_group, kT_dset + integer(HID_T) :: kT_group integer(HID_T) :: rxs_group integer(HID_T) :: rx_group integer(HID_T) :: total_nu diff --git a/src/sab_header.F90 b/src/sab_header.F90 index c8619efa32..147643065a 100644 --- a/src/sab_header.F90 +++ b/src/sab_header.F90 @@ -87,7 +87,6 @@ contains real(8), intent(in) :: tolerance integer :: i, j - integer :: n integer :: t integer :: n_energy, n_energy_out, n_mu integer :: i_closest @@ -98,7 +97,7 @@ contains integer(HID_T) :: elastic_group integer(HID_T) :: inelastic_group integer(HID_T) :: dset_id - integer(HID_T) :: kT_group, kT_dset + integer(HID_T) :: kT_group integer(HSIZE_T) :: dims2(2) integer(HSIZE_T) :: dims3(3) real(8), allocatable :: temp(:,:) From 22419b46962c5826918349e4d68b84eff67bae0a Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 6 Sep 2016 22:09:42 -0500 Subject: [PATCH 166/168] Fix subtle string array bug. --- openmc/data/thermal.py | 2 +- src/hdf5_interface.F90 | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/openmc/data/thermal.py b/openmc/data/thermal.py index 58c5276052..bbdb12dad2 100644 --- a/openmc/data/thermal.py +++ b/openmc/data/thermal.py @@ -226,7 +226,7 @@ class ThermalScattering(EqualityMixin): # Write basic data g = f.create_group(self.name) g.attrs['atomic_weight_ratio'] = self.atomic_weight_ratio - g.attrs['nuclides'] = np.string_(self.nuclides) + g.attrs['nuclides'] = np.array(self.nuclides, dtype='S') g.attrs['secondary_mode'] = np.string_(self.secondary_mode) ktg = g.create_group('kTs') for i, temperature in enumerate(self.temperatures): diff --git a/src/hdf5_interface.F90 b/src/hdf5_interface.F90 index 415ec55c9e..136628162c 100644 --- a/src/hdf5_interface.F90 +++ b/src/hdf5_interface.F90 @@ -2468,7 +2468,6 @@ contains call h5aget_type_f(attr_id, filetype, hdf5_err) call h5tget_size_f(filetype, size, hdf5_err) if (size > len(buffer(1)) + 1) then - print *, size, len(buffer(1)) call fatal_error("Character buffer is not long enough to & &read HDF5 string array.") end if From 46cb02efe49a9b0e350454c5d55a6fe2fe1ce898 Mon Sep 17 00:00:00 2001 From: Paul Romano Date: Tue, 6 Sep 2016 22:25:12 -0500 Subject: [PATCH 167/168] Remove old default_temperature specification in materials.xml --- openmc/material.py | 23 ------------------- tests/input_set.py | 4 ---- tests/test_asymmetric_lattice/inputs_true.dat | 2 +- tests/test_distribmat/inputs_true.dat | 2 +- tests/test_distribmat/test_distribmat.py | 1 - tests/test_iso_in_lab/inputs_true.dat | 2 +- tests/test_mg_basic/inputs_true.dat | 2 +- tests/test_mg_tallies/inputs_true.dat | 2 +- .../inputs_true.dat | 2 +- .../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 | 2 +- .../inputs_true.dat | 2 +- .../inputs_true.dat | 2 +- tests/test_periodic/inputs_true.dat | 2 +- tests/test_tallies/inputs_true.dat | 2 +- tests/test_tally_aggregation/inputs_true.dat | 2 +- tests/test_tally_arithmetic/inputs_true.dat | 2 +- tests/test_tally_slice_merge/inputs_true.dat | 2 +- tests/test_triso/inputs_true.dat | 2 +- tests/test_triso/test_triso.py | 1 - tests/test_volume_calc/inputs_true.dat | 2 +- tests/test_volume_calc/test_volume_calc.py | 1 - 24 files changed, 19 insertions(+), 49 deletions(-) diff --git a/openmc/material.py b/openmc/material.py index 2b52995738..f56af485a4 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -724,32 +724,14 @@ class Materials(cv.CheckedList): materials : Iterable of openmc.Material Materials to add to the collection - Attributes - ---------- - default_temperature : str - The default temperature identifier applied to a material when none is - specified. The units are in Kelvin and the temperature rounded to the - nearest integer. For example, a tempreature of 293.6K would be - provided as '294K' - """ def __init__(self, materials=None): super(Materials, self).__init__(Material, 'materials collection') - self._default_temperature = None self._materials_file = ET.Element("materials") if materials is not None: self += materials - @property - def default_temperature(self): - return self._default_temperature - - @default_temperature.setter - def default_temperature(self, temperature): - cv.check_type('default_temperature', temperature, basestring) - self._default_temperature = temperature - def add_material(self, material): """Append material to collection @@ -831,11 +813,6 @@ class Materials(cv.CheckedList): material.make_isotropic_in_lab() def _create_material_subelements(self): - if self._default_temperature is not None: - subelement = ET.SubElement(self._materials_file, - "default_temperature") - subelement.text = self._default_temperature - for material in self: xml_element = material.get_material_xml() self._materials_file.append(xml_element) diff --git a/tests/input_set.py b/tests/input_set.py index e409fba58f..94576acf0d 100644 --- a/tests/input_set.py +++ b/tests/input_set.py @@ -271,7 +271,6 @@ class InputSet(object): bot_fa.add_s_alpha_beta('c_H_in_H2O') # Define the materials file. - self.materials.default_temperature = '294K' self.materials += (fuel, clad, cold_water, hot_water, rpv_steel, lower_rad_ref, upper_rad_ref, bot_plate, bot_nozzle, top_nozzle, top_fa, bot_fa) @@ -615,7 +614,6 @@ class PinCellInputSet(object): hot_water.add_s_alpha_beta('c_H_in_H2O') # Define the materials file. - self.materials.default_temperature = '294K' self.materials += (fuel, clad, hot_water) # Instantiate ZCylinder surfaces @@ -717,7 +715,6 @@ class AssemblyInputSet(object): hot_water.add_s_alpha_beta('c_H_in_H2O') # Define the materials file. - self.materials.default_temperature = '294K' self.materials += (fuel, clad, hot_water) # Instantiate ZCylinder surfaces @@ -845,7 +842,6 @@ class MGInputSet(InputSet): water.add_macroscopic(water_data) # Define the materials file. - self.materials.default_temperature = '294K' self.materials += (uo2, clad, water) # Define surfaces. diff --git a/tests/test_asymmetric_lattice/inputs_true.dat b/tests/test_asymmetric_lattice/inputs_true.dat index 997d74ba88..9d278724f8 100644 --- a/tests/test_asymmetric_lattice/inputs_true.dat +++ b/tests/test_asymmetric_lattice/inputs_true.dat @@ -1 +1 @@ -7b62ec28ffec0028dc07ed23b720ae3f97b00aa15b319dc3991d9f1f88fcae8bffc7ccd2385d2b848180a57120624061ff4fe10745a3187e3e64fee0faface8d \ No newline at end of file +dfb59bace10a91bb7ffc871d8ee87e91d94754bb8bb002ac6088f80fe0f480741c0489f74b753fc37158d0ff0f1368739ea60638b42083791311eefeac79168e \ No newline at end of file diff --git a/tests/test_distribmat/inputs_true.dat b/tests/test_distribmat/inputs_true.dat index 2ba50f7e8c..d21da2f894 100644 --- a/tests/test_distribmat/inputs_true.dat +++ b/tests/test_distribmat/inputs_true.dat @@ -1 +1 @@ -dd0b1228d264dd3c24ca3082de9839080f727a137c77bed74b7637cc16d1564ce7500e3bb61a88224926f1d837079702f304247efdf9e52dedf779e17cd14550 \ No newline at end of file +6ae54c198e7659503d297e40be746a5bd72b35909fceed4b3ef357876b781946c0ea5021342556ef21f4034fa9e42b2c6014077c0efd3459dc063e6da4b12b59 \ No newline at end of file diff --git a/tests/test_distribmat/test_distribmat.py b/tests/test_distribmat/test_distribmat.py index 29c5d638f3..ec19176c49 100644 --- a/tests/test_distribmat/test_distribmat.py +++ b/tests/test_distribmat/test_distribmat.py @@ -29,7 +29,6 @@ class DistribmatTestHarness(PyAPITestHarness): light_fuel.add_nuclide('U235', 1.0) mats_file = openmc.Materials([moderator, dense_fuel, light_fuel]) - mats_file.default_temperature = '294K' mats_file.export_to_xml() diff --git a/tests/test_iso_in_lab/inputs_true.dat b/tests/test_iso_in_lab/inputs_true.dat index 0298e581c6..310bccb139 100644 --- a/tests/test_iso_in_lab/inputs_true.dat +++ b/tests/test_iso_in_lab/inputs_true.dat @@ -1 +1 @@ -a84e601e6ba0891aaeaa37b1aa55076fecee598bb46be2b99dcdedab597b5d7e1731e2a0dc265df2ad6f475e33dae91a3cc27bc23d0c37be25a097ea83e74fd6 \ No newline at end of file +4b3d0270a479e65579b305d1c2339b76971790bc7371c685efa6e2d341980fec301cf0859c34796ae04ae98aa01ab8b4905a8d8a3a916895c36d82ca6b58fb39 \ No newline at end of file diff --git a/tests/test_mg_basic/inputs_true.dat b/tests/test_mg_basic/inputs_true.dat index bfb0cc09e9..fad74ca827 100644 --- a/tests/test_mg_basic/inputs_true.dat +++ b/tests/test_mg_basic/inputs_true.dat @@ -1 +1 @@ -d90692c6bf8db3672d70103ded682326d7f14d416e79e18ec055bdeafe1dbc1dbe642e8410cad95bf247f27c907b10b1567127bd2868d466ce2586aacff0411f \ No newline at end of file +e843dbee8b989142d68e78f7a3e83309a9982c0127974ba4b6a58c823ce298e8fffc8828b48aa696f045818a2a80ef4003f5a191f33aacef7d7dd72c950855a6 \ No newline at end of file diff --git a/tests/test_mg_tallies/inputs_true.dat b/tests/test_mg_tallies/inputs_true.dat index c74d7759f7..e1f3385a43 100644 --- a/tests/test_mg_tallies/inputs_true.dat +++ b/tests/test_mg_tallies/inputs_true.dat @@ -1 +1 @@ -707285b77a091904a69720e78bf87a6779f2223c0fa2a3725353d00ca30f2624c7d53af016d78c7ad30b70a24bb53eda7dea2f592499b098f541591825b67143 \ No newline at end of file +b607875dcaecb7110e396a62100182818b8b2853ec9921194b7ab00d6156373b01394ad8bd729babf7d258e6d9c599f6944c6857cd9d2f65ea98e245ee3cf010 \ 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 e48c50d0a0..7b30f91223 100644 --- a/tests/test_mgxs_library_ce_to_mg/inputs_true.dat +++ b/tests/test_mgxs_library_ce_to_mg/inputs_true.dat @@ -1 +1 @@ -a33f770307b365103c5d71aa3e70deebd78d3a2fa90e88632641c1a40d64d19de0ce3c95c858aedf3beccc5de64cac434e1cd55b2b162ed315c78450c53a24a4 \ No newline at end of file +5c35e26926a43abf3ddcf782b09d96ce82d447a7db9ee9994c0aa811e431f8c06c11ce022c2a6ccf8d5f79f1cdedee2e8c20ca6d1e7cc5129ebcfae9568b2f87 \ No newline at end of file diff --git a/tests/test_mgxs_library_condense/inputs_true.dat b/tests/test_mgxs_library_condense/inputs_true.dat index c261a0edea..328d68b05f 100644 --- a/tests/test_mgxs_library_condense/inputs_true.dat +++ b/tests/test_mgxs_library_condense/inputs_true.dat @@ -1 +1 @@ -df2e5370925785e061e094561e9d2048c3104aaecf533ee9590a187d4597e53b489fb6e8cc54ed878f7d313bcf00586edceae4ff712c837faaa5ddab0ad378b3 \ No newline at end of file +2b2a2f5778b03f87d20fa6da96cc19db0489f69d4d5f0cac02dd407fd8e53a082081bfef35c4310cb2e0651254766d499e89279e711fd6fd93f913c964855839 \ No newline at end of file diff --git a/tests/test_mgxs_library_distribcell/inputs_true.dat b/tests/test_mgxs_library_distribcell/inputs_true.dat index 2ca1810e97..67509bd510 100644 --- a/tests/test_mgxs_library_distribcell/inputs_true.dat +++ b/tests/test_mgxs_library_distribcell/inputs_true.dat @@ -1 +1 @@ -687358da3e7d658b6187e1d76280437d5b1a97a7ca3920483792e74de6fa9556fa86f4d55150c03d8628b3aa424afa187d8745f087f252ad0fca44ccc2a85f4c \ No newline at end of file +ad427594bd8a68ad35382bc34b5932e7c78480b6e327caf63782d563fd6e6e5fb4e7b0dfd9094394a5db092f789c473dbb08cb6b3d0c0296edcfc247dbe95d6f \ No newline at end of file diff --git a/tests/test_mgxs_library_hdf5/inputs_true.dat b/tests/test_mgxs_library_hdf5/inputs_true.dat index c261a0edea..328d68b05f 100644 --- a/tests/test_mgxs_library_hdf5/inputs_true.dat +++ b/tests/test_mgxs_library_hdf5/inputs_true.dat @@ -1 +1 @@ -df2e5370925785e061e094561e9d2048c3104aaecf533ee9590a187d4597e53b489fb6e8cc54ed878f7d313bcf00586edceae4ff712c837faaa5ddab0ad378b3 \ No newline at end of file +2b2a2f5778b03f87d20fa6da96cc19db0489f69d4d5f0cac02dd407fd8e53a082081bfef35c4310cb2e0651254766d499e89279e711fd6fd93f913c964855839 \ No newline at end of file diff --git a/tests/test_mgxs_library_mesh/inputs_true.dat b/tests/test_mgxs_library_mesh/inputs_true.dat index 4cebb274ec..9e2bc06f18 100644 --- a/tests/test_mgxs_library_mesh/inputs_true.dat +++ b/tests/test_mgxs_library_mesh/inputs_true.dat @@ -1 +1 @@ -7f3aec9cedab76262de3706427ccba88b4c81fd4c9a033ff5467671ca21abe13b3981100d688502818bdd0534db22438970b02d652ca9d105557276de2d2a550 \ No newline at end of file +68c7695d7ae0367c59155eab05d3fe859cae895170f2cd32d4463af340a9a2035be16221b1eda8e2a1132bfe1b8163ca8d964fb1b23274c232fb10fd88274aea \ No newline at end of file diff --git a/tests/test_mgxs_library_no_nuclides/inputs_true.dat b/tests/test_mgxs_library_no_nuclides/inputs_true.dat index c261a0edea..328d68b05f 100644 --- a/tests/test_mgxs_library_no_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_no_nuclides/inputs_true.dat @@ -1 +1 @@ -df2e5370925785e061e094561e9d2048c3104aaecf533ee9590a187d4597e53b489fb6e8cc54ed878f7d313bcf00586edceae4ff712c837faaa5ddab0ad378b3 \ No newline at end of file +2b2a2f5778b03f87d20fa6da96cc19db0489f69d4d5f0cac02dd407fd8e53a082081bfef35c4310cb2e0651254766d499e89279e711fd6fd93f913c964855839 \ No newline at end of file diff --git a/tests/test_mgxs_library_nuclides/inputs_true.dat b/tests/test_mgxs_library_nuclides/inputs_true.dat index f3c25d4d50..593111f329 100644 --- a/tests/test_mgxs_library_nuclides/inputs_true.dat +++ b/tests/test_mgxs_library_nuclides/inputs_true.dat @@ -1 +1 @@ -332fd9ff1ca576410ffc6c0f3f03c00618fc863509dc3725f2f3a82134e2400de9c1edf2adc68cb8bce528789094f8eb468371e65cbc13efe76d76467ef291d9 \ No newline at end of file +63f6f8ae24e0d8e23731c903a59e3f5e0edff730933ef6f8836ebf78949db75542c5794a6486c27016ad22e4375b8a18092cd1d1e025162afd01936cac2f205b \ No newline at end of file diff --git a/tests/test_periodic/inputs_true.dat b/tests/test_periodic/inputs_true.dat index 0b49ac2aea..ed1bc7d1b4 100644 --- a/tests/test_periodic/inputs_true.dat +++ b/tests/test_periodic/inputs_true.dat @@ -1 +1 @@ -f427510feb8a63ee2246613e65c9e9a488b6b7df11ce5f5ab0c61b23f299e150a27068ee110f77c64b5bb82882b6d0a428e06de681df2bd83facb9ebc46fb54c \ No newline at end of file +259ea7c22920ddea0bc076ee77d35e76f36d2c7043cb8d036b182a11fd7d0f6524e3cbd9c6b0bf4a1af905ebe10b765d3d43e43e899d3edbb601baf6fd172365 \ No newline at end of file diff --git a/tests/test_tallies/inputs_true.dat b/tests/test_tallies/inputs_true.dat index 196925c387..5f4bebb0d2 100644 --- a/tests/test_tallies/inputs_true.dat +++ b/tests/test_tallies/inputs_true.dat @@ -1 +1 @@ -11adb9111f20950e28b1c1929ee4ca0c9a6b2524de89bef44a495b2fe8cda3a2acac9e87d64ddb5eba591c8d22289956cb1f024d31e05da3c9a4162b8c589d85 \ No newline at end of file +96d2f92c6017e62d688e3ca245c2ff7904a92816d188d096829440cd8fcfd4f8639dc67c12d54b324081c19e1c7dd2e79c1caeac53d7826399f11766826d5410 \ 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 fa61e20b78..6d2990754d 100644 --- a/tests/test_tally_aggregation/inputs_true.dat +++ b/tests/test_tally_aggregation/inputs_true.dat @@ -1 +1 @@ -bc17ba12ee5de7e6b0226e589be9044af725ff4e27683b765a9c75e5629176b5ca51d1e0306028ae90185d64644babf9ac22e4753f092b4b836790f4e162f9d0 \ No newline at end of file +4a4e481b9af3612c71bdc93245011555807061bbd9d9be4c5b399f2c38820d38d9ce3ac6255d045415a216737eac65fb0f0b6e331e49b90bf8edc814d0f2f0e8 \ 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 56798828c6..b0da0ed247 100644 --- a/tests/test_tally_arithmetic/inputs_true.dat +++ b/tests/test_tally_arithmetic/inputs_true.dat @@ -1 +1 @@ -6b59ea3a0dc0d25c590f724b8c051a54e8d7836467ba31b7da72b0574398e6c73160a180524952ea983b0e7a7de776d2d7102d280d5a4e7e3624bd76f6f42a09 \ No newline at end of file +6747131dad4c1efd8c87d857ce9127cb16ec883fdf5fabe309d82732d47851424273e9ad4878a335555d8b25bb0c0a15e68ac30e355ae346e9885c499e9ec979 \ No newline at end of file diff --git a/tests/test_tally_slice_merge/inputs_true.dat b/tests/test_tally_slice_merge/inputs_true.dat index a40c0a01df..7a747e6b52 100644 --- a/tests/test_tally_slice_merge/inputs_true.dat +++ b/tests/test_tally_slice_merge/inputs_true.dat @@ -1 +1 @@ -6d9ebab08ccce003e6128c6346ffd80e69a957fab15e9a0e211771efa68b24f276e62781f8471c72072f9017380d7e821c38002c03689993efed45db9590c039 \ No newline at end of file +144dd4059444fad5e2e4fa20681fbdc74c0e5cbf3265104a0b49d87c768798eaeb25e3c6c795bcac2eebdde784c51588006d62c9f25be96dda5c51011a76b7c1 \ No newline at end of file diff --git a/tests/test_triso/inputs_true.dat b/tests/test_triso/inputs_true.dat index 4f58f14fbb..561877ad93 100644 --- a/tests/test_triso/inputs_true.dat +++ b/tests/test_triso/inputs_true.dat @@ -1 +1 @@ -033b09236ffceab5f0f7860d4926e0a66f328c6dd6fa48b28d6237278d42f9e06a28f2368f273773e417b8177705bc9a5e3ef67335734e5f17ff9843b72a2357 \ No newline at end of file +b22973093e2b0690b30fb1262a11e27004555b796c446d256cb58a1d7329888ab60c1b93729b3d74bb015b98aa434416daa2dc2aee526eb8df0e9052911f94b4 \ No newline at end of file diff --git a/tests/test_triso/test_triso.py b/tests/test_triso/test_triso.py index 386be00b36..685034491f 100644 --- a/tests/test_triso/test_triso.py +++ b/tests/test_triso/test_triso.py @@ -93,7 +93,6 @@ class TRISOTestHarness(PyAPITestHarness): settings.export_to_xml() mats = openmc.Materials([fuel, porous_carbon, ipyc, sic, opyc, graphite]) - mats.default_temperature = '294K' mats.export_to_xml() diff --git a/tests/test_volume_calc/inputs_true.dat b/tests/test_volume_calc/inputs_true.dat index 3a2d9c4747..ddfd497de4 100644 --- a/tests/test_volume_calc/inputs_true.dat +++ b/tests/test_volume_calc/inputs_true.dat @@ -1 +1 @@ -8dc4641e35f7770b8297eab9f71080c62a1c9607f36f7671cc61d47e0714887dea2f4c2ee515b23f39c38b1ea256c695d7c4d0ad95f5d7497a52d15f2ead33a5 \ No newline at end of file +382404d3061d2c847c87654ab12594ba3fbb7e3a82327da872b5fe2029018ef4d5d3376fceba5c2229ea6f85e1fb63650caf54baed3f3b0304137fde61a98d63 \ No newline at end of file diff --git a/tests/test_volume_calc/test_volume_calc.py b/tests/test_volume_calc/test_volume_calc.py index 656f4654a0..fa267efb6a 100644 --- a/tests/test_volume_calc/test_volume_calc.py +++ b/tests/test_volume_calc/test_volume_calc.py @@ -24,7 +24,6 @@ class VolumeTest(PyAPITestHarness): fuel.set_density('g/cc', 4.5) materials = openmc.Materials((water, fuel)) - materials.default_temperature = '294K' materials.export_to_xml() cyl = openmc.ZCylinder(1, R=1.0, boundary_type='vacuum') From d96f6282fb7b20227f1ee044114d759d8f158cb8 Mon Sep 17 00:00:00 2001 From: Adam Nelson Date: Wed, 7 Sep 2016 18:41:27 -0400 Subject: [PATCH 168/168] Fixing final @smharper comments --- docs/source/usersguide/input.rst | 10 ++++------ openmc/settings.py | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index e9126f16b3..dae3e74b25 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -728,12 +728,10 @@ a material default temperature. The ```` element has an accepted value of "nearest" or "interpolation". A value of "nearest" indicates that for each cell, the nearest temperature at which cross sections are given is to be applied, within a given -tolerance (see :ref:`temperature_tolerance`). A value of "interpolation" -indicates that cross sections are to be interpolated between temperatures at -which nuclear data are present. A value of "multipole" indicates that the -windowed multipole method should be used to evaluate temperature-dependent cross -sections in the resolved resonance range (a :ref:`windowed multipole library -` must also be available). +tolerance (see :ref:`temperature_tolerance`). A value of "multipole" indicates +that the windowed multipole method should be used to evaluate +temperature-dependent cross sections in the resolved resonance range (a +:ref:`windowed multipole library ` must also be available). *Default*: "nearest" diff --git a/openmc/settings.py b/openmc/settings.py index 86aac94712..c7d6debb9e 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -106,7 +106,7 @@ class Settings(object): temperatures at which nuclear data doesn't exist. Accepted keys are 'default', 'method', and 'tolerance'. 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 + 'method' should be 'nearest' or 'multipole'. If the method is 'nearest', 'tolerance' indicates a range of temperature within which cross sections may be used. trigger_active : bool