Ejemplo n.º 1
0
def geneva_read(fname, Zstr='014', tar=None):
    '''
    Reads Geneva model file

    Usage:
    age, Mstar, logL, logTeff, Hfrac, Hefrac, oblat, w, Rpole = 
        geneva_read(fname, tar=None)

    where tar is the read tar(.gz) opened file.
    '''
    # read tar file
    if tar is None:
        dir0 = '{0}/refs/geneva_models/'.format(_hdtpath())
        fmod = 'Z{:}.tar.gz'.format(Zstr)
        tar = _tarfile.open(dir0 + fmod, 'r:gz')
    else:
        Zstr = tar.getnames()[0][7:10]

    m = tar.getmember(fname)
    fname = tar.extractfile(m)

    # (age, M, logL, logTeff, Hfrac, Hefrac, oblat, w, Rpole)
    cols = (1, 2, 3, 4, 21, 22, 34, 39, 44)
    t = _np.loadtxt(fname, usecols=cols, skiprows=2)
    age = t[:, 0]
    Mstar = t[:, 1]
    logL = t[:, 2]
    logTeff = t[:, 3]
    Hfrac = t[:, 4]
    Hefrac = t[:, 5]
    oblat = 1. / t[:, 6]
    w = t[:, 7]
    Rpole = t[:, 8]

    return age, Mstar, logL, logTeff, Hfrac, Hefrac, oblat, w, Rpole
Ejemplo n.º 2
0
def geneva_read(fname, Zstr='014', tar=None):
    '''
    Reads Geneva model file

    Usage:
    age, Mstar, logL, logTeff, Hfrac, Hefrac, oblat, w, Rpole = geneva_read(fname, tar=None)

    where tar is the read tar(.gz) opened file.
    '''
    # read tar file
    if tar == None:
        dir0 = '{0}/refs/geneva_models/'.format(_hdtpath())
        fmod = 'Z{:}.tar.gz'.format(Zstr)
        tar = _tarfile.open(dir0 + fmod, 'r:gz')
    else:
        Zstr = tar.getnames()[0][7:10]

    m = tar.getmember(fname)
    fname = tar.extractfile(m)

    # (age, M, logL, logTeff, Hfrac, Hefrac, oblat, w, Rpole)
    cols = (1, 2, 3, 4, 21, 22, 34, 39, 44)
    t = _np.loadtxt(fname, usecols=cols, skiprows=2)
    age = t[:, 0]
    Mstar = t[:, 1]
    logL = t[:, 2]
    logTeff = t[:, 3]
    Hfrac = t[:, 4]
    Hefrac = t[:, 5]
    oblat = 1./t[:, 6]
    w = t[:, 7]
    Rpole = t[:, 8]

    return age, Mstar, logL, logTeff, Hfrac, Hefrac, oblat, w, Rpole
Ejemplo n.º 3
0
def geneva_interp(Mstar, oblat, t, Zstr='014', tar=None, silent=True):
    '''
    Interpolates Geneva stellar models.

    Usage:
    Rpole, logL, age = geneva_interp(Mstar, oblat, t, tar=None, silent=True)

    where t is given in tMS, and tar is the open tar file. The chosen
    metallicity is according to the input tar file. If tar=None, the
    code will take Zstr='014' by default.
    '''
    # oblat to Omega/Omega_c
    w = oblat2w(oblat)

    # grid
    if Mstar <= 20.:
        Mlist = _np.array([1.7, 2., 2.5, 3., 4., 5., 7., 9., 12., 15., 20.])
    else:
        Mlist = _np.array([20., 25., 32., 40., 60., 85., 120.])

    # read tar file
    if tar == None:
        dir0 = '{0}/refs/geneva_models/'.format(_hdtpath())
        fmod = 'Z{:}.tar.gz'.format(Zstr)
        tar = _tarfile.open(dir0 + fmod, 'r:gz')
    else:
        Zstr = tar.getnames()[0][7:10]

    # interpolation
    if (Mstar >= Mlist.min()) * (Mstar <= Mlist.max()):
        if (Mstar == Mlist).any():
            Rpole, logL, age = geneva_closest(Mstar, oblat, t, tar=tar, Zstr=Zstr, silent=silent)
        else:
            # nearest value at left
            Mleft = Mlist[Mlist < Mstar]
            Mleft = Mleft[_np.abs(Mleft - Mstar).argmin()]
            iMleft = _np.where(Mlist == Mleft)[0][0]
            Rpolel, logLl, agel = geneva_closest(Mlist[iMleft], oblat, t, tar=tar, Zstr=Zstr, silent=silent)
            # nearest value at right
            Mright = Mlist[Mlist > Mstar]
            Mright = Mright[_np.abs(Mright - Mstar).argmin()]
            iMright = _np.where(Mlist == Mright)[0][0]
            Rpoler, logLr, ager = geneva_closest(Mlist[iMright], oblat, t, tar=tar, Zstr=Zstr, silent=silent)
            # interpolate between masses
            weight = _np.array([Mright-Mstar, Mstar-Mleft]) / (Mright-Mleft)
            Rpole = weight.dot(_np.array([Rpolel, Rpoler]))
            logL = weight.dot(_np.array([logLl, logLr]))
            age = weight.dot(_np.array([agel, ager]))
    else:
        if not silent:
            print('[geneva_interp] Warning: Mstar out of available range, taking the closest value.')
        Rpole, logL, age = geneva_closest(Mstar, oblat, t, tar=tar, Zstr=Zstr, silent=silent)

    return Rpole, logL, age
