Пример #1
0
def readSTable(line, mf7):
    line, dat = endfFileToGNDMisc.getTAB1(line, mf7)
    temps, betas = [dat['C1']], [dat['C2']]

    # energy interpolation should be 'flat':
    e_interp = dat['interpolationInfo']
    if len(e_interp) > 1:
        raise ValueError("only one interpolation region allowed for S table")
    e_interp = endfFileToGNDMisc.ENDFInterpolationToGND1d(e_interp[0][1])
    energies, data = map(list, zip(*dat['data']))

    # higher temperatures:
    ntemps = int(dat['L1'])
    t_interp = []
    for j in range(ntemps):
        line, dat = endfFileToGNDMisc.getList(line, mf7)
        temps.append(dat['C1'])
        betas.append(dat['C2'])
        data.extend(dat['data'])
        t_interp.append(endfFileToGNDMisc.ENDFInterpolationToGND1d(dat['L1']))

    # sanity checks: beta and temperature interpolation should be identical for all T
    if len(set(betas)) != 1:
        raise ValueError("inconsistent beta values encountered!")
    beta = betas[0]
    if len(set(t_interp)) > 1:
        raise ValueError(
            "inconsistent temperature interpolations encountered!")
    if t_interp: t_interp = t_interp[0]
    else: t_interp = None

    return line, temps, energies, beta, data, e_interp, t_interp
Пример #2
0
def readT_effective(line, mf7):
    line, dat = endfFileToGNDMisc.getTAB1(line, mf7)
    e_interp = dat['interpolationInfo']
    if len(e_interp) > 1:
        raise ValueError(
            "only one interpolation region allowed for T_eff data")
    e_interp = endfFileToGNDMisc.ENDFInterpolationToGND1d(e_interp[0][1])

    t_axes = axesModule.axes(labelsUnits={
        1: ('temperature', 'K'),
        0: ('t_effective', 'K')
    })
    return line, TS.T_effective(dat['data'],
                                axes=t_axes,
                                interpolation=e_interp)
