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
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)
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