Ejemplo n.º 4
0
def sigma4b_cranmer(M, w):
    '''Computes sigma4b defined in Cranmer 1996 (Eq. 4.22)
    
    Usage:
    s4b = sigma4b_cranmer(M, w)

    where w=Omega/Omega_c, M=stellar mass in Msun (from 1.7 to 20.)
    '''
    dir0 = '{0}/refs/tables/'.format(_hdtpath())
    tab = _np.load(dir0 + 'sigma4b_cranmer.npz')
    s4b = _griddata(tab['parlist'], tab['sigma4b'], _np.array([M, w]), method='linear')[0]
    return s4b
Ejemplo n.º 5
0
def sigma4b_cranmer(M, w):
    '''Computes sigma4b defined in Cranmer 1996 (Eq. 4.22)

    Usage:
    s4b = sigma4b_cranmer(M, w)

    where w=Omega/Omega_c, M=stellar mass in Msun (from 1.7 to 20.)
    '''
    dir0 = '{0}/refs/tables/'.format(_hdtpath())
    tab = _np.load(dir0 + 'sigma4b_cranmer.npz')
    s4b = _griddata(tab['parlist'],
                    tab['sigma4b'],
                    _np.array([M, w]),
                    method='linear')[0]
    return s4b
Ejemplo n.º 6
0
def geneva_pre_computed(Zstr='014', silent=False):
    '''
    Create geneva pre-computed grid
    '''
    dir0 = '{0}/refs/geneva_models/'.format(_hdtpath())

    if _os.path.exists(dir0 + 'geneva_interp_Z{:}.npz'.format(Zstr)):
        data = _np.load(dir0 + 'geneva_interp_Z{:}.npz'.format(Zstr))
    else:
        # par grid
        Mstar_arr = _np.array(
            [1.7, 2., 2.5, 3., 4., 5., 7., 9., 12., 15., 20.])
        oblat_arr = _np.linspace(1., 1.5, 6)
        t_arr = _np.hstack(
            [_np.linspace(0., .9, 10),
             _np.linspace(1., 1.1, 21)])

        Rpole_grid = _np.zeros([len(Mstar_arr), len(oblat_arr), len(t_arr)])
        logL_grid = _np.zeros([len(Mstar_arr), len(oblat_arr), len(t_arr)])
        age_grid = _np.zeros([len(Mstar_arr), len(oblat_arr), len(t_arr)])

        # read tar file
        tar = _tarfile.open(dir0 + 'Z{:}.tar.gz'.format(Zstr), 'r:gz')

        for iM, Mstar in enumerate(Mstar_arr):
            for iob, oblat in enumerate(oblat_arr):
                for it, t in enumerate(t_arr):
                    if not silent:
                        print(Mstar, oblat, t)
                    Rp, lL, age = geneva_interp(Mstar,
                                                oblat,
                                                t,
                                                tar=tar,
                                                Zstr=Zstr,
                                                silent=silent)
                    Rpole_grid[iM, iob, it] = Rp
                    logL_grid[iM, iob, it] = lL
                    age_grid[iM, iob, it] = age
        _np.savez(dir0 + 'geneva_interp_Z{:}'.format(Zstr),
                  Mstar_arr=Mstar_arr,
                  oblat_arr=oblat_arr,
                  t_arr=t_arr,
                  Rpole_grid=Rpole_grid,
                  logL_grid=logL_grid,
                  age_grid=age_grid)

    # high M
    if _os.path.exists(dir0 + 'geneva_interp_Z{:}_highM.npz'.format(Zstr)):
        data = _np.load(dir0 + 'geneva_interp_Z{:}_highM.npz'.format(Zstr))
        return

    # par grid
    Mstar_arr = _np.array([20., 25., 32., 40., 60., 85., 120.])
    oblat_arr = _np.linspace(1., 1.05633802817, 2)
    t_arr = _np.hstack([_np.linspace(0., .9, 10), _np.linspace(1., 1.1, 21)])

    Rpole_grid = _np.zeros([len(Mstar_arr), len(oblat_arr), len(t_arr)])
    logL_grid = _np.zeros([len(Mstar_arr), len(oblat_arr), len(t_arr)])
    age_grid = _np.zeros([len(Mstar_arr), len(oblat_arr), len(t_arr)])

    # read tar file
    tar = _tarfile.open(dir0 + 'Z{:}.tar.gz'.format(Zstr), 'r:gz')

    for iM, Mstar in enumerate(Mstar_arr):
        for iob, oblat in enumerate(oblat_arr):
            for it, t in enumerate(t_arr):
                if not silent:
                    print(Mstar, oblat, t)
                Rp, lL, age = geneva_interp(Mstar,
                                            oblat,
                                            t,
                                            tar=tar,
                                            Zstr=Zstr,
                                            silent=silent)
                Rpole_grid[iM, iob, it] = Rp
                logL_grid[iM, iob, it] = lL
                age_grid[iM, iob, it] = age
    _np.savez(dir0 + 'geneva_interp_Z{:}_highM'.format(Zstr),
              Mstar_arr=Mstar_arr,
              oblat_arr=oblat_arr,
              t_arr=t_arr,
              Rpole_grid=Rpole_grid,
              logL_grid=logL_grid,
              age_grid=age_grid)
    return
