From 94a0414018f185813f74c234d26a0a6e4be11aab Mon Sep 17 00:00:00 2001 From: Mark Onufer Date: Tue, 4 Feb 2025 18:22:59 -0800 Subject: [PATCH] add function and fix init --- armi/reactor/components/component.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/armi/reactor/components/component.py b/armi/reactor/components/component.py index 541c95a89..92ea0ef95 100644 --- a/armi/reactor/components/component.py +++ b/armi/reactor/components/component.py @@ -369,11 +369,20 @@ def applyMaterialMassFracsToNumberDensities(self): # `density` is 3D density # call getProperty to cache and improve speed density = self.material.getProperty("pseudoDensity", Tc=self.temperatureInC) - self.p.numberDensities = densityTools.getNDensFromMasses( density, self.material.massFrac ) + # Sometimes the material thermal expansion depends on its parents composition (eg Pu frac) so + # setting number densities can sometimes change thermal expansion behavior. + # so call again so that the material has access to its parents comp when providing the reference initial density. + densityBasedOnParentComposition = self.material.getProperty( + "pseudoDensity", Tc=self.temperatureInC + ) + self.p.numberDensities = densityTools.getNDensFromMasses( + densityBasedOnParentComposition, self.material.massFrac + ) + # material needs to be expanded from the material's cold temp to hot, # not components cold temp, so we don't use mat.linearExpansionFactor or # component.getThermalExpansionFactor. @@ -715,12 +724,7 @@ def setNumberDensity(self, nucName, val): val : float Number density to set in atoms/bn-cm (heterogeneous) """ - self.p.numberDensities[nucName] = val - self.p.assigned = parameters.SINCE_ANYTHING - # necessary for syncMpiState - parameters.ALL_DEFINITIONS[ - "numberDensities" - ].assigned = parameters.SINCE_ANYTHING + self.updateNumberDensities({nucName: val}) def setNumberDensities(self, numberDensities): """ @@ -804,7 +808,7 @@ def updateNumberDensities(self, numberDensities): factor = area / self.getArea() self.changeNDensByFactor(factor) - # since we're updating the object the param points to but not the param itself, we have to inform + # since we're calling update on the object the param points to, but not the param itself, we have to inform # the param system to flag it as modified so it properly syncs during ``syncMpiState``. self.p.assigned = parameters.SINCE_ANYTHING self.p.paramDefs["numberDensities"].assigned = parameters.SINCE_ANYTHING