diff --git a/armi/reactor/blocks.py b/armi/reactor/blocks.py index cdbd5fabf..55613eddb 100644 --- a/armi/reactor/blocks.py +++ b/armi/reactor/blocks.py @@ -2509,13 +2509,10 @@ def getWettedPerimeter(self): ) # flags pertaining to circular pin components where the exterior of the circle is wetted - wettedPinComponentFlags = ( - Flags.CLAD, - Flags.WIRE, - ) + wettedPinComponentFlags = (Flags.CLAD, Flags.WIRE) - # flags pertaining to circular components where both the interior and exterior of the circle are wetted - wettedHollowCircleComponentFlags = (Flags.DUCT | Flags.INNER,) + # flags pertaining to components where both the interior and exterior are wetted + wettedHollowComponentFlags = (Flags.DUCT | Flags.INNER,) # obtain all wetted components based on type wettedHollowHexagonComponents = [] @@ -2529,9 +2526,13 @@ def getWettedPerimeter(self): wettedPinComponents.append(c) if c else None wettedHollowCircleComponents = [] - for flag in wettedHollowCircleComponentFlags: + wettedHollowHexComponents = [] + for flag in wettedHollowComponentFlags: c = self.getComponent(flag, exact=True) - wettedHollowCircleComponents.append(c) if c else None + if isinstance(c, Hexagon): + wettedHollowHexComponents.append(c) if c else None + else: + wettedHollowCircleComponents.append(c) if c else None # calculate wetted perimeters according to their geometries @@ -2565,10 +2566,19 @@ def getWettedPerimeter(self): ) wettedHollowCirclePerimeter *= math.pi + # hollow hexagon = 6 * (ip + op) / sqrt(3) + wettedHollowHexPerimeter = 0.0 + for c in wettedHollowHexComponents: + wettedHollowHexPerimeter += ( + c.getDimension("ip") + c.getDimension("op") if c else 0.0 + ) + wettedHollowHexPerimeter *= 6 / math.sqrt(3) + return ( wettedHollowHexagonPerimeter + wettedPinPerimeter + wettedHollowCirclePerimeter + + wettedHollowHexPerimeter ) def getFlowArea(self): diff --git a/armi/reactor/tests/test_blocks.py b/armi/reactor/tests/test_blocks.py index 863cf4719..07f7eb09b 100644 --- a/armi/reactor/tests/test_blocks.py +++ b/armi/reactor/tests/test_blocks.py @@ -48,7 +48,7 @@ def buildSimpleFuelBlock(): - """Return a simple block containing fuel, clad, duct, and coolant.""" + """Return a simple hex block containing fuel, clad, duct, and coolant.""" b = blocks.HexBlock("fuel", height=10.0) fuelDims = {"Tinput": 25.0, "Thot": 600, "od": 0.76, "id": 0.00, "mult": 127.0} @@ -816,8 +816,7 @@ def test_replaceBlockWithBlock(self): self.assertEqual(block.p.height, refHeight) def test_getWettedPerimeter(self): - cur = self.block.getWettedPerimeter() - + # calculate the reference value wire = self.block.getComponent(Flags.WIRE) correctionFactor = np.hypot( 1.0, @@ -825,16 +824,81 @@ def test_getWettedPerimeter(self): * wire.getDimension("helixDiameter") / wire.getDimension("axialPitch"), ) - wireDiameter = wire.getDimension("od") * correctionFactor - - ref = math.pi * ( - self.block.getDim(Flags.CLAD, "od") + wireDiameter - ) * self.block.getDim(Flags.CLAD, "mult") + 6 * self.block.getDim( - Flags.DUCT, "ip" - ) / math.sqrt( - 3 - ) + wireDiam = wire.getDimension("od") * correctionFactor + + ipDim = self.block.getDim(Flags.DUCT, "ip") + odDim = self.block.getDim(Flags.CLAD, "od") + mult = self.block.getDim(Flags.CLAD, "mult") + ref = math.pi * (odDim + wireDiam) * mult + 6 * ipDim / math.sqrt(3) + + # test getWettedPerimeter + cur = self.block.getWettedPerimeter() + self.assertAlmostEqual(cur, ref) + + def test_getWettedPerimeterCircularInnerDuct(self): + """Calculate the wetted perimeter for a HexBlock with circular inner duct.""" + # build a test block with a Hex inner duct + fuelDims = {"Tinput": 400, "Thot": 400, "od": 0.76, "id": 0.00, "mult": 127.0} + cladDims = {"Tinput": 400, "Thot": 400, "od": 0.80, "id": 0.77, "mult": 127.0} + ductDims = {"Tinput": 400, "Thot": 400, "od": 16, "id": 15.3, "mult": 1.0} + intercoolantDims = { + "Tinput": 400, + "Thot": 400, + "od": 17.0, + "id": ductDims["od"], + "mult": 1.0, + } + + fuel = components.Circle("fuel", "UZr", **fuelDims) + clad = components.Circle("clad", "HT9", **cladDims) + duct = components.Circle("inner duct", "HT9", **ductDims) + intercoolant = components.Circle("intercoolant", "Sodium", **intercoolantDims) + + b = blocks.HexBlock("fuel", height=10.0) + b.add(fuel) + b.add(clad) + b.add(duct) + b.add(intercoolant) + + # calculate the reference value + ref = (ductDims["id"] + ductDims["od"]) * math.pi + ref += b.getNumPins() * cladDims["od"] * math.pi + + # test getWettedPerimeter + cur = b.getWettedPerimeter() + self.assertAlmostEqual(cur, ref) + + def test_getWettedPerimeterHexInnerDuct(self): + """Calculate the wetted perimeter for a HexBlock with hexagonal inner duct.""" + # build a test block with a Hex inner duct + fuelDims = {"Tinput": 400, "Thot": 400, "od": 0.76, "id": 0.00, "mult": 127.0} + cladDims = {"Tinput": 400, "Thot": 400, "od": 0.80, "id": 0.77, "mult": 127.0} + ductDims = {"Tinput": 400, "Thot": 400, "op": 16, "ip": 15.3, "mult": 1.0} + intercoolantDims = { + "Tinput": 400, + "Thot": 400, + "op": 17.0, + "ip": ductDims["op"], + "mult": 1.0, + } + + fuel = components.Circle("fuel", "UZr", **fuelDims) + clad = components.Circle("clad", "HT9", **cladDims) + duct = components.Hexagon("inner duct", "HT9", **ductDims) + intercoolant = components.Hexagon("intercoolant", "Sodium", **intercoolantDims) + + b = blocks.HexBlock("fuel", height=10.0) + b.add(fuel) + b.add(clad) + b.add(duct) + b.add(intercoolant) + + # calculate the reference value + ref = 6 * (ductDims["ip"] + ductDims["op"]) / math.sqrt(3) + ref += b.getNumPins() * cladDims["od"] * math.pi + # test getWettedPerimeter + cur = b.getWettedPerimeter() self.assertAlmostEqual(cur, ref) def test_getFlowAreaPerPin(self): diff --git a/doc/release/0.4.rst b/doc/release/0.4.rst index 22877091e..b6917e9bb 100644 --- a/doc/release/0.4.rst +++ b/doc/release/0.4.rst @@ -62,6 +62,7 @@ Bug Fixes #. Material theoretical density is serialized to and read from database. (`PR#1852 `_) #. Removed broken and unused column in ``summarizeMaterialData``. (`PR#1925 `_) #. Fixed edge case in ``assemblyBlueprint._checkParamConsistency()``. (`PR#1928 `_) +#. Fixed wetted perimeter for hex inner ducts. (`PR#1985 `_) #. TBD Quality Work