Ejemplo n.º 7
0
def geneva_interp_fast(Mstar, oblat, t, Zstr='014', silent=True):
    '''
    Interpolates Geneva stellar models, from grid of
    pre-computed interpolations.

    Usage:
    Rpole, logL, age = geneva_interp_fast(Mstar, oblat, t, Zstr='014')

    where t is given in tMS, and tar is the open tar file. For now, only
    Zstr='014' is available.
    '''
    # read grid
    dir0 = '{0}/refs/geneva_models/'.format(_hdtpath())
    if Mstar <= 20.:
        fname = 'geneva_interp_Z{:}.npz'.format(Zstr)
    else:
        fname = 'geneva_interp_Z{:}_highM.npz'.format(Zstr)
    data = _np.load(dir0 + fname)
    Mstar_arr = data['Mstar_arr']
    oblat_arr = data['oblat_arr']
    t_arr = data['t_arr']
    Rpole_grid = data['Rpole_grid']
    logL_grid = data['logL_grid']
    age_grid = data['age_grid']

    # build grid of parameters
    par_grid = []
    for M in Mstar_arr:
        for ob in oblat_arr:
            for tt in t_arr:
                par_grid.append([M, ob, tt])
    par_grid = _np.array(par_grid)

    # set input/output parameters
    par = _np.array([Mstar, oblat, t])

    # set ranges
    ranges = _np.array([[par_grid[:, i].min(), par_grid[:, i].max()]
                        for i in range(len(par))])

    # find neighbours
    keep, out, inside_ranges, par, par_grid = _phc.find_neighbours(
        par, par_grid, ranges)

    # interpolation method
    if inside_ranges:
        interp_method = 'linear'
    else:
        if not silent:
            print('[geneva_interp_fast] Warning: parameters out of available '
                  'range, taking closest model')
        interp_method = 'nearest'

    if len(keep[keep]) == 1:
        # coincidence
        Rpole = Rpole_grid.flatten()[keep][0]
        logL = logL_grid.flatten()[keep][0]
        age = age_grid.flatten()[keep][0]
    else:
        # interpolation
        Rpole = _griddata(par_grid[keep],
                          Rpole_grid.flatten()[keep],
                          par,
                          method=interp_method,
                          rescale=True)[0]
        logL = _griddata(par_grid[keep],
                         logL_grid.flatten()[keep],
                         par,
                         method=interp_method,
                         rescale=True)[0]
        age = _griddata(par_grid[keep],
                        age_grid.flatten()[keep],
                        par,
                        method=interp_method,
                        rescale=True)[0]

    return Rpole, logL, age
