예제 #1
0
    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
                )
            )
예제 #2
0
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
예제 #3
0
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))
예제 #4
0
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