def interp( self, nH, T ):
nH = np.array( nH )
T = np.array( T )
if nH.size != T.size:
raise ValueError(' owls_ion_tables: array size mismatch !!! ')
# field discovery will have nH.size == 1 and T.size == 1
# in that case we simply return 1.0
if nH.size == 1 and T.size == 1:
ionfrac = 1.0
return ionfrac
# find inH and fnH
#-----------------------------------------------------
x_nH = ( nH - self.nH[0] ) / self.DELTA_nH
x_nH_clip = np.clip( x_nH, 0.0, self.nH.size-1.001 )
fnH,inH = np.modf( x_nH_clip )
inH = inH.astype( np.int32 )
# find iT and fT
#-----------------------------------------------------
x_T = ( T - self.T[0] ) / self.DELTA_T
x_T_clip = np.clip( x_T, 0.0, self.T.size-1.001 )
fT,iT = np.modf( x_T_clip )
iT = iT.astype( np.int32 )
# short names for previously calculated iz and fz
#-----------------------------------------------------
iz = self.iz
fz = self.fz
# calculate interpolated value
# use tri-linear interpolation on the log values
#-----------------------------------------------------
ionfrac = self.ionbal[inH, iT, iz ] * (1-fnH) * (1-fT) * (1-fz) + \
self.ionbal[inH+1, iT, iz ] * (fnH) * (1-fT) * (1-fz) + \
self.ionbal[inH, iT+1, iz ] * (1-fnH) * (fT) * (1-fz) + \
self.ionbal[inH, iT, iz+1] * (1-fnH) * (1-fT) * (fz) + \
self.ionbal[inH+1, iT, iz+1] * (fnH) * (1-fT) * (fz) + \
self.ionbal[inH, iT+1, iz+1] * (1-fnH) * (fT) * (fz) + \
self.ionbal[inH+1, iT+1, iz] * (fnH) * (fT) * (1-fz) + \
self.ionbal[inH+1, iT+1, iz+1] * (fnH) * (fT) * (fz)
return 10**ionfrac
评论列表
文章目录