Ejemplo n.º 8
0
def geneva_interp(Mstar, oblat, t, Zstr='014', tar=None, silent=True):
    '''
    Interpolates Geneva stellar models.

    Usage:
    Rpole, logL, age = geneva_interp(Mstar, oblat, t, tar=None, silent=True)

    where t is given in tMS, and tar is the open tar file. The chosen
    metallicity is according to the input tar file. If tar=None, the
    code will take Zstr='014' by default.
    '''
    # oblat to Omega/Omega_c
    # w = oblat2w(oblat)

    # grid
    if Mstar <= 20.:
        Mlist = _np.array([1.7, 2., 2.5, 3., 4., 5., 7., 9., 12., 15., 20.])
    else:
        Mlist = _np.array([20., 25., 32., 40., 60., 85., 120.])

    # read tar file
    if tar is None:
        dir0 = '{0}/refs/geneva_models/'.format(_hdtpath())
        fmod = 'Z{:}.tar.gz'.format(Zstr)
        tar = _tarfile.open(dir0 + fmod, 'r:gz')
    else:
        Zstr = tar.getnames()[0][7:10]

    # interpolation
    if (Mstar >= Mlist.min()) * (Mstar <= Mlist.max()):
        if (Mstar == Mlist).any():
            Rpole, logL, age = geneva_closest(Mstar,
                                              oblat,
                                              t,
                                              tar=tar,
                                              Zstr=Zstr,
                                              silent=silent)
        else:
            # nearest value at left
            Mleft = Mlist[Mlist < Mstar]
            Mleft = Mleft[_np.abs(Mleft - Mstar).argmin()]
            iMleft = _np.where(Mlist == Mleft)[0][0]
            Rpolel, logLl, agel = geneva_closest(Mlist[iMleft],
                                                 oblat,
                                                 t,
                                                 tar=tar,
                                                 Zstr=Zstr,
                                                 silent=silent)
            # nearest value at right
            Mright = Mlist[Mlist > Mstar]
            Mright = Mright[_np.abs(Mright - Mstar).argmin()]
            iMright = _np.where(Mlist == Mright)[0][0]
            Rpoler, logLr, ager = geneva_closest(Mlist[iMright],
                                                 oblat,
                                                 t,
                                                 tar=tar,
                                                 Zstr=Zstr,
                                                 silent=silent)
            # interpolate between masses
            weight = _np.array([Mright - Mstar, Mstar - Mleft
                                ]) / (Mright - Mleft)
            Rpole = weight.dot(_np.array([Rpolel, Rpoler]))
            logL = weight.dot(_np.array([logLl, logLr]))
            age = weight.dot(_np.array([agel, ager]))
    else:
        if not silent:
            print('[geneva_interp] Warning: Mstar out of available range, '
                  'taking the closest value.')
        Rpole, logL, age = geneva_closest(Mstar,
                                          oblat,
                                          t,
                                          tar=tar,
                                          Zstr=Zstr,
                                          silent=silent)

    return Rpole, logL, age
