示例#1
0
def toENDF6(self, flags, targetInfo, verbosityIndent=''):

    gridded = self.forms[0]
    data = gridded.array.constructArray()
    Tlist = list(gridded.axes[-1].grid)  #FIXME what if grid units aren't 'K'?
    Elist = list(gridded.axes[-2].grid)  #FIXME      ""                  'eV'?

    LT = len(Tlist) - 1
    # first temperature includes the energy list:
    endf = [
        endfFormatsModule.endfHeadLine(Tlist[0], 0, LT, 0, 1, len(data[0]))
    ]
    independentInterp = gndToENDF6.gndToENDFInterpolationFlag(
        gridded.axes[1].interpolation)
    dependentInterp = gndToENDF6.gndToENDFInterpolationFlag(
        gridded.axes[2].interpolation)
    endf += ['%11i%11i%44s' % (len(data[0]), independentInterp, '')
             ]  # no trailing zeros
    endf += endfFormatsModule.endfDataList(
        list(itertools.chain(*zip(Elist, data[0]))))

    # remaining temperatures:
    for T, datList in zip(Tlist[1:], data[1:]):
        endf += [
            endfFormatsModule.endfHeadLine(T, 0, dependentInterp, 0,
                                           len(datList), 0)
        ]
        endf += endfFormatsModule.endfDataList(datList)
    return endf
示例#2
0
def toENDF6(self, flags, targetInfo, verbosityIndent=''):
    NR = 1
    NP = len(self)
    endf = [endfFormatsModule.endfHeadLine(0, 0, 0, 0, NR, NP)]
    interp = gndToENDF6.gndToENDFInterpolationFlag(self.interpolation)
    endf += ['%11i%11i%44s' % (len(self), interp, '')]
    endf += endfFormatsModule.endfDataList(
        list(itertools.chain(*self.copyDataToXYs())))
    return endf
示例#3
0
def toENDF6(self, endfMFList, flags, targetInfo, verbosityIndent=''):
    ZAM, AWT = targetInfo['ZA'], targetInfo['mass']
    LTHR, LAT, LASYM = 0, self.calculatedAtThermal, self.asymmetric
    endf = [endfFormatsModule.endfHeadLine(ZAM, AWT, LTHR, LAT, LASYM, 0)]
    # describe scattering atoms:
    LLN, NS = 0, len(self.scatteringAtoms) - 1
    NI = 6 * (NS + 1)
    endf += [endfFormatsModule.endfHeadLine(0, 0, LLN, 0, NI, NS)]
    # principal scattering atom:
    atom = self.scatteringAtoms[0]
    endf += [
        endfFormatsModule.endfDataLine([
            atom.freeAtomCrossSection.getValueAs('b'), atom.e_critical,
            atom.mass,
            atom.e_max.getValueAs('eV'), 0, atom.numberPerMolecule
        ])
    ]
    for atom in self.scatteringAtoms[1:]:
        a1 = {
            'SCT': 0.0,
            'free_gas': 1.0,
            'diffusive_motion': 2.0
        }[atom.functionalForm]
        endf += [
            endfFormatsModule.endfDataLine([
                a1,
                atom.freeAtomCrossSection.getValueAs('b'), atom.mass, 0, 0,
                atom.numberPerMolecule
            ])
        ]

    # convert data form: sort first by beta, then E, then T
    gridded = self.S_alpha_beta.forms[0]
    array = gridded.array.constructArray()  # 3D numpy array

    Tlist = list(gridded.axes[3].grid)  # FIXME check grid units
    betas = list(gridded.axes[2].grid)
    alphas = list(gridded.axes[1].grid)

    # switch array back to ENDF ordering:  1st beta, then T, then alpha:
    array = array.transpose((1, 0, 2))

    NR = 1
    NB = len(betas)
    endf += [endfFormatsModule.endfHeadLine(0, 0, 0, 0, NR, NB)]
    #endf += endfFormatsModule.endfInterpolationList( (NB, 4) )
    endf += [
        '%11i%11i%44s' % (NB, 4, '')
    ]  # FIXME add 'suppressTrailingZeros' option to endfInterpolationList

    LT = len(Tlist) - 1
    if LT:
        T_interp = gndToENDF6.gndToENDFInterpolationFlag(
            gridded.axes[3].interpolation)
    else:
        T_interp = None
    beta_interp = gndToENDF6.gndToENDFInterpolationFlag(
        gridded.axes[2].interpolation)
    alpha_interp = gndToENDF6.gndToENDFInterpolationFlag(
        gridded.axes[1].interpolation)

    for index, beta in enumerate(betas):
        data = array[index, :, :]  # 2D sub-array for this beta

        endf += [
            endfFormatsModule.endfHeadLine(Tlist[0], beta, LT, 0, 1,
                                           len(data[0]))
        ]
        endf += ['%11i%11i%44s' % (len(alphas), alpha_interp, '')
                 ]  # no trailing zeros
        # For each beta, the first temperature needs to include the energy list:
        endf += endfFormatsModule.endfDataList(
            list(itertools.chain(*zip(alphas, data[0]))))

        # remaining temperatures:
        for T, datList in zip(Tlist[1:], data[1:]):
            endf += [
                endfFormatsModule.endfHeadLine(T, beta, T_interp, 0,
                                               len(datList), 0)
            ]
            endf += endfFormatsModule.endfDataList(datList)

    for atom in self.scatteringAtoms:
        if atom.effectiveTemperature is not None:
            endf += atom.effectiveTemperature.toENDF6(flags,
                                                      targetInfo,
                                                      verbosityIndent='')
    endfMFList[7][4] = endf + [99999]
