Esempio n. 1
0
File: snop.py Progetto: fimay/hedp
def snop_opacity(element, dens, tele, nu, full_output=False):
    """
    Parameters:
    -----------
     - element [str]: chemical element
     - dens [ndarray]: array of densities [g.cm⁻³]
     - dens [ndarray]: array of electron temperatures [eV]
     - nu [ndarray]: array of energies [eV]
          must be between [10 eV, 30 keV]
    Returns:
    --------
        opacity in cm⁻¹
    """

    db = matdb(element)
    s_args = dict(db.snop)
    s_args['arho'] = dens
    s_args['atele'] = np.fmax(tele, 1e-3) # just to be safe
    s_args['dsm'] = db.solid_dens
    for key, val in {'lte': False, 'lsff': True,
                    'lsbf': True, 'lsbb':True}.iteritems():
        s_args[key] = [val]*len(s_args['z'])
    s_args['fg'] =  np.array([np.min(nu)*1e-3, np.max(nu)*1e-3])
    s_args['nu'] = nu
    s_args['nout'] = 1
    d = run_snop(**s_args)
    if full_output:
        return d
    else:
        op = d['op_total'].copy()
        del d
        return op
Esempio n. 2
0
def xray_filter_transmission(nu, element=None, thickness=None, layers=None):
    """
    Computes filter transmission for solid foils

    Parameters:
    -----------
     - nu [ndarray] photon frequency array [eV]
     - element: [str] filter element, should be in matdb
     - thickness: [float] foil thickness [cm]
     - layers: [dict] dict of layers
         {'element1': thickness1, 'element2': thickness2, ...}
    """
    wrong_args = np.array(
        [arg is None for arg in [element, thickness, layers]])
    if wrong_args.all() or (~wrong_args).all():
        raise ValueError(
            'You should provide either element and thickness or layers dict!')
    if layers is None:
        op = cold_opacity(element,
                          hedp.matdb(element).solid_dens, nu, 'pickle')
        return np.exp(-op * thickness)
    else:
        Transmissions = [xray_filter_transmission(nu, el, thick)\
                for el, thick in layers.iteritems()]
        return np.prod(np.array(Transmissions), axis=0)
Esempio n. 3
0
def cold_opacity(element, dens=0.1, nu=None, hdf5_backend='pytables'):
    """
    Parameters:
    -----------
     - element [str]: chemical element
     - dens [float or ndarray]: array of densities [g.cm⁻³]
     - nu [ndarray]: array of energies [eV]
          must be between [10 eV, 30 keV]
     - hdf5_backend [str]: pytables or h5py [use because of
              a bug between pytables and yt]
    Returns:
    --------
        opacity in cm⁻¹
    """
    #hdf5_backend = 'h5py'
    if hdf5_backend == 'h5py':
        import h5py
        with h5py.File(HENKE_DATA_PATH+'.h5', 'r') as f:
            if not '/'+element in f:
                print("Warning: couldn't find cold opacity for {0} ; trying to download...".format(element))
                f.close()
                download_full(element)
                f = h5py.File(HENKE_DATA_PATH+'.h5', 'r')
            nu0 = f[element]['nu'][:]
            op0 = f[element]['op'][:]
            f.close()
    elif hdf5_backend == 'pytables':
        import tables
        with tables.open_file(HENKE_DATA_PATH+'.h5', 'a') as f:
            if not '/'+element in f:
                print("Warning: couldn't find cold opacity for {0} ; trying to download...".format(element))
                f.close()
                download_full(element)
                f = tables.openFile(HENKE_DATA_PATH+'.h5', 'r')

            nu0 = getattr(f.root, element).nu[:]
            op0 = getattr(f.root, element).op[:]
            f.close()
            sync_pickle_db()
    elif hdf5_backend == 'pickle':
        import pickle
        with open(HENKE_DATA_PATH+'.pickle', 'rb') as handle:
              mdict = pickle.load(handle)
              nu0, op0 = mdict[element]
    else:
        raise ValueError
    #print hdf5_backend

    if nu is not None:
        op = interp1d(nu0, op0)(nu)
    else:
        op = op0
    if isinstance(dens, numbers.Number):
        if dens < 0:
            dens = hedp.matdb(element).solid_dens
        return op*dens
    elif dens.ndim <= 1:
        return op*dens.reshape(-1,1)
    elif dens.ndim == 2:
        return dens[:,:,np.newaxis]*op[np.newaxis, np.newaxis, :]