Ejemplo n.º 9
0
def geneva_closest(Mstar, oblat, t, Zstr='014', tar=None, silent=True):
    '''
    Interpolate models between rotation rates, at closest Mstar.

    Usage:
    Rpole, logL = geneva_closest(Mstar, oblat, t, Zstr='014', tar=None, 
        silent=True)

    where t is given in tMS, and tar is the open tar file. The chosen
    metallicity is according to the input tar file. If tar=None, the
    code will take Zstr='014' by default.
    '''
    # oblat to Omega/Omega_c
    w = oblat2w(oblat)

    # grid
    if Mstar <= 20.:
        Mlist = _np.array([1.7, 2., 2.5, 3., 4., 5., 7., 9., 12., 15., 20.])
        Mstr = _np.array([
            '1p700', '2p000', '2p500', '3p000', '4p000', '5p000', '7p000',
            '9p000', '12p00', '15p00', '20p00'
        ])
        Vlist = _np.array([0., 0.1, 0.3, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95])
        Vstr = _np.array([
            '00000', '10000', '30000', '50000', '60000', '70000', '80000',
            '90000', '95000'
        ])
    else:
        Mlist = _np.array([20., 25., 32., 40., 60., 85., 120.])
        Mstr = _np.array(
            ['20p00', '25p00', '32p00', '40p00', '60p00', '85p00', '120p0'])
        Vlist = _np.array([0., 0.568])
        Vstr = _np.array(['00000', '56800'])

    # read tar file
    if tar is None:
        dir0 = '{0}/refs/geneva_models/'.format(_hdtpath())
        fmod = 'Z{:}.tar.gz'.format(Zstr)
        tar = _tarfile.open(dir0 + fmod, 'r:gz')
    else:
        Zstr = tar.getnames()[0][7:10]

    # find closest Mstar
    iM = _np.where(_np.abs(Mstar - Mlist) == _np.min(_np.abs(Mstar -
                                                             Mlist)))[0][0]

    # find values at selected age
    nw = len(Vlist)
    wlist = _np.zeros(nw)
    Rplist = _np.zeros(nw)
    logLlist = _np.zeros(nw)
    agelist = _np.zeros(nw)
    for iw, vs in enumerate(Vstr):
        fname = 'M{:}Z{:}00V{:}.dat'.format(Mstr[iM], Zstr, vs)
        age1, _, logL1, _, Hfrac1, _, _, w1, Rpole1 = geneva_read(fname,
                                                                  tar=tar)
        t1 = age1 / age1[_np.where(Hfrac1 == 0.)[0][0] - 1]
        if t > t1.max() and not silent:
            print('[geneva_closest] Warning: requested age not available, '
                  'taking t/tMS={:.2f} instead of t/tMS={:.2f}.'.format(
                      t1.max(), t))
        it = _np.where(_np.abs(t - t1) == _np.min(_np.abs(t - t1)))[0][0]
        wlist[iw] = w1[it]
        Rplist[iw] = Rpole1[it]
        logLlist[iw] = logL1[it]
        agelist[iw] = age1[it] / 1e6
    # interpolate between rotation rates
    if w <= wlist.max():
        Rpole = _griddata(wlist, Rplist, [w], method='linear')[0]
        logL = _griddata(wlist, logLlist, [w], method='linear')[0]
        age = _griddata(wlist, agelist, [w], method='linear')[0]
    else:
        if not silent:
            print('[geneva_closest] Warning: no model rotating this fast at '
                  'this age, taking closest model instead. (omega={:.2f} '
                  'instead of omega={:.2f})'.format(wlist.max(), w))
        iwmax = _np.where(wlist == wlist.max())[0][0]
        Rpole = Rplist[iwmax]
        logL = logLlist[iwmax]
        age = agelist[iwmax]

    return Rpole, logL, age
