Source code for omfit_classes.omfit_accome

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

import numpy as np
from omfit_classes.omfit_ascii import OMFITascii
import fortranformat

__all__ = ['OMFITaccomeEquilibrium']


[docs]class OMFITaccomeEquilibrium(SortedDict, OMFITascii): r""" Class used to interface equilibrium files generated by ACCOME :param filename: filename passed to OMFITascii class :param \**kw: keyword dictionary passed to OMFITascii class """ def __init__(self, filename, **kw): OMFITascii.__init__(self, filename, **kw) SortedDict.__init__(self, caseInsensitive=True) self.dynaLoad = True
[docs] def load(self): def splitter(inv, step=16): value = [] for k in range(len(inv) // step): value.append(inv[step * k : step * (k + 1)]) return value with open(self.filename, 'r') as f: lines = f.read().split('\n') header = lines[0].split() self['HEADER'] = ''.join([x.ljust(8) for x in header[:-4]]) _ = int(header[-4]) # obsolete variable # number of points in the horizontal and vertical directions respectively self['NR'] = NR = int(header[-3]) self['NZ'] = NZ = int(header[-2]) # number of poloidal flux surfaces self['NV'] = N = int(header[-1]) f2020 = fortranformat.FortranRecordWriter('5e16.9') block = [] for k in range(1, 5): block.extend(splitter(lines[k])) data0d = list(map(float, block)) name0d = [ 'RBOX', # the nominal full-width of the rectangle 'ZBOX', # the nominal full-height of the rectangle 'RADMAJ', # nominal major radius of the plasma axis 'RBOXDST', # major radius of the inner edge of the rectangular grid 'YMIDEQ', # the vertical shift of the rectangular box in the up-down symmetry plane 'RAXIS', # major radius of the magnetic axis 'ZAXIS', # vertical height of the magnetic axis 'PSIMAG', # poloidal flux function values at the magnetic axis 'PSILIM', # poloidal flux function values at the last closed flux surface 'BTOR', # toroidal magnetic field at raxis 'TOTEQD', # toroidal plasma current '_PSIMX1', # poloidal flux function at the magnetic axis (again!) '_PSIMX2', # obsolete variable '_XAX1', # major radius of the magnetic axes(xax1 is the same as raxis above) '_XAX2', # xax2 is not used (xax2 = xax1) '_ZAX1', # vertical height of the magnetic axes(xax1 is the same as zaxis above) '_ZAX2', # zax2 is not used (zax2 = zax1) '_PSISEP', # obsolete variable '_XSEP', # obsolete variable '_ZSEP', # obsolete variable ] for name, data in zip(name0d, data0d): if not name.startswith('_'): self[name] = data block = [] n = 5 + 4 * int(np.ceil(N / 5.0)) for k in range(5, n): block.extend(splitter(lines[k])) data1d = np.reshape(np.array(list(map(float, block))), (4, N)) self['FPSIAR'] = data1d[0, :] # 1-D array of (R * B_phi) on "NV" equi-spaced points in psi self['PRAR'] = data1d[1, :] # 1-D array of pressure on "NV" equi-spaced points in psi self['FFPAR'] = data1d[2, :] # 1-D array of f-f_prime on "NV" equi-spaced points in psi self['PPAR'] = data1d[3, :] # 1-D array of p-p_prime on "NV" equi-spaced points in psi block = [] for k in range(n, len(lines)): block.extend(splitter(lines[k])) if len(block) == NR * NZ: break self['PSI'] = np.reshape(np.array(list(map(float, block))), (NR, NZ)) # 2-D array of psi values on an "NR" by "NZ" grid n = n + int(np.ceil(NR * NZ / 5.0)) block = [] for k in range(n, len(lines)): block.extend(splitter(lines[k])) data = np.array(list(map(float, block))) self['Q'] = data[:N] # array of safety factor on "NV" equi-spaced points in psi r, z = np.reshape(data[N:], (-1, 2)).T index = np.where((r == r[0]) & (z == z[0]))[0][1] + 1 self['RBBBS'] = r[:index] self['ZBBBS'] = z[:index] self['RLIM'] = r[index:] self['ZLIM'] = z[index:]
############################################ if '__main__' == __name__: test_classes_main_header() tmp = OMFITaccomeEquilibrium(OMFITsrc + '/../samples/accome_equilibrium.dat') tmp.load()