diff --git a/docs/source/pythonapi/examples/mgxs-part-iv.ipynb b/docs/source/pythonapi/examples/mgxs-part-iv.ipynb index 74bbfb7d35..eb100c60d6 100644 --- a/docs/source/pythonapi/examples/mgxs-part-iv.ipynb +++ b/docs/source/pythonapi/examples/mgxs-part-iv.ipynb @@ -429,7 +429,7 @@ "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "" ] @@ -575,7 +575,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/nelsonag/git/openmc/openmc/mgxs/library.py:373: RuntimeWarning: The P0 correction will be ignored since the scattering order 0 is greater than zero\n", + "/Users/sam/.local/lib/python2.7/site-packages/openmc-0.8.0-py2.7-macosx-10.10-x86_64.egg/openmc/mgxs/library.py:370: RuntimeWarning: The P0 correction will be ignored since the scattering order 0 is greater than zero\n", " warn(msg, RuntimeWarning)\n" ] } @@ -731,9 +731,9 @@ " 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 | 9d769378838a8404a7e878a65a6bf7f9fb8e083d\n", - " Date/Time | 2016-10-04 19:54:41\n", - " OpenMP Threads | 8\n", + " Git SHA1 | 6b1ff6128464ff7f0d9fad31bc4bbbf58cdf566c\n", + " Date/Time | 2016-10-25 20:51:15\n", + " MPI Processes | 1\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -741,14 +741,14 @@ "\n", " Reading settings XML file...\n", " Reading geometry XML file...\n", - " Reading cross sections XML file...\n", " Reading materials XML file...\n", - " Reading U235 from /opt/xsdata/nndc/U235.h5\n", - " Reading U238 from /opt/xsdata/nndc/U238.h5\n", - " Reading O16 from /opt/xsdata/nndc/O16.h5\n", - " Reading Zr90 from /opt/xsdata/nndc/Zr90.h5\n", - " Reading H1 from /opt/xsdata/nndc/H1.h5\n", - " Reading B10 from /opt/xsdata/nndc/B10.h5\n", + " Reading cross sections XML file...\n", + " Reading U235 from /Users/sam/git/openmc-sam/data/nndc_hdf5/U235.h5\n", + " Reading U238 from /Users/sam/git/openmc-sam/data/nndc_hdf5/U238.h5\n", + " Reading O16 from /Users/sam/git/openmc-sam/data/nndc_hdf5/O16.h5\n", + " Reading Zr90 from /Users/sam/git/openmc-sam/data/nndc_hdf5/Zr90.h5\n", + " Reading H1 from /Users/sam/git/openmc-sam/data/nndc_hdf5/H1.h5\n", + " Reading B10 from /Users/sam/git/openmc-sam/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", @@ -819,20 +819,20 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 2.5432E-01 seconds\n", - " Reading cross sections = 1.4823E-01 seconds\n", - " Total time in simulation = 7.6226E+00 seconds\n", - " Time in transport only = 7.5567E+00 seconds\n", - " Time in inactive batches = 8.4858E-01 seconds\n", - " Time in active batches = 6.7740E+00 seconds\n", - " Time synchronizing fission bank = 4.9022E-03 seconds\n", - " Sampling source sites = 3.4092E-03 seconds\n", - " SEND/RECV source sites = 1.4584E-03 seconds\n", - " Time accumulating tallies = 1.0030E-04 seconds\n", - " Total time for finalization = 3.2380E-06 seconds\n", - " Total time elapsed = 7.8942E+00 seconds\n", - " Calculation Rate (inactive) = 58922.0 neutrons/second\n", - " Calculation Rate (active) = 29524.6 neutrons/second\n", + " Total time for initialization = 6.7087E-01 seconds\n", + " Reading cross sections = 4.9140E-01 seconds\n", + " Total time in simulation = 8.2685E+01 seconds\n", + " Time in transport only = 8.2657E+01 seconds\n", + " Time in inactive batches = 1.0173E+01 seconds\n", + " Time in active batches = 7.2513E+01 seconds\n", + " Time synchronizing fission bank = 1.0907E-02 seconds\n", + " Sampling source sites = 6.1890E-03 seconds\n", + " SEND/RECV source sites = 2.7820E-03 seconds\n", + " Time accumulating tallies = 9.7300E-04 seconds\n", + " Total time for finalization = 1.4000E-05 seconds\n", + " Total time elapsed = 8.3405E+01 seconds\n", + " Calculation Rate (inactive) = 4915.21 neutrons/second\n", + " Calculation Rate (active) = 2758.14 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", @@ -970,20 +970,7 @@ "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/home/nelsonag/git/openmc/openmc/tallies.py:1945: RuntimeWarning: invalid value encountered in true_divide\n", - " self_rel_err = data['self']['std. dev.'] / data['self']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1946: RuntimeWarning: invalid value encountered in true_divide\n", - " other_rel_err = data['other']['std. dev.'] / data['other']['mean']\n", - "/home/nelsonag/git/openmc/openmc/tallies.py:1947: 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", @@ -1033,8 +1020,11 @@ "# Finally, instantiate our Materials object\n", "materials_file = openmc.Materials((fuel, zircaloy, water))\n", "\n", + "# Set the location of the cross sections file\n", + "materials_file.cross_sections = './mgxs.h5'\n", + "\n", "# Export to \"materials.xml\"\n", - "materials_file.export_to_xml()\n" + "materials_file.export_to_xml()" ] }, { @@ -1060,8 +1050,7 @@ }, "outputs": [], "source": [ - "# Set the location of the cross sections file\n", - "settings_file.cross_sections = './mgxs.h5'\n", + "# Set the energy mode\n", "settings_file.energy_mode = 'multi-group'\n", "\n", "# Export to \"settings.xml\"\n", @@ -1118,9 +1107,9 @@ " 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 | 9d769378838a8404a7e878a65a6bf7f9fb8e083d\n", - " Date/Time | 2016-10-04 19:54:49\n", - " OpenMP Threads | 8\n", + " Git SHA1 | 6b1ff6128464ff7f0d9fad31bc4bbbf58cdf566c\n", + " Date/Time | 2016-10-25 20:52:38\n", + " MPI Processes | 1\n", "\n", " ===========================================================================\n", " ========================> INITIALIZATION <=========================\n", @@ -1128,8 +1117,8 @@ "\n", " Reading settings XML file...\n", " Reading geometry XML file...\n", - " Reading cross sections HDF5 file...\n", " Reading materials XML file...\n", + " Reading cross sections HDF5 file...\n", " Reading tallies XML file...\n", " Loading Cross Section Data...\n", " Loading fuel Data...\n", @@ -1152,48 +1141,48 @@ " 6/1 1.04127 \n", " 7/1 1.01783 \n", " 8/1 1.03856 \n", - " 9/1 1.03637 \n", - " 10/1 1.03884 \n", - " 11/1 1.04466 \n", - " 12/1 1.01060 1.02763 +/- 0.01703\n", - " 13/1 1.02517 1.02681 +/- 0.00987\n", - " 14/1 1.05287 1.03333 +/- 0.00954\n", - " 15/1 1.04369 1.03540 +/- 0.00768\n", - " 16/1 1.01304 1.03167 +/- 0.00729\n", - " 17/1 1.04258 1.03323 +/- 0.00636\n", - " 18/1 1.02301 1.03195 +/- 0.00565\n", - " 19/1 1.03906 1.03274 +/- 0.00505\n", - " 20/1 1.04148 1.03362 +/- 0.00460\n", - " 21/1 1.01271 1.03172 +/- 0.00457\n", - " 22/1 1.02021 1.03076 +/- 0.00428\n", - " 23/1 0.99553 1.02805 +/- 0.00478\n", - " 24/1 1.02434 1.02778 +/- 0.00443\n", - " 25/1 1.02987 1.02792 +/- 0.00413\n", - " 26/1 1.01676 1.02722 +/- 0.00393\n", - " 27/1 1.02738 1.02723 +/- 0.00369\n", - " 28/1 1.04014 1.02795 +/- 0.00355\n", - " 29/1 1.02831 1.02797 +/- 0.00336\n", - " 30/1 1.02643 1.02789 +/- 0.00319\n", - " 31/1 1.03939 1.02844 +/- 0.00308\n", - " 32/1 1.03282 1.02864 +/- 0.00294\n", - " 33/1 1.00098 1.02744 +/- 0.00306\n", - " 34/1 1.01763 1.02703 +/- 0.00296\n", - " 35/1 1.01412 1.02651 +/- 0.00288\n", - " 36/1 1.01564 1.02609 +/- 0.00280\n", - " 37/1 1.02379 1.02601 +/- 0.00270\n", - " 38/1 1.03648 1.02638 +/- 0.00263\n", - " 39/1 1.03237 1.02659 +/- 0.00254\n", - " 40/1 1.03501 1.02687 +/- 0.00247\n", - " 41/1 1.02054 1.02666 +/- 0.00240\n", - " 42/1 1.05751 1.02763 +/- 0.00252\n", - " 43/1 1.00751 1.02702 +/- 0.00251\n", - " 44/1 1.04743 1.02762 +/- 0.00251\n", - " 45/1 1.05212 1.02832 +/- 0.00254\n", - " 46/1 1.01839 1.02804 +/- 0.00248\n", - " 47/1 1.00424 1.02740 +/- 0.00250\n", - " 48/1 1.03117 1.02750 +/- 0.00243\n", - " 49/1 1.00988 1.02705 +/- 0.00241\n", - " 50/1 1.01943 1.02686 +/- 0.00236\n", + " 9/1 1.03626 \n", + " 10/1 1.03858 \n", + " 11/1 1.03725 \n", + " 12/1 1.01497 1.02611 +/- 0.01114\n", + " 13/1 1.03853 1.03025 +/- 0.00765\n", + " 14/1 1.02754 1.02957 +/- 0.00545\n", + " 15/1 1.03576 1.03081 +/- 0.00440\n", + " 16/1 1.02338 1.02957 +/- 0.00380\n", + " 17/1 1.03089 1.02976 +/- 0.00322\n", + " 18/1 1.05856 1.03336 +/- 0.00455\n", + " 19/1 1.00958 1.03072 +/- 0.00481\n", + " 20/1 1.01074 1.02872 +/- 0.00474\n", + " 21/1 1.00291 1.02637 +/- 0.00489\n", + " 22/1 1.00197 1.02434 +/- 0.00490\n", + " 23/1 1.01859 1.02390 +/- 0.00453\n", + " 24/1 1.03854 1.02494 +/- 0.00432\n", + " 25/1 1.01060 1.02399 +/- 0.00414\n", + " 26/1 1.04206 1.02512 +/- 0.00403\n", + " 27/1 1.01329 1.02442 +/- 0.00385\n", + " 28/1 1.04189 1.02539 +/- 0.00376\n", + " 29/1 1.04326 1.02633 +/- 0.00368\n", + " 30/1 1.01600 1.02582 +/- 0.00353\n", + " 31/1 0.99692 1.02444 +/- 0.00363\n", + " 32/1 0.97135 1.02203 +/- 0.00422\n", + " 33/1 1.04856 1.02318 +/- 0.00419\n", + " 34/1 1.01941 1.02302 +/- 0.00402\n", + " 35/1 1.00792 1.02242 +/- 0.00390\n", + " 36/1 1.05356 1.02362 +/- 0.00393\n", + " 37/1 1.04524 1.02442 +/- 0.00387\n", + " 38/1 1.02502 1.02444 +/- 0.00373\n", + " 39/1 1.01854 1.02424 +/- 0.00360\n", + " 40/1 1.02803 1.02436 +/- 0.00348\n", + " 41/1 0.99161 1.02331 +/- 0.00353\n", + " 42/1 1.06681 1.02466 +/- 0.00368\n", + " 43/1 1.03784 1.02506 +/- 0.00359\n", + " 44/1 1.01966 1.02491 +/- 0.00348\n", + " 45/1 1.02400 1.02488 +/- 0.00338\n", + " 46/1 0.99642 1.02409 +/- 0.00338\n", + " 47/1 1.05020 1.02479 +/- 0.00336\n", + " 48/1 1.02607 1.02483 +/- 0.00327\n", + " 49/1 1.00497 1.02432 +/- 0.00323\n", + " 50/1 1.03585 1.02461 +/- 0.00316\n", " Creating state point statepoint.50.h5...\n", "\n", " ===========================================================================\n", @@ -1203,27 +1192,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 9.9611E-02 seconds\n", - " Reading cross sections = 2.2051E-02 seconds\n", - " Total time in simulation = 6.3645E+00 seconds\n", - " Time in transport only = 6.3383E+00 seconds\n", - " Time in inactive batches = 6.3592E-01 seconds\n", - " Time in active batches = 5.7285E+00 seconds\n", - " Time synchronizing fission bank = 5.1108E-03 seconds\n", - " Sampling source sites = 3.7109E-03 seconds\n", - " SEND/RECV source sites = 1.3393E-03 seconds\n", - " Time accumulating tallies = 8.0199E-05 seconds\n", - " Total time for finalization = 2.9170E-06 seconds\n", - " Total time elapsed = 6.4828E+00 seconds\n", - " Calculation Rate (inactive) = 78625.7 neutrons/second\n", - " Calculation Rate (active) = 34912.9 neutrons/second\n", + " Total time for initialization = 4.1107E-02 seconds\n", + " Reading cross sections = 5.7660E-03 seconds\n", + " Total time in simulation = 6.6928E+01 seconds\n", + " Time in transport only = 6.6906E+01 seconds\n", + " Time in inactive batches = 6.9962E+00 seconds\n", + " Time in active batches = 5.9932E+01 seconds\n", + " Time synchronizing fission bank = 9.4430E-03 seconds\n", + " Sampling source sites = 6.5990E-03 seconds\n", + " SEND/RECV source sites = 2.2240E-03 seconds\n", + " Time accumulating tallies = 9.4200E-04 seconds\n", + " Total time for finalization = 1.4000E-05 seconds\n", + " Total time elapsed = 6.7022E+01 seconds\n", + " Calculation Rate (inactive) = 7146.75 neutrons/second\n", + " Calculation Rate (active) = 3337.11 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.02515 +/- 0.00252\n", - " k-effective (Track-length) = 1.02686 +/- 0.00236\n", - " k-effective (Absorption) = 1.02678 +/- 0.00178\n", - " Combined k-effective = 1.02710 +/- 0.00176\n", + " k-effective (Collision) = 1.02644 +/- 0.00247\n", + " k-effective (Track-length) = 1.02461 +/- 0.00316\n", + " k-effective (Absorption) = 1.02785 +/- 0.00173\n", + " Combined k-effective = 1.02718 +/- 0.00166\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -1305,8 +1294,8 @@ "output_type": "stream", "text": [ "Continuous-Energy keff = 1.024295\n", - "Multi-Group keff = 1.027098\n", - "bias [pcm]: -280.3\n" + "Multi-Group keff = 1.027176\n", + "bias [pcm]: -288.2\n" ] } ], @@ -1403,7 +1392,7 @@ { "data": { "text/plain": [ - "" + "" ] }, "execution_count": 40, @@ -1412,9 +1401,9 @@ }, { "data": { - "image/png": "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\nrkJggg==\n", + "image/png": "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\nrkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -1459,21 +1448,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/usersguide/input.rst b/docs/source/usersguide/input.rst index 0182230d3a..8ac584fe0a 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -105,19 +105,6 @@ standard deviation. *Default*: false -.. _cross_sections: - -```` Element ----------------------------- - -The ```` element has no attributes and simply indicates the path -to an XML cross section listing file (usually named cross_sections.xml). If this -element is absent from the settings.xml file, the -:envvar:`OPENMC_CROSS_SECTIONS` environment variable will be used to find the -path to the XML cross section listing when in continuous-energy mode, and the -:envvar:`OPENMC_MG_CROSS_SECTIONS` environment variable will be used in -multi-group mode. - ```` Element -------------------- @@ -289,20 +276,6 @@ 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 -------------------------------- - -The ```` element indicates the directory containing a -windowed multipole library. If a windowed multipole library is available, -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. - ```` Element --------------------------- @@ -316,29 +289,6 @@ then, OpenMC will only use up to the :math:`P_1` data. .. note:: This element is not used in the continuous-energy :ref:`energy_mode`. -.. _natural_elements: - -```` Element ------------------------------- - -The ```` element indicates to OpenMC what nuclides are -available in the cross section library when expanding an ```` into -separate isotopes (see :ref:`material`). The accepted values are: - - - ENDF/B-VII.0 - - ENDF/B-VII.1 - - JEFF-3.1.1 - - JEFF-3.1.2 - - JEFF-3.2 - - JENDL-3.2 - - JENDL-3.3 - - JENDL-4.0 - -Note that the value is case-insensitive, so "ENDF/B-VII.1" is equivalent to -"endf/b-vii.1". - - *Default*: ENDF/B-VII.1 - ```` Element ----------------------- @@ -1368,6 +1318,33 @@ Here is an example of a properly defined 2d hexagonal lattice: Materials Specification -- materials.xml ---------------------------------------- +.. _cross_sections: + +```` Element +---------------------------- + +The ```` element has no attributes and simply indicates the path +to an XML cross section listing file (usually named cross_sections.xml). If this +element is absent from the settings.xml file, the +:envvar:`OPENMC_CROSS_SECTIONS` environment variable will be used to find the +path to the XML cross section listing when in continuous-energy mode, and the +:envvar:`OPENMC_MG_CROSS_SECTIONS` environment variable will be used in +multi-group mode. + +.. _multipole_library: + +```` Element +------------------------------- + +The ```` element indicates the directory containing a +windowed multipole library. If a windowed multipole library is available, +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. + .. _material: ```` Element @@ -1440,43 +1417,6 @@ Each ``material`` element can have the following attributes or sub-elements: .. note:: The ``scattering`` attribute/sub-element is not used in the multi-group :ref:`energy_mode`. - :element: - - 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``, 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 - - - - - - - In some cross section libraries, certain naturally occurring isotopes do not - have cross sections. The :ref:`natural_elements` option determines how a - natural element is split into isotopes in these cases. - - *Default*: None - - An optional attribute/sub-element for each element is ``scattering``. This - attribute may be set to "data" to use the scattering laws specified by the - cross section library (default). Alternatively, when set to "iso-in-lab", - the scattering laws are used to sample the outgoing energy but an - isotropic-in-lab distribution is used to sample the outgoing angle at each - scattering interaction. The ``scattering`` attribute may be most useful - when using OpenMC to compute multi-group cross-sections for deterministic - transport codes and to quantify the effects of anisotropic scattering. - - *Default*: None - - .. note:: The ``scattering`` attribute/sub-element is not used in the - multi-group :ref:`energy_mode`. - :sab: Associates an S(a,b) table with the material. This element has one attribute/sub-element called ``name``. The ``name`` attribute @@ -1503,9 +1443,6 @@ Each ``material`` element can have the following attributes or sub-elements: *Default*: None -.. _IUPAC Isotopic Compositions of the Elements 2009: - http://pac.iupac.org/publications/pac/pdf/2011/pdf/8302x0397.pdf - ------------------------------------ Tallies Specification -- tallies.xml ------------------------------------ diff --git a/examples/python/pincell/build-xml.py b/examples/python/pincell/build-xml.py index 8ce4eab629..534c3ab821 100644 --- a/examples/python/pincell/build-xml.py +++ b/examples/python/pincell/build-xml.py @@ -45,18 +45,14 @@ sn119 = openmc.Nuclide('Sn119') sn120 = openmc.Nuclide('Sn120') sn122 = openmc.Nuclide('Sn122') sn124 = openmc.Nuclide('Sn124') -u234 = openmc.Nuclide('U234') -u235 = openmc.Nuclide('U235') -u238 = openmc.Nuclide('U238') +u = openmc.Element('U') +o = openmc.Element('O') # Instantiate some Materials and register the appropriate Nuclides uo2 = openmc.Material(material_id=1, name='UO2 fuel at 2.4% wt enrichment') uo2.set_density('g/cm3', 10.29769) -uo2.add_nuclide(u234, 4.4843e-6) -uo2.add_nuclide(u235, 5.5815e-4) -uo2.add_nuclide(u238, 2.2408e-2) -uo2.add_nuclide(o16, 4.5829e-2) -uo2.add_nuclide(o17, 1.1164e-4) +uo2.add_element(u, 1., enrichment=0.024) +uo2.add_element(o, 2.) helium = openmc.Material(material_id=2, name='Helium for gap') helium.set_density('g/cm3', 0.001598) diff --git a/examples/python/pincell_multigroup/build-xml.py b/examples/python/pincell_multigroup/build-xml.py index 216c565397..1dcfc896bf 100644 --- a/examples/python/pincell_multigroup/build-xml.py +++ b/examples/python/pincell_multigroup/build-xml.py @@ -83,6 +83,7 @@ water.add_macroscopic(h2o_data) # Instantiate a Materials collection and export to XML materials_file = openmc.Materials([uo2, water]) +materials_file.cross_sections = "./mgxs.h5" materials_file.export_to_xml() @@ -132,7 +133,6 @@ geometry.export_to_xml() # Instantiate a Settings object, set all runtime parameters, and export to XML settings_file = openmc.Settings() settings_file.energy_mode = "multi-group" -settings_file.cross_sections = "./mgxs.h5" settings_file.batches = batches settings_file.inactive = inactive settings_file.particles = particles diff --git a/examples/xml/pincell_multigroup/geometry.xml b/examples/xml/pincell_multigroup/geometry.xml index 7f2fb36e82..84e8b4e0b0 100644 --- a/examples/xml/pincell_multigroup/geometry.xml +++ b/examples/xml/pincell_multigroup/geometry.xml @@ -1,10 +1,11 @@ - + + - - + + - + diff --git a/examples/xml/pincell_multigroup/materials.xml b/examples/xml/pincell_multigroup/materials.xml index 9b9ce21805..61a5cc697a 100644 --- a/examples/xml/pincell_multigroup/materials.xml +++ b/examples/xml/pincell_multigroup/materials.xml @@ -1,11 +1,54 @@ - + - - - - - - - - + + ./mgxs.h5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/xml/pincell_multigroup/settings.xml b/examples/xml/pincell_multigroup/settings.xml index 6b9080b5a5..9adc17c9d0 100644 --- a/examples/xml/pincell_multigroup/settings.xml +++ b/examples/xml/pincell_multigroup/settings.xml @@ -1,15 +1,37 @@ - + - - 1000 - 100 - 10 - - - - -0.63 -0.63 -1 0.63 0.63 1 - - - ./mgxs.h5 - multi-group + + multi-group + + + + 100 + 10 + 1000 + + + + + + + -0.63 -0.63 -1E50 + 0.63 0.63 1E50 + + + + + + true + true + + + false + diff --git a/openmc/element.py b/openmc/element.py index e1484198cf..d56c3b3507 100644 --- a/openmc/element.py +++ b/openmc/element.py @@ -1,17 +1,21 @@ +from collections import OrderedDict import re import sys +import os from six import string_types +from xml.etree import ElementTree as ET import openmc from openmc.checkvalue import check_type, check_length -from openmc.data import NATURAL_ABUNDANCE +from openmc.data import NATURAL_ABUNDANCE, atomic_mass class Element(object): - """A natural element used in a material via . Internally, OpenMC will - expand the natural element into isotopes based on the known natural - abundances. + """A natural element that auto-expands to add the isotopes of an element to + a material in their natural abundance. Internally, the OpenMC Python API + expands the natural element into isotopes only when the materials.xml file + is created. Parameters ---------- @@ -83,16 +87,37 @@ class Element(object): @scattering.setter def scattering(self, scattering): - if not scattering in ['data', 'iso-in-lab']: - msg = 'Unable to set scattering for Element to {0} ' \ - 'which is not "data" or "iso-in-lab"'.format(scattering) + if not scattering in ['data', 'iso-in-lab', None]: + msg = 'Unable to set scattering for Element to {0} which ' \ + 'is not "data", "iso-in-lab", or None'.format(scattering) raise ValueError(msg) self._scattering = scattering - def expand(self): + def expand(self, percent, percent_type, enrichment=None, + cross_sections=None): """Expand natural element into its naturally-occurring isotopes. + An optional cross_sections argument or the OPENMC_CROSS_SECTIONS + environment variable is used to specify a cross_sections.xml file. + If the cross_sections.xml file is found, the element is expanded only + into the isotopes/nuclides present in cross_sections.xml. If no + cross_sections.xml file is found, the element is expanded based on its + naturally occurring isotopes. + + Parameters + ---------- + percent : float + Atom or weight percent + percent_type : {'ao', 'wo'} + 'ao' for atom percent and 'wo' for weight percent + enrichment : float, optional + Enrichment for U235 in weight percent. For example, input 4.95 for + 4.95 weight percent enriched U. Default is None + (natural composition). + cross_sections : str, optional + Location of cross_sections.xml file. Default is None. + Returns ------- isotopes : list @@ -102,9 +127,133 @@ class Element(object): """ + # Get the nuclides present in nature + natural_nuclides = set() + for nuclide in sorted(NATURAL_ABUNDANCE.keys()): + if re.match(r'{}\d+'.format(self.name), nuclide): + natural_nuclides.add(nuclide) + + # Create dict to store the expanded nuclides and abundances + abundances = OrderedDict() + + # If cross_sections is None, get the cross sections from the + # OPENMC_CROSS_SECTIONS environment variable + if cross_sections is None: + cross_sections = os.environ.get('OPENMC_CROSS_SECTIONS') + + # If a cross_sections library is present, check natural nuclides + # against the nuclides in the library + if cross_sections is not None: + + library_nuclides = set() + tree = ET.parse(cross_sections) + root = tree.getroot() + for child in root: + nuclide = child.attrib['materials'] + if re.match(r'{}\d+'.format(self.name), nuclide) and \ + '_m' not in nuclide: + library_nuclides.add(nuclide) + + # Get a set of the mutual and absent nuclides. Convert to lists + # and sort to avoid different ordering between Python 2 and 3. + mutual_nuclides = natural_nuclides.intersection(library_nuclides) + absent_nuclides = natural_nuclides.difference(mutual_nuclides) + mutual_nuclides = sorted(list(mutual_nuclides)) + absent_nuclides = sorted(list(absent_nuclides)) + + # If all natural nuclides are present in the library, expand element + # using all natural nuclides + if len(absent_nuclides) == 0: + for nuclide in mutual_nuclides: + abundances[nuclide] = NATURAL_ABUNDANCE[nuclide] + + # If no natural elements are present in the library, check if the + # 0 nuclide is present. If so, set the abundance to 1 for this + # nuclide. Else, raise an error. + elif len(mutual_nuclides) == 0: + nuclide_0 = self.name + '0' + if nuclide_0 in library_nuclides: + abundances[nuclide_0] = 1.0 + else: + msg = 'Unable to expand element {0} because the cross '\ + 'section library provided does not contain any of '\ + 'the natural isotopes for that element.'\ + .format(self.name) + raise ValueError(msg) + + # If some, but not all, natural nuclides are in the library, add + # the mutual nuclides. For the absent nuclides, add them based on + # our knowledge of the common cross section libraries + # (ENDF, JEFF, and JENDL) + else: + + # Add the mutual isotopes + for nuclide in mutual_nuclides: + abundances[nuclide] = NATURAL_ABUNDANCE[nuclide] + + # Adjust the abundances for the absent nuclides + for nuclide in absent_nuclides: + + if nuclide in ['O17', 'O18'] and 'O16' in mutual_nuclides: + abundances['O16'] += NATURAL_ABUNDANCE[nuclide] + elif nuclide == 'Ta180' and 'Ta181' in mutual_nuclides: + abundances['Ta181'] += NATURAL_ABUNDANCE[nuclide] + elif nuclide == 'W180' and 'W182' in mutual_nuclides: + abundances['W182'] += NATURAL_ABUNDANCE[nuclide] + else: + msg = 'Unsure how to partition natural abundance of ' \ + 'isotope {0} into other natural isotopes of ' \ + 'this element that are present in the cross ' \ + 'section library provided. Consider adding ' \ + 'the isotopes of this element individually.' + raise ValueError(msg) + + # If a cross_section library is not present, expand the element into + # its natural nuclides + else: + for nuclide in natural_nuclides: + abundances[nuclide] = NATURAL_ABUNDNACE[nuclide] + + # Modify mole fractions if enrichment provided + if enrichment is not None: + + # Calculate the mass fractions of isotopes + abundances['U234'] = 0.008 * enrichment + abundances['U235'] = enrichment + abundances['U238'] = 100.0 - 1.008 * enrichment + + # Convert the mass fractions to mole fractions + for nuclide in abundances.keys(): + abundances[nuclide] /= atomic_mass(nuclide) + + # Normalize the mole fractions to one + sum_abundances = sum(abundances.values()) + for nuclide in abundances.keys(): + abundances[nuclide] /= sum_abundances + + # Compute the ratio of the nuclide atomic masses to the element + # atomic mass + if percent_type == 'wo': + + # Compute the element atomic mass + element_am = 0. + for nuclide in abundances.keys(): + element_am += atomic_mass(nuclide) * abundances[nuclide] + + # Convert the molar fractions to mass fractions + for nuclide in abundances.keys(): + abundances[nuclide] *= atomic_mass(nuclide) / element_am + + # Normalize the mass fractions to one + sum_abundances = sum(abundances.values()) + for nuclide in abundances.keys(): + abundances[nuclide] /= sum_abundances + + # Create a list of the isotopes in this element isotopes = [] - for isotope, abundance in sorted(NATURAL_ABUNDANCE.items()): - if re.match(r'{}\d+'.format(self.name), isotope): - nuc = openmc.Nuclide(isotope) - isotopes.append((nuc, abundance)) + for nuclide, abundance in abundances.items(): + nuc = openmc.Nuclide(nuclide) + nuc.scattering = self.scattering + isotopes.append((nuc, percent*abundance, percent_type)) + return isotopes diff --git a/openmc/material.py b/openmc/material.py index 6f9c4ba15f..c265c90694 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -57,9 +57,9 @@ class Material(object): 'atom/b-cm', 'atom/cm3', 'sum', or 'macro'. The 'macro' unit only applies in the case of a multi-group calculation. elements : list of tuple - List in which each item is a 3-tuple consisting of an - :class:`openmc.Element` instance, the percent density, and the percent - type ('ao' or 'wo'). + List in which each item is a 4-tuple consisting of an + :class:`openmc.Element` instance, the percent density, the percent + type ('ao' or 'wo'), and enrichment. nuclides : list of tuple List in which each item is a 3-tuple consisting of an :class:`openmc.Nuclide` instance, the percent density, and the percent @@ -82,7 +82,7 @@ class Material(object): # (only one is allowed, hence this is different than _nuclides, etc) self._macroscopic = None - # A list of tuples (element, percent, percent type) + # A list of tuples (element, percent, percent type, enrichment) self._elements = [] # If specified, a list of table names @@ -148,9 +148,13 @@ class Material(object): string += '{0: <16}\n'.format('\tElements') - for element, percent, percent_type in self._elements: + for element, percent, percent_type, enr in self._elements: string += '{0: <16}'.format('\t{0.name}'.format(element)) - string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type) + if enr is None: + string += '=\t{0: <12} [{1}]\n'.format(percent, percent_type) + else: + string += '=\t{0: <12} [{1}] @ {2} w/o enrichment\n'\ + .format(percent, percent_type, enr) return string @@ -401,7 +405,7 @@ class Material(object): if macroscopic.name == self._macroscopic.name: self._macroscopic = None - def add_element(self, element, percent, percent_type='ao', expand=False): + def add_element(self, element, percent, percent_type='ao', enrichment=None): """Add a natural element to the material Parameters @@ -413,9 +417,10 @@ class Material(object): percent_type : {'ao', 'wo'}, optional 'ao' for atom percent and 'wo' for weight percent. Defaults to atom percent. - expand : bool, optional - Whether to expand the natural element into its naturally-occurring - isotopes. Defaults to False. + enrichment : float, optional + Enrichment for U235 in weight percent. For example, input 4.95 for + 4.95 weight percent enriched U. Default is None + (natural composition). """ @@ -445,14 +450,33 @@ class Material(object): else: element = openmc.Element(element) - if expand: - if percent_type == 'wo': - raise NotImplementedError('Expanding natural element based on ' - 'weight percent is not yet supported.') - for isotope, abundance in element.expand(): - self._nuclides.append((isotope, percent*abundance, percent_type)) - else: - self._elements.append((element, percent, percent_type)) + if enrichment is not None: + if not isinstance(enrichment, Real): + msg = 'Unable to add an Element to Material ID="{0}" with a ' \ + 'non-floating point enrichment value "{1}"'\ + .format(self._id, enrichment) + raise ValueError(msg) + + elif element.name != 'U': + msg = 'Unable to use enrichment for element {0} which is not ' \ + 'uranium for Material ID="{1}"'.format(element.name, + self._id) + raise ValueError(msg) + + # Check that the enrichment is in the valid range + cv.check_less_than('enrichment', enrichment, 100./1.008) + cv.check_greater_than('enrichment', enrichment, 0., equality=True) + + if enrichment > 5.0: + msg = 'A uranium enrichment of {0} was given for Material ID='\ + '"{1}". OpenMC assumes the U234/U235 mass ratio is '\ + 'constant at 0.008, which is only valid at low ' \ + 'enrichments. Consider setting the isotopic ' \ + 'composition manually for enrichments over 5%.'.\ + format(enrichment, self._id) + warnings.warn(msg) + + self._elements.append((element, percent, percent_type, enrichment)) def remove_element(self, element): """Remove a natural element from the material @@ -469,10 +493,10 @@ class Material(object): 'since it is not an Element'.format(self.id, element) raise ValueError(msg) - # If the Material contains the Nuclide, delete it + # If the Material contains the Element, delete it for elm in self._elements: if element == elm: - self._nuclides.remove(elm) + self._elements.remove(elm) def add_s_alpha_beta(self, name): r"""Add an :math:`S(\alpha,\beta)` table to the material @@ -502,7 +526,6 @@ class Material(object): self._sab.append(new_name) - def make_isotropic_in_lab(self): for nuclide, percent, percent_type in self._nuclides: nuclide.scattering = 'iso-in-lab' @@ -521,13 +544,15 @@ class Material(object): nuclides = [] - for nuclide, density, density_type in self._nuclides: + for nuclide, percent, percent_type in self._nuclides: nuclides.append(nuclide.name) - for element, density, density_type in self._elements: + for ele, ele_pct, ele_pct_type, enr in self._elements: + # Expand natural element into isotopes - for isotope, abundance in element.expand(): - nuclides.append(isotope.name) + isotopes = ele.expand(ele_pct, ele_pct_type, enr) + for iso, iso_pct, iso_pct_type in isotopes: + nuclides.append(iso.name) return nuclides @@ -537,8 +562,8 @@ class Material(object): Returns ------- nuclides : dict - Dictionary whose keys are nuclide names and values are 2-tuples of - (nuclide, density) + Dictionary whose keys are nuclide names and values are 3-tuples of + (nuclide, density percent, density percent type) """ @@ -547,10 +572,12 @@ class Material(object): for nuclide, density, density_type in self._nuclides: nuclides[nuclide.name] = (nuclide, density) - for element, density, density_type in self._elements: + for ele, ele_pct, ele_pct_type, enr in self._elements: + # Expand natural element into isotopes - for isotope, abundance in element.expand(): - nuclides[isotope.name] = (isotope, density*abundance) + isotopes = ele.expand(ele_pct, ele_pct_type, enr) + for iso, iso_pct, iso_pct_type in isotopes: + nuclides[iso.name] = (iso, iso_pct, iso_pct_type) return nuclides @@ -575,22 +602,20 @@ class Material(object): return xml_element - def _get_element_xml(self, element, distrib=False): - xml_element = ET.Element("element") - xml_element.set("name", str(element[0].name)) + def _get_element_xml(self, element, cross_sections, distrib=False): - if not distrib: - if element[2] == 'ao': - xml_element.set("ao", str(element[1])) - else: - xml_element.set("wo", str(element[1])) + # Get the nuclides in this element + nuclides = element[0].expand(element[1], element[2], element[3], + cross_sections) - if not element[0].scattering is None: - xml_element.set("scattering", element[0].scattering) + xml_elements = [] + for nuclide in nuclides: + xml_elements.append(self._get_nuclide_xml(nuclide, distrib)) - return xml_element + return xml_elements def _get_nuclides_xml(self, nuclides, distrib=False): + xml_elements = [] for nuclide in nuclides: @@ -598,15 +623,19 @@ class Material(object): return xml_elements - def _get_elements_xml(self, elements, distrib=False): + def _get_elements_xml(self, elements, cross_sections, distrib=False): + xml_elements = [] for element in elements: - xml_elements.append(self._get_element_xml(element, distrib)) + nuclide_elements = self._get_element_xml(element, cross_sections, + distrib) + for nuclide_element in nuclide_elements: + xml_elements.append(nuclide_element) return xml_elements - def get_material_xml(self): + def get_material_xml(self, cross_sections): """Return XML representation of the material Returns @@ -642,7 +671,8 @@ class Material(object): element.append(subelement) # Create element XML subelements - subelements = self._get_elements_xml(self._elements) + subelements = self._get_elements_xml(self._elements, + cross_sections) for subelement in subelements: element.append(subelement) else: @@ -656,12 +686,12 @@ class Material(object): comps = [] allnucs = self._nuclides + self._elements dist_per_type = allnucs[0][2] - for nuc, per, typ in allnucs: - if not typ == dist_per_type: + for nuc in allnucs: + if nuc[2] != dist_per_type: msg = 'All nuclides and elements in a distributed ' \ 'material must have the same type, either ao or wo' raise ValueError(msg) - comps.append(per) + comps.append(nuc[1]) if self._distrib_otf_file is None: # Create values and units subelements @@ -676,12 +706,15 @@ class Material(object): if self._macroscopic is None: # Create nuclide XML subelements - subelements = self._get_nuclides_xml(self._nuclides, distrib=True) + subelements = self._get_nuclides_xml(self._nuclides, + distrib=True) for subelement_nuc in subelements: subelement.append(subelement_nuc) # Create element XML subelements - subelements = self._get_elements_xml(self._elements, distrib=True) + subelements = self._get_elements_xml(self._elements, + cross_sections, + distrib=True) for subsubelement in subelements: subelement.append(subsubelement) else: @@ -716,15 +749,49 @@ class Materials(cv.CheckedList): ---------- materials : Iterable of openmc.Material Materials to add to the collection + cross_sections : str + Indicates the path to an XML cross section listing file (usually named + cross_sections.xml). If it is not set, the + :envvar:`OPENMC_CROSS_SECTIONS` environment variable will be used for + continuous-energy calculations and + :envvar:`OPENMC_MG_CROSS_SECTIONS` will be used for multi-group + calculations to find the path to the XML cross section file. + multipole_library : str + Indicates the path to a directory containing a windowed multipole + cross section library. If it is not set, the + :envvar:`OPENMC_MULTIPOLE_LIBRARY` environment variable will be used. A + multipole library is optional. """ def __init__(self, materials=None): super(Materials, self).__init__(Material, 'materials collection') + self._materials_file = ET.Element("materials") + self._cross_sections = None + self._multipole_library = None + if materials is not None: self += materials + @property + def cross_sections(self): + return self._cross_sections + + @property + def multipole_library(self): + return self._multipole_library + + @cross_sections.setter + def cross_sections(self, cross_sections): + cv.check_type('cross sections', cross_sections, string_types) + self._cross_sections = cross_sections + + @multipole_library.setter + def multipole_library(self, multipole_library): + cv.check_type('cross sections', multipole_library, string_types) + self._multipole_library = multipole_library + def add_material(self, material): """Append material to collection @@ -807,9 +874,19 @@ class Materials(cv.CheckedList): def _create_material_subelements(self): for material in self: - xml_element = material.get_material_xml() + xml_element = material.get_material_xml(self.cross_sections) self._materials_file.append(xml_element) + def _create_cross_sections_subelement(self): + if self._cross_sections is not None: + element = ET.SubElement(self._materials_file, "cross_sections") + element.text = str(self._cross_sections) + + def _create_multipole_library_subelement(self): + if self._multipole_library is not None: + element = ET.SubElement(self._materials_file, "multipole_library") + element.text = str(self._multipole_library) + def export_to_xml(self, path='materials.xml'): """Export material collection to an XML file. @@ -824,6 +901,8 @@ class Materials(cv.CheckedList): self._materials_file.clear() self._create_material_subelements() + self._create_cross_sections_subelement() + self._create_multipole_library_subelement() # Clean the indentation in the file to be user-readable sort_xml_elements(self._materials_file) diff --git a/openmc/nuclide.py b/openmc/nuclide.py index 5b844582c6..55afd4e9c3 100644 --- a/openmc/nuclide.py +++ b/openmc/nuclide.py @@ -87,9 +87,9 @@ class Nuclide(object): @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) + if not scattering in ['data', 'iso-in-lab', None]: + msg = 'Unable to set scattering for Nuclide to {0} which ' \ + 'is not "data", "iso-in-lab", or None'.format(scattering) raise ValueError(msg) self._scattering = scattering diff --git a/openmc/settings.py b/openmc/settings.py index a214b02f3a..683324fa2e 100644 --- a/openmc/settings.py +++ b/openmc/settings.py @@ -603,12 +603,19 @@ class Settings(object): @cross_sections.setter def cross_sections(self, cross_sections): + warnings.warn('Settings.cross_sections has been deprecated and will be ' + 'removed in a future version. Materials.cross_sections ' + 'should defined instead.', DeprecationWarning) cv.check_type('cross sections', cross_sections, string_types) self._cross_sections = cross_sections @multipole_library.setter def multipole_library(self, multipole_library): - cv.check_type('cross sections', multipole_library, string_types) + warnings.warn('Settings.multipole_library has been deprecated and will ' + 'be removed in a future version. ' + 'Materials.multipole_library should defined instead.', + DeprecationWarning) + cv.check_type('multipole library', multipole_library, string_types) self._multipole_library = multipole_library @ptables.setter @@ -713,6 +720,7 @@ class Settings(object): @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, diff --git a/src/constants.F90 b/src/constants.F90 index 8c321156cf..c42631c1c9 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -257,17 +257,6 @@ module constants ! Maximum number of partial fission reactions integer, parameter :: PARTIAL_FISSION_MAX = 4 - ! Major cross section libraries - integer, parameter :: & - ENDF_BVII0 = 1, & - ENDF_BVII1 = 2, & - JEFF_311 = 3, & - JEFF_312 = 4, & - JEFF_32 = 5, & - JENDL_32 = 6, & - JENDL_33 = 7, & - JENDL_40 = 8 - ! Temperature treatment method integer, parameter :: & TEMPERATURE_NEAREST = 1, & diff --git a/src/global.F90 b/src/global.F90 index f9d501b41a..8111fd5144 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -96,9 +96,6 @@ module global ! Unreoslved resonance probablity tables logical :: urr_ptables_on = .true. - ! What to assume for expanding natural elements - integer :: default_expand = ENDF_BVII1 - ! Default temperature and method for choosing temperatures integer :: temperature_method = TEMPERATURE_NEAREST logical :: temperature_multipole = .false. @@ -323,14 +320,14 @@ module global logical :: restart_run = .false. integer :: restart_batch - character(MAX_FILE_LEN) :: path_input ! Path to input file - character(MAX_FILE_LEN) :: path_cross_sections ! Path to cross_sections.xml - character(MAX_FILE_LEN) :: path_multipole ! Path to wmp library - character(MAX_FILE_LEN) :: path_source = '' ! Path to binary source - character(MAX_FILE_LEN) :: path_state_point ! Path to binary state point - character(MAX_FILE_LEN) :: path_source_point ! Path to binary source point - character(MAX_FILE_LEN) :: path_particle_restart ! Path to particle restart - character(MAX_FILE_LEN) :: path_output = '' ! Path to output directory + character(MAX_FILE_LEN) :: path_input ! Path to input file + character(MAX_FILE_LEN) :: path_cross_sections = '' ! Path to cross_sections.xml + character(MAX_FILE_LEN) :: path_multipole ! Path to wmp library + character(MAX_FILE_LEN) :: path_source = '' ! Path to binary source + character(MAX_FILE_LEN) :: path_state_point ! Path to binary state point + character(MAX_FILE_LEN) :: path_source_point ! Path to binary source point + character(MAX_FILE_LEN) :: path_particle_restart ! Path to particle restart + character(MAX_FILE_LEN) :: path_output = '' ! Path to output directory ! The verbosity controls how much information will be printed to the ! screen and in logs diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 324fce0c7d..b3306fb4ff 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -81,7 +81,6 @@ contains real(8), allocatable :: temp_real(:) integer :: n_tracks logical :: file_exists - character(MAX_FILE_LEN) :: env_variable character(MAX_WORD_LEN) :: type character(MAX_LINE_LEN) :: filename type(Node), pointer :: doc => null() @@ -138,55 +137,24 @@ contains end if end if - ! Find cross_sections.xml file -- the first place to look is the - ! settings.xml file. If no file is found there, then we check the - ! CROSS_SECTIONS environment variable - if (.not. check_for_node(doc, "cross_sections")) then - ! No cross_sections.xml file specified in settings.xml, check - ! environment variable - if (run_CE) then - call get_environment_variable("OPENMC_CROSS_SECTIONS", env_variable) - if (len_trim(env_variable) == 0) then - call get_environment_variable("CROSS_SECTIONS", env_variable) - if (len_trim(env_variable) == 0) then - call fatal_error("No cross_sections.xml file was specified in & - &settings.xml or in the OPENMC_CROSS_SECTIONS environment & - &variable. OpenMC needs such a file to identify where to & - &find ACE cross section libraries. Please consult the & - &user's guide at http://mit-crpg.github.io/openmc for & - &information on how to set up ACE cross section libraries.") - else - call warning("The CROSS_SECTIONS environment variable is & - &deprecated. Please update your environment to use & - &OPENMC_CROSS_SECTIONS instead.") - end if - end if - path_cross_sections = trim(env_variable) - else - call get_environment_variable("OPENMC_MG_CROSS_SECTIONS", env_variable) - if (len_trim(env_variable) == 0) then - call fatal_error("No mgxs.xml file was specified in & - &settings.xml or in the OPENMC_MG_CROSS_SECTIONS environment & - &variable. OpenMC needs such a file to identify where to & - &find ACE cross section libraries. Please consult the user's & - &guide at http://mit-crpg.github.io/openmc for information on & - &how to set up ACE cross section libraries.") - else - path_cross_sections = trim(env_variable) - end if - end if - else + ! Look for deprecated cross_sections.xml file in settings.xml + if (check_for_node(doc, "cross_sections")) then + call warning("Setting cross_sections in settings.xml has been deprecated.& + & The cross_sections are now set in materials.xml and the & + &cross_sections input to materials.xml and the OPENMC_CROSS_SECTIONS& + & environment variable will take precendent over setting & + &cross_sections in settings.xml.") call get_node_value(doc, "cross_sections", path_cross_sections) end if - ! Find the windowed multipole library + ! Look for deprecated windowed_multipole file in settings.xml if (run_mode /= MODE_PLOTTING) then - if (.not. check_for_node(doc, "multipole_library")) then - ! No library location specified in settings.xml, check - ! environment variable - call get_environment_variable("OPENMC_MULTIPOLE_LIBRARY", env_variable) - path_multipole = trim(env_variable) - else + if (check_for_node(doc, "multipole_library")) then + call warning("Setting multipole_library in settings.xml has been & + &deprecated. The multipole_library is now set in materials.xml and& + & the multipole_library input to materials.xml and the & + &OPENMC_MULTIPOLE_LIBRARY environment variable will take & + &precendent over setting multipole_library in settings.xml.") call get_node_value(doc, "multipole_library", path_multipole) end if if (.not. ends_with(path_multipole, "/")) & @@ -1055,32 +1023,6 @@ contains end if end if - ! Natural element expansion option - if (check_for_node(doc, "natural_elements")) then - call get_node_value(doc, "natural_elements", temp_str) - select case (to_lower(temp_str)) - case ('endf/b-vii.0') - default_expand = ENDF_BVII0 - case ('endf/b-vii.1') - default_expand = ENDF_BVII1 - case ('jeff-3.1.1') - default_expand = JEFF_311 - case ('jeff-3.1.2') - default_expand = JEFF_312 - case ('jeff-3.2') - default_expand = JEFF_32 - case ('jendl-3.2') - default_expand = JENDL_32 - case ('jendl-3.3') - default_expand = JENDL_33 - case ('jendl-4.0') - default_expand = JENDL_40 - case default - call fatal_error("Unknown natural element expansion option: " & - // trim(temp_str)) - 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)) @@ -2095,8 +2037,90 @@ contains 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(:) + character(MAX_LINE_LEN) :: temp_str + real(8), allocatable :: material_temps(:) + logical :: file_exists + character(MAX_FILE_LEN) :: env_variable + character(MAX_LINE_LEN) :: filename + type(Node), pointer :: doc => null() + ! Display output message + call write_message("Reading materials XML file...", 5) + + ! Check is materials.xml exists + filename = trim(path_input) // "materials.xml" + inquire(FILE=filename, EXIST=file_exists) + if (.not. file_exists) then + call fatal_error("Material XML file '" // trim(filename) // "' does not & + &exist!") + end if + + ! Parse materials.xml file + call open_xmldoc(doc, filename) + + ! Find cross_sections.xml file -- the first place to look is the + ! materials.xml file. If no file is found there, then we check the + ! OPENMC_CROSS_SECTIONS environment variable + if (.not. check_for_node(doc, "cross_sections")) then + ! No cross_sections.xml file specified in settings.xml, check + ! environment variable + if (run_CE) then + call get_environment_variable("OPENMC_CROSS_SECTIONS", env_variable) + if (len_trim(env_variable) == 0) then + call get_environment_variable("CROSS_SECTIONS", env_variable) + ! FIXME: When deprecated option of setting the cross sections in + ! settings.xml is removed, remove ".and. path_cross_sections == ''" + if (len_trim(env_variable) == 0 .and. path_cross_sections == '') then + call fatal_error("No cross_sections.xml file was specified in & + &materials.xml, settings.xml, or in the OPENMC_CROSS_SECTIONS& + & environment variable. OpenMC needs such a file to identify & + &where to find ACE cross section libraries. Please consult the& + & user's guide at http://mit-crpg.github.io/openmc for & + &information on how to set up ACE cross section libraries.") + else + call warning("The CROSS_SECTIONS environment variable is & + &deprecated. Please update your environment to use & + &OPENMC_CROSS_SECTIONS instead.") + end if + end if + path_cross_sections = trim(env_variable) + else + call get_environment_variable("OPENMC_MG_CROSS_SECTIONS", env_variable) + ! FIXME: When deprecated option of setting the mg cross sections in + ! settings.xml is removed, remove ".and. path_cross_sections == ''" + if (len_trim(env_variable) == 0 .and. path_cross_sections == '') then + call fatal_error("No mgxs.h5 file was specified in & + &materials.xml or in the OPENMC_MG_CROSS_SECTIONS environment & + &variable. OpenMC needs such a file to identify where to & + &find MG cross section libraries. Please consult the user's & + &guide at http://mit-crpg.github.io/openmc for information on & + &how to set up MG cross section libraries.") + else if (len_trim(env_variable) /= 0) then + path_cross_sections = trim(env_variable) + end if + end if + else + call get_node_value(doc, "cross_sections", path_cross_sections) + end if + + ! Find the windowed multipole library + if (run_mode /= MODE_PLOTTING) then + if (.not. check_for_node(doc, "multipole_library")) then + ! No library location specified in materials.xml, check + ! environment variable + call get_environment_variable("OPENMC_MULTIPOLE_LIBRARY", env_variable) + path_multipole = trim(env_variable) + else + call get_node_value(doc, "multipole_library", path_multipole) + end if + if (.not. ends_with(path_multipole, "/")) & + path_multipole = trim(path_multipole) // "/" + end if + + ! Close materials XML file + call close_xmldoc(doc) + + ! Now that the cross_sections.xml or mgxs.h5 has been located, read it in if (run_CE) then call read_ce_cross_sections_xml(libraries) else @@ -2150,40 +2174,34 @@ contains integer :: i ! loop index for materials integer :: j ! loop index for nuclides - integer :: k ! loop index for elements integer :: n ! number of nuclides integer :: n_sab ! number of sab tables for a material - integer :: n_nuc_ele ! number of nuclides in an element integer :: i_library ! index in libraries array integer :: index_nuclide ! index in nuclides integer :: index_sab ! index in sab_tables - real(8) :: val ! value entered for density - real(8) :: temp_dble ! temporary double prec. real 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(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 - type(VectorChar) :: names ! temporary list of nuclide names - type(VectorReal) :: densities ! temporary list of nuclide densities - type(VectorInt) :: list_iso_lab ! temporary list of isotropic lab scatterers - type(Material), pointer :: mat => null() + character(20) :: name ! name of nuclide, e.g. 92235.03c + 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 + real(8) :: val ! value entered for density + real(8) :: temp_dble ! temporary double prec. real + logical :: sum_density ! density is sum of nuclide densities + type(VectorChar) :: names ! temporary list of nuclide names + type(VectorInt) :: list_iso_lab ! temporary list of isotropic lab scatterers + type(VectorReal) :: densities ! temporary list of nuclide densities + type(Material), pointer :: mat => null() type(Node), pointer :: doc => null() type(Node), pointer :: node_mat => null() type(Node), pointer :: node_dens => null() type(Node), pointer :: node_nuc => null() - type(Node), pointer :: node_ele => null() type(Node), pointer :: node_sab => null() type(NodeList), pointer :: node_mat_list => null() type(NodeList), pointer :: node_nuc_list => null() - type(NodeList), pointer :: node_macro_list => null() type(NodeList), pointer :: node_ele_list => null() + type(NodeList), pointer :: node_macro_list => null() type(NodeList), pointer :: node_sab_list => null() - ! Display output message - call write_message("Reading materials XML file...", 5) - ! Check is materials.xml exists filename = trim(path_input) // "materials.xml" inquire(FILE=filename, EXIST=file_exists) @@ -2238,9 +2256,6 @@ contains material_temps(i) = ERROR_REAL end if - ! ======================================================================= - ! READ AND PARSE TAG - ! Get pointer to density element if (check_for_node(node_mat, "density")) then call get_node_ptr(node_mat, "density", node_dens) @@ -2249,22 +2264,16 @@ contains // trim(to_str(mat % id))) end if - ! Initialize value to zero - val = ZERO - ! Copy units call get_node_value(node_dens, "units", units) + ! If the units is 'sum', then the total density of the material is taken + ! to be the sum of the atom fractions listed on the nuclides if (units == 'sum') then - ! If the user gave the units as 'sum', then the total density of the - ! material is taken to be the sum of the atom fractions listed on the - ! nuclides - sum_density = .true. else if (units == 'macro') then if (check_for_node(node_dens, "value")) then - ! Copy value call get_node_value(node_dens, "value", val) else val = ONE @@ -2276,7 +2285,6 @@ contains sum_density = .false. else - ! Copy value call get_node_value(node_dens, "value", val) ! Check for erroneous density @@ -2302,15 +2310,25 @@ contains end select end if + ! Issue error if elements are provided + call get_node_list(node_mat, "element", node_ele_list) + + if (get_list_size(node_ele_list) > 0) then + call fatal_error("Unable to add an element to material " & + // trim(to_str(mat % id)) // " since the element option has & + &been removed from the xml input. Elements can only be added via & + &the Python API, which will expand elements into their natural & + &nuclides.") + end if + ! ======================================================================= ! READ AND PARSE TAGS ! Check to ensure material has at least one nuclide if (.not. check_for_node(node_mat, "nuclide") .and. & - .not. check_for_node(node_mat, "element") .and. & .not. check_for_node(node_mat, "macroscopic")) then - call fatal_error("No macroscopic data, nuclides or natural elements & - &specified on material " // trim(to_str(mat % id))) + call fatal_error("No macroscopic data or nuclides specified on & + &material " // trim(to_str(mat % id))) end if ! Create list of macroscopic x/s based on those specified, just treat @@ -2339,11 +2357,10 @@ contains call get_node_value(node_nuc, "name", name) name = trim(name) - ! save name and density to list + ! save name to list call names % push_back(name) - ! Check if no atom/weight percents were specified or if both atom and - ! weight percents were specified + ! Set density for macroscopic data if (units == 'macro') then call densities % push_back(ONE) else @@ -2355,7 +2372,7 @@ contains ! Get pointer list of XML call get_node_list(node_mat, "nuclide", node_nuc_list) - ! Create list of nuclides based on those specified plus natural elements + ! Create list of nuclides based on those specified INDIVIDUAL_NUCLIDES: do j = 1, get_list_size(node_nuc_list) ! Combine nuclide identifier and cross section and copy into names call get_list_item(node_nuc_list, j, node_nuc) @@ -2387,7 +2404,7 @@ contains call get_node_value(node_nuc, "name", name) name = trim(name) - ! save name and density to list + ! save name to list call names % push_back(name) ! Check if no atom/weight percents were specified or if both atom and @@ -2397,12 +2414,12 @@ contains else if (.not. check_for_node(node_nuc, "ao") .and. & .not. check_for_node(node_nuc, "wo")) then - call fatal_error("No atom or weight percent specified for nuclide " & - // trim(name)) + call fatal_error("No atom or weight percent specified for & + &nuclide" // trim(name)) elseif (check_for_node(node_nuc, "ao") .and. & check_for_node(node_nuc, "wo")) then - call fatal_error("Cannot specify both atom and weight percents for a & - &nuclide: " // trim(name)) + call fatal_error("Cannot specify both atom and weight percents & + &for a nuclide: " // trim(name)) end if ! Copy atom/weight percents @@ -2417,73 +2434,6 @@ contains end do INDIVIDUAL_NUCLIDES end if - ! ======================================================================= - ! READ AND PARSE TAGS - - ! Get pointer list of XML - call get_node_list(node_mat, "element", node_ele_list) - - NATURAL_ELEMENTS: do j = 1, get_list_size(node_ele_list) - call get_list_item(node_ele_list, j, node_ele) - - ! Check for empty name on natural element - if (.not. check_for_node(node_ele, "name")) then - call fatal_error("No name specified on nuclide in material " & - // trim(to_str(mat % id))) - end if - call get_node_value(node_ele, "name", name) - - ! 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. & - .not. check_for_node(node_ele, "wo")) then - call fatal_error("No atom or weight percent specified for element " & - // trim(name)) - elseif (check_for_node(node_ele, "ao") .and. & - check_for_node(node_ele, "wo")) then - call fatal_error("Cannot specify both atom and weight percents for & - &element: " // trim(name)) - end if - - ! Get current number of nuclides - n_nuc_ele = names % size() - - ! 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_dble, names, & - densities) - else - call fatal_error("The ability to expand a natural element based on & - &weight percentage is not yet supported.") - end if - - ! Compute number of new nuclides from the natural element expansion - n_nuc_ele = names % size() - n_nuc_ele - - ! Check enforced isotropic lab scattering - if (run_CE) then - if (check_for_node(node_ele, "scattering")) then - call get_node_value(node_ele, "scattering", temp_str) - else - temp_str = "data" - end if - - ! Set ace or iso-in-lab scattering for each nuclide in element - do k = 1, n_nuc_ele - if (adjustl(to_lower(temp_str)) == "iso-in-lab") then - call list_iso_lab % push_back(1) - else if (adjustl(to_lower(temp_str)) == "data") then - call list_iso_lab % push_back(0) - else - call fatal_error("Scattering must be isotropic in lab or follow& - & the ACE file data") - end if - end do - end if - - end do NATURAL_ELEMENTS - ! ======================================================================== ! COPY NUCLIDES TO ARRAYS IN MATERIAL @@ -4708,838 +4658,6 @@ contains end subroutine read_mg_cross_sections_header -!=============================================================================== -! EXPAND_NATURAL_ELEMENT converts natural elements specified using an -! tag within a material into individual isotopes based on IUPAC Isotopic -! Compositions of the Elements 2009 (doi:10.1351/PAC-REP-10-06-02). In some -! cases, modifications have been made to work with ENDF/B-VII.1 where -! evaluations of particular isotopes don't exist. -!=============================================================================== - - subroutine expand_natural_element(name, density, names, densities) - character(*), intent(in) :: name - real(8), intent(in) :: density - type(VectorChar), intent(inout) :: names - type(VectorReal), intent(inout) :: densities - - character(2) :: element_name - - element_name = name(1:2) - - select case (to_lower(element_name)) - case ('h') - call names % push_back('H1') - call densities % push_back(density * 0.999885_8) - call names % push_back('H2') - call densities % push_back(density * 0.000115_8) - case ('he') - call names % push_back('He3') - call densities % push_back(density * 0.00000134_8) - call names % push_back('He4') - call densities % push_back(density * 0.99999866_8) - - case ('li') - call names % push_back('Li6') - call densities % push_back(density * 0.0759_8) - call names % push_back('Li7') - call densities % push_back(density * 0.9241_8) - - case ('be') - call names % push_back('Be9') - call densities % push_back(density) - - case ('b') - call names % push_back('B10') - call densities % push_back(density * 0.199_8) - 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') - call densities % push_back(density) - - case ('n') - call names % push_back('N14') - call densities % push_back(density * 0.99636_8) - 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') - call densities % push_back(density * 0.99757_8) - call names % push_back('O17') - call densities % push_back(density * 0.00038_8) - 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') - call densities % push_back(density) - else - call names % push_back('O16') - call densities % push_back(density * 0.99962_8) - call names % push_back('O17') - call densities % push_back(density * 0.00038_8) - end if - - case ('f') - call names % push_back('F19') - call densities % push_back(density) - - case ('ne') - call names % push_back('Ne20') - call densities % push_back(density * 0.9048_8) - call names % push_back('Ne21') - call densities % push_back(density * 0.0027_8) - call names % push_back('Ne22') - call densities % push_back(density * 0.0925_8) - - case ('na') - call names % push_back('Na23') - call densities % push_back(density) - - case ('mg') - call names % push_back('Mg24') - call densities % push_back(density * 0.7899_8) - call names % push_back('Mg25') - call densities % push_back(density * 0.1000_8) - call names % push_back('Mg26') - call densities % push_back(density * 0.1101_8) - - case ('al') - call names % push_back('Al27') - call densities % push_back(density) - - case ('si') - call names % push_back('Si28') - call densities % push_back(density * 0.92223_8) - call names % push_back('Si29') - call densities % push_back(density * 0.04685_8) - call names % push_back('Si30') - call densities % push_back(density * 0.03092_8) - - case ('p') - call names % push_back('P31') - call densities % push_back(density) - - case ('s') - call names % push_back('S32') - call densities % push_back(density * 0.9499_8) - call names % push_back('S33') - call densities % push_back(density * 0.0075_8) - call names % push_back('S34') - call densities % push_back(density * 0.0425_8) - call names % push_back('S36') - call densities % push_back(density * 0.0001_8) - - case ('cl') - call names % push_back('Cl35') - call densities % push_back(density * 0.7576_8) - call names % push_back('Cl37') - call densities % push_back(density * 0.2424_8) - - case ('ar') - call names % push_back('Ar36') - call densities % push_back(density * 0.003336_8) - call names % push_back('Ar38') - call densities % push_back(density * 0.000629_8) - call names % push_back('Ar40') - call densities % push_back(density * 0.996035_8) - - case ('k') - call names % push_back('K39') - call densities % push_back(density * 0.932581_8) - call names % push_back('K40') - call densities % push_back(density * 0.000117_8) - call names % push_back('K41') - call densities % push_back(density * 0.067302_8) - - case ('ca') - call names % push_back('Ca40') - call densities % push_back(density * 0.96941_8) - call names % push_back('Ca42') - call densities % push_back(density * 0.00647_8) - call names % push_back('Ca43') - call densities % push_back(density * 0.00135_8) - call names % push_back('Ca44') - call densities % push_back(density * 0.02086_8) - call names % push_back('Ca46') - call densities % push_back(density * 0.00004_8) - call names % push_back('Ca48') - call densities % push_back(density * 0.00187_8) - - case ('sc') - call names % push_back('Sc45') - call densities % push_back(density) - - case ('ti') - call names % push_back('Ti46') - call densities % push_back(density * 0.0825_8) - call names % push_back('Ti47') - call densities % push_back(density * 0.0744_8) - call names % push_back('Ti48') - call densities % push_back(density * 0.7372_8) - call names % push_back('Ti49') - call densities % push_back(density * 0.0541_8) - 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') - call densities % push_back(density) - else - call names % push_back('V50') - call densities % push_back(density * 0.0025_8) - call names % push_back('V51') - call densities % push_back(density * 0.9975_8) - end if - - case ('cr') - call names % push_back('Cr50') - call densities % push_back(density * 0.04345_8) - call names % push_back('Cr52') - call densities % push_back(density * 0.83789_8) - call names % push_back('Cr53') - call densities % push_back(density * 0.09501_8) - call names % push_back('Cr54') - call densities % push_back(density * 0.02365_8) - - case ('mn') - call names % push_back('Mn55') - call densities % push_back(density) - - case ('fe') - call names % push_back('Fe54') - call densities % push_back(density * 0.05845_8) - call names % push_back('Fe56') - call densities % push_back(density * 0.91754_8) - call names % push_back('Fe57') - call densities % push_back(density * 0.02119_8) - call names % push_back('Fe58') - call densities % push_back(density * 0.00282_8) - - case ('co') - call names % push_back('Co59') - call densities % push_back(density) - - case ('ni') - call names % push_back('Ni58') - call densities % push_back(density * 0.68077_8) - call names % push_back('Ni60') - call densities % push_back(density * 0.26223_8) - call names % push_back('Ni61') - call densities % push_back(density * 0.011399_8) - call names % push_back('Ni62') - call densities % push_back(density * 0.036346_8) - call names % push_back('Ni64') - call densities % push_back(density * 0.009255_8) - - case ('cu') - call names % push_back('Cu63') - call densities % push_back(density * 0.6915_8) - 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') - call densities % push_back(density) - else - call names % push_back('Zn64') - call densities % push_back(density * 0.4917_8) - call names % push_back('Zn66') - call densities % push_back(density * 0.2773_8) - call names % push_back('Zn67') - call densities % push_back(density * 0.0404_8) - call names % push_back('Zn68') - call densities % push_back(density * 0.1845_8) - 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') - call densities % push_back(density) - else - call names % push_back('Ga69') - call densities % push_back(density * 0.60108_8) - call names % push_back('Ga71') - call densities % push_back(density * 0.39892_8) - end if - - case ('ge') - call names % push_back('Ge70') - call densities % push_back(density * 0.2057_8) - call names % push_back('Ge72') - call densities % push_back(density * 0.2745_8) - call names % push_back('Ge73') - call densities % push_back(density * 0.0775_8) - call names % push_back('Ge74') - call densities % push_back(density * 0.3650_8) - call names % push_back('Ge76') - call densities % push_back(density * 0.0773_8) - - case ('as') - call names % push_back('As75') - call densities % push_back(density) - - case ('se') - call names % push_back('Se74') - call densities % push_back(density * 0.0089_8) - call names % push_back('Se76') - call densities % push_back(density * 0.0937_8) - call names % push_back('Se77') - call densities % push_back(density * 0.0763_8) - call names % push_back('Se78') - call densities % push_back(density * 0.2377_8) - call names % push_back('Se80') - call densities % push_back(density * 0.4961_8) - call names % push_back('Se82') - call densities % push_back(density * 0.0873_8) - - case ('br') - call names % push_back('Br79') - call densities % push_back(density * 0.5069_8) - call names % push_back('Br81') - call densities % push_back(density * 0.4931_8) - - case ('kr') - call names % push_back('Kr78') - call densities % push_back(density * 0.00355_8) - call names % push_back('Kr80') - call densities % push_back(density * 0.02286_8) - call names % push_back('Kr82') - call densities % push_back(density * 0.11593_8) - call names % push_back('Kr83') - call densities % push_back(density * 0.11500_8) - call names % push_back('Kr84') - call densities % push_back(density * 0.56987_8) - call names % push_back('Kr86') - call densities % push_back(density * 0.17279_8) - - case ('rb') - call names % push_back('Rb85') - call densities % push_back(density * 0.7217_8) - call names % push_back('Rb87') - call densities % push_back(density * 0.2783_8) - - case ('sr') - call names % push_back('Sr84') - call densities % push_back(density * 0.0056_8) - call names % push_back('Sr86') - call densities % push_back(density * 0.0986_8) - call names % push_back('Sr87') - call densities % push_back(density * 0.0700_8) - call names % push_back('Sr88') - call densities % push_back(density * 0.8258_8) - - case ('y') - call names % push_back('Y89') - call densities % push_back(density) - - case ('zr') - call names % push_back('Zr90') - call densities % push_back(density * 0.5145_8) - call names % push_back('Zr91') - call densities % push_back(density * 0.1122_8) - call names % push_back('Zr92') - call densities % push_back(density * 0.1715_8) - call names % push_back('Zr94') - call densities % push_back(density * 0.1738_8) - call names % push_back('Zr96') - call densities % push_back(density * 0.0280_8) - - case ('nb') - call names % push_back('Nb93') - call densities % push_back(density) - - case ('mo') - call names % push_back('Mo92') - call densities % push_back(density * 0.1453_8) - call names % push_back('Mo94') - call densities % push_back(density * 0.0915_8) - call names % push_back('Mo95') - call densities % push_back(density * 0.1584_8) - call names % push_back('Mo96') - call densities % push_back(density * 0.1667_8) - call names % push_back('Mo97') - call densities % push_back(density * 0.0960_8) - call names % push_back('Mo98') - call densities % push_back(density * 0.2439_8) - call names % push_back('Mo100') - call densities % push_back(density * 0.0982_8) - - case ('ru') - call names % push_back('Ru96') - call densities % push_back(density * 0.0554_8) - call names % push_back('Ru98') - call densities % push_back(density * 0.0187_8) - call names % push_back('Ru99') - call densities % push_back(density * 0.1276_8) - call names % push_back('Ru100') - call densities % push_back(density * 0.1260_8) - call names % push_back('Ru101') - call densities % push_back(density * 0.1706_8) - call names % push_back('Ru102') - call densities % push_back(density * 0.3155_8) - call names % push_back('Ru104') - call densities % push_back(density * 0.1862_8) - - case ('rh') - call names % push_back('Rh103') - call densities % push_back(density) - - case ('pd') - call names % push_back('Pd102') - call densities % push_back(density * 0.0102_8) - call names % push_back('Pd104') - call densities % push_back(density * 0.1114_8) - call names % push_back('Pd105') - call densities % push_back(density * 0.2233_8) - call names % push_back('Pd106') - call densities % push_back(density * 0.2733_8) - call names % push_back('Pd108') - call densities % push_back(density * 0.2646_8) - call names % push_back('Pd110') - call densities % push_back(density * 0.1172_8) - - case ('ag') - call names % push_back('Ag107') - call densities % push_back(density * 0.51839_8) - call names % push_back('Ag109') - call densities % push_back(density * 0.48161_8) - - case ('cd') - call names % push_back('Cd106') - call densities % push_back(density * 0.0125_8) - call names % push_back('Cd108') - call densities % push_back(density * 0.0089_8) - call names % push_back('Cd110') - call densities % push_back(density * 0.1249_8) - call names % push_back('Cd111') - call densities % push_back(density * 0.1280_8) - call names % push_back('Cd112') - call densities % push_back(density * 0.2413_8) - call names % push_back('Cd113') - call densities % push_back(density * 0.1222_8) - call names % push_back('Cd114') - call densities % push_back(density * 0.2873_8) - call names % push_back('Cd116') - call densities % push_back(density * 0.0749_8) - - case ('in') - call names % push_back('In113') - call densities % push_back(density * 0.0429_8) - call names % push_back('In115') - call densities % push_back(density * 0.9571_8) - - case ('sn') - call names % push_back('Sn112') - call densities % push_back(density * 0.0097_8) - call names % push_back('Sn114') - call densities % push_back(density * 0.0066_8) - call names % push_back('Sn115') - call densities % push_back(density * 0.0034_8) - call names % push_back('Sn116') - call densities % push_back(density * 0.1454_8) - call names % push_back('Sn117') - call densities % push_back(density * 0.0768_8) - call names % push_back('Sn118') - call densities % push_back(density * 0.2422_8) - call names % push_back('Sn119') - call densities % push_back(density * 0.0859_8) - call names % push_back('Sn120') - call densities % push_back(density * 0.3258_8) - call names % push_back('Sn122') - call densities % push_back(density * 0.0463_8) - call names % push_back('Sn124') - call densities % push_back(density * 0.0579_8) - - case ('sb') - call names % push_back('Sb121') - call densities % push_back(density * 0.5721_8) - call names % push_back('Sb123') - call densities % push_back(density * 0.4279_8) - - case ('te') - call names % push_back('Te120') - call densities % push_back(density * 0.0009_8) - call names % push_back('Te122') - call densities % push_back(density * 0.0255_8) - call names % push_back('Te123') - call densities % push_back(density * 0.0089_8) - call names % push_back('Te124') - call densities % push_back(density * 0.0474_8) - call names % push_back('Te125') - call densities % push_back(density * 0.0707_8) - call names % push_back('Te126') - call densities % push_back(density * 0.1884_8) - call names % push_back('Te128') - call densities % push_back(density * 0.3174_8) - call names % push_back('Te130') - call densities % push_back(density * 0.3408_8) - - case ('i') - call names % push_back('I127') - call densities % push_back(density) - - case ('xe') - call names % push_back('Xe124') - call densities % push_back(density * 0.000952_8) - call names % push_back('Xe126') - call densities % push_back(density * 0.000890_8) - call names % push_back('Xe128') - call densities % push_back(density * 0.019102_8) - call names % push_back('Xe129') - call densities % push_back(density * 0.264006_8) - call names % push_back('Xe130') - call densities % push_back(density * 0.040710_8) - call names % push_back('Xe131') - call densities % push_back(density * 0.212324_8) - call names % push_back('Xe132') - call densities % push_back(density * 0.269086_8) - call names % push_back('Xe134') - call densities % push_back(density * 0.104357_8) - call names % push_back('Xe136') - call densities % push_back(density * 0.088573_8) - - case ('cs') - call names % push_back('Cs133') - call densities % push_back(density) - - case ('ba') - call names % push_back('Ba130') - call densities % push_back(density * 0.00106_8) - call names % push_back('Ba132') - call densities % push_back(density * 0.00101_8) - call names % push_back('Ba134') - call densities % push_back(density * 0.02417_8) - call names % push_back('Ba135') - call densities % push_back(density * 0.06592_8) - call names % push_back('Ba136') - call densities % push_back(density * 0.07854_8) - call names % push_back('Ba137') - call densities % push_back(density * 0.11232_8) - call names % push_back('Ba138') - call densities % push_back(density * 0.71698_8) - - case ('la') - call names % push_back('La138') - call densities % push_back(density * 0.0008881_8) - call names % push_back('La139') - call densities % push_back(density * 0.9991119_8) - - case ('ce') - call names % push_back('Ce136') - call densities % push_back(density * 0.00185_8) - call names % push_back('Ce138') - call densities % push_back(density * 0.00251_8) - call names % push_back('Ce140') - call densities % push_back(density * 0.88450_8) - call names % push_back('Ce142') - call densities % push_back(density * 0.11114_8) - - case ('pr') - call names % push_back('Pr141') - call densities % push_back(density) - - case ('nd') - call names % push_back('Nd142') - call densities % push_back(density * 0.27152_8) - call names % push_back('Nd143') - call densities % push_back(density * 0.12174_8) - call names % push_back('Nd144') - call densities % push_back(density * 0.23798_8) - call names % push_back('Nd145') - call densities % push_back(density * 0.08293_8) - call names % push_back('Nd146') - call densities % push_back(density * 0.17189_8) - call names % push_back('Nd148') - call densities % push_back(density * 0.05756_8) - call names % push_back('Nd150') - call densities % push_back(density * 0.05638_8) - - case ('sm') - call names % push_back('Sm144') - call densities % push_back(density * 0.0307_8) - call names % push_back('Sm147') - call densities % push_back(density * 0.1499_8) - call names % push_back('Sm148') - call densities % push_back(density * 0.1124_8) - call names % push_back('Sm149') - call densities % push_back(density * 0.1382_8) - call names % push_back('Sm150') - call densities % push_back(density * 0.0738_8) - call names % push_back('Sm152') - call densities % push_back(density * 0.2675_8) - call names % push_back('Sm154') - call densities % push_back(density * 0.2275_8) - - case ('eu') - call names % push_back('Eu151') - call densities % push_back(density * 0.4781_8) - call names % push_back('Eu153') - call densities % push_back(density * 0.5219_8) - - case ('gd') - call names % push_back('Gd152') - call densities % push_back(density * 0.0020_8) - call names % push_back('Gd154') - call densities % push_back(density * 0.0218_8) - call names % push_back('Gd155') - call densities % push_back(density * 0.1480_8) - call names % push_back('Gd156') - call densities % push_back(density * 0.2047_8) - call names % push_back('Gd157') - call densities % push_back(density * 0.1565_8) - call names % push_back('Gd158') - call densities % push_back(density * 0.2484_8) - call names % push_back('Gd160') - call densities % push_back(density * 0.2186_8) - - case ('tb') - call names % push_back('Tb159') - call densities % push_back(density) - - case ('dy') - call names % push_back('Dy156') - call densities % push_back(density * 0.00056_8) - call names % push_back('Dy158') - call densities % push_back(density * 0.00095_8) - call names % push_back('Dy160') - call densities % push_back(density * 0.02329_8) - call names % push_back('Dy161') - call densities % push_back(density * 0.18889_8) - call names % push_back('Dy162') - call densities % push_back(density * 0.25475_8) - call names % push_back('Dy163') - call densities % push_back(density * 0.24896_8) - call names % push_back('Dy164') - call densities % push_back(density * 0.28260_8) - - case ('ho') - call names % push_back('Ho165') - call densities % push_back(density) - - case ('er') - call names % push_back('Er162') - call densities % push_back(density * 0.00139_8) - call names % push_back('Er164') - call densities % push_back(density * 0.01601_8) - call names % push_back('Er166') - call densities % push_back(density * 0.33503_8) - call names % push_back('Er167') - call densities % push_back(density * 0.22869_8) - call names % push_back('Er168') - call densities % push_back(density * 0.26978_8) - call names % push_back('Er170') - call densities % push_back(density * 0.14910_8) - - case ('tm') - call names % push_back('Tm169') - call densities % push_back(density) - - case ('yb') - call names % push_back('Yb168') - call densities % push_back(density * 0.00123_8) - call names % push_back('Yb170') - call densities % push_back(density * 0.02982_8) - call names % push_back('Yb171') - call densities % push_back(density * 0.1409_8) - call names % push_back('Yb172') - call densities % push_back(density * 0.2168_8) - call names % push_back('Yb173') - call densities % push_back(density * 0.16103_8) - call names % push_back('Yb174') - call densities % push_back(density * 0.32026_8) - call names % push_back('Yb176') - call densities % push_back(density * 0.12996_8) - - case ('lu') - call names % push_back('Lu175') - call densities % push_back(density * 0.97401_8) - call names % push_back('Lu176') - call densities % push_back(density * 0.02599_8) - - case ('hf') - call names % push_back('Hf174') - call densities % push_back(density * 0.0016_8) - call names % push_back('Hf176') - call densities % push_back(density * 0.0526_8) - call names % push_back('Hf177') - call densities % push_back(density * 0.1860_8) - call names % push_back('Hf178') - call densities % push_back(density * 0.2728_8) - call names % push_back('Hf179') - call densities % push_back(density * 0.1362_8) - 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') - call densities % push_back(density) - else - call names % push_back('Ta180') - call densities % push_back(density * 0.0001201_8) - call names % push_back('Ta181') - call densities % push_back(density * 0.9998799_8) - end if - - case ('w') - if (default_expand == ENDF_BVII0 .or. default_expand == JEFF_311 & - .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') - call densities % push_back(density * 0.2662_8) - call names % push_back('W183') - call densities % push_back(density * 0.1431_8) - call names % push_back('W184') - call densities % push_back(density * 0.3064_8) - call names % push_back('W186') - call densities % push_back(density * 0.2843_8) - else - call names % push_back('W180') - call densities % push_back(density * 0.0012_8) - call names % push_back('W182') - call densities % push_back(density * 0.2650_8) - call names % push_back('W183') - call densities % push_back(density * 0.1431_8) - call names % push_back('W184') - call densities % push_back(density * 0.3064_8) - call names % push_back('W186') - call densities % push_back(density * 0.2843_8) - end if - - case ('re') - call names % push_back('Re185') - call densities % push_back(density * 0.3740_8) - 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') - call densities % push_back(density) - else - call names % push_back('Os184') - call densities % push_back(density * 0.0002_8) - call names % push_back('Os186') - call densities % push_back(density * 0.0159_8) - call names % push_back('Os187') - call densities % push_back(density * 0.0196_8) - call names % push_back('Os188') - call densities % push_back(density * 0.1324_8) - call names % push_back('Os189') - call densities % push_back(density * 0.1615_8) - call names % push_back('Os190') - call densities % push_back(density * 0.2626_8) - call names % push_back('Os192') - call densities % push_back(density * 0.4078_8) - end if - - case ('ir') - call names % push_back('Ir191') - call densities % push_back(density * 0.373_8) - 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') - call densities % push_back(density) - else - call names % push_back('Pt190') - call densities % push_back(density * 0.00012_8) - call names % push_back('Pt192') - call densities % push_back(density * 0.00782_8) - call names % push_back('Pt194') - call densities % push_back(density * 0.3286_8) - call names % push_back('Pt195') - call densities % push_back(density * 0.3378_8) - call names % push_back('Pt196') - call densities % push_back(density * 0.2521_8) - call names % push_back('Pt198') - call densities % push_back(density * 0.07356_8) - end if - - case ('au') - call names % push_back('Au197') - call densities % push_back(density) - - case ('hg') - call names % push_back('Hg196') - call densities % push_back(density * 0.0015_8) - call names % push_back('Hg198') - call densities % push_back(density * 0.0997_8) - call names % push_back('Hg199') - call densities % push_back(density * 0.1687_8) - call names % push_back('Hg200') - call densities % push_back(density * 0.2310_8) - call names % push_back('Hg201') - call densities % push_back(density * 0.1318_8) - call names % push_back('Hg202') - call densities % push_back(density * 0.2986_8) - 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') - call densities % push_back(density) - else - call names % push_back('Tl203') - call densities % push_back(density * 0.2952_8) - call names % push_back('Tl205') - call densities % push_back(density * 0.7048_8) - end if - - case ('pb') - call names % push_back('Pb204') - call densities % push_back(density * 0.014_8) - call names % push_back('Pb206') - call densities % push_back(density * 0.241_8) - call names % push_back('Pb207') - call densities % push_back(density * 0.221_8) - call names % push_back('Pb208') - call densities % push_back(density * 0.524_8) - - case ('bi') - call names % push_back('Bi209') - call densities % push_back(density) - - case ('th') - call names % push_back('Th232') - call densities % push_back(density) - - case ('pa') - call names % push_back('Pa231') - call densities % push_back(density) - - case ('u') - call names % push_back('U234') - call densities % push_back(density * 0.000054_8) - call names % push_back('U235') - call densities % push_back(density * 0.007204_8) - call names % push_back('U238') - call densities % push_back(density * 0.992742_8) - - case default - call fatal_error("Cannot expand element: " // name) - - end select - - end subroutine expand_natural_element - !=============================================================================== ! GENERATE_RPN implements the shunting-yard algorithm to generate a Reverse ! Polish notation (RPN) expression for the region specification of a cell given @@ -5628,17 +4746,17 @@ contains end subroutine generate_rpn !=============================================================================== -! NORMALIZE_AO normalizes the atom or weight percentages for each material +! NORMALIZE_AO Normalize the nuclide atom percents !=============================================================================== subroutine normalize_ao() - integer :: i ! index in materials array - integer :: j ! index over nuclides in material - real(8) :: sum_percent ! summation - real(8) :: awr ! atomic weight ratio - real(8) :: x ! atom percent - logical :: percent_in_atom ! nuclides specified in atom percent? - logical :: density_in_atom ! density specified in atom/b-cm? + integer :: i ! index in materials array + integer :: j ! index over nuclides in material + real(8) :: sum_percent ! summation + real(8) :: awr ! atomic weight ratio + real(8) :: x ! atom percent + logical :: percent_in_atom ! nuclides specified in atom percent? + logical :: density_in_atom ! density specified in atom/b-cm? do i = 1, size(materials) associate (mat => materials(i)) diff --git a/src/relaxng/materials.rnc b/src/relaxng/materials.rnc index c5f4efd6f3..134fb86cae 100644 --- a/src/relaxng/materials.rnc +++ b/src/relaxng/materials.rnc @@ -42,4 +42,8 @@ element materials { (element name { xsd:string } | attribute name { xsd:string }) }* }+ + + element cross_sections { xsd:string { maxLength = "255" } }? & + + element multipole_library { xsd:string { maxLength = "255" } }? & } diff --git a/src/relaxng/settings.rnc b/src/relaxng/settings.rnc index b05ab7d6b5..62d9451c3d 100644 --- a/src/relaxng/settings.rnc +++ b/src/relaxng/settings.rnc @@ -25,10 +25,6 @@ element settings { } ) & - element cross_sections { xsd:string { maxLength = "255" } }? & - - element multipole_library { xsd:string { maxLength = "255" } }? & - element cutoff { (element weight { xsd:double } | attribute weight { xsd:double })? & (element weight_avg { xsd:double } | attribute weight_avg { xsd:double })? diff --git a/tests/input_set.py b/tests/input_set.py index 0d5a78bab9..7971a8a4cc 100644 --- a/tests/input_set.py +++ b/tests/input_set.py @@ -524,31 +524,22 @@ class PinCellInputSet(object): # 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') - left = openmc.XPlane(x0=-0.63, name='left') - right = openmc.XPlane(x0=0.63, name='right') - bottom = openmc.YPlane(y0=-0.63, name='bottom') - top = openmc.YPlane(y0=0.63, name='top') - - left.boundary_type = 'reflective' - right.boundary_type = 'reflective' - top.boundary_type = 'reflective' - bottom.boundary_type = 'reflective' + left = openmc.XPlane(x0=-0.63, name='left', boundary_type='reflective') + right = openmc.XPlane(x0=0.63, name='right', boundary_type='reflective') + bottom = openmc.YPlane(y0=-0.63, name='bottom', + boundary_type='reflective') + top = openmc.YPlane(y0=0.63, name='top', boundary_type='reflective') # Instantiate Cells - fuel_pin = openmc.Cell(name='cell 1') - cladding = openmc.Cell(name='cell 3') - water = openmc.Cell(name='cell 2') + fuel_pin = openmc.Cell(name='cell 1', fill=fuel) + cladding = openmc.Cell(name='cell 3', fill=clad) + water = openmc.Cell(name='cell 2', fill=hot_water) # Use surface half-spaces to define regions fuel_pin.region = -fuel_or cladding.region = +fuel_or & -clad_or water.region = +clad_or & +left & -right & +bottom & -top - # Register Materials with Cells - fuel_pin.fill = fuel - cladding.fill = clad - water.fill = hot_water - # Instantiate Universe root = openmc.Universe(universe_id=0, name='root universe') @@ -757,6 +748,7 @@ class MGInputSet(InputSet): # Define the materials file self.xs_data = xs self.materials += mats + self.materials.cross_sections = "../1d_mgxs.h5" # Define surfaces. # Assembly/Problem Boundary @@ -793,7 +785,6 @@ class MGInputSet(InputSet): self.settings.source = Source(space=Box([0.0, 0.0, 0.0], [10.0, 10.0, 5.])) self.settings.energy_mode = "multi-group" - self.settings.cross_sections = "../1d_mgxs.h5" def build_defualt_plots(self): plot = openmc.Plot() diff --git a/tests/test_complex_cell/materials.xml b/tests/test_complex_cell/materials.xml index 6edf0a5f9c..69abdc96f4 100644 --- a/tests/test_complex_cell/materials.xml +++ b/tests/test_complex_cell/materials.xml @@ -11,11 +11,11 @@ - + - + diff --git a/tests/test_complex_cell/results_true.dat b/tests/test_complex_cell/results_true.dat index da3acd2aa3..a5aa837e02 100644 --- a/tests/test_complex_cell/results_true.dat +++ b/tests/test_complex_cell/results_true.dat @@ -1,11 +1,11 @@ k-combined: -2.531110E-01 3.041974E-03 +2.511523E-01 2.296777E-03 tally 1: -2.594626E+00 -1.346701E+00 -2.683653E+00 -1.440725E+00 -9.933862E-01 -1.977011E-01 -1.112289E-01 -2.476655E-03 +2.578905E+00 +1.331155E+00 +2.688693E+00 +1.447930E+00 +9.863774E-01 +1.948549E-01 +1.123802E-01 +2.527538E-03 diff --git a/tests/test_element_wo/test_element_wo.py b/tests/test_element_wo/test_element_wo.py new file mode 100644 index 0000000000..e2a5726f19 --- /dev/null +++ b/tests/test_element_wo/test_element_wo.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +import os +import sys + +import numpy as np + +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) +from openmc import Material +from openmc.data import NATURAL_ABUNDANCE, atomic_mass + + +if __name__ == '__main__': + # This test doesn't require an OpenMC run. We just need to make sure the + # element.expand() method expands elements with the proper nuclide + # compositions. + + h_am = (NATURAL_ABUNDANCE['H1'] * atomic_mass('H1') + + NATURAL_ABUNDANCE['H2'] * atomic_mass('H2')) + o_am = (NATURAL_ABUNDANCE['O17'] * atomic_mass('O17') + + (NATURAL_ABUNDANCE['O16'] + NATURAL_ABUNDANCE['O18']) + * atomic_mass('O16')) + water_am = 2 * h_am + o_am + + water = Material() + water.add_element('O', o_am / water_am, 'wo') + water.add_element('H', 2 * h_am / water_am, 'wo') + densities = water.get_nuclide_densities() + + for nuc in densities.keys(): + assert nuc in ('H1', 'H2', 'O16', 'O17') + + if nuc in ('H1', 'H2'): + val = 2 * NATURAL_ABUNDANCE[nuc] * atomic_mass(nuc) / water_am + assert np.isclose(densities[nuc][1], val, rtol=1.e-8) + if nuc == 'O16': + val = (NATURAL_ABUNDANCE[nuc] + NATURAL_ABUNDANCE['O18']) \ + * atomic_mass(nuc) / water_am + assert np.isclose(densities[nuc][1], val, rtol=1.e-8) + if nuc == 'O17': + val = NATURAL_ABUNDANCE[nuc] * atomic_mass(nuc) / water_am + assert np.isclose(densities[nuc][1], val, rtol=1.e-8) diff --git a/tests/test_enrichment/test_enrichment.py b/tests/test_enrichment/test_enrichment.py new file mode 100644 index 0000000000..48416885b8 --- /dev/null +++ b/tests/test_enrichment/test_enrichment.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +import os +import sys + +import numpy as np + +sys.path.insert(0, os.pardir) +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) +from openmc import Material +from openmc.data import NATURAL_ABUNDANCE, atomic_mass + + +if __name__ == '__main__': + # This test doesn't require an OpenMC run. We just need to make sure the + # element.expand() method expands Uranium to the proper enrichment. + + uranium = Material() + uranium.add_element('U', 1.0, 'wo', 4.95) + densities = uranium.get_nuclide_densities() + + sum_densities = 0. + for nuc in densities.keys(): + assert nuc in ('U234', 'U235', 'U238') + sum_densities += densities[nuc][1] + + # Compute the weight percent U235 + enrichment = densities['U235'][1] / sum_densities + assert np.isclose(enrichment, 0.0495, rtol=1.e-8) + + # Compute the ratio of U234/U235 + u234_to_u235 = densities['U234'][1] / densities['U235'][1] + assert np.isclose(u234_to_u235, 0.008, rtol=1.e-8) diff --git a/tests/test_mg_basic/inputs_true.dat b/tests/test_mg_basic/inputs_true.dat index 08917ab7db..6834e8e64c 100644 --- a/tests/test_mg_basic/inputs_true.dat +++ b/tests/test_mg_basic/inputs_true.dat @@ -1 +1 @@ -115218221500e60ea43145875324a9a6800366fcc97357ef4cd8182f9253e114cbe1c7481dd3bdd8d7dce5983e2cb757ae0a2e05ede236d94cba7909703ba7f7 \ No newline at end of file +12abd69924751d1cf2a296ce799bfb2a6a4e744ffc49eef5a5cee8b764254caa3783c406cff71238c5608b454f451953479fb4caad45460a013225ab8de2271e \ 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 3056e8cbdf..ddb555692e 100644 --- a/tests/test_mg_max_order/inputs_true.dat +++ b/tests/test_mg_max_order/inputs_true.dat @@ -1 +1 @@ -139d760cd83eab001ed3fd52d7146fb5f30b7021b26ada6a1e425f5446185ac6fa61ac2ac58aa9e895981e10540160b7ae7428c833024679ef1ca762715e2d51 \ No newline at end of file +1f82e622b36562a0a14536fe24c95ee9c901c428f7f082f245afae5c699ccd647aaf31a49790822ceb7ec136bdb75f8e25c3677642f73702ca2e30b058f6b440 \ No newline at end of file diff --git a/tests/test_mg_nuclide/inputs_true.dat b/tests/test_mg_nuclide/inputs_true.dat index 57aa5d33f0..95f65c29e0 100644 --- a/tests/test_mg_nuclide/inputs_true.dat +++ b/tests/test_mg_nuclide/inputs_true.dat @@ -1 +1 @@ -6d03b988671fe21dfe2a908685536edb3059e5bdda7974ddfa65c7f63cecb7f6b3fce49bc1533ef2787e284121779653cb14a66cfd709258e4b07d8bd7571843 \ No newline at end of file +ec7f0697d22668dcc4cdaf134c58b9f84137730d52cb44264ee9205369abcf995b2f66847d620715cd609bd2f5f865294374978f8fb89f182962e40801171cba \ 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 6b0ff76b15..7be35573cd 100644 --- a/tests/test_mg_tallies/inputs_true.dat +++ b/tests/test_mg_tallies/inputs_true.dat @@ -1 +1 @@ -8c496e13f9456bedcc0789ffdca81913596cca3c7867717ced38c3063b6cdc8949bd204c98723b72c1b456e3fc85fc90e6710482b0c74e5e29283902a5d9ed50 \ No newline at end of file +54cd9db30bc8e671591d76e8da2b5dead54eb4cead1eef09a005e96ca2c0fd707872e0cc21f31d198915b156605de78322fbb7957698ea8febceb23f048e44ad \ 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 74a424597c..28da845670 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 @@ -59,8 +59,8 @@ class MGXSTestHarness(PyAPITestHarness): self._input_set.mgxs_file, self._input_set.materials, \ self._input_set.geometry = self.mgxs_lib.create_mg_mode() - # Modify settings so we can run in MG mode - self._input_set.settings.cross_sections = './mgxs.h5' + # Modify materials and settings so we can run in MG mode + self._input_set.materials.cross_sections = './mgxs.h5' self._input_set.settings.energy_mode = 'multi-group' # Write modified input files diff --git a/tests/test_natural_element/geometry.xml b/tests/test_natural_element/geometry.xml deleted file mode 100644 index b6b4bd817b..0000000000 --- a/tests/test_natural_element/geometry.xml +++ /dev/null @@ -1,94 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_natural_element/materials.xml b/tests/test_natural_element/materials.xml deleted file mode 100644 index 6568951f43..0000000000 --- a/tests/test_natural_element/materials.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_natural_element/results_true.dat b/tests/test_natural_element/results_true.dat deleted file mode 100644 index cc4a12f749..0000000000 --- a/tests/test_natural_element/results_true.dat +++ /dev/null @@ -1,2 +0,0 @@ -k-combined: -1.034427E+00 1.583807E-02 diff --git a/tests/test_natural_element/settings.xml b/tests/test_natural_element/settings.xml deleted file mode 100644 index f903c92e72..0000000000 --- a/tests/test_natural_element/settings.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - 10 - 5 - 400 - - - endf/b-vii.1 - - - - box - 0 0 0 1 1 1 - - - - - diff --git a/tests/test_natural_element/test_natural_element.py b/tests/test_natural_element/test_natural_element.py deleted file mode 100644 index 2a595f3e66..0000000000 --- a/tests/test_natural_element/test_natural_element.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_tallies/test_tallies.py b/tests/test_tallies/test_tallies.py index aa3aa208bc..07ca5bfdaf 100644 --- a/tests/test_tallies/test_tallies.py +++ b/tests/test_tallies/test_tallies.py @@ -122,7 +122,7 @@ 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', + '(n,gamma)', 'nu-fission', 'scatter', 'elastic', 'total', 'prompt-nu-fission', 'fission-q-prompt', 'fission-q-recoverable'] score_tallies[0].estimator = 'tracklength' diff --git a/tests/test_triso/inputs_true.dat b/tests/test_triso/inputs_true.dat index 561877ad93..0ca3943f42 100644 --- a/tests/test_triso/inputs_true.dat +++ b/tests/test_triso/inputs_true.dat @@ -1 +1 @@ -b22973093e2b0690b30fb1262a11e27004555b796c446d256cb58a1d7329888ab60c1b93729b3d74bb015b98aa434416daa2dc2aee526eb8df0e9052911f94b4 \ No newline at end of file +3a356b5b6d0aaa3db8c601521e1837a6870c5e5f6d1068f4f3e9b896c0107517d99ff9676311221633169b4d79dc1c4076bff84130e6de16df7ace4da5481a60 \ No newline at end of file