Ejemplo n.º 10
0
def geneva_pre_computed(Zstr='014', silent=False):
    '''
    Create geneva pre-computed grid
    '''
    dir0 = '{0}/refs/geneva_models/'.format(_hdtpath())

    try:
        data = _np.load(dir0 + 'geneva_interp_Z{:}.npz'.format(Zstr))
    except:
        # par grid
        Mstar_arr = _np.array([1.7, 2., 2.5, 3., 4., 5., 7., 9., 12., 15., 20.])
        oblat_arr = _np.linspace(1., 1.5, 6)
        t_arr = _np.hstack([_np.linspace(0., .9, 10), _np.linspace(1., 1.1, 21)])
        
        Rpole_grid = _np.zeros([len(Mstar_arr), len(oblat_arr), len(t_arr)])
        logL_grid = _np.zeros([len(Mstar_arr), len(oblat_arr), len(t_arr)])
        age_grid = _np.zeros([len(Mstar_arr), len(oblat_arr), len(t_arr)])
    
        # read tar file
        tar = _tarfile.open(dir0 + 'Z{:}.tar.gz'.format(Zstr), 'r:gz')
    
        for iM, Mstar in enumerate(Mstar_arr):
            for iob, oblat in enumerate(oblat_arr):
                for it, t in enumerate(t_arr):
                    if not silent:
                        print(Mstar, oblat, t)
                    Rp, lL, age = geneva_interp(Mstar, oblat, t, tar=tar, Zstr=Zstr, silent=silent)
                    Rpole_grid[iM, iob, it] = Rp
                    logL_grid[iM, iob, it] = lL
                    age_grid[iM, iob, it] = age
        _np.savez(dir0 + 'geneva_interp_Z{:}'.format(Zstr), Mstar_arr=Mstar_arr, oblat_arr=oblat_arr, t_arr=t_arr, \
                  Rpole_grid=Rpole_grid, logL_grid=logL_grid, age_grid=age_grid)

    # high M    
    try:
        data = _np.load(dir0 + 'geneva_interp_Z{:}_highM.npz'.format(Zstr))
    except:
        # par grid
        Mstar_arr = _np.array([20., 25., 32., 40., 60., 85., 120.])
        oblat_arr = _np.linspace(1., 1.05633802817, 2)
        t_arr = _np.hstack([_np.linspace(0., .9, 10), _np.linspace(1., 1.1, 21)])
        
        Rpole_grid = _np.zeros([len(Mstar_arr), len(oblat_arr), len(t_arr)])
        logL_grid = _np.zeros([len(Mstar_arr), len(oblat_arr), len(t_arr)])
        age_grid = _np.zeros([len(Mstar_arr), len(oblat_arr), len(t_arr)])
    
        # read tar file
        tar = _tarfile.open(dir0 + 'Z{:}.tar.gz'.format(Zstr), 'r:gz')
    
        for iM, Mstar in enumerate(Mstar_arr):
            for iob, oblat in enumerate(oblat_arr):
                for it, t in enumerate(t_arr):
                    if not silent:
                        print(Mstar, oblat, t)
                    Rp, lL, age = geneva_interp(Mstar, oblat, t, tar=tar, Zstr=Zstr, silent=silent)
                    Rpole_grid[iM, iob, it] = Rp
                    logL_grid[iM, iob, it] = lL
                    age_grid[iM, iob, it] = age
        _np.savez(dir0 + 'geneva_interp_Z{:}_highM'.format(Zstr), Mstar_arr=Mstar_arr, oblat_arr=oblat_arr, t_arr=t_arr, \
                  Rpole_grid=Rpole_grid, logL_grid=logL_grid, age_grid=age_grid)

    return
Ejemplo n.º 11
0
def geneva_interp_fast(Mstar, oblat, t, Zstr='014', silent=True):
    '''
    Interpolates Geneva stellar models, from grid of
    pre-computed interpolations.

    Usage:
    Rpole, logL, age = geneva_interp_fast(Mstar, oblat, t, Zstr='014')

    where t is given in tMS, and tar is the open tar file. For now, only
    Zstr='014' is available.
    '''
    # read grid
    dir0 = '{0}/refs/geneva_models/'.format(_hdtpath())
    if Mstar <= 20.:
        fname = 'geneva_interp_Z{:}.npz'.format(Zstr)
    else:
        fname = 'geneva_interp_Z{:}_highM.npz'.format(Zstr)
    data = _np.load(dir0 + fname)
    Mstar_arr = data['Mstar_arr']
    oblat_arr =data['oblat_arr']
    t_arr = data['t_arr']
    Rpole_grid = data['Rpole_grid']
    logL_grid = data['logL_grid']
    age_grid = data['age_grid']

    # build grid of parameters
    par_grid = []
    for M in Mstar_arr:
        for ob in oblat_arr:
            for tt in t_arr:
                par_grid.append([M, ob, tt])
    par_grid = _np.array(par_grid)

    # set input/output parameters
    par = _np.array([Mstar, oblat, t])

    # set ranges
    ranges = _np.array([[par_grid[:, i].min(), par_grid[:, i].max()] for i in range(len(par))])

    # find neighbours
    keep, out, inside_ranges, par, par_grid = _phc.find_neighbours(par, par_grid, ranges)

    # interpolation method
    if inside_ranges:
        interp_method = 'linear'
    else:
        if not silent:
            print('[geneva_interp_fast] Warning: parameters out of available range, taking closest model')
        interp_method = 'nearest'

    if len(keep[keep]) == 1:
        # coincidence
        Rpole = Rpole_grid.flatten()[keep][0]
        logL = logL_grid.flatten()[keep][0]
        age = age_grid.flatten()[keep][0]
    else:
        # interpolation
        Rpole = _griddata(par_grid[keep], Rpole_grid.flatten()[keep], par, method=interp_method, rescale=True)[0]
        logL = _griddata(par_grid[keep], logL_grid.flatten()[keep], par, method=interp_method, rescale=True)[0]
        age = _griddata(par_grid[keep], age_grid.flatten()[keep], par, method=interp_method, rescale=True)[0]

    return Rpole, logL, age