Esempio n. 4
0
def download_full(element, dens=None):
    """
    Download files to database for given element
    """
    import tables
    db = hedp.matdb(element)
    op_tot = []
    nu_tot = []
    for nu in [(10,100),(100, 1000), (1000, 9000), (9000, 30000)]:
        if dens is None:
            if db.solid_dens:
                if db.solid_dens>0.1:
                    solid_dens = db.solid_dens
                else:
                    solid_dens = 1e4*db.solid_dens  # this is a gas
            else:
                solid_dens = 0.1
        else:
            solid_dens=dens
        nu_arr, op_arr =  download(db.formula, solid_dens, nu=nu)
        nu_tot.append(nu_arr)
        op_tot.append(op_arr)
    op = np.concatenate(op_tot)
    nu = np.concatenate(nu_tot)
    _, mask = np.unique(nu, return_index=True)

    data = {'op': op[mask], 'nu': nu[mask]}

    with tables.openFile(HENKE_DATA_PATH+'.h5', 'a') as f:
        atom = tables.Atom.from_dtype(data['op'].dtype)
        group = f.createGroup(f.root, element)
        for name, arr in data.iteritems():
            ds = f.createCArray(group, name, atom, arr.shape)
            ds[:] = arr
Esempio n. 5
0
File: xray.py Progetto: fimay/hedp
def Kalpha_profile(el, nu, sigma=100):
    """
    Computes the Kalpha line profile
    Parameters:
    -----------
     - nu [ndarray] photon frequency array [eV]
     - element: [str] filter element, should be in matdb
     - sigma: [float] gaussian with in eV

     Returns:
     --------

     - profile: [ndarray] Kα line profile as a normalized gaussian
    """
    nu0 = hedp.matdb(el).spect[u'Kα1'] #Heα1'] #Kα1']
    return 1./(sigma*(2*np.pi)**0.5)* np.exp(-(nu-nu0)**2/(2*sigma**2))
Esempio n. 6
0
def Kalpha_profile(el, nu, sigma=100):
    """
    Computes the Kalpha line profile
    Parameters:
    -----------
     - nu [ndarray] photon frequency array [eV]
     - element: [str] filter element, should be in matdb
     - sigma: [float] gaussian with in eV

     Returns:
     --------

     - profile: [ndarray] Kα line profile as a normalized gaussian
    """
    nu0 = hedp.matdb(el).spect[u'Kα1']  #Heα1'] #Kα1']
    return 1. / (sigma * (2 * np.pi)**0.5) * np.exp(-(nu - nu0)**2 /
                                                    (2 * sigma**2))
Esempio n. 7
0
File: xray.py Progetto: fimay/hedp
def xray_filter_transmission(nu, element=None, thickness=None,layers=None):
    """
    Computes filter transmission for solid foils

    Parameters:
    -----------
     - nu [ndarray] photon frequency array [eV]
     - element: [str] filter element, should be in matdb
     - thickness: [float] foil thickness [cm]
     - layers: [dict] dict of layers
         {'element1': thickness1, 'element2': thickness2, ...}
    """
    wrong_args = np.array([arg is None for arg in [element, thickness, layers]])
    if wrong_args.all() or (~wrong_args).all():
        raise ValueError('You should provide either element and thickness or layers dict!')
    if layers is None:
        op = cold_opacity(element, 
                        hedp.matdb(element).solid_dens,
                        nu, 'pickle')
        return np.exp(-op*thickness)
    else:
        Transmissions = [xray_filter_transmission(nu, el, thick)\
                for el, thick in layers.iteritems()]
        return np.prod(np.array(Transmissions), axis=0)
