diff --git a/.gitignore b/.gitignore index 08f7bd2e4..ef67316fb 100644 --- a/.gitignore +++ b/.gitignore @@ -36,6 +36,7 @@ src/xml-fortran/xmlreader # Test results error file results_error.dat +inputs_error.dat # Test build files tests/build/ diff --git a/docs/source/pythonapi/examples/post-processing.ipynb b/docs/source/pythonapi/examples/post-processing.ipynb index de6234a72..fbaa3b515 100644 --- a/docs/source/pythonapi/examples/post-processing.ipynb +++ b/docs/source/pythonapi/examples/post-processing.ipynb @@ -159,7 +159,18 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" + ] + } + ], "source": [ "# Create a Universe to encapsulate a fuel pin\n", "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", @@ -197,7 +208,20 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" + ] + } + ], "source": [ "# Create root Cell\n", "root_cell = openmc.Cell(name='root cell')\n", @@ -353,7 +377,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMTE6MTc6MDItMDQ6MDDQML6SAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDExOjE3OjAyLTA0OjAwoW0GLgAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDhUMTM6NDI6MjAtMDQ6MDCoc1E2AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTA4\nVDEzOjQyOjIwLTA0OjAw2S7pigAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -419,7 +443,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "metadata": { "collapsed": true }, @@ -438,7 +462,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": true @@ -464,8 +488,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 11:17:02\n", + " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", + " Date/Time: 2015-10-08 13:42:20\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -478,11 +502,11 @@ " Reading materials XML file...\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", + " Loading ACE cross section table: 92235.71c\n", " Loading ACE cross section table: 92238.71c\n", " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 5010.71c\n", " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 5010.71c\n", " Loading ACE cross section table: 40090.71c\n", " Initializing source particles...\n", "\n", @@ -492,149 +516,53 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 1.01593 \n", - " 2/1 1.05332 \n", - " 3/1 1.03858 \n", - " 4/1 1.03420 \n", - " 5/1 1.03004 \n", - " 6/1 1.03899 \n", - " 7/1 1.04639 \n", - " 8/1 1.03921 \n", - " 9/1 1.00410 \n", - " 10/1 1.06702 \n", - " 11/1 1.03401 \n", - " 12/1 1.05518 1.04460 +/- 0.01059\n", - " 13/1 1.03358 1.04092 +/- 0.00713\n", - " 14/1 1.00991 1.03317 +/- 0.00925\n", - " 15/1 1.04884 1.03631 +/- 0.00782\n", - " 16/1 1.03449 1.03600 +/- 0.00639\n", - " 17/1 1.04612 1.03745 +/- 0.00559\n", - " 18/1 1.07511 1.04216 +/- 0.00675\n", - " 19/1 1.01774 1.03944 +/- 0.00655\n", - " 20/1 1.04054 1.03955 +/- 0.00586\n", - " 21/1 1.01202 1.03705 +/- 0.00586\n", - " 22/1 1.04460 1.03768 +/- 0.00538\n", - " 23/1 1.04415 1.03818 +/- 0.00498\n", - " 24/1 1.04222 1.03846 +/- 0.00462\n", - " 25/1 1.04045 1.03860 +/- 0.00430\n", - " 26/1 1.04133 1.03877 +/- 0.00403\n", - " 27/1 1.03166 1.03835 +/- 0.00381\n", - " 28/1 1.00701 1.03661 +/- 0.00399\n", - " 29/1 1.04111 1.03685 +/- 0.00378\n", - " 30/1 1.05130 1.03757 +/- 0.00366\n", - " 31/1 1.02685 1.03706 +/- 0.00352\n", - " 32/1 1.03458 1.03695 +/- 0.00335\n", - " 33/1 1.05243 1.03762 +/- 0.00328\n", - " 34/1 1.05717 1.03843 +/- 0.00324\n", - " 35/1 1.07396 1.03985 +/- 0.00342\n", - " 36/1 1.01690 1.03897 +/- 0.00340\n", - " 37/1 1.03340 1.03877 +/- 0.00328\n", - " 38/1 1.04153 1.03886 +/- 0.00316\n", - " 39/1 1.01971 1.03820 +/- 0.00312\n", - " 40/1 1.01491 1.03743 +/- 0.00311\n", - " 41/1 1.02779 1.03712 +/- 0.00303\n", - " 42/1 1.03047 1.03691 +/- 0.00294\n", - " 43/1 1.02305 1.03649 +/- 0.00288\n", - " 44/1 1.07854 1.03773 +/- 0.00305\n", - " 45/1 1.04412 1.03791 +/- 0.00297\n", - " 46/1 1.05139 1.03828 +/- 0.00291\n", - " 47/1 1.05357 1.03870 +/- 0.00286\n", - " 48/1 1.06435 1.03937 +/- 0.00287\n", - " 49/1 1.02632 1.03904 +/- 0.00281\n", - " 50/1 1.05201 1.03936 +/- 0.00276\n", - " 51/1 1.04582 1.03952 +/- 0.00270\n", - " 52/1 1.02056 1.03907 +/- 0.00267\n", - " 53/1 1.06448 1.03966 +/- 0.00267\n", - " 54/1 1.03609 1.03958 +/- 0.00261\n", - " 55/1 1.02701 1.03930 +/- 0.00257\n", - " 56/1 1.04865 1.03950 +/- 0.00252\n", - " 57/1 1.06310 1.04000 +/- 0.00252\n", - " 58/1 1.02975 1.03979 +/- 0.00247\n", - " 59/1 1.03922 1.03978 +/- 0.00242\n", - " 60/1 1.07259 1.04043 +/- 0.00246\n", - " 61/1 1.04555 1.04053 +/- 0.00242\n", - " 62/1 1.01950 1.04013 +/- 0.00240\n", - " 63/1 1.04618 1.04024 +/- 0.00236\n", - " 64/1 1.02489 1.03996 +/- 0.00233\n", - " 65/1 1.06850 1.04048 +/- 0.00235\n", - " 66/1 1.03623 1.04040 +/- 0.00231\n", - " 67/1 0.99892 1.03967 +/- 0.00238\n", - " 68/1 1.05557 1.03995 +/- 0.00236\n", - " 69/1 1.01211 1.03948 +/- 0.00236\n", - " 70/1 1.04679 1.03960 +/- 0.00233\n", - " 71/1 1.03461 1.03952 +/- 0.00229\n", - " 72/1 1.01993 1.03920 +/- 0.00227\n", - " 73/1 1.04742 1.03933 +/- 0.00224\n", - " 74/1 1.05269 1.03954 +/- 0.00222\n", - " 75/1 1.05696 1.03981 +/- 0.00220\n", - " 76/1 1.05904 1.04010 +/- 0.00218\n", - " 77/1 1.05930 1.04039 +/- 0.00217\n", - " 78/1 1.03375 1.04029 +/- 0.00214\n", - " 79/1 1.07044 1.04073 +/- 0.00215\n", - " 80/1 1.04144 1.04074 +/- 0.00212\n", - " 81/1 1.06296 1.04105 +/- 0.00212\n", - " 82/1 1.04630 1.04112 +/- 0.00209\n", - " 83/1 1.03772 1.04108 +/- 0.00206\n", - " 84/1 1.03774 1.04103 +/- 0.00203\n", - " 85/1 1.03984 1.04101 +/- 0.00200\n", - " 86/1 1.03040 1.04087 +/- 0.00198\n", - " 87/1 1.03484 1.04080 +/- 0.00196\n", - " 88/1 1.03820 1.04076 +/- 0.00193\n", - " 89/1 1.04654 1.04084 +/- 0.00191\n", - " 90/1 1.03377 1.04075 +/- 0.00189\n", - " 91/1 1.03370 1.04066 +/- 0.00187\n", - " 92/1 1.04172 1.04067 +/- 0.00184\n", - " 93/1 1.04945 1.04078 +/- 0.00182\n", - " 94/1 1.03360 1.04069 +/- 0.00181\n", - " 95/1 1.06547 1.04099 +/- 0.00181\n", - " 96/1 1.04340 1.04101 +/- 0.00179\n", - " 97/1 1.07502 1.04140 +/- 0.00181\n", - " 98/1 1.05391 1.04155 +/- 0.00179\n", - " 99/1 1.05622 1.04171 +/- 0.00178\n", - " 100/1 1.01519 1.04142 +/- 0.00179\n", - " Creating state point statepoint.100.h5...\n", - "\n", - " ===========================================================================\n", - " ======================> SIMULATION FINISHED <======================\n", - " ===========================================================================\n", - "\n", - "\n", - " =======================> TIMING STATISTICS <=======================\n", - "\n", - " Total time for initialization = 5.2900E-01 seconds\n", - " Reading cross sections = 9.6000E-02 seconds\n", - " Total time in simulation = 3.1874E+02 seconds\n", - " Time in transport only = 3.1866E+02 seconds\n", - " Time in inactive batches = 1.3286E+01 seconds\n", - " Time in active batches = 3.0545E+02 seconds\n", - " Time synchronizing fission bank = 1.1000E-02 seconds\n", - " Sampling source sites = 7.0000E-03 seconds\n", - " SEND/RECV source sites = 3.0000E-03 seconds\n", - " Time accumulating tallies = 2.2000E-02 seconds\n", - " Total time for finalization = 1.7800E-01 seconds\n", - " Total time elapsed = 3.1947E+02 seconds\n", - " Calculation Rate (inactive) = 3763.36 neutrons/second\n", - " Calculation Rate (active) = 1473.24 neutrons/second\n", - "\n", - " ============================> RESULTS <============================\n", - "\n", - " k-effective (Collision) = 1.04100 +/- 0.00169\n", - " k-effective (Track-length) = 1.04142 +/- 0.00179\n", - " k-effective (Absorption) = 1.04380 +/- 0.00147\n", - " Combined k-effective = 1.04287 +/- 0.00130\n", - " Leakage Fraction = 0.00000 +/- 0.00000\n", - "\n" + " 1/1 1.04894 \n", + " 2/1 1.01711 \n", + " 3/1 1.05357 \n", + " 4/1 1.03052 \n", + " 5/1 1.06523 \n", + " 6/1 1.06806 \n", + " 7/1 1.05161 \n", + " 8/1 1.04199 \n", + " 9/1 1.05010 \n", + " 10/1 1.04617 \n", + " 11/1 1.04894 \n", + " 12/1 1.06806 1.05850 +/- 0.00956\n", + " 13/1 1.05002 1.05567 +/- 0.00620\n", + " 14/1 1.03471 1.05043 +/- 0.00683\n", + " 15/1 1.01803 1.04395 +/- 0.00837\n", + " 16/1 1.05588 1.04594 +/- 0.00712\n", + " 17/1 1.07503 1.05010 +/- 0.00731\n", + " 18/1 1.02786 1.04732 +/- 0.00691\n", + " 19/1 1.00071 1.04214 +/- 0.00800\n", + " 20/1 1.05587 1.04351 +/- 0.00729\n", + " 21/1 1.03886 1.04309 +/- 0.00660\n", + " 22/1 1.04335 1.04311 +/- 0.00603\n", + " 23/1 1.04057 1.04292 +/- 0.00555\n", + " 24/1 1.01976 1.04126 +/- 0.00540\n", + " 25/1 1.05811 1.04238 +/- 0.00515\n", + " 26/1 1.02351 1.04120 +/- 0.00496\n", + " 27/1 1.05261 1.04188 +/- 0.00471\n", + " 28/1 1.03355 1.04141 +/- 0.00446\n", + " 29/1 1.02797 1.04071 +/- 0.00428\n", + " 30/1 1.03758 1.04055 +/- 0.00406\n", + " 31/1 1.04883 1.04094 +/- 0.00388\n", + " 32/1 1.03557 1.04070 +/- 0.00371\n", + " 33/1 1.02947 1.04021 +/- 0.00358\n", + " 34/1 1.03651 1.04006 +/- 0.00343\n", + " 35/1 1.03331 1.03979 +/- 0.00330\n", + " 36/1 1.05947 1.04054 +/- 0.00326\n", + " 37/1 1.05093 1.04093 +/- 0.00316\n", + " 38/1 1.06787 1.04189 +/- 0.00319\n", + " 39/1 1.01451 1.04095 +/- 0.00322\n", + " 40/1 1.02351 1.04037 +/- 0.00317\n", + " 41/1 1.04826 1.04062 +/- 0.00307\n", + " 42/1 1.04228 1.04067 +/- 0.00298\n", + " 43/1 1.03214 1.04041 +/- 0.00290\n", + " 44/1 1.04950 1.04068 +/- 0.00282\n", + " 45/1 1.06616 1.04141 +/- 0.00284\n", + " 46/1 1.07039 1.04221 +/- 0.00287\n" ] - }, - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" } ], "source": [ @@ -658,7 +586,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": true @@ -678,27 +606,11 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tally\n", - "\tID =\t10000\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tmesh\t[10000]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t[u'flux', u'fission']\n", - "\tEstimator =\ttracklength\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "tally = sp.get_tally(scores=['flux'])\n", "print(tally)" @@ -713,33 +625,11 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([[[ 0.41271426, 0. ]],\n", - "\n", - " [[ 0.40846766, 0. ]],\n", - "\n", - " [[ 0.4112029 , 0. ]],\n", - "\n", - " ..., \n", - " [[ 0.41437289, 0. ]],\n", - "\n", - " [[ 0.41376468, 0. ]],\n", - "\n", - " [[ 0.41312074, 0. ]]])" - ] - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "tally.sum" ] @@ -753,52 +643,11 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(10000, 1, 2)\n" - ] - }, - { - "data": { - "text/plain": [ - "(array([[[ 0.00458571, 0. ]],\n", - " \n", - " [[ 0.00453853, 0. ]],\n", - " \n", - " [[ 0.00456892, 0. ]],\n", - " \n", - " ..., \n", - " [[ 0.00460414, 0. ]],\n", - " \n", - " [[ 0.00459739, 0. ]],\n", - " \n", - " [[ 0.00459023, 0. ]]]),\n", - " array([[[ 2.02702426e-05, 0.00000000e+00]],\n", - " \n", - " [[ 1.77108625e-05, 0.00000000e+00]],\n", - " \n", - " [[ 1.79568064e-05, 0.00000000e+00]],\n", - " \n", - " ..., \n", - " [[ 1.83114148e-05, 0.00000000e+00]],\n", - " \n", - " [[ 1.69970626e-05, 0.00000000e+00]],\n", - " \n", - " [[ 1.92143217e-05, 0.00000000e+00]]]))" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "print(tally.mean.shape)\n", "(tally.mean, tally.std_dev)" @@ -813,27 +662,11 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Tally\n", - "\tID =\t10000\n", - "\tName =\t\n", - "\tFilters =\t\n", - " \t\tmesh\t[10000]\n", - "\tNuclides =\ttotal \n", - "\tScores =\t[u'flux']\n", - "\tEstimator =\ttracklength\n", - "\n" - ] - } - ], + "outputs": [], "source": [ "flux = tally.get_slice(scores=['flux'])\n", "fission = tally.get_slice(scores=['fission'])\n", @@ -849,7 +682,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "metadata": { "collapsed": false }, @@ -863,32 +696,11 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\ncPmIaKHPh5wAAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "fig = plt.subplot(121)\n", "fig.imshow(flux.mean)\n", @@ -905,22 +717,11 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Determine relative error\n", "relative_error = np.zeros_like(flux.std_dev)\n", @@ -947,29 +748,11 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([ (1.0, [0.08159183470384083, 0.37187405724079425, -0.4569273259677805], [-0.5991379733562734, 0.6213299732428319, -0.5049581697849825], 1.4308796774550836),\n", - " (1.0, [0.08159183470384083, 0.37187405724079425, -0.4569273259677805], [0.6943502674814661, -0.18996972225593808, 0.694110373553384], 1.8499326750790277),\n", - " (1.0, [-0.2283457014858208, -0.3149356437736135, -0.6287339985223156], [0.22841158666373973, -0.9428738529578353, 0.24252225565130936], 2.8993105331976654),\n", - " ...,\n", - " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [0.871391386295745, 0.3866181159860615, 0.30199914615933615], 2.2329770939373517),\n", - " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [-0.4649777417907873, 0.38973845929247963, 0.7949211489119309], 1.6836109244016622),\n", - " (1.0, [-0.20844939420957254, 0.043779246455180054, -0.22209004880139005], [-0.4649777417907873, 0.38973845929247963, 0.7949211489119309], 1.6836109244016622)], \n", - " dtype=[('wgt', '" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Create log-spaced energy bins from 1 keV to 100 MeV\n", "energy_bins = np.logspace(-3,1)\n", @@ -1071,32 +814,11 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/plain": [ - "(-0.5, 0.5)" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "plt.quiver(sp.source['xyz'][:,0], sp.source['xyz'][:,1],\n", " sp.source['uvw'][:,0], sp.source['uvw'][:,1],\n", diff --git a/docs/source/pythonapi/examples/tally-arithmetic.ipynb b/docs/source/pythonapi/examples/tally-arithmetic.ipynb index a0055b8b1..bbd900fdd 100644 --- a/docs/source/pythonapi/examples/tally-arithmetic.ipynb +++ b/docs/source/pythonapi/examples/tally-arithmetic.ipynb @@ -174,7 +174,18 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" + ] + } + ], "source": [ "# Create a Universe to encapsulate a fuel pin\n", "pin_cell_universe = openmc.Universe(name='1.6% Fuel Pin')\n", @@ -212,7 +223,20 @@ "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n", + "/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/universe.py:199: DeprecationWarning: Cell.add_surface(...) has been deprecated and may be removed in a future version. The region for a Cell should be defined using the region property directly.\n" + ] + } + ], "source": [ "# Create root Cell\n", "root_cell = openmc.Cell(name='root cell')\n", @@ -369,7 +393,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDNUMTM6MDI6MDItMDQ6MDCXyx9dAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTAz\nVDEzOjAyOjAyLTA0OjAw5pan4QAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAPoAAAD6AgMAAAD1grKuAAAABGdBTUEAALGPC/xhBQAAAAFzUkdC\nAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAxQTFRF\n////chIS6YCRTb/E6kGE+wAAAAFiS0dEAIgFHUgAAAAJcEhZcwAAAEgAAABIAEbJaz4AAALKSURB\nVGje7dpLcqQwDAbgHHE2YeEj+D4cwQucBUfo+3CEXoSp8OhuhF70T4qpKXmdr21LogK2Pj7A8QmN\nP+HDhw8fPnz48Kf6VH9G+66vy+je8k19jnf8C5dXIPv86ms56lPdjvaYbyodx3ze+XLE76cXFiD4\nzPji99z0/AJ4n1lfvJ6fnl0A6x+578efMSg1wPr172/jPO5yFXM+Ef78gdblM+WPHyguP//t1/g6\npA0wfln+ho/fwgYYn19C/xwDvwHGc9OvC+hs37DTrwuwfWanXxdQTC9Mvyygs3wjTL8uwPJpn/tN\nDbSGz7T0SBEWw4vLXzbQ6b6RoveIoO6TvPxlA63qs7z8ZQPF9F+SH22vbX8OQKf5Rtv+EgDNJ3X5\n8wZaxWd1+fMGiuFvir8bvjp8J/tGy/6jAmRvhW8fwL3vVT+o3grfPoB7r/IpALI3tz8FoJN84/NV\n873hB8UnM3xzANtf8nb4dwmg3grfFEDJO8JPE0i9Ff4pAYL3pI8mkHor/HMCeO9JH00g9SafEsh7\nT/ppARBvp48UwJnelT5SACd7O31TAlnvKx9SQCd7B58KgPO+8iMFuPWe9E8F8BveWX7bAjzX9y4/\n/Jve+fhsH6Ctv7n8PTzjvY/v9gEOHz58+PBX+6v/f/wPvnd54f3j6venE/yl769Xv7+j3x/o98/V\n32/o9+fl389Xnx+g5x/o+Qt6/oOeP6HnX+j5G3z+h54/ouefV5/foufP6Pk3ev4On/+j9w/o/Qd6\n/4Le/6D3T/D9V67Y/ZsVQBq+s+8f0ftP+P41axXguP9NWgDuu/Cdfv+N3r/D9/9TAID+A7T/Ae2/\ngPs/0P4TtP8F7r9J3AIO9P+g/Udw/9Oygbf7r9D+L7j/DO1/Q/vv4P4/tP8Q7n9E+y/h/k+0/xTu\nf4X7b+H+X7T/+BPuf3aM8OHDhw8fPnz4w/4vzcvgeY10sY0AAAAldEVYdGRhdGU6Y3JlYXRlADIw\nMTUtMTAtMDhUMTM6NDI6MDYtMDQ6MDCJhmNxAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEwLTA4\nVDEzOjQyOjA2LTA0OjAw+NvbzQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] @@ -563,6 +587,7 @@ "name": "stdout", "output_type": "stream", "text": [ + "rm: cannot remove ‘statepoint.*’: No such file or directory\n", "\n", " .d88888b. 888b d888 .d8888b.\n", " d88P\" \"Y88b 8888b d8888 d88P Y88b\n", @@ -579,8 +604,8 @@ " Copyright: 2011-2015 Massachusetts Institute of Technology\n", " License: http://mit-crpg.github.io/openmc/license.html\n", " Version: 0.7.0\n", - " Git SHA1: e0c2aace2e73367536fa03e153b67a2d038cd2b3\n", - " Date/Time: 2015-10-03 13:02:02\n", + " Git SHA1: 23535afa1c69644bb299bde18a094c3b99d53ae0\n", + " Date/Time: 2015-10-08 13:42:07\n", " MPI Processes: 1\n", "\n", " ===========================================================================\n", @@ -593,11 +618,11 @@ " Reading materials XML file...\n", " Reading tallies XML file...\n", " Building neighboring cells lists for each surface...\n", + " Loading ACE cross section table: 92235.71c\n", " Loading ACE cross section table: 92238.71c\n", " Loading ACE cross section table: 8016.71c\n", - " Loading ACE cross section table: 92235.71c\n", - " Loading ACE cross section table: 5010.71c\n", " Loading ACE cross section table: 1001.71c\n", + " Loading ACE cross section table: 5010.71c\n", " Loading ACE cross section table: 40090.71c\n", " Initializing source particles...\n", "\n", @@ -607,26 +632,26 @@ "\n", " Bat./Gen. k Average k \n", " ========= ======== ==================== \n", - " 1/1 1.00279 \n", - " 2/1 1.03320 \n", - " 3/1 1.04467 \n", - " 4/1 1.09693 \n", - " 5/1 1.05008 \n", - " 6/1 1.08426 \n", - " 7/1 1.05363 1.06894 +/- 0.01531\n", - " 8/1 0.97961 1.03917 +/- 0.03106\n", - " 9/1 1.06444 1.04549 +/- 0.02285\n", - " 10/1 1.08345 1.05308 +/- 0.01926\n", - " 11/1 1.06871 1.05568 +/- 0.01594\n", - " 12/1 1.03183 1.05228 +/- 0.01390\n", - " 13/1 1.04486 1.05135 +/- 0.01207\n", - " 14/1 1.06468 1.05283 +/- 0.01075\n", - " 15/1 1.04185 1.05173 +/- 0.00968\n", - " 16/1 1.01268 1.04818 +/- 0.00944\n", - " 17/1 1.04129 1.04761 +/- 0.00864\n", - " 18/1 1.01127 1.04481 +/- 0.00843\n", - " 19/1 1.03738 1.04428 +/- 0.00782\n", - " 20/1 1.04410 1.04427 +/- 0.00728\n", + " 1/1 1.05992 \n", + " 2/1 1.05251 \n", + " 3/1 1.05204 \n", + " 4/1 1.02100 \n", + " 5/1 1.07784 \n", + " 6/1 1.04814 \n", + " 7/1 1.02335 1.03574 +/- 0.01239\n", + " 8/1 1.02415 1.03188 +/- 0.00813\n", + " 9/1 1.10331 1.04974 +/- 0.01876\n", + " 10/1 1.05452 1.05069 +/- 0.01456\n", + " 11/1 1.07867 1.05536 +/- 0.01277\n", + " 12/1 1.04203 1.05345 +/- 0.01096\n", + " 13/1 1.04482 1.05237 +/- 0.00955\n", + " 14/1 1.04117 1.05113 +/- 0.00852\n", + " 15/1 1.07581 1.05360 +/- 0.00801\n", + " 16/1 1.04235 1.05257 +/- 0.00731\n", + " 17/1 1.02710 1.05045 +/- 0.00701\n", + " 18/1 1.01970 1.04809 +/- 0.00687\n", + " 19/1 1.01022 1.04538 +/- 0.00691\n", + " 20/1 1.01449 1.04332 +/- 0.00675\n", " Creating state point statepoint.20.h5...\n", "\n", " ===========================================================================\n", @@ -636,27 +661,27 @@ "\n", " =======================> TIMING STATISTICS <=======================\n", "\n", - " Total time for initialization = 4.1600E-01 seconds\n", - " Reading cross sections = 9.1000E-02 seconds\n", - " Total time in simulation = 1.4793E+01 seconds\n", - " Time in transport only = 1.4785E+01 seconds\n", - " Time in inactive batches = 2.1450E+00 seconds\n", - " Time in active batches = 1.2648E+01 seconds\n", + " Total time for initialization = 4.6000E-01 seconds\n", + " Reading cross sections = 1.3900E-01 seconds\n", + " Total time in simulation = 1.6630E+01 seconds\n", + " Time in transport only = 1.6613E+01 seconds\n", + " Time in inactive batches = 2.1710E+00 seconds\n", + " Time in active batches = 1.4459E+01 seconds\n", " Time synchronizing fission bank = 2.0000E-03 seconds\n", - " Sampling source sites = 2.0000E-03 seconds\n", - " SEND/RECV source sites = 0.0000E+00 seconds\n", + " Sampling source sites = 0.0000E+00 seconds\n", + " SEND/RECV source sites = 1.0000E-03 seconds\n", " Time accumulating tallies = 0.0000E+00 seconds\n", " Total time for finalization = 1.0000E-03 seconds\n", - " Total time elapsed = 1.5219E+01 seconds\n", - " Calculation Rate (inactive) = 5827.51 neutrons/second\n", - " Calculation Rate (active) = 2964.90 neutrons/second\n", + " Total time elapsed = 1.7100E+01 seconds\n", + " Calculation Rate (inactive) = 5757.72 neutrons/second\n", + " Calculation Rate (active) = 2593.54 neutrons/second\n", "\n", " ============================> RESULTS <============================\n", "\n", - " k-effective (Collision) = 1.04044 +/- 0.00527\n", - " k-effective (Track-length) = 1.04427 +/- 0.00728\n", - " k-effective (Absorption) = 1.04794 +/- 0.00535\n", - " Combined k-effective = 1.04628 +/- 0.00467\n", + " k-effective (Collision) = 1.03935 +/- 0.00682\n", + " k-effective (Track-length) = 1.04332 +/- 0.00675\n", + " k-effective (Absorption) = 1.03845 +/- 0.00598\n", + " Combined k-effective = 1.04024 +/- 0.00523\n", " Leakage Fraction = 0.00000 +/- 0.00000\n", "\n" ] @@ -696,7 +721,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 27, "metadata": { "collapsed": false, "scrolled": true @@ -716,7 +741,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 28, "metadata": { "collapsed": false, "scrolled": true @@ -739,45 +764,24 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
nuclidescoremeanstd. dev.
0total(nu-fission / absorption)1.0463530.00935
\n", - "
" - ], - "text/plain": [ - " nuclide score mean std. dev.\n", - "0 total (nu-fission / absorption) 1.046353 0.00935" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" + "ename": "AttributeError", + "evalue": "'CrossScore' object has no attribute 'strip'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mfiss_rate\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_tally\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'fiss. rate'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mabs_rate\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_tally\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mname\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'abs. rate'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[0mkeff\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mfiss_rate\u001b[0m \u001b[1;33m/\u001b[0m \u001b[0mabs_rate\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 5\u001b[0m \u001b[0mkeff\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mget_pandas_dataframe\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.pyc\u001b[0m in \u001b[0;36m__div__\u001b[1;34m(self, other)\u001b[0m\n\u001b[0;32m 2051\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2052\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mTally\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 2053\u001b[1;33m \u001b[0mnew_tally\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_outer_product\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbinary_op\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'/'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2054\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2055\u001b[0m \u001b[1;32melif\u001b[0m \u001b[0misinstance\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mother\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mReal\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.pyc\u001b[0m in \u001b[0;36m_outer_product\u001b[1;34m(self, other, binary_op)\u001b[0m\n\u001b[0;32m 1548\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mself_score\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mother_score\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mitertools\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mproduct\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mall_scores\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1549\u001b[0m \u001b[0mnew_score\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mCrossScore\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mself_score\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mother_score\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mbinary_op\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 1550\u001b[1;33m \u001b[0mnew_tally\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd_score\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnew_score\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1551\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1552\u001b[0m \u001b[1;31m# Generate nuclide \"outer products\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m/usr/local/lib/python2.7/dist-packages/openmc-0.7.0-py2.7.egg/openmc/tallies.pyc\u001b[0m in \u001b[0;36madd_score\u001b[1;34m(self, score)\u001b[0m\n\u001b[0;32m 434\u001b[0m \u001b[1;32mreturn\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 435\u001b[0m \u001b[1;32melse\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 436\u001b[1;33m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0m_scores\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mscore\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstrip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 437\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 438\u001b[0m \u001b[1;33m@\u001b[0m\u001b[0mnum_score_bins\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msetter\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mAttributeError\u001b[0m: 'CrossScore' object has no attribute 'strip'" + ] } ], "source": [ @@ -799,49 +803,11 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)totalabsorption0.958730.00774
\n", - "
" - ], - "text/plain": [ - " energy [MeV] nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) total absorption 0.95873 0.00774" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Compute resonance escape probability using tally arithmetic\n", "therm_abs_rate = sp.get_tally(name='therm. abs. rate')\n", @@ -859,47 +825,11 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
nuclidescoremeanstd. dev.
0totalnu-fission1.0916220.011163
\n", - "
" - ], - "text/plain": [ - " nuclide score mean std. dev.\n", - "0 total nu-fission 1.091622 0.011163" - ] - }, - "execution_count": 28, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Compute fast fission factor factor using tally arithmetic\n", "therm_fiss_rate = sp.get_tally(name='therm. fiss. rate')\n", @@ -918,51 +848,11 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
energy [MeV]cellnuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)10000totalabsorption0.8020120.006609
\n", - "
" - ], - "text/plain": [ - " energy [MeV] cell nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) 10000 total absorption 0.802012 0.006609" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Compute thermal flux utilization factor using tally arithmetic\n", "fuel_therm_abs_rate = sp.get_tally(name='fuel therm. abs. rate')\n", @@ -979,49 +869,11 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)total(nu-fission / absorption)1.2466040.011825
\n", - "
" - ], - "text/plain": [ - " energy [MeV] nuclide score mean std. dev.\n", - "0 (0.0e+00 - 6.2e-01) total (nu-fission / absorption) 1.246604 0.011825" - ] - }, - "execution_count": 30, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Compute neutrons produced per absorption (eta) using tally arithmetic\n", "eta = therm_fiss_rate / fuel_therm_abs_rate\n", @@ -1037,52 +889,11 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
energy [MeV]nuclidescoremeanstd. dev.
0(0.0e+00 - 6.2e-01)total(((absorption * nu-fission) * absorption) * (n...1.0463530.01894
\n", - "
" - ], - "text/plain": [ - " energy [MeV] nuclide \\\n", - "0 (0.0e+00 - 6.2e-01) total \n", - "\n", - " score mean std. dev. \n", - "0 (((absorption * nu-fission) * absorption) * (n... 1.046353 0.01894 " - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "keff = res_esc * fast_fiss * therm_util * eta\n", "keff.get_pandas_dataframe()" @@ -1099,7 +910,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "metadata": { "collapsed": false, "scrolled": true @@ -1115,131 +926,11 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
010000(0.0e+00 - 6.3e-07)(U-238 / total)(nu-fission / flux)6.641746e-076.859257e-09
110000(0.0e+00 - 6.3e-07)(U-238 / total)(scatter / flux)2.099861e-011.966887e-03
210000(0.0e+00 - 6.3e-07)(U-235 / total)(nu-fission / flux)3.556665e-013.717881e-03
310000(0.0e+00 - 6.3e-07)(U-235 / total)(scatter / flux)5.554650e-035.218094e-05
410000(6.3e-07 - 2.0e+01)(U-238 / total)(nu-fission / flux)7.165057e-035.625590e-05
510000(6.3e-07 - 2.0e+01)(U-238 / total)(scatter / flux)2.276535e-018.544314e-04
610000(6.3e-07 - 2.0e+01)(U-235 / total)(nu-fission / flux)8.089493e-035.080374e-05
710000(6.3e-07 - 2.0e+01)(U-235 / total)(scatter / flux)3.370111e-031.361116e-05
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide score \\\n", - "0 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (nu-fission / flux) \n", - "1 10000 (0.0e+00 - 6.3e-07) (U-238 / total) (scatter / flux) \n", - "2 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (nu-fission / flux) \n", - "3 10000 (0.0e+00 - 6.3e-07) (U-235 / total) (scatter / flux) \n", - "4 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (nu-fission / flux) \n", - "5 10000 (6.3e-07 - 2.0e+01) (U-238 / total) (scatter / flux) \n", - "6 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (nu-fission / flux) \n", - "7 10000 (6.3e-07 - 2.0e+01) (U-235 / total) (scatter / flux) \n", - "\n", - " mean std. dev. \n", - "0 6.641746e-07 6.859257e-09 \n", - "1 2.099861e-01 1.966887e-03 \n", - "2 3.556665e-01 3.717881e-03 \n", - "3 5.554650e-03 5.218094e-05 \n", - "4 7.165057e-03 5.625590e-05 \n", - "5 2.276535e-01 8.544314e-04 \n", - "6 8.089493e-03 5.080374e-05 \n", - "7 3.370111e-03 1.361116e-05 " - ] - }, - "execution_count": 33, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "fuel_xs = fuel_rxn_rates / flux\n", "fuel_xs.get_pandas_dataframe()" @@ -1254,23 +945,11 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[[ 6.64174599e-07]\n", - " [ 3.55666541e-01]]\n", - "\n", - " [[ 7.16505734e-03]\n", - " [ 8.08949336e-03]]]\n" - ] - } - ], + "outputs": [], "source": [ "# Show how to use Tally.get_values(...) with a CrossScore\n", "nu_fiss_xs = fuel_xs.get_values(scores=['(nu-fission / flux)'])\n", @@ -1286,21 +965,11 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[[ 0.00555465]]\n", - "\n", - " [[ 0.00337011]]]\n" - ] - } - ], + "outputs": [], "source": [ "# Show how to use Tally.get_values(...) with a CrossScore and CrossNuclide\n", "u235_scatter_xs = fuel_xs.get_values(nuclides=['(U-235 / total)'], \n", @@ -1310,20 +979,11 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[[[ 0.22765348]\n", - " [ 0.00337011]]]\n" - ] - } - ], + "outputs": [], "source": [ "# Show how to use Tally.get_values(...) with a CrossFilter and CrossScore\n", "fast_scatter_xs = fuel_xs.get_values(filters=['energy'], \n", @@ -1341,81 +1001,11 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
010000(0.0e+00 - 6.3e-07)U-238nu-fission0.0000021.284890e-08
110000(0.0e+00 - 6.3e-07)U-235nu-fission0.8679827.022256e-03
210000(6.3e-07 - 2.0e+01)U-238nu-fission0.0828016.087096e-04
310000(6.3e-07 - 2.0e+01)U-235nu-fission0.0934845.275039e-04
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide score mean std. dev.\n", - "0 10000 (0.0e+00 - 6.3e-07) U-238 nu-fission 0.000002 1.284890e-08\n", - "1 10000 (0.0e+00 - 6.3e-07) U-235 nu-fission 0.867982 7.022256e-03\n", - "2 10000 (6.3e-07 - 2.0e+01) U-238 nu-fission 0.082801 6.087096e-04\n", - "3 10000 (6.3e-07 - 2.0e+01) U-235 nu-fission 0.093484 5.275039e-04" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# \"Slice\" the nu-fission data into a new derived Tally\n", "nu_fission_rates = fuel_rxn_rates.get_slice(scores=['nu-fission'])\n", @@ -1424,131 +1014,11 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
cellenergy [MeV]nuclidescoremeanstd. dev.
010002(1.0e-08 - 1.1e-07)H-1scatter4.6205250.038249
110002(1.1e-07 - 1.2e-06)H-1scatter2.0368410.013203
210002(1.2e-06 - 1.3e-05)H-1scatter1.6599160.010107
310002(1.3e-05 - 1.4e-04)H-1scatter1.8615460.013328
410002(1.4e-04 - 1.5e-03)H-1scatter2.0496640.008215
510002(1.5e-03 - 1.6e-02)H-1scatter2.1621570.010245
610002(1.6e-02 - 1.7e-01)H-1scatter2.2244960.013796
710002(1.7e-01 - 1.9e+00)H-1scatter1.9975850.009161
810002(1.9e+00 - 2.0e+01)H-1scatter0.3734720.003922
\n", - "
" - ], - "text/plain": [ - " cell energy [MeV] nuclide score mean std. dev.\n", - "0 10002 (1.0e-08 - 1.1e-07) H-1 scatter 4.620525 0.038249\n", - "1 10002 (1.1e-07 - 1.2e-06) H-1 scatter 2.036841 0.013203\n", - "2 10002 (1.2e-06 - 1.3e-05) H-1 scatter 1.659916 0.010107\n", - "3 10002 (1.3e-05 - 1.4e-04) H-1 scatter 1.861546 0.013328\n", - "4 10002 (1.4e-04 - 1.5e-03) H-1 scatter 2.049664 0.008215\n", - "5 10002 (1.5e-03 - 1.6e-02) H-1 scatter 2.162157 0.010245\n", - "6 10002 (1.6e-02 - 1.7e-01) H-1 scatter 2.224496 0.013796\n", - "7 10002 (1.7e-01 - 1.9e+00) H-1 scatter 1.997585 0.009161\n", - "8 10002 (1.9e+00 - 2.0e+01) H-1 scatter 0.373472 0.003922" - ] - }, - "execution_count": 38, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# \"Slice\" the H-1 scatter data in the moderator Cell into a new derived Tally\n", "need_to_slice = sp.get_tally(name='need-to-slice')\n", diff --git a/docs/source/usersguide/input.rst b/docs/source/usersguide/input.rst index b4d153f18..44db25207 100644 --- a/docs/source/usersguide/input.rst +++ b/docs/source/usersguide/input.rst @@ -720,9 +720,8 @@ Geometry Specification -- geometry.xml The geometry in OpenMC is described using `constructive solid geometry`_ (CSG), also sometimes referred to as combinatorial geometry. CSG allows a user to create complex objects using Boolean operators on a set of simpler surfaces. In -the geometry model, each unique closed volume in defined by its bounding -surfaces. In OpenMC, most `quadratic surfaces`_ can be modeled and used as -bounding surfaces. +the geometry model, each unique volume is defined by its bounding surfaces. In +OpenMC, most `quadratic surfaces`_ can be modeled and used as bounding surfaces. Every geometry.xml must have an XML declaration at the beginning of the file and a root element named geometry. Within the root element the user can define any @@ -745,7 +744,7 @@ number of cells, surfaces, and lattices. Let us look at the following example: 1 0 1 - -1 + -1 @@ -763,7 +762,7 @@ could be written as: - + @@ -787,7 +786,8 @@ Each ```` element can have the following attributes or sub-elements: :type: The type of the surfaces. This can be "x-plane", "y-plane", "z-plane", - "plane", "x-cylinder", "y-cylinder", "z-cylinder", or "sphere". + "plane", "x-cylinder", "y-cylinder", "z-cylinder", "sphere", "x-cone", + "y-cone", or "z-cone". *Default*: None @@ -891,15 +891,29 @@ Each ```` element can have the following attributes or sub-elements: *Default*: None - :surfaces: - A list of the ``ids`` for surfaces that bound this cell, e.g. if the cell - is on the negative side of surface 3 and the positive side of surface 5, the - bounding surfaces would be given as "-3 5". + :region: + A Boolean expression of half-spaces that defines the spatial region which + the cell occupies. Each half-space is identified by the unique ID of the + surface prefixed by `-` or `+` to indicate that it is the negative or + positive half-space, respectively. The `+` sign for a positive half-space + can be omitted. Valid Boolean operators are parentheses, union `|`, + complement `~`, and intersection. Intersection is implicit and indicated by + the presence of whitespace. The order of operator precedence is parentheses, + complement, intersection, and then union. - .. note:: The surface attribute/element can be omitted to make a cell fill - its entire universe. + As an example, the following code gives a cell that is the union of the + negative half-space of surface 3 and the complement of the intersection of + the positive half-space of surface 5 and the negative half-space of surface + 2: - *Default*: No surfaces + .. code-block:: xml + + + + .. note:: The ``region`` attribute/element can be omitted to make a cell + fill its entire universe. + + *Default*: A region filling all space. :rotation: If the cell is filled with a universe, this element specifies the angles in @@ -1239,17 +1253,87 @@ The ```` element accepts the following sub-elements: :energy: A monotonically increasing list of bounding **pre-collision** energies for a number of groups. For example, if this filter is specified as - ````, then two energy bins - will be created, one with energies between 0 and 1 MeV and the other - with energies between 1 and 20 MeV. + + .. code-block:: xml + + + + then two energy bins will be created, one with energies between 0 and + 1 MeV and the other with energies between 1 and 20 MeV. :energyout: A monotonically increasing list of bounding **post-collision** energies for a number of groups. For example, if this filter is - specified as ````, then - two post-collision energy bins will be created, one with energies + specified as + + .. code-block:: xml + + + + then two post-collision energy bins will be created, one with energies between 0 and 1 MeV and the other with energies between 1 and 20 MeV. + :mu: + A monotonically increasing list of bounding **post-collision** cosines + of the change in a particle's angle (i.e., :math:`\mu = \hat{\Omega} + \cdot \hat{\Omega}'`), which represents a portion of the possible + values of :math:`[-1,1]`. For example, spanning all of :math:`[-1,1]` + with five equi-width bins can be specified as: + + .. code-block:: xml + + + + Alternatively, if only one value is provided as a bin, OpenMC will + interpret this to mean the complete range of :math:`[-1,1]` should + be automatically subdivided in to the provided value for the bin. + That is, the above example of five equi-width bins spanning + :math:`[-1,1]` can be instead written as: + + .. code-block:: xml + + + + :polar: + A monotonically increasing list of bounding particle polar angles + which represents a portion of the possible values of :math:`[0,\pi]`. + For example, spanning all of :math:`[0,\pi]` with five equi-width + bins can be specified as: + + .. code-block:: xml + + + + Alternatively, if only one value is provided as a bin, OpenMC will + interpret this to mean the complete range of :math:`[0,\pi]` should + be automatically subdivided in to the provided value for the bin. + That is, the above example of five equi-width bins spanning + :math:`[0,\pi]` can be instead written as: + + .. code-block:: xml + + + + :azimuthal: + A monotonically increasing list of bounding particle azimuthal angles + which represents a portion of the possible values of :math:`[-\pi,\pi)`. + For example, spanning all of :math:`[-\pi,\pi)` with two equi-width + bins can be specified as: + + .. code-block:: xml + + + + Alternatively, if only one value is provided as a bin, OpenMC will + interpret this to mean the complete range of :math:`[-\pi,\pi)` should + be automatically subdivided in to the provided value for the bin. + That is, the above example of five equi-width bins spanning + :math:`[-\pi,\pi)` can be instead written as: + + .. code-block:: xml + + + :mesh: The ``id`` of a structured mesh to be tallied over. diff --git a/docs/source/usersguide/output/summary.rst b/docs/source/usersguide/output/summary.rst index 9ced8448a..d37b2172f 100644 --- a/docs/source/usersguide/output/summary.rst +++ b/docs/source/usersguide/output/summary.rst @@ -117,9 +117,9 @@ The current revision of the summary file format is 1. Unique ID of the lattice which fills the cell. Only present if fill_type is set to 'lattice'. -**/geometry/cells/cell /surfaces** (*int[]*) +**/geometry/cells/cell /region** (*char[]*) - Surface specification for the cell. + Region specification for the cell. **/geometry/surfaces/surface /index** (*int*) diff --git a/examples/python/basic/build-xml.py b/examples/python/basic/build-xml.py index fb850f3ad..488603d33 100644 --- a/examples/python/basic/build-xml.py +++ b/examples/python/basic/build-xml.py @@ -1,6 +1,5 @@ import openmc - ############################################################################### # Simulation Input File Parameters ############################################################################### @@ -54,12 +53,11 @@ cell2 = openmc.Cell(cell_id=100, name='cell 2') cell3 = openmc.Cell(cell_id=101, name='cell 3') cell4 = openmc.Cell(cell_id=2, name='cell 4') -# Register Surfaces with Cells -cell1.add_surface(surface=surf2, halfspace=-1) -cell2.add_surface(surface=surf1, halfspace=-1) -cell3.add_surface(surface=surf1, halfspace=+1) -cell4.add_surface(surface=surf2, halfspace=+1) -cell4.add_surface(surface=surf3, halfspace=-1) +# Use surface half-spaces to define regions +cell1.region = -surf2 +cell2.region = -surf1 +cell3.region = +surf1 +cell4.region = +surf2 & -surf3 # Register Materials with Cells cell2.fill = fuel diff --git a/examples/python/boxes/build-xml.py b/examples/python/boxes/build-xml.py new file mode 100644 index 000000000..4bac9fff4 --- /dev/null +++ b/examples/python/boxes/build-xml.py @@ -0,0 +1,134 @@ +import openmc + +############################################################################### +# Simulation Input File Parameters +############################################################################### + +# OpenMC simulation parameters +batches = 15 +inactive = 5 +particles = 10000 + + +############################################################################### +# Exporting to OpenMC materials.xml File +############################################################################### + +# Instantiate some Nuclides +h1 = openmc.Nuclide('H-1') +o16 = openmc.Nuclide('O-16') +u235 = openmc.Nuclide('U-235') +u238 = openmc.Nuclide('U-238') + +# Instantiate some Materials and register the appropriate Nuclides +fuel1 = openmc.Material(material_id=1, name='fuel') +fuel1.set_density('g/cc', 4.5) +fuel1.add_nuclide(u235, 1.) + +fuel2 = openmc.Material(material_id=2, name='depleted fuel') +fuel2.set_density('g/cc', 4.5) +fuel2.add_nuclide(u238, 1.) + +moderator = openmc.Material(material_id=3, name='moderator') +moderator.set_density('g/cc', 1.0) +moderator.add_nuclide(h1, 2.) +moderator.add_nuclide(o16, 1.) +moderator.add_s_alpha_beta('HH2O', '71t') + +# Instantiate a MaterialsFile, register all Materials, and export to XML +materials_file = openmc.MaterialsFile() +materials_file.default_xs = '71c' +materials_file.add_materials([fuel1, fuel2, moderator]) +materials_file.export_to_xml() + + +############################################################################### +# Exporting to OpenMC geometry.xml File +############################################################################### + +# Instantiate planar surfaces +x1 = openmc.XPlane(surface_id=1, x0=-10) +x2 = openmc.XPlane(surface_id=2, x0=-7) +x3 = openmc.XPlane(surface_id=3, x0=-4) +x4 = openmc.XPlane(surface_id=4, x0=4) +x5 = openmc.XPlane(surface_id=5, x0=7) +x6 = openmc.XPlane(surface_id=6, x0=10) +y1 = openmc.YPlane(surface_id=11, y0=-10) +y2 = openmc.YPlane(surface_id=12, y0=-7) +y3 = openmc.YPlane(surface_id=13, y0=-4) +y4 = openmc.YPlane(surface_id=14, y0=4) +y5 = openmc.YPlane(surface_id=15, y0=7) +y6 = openmc.YPlane(surface_id=16, y0=10) +z1 = openmc.ZPlane(surface_id=21, z0=-10) +z2 = openmc.ZPlane(surface_id=22, z0=-7) +z3 = openmc.ZPlane(surface_id=23, z0=-4) +z4 = openmc.ZPlane(surface_id=24, z0=4) +z5 = openmc.ZPlane(surface_id=25, z0=7) +z6 = openmc.ZPlane(surface_id=26, z0=10) + +# Set vacuum boundary conditions on outside +for surface in [x1, x6, y1, y6, z1, z6]: + surface.boundary_type = 'vacuum' + +# Instantiate Cells +inner_box = openmc.Cell(cell_id=1, name='inner box') +middle_box = openmc.Cell(cell_id=2, name='middle box') +outer_box = openmc.Cell(cell_id=3, name='outer box') + +# Use each set of six planes to create solid cube regions. We can then use these +# to create cubic shells. +inner_cube = +x3 & -x4 & +y3 & -y4 & +z3 & -z4 +middle_cube = +x2 & -x5 & +y2 & -y5 & +z2 & -z5 +outer_cube = +x1 & -x6 & +y1 & -y6 & +z1 & -z6 +outside_inner_cube = -x3 | +x4 | -y3 | +y4 | -z3 | +z4 + +# Use surface half-spaces to define regions +inner_box.region = inner_cube +middle_box.region = middle_cube & outside_inner_cube +outer_box.region = outer_cube & ~middle_cube + +# Register Materials with Cells +inner_box.fill = fuel1 +middle_box.fill = fuel2 +outer_box.fill = moderator + +# Instantiate root universe +root = openmc.Universe(universe_id=0, name='root universe') +root.add_cells([inner_box, middle_box, outer_box]) + +# Instantiate a Geometry and register the root Universe +geometry = openmc.Geometry() +geometry.root_universe = root + +# Instantiate a GeometryFile, register Geometry, and export to XML +geometry_file = openmc.GeometryFile() +geometry_file.geometry = geometry +geometry_file.export_to_xml() + + +############################################################################### +# Exporting to OpenMC settings.xml File +############################################################################### + +# Instantiate a SettingsFile, set all runtime parameters, and export to XML +settings_file = openmc.SettingsFile() +settings_file.batches = batches +settings_file.inactive = inactive +settings_file.particles = particles +settings_file.set_source_space('point', [0., 0., 0.]) +settings_file.export_to_xml() + +############################################################################### +# Exporting to OpenMC plots.xml File +############################################################################### + +plot = openmc.Plot(plot_id=1) +plot.origin = [0, 0, 0] +plot.width = [20, 20] +plot.pixels = [200, 200] +plot.color = 'cell' + +# Instantiate a PlotsFile, add Plot, and export to XML +plot_file = openmc.PlotsFile() +plot_file.add_plot(plot) +plot_file.export_to_xml() diff --git a/examples/python/lattice/hexagonal/build-xml.py b/examples/python/lattice/hexagonal/build-xml.py index 5cf8eed06..5fa0f9b1b 100644 --- a/examples/python/lattice/hexagonal/build-xml.py +++ b/examples/python/lattice/hexagonal/build-xml.py @@ -67,15 +67,12 @@ cell4 = openmc.Cell(cell_id=500, name='cell 4') cell5 = openmc.Cell(cell_id=600, name='cell 5') cell6 = openmc.Cell(cell_id=601, name='cell 6') -# Register Surfaces with Cells -cell1.add_surface(left, halfspace=+1) -cell1.add_surface(right, halfspace=-1) -cell1.add_surface(bottom, halfspace=+1) -cell1.add_surface(top, halfspace=-1) -cell2.add_surface(fuel_surf, halfspace=-1) -cell3.add_surface(fuel_surf, halfspace=+1) -cell5.add_surface(fuel_surf, halfspace=-1) -cell6.add_surface(fuel_surf, halfspace=+1) +# Use surface half-spaces to define regions +cell1.region = +left & -right & +bottom & -top +cell2.region = -fuel_surf +cell3.region = +fuel_surf +cell5.region = -fuel_surf +cell6.region = +fuel_surf # Register Materials with Cells cell2.fill = fuel diff --git a/examples/python/lattice/nested/build-xml.py b/examples/python/lattice/nested/build-xml.py index 24b5554c0..501b3ee4b 100644 --- a/examples/python/lattice/nested/build-xml.py +++ b/examples/python/lattice/nested/build-xml.py @@ -66,21 +66,15 @@ cell6 = openmc.Cell(cell_id=202, name='cell 6') cell7 = openmc.Cell(cell_id=301, name='cell 7') cell8 = openmc.Cell(cell_id=302, name='cell 8') -# Register Surfaces with Cells -cell1.add_surface(left, halfspace=+1) -cell1.add_surface(right, halfspace=-1) -cell1.add_surface(bottom, halfspace=+1) -cell1.add_surface(top, halfspace=-1) -cell2.add_surface(left, halfspace=+1) -cell2.add_surface(right, halfspace=-1) -cell2.add_surface(bottom, halfspace=+1) -cell2.add_surface(top, halfspace=-1) -cell3.add_surface(fuel1, halfspace=-1) -cell4.add_surface(fuel1, halfspace=+1) -cell5.add_surface(fuel2, halfspace=-1) -cell6.add_surface(fuel2, halfspace=+1) -cell7.add_surface(fuel3, halfspace=-1) -cell8.add_surface(fuel3, halfspace=+1) +# Use surface half-space to define regions +cell1.region = +left & -right & +bottom & -top +cell2.region = +left & -right & +bottom & -top +cell3.region = -fuel1 +cell4.region = +fuel1 +cell5.region = -fuel2 +cell6.region = +fuel2 +cell7.region = -fuel3 +cell8.region = +fuel3 # Register Materials with Cells cell3.fill = fuel diff --git a/examples/python/lattice/simple/build-xml.py b/examples/python/lattice/simple/build-xml.py index 57e1f1729..00fbea22a 100644 --- a/examples/python/lattice/simple/build-xml.py +++ b/examples/python/lattice/simple/build-xml.py @@ -1,6 +1,5 @@ import openmc - ############################################################################### # Simulation Input File Parameters ############################################################################### @@ -65,17 +64,14 @@ cell5 = openmc.Cell(cell_id=202, name='cell 5') cell6 = openmc.Cell(cell_id=301, name='cell 6') cell7 = openmc.Cell(cell_id=302, name='cell 7') -# Register Surfaces with Cells -cell1.add_surface(left, halfspace=+1) -cell1.add_surface(right, halfspace=-1) -cell1.add_surface(bottom, halfspace=+1) -cell1.add_surface(top, halfspace=-1) -cell2.add_surface(fuel1, halfspace=-1) -cell3.add_surface(fuel1, halfspace=+1) -cell4.add_surface(fuel2, halfspace=-1) -cell5.add_surface(fuel2, halfspace=+1) -cell6.add_surface(fuel3, halfspace=-1) -cell7.add_surface(fuel3, halfspace=+1) +# Use surface half-spaces to define regions +cell1.region = +left & -right & +bottom & -top +cell2.region = -fuel1 +cell3.region = +fuel1 +cell4.region = -fuel2 +cell5.region = +fuel2 +cell6.region = -fuel3 +cell7.region = +fuel3 # Register Materials with Cells cell2.fill = fuel diff --git a/examples/python/pincell/build-xml.py b/examples/python/pincell/build-xml.py index fc9663b90..b3bb932dc 100644 --- a/examples/python/pincell/build-xml.py +++ b/examples/python/pincell/build-xml.py @@ -1,6 +1,5 @@ import openmc - ############################################################################### # Simulation Input File Parameters ############################################################################### @@ -132,17 +131,11 @@ gap = openmc.Cell(cell_id=2, name='cell 2') clad = openmc.Cell(cell_id=3, name='cell 3') water = openmc.Cell(cell_id=4, name='cell 4') -# Register Surfaces with Cells -fuel.add_surface(fuel_or, halfspace=-1) -gap.add_surface(fuel_or, halfspace=+1) -gap.add_surface(clad_ir, halfspace=-1) -clad.add_surface(clad_ir, halfspace=+1) -clad.add_surface(clad_or, halfspace=-1) -water.add_surface(clad_or, halfspace=+1) -water.add_surface(left, halfspace=+1) -water.add_surface(right, halfspace=-1) -water.add_surface(bottom, halfspace=+1) -water.add_surface(top, halfspace=-1) +# Use surface half-spaces to define regions +fuel.region = -fuel_or +gap.region = +fuel_or & -clad_ir +clad.region = +clad_ir & -clad_or +water.region = +clad_or & +left & -right & +bottom & -top # Register Materials with Cells fuel.fill = uo2 diff --git a/examples/python/reflective/build-xml.py b/examples/python/reflective/build-xml.py index 9a182903e..9eab4aec3 100644 --- a/examples/python/reflective/build-xml.py +++ b/examples/python/reflective/build-xml.py @@ -1,6 +1,5 @@ import openmc - ############################################################################### # Simulation Input File Parameters ############################################################################### @@ -52,13 +51,8 @@ surf6.boundary_type = 'reflective' # Instantiate Cell cell = openmc.Cell(cell_id=1, name='cell 1') -# Register Surfaces with Cell -cell.add_surface(surface=surf1, halfspace=+1) -cell.add_surface(surface=surf2, halfspace=-1) -cell.add_surface(surface=surf3, halfspace=+1) -cell.add_surface(surface=surf4, halfspace=-1) -cell.add_surface(surface=surf5, halfspace=+1) -cell.add_surface(surface=surf6, halfspace=-1) +# Use surface half-spaces to define region +cell.region = +surf1 & -surf2 & +surf3 & -surf4 & +surf5 & -surf6 # Register Material with Cell cell.fill = fuel diff --git a/examples/xml/basic/geometry.xml b/examples/xml/basic/geometry.xml index e9483306c..b30884f8c 100644 --- a/examples/xml/basic/geometry.xml +++ b/examples/xml/basic/geometry.xml @@ -2,14 +2,14 @@ - - - - + + + + - + diff --git a/examples/xml/boxes/geometry.xml b/examples/xml/boxes/geometry.xml new file mode 100644 index 000000000..abe4924e6 --- /dev/null +++ b/examples/xml/boxes/geometry.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/xml/boxes/materials.xml b/examples/xml/boxes/materials.xml new file mode 100644 index 000000000..6f6114a7d --- /dev/null +++ b/examples/xml/boxes/materials.xml @@ -0,0 +1,23 @@ + + + + 71c + + + + + + + + + + + + + + + + + + + diff --git a/examples/xml/boxes/plots.xml b/examples/xml/boxes/plots.xml new file mode 100644 index 000000000..b7a3093d2 --- /dev/null +++ b/examples/xml/boxes/plots.xml @@ -0,0 +1,9 @@ + + + + cell + 0. 0. 0. + 20. 20. + 200 200 + + diff --git a/examples/xml/boxes/settings.xml b/examples/xml/boxes/settings.xml new file mode 100644 index 000000000..0ac26ec4d --- /dev/null +++ b/examples/xml/boxes/settings.xml @@ -0,0 +1,16 @@ + + + + + + 15 + 5 + 10000 + + + + + + + + diff --git a/examples/xml/lattice/nested/geometry.xml b/examples/xml/lattice/nested/geometry.xml index 9df9b9e93..324f71cb3 100644 --- a/examples/xml/lattice/nested/geometry.xml +++ b/examples/xml/lattice/nested/geometry.xml @@ -1,14 +1,14 @@ - - - - - - - - + + + + + + + + diff --git a/examples/xml/lattice/simple/geometry.xml b/examples/xml/lattice/simple/geometry.xml index c1f8d7864..bda7246c7 100644 --- a/examples/xml/lattice/simple/geometry.xml +++ b/examples/xml/lattice/simple/geometry.xml @@ -1,13 +1,13 @@ - - - - - - - + + + + + + + 4 4 diff --git a/examples/xml/pincell/geometry.xml b/examples/xml/pincell/geometry.xml index 53cb2f15d..f67f9e74c 100644 --- a/examples/xml/pincell/geometry.xml +++ b/examples/xml/pincell/geometry.xml @@ -19,9 +19,9 @@ - - - - + + + + diff --git a/examples/xml/reflective/geometry.xml b/examples/xml/reflective/geometry.xml index 664ef0705..51cdf1ecb 100644 --- a/examples/xml/reflective/geometry.xml +++ b/examples/xml/reflective/geometry.xml @@ -5,15 +5,15 @@ 0 1 - 1 -2 3 -4 5 -6 + 1 -2 3 -4 5 -6 - + - + - + diff --git a/openmc/clean_xml.py b/openmc/clean_xml.py index 2bb3f39f1..aefd30ac7 100644 --- a/openmc/clean_xml.py +++ b/openmc/clean_xml.py @@ -29,7 +29,7 @@ def sort_xml_elements(tree): comment_elements.append((element, next_element)) # Now iterate over all tags and order the elements within each tag - for tag in tags: + for tag in sorted(list(tags)): # Retrieve all of the elements for this tag try: diff --git a/openmc/filter.py b/openmc/filter.py index eaa30d30e..385ba20cf 100644 --- a/openmc/filter.py +++ b/openmc/filter.py @@ -15,7 +15,8 @@ if sys.version_info[0] >= 3: _FILTER_TYPES = ['universe', 'material', 'cell', 'cellborn', 'surface', - 'mesh', 'energy', 'energyout', 'distribcell'] + 'mesh', 'energy', 'energyout', 'mu', 'polar', 'azimuthal', + 'distribcell'] class Filter(object): """A filter used to constrain a tally to a specific criterion, e.g. only diff --git a/openmc/material.py b/openmc/material.py index 4f60abc67..3ca8f2413 100644 --- a/openmc/material.py +++ b/openmc/material.py @@ -1,4 +1,4 @@ -from collections import Iterable +from collections import Iterable, OrderedDict from copy import deepcopy from numbers import Real, Integral import warnings @@ -64,15 +64,15 @@ class Material(object): self._density = None self._density_units = '' - # A dictionary of Nuclides + # An ordered dictionary of Nuclides (order affects OpenMC results) # Keys - Nuclide names # Values - tuple (nuclide, percent, percent type) - self._nuclides = {} + self._nuclides = OrderedDict() - # A dictionary of Elements + # An ordered dictionary of Elements (order affects OpenMC results) # Keys - Element names # Values - tuple (element, percent, percent type) - self._elements = {} + self._elements = OrderedDict() # If specified, a list of tuples of (table name, xs identifier) self._sab = [] diff --git a/openmc/opencg_compatible.py b/openmc/opencg_compatible.py index 1cdf8e875..019d2aabc 100644 --- a/openmc/opencg_compatible.py +++ b/openmc/opencg_compatible.py @@ -9,6 +9,8 @@ except ImportError: raise ImportError(msg) import openmc +from openmc.region import Intersection +from openmc.surface import Halfspace # A dictionary of all OpenMC Materials created @@ -480,12 +482,24 @@ def get_opencg_cell(openmc_cell): if openmc_cell.translation is not None: opencg_cell.translation = openmc_cell.translation - surfaces = openmc_cell.surfaces - - for surface_id in surfaces: - surface = surfaces[surface_id][0] - halfspace = surfaces[surface_id][1] + # Add surfaces to OpenCG cell from OpenMC cell region. Right now this only + # works if the region is a single half-space or an intersection of + # half-spaces, i.e., no complex cells. + region = openmc_cell.region + if isinstance(region, Halfspace): + surface = region.surface + halfspace = -1 if region.side == '-' else 1 opencg_cell.add_surface(get_opencg_surface(surface), halfspace) + elif isinstance(region, Intersection): + for node in region.nodes: + if not isinstance(node, Halfspace): + raise NotImplementedError("Complex cells not yet supported " + "in OpenCG.") + surface = node.surface + halfspace = -1 if node.side == '-' else 1 + opencg_cell.add_surface(get_opencg_surface(surface), halfspace) + else: + raise NotImplementedError("Complex cells not yet supported in OpenCG.") # Add the OpenMC Cell to the global collection of all OpenMC Cells OPENMC_CELLS[cell_id] = openmc_cell diff --git a/openmc/region.py b/openmc/region.py new file mode 100644 index 000000000..5baac22dd --- /dev/null +++ b/openmc/region.py @@ -0,0 +1,308 @@ +from abc import ABCMeta, abstractmethod +from collections import Iterable + +from openmc.checkvalue import check_type + + +class Region(object): + """Region of space that can be assigned to a cell. + + Region is an abstract base class that is inherited by Halfspace, + Intersection, Union, and Complement. Each of those respective classes are + typically not instantiated directly but rather are created through operators + of the Surface and Region classes. + + """ + + __metaclass__ = ABCMeta + + def __and__(self, other): + return Intersection(self, other) + + def __or__(self, other): + return Union(self, other) + + def __invert__(self): + return Complement(self) + + @abstractmethod + def __str__(self): + return '' + + @staticmethod + def from_expression(expression, surfaces): + """Generate a region given an infix expression. + + Parameters + ---------- + expression : str + Boolean expression relating surface half-spaces. The possible + operators are union '|', intersection ' ', and complement '~'. For + example, '(1 -2) | 3 ~(4 -5)'. + surfaces : dict + Dictionary whose keys are suface IDs that appear in the Boolean + expression and whose values are Surface objects. + + """ + + # Strip leading and trailing whitespace + expression = expression.strip() + + # Convert the string expression into a list of tokens, i.e., operators + # and surface half-spaces, representing the expression in infix + # notation. + i = 0 + i_start = -1 + tokens = [] + while i < len(expression): + if expression[i] in '()|~ ': + # If special character appears immediately after a non-operator, + # create a token with the apporpriate half-space + if i_start >= 0: + j = int(expression[i_start:i]) + if j < 0: + tokens.append(-surfaces[abs(j)]) + else: + tokens.append(+surfaces[abs(j)]) + + if expression[i] in '()|~': + # For everything other than intersection, add the operator + # to the list of tokens + tokens.append(expression[i]) + else: + # Find next non-space character + while expression[i+1] == ' ': + i += 1 + + # If previous token is a halfspace or right parenthesis and next token + # is not a left parenthese or union operator, that implies that the + # whitespace is to be interpreted as an intersection operator + if (i_start >= 0 or tokens[-1] == ')') and \ + expression[i+1] not in ')|': + tokens.append(' ') + + i_start = -1 + else: + # Check for invalid characters + if expression[i] not in '-0123456789': + raise SyntaxError("Invalid character '{}' in expression" + .format(expression[i])) + + # If we haven't yet reached the start of a word, start one + if i_start < 0: + i_start = i + i += 1 + + # If we've reached the end and we're still in a word, create a + # half-space token and add it to the list + if i_start >= 0: + j = int(expression[i_start:]) + if j < 0: + tokens.append(-surfaces[abs(j)]) + else: + tokens.append(+surfaces[abs(j)]) + + # The functions below are used to apply an operator to operands on the + # output queue during the shunting yard algorithm. + def can_be_combined(region): + return isinstance(region, Complement) or hasattr(region, 'surface') + + def apply_operator(output, operator): + r2 = output.pop() + if operator == ' ': + r1 = output.pop() + if isinstance(r1, Intersection) and can_be_combined(r2): + r1.nodes.append(r2) + output.append(r1) + elif isinstance(r2, Intersection) and can_be_combined(r1): + r2.nodes.insert(0, r1) + output.append(r2) + elif isinstance(r1, Intersection) and isinstance(r2, Intersection): + r1.nodes += r2.nodes + output.append(r1) + else: + output.append(Intersection(r1, r2)) + elif operator == '|': + r1 = output.pop() + if isinstance(r1, Union) and can_be_combined(r2): + r1.nodes.append(r2) + output.append(r1) + elif isinstance(r2, Union) and can_be_combined(r1): + r2.nodes.insert(0, r1) + output.append(r2) + elif isinstance(r1, Union) and isinstance(r2, Union): + r1.nodes += r2.nodes + output.append(r1) + else: + output.append(Union(r1, r2)) + elif operator == '~': + output.append(Complement(r2)) + + # The following is an implementation of the shunting yard algorithm to + # generate an abstract syntax tree for the region expression. + output = [] + stack = [] + precedence = {'|': 1, ' ': 2, '~': 3} + associativity = {'|': 'left', ' ': 'left', '~': 'right'} + for token in tokens: + if token in (' ', '|', '~'): + # Normal operators + while stack: + op = stack[-1] + if (op not in ('(', ')') and + ((associativity[token] == 'right' and + precedence[token] < precedence[op]) or + (associativity[token] == 'left' and + precedence[token] <= precedence[op]))): + apply_operator(output, stack.pop()) + else: + break + stack.append(token) + elif token == '(': + # Left parentheses + stack.append(token) + elif token == ')': + # Right parentheses + while stack[-1] != '(': + apply_operator(output, stack.pop()) + if len(stack) == 0: + raise SyntaxError('Mismatched parentheses in ' + 'region specification.') + stack.pop() + else: + # Surface halfspaces + output.append(token) + while stack: + if stack[-1] in '()': + raise SyntaxError('Mismatched parentheses in region ' + 'specification.') + apply_operator(output, stack.pop()) + + # Since we are generating an abstract syntax tree rather than a reverse + # Polish notation expression, the output queue should have a single item + # at the end + return output[0] + + +class Intersection(Region): + """Intersection of two or more regions. + + Instances of Intersection are generally created via the __and__ operator + applied to two instances of Region. This is illustrated in the following + example: + + >>> equator = openmc.surface.ZPlane(z0=0.0) + >>> earth = openmc.surface.Sphere(R=637.1e6) + >>> northern_hemisphere = -earth & +equator + >>> southern_hemisphere = -earth & -equator + >>> type(northern_hemisphere) + + + Parameters + ---------- + *nodes + Regions to take the intersection of + + Attributes + ---------- + nodes : tuple of Region + Regions to take the intersection of + + """ + + def __init__(self, *nodes): + self.nodes = list(nodes) + + @property + def nodes(self): + return self._nodes + + @nodes.setter + def nodes(self, nodes): + check_type('nodes', nodes, Iterable, Region) + self._nodes = nodes + + def __str__(self): + return '(' + ' '.join(map(str, self.nodes)) + ')' + + +class Union(Region): + """Union of two or more regions. + + Instances of Union are generally created via the __or__ operator applied to + two instances of Region. This is illustrated in the following example: + + >>> s1 = openmc.surface.ZPlane(z0=0.0) + >>> s2 = openmc.surface.Sphere(R=637.1e6) + >>> type(-s2 | +s1) + + + Parameters + ---------- + *nodes + Regions to take the union of + + Attributes + ---------- + nodes : tuple of Region + Regions to take the union of + + """ + + def __init__(self, *nodes): + self.nodes = list(nodes) + + @property + def nodes(self): + return self._nodes + + @nodes.setter + def nodes(self, nodes): + check_type('nodes', nodes, Iterable, Region) + self._nodes = nodes + + def __str__(self): + return '(' + ' | '.join(map(str, self.nodes)) + ')' + + +class Complement(Region): + """Complement of a region. + + The Complement of an existing Region can be created by using the __invert__ + operator as the following example demonstrates: + + >>> xl = openmc.surface.XPlane(x0=-10.0) + >>> xr = openmc.surface.XPlane(x0=10.0) + >>> yl = openmc.surface.YPlane(y0=-10.0) + >>> yr = openmc.surface.YPlane(y0=10.0) + >>> inside_box = +xl & -xr & +yl & -yl + >>> outside_box = ~inside_box + >>> type(outside_box) + + + Parameters + ---------- + node : Region + Region to take the complement of + + Attributes + ---------- + node : Region + Regions to take the complement of + + """ + + def __init__(self, node): + self.node = node + + @property + def node(self): + return self._node + + @node.setter + def node(self, node): + check_type('node', node, Region) + self._node = node + + def __str__(self): + return '~' + str(self.node) diff --git a/openmc/summary.py b/openmc/summary.py index 15da2784a..c31a8481c 100644 --- a/openmc/summary.py +++ b/openmc/summary.py @@ -1,6 +1,7 @@ import numpy as np import openmc +from openmc.region import Region class Summary(object): @@ -212,10 +213,10 @@ class Summary(object): else: fill = self._f['geometry/cells'][key]['lattice'].value - if 'surfaces' in self._f['geometry/cells'][key].keys(): - surfaces = self._f['geometry/cells'][key]['surfaces'][...] + if 'region' in self._f['geometry/cells'][key].keys(): + region = self._f['geometry/cells'][key]['region'].value.decode() else: - surfaces = [] + region = [] # Create this Cell cell = openmc.Cell(cell_id=cell_id, name=name) @@ -240,13 +241,10 @@ class Summary(object): # Store Cell fill information for after Universe/Lattice creation self._cell_fills[index] = (fill_type, fill) - # Iterate over all Surfaces and add them to the Cell - for surface_halfspace in surfaces: - - halfspace = np.sign(surface_halfspace) - surface_id = abs(surface_halfspace) - surface = self.get_surface_by_id(surface_id) - cell.add_surface(surface, halfspace) + # Generate Region object given infix expression + if region: + cell.region = Region.from_expression( + region, {s.id: s for s in self.surfaces.values()}) # Add the Cell to the global dictionary of all Cells self.cells[index] = cell diff --git a/openmc/surface.py b/openmc/surface.py index 063787ce3..afa426fa3 100644 --- a/openmc/surface.py +++ b/openmc/surface.py @@ -4,6 +4,7 @@ from xml.etree import ElementTree as ET import sys from openmc.checkvalue import check_type, check_value, check_greater_than +from openmc.region import Region if sys.version_info[0] >= 3: basestring = str @@ -38,17 +39,17 @@ class Surface(object): Attributes ---------- + boundary_type : {'transmission, 'vacuum', 'reflective', 'periodic'} + Boundary condition that defines the behavior for particles hitting the + surface. + coeffs : dict + Dictionary of surface coefficients id : int Unique identifier for the surface name : str Name of the surface type : str Type of the surface, e.g. 'x-plane' - boundary_type : {'transmission, 'vacuum', 'reflective', 'periodic'} - Boundary condition that defines the behavior for particles hitting the - surface. - coeffs : dict - Dictionary of surface coefficients """ @@ -68,6 +69,12 @@ class Surface(object): # proper order self._coeff_keys = [] + def __neg__(self): + return Halfspace(self, '-') + + def __pos__(self): + return Halfspace(self, '+') + @property def id(self): return self._id @@ -940,3 +947,68 @@ class ZCone(Cone): R2, name=name) self._type = 'z-cone' + + +class Halfspace(Region): + """A positive or negative half-space region. + + A half-space is either of the two parts into which a two-dimension surface + divides the three-dimensional Euclidean space. If the equation of the + surface is :math:`f(x,y,z) = 0`, the region for which :math:`f(x,y,z) < 0` + is referred to as the negative half-space and the region for which + :math:`f(x,y,z) > 0` is referred to as the positive half-space. + + Instances of Halfspace are generally not instantiated directly. Rather, they + can be created from an existing Surface through the __neg__ and __pos__ + operators, as the following example demonstrates: + + >>> sphere = openmc.surface.Sphere(surface_id=1, R=10.0) + >>> inside_sphere = -sphere + >>> outside_sphere = +sphere + >>> type(inside_sphere) + + + Parameters + ---------- + surface : Surface + Surface which divides Euclidean space. + side : {'+', '-'} + Indicates whether the positive or negative half-space is used. + + Attributes + ---------- + surface : Surface + Surface which divides Euclidean space. + side : {'+', '-'} + Indicates whether the positive or negative half-space is used. + + """ + + def __init__(self, surface, side): + self.surface = surface + self.side = side + + def __invert__(self): + return -self.surface if self.side == '+' else +self.surface + + @property + def surface(self): + return self._surface + + @surface.setter + def surface(self, surface): + check_type('surface', surface, Surface) + self._surface = surface + + @property + def side(self): + return self._side + + @side.setter + def side(self, side): + check_value('side', side, ('+', '-')) + self._side = side + + def __str__(self): + return '-' + str(self.surface.id) if self.side == '-' \ + else str(self.surface.id) diff --git a/openmc/tallies.py b/openmc/tallies.py index 0bfdc299a..a25004ff9 100644 --- a/openmc/tallies.py +++ b/openmc/tallies.py @@ -432,6 +432,8 @@ class Tally(object): # If the score is already in the Tally, don't add it again if score in self.scores: return + elif isinstance(score, basestring): + self._scores.append(score.strip()) else: self._scores.append(score) @@ -1168,7 +1170,6 @@ class Tally(object): # Append each Filter's DataFrame to the overall DataFrame for filter in self.filters: filter_df = filter.get_pandas_dataframe(data_size, summary) - df = pd.concat([df, filter_df], axis=1) # Include DataFrame column for nuclides if user requested it diff --git a/openmc/universe.py b/openmc/universe.py index ef89780e1..e9f7f3284 100644 --- a/openmc/universe.py +++ b/openmc/universe.py @@ -3,11 +3,14 @@ from collections import OrderedDict, Iterable from numbers import Real, Integral from xml.etree import ElementTree as ET import sys +import warnings import numpy as np import openmc import openmc.checkvalue as cv +from openmc.surface import Halfspace +from openmc.region import Region, Intersection, Complement if sys.version_info[0] >= 3: basestring = str @@ -45,10 +48,8 @@ class Cell(object): Name of the cell fill : Material or Universe or Lattice or 'void' Indicates what the region of space is filled with - surfaces : dict - Dictionary whose keys are surface IDs and values are 2-tuples of a - Surface object and an integer identify whether the positive or negative - half-space is to be used + region : openmc.region.Region + Region of space that is assigned to the cell. rotation : ndarray If the cell is filled with a universe, this array specifies the angles in degrees about the x, y, and z axes that the filled universe should be @@ -67,7 +68,7 @@ class Cell(object): self.name = name self._fill = None self._type = None - self._surfaces = {} + self._region = None self._rotation = None self._translation = None self._offsets = None @@ -96,8 +97,8 @@ class Cell(object): return None @property - def surfaces(self): - return self._surfaces + def region(self): + return self._region @property def rotation(self): @@ -173,6 +174,11 @@ class Cell(object): cv.check_type('cell offsets', offsets, Iterable) self._offsets = offsets + @region.setter + def region(self, region): + cv.check_type('cell region', region, Region) + self._region = region + def add_surface(self, surface, halfspace): """Add a half-space to the list of half-spaces whose intersection defines the cell. @@ -186,6 +192,12 @@ class Cell(object): """ + warnings.simplefilter('always', DeprecationWarning) + warnings.warn("Cell.add_surface(...) has been deprecated and may be " + "removed in a future version. The region for a Cell " + "should be defined using the region property directly.", + DeprecationWarning) + if not isinstance(surface, openmc.Surface): msg = 'Unable to add Surface "{0}" to Cell ID="{1}" since it is ' \ 'not a Surface object'.format(surface, self._id) @@ -196,28 +208,17 @@ class Cell(object): '"{2}" since it is not +/-1'.format(surface, self._id, halfspace) raise ValueError(msg) - # If the Cell does not already contain the Surface, add it - if surface._id not in self._surfaces: - self._surfaces[surface._id] = (surface, halfspace) - - def remove_surface(self, surface): - """Remove the half-space associated with a particular surface. - - Parameters - ---------- - surface : openmc.surface.Surface - Surface to remove from definition - - """ - - if not isinstance(surface, openmc.Surface): - msg = 'Unable to remove Surface "{0}" from Cell ID="{1}" since it is ' \ - 'not a Surface object'.format(surface, self._id) - raise ValueError(msg) - - # If the Cell contains the Surface, delete it - if surface._id in self._surfaces: - del self._surfaces[surface._id] + # If no region has been assigned, simply use the half-space. Otherwise, + # take the intersection of the current region and the half-space + # specified + region = +surface if halfspace == 1 else -surface + if self.region is None: + self.region = region + else: + if isinstance(self.region, Intersection): + self.region.nodes.append(region) + else: + self.region = Intersection(self.region, region) def get_offset(self, path, filter_offset): # Get the current element and remove it from the list @@ -311,13 +312,7 @@ class Cell(object): else: string += '{0: <16}{1}{2}\n'.format('\tFill', '=\t', self._fill) - string += '{0: <16}{1}\n'.format('\tSurfaces', '=\t') - - for surface_id in self._surfaces: - halfspace = self._surfaces[surface_id][1] - string += '{0} '.format(halfspace * surface_id) - - string = string.rstrip(' ') + '\n' + string += '{0: <16}{1}{2}\n'.format('\tRegion', '=\t', self._region) string += '{0: <16}{1}{2}\n'.format('\tRotation', '=\t', self._rotation) @@ -348,26 +343,30 @@ class Cell(object): element.set("fill", str(self._fill)) self._fill.create_xml_subelement(xml_element) - if self._surfaces is not None: - surfaces = '' + if self.region is not None: + # Set the region attribute with the region specification + element.set("region", str(self.region)) - for surface_id in self._surfaces: - # Determine if XML element already includes this Surface - path = './surface[@id=\'{0}\']'.format(surface_id) - test = xml_element.find(path) + # Only surfaces that appear in a region are added to the geometry + # file, so the appropriate check is performed here. First we create + # a function which is called recursively to navigate through the CSG + # tree. When it reaches a leaf (a Halfspace), it creates a + # element for the corresponding surface if none has been created + # thus far. + def create_surface_elements(node, element): + if isinstance(node, Halfspace): + path = './surface[@id=\'{0}\']'.format(node.surface.id) + if xml_element.find(path) is None: + surface_subelement = node.surface.create_xml_subelement() + xml_element.append(surface_subelement) + elif isinstance(node, Complement): + create_surface_elements(node.node, element) + else: + for subnode in node.nodes: + create_surface_elements(subnode, element) - # If the element does not contain the Surface subelement - if test is None: - # Create the XML subelement for this Surface - surface = self._surfaces[surface_id][0] - surface_subelement = surface.create_xml_subelement() - xml_element.append(surface_subelement) - - # Append the halfspace and Surface ID - halfspace = self._surfaces[surface_id][1] - surfaces += '{0} '.format(halfspace * surface_id) - - element.set("surfaces", surfaces.rstrip(' ')) + # Call the recursive function from the top node + create_surface_elements(self.region, xml_element) if self._translation is not None: element.set("translation", ' '.join(map(str, self._translation))) diff --git a/scripts/openmc-update-inputs b/scripts/openmc-update-inputs index f2e5308d0..2a8097854 100755 --- a/scripts/openmc-update-inputs +++ b/scripts/openmc-update-inputs @@ -1,14 +1,15 @@ #!/usr/bin/env python """Update OpenMC's input XML files to the latest format. -Usage information can be obtained by running 'update_inputs.py --help': +Usage information can be obtained by running 'openmc-update-inputs --help': -usage: update_lattices.py [-h] IN [IN ...] +usage: openmc-update-inputs [-h] IN [IN ...] -Update lattices in geometry.xml files to the latest format. This will remove -'outside' attributes/elements and replace them with 'outer' attributes. Note -that this script will not delete the given files; it will append '.original' -to the given files and write new ones. +Update geometry.xml files to the latest format. This will remove 'outside' +attributes/elements from lattices and replace them with 'outer' attributes. For +'cell' elements, any 'surfaces' attributes/elements will be renamed +'region'. Note that this script will not delete the given files; it will append +'.original' to the given files and write new ones. positional arguments: IN Input geometry.xml file(s). @@ -35,9 +36,10 @@ they will be moved to a new file with '.original' appended to their name. Formatting changes that will be made: -geometry.xml: Lattices containing 'outside' attributes/tags will be replaced +geometry.xml: Lattices containing 'outside' attributes/tags will be replaced with lattices containing 'outer' attributes, and the appropriate - cells/universes will be added. + cells/universes will be added. Any 'surfaces' attributes/elements on a cell + will be renamed 'region'. """ @@ -173,9 +175,6 @@ def update_geometry(geometry_root): root = geometry_root was_updated = False - # Ignore files that do not contain lattices. - if all([child.tag != 'lattice' for child in root]): return False - # Get a set of already-used universe and cell ids. uids = get_universe_ids(root) cids = get_cell_ids(root) @@ -233,6 +232,17 @@ def update_geometry(geometry_root): del lat.attrib['width'] was_updated = True + # Change 'surfaces' to 'region' in cell definitions + for cell in root.iter('cell'): + elem = cell.find('surfaces') + if elem is not None: + elem.tag = 'region' + was_updated = True + if 'surfaces' in cell.attrib: + cell.attrib['region'] = cell.attrib['surfaces'] + del cell.attrib['surfaces'] + was_updated = True + return was_updated diff --git a/src/constants.F90 b/src/constants.F90 index 53891cdaa..9237dc2d0 100644 --- a/src/constants.F90 +++ b/src/constants.F90 @@ -87,10 +87,11 @@ module constants ! Logical operators for cell definitions integer, parameter :: & - OP_LEFT_PAREN = huge(0), & ! Left parentheses - OP_RIGHT_PAREN = huge(0) - 1, & ! Right parentheses - OP_UNION = huge(0) - 2, & ! Union operator - OP_DIFFERENCE = huge(0) - 3 ! Difference operator + OP_LEFT_PAREN = huge(0), & ! Left parentheses + OP_RIGHT_PAREN = huge(0) - 1, & ! Right parentheses + OP_COMPLEMENT = huge(0) - 2, & ! Complement operator (~) + OP_INTERSECTION = huge(0) - 3, & ! Intersection operator + OP_UNION = huge(0) - 4 ! Union operator (^) ! Cell types integer, parameter :: & @@ -300,17 +301,20 @@ module constants integer, parameter :: NO_BIN_FOUND = -1 ! Tally filter and map types - integer, parameter :: N_FILTER_TYPES = 9 + integer, parameter :: N_FILTER_TYPES = 12 integer, parameter :: & - FILTER_UNIVERSE = 1, & - FILTER_MATERIAL = 2, & - FILTER_CELL = 3, & - FILTER_CELLBORN = 4, & - FILTER_SURFACE = 5, & - FILTER_MESH = 6, & - FILTER_ENERGYIN = 7, & - FILTER_ENERGYOUT = 8, & - FILTER_DISTRIBCELL = 9 + FILTER_UNIVERSE = 1, & + FILTER_MATERIAL = 2, & + FILTER_CELL = 3, & + FILTER_CELLBORN = 4, & + FILTER_SURFACE = 5, & + FILTER_MESH = 6, & + FILTER_ENERGYIN = 7, & + FILTER_ENERGYOUT = 8, & + FILTER_DISTRIBCELL = 9, & + FILTER_MU = 10, & + FILTER_POLAR = 11, & + FILTER_AZIMUTHAL = 12 ! Mesh types integer, parameter :: & diff --git a/src/geometry.F90 b/src/geometry.F90 index 39d95817b..e1e1b1f44 100644 --- a/src/geometry.F90 +++ b/src/geometry.F90 @@ -2,12 +2,13 @@ module geometry use constants use error, only: fatal_error, warning - use geometry_header, only: Cell, Surface, Universe, Lattice, & + use geometry_header, only: Cell, Universe, Lattice, & &RectLattice, HexLattice use global use output, only: write_message use particle_header, only: LocalCoord, Particle use particle_restart_write, only: write_particle_restart + use surface_header use string, only: to_str use tally, only: score_surface_current @@ -16,59 +17,124 @@ module geometry contains !=============================================================================== -! SIMPLE_CELL_CONTAINS determines whether a given the current coordinates of the -! particle are inside a cell defined as the intersection of a series of surfaces +! CELL_CONTAINS determines if a cell contains the particle at a given +! location. The bounds of the cell are detemined by a logical expression +! involving surface half-spaces. At initialization, the expression was converted +! to RPN notation. +! +! The function is split into two cases, one for simple cells (those involving +! only the intersection of half-spaces) and one for complex cells. Simple cells +! can be evaluated with short circuit evaluation, i.e., as soon as we know that +! one half-space is not satisfied, we can exit. This provides a performance +! benefit for the common case. In complex_cell_contains, we evaluate the RPN +! expression using a stack, similar to how a RPN calculator would work. !=============================================================================== - function simple_cell_contains(c, p) result(in_cell) + pure function cell_contains(c, p) result(in_cell) + type(Cell), intent(in) :: c + type(Particle), intent(in) :: p + logical :: in_cell - type(Cell), pointer :: c - type(Particle), intent(inout) :: p - logical :: in_cell + if (c%simple) then + in_cell = simple_cell_contains(c, p) + else + in_cell = complex_cell_contains(c, p) + end if + end function cell_contains - integer :: i ! index of surfaces in cell - integer :: i_surface ! index in surfaces array (with sign) - logical :: specified_sense ! specified sense of surface in list + pure function simple_cell_contains(c, p) result(in_cell) + type(Cell), intent(in) :: c + type(Particle), intent(in) :: p + logical :: in_cell + + integer :: i + integer :: token logical :: actual_sense ! sense of particle wrt surface - type(Surface), pointer :: s - SURFACE_LOOP: do i = 1, c % n_surfaces - ! Lookup surface - i_surface = c % surfaces(i) - - ! Check if the particle is currently on the specified surface - if (i_surface == p % surface) then - ! Particle is heading into the cell - cycle - elseif (i_surface == -p % surface) then - ! Particle is heading out of the cell - in_cell = .false. - return - end if - - ! Determine the specified sense of the surface in the cell and the actual - ! sense of the particle with respect to the surface - s => surfaces(abs(i_surface)) - actual_sense = sense(p, s) - specified_sense = (c % surfaces(i) > 0) - - ! Compare sense of point to specified sense - if (actual_sense .neqv. specified_sense) then - in_cell = .false. - return - end if - end do SURFACE_LOOP - - ! If we've reached here, then the sense matched on every surface or there - ! are no surfaces. in_cell = .true. - + do i = 1, size(c%rpn) + token = c%rpn(i) + if (token < OP_UNION) then + ! If the token is not an operator, evaluate the sense of particle with + ! respect to the surface and see if the token matches the sense. If the + ! particle's surface attribute is set and matches the token, that + ! overrides the determination based on sense(). + if (token == p%surface) then + cycle + elseif (-token == p%surface) then + in_cell = .false. + exit + else + actual_sense = surfaces(abs(token))%obj%sense(& + p%coord(p%n_coord)%xyz, p%coord(p%n_coord)%uvw) + if (actual_sense .neqv. (token > 0)) then + in_cell = .false. + exit + end if + end if + end if + end do end function simple_cell_contains + pure function complex_cell_contains(c, p) result(in_cell) + type(Cell), intent(in) :: c + type(Particle), intent(in) :: p + logical :: in_cell + + integer :: i + integer :: token + integer :: i_stack + logical :: actual_sense ! sense of particle wrt surface + logical :: stack(size(c%rpn)) + + i_stack = 0 + do i = 1, size(c%rpn) + token = c%rpn(i) + + ! If the token is a binary operator (intersection/union), apply it to + ! the last two items on the stack. If the token is a unary operator + ! (complement), apply it to the last item on the stack. + select case (token) + case (OP_UNION) + stack(i_stack - 1) = stack(i_stack - 1) .or. stack(i_stack) + i_stack = i_stack - 1 + case (OP_INTERSECTION) + stack(i_stack - 1) = stack(i_stack - 1) .and. stack(i_stack) + i_stack = i_stack - 1 + case (OP_COMPLEMENT) + stack(i_stack) = .not. stack(i_stack) + case default + ! If the token is not an operator, evaluate the sense of particle with + ! respect to the surface and see if the token matches the sense. If the + ! particle's surface attribute is set and matches the token, that + ! overrides the determination based on sense(). + i_stack = i_stack + 1 + if (token == p%surface) then + stack(i_stack) = .true. + elseif (-token == p%surface) then + stack(i_stack) = .false. + else + actual_sense = surfaces(abs(token))%obj%sense(& + p%coord(p%n_coord)%xyz, p%coord(p%n_coord)%uvw) + stack(i_stack) = (actual_sense .eqv. (token > 0)) + end if + end select + end do + + if (i_stack == 1) then + ! The one remaining logical on the stack indicates whether the particle is + ! in the cell. + in_cell = stack(i_stack) + else + ! This case occurs if there is no region specification since i_stack will + ! still be zero. + in_cell = .true. + end if + end function complex_cell_contains !=============================================================================== ! CHECK_CELL_OVERLAP checks for overlapping cells at the current particle's -! position using simple_cell_contains and the LocalCoord's built up by find_cell +! position using cell_contains and the LocalCoord's built up by find_cell !=============================================================================== subroutine check_cell_overlap(p) @@ -95,7 +161,7 @@ contains index_cell = univ % cells(i) c => cells(index_cell) - if (simple_cell_contains(c, p)) then + if (cell_contains(c, p)) then ! the particle should only be contained in one cell per level if (index_cell /= p % coord(j) % cell) then call fatal_error("Overlapping cells detected: " & @@ -164,7 +230,7 @@ contains c => cells(index_cell) ! Move on to the next cell if the particle is not inside this cell - if (.not. simple_cell_contains(c, p)) cycle + if (.not. cell_contains(c, p)) cycle ! Set cell on this level p % coord(j) % cell = index_cell @@ -273,28 +339,19 @@ contains !=============================================================================== subroutine cross_surface(p, last_cell) - type(Particle), intent(inout) :: p integer, intent(in) :: last_cell ! last cell particle was in - real(8) :: x ! x-x0 for sphere - real(8) :: y ! y-y0 for sphere - real(8) :: z ! z-z0 for sphere - real(8) :: R ! radius of sphere real(8) :: u ! x-component of direction real(8) :: v ! y-component of direction real(8) :: w ! z-component of direction - real(8) :: n1 ! x-component of surface normal - real(8) :: n2 ! y-component of surface normal - real(8) :: n3 ! z-component of surface normal - real(8) :: dot_prod ! dot product of direction and normal real(8) :: norm ! "norm" of surface normal integer :: i_surface ! index in surfaces logical :: found ! particle found in universe? - type(Surface), pointer :: surf + class(Surface), pointer :: surf i_surface = abs(p % surface) - surf => surfaces(i_surface) + surf => surfaces(i_surface)%obj if (verbosity >= 10 .or. trace) then call write_message(" Crossing surface " // trim(to_str(surf % id))) end if @@ -351,131 +408,15 @@ contains p % coord(1) % xyz = p % coord(1) % xyz + TINY_BIT * p % coord(1) % uvw end if - ! Copy particle's direction cosines - u = p % coord(1) % uvw(1) - v = p % coord(1) % uvw(2) - w = p % coord(1) % uvw(3) + ! Reflect particle off surface + call surf%reflect(p%coord(1)%xyz, p%coord(1)%uvw) - select case (surf%type) - case (SURF_PX) - u = -u - - case (SURF_PY) - v = -v - - case (SURF_PZ) - w = -w - - case (SURF_PLANE) - ! Find surface coefficients and norm of vector normal to surface - n1 = surf % coeffs(1) - n2 = surf % coeffs(2) - n3 = surf % coeffs(3) - norm = n1*n1 + n2*n2 + n3*n3 - dot_prod = u*n1 + v*n2 + w*n3 - - ! Reflect direction according to normal - u = u - 2*dot_prod*n1/norm - v = v - 2*dot_prod*n2/norm - w = w - 2*dot_prod*n3/norm - - case (SURF_CYL_X) - ! Find y-y0, z-z0 and dot product of direction and surface normal - y = p % coord(1) % xyz(2) - surf % coeffs(1) - z = p % coord(1) % xyz(3) - surf % coeffs(2) - R = surf % coeffs(3) - dot_prod = v*y + w*z - - ! Reflect direction according to normal - v = v - 2*dot_prod*y/(R*R) - w = w - 2*dot_prod*z/(R*R) - - case (SURF_CYL_Y) - ! Find x-x0, z-z0 and dot product of direction and surface normal - x = p % coord(1) % xyz(1) - surf % coeffs(1) - z = p % coord(1) % xyz(3) - surf % coeffs(2) - R = surf % coeffs(3) - dot_prod = u*x + w*z - - ! Reflect direction according to normal - u = u - 2*dot_prod*x/(R*R) - w = w - 2*dot_prod*z/(R*R) - - case (SURF_CYL_Z) - ! Find x-x0, y-y0 and dot product of direction and surface normal - x = p % coord(1) % xyz(1) - surf % coeffs(1) - y = p % coord(1) % xyz(2) - surf % coeffs(2) - R = surf % coeffs(3) - dot_prod = u*x + v*y - - ! Reflect direction according to normal - u = u - 2*dot_prod*x/(R*R) - v = v - 2*dot_prod*y/(R*R) - - case (SURF_SPHERE) - ! Find x-x0, y-y0, z-z0 and dot product of direction and surface - ! normal - x = p % coord(1) % xyz(1) - surf % coeffs(1) - y = p % coord(1) % xyz(2) - surf % coeffs(2) - z = p % coord(1) % xyz(3) - surf % coeffs(3) - R = surf % coeffs(4) - dot_prod = u*x + v*y + w*z - - ! Reflect direction according to normal - u = u - 2*dot_prod*x/(R*R) - v = v - 2*dot_prod*y/(R*R) - w = w - 2*dot_prod*z/(R*R) - - case (SURF_CONE_X) - ! Find x-x0, y-y0, z-z0 and dot product of direction and surface - ! normal - x = p % coord(1) % xyz(1) - surf % coeffs(1) - y = p % coord(1) % xyz(2) - surf % coeffs(2) - z = p % coord(1) % xyz(3) - surf % coeffs(3) - R = surf % coeffs(4) - dot_prod = (v*y + w*z - R*u*x)/((R + ONE)*R*x*x) - - ! Reflect direction according to normal - u = u + 2*dot_prod*R*x - v = v - 2*dot_prod*y - w = w - 2*dot_prod*z - - case (SURF_CONE_Y) - ! Find x-x0, y-y0, z-z0 and dot product of direction and surface - ! normal - x = p % coord(1) % xyz(1) - surf % coeffs(1) - y = p % coord(1) % xyz(2) - surf % coeffs(2) - z = p % coord(1) % xyz(3) - surf % coeffs(3) - R = surf % coeffs(4) - dot_prod = (u*x + w*z - R*v*y)/((R + ONE)*R*y*y) - - ! Reflect direction according to normal - u = u - 2*dot_prod*x - v = v + 2*dot_prod*R*y - w = w - 2*dot_prod*z - - case (SURF_CONE_Z) - ! Find x-x0, y-y0, z-z0 and dot product of direction and surface - ! normal - x = p % coord(1) % xyz(1) - surf % coeffs(1) - y = p % coord(1) % xyz(2) - surf % coeffs(2) - z = p % coord(1) % xyz(3) - surf % coeffs(3) - R = surf % coeffs(4) - dot_prod = (u*x + v*y - R*w*z)/((R + ONE)*R*z*z) - - ! Reflect direction according to normal - u = u - 2*dot_prod*x - v = v - 2*dot_prod*y - w = w + 2*dot_prod*R*z - - case default - call fatal_error("Reflection not supported for surface " & - &// trim(to_str(surf % id))) - end select - - ! Set new particle direction + ! Make sure new particle direction is normalized + u = p%coord(1)%uvw(1) + v = p%coord(1)%uvw(2) + w = p%coord(1)%uvw(3) norm = sqrt(u*u + v*v + w*w) - p % coord(1) % uvw = [u, v, w] / norm + p%coord(1)%uvw(:) = [u, v, w] / norm ! Reassign particle's cell and surface p % coord(1) % cell = last_cell @@ -507,18 +448,18 @@ contains ! ========================================================================== ! SEARCH NEIGHBOR LISTS FOR NEXT CELL - if (p % surface > 0 .and. allocated(surf % neighbor_pos)) then + if (p % surface > 0 .and. allocated(surf%neighbor_pos)) then ! If coming from negative side of surface, search all the neighboring ! cells on the positive side - call find_cell(p, found, surf % neighbor_pos) + call find_cell(p, found, surf%neighbor_pos) if (found) return - elseif (p % surface < 0 .and. allocated(surf % neighbor_neg)) then + elseif (p % surface < 0 .and. allocated(surf%neighbor_neg)) then ! If coming from positive side of surface, search all the neighboring ! cells on the negative side - call find_cell(p, found, surf % neighbor_neg) + call find_cell(p, found, surf%neighbor_neg) if (found) return end if @@ -546,8 +487,8 @@ contains if (.not. found) then call handle_lost_particle(p, "After particle " // trim(to_str(p % id)) & - &// " crossed surface " // trim(to_str(surfaces(i_surface) % id)) & - &// " it could not be located in any cell and it did not leak.") + // " crossed surface " // trim(to_str(surf%id)) & + // " it could not be located in any cell and it did not leak.") return end if end if @@ -633,7 +574,6 @@ contains subroutine distance_to_boundary(p, dist, surface_crossed, lattice_translation, & next_level) - type(Particle), intent(inout) :: p real(8), intent(out) :: dist integer, intent(out) :: surface_crossed @@ -657,13 +597,9 @@ contains real(8) :: d_lat ! distance to lattice boundary real(8) :: d_surf ! distance to surface real(8) :: x0,y0,z0 ! coefficients for surface - real(8) :: r ! radius for quadratic surfaces - real(8) :: tmp ! dot product of surface normal with direction - real(8) :: a,b,c,k ! quadratic equation coefficients - real(8) :: quad ! discriminant of quadratic equation - logical :: on_surface ! is particle on surface? + logical :: coincident ! is particle on surface? type(Cell), pointer :: cl - type(Surface), pointer :: surf + class(Surface), pointer :: surf class(Lattice), pointer :: lat ! inialize distance to infinity (huge) @@ -688,427 +624,26 @@ contains ! ======================================================================= ! FIND MINIMUM DISTANCE TO SURFACE IN THIS CELL - SURFACE_LOOP: do i = 1, cl % n_surfaces + SURFACE_LOOP: do i = 1, size(cl%region) + index_surf = cl%region(i) + coincident = (index_surf == p % surface) - ! copy local coordinates of particle - x = p % coord(j) % xyz(1) - y = p % coord(j) % xyz(2) - z = p % coord(j) % xyz(3) - - ! check for coincident surface -- note that we can't skip the - ! calculation in general because a particle could be on one side of a - ! cylinder and still have a positive distance to the other - - index_surf = cl % surfaces(i) - if (index_surf == p % surface) then - on_surface = .true. - else - on_surface = .false. - end if - - ! check for operators + ! ignore this token if it corresponds to an operator rather than a + ! region. index_surf = abs(index_surf) - if (index_surf >= OP_DIFFERENCE) cycle + if (index_surf >= OP_UNION) cycle - ! get pointer to surface - surf => surfaces(index_surf) + ! Calculate distance to surface + surf => surfaces(index_surf)%obj + d = surf%distance(p%coord(j)%xyz, p%coord(j)%uvw, coincident) - ! TODO: Can probably combines a lot of the cases to reduce repetition - ! since the algorithm is the same for (x-plane, y-plane, z-plane), - ! (x-cylinder, y-cylinder, z-cylinder), etc. - - select case (surf % type) - case (SURF_PX) - if (on_surface .or. u == ZERO) then - d = INFINITY - else - x0 = surf % coeffs(1) - d = (x0 - x)/u - if (d < ZERO) d = INFINITY - end if - - case (SURF_PY) - if (on_surface .or. v == ZERO) then - d = INFINITY - else - y0 = surf % coeffs(1) - d = (y0 - y)/v - if (d < ZERO) d = INFINITY - end if - - case (SURF_PZ) - if (on_surface .or. w == ZERO) then - d = INFINITY - else - z0 = surf % coeffs(1) - d = (z0 - z)/w - if (d < ZERO) d = INFINITY - end if - - case (SURF_PLANE) - A = surf % coeffs(1) - B = surf % coeffs(2) - C = surf % coeffs(3) - D = surf % coeffs(4) - - tmp = A*u + B*v + C*w - if (on_surface .or. tmp == ZERO) then - d = INFINITY - else - d = -(A*x + B*y + C*z - D)/tmp - if (d < ZERO) d = INFINITY - end if - - case (SURF_CYL_X) - a = ONE - u*u ! v^2 + w^2 - if (a == ZERO) then - d = INFINITY - else - y0 = surf % coeffs(1) - z0 = surf % coeffs(2) - r = surf % coeffs(3) - - y = y - y0 - z = z - z0 - k = y*v + z*w - c = y*y + z*z - r*r - quad = k*k - a*c - - if (quad < ZERO) then - ! no intersection with cylinder - - d = INFINITY - - elseif (on_surface) then - ! particle is on the cylinder, thus one distance is - ! positive/negative and the other is zero. The sign of k - ! determines if we are facing in or out - - if (k >= ZERO) then - d = INFINITY - else - d = (-k + sqrt(quad))/a - end if - - elseif (c < ZERO) then - ! particle is inside the cylinder, thus one distance must be - ! negative and one must be positive. The positive distance - ! will be the one with negative sign on sqrt(quad) - - d = (-k + sqrt(quad))/a - - else - ! particle is outside the cylinder, thus both distances are - ! either positive or negative. If positive, the smaller - ! distance is the one with positive sign on sqrt(quad) - - d = (-k - sqrt(quad))/a - if (d < ZERO) d = INFINITY - - end if - end if - - case (SURF_CYL_Y) - a = ONE - v*v ! u^2 + w^2 - if (a == ZERO) then - d = INFINITY - else - x0 = surf % coeffs(1) - z0 = surf % coeffs(2) - r = surf % coeffs(3) - - x = x - x0 - z = z - z0 - k = x*u + z*w - c = x*x + z*z - r*r - quad = k*k - a*c - - if (quad < ZERO) then - ! no intersection with cylinder - - d = INFINITY - - elseif (on_surface) then - ! particle is on the cylinder, thus one distance is - ! positive/negative and the other is zero. The sign of k - ! determines if we are facing in or out - - if (k >= ZERO) then - d = INFINITY - else - d = (-k + sqrt(quad))/a - end if - - elseif (c < ZERO) then - ! particle is inside the cylinder, thus one distance must be - ! negative and one must be positive. The positive distance - ! will be the one with negative sign on sqrt(quad) - - d = (-k + sqrt(quad))/a - - else - ! particle is outside the cylinder, thus both distances are - ! either positive or negative. If positive, the smaller - ! distance is the one with positive sign on sqrt(quad) - - d = (-k - sqrt(quad))/a - if (d < ZERO) d = INFINITY - - end if - end if - - case (SURF_CYL_Z) - a = ONE - w*w ! u^2 + v^2 - if (a == ZERO) then - d = INFINITY - else - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - r = surf % coeffs(3) - - x = x - x0 - y = y - y0 - k = x*u + y*v - c = x*x + y*y - r*r - quad = k*k - a*c - - if (quad < ZERO) then - ! no intersection with cylinder - - d = INFINITY - - elseif (on_surface) then - ! particle is on the cylinder, thus one distance is - ! positive/negative and the other is zero. The sign of k - ! determines if we are facing in or out - - if (k >= ZERO) then - d = INFINITY - else - d = (-k + sqrt(quad))/a - end if - - elseif (c < ZERO) then - ! particle is inside the cylinder, thus one distance must be - ! negative and one must be positive. The positive distance - ! will be the one with negative sign on sqrt(quad) - - d = (-k + sqrt(quad))/a - - else - ! particle is outside the cylinder, thus both distances are - ! either positive or negative. If positive, the smaller - ! distance is the one with positive sign on sqrt(quad) - - d = (-k - sqrt(quad))/a - if (d <= ZERO) d = INFINITY - - end if - end if - - case (SURF_SPHERE) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - - x = x - x0 - y = y - y0 - z = z - z0 - k = x*u + y*v + z*w - c = x*x + y*y + z*z - r*r - quad = k*k - c - - if (quad < ZERO) then - ! no intersection with sphere - - d = INFINITY - - elseif (on_surface) then - ! particle is on the sphere, thus one distance is - ! positive/negative and the other is zero. The sign of k - ! determines if we are facing in or out - - if (k >= ZERO) then - d = INFINITY - else - d = -k + sqrt(quad) - end if - - elseif (c < ZERO) then - ! particle is inside the sphere, thus one distance must be - ! negative and one must be positive. The positive distance will - ! be the one with negative sign on sqrt(quad) - - d = -k + sqrt(quad) - - else - ! particle is outside the sphere, thus both distances are either - ! positive or negative. If positive, the smaller distance is the - ! one with positive sign on sqrt(quad) - - d = -k - sqrt(quad) - if (d < ZERO) d = INFINITY - - end if - - case (SURF_CONE_X) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - - x = x - x0 - y = y - y0 - z = z - z0 - a = v*v + w*w - r*u*u - k = y*v + z*w - r*x*u - c = y*y + z*z - r*x*x - quad = k*k - a*c - - if (quad < ZERO) then - ! no intersection with cone - - d = INFINITY - - elseif (on_surface) then - ! particle is on the cone, thus one distance is positive/negative - ! and the other is zero. The sign of k determines which distance is - ! zero and which is not. - - if (k >= ZERO) then - d = (-k - sqrt(quad))/a - else - d = (-k + sqrt(quad))/a - end if - - else - ! calculate both solutions to the quadratic - quad = sqrt(quad) - d = (-k - quad)/a - b = (-k + quad)/a - - ! determine the smallest positive solution - if (d < ZERO) then - if (b > ZERO) then - d = b - end if - else - if (b > ZERO) d = min(d, b) - end if - end if - - ! If the distance was negative, set boundary distance to infinity - if (d <= ZERO) d = INFINITY - - case (SURF_CONE_Y) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - - x = x - x0 - y = y - y0 - z = z - z0 - a = u*u + w*w - r*v*v - k = x*u + z*w - r*y*v - c = x*x + z*z - r*y*y - quad = k*k - a*c - - if (quad < ZERO) then - ! no intersection with cone - - d = INFINITY - - elseif (on_surface) then - ! particle is on the cone, thus one distance is positive/negative - ! and the other is zero. The sign of k determines which distance is - ! zero and which is not. - - if (k >= ZERO) then - d = (-k - sqrt(quad))/a - else - d = (-k + sqrt(quad))/a - end if - - else - ! calculate both solutions to the quadratic - quad = sqrt(quad) - d = (-k - quad)/a - b = (-k + quad)/a - - ! determine the smallest positive solution - if (d < ZERO) then - if (b > ZERO) then - d = b - end if - else - if (b > ZERO) d = min(d, b) - end if - end if - - ! If the distance was negative, set boundary distance to infinity - if (d <= ZERO) d = INFINITY - - case (SURF_CONE_Z) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - - x = x - x0 - y = y - y0 - z = z - z0 - a = u*u + v*v - r*w*w - k = x*u + y*v - r*z*w - c = x*x + y*y - r*z*z - quad = k*k - a*c - - if (quad < ZERO) then - ! no intersection with cone - - d = INFINITY - - elseif (on_surface) then - ! particle is on the cone, thus one distance is positive/negative - ! and the other is zero. The sign of k determines which distance is - ! zero and which is not. - - if (k >= ZERO) then - d = (-k - sqrt(quad))/a - else - d = (-k + sqrt(quad))/a - end if - - else - ! calculate both solutions to the quadratic - quad = sqrt(quad) - d = (-k - quad)/a - b = (-k + quad)/a - - ! determine the smallest positive solution - if (d < ZERO) then - if (b > ZERO) then - d = b - end if - else - if (b > ZERO) d = min(d, b) - end if - end if - - ! If the distance was negative, set boundary distance to infinity - if (d <= ZERO) d = INFINITY - - end select - - ! Check is calculated distance is new minimum + ! Check if calculated distance is new minimum if (d < d_surf) then if (abs(d - d_surf)/d_surf >= FP_PRECISION) then d_surf = d - level_surf_cross = -cl % surfaces(i) + level_surf_cross = -cl % region(i) end if end if - end do SURFACE_LOOP ! ======================================================================= @@ -1329,133 +864,6 @@ contains end subroutine distance_to_boundary -!=============================================================================== -! SENSE determines whether a point is on the 'positive' or 'negative' side of a -! surface. This routine is crucial for determining what cell a particular point -! is in. -!=============================================================================== - - recursive function sense(p, surf) result(s) - - type(Particle), intent(inout) :: p - type(Surface), pointer :: surf ! surface - logical :: s ! sense of particle - - integer :: j - real(8) :: x,y,z ! coordinates of particle - real(8) :: func ! surface function evaluated at point - real(8) :: A ! coefficient on x for plane - real(8) :: B ! coefficient on y for plane - real(8) :: C ! coefficient on z for plane - real(8) :: D ! coefficient for plane - real(8) :: x0,y0,z0 ! coefficients for quadratic surfaces / box - real(8) :: r ! radius for quadratic surfaces - - j = p % n_coord - x = p % coord(j) % xyz(1) - y = p % coord(j) % xyz(2) - z = p % coord(j) % xyz(3) - - select case (surf % type) - case (SURF_PX) - x0 = surf % coeffs(1) - func = x - x0 - - case (SURF_PY) - y0 = surf % coeffs(1) - func = y - y0 - - case (SURF_PZ) - z0 = surf % coeffs(1) - func = z - z0 - - case (SURF_PLANE) - A = surf % coeffs(1) - B = surf % coeffs(2) - C = surf % coeffs(3) - D = surf % coeffs(4) - func = A*x + B*y + C*z - D - - case (SURF_CYL_X) - y0 = surf % coeffs(1) - z0 = surf % coeffs(2) - r = surf % coeffs(3) - y = y - y0 - z = z - z0 - func = y*y + z*z - r*r - - case (SURF_CYL_Y) - x0 = surf % coeffs(1) - z0 = surf % coeffs(2) - r = surf % coeffs(3) - x = x - x0 - z = z - z0 - func = x*x + z*z - r*r - - case (SURF_CYL_Z) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - r = surf % coeffs(3) - x = x - x0 - y = y - y0 - func = x*x + y*y - r*r - - case (SURF_SPHERE) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - x = x - x0 - y = y - y0 - z = z - z0 - func = x*x + y*y + z*z - r*r - - case (SURF_CONE_X) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - x = x - x0 - y = y - y0 - z = z - z0 - func = y*y + z*z - r*x*x - - case (SURF_CONE_Y) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - x = x - x0 - y = y - y0 - z = z - z0 - func = x*x + z*z - r*y*y - - case (SURF_CONE_Z) - x0 = surf % coeffs(1) - y0 = surf % coeffs(2) - z0 = surf % coeffs(3) - r = surf % coeffs(4) - x = x - x0 - y = y - y0 - z = z - z0 - func = x*x + y*y - r*z*z - - end select - - ! Check which side of surface the point is on - if (abs(func) < FP_COINCIDENT) then - ! Particle may be coincident with this surface. Artifically move the - ! particle forward a tiny bit. - p % coord(j) % xyz = p % coord(j) % xyz + TINY_BIT * p % coord(j) % uvw - s = sense(p, surf) - elseif (func > 0) then - s = .true. - else - s = .false. - end if - - end function sense - !=============================================================================== ! NEIGHBOR_LISTS builds a list of neighboring cells to each surface to speed up ! searches when a cell boundary is crossed. @@ -1469,8 +877,7 @@ contains integer, allocatable :: count_positive(:) ! # of cells on positive side integer, allocatable :: count_negative(:) ! # of cells on negative side logical :: positive ! positive side specified in surface list - type(Cell), pointer :: c - type(Surface), pointer :: surf + type(Cell), pointer :: c call write_message("Building neighboring cells lists for each surface...", & &4) @@ -1483,11 +890,15 @@ contains do i = 1, n_cells c => cells(i) - ! loop over each surface specification - do j = 1, c % n_surfaces - i_surface = c % surfaces(j) + ! loop over each region specification + do j = 1, size(c%region) + i_surface = c % region(j) positive = (i_surface > 0) + + ! Skip any tokens that correspond to operators rather than regions i_surface = abs(i_surface) + if (i_surface >= OP_UNION) cycle + if (positive) then count_positive(i_surface) = count_positive(i_surface) + 1 else @@ -1498,12 +909,11 @@ contains ! allocate neighbor lists for each surface do i = 1, n_surfaces - surf => surfaces(i) if (count_positive(i) > 0) then - allocate(surf%neighbor_pos(count_positive(i))) + allocate(surfaces(i)%obj%neighbor_pos(count_positive(i))) end if if (count_negative(i) > 0) then - allocate(surf%neighbor_neg(count_negative(i))) + allocate(surfaces(i)%obj%neighbor_neg(count_negative(i))) end if end do @@ -1514,19 +924,21 @@ contains do i = 1, n_cells c => cells(i) - ! loop over each surface specification - do j = 1, c % n_surfaces - i_surface = c % surfaces(j) + ! loop through the region specification + do j = 1, size(c%region) + i_surface = c % region(j) positive = (i_surface > 0) - i_surface = abs(i_surface) - surf => surfaces(i_surface) + ! Skip any tokens that correspond to operators rather than regions + i_surface = abs(i_surface) + if (i_surface >= OP_UNION) cycle + if (positive) then count_positive(i_surface) = count_positive(i_surface) + 1 - surf%neighbor_pos(count_positive(i_surface)) = i + surfaces(i_surface)%obj%neighbor_pos(count_positive(i_surface)) = i else count_negative(i_surface) = count_negative(i_surface) + 1 - surf%neighbor_neg(count_negative(i_surface)) = i + surfaces(i_surface)%obj%neighbor_neg(count_negative(i_surface)) = i end if end do end do diff --git a/src/geometry_header.F90 b/src/geometry_header.F90 index 93e5dd1fd..20e437cac 100644 --- a/src/geometry_header.F90 +++ b/src/geometry_header.F90 @@ -113,22 +113,6 @@ module geometry_header class(Lattice), allocatable :: obj end type LatticeContainer -!=============================================================================== -! SURFACE type defines a first- or second-order surface that can be used to -! construct closed volumes (cells) -!=============================================================================== - - type Surface - integer :: id ! Unique ID - character(len=52) :: name = "" ! User-defined name - integer :: type ! Type of surface - real(8), allocatable :: coeffs(:) ! Definition of surface - integer, allocatable :: & - neighbor_pos(:), & ! List of cells on positive side - neighbor_neg(:) ! List of cells on negative side - integer :: bc ! Boundary condition - end type Surface - !=============================================================================== ! CELL defines a closed volume by its bounding surfaces !=============================================================================== @@ -144,14 +128,13 @@ module geometry_header ! the geom integer :: material ! Material within cell (0 for ! universe) - integer :: n_surfaces ! Number of surfaces within integer, allocatable :: offset (:) ! Distribcell offset for tally ! counter - integer, allocatable :: & - & surfaces(:) ! List of surfaces bounding cell - ! -- note that parentheses, union, - ! etc operators will be listed here - ! too + integer, allocatable :: region(:) ! Definition of spatial region as + ! Boolean expression of half-spaces + integer, allocatable :: rpn(:) ! Reverse Polish notation for region + ! expression + logical :: simple ! Is the region simple (intersections only) ! Rotation matrix and translation vector real(8), allocatable :: translation(:) diff --git a/src/global.F90 b/src/global.F90 index 398b72e14..87d727829 100644 --- a/src/global.F90 +++ b/src/global.F90 @@ -6,11 +6,12 @@ module global use cmfd_header use constants use dict_header, only: DictCharInt, DictIntInt - use geometry_header, only: Cell, Universe, Lattice, LatticeContainer, Surface + use geometry_header, only: Cell, Universe, Lattice, LatticeContainer use material_header, only: Material use mesh_header, only: RegularMesh use plot_header, only: ObjectPlot use set_header, only: SetInt + use surface_header, only: SurfaceContainer use source_header, only: ExtSource use tally_header, only: TallyObject, TallyMap, TallyResult use trigger_header, only: KTrigger @@ -27,12 +28,12 @@ module global ! GEOMETRY-RELATED VARIABLES ! Main arrays - type(Cell), allocatable, target :: cells(:) - type(Universe), allocatable, target :: universes(:) - type(LatticeContainer), allocatable, target :: lattices(:) - type(Surface), allocatable, target :: surfaces(:) - type(Material), allocatable, target :: materials(:) - type(ObjectPlot), allocatable, target :: plots(:) + type(Cell), allocatable, target :: cells(:) + type(Universe), allocatable, target :: universes(:) + type(LatticeContainer), allocatable, target :: lattices(:) + type(SurfaceContainer), allocatable, target :: surfaces(:) + type(Material), allocatable, target :: materials(:) + type(ObjectPlot), allocatable, target :: plots(:) ! Size of main arrays integer :: n_cells ! # of cells diff --git a/src/initialize.F90 b/src/initialize.F90 index 86242c753..ca92595c2 100644 --- a/src/initialize.F90 +++ b/src/initialize.F90 @@ -568,15 +568,18 @@ contains do i = 1, n_cells ! ======================================================================= - ! ADJUST SURFACE LIST FOR EACH CELL + ! ADJUST REGION SPECIFICATION FOR EACH CELL c => cells(i) - do j = 1, c%n_surfaces - id = c%surfaces(j) - if (id < OP_DIFFERENCE) then + do j = 1, size(c%region) + id = c%region(j) + ! Make sure that only regions are checked. Since OP_UNION is the + ! operator with the lowest integer value, anything below it must denote + ! a half-space + if (id < OP_UNION) then if (surface_dict%has_key(abs(id))) then i_array = surface_dict%get_key(abs(id)) - c%surfaces(j) = sign(i_array, id) + c%region(j) = sign(i_array, id) else call fatal_error("Could not find surface " // trim(to_str(abs(id)))& &// " specified on cell " // trim(to_str(c%id))) @@ -584,6 +587,16 @@ contains end if end do + ! Also adjust the indices in the reverse Polish notation + do j = 1, size(c%rpn) + id = c%rpn(j) + ! Again, make sure that only regions are checked + if (id < OP_UNION) then + i_array = surface_dict%get_key(abs(id)) + c%rpn(j) = sign(i_array, id) + end if + end do + ! ======================================================================= ! ADJUST UNIVERSE INDEX FOR EACH CELL diff --git a/src/input_xml.F90 b/src/input_xml.F90 index 3899d43f0..6d15f0d20 100644 --- a/src/input_xml.F90 +++ b/src/input_xml.F90 @@ -5,15 +5,17 @@ module input_xml use dict_header, only: DictIntInt, ElemKeyValueCI use energy_grid, only: grid_method, n_log_bins use error, only: fatal_error, warning - use geometry_header, only: Cell, Surface, Lattice, RectLattice, HexLattice + use geometry_header, only: Cell, Lattice, RectLattice, HexLattice use global use list_header, only: ListChar, ListReal use mesh_header, only: RegularMesh use output, only: write_message use plot_header use random_lcg, only: prn + use surface_header + use stl_vector, only: VectorInt use string, only: to_lower, to_str, str_to_int, str_to_real, & - starts_with, ends_with + starts_with, ends_with, tokenize use tally_header, only: TallyObject, TallyFilter use tally_initialize, only: add_tallies use xml_interface @@ -987,13 +989,15 @@ contains integer :: coeffs_reqd integer, allocatable :: temp_int_array(:) real(8) :: phi, theta, psi + real(8), allocatable :: coeffs(:) logical :: file_exists logical :: boundary_exists character(MAX_LINE_LEN) :: filename character(MAX_WORD_LEN) :: word - type(Cell), pointer :: c => null() - type(Surface), pointer :: s => null() - class(Lattice), pointer :: lat => null() + character(MAX_LINE_LEN) :: region_spec + type(Cell), pointer :: c + class(Surface), pointer :: s + class(Lattice), pointer :: lat type(Node), pointer :: doc => null() type(Node), pointer :: node_cell => null() type(Node), pointer :: node_surf => null() @@ -1002,6 +1006,8 @@ contains type(NodeList), pointer :: node_surf_list => null() type(NodeList), pointer :: node_rlat_list => null() type(NodeList), pointer :: node_hlat_list => null() + type(VectorInt) :: tokens + type(VectorInt) :: rpn ! Display output message call write_message("Reading geometry XML file...", 5) @@ -1112,17 +1118,42 @@ contains call fatal_error("Cannot specify material and fill simultaneously") end if - ! Allocate array for surfaces and copy + ! Check for region specification (also under deprecated name surfaces) + region_spec = '' if (check_for_node(node_cell, "surfaces")) then - n = get_arraysize_integer(node_cell, "surfaces") - else - n = 0 + call warning("The use of 'surfaces' is deprecated and will be & + &disallowed in a future release. Use 'region' instead. The & + &openmc-update-inputs utility can be used to automatically & + &update geometry.xml files.") + call get_node_value(node_cell, "surfaces", region_spec) + elseif (check_for_node(node_cell, "region")) then + call get_node_value(node_cell, "region", region_spec) end if - c % n_surfaces = n - if (n > 0) then - allocate(c % surfaces(n)) - call get_node_array(node_cell, "surfaces", c % surfaces) + if (len_trim(region_spec) > 0) then + ! Create surfaces array from string + call tokenize(region_spec, tokens) + + ! Use shunting-yard algorithm to determine RPN for surface algorithm + call generate_rpn(c%id, tokens, rpn) + + ! Copy region spec and RPN form to cell arrays + allocate(c % region(tokens%size())) + allocate(c % rpn(rpn%size())) + c % region(:) = tokens%data(1:tokens%size()) + c % rpn(:) = rpn%data(1:rpn%size()) + + call tokens%clear() + call rpn%clear() + end if + if (.not. allocated(c%region)) allocate(c%region(0)) + if (.not. allocated(c%rpn)) allocate(c%rpn(0)) + + ! Check if this is a simple cell + if (any(c%rpn == OP_COMPLEMENT) .or. any(c%rpn == OP_UNION)) then + c%simple = .false. + else + c%simple = .true. end if ! Rotation matrix @@ -1222,71 +1253,71 @@ contains allocate(surfaces(n_surfaces)) do i = 1, n_surfaces - s => surfaces(i) - ! Get pointer to i-th surface node call get_list_item(node_surf_list, i, node_surf) - ! Copy data into cells - if (check_for_node(node_surf, "id")) then - call get_node_value(node_surf, "id", s % id) - else - call fatal_error("Must specify id of surface in geometry XML file.") - end if - - ! Check to make sure 'id' hasn't been used - if (surface_dict % has_key(s % id)) then - call fatal_error("Two or more surfaces use the same unique ID: " & - &// to_str(s % id)) - end if - - ! Copy surface name - if (check_for_node(node_surf, "name")) then - call get_node_value(node_surf, "name", s % name) - end if - ! Copy and interpret surface type word = '' if (check_for_node(node_surf, "type")) & call get_node_value(node_surf, "type", word) select case(to_lower(word)) case ('x-plane') - s % type = SURF_PX coeffs_reqd = 1 + allocate(SurfaceXPlane :: surfaces(i)%obj) case ('y-plane') - s % type = SURF_PY coeffs_reqd = 1 + allocate(SurfaceYPlane :: surfaces(i)%obj) case ('z-plane') - s % type = SURF_PZ coeffs_reqd = 1 + allocate(SurfaceZPlane :: surfaces(i)%obj) case ('plane') - s % type = SURF_PLANE coeffs_reqd = 4 + allocate(SurfacePlane :: surfaces(i)%obj) case ('x-cylinder') - s % type = SURF_CYL_X coeffs_reqd = 3 + allocate(SurfaceXCylinder :: surfaces(i)%obj) case ('y-cylinder') - s % type = SURF_CYL_Y coeffs_reqd = 3 + allocate(SurfaceYCylinder :: surfaces(i)%obj) case ('z-cylinder') - s % type = SURF_CYL_Z coeffs_reqd = 3 + allocate(SurfaceZCylinder :: surfaces(i)%obj) case ('sphere') - s % type = SURF_SPHERE coeffs_reqd = 4 + allocate(SurfaceSphere :: surfaces(i)%obj) case ('x-cone') - s % type = SURF_CONE_X coeffs_reqd = 4 + allocate(SurfaceXCone :: surfaces(i)%obj) case ('y-cone') - s % type = SURF_CONE_Y coeffs_reqd = 4 + allocate(SurfaceYCone :: surfaces(i)%obj) case ('z-cone') - s % type = SURF_CONE_Z coeffs_reqd = 4 + allocate(SurfaceZCone :: surfaces(i)%obj) case default call fatal_error("Invalid surface type: " // trim(word)) end select + s => surfaces(i)%obj + + ! Copy data into cells + if (check_for_node(node_surf, "id")) then + call get_node_value(node_surf, "id", s%id) + else + call fatal_error("Must specify id of surface in geometry XML file.") + end if + + ! Check to make sure 'id' hasn't been used + if (surface_dict % has_key(s%id)) then + call fatal_error("Two or more surfaces use the same unique ID: " & + &// to_str(s%id)) + end if + + ! Copy surface name + if (check_for_node(node_surf, "name")) then + call get_node_value(node_surf, "name", s%name) + end if + ! Check to make sure that the proper number of coefficients ! have been specified for the given type of surface. Then copy ! surface coordinates. @@ -1294,36 +1325,84 @@ contains n = get_arraysize_double(node_surf, "coeffs") if (n < coeffs_reqd) then call fatal_error("Not enough coefficients specified for surface: " & - &// trim(to_str(s % id))) + &// trim(to_str(s%id))) elseif (n > coeffs_reqd) then call fatal_error("Too many coefficients specified for surface: " & - &// trim(to_str(s % id))) - else - allocate(s % coeffs(n)) - call get_node_array(node_surf, "coeffs", s % coeffs) + &// trim(to_str(s%id))) end if + allocate(coeffs(n)) + call get_node_array(node_surf, "coeffs", coeffs) + + select type(s) + type is (SurfaceXPlane) + s%x0 = coeffs(1) + type is (SurfaceYPlane) + s%y0 = coeffs(1) + type is (SurfaceZPlane) + s%z0 = coeffs(1) + type is (SurfacePlane) + s%A = coeffs(1) + s%B = coeffs(2) + s%C = coeffs(3) + s%D = coeffs(4) + type is (SurfaceXCylinder) + s%y0 = coeffs(1) + s%z0 = coeffs(2) + s%r = coeffs(3) + type is (SurfaceYCylinder) + s%x0 = coeffs(1) + s%z0 = coeffs(2) + s%r = coeffs(3) + type is (SurfaceZCylinder) + s%x0 = coeffs(1) + s%y0 = coeffs(2) + s%r = coeffs(3) + type is (SurfaceSphere) + s%x0 = coeffs(1) + s%y0 = coeffs(2) + s%z0 = coeffs(3) + s%r = coeffs(4) + type is (SurfaceXCone) + s%x0 = coeffs(1) + s%y0 = coeffs(2) + s%z0 = coeffs(3) + s%r2 = coeffs(4) + type is (SurfaceYCone) + s%x0 = coeffs(1) + s%y0 = coeffs(2) + s%z0 = coeffs(3) + s%r2 = coeffs(4) + type is (SurfaceZCone) + s%x0 = coeffs(1) + s%y0 = coeffs(2) + s%z0 = coeffs(3) + s%r2 = coeffs(4) + end select + + ! No longer need coefficients + deallocate(coeffs) + ! Boundary conditions word = '' if (check_for_node(node_surf, "boundary")) & call get_node_value(node_surf, "boundary", word) select case (to_lower(word)) case ('transmission', 'transmit', '') - s % bc = BC_TRANSMIT + s%bc = BC_TRANSMIT case ('vacuum') - s % bc = BC_VACUUM + s%bc = BC_VACUUM boundary_exists = .true. case ('reflective', 'reflect', 'reflecting') - s % bc = BC_REFLECT + s%bc = BC_REFLECT boundary_exists = .true. case default call fatal_error("Unknown boundary condition '" // trim(word) // & - &"' specified on surface " // trim(to_str(s % id))) + &"' specified on surface " // trim(to_str(s%id))) end select ! Add surface to dictionary - call surface_dict % add_key(s % id, i) - + call surface_dict % add_key(s%id, i) end do ! Check to make sure a boundary condition was applied to at least one @@ -2085,6 +2164,9 @@ contains integer :: imomstr ! Index of MOMENT_STRS & MOMENT_N_STRS logical :: file_exists ! does tallies.xml file exist? real(8) :: rarray3(3) ! temporary double prec. array + integer :: Nangle ! Number of angular bins + real(8) :: dangle ! Mu spacing if using automatic allocation + integer :: iangle ! Loop counter for building mu filter bins character(MAX_LINE_LEN) :: filename character(MAX_WORD_LEN) :: word character(MAX_WORD_LEN) :: score_name @@ -2352,8 +2434,9 @@ contains ! Determine number of bins if (check_for_node(node_filt, "bins")) then - if (trim(temp_str) == 'energy' .or. & - trim(temp_str) == 'energyout') then + if (temp_str == 'energy' .or. temp_str == 'energyout' .or. & + temp_str == 'mu' .or. temp_str == 'polar' .or. & + temp_str == 'azimuthal') then n_words = get_arraysize_double(node_filt, "bins") else n_words = get_arraysize_integer(node_filt, "bins") @@ -2489,6 +2572,103 @@ contains ! Set to analog estimator t % estimator = ESTIMATOR_ANALOG + case ('mu') + ! Set type of filter + t % filters(j) % type = FILTER_MU + + ! Set number of bins + t % filters(j) % n_bins = n_words - 1 + + ! Allocate and store bins + allocate(t % filters(j) % real_bins(n_words)) + call get_node_array(node_filt, "bins", t % filters(j) % real_bins) + + ! Allow a user to input a lone number which will mean that + ! you subivide [-1,1] evenly with the input being the number of bins + if (n_words == 1) then + Nangle = int(t % filters(j) % real_bins(1)) + if (Nangle > 1) then + t % filters(j) % n_bins = Nangle + dangle = TWO / real(Nangle,8) + deallocate(t % filters(j) % real_bins) + allocate(t % filters(j) % real_bins(Nangle + 1)) + do iangle = 1, Nangle + t % filters(j) % real_bins(iangle) = -ONE + (iangle - 1) * dangle + end do + t % filters(j) % real_bins(Nangle + 1) = ONE + else + call fatal_error("Number of bins for mu filter must be& + & greater than 1 on tally " // trim(to_str(t % id)) // ".") + end if + + end if + + ! Set to analog estimator + t % estimator = ESTIMATOR_ANALOG + + case ('polar') + ! Set type of filter + t % filters(j) % type = FILTER_POLAR + + ! Set number of bins + t % filters(j) % n_bins = n_words - 1 + + ! Allocate and store bins + allocate(t % filters(j) % real_bins(n_words)) + call get_node_array(node_filt, "bins", t % filters(j) % real_bins) + + ! Allow a user to input a lone number which will mean that + ! you subivide [0,pi] evenly with the input being the number of bins + if (n_words == 1) then + Nangle = int(t % filters(j) % real_bins(1)) + if (Nangle > 1) then + t % filters(j) % n_bins = Nangle + dangle = PI / real(Nangle,8) + deallocate(t % filters(j) % real_bins) + allocate(t % filters(j) % real_bins(Nangle + 1)) + do iangle = 1, Nangle + t % filters(j) % real_bins(iangle) = (iangle - 1) * dangle + end do + t % filters(j) % real_bins(Nangle + 1) = PI + else + call fatal_error("Number of bins for polar filter must be& + & greater than 1 on tally " // trim(to_str(t % id)) // ".") + end if + + end if + + case ('azimuthal') + ! Set type of filter + t % filters(j) % type = FILTER_AZIMUTHAL + + ! Set number of bins + t % filters(j) % n_bins = n_words - 1 + + ! Allocate and store bins + allocate(t % filters(j) % real_bins(n_words)) + call get_node_array(node_filt, "bins", t % filters(j) % real_bins) + + ! Allow a user to input a lone number which will mean that + ! you sub-divide [-pi,pi) evenly with the input being the number of + ! bins + if (n_words == 1) then + Nangle = int(t % filters(j) % real_bins(1)) + if (Nangle > 1) then + t % filters(j) % n_bins = Nangle + dangle = TWO * PI / real(Nangle,8) + deallocate(t % filters(j) % real_bins) + allocate(t % filters(j) % real_bins(Nangle + 1)) + do iangle = 1, Nangle + t % filters(j) % real_bins(iangle) = -PI + (iangle - 1) * dangle + end do + t % filters(j) % real_bins(Nangle + 1) = PI + else + call fatal_error("Number of bins for azimuthal filter must be& + & greater than 1 on tally " // trim(to_str(t % id)) // ".") + end if + + end if + case default ! Specified tally filter is invalid, raise error call fatal_error("Unknown filter type '" & @@ -2658,6 +2838,7 @@ contains ! scores then strip off the n and store it as an integer to be used ! later. Then perform the select case on this modified (number ! removed) string + n_order = -1 score_name = sarray(l) do imomstr = 1, size(MOMENT_STRS) if (starts_with(score_name,trim(MOMENT_STRS(imomstr)))) then @@ -2703,6 +2884,23 @@ contains end do end if + ! Check to see if the mu filter is applied and if that makes sense. + if ((.not. starts_with(score_name,'scatter')) .and. & + (.not. starts_with(score_name,'nu-scatter'))) then + if (t % find_filter(FILTER_MU) > 0) then + call fatal_error("Cannot tally " // trim(score_name) //" with a & + &change of angle (mu) filter.") + end if + ! Also check to see if this is a legendre expansion or not. + ! If so, we can accept this score and filter combo for p0, but not + ! elsewhere. + else if (n_order > 0) then + if (t % find_filter(FILTER_MU) > 0) then + call fatal_error("Cannot tally " // trim(score_name) //" with a & + &change of angle (mu) filter unless order is 0.") + end if + end if + select case (trim(score_name)) case ('flux') ! Prohibit user from tallying flux for an individual nuclide @@ -4716,4 +4914,91 @@ contains 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 +! the infix notation. +!=============================================================================== + + subroutine generate_rpn(cell_id, tokens, output) + integer, intent(in) :: cell_id + type(VectorInt), intent(in) :: tokens ! infix notation + type(VectorInt), intent(inout) :: output ! RPN notation + + integer :: i + integer :: token + integer :: op + type(VectorInt) :: stack + + do i = 1, tokens%size() + token = tokens%data(i) + + if (token < OP_UNION) then + ! If token is not an operator, add it to output + call output%push_back(token) + + elseif (token < OP_RIGHT_PAREN) then + ! Regular operators union, intersection, complement + do while (stack%size() > 0) + op = stack%data(stack%size()) + + if (op < OP_RIGHT_PAREN .and. & + ((token == OP_COMPLEMENT .and. token < op) .or. & + (token /= OP_COMPLEMENT .and. token <= op))) then + ! While there is an operator, op, on top of the stack, if the token + ! is left-associative and its precedence is less than or equal to + ! that of op or if the token is right-associative and its precedence + ! is less than that of op, move op to the output queue and push the + ! token on to the stack. Note that only complement is + ! right-associative. + call output%push_back(op) + call stack%pop_back() + else + exit + end if + end do + + call stack%push_back(token) + + elseif (token == OP_LEFT_PAREN) then + ! If the token is a left parenthesis, push it onto the stack + call stack%push_back(token) + + else + ! If the token is a right parenthesis, move operators from the stack to + ! the output queue until reaching the left parenthesis. + do + ! If we run out of operators without finding a left parenthesis, it + ! means there are mismatched parentheses. + if (stack%size() == 0) then + call fatal_error('Mimatched parentheses in region specification & + &for cell ' // trim(to_str(cell_id)) // '.') + end if + + op = stack%data(stack%size()) + if (op == OP_LEFT_PAREN) exit + call output%push_back(op) + call stack%pop_back() + end do + + ! Pop the left parenthesis. + call stack%pop_back() + end if + end do + + ! While there are operators on the stack, move them to the output queue + do while (stack%size() > 0) + op = stack%data(stack%size()) + + ! If the operator is a parenthesis, it is mismatched + if (op >= OP_RIGHT_PAREN) then + call fatal_error('Mimatched parentheses in region specification & + &for cell ' // trim(to_str(cell_id)) // '.') + end if + + call output%push_back(op) + call stack%pop_back() + end do + end subroutine generate_rpn + end module input_xml diff --git a/src/math.F90 b/src/math.F90 index 826172fa2..6b96baa0d 100644 --- a/src/math.F90 +++ b/src/math.F90 @@ -181,7 +181,6 @@ contains if (uvw(1) == ZERO) then phi = ZERO else -! phi = atan(uvw(2) / uvw(1)) phi = atan2(uvw(2), uvw(1)) end if @@ -192,364 +191,364 @@ contains rn(1) = ONE case (1) ! l = 1, m = -1 - rn(1) = ONE*sqrt(w2m1) * sin(phi) + rn(1) = -(ONE*sqrt(w2m1) * sin(phi)) ! l = 1, m = 0 rn(2) = ONE * w ! l = 1, m = 1 - rn(3) = ONE*sqrt(w2m1) * cos(phi) + rn(3) = -(ONE*sqrt(w2m1) * cos(phi)) case (2) ! l = 2, m = -2 rn(1) = 0.288675134594813_8 * (-THREE * w**2 + THREE) * sin(TWO*phi) ! l = 2, m = -1 - rn(2) = 1.73205080756888_8 * w*sqrt(w2m1) * sin(phi) + rn(2) = -(1.73205080756888_8 * w*sqrt(w2m1) * sin(phi)) ! l = 2, m = 0 rn(3) = 1.5_8 * w**2 - HALF ! l = 2, m = 1 - rn(4) = 1.73205080756888_8 * w*sqrt(w2m1) * cos(phi) + rn(4) = -(1.73205080756888_8 * w*sqrt(w2m1) * cos(phi)) ! l = 2, m = 2 rn(5) = 0.288675134594813_8 * (-THREE * w**2 + THREE) * cos(TWO*phi) case (3) ! l = 3, m = -3 - rn(1) = 0.790569415042095_8 * (w2m1)**(THREE/TWO) * sin(THREE * phi) + rn(1) = -(0.790569415042095_8 * (w2m1)**(THREE/TWO) * sin(THREE * phi)) ! l = 3, m = -2 rn(2) = 1.93649167310371_8 * w*(w2m1) * sin(TWO*phi) ! l = 3, m = -1 - rn(3) = 0.408248290463863_8*sqrt(w2m1)*((15.0_8/TWO)*w**2 - THREE/TWO) * & - sin(phi) + rn(3) = -(0.408248290463863_8*sqrt(w2m1)*((15.0_8/TWO)*w**2 - THREE/TWO) * & + sin(phi)) ! l = 3, m = 0 rn(4) = 2.5_8 * w**3 - 1.5_8 * w ! l = 3, m = 1 - rn(5) = 0.408248290463863_8*sqrt(w2m1)*((15.0_8/TWO)*w**2 - THREE/TWO) * & - cos(phi) + rn(5) = -(0.408248290463863_8*sqrt(w2m1)*((15.0_8/TWO)*w**2 - THREE/TWO) * & + cos(phi)) ! l = 3, m = 2 rn(6) = 1.93649167310371_8 * w*(w2m1) * cos(TWO*phi) ! l = 3, m = 3 - rn(7) = 0.790569415042095_8 * (w2m1)**(THREE/TWO) * cos(THREE* phi) + rn(7) = -(0.790569415042095_8 * (w2m1)**(THREE/TWO) * cos(THREE* phi)) case (4) ! l = 4, m = -4 rn(1) = 0.739509972887452_8 * (w2m1)**2 * sin(4.0_8*phi) ! l = 4, m = -3 - rn(2) = 2.09165006633519_8 * w*(w2m1)**(THREE/TWO) * sin(THREE* phi) + rn(2) = -(2.09165006633519_8 * w*(w2m1)**(THREE/TWO) * sin(THREE* phi)) ! l = 4, m = -2 rn(3) = 0.074535599249993_8 * (w2m1)*((105.0_8/TWO)*w**2 - 15.0_8/TWO) * & sin(TWO*phi) ! l = 4, m = -1 - rn(4) = 0.316227766016838_8*sqrt(w2m1)*((35.0_8/TWO)*w**3 - 15.0_8/TWO*w)& - * sin(phi) + rn(4) = -(0.316227766016838_8*sqrt(w2m1)*((35.0_8/TWO)*w**3 - 15.0_8/TWO*w)& + * sin(phi)) ! l = 4, m = 0 rn(5) = 4.375_8 * w**4 - 3.75_8 * w**2 + 0.375_8 ! l = 4, m = 1 - rn(6) = 0.316227766016838_8*sqrt(w2m1)*((35.0_8/TWO)*w**3 - 15.0_8/TWO*w)& - * cos(phi) + rn(6) = -(0.316227766016838_8*sqrt(w2m1)*((35.0_8/TWO)*w**3 - 15.0_8/TWO*w)& + * cos(phi)) ! l = 4, m = 2 rn(7) = 0.074535599249993_8 * (w2m1)*((105.0_8/TWO)*w**2 - 15.0_8/TWO) * & cos(TWO*phi) ! l = 4, m = 3 - rn(8) = 2.09165006633519_8 * w*(w2m1)**(THREE/TWO) * cos(THREE* phi) + rn(8) = -(2.09165006633519_8 * w*(w2m1)**(THREE/TWO) * cos(THREE* phi)) ! l = 4, m = 4 rn(9) = 0.739509972887452_8 * (w2m1)**2 * cos(4.0_8*phi) case (5) ! l = 5, m = -5 - rn(1) = 0.701560760020114_8 * (w2m1)**(5.0_8/TWO) * sin(5.0_8*phi) + rn(1) = -(0.701560760020114_8 * (w2m1)**(5.0_8/TWO) * sin(5.0_8*phi)) ! l = 5, m = -4 rn(2) = 2.21852991866236_8 * w*(w2m1)**2 * sin(4.0_8*phi) ! l = 5, m = -3 - rn(3) = 0.00996023841111995_8 * (w2m1)**(THREE/TWO)* & - ((945.0_8 /TWO)*w**2 - 105.0_8/TWO) * sin(THREE*phi) + rn(3) = -(0.00996023841111995_8 * (w2m1)**(THREE/TWO)* & + ((945.0_8 /TWO)*w**2 - 105.0_8/TWO) * sin(THREE*phi)) ! l = 5, m = -2 rn(4) = 0.0487950036474267_8 * (w2m1) & * ((315.0_8/TWO)*w**3 - 105.0_8/TWO*w) * sin(TWO*phi) ! l = 5, m = -1 - rn(5) = 0.258198889747161_8*sqrt(w2m1)* & + rn(5) = -(0.258198889747161_8*sqrt(w2m1)* & ((315.0_8/8.0_8)*w**4 - 105.0_8/4.0_8 * w**2 + 15.0_8/8.0_8) & - * sin(phi) + * sin(phi)) ! l = 5, m = 0 rn(6) = 7.875_8 * w**5 - 8.75_8 * w**3 + 1.875_8 * w ! l = 5, m = 1 - rn(7) = 0.258198889747161_8*sqrt(w2m1)* & + rn(7) = -(0.258198889747161_8*sqrt(w2m1)* & ((315.0_8/8.0_8)*w**4 - 105.0_8/4.0_8 * w**2 + 15.0_8/8.0_8) & - * cos(phi) + * cos(phi)) ! l = 5, m = 2 rn(8) = 0.0487950036474267_8 * (w2m1)* & ((315.0_8/TWO)*w**3 - 105.0_8/TWO*w) * cos(TWO*phi) ! l = 5, m = 3 - rn(9) = 0.00996023841111995_8 * (w2m1)**(THREE/TWO)* & - ((945.0_8 /TWO)*w**2 - 105.0_8/TWO) * cos(THREE*phi) + rn(9) = -(0.00996023841111995_8 * (w2m1)**(THREE/TWO)* & + ((945.0_8 /TWO)*w**2 - 105.0_8/TWO) * cos(THREE*phi)) ! l = 5, m = 4 rn(10) = 2.21852991866236_8 * w*(w2m1)**2 * cos(4.0_8*phi) ! l = 5, m = 5 - rn(11) = 0.701560760020114_8 * (w2m1)**(5.0_8/TWO) * cos(5.0_8* phi) + rn(11) = -(0.701560760020114_8 * (w2m1)**(5.0_8/TWO) * cos(5.0_8* phi)) case (6) ! l = 6, m = -6 rn(1) = 0.671693289381396_8 * (w2m1)**3 * sin(6.0_8*phi) ! l = 6, m = -5 - rn(2) = 2.32681380862329_8 * w*(w2m1)**(5.0_8/TWO) * sin(5.0_8*phi) + rn(2) = -(2.32681380862329_8 * w*(w2m1)**(5.0_8/TWO) * sin(5.0_8*phi)) ! l = 6, m = -4 rn(3) = 0.00104990131391452_8 * (w2m1)**2 * & ((10395.0_8/TWO)*w**2 - 945.0_8/TWO) * sin(4.0_8*phi) ! l = 6, m = -3 - rn(4) = 0.00575054632785295_8 * (w2m1)**(THREE/TWO) * & - ((3465.0_8/TWO)*w**3 - 945.0_8/TWO*w) * sin(THREE*phi) + rn(4) = -(0.00575054632785295_8 * (w2m1)**(THREE/TWO) * & + ((3465.0_8/TWO)*w**3 - 945.0_8/TWO*w) * sin(THREE*phi)) ! l = 6, m = -2 rn(5) = 0.0345032779671177_8 * (w2m1) * & ((3465.0_8/8.0_8)*w**4 - 945.0_8/4.0_8 * w**2 + 105.0_8/8.0_8) & * sin(TWO*phi) ! l = 6, m = -1 - rn(6) = 0.218217890235992_8*sqrt(w2m1) * & + rn(6) = -(0.218217890235992_8*sqrt(w2m1) * & ((693.0_8/8.0_8)*w**5- 315.0_8/4.0_8 * w**3 + (105.0_8/8.0_8)*w) & - * sin(phi) + * sin(phi)) ! l = 6, m = 0 rn(7) = 14.4375_8 * w**6 - 19.6875_8 * w**4 + 6.5625_8 * w**2 - 0.3125_8 ! l = 6, m = 1 - rn(8) = 0.218217890235992_8*sqrt(w2m1) * & + rn(8) = -(0.218217890235992_8*sqrt(w2m1) * & ((693.0_8/8.0_8)*w**5- 315.0_8/4.0_8 * w**3 + (105.0_8/8.0_8)*w) & - * cos(phi) + * cos(phi)) ! l = 6, m = 2 rn(9) = 0.0345032779671177_8 * (w2m1) * & ((3465.0_8/8.0_8)*w**4 -945.0_8/4.0_8 * w**2 + 105.0_8/8.0_8) & * cos(TWO*phi) ! l = 6, m = 3 - rn(10) = 0.00575054632785295_8 * (w2m1)**(THREE/TWO) * & - ((3465.0_8/TWO)*w**3 - 945.0_8/TWO*w) * cos(THREE*phi) + rn(10) = -(0.00575054632785295_8 * (w2m1)**(THREE/TWO) * & + ((3465.0_8/TWO)*w**3 - 945.0_8/TWO*w) * cos(THREE*phi)) ! l = 6, m = 4 rn(11) = 0.00104990131391452_8 * (w2m1)**2 * & ((10395.0_8/TWO)*w**2 - 945.0_8/TWO) * cos(4.0_8*phi) ! l = 6, m = 5 - rn(12) = 2.32681380862329_8 * w*(w2m1)**(5.0_8/TWO) * cos(5.0_8*phi) + rn(12) = -(2.32681380862329_8 * w*(w2m1)**(5.0_8/TWO) * cos(5.0_8*phi)) ! l = 6, m = 6 rn(13) = 0.671693289381396_8 * (w2m1)**3 * cos(6.0_8*phi) case (7) ! l = 7, m = -7 - rn(1) = 0.647259849287749_8 * (w2m1)**(7.0_8/TWO) * sin(7.0_8*phi) + rn(1) = -(0.647259849287749_8 * (w2m1)**(7.0_8/TWO) * sin(7.0_8*phi)) ! l = 7, m = -6 rn(2) = 2.42182459624969_8 * w*(w2m1)**3 * sin(6.0_8*phi) ! l = 7, m = -5 - rn(3) = 9.13821798555235d-5*(w2m1)**(5.0_8/TWO)* & - ((135135.0_8/TWO)*w**2 - 10395.0_8/TWO) * sin(5.0_8*phi) + rn(3) = -(9.13821798555235d-5*(w2m1)**(5.0_8/TWO)* & + ((135135.0_8/TWO)*w**2 - 10395.0_8/TWO) * sin(5.0_8*phi)) ! l = 7, m = -4 rn(4) = 0.000548293079133141_8 * (w2m1)**2* & ((45045.0_8/TWO)*w**3 - 10395.0_8/TWO*w) * sin(4.0_8*phi) ! l = 7, m = -3 - rn(5) = 0.00363696483726654_8 * (w2m1)**(THREE/TWO)* & - ((45045.0_8/8.0_8)*w**4 - 10395.0_8/4.0_8 * w**2 + 945.0_8/8.0_8)* & - sin(THREE*phi) + rn(5) = -(0.00363696483726654_8 * (w2m1)**(THREE/TWO)* & + ((45045.0_8/8.0_8)*w**4 - 10395.0_8/4.0_8 * w**2 + 945.0_8/8.0_8)* & + sin(THREE*phi)) ! l = 7, m = -2 rn(6) = 0.025717224993682_8 * (w2m1)* & ((9009.0_8/8.0_8)*w**5 -3465.0_8/4.0_8 * w**3 + (945.0_8/8.0_8)*w)* & sin(TWO*phi) ! l = 7, m = -1 - rn(7) = 0.188982236504614_8*sqrt(w2m1)* & - ((3003.0_8/16.0_8)*w**6 - 3465.0_8/16.0_8 * w**4 + & - (945.0_8/16.0_8)*w**2 - 35.0_8/16.0_8) * sin(phi) + rn(7) = -(0.188982236504614_8*sqrt(w2m1)* & + ((3003.0_8/16.0_8)*w**6 - 3465.0_8/16.0_8 * w**4 + & + (945.0_8/16.0_8)*w**2 - 35.0_8/16.0_8) * sin(phi)) ! l = 7, m = 0 rn(8) = 26.8125_8 * w**7 - 43.3125_8 * w**5 + 19.6875_8 * w**3 -2.1875_8 & * w ! l = 7, m = 1 - rn(9) = 0.188982236504614_8*sqrt(w2m1)* & - ((3003.0_8/16.0_8)*w**6 - 3465.0_8/16.0_8 * w**4 + & - (945.0_8/16.0_8)*w**2 - 35.0_8/16.0_8) * cos(phi) + rn(9) = -(0.188982236504614_8*sqrt(w2m1)* & + ((3003.0_8/16.0_8)*w**6 - 3465.0_8/16.0_8 * w**4 + & + (945.0_8/16.0_8)*w**2 - 35.0_8/16.0_8) * cos(phi)) ! l = 7, m = 2 rn(10) = 0.025717224993682_8 * (w2m1)* & ((9009.0_8/8.0_8)*w**5 -3465.0_8/4.0_8 * w**3 + (945.0_8/8.0_8)*w)* & cos(TWO*phi) ! l = 7, m = 3 - rn(11) = 0.00363696483726654_8 * (w2m1)**(THREE/TWO)* & - ((45045.0_8/8.0_8)*w**4 - 10395.0_8/4.0_8 * w**2 + 945.0_8/8.0_8)* & - cos(THREE*phi) + rn(11) = -(0.00363696483726654_8 * (w2m1)**(THREE/TWO)* & + ((45045.0_8/8.0_8)*w**4 - 10395.0_8/4.0_8 * w**2 + 945.0_8/8.0_8)* & + cos(THREE*phi)) ! l = 7, m = 4 rn(12) = 0.000548293079133141_8 * (w2m1)**2 * & ((45045.0_8/TWO)*w**3 - 10395.0_8/TWO*w) * cos(4.0_8*phi) ! l = 7, m = 5 - rn(13) = 9.13821798555235d-5*(w2m1)**(5.0_8/TWO)* & - ((135135.0_8/TWO)*w**2 - 10395.0_8/TWO) * cos(5.0_8*phi) + rn(13) = -(9.13821798555235d-5*(w2m1)**(5.0_8/TWO)* & + ((135135.0_8/TWO)*w**2 - 10395.0_8/TWO) * cos(5.0_8*phi)) ! l = 7, m = 6 rn(14) = 2.42182459624969_8 * w*(w2m1)**3 * cos(6.0_8*phi) ! l = 7, m = 7 - rn(15) = 0.647259849287749_8 * (w2m1)**(7.0_8/TWO) * cos(7.0_8*phi) + rn(15) = -(0.647259849287749_8 * (w2m1)**(7.0_8/TWO) * cos(7.0_8*phi)) case (8) ! l = 8, m = -8 rn(1) = 0.626706654240044_8 * (w2m1)**4 * sin(8.0_8*phi) ! l = 8, m = -7 - rn(2) = 2.50682661696018_8 * w*(w2m1)**(7.0_8/TWO) * sin(7.0_8*phi) + rn(2) = -(2.50682661696018_8 * w*(w2m1)**(7.0_8/TWO) * sin(7.0_8*phi)) ! l = 8, m = -6 rn(3) = 6.77369783729086d-6*(w2m1)**3* & ((2027025.0_8/TWO)*w**2 - 135135.0_8/TWO) * sin(6.0_8*phi) ! l = 8, m = -5 - rn(4) = 4.38985792528482d-5*(w2m1)**(5.0_8/TWO)* & - ((675675.0_8/TWO)*w**3 - 135135.0_8/TWO*w) * sin(5.0_8*phi) + rn(4) = -(4.38985792528482d-5*(w2m1)**(5.0_8/TWO)* & + ((675675.0_8/TWO)*w**3 - 135135.0_8/TWO*w) * sin(5.0_8*phi)) ! l = 8, m = -4 rn(5) = 0.000316557156832328_8 * (w2m1)**2* & ((675675.0_8/8.0_8)*w**4 - 135135.0_8/4.0_8 * w**2 & + 10395.0_8/8.0_8) * sin(4.0_8*phi) ! l = 8, m = -3 - rn(6) = 0.00245204119306875_8 * (w2m1)**(THREE/TWO)* & - ((135135.0_8/8.0_8)*w**5 - 45045.0_8/4.0_8 * w**3 & - + (10395.0_8/8.0_8)*w) * sin(THREE*phi) + rn(6) = -(0.00245204119306875_8 * (w2m1)**(THREE/TWO)* & + ((135135.0_8/8.0_8)*w**5 - 45045.0_8/4.0_8 * w**3 & + + (10395.0_8/8.0_8)*w) * sin(THREE*phi)) ! l = 8, m = -2 rn(7) = 0.0199204768222399_8 * (w2m1)* & ((45045.0_8/16.0_8)*w**6- 45045.0_8/16.0_8 * w**4 + & (10395.0_8/16.0_8)*w**2 - 315.0_8/16.0_8) * sin(TWO*phi) ! l = 8, m = -1 - rn(8) = 0.166666666666667_8*sqrt(w2m1)* & - ((6435.0_8/16.0_8)*w**7 - 9009.0_8/16.0_8 * w**5 + & - (3465.0_8/16.0_8)*w**3 - 315.0_8/16.0_8 * w) * sin(phi) + rn(8) = -(0.166666666666667_8*sqrt(w2m1)* & + ((6435.0_8/16.0_8)*w**7 - 9009.0_8/16.0_8 * w**5 + & + (3465.0_8/16.0_8)*w**3 - 315.0_8/16.0_8 * w) * sin(phi)) ! l = 8, m = 0 rn(9) = 50.2734375_8 * w**8 - 93.84375_8 * w**6 + 54.140625_8 * w**4 -& 9.84375_8 * w**2 + 0.2734375_8 ! l = 8, m = 1 - rn(10) = 0.166666666666667_8*sqrt(w2m1)* & - ((6435.0_8/16.0_8)*w**7 - 9009.0_8/16.0_8 * w**5 + & - (3465.0_8/16.0_8)*w**3 - 315.0_8/16.0_8 * w) * cos(phi) + rn(10) = -(0.166666666666667_8*sqrt(w2m1)* & + ((6435.0_8/16.0_8)*w**7 - 9009.0_8/16.0_8 * w**5 + & + (3465.0_8/16.0_8)*w**3 - 315.0_8/16.0_8 * w) * cos(phi)) ! l = 8, m = 2 rn(11) = 0.0199204768222399_8 * (w2m1)*((45045.0_8/16.0_8)*w**6- & 45045.0_8/16.0_8 * w**4 + (10395.0_8/16.0_8)*w**2 - & 315.0_8/16.0_8) * cos(TWO*phi) ! l = 8, m = 3 - rn(12) = 0.00245204119306875_8 * (w2m1)**(THREE/TWO)* & - ((135135.0_8/8.0_8)*w**5 - 45045.0_8/4.0_8 * w**3 + & - (10395.0_8/8.0_8)*w) * cos(THREE*phi) + rn(12) = -(0.00245204119306875_8 * (w2m1)**(THREE/TWO)* & + ((135135.0_8/8.0_8)*w**5 - 45045.0_8/4.0_8 * w**3 + & + (10395.0_8/8.0_8)*w) * cos(THREE*phi)) ! l = 8, m = 4 rn(13) = 0.000316557156832328_8 * (w2m1)**2*((675675.0_8/8.0_8)*w**4 - & 135135.0_8/4.0_8 * w**2 + 10395.0_8/8.0_8) * cos(4.0_8*phi) ! l = 8, m = 5 - rn(14) = 4.38985792528482d-5*(w2m1)**(5.0_8/TWO)*((675675.0_8/TWO)*w**3 -& - 135135.0_8/TWO*w) * cos(5.0_8*phi) + rn(14) = -(4.38985792528482d-5*(w2m1)**(5.0_8/TWO)*((675675.0_8/TWO)*w**3 -& + 135135.0_8/TWO*w) * cos(5.0_8*phi)) ! l = 8, m = 6 rn(15) = 6.77369783729086d-6*(w2m1)**3*((2027025.0_8/TWO)*w**2 - & 135135.0_8/TWO) * cos(6.0_8*phi) ! l = 8, m = 7 - rn(16) = 2.50682661696018_8 * w*(w2m1)**(7.0_8/TWO) * cos(7.0_8*phi) + rn(16) = -(2.50682661696018_8 * w*(w2m1)**(7.0_8/TWO) * cos(7.0_8*phi)) ! l = 8, m = 8 rn(17) = 0.626706654240044_8 * (w2m1)**4 * cos(8.0_8*phi) case (9) ! l = 9, m = -9 - rn(1) = 0.609049392175524_8 * (w2m1)**(9.0_8/TWO) * sin(9.0_8*phi) + rn(1) = -(0.609049392175524_8 * (w2m1)**(9.0_8/TWO) * sin(9.0_8*phi)) ! l = 9, m = -8 rn(2) = 2.58397773170915_8 * w*(w2m1)**4 * sin(8.0_8*phi) ! l = 9, m = -7 - rn(3) = 4.37240315267812d-7*(w2m1)**(7.0_8/TWO)* & - ((34459425.0_8/TWO)*w**2 - 2027025.0_8/TWO) * sin(7.0_8*phi) + rn(3) = -(4.37240315267812d-7*(w2m1)**(7.0_8/TWO)* & + ((34459425.0_8/TWO)*w**2 - 2027025.0_8/TWO) * sin(7.0_8*phi)) ! l = 9, m = -6 rn(4) = 3.02928976464514d-6*(w2m1)**3* & ((11486475.0_8/TWO)*w**3 - 2027025.0_8/TWO*w) * sin(6.0_8*phi) ! l = 9, m = -5 - rn(5) = 2.34647776186144d-5*(w2m1)**(5.0_8/TWO)* & - ((11486475.0_8/8.0_8)*w**4 - 2027025.0_8/4.0_8 * w**2 + & - 135135.0_8/8.0_8) * sin(5.0_8*phi) + rn(5) = -(2.34647776186144d-5*(w2m1)**(5.0_8/TWO)* & + ((11486475.0_8/8.0_8)*w**4 - 2027025.0_8/4.0_8 * w**2 + & + 135135.0_8/8.0_8) * sin(5.0_8*phi)) ! l = 9, m = -4 rn(6) = 0.000196320414650061_8 * (w2m1)**2*((2297295.0_8/8.0_8)*w**5 - & 675675.0_8/4.0_8 * w**3 + (135135.0_8/8.0_8)*w) * sin(4.0_8*phi) ! l = 9, m = -3 - rn(7) = 0.00173385495536766_8 * (w2m1)**(THREE/TWO)* & - ((765765.0_8/16.0_8)*w**6 - 675675.0_8/16.0_8 * w**4 + & - (135135.0_8/16.0_8)*w**2 - 3465.0_8/16.0_8) * sin(THREE*phi) + rn(7) = -(0.00173385495536766_8 * (w2m1)**(THREE/TWO)* & + ((765765.0_8/16.0_8)*w**6 - 675675.0_8/16.0_8 * w**4 + & + (135135.0_8/16.0_8)*w**2 - 3465.0_8/16.0_8) * sin(THREE*phi)) ! l = 9, m = -2 rn(8) = 0.0158910431540932_8 * (w2m1)*((109395.0_8/16.0_8)*w**7- & 135135.0_8/16.0_8 * w**5 + (45045.0_8/16.0_8)*w**3 & - 3465.0_8/16.0_8 * w) * sin(TWO*phi) ! l = 9, m = -1 - rn(9) = 0.149071198499986_8*sqrt(w2m1)*((109395.0_8/128.0_8)*w**8 - & - 45045.0_8/32.0_8 * w**6 + (45045.0_8/64.0_8)*w**4 - 3465.0_8/32.0_8 & - * w**2 + 315.0_8/128.0_8) * sin(phi) + rn(9) = -(0.149071198499986_8*sqrt(w2m1)*((109395.0_8/128.0_8)*w**8 - & + 45045.0_8/32.0_8 * w**6 + (45045.0_8/64.0_8)*w**4 - 3465.0_8/32.0_8 & + * w**2 + 315.0_8/128.0_8) * sin(phi)) ! l = 9, m = 0 rn(10) = 94.9609375_8 * w**9 - 201.09375_8 * w**7 + 140.765625_8 * w**5- & 36.09375_8 * w**3 + 2.4609375_8 * w ! l = 9, m = 1 - rn(11) = 0.149071198499986_8*sqrt(w2m1)*((109395.0_8/128.0_8)*w**8 - & - 45045.0_8/32.0_8 * w**6 + (45045.0_8/64.0_8)*w**4 -3465.0_8/32.0_8 & - * w**2 + 315.0_8/128.0_8) * cos(phi) + rn(11) = -(0.149071198499986_8*sqrt(w2m1)*((109395.0_8/128.0_8)*w**8 - & + 45045.0_8/32.0_8 * w**6 + (45045.0_8/64.0_8)*w**4 -3465.0_8/32.0_8 & + * w**2 + 315.0_8/128.0_8) * cos(phi)) ! l = 9, m = 2 rn(12) = 0.0158910431540932_8 * (w2m1)*((109395.0_8/16.0_8)*w**7 - & 135135.0_8/16.0_8 * w**5 + (45045.0_8/16.0_8)*w**3 & - 3465.0_8/ 16.0_8 * w) * cos(TWO*phi) ! l = 9, m = 3 - rn(13) = 0.00173385495536766_8 * (w2m1)**(THREE/TWO)*((765765.0_8/16.0_8)& - *w**6 - 675675.0_8/16.0_8 * w**4 + (135135.0_8/16.0_8)*w**2 & - - 3465.0_8/16.0_8)* cos(THREE*phi) + rn(13) = -(0.00173385495536766_8 * (w2m1)**(THREE/TWO)*((765765.0_8/16.0_8)& + *w**6 - 675675.0_8/16.0_8 * w**4 + (135135.0_8/16.0_8)*w**2 & + - 3465.0_8/16.0_8)* cos(THREE*phi)) ! l = 9, m = 4 rn(14) = 0.000196320414650061_8 * (w2m1)**2*((2297295.0_8/8.0_8)*w**5 - & 675675.0_8/4.0_8 * w**3 + (135135.0_8/8.0_8)*w) * cos(4.0_8*phi) ! l = 9, m = 5 - rn(15) = 2.34647776186144d-5*(w2m1)**(5.0_8/TWO)*((11486475.0_8/8.0_8)* & - w**4 - 2027025.0_8/4.0_8 * w**2 + 135135.0_8/8.0_8) * cos(5.0_8*phi) + rn(15) = -(2.34647776186144d-5*(w2m1)**(5.0_8/TWO)*((11486475.0_8/8.0_8)* & + w**4 - 2027025.0_8/4.0_8 * w**2 + 135135.0_8/8.0_8) * cos(5.0_8*phi)) ! l = 9, m = 6 rn(16) = 3.02928976464514d-6*(w2m1)**3*((11486475.0_8/TWO)*w**3 - & 2027025.0_8/TWO*w) * cos(6.0_8*phi) ! l = 9, m = 7 - rn(17) = 4.37240315267812d-7*(w2m1)**(7.0_8/TWO)* & - ((34459425.0_8/TWO)*w**2 - 2027025.0_8/TWO) * cos(7.0_8*phi) + rn(17) = -(4.37240315267812d-7*(w2m1)**(7.0_8/TWO)* & + ((34459425.0_8/TWO)*w**2 - 2027025.0_8/TWO) * cos(7.0_8*phi)) ! l = 9, m = 8 rn(18) = 2.58397773170915_8 * w*(w2m1)**4 * cos(8.0_8*phi) ! l = 9, m = 9 - rn(19) = 0.609049392175524_8 * (w2m1)**(9.0_8/TWO) * cos(9.0_8*phi) + rn(19) = -(0.609049392175524_8 * (w2m1)**(9.0_8/TWO) * cos(9.0_8*phi)) case (10) ! l = 10, m = -10 rn(1) = 0.593627917136573_8 * (w2m1)**5 * sin(10.0_8*phi) ! l = 10, m = -9 - rn(2) = 2.65478475211798_8 * w*(w2m1)**(9.0_8/TWO) * sin(9.0_8*phi) + rn(2) = -(2.65478475211798_8 * w*(w2m1)**(9.0_8/TWO) * sin(9.0_8*phi)) ! l = 10, m = -8 rn(3) = 2.49953651452314d-8*(w2m1)**4*((654729075.0_8/TWO)*w**2 - & 34459425.0_8/TWO) * sin(8.0_8*phi) ! l = 10, m = -7 - rn(4) = 1.83677671621093d-7*(w2m1)**(7.0_8/TWO)* & - ((218243025.0_8/TWO)*w**3 - 34459425.0_8/TWO*w) * sin(7.0_8*phi) + rn(4) = -(1.83677671621093d-7*(w2m1)**(7.0_8/TWO)* & + ((218243025.0_8/TWO)*w**3 - 34459425.0_8/TWO*w) * sin(7.0_8*phi)) ! l = 10, m = -6 rn(5) = 1.51464488232257d-6*(w2m1)**3*((218243025.0_8/8.0_8)*w**4 - & 34459425.0_8/4.0_8 * w**2 + 2027025.0_8/8.0_8) * sin(6.0_8*phi) ! l = 10, m = -5 - rn(6) = 1.35473956745817d-5*(w2m1)**(5.0_8/TWO)* & - ((43648605.0_8/8.0_8)*w**5 - 11486475.0_8/4.0_8 * w**3 + & - (2027025.0_8/8.0_8)*w) * sin(5.0_8*phi) + rn(6) = -(1.35473956745817d-5*(w2m1)**(5.0_8/TWO)* & + ((43648605.0_8/8.0_8)*w**5 - 11486475.0_8/4.0_8 * w**3 + & + (2027025.0_8/8.0_8)*w) * sin(5.0_8*phi)) ! l = 10, m = -4 rn(7) = 0.000128521880085575_8 * (w2m1)**2*((14549535.0_8/16.0_8)*w**6 - & 11486475.0_8/16.0_8 * w**4 + (2027025.0_8/16.0_8)*w**2 - & 45045.0_8/16.0_8) * sin(4.0_8*phi) ! l = 10, m = -3 - rn(8) = 0.00127230170115096_8 * (w2m1)**(THREE/TWO)* & - ((2078505.0_8/16.0_8)*w**7 - 2297295.0_8/16.0_8 * w**5 + & - (675675.0_8/16.0_8)*w**3 - 45045.0_8/16.0_8 * w) * sin(THREE*phi) + rn(8) = -(0.00127230170115096_8 * (w2m1)**(THREE/TWO)* & + ((2078505.0_8/16.0_8)*w**7 - 2297295.0_8/16.0_8 * w**5 + & + (675675.0_8/16.0_8)*w**3 - 45045.0_8/16.0_8 * w) * sin(THREE*phi)) ! l = 10, m = -2 rn(9) = 0.012974982402692_8 * (w2m1)*((2078505.0_8/128.0_8)*w**8 - & 765765.0_8/32.0_8 * w**6 + (675675.0_8/64.0_8)*w**4 - & 45045.0_8/32.0_8 * w**2 + 3465.0_8/128.0_8) * sin(TWO*phi) ! l = 10, m = -1 - rn(10) = 0.134839972492648_8*sqrt(w2m1)*((230945.0_8/128.0_8)*w**9 - & - 109395.0_8/32.0_8 * w**7 + (135135.0_8/64.0_8)*w**5 - & - 15015.0_8/32.0_8 * w**3 + (3465.0_8/128.0_8)*w) * sin(phi) + rn(10) = -(0.134839972492648_8*sqrt(w2m1)*((230945.0_8/128.0_8)*w**9 - & + 109395.0_8/32.0_8 * w**7 + (135135.0_8/64.0_8)*w**5 - & + 15015.0_8/32.0_8 * w**3 + (3465.0_8/128.0_8)*w) * sin(phi)) ! l = 10, m = 0 rn(11) = 180.42578125_8 * w**10 - 427.32421875_8 * w**8 +351.9140625_8 & * w**6 - 117.3046875_8 * w**4 + 13.53515625_8 * w**2 -0.24609375_8 ! l = 10, m = 1 - rn(12) = 0.134839972492648_8*sqrt(w2m1)*((230945.0_8/128.0_8)*w**9 - & - 109395.0_8/32.0_8 * w**7 + (135135.0_8/64.0_8)*w**5 -15015.0_8/ & - 32.0_8 * w**3 + (3465.0_8/128.0_8)*w) * cos(phi) + rn(12) = -(0.134839972492648_8*sqrt(w2m1)*((230945.0_8/128.0_8)*w**9 - & + 109395.0_8/32.0_8 * w**7 + (135135.0_8/64.0_8)*w**5 -15015.0_8/ & + 32.0_8 * w**3 + (3465.0_8/128.0_8)*w) * cos(phi)) ! l = 10, m = 2 rn(13) = 0.012974982402692_8 * (w2m1)*((2078505.0_8/128.0_8)*w**8 - & 765765.0_8/32.0_8 * w**6 + (675675.0_8/64.0_8)*w**4 -& 45045.0_8/32.0_8 * w**2 + 3465.0_8/128.0_8) * cos(TWO*phi) ! l = 10, m = 3 - rn(14) = 0.00127230170115096_8 * (w2m1)**(THREE/TWO)* & - ((2078505.0_8/16.0_8)*w**7 - 2297295.0_8/16.0_8 * w**5 + & - (675675.0_8/16.0_8)*w**3 - 45045.0_8/16.0_8 * w) * cos(THREE*phi) + rn(14) = -(0.00127230170115096_8 * (w2m1)**(THREE/TWO)* & + ((2078505.0_8/16.0_8)*w**7 - 2297295.0_8/16.0_8 * w**5 + & + (675675.0_8/16.0_8)*w**3 - 45045.0_8/16.0_8 * w) * cos(THREE*phi)) ! l = 10, m = 4 rn(15) = 0.000128521880085575_8 * (w2m1)**2*((14549535.0_8/16.0_8)*w**6 -& 11486475.0_8/16.0_8 * w**4 + (2027025.0_8/16.0_8)*w**2 - & 45045.0_8/16.0_8) * cos(4.0_8*phi) ! l = 10, m = 5 - rn(16) = 1.35473956745817d-5*(w2m1)**(5.0_8/TWO)* & - ((43648605.0_8/8.0_8)*w**5 - 11486475.0_8/4.0_8 * w**3 + & - (2027025.0_8/8.0_8)*w) * cos(5.0_8*phi) + rn(16) = -(1.35473956745817d-5*(w2m1)**(5.0_8/TWO)* & + ((43648605.0_8/8.0_8)*w**5 - 11486475.0_8/4.0_8 * w**3 + & + (2027025.0_8/8.0_8)*w) * cos(5.0_8*phi)) ! l = 10, m = 6 rn(17) = 1.51464488232257d-6*(w2m1)**3*((218243025.0_8/8.0_8)*w**4 - & 34459425.0_8/4.0_8 * w**2 + 2027025.0_8/8.0_8) * cos(6.0_8*phi) ! l = 10, m = 7 - rn(18) = 1.83677671621093d-7*(w2m1)**(7.0_8/TWO)* & - ((218243025.0_8/TWO)*w**3 - 34459425.0_8/TWO*w) * cos(7.0_8*phi) + rn(18) = -(1.83677671621093d-7*(w2m1)**(7.0_8/TWO)* & + ((218243025.0_8/TWO)*w**3 - 34459425.0_8/TWO*w) * cos(7.0_8*phi)) ! l = 10, m = 8 rn(19) = 2.49953651452314d-8*(w2m1)**4* & ((654729075.0_8/TWO)*w**2 - 34459425.0_8/TWO) * cos(8.0_8*phi) ! l = 10, m = 9 - rn(20) = 2.65478475211798_8 * w*(w2m1)**(9.0_8/TWO) * cos(9.0_8*phi) + rn(20) = -(2.65478475211798_8 * w*(w2m1)**(9.0_8/TWO) * cos(9.0_8*phi)) ! l = 10, m = 10 rn(21) = 0.593627917136573_8 * (w2m1)**5 * cos(10.0_8*phi) case default diff --git a/src/output.F90 b/src/output.F90 index 1a841a777..84146f3d3 100644 --- a/src/output.F90 +++ b/src/output.F90 @@ -6,7 +6,7 @@ module output use constants use endf, only: reaction_name use error, only: fatal_error, warning - use geometry_header, only: Cell, Universe, Surface, Lattice, RectLattice, & + use geometry_header, only: Cell, Universe, Lattice, RectLattice, & HexLattice, BASE_UNIVERSE use global use math, only: t_percentile @@ -254,10 +254,9 @@ contains type(Particle), intent(in) :: p integer :: i ! index for coordinate levels - type(Cell), pointer :: c => null() - type(Surface), pointer :: s => null() - type(Universe), pointer :: u => null() - class(Lattice), pointer :: l => null() + type(Cell), pointer :: c + type(Universe), pointer :: u + class(Lattice), pointer :: l ! display type of particle select case (p % type) @@ -304,8 +303,7 @@ contains ! Print surface if (p % surface /= NONE) then - s => surfaces(abs(p % surface)) - write(ou,*) ' Surface = ' // to_str(sign(s % id, p % surface)) + write(ou,*) ' Surface = ' // to_str(sign(surfaces(i)%obj%id, p % surface)) end if ! Display weight, energy, grid index, and interpolation factor @@ -960,6 +958,9 @@ contains filter_name(FILTER_MESH) = "Mesh" filter_name(FILTER_ENERGYIN) = "Incoming Energy" filter_name(FILTER_ENERGYOUT) = "Outgoing Energy" + filter_name(FILTER_MU) = "Change-in-Angle" + filter_name(FILTER_POLAR) = "Polar Angle" + filter_name(FILTER_AZIMUTHAL) = "Azimuthal Angle" ! Initialize names for scores score_names(abs(SCORE_FLUX)) = "Flux" @@ -1385,7 +1386,7 @@ contains univ, bin-1, offset, label) case (FILTER_SURFACE) i = t % filters(i_filter) % int_bins(bin) - label = to_str(surfaces(i) % id) + label = to_str(surfaces(i)%obj%id) case (FILTER_MESH) m => meshes(t % filters(i_filter) % int_bins(1)) allocate(ijk(m % n_dimension)) @@ -1397,7 +1398,8 @@ contains label = "Index (" // trim(to_str(ijk(1))) // ", " // & trim(to_str(ijk(2))) // ", " // trim(to_str(ijk(3))) // ")" end if - case (FILTER_ENERGYIN, FILTER_ENERGYOUT) + case (FILTER_ENERGYIN, FILTER_ENERGYOUT, FILTER_MU, FILTER_POLAR, & + FILTER_AZIMUTHAL) E0 = t % filters(i_filter) % real_bins(bin) E1 = t % filters(i_filter) % real_bins(bin + 1) label = "[" // trim(to_str(E0)) // ", " // trim(to_str(E1)) // ")" diff --git a/src/physics.F90 b/src/physics.F90 index 11bc3720f..889126d7d 100644 --- a/src/physics.F90 +++ b/src/physics.F90 @@ -465,6 +465,12 @@ contains ! Set energy and direction of particle in LAB frame uvw = v_n / vel + ! Because of floating-point roundoff, it may be possible for mu_lab to be + ! outside of the range [-1,1). In these cases, we just set mu_lab to exactly + ! -1 or 1 + + if (abs(mu_lab) > ONE) mu_lab = sign(ONE,mu_lab) + end subroutine elastic_scatter !=============================================================================== @@ -711,6 +717,12 @@ contains end if ! (inelastic secondary energy treatment) end if ! (elastic or inelastic) + ! Because of floating-point roundoff, it may be possible for mu to be + ! outside of the range [-1,1). In these cases, we just set mu to exactly + ! -1 or 1 + + if (abs(mu) > ONE) mu = sign(ONE,mu) + ! change direction of particle uvw = rotate_angle(uvw, mu) @@ -1298,6 +1310,11 @@ contains ! sample outgoing energy if (law == 44 .or. law == 61) then call sample_energy(rxn%edist, E_in, E, mu) + ! Because of floating-point roundoff, it may be possible for mu to be + ! outside of the range [-1,1). In these cases, we just set mu to exactly + ! -1 or 1 + + if (abs(mu) > ONE) mu = sign(ONE,mu) elseif (law == 66) then call sample_energy(rxn%edist, E_in, E, A=A, Q=Q) else @@ -1315,6 +1332,12 @@ contains ! determine outgoing angle in lab mu = mu * sqrt(E_cm/E) + ONE/(A+ONE) * sqrt(E_in/E) + + ! Because of floating-point roundoff, it may be possible for mu to be + ! outside of the range [-1,1). In these cases, we just set mu to exactly + ! -1 or 1 + + if (abs(mu) > ONE) mu = sign(ONE,mu) end if ! Set outgoing energy and scattering angle diff --git a/src/relaxng/geometry.rnc b/src/relaxng/geometry.rnc index 82f1f15b3..2a8d07b8c 100644 --- a/src/relaxng/geometry.rnc +++ b/src/relaxng/geometry.rnc @@ -9,7 +9,7 @@ element geometry { (element material { ( xsd:int | "void" ) } | attribute material { ( xsd:int | "void" ) }) ) & - (element surfaces { list { xsd:int* } } | attribute surfaces { list { xsd:int* } })? & + (element region { xsd:string } | attribute region { xsd:string })? & (element rotation { list { xsd:double+ } } | attribute rotation { list { xsd:double+ } })? & (element translation { list { xsd:double+ } } | attribute translation { list { xsd:double+ } })? }* diff --git a/src/relaxng/geometry.rng b/src/relaxng/geometry.rng index 9bd573b34..fcb310d0b 100644 --- a/src/relaxng/geometry.rng +++ b/src/relaxng/geometry.rng @@ -62,19 +62,11 @@ - - - - - - + + - - - - - - + + diff --git a/src/relaxng/tallies.rnc b/src/relaxng/tallies.rnc index ee93d273c..a19121845 100644 --- a/src/relaxng/tallies.rnc +++ b/src/relaxng/tallies.rnc @@ -23,9 +23,11 @@ element tallies { attribute estimator { ( "analog" | "tracklength" ) })? & element filter { (element type { ( "cell" | "cellborn" | "material" | "universe" | - "surface" | "distribcell" | "mesh" | "energy" | "energyout" ) } | + "surface" | "distribcell" | "mesh" | "energy" | "energyout" | "mu" | + "polar" | "azimuthal") } | attribute type { ( "cell" | "cellborn" | "material" | "universe" | - "surface" | "distribcell" | "mesh" | "energy" | "energyout" ) }) & + "surface" | "distribcell" | "mesh" | "energy" | "energyout" | "mu" | + "polar" | "azimuthal") }) & (element bins { list { xsd:double+ } } | attribute bins { list { xsd:double+ } }) }* & diff --git a/src/relaxng/tallies.rng b/src/relaxng/tallies.rng index 76973e855..cb952b930 100644 --- a/src/relaxng/tallies.rng +++ b/src/relaxng/tallies.rng @@ -145,6 +145,9 @@ mesh energy energyout + mu + polar + azimuthal @@ -158,6 +161,9 @@ mesh energy energyout + mu + polar + azimuthal diff --git a/src/state_point.F90 b/src/state_point.F90 index 64ba7ef55..c958cbc88 100644 --- a/src/state_point.F90 +++ b/src/state_point.F90 @@ -256,14 +256,23 @@ contains call write_dataset(filter_group, "type", "energy") case(FILTER_ENERGYOUT) call write_dataset(filter_group, "type", "energyout") + case(FILTER_MU) + call write_dataset(filter_group, "type", "mu") + case(FILTER_POLAR) + call write_dataset(filter_group, "type", "polar") + case(FILTER_AZIMUTHAL) + call write_dataset(filter_group, "type", "azimuthal") case(FILTER_DISTRIBCELL) call write_dataset(filter_group, "type", "distribcell") end select call write_dataset(filter_group, "offset", tally%filters(j)%offset) call write_dataset(filter_group, "n_bins", tally%filters(j)%n_bins) - if (tally%filters(j)%type == FILTER_ENERGYIN .or. & - tally%filters(j)%type == FILTER_ENERGYOUT) then + if (tally % filters(j) % type == FILTER_ENERGYIN .or. & + tally % filters(j) % type == FILTER_ENERGYOUT .or. & + tally % filters(j) % type == FILTER_MU .or. & + tally % filters(j) % type == FILTER_POLAR .or. & + tally % filters(j) % type == FILTER_AZIMUTHAL) then call write_dataset(filter_group, "bins", & tally%filters(j)%real_bins) else diff --git a/src/stl_vector.F90 b/src/stl_vector.F90 new file mode 100644 index 000000000..8038628fb --- /dev/null +++ b/src/stl_vector.F90 @@ -0,0 +1,351 @@ +module stl_vector + + ! This module provides derived types that are meant to mimic the + ! std::vector type in C++. The vector type has numerous advantages over + ! simple arrays and linked lists in that storage can grow and shrink + ! dynamically, yet it is still contiguous in memory. Vectors can be filled + ! element-by-element with automatic memory allocation in amortized constant + ! time. In the implementation here, we grow the vector by a factor of 1.5 each + ! time the capacity is exceed. + ! + ! The member functions which have been implemented here are: + ! + ! capacity -- Returns the size of the storage space currently allocated for + ! the vector + ! + ! clear -- Remove all elements from the vector, leaving it with a size of + ! 0. Note that this doesn't imply that storage is deallocated. + ! + ! initialize -- Set the storage size of the vector and optionally fill it with + ! a particular value. + ! + ! pop_back -- Remove the last element of the vector, reducing the size by one. + ! + ! push_back -- Add a new element at the end of the vector. This increases the + ! size of the vector by one. Note that the underlying storage is + ! reallocated only if the size exceeds the capacity. + ! + ! reserve -- Requests that the capacity of the vector be a certain size. + ! + ! resize -- Resize the vector so it contains n elements. If n is larger than + ! the current size, an optional fill value can be used to set the + ! extra elements. + ! + ! shrink_to_fit -- Request that the capacity be reduced to fit the size. + ! + ! size -- Returns the number of elements in the vector. + + implicit none + private + + real(8), parameter :: GROWTH_FACTOR = 1.5 + + type, public :: VectorInt + integer, private :: size_ = 0 + integer, private :: capacity_ = 0 + integer, allocatable :: data(:) + contains + procedure :: capacity => capacity_int + procedure :: clear => clear_int + generic :: initialize => & + initialize_fill_int + procedure, private :: initialize_fill_int + procedure :: pop_back => pop_back_int + procedure :: push_back => push_back_int + procedure :: reserve => reserve_int + procedure :: resize => resize_int + procedure :: shrink_to_fit => shrink_to_fit_int + procedure :: size => size_int + end type VectorInt + + type, public :: VectorReal + integer, private :: size_ = 0 + integer, private :: capacity_ = 0 + real(8), allocatable :: data(:) + contains + procedure :: capacity => capacity_real + procedure :: clear => clear_real + generic :: initialize => & + initialize_fill_real + procedure, private :: initialize_fill_real + procedure :: pop_back => pop_back_real + procedure :: push_back => push_back_real + procedure :: reserve => reserve_real + procedure :: resize => resize_real + procedure :: shrink_to_fit => shrink_to_fit_real + procedure :: size => size_real + end type VectorReal + +contains + +!=============================================================================== +! Implementation of VectorInt +!=============================================================================== + + pure function capacity_int(this) result(capacity) + class(VectorInt), intent(in) :: this + integer :: capacity + + capacity = this%capacity_ + end function capacity_int + + subroutine clear_int(this) + class(VectorInt), intent(inout) :: this + + ! Since integer is trivially destructible, we only need to set size to zero + ! and can leave capacity as is + this%size_ = 0 + end subroutine clear_int + + subroutine initialize_fill_int(this, n, val) + class(VectorInt), intent(inout) :: this + integer, intent(in) :: n + integer, optional, intent(in) :: val + + integer :: val_ + + ! If no value given, fill the vector with zeros + if (present(val)) then + val_ = val + else + val_ = 0 + end if + + if (allocated(this%data)) deallocate(this%data) + + allocate(this%data(n), SOURCE=val_) + this%size_ = n + this%capacity_ = n + end subroutine initialize_fill_int + + subroutine pop_back_int(this) + class(VectorInt), intent(inout) :: this + if (this%size_ > 0) this%size_ = this%size_ - 1 + end subroutine pop_back_int + + subroutine push_back_int(this, val) + class(VectorInt), intent(inout) :: this + integer, intent(in) :: val + + integer :: capacity + integer, allocatable :: data(:) + + if (this%capacity_ == this%size_) then + ! Create new data array that is GROWTH_FACTOR larger. Note that + if (this%capacity_ == 0) then + capacity = 8 + else + capacity = int(GROWTH_FACTOR*this%capacity_) + end if + allocate(data(capacity)) + + ! Copy existing elements + if (this%size_ > 0) data(1:this%size_) = this%data + + ! Move allocation + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = capacity + end if + + ! Increase size of vector by one and set new element + this%size_ = this%size_ + 1 + this%data(this%size_) = val + end subroutine push_back_int + + subroutine reserve_int(this, n) + class(VectorInt), intent(inout) :: this + integer, intent(in) :: n + + integer, allocatable :: data(:) + + if (n > this%capacity_) then + allocate(data(n)) + + ! Copy existing elements + if (this%size_ > 0) data(1:this%size_) = this%data(1:this%size_) + + ! Move allocation + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = n + end if + end subroutine reserve_int + + subroutine resize_int(this, n, val) + class(VectorInt), intent(inout) :: this + integer, intent(in) :: n + integer, intent(in), optional :: val + + if (n < this%size_) then + this%size_ = n + elseif (n > this%size_) then + ! If requested size is greater than capacity, first reserve that many + ! elements + if (n > this%capacity_) call this%reserve(n) + + ! Fill added elements with specified value and increase size + if (present(val)) this%data(this%size_ + 1 : n) = val + this%size_ = n + end if + + end subroutine resize_int + + subroutine shrink_to_fit_int(this) + class(VectorInt), intent(inout) :: this + + integer, allocatable :: data(:) + + if (this%capacity_ > this%size_) then + if (this%size_ > 0) then + allocate(data(this%size_)) + data(:) = this%data(1:this%size_) + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = this%size_ + else + if (allocated(this%data)) deallocate(this%data) + end if + end if + end subroutine shrink_to_fit_int + + pure function size_int(this) result(size) + class(VectorInt), intent(in) :: this + integer :: size + + size = this%size_ + end function size_int + +!=============================================================================== +! Implementation of VectorReal +!=============================================================================== + + pure function capacity_real(this) result(capacity) + class(VectorReal), intent(in) :: this + integer :: capacity + + capacity = this%capacity_ + end function capacity_real + + subroutine clear_real(this) + class(VectorReal), intent(inout) :: this + + ! Since real is trivially destructible, we only need to set size to zero and + ! can leave capacity as is + this%size_ = 0 + end subroutine clear_real + + subroutine initialize_fill_real(this, n, val) + class(VectorReal), intent(inout) :: this + integer, intent(in) :: n + real(8), optional, intent(in) :: val + + real(8) :: val_ + + ! If no value given, fill the vector with zeros + if (present(val)) then + val_ = val + else + val_ = 0 + end if + + if (allocated(this%data)) deallocate(this%data) + + allocate(this%data(n), SOURCE=val_) + this%size_ = n + this%capacity_ = n + end subroutine initialize_fill_real + + subroutine pop_back_real(this) + class(VectorReal), intent(inout) :: this + if (this%size_ > 0) this%size_ = this%size_ - 1 + end subroutine pop_back_real + + subroutine push_back_real(this, val) + class(VectorReal), intent(inout) :: this + real(8), intent(in) :: val + + integer :: capacity + real(8), allocatable :: data(:) + + if (this%capacity_ == this%size_) then + ! Create new data array that is GROWTH_FACTOR larger. Note that + if (this%capacity_ == 0) then + capacity = 8 + else + capacity = int(GROWTH_FACTOR*this%capacity_) + end if + allocate(data(capacity)) + + ! Copy existing elements + if (this%size_ > 0) data(1:this%size_) = this%data + + ! Move allocation + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = capacity + end if + + ! Increase size of vector by one and set new element + this%size_ = this%size_ + 1 + this%data(this%size_) = val + end subroutine push_back_real + + subroutine reserve_real(this, n) + class(VectorReal), intent(inout) :: this + integer, intent(in) :: n + + real(8), allocatable :: data(:) + + if (n > this%capacity_) then + allocate(data(n)) + + ! Copy existing elements + if (this%size_ > 0) data(1:this%size_) = this%data(1:this%size_) + + ! Move allocation + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = n + end if + end subroutine reserve_real + + subroutine resize_real(this, n, val) + class(VectorReal), intent(inout) :: this + integer, intent(in) :: n + real(8), intent(in), optional :: val + + if (n < this%size_) then + this%size_ = n + elseif (n > this%size_) then + ! If requested size is greater than capacity, first reserve that many + ! elements + if (n > this%capacity_) call this%reserve(n) + + ! Fill added elements with specified value and increase size + if (present(val)) this%data(this%size_ + 1 : n) = val + this%size_ = n + end if + + end subroutine resize_real + + subroutine shrink_to_fit_real(this) + class(VectorReal), intent(inout) :: this + + real(8), allocatable :: data(:) + + if (this%capacity_ > this%size_) then + if (this%size_ > 0) then + allocate(data(this%size_)) + data(:) = this%data(1:this%size_) + call move_alloc(FROM=data, TO=this%data) + this%capacity_ = this%size_ + else + if (allocated(this%data)) deallocate(this%data) + end if + end if + end subroutine shrink_to_fit_real + + pure function size_real(this) result(size) + class(VectorReal), intent(in) :: this + integer :: size + + size = this%size_ + end function size_real + +end module stl_vector diff --git a/src/string.F90 b/src/string.F90 index 5f57bb385..45db59c87 100644 --- a/src/string.F90 +++ b/src/string.F90 @@ -1,8 +1,10 @@ module string - use constants, only: MAX_WORDS, MAX_LINE_LEN, ERROR_INT, ERROR_REAL + use constants, only: MAX_WORDS, MAX_LINE_LEN, ERROR_INT, ERROR_REAL, & + OP_LEFT_PAREN, OP_RIGHT_PAREN, OP_COMPLEMENT, OP_INTERSECTION, OP_UNION use error, only: fatal_error, warning use global, only: master + use stl_vector, only: VectorInt implicit none @@ -63,63 +65,96 @@ contains end subroutine split_string !=============================================================================== -! SPLIT_STRING_WL takes a string that includes logical expressions for a list of -! bounding surfaces in a cell and splits it into separate words. The characters -! (, ), :, and # count as separate words since they represent operators. -! -! Arguments: -! string = input line -! words = array of words -! n = number of words +! TOKENIZE takes a string that includes logical expressions for a list of +! bounding surfaces in a cell and splits it into separate tokens. The characters +! (, ), |, and ~ count as separate tokens since they represent operators. !=============================================================================== - subroutine split_string_wl(string, words, n) + subroutine tokenize(string, tokens) + character(*), intent(in) :: string + type(VectorInt), intent(inout) :: tokens - character(*), intent(in) :: string - character(*), intent(out) :: words(MAX_WORDS) - integer, intent(out) :: n + integer :: i ! current index + integer :: i_start ! starting index of word + integer :: token + character(len=len_trim(string)) :: string_ - character(1) :: chr ! current character - integer :: i ! current index - integer :: i_start ! starting index of word - integer :: i_end ! ending index of word + ! Remove leading blanks + string_ = adjustl(string) i_start = 0 - i_end = 0 - n = 0 - do i = 1, len_trim(string) - chr = string(i:i) - + i = 1 + do while (i <= len_trim(string_)) ! Check for special characters - if (index('():#', chr) > 0) then + if (index('()|~ ', string_(i:i)) > 0) then + ! If the special character appears immediately after a non-operator, + ! create a token with the surface half-space if (i_start > 0) then - i_end = i - 1 - n = n + 1 - words(n) = string(i_start:i_end) + call tokens%push_back(int(str_to_int(& + string_(i_start:i - 1)), 4)) end if - n = n + 1 - words(n) = chr + + select case (string_(i:i)) + case ('(') + call tokens%push_back(OP_LEFT_PAREN) + case (')') + if (tokens%size() > 0) then + token = tokens%data(tokens%size()) + if (token >= OP_UNION .and. token < OP_RIGHT_PAREN) then + call fatal_error("Right parentheses cannot follow an operator in & + ®ion specification: " // trim(string)) + end if + end if + call tokens%push_back(OP_RIGHT_PAREN) + case ('|') + if (tokens%size() > 0) then + token = tokens%data(tokens%size()) + if (.not. (token < OP_UNION .or. token == OP_RIGHT_PAREN)) then + call fatal_error("Union cannot follow an operator in region & + &specification: " // trim(string)) + end if + end if + call tokens%push_back(OP_UNION) + case ('~') + call tokens%push_back(OP_COMPLEMENT) + case (' ') + ! Find next non-space character + do while (string_(i+1:i+1) == ' ') + i = i + 1 + end do + + ! If previous token is a halfspace or right parenthesis and next token + ! is not a left parenthese or union operator, that implies that the + ! whitespace is to be interpreted as an intersection operator + if (i_start > 0 .or. tokens%data(tokens%size()) == OP_RIGHT_PAREN) then + if (index(')|', string_(i+1:i+1)) == 0) then + call tokens%push_back(OP_INTERSECTION) + end if + end if + end select + i_start = 0 - i_end = 0 - cycle + else + ! Check for invalid characters + if (index('-0123456789', string_(i:i)) == 0) then + call fatal_error("Invalid character '" // string_(i:i) // "' in & + ®ion specification.") + end if + + ! If we haven't yet reached the start of a word, start a new word + if (i_start == 0) i_start = i end if - if ((i_start == 0) .and. (chr /= ' ')) then - i_start = i - end if - if (i_start > 0) then - if (chr == ' ') i_end = i - 1 - if (i == len_trim(string)) i_end = i - if (i_end > 0) then - n = n + 1 - words(n) = string(i_start:i_end) - ! reset indices - i_start = 0 - i_end = 0 - end if - end if + i = i + 1 end do - end subroutine split_string_wl + + ! If we've reached the end and we're still in a word, create a token from it + ! and add it to the list + if (i_start > 0) then + call tokens%push_back(int(str_to_int(& + string_(i_start:len_trim(string_))), 4)) + end if + end subroutine tokenize !=============================================================================== ! CONCATENATE takes an array of words and concatenates them together in one diff --git a/src/summary.F90 b/src/summary.F90 index b93bf120c..1bf57cc93 100644 --- a/src/summary.F90 +++ b/src/summary.F90 @@ -3,13 +3,14 @@ module summary use ace_header, only: Reaction, UrrData, Nuclide use constants use endf, only: reaction_name - use geometry_header, only: Cell, Surface, Universe, Lattice, RectLattice, & + use geometry_header, only: Cell, Universe, Lattice, RectLattice, & &HexLattice use global use hdf5_interface use material_header, only: Material use mesh_header, only: RegularMesh use output, only: time_stamp + use surface_header use string, only: to_str use tally_header, only: TallyObject @@ -106,14 +107,15 @@ contains integer :: i, j, k, m integer, allocatable :: lattice_universes(:,:,:) - integer, allocatable :: surface_ids(:) integer(HID_T) :: geom_group integer(HID_T) :: cells_group, cell_group integer(HID_T) :: surfaces_group, surface_group integer(HID_T) :: universes_group, univ_group integer(HID_T) :: lattices_group, lattice_group + real(8), allocatable :: coeffs(:) + character(MAX_LINE_LEN) :: region_spec type(Cell), pointer :: c - type(Surface), pointer :: s + class(Surface), pointer :: s type(Universe), pointer :: u class(Lattice), pointer :: lat @@ -174,15 +176,25 @@ contains end select ! Write list of bounding surfaces - if (c%n_surfaces > 0) then - allocate(surface_ids(c%n_surfaces)) - do j = 1, c%n_surfaces - k = c%surfaces(j) - surface_ids(j) = sign(surfaces(abs(k))%id, k) - end do - call write_dataset(cell_group, "surfaces", surface_ids) - deallocate(surface_ids) - end if + region_spec = "" + do j = 1, size(c%region) + k = c%region(j) + select case(k) + case (OP_LEFT_PAREN) + region_spec = trim(region_spec) // " (" + case (OP_RIGHT_PAREN) + region_spec = trim(region_spec) // " )" + case (OP_COMPLEMENT) + region_spec = trim(region_spec) // " ~" + case (OP_INTERSECTION) + case (OP_UNION) + region_spec = trim(region_spec) // " |" + case default + region_spec = trim(region_spec) // " " // to_str(& + sign(surfaces(abs(k))%obj%id, k)) + end select + end do + call write_dataset(cell_group, "region", adjustl(region_spec)) call close_group(cell_group) end do CELL_LOOP @@ -197,7 +209,7 @@ contains ! Write information on each surface SURFACE_LOOP: do i = 1, n_surfaces - s => surfaces(i) + s => surfaces(i)%obj surface_group = create_group(surfaces_group, "surface " // & trim(to_str(s%id))) @@ -208,33 +220,65 @@ contains call write_dataset(surface_group, "name", s%name) ! Write surface type - select case (s%type) - case (SURF_PX) + select type (s) + type is (SurfaceXPlane) call write_dataset(surface_group, "type", "x-plane") - case (SURF_PY) - call write_dataset(surface_group, "type", "y-plane") - case (SURF_PZ) - call write_dataset(surface_group, "type", "z-plane") - case (SURF_PLANE) - call write_dataset(surface_group, "type", "plane") - case (SURF_CYL_X) - call write_dataset(surface_group, "type", "x-cylinder") - case (SURF_CYL_Y) - call write_dataset(surface_group, "type", "y-cylinder") - case (SURF_CYL_Z) - call write_dataset(surface_group, "type", "z-cylinder") - case (SURF_SPHERE) - call write_dataset(surface_group, "type", "sphere") - case (SURF_CONE_X) - call write_dataset(surface_group, "type", "x-cone") - case (SURF_CONE_Y) - call write_dataset(surface_group, "type", "y-cone") - case (SURF_CONE_Z) - call write_dataset(surface_group, "type", "z-cone") - end select + allocate(coeffs(1)) + coeffs(1) = s%x0 - ! Write coefficients for surface - call write_dataset(surface_group, "coefficients", s%coeffs) + type is (SurfaceYPlane) + call write_dataset(surface_group, "type", "y-plane") + allocate(coeffs(1)) + coeffs(1) = s%y0 + + type is (SurfaceZPlane) + call write_dataset(surface_group, "type", "z-plane") + allocate(coeffs(1)) + coeffs(1) = s%z0 + + type is (SurfacePlane) + call write_dataset(surface_group, "type", "plane") + allocate(coeffs(4)) + coeffs(:) = [s%A, s%B, s%C, s%D] + + type is (SurfaceXCylinder) + call write_dataset(surface_group, "type", "x-cylinder") + allocate(coeffs(3)) + coeffs(:) = [s%y0, s%z0, s%r] + + type is (SurfaceYCylinder) + call write_dataset(surface_group, "type", "y-cylinder") + allocate(coeffs(3)) + coeffs(:) = [s%x0, s%z0, s%r] + + type is (SurfaceZCylinder) + call write_dataset(surface_group, "type", "z-cylinder") + allocate(coeffs(3)) + coeffs(:) = [s%x0, s%y0, s%r] + + type is (SurfaceSphere) + call write_dataset(surface_group, "type", "sphere") + allocate(coeffs(4)) + coeffs(:) = [s%x0, s%y0, s%z0, s%r] + + type is (SurfaceXCone) + call write_dataset(surface_group, "type", "x-cone") + allocate(coeffs(4)) + coeffs(:) = [s%x0, s%y0, s%z0, s%r2] + + type is (SurfaceYCone) + call write_dataset(surface_group, "type", "y-cone") + allocate(coeffs(4)) + coeffs(:) = [s%x0, s%y0, s%z0, s%r2] + + type is (SurfaceZCone) + call write_dataset(surface_group, "type", "z-cone") + allocate(coeffs(4)) + coeffs(:) = [s%x0, s%y0, s%z0, s%r2] + + end select + call write_dataset(surface_group, "coefficients", coeffs) + deallocate(coeffs) ! Write boundary condition select case (s%bc) @@ -496,7 +540,10 @@ contains ! Write filter bins if (t%filters(j)%type == FILTER_ENERGYIN .or. & - t%filters(j)%type == FILTER_ENERGYOUT) then + t%filters(j)%type == FILTER_ENERGYOUT .or. & + t%filters(j)%type == FILTER_MU .or. & + t%filters(j)%type == FILTER_POLAR .or. & + t%filters(j)%type == FILTER_AZIMUTHAL) then call write_dataset(filter_group, "bins", t%filters(j)%real_bins) else call write_dataset(filter_group, "bins", t%filters(j)%int_bins) @@ -522,6 +569,12 @@ contains call write_dataset(filter_group, "type", "energyout") case(FILTER_DISTRIBCELL) call write_dataset(filter_group, "type", "distribcell") + case(FILTER_MU) + call write_dataset(filter_group, "type", "mu") + case(FILTER_POLAR) + call write_dataset(filter_group, "type", "polar") + case(FILTER_AZIMUTHAL) + call write_dataset(filter_group, "type", "azimuthal") end select call close_group(filter_group) diff --git a/src/surface_header.F90 b/src/surface_header.F90 new file mode 100644 index 000000000..6fc1bbc23 --- /dev/null +++ b/src/surface_header.F90 @@ -0,0 +1,956 @@ +module surface_header + + use constants, only: ONE, TWO, ZERO, INFINITY, FP_COINCIDENT + + implicit none + +!=============================================================================== +! SURFACE type defines a first- or second-order surface that can be used to +! construct closed volumes (cells) +!=============================================================================== + + type, abstract :: Surface + integer :: id ! Unique ID + integer, allocatable :: & + neighbor_pos(:), & ! List of cells on positive side + neighbor_neg(:) ! List of cells on negative side + integer :: bc ! Boundary condition + character(len=52) :: name = "" ! User-defined name + contains + procedure :: sense + procedure :: reflect + procedure(iEvaluate), deferred :: evaluate + procedure(iDistance), deferred :: distance + procedure(iNormal), deferred :: normal + end type Surface + + abstract interface + pure function iEvaluate(this, xyz) result(f) + import Surface + class(Surface), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + end function iEvaluate + + pure function iDistance(this, xyz, uvw, coincident) result(d) + import Surface + class(Surface), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d + end function iDistance + + pure function iNormal(this, xyz) result(uvw) + import Surface + class(Surface), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + end function iNormal + end interface + +!=============================================================================== +! SURFACECONTAINER allows us to store an array of different types of surfaces +!=============================================================================== + + type :: SurfaceContainer + class(Surface), allocatable :: obj + end type SurfaceContainer + +!=============================================================================== +! All the derived types below are extensions of the abstract Surface type. They +! inherent the reflect() and sense() type-bound procedures and must implement +! evaluate(), distance(), and normal() +!=============================================================================== + + type, extends(Surface) :: SurfaceXPlane + ! x = x0 + real(8) :: x0 + contains + procedure :: evaluate => x_plane_evaluate + procedure :: distance => x_plane_distance + procedure :: normal => x_plane_normal + end type SurfaceXPlane + + type, extends(Surface) :: SurfaceYPlane + ! y = y0 + real(8) :: y0 + contains + procedure :: evaluate => y_plane_evaluate + procedure :: distance => y_plane_distance + procedure :: normal => y_plane_normal + end type SurfaceYPlane + + type, extends(Surface) :: SurfaceZPlane + ! z = z0 + real(8) :: z0 + contains + procedure :: evaluate => z_plane_evaluate + procedure :: distance => z_plane_distance + procedure :: normal => z_plane_normal + end type SurfaceZPlane + + type, extends(Surface) :: SurfacePlane + ! Ax + By + Cz = D + real(8) :: A + real(8) :: B + real(8) :: C + real(8) :: D + contains + procedure :: evaluate => plane_evaluate + procedure :: distance => plane_distance + procedure :: normal => plane_normal + end type SurfacePlane + + type, extends(Surface) :: SurfaceXCylinder + ! (y - y0)^2 + (z - z0)^2 = R^2 + real(8) :: y0 + real(8) :: z0 + real(8) :: r + contains + procedure :: evaluate => x_cylinder_evaluate + procedure :: distance => x_cylinder_distance + procedure :: normal => x_cylinder_normal + end type SurfaceXCylinder + + type, extends(Surface) :: SurfaceYCylinder + ! (x - x0)^2 + (z - z0)^2 = R^2 + real(8) :: x0 + real(8) :: z0 + real(8) :: r + contains + procedure :: evaluate => y_cylinder_evaluate + procedure :: distance => y_cylinder_distance + procedure :: normal => y_cylinder_normal + end type SurfaceYCylinder + + type, extends(Surface) :: SurfaceZCylinder + ! (x - x0)^2 + (y - y0)^2 = R^2 + real(8) :: x0 + real(8) :: y0 + real(8) :: r + contains + procedure :: evaluate => z_cylinder_evaluate + procedure :: distance => z_cylinder_distance + procedure :: normal => z_cylinder_normal + end type SurfaceZCylinder + + type, extends(Surface) :: SurfaceSphere + ! (x - x0)^2 + (y - y0)^2 + (z - z0)^2 = R^2 + real(8) :: x0 + real(8) :: y0 + real(8) :: z0 + real(8) :: r + contains + procedure :: evaluate => sphere_evaluate + procedure :: distance => sphere_distance + procedure :: normal => sphere_normal + end type SurfaceSphere + + type, extends(Surface) :: SurfaceXCone + ! (y - y0)^2 + (z - z0)^2 = R^2*(x - x0)^2 + real(8) :: x0 + real(8) :: y0 + real(8) :: z0 + real(8) :: r2 + contains + procedure :: evaluate => x_cone_evaluate + procedure :: distance => x_cone_distance + procedure :: normal => x_cone_normal + end type SurfaceXCone + + type, extends(Surface) :: SurfaceYCone + ! (x - x0)^2 + (z - z0)^2 = R^2*(y - y0)^2 + real(8) :: x0 + real(8) :: y0 + real(8) :: z0 + real(8) :: r2 + contains + procedure :: evaluate => y_cone_evaluate + procedure :: distance => y_cone_distance + procedure :: normal => y_cone_normal + end type SurfaceYCone + + type, extends(Surface) :: SurfaceZCone + ! (x - x0)^2 + (y - y0)^2 = R^2*(z - z0)^2 + real(8) :: x0 + real(8) :: y0 + real(8) :: z0 + real(8) :: r2 + contains + procedure :: evaluate => z_cone_evaluate + procedure :: distance => z_cone_distance + procedure :: normal => z_cone_normal + end type SurfaceZCone + +contains + +!=============================================================================== +! SENSE determines whether a point is on the 'positive' or 'negative' side of a +! surface. This routine is crucial for determining what cell a particular point +! is in. The positive side is indicated by a returned value of .true. and the +! negative side is indicated by a returned value of .false. +!=============================================================================== + + pure function sense(this, xyz, uvw) result(s) + class(Surface), intent(in) :: this ! surface + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical :: s ! sense of particle + + real(8) :: f ! surface function evaluated at point + + ! Evaluate the surface equation at the particle's coordinates to determine + ! which side the particle is on + f = this%evaluate(xyz) + + ! Check which side of surface the point is on + if (abs(f) < FP_COINCIDENT) then + ! Particle may be coincident with this surface. To determine the sense, we + ! look at the direction of the particle relative to the surface normal (by + ! default in the positive direction) via their dot product. + s = (dot_product(uvw, this%normal(xyz)) > ZERO) + else + s = (f > ZERO) + end if + end function sense + +!=============================================================================== +! REFLECT determines the direction a particle will travel if it is specularly +! reflected from the surface at a given position and direction. The position is +! needed because the reflection is performed using the surface normal, which +! depends on the position for second-order surfaces. +!=============================================================================== + + pure subroutine reflect(this, xyz, uvw) + class(Surface), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(inout) :: uvw(3) + + real(8) :: projection + real(8) :: magnitude + real(8) :: n(3) + + ! Construct normal vector + n(:) = this%normal(xyz) + + ! Determine projection of direction onto normal and squared magnitude of + ! normal + projection = n(1)*uvw(1) + n(2)*uvw(2) + n(3)*uvw(3) + magnitude = n(1)*n(1) + n(2)*n(2) + n(3)*n(3) + + ! Reflect direction according to normal + uvw(:) = uvw - TWO*projection/magnitude * n + end subroutine reflect + +!=============================================================================== +! SurfaceXPlane Implementation +!=============================================================================== + + pure function x_plane_evaluate(this, xyz) result(f) + class(SurfaceXPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + f = xyz(1) - this%x0 + end function x_plane_evaluate + + pure function x_plane_distance(this, xyz, uvw, coincident) result(d) + class(SurfaceXPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d + + real(8) :: f + + f = this%x0 - xyz(1) + if (coincident .or. abs(f) < FP_COINCIDENT .or. uvw(1) == ZERO) then + d = INFINITY + else + d = f/uvw(1) + if (d < ZERO) d = INFINITY + end if + end function x_plane_distance + + pure function x_plane_normal(this, xyz) result(uvw) + class(SurfaceXPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(:) = [ONE, ZERO, ZERO] + end function x_plane_normal + +!=============================================================================== +! SurfaceYPlane Implementation +!=============================================================================== + + pure function y_plane_evaluate(this, xyz) result(f) + class(SurfaceYPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + f = xyz(2) - this%y0 + end function y_plane_evaluate + + pure function y_plane_distance(this, xyz, uvw, coincident) result(d) + class(SurfaceYPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d + + real(8) :: f + + f = this%y0 - xyz(2) + if (coincident .or. abs(f) < FP_COINCIDENT .or. uvw(2) == ZERO) then + d = INFINITY + else + d = f/uvw(2) + if (d < ZERO) d = INFINITY + end if + end function y_plane_distance + + pure function y_plane_normal(this, xyz) result(uvw) + class(SurfaceYPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(:) = [ZERO, ONE, ZERO] + end function y_plane_normal + +!=============================================================================== +! SurfaceZPlane Implementation +!=============================================================================== + + pure function z_plane_evaluate(this, xyz) result(f) + + class(SurfaceZPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + f = xyz(3) - this%z0 + + end function z_plane_evaluate + + pure function z_plane_distance(this, xyz, uvw, coincident) result(d) + class(SurfaceZPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d + + real(8) :: f + + f = this%z0 - xyz(3) + if (coincident .or. abs(f) < FP_COINCIDENT .or. uvw(3) == ZERO) then + d = INFINITY + else + d = f/uvw(3) + if (d < ZERO) d = INFINITY + end if + end function z_plane_distance + + pure function z_plane_normal(this, xyz) result(uvw) + class(SurfaceZPlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(:) = [ZERO, ZERO, ONE] + end function z_plane_normal + +!=============================================================================== +! SurfacePlane Implementation +!=============================================================================== + + pure function plane_evaluate(this, xyz) result(f) + class(SurfacePlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + f = this%A*xyz(1) + this%B*xyz(2) + this%C*xyz(3) - this%D + end function plane_evaluate + + pure function plane_distance(this, xyz, uvw, coincident) result(d) + class(SurfacePlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d + + real(8) :: f + real(8) :: projection + + f = this%A*xyz(1) + this%B*xyz(2) + this%C*xyz(3) - this%D + projection = this%A*uvw(1) + this%B*uvw(2) + this%C*uvw(3) + if (coincident .or. abs(f) < FP_COINCIDENT .or. projection == ZERO) then + d = INFINITY + else + d = -f/projection + if (d < ZERO) d = INFINITY + end if + end function plane_distance + + pure function plane_normal(this, xyz) result(uvw) + class(SurfacePlane), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(:) = [this%A, this%B, this%C] + end function plane_normal + +!=============================================================================== +! SurfaceXCylinder Implementation +!=============================================================================== + + pure function x_cylinder_evaluate(this, xyz) result(f) + class(SurfaceXCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + real(8) :: y, z + + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + f = y*y + z*z - this%r*this%r + end function x_cylinder_evaluate + + pure function x_cylinder_distance(this, xyz, uvw, coincident) result(d) + class(SurfaceXCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d + + real(8) :: y, z, k, a, c, quad + + a = ONE - uvw(1)*uvw(1) ! v^2 + w^2 + if (a == ZERO) then + d = INFINITY + else + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + k = y*uvw(2) + z*uvw(3) + c = y*y + z*z - this%r*this%r + quad = k*k - a*c + + if (quad < ZERO) then + ! no intersection with cylinder + + d = INFINITY + + elseif (coincident .or. abs(c) < FP_COINCIDENT) then + ! particle is on the cylinder, thus one distance is positive/negative + ! and the other is zero. The sign of k determines if we are facing in or + ! out + + if (k >= ZERO) then + d = INFINITY + else + d = (-k + sqrt(quad))/a + end if + + elseif (c < ZERO) then + ! particle is inside the cylinder, thus one distance must be negative + ! and one must be positive. The positive distance will be the one with + ! negative sign on sqrt(quad) + + d = (-k + sqrt(quad))/a + + else + ! particle is outside the cylinder, thus both distances are either + ! positive or negative. If positive, the smaller distance is the one + ! with positive sign on sqrt(quad) + + d = (-k - sqrt(quad))/a + if (d < ZERO) d = INFINITY + + end if + end if + end function x_cylinder_distance + + pure function x_cylinder_normal(this, xyz) result(uvw) + class(SurfaceXCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(1) = ZERO + uvw(2) = TWO*(xyz(2) - this%y0) + uvw(3) = TWO*(xyz(3) - this%z0) + end function x_cylinder_normal + +!=============================================================================== +! SurfaceYCylinder Implementation +!=============================================================================== + + pure function y_cylinder_evaluate(this, xyz) result(f) + class(SurfaceYCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + real(8) :: x, z + + x = xyz(1) - this%x0 + z = xyz(3) - this%z0 + f = x*x + z*z - this%r*this%r + end function y_cylinder_evaluate + + pure function y_cylinder_distance(this, xyz, uvw, coincident) result(d) + class(SurfaceYCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d + + real(8) :: x, z, k, a, c, quad + + a = ONE - uvw(2)*uvw(2) ! u^2 + w^2 + if (a == ZERO) then + d = INFINITY + else + x = xyz(1) - this%x0 + z = xyz(3) - this%z0 + k = x*uvw(1) + z*uvw(3) + c = x*x + z*z - this%r*this%r + quad = k*k - a*c + + if (quad < ZERO) then + ! no intersection with cylinder + + d = INFINITY + + elseif (coincident .or. abs(c) < FP_COINCIDENT) then + ! particle is on the cylinder, thus one distance is positive/negative + ! and the other is zero. The sign of k determines if we are facing in or + ! out + + if (k >= ZERO) then + d = INFINITY + else + d = (-k + sqrt(quad))/a + end if + + elseif (c < ZERO) then + ! particle is inside the cylinder, thus one distance must be negative + ! and one must be positive. The positive distance will be the one with + ! negative sign on sqrt(quad) + + d = (-k + sqrt(quad))/a + + else + ! particle is outside the cylinder, thus both distances are either + ! positive or negative. If positive, the smaller distance is the one + ! with positive sign on sqrt(quad) + + d = (-k - sqrt(quad))/a + if (d < ZERO) d = INFINITY + + end if + end if + end function y_cylinder_distance + + pure function y_cylinder_normal(this, xyz) result(uvw) + class(SurfaceYCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(1) = TWO*(xyz(1) - this%x0) + uvw(2) = ZERO + uvw(3) = TWO*(xyz(3) - this%z0) + end function y_cylinder_normal + +!=============================================================================== +! SurfaceZCylinder Implementation +!=============================================================================== + + pure function z_cylinder_evaluate(this, xyz) result(f) + class(SurfaceZCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + real(8) :: x, y + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + f = x*x + y*y - this%r*this%r + end function z_cylinder_evaluate + + pure function z_cylinder_distance(this, xyz, uvw, coincident) result(d) + class(SurfaceZCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d + + real(8) :: x, y, k, a, c, quad + + a = ONE - uvw(3)*uvw(3) ! u^2 + v^2 + if (a == ZERO) then + d = INFINITY + else + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + k = x*uvw(1) + y*uvw(2) + c = x*x + y*y - this%r*this%r + quad = k*k - a*c + + if (quad < ZERO) then + ! no intersection with cylinder + + d = INFINITY + + elseif (coincident .or. abs(c) < FP_COINCIDENT) then + ! particle is on the cylinder, thus one distance is positive/negative + ! and the other is zero. The sign of k determines if we are facing in or + ! out + + if (k >= ZERO) then + d = INFINITY + else + d = (-k + sqrt(quad))/a + end if + + elseif (c < ZERO) then + ! particle is inside the cylinder, thus one distance must be negative + ! and one must be positive. The positive distance will be the one with + ! negative sign on sqrt(quad) + + d = (-k + sqrt(quad))/a + + else + ! particle is outside the cylinder, thus both distances are either + ! positive or negative. If positive, the smaller distance is the one + ! with positive sign on sqrt(quad) + + d = (-k - sqrt(quad))/a + if (d < ZERO) d = INFINITY + + end if + end if + end function z_cylinder_distance + + pure function z_cylinder_normal(this, xyz) result(uvw) + class(SurfaceZCylinder), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(1) = TWO*(xyz(1) - this%x0) + uvw(2) = TWO*(xyz(2) - this%y0) + uvw(3) = ZERO + end function z_cylinder_normal + +!=============================================================================== +! SphereImplementation +!=============================================================================== + + pure function sphere_evaluate(this, xyz) result(f) + class(SurfaceSphere), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + real(8) :: x, y, z + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + f = x*x + y*y + z*z - this%r*this%r + end function sphere_evaluate + + pure function sphere_distance(this, xyz, uvw, coincident) result(d) + class(SurfaceSphere), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d + + real(8) :: x, y, z, k, c, quad + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + k = x*uvw(1) + y*uvw(2) + z*uvw(3) + c = x*x + y*y + z*z - this%r*this%r + quad = k*k - c + + if (quad < ZERO) then + ! no intersection with sphere + + d = INFINITY + + elseif (coincident .or. abs(c) < FP_COINCIDENT) then + ! particle is on the sphere, thus one distance is positive/negative and + ! the other is zero. The sign of k determines if we are facing in or out + + if (k >= ZERO) then + d = INFINITY + else + d = -k + sqrt(quad) + end if + + elseif (c < ZERO) then + ! particle is inside the sphere, thus one distance must be negative and + ! one must be positive. The positive distance will be the one with + ! negative sign on sqrt(quad) + + d = -k + sqrt(quad) + + else + ! particle is outside the sphere, thus both distances are either positive + ! or negative. If positive, the smaller distance is the one with positive + ! sign on sqrt(quad) + + d = -k - sqrt(quad) + if (d < ZERO) d = INFINITY + + end if + end function sphere_distance + + pure function sphere_normal(this, xyz) result(uvw) + class(SurfaceSphere), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(:) = TWO*(xyz - [this%x0, this%y0, this%z0]) + end function sphere_normal + +!=============================================================================== +! SurfaceXCone Implementation +!=============================================================================== + + pure function x_cone_evaluate(this, xyz) result(f) + class(SurfaceXCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + real(8) :: x, y, z + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + f = y*y + z*z - this%r2*x*x + end function x_cone_evaluate + + pure function x_cone_distance(this, xyz, uvw, coincident) result(d) + class(SurfaceXCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d + + real(8) :: x, y, z, k, a, b, c, quad + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + a = uvw(2)*uvw(2) + uvw(3)*uvw(3) - this%r2*uvw(1)*uvw(1) + k = y*uvw(2) + z*uvw(3) - this%r2*x*uvw(1) + c = y*y + z*z - this%r2*x*x + quad = k*k - a*c + + if (quad < ZERO) then + ! no intersection with cone + + d = INFINITY + + elseif (coincident .or. abs(c) < FP_COINCIDENT) then + ! particle is on the cone, thus one distance is positive/negative and the + ! other is zero. The sign of k determines which distance is zero and which + ! is not. + + if (k >= ZERO) then + d = (-k - sqrt(quad))/a + else + d = (-k + sqrt(quad))/a + end if + + else + ! calculate both solutions to the quadratic + quad = sqrt(quad) + d = (-k - quad)/a + b = (-k + quad)/a + + ! determine the smallest positive solution + if (d < ZERO) then + if (b > ZERO) then + d = b + end if + else + if (b > ZERO) d = min(d, b) + end if + end if + + ! If the distance was negative, set boundary distance to infinity + if (d <= ZERO) d = INFINITY + end function x_cone_distance + + pure function x_cone_normal(this, xyz) result(uvw) + class(SurfaceXCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(1) = -TWO*this%r2*(xyz(1) - this%x0) + uvw(2) = TWO*(xyz(2) - this%y0) + uvw(3) = TWO*(xyz(3) - this%z0) + end function x_cone_normal + +!=============================================================================== +! SurfaceYCone Implementation +!=============================================================================== + + pure function y_cone_evaluate(this, xyz) result(f) + class(SurfaceYCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + real(8) :: x, y, z + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + f = x*x + z*z - this%r2*y*y + end function y_cone_evaluate + + pure function y_cone_distance(this, xyz, uvw, coincident) result(d) + class(SurfaceYCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d + + real(8) :: x, y, z, k, a, b, c, quad + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + a = uvw(1)*uvw(1) + uvw(3)*uvw(3) - this%r2*uvw(2)*uvw(2) + k = x*uvw(1) + z*uvw(3) - this%r2*y*uvw(2) + c = x*x + z*z - this%r2*y*y + quad = k*k - a*c + + if (quad < ZERO) then + ! no intersection with cone + + d = INFINITY + + elseif (coincident .or. abs(c) < FP_COINCIDENT) then + ! particle is on the cone, thus one distance is positive/negative and the + ! other is zero. The sign of k determines which distance is zero and which + ! is not. + + if (k >= ZERO) then + d = (-k - sqrt(quad))/a + else + d = (-k + sqrt(quad))/a + end if + + else + ! calculate both solutions to the quadratic + quad = sqrt(quad) + d = (-k - quad)/a + b = (-k + quad)/a + + ! determine the smallest positive solution + if (d < ZERO) then + if (b > ZERO) then + d = b + end if + else + if (b > ZERO) d = min(d, b) + end if + end if + + ! If the distance was negative, set boundary distance to infinity + if (d <= ZERO) d = INFINITY + end function y_cone_distance + + pure function y_cone_normal(this, xyz) result(uvw) + class(SurfaceYCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(1) = TWO*(xyz(1) - this%x0) + uvw(2) = -TWO*this%r2*(xyz(2) - this%y0) + uvw(3) = TWO*(xyz(3) - this%z0) + end function y_cone_normal + +!=============================================================================== +! SurfaceZConeImplementation +!=============================================================================== + + pure function z_cone_evaluate(this, xyz) result(f) + class(SurfaceZCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: f + + real(8) :: x, y, z + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + f = x*x + y*y - this%r2*z*z + end function z_cone_evaluate + + pure function z_cone_distance(this, xyz, uvw, coincident) result(d) + class(SurfaceZCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8), intent(in) :: uvw(3) + logical, intent(in) :: coincident + real(8) :: d + + real(8) :: x, y, z, k, a, b, c, quad + + x = xyz(1) - this%x0 + y = xyz(2) - this%y0 + z = xyz(3) - this%z0 + a = uvw(1)*uvw(1) + uvw(2)*uvw(2) - this%r2*uvw(3)*uvw(3) + k = x*uvw(1) + y*uvw(2) - this%r2*z*uvw(3) + c = x*x + y*y - this%r2*z*z + quad = k*k - a*c + + if (quad < ZERO) then + ! no intersection with cone + + d = INFINITY + + elseif (coincident .or. abs(c) < FP_COINCIDENT) then + ! particle is on the cone, thus one distance is positive/negative and the + ! other is zero. The sign of k determines which distance is zero and which + ! is not. + + if (k >= ZERO) then + d = (-k - sqrt(quad))/a + else + d = (-k + sqrt(quad))/a + end if + + else + ! calculate both solutions to the quadratic + quad = sqrt(quad) + d = (-k - quad)/a + b = (-k + quad)/a + + ! determine the smallest positive solution + if (d < ZERO) then + if (b > ZERO) then + d = b + end if + else + if (b > ZERO) d = min(d, b) + end if + end if + + ! If the distance was negative, set boundary distance to infinity + if (d <= ZERO) d = INFINITY + end function z_cone_distance + + pure function z_cone_normal(this, xyz) result(uvw) + class(SurfaceZCone), intent(in) :: this + real(8), intent(in) :: xyz(3) + real(8) :: uvw(3) + + uvw(1) = TWO*(xyz(1) - this%x0) + uvw(2) = TWO*(xyz(2) - this%y0) + uvw(3) = -TWO*this%r2*(xyz(3) - this%z0) + end function z_cone_normal + +end module surface_header diff --git a/src/tally.F90 b/src/tally.F90 index d8ecf4db5..b1c9b7b34 100644 --- a/src/tally.F90 +++ b/src/tally.F90 @@ -992,6 +992,8 @@ contains logical :: found_bin ! was a scoring bin found? logical :: start_in_mesh ! starting coordinates inside mesh? logical :: end_in_mesh ! ending coordinates inside mesh? + real(8) :: theta + real(8) :: phi type(TallyObject), pointer :: t type(RegularMesh), pointer :: m type(Material), pointer :: mat @@ -1077,6 +1079,40 @@ contains k + 1, p % E) end if + case (FILTER_POLAR) + ! Get theta value + theta = acos(p % coord(1) % uvw(3)) + + ! determine polar angle bin + k = t % filters(i) % n_bins + + ! check if particle is within polar angle bins + if (theta < t % filters(i) % real_bins(1) .or. & + theta > t % filters(i) % real_bins(k + 1)) then + matching_bins(i) = NO_BIN_FOUND + else + ! search to find polar angle bin + matching_bins(i) = binary_search(t % filters(i) % real_bins, & + k + 1, theta) + end if + + case (FILTER_AZIMUTHAL) + ! make sure the correct direction vector is used + phi = atan2(p % coord(1) % uvw(2), p % coord(1) % uvw(1)) + + ! determine mu bin + k = t % filters(i) % n_bins + + ! check if particle is within azimuthal angle bins + if (phi < t % filters(i) % real_bins(1) .or. & + phi > t % filters(i) % real_bins(k + 1)) then + matching_bins(i) = NO_BIN_FOUND + else + ! search to find azimuthal angle bin + matching_bins(i) = binary_search(t % filters(i) % real_bins, & + k + 1, phi) + end if + end select ! Check if no matching bin was found @@ -1333,6 +1369,7 @@ contains integer :: n ! number of bins for single filter integer :: offset ! offset for distribcell real(8) :: E ! particle energy + real(8) :: theta, phi ! Polar and Azimuthal Angles, respectively type(TallyObject), pointer :: t type(RegularMesh), pointer :: m @@ -1443,6 +1480,61 @@ contains n + 1, p % E) end if + case (FILTER_MU) + ! determine mu bin + n = t % filters(i) % n_bins + + ! check if particle is within mu bins + if (p % mu < t % filters(i) % real_bins(1) .or. & + p % mu > t % filters(i) % real_bins(n + 1)) then + matching_bins(i) = NO_BIN_FOUND + else + ! search to find mu bin + matching_bins(i) = binary_search(t % filters(i) % real_bins, & + n + 1, p % mu) + end if + + case (FILTER_POLAR) + ! make sure the correct direction vector is used + if (t % estimator == ESTIMATOR_TRACKLENGTH) then + theta = acos(p % coord(1) % uvw(3)) + else + theta = acos(p % last_uvw(3)) + end if + + ! determine polar angle bin + n = t % filters(i) % n_bins + + ! check if particle is within polar angle bins + if (theta < t % filters(i) % real_bins(1) .or. & + theta > t % filters(i) % real_bins(n + 1)) then + matching_bins(i) = NO_BIN_FOUND + else + ! search to find polar angle bin + matching_bins(i) = binary_search(t % filters(i) % real_bins, & + n + 1, theta) + end if + + case (FILTER_AZIMUTHAL) + ! make sure the correct direction vector is used + if (t % estimator == ESTIMATOR_TRACKLENGTH) then + phi = atan2(p % coord(1) % uvw(2), p % coord(1) % uvw(1)) + else + phi = atan2(p % last_uvw(2), p % last_uvw(1)) + end if + ! determine mu bin + n = t % filters(i) % n_bins + + ! check if particle is within azimuthal angle bins + if (phi < t % filters(i) % real_bins(1) .or. & + phi > t % filters(i) % real_bins(n + 1)) then + matching_bins(i) = NO_BIN_FOUND + else + ! search to find azimuthal angle bin + matching_bins(i) = binary_search(t % filters(i) % real_bins, & + n + 1, phi) + end if + end select ! If the current filter didn't match, exit this subroutine diff --git a/tests/input_set.py b/tests/input_set.py new file mode 100644 index 000000000..87b857f4a --- /dev/null +++ b/tests/input_set.py @@ -0,0 +1,571 @@ +import openmc + + +class InputSet(object): + def __init__(self): + self.settings = openmc.SettingsFile() + self.materials = openmc.MaterialsFile() + self.geometry = openmc.GeometryFile() + self.tallies = None + self.plots = None + + def export(self): + self.settings.export_to_xml() + self.materials.export_to_xml() + self.geometry.export_to_xml() + if self.tallies is not None: self.tallies.export_to_xml() + if self.plots is not None: self.plots.export_to_xml() + + def build_default_materials_and_geometry(self): + # Define materials. + fuel = openmc.Material(name='Fuel', material_id=1) + fuel.set_density('g/cm3', 10.062) + fuel.add_nuclide("U-234", 4.9476e-6) + fuel.add_nuclide("U-235", 4.8218e-4) + fuel.add_nuclide("U-236", 9.0402e-5) + fuel.add_nuclide("U-238", 2.1504e-2) + fuel.add_nuclide("Np-237", 7.3733e-6) + fuel.add_nuclide("Pu-238", 1.5148e-6) + fuel.add_nuclide("Pu-239", 1.3955e-4) + fuel.add_nuclide("Pu-240", 3.4405e-5) + fuel.add_nuclide("Pu-241", 2.1439e-5) + fuel.add_nuclide("Pu-242", 3.7422e-6) + fuel.add_nuclide("Am-241", 4.5041e-7) + fuel.add_nuclide("Am-242m", 9.2301e-9) + fuel.add_nuclide("Am-243", 4.7878e-7) + fuel.add_nuclide("Cm-242", 1.0485e-7) + fuel.add_nuclide("Cm-243", 1.4268e-9) + fuel.add_nuclide("Cm-244", 8.8756e-8) + fuel.add_nuclide("Cm-245", 3.5285e-9) + fuel.add_nuclide("Mo-95", 2.6497e-5) + fuel.add_nuclide("Tc-99", 3.2772e-5) + fuel.add_nuclide("Ru-101", 3.0742e-5) + fuel.add_nuclide("Ru-103", 2.3505e-6) + fuel.add_nuclide("Ag-109", 2.0009e-6) + fuel.add_nuclide("Xe-135", 1.0801e-8) + fuel.add_nuclide("Cs-133", 3.4612e-5) + fuel.add_nuclide("Nd-143", 2.6078e-5) + fuel.add_nuclide("Nd-145", 1.9898e-5) + fuel.add_nuclide("Sm-147", 1.6128e-6) + fuel.add_nuclide("Sm-149", 1.1627e-7) + fuel.add_nuclide("Sm-150", 7.1727e-6) + fuel.add_nuclide("Sm-151", 5.4947e-7) + fuel.add_nuclide("Sm-152", 3.0221e-6) + fuel.add_nuclide("Eu-153", 2.6209e-6) + fuel.add_nuclide("Gd-155", 1.5369e-9) + fuel.add_nuclide("O-16", 4.5737e-2) + + clad = openmc.Material(name='Cladding', material_id=2) + clad.set_density('g/cm3', 5.77) + clad.add_nuclide("Zr-90", 0.5145) + clad.add_nuclide("Zr-91", 0.1122) + clad.add_nuclide("Zr-92", 0.1715) + clad.add_nuclide("Zr-94", 0.1738) + clad.add_nuclide("Zr-96", 0.0280) + + cold_water = openmc.Material(name='Cold borated water', material_id=3) + cold_water.set_density('atom/b-cm', 0.07416) + cold_water.add_nuclide("H-1", 2.0) + cold_water.add_nuclide("O-16", 1.0) + cold_water.add_nuclide("B-10", 6.490e-4) + cold_water.add_nuclide("B-11", 2.689e-3) + cold_water.add_s_alpha_beta('HH2O', '71t') + + hot_water = openmc.Material(name='Hot borated water', material_id=4) + hot_water.set_density('atom/b-cm', 0.06614) + hot_water.add_nuclide("H-1", 2.0) + hot_water.add_nuclide("O-16", 1.0) + hot_water.add_nuclide("B-10", 6.490e-4) + hot_water.add_nuclide("B-11", 2.689e-3) + hot_water.add_s_alpha_beta('HH2O', '71t') + + rpv_steel = openmc.Material(name='Reactor pressure vessel steel', + material_id=5) + rpv_steel.set_density('g/cm3', 7.9) + rpv_steel.add_nuclide("Fe-54", 0.05437098, 'wo') + rpv_steel.add_nuclide("Fe-56", 0.88500663, 'wo') + rpv_steel.add_nuclide("Fe-57", 0.0208008, 'wo') + rpv_steel.add_nuclide("Fe-58", 0.00282159, 'wo') + rpv_steel.add_nuclide("Ni-58", 0.0067198, 'wo') + rpv_steel.add_nuclide("Ni-60", 0.0026776, 'wo') + rpv_steel.add_nuclide("Ni-61", 0.0001183, 'wo') + rpv_steel.add_nuclide("Ni-62", 0.0003835, 'wo') + rpv_steel.add_nuclide("Ni-64", 0.0001008, 'wo') + rpv_steel.add_nuclide("Mn-55", 0.01, 'wo') + rpv_steel.add_nuclide("Mo-92", 0.000849, 'wo') + rpv_steel.add_nuclide("Mo-94", 0.0005418, 'wo') + rpv_steel.add_nuclide("Mo-95", 0.0009438, 'wo') + rpv_steel.add_nuclide("Mo-96", 0.0010002, 'wo') + rpv_steel.add_nuclide("Mo-97", 0.0005796, 'wo') + rpv_steel.add_nuclide("Mo-98", 0.0014814, 'wo') + rpv_steel.add_nuclide("Mo-100", 0.0006042, 'wo') + rpv_steel.add_nuclide("Si-28", 0.00367464, 'wo') + rpv_steel.add_nuclide("Si-29", 0.00019336, 'wo') + rpv_steel.add_nuclide("Si-30", 0.000132, 'wo') + rpv_steel.add_nuclide("Cr-50", 0.00010435, 'wo') + rpv_steel.add_nuclide("Cr-52", 0.002092475, 'wo') + rpv_steel.add_nuclide("Cr-53", 0.00024185, 'wo') + rpv_steel.add_nuclide("Cr-54", 6.1325e-05, 'wo') + rpv_steel.add_nuclide("C-Nat", 0.0025, 'wo') + rpv_steel.add_nuclide("Cu-63", 0.0013696, 'wo') + rpv_steel.add_nuclide("Cu-65", 0.0006304, 'wo') + + lower_rad_ref = openmc.Material(name='Lower radial reflector', + material_id=6) + lower_rad_ref.set_density('g/cm3', 4.32) + lower_rad_ref.add_nuclide("H-1", 0.0095661, 'wo') + lower_rad_ref.add_nuclide("O-16", 0.0759107, 'wo') + lower_rad_ref.add_nuclide("B-10", 3.08409e-5, 'wo') + lower_rad_ref.add_nuclide("B-11", 1.40499e-4, 'wo') + lower_rad_ref.add_nuclide("Fe-54", 0.035620772088, 'wo') + lower_rad_ref.add_nuclide("Fe-56", 0.579805982228, 'wo') + lower_rad_ref.add_nuclide("Fe-57", 0.01362750048, 'wo') + lower_rad_ref.add_nuclide("Fe-58", 0.001848545204, 'wo') + lower_rad_ref.add_nuclide("Ni-58", 0.055298376566, 'wo') + lower_rad_ref.add_nuclide("Ni-60", 0.022034425592, 'wo') + lower_rad_ref.add_nuclide("Ni-61", 0.000973510811, 'wo') + lower_rad_ref.add_nuclide("Ni-62", 0.003155886695, 'wo') + lower_rad_ref.add_nuclide("Ni-64", 0.000829500336, 'wo') + lower_rad_ref.add_nuclide("Mn-55", 0.0182870, 'wo') + lower_rad_ref.add_nuclide("Si-28", 0.00839976771, 'wo') + lower_rad_ref.add_nuclide("Si-29", 0.00044199679, 'wo') + lower_rad_ref.add_nuclide("Si-30", 0.0003017355, 'wo') + lower_rad_ref.add_nuclide("Cr-50", 0.007251360806, 'wo') + lower_rad_ref.add_nuclide("Cr-52", 0.145407678031, 'wo') + lower_rad_ref.add_nuclide("Cr-53", 0.016806340306, 'wo') + lower_rad_ref.add_nuclide("Cr-54", 0.004261520857, 'wo') + lower_rad_ref.add_s_alpha_beta('HH2O', '71t') + + upper_rad_ref = openmc.Material(name='Upper radial reflector /' + 'Top plate region', material_id=7) + upper_rad_ref.set_density('g/cm3', 4.28) + upper_rad_ref.add_nuclide("H-1", 0.0086117, 'wo') + upper_rad_ref.add_nuclide("O-16", 0.0683369, 'wo') + upper_rad_ref.add_nuclide("B-10", 2.77638e-5, 'wo') + upper_rad_ref.add_nuclide("B-11", 1.26481e-4, 'wo') + upper_rad_ref.add_nuclide("Fe-54", 0.035953677186, 'wo') + upper_rad_ref.add_nuclide("Fe-56", 0.585224740891, 'wo') + upper_rad_ref.add_nuclide("Fe-57", 0.01375486056, 'wo') + upper_rad_ref.add_nuclide("Fe-58", 0.001865821363, 'wo') + upper_rad_ref.add_nuclide("Ni-58", 0.055815129186, 'wo') + upper_rad_ref.add_nuclide("Ni-60", 0.022240333032, 'wo') + upper_rad_ref.add_nuclide("Ni-61", 0.000982608081, 'wo') + upper_rad_ref.add_nuclide("Ni-62", 0.003185377845, 'wo') + upper_rad_ref.add_nuclide("Ni-64", 0.000837251856, 'wo') + upper_rad_ref.add_nuclide("Mn-55", 0.0184579, 'wo') + upper_rad_ref.add_nuclide("Si-28", 0.00847831314, 'wo') + upper_rad_ref.add_nuclide("Si-29", 0.00044612986, 'wo') + upper_rad_ref.add_nuclide("Si-30", 0.000304557, 'wo') + upper_rad_ref.add_nuclide("Cr-50", 0.00731912987, 'wo') + upper_rad_ref.add_nuclide("Cr-52", 0.146766614995, 'wo') + upper_rad_ref.add_nuclide("Cr-53", 0.01696340737, 'wo') + upper_rad_ref.add_nuclide("Cr-54", 0.004301347765, 'wo') + upper_rad_ref.add_s_alpha_beta('HH2O', '71t') + + bot_plate = openmc.Material(name='Bottom plate region', material_id=8) + bot_plate.set_density('g/cm3', 7.184) + bot_plate.add_nuclide("H-1", 0.0011505, 'wo') + bot_plate.add_nuclide("O-16", 0.0091296, 'wo') + bot_plate.add_nuclide("B-10", 3.70915e-6, 'wo') + bot_plate.add_nuclide("B-11", 1.68974e-5, 'wo') + bot_plate.add_nuclide("Fe-54", 0.03855611055, 'wo') + bot_plate.add_nuclide("Fe-56", 0.627585036425, 'wo') + bot_plate.add_nuclide("Fe-57", 0.014750478, 'wo') + bot_plate.add_nuclide("Fe-58", 0.002000875025, 'wo') + bot_plate.add_nuclide("Ni-58", 0.059855207342, 'wo') + bot_plate.add_nuclide("Ni-60", 0.023850159704, 'wo') + bot_plate.add_nuclide("Ni-61", 0.001053732407, 'wo') + bot_plate.add_nuclide("Ni-62", 0.003415945715, 'wo') + bot_plate.add_nuclide("Ni-64", 0.000897854832, 'wo') + bot_plate.add_nuclide("Mn-55", 0.0197940, 'wo') + bot_plate.add_nuclide("Si-28", 0.00909197802, 'wo') + bot_plate.add_nuclide("Si-29", 0.00047842098, 'wo') + bot_plate.add_nuclide("Si-30", 0.000326601, 'wo') + bot_plate.add_nuclide("Cr-50", 0.007848910646, 'wo') + bot_plate.add_nuclide("Cr-52", 0.157390026871, 'wo') + bot_plate.add_nuclide("Cr-53", 0.018191270146, 'wo') + bot_plate.add_nuclide("Cr-54", 0.004612692337, 'wo') + bot_plate.add_s_alpha_beta('HH2O', '71t') + + bot_nozzle = openmc.Material(name='Bottom nozzle region', material_id=9) + bot_nozzle.set_density('g/cm3', 2.53) + bot_nozzle.add_nuclide("H-1", 0.0245014, 'wo') + bot_nozzle.add_nuclide("O-16", 0.1944274, 'wo') + bot_nozzle.add_nuclide("B-10", 7.89917e-5, 'wo') + bot_nozzle.add_nuclide("B-11", 3.59854e-4, 'wo') + bot_nozzle.add_nuclide("Fe-54", 0.030411411144, 'wo') + bot_nozzle.add_nuclide("Fe-56", 0.495012237964, 'wo') + bot_nozzle.add_nuclide("Fe-57", 0.01163454624, 'wo') + bot_nozzle.add_nuclide("Fe-58", 0.001578204652, 'wo') + bot_nozzle.add_nuclide("Ni-58", 0.047211231662, 'wo') + bot_nozzle.add_nuclide("Ni-60", 0.018811987544, 'wo') + bot_nozzle.add_nuclide("Ni-61", 0.000831139127, 'wo') + bot_nozzle.add_nuclide("Ni-62", 0.002694352115, 'wo') + bot_nozzle.add_nuclide("Ni-64", 0.000708189552, 'wo') + bot_nozzle.add_nuclide("Mn-55", 0.0156126, 'wo') + bot_nozzle.add_nuclide("Si-28", 0.007171335558, 'wo') + bot_nozzle.add_nuclide("Si-29", 0.000377356542, 'wo') + bot_nozzle.add_nuclide("Si-30", 0.0002576079, 'wo') + bot_nozzle.add_nuclide("Cr-50", 0.006190885148, 'wo') + bot_nozzle.add_nuclide("Cr-52", 0.124142524198, 'wo') + bot_nozzle.add_nuclide("Cr-53", 0.014348496148, 'wo') + bot_nozzle.add_nuclide("Cr-54", 0.003638294506, 'wo') + bot_nozzle.add_s_alpha_beta('HH2O', '71t') + + top_nozzle = openmc.Material(name='Top nozzle region', material_id=10) + top_nozzle.set_density('g/cm3', 1.746) + top_nozzle.add_nuclide("H-1", 0.0358870, 'wo') + top_nozzle.add_nuclide("O-16", 0.2847761, 'wo') + top_nozzle.add_nuclide("B-10", 1.15699e-4, 'wo') + top_nozzle.add_nuclide("B-11", 5.27075e-4, 'wo') + top_nozzle.add_nuclide("Fe-54", 0.02644016154, 'wo') + top_nozzle.add_nuclide("Fe-56", 0.43037146399, 'wo') + top_nozzle.add_nuclide("Fe-57", 0.0101152584, 'wo') + top_nozzle.add_nuclide("Fe-58", 0.00137211607, 'wo') + top_nozzle.add_nuclide("Ni-58", 0.04104621835, 'wo') + top_nozzle.add_nuclide("Ni-60", 0.0163554502, 'wo') + top_nozzle.add_nuclide("Ni-61", 0.000722605975, 'wo') + top_nozzle.add_nuclide("Ni-62", 0.002342513875, 'wo') + top_nozzle.add_nuclide("Ni-64", 0.0006157116, 'wo') + top_nozzle.add_nuclide("Mn-55", 0.0135739, 'wo') + top_nozzle.add_nuclide("Si-28", 0.006234853554, 'wo') + top_nozzle.add_nuclide("Si-29", 0.000328078746, 'wo') + top_nozzle.add_nuclide("Si-30", 0.0002239677, 'wo') + top_nozzle.add_nuclide("Cr-50", 0.005382452306, 'wo') + top_nozzle.add_nuclide("Cr-52", 0.107931450781, 'wo') + top_nozzle.add_nuclide("Cr-53", 0.012474806806, 'wo') + top_nozzle.add_nuclide("Cr-54", 0.003163190107, 'wo') + top_nozzle.add_s_alpha_beta('HH2O', '71t') + + top_fa = openmc.Material(name='Top of fuel assemblies', material_id=11) + top_fa.set_density('g/cm3', 3.044) + top_fa.add_nuclide("H-1", 0.0162913, 'wo') + top_fa.add_nuclide("O-16", 0.1292776, 'wo') + top_fa.add_nuclide("B-10", 5.25228e-5, 'wo') + top_fa.add_nuclide("B-11", 2.39272e-4, 'wo') + top_fa.add_nuclide("Zr-90", 0.43313403903, 'wo') + top_fa.add_nuclide("Zr-91", 0.09549277374, 'wo') + top_fa.add_nuclide("Zr-92", 0.14759527104, 'wo') + top_fa.add_nuclide("Zr-94", 0.15280552077, 'wo') + top_fa.add_nuclide("Zr-96", 0.02511169542, 'wo') + top_fa.add_s_alpha_beta('HH2O', '71t') + + bot_fa = openmc.Material(name='Bottom of fuel assemblies', material_id=12) + bot_fa.set_density('g/cm3', 1.762) + bot_fa.add_nuclide("H-1", 0.0292856, 'wo') + bot_fa.add_nuclide("O-16", 0.2323919, 'wo') + bot_fa.add_nuclide("B-10", 9.44159e-5, 'wo') + bot_fa.add_nuclide("B-11", 4.30120e-4, 'wo') + bot_fa.add_nuclide("Zr-90", 0.3741373658, 'wo') + bot_fa.add_nuclide("Zr-91", 0.0824858164, 'wo') + bot_fa.add_nuclide("Zr-92", 0.1274914944, 'wo') + bot_fa.add_nuclide("Zr-94", 0.1319920622, 'wo') + bot_fa.add_nuclide("Zr-96", 0.0216912612, 'wo') + bot_fa.add_s_alpha_beta('HH2O', '71t') + + # Define the materials file. + self.materials.default_xs = '71c' + self.materials.add_materials((fuel, clad, cold_water, hot_water, + rpv_steel, lower_rad_ref, upper_rad_ref, bot_plate, bot_nozzle, + top_nozzle, top_fa, bot_fa)) + + # Define surfaces. + s1 = openmc.ZCylinder(R=0.41, surface_id=1) + s2 = openmc.ZCylinder(R=0.475, surface_id=2) + s3 = openmc.ZCylinder(R=0.56, surface_id=3) + s4 = openmc.ZCylinder(R=0.62, surface_id=4) + s5 = openmc.ZCylinder(R=187.6, surface_id=5) + s6 = openmc.ZCylinder(R=209.0, surface_id=6) + s7 = openmc.ZCylinder(R=229.0, surface_id=7) + s8 = openmc.ZCylinder(R=249.0, surface_id=8) + s8.boundary_type = 'vacuum' + + s31 = openmc.ZPlane(z0=-229.0, surface_id=31) + s31.boundary_type = 'vacuum' + s32 = openmc.ZPlane(z0=-199.0, surface_id=32) + s33 = openmc.ZPlane(z0=-193.0, surface_id=33) + s34 = openmc.ZPlane(z0=-183.0, surface_id=34) + s35 = openmc.ZPlane(z0=0.0, surface_id=35) + s36 = openmc.ZPlane(z0=183.0, surface_id=36) + s37 = openmc.ZPlane(z0=203.0, surface_id=37) + s38 = openmc.ZPlane(z0=215.0, surface_id=38) + s39 = openmc.ZPlane(z0=223.0, surface_id=39) + s39.boundary_type = 'vacuum' + + # Define pin cells. + fuel_cold = openmc.Universe(name='Fuel pin, cladding, cold water', + universe_id=1) + c21 = openmc.Cell(cell_id=21) + c21.region = -s1 + c21.fill = fuel + c22 = openmc.Cell(cell_id=22) + c22.region = +s1 & -s2 + c22.fill = clad + c23 = openmc.Cell(cell_id=23) + c23.region = +s2 + c23.fill = cold_water + fuel_cold.add_cells((c21, c22, c23)) + + tube_cold = openmc.Universe(name='Instrumentation guide tube, ' + 'cold water', universe_id=2) + c24 = openmc.Cell(cell_id=24) + c24.region = -s3 + c24.fill = cold_water + c25 = openmc.Cell(cell_id=25) + c25.region = +s3 & -s4 + c25.fill = clad + c26 = openmc.Cell(cell_id=26) + c26.region = +s4 + c26.fill = cold_water + tube_cold.add_cells((c24, c25, c26)) + + fuel_hot = openmc.Universe(name='Fuel pin, cladding, hot water', + universe_id=3) + c27 = openmc.Cell(cell_id=27) + c27.region = -s1 + c27.fill = fuel + c28 = openmc.Cell(cell_id=28) + c28.region = +s1 & -s2 + c28.fill = clad + c29 = openmc.Cell(cell_id=29) + c29.region = +s2 + c29.fill = hot_water + fuel_hot.add_cells((c27, c28, c29)) + + tube_hot = openmc.Universe(name='Instrumentation guide tube, hot water', + universe_id=4) + c30 = openmc.Cell(cell_id=30) + c30.region = -s3 + c30.fill = hot_water + c31 = openmc.Cell(cell_id=31) + c31.region = +s3 & -s4 + c31.fill = clad + c32 = openmc.Cell(cell_id=32) + c32.region = +s4 + c32.fill = hot_water + tube_hot.add_cells((c30, c31, c32)) + + # Define fuel lattices. + l100 = openmc.RectLattice(name='Fuel assembly (lower half)', + lattice_id=100) + l100.dimension = (17, 17) + l100.lower_left = (-10.71, -10.71) + l100.pitch = (1.26, 1.26) + l100.universes = [ + [fuel_cold]*17, + [fuel_cold]*17, + [fuel_cold]*5 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*5, + [fuel_cold]*3 + [tube_cold] + [fuel_cold]*9 + [tube_cold] + + [fuel_cold]*3, + [fuel_cold]*17, + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2, + [fuel_cold]*17, + [fuel_cold]*17, + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2, + [fuel_cold]*17, + [fuel_cold]*17, + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*2, + [fuel_cold]*17, + [fuel_cold]*3 + [tube_cold] + [fuel_cold]*9 + [tube_cold] + + [fuel_cold]*3, + [fuel_cold]*5 + [tube_cold] + [fuel_cold]*2 + [tube_cold] + + [fuel_cold]*2 + [tube_cold] + [fuel_cold]*5, + [fuel_cold]*17, + [fuel_cold]*17 ] + + l101 = openmc.RectLattice(name='Fuel assembly (upper half)', + lattice_id=101) + l101.dimension = (17, 17) + l101.lower_left = (-10.71, -10.71) + l101.pitch = (1.26, 1.26) + l101.universes = [ + [fuel_hot]*17, + [fuel_hot]*17, + [fuel_hot]*5 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*5, + [fuel_hot]*3 + [tube_hot] + [fuel_hot]*9 + [tube_hot] + + [fuel_hot]*3, + [fuel_hot]*17, + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2, + [fuel_hot]*17, + [fuel_hot]*17, + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2, + [fuel_hot]*17, + [fuel_hot]*17, + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*2, + [fuel_hot]*17, + [fuel_hot]*3 + [tube_hot] + [fuel_hot]*9 + [tube_hot] + + [fuel_hot]*3, + [fuel_hot]*5 + [tube_hot] + [fuel_hot]*2 + [tube_hot] + + [fuel_hot]*2 + [tube_hot] + [fuel_hot]*5, + [fuel_hot]*17, + [fuel_hot]*17 ] + + # Define assemblies. + fa_cw = openmc.Universe(name='Water assembly (cold)', universe_id=5) + c50 = openmc.Cell(cell_id=50) + c50.region = +s34 & -s35 + c50.fill = cold_water + fa_cw.add_cells((c50, )) + + fa_hw = openmc.Universe(name='Water assembly (hot)', universe_id=7) + c70 = openmc.Cell(cell_id=70) + c70.region = +s35 & -s36 + c70.fill = hot_water + fa_hw.add_cells((c70, )) + + fa_cold = openmc.Universe(name='Fuel assembly (cold)', universe_id=6) + c60 = openmc.Cell(cell_id=60) + c60.region = +s34 & -s35 + c60.fill = l100 + fa_cold.add_cells((c60, )) + + fa_hot = openmc.Universe(name='Fuel assembly (hot)', universe_id=8) + c80 = openmc.Cell(cell_id=80) + c80.region = +s35 & -s36 + c80.fill = l101 + fa_hot.add_cells((c80, )) + + # Define core lattices + l200 = openmc.RectLattice(name='Core lattice (lower half)', + lattice_id=200) + l200.dimension = (21, 21) + l200.lower_left = (-224.91, -224.91) + l200.pitch = (21.42, 21.42) + l200.universes = [ + [fa_cw]*21, + [fa_cw]*21, + [fa_cw]*7 + [fa_cold]*7 + [fa_cw]*7, + [fa_cw]*5 + [fa_cold]*11 + [fa_cw]*5, + [fa_cw]*4 + [fa_cold]*13 + [fa_cw]*4, + [fa_cw]*3 + [fa_cold]*15 + [fa_cw]*3, + [fa_cw]*3 + [fa_cold]*15 + [fa_cw]*3, + [fa_cw]*2 + [fa_cold]*17 + [fa_cw]*2, + [fa_cw]*2 + [fa_cold]*17 + [fa_cw]*2, + [fa_cw]*2 + [fa_cold]*17 + [fa_cw]*2, + [fa_cw]*2 + [fa_cold]*17 + [fa_cw]*2, + [fa_cw]*2 + [fa_cold]*17 + [fa_cw]*2, + [fa_cw]*2 + [fa_cold]*17 + [fa_cw]*2, + [fa_cw]*2 + [fa_cold]*17 + [fa_cw]*2, + [fa_cw]*3 + [fa_cold]*15 + [fa_cw]*3, + [fa_cw]*3 + [fa_cold]*15 + [fa_cw]*3, + [fa_cw]*4 + [fa_cold]*13 + [fa_cw]*4, + [fa_cw]*5 + [fa_cold]*11 + [fa_cw]*5, + [fa_cw]*7 + [fa_cold]*7 + [fa_cw]*7, + [fa_cw]*21, + [fa_cw]*21] + + l201 = openmc.RectLattice(name='Core lattice (lower half)', + lattice_id=201) + l201.dimension = (21, 21) + l201.lower_left = (-224.91, -224.91) + l201.pitch = (21.42, 21.42) + l201.universes = [ + [fa_hw]*21, + [fa_hw]*21, + [fa_hw]*7 + [fa_hot]*7 + [fa_hw]*7, + [fa_hw]*5 + [fa_hot]*11 + [fa_hw]*5, + [fa_hw]*4 + [fa_hot]*13 + [fa_hw]*4, + [fa_hw]*3 + [fa_hot]*15 + [fa_hw]*3, + [fa_hw]*3 + [fa_hot]*15 + [fa_hw]*3, + [fa_hw]*2 + [fa_hot]*17 + [fa_hw]*2, + [fa_hw]*2 + [fa_hot]*17 + [fa_hw]*2, + [fa_hw]*2 + [fa_hot]*17 + [fa_hw]*2, + [fa_hw]*2 + [fa_hot]*17 + [fa_hw]*2, + [fa_hw]*2 + [fa_hot]*17 + [fa_hw]*2, + [fa_hw]*2 + [fa_hot]*17 + [fa_hw]*2, + [fa_hw]*2 + [fa_hot]*17 + [fa_hw]*2, + [fa_hw]*3 + [fa_hot]*15 + [fa_hw]*3, + [fa_hw]*3 + [fa_hot]*15 + [fa_hw]*3, + [fa_hw]*4 + [fa_hot]*13 + [fa_hw]*4, + [fa_hw]*5 + [fa_hot]*11 + [fa_hw]*5, + [fa_hw]*7 + [fa_hot]*7 + [fa_hw]*7, + [fa_hw]*21, + [fa_hw]*21] + + # Define root universe. + root = openmc.Universe(universe_id=0, name='root universe') + c1 = openmc.Cell(cell_id=1) + c1.region = -s6 & +s34 & -s35 + c1.fill = l200 + + c2 = openmc.Cell(cell_id=2) + c2.region = -s6 & +s35 & -s36 + c2.fill = l201 + + c3 = openmc.Cell(cell_id=3) + c3.region = -s7 & +s31 & -s32 + c3.fill = bot_plate + + c4 = openmc.Cell(cell_id=4) + c4.region = -s5 & +s32 & -s33 + c4.fill = bot_nozzle + + c5 = openmc.Cell(cell_id=5) + c5.region = -s5 & +s33 & -s34 + c5.fill = bot_fa + + c6 = openmc.Cell(cell_id=6) + c6.region = -s5 & +s36 & -s37 + c6.fill = top_fa + + c7 = openmc.Cell(cell_id=7) + c7.region = -s5 & +s37 & -s38 + c7.fill = top_nozzle + + c8 = openmc.Cell(cell_id=8) + c8.region = -s7 & +s38 & -s39 + c8.fill = upper_rad_ref + + c9 = openmc.Cell(cell_id=9) + c9.region = +s6 & -s7 & +s32 & -s38 + c9.fill = bot_nozzle + + c10 = openmc.Cell(cell_id=10) + c10.region = +s7 & -s8 & +s31 & -s39 + c10.fill = rpv_steel + + c11 = openmc.Cell(cell_id=11) + c11.region = +s5 & -s6 & +s32 & -s34 + c11.fill = lower_rad_ref + + c12 = openmc.Cell(cell_id=12) + c12.region = +s5 & -s6 & +s36 & -s38 + c12.fill = upper_rad_ref + + root.add_cells((c1, c2, c3, c4, c5, c6, c7, c8, c9, c10, c11, c12)) + + # Define the geometry file. + geometry = openmc.Geometry() + geometry.root_universe = root + + self.geometry.geometry = geometry + + def build_default_settings(self): + self.settings.batches = 10 + self.settings.inactive = 5 + self.settings.particles = 100 + self.settings.set_source_space('box', (-160, -160, -183, 160, 160, 183)) + + def build_defualt_plots(self): + plot = openmc.Plot() + plot.filename = 'mat' + plot.origin = (125, 125, 0) + plot.width = (250, 250) + plot.pixels = (3000, 3000) + plot.color = 'mat' + + self.plots.add_plot(plot) diff --git a/tests/test_basic/geometry.xml b/tests/test_basic/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_basic/geometry.xml +++ b/tests/test_basic/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_basic/test_basic.py b/tests/test_basic/test_basic.py index 6633e5911..2a595f3e6 100755 --- a/tests/test_basic/test_basic.py +++ b/tests/test_basic/test_basic.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_cmfd_feed/geometry.xml b/tests/test_cmfd_feed/geometry.xml index 57c4aa228..73ea679c4 100644 --- a/tests/test_cmfd_feed/geometry.xml +++ b/tests/test_cmfd_feed/geometry.xml @@ -4,7 +4,7 @@ 0 - -1 2 -3 4 -5 6 + -1 2 -3 4 -5 6 1 @@ -39,5 +39,5 @@ -1 reflective - + diff --git a/tests/test_cmfd_feed/test_cmfd_feed.py b/tests/test_cmfd_feed/test_cmfd_feed.py index a3d2f3031..3bc5f6174 100644 --- a/tests/test_cmfd_feed/test_cmfd_feed.py +++ b/tests/test_cmfd_feed/test_cmfd_feed.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import CMFDTestHarness diff --git a/tests/test_cmfd_nofeed/geometry.xml b/tests/test_cmfd_nofeed/geometry.xml index 57c4aa228..73ea679c4 100644 --- a/tests/test_cmfd_nofeed/geometry.xml +++ b/tests/test_cmfd_nofeed/geometry.xml @@ -4,7 +4,7 @@ 0 - -1 2 -3 4 -5 6 + -1 2 -3 4 -5 6 1 @@ -39,5 +39,5 @@ -1 reflective - + diff --git a/tests/test_cmfd_nofeed/test_cmfd_nofeed.py b/tests/test_cmfd_nofeed/test_cmfd_nofeed.py index a3d2f3031..3bc5f6174 100644 --- a/tests/test_cmfd_nofeed/test_cmfd_nofeed.py +++ b/tests/test_cmfd_nofeed/test_cmfd_nofeed.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import CMFDTestHarness diff --git a/tests/test_complex_cell/geometry.xml b/tests/test_complex_cell/geometry.xml new file mode 100644 index 000000000..18e304fe0 --- /dev/null +++ b/tests/test_complex_cell/geometry.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_complex_cell/materials.xml b/tests/test_complex_cell/materials.xml new file mode 100644 index 000000000..60ec99673 --- /dev/null +++ b/tests/test_complex_cell/materials.xml @@ -0,0 +1,23 @@ + + + + 71c + + + + + + + + + + + + + + + + + + + diff --git a/tests/test_complex_cell/results_true.dat b/tests/test_complex_cell/results_true.dat new file mode 100644 index 000000000..56e7e409f --- /dev/null +++ b/tests/test_complex_cell/results_true.dat @@ -0,0 +1,11 @@ +k-combined: +2.651570E-01 2.116381E-03 +tally 1: +2.639097E+00 +1.394398E+00 +2.743740E+00 +1.506124E+00 +1.041248E+00 +2.177204E-01 +1.087210E-01 +2.365126E-03 diff --git a/tests/test_filter_cellborn/settings.xml b/tests/test_complex_cell/settings.xml similarity index 62% rename from tests/test_filter_cellborn/settings.xml rename to tests/test_complex_cell/settings.xml index 517637a59..a6fd5da19 100644 --- a/tests/test_filter_cellborn/settings.xml +++ b/tests/test_complex_cell/settings.xml @@ -4,15 +4,12 @@ 10 5 - 100 + 1000 - - -160 -160 -183 - 160 160 183 - + -4 -4 -4 4 4 4 diff --git a/tests/test_filter_universe/tallies.xml b/tests/test_complex_cell/tallies.xml similarity index 60% rename from tests/test_filter_universe/tallies.xml rename to tests/test_complex_cell/tallies.xml index bcf16f53a..d1a7d387e 100644 --- a/tests/test_filter_universe/tallies.xml +++ b/tests/test_complex_cell/tallies.xml @@ -1,9 +1,7 @@ - - + total - - \ No newline at end of file + diff --git a/tests/test_complex_cell/test_complex_cell.py b/tests/test_complex_cell/test_complex_cell.py new file mode 100755 index 000000000..1777db993 --- /dev/null +++ b/tests/test_complex_cell/test_complex_cell.py @@ -0,0 +1,10 @@ +#!/usr/bin/env python + +import sys +sys.path.insert(0, '..') +from testing_harness import TestHarness + + +if __name__ == '__main__': + harness = TestHarness('statepoint.10.*', True) + harness.main() diff --git a/tests/test_confidence_intervals/geometry.xml b/tests/test_confidence_intervals/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_confidence_intervals/geometry.xml +++ b/tests/test_confidence_intervals/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_confidence_intervals/test_confidence_intervals.py b/tests/test_confidence_intervals/test_confidence_intervals.py index 1777db993..ed6addec4 100755 --- a/tests/test_confidence_intervals/test_confidence_intervals.py +++ b/tests/test_confidence_intervals/test_confidence_intervals.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_density_atombcm/geometry.xml b/tests/test_density_atombcm/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_density_atombcm/geometry.xml +++ b/tests/test_density_atombcm/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_density_atombcm/test_density_atombcm.py b/tests/test_density_atombcm/test_density_atombcm.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_density_atombcm/test_density_atombcm.py +++ b/tests/test_density_atombcm/test_density_atombcm.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_density_atomcm3/geometry.xml b/tests/test_density_atomcm3/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_density_atomcm3/geometry.xml +++ b/tests/test_density_atomcm3/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_density_atomcm3/test_density_atomcm3.py b/tests/test_density_atomcm3/test_density_atomcm3.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_density_atomcm3/test_density_atomcm3.py +++ b/tests/test_density_atomcm3/test_density_atomcm3.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_density_kgm3/geometry.xml b/tests/test_density_kgm3/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_density_kgm3/geometry.xml +++ b/tests/test_density_kgm3/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_density_kgm3/test_density_kgm3.py b/tests/test_density_kgm3/test_density_kgm3.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_density_kgm3/test_density_kgm3.py +++ b/tests/test_density_kgm3/test_density_kgm3.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_density_sum/geometry.xml b/tests/test_density_sum/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_density_sum/geometry.xml +++ b/tests/test_density_sum/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_density_sum/test_density_sum.py b/tests/test_density_sum/test_density_sum.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_density_sum/test_density_sum.py +++ b/tests/test_density_sum/test_density_sum.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_eigenvalue_genperbatch/geometry.xml b/tests/test_eigenvalue_genperbatch/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_eigenvalue_genperbatch/geometry.xml +++ b/tests/test_eigenvalue_genperbatch/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_eigenvalue_genperbatch/test_eigenvalue_genperbatch.py b/tests/test_eigenvalue_genperbatch/test_eigenvalue_genperbatch.py index 22752c189..d6f69fdbb 100644 --- a/tests/test_eigenvalue_genperbatch/test_eigenvalue_genperbatch.py +++ b/tests/test_eigenvalue_genperbatch/test_eigenvalue_genperbatch.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_eigenvalue_no_inactive/geometry.xml b/tests/test_eigenvalue_no_inactive/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_eigenvalue_no_inactive/geometry.xml +++ b/tests/test_eigenvalue_no_inactive/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_eigenvalue_no_inactive/test_eigenvalue_no_inactive.py b/tests/test_eigenvalue_no_inactive/test_eigenvalue_no_inactive.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_eigenvalue_no_inactive/test_eigenvalue_no_inactive.py +++ b/tests/test_eigenvalue_no_inactive/test_eigenvalue_no_inactive.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_energy_grid/geometry.xml b/tests/test_energy_grid/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_energy_grid/geometry.xml +++ b/tests/test_energy_grid/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_energy_grid/test_energy_grid.py b/tests/test_energy_grid/test_energy_grid.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_energy_grid/test_energy_grid.py +++ b/tests/test_energy_grid/test_energy_grid.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_entropy/geometry.xml b/tests/test_entropy/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_entropy/geometry.xml +++ b/tests/test_entropy/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_entropy/test_entropy.py b/tests/test_entropy/test_entropy.py index 43c17da14..113cafcb2 100644 --- a/tests/test_entropy/test_entropy.py +++ b/tests/test_entropy/test_entropy.py @@ -3,9 +3,9 @@ import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness +from openmc.statepoint import StatePoint class EntropyTestHarness(TestHarness): diff --git a/tests/test_filter_azimuthal/inputs_true.dat b/tests/test_filter_azimuthal/inputs_true.dat new file mode 100644 index 000000000..42b6e820b --- /dev/null +++ b/tests/test_filter_azimuthal/inputs_true.dat @@ -0,0 +1 @@ +1d5f81d12f607f4a8436dfb65167e2a2be55dbf86fbc2cc465cec274671be5eaff517d781a4d40e264bb695e3c66c7ff61a650217c99de2ca8c15ca747fe6b80 \ No newline at end of file diff --git a/tests/test_filter_azimuthal/results_true.dat b/tests/test_filter_azimuthal/results_true.dat new file mode 100644 index 000000000..7883a730d --- /dev/null +++ b/tests/test_filter_azimuthal/results_true.dat @@ -0,0 +1,76 @@ +k-combined: +9.903196E-01 4.279617E-02 +tally 1: +4.215917E+01 +3.561920E+02 +4.174788E+01 +3.505184E+02 +4.603223E+01 +4.242918E+02 +4.496760E+01 +4.075599E+02 +4.088099E+01 +3.376516E+02 +tally 2: +4.157239E+01 +3.482158E+02 +4.227810E+01 +3.613293E+02 +4.376107E+01 +3.835007E+02 +4.644205E+01 +4.327195E+02 +4.191554E+01 +3.522147E+02 +tally 3: +4.215917E+01 +3.561920E+02 +4.174788E+01 +3.505184E+02 +4.603223E+01 +4.242918E+02 +4.496402E+01 +4.075053E+02 +4.088458E+01 +3.377000E+02 +tally 4: +1.531988E+01 +4.816326E+01 +9.274393E+00 +1.821174E+01 +1.595868E+01 +5.124238E+01 +1.299895E+00 +6.417145E-01 +1.510024E+01 +4.604170E+01 +8.533361E+00 +1.462765E+01 +1.658141E+01 +5.595629E+01 +1.427417E+00 +6.621807E-01 +1.683102E+01 +5.741400E+01 +9.845257E+00 +2.028406E+01 +1.773179E+01 +6.477077E+01 +1.536972E+00 +6.111079E-01 +1.586070E+01 +5.360975E+01 +9.928220E+00 +2.089005E+01 +1.737609E+01 +6.161847E+01 +1.700608E+00 +8.439708E-01 +1.607027E+01 +5.490113E+01 +7.569336E+00 +1.280955E+01 +1.606086E+01 +5.308665E+01 +9.898901E-01 +3.143027E-01 diff --git a/tests/test_filter_azimuthal/test_filter_azimuthal.py b/tests/test_filter_azimuthal/test_filter_azimuthal.py new file mode 100644 index 000000000..248ba0012 --- /dev/null +++ b/tests/test_filter_azimuthal/test_filter_azimuthal.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +import os +import sys +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + +class FilterAzimuthalTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt1 = openmc.Filter(type='azimuthal', + bins=(-3.1416, -1.8850, -0.6283, 0.6283, 1.8850, + 3.1416)) + tally1 = openmc.Tally(tally_id=1) + tally1.add_filter(filt1) + tally1.add_score('flux') + tally1.estimator = 'tracklength' + + tally2 = openmc.Tally(tally_id=2) + tally2.add_filter(filt1) + tally2.add_score('flux') + tally2.estimator = 'analog' + + filt3 = openmc.Filter(type='azimuthal', bins=(5,)) + tally3 = openmc.Tally(tally_id=3) + tally3.add_filter(filt3) + tally3.add_score('flux') + tally3.estimator = 'tracklength' + + mesh = openmc.Mesh(mesh_id=1) + mesh.lower_left = [-182.07, -182.07] + mesh.upper_right = [182.07, 182.07] + mesh.dimension = [2, 2] + filt_mesh = openmc.Filter(type='mesh', bins=(1,)) + tally4 = openmc.Tally(tally_id=4) + tally4.add_filter(filt3) + tally4.add_filter(filt_mesh) + tally4.add_score('flux') + tally4.estimator = 'tracklength' + + + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally1) + self._input_set.tallies.add_tally(tally2) + self._input_set.tallies.add_tally(tally3) + self._input_set.tallies.add_tally(tally4) + self._input_set.tallies.add_mesh(mesh) + + super(FilterAzimuthalTestHarness, self)._build_inputs() + + def _cleanup(self): + super(FilterAzimuthalTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + + +if __name__ == '__main__': + harness = FilterAzimuthalTestHarness('statepoint.10.*', True) + harness.main() diff --git a/tests/test_filter_cell/geometry.xml b/tests/test_filter_cell/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_filter_cell/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_cell/inputs_true.dat b/tests/test_filter_cell/inputs_true.dat new file mode 100644 index 000000000..2320ff6ab --- /dev/null +++ b/tests/test_filter_cell/inputs_true.dat @@ -0,0 +1 @@ +caae173f01f7073d634a68a5c4ce97177423e13596a863976e1c40303dc8c05afed457d5a1aa0ae73627ec953143e4f9c1f45bdbd3b0cca76433062467d59777 \ No newline at end of file diff --git a/tests/test_filter_cell/materials.xml b/tests/test_filter_cell/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_filter_cell/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_cell/results_true.dat b/tests/test_filter_cell/results_true.dat index f3aa5d89b..47ff3c281 100644 --- a/tests/test_filter_cell/results_true.dat +++ b/tests/test_filter_cell/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 -1.423676E+01 -4.330937E+01 -2.914798E+00 -1.831649E+00 -4.088282E+01 -3.662539E+02 +1.767552E+01 +6.295417E+01 +3.863588E+00 +3.013300E+00 +5.356594E+01 +5.839391E+02 diff --git a/tests/test_filter_cell/settings.xml b/tests/test_filter_cell/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_filter_cell/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_cell/tallies.xml b/tests/test_filter_cell/tallies.xml deleted file mode 100644 index 815b84c14..000000000 --- a/tests/test_filter_cell/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - total - - - \ No newline at end of file diff --git a/tests/test_filter_cell/test_filter_cell.py b/tests/test_filter_cell/test_filter_cell.py index 1777db993..d532d59cf 100644 --- a/tests/test_filter_cell/test_filter_cell.py +++ b/tests/test_filter_cell/test_filter_cell.py @@ -1,10 +1,29 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class FilterCellTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(filt) + tally.add_score('total') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + super(FilterCellTestHarness, self)._build_inputs() + + def _cleanup(self): + super(FilterCellTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterCellTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_filter_cellborn/geometry.xml b/tests/test_filter_cellborn/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_filter_cellborn/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_cellborn/inputs_true.dat b/tests/test_filter_cellborn/inputs_true.dat new file mode 100644 index 000000000..5aef4cbb0 --- /dev/null +++ b/tests/test_filter_cellborn/inputs_true.dat @@ -0,0 +1 @@ +2f24eb86cda981982a8db5bb110c72e9cef542c06e15b748c1c7e459f96b0d8ba0978b51dffc006e813cd2e2ae1fa0357336f8322ae263189841afde01f0327b \ No newline at end of file diff --git a/tests/test_filter_cellborn/materials.xml b/tests/test_filter_cellborn/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_filter_cellborn/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_cellborn/results_true.dat b/tests/test_filter_cellborn/results_true.dat index 36dcf40d0..d0ab58f4e 100644 --- a/tests/test_filter_cellborn/results_true.dat +++ b/tests/test_filter_cellborn/results_true.dat @@ -1,10 +1,10 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 -7.007584E+01 -1.050827E+03 +8.921179E+01 +1.601939E+03 0.000000E+00 0.000000E+00 0.000000E+00 diff --git a/tests/test_filter_cellborn/tallies.xml b/tests/test_filter_cellborn/tallies.xml deleted file mode 100644 index b278b07ff..000000000 --- a/tests/test_filter_cellborn/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - total - - - \ No newline at end of file diff --git a/tests/test_filter_cellborn/test_filter_cellborn.py b/tests/test_filter_cellborn/test_filter_cellborn.py index 1777db993..2fac6a1fc 100644 --- a/tests/test_filter_cellborn/test_filter_cellborn.py +++ b/tests/test_filter_cellborn/test_filter_cellborn.py @@ -1,10 +1,29 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class FilterCellbornTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cellborn', bins=(10, 21, 22, 23)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(filt) + tally.add_score('total') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + super(FilterCellbornTestHarness, self)._build_inputs() + + def _cleanup(self): + super(FilterCellbornTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterCellbornTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_filter_distribcell/case-1/geometry.xml b/tests/test_filter_distribcell/case-1/geometry.xml index 507559615..34e636e9f 100644 --- a/tests/test_filter_distribcell/case-1/geometry.xml +++ b/tests/test_filter_distribcell/case-1/geometry.xml @@ -1,9 +1,9 @@ - - - + + + diff --git a/tests/test_filter_distribcell/case-2/geometry.xml b/tests/test_filter_distribcell/case-2/geometry.xml index b6797d65d..e3aeedd64 100644 --- a/tests/test_filter_distribcell/case-2/geometry.xml +++ b/tests/test_filter_distribcell/case-2/geometry.xml @@ -1,15 +1,15 @@ - - - - - - - - - + + + + + + + + + 2 2 diff --git a/tests/test_filter_distribcell/case-3/geometry.xml b/tests/test_filter_distribcell/case-3/geometry.xml index b85dd04df..f6f067aad 100644 --- a/tests/test_filter_distribcell/case-3/geometry.xml +++ b/tests/test_filter_distribcell/case-3/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_filter_distribcell/case-4/geometry.xml b/tests/test_filter_distribcell/case-4/geometry.xml index 4c2a7fd5e..c835218bc 100644 --- a/tests/test_filter_distribcell/case-4/geometry.xml +++ b/tests/test_filter_distribcell/case-4/geometry.xml @@ -1,9 +1,9 @@ - - - - + + + + 1.0 3 diff --git a/tests/test_filter_distribcell/test_filter_distribcell.py b/tests/test_filter_distribcell/test_filter_distribcell.py index 541d6b6af..872d29552 100644 --- a/tests/test_filter_distribcell/test_filter_distribcell.py +++ b/tests/test_filter_distribcell/test_filter_distribcell.py @@ -4,8 +4,7 @@ import glob import hashlib import os import sys - -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import * diff --git a/tests/test_filter_energy/geometry.xml b/tests/test_filter_energy/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_filter_energy/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_energy/inputs_true.dat b/tests/test_filter_energy/inputs_true.dat new file mode 100644 index 000000000..b120e9fd6 --- /dev/null +++ b/tests/test_filter_energy/inputs_true.dat @@ -0,0 +1 @@ +49835200052ee1a4c9583a7bb4e9430de7d01a6d7a8d4f63ae37be9bbac4fd8c7ed9135ecbc4ab4cb075fd4d77b322265783463dd07c127decceee8c9fe25bfd \ No newline at end of file diff --git a/tests/test_filter_energy/materials.xml b/tests/test_filter_energy/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_filter_energy/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_energy/results_true.dat b/tests/test_filter_energy/results_true.dat index e3f6cff98..599e0bf88 100644 --- a/tests/test_filter_energy/results_true.dat +++ b/tests/test_filter_energy/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -2.770022E+01 -1.559167E+02 -4.285040E+01 -3.679177E+02 -5.288354E+01 -5.619308E+02 -1.134904E+01 -2.579927E+01 +2.844008E+01 +1.619630E+02 +4.425619E+01 +3.938244E+02 +5.527425E+01 +6.120383E+02 +9.799897E+00 +1.957877E+01 diff --git a/tests/test_filter_energy/settings.xml b/tests/test_filter_energy/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_filter_energy/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_energy/tallies.xml b/tests/test_filter_energy/tallies.xml deleted file mode 100644 index 69ce1d593..000000000 --- a/tests/test_filter_energy/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - total - - - \ No newline at end of file diff --git a/tests/test_filter_energy/test_filter_energy.py b/tests/test_filter_energy/test_filter_energy.py index 1777db993..54d1dd4b7 100644 --- a/tests/test_filter_energy/test_filter_energy.py +++ b/tests/test_filter_energy/test_filter_energy.py @@ -1,10 +1,30 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class FilterEnergyTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='energy', + bins=(0.0, 0.253e-6, 1.0e-3, 1.0, 20.0)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(filt) + tally.add_score('total') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + super(FilterEnergyTestHarness, self)._build_inputs() + + def _cleanup(self): + super(FilterEnergyTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterEnergyTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_filter_energyout/geometry.xml b/tests/test_filter_energyout/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_filter_energyout/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_energyout/inputs_true.dat b/tests/test_filter_energyout/inputs_true.dat new file mode 100644 index 000000000..7096648e6 --- /dev/null +++ b/tests/test_filter_energyout/inputs_true.dat @@ -0,0 +1 @@ +183b4a06cbd0930cfa4f28d0c385cf3ae93ab97c171580c2ba9eec0e4b716102ad83f510d62258ef6769c446e72e1d5ba9f630b171ee239ec04c9bbd1e56742e \ No newline at end of file diff --git a/tests/test_filter_energyout/materials.xml b/tests/test_filter_energyout/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_filter_energyout/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_energyout/results_true.dat b/tests/test_filter_energyout/results_true.dat index 649f4d725..814385d5a 100644 --- a/tests/test_filter_energyout/results_true.dat +++ b/tests/test_filter_energyout/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -2.835000E+01 -1.631463E+02 -4.252000E+01 -3.622146E+02 -5.192000E+01 -5.401444E+02 -7.390000E+00 -1.097710E+01 +2.842000E+01 +1.620214E+02 +4.361000E+01 +3.810139E+02 +5.297000E+01 +5.616595E+02 +6.530000E+00 +8.828900E+00 diff --git a/tests/test_filter_energyout/settings.xml b/tests/test_filter_energyout/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_filter_energyout/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_energyout/tallies.xml b/tests/test_filter_energyout/tallies.xml deleted file mode 100644 index ebec597f1..000000000 --- a/tests/test_filter_energyout/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - scatter - - - \ No newline at end of file diff --git a/tests/test_filter_energyout/test_filter_energyout.py b/tests/test_filter_energyout/test_filter_energyout.py index 1777db993..43a8c7d5a 100644 --- a/tests/test_filter_energyout/test_filter_energyout.py +++ b/tests/test_filter_energyout/test_filter_energyout.py @@ -1,10 +1,30 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class FilterEnergyoutTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='energyout', + bins=(0.0, 0.253e-6, 1.0e-3, 1.0, 20.0)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(filt) + tally.add_score('scatter') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + super(FilterEnergyoutTestHarness, self)._build_inputs() + + def _cleanup(self): + super(FilterEnergyoutTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterEnergyoutTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_filter_group_transfer/geometry.xml b/tests/test_filter_group_transfer/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_filter_group_transfer/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_group_transfer/inputs_true.dat b/tests/test_filter_group_transfer/inputs_true.dat new file mode 100644 index 000000000..813bb43c1 --- /dev/null +++ b/tests/test_filter_group_transfer/inputs_true.dat @@ -0,0 +1 @@ +461a6a4ec3b0b6dc7199c09fa8f527e51cc7a1ea4281a708f8b7bcdbb12f7162027928dfcef68a24eaf6c06037a68e151df9aac9eac6ce56617466f2f5270b71 \ No newline at end of file diff --git a/tests/test_filter_group_transfer/materials.xml b/tests/test_filter_group_transfer/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_filter_group_transfer/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_group_transfer/results_true.dat b/tests/test_filter_group_transfer/results_true.dat index f2d5faa99..c41451e77 100644 --- a/tests/test_filter_group_transfer/results_true.dat +++ b/tests/test_filter_group_transfer/results_true.dat @@ -1,54 +1,54 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -2.571000E+01 -1.344145E+02 +2.576000E+01 +1.331666E+02 0.000000E+00 0.000000E+00 -2.000000E-02 -2.000000E-04 +7.000000E-02 +1.300000E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -8.909862E-01 -1.660072E-01 +1.050675E+00 +2.274991E-01 0.000000E+00 0.000000E+00 -2.269580E+00 -1.046926E+00 -2.640000E+00 -1.397800E+00 +2.070821E+00 +8.886068E-01 +2.660000E+00 +1.422000E+00 0.000000E+00 0.000000E+00 -3.799000E+01 -2.892451E+02 +3.897000E+01 +3.042635E+02 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -3.267964E-01 -2.170374E-02 +4.352932E-01 +4.705717E-02 0.000000E+00 0.000000E+00 -8.811378E-01 -1.642094E-01 +1.018668E+00 +2.090017E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -4.510000E+00 -4.068900E+00 +4.570000E+00 +4.182700E+00 0.000000E+00 0.000000E+00 -4.842000E+01 -4.700146E+02 -6.079426E-02 -8.532151E-04 +4.968000E+01 +4.940534E+02 +6.537406E-02 +1.230788E-03 0.000000E+00 0.000000E+00 -1.182446E-01 -3.979568E-03 +8.678070E-02 +2.482037E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -57,11 +57,11 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -3.500000E+00 -2.455800E+00 -1.158638E-01 -2.993934E-03 -7.390000E+00 -1.097710E+01 -3.126942E-01 -2.185793E-02 +3.290000E+00 +2.178900E+00 +1.610879E-01 +5.883677E-03 +6.530000E+00 +8.828900E+00 +3.151783E-01 +2.052521E-02 diff --git a/tests/test_filter_group_transfer/settings.xml b/tests/test_filter_group_transfer/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_filter_group_transfer/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_group_transfer/tallies.xml b/tests/test_filter_group_transfer/tallies.xml deleted file mode 100644 index 64a6fa5e1..000000000 --- a/tests/test_filter_group_transfer/tallies.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - scatter nu-fission - - - \ No newline at end of file diff --git a/tests/test_filter_group_transfer/test_filter_group_transfer.py b/tests/test_filter_group_transfer/test_filter_group_transfer.py index 1777db993..cbea5e0a7 100644 --- a/tests/test_filter_group_transfer/test_filter_group_transfer.py +++ b/tests/test_filter_group_transfer/test_filter_group_transfer.py @@ -1,10 +1,34 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class FilterGroupTransferTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt1 = openmc.Filter(type='energy', + bins=(0.0, 0.253e-6, 1.0e-3, 1.0, 20.0)) + filt2 = openmc.Filter(type='energyout', + bins=(0.0, 0.253e-6, 1.0e-3, 1.0, 20.0)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(filt1) + tally.add_filter(filt2) + tally.add_score('scatter') + tally.add_score('nu-fission') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + super(FilterGroupTransferTestHarness, self)._build_inputs() + + def _cleanup(self): + super(FilterGroupTransferTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterGroupTransferTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_filter_material/geometry.xml b/tests/test_filter_material/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_filter_material/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_material/inputs_true.dat b/tests/test_filter_material/inputs_true.dat new file mode 100644 index 000000000..aaa4a4939 --- /dev/null +++ b/tests/test_filter_material/inputs_true.dat @@ -0,0 +1 @@ +2fbd0986abff08126680925284929cf67bdad0cd564775197b78065ce3b0e6ad8094f5ca4d14ea69347db69a6cdcc9796a095178ae9b14a927b101f32f3cd0ec \ No newline at end of file diff --git a/tests/test_filter_material/materials.xml b/tests/test_filter_material/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_filter_material/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_material/results_true.dat b/tests/test_filter_material/results_true.dat index 86e1e943c..d2b23e290 100644 --- a/tests/test_filter_material/results_true.dat +++ b/tests/test_filter_material/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -2.923791E+01 -1.711686E+02 -6.753642E+00 -9.145065E+00 -4.921142E+01 -5.186991E+02 -4.731999E+01 -4.905260E+02 +2.868239E+01 +1.648549E+02 +6.779424E+00 +9.202676E+00 +6.446222E+01 +8.387204E+02 +3.367496E+01 +2.349072E+02 diff --git a/tests/test_filter_material/settings.xml b/tests/test_filter_material/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_filter_material/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_material/tallies.xml b/tests/test_filter_material/tallies.xml deleted file mode 100644 index 4b8d1ce8f..000000000 --- a/tests/test_filter_material/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - total - - - \ No newline at end of file diff --git a/tests/test_filter_material/test_filter_material.py b/tests/test_filter_material/test_filter_material.py index 1777db993..8e42d8c9a 100644 --- a/tests/test_filter_material/test_filter_material.py +++ b/tests/test_filter_material/test_filter_material.py @@ -1,10 +1,29 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class FilterMaterialTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='material', bins=(1, 2, 3, 4)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(filt) + tally.add_score('total') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + super(FilterMaterialTestHarness, self)._build_inputs() + + def _cleanup(self): + super(FilterMaterialTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterMaterialTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_filter_mesh_2d/geometry.xml b/tests/test_filter_mesh_2d/geometry.xml index b85dd04df..f6f067aad 100644 --- a/tests/test_filter_mesh_2d/geometry.xml +++ b/tests/test_filter_mesh_2d/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_filter_mesh_2d/test_filter_mesh_2d.py b/tests/test_filter_mesh_2d/test_filter_mesh_2d.py index 1777db993..ed6addec4 100644 --- a/tests/test_filter_mesh_2d/test_filter_mesh_2d.py +++ b/tests/test_filter_mesh_2d/test_filter_mesh_2d.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_filter_mesh_3d/geometry.xml b/tests/test_filter_mesh_3d/geometry.xml index b85dd04df..f6f067aad 100644 --- a/tests/test_filter_mesh_3d/geometry.xml +++ b/tests/test_filter_mesh_3d/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_filter_mesh_3d/test_filter_mesh_3d.py b/tests/test_filter_mesh_3d/test_filter_mesh_3d.py index 1777db993..ed6addec4 100644 --- a/tests/test_filter_mesh_3d/test_filter_mesh_3d.py +++ b/tests/test_filter_mesh_3d/test_filter_mesh_3d.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_filter_mu/inputs_true.dat b/tests/test_filter_mu/inputs_true.dat new file mode 100644 index 000000000..b0a607ad3 --- /dev/null +++ b/tests/test_filter_mu/inputs_true.dat @@ -0,0 +1 @@ +cd2aeb24baafe9a904e697955990f6cffb5f25618fdf8c972775715bfe6e92bc259e36fd2b5addff8181439de58ad6f530972ec391e827f46146a2aaace34358 \ No newline at end of file diff --git a/tests/test_filter_mu/results_true.dat b/tests/test_filter_mu/results_true.dat new file mode 100644 index 000000000..e647a46ec --- /dev/null +++ b/tests/test_filter_mu/results_true.dat @@ -0,0 +1,121 @@ +k-combined: +9.903196E-01 4.279617E-02 +tally 1: +1.241000E+01 +3.088870E+01 +1.241000E+01 +3.088870E+01 +1.364000E+01 +3.727140E+01 +1.364000E+01 +3.727140E+01 +3.251000E+01 +2.118597E+02 +3.251000E+01 +2.118597E+02 +7.297000E+01 +1.066904E+03 +7.297000E+01 +1.066904E+03 +tally 2: +9.880000E+00 +1.964520E+01 +9.880000E+00 +1.964520E+01 +1.022000E+01 +2.099620E+01 +1.022000E+01 +2.099620E+01 +1.479000E+01 +4.397670E+01 +1.479000E+01 +4.397670E+01 +3.470000E+01 +2.412094E+02 +3.470000E+01 +2.412094E+02 +6.194000E+01 +7.687326E+02 +6.194000E+01 +7.687326E+02 +tally 3: +3.560000E+00 +2.681800E+00 +3.560000E+00 +2.681800E+00 +1.930000E+00 +7.915000E-01 +1.930000E+00 +7.915000E-01 +3.870000E+00 +3.109100E+00 +3.870000E+00 +3.109100E+00 +3.500000E-01 +3.630000E-02 +3.500000E-01 +3.630000E-02 +3.680000E+00 +2.840200E+00 +3.680000E+00 +2.840200E+00 +2.050000E+00 +8.735000E-01 +2.050000E+00 +8.735000E-01 +3.910000E+00 +3.085100E+00 +3.910000E+00 +3.085100E+00 +3.900000E-01 +3.610000E-02 +3.900000E-01 +3.610000E-02 +5.130000E+00 +5.422100E+00 +5.130000E+00 +5.422100E+00 +3.100000E+00 +1.959200E+00 +3.100000E+00 +1.959200E+00 +5.840000E+00 +6.914600E+00 +5.840000E+00 +6.914600E+00 +5.400000E-01 +8.980000E-02 +5.400000E-01 +8.980000E-02 +1.215000E+01 +3.061010E+01 +1.215000E+01 +3.061010E+01 +7.220000E+00 +1.081680E+01 +7.220000E+00 +1.081680E+01 +1.355000E+01 +3.699090E+01 +1.355000E+01 +3.699090E+01 +1.360000E+00 +5.098000E-01 +1.360000E+00 +5.098000E-01 +2.199000E+01 +9.837430E+01 +2.199000E+01 +9.837430E+01 +1.243000E+01 +3.167470E+01 +1.243000E+01 +3.167470E+01 +2.451000E+01 +1.233915E+02 +2.451000E+01 +1.233915E+02 +2.460000E+00 +1.687000E+00 +2.460000E+00 +1.687000E+00 diff --git a/tests/test_filter_mu/test_filter_mu.py b/tests/test_filter_mu/test_filter_mu.py new file mode 100644 index 000000000..f59f8c63f --- /dev/null +++ b/tests/test_filter_mu/test_filter_mu.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python + +import os +import sys +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class FilterMuTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt1 = openmc.Filter(type='mu', + bins=(-1.0, -0.5, 0.0, 0.5, 1.0)) + tally1 = openmc.Tally(tally_id=1) + tally1.add_filter(filt1) + tally1.add_score('scatter') + tally1.add_score('nu-scatter') + + filt2 = openmc.Filter(type='mu', bins=(5,)) + tally2 = openmc.Tally(tally_id=2) + tally2.add_filter(filt2) + tally2.add_score('scatter') + tally2.add_score('nu-scatter') + + mesh = openmc.Mesh(mesh_id=1) + mesh.lower_left = [-182.07, -182.07] + mesh.upper_right = [182.07, 182.07] + mesh.dimension = [2, 2] + filt_mesh = openmc.Filter(type='mesh', bins=(1,)) + tally3 = openmc.Tally(tally_id=3) + tally3.add_filter(filt2) + tally3.add_filter(filt_mesh) + tally3.add_score('scatter') + tally3.add_score('nu-scatter') + + + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally1) + self._input_set.tallies.add_tally(tally2) + self._input_set.tallies.add_tally(tally3) + self._input_set.tallies.add_mesh(mesh) + + super(FilterMuTestHarness, self)._build_inputs() + + def _cleanup(self): + super(FilterMuTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + + +if __name__ == '__main__': + harness = FilterMuTestHarness('statepoint.10.*', True) + harness.main() diff --git a/tests/test_filter_polar/inputs_true.dat b/tests/test_filter_polar/inputs_true.dat new file mode 100644 index 000000000..db67a890f --- /dev/null +++ b/tests/test_filter_polar/inputs_true.dat @@ -0,0 +1 @@ +2de29e0a083af0722039ebc246469f26e260d604ab8b76314b2ac472bbd23004e031aec7afe3dbfc4c6112428846cd0cf0c1430e878832b9dab36463d026dee6 \ No newline at end of file diff --git a/tests/test_filter_polar/results_true.dat b/tests/test_filter_polar/results_true.dat new file mode 100644 index 000000000..2d822630e --- /dev/null +++ b/tests/test_filter_polar/results_true.dat @@ -0,0 +1,76 @@ +k-combined: +9.903196E-01 4.279617E-02 +tally 1: +2.127061E+01 +9.220793E+01 +5.602776E+01 +6.373945E+02 +6.367492E+01 +8.138443E+02 +5.529942E+01 +6.140264E+02 +1.951517E+01 +7.668661E+01 +tally 2: +2.075936E+01 +8.757254E+01 +5.524881E+01 +6.153139E+02 +6.475252E+01 +8.402281E+02 +5.446664E+01 +5.961174E+02 +2.074180E+01 +8.681580E+01 +tally 3: +2.128073E+01 +9.230382E+01 +5.601764E+01 +6.371703E+02 +6.367492E+01 +8.138443E+02 +5.529942E+01 +6.140264E+02 +1.951517E+01 +7.668661E+01 +tally 4: +8.088647E+00 +1.396899E+01 +3.960907E+00 +3.249150E+00 +8.430714E+00 +1.435355E+01 +7.192159E-01 +1.641710E-01 +1.974619E+01 +8.105078E+01 +1.212452E+01 +3.016420E+01 +2.228348E+01 +1.050847E+02 +1.748809E+00 +9.501796E-01 +2.257423E+01 +1.038902E+02 +1.351331E+01 +3.969787E+01 +2.507638E+01 +1.283664E+02 +2.193118E+00 +1.424580E+00 +2.192232E+01 +9.859711E+01 +1.096779E+01 +2.506373E+01 +2.074138E+01 +8.670015E+01 +1.469145E+00 +8.072204E-01 +6.850719E+00 +9.425536E+00 +4.584038E+00 +4.399762E+00 +7.176883E+00 +1.090693E+01 +8.244944E-01 +1.794291E-01 diff --git a/tests/test_filter_polar/test_filter_polar.py b/tests/test_filter_polar/test_filter_polar.py new file mode 100644 index 000000000..db7ed4f6d --- /dev/null +++ b/tests/test_filter_polar/test_filter_polar.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +import os +import sys +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + +class FilterPolarTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt1 = openmc.Filter(type='polar', + bins=(0.0, 0.6283, 1.2566, 1.8850, 2.5132, + 3.1416)) + tally1 = openmc.Tally(tally_id=1) + tally1.add_filter(filt1) + tally1.add_score('flux') + tally1.estimator = 'tracklength' + + tally2 = openmc.Tally(tally_id=2) + tally2.add_filter(filt1) + tally2.add_score('flux') + tally2.estimator = 'analog' + + filt3 = openmc.Filter(type='polar', bins=(5,)) + tally3 = openmc.Tally(tally_id=3) + tally3.add_filter(filt3) + tally3.add_score('flux') + tally3.estimator = 'tracklength' + + mesh = openmc.Mesh(mesh_id=1) + mesh.lower_left = [-182.07, -182.07] + mesh.upper_right = [182.07, 182.07] + mesh.dimension = [2, 2] + filt_mesh = openmc.Filter(type='mesh', bins=(1,)) + tally4 = openmc.Tally(tally_id=4) + tally4.add_filter(filt3) + tally4.add_filter(filt_mesh) + tally4.add_score('flux') + tally4.estimator = 'tracklength' + + + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally1) + self._input_set.tallies.add_tally(tally2) + self._input_set.tallies.add_tally(tally3) + self._input_set.tallies.add_tally(tally4) + self._input_set.tallies.add_mesh(mesh) + + super(FilterPolarTestHarness, self)._build_inputs() + + def _cleanup(self): + super(FilterPolarTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) + + +if __name__ == '__main__': + harness = FilterPolarTestHarness('statepoint.10.*', True) + harness.main() diff --git a/tests/test_filter_universe/geometry.xml b/tests/test_filter_universe/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_filter_universe/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_filter_universe/inputs_true.dat b/tests/test_filter_universe/inputs_true.dat new file mode 100644 index 000000000..7cda1ab84 --- /dev/null +++ b/tests/test_filter_universe/inputs_true.dat @@ -0,0 +1 @@ +51fcaf0aa527d1fd1022e5f312d4d25cd9bacc5fc9792d9f7702ee97cac43700a31f25be767a2cff769c37b5e1cdf3f922467977a9958fa34561e2a102bf8537 \ No newline at end of file diff --git a/tests/test_filter_universe/materials.xml b/tests/test_filter_universe/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_filter_universe/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_filter_universe/results_true.dat b/tests/test_filter_universe/results_true.dat index 856d97d59..f71c4d2c2 100644 --- a/tests/test_filter_universe/results_true.dat +++ b/tests/test_filter_universe/results_true.dat @@ -1,11 +1,11 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -5.803437E+01 -7.324822E+02 -7.168085E+00 -1.101286E+01 -5.815302E+01 -7.373019E+02 -5.778029E+00 -7.558661E+00 +7.510505E+01 +1.143811E+03 +8.792943E+00 +1.575416E+01 +4.214462E+01 +3.642975E+02 +4.335157E+00 +3.864423E+00 diff --git a/tests/test_filter_universe/settings.xml b/tests/test_filter_universe/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_filter_universe/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_filter_universe/test_filter_universe.py b/tests/test_filter_universe/test_filter_universe.py index 1777db993..00dd16619 100644 --- a/tests/test_filter_universe/test_filter_universe.py +++ b/tests/test_filter_universe/test_filter_universe.py @@ -1,10 +1,29 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class FilterUniverseTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='universe', bins=(1, 2, 3, 4)) + tally = openmc.Tally(tally_id=1) + tally.add_filter(filt) + tally.add_score('total') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(tally) + + super(FilterUniverseTestHarness, self)._build_inputs() + + def _cleanup(self): + super(FilterUniverseTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = FilterUniverseTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_fixed_source/geometry.xml b/tests/test_fixed_source/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_fixed_source/geometry.xml +++ b/tests/test_fixed_source/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_fixed_source/test_fixed_source.py b/tests/test_fixed_source/test_fixed_source.py index c3bd34856..12dbb8d76 100644 --- a/tests/test_fixed_source/test_fixed_source.py +++ b/tests/test_fixed_source/test_fixed_source.py @@ -3,9 +3,10 @@ import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +import numpy as np +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness +from openmc.statepoint import StatePoint class FixedSourceTestHarness(TestHarness): diff --git a/tests/test_infinite_cell/geometry.xml b/tests/test_infinite_cell/geometry.xml index e3f63354c..90bd2233b 100644 --- a/tests/test_infinite_cell/geometry.xml +++ b/tests/test_infinite_cell/geometry.xml @@ -1,7 +1,7 @@ - + @@ -13,5 +13,5 @@ - + diff --git a/tests/test_infinite_cell/test_infinite_cell.py b/tests/test_infinite_cell/test_infinite_cell.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_infinite_cell/test_infinite_cell.py +++ b/tests/test_infinite_cell/test_infinite_cell.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_lattice/geometry.xml b/tests/test_lattice/geometry.xml index 89af5f196..809cd6fbb 100644 --- a/tests/test_lattice/geometry.xml +++ b/tests/test_lattice/geometry.xml @@ -40,11 +40,11 @@ - - - - - + + + + + @@ -85,38 +85,38 @@ - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/tests/test_lattice/test_lattice.py b/tests/test_lattice/test_lattice.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_lattice/test_lattice.py +++ b/tests/test_lattice/test_lattice.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_lattice_hex/geometry.xml b/tests/test_lattice_hex/geometry.xml index 8b5915dcd..cfe39849c 100644 --- a/tests/test_lattice_hex/geometry.xml +++ b/tests/test_lattice_hex/geometry.xml @@ -14,29 +14,29 @@ - - - - - - - + + + + + + + - - - + + + - - - + + + @@ -194,6 +194,6 @@ + region="-1001 -1002 -1003 -1004 -1005 -1006 1007 -1008"/> diff --git a/tests/test_lattice_hex/test_lattice_hex.py b/tests/test_lattice_hex/test_lattice_hex.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_lattice_hex/test_lattice_hex.py +++ b/tests/test_lattice_hex/test_lattice_hex.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_lattice_mixed/geometry.xml b/tests/test_lattice_mixed/geometry.xml index 524e4d928..41aa05d41 100644 --- a/tests/test_lattice_mixed/geometry.xml +++ b/tests/test_lattice_mixed/geometry.xml @@ -15,29 +15,29 @@ - - - - - - - + + + + + + + - - - + + + - - - + + + @@ -151,6 +151,6 @@ + region="-1001 -1002 -1003 -1004 -1005 -1006 1007 -1008"/> diff --git a/tests/test_lattice_mixed/test_lattice_mixed.py b/tests/test_lattice_mixed/test_lattice_mixed.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_lattice_mixed/test_lattice_mixed.py +++ b/tests/test_lattice_mixed/test_lattice_mixed.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_lattice_multiple/geometry.xml b/tests/test_lattice_multiple/geometry.xml index b85dd04df..f6f067aad 100644 --- a/tests/test_lattice_multiple/geometry.xml +++ b/tests/test_lattice_multiple/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_lattice_multiple/test_lattice_multiple.py b/tests/test_lattice_multiple/test_lattice_multiple.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_lattice_multiple/test_lattice_multiple.py +++ b/tests/test_lattice_multiple/test_lattice_multiple.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_many_scores/geometry.xml b/tests/test_many_scores/geometry.xml index b85dd04df..f6f067aad 100644 --- a/tests/test_many_scores/geometry.xml +++ b/tests/test_many_scores/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_many_scores/results_true.dat b/tests/test_many_scores/results_true.dat index bb151ae0e..6c1f62732 100644 --- a/tests/test_many_scores/results_true.dat +++ b/tests/test_many_scores/results_true.dat @@ -37,73 +37,73 @@ tally 1: 5.986137E+03 2.247257E+01 1.683779E+02 --1.512960E-01 +1.512960E-01 2.623972E-02 -3.775020E-01 1.055377E-01 --1.916133E-01 +1.916133E-01 4.680798E-02 2.754367E-02 3.320008E-04 --2.028374E-02 +2.028374E-02 1.319357E-02 8.974271E-03 1.681081E-03 --1.658978E-01 +1.658978E-01 1.520448E-02 2.878360E-01 5.645480E-02 1.014000E+01 3.427342E+01 --4.798897E-02 +4.798897E-02 1.551226E-03 -1.818770E-01 1.492633E-02 --6.340651E-02 +6.340651E-02 9.011305E-03 3.395308E-02 4.612818E-04 --2.640250E-02 +2.640250E-02 6.434787E-04 -8.242639E-03 9.516540E-04 --8.378601E-02 +8.378601E-02 2.645988E-03 9.567484E-02 7.262477E-03 8.628000E+00 2.481430E+01 --4.712248E-02 +4.712248E-02 1.140942E-03 -6.431930E-02 4.290580E-03 --9.251642E-02 +9.251642E-02 8.134201E-03 1.020119E-04 1.154184E-04 --2.994164E-02 +2.994164E-02 3.079076E-04 2.128844E-02 2.046549E-04 -1.637972E-02 +-1.637972E-02 1.459209E-04 4.629047E-02 7.823267E-04 8.632000E+00 2.483728E+01 --4.651997E-02 +4.651997E-02 1.133839E-03 -6.416955E-02 4.279418E-03 --9.280565E-02 +9.280565E-02 8.095106E-03 -2.078094E-04 1.151292E-04 --3.005568E-02 +3.005568E-02 3.104764E-04 2.199519E-02 2.179172E-04 -1.660645E-02 +-1.660645E-02 1.451345E-04 4.607553E-02 7.673412E-04 diff --git a/tests/test_many_scores/test_many_scores.py b/tests/test_many_scores/test_many_scores.py index 66bfe3dfa..88c3bdfb3 100644 --- a/tests/test_many_scores/test_many_scores.py +++ b/tests/test_many_scores/test_many_scores.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_natural_element/geometry.xml b/tests/test_natural_element/geometry.xml index 2d427d8cb..b6b4bd817 100644 --- a/tests/test_natural_element/geometry.xml +++ b/tests/test_natural_element/geometry.xml @@ -45,50 +45,50 @@ - - + + - - + + - + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - + + + diff --git a/tests/test_natural_element/test_natural_element.py b/tests/test_natural_element/test_natural_element.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_natural_element/test_natural_element.py +++ b/tests/test_natural_element/test_natural_element.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_output/geometry.xml b/tests/test_output/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_output/geometry.xml +++ b/tests/test_output/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_output/test_output.py b/tests/test_output/test_output.py index b37b7d07b..8e36ead80 100644 --- a/tests/test_output/test_output.py +++ b/tests/test_output/test_output.py @@ -3,9 +3,8 @@ import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness class OutputTestHarness(TestHarness): diff --git a/tests/test_particle_restart_eigval/geometry.xml b/tests/test_particle_restart_eigval/geometry.xml index 52fea4df6..c86e016c6 100644 --- a/tests/test_particle_restart_eigval/geometry.xml +++ b/tests/test_particle_restart_eigval/geometry.xml @@ -4,6 +4,6 @@ - + diff --git a/tests/test_particle_restart_eigval/test_particle_restart_eigval.py b/tests/test_particle_restart_eigval/test_particle_restart_eigval.py index a9f4563d0..139cb2b9f 100644 --- a/tests/test_particle_restart_eigval/test_particle_restart_eigval.py +++ b/tests/test_particle_restart_eigval/test_particle_restart_eigval.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import ParticleRestartTestHarness diff --git a/tests/test_particle_restart_fixed/geometry.xml b/tests/test_particle_restart_fixed/geometry.xml index 52fea4df6..c86e016c6 100644 --- a/tests/test_particle_restart_fixed/geometry.xml +++ b/tests/test_particle_restart_fixed/geometry.xml @@ -4,6 +4,6 @@ - + diff --git a/tests/test_particle_restart_fixed/test_particle_restart_fixed.py b/tests/test_particle_restart_fixed/test_particle_restart_fixed.py index 385a42940..5af745489 100644 --- a/tests/test_particle_restart_fixed/test_particle_restart_fixed.py +++ b/tests/test_particle_restart_fixed/test_particle_restart_fixed.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import ParticleRestartTestHarness diff --git a/tests/test_plot_background/geometry.xml b/tests/test_plot_background/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_plot_background/geometry.xml +++ b/tests/test_plot_background/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_plot_background/test_plot_background.py b/tests/test_plot_background/test_plot_background.py index 49cdacb05..7890eca19 100644 --- a/tests/test_plot_background/test_plot_background.py +++ b/tests/test_plot_background/test_plot_background.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import PlotTestHarness diff --git a/tests/test_plot_basis/geometry.xml b/tests/test_plot_basis/geometry.xml index ac00ebaf5..83619d9f7 100644 --- a/tests/test_plot_basis/geometry.xml +++ b/tests/test_plot_basis/geometry.xml @@ -6,8 +6,8 @@ - - - + + + diff --git a/tests/test_plot_basis/results_true.dat b/tests/test_plot_basis/results_true.dat index ae588fd4f..b1d5dc853 100644 --- a/tests/test_plot_basis/results_true.dat +++ b/tests/test_plot_basis/results_true.dat @@ -1 +1 @@ -6a2400a95ea5baee432dd04a85252818d682004dc80b225b99c4bbc7cfd20d8523bd8e5df8a272df288cb2f300e5eee55f7ffa7b4d28ea64f92b78839ab0e86b \ No newline at end of file +368e0135c136d5c8a2dabb4c8085279dc7ac0bd81b2ec905bdf11ecb5fe99803868631cdff0b3ddec941323bcc661747d4c16edfd4f8d38582155bd6fd7e82e8 \ No newline at end of file diff --git a/tests/test_plot_basis/test_plot_basis.py b/tests/test_plot_basis/test_plot_basis.py index 85e30557d..d45479e25 100644 --- a/tests/test_plot_basis/test_plot_basis.py +++ b/tests/test_plot_basis/test_plot_basis.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import PlotTestHarness diff --git a/tests/test_plot_colspec/geometry.xml b/tests/test_plot_colspec/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_plot_colspec/geometry.xml +++ b/tests/test_plot_colspec/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_plot_colspec/test_plot_colspec.py b/tests/test_plot_colspec/test_plot_colspec.py index 49cdacb05..7890eca19 100644 --- a/tests/test_plot_colspec/test_plot_colspec.py +++ b/tests/test_plot_colspec/test_plot_colspec.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import PlotTestHarness diff --git a/tests/test_plot_mask/geometry.xml b/tests/test_plot_mask/geometry.xml index ac00ebaf5..83619d9f7 100644 --- a/tests/test_plot_mask/geometry.xml +++ b/tests/test_plot_mask/geometry.xml @@ -6,8 +6,8 @@ - - - + + + diff --git a/tests/test_plot_mask/results_true.dat b/tests/test_plot_mask/results_true.dat index 107632454..a1e323203 100644 --- a/tests/test_plot_mask/results_true.dat +++ b/tests/test_plot_mask/results_true.dat @@ -1 +1 @@ -d888a734d6e69c5ca92457dc865c4defd8a1d8a1d4a01e0c8e7c528dde25d96df1283da37889dac0857329051958be2f2b491f2fd2bc22c8424a60ec6cda04bd \ No newline at end of file +a7cb65bf40c84c0540d45ff292c398f9ae51b3d9396e88b9b4e5cdf05e8730f409bddb53aec6d396058194c6293c5bd3ef39efd0b0f30f2423f696193c85176c \ No newline at end of file diff --git a/tests/test_plot_mask/test_plot_mask.py b/tests/test_plot_mask/test_plot_mask.py index 85e30557d..d45479e25 100644 --- a/tests/test_plot_mask/test_plot_mask.py +++ b/tests/test_plot_mask/test_plot_mask.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import PlotTestHarness diff --git a/tests/test_ptables_off/geometry.xml b/tests/test_ptables_off/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_ptables_off/geometry.xml +++ b/tests/test_ptables_off/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_ptables_off/test_ptables_off.py b/tests/test_ptables_off/test_ptables_off.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_ptables_off/test_ptables_off.py +++ b/tests/test_ptables_off/test_ptables_off.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_reflective_cone/geometry.xml b/tests/test_reflective_cone/geometry.xml index 5453e1615..f5499fbb6 100644 --- a/tests/test_reflective_cone/geometry.xml +++ b/tests/test_reflective_cone/geometry.xml @@ -2,6 +2,6 @@ - + diff --git a/tests/test_reflective_cone/test_reflective_cone.py b/tests/test_reflective_cone/test_reflective_cone.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_reflective_cone/test_reflective_cone.py +++ b/tests/test_reflective_cone/test_reflective_cone.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_reflective_cylinder/geometry.xml b/tests/test_reflective_cylinder/geometry.xml index ce1082f3d..e6aed65da 100644 --- a/tests/test_reflective_cylinder/geometry.xml +++ b/tests/test_reflective_cylinder/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_reflective_cylinder/test_reflective_cylinder.py b/tests/test_reflective_cylinder/test_reflective_cylinder.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_reflective_cylinder/test_reflective_cylinder.py +++ b/tests/test_reflective_cylinder/test_reflective_cylinder.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_reflective_plane/geometry.xml b/tests/test_reflective_plane/geometry.xml index 454441436..0dc5c29ab 100644 --- a/tests/test_reflective_plane/geometry.xml +++ b/tests/test_reflective_plane/geometry.xml @@ -8,6 +8,6 @@ - + diff --git a/tests/test_reflective_plane/test_reflective_plane.py b/tests/test_reflective_plane/test_reflective_plane.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_reflective_plane/test_reflective_plane.py +++ b/tests/test_reflective_plane/test_reflective_plane.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_reflective_sphere/geometry.xml b/tests/test_reflective_sphere/geometry.xml index 5f36d2396..0dc98eba6 100644 --- a/tests/test_reflective_sphere/geometry.xml +++ b/tests/test_reflective_sphere/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_reflective_sphere/results_true.dat b/tests/test_reflective_sphere/results_true.dat index f25a72dc9..91dd20fba 100644 --- a/tests/test_reflective_sphere/results_true.dat +++ b/tests/test_reflective_sphere/results_true.dat @@ -1,2 +1,2 @@ k-combined: -2.271012E+00 3.466350E-03 +2.271012E+00 3.466351E-03 diff --git a/tests/test_reflective_sphere/test_reflective_sphere.py b/tests/test_reflective_sphere/test_reflective_sphere.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_reflective_sphere/test_reflective_sphere.py +++ b/tests/test_reflective_sphere/test_reflective_sphere.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_resonance_scattering/geometry.xml b/tests/test_resonance_scattering/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_resonance_scattering/geometry.xml +++ b/tests/test_resonance_scattering/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_resonance_scattering/test_resonance_scattering.py b/tests/test_resonance_scattering/test_resonance_scattering.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_resonance_scattering/test_resonance_scattering.py +++ b/tests/test_resonance_scattering/test_resonance_scattering.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_rotation/geometry.xml b/tests/test_rotation/geometry.xml index 7306dabde..222617877 100644 --- a/tests/test_rotation/geometry.xml +++ b/tests/test_rotation/geometry.xml @@ -5,7 +5,7 @@ - - + + diff --git a/tests/test_rotation/test_rotation.py b/tests/test_rotation/test_rotation.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_rotation/test_rotation.py +++ b/tests/test_rotation/test_rotation.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_salphabeta/geometry.xml b/tests/test_salphabeta/geometry.xml index ef0598842..f9caa6c88 100644 --- a/tests/test_salphabeta/geometry.xml +++ b/tests/test_salphabeta/geometry.xml @@ -6,8 +6,8 @@ - - - + + + diff --git a/tests/test_salphabeta/test_salphabeta.py b/tests/test_salphabeta/test_salphabeta.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_salphabeta/test_salphabeta.py +++ b/tests/test_salphabeta/test_salphabeta.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_salphabeta_multiple/geometry.xml b/tests/test_salphabeta_multiple/geometry.xml index 63f69f743..13eb60166 100644 --- a/tests/test_salphabeta_multiple/geometry.xml +++ b/tests/test_salphabeta_multiple/geometry.xml @@ -45,52 +45,52 @@ - + - + - - + + - + - + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - - - + + + diff --git a/tests/test_salphabeta_multiple/test_salphabeta_multiple.py b/tests/test_salphabeta_multiple/test_salphabeta_multiple.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_salphabeta_multiple/test_salphabeta_multiple.py +++ b/tests/test_salphabeta_multiple/test_salphabeta_multiple.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_score_MT/geometry.xml b/tests/test_score_MT/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_MT/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_MT/inputs_true.dat b/tests/test_score_MT/inputs_true.dat new file mode 100644 index 000000000..3789a69cb --- /dev/null +++ b/tests/test_score_MT/inputs_true.dat @@ -0,0 +1 @@ +63295b9d510370e65e63a3db627d47d286f5479e53c8eabeda9a5cb25ffe35becb636835aadad11691e34c23292fe11b5f688daee76d76ceac4b5dfd2f9ede4c \ No newline at end of file diff --git a/tests/test_score_MT/materials.xml b/tests/test_score_MT/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_MT/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_MT/results_true.dat b/tests/test_score_MT/results_true.dat index 4b1c1af26..44656963f 100644 --- a/tests/test_score_MT/results_true.dat +++ b/tests/test_score_MT/results_true.dat @@ -1,5 +1,5 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 @@ -9,30 +9,30 @@ tally 1: 0.000000E+00 0.000000E+00 0.000000E+00 -6.261679E-03 -2.310296E-05 -6.261679E-03 -2.310296E-05 -3.434524E-01 -2.482946E-02 -1.059004E+00 -2.432555E-01 -3.828838E-04 -9.365499E-08 -3.828838E-04 -9.365499E-08 -3.226036E-02 -2.229037E-04 -1.450446E-02 -4.382852E-05 -8.650696E-08 -7.483455E-15 -8.650696E-08 -7.483455E-15 -7.312640E-05 -2.080857E-09 -6.101318E-02 -8.452067E-04 +1.538090E-03 +1.381456E-06 +1.538090E-03 +1.381456E-06 +3.974412E-01 +3.209809E-02 +1.373550E+00 +3.796357E-01 +5.252455E-06 +2.290531E-11 +5.252455E-06 +2.290531E-11 +3.359792E-02 +2.267331E-04 +2.459115E-02 +1.233078E-04 +0.000000E+00 +0.000000E+00 +0.000000E+00 +0.000000E+00 +7.004005E-05 +1.748739E-09 +8.104946E-02 +1.395618E-03 tally 2: 0.000000E+00 0.000000E+00 @@ -46,16 +46,16 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -3.000000E-01 -2.440000E-02 +2.000000E-01 +9.000000E-03 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -4.000000E-02 -6.000000E-04 +2.000000E-02 +2.000000E-04 0.000000E+00 0.000000E+00 0.000000E+00 @@ -75,27 +75,27 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -5.724026E-03 -1.684945E-05 -5.724026E-03 -1.684945E-05 -3.250298E-01 -2.370870E-02 -1.083784E+00 -2.568556E-01 -4.449887E-05 -1.980149E-09 -4.449887E-05 -1.980149E-09 -3.526275E-02 -2.863085E-04 -1.417358E-02 -4.375519E-05 +1.408027E-03 +1.849607E-06 +1.408027E-03 +1.849607E-06 +3.946436E-01 +3.166261E-02 +1.288136E+00 +3.382059E-01 +2.179241E-05 +4.749090E-10 +2.179241E-05 +4.749090E-10 +3.146594E-02 +2.159308E-04 +4.278352E-02 +4.094478E-04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -5.106469E-05 -8.605176E-10 -6.204277E-02 -8.555398E-04 +1.736514E-04 +1.245171E-08 +7.989710E-02 +1.377742E-03 diff --git a/tests/test_score_MT/settings.xml b/tests/test_score_MT/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_score_MT/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_MT/tallies.xml b/tests/test_score_MT/tallies.xml deleted file mode 100644 index 5e66ae929..000000000 --- a/tests/test_score_MT/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - n2n 16 51 102 - - - - - n2n 16 51 102 - analog - - - - - n2n 16 51 102 - collision - - - diff --git a/tests/test_score_MT/test_score_MT.py b/tests/test_score_MT/test_score_MT.py index 1777db993..dae86d418 100644 --- a/tests/test_score_MT/test_score_MT.py +++ b/tests/test_score_MT/test_score_MT.py @@ -1,10 +1,35 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreMTTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('n2n') for t in tallies] + [t.add_score('16') for t in tallies] + [t.add_score('51') for t in tallies] + [t.add_score('102') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + super(ScoreMTTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreMTTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreMTTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_absorption/geometry.xml b/tests/test_score_absorption/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_absorption/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_absorption/inputs_true.dat b/tests/test_score_absorption/inputs_true.dat new file mode 100644 index 000000000..c4c133600 --- /dev/null +++ b/tests/test_score_absorption/inputs_true.dat @@ -0,0 +1 @@ +482760c362f56e453ce4b466083e77f84a461e636330d7cc2cb1cf7facced678a57a7c785ff9d039b3f575396cb435f99df05d6fa207f553c28ed3ce4f8151b3 \ No newline at end of file diff --git a/tests/test_score_absorption/materials.xml b/tests/test_score_absorption/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_absorption/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_absorption/results_true.dat b/tests/test_score_absorption/results_true.dat index 9370a146f..72661f77f 100644 --- a/tests/test_score_absorption/results_true.dat +++ b/tests/test_score_absorption/results_true.dat @@ -1,29 +1,29 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 -2.006479E+00 -8.808050E-01 -1.444838E-02 -4.349668E-05 -2.926865E-01 -1.944083E-02 +2.533174E+00 +1.298118E+00 +2.453769E-02 +1.227715E-04 +3.869051E-01 +3.180828E-02 tally 2: 0.000000E+00 0.000000E+00 -2.030000E+00 -8.879000E-01 -0.000000E+00 -0.000000E+00 +2.540000E+00 +1.293400E+00 +4.000000E-02 +6.000000E-04 4.000000E-01 -4.240000E-02 +3.600000E-02 tally 3: 0.000000E+00 0.000000E+00 -1.990713E+00 -8.557870E-01 -1.427399E-02 -4.420707E-05 -2.968053E-01 -1.960663E-02 +2.422314E+00 +1.193460E+00 +4.285618E-02 +4.109734E-04 +3.832282E-01 +3.169516E-02 diff --git a/tests/test_score_absorption/settings.xml b/tests/test_score_absorption/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_score_absorption/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_absorption/tallies.xml b/tests/test_score_absorption/tallies.xml deleted file mode 100644 index 8b2dc2931..000000000 --- a/tests/test_score_absorption/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - absorption - - - - - analog - absorption - - - - - collision - absorption - - - diff --git a/tests/test_score_absorption/test_score_absorption.py b/tests/test_score_absorption/test_score_absorption.py index 1777db993..c7e3e130d 100644 --- a/tests/test_score_absorption/test_score_absorption.py +++ b/tests/test_score_absorption/test_score_absorption.py @@ -1,10 +1,32 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreAbsorptionTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('absorption') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + super(ScoreAbsorptionTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreAbsorptionTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreAbsorptionTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_current/geometry.xml b/tests/test_score_current/geometry.xml index b85dd04df..f6f067aad 100644 --- a/tests/test_score_current/geometry.xml +++ b/tests/test_score_current/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_score_current/test_score_current.py b/tests/test_score_current/test_score_current.py index 64f640b96..99c2981c2 100644 --- a/tests/test_score_current/test_score_current.py +++ b/tests/test_score_current/test_score_current.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import HashedTestHarness diff --git a/tests/test_score_events/geometry.xml b/tests/test_score_events/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_events/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_events/inputs_true.dat b/tests/test_score_events/inputs_true.dat new file mode 100644 index 000000000..bb0fef8e5 --- /dev/null +++ b/tests/test_score_events/inputs_true.dat @@ -0,0 +1 @@ +a97ae7049ac8c30b838987a3e87cbe5ff70b004ee0434e6204931def46c4c099bfef06e74658dab1114cc1035d3f404211a9bc94ef96e9cfb5b788da39d17bbd \ No newline at end of file diff --git a/tests/test_score_events/materials.xml b/tests/test_score_events/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_events/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_events/results_true.dat b/tests/test_score_events/results_true.dat index 35ae33eb8..34b114fbc 100644 --- a/tests/test_score_events/results_true.dat +++ b/tests/test_score_events/results_true.dat @@ -1,12 +1,12 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -5.328000E+01 -6.082750E+02 -5.594000E+01 -6.836068E+02 +6.520000E+01 +8.551888E+02 +4.035000E+01 +3.351119E+02 tally 2: -1.372000E+01 -4.018980E+01 -1.474000E+01 -4.802520E+01 +1.739000E+01 +6.083290E+01 +1.104000E+01 +2.498260E+01 diff --git a/tests/test_score_events/settings.xml b/tests/test_score_events/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_score_events/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_events/tallies.xml b/tests/test_score_events/tallies.xml deleted file mode 100644 index ac47f9ec8..000000000 --- a/tests/test_score_events/tallies.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - events - - - - - - analog - events - - - \ No newline at end of file diff --git a/tests/test_score_events/test_score_events.py b/tests/test_score_events/test_score_events.py index 1777db993..dce944592 100644 --- a/tests/test_score_events/test_score_events.py +++ b/tests/test_score_events/test_score_events.py @@ -1,10 +1,31 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreEventsTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 27)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 3)] + [t.add_filter(filt) for t in tallies] + [t.add_score('events') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + super(ScoreEventsTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreEventsTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreEventsTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_fission/geometry.xml b/tests/test_score_fission/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_fission/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_fission/inputs_true.dat b/tests/test_score_fission/inputs_true.dat new file mode 100644 index 000000000..d90ca274e --- /dev/null +++ b/tests/test_score_fission/inputs_true.dat @@ -0,0 +1 @@ +5a0461d03b0d9653ee35fded4be23e9b8316e3b7e21d352f822bc1f9763c03e9edab922bdc431f30d2a647c4216d45deba396bf56203027a328b7b28d970e0b8 \ No newline at end of file diff --git a/tests/test_score_fission/materials.xml b/tests/test_score_fission/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_fission/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_fission/results_true.dat b/tests/test_score_fission/results_true.dat index 86b31aaaf..2b28cc825 100644 --- a/tests/test_score_fission/results_true.dat +++ b/tests/test_score_fission/results_true.dat @@ -1,29 +1,29 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -9.432574E-01 -1.970463E-01 +1.156315E+00 +2.733527E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.039280E+00 -2.345809E-01 +6.971594E-01 +1.004973E-01 tally 2: -8.953531E-01 -1.798609E-01 +1.225263E+00 +3.054971E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -9.923196E-01 -2.067216E-01 +6.475958E-01 +8.567154E-02 tally 3: -9.036254E-01 -1.746552E-01 +1.131528E+00 +2.612886E-01 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -9.912744E-01 -2.192705E-01 +7.021712E-01 +1.008605E-01 diff --git a/tests/test_score_fission/settings.xml b/tests/test_score_fission/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_score_fission/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_fission/tallies.xml b/tests/test_score_fission/tallies.xml deleted file mode 100644 index a8b57f911..000000000 --- a/tests/test_score_fission/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - fission - - - - - analog - fission - - - - - collision - fission - - - diff --git a/tests/test_score_fission/test_score_fission.py b/tests/test_score_fission/test_score_fission.py index 1777db993..4026c0cab 100644 --- a/tests/test_score_fission/test_score_fission.py +++ b/tests/test_score_fission/test_score_fission.py @@ -1,10 +1,32 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreFissionTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23, 27)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('fission') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + super(ScoreFissionTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreFissionTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreFissionTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_flux/geometry.xml b/tests/test_score_flux/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_flux/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_flux/inputs_true.dat b/tests/test_score_flux/inputs_true.dat new file mode 100644 index 000000000..2e7358c49 --- /dev/null +++ b/tests/test_score_flux/inputs_true.dat @@ -0,0 +1 @@ +33b7b97f55a337d7001e7927517db6d36d512efec01fa5512c80bbc76b0b581f691a72a3810251aa97491b8cdf25a8ddcc9c9b3e3f54ccc6c315a84e715567d3 \ No newline at end of file diff --git a/tests/test_score_flux/materials.xml b/tests/test_score_flux/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_flux/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_flux/results_true.dat b/tests/test_score_flux/results_true.dat index 31ca238d4..5c366ea8c 100644 --- a/tests/test_score_flux/results_true.dat +++ b/tests/test_score_flux/results_true.dat @@ -1,41 +1,41 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -3.224218E+01 -2.217821E+02 -1.079687E+01 -2.494701E+01 -5.252579E+01 -5.951604E+02 -3.325822E+01 -2.414028E+02 -1.145800E+01 -2.880575E+01 -5.605671E+01 -6.804062E+02 +3.890713E+01 +3.046363E+02 +1.366220E+01 +3.758161E+01 +6.561669E+01 +8.680729E+02 +2.382728E+01 +1.170590E+02 +8.047875E+00 +1.334796E+01 +4.056568E+01 +3.389623E+02 tally 2: -3.077754E+01 -2.017424E+02 -1.172238E+01 -3.139127E+01 -5.231699E+01 -5.870469E+02 -3.259142E+01 -2.336719E+02 -1.040924E+01 -2.432332E+01 -5.709679E+01 -6.978668E+02 +3.862543E+01 +2.993190E+02 +1.438678E+01 +4.193571E+01 +6.400634E+01 +8.298077E+02 +2.426423E+01 +1.215124E+02 +7.600812E+00 +1.199814E+01 +4.104875E+01 +3.455300E+02 tally 3: -3.077754E+01 -2.017424E+02 -1.172238E+01 -3.139127E+01 -5.231699E+01 -5.870469E+02 -3.259142E+01 -2.336719E+02 -1.040924E+01 -2.432332E+01 -5.709679E+01 -6.978668E+02 +3.862543E+01 +2.993190E+02 +1.438678E+01 +4.193571E+01 +6.400634E+01 +8.298077E+02 +2.426423E+01 +1.215124E+02 +7.600812E+00 +1.199814E+01 +4.104875E+01 +3.455300E+02 diff --git a/tests/test_score_flux/settings.xml b/tests/test_score_flux/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_score_flux/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_flux/tallies.xml b/tests/test_score_flux/tallies.xml deleted file mode 100644 index bcde40c75..000000000 --- a/tests/test_score_flux/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - flux - - - - - flux - analog - - - - - flux - collision - - - diff --git a/tests/test_score_flux/test_score_flux.py b/tests/test_score_flux/test_score_flux.py index 1777db993..1eea55f45 100644 --- a/tests/test_score_flux/test_score_flux.py +++ b/tests/test_score_flux/test_score_flux.py @@ -1,10 +1,32 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreFluxTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23, 27, 28, 29)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('flux') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + super(ScoreFluxTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreFluxTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreFluxTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_flux_yn/geometry.xml b/tests/test_score_flux_yn/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_flux_yn/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_flux_yn/inputs_true.dat b/tests/test_score_flux_yn/inputs_true.dat new file mode 100644 index 000000000..c7a1a1b52 --- /dev/null +++ b/tests/test_score_flux_yn/inputs_true.dat @@ -0,0 +1 @@ +b1a63345fc721f87c8fc25babb06741b585ee5dff5f29bb6debfbabb2ad57cb762d98c14e544df998a27bc725fb2704092fcdde54315ff832dff96c3641551d0 \ No newline at end of file diff --git a/tests/test_score_flux_yn/materials.xml b/tests/test_score_flux_yn/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_flux_yn/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_flux_yn/results_true.dat b/tests/test_score_flux_yn/results_true.dat index 937f810ea..28a1babb0 100644 --- a/tests/test_score_flux_yn/results_true.dat +++ b/tests/test_score_flux_yn/results_true.dat @@ -1,1314 +1,1314 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -3.224218E+01 -2.217821E+02 -1.079687E+01 -2.494701E+01 -5.252579E+01 -5.951604E+02 -3.325822E+01 -2.414028E+02 -1.145800E+01 -2.880575E+01 -5.605671E+01 -6.804062E+02 +3.890713E+01 +3.046363E+02 +1.366220E+01 +3.758161E+01 +6.561669E+01 +8.680729E+02 +2.382728E+01 +1.170590E+02 +8.047875E+00 +1.334796E+01 +4.056568E+01 +3.389623E+02 tally 2: -3.224218E+01 -2.217821E+02 --4.524803E-01 -1.326110E-01 --2.725152E-01 -4.845463E-01 --4.030063E-01 -1.825349E-01 --2.145346E-01 -7.197305E-02 -2.488985E-01 -4.295894E-02 --6.797085E-01 -2.125889E-01 -1.698034E-01 -3.750580E-02 --6.596628E-02 -6.507545E-02 -4.519597E-02 -1.432412E-02 -6.227959E-01 -1.066624E-01 -2.328135E-01 -8.583522E-02 --8.899482E-01 -1.982834E-01 -3.269468E-01 -5.392549E-02 -1.684792E-01 -1.461138E-01 --2.026161E-01 -1.992812E-01 -2.599678E-01 -7.704699E-02 --3.329837E-01 -8.761827E-02 --5.287177E-01 -9.089410E-02 -3.666982E-01 -4.451200E-02 -2.096594E-01 -4.539545E-02 -2.091762E-01 -4.861771E-02 -1.476292E-01 -2.837569E-02 --4.091772E-01 -1.141307E-01 --1.652694E-01 -5.552090E-02 -8.207679E-02 -1.659512E-02 --1.203575E-01 -6.408952E-02 --8.219791E-03 -9.915873E-02 --3.768675E-02 -8.535079E-02 -1.305167E-01 -1.917693E-02 -1.823050E-01 -1.945159E-02 -2.999655E-01 -4.587948E-02 -3.687435E-01 -1.382795E-01 -1.220376E-01 -6.297901E-02 -3.899923E-01 -5.894393E-02 --1.878957E-02 -1.159448E-01 -1.079687E+01 -2.494701E+01 --1.067271E-01 -9.075462E-03 --2.571244E-02 -4.402172E-02 --3.646387E-02 -2.948533E-02 --1.043828E-01 -1.600528E-02 -4.361032E-02 -3.875958E-03 --3.096545E-01 -3.184604E-02 -8.723730E-02 -4.599654E-03 -6.541966E-03 -9.605866E-03 -5.837907E-02 -3.026784E-03 -1.523399E-01 -7.846764E-03 -2.778305E-02 -8.106935E-03 --2.895648E-01 -1.983532E-02 -4.866247E-02 -1.048055E-02 -2.600097E-02 -1.465465E-02 --6.958338E-02 -3.287519E-02 -1.690742E-01 -1.204714E-02 --1.127534E-01 -7.881362E-03 --1.662306E-01 -9.412057E-03 -1.674047E-01 -6.690449E-03 --4.370664E-02 -5.828314E-03 -9.323095E-02 -4.400433E-03 -1.353164E-02 -1.389416E-03 --1.062009E-01 -1.297730E-02 --5.331064E-02 -5.321055E-03 -7.698466E-02 -3.247975E-03 --2.095250E-02 -4.788058E-03 --8.861817E-03 -7.657174E-03 -1.769365E-02 -1.144058E-03 -1.788678E-02 -2.746804E-03 -4.403056E-03 -6.918351E-04 -1.059091E-01 -1.394217E-02 -1.442934E-01 -1.318500E-02 -2.199047E-02 -5.838245E-03 -8.175546E-02 -3.242012E-03 -7.359786E-03 -1.673277E-02 -5.252579E+01 -5.951604E+02 --8.293789E-01 -2.900775E-01 -6.285324E-01 -1.487344E+00 --4.765860E-01 -8.058451E-01 --3.101266E-01 -1.597231E-01 -3.333449E-01 -1.162003E-01 --1.314742E+00 -4.565068E-01 -4.726655E-01 -1.161194E-01 -2.824987E-01 -8.732802E-02 -1.025468E-01 -4.935830E-02 -4.216767E-01 -1.225700E-01 --4.022783E-02 -1.178843E-01 --7.967853E-01 -2.698001E-01 -3.741686E-01 -2.849501E-01 -3.377745E-01 -3.722806E-01 -9.234355E-02 -4.498496E-01 -8.019475E-01 -3.404218E-01 --3.086622E-01 -1.857604E-01 --8.474654E-01 -1.733363E-01 -8.124627E-01 -1.415201E-01 --3.075481E-01 -3.345921E-02 -7.126178E-01 -2.478330E-01 -2.983972E-01 -2.913106E-02 --6.759256E-01 -4.245338E-01 --3.491214E-01 -1.017784E-01 -1.637602E-01 -7.414687E-02 --3.344942E-01 -1.165491E-01 --6.038784E-02 -1.791698E-01 -2.645086E-01 -8.129446E-02 --2.738265E-01 -6.616303E-02 -1.135151E-02 -4.140154E-02 -4.679883E-01 -1.914750E-01 -2.876984E-01 -1.355086E-01 --2.741613E-01 -1.060457E-01 -5.972204E-01 -2.144153E-01 --9.215131E-02 -4.815135E-01 -3.325822E+01 -2.414028E+02 --3.072951E-02 -3.385901E-01 -9.729550E-01 -3.745599E-01 --5.237870E-01 -3.101477E-01 --5.994810E-01 -1.696123E-01 --3.402784E-01 -1.910685E-01 --3.779571E-01 -2.598004E-01 --4.804007E-01 -1.417261E-01 --5.444032E-01 -1.756801E-01 --9.921809E-02 -6.889191E-02 --3.768065E-01 -8.931168E-02 -5.814513E-02 -1.660714E-02 --1.263664E-01 -2.650287E-01 -1.951860E-01 -2.090892E-01 -3.576168E-01 -2.511782E-01 --9.547988E-02 -7.900044E-03 -5.460746E-01 -1.319868E-01 --1.577655E-01 -8.575762E-02 -2.938792E-02 -7.941653E-02 --7.505627E-01 -2.530444E-01 --2.399786E-01 -1.105633E-01 -2.035740E-01 -2.442135E-02 -1.190368E-01 -8.652216E-02 -5.753449E-01 -9.353813E-02 -4.911025E-01 -6.795258E-02 --2.967023E-03 -7.063512E-03 --2.158307E-01 -4.680921E-02 --1.811238E-01 -7.008450E-02 -1.809785E-01 -3.414843E-02 --1.380825E-01 -3.469381E-02 -3.722241E-01 -3.956589E-02 -2.064516E-01 -2.676312E-02 --3.889056E-01 -6.737109E-02 -1.625815E-01 -1.356347E-02 --5.278455E-01 -1.297993E-01 --1.269304E-02 -1.253029E-02 -1.145800E+01 -2.880575E+01 -6.201234E-02 -4.410457E-02 -2.694694E-01 -6.262339E-02 --1.173739E-01 -4.727885E-02 --1.785056E-01 -1.745391E-02 --4.744392E-02 -2.117667E-02 -3.998416E-02 -6.058339E-02 --1.927536E-01 -1.710512E-02 --1.800560E-01 -2.420071E-02 --1.136912E-01 -1.049357E-02 --1.104415E-01 -1.181394E-02 -3.486245E-02 -3.673104E-03 --8.343502E-02 -2.270299E-02 --3.064437E-02 -1.197968E-02 -1.912081E-01 -2.808487E-02 -2.601014E-02 -1.311244E-03 -1.295023E-01 -1.108983E-02 --1.158397E-01 -1.033182E-02 -8.316701E-02 -2.061897E-02 --1.136796E-01 -3.133021E-02 --1.722931E-02 -2.168654E-02 -1.464014E-01 -8.570818E-03 -5.859338E-02 -6.076029E-03 -1.776223E-01 -1.345571E-02 -1.582455E-01 -9.719314E-03 -9.088118E-03 -1.681557E-03 --6.298727E-02 -5.287397E-03 -5.793395E-03 -6.397495E-03 --1.835123E-02 -4.506573E-03 --7.558061E-02 -4.462082E-03 -3.136371E-02 -3.181332E-03 --2.787527E-02 -1.765822E-03 --9.878307E-02 -3.381183E-03 -1.279690E-01 -4.386067E-03 --1.043523E-01 -5.381331E-03 -1.000162E-02 -6.707280E-04 -5.605671E+01 -6.804062E+02 -1.431465E-01 -1.700768E+00 -2.010680E+00 -2.307036E+00 --5.276592E-01 -1.006050E+00 --9.123132E-01 -4.824313E-01 --3.276490E-01 -5.842232E-01 -6.749445E-02 -6.049661E-01 --1.317515E+00 -4.738014E-01 --9.470910E-01 -4.937085E-01 --3.338536E-01 -2.196164E-01 --3.032729E-01 -1.241029E-01 --3.285269E-01 -5.276607E-02 --4.107012E-01 -6.402858E-01 -3.357626E-01 -2.672801E-01 -1.000507E+00 -5.263322E-01 --1.834202E-01 -9.495434E-02 -8.133484E-01 -3.011488E-01 --4.083516E-01 -2.428630E-01 -4.032934E-01 -1.825835E-01 --8.291267E-01 -6.773284E-01 --2.401557E-01 -2.280331E-01 -4.325658E-01 -1.163540E-01 -6.671759E-02 -2.181769E-01 -6.984462E-01 -1.716985E-01 -7.108347E-01 -1.386394E-01 -1.709795E-01 -5.320122E-02 --2.354809E-01 -7.105363E-02 -1.600239E-01 -9.179874E-02 -2.802111E-02 -6.149546E-02 --4.005049E-01 -2.195356E-01 -7.914623E-01 -2.273026E-01 -3.392453E-01 -1.101813E-01 --7.821576E-01 -1.637944E-01 -4.736782E-01 -1.531480E-01 --5.253391E-01 -1.093913E-01 -2.235961E-01 -5.449263E-02 +3.890713E+01 +3.046363E+02 +-1.623579E-01 +4.602199E-02 +4.860074E-01 +5.999399E-01 +-7.895692E-01 +2.803790E-01 +2.525526E-01 +8.261176E-02 +9.103525E-02 +2.246700E-01 +4.583205E-01 +8.444556E-02 +-1.246553E-01 +2.351010E-01 +-3.534581E-01 +1.247916E-01 +-3.700473E-01 +5.215562E-02 +-1.831625E-01 +1.927381E-01 +-1.540114E-01 +1.918221E-02 +-1.266458E-01 +1.455875E-01 +-6.796869E-01 +3.911926E-01 +1.987931E-02 +4.966442E-02 +4.443797E-01 +8.842717E-02 +-1.073855E-01 +4.912428E-02 +-3.999416E-02 +4.440138E-02 +2.857919E-01 +6.935717E-02 +4.174851E-01 +5.485570E-02 +-2.178958E-01 +8.052149E-02 +-1.179644E-02 +6.709330E-02 +8.843286E-01 +2.749681E-01 +2.935079E-01 +3.032897E-02 +-1.809434E-01 +1.902413E-01 +-2.091991E-01 +1.061912E-01 +-7.137275E-02 +4.397656E-02 +2.311558E-01 +4.680679E-02 +9.927573E-02 +1.844111E-01 +-2.821437E-02 +7.293762E-02 +6.224251E-01 +1.028351E-01 +4.136440E-01 +5.198207E-02 +-7.833133E-02 +1.192960E-02 +1.041586E-01 +1.587417E-01 +-3.595677E-01 +3.086335E-01 +-2.096284E-01 +7.881012E-02 +1.366220E+01 +3.758161E+01 +1.461402E-02 +3.260482E-03 +8.325893E-02 +6.248769E-02 +-2.785736E-01 +3.698417E-02 +1.932396E-03 +1.561742E-02 +8.063397E-02 +3.598680E-02 +8.565555E-02 +5.344369E-03 +-3.899905E-02 +2.422867E-02 +-1.215439E-01 +9.193858E-03 +-1.982614E-01 +1.045860E-02 +-7.712629E-02 +2.199979E-02 +3.626484E-02 +9.872078E-04 +-6.305159E-02 +1.645879E-02 +-3.052155E-01 +5.620564E-02 +3.507115E-02 +1.056383E-02 +1.297490E-02 +5.889958E-03 +-1.208752E-02 +7.323602E-03 +-3.441007E-03 +1.841496E-02 +5.543442E-02 +1.186636E-02 +8.000436E-02 +3.703835E-03 +-3.636792E-02 +1.490603E-02 +8.753196E-02 +7.958027E-03 +2.066727E-01 +1.414130E-02 +3.652482E-02 +8.380395E-04 +-1.652432E-01 +1.878732E-02 +-1.375567E-01 +1.302400E-02 +3.692057E-03 +6.312506E-03 +9.016211E-02 +6.699735E-03 +-5.875401E-02 +1.731945E-02 +-3.960008E-02 +3.595906E-03 +1.653510E-01 +9.277293E-03 +4.064973E-02 +2.794606E-03 +-1.729061E-02 +3.219772E-03 +5.764808E-02 +1.861051E-02 +-5.970583E-02 +2.070164E-02 +-6.739411E-02 +1.063341E-02 +6.561669E+01 +8.680729E+02 +-7.938430E-01 +2.994198E-01 +9.278084E-01 +1.861899E+00 +-1.432236E+00 +7.429647E-01 +7.460836E-02 +5.946808E-01 +6.140731E-02 +3.175177E-01 +1.212677E+00 +5.125288E-01 +1.952865E-02 +5.468421E-01 +-2.965796E-01 +1.123288E-01 +-5.334195E-01 +1.589612E-01 +-6.340814E-01 +4.874650E-01 +-4.264003E-02 +9.109571E-03 +-4.323424E-01 +3.370329E-01 +-1.186876E+00 +9.854644E-01 +-2.420825E-01 +1.699455E-01 +2.920627E-02 +6.816643E-02 +-2.684345E-01 +9.799236E-02 +1.281596E-01 +3.092987E-01 +3.746150E-01 +1.242044E-01 +1.035056E+00 +2.589772E-01 +2.005450E-01 +2.074622E-01 +5.412719E-01 +3.193584E-01 +1.070173E+00 +3.266747E-01 +2.657850E-01 +1.599950E-01 +-4.694853E-01 +2.738937E-01 +-7.761977E-01 +2.561652E-01 +3.673179E-02 +9.486916E-02 +3.309909E-01 +1.095243E-01 +1.623761E-01 +2.874582E-01 +2.846296E-01 +2.430397E-01 +7.384842E-01 +2.556480E-01 +3.577508E-01 +1.763210E-01 +-2.917525E-01 +1.875646E-01 +1.634324E-01 +2.952144E-01 +-4.329582E-01 +3.418652E-01 +-2.719362E-01 +2.278925E-01 +2.382728E+01 +1.170590E+02 +-4.718326E-01 +1.961501E-01 +1.612551E-02 +2.815245E-02 +-6.390587E-01 +1.902968E-01 +2.290989E-01 +3.758858E-02 +-1.568179E-01 +1.509162E-01 +-2.363058E-01 +6.671396E-02 +4.350800E-02 +1.031680E-01 +-2.956828E-01 +2.515141E-02 +4.835878E-01 +8.614200E-02 +-5.365970E-02 +8.404087E-02 +6.079969E-02 +3.684343E-02 +-1.313088E-02 +1.488843E-02 +-2.603258E-02 +2.900625E-02 +1.249213E-01 +2.737277E-02 +-4.491422E-01 +9.482600E-02 +-1.095589E-01 +3.711500E-02 +2.248159E-01 +2.815827E-02 +-5.976009E-02 +5.887828E-03 +6.097208E-02 +5.393315E-02 +3.449714E-02 +4.332442E-02 +1.030757E-01 +2.839453E-02 +-4.399117E-01 +8.887569E-02 +-4.564910E-01 +1.172398E-01 +-2.528382E-01 +1.217655E-01 +-3.443316E-01 +4.275616E-02 +5.437008E-02 +2.355567E-02 +5.505588E-02 +5.479129E-02 +-8.326640E-02 +3.095858E-02 +1.888781E-01 +2.884542E-02 +1.981251E-01 +1.520694E-02 +5.279866E-02 +1.020641E-01 +-1.465368E-01 +3.070686E-02 +2.356940E-01 +7.899657E-02 +4.109278E-01 +5.291082E-02 +-2.572510E-01 +3.420895E-02 +8.047875E+00 +1.334796E+01 +-1.707535E-01 +3.290927E-02 +1.024687E-01 +1.308811E-02 +-1.805451E-01 +1.696222E-02 +3.519587E-02 +7.546726E-03 +-1.034933E-01 +2.224207E-02 +-1.580512E-01 +2.369625E-02 +-4.302961E-02 +1.635623E-02 +-2.992903E-02 +5.190220E-03 +2.130862E-01 +1.186351E-02 +-3.321696E-02 +7.972404E-03 +4.992040E-02 +5.667098E-03 +1.261320E-02 +2.436872E-03 +8.314024E-04 +5.360616E-03 +-6.318247E-02 +1.644558E-03 +-1.373600E-01 +1.030707E-02 +1.511677E-03 +3.467685E-03 +1.923485E-02 +8.106508E-04 +-1.180094E-01 +4.381376E-03 +-2.798056E-02 +4.871288E-03 +-7.689499E-02 +7.079493E-03 +-5.842586E-02 +1.380713E-03 +-9.946341E-02 +7.085062E-03 +-8.061825E-02 +8.679468E-03 +-9.229524E-03 +9.187483E-03 +-1.048310E-01 +3.506026E-03 +3.666209E-02 +3.259203E-03 +1.190727E-01 +4.935341E-03 +-7.391655E-02 +2.805554E-03 +2.029126E-02 +2.497736E-03 +2.787185E-02 +5.677987E-04 +6.873108E-02 +1.287727E-02 +-5.262840E-02 +3.190440E-03 +3.910911E-02 +8.661121E-03 +1.076197E-01 +5.456176E-03 +-7.476066E-02 +2.693605E-03 +4.056568E+01 +3.389623E+02 +-6.428633E-01 +6.128893E-01 +4.878518E-01 +2.130257E-01 +-9.548044E-01 +4.556949E-01 +2.234940E-01 +1.006817E-01 +1.080276E-01 +5.980158E-01 +-3.639229E-01 +3.120105E-01 +3.237506E-01 +3.451548E-01 +1.143081E-01 +7.924550E-02 +6.456733E-01 +2.424413E-01 +1.478136E-01 +1.458665E-01 +2.134798E-02 +9.102875E-02 +3.633264E-01 +7.386463E-02 +-2.213946E-01 +1.253249E-01 +-3.153847E-01 +1.094273E-01 +-7.161113E-01 +2.275500E-01 +-2.461979E-01 +1.484452E-01 +2.332886E-01 +9.715521E-02 +-7.029988E-02 +1.835254E-02 +-1.982842E-01 +9.722998E-02 +-2.089693E-01 +2.271404E-01 +7.316104E-02 +3.974665E-02 +-3.266640E-01 +8.054809E-02 +-5.126088E-01 +3.234942E-01 +-3.048753E-01 +3.439501E-01 +-4.872647E-01 +9.473730E-02 +1.590200E-01 +3.613462E-02 +4.641787E-01 +1.671339E-01 +-1.391114E-01 +3.581561E-02 +2.209343E-01 +1.489367E-02 +3.015665E-01 +4.265694E-02 +1.334716E-01 +2.321929E-01 +-3.702914E-01 +1.699549E-01 +8.891532E-02 +1.708595E-01 +6.123686E-01 +1.429184E-01 +-5.891300E-01 +1.085467E-01 tally 3: -3.077754E+01 -2.017424E+02 --4.040800E-01 -5.606719E-01 --5.238239E-01 -4.460714E-01 -1.155164E-01 -1.686786E-01 --1.972294E-01 -2.912851E-01 -4.908524E-01 -1.374195E-01 --1.467088E-02 -1.080839E-01 -6.749037E-02 -1.397361E-01 -4.136479E-03 -9.237632E-02 --3.742305E-01 -9.917374E-02 -5.374208E-01 -2.530961E-01 -2.270996E-01 -9.415721E-02 --4.568867E-02 -1.277446E-01 -1.581716E-01 -6.217155E-02 -4.667840E-01 -1.143380E-01 -9.684270E-02 -7.302998E-02 -8.366629E-01 -1.797483E-01 --5.657893E-01 -2.553910E-01 --2.351441E-02 -4.395513E-02 -7.843306E-01 -1.466478E-01 -4.617856E-02 -1.154681E-02 -1.431343E-01 -3.531062E-02 -4.625825E-01 -6.235642E-02 --8.837342E-02 -6.231694E-02 --3.766755E-01 -6.412261E-02 -1.995226E-01 -1.743990E-01 --2.498625E-02 -8.897536E-02 --1.039315E-01 -1.868672E-01 -6.712910E-01 -2.084042E-01 -5.805639E-02 -4.049580E-02 -1.603677E-01 -4.280033E-02 -3.909878E-01 -7.726018E-02 -9.878354E-02 -4.630595E-02 --2.389983E-01 -3.528604E-02 -1.641046E-01 -1.669859E-01 --2.351986E-02 -1.048794E-02 -1.172238E+01 -3.139127E+01 --1.057733E+00 -2.820672E-01 -5.708838E-02 -6.224675E-02 -2.492981E-02 -1.827498E-01 --1.339268E-01 -1.968929E-02 -2.363867E-01 -3.028587E-02 --2.867841E-01 -2.680318E-02 --2.352784E-01 -1.895006E-02 -4.365572E-01 -1.883240E-01 --3.388837E-01 -7.209932E-02 -3.488374E-01 -6.640137E-02 --3.343893E-01 -4.149634E-02 --4.575314E-01 -7.461614E-02 -4.436881E-01 -1.325092E-01 -3.394853E-01 -2.987173E-02 --2.633936E-02 -6.171428E-02 -9.994191E-02 -6.447641E-02 --1.618840E-01 -3.497845E-02 --1.290678E-01 -3.735394E-02 -9.852126E-03 -2.963925E-02 --1.656539E-01 -4.190396E-02 --2.292763E-01 -7.045480E-02 --4.616824E-03 -1.926690E-02 --1.960839E-01 -1.396042E-02 --2.133526E-02 -5.189823E-02 -2.933136E-01 -5.721356E-02 --1.084914E-01 -2.448532E-02 --4.778583E-01 -7.644033E-02 -1.736901E-01 -6.630467E-02 --5.460801E-02 -1.510381E-02 -1.106093E-01 -1.590306E-02 -1.659501E-01 -5.983218E-02 -1.343781E-02 -2.751294E-02 -2.052693E-01 -3.478581E-02 --1.006298E-01 -1.815313E-02 --2.563766E-01 -3.045246E-02 -5.231699E+01 -5.870469E+02 --6.102587E-01 -5.930968E-01 -1.184182E+00 -1.364433E+00 --6.362263E-02 -8.852514E-01 --4.844978E-01 -1.751923E-01 -8.223413E-01 -2.436206E-01 --9.656506E-01 -3.513566E-01 -2.710494E-01 -7.170772E-01 -4.792482E-01 -2.551569E-01 --1.266077E-01 -2.824778E-01 -6.389964E-01 -2.501483E-01 -8.915816E-01 -3.557431E-01 --1.007448E+00 -5.743018E-01 -3.528444E-01 -2.428078E-01 --5.833000E-01 -3.733648E-01 --4.660289E-01 -6.567263E-02 -5.856088E-01 -2.336146E-01 -3.836351E-02 -7.665403E-02 --6.721211E-01 -2.651780E-01 -5.725993E-01 -2.101026E-01 --2.130594E-01 -1.855350E-02 -2.607168E-01 -1.564288E-01 --3.399382E-02 -3.067656E-02 --1.228976E+00 -6.554836E-01 --2.962235E-01 -1.808511E-01 -5.521675E-01 -1.722073E-01 --1.658751E-01 -1.994119E-02 --2.671896E-01 -1.343320E-01 --2.325282E-01 -4.677656E-02 --3.380310E-01 -1.703532E-01 --3.571853E-01 -1.140525E-01 -3.836770E-02 -8.586429E-02 -7.328263E-01 -1.567227E-01 -4.840110E-02 -2.718471E-02 -5.654783E-01 -3.645579E-01 --3.027585E-01 -1.407867E-01 -3.259142E+01 -2.336719E+02 -3.053294E-01 -2.086257E-01 --7.563597E-01 -2.816768E-01 --3.039288E-01 -2.855043E-01 --2.648323E-01 -1.883784E-01 -2.665933E-01 -1.782353E-01 -1.978960E-01 -1.419567E-01 -1.228712E-01 -1.913946E-01 --9.152681E-03 -1.324681E-01 --5.707326E-01 -1.092067E-01 -2.326858E-01 -6.731743E-02 --5.170241E-01 -1.353439E-01 --4.064026E-01 -9.715030E-02 --1.142031E-01 -7.748788E-02 -2.928039E-01 -2.716157E-01 --1.721186E-01 -1.447738E-01 -6.452116E-01 -1.821975E-01 --5.697276E-01 -1.047333E-01 --9.640967E-02 -1.139327E-01 --4.509832E-01 -2.079493E-01 --2.134684E-02 -2.907667E-01 --2.434868E-01 -1.235397E-01 -2.550330E-01 -2.979627E-01 -9.598615E-01 -3.140885E-01 -1.218430E-01 -6.283872E-02 -2.412915E-01 -1.907292E-02 --2.236667E-01 -4.379414E-02 -2.844474E-01 -2.965692E-02 -1.618860E-01 -8.293785E-03 --1.265583E-01 -4.515449E-02 -6.356127E-02 -1.358134E-02 --3.844886E-01 -8.600010E-02 --1.942739E-01 -7.516022E-02 -1.765511E-01 -3.522611E-02 --3.433188E-01 -3.456066E-02 --1.501983E-01 -5.633844E-02 -1.040924E+01 -2.432332E+01 --4.138270E-01 -1.309129E-01 --3.151106E-01 -1.286964E-01 -9.213222E-02 -6.189454E-02 --2.746107E-01 -8.103949E-02 --9.781742E-02 -3.783736E-02 --1.178371E-01 -3.242332E-02 --5.837932E-01 -2.059491E-01 --7.338223E-03 -8.012203E-02 -5.628994E-02 -2.190669E-02 -8.155585E-02 -1.039007E-01 -6.052048E-02 -4.339463E-02 --1.157646E-02 -1.839000E-02 --2.641673E-01 -4.737589E-02 --8.531135E-02 -5.432766E-02 -6.036555E-01 -1.190329E-01 --3.149976E-01 -5.735264E-02 --8.456340E-02 -4.563143E-03 -2.224065E-01 -6.600030E-02 -9.562392E-03 -1.843524E-02 --2.400599E-01 -3.182217E-02 --6.534941E-01 -1.180315E-01 -4.371157E-01 -9.076666E-02 -3.257455E-02 -2.936184E-02 --8.788428E-02 -1.923293E-02 --2.604776E-01 -3.660313E-02 --6.315350E-02 -1.503534E-02 -5.609294E-01 -8.783528E-02 --7.363672E-01 -1.789210E-01 -2.883575E-01 -6.478578E-02 --3.302954E-02 -1.517946E-02 --3.234157E-01 -4.418920E-02 -2.846318E-01 -2.712085E-02 --3.227536E-01 -5.062832E-02 -4.391474E-01 -5.548002E-02 -1.322988E-01 -2.995854E-02 -5.709679E+01 -6.978668E+02 -2.859201E-02 -1.094507E+00 -6.058587E-01 -6.079927E-01 -7.553798E-02 -1.131607E+00 --5.851206E-01 -1.215663E+00 -8.266012E-02 -9.031287E-01 --7.088368E-01 -3.984608E-01 --4.414986E-01 -1.502417E-01 -2.241998E-01 -3.228823E-01 --7.328574E-01 -2.430448E-01 --8.070160E-01 -1.767265E-01 --1.154449E-01 -8.739303E-03 --3.787161E-01 -4.728756E-01 --1.743577E-01 -1.091245E-01 -2.878137E-01 -2.724285E-01 -2.128994E-01 -4.440539E-01 -9.495567E-01 -3.622719E-01 -1.422950E-01 -5.309223E-02 -1.323659E-01 -1.911979E-01 --1.303752E-01 -5.710728E-01 --4.611294E-02 -4.086632E-02 -5.937879E-01 -1.006156E-01 --3.558925E-01 -2.998983E-01 -1.175971E+00 -5.323321E-01 -2.426485E-01 -1.497265E-01 -7.805090E-02 -5.060214E-02 --2.914577E-01 -2.233355E-01 -1.053098E-01 -6.693123E-02 -4.541315E-01 -1.328340E-01 --6.290732E-02 -8.910616E-02 -7.371592E-01 -1.980732E-01 -5.804701E-01 -1.711949E-01 --6.642202E-01 -1.131866E-01 -1.779818E-01 -6.530190E-02 --5.224739E-01 -2.534102E-01 --1.824905E-01 -2.910309E-02 +3.862543E+01 +2.993190E+02 +-5.083613E-01 +2.933365E-01 +-4.356793E-01 +6.676831E-01 +-6.093148E-01 +5.685331E-01 +2.512276E-01 +1.308652E-01 +-1.075955E+00 +4.775270E-01 +3.660307E-01 +1.627691E-01 +5.402149E-01 +2.324946E-01 +-3.887573E-01 +1.028105E-01 +4.324152E-01 +1.015147E-01 +3.306993E-02 +8.425069E-02 +2.127456E-01 +5.435453E-02 +2.977294E-01 +1.088039E-01 +-1.055079E+00 +3.590635E-01 +-6.740592E-01 +2.606281E-01 +3.329512E-01 +1.587428E-01 +-1.248691E-01 +1.659045E-01 +2.306000E-01 +1.062057E-01 +9.127791E-02 +2.649459E-01 +2.629881E-01 +4.786229E-02 +2.286813E-01 +2.363629E-02 +6.338613E-01 +1.118828E-01 +7.466647E-01 +1.424535E-01 +7.955161E-02 +1.003327E-02 +1.082691E-01 +2.727882E-02 +-5.295185E-01 +1.335133E-01 +-6.321517E-01 +1.422916E-01 +1.236137E-01 +2.041422E-01 +-5.389265E-02 +1.852888E-01 +3.746082E-01 +5.580885E-02 +1.383528E-01 +2.754456E-01 +5.081204E-01 +1.886515E-01 +-4.022264E-01 +1.417397E-01 +-3.377771E-01 +6.673888E-02 +1.170109E-01 +1.783182E-02 +-2.097916E-01 +7.139323E-02 +1.438678E+01 +4.193571E+01 +-6.547124E-01 +1.780450E-01 +2.207489E-01 +2.115835E-01 +4.952323E-02 +3.039341E-01 +6.681546E-01 +1.389250E-01 +-4.078026E-02 +4.393667E-02 +-8.695509E-01 +2.850853E-01 +-1.792062E-01 +7.367253E-02 +-5.657500E-01 +2.115125E-01 +-8.525189E-02 +2.541971E-02 +5.227867E-02 +2.008468E-02 +6.825349E-02 +5.316522E-02 +3.763076E-01 +7.112554E-02 +-1.279973E-02 +1.883096E-01 +7.775189E-02 +6.874374E-02 +1.119537E-01 +8.467755E-02 +-1.600632E-01 +8.650448E-02 +6.210095E-01 +1.094309E-01 +-9.997484E-02 +3.935353E-02 +-2.300525E-01 +2.351925E-02 +2.486103E-02 +3.125565E-02 +1.289518E-02 +2.879251E-02 +-3.166559E-01 +2.931428E-02 +-1.379285E-02 +2.416257E-02 +1.220552E-02 +5.154030E-02 +-1.431676E-01 +3.434080E-02 +8.148581E-02 +4.218412E-02 +8.541678E-03 +6.396306E-02 +-7.851012E-03 +5.799658E-02 +2.435723E-01 +6.744263E-02 +-2.429877E-01 +6.966516E-02 +-1.638644E-01 +2.058798E-02 +-8.986584E-03 +1.374824E-02 +3.547454E-01 +7.765460E-02 +-1.570173E-01 +6.916960E-02 +-1.056941E-02 +7.626528E-03 +6.400634E+01 +8.298077E+02 +-3.894111E-01 +8.617494E-01 +1.796567E-01 +1.065356E+00 +-1.561037E+00 +7.701475E-01 +-2.237530E-01 +2.259442E-01 +1.109999E+00 +6.179412E-01 +1.636912E+00 +7.887441E-01 +4.661183E-01 +4.191138E-01 +-1.040546E+00 +2.971961E-01 +1.044850E-01 +1.493530E-01 +-4.991935E-01 +3.222404E-01 +-4.205099E-01 +2.734911E-01 +-7.583139E-01 +3.000853E-01 +-3.750811E-01 +1.348273E-01 +-6.355508E-01 +3.666139E-01 +5.233787E-01 +1.292414E-01 +-2.869538E-02 +9.115092E-02 +6.851052E-01 +3.061040E-01 +1.703522E-01 +7.300335E-02 +4.541075E-01 +4.438507E-01 +-2.674857E-01 +4.718588E-01 +3.022517E-02 +1.136781E-01 +5.755596E-01 +2.688162E-01 +2.698373E-01 +1.403188E-01 +8.772347E-01 +3.503562E-01 +-4.258508E-01 +1.400825E-01 +-1.384853E-01 +4.924947E-02 +-1.009402E-01 +2.039230E-01 +-1.339732E-01 +4.772083E-02 +-3.249636E-01 +4.339747E-01 +1.564400E-01 +2.703717E-01 +2.536360E-01 +8.543919E-02 +-3.622063E-01 +7.442240E-02 +-2.074953E-02 +1.355614E-01 +-3.909820E-02 +1.007999E-01 +3.162815E-01 +9.656425E-02 +2.426423E+01 +1.215124E+02 +-9.628829E-01 +3.563586E-01 +2.964625E-01 +9.739638E-02 +-3.680881E-01 +3.484018E-01 +4.339143E-01 +7.590564E-02 +4.633394E-02 +1.080030E-01 +3.091634E-01 +1.246585E-01 +4.520500E-02 +1.095704E-01 +2.479383E-01 +1.138276E-01 +6.457108E-02 +6.833667E-02 +-5.623363E-02 +1.087254E-01 +3.675294E-01 +9.602246E-02 +-1.459951E-01 +9.440544E-02 +-6.817672E-02 +4.978066E-02 +1.076782E-02 +1.697440E-01 +-1.024501E-02 +1.184830E-01 +-1.654178E-01 +1.689209E-02 +-1.006214E-01 +3.392546E-02 +5.070063E-01 +7.598100E-02 +2.251704E-01 +7.867348E-02 +-1.693789E-01 +2.069974E-01 +-2.790249E-01 +2.674643E-02 +3.888604E-01 +3.649330E-02 +7.614452E-02 +7.098023E-02 +1.236282E-02 +5.476895E-02 +-3.151637E-01 +3.543466E-02 +-6.363562E-01 +9.323507E-02 +2.808153E-01 +8.537981E-02 +2.197639E-01 +3.393653E-02 +8.660625E-02 +1.575544E-02 +3.733826E-02 +1.449783E-02 +8.800903E-04 +3.993931E-02 +3.304886E-01 +3.099095E-02 +-4.149186E-02 +5.375091E-02 +2.448819E-01 +9.225028E-02 +-1.230091E-01 +3.865008E-02 +7.600812E+00 +1.199814E+01 +-8.738539E-01 +3.078183E-01 +-2.592305E-01 +1.015952E-01 +-6.391696E-02 +6.657129E-02 +-2.857855E-01 +2.216294E-02 +-3.516811E-01 +3.429194E-02 +4.585144E-02 +6.204056E-02 +-1.599494E-01 +1.684846E-02 +-2.364219E-01 +1.550644E-02 +1.197289E-01 +8.631394E-02 +-1.364517E-01 +5.086560E-02 +-2.213374E-01 +2.779096E-02 +-7.328761E-02 +1.216230E-02 +2.476803E-01 +2.724500E-02 +-6.356296E-02 +2.513244E-02 +-3.886281E-01 +9.479377E-02 +1.006972E-01 +1.352120E-02 +6.932242E-02 +3.192705E-02 +-3.232505E-02 +5.592418E-02 +9.582599E-02 +1.504811E-02 +-2.887999E-01 +3.760482E-02 +-2.372013E-01 +1.868786E-02 +-1.655526E-01 +4.720116E-02 +8.611265E-02 +2.284310E-02 +-2.142116E-01 +2.619080E-02 +-1.811202E-01 +1.457105E-02 +1.430164E-01 +2.016598E-02 +-4.066031E-01 +7.671356E-02 +1.364946E-01 +1.385677E-02 +8.357667E-02 +1.521943E-02 +-2.235270E-02 +1.029570E-02 +-7.920760E-02 +4.227880E-02 +2.622096E-01 +2.327728E-02 +-7.787296E-03 +2.288300E-02 +-1.645219E-02 +5.394704E-02 +7.274557E-02 +1.075570E-02 +4.104875E+01 +3.455300E+02 +-9.827893E-01 +2.751051E-01 +3.227606E-01 +1.213711E-01 +-1.272840E-02 +2.813639E-01 +-1.910394E-01 +5.682320E-02 +4.136260E-01 +2.444497E-01 +-5.123352E-02 +3.867174E-01 +4.424857E-02 +9.651204E-02 +-3.975443E-02 +1.867060E-01 +7.618837E-01 +1.756891E-01 +4.259599E-01 +1.146646E-01 +5.658031E-02 +1.366891E-01 +2.464931E-01 +2.181122E-01 +-1.593998E-01 +2.666678E-01 +-1.928096E-01 +1.216164E-01 +-7.020992E-01 +1.701086E-01 +3.914244E-01 +1.772217E-01 +3.285697E-01 +1.521826E-01 +-2.947923E-02 +8.201284E-02 +-1.346653E-01 +4.498340E-02 +2.112724E-01 +9.923303E-02 +-8.551910E-02 +8.804286E-03 +-3.631005E-01 +1.168145E-01 +-1.840770E-01 +5.714283E-02 +-2.709303E-02 +9.381338E-02 +-2.104005E-02 +4.479215E-02 +4.059493E-01 +8.277066E-02 +2.877400E-01 +8.584721E-02 +4.881128E-02 +1.864179E-01 +8.584545E-02 +4.421744E-02 +-4.392466E-01 +6.260373E-02 +-3.143214E-02 +8.184856E-02 +-5.630973E-01 +1.323469E-01 +-8.010498E-02 +1.096975E-01 +1.818829E-01 +1.717701E-02 +-1.062149E-01 +5.400365E-02 tally 4: -3.077754E+01 -2.017424E+02 --4.040800E-01 -5.606719E-01 --5.238239E-01 -4.460714E-01 -1.155164E-01 -1.686786E-01 --1.972294E-01 -2.912851E-01 -4.908524E-01 -1.374195E-01 --1.467088E-02 -1.080839E-01 -6.749037E-02 -1.397361E-01 -4.136479E-03 -9.237632E-02 --3.742305E-01 -9.917374E-02 -5.374208E-01 -2.530961E-01 -2.270996E-01 -9.415721E-02 --4.568867E-02 -1.277446E-01 -1.581716E-01 -6.217155E-02 -4.667840E-01 -1.143380E-01 -9.684270E-02 -7.302998E-02 -8.366629E-01 -1.797483E-01 --5.657893E-01 -2.553910E-01 --2.351441E-02 -4.395513E-02 -7.843306E-01 -1.466478E-01 -4.617856E-02 -1.154681E-02 -1.431343E-01 -3.531062E-02 -4.625825E-01 -6.235642E-02 --8.837342E-02 -6.231694E-02 --3.766755E-01 -6.412261E-02 -1.995226E-01 -1.743990E-01 --2.498625E-02 -8.897536E-02 --1.039315E-01 -1.868672E-01 -6.712910E-01 -2.084042E-01 -5.805639E-02 -4.049580E-02 -1.603677E-01 -4.280033E-02 -3.909878E-01 -7.726018E-02 -9.878354E-02 -4.630595E-02 --2.389983E-01 -3.528604E-02 -1.641046E-01 -1.669859E-01 --2.351986E-02 -1.048794E-02 -1.172238E+01 -3.139127E+01 --1.057733E+00 -2.820672E-01 -5.708838E-02 -6.224675E-02 -2.492981E-02 -1.827498E-01 --1.339268E-01 -1.968929E-02 -2.363867E-01 -3.028587E-02 --2.867841E-01 -2.680318E-02 --2.352784E-01 -1.895006E-02 -4.365572E-01 -1.883240E-01 --3.388837E-01 -7.209932E-02 -3.488374E-01 -6.640137E-02 --3.343893E-01 -4.149634E-02 --4.575314E-01 -7.461614E-02 -4.436881E-01 -1.325092E-01 -3.394853E-01 -2.987173E-02 --2.633936E-02 -6.171428E-02 -9.994191E-02 -6.447641E-02 --1.618840E-01 -3.497845E-02 --1.290678E-01 -3.735394E-02 -9.852126E-03 -2.963925E-02 --1.656539E-01 -4.190396E-02 --2.292763E-01 -7.045480E-02 --4.616824E-03 -1.926690E-02 --1.960839E-01 -1.396042E-02 --2.133526E-02 -5.189823E-02 -2.933136E-01 -5.721356E-02 --1.084914E-01 -2.448532E-02 --4.778583E-01 -7.644033E-02 -1.736901E-01 -6.630467E-02 --5.460801E-02 -1.510381E-02 -1.106093E-01 -1.590306E-02 -1.659501E-01 -5.983218E-02 -1.343781E-02 -2.751294E-02 -2.052693E-01 -3.478581E-02 --1.006298E-01 -1.815313E-02 --2.563766E-01 -3.045246E-02 -5.231699E+01 -5.870469E+02 --6.102587E-01 -5.930968E-01 -1.184182E+00 -1.364433E+00 --6.362263E-02 -8.852514E-01 --4.844978E-01 -1.751923E-01 -8.223413E-01 -2.436206E-01 --9.656506E-01 -3.513566E-01 -2.710494E-01 -7.170772E-01 -4.792482E-01 -2.551569E-01 --1.266077E-01 -2.824778E-01 -6.389964E-01 -2.501483E-01 -8.915816E-01 -3.557431E-01 --1.007448E+00 -5.743018E-01 -3.528444E-01 -2.428078E-01 --5.833000E-01 -3.733648E-01 --4.660289E-01 -6.567263E-02 -5.856088E-01 -2.336146E-01 -3.836351E-02 -7.665403E-02 --6.721211E-01 -2.651780E-01 -5.725993E-01 -2.101026E-01 --2.130594E-01 -1.855350E-02 -2.607168E-01 -1.564288E-01 --3.399382E-02 -3.067656E-02 --1.228976E+00 -6.554836E-01 --2.962235E-01 -1.808511E-01 -5.521675E-01 -1.722073E-01 --1.658751E-01 -1.994119E-02 --2.671896E-01 -1.343320E-01 --2.325282E-01 -4.677656E-02 --3.380310E-01 -1.703532E-01 --3.571853E-01 -1.140525E-01 -3.836770E-02 -8.586429E-02 -7.328263E-01 -1.567227E-01 -4.840110E-02 -2.718471E-02 -5.654783E-01 -3.645579E-01 --3.027585E-01 -1.407867E-01 -3.259142E+01 -2.336719E+02 -3.053294E-01 -2.086257E-01 --7.563597E-01 -2.816768E-01 --3.039288E-01 -2.855043E-01 --2.648323E-01 -1.883784E-01 -2.665933E-01 -1.782353E-01 -1.978960E-01 -1.419567E-01 -1.228712E-01 -1.913946E-01 --9.152681E-03 -1.324681E-01 --5.707326E-01 -1.092067E-01 -2.326858E-01 -6.731743E-02 --5.170241E-01 -1.353439E-01 --4.064026E-01 -9.715030E-02 --1.142031E-01 -7.748788E-02 -2.928039E-01 -2.716157E-01 --1.721186E-01 -1.447738E-01 -6.452116E-01 -1.821975E-01 --5.697276E-01 -1.047333E-01 --9.640967E-02 -1.139327E-01 --4.509832E-01 -2.079493E-01 --2.134684E-02 -2.907667E-01 --2.434868E-01 -1.235397E-01 -2.550330E-01 -2.979627E-01 -9.598615E-01 -3.140885E-01 -1.218430E-01 -6.283872E-02 -2.412915E-01 -1.907292E-02 --2.236667E-01 -4.379414E-02 -2.844474E-01 -2.965692E-02 -1.618860E-01 -8.293785E-03 --1.265583E-01 -4.515449E-02 -6.356127E-02 -1.358134E-02 --3.844886E-01 -8.600010E-02 --1.942739E-01 -7.516022E-02 -1.765511E-01 -3.522611E-02 --3.433188E-01 -3.456066E-02 --1.501983E-01 -5.633844E-02 -1.040924E+01 -2.432332E+01 --4.138270E-01 -1.309129E-01 --3.151106E-01 -1.286964E-01 -9.213222E-02 -6.189454E-02 --2.746107E-01 -8.103949E-02 --9.781742E-02 -3.783736E-02 --1.178371E-01 -3.242332E-02 --5.837932E-01 -2.059491E-01 --7.338223E-03 -8.012203E-02 -5.628994E-02 -2.190669E-02 -8.155585E-02 -1.039007E-01 -6.052048E-02 -4.339463E-02 --1.157646E-02 -1.839000E-02 --2.641673E-01 -4.737589E-02 --8.531135E-02 -5.432766E-02 -6.036555E-01 -1.190329E-01 --3.149976E-01 -5.735264E-02 --8.456340E-02 -4.563143E-03 -2.224065E-01 -6.600030E-02 -9.562392E-03 -1.843524E-02 --2.400599E-01 -3.182217E-02 --6.534941E-01 -1.180315E-01 -4.371157E-01 -9.076666E-02 -3.257455E-02 -2.936184E-02 --8.788428E-02 -1.923293E-02 --2.604776E-01 -3.660313E-02 --6.315350E-02 -1.503534E-02 -5.609294E-01 -8.783528E-02 --7.363672E-01 -1.789210E-01 -2.883575E-01 -6.478578E-02 --3.302954E-02 -1.517946E-02 --3.234157E-01 -4.418920E-02 -2.846318E-01 -2.712085E-02 --3.227536E-01 -5.062832E-02 -4.391474E-01 -5.548002E-02 -1.322988E-01 -2.995854E-02 -5.709679E+01 -6.978668E+02 -2.859201E-02 -1.094507E+00 -6.058587E-01 -6.079927E-01 -7.553798E-02 -1.131607E+00 --5.851206E-01 -1.215663E+00 -8.266012E-02 -9.031287E-01 --7.088368E-01 -3.984608E-01 --4.414986E-01 -1.502417E-01 -2.241998E-01 -3.228823E-01 --7.328574E-01 -2.430448E-01 --8.070160E-01 -1.767265E-01 --1.154449E-01 -8.739303E-03 --3.787161E-01 -4.728756E-01 --1.743577E-01 -1.091245E-01 -2.878137E-01 -2.724285E-01 -2.128994E-01 -4.440539E-01 -9.495567E-01 -3.622719E-01 -1.422950E-01 -5.309223E-02 -1.323659E-01 -1.911979E-01 --1.303752E-01 -5.710728E-01 --4.611294E-02 -4.086632E-02 -5.937879E-01 -1.006156E-01 --3.558925E-01 -2.998983E-01 -1.175971E+00 -5.323321E-01 -2.426485E-01 -1.497265E-01 -7.805090E-02 -5.060214E-02 --2.914577E-01 -2.233355E-01 -1.053098E-01 -6.693123E-02 -4.541315E-01 -1.328340E-01 --6.290732E-02 -8.910616E-02 -7.371592E-01 -1.980732E-01 -5.804701E-01 -1.711949E-01 --6.642202E-01 -1.131866E-01 -1.779818E-01 -6.530190E-02 --5.224739E-01 -2.534102E-01 --1.824905E-01 -2.910309E-02 +3.862543E+01 +2.993190E+02 +-5.083613E-01 +2.933365E-01 +-4.356793E-01 +6.676831E-01 +-6.093148E-01 +5.685331E-01 +2.512276E-01 +1.308652E-01 +-1.075955E+00 +4.775270E-01 +3.660307E-01 +1.627691E-01 +5.402149E-01 +2.324946E-01 +-3.887573E-01 +1.028105E-01 +4.324152E-01 +1.015147E-01 +3.306993E-02 +8.425069E-02 +2.127456E-01 +5.435453E-02 +2.977294E-01 +1.088039E-01 +-1.055079E+00 +3.590635E-01 +-6.740592E-01 +2.606281E-01 +3.329512E-01 +1.587428E-01 +-1.248691E-01 +1.659045E-01 +2.306000E-01 +1.062057E-01 +9.127791E-02 +2.649459E-01 +2.629881E-01 +4.786229E-02 +2.286813E-01 +2.363629E-02 +6.338613E-01 +1.118828E-01 +7.466647E-01 +1.424535E-01 +7.955161E-02 +1.003327E-02 +1.082691E-01 +2.727882E-02 +-5.295185E-01 +1.335133E-01 +-6.321517E-01 +1.422916E-01 +1.236137E-01 +2.041422E-01 +-5.389265E-02 +1.852888E-01 +3.746082E-01 +5.580885E-02 +1.383528E-01 +2.754456E-01 +5.081204E-01 +1.886515E-01 +-4.022264E-01 +1.417397E-01 +-3.377771E-01 +6.673888E-02 +1.170109E-01 +1.783182E-02 +-2.097916E-01 +7.139323E-02 +1.438678E+01 +4.193571E+01 +-6.547124E-01 +1.780450E-01 +2.207489E-01 +2.115835E-01 +4.952323E-02 +3.039341E-01 +6.681546E-01 +1.389250E-01 +-4.078026E-02 +4.393667E-02 +-8.695509E-01 +2.850853E-01 +-1.792062E-01 +7.367253E-02 +-5.657500E-01 +2.115125E-01 +-8.525189E-02 +2.541971E-02 +5.227867E-02 +2.008468E-02 +6.825349E-02 +5.316522E-02 +3.763076E-01 +7.112554E-02 +-1.279973E-02 +1.883096E-01 +7.775189E-02 +6.874374E-02 +1.119537E-01 +8.467755E-02 +-1.600632E-01 +8.650448E-02 +6.210095E-01 +1.094309E-01 +-9.997484E-02 +3.935353E-02 +-2.300525E-01 +2.351925E-02 +2.486103E-02 +3.125565E-02 +1.289518E-02 +2.879251E-02 +-3.166559E-01 +2.931428E-02 +-1.379285E-02 +2.416257E-02 +1.220552E-02 +5.154030E-02 +-1.431676E-01 +3.434080E-02 +8.148581E-02 +4.218412E-02 +8.541678E-03 +6.396306E-02 +-7.851012E-03 +5.799658E-02 +2.435723E-01 +6.744263E-02 +-2.429877E-01 +6.966516E-02 +-1.638644E-01 +2.058798E-02 +-8.986584E-03 +1.374824E-02 +3.547454E-01 +7.765460E-02 +-1.570173E-01 +6.916960E-02 +-1.056941E-02 +7.626528E-03 +6.400634E+01 +8.298077E+02 +-3.894111E-01 +8.617494E-01 +1.796567E-01 +1.065356E+00 +-1.561037E+00 +7.701475E-01 +-2.237530E-01 +2.259442E-01 +1.109999E+00 +6.179412E-01 +1.636912E+00 +7.887441E-01 +4.661183E-01 +4.191138E-01 +-1.040546E+00 +2.971961E-01 +1.044850E-01 +1.493530E-01 +-4.991935E-01 +3.222404E-01 +-4.205099E-01 +2.734911E-01 +-7.583139E-01 +3.000853E-01 +-3.750811E-01 +1.348273E-01 +-6.355508E-01 +3.666139E-01 +5.233787E-01 +1.292414E-01 +-2.869538E-02 +9.115092E-02 +6.851052E-01 +3.061040E-01 +1.703522E-01 +7.300335E-02 +4.541075E-01 +4.438507E-01 +-2.674857E-01 +4.718588E-01 +3.022517E-02 +1.136781E-01 +5.755596E-01 +2.688162E-01 +2.698373E-01 +1.403188E-01 +8.772347E-01 +3.503562E-01 +-4.258508E-01 +1.400825E-01 +-1.384853E-01 +4.924947E-02 +-1.009402E-01 +2.039230E-01 +-1.339732E-01 +4.772083E-02 +-3.249636E-01 +4.339747E-01 +1.564400E-01 +2.703717E-01 +2.536360E-01 +8.543919E-02 +-3.622063E-01 +7.442240E-02 +-2.074953E-02 +1.355614E-01 +-3.909820E-02 +1.007999E-01 +3.162815E-01 +9.656425E-02 +2.426423E+01 +1.215124E+02 +-9.628829E-01 +3.563586E-01 +2.964625E-01 +9.739638E-02 +-3.680881E-01 +3.484018E-01 +4.339143E-01 +7.590564E-02 +4.633394E-02 +1.080030E-01 +3.091634E-01 +1.246585E-01 +4.520500E-02 +1.095704E-01 +2.479383E-01 +1.138276E-01 +6.457108E-02 +6.833667E-02 +-5.623363E-02 +1.087254E-01 +3.675294E-01 +9.602246E-02 +-1.459951E-01 +9.440544E-02 +-6.817672E-02 +4.978066E-02 +1.076782E-02 +1.697440E-01 +-1.024501E-02 +1.184830E-01 +-1.654178E-01 +1.689209E-02 +-1.006214E-01 +3.392546E-02 +5.070063E-01 +7.598100E-02 +2.251704E-01 +7.867348E-02 +-1.693789E-01 +2.069974E-01 +-2.790249E-01 +2.674643E-02 +3.888604E-01 +3.649330E-02 +7.614452E-02 +7.098023E-02 +1.236282E-02 +5.476895E-02 +-3.151637E-01 +3.543466E-02 +-6.363562E-01 +9.323507E-02 +2.808153E-01 +8.537981E-02 +2.197639E-01 +3.393653E-02 +8.660625E-02 +1.575544E-02 +3.733826E-02 +1.449783E-02 +8.800903E-04 +3.993931E-02 +3.304886E-01 +3.099095E-02 +-4.149186E-02 +5.375091E-02 +2.448819E-01 +9.225028E-02 +-1.230091E-01 +3.865008E-02 +7.600812E+00 +1.199814E+01 +-8.738539E-01 +3.078183E-01 +-2.592305E-01 +1.015952E-01 +-6.391696E-02 +6.657129E-02 +-2.857855E-01 +2.216294E-02 +-3.516811E-01 +3.429194E-02 +4.585144E-02 +6.204056E-02 +-1.599494E-01 +1.684846E-02 +-2.364219E-01 +1.550644E-02 +1.197289E-01 +8.631394E-02 +-1.364517E-01 +5.086560E-02 +-2.213374E-01 +2.779096E-02 +-7.328761E-02 +1.216230E-02 +2.476803E-01 +2.724500E-02 +-6.356296E-02 +2.513244E-02 +-3.886281E-01 +9.479377E-02 +1.006972E-01 +1.352120E-02 +6.932242E-02 +3.192705E-02 +-3.232505E-02 +5.592418E-02 +9.582599E-02 +1.504811E-02 +-2.887999E-01 +3.760482E-02 +-2.372013E-01 +1.868786E-02 +-1.655526E-01 +4.720116E-02 +8.611265E-02 +2.284310E-02 +-2.142116E-01 +2.619080E-02 +-1.811202E-01 +1.457105E-02 +1.430164E-01 +2.016598E-02 +-4.066031E-01 +7.671356E-02 +1.364946E-01 +1.385677E-02 +8.357667E-02 +1.521943E-02 +-2.235270E-02 +1.029570E-02 +-7.920760E-02 +4.227880E-02 +2.622096E-01 +2.327728E-02 +-7.787296E-03 +2.288300E-02 +-1.645219E-02 +5.394704E-02 +7.274557E-02 +1.075570E-02 +4.104875E+01 +3.455300E+02 +-9.827893E-01 +2.751051E-01 +3.227606E-01 +1.213711E-01 +-1.272840E-02 +2.813639E-01 +-1.910394E-01 +5.682320E-02 +4.136260E-01 +2.444497E-01 +-5.123352E-02 +3.867174E-01 +4.424857E-02 +9.651204E-02 +-3.975443E-02 +1.867060E-01 +7.618837E-01 +1.756891E-01 +4.259599E-01 +1.146646E-01 +5.658031E-02 +1.366891E-01 +2.464931E-01 +2.181122E-01 +-1.593998E-01 +2.666678E-01 +-1.928096E-01 +1.216164E-01 +-7.020992E-01 +1.701086E-01 +3.914244E-01 +1.772217E-01 +3.285697E-01 +1.521826E-01 +-2.947923E-02 +8.201284E-02 +-1.346653E-01 +4.498340E-02 +2.112724E-01 +9.923303E-02 +-8.551910E-02 +8.804286E-03 +-3.631005E-01 +1.168145E-01 +-1.840770E-01 +5.714283E-02 +-2.709303E-02 +9.381338E-02 +-2.104005E-02 +4.479215E-02 +4.059493E-01 +8.277066E-02 +2.877400E-01 +8.584721E-02 +4.881128E-02 +1.864179E-01 +8.584545E-02 +4.421744E-02 +-4.392466E-01 +6.260373E-02 +-3.143214E-02 +8.184856E-02 +-5.630973E-01 +1.323469E-01 +-8.010498E-02 +1.096975E-01 +1.818829E-01 +1.717701E-02 +-1.062149E-01 +5.400365E-02 diff --git a/tests/test_score_flux_yn/settings.xml b/tests/test_score_flux_yn/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_score_flux_yn/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_flux_yn/tallies.xml b/tests/test_score_flux_yn/tallies.xml deleted file mode 100644 index e9f08bd4e..000000000 --- a/tests/test_score_flux_yn/tallies.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - flux - - - - - flux-y5 - - - - - flux-y5 - analog - - - - - flux-y5 - collision - - - diff --git a/tests/test_score_flux_yn/test_score_flux_yn.py b/tests/test_score_flux_yn/test_score_flux_yn.py index 1777db993..254069226 100755 --- a/tests/test_score_flux_yn/test_score_flux_yn.py +++ b/tests/test_score_flux_yn/test_score_flux_yn.py @@ -1,10 +1,33 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreFluxYnTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23, 27, 28, 29)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 5)] + [t.add_filter(filt) for t in tallies] + tallies[0].add_score('flux') + [t.add_score('flux-y5') for t in tallies[1:]] + tallies[1].estimator = 'tracklength' + tallies[2].estimator = 'analog' + tallies[3].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + super(ScoreFluxYnTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreFluxYnTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreFluxYnTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_kappafission/geometry.xml b/tests/test_score_kappafission/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_kappafission/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_kappafission/inputs_true.dat b/tests/test_score_kappafission/inputs_true.dat new file mode 100644 index 000000000..ecb42ddb4 --- /dev/null +++ b/tests/test_score_kappafission/inputs_true.dat @@ -0,0 +1 @@ +57e4aa7550789aec0fcbc4a8917e9d28b1f1ae098a09cde95b757fd87d0dd3924c1bb9d4b23c59cd3793446fb6bbc8af4e1bb46323d70d5e5acd13db1167f545 \ No newline at end of file diff --git a/tests/test_score_kappafission/materials.xml b/tests/test_score_kappafission/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_kappafission/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_kappafission/results_true.dat b/tests/test_score_kappafission/results_true.dat index e992b4b68..75d37cd87 100644 --- a/tests/test_score_kappafission/results_true.dat +++ b/tests/test_score_kappafission/results_true.dat @@ -1,29 +1,29 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -1.848110E+02 -7.563211E+03 +2.266048E+02 +1.049833E+04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.035912E+02 -8.999693E+03 +1.366139E+02 +3.859561E+03 tally 2: -1.765331E+02 -6.974050E+03 +2.402814E+02 +1.174003E+04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.938441E+02 -7.888708E+03 +1.270420E+02 +3.297537E+03 tally 3: -1.770125E+02 -6.702714E+03 +2.217075E+02 +1.003168E+04 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -1.942246E+02 -8.416720E+03 +1.375693E+02 +3.872389E+03 diff --git a/tests/test_score_kappafission/settings.xml b/tests/test_score_kappafission/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_score_kappafission/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_kappafission/tallies.xml b/tests/test_score_kappafission/tallies.xml deleted file mode 100644 index 8fe5d5c84..000000000 --- a/tests/test_score_kappafission/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - kappa-fission - - - - - kappa-fission - analog - - - - - kappa-fission - collision - - - diff --git a/tests/test_score_kappafission/test_score_kappafission.py b/tests/test_score_kappafission/test_score_kappafission.py index 1777db993..2e93b51c4 100644 --- a/tests/test_score_kappafission/test_score_kappafission.py +++ b/tests/test_score_kappafission/test_score_kappafission.py @@ -1,10 +1,32 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreKappaFissionTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23, 27)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('kappa-fission') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + super(ScoreKappaFissionTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreKappaFissionTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreKappaFissionTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_nufission/geometry.xml b/tests/test_score_nufission/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_nufission/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_nufission/inputs_true.dat b/tests/test_score_nufission/inputs_true.dat new file mode 100644 index 000000000..52f7765fa --- /dev/null +++ b/tests/test_score_nufission/inputs_true.dat @@ -0,0 +1 @@ +a42b2e165f59d3f499865d5db1e7db9b4cb25e48290f94080e569a9efc0b437d75cbb5773ac564f6cc95b19521fb7bc97a3eb641b491828c90cd086dc0c06a4b \ No newline at end of file diff --git a/tests/test_score_nufission/materials.xml b/tests/test_score_nufission/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_nufission/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_nufission/results_true.dat b/tests/test_score_nufission/results_true.dat index 33c4ff9fb..31c6abe9d 100644 --- a/tests/test_score_nufission/results_true.dat +++ b/tests/test_score_nufission/results_true.dat @@ -1,29 +1,29 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -2.486342E+00 -1.368793E+00 +3.041781E+00 +1.891714E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.733038E+00 -1.616903E+00 +1.835166E+00 +6.963265E-01 tally 2: -2.296157E+00 -1.167084E+00 +3.341227E+00 +2.322075E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.679940E+00 -1.498454E+00 +1.862652E+00 +7.112121E-01 tally 3: -2.381373E+00 -1.213497E+00 +2.975121E+00 +1.806644E+00 0.000000E+00 0.000000E+00 0.000000E+00 0.000000E+00 -2.607077E+00 -1.513932E+00 +1.846861E+00 +6.985413E-01 diff --git a/tests/test_score_nufission/settings.xml b/tests/test_score_nufission/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_score_nufission/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_nufission/tallies.xml b/tests/test_score_nufission/tallies.xml deleted file mode 100644 index 2812a00b5..000000000 --- a/tests/test_score_nufission/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - nu-fission - - - - - nu-fission - analog - - - - - nu-fission - collision - - - diff --git a/tests/test_score_nufission/test_score_nufission.py b/tests/test_score_nufission/test_score_nufission.py index 1777db993..3d540daac 100644 --- a/tests/test_score_nufission/test_score_nufission.py +++ b/tests/test_score_nufission/test_score_nufission.py @@ -1,10 +1,32 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreNuFissionTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23, 27)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('nu-fission') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + super(ScoreNuFissionTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreNuFissionTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreNuFissionTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_nuscatter/geometry.xml b/tests/test_score_nuscatter/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_nuscatter/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_nuscatter/inputs_true.dat b/tests/test_score_nuscatter/inputs_true.dat new file mode 100644 index 000000000..80840f900 --- /dev/null +++ b/tests/test_score_nuscatter/inputs_true.dat @@ -0,0 +1 @@ +764d3ba6b1bc86b462d44151242bd18fa5f0200b831bb7537cf881b728622799eb95a457f88a503487bfd30095c1fa995818d50a6bc41dd182009772c010e82b \ No newline at end of file diff --git a/tests/test_score_nuscatter/materials.xml b/tests/test_score_nuscatter/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_nuscatter/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_nuscatter/results_true.dat b/tests/test_score_nuscatter/results_true.dat index 66e0c0a03..8f9fcba89 100644 --- a/tests/test_score_nuscatter/results_true.dat +++ b/tests/test_score_nuscatter/results_true.dat @@ -1,11 +1,11 @@ k-combined: -9.870214E-01 2.095925E-02 +1.034954E+00 1.782721E-02 tally 1: 0.000000E+00 0.000000E+00 -3.353000E+01 -1.133379E+02 -8.150000E+00 -6.793700E+00 -1.098500E+02 -1.221333E+03 +2.514000E+01 +6.511880E+01 +6.370000E+00 +4.230900E+00 +8.547000E+01 +7.481913E+02 diff --git a/tests/test_score_nuscatter/settings.xml b/tests/test_score_nuscatter/settings.xml deleted file mode 100644 index ce632aae3..000000000 --- a/tests/test_score_nuscatter/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 0 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_nuscatter/tallies.xml b/tests/test_score_nuscatter/tallies.xml deleted file mode 100644 index 08f8fa32c..000000000 --- a/tests/test_score_nuscatter/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - nu-scatter - - - \ No newline at end of file diff --git a/tests/test_score_nuscatter/test_score_nuscatter.py b/tests/test_score_nuscatter/test_score_nuscatter.py index 1777db993..6f3318126 100644 --- a/tests/test_score_nuscatter/test_score_nuscatter.py +++ b/tests/test_score_nuscatter/test_score_nuscatter.py @@ -1,10 +1,34 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreNuScatterTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + t = openmc.Tally(tally_id=1) + t.add_filter(filt) + t.add_score('nu-scatter') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(t) + + self._input_set.build_default_materials_and_geometry() + self._input_set.build_default_settings() + + self._input_set.settings.inactive = 0 + + self._input_set.export() + + def _cleanup(self): + super(ScoreNuScatterTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreNuScatterTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_nuscatter_n/geometry.xml b/tests/test_score_nuscatter_n/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_nuscatter_n/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_nuscatter_n/inputs_true.dat b/tests/test_score_nuscatter_n/inputs_true.dat new file mode 100644 index 000000000..c63f891d2 --- /dev/null +++ b/tests/test_score_nuscatter_n/inputs_true.dat @@ -0,0 +1 @@ +17541e365f35ebd25134465a02d9a66e46536c4e3f5769da62137ec94ee7c8fb46ef38b9039aa6430261329a4e1b0ce677174323563e5be2f1368dc0c552e312 \ No newline at end of file diff --git a/tests/test_score_nuscatter_n/materials.xml b/tests/test_score_nuscatter_n/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_nuscatter_n/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_nuscatter_n/results_true.dat b/tests/test_score_nuscatter_n/results_true.dat index 5dbc7f8ab..0c1315807 100644 --- a/tests/test_score_nuscatter_n/results_true.dat +++ b/tests/test_score_nuscatter_n/results_true.dat @@ -1,33 +1,33 @@ k-combined: -9.870214E-01 2.095925E-02 +1.034954E+00 1.782721E-02 tally 1: -3.353000E+01 -1.133379E+02 -3.491100E+00 -1.265776E+00 -1.948509E+00 -4.761101E-01 -9.177045E-01 -1.251750E-01 -5.654249E-01 -5.567043E-02 -8.150000E+00 -6.793700E+00 -1.223263E+00 -1.678053E-01 -7.833173E-01 -8.407682E-02 -1.350170E-01 -7.393546E-03 -2.164837E-01 -1.367122E-02 -1.098500E+02 -1.221333E+03 -5.598624E+01 -3.183267E+02 -2.048716E+01 -4.301097E+01 -1.399456E+00 -4.458904E-01 --2.183180E+00 -6.628474E-01 +2.514000E+01 +6.511880E+01 +2.724740E+00 +8.378120E-01 +1.521255E+00 +2.667071E-01 +7.903706E-01 +1.216244E-01 +5.770120E-01 +5.508594E-02 +6.370000E+00 +4.230900E+00 +8.075261E-01 +9.047897E-02 +5.879624E-01 +4.107777E-02 +2.034636E-01 +8.243025E-03 +-2.744502E-02 +1.515916E-03 +8.547000E+01 +7.481913E+02 +4.446994E+01 +2.016855E+02 +1.664683E+01 +2.837713E+01 +1.373176E+00 +3.329601E-01 +-1.663772E+00 +4.264485E-01 diff --git a/tests/test_score_nuscatter_n/settings.xml b/tests/test_score_nuscatter_n/settings.xml deleted file mode 100644 index ce632aae3..000000000 --- a/tests/test_score_nuscatter_n/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 0 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_nuscatter_n/tallies.xml b/tests/test_score_nuscatter_n/tallies.xml deleted file mode 100644 index 90e28227b..000000000 --- a/tests/test_score_nuscatter_n/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - nu-scatter nu-scatter-1 nu-scatter-2 nu-scatter-3 nu-scatter-4 - - - diff --git a/tests/test_score_nuscatter_n/test_score_nuscatter_n.py b/tests/test_score_nuscatter_n/test_score_nuscatter_n.py index 1777db993..40029bd02 100644 --- a/tests/test_score_nuscatter_n/test_score_nuscatter_n.py +++ b/tests/test_score_nuscatter_n/test_score_nuscatter_n.py @@ -1,10 +1,38 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreNuScatterNTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23)) + t = openmc.Tally(tally_id=1) + t.add_filter(filt) + t.add_score('nu-scatter') + t.add_score('nu-scatter-1') + t.add_score('nu-scatter-2') + t.add_score('nu-scatter-3') + t.add_score('nu-scatter-4') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(t) + + self._input_set.build_default_materials_and_geometry() + self._input_set.build_default_settings() + + self._input_set.settings.inactive = 0 + + self._input_set.export() + + def _cleanup(self): + super(ScoreNuScatterNTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreNuScatterNTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_nuscatter_pn/geometry.xml b/tests/test_score_nuscatter_pn/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_nuscatter_pn/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_nuscatter_pn/inputs_true.dat b/tests/test_score_nuscatter_pn/inputs_true.dat new file mode 100644 index 000000000..ef53ee8f6 --- /dev/null +++ b/tests/test_score_nuscatter_pn/inputs_true.dat @@ -0,0 +1 @@ +8ae1b048b90a049d9ed42336a0a2e8f7a250a14d889cc15e0c2831ed71617a78b92570480a15f936f2dd623c75f55693e38c69041c3cae24aba082409b51bc9f \ No newline at end of file diff --git a/tests/test_score_nuscatter_pn/materials.xml b/tests/test_score_nuscatter_pn/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_nuscatter_pn/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_nuscatter_pn/results_true.dat b/tests/test_score_nuscatter_pn/results_true.dat index 41bc17f8b..603c13e70 100644 --- a/tests/test_score_nuscatter_pn/results_true.dat +++ b/tests/test_score_nuscatter_pn/results_true.dat @@ -1,24 +1,24 @@ k-combined: -9.870214E-01 2.095925E-02 +1.034954E+00 1.782721E-02 tally 1: -3.353000E+01 -1.133379E+02 -3.491100E+00 -1.265776E+00 -1.948509E+00 -4.761101E-01 -9.177045E-01 -1.251750E-01 -5.654249E-01 -5.567043E-02 +2.514000E+01 +6.511880E+01 +2.724740E+00 +8.378120E-01 +1.521255E+00 +2.667071E-01 +7.903706E-01 +1.216244E-01 +5.770120E-01 +5.508594E-02 tally 2: -3.353000E+01 -1.133379E+02 -3.491100E+00 -1.265776E+00 -1.948509E+00 -4.761101E-01 -9.177045E-01 -1.251750E-01 -5.654249E-01 -5.567043E-02 +2.514000E+01 +6.511880E+01 +2.724740E+00 +8.378120E-01 +1.521255E+00 +2.667071E-01 +7.903706E-01 +1.216244E-01 +5.770120E-01 +5.508594E-02 diff --git a/tests/test_score_nuscatter_pn/settings.xml b/tests/test_score_nuscatter_pn/settings.xml deleted file mode 100644 index ce632aae3..000000000 --- a/tests/test_score_nuscatter_pn/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 0 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_nuscatter_pn/tallies.xml b/tests/test_score_nuscatter_pn/tallies.xml deleted file mode 100644 index dfad48dda..000000000 --- a/tests/test_score_nuscatter_pn/tallies.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - nu-scatter-0 nu-scatter-1 nu-scatter-2 nu-scatter-3 nu-scatter-4 - - - - - nu-scatter-p4 - - - diff --git a/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py b/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py index 1777db993..6a69fe054 100644 --- a/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py +++ b/tests/test_score_nuscatter_pn/test_score_nuscatter_pn.py @@ -1,10 +1,42 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreNuScatterPNTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, )) + t1 = openmc.Tally(tally_id=1) + t1.add_filter(filt) + t1.add_score('nu-scatter-0') + t1.add_score('nu-scatter-1') + t1.add_score('nu-scatter-2') + t1.add_score('nu-scatter-3') + t1.add_score('nu-scatter-4') + t2 = openmc.Tally(tally_id=2) + t2.add_filter(filt) + t2.add_score('nu-scatter-p4') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(t1) + self._input_set.tallies.add_tally(t2) + + self._input_set.build_default_materials_and_geometry() + self._input_set.build_default_settings() + + self._input_set.settings.inactive = 0 + + self._input_set.export() + + def _cleanup(self): + super(ScoreNuScatterPNTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreNuScatterPNTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_nuscatter_yn/geometry.xml b/tests/test_score_nuscatter_yn/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_nuscatter_yn/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_nuscatter_yn/inputs_true.dat b/tests/test_score_nuscatter_yn/inputs_true.dat new file mode 100644 index 000000000..632a14403 --- /dev/null +++ b/tests/test_score_nuscatter_yn/inputs_true.dat @@ -0,0 +1 @@ +205e5cac8129797b815f0e79dad6c41a1876157ba69fcffecf67c3603dc36ded5f0168f9961d51fcb7dc7db6d732e7a3e8f82d04947aa0309df56bb8333d4bc9 \ No newline at end of file diff --git a/tests/test_score_nuscatter_yn/materials.xml b/tests/test_score_nuscatter_yn/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_nuscatter_yn/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_nuscatter_yn/results_true.dat b/tests/test_score_nuscatter_yn/results_true.dat index cdf051ee7..2b14a7256 100644 --- a/tests/test_score_nuscatter_yn/results_true.dat +++ b/tests/test_score_nuscatter_yn/results_true.dat @@ -1,38 +1,38 @@ k-combined: -9.870214E-01 2.095925E-02 +1.034954E+00 1.782721E-02 tally 1: -3.353000E+01 -1.133379E+02 +2.514000E+01 +6.511880E+01 tally 2: -3.353000E+01 -1.133379E+02 -4.293226E-01 -6.259462E-02 --2.011041E-02 -5.388144E-02 -3.900136E-01 -5.873137E-02 -6.150213E-02 -9.043796E-03 -5.518583E-02 -1.739087E-02 --2.047987E-01 -1.993679E-02 -6.710345E-02 -1.652573E-02 --3.619254E-02 -1.598186E-02 -3.551558E-02 -9.077346E-03 -1.044669E-01 -2.082961E-03 --3.782063E-02 -1.681459E-02 -1.752386E-01 -1.411429E-02 --3.289649E-02 -9.534958E-03 -5.252770E-02 -7.518445E-03 -2.688056E-02 -3.397824E-03 +2.514000E+01 +6.511880E+01 +2.222467E-01 +2.881247E-02 +3.019176E-01 +3.014833E-02 +-8.459006E-04 +4.773570E-02 +9.596964E-02 +1.009754E-02 +4.314855E-02 +6.207871E-03 +4.607677E-02 +9.205573E-03 +2.345994E-03 +1.243004E-02 +9.577397E-02 +6.605519E-03 +2.821584E-02 +3.834286E-03 +-1.077389E-01 +6.570217E-03 +1.106443E-01 +1.006436E-02 +1.322104E-01 +7.721677E-03 +-1.315548E-02 +5.488918E-04 +-2.792171E-02 +5.816161E-03 +1.994370E-02 +1.169674E-03 diff --git a/tests/test_score_nuscatter_yn/settings.xml b/tests/test_score_nuscatter_yn/settings.xml deleted file mode 100644 index ce632aae3..000000000 --- a/tests/test_score_nuscatter_yn/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 0 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_nuscatter_yn/tallies.xml b/tests/test_score_nuscatter_yn/tallies.xml deleted file mode 100644 index b80b37dc8..000000000 --- a/tests/test_score_nuscatter_yn/tallies.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - nu-scatter-0 - - - - - nu-scatter-y3 - - - diff --git a/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py b/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py index 1777db993..6a6ad5495 100644 --- a/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py +++ b/tests/test_score_nuscatter_yn/test_score_nuscatter_yn.py @@ -1,10 +1,38 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreNuScatterYNTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, )) + t1 = openmc.Tally(tally_id=1) + t1.add_filter(filt) + t1.add_score('nu-scatter-0') + t2 = openmc.Tally(tally_id=2) + t2.add_filter(filt) + t2.add_score('nu-scatter-y3') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(t1) + self._input_set.tallies.add_tally(t2) + + self._input_set.build_default_materials_and_geometry() + self._input_set.build_default_settings() + + self._input_set.settings.inactive = 0 + + self._input_set.export() + + def _cleanup(self): + super(ScoreNuScatterYNTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreNuScatterYNTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_scatter/geometry.xml b/tests/test_score_scatter/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_scatter/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_scatter/inputs_true.dat b/tests/test_score_scatter/inputs_true.dat new file mode 100644 index 000000000..35557cd3c --- /dev/null +++ b/tests/test_score_scatter/inputs_true.dat @@ -0,0 +1 @@ +b5baba05419ce120bd22d935af9cdd6d206ad5dc5cae5991a9d160c70bb029f2d87040fa4e19f7190de64b908ac6a41a8b28db4a4f3883ec16e529b1449e983d \ No newline at end of file diff --git a/tests/test_score_scatter/materials.xml b/tests/test_score_scatter/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_scatter/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_scatter/results_true.dat b/tests/test_score_scatter/results_true.dat index 21d7d83c2..8d3e0fdc0 100644 --- a/tests/test_score_scatter/results_true.dat +++ b/tests/test_score_scatter/results_true.dat @@ -1,29 +1,29 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 -1.223028E+01 -3.185078E+01 -2.900350E+00 -1.814004E+00 -4.059013E+01 -3.609499E+02 +1.514235E+01 +4.620490E+01 +3.839050E+00 +2.975620E+00 +5.317903E+01 +5.754103E+02 tally 2: 0.000000E+00 0.000000E+00 -1.169000E+01 -2.915330E+01 -3.200000E+00 -2.342600E+00 -4.064000E+01 -3.595168E+02 +1.485000E+01 +4.439790E+01 +4.120000E+00 +3.438000E+00 +5.173000E+01 +5.467243E+02 tally 3: 0.000000E+00 0.000000E+00 -1.172929E+01 -2.935812E+01 -3.185726E+00 -2.323517E+00 -4.074319E+01 -3.614902E+02 +1.496769E+01 +4.502714E+01 +4.117144E+00 +3.431861E+00 +5.174677E+01 +5.469474E+02 diff --git a/tests/test_score_scatter/settings.xml b/tests/test_score_scatter/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_score_scatter/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_scatter/tallies.xml b/tests/test_score_scatter/tallies.xml deleted file mode 100644 index b6eb73b50..000000000 --- a/tests/test_score_scatter/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - scatter - - - - - scatter - analog - - - - - scatter - collision - - - diff --git a/tests/test_score_scatter/test_score_scatter.py b/tests/test_score_scatter/test_score_scatter.py index 1777db993..0b2621acd 100644 --- a/tests/test_score_scatter/test_score_scatter.py +++ b/tests/test_score_scatter/test_score_scatter.py @@ -1,10 +1,32 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreScatterTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('scatter') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + super(ScoreScatterTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreScatterTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreScatterTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_scatter_n/geometry.xml b/tests/test_score_scatter_n/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_scatter_n/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_scatter_n/inputs_true.dat b/tests/test_score_scatter_n/inputs_true.dat new file mode 100644 index 000000000..e6e3a395b --- /dev/null +++ b/tests/test_score_scatter_n/inputs_true.dat @@ -0,0 +1 @@ +a153add0502ff0fd4b0670f01679e104be1bb05941e73fb35e426c7f1e41a6144c7eb81fdba0d62ea3f39c7c6798028ff6d5df8c7a50b3e3f9e9bfe72fd48c2f \ No newline at end of file diff --git a/tests/test_score_scatter_n/materials.xml b/tests/test_score_scatter_n/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_scatter_n/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_scatter_n/results_true.dat b/tests/test_score_scatter_n/results_true.dat index b46a1e184..96e56bd6a 100644 --- a/tests/test_score_scatter_n/results_true.dat +++ b/tests/test_score_scatter_n/results_true.dat @@ -1,33 +1,33 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -1.169000E+01 -2.915330E+01 -1.247253E+00 -3.767436E-01 -5.330812E-01 -1.385083E-01 -2.987823E-01 -5.699361E-02 -2.645512E-01 -2.905381E-02 -3.200000E+00 -2.342600E+00 -3.809941E-01 -2.965326E-02 -4.319242E-01 -3.738822E-02 -9.261909E-02 -6.711328E-03 --6.052442E-02 -7.087230E-03 -4.064000E+01 -3.595168E+02 -2.096700E+01 -9.516606E+01 -7.560566E+00 -1.248694E+01 -2.093348E-01 -4.278510E-02 --1.449929E+00 -4.356371E-01 +1.485000E+01 +4.439790E+01 +1.259515E+00 +3.360064E-01 +7.983154E-01 +1.355632E-01 +3.425460E-01 +2.971972E-02 +2.949225E-01 +3.975603E-02 +4.120000E+00 +3.438000E+00 +6.222571E-01 +8.335984E-02 +1.670136E-01 +1.374768E-02 +-5.819374E-02 +1.091808E-02 +-6.389550E-02 +5.688533E-03 +5.173000E+01 +5.467243E+02 +2.669403E+01 +1.451361E+02 +9.691140E+00 +1.933574E+01 +5.860769E-01 +2.122377E-01 +-1.190340E+00 +3.145785E-01 diff --git a/tests/test_score_scatter_n/settings.xml b/tests/test_score_scatter_n/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_score_scatter_n/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_scatter_n/tallies.xml b/tests/test_score_scatter_n/tallies.xml deleted file mode 100644 index 0164dea35..000000000 --- a/tests/test_score_scatter_n/tallies.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - scatter scatter-1 scatter-2 scatter-3 scatter-4 - - - \ No newline at end of file diff --git a/tests/test_score_scatter_n/test_score_scatter_n.py b/tests/test_score_scatter_n/test_score_scatter_n.py index 1777db993..47fd12b2e 100644 --- a/tests/test_score_scatter_n/test_score_scatter_n.py +++ b/tests/test_score_scatter_n/test_score_scatter_n.py @@ -1,10 +1,33 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreScatterNTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, 22, 23)) + t = openmc.Tally(tally_id=1) + t.add_filter(filt) + t.add_score('scatter') + t.add_score('scatter-1') + t.add_score('scatter-2') + t.add_score('scatter-3') + t.add_score('scatter-4') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(t) + + super(ScoreScatterNTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreScatterNTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreScatterNTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_scatter_pn/geometry.xml b/tests/test_score_scatter_pn/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_scatter_pn/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_scatter_pn/inputs_true.dat b/tests/test_score_scatter_pn/inputs_true.dat new file mode 100644 index 000000000..3878939c5 --- /dev/null +++ b/tests/test_score_scatter_pn/inputs_true.dat @@ -0,0 +1 @@ +fe56d58827d1803c1a49391711ad682be4a7cbc51519248812554f66e3e46266edc179f4254291a5f455751d3cdc13a17bbd103b9810c8818f36e4d283b503be \ No newline at end of file diff --git a/tests/test_score_scatter_pn/materials.xml b/tests/test_score_scatter_pn/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_scatter_pn/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_scatter_pn/results_true.dat b/tests/test_score_scatter_pn/results_true.dat index 3c34895d9..753216a8b 100644 --- a/tests/test_score_scatter_pn/results_true.dat +++ b/tests/test_score_scatter_pn/results_true.dat @@ -1,24 +1,24 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -1.169000E+01 -2.915330E+01 -1.247253E+00 -3.767436E-01 -5.330812E-01 -1.385083E-01 -2.987823E-01 -5.699361E-02 -2.645512E-01 -2.905381E-02 +1.485000E+01 +4.439790E+01 +1.259515E+00 +3.360064E-01 +7.983154E-01 +1.355632E-01 +3.425460E-01 +2.971972E-02 +2.949225E-01 +3.975603E-02 tally 2: -1.169000E+01 -2.915330E+01 -1.247253E+00 -3.767436E-01 -5.330812E-01 -1.385083E-01 -2.987823E-01 -5.699361E-02 -2.645512E-01 -2.905381E-02 +1.485000E+01 +4.439790E+01 +1.259515E+00 +3.360064E-01 +7.983154E-01 +1.355632E-01 +3.425460E-01 +2.971972E-02 +2.949225E-01 +3.975603E-02 diff --git a/tests/test_score_scatter_pn/settings.xml b/tests/test_score_scatter_pn/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_score_scatter_pn/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_scatter_pn/tallies.xml b/tests/test_score_scatter_pn/tallies.xml deleted file mode 100644 index 61a7854d6..000000000 --- a/tests/test_score_scatter_pn/tallies.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - scatter-0 scatter-1 scatter-2 scatter-3 scatter-4 - - - - - scatter-p4 - - - \ No newline at end of file diff --git a/tests/test_score_scatter_pn/test_score_scatter_pn.py b/tests/test_score_scatter_pn/test_score_scatter_pn.py index 1777db993..9186fe548 100644 --- a/tests/test_score_scatter_pn/test_score_scatter_pn.py +++ b/tests/test_score_scatter_pn/test_score_scatter_pn.py @@ -1,10 +1,38 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreScatterPNTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, )) + t1 = openmc.Tally(tally_id=1) + t1.add_filter(filt) + t1.add_score('scatter-0') + t1.add_score('scatter-1') + t1.add_score('scatter-2') + t1.add_score('scatter-3') + t1.add_score('scatter-4') + t1.estimator = 'analog' + t2 = openmc.Tally(tally_id=2) + t2.add_filter(filt) + t2.add_score('scatter-p4') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(t1) + self._input_set.tallies.add_tally(t2) + + super(ScoreScatterPNTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreScatterPNTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreScatterPNTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_scatter_yn/geometry.xml b/tests/test_score_scatter_yn/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_scatter_yn/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_scatter_yn/inputs_true.dat b/tests/test_score_scatter_yn/inputs_true.dat new file mode 100644 index 000000000..1ae9f6047 --- /dev/null +++ b/tests/test_score_scatter_yn/inputs_true.dat @@ -0,0 +1 @@ +d80a9e8befab978bc84a231437a2b96c8f6dba81984c9e82a79360feb26bc9875b661131dbaa2deeb66b0aa50a39b2e738303bc40c5c65ee1995cf52f687ae46 \ No newline at end of file diff --git a/tests/test_score_scatter_yn/materials.xml b/tests/test_score_scatter_yn/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_scatter_yn/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_scatter_yn/results_true.dat b/tests/test_score_scatter_yn/results_true.dat index 9df7ea42a..fb6b4749d 100644 --- a/tests/test_score_scatter_yn/results_true.dat +++ b/tests/test_score_scatter_yn/results_true.dat @@ -1,56 +1,56 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: -1.169000E+01 -2.915330E+01 +1.485000E+01 +4.439790E+01 tally 2: -1.169000E+01 -2.915330E+01 --2.198379E-01 -2.828670E-02 --1.317276E-01 -9.568596E-03 -8.309792E-02 -1.155410E-02 --2.288506E-02 -3.710542E-03 --2.720674E-02 -1.789163E-03 --1.323964E-02 -1.819112E-04 -8.941597E-02 -4.265616E-03 -1.516805E-01 -1.332526E-02 --1.832782E-02 -6.611171E-03 -1.311371E-02 -2.840648E-03 -3.728365E-02 -2.866806E-03 --5.100587E-02 -2.957146E-03 -3.388028E-02 -2.481570E-03 --7.766921E-02 -3.129377E-03 -1.666131E-02 -3.828290E-03 -8.102553E-02 -2.118169E-03 -6.303084E-03 -7.156173E-04 --2.083478E-03 -2.683340E-03 -6.794806E-03 -3.912783E-04 -1.005390E-01 -2.920205E-03 --5.332517E-02 -2.205372E-03 --1.584725E-02 -8.984498E-04 -3.486904E-02 -6.448722E-04 --2.420912E-02 -6.352276E-04 +1.485000E+01 +4.439790E+01 +-8.440076E-02 +1.135203E-02 +8.198663E-02 +3.887429E-02 +-1.358080E-01 +2.890416E-02 +-3.544823E-02 +9.843339E-04 +-1.542072E-01 +8.228126E-03 +1.057111E-01 +3.758100E-03 +-1.647870E-02 +4.827841E-03 +1.378297E-01 +1.566876E-02 +4.676778E-02 +4.809366E-03 +1.966204E-02 +7.447981E-04 +1.889258E-02 +6.841953E-04 +1.337703E-02 +1.250077E-03 +-1.044684E-01 +6.969498E-03 +-1.177995E-02 +8.208715E-03 +-1.940058E-04 +5.128759E-03 +-2.165868E-02 +1.335569E-03 +-3.080886E-02 +4.544434E-04 +1.039856E-03 +1.209631E-03 +-1.317068E-02 +1.469722E-03 +-6.432758E-02 +2.106736E-03 +3.323023E-02 +4.513838E-03 +2.683700E-02 +1.146747E-03 +-3.494912E-02 +1.006153E-03 +6.289525E-02 +3.700145E-03 diff --git a/tests/test_score_scatter_yn/settings.xml b/tests/test_score_scatter_yn/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_score_scatter_yn/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_scatter_yn/tallies.xml b/tests/test_score_scatter_yn/tallies.xml deleted file mode 100644 index 3c46c13d4..000000000 --- a/tests/test_score_scatter_yn/tallies.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - scatter-0 - analog - - - - - scatter-y4 - - - diff --git a/tests/test_score_scatter_yn/test_score_scatter_yn.py b/tests/test_score_scatter_yn/test_score_scatter_yn.py index 1777db993..9e6900031 100644 --- a/tests/test_score_scatter_yn/test_score_scatter_yn.py +++ b/tests/test_score_scatter_yn/test_score_scatter_yn.py @@ -1,10 +1,34 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreScatterYNTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(21, )) + t1 = openmc.Tally(tally_id=1) + t1.add_filter(filt) + t1.add_score('scatter-0') + t1.estimator = 'analog' + t2 = openmc.Tally(tally_id=2) + t2.add_filter(filt) + t2.add_score('scatter-y4') + self._input_set.tallies = openmc.TalliesFile() + self._input_set.tallies.add_tally(t1) + self._input_set.tallies.add_tally(t2) + + super(ScoreScatterYNTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreScatterYNTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreScatterYNTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_total/geometry.xml b/tests/test_score_total/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_total/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_total/inputs_true.dat b/tests/test_score_total/inputs_true.dat new file mode 100644 index 000000000..c8b979c72 --- /dev/null +++ b/tests/test_score_total/inputs_true.dat @@ -0,0 +1 @@ +8813917cab656135c4eebfdbe5f0d95e6a9409a2b36df1dfb483bdd193a3c0978727918a58399b259b82a7d51ae3f1801148bd978603fec11f27acdbf89520e2 \ No newline at end of file diff --git a/tests/test_score_total/materials.xml b/tests/test_score_total/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_total/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_total/results_true.dat b/tests/test_score_total/results_true.dat index e782fd9d0..9b8a06f80 100644 --- a/tests/test_score_total/results_true.dat +++ b/tests/test_score_total/results_true.dat @@ -1,29 +1,29 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 -1.423676E+01 -4.330937E+01 -2.914798E+00 -1.831649E+00 -4.088282E+01 -3.662539E+02 +1.767552E+01 +6.295417E+01 +3.863588E+00 +3.013300E+00 +5.356594E+01 +5.839391E+02 tally 2: 0.000000E+00 0.000000E+00 -1.372000E+01 -4.018980E+01 -3.200000E+00 -2.342600E+00 -4.104000E+01 -3.668254E+02 +1.739000E+01 +6.083290E+01 +4.160000E+00 +3.501000E+00 +5.213000E+01 +5.552351E+02 tally 3: 0.000000E+00 0.000000E+00 -1.372000E+01 -4.018980E+01 -3.200000E+00 -2.342600E+00 -4.104000E+01 -3.668254E+02 +1.739000E+01 +6.083290E+01 +4.160000E+00 +3.501000E+00 +5.213000E+01 +5.552351E+02 diff --git a/tests/test_score_total/settings.xml b/tests/test_score_total/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_score_total/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_total/tallies.xml b/tests/test_score_total/tallies.xml deleted file mode 100644 index 02286f96c..000000000 --- a/tests/test_score_total/tallies.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - total - - - - - total - analog - - - - - total - collision - - - diff --git a/tests/test_score_total/test_score_total.py b/tests/test_score_total/test_score_total.py index 1777db993..c6f3f335f 100644 --- a/tests/test_score_total/test_score_total.py +++ b/tests/test_score_total/test_score_total.py @@ -1,10 +1,32 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreTotalTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 4)] + [t.add_filter(filt) for t in tallies] + [t.add_score('total') for t in tallies] + tallies[0].estimator = 'tracklength' + tallies[1].estimator = 'analog' + tallies[2].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + super(ScoreTotalTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreTotalTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreTotalTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_score_total_yn/geometry.xml b/tests/test_score_total_yn/geometry.xml deleted file mode 100644 index b85dd04df..000000000 --- a/tests/test_score_total_yn/geometry.xml +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 1 1 - 1 1 1 1 1 2 1 1 2 1 1 2 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - - - - - - 17 17 - -10.71 -10.71 - 1.26 1.26 - - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 4 3 3 4 3 3 4 3 3 4 3 3 4 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 4 3 3 3 3 3 3 3 3 3 4 3 3 3 - 3 3 3 3 3 4 3 3 4 3 3 4 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 - 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 - 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 5 5 5 5 5 - 5 5 5 5 5 5 5 6 6 6 6 6 6 6 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 - - - - - - 21 21 - -224.91 -224.91 - 21.42 21.42 - - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 - 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 - 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 7 7 7 7 7 - 7 7 7 7 7 7 7 8 8 8 8 8 8 8 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 - - - - diff --git a/tests/test_score_total_yn/inputs_true.dat b/tests/test_score_total_yn/inputs_true.dat new file mode 100644 index 000000000..b2818f856 --- /dev/null +++ b/tests/test_score_total_yn/inputs_true.dat @@ -0,0 +1 @@ +4dbbd9cec921d2420e7567533c833afbe94335073aa760d1fd937adb695191b3ab7c070ec0d32721dddb4a46054e68322cf6a058420e20e439eb1d44f09f4be4 \ No newline at end of file diff --git a/tests/test_score_total_yn/materials.xml b/tests/test_score_total_yn/materials.xml deleted file mode 100644 index 9c0b74f3f..000000000 --- a/tests/test_score_total_yn/materials.xml +++ /dev/null @@ -1,272 +0,0 @@ - - - - 71c - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/test_score_total_yn/results_true.dat b/tests/test_score_total_yn/results_true.dat index 28a4b1627..b416b05ec 100644 --- a/tests/test_score_total_yn/results_true.dat +++ b/tests/test_score_total_yn/results_true.dat @@ -1,14 +1,14 @@ k-combined: -1.005983E+00 2.248579E-02 +9.903196E-01 4.279617E-02 tally 1: 0.000000E+00 0.000000E+00 -1.423676E+01 -4.330937E+01 -2.914798E+00 -1.831649E+00 -4.088282E+01 -3.662539E+02 +1.767552E+01 +6.295417E+01 +3.863588E+00 +3.013300E+00 +5.356594E+01 +5.839391E+02 tally 2: 0.000000E+00 0.000000E+00 @@ -110,106 +110,106 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -7.812543E-01 -1.349265E-01 --7.005988E-03 -2.198486E-04 -3.237937E-02 -7.569491E-04 --3.865436E-04 -4.048167E-04 --1.003877E-02 -3.195619E-04 -3.738815E-03 -3.506174E-04 --2.549288E-02 -3.086810E-04 -1.693002E-02 -1.255885E-04 -3.059341E-03 -1.971678E-04 -9.247344E-03 -2.402855E-04 -6.618469E-04 -1.639025E-04 -1.992953E-02 -1.365376E-04 -3.262256E-03 -1.341040E-05 -2.864166E-03 -4.394787E-05 -1.494351E-03 -1.001007E-04 --1.091424E-02 -1.221030E-04 -9.875992E-03 -1.141979E-04 -1.263647E-02 -2.400023E-04 --2.944398E-03 -1.246417E-04 -1.970051E-03 -1.600160E-04 -6.148931E-03 -4.774182E-05 -1.107728E-02 -1.095420E-04 -1.382599E-02 -1.537793E-04 --1.296297E-02 -1.392028E-04 --1.479385E-02 -1.650074E-04 -1.423676E+01 -4.330937E+01 --2.802155E-01 -3.016146E-02 --8.009314E-02 -4.251899E-02 --7.383773E-02 -1.547362E-02 --1.274422E-01 -2.290306E-02 -1.370426E-01 -1.002935E-02 --2.607280E-01 -3.414307E-02 -1.497421E-02 -2.944540E-03 --2.866477E-02 -9.113662E-03 --3.949118E-02 -4.437767E-03 -2.283116E-01 -1.792907E-02 -1.334103E-01 -1.587762E-02 --3.139096E-01 -2.330713E-02 -1.025884E-03 -5.754195E-03 -1.099489E-01 -1.861634E-02 --7.863729E-02 -2.276108E-02 -1.219111E-01 -1.363203E-02 --1.261893E-01 -1.937908E-02 --1.995428E-01 -1.383344E-02 -8.803472E-02 -3.742219E-03 -1.501143E-01 -1.288322E-02 -4.522115E-02 -8.283014E-03 -1.113588E-01 -8.523967E-03 --1.820582E-01 -1.648932E-02 --1.121108E-01 -1.059879E-02 +9.780506E-01 +1.942072E-01 +-4.170415E-02 +7.581469E-04 +-2.419728E-03 +6.296241E-04 +-8.163997E-03 +4.785197E-04 +3.971909E-03 +1.363304E-04 +1.585497E-02 +1.295251E-04 +-7.029875E-02 +1.208194E-03 +-1.524070E-02 +2.828843E-04 +-2.141105E-02 +2.953327E-04 +-2.147623E-02 +2.390414E-04 +5.592040E-04 +1.720605E-04 +3.022066E-03 +1.843720E-04 +1.489821E-02 +9.193290E-05 +-1.354668E-02 +2.551940E-04 +-5.692690E-04 +3.013453E-04 +2.324582E-02 +2.170615E-04 +1.883012E-02 +1.045949E-04 +-3.997107E-03 +1.674058E-04 +1.616443E-02 +2.046286E-04 +1.625747E-02 +1.851351E-04 +1.120209E-02 +2.028649E-04 +4.240284E-03 +4.019011E-05 +1.535379E-02 +9.872559E-05 +-8.973926E-03 +1.448680E-04 +-3.933227E-03 +4.305328E-04 +1.767552E+01 +6.295417E+01 +-1.458308E-01 +8.239551E-03 +1.976485E-01 +7.360520E-02 +-2.647182E-01 +5.347815E-02 +1.828025E-01 +1.840743E-02 +1.865994E-01 +2.843407E-02 +-6.438995E-02 +8.898045E-03 +-1.416445E-01 +3.839856E-02 +-3.298894E-01 +2.672141E-02 +-1.462639E-01 +1.225250E-02 +-6.410138E-02 +3.766615E-02 +4.701705E-02 +1.968428E-03 +2.953056E-02 +2.358647E-02 +-1.717672E-01 +5.877351E-02 +1.927497E-02 +1.358953E-02 +1.708870E-01 +1.502033E-02 +4.453803E-02 +1.622532E-02 +-2.076143E-02 +1.850686E-03 +1.111325E-01 +8.415150E-03 +1.249594E-01 +7.491280E-03 +1.381757E-02 +1.537264E-02 +-7.286234E-03 +9.057874E-03 +3.162973E-01 +3.303388E-02 +1.012773E-01 +8.345375E-03 +-5.238963E-02 +3.920421E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -260,56 +260,56 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -2.914798E+00 -1.831649E+00 --3.213884E-02 -1.391026E-03 --1.124311E-02 -2.059984E-03 --1.372399E-02 -2.990198E-03 --6.931800E-03 -1.073303E-03 --5.448993E-03 -3.542504E-04 --7.264172E-02 -1.742045E-03 -1.526380E-02 -5.962297E-04 -1.576474E-02 -5.335071E-04 -2.028206E-02 -2.915489E-04 -4.014298E-02 -4.285950E-04 -8.228146E-03 -6.388002E-04 --8.183952E-02 -2.031634E-03 -1.014523E-02 -1.159653E-03 -9.321030E-03 -7.480844E-04 --3.156017E-02 -2.064357E-03 -3.606483E-02 -4.060244E-04 --3.866234E-02 -1.046100E-03 --5.723297E-02 -1.042437E-03 -2.894838E-02 -2.922848E-04 --1.529225E-03 -2.472179E-04 -9.484410E-03 -4.172637E-04 --4.442548E-04 -2.518508E-04 --3.065480E-02 -3.571846E-04 --6.519117E-03 -1.779322E-04 +3.863588E+00 +3.013300E+00 +5.075749E-02 +1.018210E-03 +3.445344E-02 +5.778215E-03 +-6.239642E-02 +4.107408E-03 +-1.475495E-02 +7.971898E-04 +5.809323E-02 +3.039895E-03 +-2.510339E-02 +3.529134E-04 +-9.731680E-03 +1.221628E-03 +-5.815144E-02 +1.403261E-03 +-4.936694E-02 +6.481626E-04 +5.141985E-03 +1.343973E-03 +1.515105E-02 +3.044735E-04 +4.474521E-03 +1.155268E-03 +-6.855877E-02 +4.048417E-03 +-2.701967E-05 +1.279041E-03 +2.197636E-02 +2.843662E-04 +-1.780381E-02 +8.441574E-04 +2.916634E-02 +2.530602E-03 +2.289834E-02 +2.201375E-03 +3.283424E-02 +7.615219E-04 +9.623726E-03 +7.614092E-04 +2.808239E-02 +1.500381E-03 +4.835419E-02 +6.933678E-04 +-2.636221E-02 +2.230834E-04 +-4.957463E-02 +1.939266E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -360,56 +360,56 @@ tally 2: 0.000000E+00 0.000000E+00 0.000000E+00 -4.088282E+01 -3.662539E+02 --9.859591E-01 -2.743013E-01 -2.392244E-01 -3.795971E-01 --3.389717E-01 -7.054539E-01 --1.673679E-01 -1.081377E-01 -2.918680E-01 -7.161035E-02 --5.627453E-01 -9.124299E-02 -7.185542E-01 -2.062140E-01 -8.533956E-02 -3.649126E-02 -7.630639E-02 -1.623523E-02 -3.785290E-02 -4.181389E-02 -1.388919E-01 -1.307834E-01 --2.682812E-01 -6.653584E-02 -7.151084E-02 -3.466772E-02 -6.941393E-02 -2.821800E-02 -2.392050E-02 -1.132504E-01 -3.749985E-01 -8.337209E-02 --2.998887E-01 -6.767226E-02 --3.629285E-01 -7.246083E-02 -3.989685E-01 -4.378581E-02 -1.330115E-01 -2.634398E-02 -2.649739E-01 -4.300042E-02 -5.793351E-01 -7.399884E-02 --2.236528E-01 -3.130205E-02 --3.695818E-01 -4.703480E-02 +5.356594E+01 +5.839391E+02 +-1.198882E+00 +3.391100E-01 +3.952398E-01 +5.729760E-01 +-1.045726E+00 +4.419194E-01 +2.683170E-01 +1.872580E-01 +5.059349E-01 +2.592209E-01 +4.561651E-01 +1.253696E-01 +-4.273775E-01 +3.509266E-01 +-6.300496E-01 +2.102051E-01 +-3.094705E-01 +1.410278E-01 +-6.840225E-01 +1.971765E-01 +4.123355E-02 +3.962538E-02 +-1.554557E-01 +2.784362E-02 +-4.698631E-01 +1.867413E-01 +-7.016026E-02 +3.059344E-02 +2.922284E-01 +8.680517E-02 +-1.252431E-01 +3.180591E-02 +1.825937E-01 +8.626653E-02 +1.637960E-01 +1.329538E-01 +6.662867E-01 +1.497985E-01 +4.662585E-01 +7.552145E-02 +1.198254E-03 +2.020899E-01 +5.281410E-01 +9.615758E-02 +6.396211E-02 +1.806992E-01 +-1.898620E-01 +1.113751E-01 tally 3: 0.000000E+00 0.000000E+00 @@ -511,106 +511,106 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -7.200000E-01 -1.152000E-01 --9.800486E-03 -5.637123E-04 --2.018554E-02 -4.617738E-04 --6.271657E-03 -8.252833E-04 --8.231683E-03 -3.035447E-03 --2.566508E-02 -1.108829E-03 -2.748466E-03 -1.641191E-03 -6.833190E-03 -5.993876E-04 -3.392213E-02 -2.143714E-03 -3.105616E-02 -1.012625E-03 --5.473567E-02 -1.615531E-03 --1.435523E-02 -1.095690E-03 -4.579564E-03 -6.451444E-04 --1.570409E-02 -3.833387E-04 -1.633422E-02 -2.144997E-03 --7.438775E-03 -6.441846E-04 -5.440025E-04 -1.290719E-04 --1.687899E-02 -1.606230E-03 -3.315902E-02 -1.061759E-03 --1.184684E-02 -4.312573E-04 --4.732586E-02 -1.387994E-03 --1.563538E-02 -3.316015E-04 -3.681927E-02 -5.403320E-04 -2.928507E-03 -5.761742E-04 --3.519362E-02 -6.725185E-04 -1.372000E+01 -4.018980E+01 --2.015212E-01 -1.072884E-01 --2.606953E-01 -4.894468E-02 -7.537153E-02 -2.216346E-02 --3.818524E-02 -6.301675E-02 -2.386335E-01 -1.931104E-02 --1.872805E-02 -1.265896E-02 -3.732943E-02 -2.347696E-02 --8.857050E-02 -1.636275E-02 --1.718450E-01 -1.043488E-02 -1.526226E-01 -2.435399E-02 -7.344765E-02 -1.541644E-02 --9.819186E-03 -1.473467E-02 --8.215914E-03 -1.463085E-02 -2.197504E-01 -2.244815E-02 -2.521002E-02 -8.206540E-03 -3.677974E-01 -3.982027E-02 --1.934606E-01 -3.440019E-02 -1.050141E-01 -2.346980E-02 -2.458487E-01 -1.861429E-02 -4.226131E-02 -2.690841E-03 -3.174234E-02 -1.867018E-02 -2.284995E-01 -1.190246E-02 --7.894573E-03 -3.715471E-03 --1.593928E-01 -1.391828E-02 +9.300000E-01 +1.839000E-01 +4.056201E-03 +8.670884E-04 +-2.262959E-02 +2.263780E-03 +-4.568371E-02 +4.078305E-03 +6.023055E-02 +1.099458E-03 +-2.468374E-02 +3.403931E-03 +-8.676202E-02 +2.444658E-03 +2.075016E-02 +5.432442E-03 +1.101095E-02 +3.129947E-04 +8.689134E-03 +2.422445E-03 +-1.097503E-02 +4.670673E-04 +4.979355E-02 +1.791811E-03 +1.769845E-02 +6.074665E-04 +-1.473469E-02 +1.257671E-03 +-1.133757E-02 +1.555143E-03 +1.730195E-02 +1.841949E-03 +-1.191492E-02 +1.859105E-03 +9.038577E-03 +4.401577E-04 +1.770047E-02 +4.158291E-04 +1.492809E-02 +5.488168E-04 +7.970152E-02 +1.597910E-03 +3.741348E-02 +5.704935E-04 +2.078478E-02 +5.379832E-04 +-1.355930E-02 +6.747758E-04 +3.416200E-02 +8.262470E-04 +1.739000E+01 +6.083290E+01 +-2.434171E-01 +3.049063E-02 +-1.278707E-01 +9.585267E-02 +-2.597328E-01 +8.692607E-02 +2.496700E-01 +3.750933E-02 +-1.309937E-01 +4.217907E-02 +-1.863241E-01 +1.738581E-02 +1.292679E-01 +1.799004E-02 +-3.543191E-01 +3.682107E-02 +1.904413E-01 +1.455250E-02 +-7.093238E-02 +1.473997E-02 +1.920412E-01 +1.308864E-02 +1.566093E-01 +1.913492E-02 +-2.499642E-01 +3.036874E-02 +-2.323022E-01 +3.794368E-02 +6.361729E-02 +3.266166E-02 +4.688479E-02 +2.806712E-02 +9.796563E-02 +1.419748E-02 +1.000847E-02 +3.233262E-02 +7.570231E-02 +4.626536E-03 +1.489091E-01 +1.159345E-02 +2.236285E-01 +1.480084E-02 +2.461305E-01 +1.643844E-02 +1.773523E-02 +1.626036E-03 +6.570774E-02 +1.069893E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -661,56 +661,56 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -3.200000E+00 -2.342600E+00 --2.991985E-01 -1.868406E-02 -4.460301E-02 -4.132113E-03 --2.190630E-02 -1.023889E-02 --3.265764E-02 -2.060374E-03 -3.491521E-02 -4.785957E-04 --3.623623E-02 -5.929111E-04 --4.962268E-02 -1.814245E-03 -1.406439E-01 -1.174445E-02 --9.433277E-02 -5.036897E-03 -9.058176E-02 -3.871598E-03 --1.409089E-01 -6.665385E-03 --1.062337E-01 -4.771650E-03 -1.155280E-01 -8.020320E-03 -8.348336E-02 -1.633941E-03 -1.475434E-02 -3.411046E-03 -4.474425E-03 -6.049348E-03 -6.716359E-03 -2.898000E-03 --3.674047E-02 -2.971797E-03 --2.368070E-02 -9.474965E-04 --6.109826E-02 -4.846201E-03 --5.076118E-02 -8.354393E-03 --1.763594E-02 -1.017310E-03 --2.941064E-02 -1.044916E-03 --5.631429E-03 -3.915186E-03 +4.160000E+00 +3.501000E+00 +-9.464171E-02 +8.682833E-03 +8.467800E-02 +1.402624E-02 +1.283471E-02 +2.630439E-02 +1.859869E-01 +1.189528E-02 +1.910311E-02 +2.907370E-03 +-2.542253E-01 +2.143851E-02 +-4.021473E-02 +5.812599E-03 +-1.242140E-01 +1.017873E-02 +-2.934198E-02 +2.409920E-03 +5.719767E-02 +2.211520E-03 +3.023903E-02 +2.870625E-03 +1.092479E-01 +6.089989E-03 +1.604743E-02 +1.110224E-02 +3.811062E-03 +5.234112E-03 +5.446762E-02 +5.323411E-03 +-3.868978E-02 +4.949255E-03 +1.384260E-01 +4.903532E-03 +-3.761889E-02 +2.524889E-03 +-6.079772E-02 +2.328339E-03 +1.956623E-03 +4.096814E-03 +1.716402E-03 +2.022751E-03 +-1.108600E-01 +3.227014E-03 +-2.447622E-03 +4.075421E-03 +1.582493E-02 +4.847858E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -761,56 +761,56 @@ tally 3: 0.000000E+00 0.000000E+00 0.000000E+00 -4.104000E+01 -3.668254E+02 --7.832373E-01 -3.913941E-01 -2.281642E-01 -2.669856E-01 --3.731272E-01 -6.152809E-01 --3.232973E-01 -7.526283E-02 -3.686513E-01 -9.047618E-02 --6.018185E-01 -9.140623E-02 -3.848843E-01 -3.431711E-01 -3.397425E-03 -8.879103E-02 --2.471531E-02 -5.561795E-02 -1.373897E-01 -7.288680E-02 -1.816888E-01 -5.419638E-02 --3.504404E-01 -1.461853E-01 -1.225356E-01 -3.443595E-02 --3.109887E-01 -5.492397E-02 --3.542105E-01 -6.530224E-02 -2.104218E-01 -4.093872E-02 -2.661467E-02 -3.058847E-02 --3.744331E-01 -6.755739E-02 -1.391218E-01 -4.432842E-02 -1.622041E-01 -6.843992E-03 -4.149973E-02 -1.782398E-02 -2.551752E-01 -2.626972E-02 --4.706697E-01 -9.193926E-02 --1.287882E-01 -3.489982E-02 +5.213000E+01 +5.552351E+02 +-6.019876E-01 +2.938936E-01 +2.126970E-01 +3.363271E-01 +-6.928646E-01 +3.077152E-01 +-2.976474E-01 +5.830705E-02 +7.804821E-01 +3.967156E-01 +5.737502E-01 +1.090147E-01 +-2.867929E-01 +1.312720E-01 +-4.735578E-01 +6.714577E-02 +-6.340442E-02 +4.240623E-02 +-1.594570E-01 +1.167021E-01 +-5.403124E-02 +6.452745E-02 +-2.670969E-01 +5.822561E-02 +-3.033558E-01 +4.890487E-02 +-3.515557E-01 +5.069681E-02 +2.257462E-01 +4.682933E-02 +-1.449924E-02 +1.625521E-02 +2.809498E-01 +6.883451E-02 +1.904808E-01 +1.004755E-01 +2.570005E-01 +4.301248E-02 +9.493600E-02 +7.708499E-02 +-2.804222E-01 +4.455703E-02 +3.199914E-01 +7.435651E-02 +-2.818069E-04 +7.231318E-02 +3.689494E-01 +1.349712E-01 tally 4: 0.000000E+00 0.000000E+00 @@ -912,106 +912,106 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -7.652157E-01 -1.242826E-01 --1.008373E-02 -5.281691E-04 --1.014715E-02 -2.749212E-04 --2.506414E-02 -2.613512E-04 -4.320187E-03 -4.316562E-04 -1.439246E-02 -9.138575E-05 --1.532539E-02 -2.360878E-04 -9.963404E-03 -1.511695E-04 --6.314554E-03 -2.742799E-05 -7.969329E-03 -1.380329E-04 --1.298431E-03 -3.287236E-04 -1.441639E-02 -1.409552E-04 -6.516689E-03 -2.511011E-04 -1.294596E-02 -2.249729E-04 -6.983038E-03 -6.334969E-05 --1.086161E-02 -1.140033E-04 -2.217006E-02 -4.221807E-04 --6.503276E-03 -2.028281E-04 -2.915180E-02 -3.659182E-04 --9.080091E-03 -1.503808E-04 --6.476980E-04 -1.927326E-04 --1.549603E-02 -3.445843E-04 -2.957508E-02 -1.835035E-04 -6.982790E-03 -1.237342E-04 --2.653281E-02 -2.606704E-04 -1.372000E+01 -4.018980E+01 --2.015212E-01 -1.072884E-01 --2.606953E-01 -4.894468E-02 -7.537153E-02 -2.216346E-02 --3.818524E-02 -6.301675E-02 -2.386335E-01 -1.931104E-02 --1.872805E-02 -1.265896E-02 -3.732943E-02 -2.347696E-02 --8.857050E-02 -1.636275E-02 --1.718450E-01 -1.043488E-02 -1.526226E-01 -2.435399E-02 -7.344765E-02 -1.541644E-02 --9.819186E-03 -1.473467E-02 --8.215914E-03 -1.463085E-02 -2.197504E-01 -2.244815E-02 -2.521002E-02 -8.206540E-03 -3.677974E-01 -3.982027E-02 --1.934606E-01 -3.440019E-02 -1.050141E-01 -2.346980E-02 -2.458487E-01 -1.861429E-02 -4.226131E-02 -2.690841E-03 -3.174234E-02 -1.867018E-02 -2.284995E-01 -1.190246E-02 --7.894573E-03 -3.715471E-03 --1.593928E-01 -1.391828E-02 +9.453374E-01 +1.815824E-01 +-4.552571E-02 +8.689847E-04 +4.192526E-03 +6.095248E-04 +-4.085060E-03 +3.488081E-04 +3.074303E-02 +3.709785E-04 +1.949067E-02 +1.995057E-04 +-7.372260E-02 +1.709765E-03 +-5.140901E-03 +6.268082E-05 +-2.589014E-02 +1.616678E-04 +1.683116E-02 +2.122512E-04 +-1.074659E-02 +1.087471E-04 +3.762844E-03 +3.439135E-05 +1.365793E-02 +5.255161E-05 +5.869374E-05 +4.060049E-04 +-7.715004E-03 +3.629588E-04 +8.240120E-03 +5.192031E-04 +1.662861E-02 +5.038262E-04 +-2.845811E-03 +2.843348E-04 +1.826833E-03 +1.104947E-05 +-5.596885E-04 +1.922661E-05 +1.398723E-02 +1.025178E-04 +1.733988E-02 +1.184228E-04 +1.250057E-02 +1.447801E-04 +-5.450018E-03 +3.725923E-05 +2.390947E-02 +6.837656E-04 +1.739000E+01 +6.083290E+01 +-2.434171E-01 +3.049063E-02 +-1.278707E-01 +9.585267E-02 +-2.597328E-01 +8.692607E-02 +2.496700E-01 +3.750933E-02 +-1.309937E-01 +4.217907E-02 +-1.863241E-01 +1.738581E-02 +1.292679E-01 +1.799004E-02 +-3.543191E-01 +3.682107E-02 +1.904413E-01 +1.455250E-02 +-7.093238E-02 +1.473997E-02 +1.920412E-01 +1.308864E-02 +1.566093E-01 +1.913492E-02 +-2.499642E-01 +3.036874E-02 +-2.323022E-01 +3.794368E-02 +6.361729E-02 +3.266166E-02 +4.688479E-02 +2.806712E-02 +9.796563E-02 +1.419748E-02 +1.000847E-02 +3.233262E-02 +7.570231E-02 +4.626536E-03 +1.489091E-01 +1.159345E-02 +2.236285E-01 +1.480084E-02 +2.461305E-01 +1.643844E-02 +1.773523E-02 +1.626036E-03 +6.570774E-02 +1.069893E-02 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1062,56 +1062,56 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -3.200000E+00 -2.342600E+00 --2.991985E-01 -1.868406E-02 -4.460301E-02 -4.132113E-03 --2.190630E-02 -1.023889E-02 --3.265764E-02 -2.060374E-03 -3.491521E-02 -4.785957E-04 --3.623623E-02 -5.929111E-04 --4.962268E-02 -1.814245E-03 -1.406439E-01 -1.174445E-02 --9.433277E-02 -5.036897E-03 -9.058176E-02 -3.871598E-03 --1.409089E-01 -6.665385E-03 --1.062337E-01 -4.771650E-03 -1.155280E-01 -8.020320E-03 -8.348336E-02 -1.633941E-03 -1.475434E-02 -3.411046E-03 -4.474425E-03 -6.049348E-03 -6.716359E-03 -2.898000E-03 --3.674047E-02 -2.971797E-03 --2.368070E-02 -9.474965E-04 --6.109826E-02 -4.846201E-03 --5.076118E-02 -8.354393E-03 --1.763594E-02 -1.017310E-03 --2.941064E-02 -1.044916E-03 --5.631429E-03 -3.915186E-03 +4.160000E+00 +3.501000E+00 +-9.464171E-02 +8.682833E-03 +8.467800E-02 +1.402624E-02 +1.283471E-02 +2.630439E-02 +1.859869E-01 +1.189528E-02 +1.910311E-02 +2.907370E-03 +-2.542253E-01 +2.143851E-02 +-4.021473E-02 +5.812599E-03 +-1.242140E-01 +1.017873E-02 +-2.934198E-02 +2.409920E-03 +5.719767E-02 +2.211520E-03 +3.023903E-02 +2.870625E-03 +1.092479E-01 +6.089989E-03 +1.604743E-02 +1.110224E-02 +3.811062E-03 +5.234112E-03 +5.446762E-02 +5.323411E-03 +-3.868978E-02 +4.949255E-03 +1.384260E-01 +4.903532E-03 +-3.761889E-02 +2.524889E-03 +-6.079772E-02 +2.328339E-03 +1.956623E-03 +4.096814E-03 +1.716402E-03 +2.022751E-03 +-1.108600E-01 +3.227014E-03 +-2.447622E-03 +4.075421E-03 +1.582493E-02 +4.847858E-03 0.000000E+00 0.000000E+00 0.000000E+00 @@ -1162,53 +1162,53 @@ tally 4: 0.000000E+00 0.000000E+00 0.000000E+00 -4.104000E+01 -3.668254E+02 --7.832373E-01 -3.913941E-01 -2.281642E-01 -2.669856E-01 --3.731272E-01 -6.152809E-01 --3.232973E-01 -7.526283E-02 -3.686513E-01 -9.047618E-02 --6.018185E-01 -9.140623E-02 -3.848843E-01 -3.431711E-01 -3.397425E-03 -8.879103E-02 --2.471531E-02 -5.561795E-02 -1.373897E-01 -7.288680E-02 -1.816888E-01 -5.419638E-02 --3.504404E-01 -1.461853E-01 -1.225356E-01 -3.443595E-02 --3.109887E-01 -5.492397E-02 --3.542105E-01 -6.530224E-02 -2.104218E-01 -4.093872E-02 -2.661467E-02 -3.058847E-02 --3.744331E-01 -6.755739E-02 -1.391218E-01 -4.432842E-02 -1.622041E-01 -6.843992E-03 -4.149973E-02 -1.782398E-02 -2.551752E-01 -2.626972E-02 --4.706697E-01 -9.193926E-02 --1.287882E-01 -3.489982E-02 +5.213000E+01 +5.552351E+02 +-6.019876E-01 +2.938936E-01 +2.126970E-01 +3.363271E-01 +-6.928646E-01 +3.077152E-01 +-2.976474E-01 +5.830705E-02 +7.804821E-01 +3.967156E-01 +5.737502E-01 +1.090147E-01 +-2.867929E-01 +1.312720E-01 +-4.735578E-01 +6.714577E-02 +-6.340442E-02 +4.240623E-02 +-1.594570E-01 +1.167021E-01 +-5.403124E-02 +6.452745E-02 +-2.670969E-01 +5.822561E-02 +-3.033558E-01 +4.890487E-02 +-3.515557E-01 +5.069681E-02 +2.257462E-01 +4.682933E-02 +-1.449924E-02 +1.625521E-02 +2.809498E-01 +6.883451E-02 +1.904808E-01 +1.004755E-01 +2.570005E-01 +4.301248E-02 +9.493600E-02 +7.708499E-02 +-2.804222E-01 +4.455703E-02 +3.199914E-01 +7.435651E-02 +-2.818069E-04 +7.231318E-02 +3.689494E-01 +1.349712E-01 diff --git a/tests/test_score_total_yn/settings.xml b/tests/test_score_total_yn/settings.xml deleted file mode 100644 index 517637a59..000000000 --- a/tests/test_score_total_yn/settings.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - 10 - 5 - 100 - - - - - - -160 -160 -183 - 160 160 183 - - - - - diff --git a/tests/test_score_total_yn/tallies.xml b/tests/test_score_total_yn/tallies.xml deleted file mode 100644 index 51cb79c39..000000000 --- a/tests/test_score_total_yn/tallies.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - total - - - - - total-y4 - U-235 total - - - - - total-y4 - U-235 total - analog - - - - - total-y4 - U-235 total - collision - - - diff --git a/tests/test_score_total_yn/test_score_total_yn.py b/tests/test_score_total_yn/test_score_total_yn.py index 1777db993..80f947f92 100644 --- a/tests/test_score_total_yn/test_score_total_yn.py +++ b/tests/test_score_total_yn/test_score_total_yn.py @@ -1,10 +1,35 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import TestHarness +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness, PyAPITestHarness +import openmc + + +class ScoreTotalYNTestHarness(PyAPITestHarness): + def _build_inputs(self): + filt = openmc.Filter(type='cell', bins=(10, 21, 22, 23)) + tallies = [openmc.Tally(tally_id=i) for i in range(1, 5)] + [t.add_filter(filt) for t in tallies] + tallies[0].add_score('total') + [t.add_score('total-y4') for t in tallies[1:]] + [t.add_nuclide('U-235') for t in tallies[1:]] + [t.add_nuclide('total') for t in tallies[1:]] + tallies[1].estimator = 'tracklength' + tallies[2].estimator = 'analog' + tallies[3].estimator = 'collision' + self._input_set.tallies = openmc.TalliesFile() + [self._input_set.tallies.add_tally(t) for t in tallies] + + super(ScoreTotalYNTestHarness, self)._build_inputs() + + def _cleanup(self): + super(ScoreTotalYNTestHarness, self)._cleanup() + f = os.path.join(os.getcwd(), 'tallies.xml') + if os.path.exists(f): os.remove(f) if __name__ == '__main__': - harness = TestHarness('statepoint.10.*', True) + harness = ScoreTotalYNTestHarness('statepoint.10.*', True) harness.main() diff --git a/tests/test_seed/geometry.xml b/tests/test_seed/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_seed/geometry.xml +++ b/tests/test_seed/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_seed/test_seed.py b/tests/test_seed/test_seed.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_seed/test_seed.py +++ b/tests/test_seed/test_seed.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_source_angle_mono/geometry.xml b/tests/test_source_angle_mono/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_source_angle_mono/geometry.xml +++ b/tests/test_source_angle_mono/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_source_angle_mono/test_source_angle_mono.py b/tests/test_source_angle_mono/test_source_angle_mono.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_source_angle_mono/test_source_angle_mono.py +++ b/tests/test_source_angle_mono/test_source_angle_mono.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_source_energy_maxwell/geometry.xml b/tests/test_source_energy_maxwell/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_source_energy_maxwell/geometry.xml +++ b/tests/test_source_energy_maxwell/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_source_energy_maxwell/test_source_energy_maxwell.py b/tests/test_source_energy_maxwell/test_source_energy_maxwell.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_source_energy_maxwell/test_source_energy_maxwell.py +++ b/tests/test_source_energy_maxwell/test_source_energy_maxwell.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_source_energy_mono/geometry.xml b/tests/test_source_energy_mono/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_source_energy_mono/geometry.xml +++ b/tests/test_source_energy_mono/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_source_energy_mono/test_source_energy_mono.py b/tests/test_source_energy_mono/test_source_energy_mono.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_source_energy_mono/test_source_energy_mono.py +++ b/tests/test_source_energy_mono/test_source_energy_mono.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_source_file/geometry.xml b/tests/test_source_file/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_source_file/geometry.xml +++ b/tests/test_source_file/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_source_file/test_source_file.py b/tests/test_source_file/test_source_file.py index fae6b2a72..6f76438c2 100644 --- a/tests/test_source_file/test_source_file.py +++ b/tests/test_source_file/test_source_file.py @@ -3,8 +3,7 @@ import glob import os import sys - -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import * diff --git a/tests/test_source_point/geometry.xml b/tests/test_source_point/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_source_point/geometry.xml +++ b/tests/test_source_point/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_source_point/test_source_point.py b/tests/test_source_point/test_source_point.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_source_point/test_source_point.py +++ b/tests/test_source_point/test_source_point.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_sourcepoint_batch/geometry.xml b/tests/test_sourcepoint_batch/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_sourcepoint_batch/geometry.xml +++ b/tests/test_sourcepoint_batch/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py index a306b9aa7..5db054134 100644 --- a/tests/test_sourcepoint_batch/test_sourcepoint_batch.py +++ b/tests/test_sourcepoint_batch/test_sourcepoint_batch.py @@ -3,9 +3,9 @@ import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness +from openmc.statepoint import StatePoint class SourcepointTestHarness(TestHarness): diff --git a/tests/test_sourcepoint_interval/geometry.xml b/tests/test_sourcepoint_interval/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_sourcepoint_interval/geometry.xml +++ b/tests/test_sourcepoint_interval/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py index a306b9aa7..5db054134 100644 --- a/tests/test_sourcepoint_interval/test_sourcepoint_interval.py +++ b/tests/test_sourcepoint_interval/test_sourcepoint_interval.py @@ -3,9 +3,9 @@ import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness +from openmc.statepoint import StatePoint class SourcepointTestHarness(TestHarness): diff --git a/tests/test_sourcepoint_latest/geometry.xml b/tests/test_sourcepoint_latest/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_sourcepoint_latest/geometry.xml +++ b/tests/test_sourcepoint_latest/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_sourcepoint_latest/test_sourcepoint_latest.py b/tests/test_sourcepoint_latest/test_sourcepoint_latest.py index 7d0af89b9..724a88fa6 100644 --- a/tests/test_sourcepoint_latest/test_sourcepoint_latest.py +++ b/tests/test_sourcepoint_latest/test_sourcepoint_latest.py @@ -1,11 +1,9 @@ #!/usr/bin/env python -import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness class SourcepointTestHarness(TestHarness): diff --git a/tests/test_sourcepoint_restart/geometry.xml b/tests/test_sourcepoint_restart/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_sourcepoint_restart/geometry.xml +++ b/tests/test_sourcepoint_restart/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_sourcepoint_restart/test_sourcepoint_restart.py b/tests/test_sourcepoint_restart/test_sourcepoint_restart.py index 1777db993..ed6addec4 100644 --- a/tests/test_sourcepoint_restart/test_sourcepoint_restart.py +++ b/tests/test_sourcepoint_restart/test_sourcepoint_restart.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_statepoint_batch/geometry.xml b/tests/test_statepoint_batch/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_statepoint_batch/geometry.xml +++ b/tests/test_statepoint_batch/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_statepoint_batch/test_statepoint_batch.py b/tests/test_statepoint_batch/test_statepoint_batch.py index bc5632618..e1dc167ff 100644 --- a/tests/test_statepoint_batch/test_statepoint_batch.py +++ b/tests/test_statepoint_batch/test_statepoint_batch.py @@ -1,7 +1,9 @@ #!/usr/bin/env python + +import os import sys -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness class StatepointTestHarness(TestHarness): diff --git a/tests/test_statepoint_interval/geometry.xml b/tests/test_statepoint_interval/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_statepoint_interval/geometry.xml +++ b/tests/test_statepoint_interval/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_statepoint_interval/test_statepoint_interval.py b/tests/test_statepoint_interval/test_statepoint_interval.py index b41ee2b7a..e7a42cdbe 100644 --- a/tests/test_statepoint_interval/test_statepoint_interval.py +++ b/tests/test_statepoint_interval/test_statepoint_interval.py @@ -1,8 +1,9 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness class StatepointTestHarness(TestHarness): diff --git a/tests/test_statepoint_restart/geometry.xml b/tests/test_statepoint_restart/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_statepoint_restart/geometry.xml +++ b/tests/test_statepoint_restart/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_statepoint_restart/test_statepoint_restart.py b/tests/test_statepoint_restart/test_statepoint_restart.py index dd42dc8ff..59b77a821 100644 --- a/tests/test_statepoint_restart/test_statepoint_restart.py +++ b/tests/test_statepoint_restart/test_statepoint_restart.py @@ -3,9 +3,10 @@ import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness +from openmc.statepoint import StatePoint +from openmc.executor import Executor class StatepointRestartTestHarness(TestHarness): diff --git a/tests/test_statepoint_sourcesep/geometry.xml b/tests/test_statepoint_sourcesep/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_statepoint_sourcesep/geometry.xml +++ b/tests/test_statepoint_sourcesep/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py b/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py index c7221c90c..00ded42ec 100644 --- a/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py +++ b/tests/test_statepoint_sourcesep/test_statepoint_sourcesep.py @@ -3,9 +3,8 @@ import glob import os import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness class SourcepointTestHarness(TestHarness): diff --git a/tests/test_survival_biasing/geometry.xml b/tests/test_survival_biasing/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_survival_biasing/geometry.xml +++ b/tests/test_survival_biasing/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_survival_biasing/test_survival_biasing.py b/tests/test_survival_biasing/test_survival_biasing.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_survival_biasing/test_survival_biasing.py +++ b/tests/test_survival_biasing/test_survival_biasing.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_tally_assumesep/geometry.xml b/tests/test_tally_assumesep/geometry.xml index b85dd04df..f6f067aad 100644 --- a/tests/test_tally_assumesep/geometry.xml +++ b/tests/test_tally_assumesep/geometry.xml @@ -21,50 +21,50 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - - + + + - + - + - + - + diff --git a/tests/test_tally_assumesep/test_tally_assumesep.py b/tests/test_tally_assumesep/test_tally_assumesep.py index 1777db993..ed6addec4 100644 --- a/tests/test_tally_assumesep/test_tally_assumesep.py +++ b/tests/test_tally_assumesep/test_tally_assumesep.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_tally_nuclides/geometry.xml b/tests/test_tally_nuclides/geometry.xml index 65954a785..7c3aefe88 100644 --- a/tests/test_tally_nuclides/geometry.xml +++ b/tests/test_tally_nuclides/geometry.xml @@ -4,7 +4,7 @@ - - + + diff --git a/tests/test_tally_nuclides/test_tally_nuclides.py b/tests/test_tally_nuclides/test_tally_nuclides.py index 1777db993..ed6addec4 100644 --- a/tests/test_tally_nuclides/test_tally_nuclides.py +++ b/tests/test_tally_nuclides/test_tally_nuclides.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_trace/geometry.xml b/tests/test_trace/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_trace/geometry.xml +++ b/tests/test_trace/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_trace/test_trace.py b/tests/test_trace/test_trace.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_trace/test_trace.py +++ b/tests/test_trace/test_trace.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_track_output/geometry.xml b/tests/test_track_output/geometry.xml index 3b5a49311..5b16fe26c 100644 --- a/tests/test_track_output/geometry.xml +++ b/tests/test_track_output/geometry.xml @@ -15,22 +15,22 @@ - - + + - - - + + + - - + + - + @@ -56,7 +56,7 @@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 - + @@ -80,10 +80,10 @@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 - - - - + + + + @@ -107,10 +107,10 @@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 - - - - + + + + @@ -136,7 +136,7 @@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 - + @@ -160,10 +160,10 @@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 - - - - + + + + @@ -187,10 +187,10 @@ 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 - - - - + + + + @@ -214,10 +214,10 @@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 - - - - + + + + @@ -242,10 +242,10 @@ 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 - - - - + + + + @@ -269,10 +269,10 @@ 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 - - - - + + + + @@ -299,7 +299,7 @@ - - + + diff --git a/tests/test_track_output/test_track_output.py b/tests/test_track_output/test_track_output.py index dc0eb1a69..9e9ce87ad 100644 --- a/tests/test_track_output/test_track_output.py +++ b/tests/test_track_output/test_track_output.py @@ -2,11 +2,11 @@ import glob import os +from subprocess import call import shutil import sys - -sys.path.insert(0, '..') -from testing_harness import * +sys.path.insert(0, os.pardir) +from testing_harness import TestHarness class TrackTestHarness(TestHarness): diff --git a/tests/test_translation/geometry.xml b/tests/test_translation/geometry.xml index 1390691dc..e2cdf2391 100644 --- a/tests/test_translation/geometry.xml +++ b/tests/test_translation/geometry.xml @@ -5,7 +5,7 @@ - - + + diff --git a/tests/test_translation/test_translation.py b/tests/test_translation/test_translation.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_translation/test_translation.py +++ b/tests/test_translation/test_translation.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_trigger_batch_interval/geometry.xml b/tests/test_trigger_batch_interval/geometry.xml index 65954a785..7c3aefe88 100644 --- a/tests/test_trigger_batch_interval/geometry.xml +++ b/tests/test_trigger_batch_interval/geometry.xml @@ -4,7 +4,7 @@ - - + + diff --git a/tests/test_trigger_batch_interval/test_trigger_batch_interval.py b/tests/test_trigger_batch_interval/test_trigger_batch_interval.py index e5c5b54b6..59b900e50 100644 --- a/tests/test_trigger_batch_interval/test_trigger_batch_interval.py +++ b/tests/test_trigger_batch_interval/test_trigger_batch_interval.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_trigger_no_batch_interval/geometry.xml b/tests/test_trigger_no_batch_interval/geometry.xml index 65954a785..7c3aefe88 100644 --- a/tests/test_trigger_no_batch_interval/geometry.xml +++ b/tests/test_trigger_no_batch_interval/geometry.xml @@ -4,7 +4,7 @@ - - + + diff --git a/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py b/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py index ff19e3d08..f9cb68d62 100644 --- a/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py +++ b/tests/test_trigger_no_batch_interval/test_trigger_no_batch_interval.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_trigger_no_status/geometry.xml b/tests/test_trigger_no_status/geometry.xml index 65954a785..7c3aefe88 100644 --- a/tests/test_trigger_no_status/geometry.xml +++ b/tests/test_trigger_no_status/geometry.xml @@ -4,7 +4,7 @@ - - + + diff --git a/tests/test_trigger_no_status/test_trigger_no_status.py b/tests/test_trigger_no_status/test_trigger_no_status.py index 1777db993..ed6addec4 100644 --- a/tests/test_trigger_no_status/test_trigger_no_status.py +++ b/tests/test_trigger_no_status/test_trigger_no_status.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_trigger_tallies/geometry.xml b/tests/test_trigger_tallies/geometry.xml index 65954a785..7c3aefe88 100644 --- a/tests/test_trigger_tallies/geometry.xml +++ b/tests/test_trigger_tallies/geometry.xml @@ -4,7 +4,7 @@ - - + + diff --git a/tests/test_trigger_tallies/test_trigger_tallies.py b/tests/test_trigger_tallies/test_trigger_tallies.py index 20094827e..a0b2119de 100644 --- a/tests/test_trigger_tallies/test_trigger_tallies.py +++ b/tests/test_trigger_tallies/test_trigger_tallies.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_uniform_fs/geometry.xml b/tests/test_uniform_fs/geometry.xml index b9b880d08..90cf35461 100644 --- a/tests/test_uniform_fs/geometry.xml +++ b/tests/test_uniform_fs/geometry.xml @@ -8,6 +8,6 @@ - + diff --git a/tests/test_uniform_fs/test_uniform_fs.py b/tests/test_uniform_fs/test_uniform_fs.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_uniform_fs/test_uniform_fs.py +++ b/tests/test_uniform_fs/test_uniform_fs.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_union_energy_grids/geometry.xml b/tests/test_union_energy_grids/geometry.xml index 612e46132..bc56030e1 100644 --- a/tests/test_union_energy_grids/geometry.xml +++ b/tests/test_union_energy_grids/geometry.xml @@ -3,6 +3,6 @@ - + diff --git a/tests/test_union_energy_grids/test_union_energy_grids.py b/tests/test_union_energy_grids/test_union_energy_grids.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_union_energy_grids/test_union_energy_grids.py +++ b/tests/test_union_energy_grids/test_union_energy_grids.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_universe/geometry.xml b/tests/test_universe/geometry.xml index a0b8b2f4f..03f507bec 100644 --- a/tests/test_universe/geometry.xml +++ b/tests/test_universe/geometry.xml @@ -5,7 +5,7 @@ - - + + diff --git a/tests/test_universe/test_universe.py b/tests/test_universe/test_universe.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_universe/test_universe.py +++ b/tests/test_universe/test_universe.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/test_void/geometry.xml b/tests/test_void/geometry.xml index 99b78586a..48a72c7c3 100644 --- a/tests/test_void/geometry.xml +++ b/tests/test_void/geometry.xml @@ -21,20 +21,20 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/tests/test_void/test_void.py b/tests/test_void/test_void.py index 6633e5911..2a595f3e6 100644 --- a/tests/test_void/test_void.py +++ b/tests/test_void/test_void.py @@ -1,7 +1,8 @@ #!/usr/bin/env python +import os import sys -sys.path.insert(0, '..') +sys.path.insert(0, os.pardir) from testing_harness import TestHarness diff --git a/tests/testing_harness.py b/tests/testing_harness.py index 3dcbee667..828fc3a09 100644 --- a/tests/testing_harness.py +++ b/tests/testing_harness.py @@ -11,7 +11,8 @@ import sys import numpy as np -sys.path.insert(0, '../..') +sys.path.insert(0, os.path.join(os.pardir, os.pardir)) +from input_set import InputSet from openmc.statepoint import StatePoint from openmc.executor import Executor import openmc.particle_restart as pr @@ -123,7 +124,7 @@ class TestHarness(object): def _write_results(self, results_string): """Write the results to an ASCII file.""" - with open('results_test.dat','w') as fh: + with open('results_test.dat', 'w') as fh: fh.write(results_string) def _overwrite_results(self): @@ -131,12 +132,14 @@ class TestHarness(object): shutil.copyfile('results_test.dat', 'results_true.dat') def _compare_results(self): + """Make sure the current results agree with the _true standard.""" compare = filecmp.cmp('results_test.dat', 'results_true.dat') if not compare: os.rename('results_test.dat', 'results_error.dat') assert compare, 'Results do not agree.' def _cleanup(self): + """Delete statepoints, tally, and test files.""" output = glob.glob(os.path.join(os.getcwd(), 'statepoint.*.*')) output.append(os.path.join(os.getcwd(), 'tallies.out')) output.append(os.path.join(os.getcwd(), 'results_test.dat')) @@ -267,3 +270,85 @@ class ParticleRestartTestHarness(TestHarness): p.uvw[2]) return outstr + + +class PyAPITestHarness(TestHarness): + def __init__(self, statepoint_name, tallies_present=False): + TestHarness.__init__(self, statepoint_name, tallies_present) + self._input_set = InputSet() + + def execute_test(self): + """Build input XMLs, run OpenMC, and verify correct results.""" + try: + self._build_inputs() + inputs = self._get_inputs() + self._write_inputs(inputs) + self._compare_inputs() + self._run_openmc() + self._test_output_created() + results = self._get_results() + self._write_results(results) + self._compare_results() + finally: + self._cleanup() + + def update_results(self): + """Update results_true.dat and inputs_true.dat""" + try: + self._build_inputs() + inputs = self._get_inputs() + self._write_inputs(inputs) + self._overwrite_inputs() + self._run_openmc() + self._test_output_created() + results = self._get_results() + self._write_results(results) + self._overwrite_results() + finally: + self._cleanup() + + def _build_inputs(self): + """Write input XML files.""" + self._input_set.build_default_materials_and_geometry() + self._input_set.build_default_settings() + self._input_set.export() + + def _get_inputs(self): + """Return a hash digest of the input XML files.""" + xmls = ('geometry.xml', 'tallies.xml', 'materials.xml', 'settings.xml') + xmls = [os.path.join(os.getcwd(), fname) for fname in xmls] + outstr = '\n'.join([open(fname).read() for fname in xmls + if os.path.exists(fname)]) + + sha512 = hashlib.sha512() + sha512.update(outstr.encode('utf-8')) + outstr = sha512.hexdigest() + + return outstr + + def _write_inputs(self, input_digest): + """Write the digest of the input XMLs to an ASCII file.""" + with open('inputs_test.dat', 'w') as fh: + fh.write(input_digest) + + def _overwrite_inputs(self): + """Overwrite inputs_true.dat with inputs_test.dat""" + shutil.copyfile('inputs_test.dat', 'inputs_true.dat') + + def _compare_inputs(self): + """Make sure the current inputs agree with the _true standard.""" + compare = filecmp.cmp('inputs_test.dat', 'inputs_true.dat') + if not compare: + os.rename('inputs_test.dat', 'inputs_error.dat') + assert compare, 'Input files are broken.' + + def _cleanup(self): + """Delete XMLs, statepoints, tally, and test files.""" + TestHarness._cleanup(self) + output = [os.path.join(os.getcwd(), 'materials.xml')] + output.append(os.path.join(os.getcwd(), 'geometry.xml')) + output.append(os.path.join(os.getcwd(), 'settings.xml')) + output.append(os.path.join(os.getcwd(), 'inputs_test.dat')) + for f in output: + if os.path.exists(f): + os.remove(f)