示例#4
0
def toENDF6(self, flags, targetInfo, verbosityIndent=''):

    endf = []
    AP = self.scatteringRadius
    if AP.isEnergyDependent():
        scatRadius = AP.form
        NR, NP = 1, len(scatRadius)
        endf.append(endfFormatsModule.endfHeadLine(0, 0, 0, 0, NR, NP))
        endf += endfFormatsModule.endfInterpolationList(
            (NP,
             gndToENDF6.gndToENDFInterpolationFlag(scatRadius.interpolation)))
        endf += endfFormatsModule.endfNdDataList(
            scatRadius.convertAxisToUnit(0, '10*fm'))
        AP = 0
    else:
        AP = AP.getValueAs('10*fm')

    NLS = len(self.L_values)
    LFW = targetInfo['unresolved_LFW']
    LRF = targetInfo['unresolved_LRF']

    def v(val):  # get value back from PhysicalQuantityWithUncertainty
        if type(val) == type(None): return
        return val.getValueAs('eV')

    if LFW == 0 and LRF == 1:  # 'Case A' from ENDF 2010 manual pg 70
        endf.append(
            endfFormatsModule.endfHeadLine(targetInfo['spin'], AP,
                                           self.forSelfShieldingOnly, 0, NLS,
                                           0))
        for Lval in self.L_values:
            NJS = len(Lval.J_values)
            endf.append(
                endfFormatsModule.endfHeadLine(targetInfo['mass'], 0, Lval.L,
                                               0, 6 * NJS, NJS))
            for Jval in Lval.J_values:
                # here we only have one width per J:
                ave = Jval.constantWidths
                endf.append(
                    endfFormatsModule.endfDataLine([
                        v(ave.levelSpacing), Jval.J.value, Jval.neutronDOF,
                        v(ave.neutronWidth),
                        v(ave.captureWidth), 0
                    ]))

    elif LFW == 1 and LRF == 1:  # 'Case B'
        energies = self.L_values[0].J_values[
            0].energyDependentWidths.getColumn('energy', units='eV')
        NE = len(energies)
        endf.append(
            endfFormatsModule.endfHeadLine(targetInfo['spin'], AP,
                                           self.forSelfShieldingOnly, 0, NE,
                                           NLS))
        nlines = int(math.ceil(NE / 6.0))
        for line in range(nlines):
            endf.append(
                endfFormatsModule.endfDataLine(energies[line * 6:line * 6 +
                                                        6]))
        for Lval in self.L_values:
            NJS = len(Lval.J_values)
            endf.append(
                endfFormatsModule.endfHeadLine(targetInfo['mass'], 0, Lval.L,
                                               0, NJS, 0))
            for Jval in Lval.J_values:
                cw = Jval.constantWidths
                endf.append(
                    endfFormatsModule.endfHeadLine(0, 0, Lval.L,
                                                   Jval.fissionDOF, NE + 6, 0))
                endf.append(
                    endfFormatsModule.endfDataLine([
                        v(cw.levelSpacing), Jval.J.value, Jval.neutronDOF,
                        v(cw.neutronWidth),
                        v(cw.captureWidth), 0
                    ]))
                fissWidths = Jval.energyDependentWidths.getColumn(
                    'fissionWidthA', units='eV')
                for line in range(nlines):
                    endf.append(
                        endfFormatsModule.endfDataLine(
                            fissWidths[line * 6:line * 6 + 6]))

    elif LRF == 2:  # 'Case C', most common in ENDF
        endf.append(
            endfFormatsModule.endfHeadLine(targetInfo['spin'], AP,
                                           self.forSelfShieldingOnly, 0, NLS,
                                           0))
        INT = gndToENDF6.gndToENDFInterpolationFlag(self.interpolation)
        for Lval in self.L_values:
            NJS = len(Lval.J_values)
            endf.append(
                endfFormatsModule.endfHeadLine(targetInfo['mass'], 0, Lval.L,
                                               0, NJS, 0))
            for Jval in Lval.J_values:
                NE = len(Jval.energyDependentWidths)
                useConstant = not NE
                if useConstant: NE = 2
                endf.append(
                    endfFormatsModule.endfHeadLine(Jval.J.value, 0, INT, 0,
                                                   6 * NE + 6, NE))
                endf.append(
                    endfFormatsModule.endfDataLine([
                        0, 0, Jval.competitiveDOF, Jval.neutronDOF,
                        Jval.gammaDOF, Jval.fissionDOF
                    ]))
                cws = Jval.constantWidths
                if useConstant:
                    # widths are all stored in 'constantWidths' instead. get energies from parent class
                    NE = 2
                    useConstant = True
                    eLow, eHigh = targetInfo['regionEnergyBounds']
                    for e in (eLow, eHigh):
                        endf.append(
                            endfFormatsModule.endfDataLine([
                                v(e),
                                v(cws.levelSpacing),
                                v(cws.competitiveWidth),
                                v(cws.neutronWidth),
                                v(cws.captureWidth),
                                v(cws.fissionWidthA)
                            ]))

                else:
                    table = [
                        Jval.energyDependentWidths.getColumn('energy',
                                                             units='eV')
                    ]
                    for attr in ('levelSpacing', 'competitiveWidth',
                                 'neutronWidth', 'captureWidth',
                                 'fissionWidthA'):
                        # find each attribute, in energy-dependent or constant width section
                        column = (Jval.energyDependentWidths.getColumn(
                            attr, units='eV') or [v(getattr(cws, attr))] * NE)
                        if not any(column): column = [0] * NE
                        table.append(column)
                    for row in zip(*table):
                        endf.append(endfFormatsModule.endfDataLine(row))
    return endf
