def _initializeMassFracs(self): self.massFracs = dict() # defaults to 0.0, __init__ is not called if any(v < 0.0 for v in self.values()): raise ValueError( "Custom isotopic input for {} is negative".format(self.name) ) valSum = sum(self.values()) if not abs(valSum - 1.0) < 1e-5 and "fractions" in self.inputFormat: raise ValueError( "Fractional custom isotopic input values must sum to 1.0 in: {}".format( self.name ) ) if self.inputFormat == "number fractions": sumNjAj = 0.0 for nuc, nj in self.items(): if nj: sumNjAj += nj * nucDir.getAtomicWeight(nuc) for nuc, value in self.items(): massFrac = value * nucDir.getAtomicWeight(nuc) / sumNjAj self.massFracs[nuc] = massFrac elif self.inputFormat == "number densities": if self._density is not None: raise exceptions.InputError( "Custom isotopic `{}` is over-specified. It was provided as number " "densities, and but density ({}) was also provided. Is the input format " "correct?".format(self.name, self.density) ) M = { nuc: Ni / units.MOLES_PER_CC_TO_ATOMS_PER_BARN_CM * nucDir.getAtomicWeight(nuc) for nuc, Ni in self.items() } densityTotal = sum(M.values()) if densityTotal < 0: raise ValueError("Computed density is negative") for nuc, Mi in M.items(): self.massFracs[nuc] = Mi / densityTotal self._computedDensity = densityTotal elif self.inputFormat == "mass fractions": self.massFracs = dict(self) # as input else: raise ValueError( "Unrecognized custom isotopics input format {}.".format( self.inputFormat ) )
def getMassFractions(numberDensities): """ Convert number densities (#/bn-cm) into mass fractions. Parameters ---------- numberDensities : dict number densities (#/bn-cm) keyed by their nuclide name Returns ------- massFracs : dict mass fractions -- normalized to 1 -- keyed by their nuclide name """ nucMassFracs = {} totalWeight = 0.0 for nucName, numDensity in numberDensities.items(): weightI = numDensity * nucDir.getAtomicWeight(nucName) nucMassFracs[nucName] = weightI # will be normalized at end totalWeight += weightI if totalWeight != 0: for nucName in numberDensities: nucMassFracs[nucName] /= totalWeight else: for nucName in numberDensities: nucMassFracs[nucName] = 0.0 return nucMassFracs
def calculateNumberDensity(nucName, mass, volume): """ Calculates the number density. Parameters ---------- mass : float volume : volume nucName : armi nuclide name -- e.g. 'U235' Returns ------- number density : float number density (#/bn-cm) See Also -------- armi.reactor.blocks.Block.setMass """ A = nucDir.getAtomicWeight(nucName) try: return units.MOLES_PER_CC_TO_ATOMS_PER_BARN_CM * mass / (volume * A) except ZeroDivisionError: if mass == 0 and volume == 0: return 0 raise ValueError("Could not calculate number density with input.\n" "mass : {}\nvolume : {}\natomic weight : {}\n".format( mass, volume, A))
def getMassInGrams(nucName, volume, numberDensity=None): """ Gets mass of a nuclide of a known volume and know number density. Parameters ---------- nucName : str name of nuclide -- e.g. 'U235' volume : float volume in (cm3) numberDensity : float number density in (at/bn-cm) Returns ------- mass : float mass of nuclide (g) """ if not numberDensity: return 0.0 A = nucDir.getAtomicWeight(nucName) return numberDensity * volume * A / units.MOLES_PER_CC_TO_ATOMS_PER_BARN_CM