Source code for aurora.interp

''' This script contains a number of functions used for interpolation of kinetic profiles and D,V profiles in STRAHL.
Refer to the STRAHL manual for details.
'''
from scipy.interpolate import interp1d
import numpy as np


[docs]def funct(params,rLCFS,r): ''' Function 'funct' in STRAHL manual The "params" input is broken down into 6 arguments: y0 is core offset y1 is edge offset y2 (>y0, >y1) sets the gaussian amplification p0 sets the width of the inner gaussian P1 sets the width of the outer gaussian p2 sets the location of the inner and outer peaks ''' params = np.reshape(params,(-1,6)) out = [] for param in params: y0,y1,y2,p0,p1,p2 = param r1 = p2*rLCFS rin = r[r<=r1] rout = r[r>r1] yin = y0 + (y2-y0) * np.exp(np.maximum(-(rin -r1)**2/p0**2,-50)) yout = y1 + (y2-y1) * np.exp(np.maximum(-(rout-r1)**2/p1**2,-50)) out.append(np.concatenate((yin,yout))) return np.array(out)
[docs]def funct2(params,rLCFS,r): '''Function 'funct2' in STRAHL manual. ''' params_1,params_2 = np.swapaxes(np.reshape(params,(-1,2,6)),0,1) funct_1 = funct(params_1,rLCFS,r) funct_2 = funct(params_2,rLCFS,r) return funct_1+funct_2
[docs]def exppol0(params,d,rLCFS,r): rho = r[:,None]/rLCFS d = np.array(d)/rLCFS params = np.array(params).T idx = np.searchsorted(r,rLCFS) core = params[0]*np.exp(params[1]*rho[:idx]**2 + params[2]*rho[:idx]**4 + params[3]*rho[:idx]**6 + params[4]*rho[:idx]**8) edge = core[-1]*np.exp(-(rho[idx:]-rho[idx-1])/d) return np.concatenate([core,edge]).T
[docs]def exppol1(params,d,rLCFS,r): rho = r[:,None]/rLCFS d = np.array(d)/rLCFS params = np.array(params).T idx = np.searchsorted(r,rLCFS) core = params[0]*np.exp(params[1]*rho[:idx]**2 + params[2]*rho[:idx]**3 + params[3]*rho[:idx]**4 + params[4]*rho[:idx]**5) edge = core[-1]*np.exp(-(rho[idx:]-rho[idx-1])/d) return np.concatenate([core,edge]).T
[docs]def ratfun(params,d,rLCFS,r): rho = r[:,None]/rLCFS d = np.array(d)/rLCFS params = np.array(params).T idx = np.searchsorted(r,rLCFS) core = params[0] * ( (1.0 - params[1])*(1.0-rho[:idx]**params[2])**params[3] + params[1]) edge = core[-1]*np.exp(-(rho[idx:]-rho[idx-1])/d) return np.concatenate([core,edge]).T
[docs]def interp_quad(x,y,d,rLCFS,r): '''Function 'interp' used for kinetic profiles. ''' f = interp1d(x,np.log(y), kind='quadratic', assume_sorted=True, copy=False) idx = np.searchsorted(r,rLCFS) core = np.exp(f(np.clip(r[:idx]/rLCFS,0, x[-1]))) edge = core[...,[idx-1]]*np.exp(-np.outer(1./np.asarray(d),r[idx:]-r[idx-1])) return np.concatenate([core,edge],axis=-1)
[docs]def interpa_quad(x,y,rLCFS,r): '''Function 'interpa' used for kinetic profiles ''' f = interp1d(x,np.log(y),bounds_error=False, kind='quadratic', assume_sorted=True, copy=False) return np.exp(f(np.minimum(r/rLCFS, x[-1])))
[docs]def interp(x,y,rLCFS,r): '''Function 'interp' used in STRAHL for D and V profiles. ''' f = interp1d(x,y,fill_value='extrapolate', assume_sorted=True, copy=False) return f(r/rLCFS)