示例#5
0
def toENDF6(self, flags, targetInfo, verbosityIndent=''):

    endf = []
    AP = getattr(self, 'scatteringRadius')
    if AP.isEnergyDependent():
        scatRadius = AP.form
        NR, NP = 1, len(scatRadius)
        endf.append(endfFormatsModule.endfHeadLine(0, 0, 0, 0, NR, NP))
        endf += endfFormatsModule.endfInterpolationList(
            (NP,
             gndToENDF6.gndToENDFInterpolationFlag(scatRadius.interpolation)))
        endf += endfFormatsModule.endfNdDataList(
            scatRadius.convertAxisToUnit(0, '10*fm'))
        AP = 0
    else:
        AP = self.scatteringRadius.getValueAs('10*fm')
    L_list = self.resonanceParameters.table.getColumn('L')
    NLS = len(set(L_list))
    LAD = getattr(self, 'computeAngularDistribution') or 0
    NLSC = getattr(self, 'LvaluesNeededForConvergence') or 0
    endf += [
        endfFormatsModule.endfHeadLine(targetInfo['spin'], AP, LAD, 0, NLS,
                                       NLSC)
    ]

    table = [
        self.resonanceParameters.table.getColumn('energy', units='eV'),
        self.resonanceParameters.table.getColumn('J')
    ]
    NE = len(table[0])
    if isinstance(self, (resonancesModule.SLBW, resonancesModule.MLBW)):
        attrList = ('totalWidth', 'neutronWidth', 'captureWidth',
                    'fissionWidthA')
    elif isinstance(self, resonancesModule.RM):
        attrList = ('neutronWidth', 'captureWidth', 'fissionWidthA',
                    'fissionWidthB')
    for attr in attrList:
        column = self.resonanceParameters.table.getColumn(attr, units='eV')
        if not column: column = [0] * NE
        table.append(column)
    CS = self.resonanceParameters.table.getColumn('channelSpin')
    if CS is not None:  # ENDF hack: J<0 -> use lower available channel spin
        targetSpin = targetInfo['spin']
        CS = [2 * (cs - targetSpin) for cs in CS]
        Js = [v[0] * v[1] for v in zip(table[1], CS)]
        table[1] = Js
    table = zip(*table)

    for L in set(L_list):
        APL = 0
        if self.scatteringRadius.isLdependent(
        ) and L in self.scatteringRadius.form.lvals:
            APL = self.scatteringRadius.getValueAs('10*fm', L=L)
        resonances = [table[i] for i in range(NE) if L_list[i] == L]
        NRS = len(resonances)
        endf.append(
            endfFormatsModule.endfHeadLine(targetInfo['mass'], APL, L, 0,
                                           6 * NRS, NRS))
        for row in resonances:
            endf.append(endfFormatsModule.endfDataLine(row))
    return endf