Пример #3
0
def readMF7(mt, mf7):

    ZA, AWR, LTHR, LAT, LASYM, dum = endfFileToGNDMisc.sixFunkyFloatStringsToIntsAndFloats(
        mf7[0], range(2, 6))

    if LTHR == 1:  # coherent elastic scattering

        line, temps, energies, dummy, data, e_interp, t_interp = readSTable(
            1, mf7)
        temps, energies = map(valuesModule.values, (temps, energies))

        if e_interp != 'flat':
            raise ValueError("unexpected energy interpolation encountered")

        axes = axesModule.axes(rank=3)
        axes[2] = axesModule.grid('temperature',
                                  2,
                                  'K',
                                  axesModule.pointsGridToken,
                                  values=temps,
                                  interpolation=t_interp)
        axes[1] = axesModule.grid('energy_in',
                                  1,
                                  'eV',
                                  axesModule.pointsGridToken,
                                  values=energies,
                                  interpolation=e_interp)
        axes[0] = axesModule.axis('S_cumulative', 0, 'eV*b')
        array = arrayModule.full(shape=(len(temps), len(energies)), data=data)
        Stab = griddedModule.gridded2d(axes, array, label="eval")

        section = TS.coherentElastic(TS.S_table(Stab))

    elif LTHR == 2:  # incoherent elastic
        line, dat = endfFileToGNDMisc.getTAB1(1, mf7)
        SB = TS.characteristicCrossSection(float(dat['C1']), 'b')

        e_interp = dat['interpolationInfo']
        if len(e_interp) > 1:
            raise ValueError(
                "only one interpolation region allowed for T_eff data")
        e_interp = endfFileToGNDMisc.ENDFInterpolationToGND1d(e_interp[0][1])

        t_axes = axesModule.axes(labelsUnits={
            1: ('temperature', 'K'),
            0: ('DebyeWallerIntegral', '1/eV')
        })
        if len(dat['data']) == 2 and dat['data'][0] == dat['data'][1]:
            dat['data'] = dat['data'][0:1]
        DbW = TS.DebyeWaller(dat['data'], axes=t_axes, interpolation=e_interp)
        section = TS.incoherentElastic(SB, DbW)

    elif LTHR == 0:  # incoherent inelastic
        line, listy = endfFileToGNDMisc.getList(1, mf7)
        LLN, NI, NS, b_n = listy['L1'], listy['NPL'], listy['N2'], listy[
            'data']
        if LLN:
            raise NotImplementedError("LLN != 0 not yet handled!")

        # b_n array contains information about principal / secondary scattering atoms
        atoms = [
            TS.scatteringAtom(label="0",
                              numberPerMolecule=int(b_n[5]),
                              mass=TS.mass(b_n[2], 'amu'),
                              freeAtomCrossSection=TS.freeAtomCrossSection(
                                  b_n[0], 'b'),
                              e_critical=TS.e_critical(b_n[1], 'eV'),
                              e_max=TS.e_max(b_n[3], 'eV'))
        ]
        for idx in range(1, NS + 1):
            functionalForm = {
                0.0: 'SCT',
                1.0: 'free_gas',
                2.0: 'diffusive_motion'
            }[b_n[6 * idx]]
            atoms.append(
                TS.scatteringAtom(label=str(idx),
                                  numberPerMolecule=b_n[6 * idx + 5],
                                  mass=TS.mass(b_n[6 * idx + 2], 'amu'),
                                  freeAtomCrossSection=TS.freeAtomCrossSection(
                                      b_n[6 * idx + 1], 'b'),
                                  functionalForm=functionalForm))

        line, t2header = endfFileToGNDMisc.getTAB2Header(line, mf7)
        n_betas = int(t2header['NZ'])

        # read first beta:
        line, temps, alphas, beta, data, a_interp, t_interp = readSTable(
            line, mf7)
        betas = [beta]

        # read in remaining betas:
        for idx in range(n_betas - 1):
            line, temps_, alphas_, beta, data_, a_interp_, t_interp_ = readSTable(
                line, mf7)
            if (temps_ != temps or alphas_ != alphas or a_interp_ != a_interp
                    or t_interp_ != t_interp):
                raise ValueError("inconsistent values!")
            betas.append(beta)
            data.extend(data_)

        temps, betas, alphas = map(valuesModule.values, (temps, betas, alphas))

        axes = axesModule.axes(rank=4)
        axes[3] = axesModule.grid('temperature',
                                  3,
                                  'K',
                                  axesModule.pointsGridToken,
                                  values=temps,
                                  interpolation=t_interp)
        axes[2] = axesModule.grid(
            'beta',
            2,
            '',
            axesModule.pointsGridToken,
            values=betas,
            interpolation=standardsModule.interpolation.flatToken)
        axes[1] = axesModule.grid('alpha',
                                  1,
                                  '',
                                  axesModule.pointsGridToken,
                                  values=alphas,
                                  interpolation=a_interp)
        axes[0] = axesModule.axis('S_alpha_beta', 0, 'eV*b')

        arrayShape_orig = (len(betas), len(temps), len(alphas))
        data = numpy.array(data).reshape(arrayShape_orig)
        # ENDF data are stored as 'beta,T,alpha'. Switch order to 'T,beta,alpha':
        data = numpy.transpose(data, axes=(1, 0, 2))
        arrayShape_new = (len(temps), len(betas), len(alphas))
        array = arrayModule.full(shape=arrayShape_new, data=data.flatten())
        Stab = griddedModule.gridded3d(axes, array, label="eval")

        S_tables = TS.S_alpha_beta(Stab)

        # last read T_eff tables. There must be at least one (for the principal scattering atom), plus more for
        # any other atoms that specify the short-collision-time approximation:
        line, t_eff = readT_effective(line, mf7)
        atoms[0].T_effective = t_eff
        for atom in atoms[1:]:
            if atom.functionalForm == 'SCT':
                line, t_eff = readT_effective(line, mf7)
                atom.T_effective = t_eff

        section = TS.incoherentInelastic(S_tables,
                                         calculatedAtThermal=LAT,
                                         asymmetric=LASYM,
                                         atoms=atoms)

    if line != len(mf7):
        raise ValueError("Trailing data left in MT%i MF7!" % mt)
    return LTHR, section