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