Source code for omfit_classes.omfit_chease

try:
    # framework is running
    from .startup_choice import *
except ImportError as _excp:
    # class is imported by itself
    if (
        'attempted relative import with no known parent package' in str(_excp)
        or 'No module named \'omfit_classes\'' in str(_excp)
        or "No module named '__main__.startup_choice'" in str(_excp)
    ):
        from startup_choice import *
    else:
        raise

from omfit_classes.omfit_ascii import OMFITascii
from omfit_classes.utils_math import cicle_fourier_smooth

import numpy as np
import scipy.interpolate as interpolate

__all__ = ['OMFITchease', 'OMFITcheaseLog', 'OMFITexptnz', 'OMFITnuplo']


[docs]class OMFITchease(SortedDict, OMFITascii): r""" OMFIT class used to interface with CHEASE EXPEQ files :param filename: filename passed to OMFITascii class :param \**kw: keyword dictionary passed to OMFITascii class """ def __init__(self, filename, **kw): SortedDict.__init__(self) OMFITascii.__init__(self, filename, **kw) self.dynaLoad = True self.rhotypes = {0: 'RHO_PSI', 1: 'RHO_TOR'} self.names = { 1: ['PSI', 'PPRIME', 'FFPRIM'], 2: ['PSI', 'PPRIME', 'JTOR'], 3: ['PSI', 'PPRIME', 'JPAR'], 41: ['RHO', 'PPRIME', 'FFPRIM'], 42: ['RHO', 'PPRIME', 'JTOR'], 43: ['RHO', 'PPRIME', 'JPAR'], 44: ['RHO', 'PPRIME', 'IPAR'], 45: ['RHO', 'PPRIME', 'Q'], 81: ['RHO', 'PRES', 'FFPRIM'], 82: ['RHO', 'PRES', 'JTOR'], 83: ['RHO', 'PRES', 'JPAR'], 84: ['RHO', 'PRES', 'IPAR'], 85: ['RHO', 'PRES', 'Q'], }
[docs] @dynaLoad def load(self): if self.filename is None or not os.stat(self.filename).st_size: return with open(self.filename, 'r') as f: lines = f.read().split('\n') tmp = lines[3].split() if len(tmp) == 1: self.version = 'standard' n1 = int(lines[3]) n2 = 1 n3 = 2 elif len(tmp) == 3: self.version = 'mars' ( n1, n2, n3, ) = list(map(int, tmp)) else: raise OMFITexception('%s is not a valid OMFITchease file' % self.filename) self['EPS'] = float(lines[0]) self['Z_AXIS'] = float(lines[1]) self['P_SEP'] = float(lines[2]) boundaries = [] for b in range(n2): tmp = [] for k, line in enumerate(lines[4 + n1 * b : 4 + n1 * (b + 1)]): tmp.append(list(map(float, line.split()))) tmp = np.array(tmp) boundaries.append(tmp) bounds = ['PLASMA'] + ['LIMITER_%d' % k for k in range(len(boundaries) - 1)] self['BOUNDARY'] = {} for k, bound in enumerate(bounds): self['BOUNDARY'][bound] = {} self['BOUNDARY'][bound]['R'] = boundaries[k][:, 0] self['BOUNDARY'][bound]['Z'] = boundaries[k][:, 1] if n3 > 2: self['BOUNDARY'][bound]['x'] = boundaries[k][:, 2] offset = 4 + n1 * n2 if self.version == 'standard': tmp = lines[offset].split() l = int(tmp[0]) if len(tmp) > 1: self.nppfun = int(tmp[1]) else: self.nppfun = 4 tmp = lines[offset + 1].split() self.nsttp = int(tmp[0]) self.nrhotype = int(tmp[1]) self['MODE'] = self.nppfun * 10 + self.nsttp elif self.version == 'mars': l = int(lines[offset]) self['MODE'] = int(lines[offset + 1]) for k, name in enumerate(self.names[self['MODE']]): if (name == 'RHO') and (self.version == 'standard'): name = self.rhotypes[self.nrhotype] self[name] = np.array(list(map(float, lines[offset + 2 + l * k : offset + 2 + l * (k + 1)]))) offset = offset + 2 + l * (k + 1) + 1 self['NOTES'] = [] for line in lines[offset:]: if line.strip(): self['NOTES'].append(line.rstrip('\n')) self['NOTES'] = '\n'.join(self['NOTES'])
[docs] @dynaSave def save(self): """ Method used to save the content of the object to the file specified in the .filename attribute :return: None """ with open(self.filename, 'w') as f: f.write(str(self['EPS']) + '\n') f.write(str(self['Z_AXIS']) + '\n') f.write(str(self['P_SEP']) + '\n') n1 = len(self['BOUNDARY']['PLASMA']['R']) if self.version == 'standard': n2 = 1 n3 = 2 f.write(str(n1) + '\n') elif self.version == 'mars': n2 = len(self['BOUNDARY']) n3 = len(self['BOUNDARY']['PLASMA']) tmp = np.hstack((n1, n2, n3)) f.write(' '.join(map(str, tmp)) + '\n') bounds = ['PLASMA'] + ['LIMITER_%d' % k for k in range(n2 - 1)] for bound in bounds: tmp = np.vstack([self['BOUNDARY'][bound]['R'], self['BOUNDARY'][bound]['Z']]).T shape = list(tmp.shape) for k in range(tmp.shape[0]): f.write(' '.join(['%5.9e' % x for x in tmp[k, :]]) + '\n') # Write length of profiles l = len(self[self.names[self['MODE']][-1]]) if self.version == 'standard': tmp = np.hstack((l, self.nppfun)) f.write(' '.join(map(str, tmp)) + '\n') tmp = np.hstack((self.nsttp, self.nrhotype)) f.write(' '.join(map(str, tmp)) + '\n') elif self.version == 'mars': f.write(str(l) + '\n') # Write number corresponding to profile combitation f.write(str(self['MODE']) + '\n') for name in self.names[self['MODE']]: if (name == 'RHO') and (self.version == 'standard'): name = self.rhotypes[self.nrhotype] tmp = self[name] shape = list(tmp.shape) for k in range(shape[0]): f.write(str('%5.9e' % tmp[k]) + '\n') if len(self['NOTES'].strip()): f.write(self['NOTES'].rstrip('\n') + '\n')
[docs] @staticmethod def splineRZ(R, Z, Nnew): """ Auxilliary function to spline single boundary from EXPEQ :param R: array 1 (R coordinate) :param Z: array 2 (Z coordinate) :param Nnew: new number of points :return: smoothed R,Z """ npoints = len(R) degree = 3 t = np.linspace(-np.pi, np.pi, npoints) ipl_t = np.linspace(-np.pi, np.pi, Nnew) R_i = interpolate.UnivariateSpline(t, R, k=degree, s=1.0e-5)(ipl_t) Z_i = interpolate.UnivariateSpline(t, Z, k=degree, s=1.0e-5)(ipl_t) return R_i, Z_i
[docs] def EQsmooth(self, keep_M_harmonics, inPlace=True, equalAngle=False, doPlot=False): """ smooth plasma boundary by zeroing out high harmonics :param keep_M_harmonics: how many harmonics to keep :param inPlace: operate in place (update this file or not) :param equalAngle: use equal angle interpolation, and if so, how many points to use :param doPlot: plot plasma boundary before and after :return: smoothed R and Z coordinates """ R = self['BOUNDARY']['PLASMA']['R'] Z = self['BOUNDARY']['PLASMA']['Z'] RS, ZS = cicle_fourier_smooth(R, Z, keep_M_harmonics, equalAngle=equalAngle, doPlot=doPlot) if inPlace: self['BOUNDARY']['PLASMA']['R'] = RS self['BOUNDARY']['PLASMA']['Z'] = ZS return RS, ZS
[docs] def addLimiter(self, R, Z): """ Insertion of a wall defined by coordinates (R,Z) :R = radial coordinate :Z = vertical coordinate Note: both must be normalized, and ndarray type """ if len(self['BOUNDARY']) == 0: raise ("Error. No PLASMA found") else: d = len(self['BOUNDARY']) - 1 self['BOUNDARY']['LIMITER_' + str(d)] = {} self['BOUNDARY']['LIMITER_' + str(d)]['R'] = R self['BOUNDARY']['LIMITER_' + str(d)]['Z'] = Z
[docs] def modifyBoundary(self): """ Interactively modify plasma boundary """ R = self['BOUNDARY']['PLASMA']['R'] Z = self['BOUNDARY']['PLASMA']['Z'] tmp = fluxGeo(R, Z) bs = BoundaryShape( a=tmp['a'], eps=tmp['eps'], kapu=tmp['kapu'], kapl=tmp['kapl'], delu=tmp['delu'], dell=tmp['dell'], zetaou=tmp['zetaou'], zetaiu=tmp['zetaiu'], zetail=tmp['zetail'], zetaol=tmp['zetaol'], zoffset=tmp['zoffset'], rbbbs=R, zbbbs=Z, upnull=False, lonull=True, ) self['BOUNDARY']['PLASMA']['R'] = bs['r'] self['BOUNDARY']['PLASMA']['Z'] = bs['z'] bs.plot()
[docs] def from_gEQDSK(self, gEQDSK=None, conformal_wall=False, mode=None, rhotype=0, version=None, cocos=2): """ Modify CHEASE EXPEQ file with data loaded from gEQDSK :param gEQDSK: input gEQDKS file from which to copy the plasma boundary :param conformal_wall: floating number that multiplies plasma boundary (should be >1) :param mode: select profile to use from gEQDSK :param rhotype: 0 for poloidal flux. 1 for toroidal flux. Only with version=='standard' :param version: either 'standard' or 'mars' """ if version is None: if hasattr(self, 'version'): version = self.version else: version = 'standard' if mode is None: if 'MODE' in self: mode = self['MODE'] else: mode = {'standard': 41, 'mars': 1}[version] gEQDSK = gEQDSK.cocosify(cocos, True, True, False) R0 = gEQDSK['RCENTR'] B0 = gEQDSK['BCENTR'] # normalizations from section 5.4.6 of CHEASE manual if version not in ['standard', 'mars']: OMFITexception('Cannot create OMFITchease in version %s' % version) else: self.version = version self['EPS'] = gEQDSK['fluxSurfaces']['geo']['eps'][-1] self['Z_AXIS'] = gEQDSK['ZMAXIS'] / R0 self['P_SEP'] = gEQDSK['PRES'][-1] / (B0**2 / constants.mu_0) self['BOUNDARY'] = {} self['BOUNDARY']['PLASMA'] = {} self['BOUNDARY']['PLASMA']['R'] = gEQDSK['RBBBS'] / R0 self['BOUNDARY']['PLASMA']['Z'] = gEQDSK['ZBBBS'] / R0 if version == 'mars': # conformal wall if 'LIMITER_0' not in self['BOUNDARY']: self['BOUNDARY']['LIMITER_0'] = {} if conformal_wall: self['BOUNDARY']['LIMITER_0']['R'] = (self['BOUNDARY']['PLASMA']['R'] - 1) * conformal_wall + 1 self['BOUNDARY']['LIMITER_0']['Z'] = (self['BOUNDARY']['PLASMA']['Z'] - self['Z_AXIS']) * conformal_wall + self['Z_AXIS'] # original wall else: self['BOUNDARY']['LIMITER_0']['R'] = gEQDSK['RLIM'] / R0 self['BOUNDARY']['LIMITER_0']['Z'] = gEQDSK['ZLIM'] / R0 # Deleting all possible profiles to avoid conflicts profiles = ['PSI', 'RHO_PSI', 'RHO_TOR'] # coordinates profiles += ['PPRIME', 'PRES'] # pressure profiles += ['FFPRIM', 'JTOR', 'JPAR', 'IPAR', 'Q'] # current for prof in profiles: self.safe_del(prof) if version == 'standard': # coordinate if rhotype == 0: self['RHO_PSI'] = gEQDSK['AuxQuantities']['RHOp'] elif rhotype == 1: self['RHO_TOR'] = gEQDSK['AuxQuantities']['RHO'] self.nrhotype = rhotype # pressure if mode in [1, 2] or int(mode / 10) == 4: self['PPRIME'] = gEQDSK['PPRIME'] / np.abs(B0 / (constants.mu_0 * R0**2)) elif int(mode / 10) == 8: self['PRES'] = gEQDSK['PRES'] / (B0**2) * constants.mu_0 else: raise OMFITexception('Cannot define pressure for MODE %d' % mode) # current/q if mod(mode, 10) == 1: self['FFPRIM'] = gEQDSK['FFPRIM'] / np.abs(B0) elif mod(mode, 10) == 2: self['JTOR'] = ( gEQDSK['fluxSurfaces']['avg']['Jt/R'] / gEQDSK['fluxSurfaces']['avg']['1/R'] / np.abs(B0 / (R0 * constants.mu_0)) ) elif mod(mode, 10) == 3: raise OMFITexception('%s cannot be loaded from gEQDSK yet' % self.names[mode][2]) elif mod(mode, 10) == 4: raise OMFITexception('%s cannot be loaded from gEQDSK yet' % self.names[mode][2]) elif mod(mode, 10) == 5: self['Q'] = gEQDSK['QPSI'] else: raise OMFITexception('Cannot define current or q for MODE %d' % mode) elif version == 'mars': self['PSI'] = gEQDSK['AuxQuantities']['RHOp'] self['PPRIME'] = gEQDSK['PPRIME'] / np.abs(B0 / (constants.mu_0 * R0**2)) if mode == 1: self['FFPRIM'] = gEQDSK['FFPRIM'] / np.abs(B0) elif mode == 2: self['JTOR'] = ( gEQDSK['fluxSurfaces']['avg']['Jt/R'] / gEQDSK['fluxSurfaces']['avg']['1/R'] / np.abs(B0 / (R0 * constants.mu_0)) ) elif mode == 3: raise OMFITexception('%s cannot be loaded from gEQDSK yet' % self.names[mode][2]) else: raise OMFITexception('MODE %s unknown or not supported' % mode) self['MODE'] = mode self['NOTES'] = '' self.version = version return self
[docs] def plot(self, bounds=None, **kw): """ :param bounds: :param kw: :return: """ from matplotlib import pyplot if bounds is None: bounds = self['BOUNDARY'] kw0 = copy.copy(kw) if 'lw' in kw: kw0['lw'] = kw0['lw'] + 1 elif 'linewidth' in kw: kw0['linewidth'] = kw0['linewidth'] + 1 else: kw0['lw'] = 2 kw0['color'] = 'k' if self.version == 'standard': X = self[self.rhotypes[self.nrhotype]] Xlabel = '$\\rho$' elif self.version == 'mars': X = self['PSI'] Xlabel = '$\\sqrt{\\psi}$' ax = pyplot.subplot(2, 2, 2) quantity = self.names[self['MODE']][1] ax.plot(X, self[quantity], **kw) ax.set_title(quantity) color = ax.lines[-1].get_color() kw['color'] = color ax = pyplot.subplot(2, 2, 4) quantity = self.names[self['MODE']][2] ax.plot(X, self[quantity], **kw) ax.set_title(quantity) ax.set_xlabel(Xlabel) ax = pyplot.subplot(1, 2, 1) for bound in self['BOUNDARY']: if bound == 'PLASMA': ax.plot(self['BOUNDARY'][bound]['R'], self['BOUNDARY'][bound]['Z'], **kw) else: ax.plot(self['BOUNDARY'][bound]['R'], self['BOUNDARY'][bound]['Z'], **kw0) ax.set_aspect('equal') ax.set_frame_on(False)
[docs]class OMFITcheaseLog(SortedDict, OMFITascii): r""" OMFIT class used to parse the CHEASE log FILES for the following parameters: betaN, NW, CURRT, Q_EDGE, Q_ZERO, R0EXP, B0EXP, Q_MIN, S_Q_MIN, Q_95 :param filename: filename passed to OMFITascii class :param \**kw: keyword dictionary passed to OMFITascii class """ def __init__(self, filename, **kw): SortedDict.__init__(self) OMFITascii.__init__(self, filename, **kw) self.dynaLoad = True
[docs] @dynaLoad def load(self): """ Load CHEASE log file data """ # Array with string pattern, variable name and position of the number to store mystring = [ ('CSV=', 'NW', -1), ('GEXP', 'BetaN', -1), ('TOTAL CURRENT -->', 'CURRT', 0), ('Q_EDGE', 'Q_EDGE', 0), ('Q_ZERO', 'Q_ZERO', 0), ('R0 [M]', 'R0EXP', 0), ('B0 [T]', 'B0EXP', 0), ('MINIMUM Q VALUE', 'Q_MIN', -1), ('S VALUE OF QMIN', 'S_Q_MIN', -1), ('Q AT 95%', 'Q_95', -1), ('RESIDU', 'RESIDUAL', 2), ] with open(self.filename, 'r') as f: for line in f.readlines(): for word, name, pos in mystring: str_found = line.find(word) if (word == 'CSV=') and (name not in self): self[name] = [] if str_found != -1: if word == 'CSV=': try: self[name].append(ast.literal_eval(line.split()[pos])) except SyntaxError: tmp = re.findall(r'(\w+=)(\d+)', line.split()[pos])[0] self[name].append(ast.literal_eval(tmp[-1])) elif (word != 'RESIDU') or ('EPSLON' in line.split()): self[name] = ast.literal_eval(line.split()[pos]) return self
[docs] def read_VacuumMesh(self, nv): """ Read vacuum mesh from CHEASE log file :param nv: number of radial intervals in vacuum (=NV from input namelist) """ self['VACUUM MESH'] = {} NW = [] rw = [] mystring = 'VACUUM MESH CSV =' with open(self.filename, 'r') as f: data = f.readlines() for line_no, line in enumerate(data): if line.find(mystring) != -1: break for ii in range(nv + 1): NW.append(int(data[line_no + ii + 1].split()[0])) rw.append(float(data[line_no + ii + 1].split()[1])) self['VACUUM MESH']['NW'] = np.asarray(NW) self['VACUUM MESH']['rw'] = np.asarray(rw) return self
[docs]class OMFITexptnz(SortedDict, OMFITascii): r""" OMFIT class used to interface with EXPTNZ files containing kinetic profiles :param filename: filename passed to OMFITascii class :param \**kw: keyword dictionary passed to OMFITascii class """ def __init__(self, filename, **kw): SortedDict.__init__(self) OMFITascii.__init__(self, filename, **kw) self.dynaLoad = True
[docs] @dynaLoad def load(self): with open(self.filename, 'r') as f: header = f.readline().split() if not len(header): return npoints = int(header[0]) tmp = np.loadtxt(self.filename, skiprows=1) nprofs = int(len(tmp) / npoints) for k in range(nprofs): if ',' in header[k + 1]: name = header[k + 1][:-1] else: name = header[k + 1] if name == 'rhopsi': rhopsi = tmp[: (k + 1) * npoints] self['rhopsi'] = xarray.DataArray( rhopsi, dims=['rhopsi'], coords={'rhopsi': rhopsi}, attrs={'Description': 'Normalized poloidal flux'} ) continue else: tmp2 = tmp[(k) * npoints : (k + 1) * npoints] self[name] = xarray.DataArray(tmp2, dims=['rhopsi'], coords={'rhopsi': self['rhopsi']})
[docs] def exptnz2mars(self): from omfit_classes.omfit_mars import OMFITmarsProfile outprofs = {} for item in self: if item == 'rhopsi': continue proffile = item + '_prof' with open(proffile, 'w') as f: tmp = np.vstack(list([self['rhopsi'], self[item]])).T shape = list(tmp.shape) shape[1] = shape[1] - 1 f.write(' '.join(map(str, shape)) + '\n') for k in range(tmp.shape[0]): f.write(' '.join(['%5.9e' % x for x in tmp[k, :]]) + '\n') outprofs[item] = OMFITmarsProfile(proffile) return outprofs
[docs]class OMFITnuplo(SortedDict, OMFITascii): """CHEASE NUPLO output file""" def __init__(self, filename, **kw): OMFITascii.__init__(self, filename, **kw) SortedDict.__init__(self) self.dynaLoad = True
[docs] @dynaLoad def load(self): if self.filename is None or not os.stat(self.filename).st_size: return def naneval(val): if 'nan' not in val.lower(): return eval(val) else: printw(" ---> WARNING!! NAN ENCOUNTERED!!!") return np.NaN def readlines_size(lines, nsize): out = [] linesread = 0 while len(out) < nsize: out += list(map(naneval, lines[linesread].split())) linesread += 1 if len(out) == nsize: return np.array(out), linesread elif len(out) > nsize: printw(" ---> WARNING!! UNEXPECTED LINES ENCOUNTERED!!!") return np.array(out), linesread with open(self.filename, mode='r') as f: lines = f.read().splitlines() NUMS = self['NUMS'] = {} DATA = self['DATA'] = {} [ NUMS['insur'], NUMS['nchi'], NUMS['nchi1'], NUMS['npsi'], NUMS['npsi1'], NUMS['ns'], NUMS['ns1'], NUMS['nt'], NUMS['nt1'], NUMS['ins'], NUMS['inr'], NUMS['inbchi'], NUMS['intext'], ] = list(map(naneval, lines[0].split())) [ NUMS['ncurv'], NUMS['nmesha'], NUMS['nmeshb'], NUMS['nmeshc'], NUMS['nmeshd'], NUMS['nmeshe'], NUMS['npoida'], NUMS['npoidb'], NUMS['npoidc'], NUMS['npoidd'], NUMS['npoide'], NUMS['niso'], NUMS['nmgaus'], ] = list(map(naneval, lines[1].split())) NUMS['niso1'] = NUMS['niso'] + 1 offset = 2 + NUMS['intext'] self['nuplo_text'] = '\n'.join(lines[2:offset]) DATA['iball'], i = readlines_size(lines[offset:], NUMS['npsi1']) offset += i DATA['imerci'], i = readlines_size(lines[offset:], NUMS['npsi1']) offset += i DATA['imercr'], i = readlines_size(lines[offset:], NUMS['npsi1']) offset += i tmp, i = readlines_size(lines[offset:], 10) offset += i [ NUMS['solpda'], NUMS['sopldb'], NUMS['solpdc'], NUMS['solpdd'], NUMS['solpde'], NUMS['zrmax'], NUMS['zrmin'], NUMS['zzmax'], NUMS['zzmin'], NUMS['pangle'], ] = tmp DATA['aplace'], i = readlines_size(lines[offset:], 10) offset += i DATA['awidth'], i = readlines_size(lines[offset:], 10) offset += i DATA['bplace'], i = readlines_size(lines[offset:], 10) offset += i DATA['bwidth'], i = readlines_size(lines[offset:], 10) offset += i DATA['cplace'], i = readlines_size(lines[offset:], 10) offset += i DATA['cwidth'], i = readlines_size(lines[offset:], 10) offset += i DATA['dplace'], i = readlines_size(lines[offset:], 10) offset += i DATA['dwidth'], i = readlines_size(lines[offset:], 10) offset += i DATA['eplace'], i = readlines_size(lines[offset:], 10) offset += i DATA['ewidth'], i = readlines_size(lines[offset:], 10) offset += i DATA['ztet'], i = readlines_size(lines[offset:], NUMS['nt1']) offset += i DATA['csig'], i = readlines_size(lines[offset:], NUMS['ns1']) offset += i DATA['cs'], i = readlines_size(lines[offset:], NUMS['niso1']) offset += i # DATA['COMMENTS']['cs'] = 's-mesh ~ sqrt(psi_normalized)' DATA['zchi'], i = readlines_size(lines[offset:], NUMS['nchi1']) offset += i # DATA['COMMENTS']['zchi'] = 'chi-mesh (note: meaning depends on Jacobian)' DATA['zcsipr'], i = readlines_size(lines[offset:], NUMS['niso1']) offset += i DATA['zrtet'], i = readlines_size(lines[offset:], NUMS['nt']) offset += i DATA['zztet'], i = readlines_size(lines[offset:], NUMS['nt']) offset += i DATA['zrsur'], i = readlines_size(lines[offset:], NUMS['insur']) offset += i DATA['ztsur'], i = readlines_size(lines[offset:], NUMS['insur']) offset += i DATA['zzsur'], i = readlines_size(lines[offset:], NUMS['insur']) offset += i # DATA['COMMENTS']['zrsur_zzsur'] = '(R-Rmag,Z-Zmag) values plasma boundary surface' DATA['zabis'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zabit'], i = readlines_size(lines[offset:], NUMS['nt1']) offset += i DATA['zabic'], i = readlines_size(lines[offset:], NUMS['nchi1']) offset += i DATA['zoart'], i = readlines_size(lines[offset:], NUMS['nt1']) offset += i DATA['zabipr'], i = readlines_size(lines[offset:], NUMS['niso1']) offset += i DATA['zabisg'], i = readlines_size(lines[offset:], NUMS['ns1']) offset += i DATA['zabsm'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zabr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zoqs'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zoqr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zodqs'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zodqr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zoshs'], i = readlines_size(lines[offset:], NUMS['npsi1'] + 1) offset += i DATA['zoshs'] = DATA['zoshs'][:-1] # bad number at the end of this line... DATA['zoshr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zojbs'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zojbr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zojbss'] = np.zeros((NUMS['ins'], 4)) DATA['zojbss'][:, 0], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zojbss'][:, 1], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zojbss'][:, 2], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zojbss'][:, 3], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zojbsr'] = np.zeros((NUMS['inr'], 4)) DATA['zojbsr'][:, 0], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zojbsr'][:, 1], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zojbsr'][:, 2], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zojbsr'][:, 3], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zojps'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zojpr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zotrs'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zotrr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zohs'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zodis'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zodrs'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zopps'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zoppr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zops'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zopr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zotts'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zottr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zots'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zotr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zoips'], i = readlines_size(lines[offset:], NUMS['ins']) offset += i DATA['zoipr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zobetr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zobets'], i = readlines_size(lines[offset:], NUMS['npsi1']) offset += i DATA['zofr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zoars'], i = readlines_size(lines[offset:], NUMS['npsi1']) offset += i DATA['zojr'], i = readlines_size(lines[offset:], NUMS['inr']) offset += i DATA['zabs'], i = readlines_size(lines[offset:], NUMS['npsi1']) offset += i DATA['rriso'] = np.zeros((NUMS['nmgaus'] * NUMS['nt1'], NUMS['npsi1'])) DATA['rziso'] = np.zeros((NUMS['nmgaus'] * NUMS['nt1'], NUMS['npsi1'])) for j in np.arange(NUMS['npsi1']): DATA['rriso'][:, j], i = readlines_size(lines[offset:], NUMS['nmgaus'] * NUMS['nt1']) offset += i DATA['rziso'][:, j], i = readlines_size(lines[offset:], NUMS['nmgaus'] * NUMS['nt1']) offset += i DATA['rrcurv'], i = readlines_size(lines[offset:], NUMS['ncurv']) offset += i DATA['rzcurv'], i = readlines_size(lines[offset:], NUMS['ncurv']) offset += i # DATA['COMMENTS']['rrcurv_rzcurv'] = '(R-Rmag, Z-Zmag) values of zero curvature line, as from NUPLO' aa, i = readlines_size(lines[offset:], NUMS['inbchi'] * NUMS['npsi1']) offset += i ij = 0 DATA['zrchi'] = np.zeros((NUMS['inbchi'], NUMS['npsi1'])) for j in np.arange(NUMS['npsi1']): DATA['zrchi'][:, j] = aa[ij : ij + NUMS['inbchi']] ij += NUMS['inbchi'] aa, i = readlines_size(lines[offset:], NUMS['inbchi'] * NUMS['npsi1']) offset += i ij = 0 DATA['zzchi'] = np.zeros((NUMS['inbchi'], NUMS['npsi1'])) for j in np.arange(NUMS['npsi1']): DATA['zzchi'][:, j] = aa[ij : ij + NUMS['inbchi']] ij += NUMS['inbchi'] # DATA['COMMENTS']['zrchi_zzchi'] = '(R-Rmag, Z-Zmag) values of chi=cst lines' aa, i = readlines_size(lines[offset:], NUMS['nchi'] * NUMS['npsi1']) offset += i ij = 0 DATA['rshear'] = np.zeros((NUMS['nchi'], NUMS['npsi1'])) for j in np.arange(NUMS['npsi1']): DATA['rshear'][:, j] = aa[ij : ij + NUMS['nchi']] ij += NUMS['nchi'] aa, i = readlines_size(lines[offset:], NUMS['nchi'] * NUMS['npsi1']) offset += i ij = 0 DATA['cr'] = np.zeros((NUMS['nchi'], NUMS['npsi1'])) for j in np.arange(NUMS['npsi1']): DATA['cr'][:, j] = aa[ij : ij + NUMS['nchi']] ij += NUMS['nchi'] aa, i = readlines_size(lines[offset:], NUMS['nchi'] * NUMS['npsi1']) offset += i ij = 0 DATA['cz'] = np.zeros((NUMS['nchi'], NUMS['npsi1'])) for j in np.arange(NUMS['npsi1']): DATA['cz'][:, j] = aa[ij : ij + NUMS['nchi']] ij += NUMS['nchi'] DATA['crp'] = np.vstack((DATA['cr'], DATA['cr'][0, :])) DATA['czp'] = np.vstack((DATA['cz'], DATA['cz'][0, :])) # DATA['COMMENTS']['cr_cz_p'] = "(R-Rmag, Z-Zmag) values of psi=cst surfaces, 'p' for including periodic point" DATA['rshearp'] = np.vstack((DATA['rshear'], DATA['rshear'][0, :])) # DATA['COMMENTS']['rshear_p'] = "(R-Rmag, Z-Zmag) values of local shear S, 'p' for including periodic point" DATA['r0curv'] = np.hstack((DATA['rrcurv'][-2::-2], DATA['rrcurv'][1::2])) DATA['z0curv'] = np.hstack((DATA['rzcurv'][-2::-2], DATA['rzcurv'][1::2]))
# DATA['COMMENTS']['r0curv, z0curv'] = "(R-Rmag, Z-Zmag) values of zero curvature line ordered from top to bottom" ############################################ if '__main__' == __name__: test_classes_main_header() tmp1 = OMFITchease(OMFITsrc + '/../samples/EXPEQ.OUT') tmp1.plot() tmp1.EQsmooth(10) tmp1.plot(bounds=['PLASMA']) from matplotlib import pyplot pyplot.show()