Esempio n. 8
0
def snop_opacity(element, dens, tele, nu, full_output=False):
    """
    Parameters:
    -----------
     - element [str]: chemical element
     - dens [ndarray]: array of densities [g.cm⁻³]
     - dens [ndarray]: array of electron temperatures [eV]
     - nu [ndarray]: array of energies [eV]
          must be between [10 eV, 30 keV]
    Returns:
    --------
        opacity in cm⁻¹
    """

    db = matdb(element)
    s_args = dict(db.snop)
    s_args['arho'] = dens
    s_args['atele'] = np.fmax(tele, 1e-3)  # just to be safe
    s_args['dsm'] = db.solid_dens
    for key, val in {
            'lte': False,
            'lsff': True,
            'lsbf': True,
            'lsbb': True
    }.iteritems():
        s_args[key] = [val] * len(s_args['z'])
    s_args['fg'] = np.array([np.min(nu) * 1e-3, np.max(nu) * 1e-3])
    s_args['nu'] = nu
    s_args['nout'] = 1
    d = run_snop(**s_args)
    if full_output:
        return d
    else:
        op = d['op_total'].copy()
        del d
        return op
Esempio n. 9
0
import opacplot2 as opp
from opacplot2.smooth import psedo_maxwell_loops, eint_offset, CheckEosConsistency,\
                insure_monotonicity, interp_isochores_1d
import numpy as np
import hedp
import pysnop
from hedp.eos import thomas_fermi_ionization

table_id = 7592
#table_id = 3720
#table_id = 2140
#mat = 'polystyrene'
mat = 'Fe'
filename = '{0}-ses-{1:4d}-v2-1.cn4'.format(mat.lower(), int(table_id))

mat_dict = hedp.matdb(mat)


SESAME_DIR = '../../sesame/'
print 'Loading SESAME db...'
eos_sesame = opp.OpgSesame(os.path.join(SESAME_DIR, "xsesame_ascii"), opp.OpgSesame.SINGLE, verbose=False)


eos_i  = eos_sesame.data[table_id]
eos_w = copy.deepcopy(eos_i)

eos_w['ioncc_pres'] =  psedo_maxwell_loops(eos_i['ioncc_dens'], eos_i['ioncc_temps'], eos_i['ioncc_pres'])
print 'ioncc_pres', 
eos_w['ioncc_pres'] = insure_monotonicity(eos_w['ioncc_dens'], eos_w['ioncc_temps'], eos_w['ioncc_pres'], axis='dens')
print 'ele_pres', 
eos_w['ele_pres'] = insure_monotonicity(eos_i['ele_dens'], eos_i['ele_temps'], eos_i['ele_pres'], axis='dens')
Esempio n. 10
0
import sys
import os.path
import copy

import opacplot2 as opp
from opacplot2.smooth import CheckEosConsistency
import numpy as np
import hedp
from hedp.eos import thomas_fermi_ionization

table_id = 2962
mat = 'Ti'
rho0 = 4.42
filename = '{0}-ses-{1:4d}-v2.cn4'.format(mat.lower(), int(table_id))

mat_dict = hedp.matdb(mat)


SESAME_DIR = '/mnt/EoS_tables/sesame/'
print 'Loading SESAME db...'
eos_sesame = opp.OpgSesame(os.path.join(SESAME_DIR, "xsesame_ascii"), opp.OpgSesame.SINGLE, verbose=False)


eos_i  = eos_sesame.data[table_id]
eos_w = copy.deepcopy(eos_i)


# merge Ion and Ele grids
eos_o = opp.adapt.EosMergeGrids(eos_w,
                filter_dens=lambda x: (x>0),
                filter_temps=lambda x: (x>0.5), # remove everything bellow 0.62 eV to avoid negative values