Ejemplo n.º 12
0
def geneva_closest(Mstar, oblat, t, Zstr='014', tar=None, silent=True):
    '''
    Interpolate models between rotation rates, at closest Mstar.

    Usage:
    Rpole, logL = geneva_closest(Mstar, oblat, t, Zstr='014', tar=None, silent=True)

    where t is given in tMS, and tar is the open tar file. The chosen
    metallicity is according to the input tar file. If tar=None, the
    code will take Zstr='014' by default.
    '''
    # oblat to Omega/Omega_c
    w = oblat2w(oblat)

    # grid
    if Mstar <= 20.:
        Mlist = _np.array([1.7, 2., 2.5, 3., 4., 5., 7., 9., 12., 15., 20.])
        Mstr = _np.array(['1p700', '2p000', '2p500', '3p000', '4p000', '5p000', \
                         '7p000', '9p000', '12p00', '15p00', '20p00'])
        Vlist = _np.array([0., 0.1, 0.3, 0.5, 0.6, 0.7, 0.8, 0.9, 0.95])
        Vstr = _np.array(['00000', '10000', '30000', '50000', '60000', '70000', \
                         '80000', '90000', '95000'])
    else:
        Mlist = _np.array([20., 25., 32., 40., 60., 85., 120.])
        Mstr = _np.array(['20p00', '25p00', '32p00', '40p00', '60p00', '85p00', \
                         '120p0'])
        Vlist = _np.array([0., 0.568])
        Vstr = _np.array(['00000', '56800'])

    # read tar file
    if tar == None:
        dir0 = '{0}/refs/geneva_models/'.format(_hdtpath())
        fmod = 'Z{:}.tar.gz'.format(Zstr)
        tar = _tarfile.open(dir0 + fmod, 'r:gz')
    else:
        Zstr = tar.getnames()[0][7:10]

    # find closest Mstar
    iM = _np.where(_np.abs(Mstar-Mlist) == _np.min(_np.abs(Mstar-Mlist)))[0][0]

    # find values at selected age
    nw = len(Vlist)
    wlist = _np.zeros(nw)
    Rplist = _np.zeros(nw)
    logLlist = _np.zeros(nw)
    agelist = _np.zeros(nw)
    for iw, vs in enumerate(Vstr):
        fname = 'M{:}Z{:}00V{:}.dat'.format(Mstr[iM], Zstr, vs)
        age1, _, logL1, _, Hfrac1, _, _, w1, Rpole1 = geneva_read(fname, tar=tar)
        t1 = age1 / age1[_np.where(Hfrac1 == 0.)[0][0]-1]
        if t > t1.max() and not silent:
            print('[geneva_closest] Warning: requested age not available, taking t/tMS={:.2f} instead of t/tMS={:.2f}.'.format(t1.max(),t))
        it = _np.where(_np.abs(t-t1) == _np.min(_np.abs(t-t1)))[0][0]
        wlist[iw] = w1[it]
        Rplist[iw] = Rpole1[it]
        logLlist[iw] = logL1[it]
        agelist[iw] = age1[it] / 1e6
    # interpolate between rotation rates
    if w <= wlist.max():
        Rpole = _griddata(wlist, Rplist, [w], method='linear')[0]
        logL = _griddata(wlist, logLlist, [w], method='linear')[0]
        age = _griddata(wlist, agelist, [w], method='linear')[0]
    else:
        if not silent:
            print('[geneva_closest] Warning: no model rotating this fast at this age, taking closest model instead. (omega={:.2f} instead of omega={:.2f})'.format(wlist.max(),w))
        iwmax = _np.where(wlist == wlist.max())[0][0]
        Rpole = Rplist[iwmax]
        logL = logLlist[iwmax]
        age = agelist[iwmax]

    return Rpole, logL, age