# Copyright 2019 TerraPower, LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Test for xs nuclides."""
import unittest
from armi.nucDirectory import nuclideBases
from armi.nuclearDataIO import isotxs
from armi.nuclearDataIO import xsLibraries
from armi.nuclearDataIO import xsNuclides
from armi.tests import ISOAA_PATH
from armi.tests import mockRunLogs
[docs]class NuclideTests(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.lib = isotxs.readBinary(ISOAA_PATH)
[docs] def test_nuclide_createFromLabelFailsOnBadName(self):
nuc = xsNuclides.XSNuclide(None, "BACONAA")
nuc.isotxsMetadata["nuclideId"] = "BACN87"
with self.assertRaises(OSError):
nuc.updateBaseNuclide()
[docs] def test_nuclide_creatingNuclidesDoesNotMessWithUnderlyingNuclideDict(self):
nuc = nuclideBases.byName["U238"]
self.assertFalse(hasattr(nuc, "xsId"))
nrAA = xsNuclides.XSNuclide(None, "U238AA")
nrAA.isotxsMetadata["nuclideId"] = nuc.name
nrAA.updateBaseNuclide()
self.assertEqual("AA", nrAA.xsId)
self.assertFalse(hasattr(nuc, "xsId"))
[docs] def test_nuclide_modifyingNuclideAttributesUpdatesTheIsotxsNuclide(self):
lib = xsLibraries.IsotxsLibrary()
nuc = nuclideBases.byName["FE"]
nrAA = xsNuclides.XSNuclide(lib, "FEAA")
lib["FEAA"] = nrAA
nrAA.isotxsMetadata["nuclideId"] = nuc.name
nrAA.updateBaseNuclide()
self.assertEqual(len(nuc.trans), len(nrAA.trans))
nuc.trans.append("whatever")
self.assertEqual(len(nuc.trans), len(nrAA.trans))
self.assertEqual("whatever", nuc.trans[-1])
self.assertEqual("whatever", nrAA.trans[-1])
# I've modified the underlying nuclide... need to reset.
nuc.trans.pop()
[docs] def test_nuclide_newLabelsDontCauseWarnings(self):
with mockRunLogs.BufferLog() as logCapture:
self.assertEqual("", logCapture.getStdout())
fe = nuclideBases.byName["FE"]
feNuc = xsNuclides.XSNuclide(None, "FEAA")
feNuc.isotxsMetadata["nuclideId"] = fe.name
feNuc.updateBaseNuclide()
self.assertEqual(fe, feNuc._base)
self.assertEqual("", logCapture.getStdout())
[docs] def test_nuclide_oldLabelsCauseWarnings(self):
with mockRunLogs.BufferLog() as logCapture:
self.assertEqual("", logCapture.getStdout())
pu = nuclideBases.byName["PU239"]
puNuc = xsNuclides.XSNuclide(None, "PLUTAA")
puNuc.isotxsMetadata["nuclideId"] = pu.name
puNuc.updateBaseNuclide()
self.assertEqual(pu, puNuc._base)
length = len(logCapture.getStdout())
self.assertGreater(length, 15)
# now get it with a legitmate same label, length shouldn't change
puNuc = xsNuclides.XSNuclide(None, "PLUTAB")
puNuc.isotxsMetadata["nuclideId"] = pu.name
puNuc.updateBaseNuclide()
self.assertEqual(pu, puNuc._base)
self.assertEqual(length, len(logCapture.getStdout()))
[docs] def test_nuclide_nuclideBaseMethodsShouldNotFail(self):
for nuc in self.lib.nuclides:
self.assertIsInstance(nuc.getDatabaseName(), str)
self.assertIsInstance(nuc.getMcc3Id(), str)
[docs] def test_nuclide_isoaaDetails(self):
nuc = self.lib["U235AA"]
self.assertEqual(935.9793848991394, sum(nuc.micros.fission))
self.assertEqual(1.0000000956962505, sum(nuc.micros.chi))
nuc = self.lib["B10AA"]
self.assertEqual(0.7499475518734471, sum(nuc.micros.nGamma))
nuc = self.lib["B11AA"]
self.assertEqual(0.0008645406924188137, sum(nuc.micros.n2n))
self.assertEqual(0.008091875669521187, sum(nuc.micros.nGamma))
[docs] def test_nuclide_2dXsArrangementIsCorrect(self):
"""Manually compare some 2d XS data to ensure the correct coordinates."""
u235 = self.lib["U235AA"]
self.assertAlmostEqual(5.76494979858, u235.micros.total[0, 0])
self.assertAlmostEqual(6.5928812027, u235.micros.total[1, 0])
self.assertAlmostEqual(113.00479126, u235.micros.total[31, 0])
self.assertAlmostEqual(606.100097656, u235.micros.total[32, 0])
self.assertAlmostEqual(5.7647356987, u235.micros.total[0, 1])
self.assertAlmostEqual(6.58178663254, u235.micros.total[1, 1])
self.assertAlmostEqual(112.154449463, u235.micros.total[31, 1])
self.assertAlmostEqual(606.100097656, u235.micros.total[32, 1])
pu239 = self.lib["PU39AA"]
self.assertAlmostEqual(5.83128976821, pu239.micros.total[0, 0])
self.assertAlmostEqual(6.64091205597, pu239.micros.total[1, 0])
self.assertAlmostEqual(394.632354736, pu239.micros.total[31, 0])
self.assertAlmostEqual(973.399902343, pu239.micros.total[32, 0])
self.assertAlmostEqual(5.83086299896, pu239.micros.total[0, 1])
self.assertAlmostEqual(6.63103675842, pu239.micros.total[1, 1])
self.assertAlmostEqual(383.891998291, pu239.micros.total[31, 1])
self.assertAlmostEqual(973.399902343, pu239.micros.total[32, 1])
[docs] def test_nuclide_scatterXsArrangementIsCorrect(self):
"""Manually compare scatter XS data to ensure the correct coordinates."""
u235 = self.lib["U235AA"]
elasticScatter = u235.micros.elasticScatter
n2nScatter = u235.micros.n2nScatter
inelasticScatter = u235.micros.inelasticScatter
self.assertAlmostEqual(0.0304658822715, elasticScatter[(2, 1)])
self.assertAlmostEqual(0.0331721678376, inelasticScatter[(2, 0)])
self.assertAlmostEqual(0.0310171917081, inelasticScatter[(2, 1)])
self.assertAlmostEqual(0.0893433615565, inelasticScatter[(2, 2)])
self.assertAlmostEqual(8.41606015456e-05, inelasticScatter[(16, 2)])
self.assertAlmostEqual(3.23279074621e-08, inelasticScatter[(17, 2)])
self.assertAlmostEqual(1.96078691062e-08, inelasticScatter[(18, 2)])
self.assertAlmostEqual(1.18927703241e-08, inelasticScatter[(19, 2)])
self.assertAlmostEqual(7.21333170972e-09, inelasticScatter[(20, 2)])
self.assertAlmostEqual(3.66581343059e-09, inelasticScatter[(21, 2)])
self.assertAlmostEqual(3.81337583732e-09, inelasticScatter[(22, 2)])
self.assertAlmostEqual(1.35068589646e-09, inelasticScatter[(23, 2)])
self.assertAlmostEqual(3.96180976914e-10, inelasticScatter[(24, 2)])
self.assertAlmostEqual(4.85626551381e-05, n2nScatter[(1, 0)])
self.assertAlmostEqual(4.61509245042e-07, n2nScatter[(1, 1)])
self.assertAlmostEqual(9.67319720075e-05, n2nScatter[(2, 1)])
self.assertAlmostEqual(3.39554608217e-05, n2nScatter[(16, 1)])
self.assertAlmostEqual(1.12633460958e-05, n2nScatter[(17, 1)])
self.assertAlmostEqual(6.964501722e-07, n2nScatter[(18, 1)])
pu239 = self.lib["PU39AA"]
elasticScatter = pu239.micros.elasticScatter
inelasticScatter = pu239.micros.inelasticScatter
n2nScatter = pu239.micros.n2nScatter
self.assertAlmostEqual(1.7445316189e-05, n2nScatter[(1, 0)])
self.assertAlmostEqual(4.12698773289e-06, n2nScatter[(17, 1)])
self.assertAlmostEqual(6.80282767007e-07, n2nScatter[(1, 1)])
self.assertAlmostEqual(1.56137302838e-05, n2nScatter[(16, 1)])
self.assertAlmostEqual(9.7953477507e-07, n2nScatter[(18, 1)])
self.assertAlmostEqual(0.000104939324956, n2nScatter[(2, 1)])
self.assertAlmostEqual(0.0206335708499, elasticScatter[(2, 1)])
self.assertAlmostEqual(0.000585122266784, inelasticScatter[(2, 0)])
self.assertAlmostEqual(0.0352461636066, inelasticScatter[(2, 1)])
self.assertAlmostEqual(0.457990020514, inelasticScatter[(2, 2)])
self.assertAlmostEqual(1.16550609164e-07, n2nScatter[(19, 1)])
self.assertAlmostEqual(5.22556074429e-05, inelasticScatter[(16, 2)])
# the code below is very useful for generating the above test information
"""
for key, xs in pu239Scatter.items():
mk = max(key[1:])
if len(key) == 5 and 1 in key and 2 in key and (mk <= 2 or mk > 15):
print ('self.assertAlmostEqual({}, pu239.micros[{}])'
.format(xs, key))
"""
[docs] def test_getMicroXS(self):
"""Check whether getMicroXS method returns the correct cross sections for the input nuclide."""
u235Nuc = self.lib["U235AA"]
for i in range(self.lib.numGroups):
refFissionXS = u235Nuc.micros.fission[i]
curFissionXS = u235Nuc.getMicroXS("fission", i)
self.assertAlmostEqual(refFissionXS, curFissionXS)
# error raised if you attempt a bad group index
with self.assertRaises(IndexError):
u235Nuc.getMicroXS("fission", -999)
# zero returned if you try to grab a non-existant interaction
self.assertEqual(u235Nuc.getMicroXS("fake", 1), 0)
[docs] def test_getXS(self):
u235Nuc = self.lib["U235AA"]
refFission = u235Nuc.micros.fission
curFission = u235Nuc.getXS("fission")
self.assertAlmostEqual(len(refFission), len(curFission))
self.assertAlmostEqual(refFission[0], curFission[0])
self.assertAlmostEqual(refFission[1], curFission[1])