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 \'classes\'' in str(_excp)
or "No module named '__main__.startup_choice'" in str(_excp)
):
from startup_choice import *
else:
raise
import struct
import numpy as np
__all__ = ['OMFITnimrod']
[docs]class OMFITnimrod(SortedDict, OMFITobject):
r"""
OMFIT class used to interface with NIMROD output files
Note: does not support writing
:param filename: filename passed to OMFITobject class
:param \**kw: keyword dictionary passed to OMFITobject class
"""
def __init__(self, filename, **kw):
OMFITobject.__init__(self, filename, **kw)
SortedDict.__init__(self, caseInsensitive=True)
self.dynaLoad = True
contour_labels = [
'B0_r [T]', # 1
'B0_z [T]', # 2
'B0_{\\phi} [T]', # 3
'J0_r [A/m^2]', # 4
'J0_z [A/m^2]', # 5
'J0_{\\phi} [A/m^2]', # 6
'V0_r [m/s]', # 7
'V0_z [m/s]', # 8
'V0_{\\phi} [m/s]', # 9
'P_0 [Pa]', # 10
'P_{0e} [Pa]', # 11
'n0 [m^{-3}]', # 12
'diff shape', # 13
'B_r [T]', # 14
'B_z [T]', # 15
'B_{\\phi} [T]', # 16
'Im B_r [T]', # 17
'Im B_z [T]', # 18
'Im B_{\\phi} [T]', # 19
'J_r [A/m^2]', # 20
'J_z [A/m^2]', # 21
'J_{\\phi} [A/m^2]', # 22
'Im J_r [A/m^2]', # 23
'Im J_z [A/m^2]', # 24
'Im J_{\\phi} [A/m^2]', # 25
'V_r [m/s]', # 26
'V_z [m/s]', # 27
'V_{\\phi} [m/s]', # 28
'Im V_r [m/s]', # 29
'Im V_z [m/s]', # 30
'Im V_{\\phi} [m/s]', # 31
'P [Pa]', # 32
'Im P [Pa]', # 33
'P_e [Pa]', # 34
'Im P_e [Pa]', # 35
'n [m^{-3}]', # 36
'Im n [m^{-3}]', # 37
'conc', # 38
'Im conc', # 39
'T_e [eV]', # 40
'Im T_e [eV]', # 41
'T_i [eV]', # 42
'Im T_i [eV]', # 43
'P_{dilu} [W/m^3]', # 44
'Im P_{dilu} [W/m^3]', # 45
'P_{brem} [W/m^3]', # 46
'Im P_{brem} [W/m^3]', # 47
'P_{rec} [W/m^3]', # 48
'Im P_{rec} [W/m^3]', # 49
'P_{line} [W/m^3]', # 50
'Im P_{line} [W/m^3]', # 51
'P_{ion} [W/m^3]', # 52
'Im P_{ion} [W/m^3]', # 53
'n_imp [m^{-3}]', # 54
'Im n_imp [m^{-3}]', # 55
'n_{ele} [m^{-3}]', # 56
'Im n_{ele} [m^{-3}]', # 57
'n_{neut} [m^{-3}]', # 58
'Im n_{neut} [m^{-3}]', # 59
'n_{imp neut} [m^{-3}]', # 60
]
for iz in range(1, 19):
contour_labels.append('n_{imp +' + str(iz) + '} [m^{-3}]')
discharge_labels = [
'istep',
'time',
'divB',
'totE', # total energy
'totIE', # total internal energy
'totIEe', # total internal electron energy
'totIEi', # total internal ion energy
'lnE', # ln(total energy)
'lnIE', # ln(internal energy)
'grate', # growth rate
'Itot', # current
'Ipert', # perturbed current
'Vloop', # perturbed loop voltage
'totflux', # total flux
'n0flux', # n=0 flux
'bigF', # F
'Theta', # Theta
'magCFL', # Eq. Mag-ac CFL
'NLCFL', # Nonlinear CFL
'flowCFL',
] # Flow CFL]
polflux_labels = ['R', 'Z', 'polflux', 'R*Bphi']
flsurf_labels = ['t', 'ix', 'polm', 'sqrt(polm)', 'polp', 'sqrt(polp)', 'q_surf', 'par_surf']
SPIhist_labels = ['thstp', 'thtm', 'ip', 'Rp', 'Zp', 'Pp', 'radius', 'aden', 'taden', 'eden', 'eT', 'ablt', 'tablt', 'asim', 'tsim']
energy_labels = ['step', 'time', 'imode', 'k', 'E_mag', 'E_kin', 'prad']
kpraden_labels = [
'istep',
'time',
'qlosd',
'qloso',
'qlosb',
'qlosr',
'qlosl',
'qlosi',
'Nz',
'Ne',
'Nz+zi',
'qlost',
'elosd',
'eloso',
'elosb',
'elosr',
'elosl',
'elosi',
'elost',
]
kpradnz_labels = ['istep', 'time', 'Nz+2', 'Nz+3', 'Nz+4', 'Nz+5', 'Nz+6', 'Nz+7', 'Nz+8', 'Nz+9', 'Nz+10']
xy_slice_labels = [
'ix/mx', # 0
'iy/my', # 1
'R', # 2
'Z', # 3
'B0R', # 4
'B0Z', # 5
'B0Phi', # 6
'J0R', # 7
'J0Z', # 8
'J0Phi', # 9
'V0R', # 10
'V0Z', # 11
'V0Phi', # 12
'P0', # 13
'PE0', # 14
'n0', # 15
'diff shape', # 16
'BR', # 17
'BZ', # 18
'BP', # 19
'Im BR', # 20
'Im BZ', # 21
'Im BP', # 22
'JR', # 23
'JZ', # 24
'JP', # 25
'Im JR', # 26
'Im JZ', # 27
'Im JP', # 28
'VR', # 29
'VZ', # 30
'VP', # 31
'Im VR', # 32
'Im VZ', # 33
'Im VP', # 34
'P', # 35
'Im P', # 36
'PE', # 37
'Im PE', # 38
'n', # 39
'Im n', # 40
'conc', # 41
'Im conc', # 42
'Te', # 43
'Im Te', # 44
'Ti', # 45
'Im Ti',
] # 46
xt_slice_labels = [
'ix/mx', # 0
'istep', # 1
't', # 2
'R', # 3
'Z', # 4
'B0R', # 5
'B0Z', # 6
'B0Phi', # 7
'J0R', # 8
'J0Z', # 9
'J0Phi', # 10
'V0R', # 11
'V0Z', # 12
'V0Phi', # 13
'P0', # 14
'PE0', # 15
'n0', # 16
'diff shape', # 17
'BR', # 18
'BZ', # 19
'BP', # 20
'Im BR', # 21
'Im BZ', # 22
'Im BP', # 23
'JR', # 24
'JZ', # 25
'JP', # 26
'Im JR', # 27
'Im JZ', # 28
'Im JP', # 29
'VR', # 30
'VZ', # 31
'VP', # 32
'Im VR', # 33
'Im VZ', # 34
'Im VP', # 35
'P', # 36
'Im P', # 37
'PE', # 38
'Im PE', # 39
'n', # 40
'Im n', # 41
'conc', # 42
'Im conc', # 43
'Te', # 44
'Im Te', # 45
'Ti', # 46
'Im Ti',
] # 47
xt_slice_kprad_labels = [
'nimp', # 48
'Im nimp', # 49
'ne', # 50
'Im ne', # 51
'qlosd', # 52
'Im qlosd', # 53
'qloso', # 54
'Im qloso', # 55
'qlosb', # 56
'Im qlosb', # 57
'qlosr', # 58
'Im qlosr', # 59
'qlosl', # 60
'Im qlosl', # 61
'qlosi', # 62
'Im qlosi', # 63
'ndn', # 64
'Im ndn',
] # 65
nimhist_labels = [
'istep', # 0
't', # 1
'imode', # 2
'k', # 3
'Br', # 4
'Bz', # 5
'Bphi', # 6
'Im Br', # 7
'Im Bz', # 8
'Im Bphi', # 9
'Jr', # 10
'Jz', # 11
'Jphi', # 12
'Im Jr', # 13
'Im Jz', # 14
'Im Jphi', # 15
'Vr', # 16
'Vz', # 17
'Vphi', # 18
'Im Vr', # 19
'Im Vz', # 20
'Im Vphi', # 21
'P', # 22
'Im P', # 23
'Pe', # 24
'Im Pe', # 25
'n', # 26
'Im n', # 27
'conc', # 28
'Im conc', # 29
'Te', # 30
'Im Te', # 31
'Ti', # 32
'Im Ti',
] # 33
def _read_raw(self):
with open(self.filename, 'rb') as f:
raw_data = f.read()
nreals = len(raw_data) // 4
return np.array(struct.unpack(">" + str(nreals) + 'f', raw_data))
def _read_table_check(self, l=4):
with open(self.filename, 'rb') as f:
d1 = []
d2 = []
data = 0
while data is not None:
data = self._read_record(f, l)
if data is not None:
if (not len(d2)) or len(data) == len(d2[0]):
d2.append(data)
elif (not len(d1)) or len(d2) == len(d1[0]):
d1.append(np.array(d2))
d2 = []
if not len(d1):
return np.array(d2)
return np.array(d1)
def _read_table(self, l=4):
with open(self.filename, 'rb') as f:
d1 = []
d2 = []
data = 0
while data is not None:
data = self._read_record(f, l)
if data is not None:
if len(data):
d2.append(data)
else:
d1.append(np.array(d2))
d2 = []
if not len(d1):
return np.array(d2)
return np.array(d1)
# Seperate read_table for discharge to fix bug with reading restarts
def _read_table_dis(self, l=4):
with open(self.filename, 'rb') as f:
d1 = []
data = 0
while data is not None:
data = self._read_record(f, l)
if data is not None and len(data):
d1.append(data)
return np.array(d1)
def _read_record(self, f, l=4):
d = f.read(4)
if not len(d):
return None
n = struct.unpack(">1i", d)[0]
data = np.array(struct.unpack(">" + str(n // l) + 'f', f.read(n)))
n2 = struct.unpack(">1i", f.read(4))[0]
if n != n2:
raise IOError('Error reading record')
return data
def _merge_blocks(self, qnt):
blx = int(self['blx'])
bly = int(self['bly'])
nxbl = int(self['nxbl'])
nybl = int(self['nybl'])
if len(qnt.shape) == 3:
tmp = np.zeros(((blx - 1) * nxbl + 1, (bly - 1) * nybl + 1), dtype=qnt.dtype)
elif len(qnt.shape) == 4:
tmp = np.zeros(((blx - 1) * nxbl + 1, (bly - 1) * nybl + 1, qnt.shape[2]), dtype=qnt.dtype)
for ibl in range(nxbl):
for jbl in range(nybl):
if len(qnt.shape) == 3:
tmp[ibl * (blx - 1) : ibl * (blx - 1) + blx, jbl * (bly - 1) : jbl * (bly - 1) + bly] = qnt[:, :, nybl * ibl + jbl]
elif len(qnt.shape) == 4:
tmp[ibl * (blx - 1) : ibl * (blx - 1) + blx, jbl * (bly - 1) : jbl * (bly - 1) + bly, :] = qnt[
:, :, :, nybl * ibl + jbl
]
return tmp
def _read_contour(self):
"""
Parse contour.bin files
"""
with open(self.filename, 'rb') as f:
raw_data = f.read()
bldat = struct.unpack(">" + str(10) + 'i', raw_data[: 4 * 10])
nbl = self['nbl'] = int(bldat[1])
nvar = self['nvar'] = int(bldat[3])
blx = self['blx'] = int(bldat[6] + 1)
bly = self['bly'] = int(bldat[7] + 1)
blp = self['blp'] = self['blx'] * self['bly']
cdata = self._read_raw()
nslice = self['nslice'] = int((len(cdata) - (11 + nbl * blp * 2 + 6 * (nbl - 1))) / (nbl * (blp + 2) * nvar))
print('Parsing data: ' + str(nslice) + ' slices')
r = np.zeros((blx, bly, nbl))
z = np.zeros((blx, bly, nbl))
for ibl in range(nbl):
c = 10 + ibl * (2 * blp + 6) + 2 * blp
b = 10 + ibl * (2 * blp + 6) + blp
a = 10 + ibl * (2 * blp + 6)
r[:, :, ibl] = np.reshape(cdata[a:b], (bly, blx)).T
z[:, :, ibl] = np.reshape(cdata[b:c], (bly, blx)).T
nybl = 1
for ir in range(1, nbl):
if r[0, 0, 0] != r[0, 0, ir]:
nybl = ir
break
nxbl = nbl // nybl
self['nxbl'] = nxbl
self['nybl'] = nybl
self['z'] = self._merge_blocks(z)
self['r'] = self._merge_blocks(r)
cdat2 = cdata[10 + 2 * blp * nbl + 6 * (nbl - 1) :]
varr = np.zeros((blx, bly, nslice, nbl, nvar))
for sl in range(nslice):
for iv in range(nvar):
for ibl in range(nbl):
a = 2 + iv * (blp + 2) + ibl * (blp + 2) * nvar
b = 2 + iv * (blp + 2) + ibl * (blp + 2) * nvar + blp
varr[:, :, sl, ibl, iv] = np.reshape(cdat2[a:b], (bly, blx)).T
if sl < nslice:
cdat2 = cdat2[nbl * nvar * (blp + 2) :]
printi('Restructuring blocks')
for k, label in enumerate(self.contour_labels):
if label[:3] == 'Im ':
continue
if k < varr.shape[-1]:
if 'Im ' + label in self.contour_labels:
kI = self.contour_labels.index('Im ' + label)
self[label] = self._merge_blocks(varr[:, :, :, :, k] + 1j * varr[:, :, :, :, kI])
elif ('{imp' in label) and (k + (nvar - 59) // 2 < nvar):
kI = k + (nvar - 59) // 2
self[label] = self._merge_blocks(varr[:, :, :, :, k] + 1j * varr[:, :, :, :, kI])
elif k < 59:
self[label] = self._merge_blocks(varr[:, :, :, :, k])
def _plot_contour(self, slice=0, phase=0, nlevels=21):
"""
Default plot for contour.bin files
:param slice: slice to plot
:param phase: plot real part of complex quantities multiplied by exp(1j*phase)
:param nlevels: number of levels in the contours
"""
plts = np.array([31, 35, 41, 13, 14, 15, 19, 20, 21, 25, 26, 27])
ioff()
try:
for k, label in enumerate(np.array(self.contour_labels)[plts]):
if k == 0:
ax = pyplot.subplot(3, 4, k + 1)
else:
pyplot.subplot(3, 4, k + 1, sharex=ax, sharey=ax)
if 'complex' in self[label].dtype.name and phase != 0:
contour(self['r'], self['z'], np.real(self[label][:, :, slice] * np.exp(1j * phase)), nlevels)
else:
contour(self['r'], self['z'], self[label][:, :, slice], nlevels)
pyplot.title('$' + re.sub(r'\(', '\\,(', label) + '$')
pyplot.gca().set_aspect('equal')
pyplot.plot(self['r'][-1, :], self['z'][-1, :], 'k')
autofmt_sharexy()
pyplot.subplots_adjust(wspace=0.0, hspace=0.2)
pyplot.suptitle('Slice ' + str(slice))
finally:
ion()
show()
def _read_polflux(self):
"""
Parse polflux.bin files
"""
with open(self.filename, 'rb') as f:
raw_data = f.read()
bldat = struct.unpack(">" + str(8) + 'i', raw_data[: 4 * 8])
mx = self['mx'] = bldat[6] + 1
my = self['my'] = bldat[7] + 1
cdata = self._read_table()
R = self['R'] = np.reshape(cdata[2][: mx * my], (my, mx))
Z = self['Z'] = np.reshape(cdata[2][mx * my :], (my, mx))
self['polflux'] = np.ndarray([my, mx, (len(cdata) - 3) // 2])
self['R*Bphi'] = np.ndarray([my, mx, (len(cdata) - 3) // 2])
nd = 3
while nd + 1 < len(cdata):
polflux = self['polflux'][:, :, (nd - 3) // 2] = np.reshape(cdata[nd][:], (my, mx))
nd = nd + 1
RBphi = self['R*Bphi'][:, :, (nd - 4) // 2] = np.reshape(cdata[nd][:], (my, mx))
nd = nd + 1
def _plot_polflux(self):
"""
Default plot for polflux.bin files
"""
ioff()
try:
ax = pyplot.subplot(1, 2, 1)
contourf(self['R'], self['Z'], self['polflux'])
pyplot.title('polflux')
pyplot.subplot(1, 2, 2, sharey=ax)
contourf(self['R'], self['Z'], self['R*Bphi'])
pyplot.title('R*Bphi')
autofmt_sharexy()
pyplot.subplots_adjust(wspace=0.0, hspace=0.2)
finally:
ion()
show()
def _read_flsurf(self):
"""
Parse flsurf.bin files
"""
cdata = self._read_table()
for k, label in enumerate(self.flsurf_labels):
self[label] = cdata[0, :, k]
def _plot_flsurf(self):
"""
Default plot for flsurf.bin files
"""
ioff()
try:
pyplot.plot(self['polp'], self['q_surf'], label='q_surf')
pyplot.plot(self['polp'], self['par_surf'], label='par_surf')
pyplot.title('q and j|| vs poloidal flux')
legend()
finally:
ion()
show()
def _read_discharge(self):
"""
Parse discharge.bin files
"""
alld = self._read_table_dis()
discharge_labels = self.discharge_labels[: alld.shape[-1]]
for kit, it in enumerate(discharge_labels):
if it not in ['dummy', 'lnE', 'lnIE']:
try:
self[it] = np.squeeze(alld)[:, kit]
except IndexError as _excp:
raise
printe(repr(_excp))
def _plot_discharge(self):
"""
Default plot for discharge.bin files
"""
kit = 0
for it in self:
if it not in ['istep', 'time']:
kit += 1
if kit == 1:
ax = pyplot.subplot(4, 4, kit)
else:
pyplot.subplot(4, 4, kit, sharex=ax)
pyplot.plot(self['time'] * 1e3, self[it])
title_inside(it, 0.5, 0.7)
pyplot.xlabel('time [ms]')
autofmt_sharex()
pyplot.suptitle('Discharge summary')
def _read_kpraden(self):
"""
Parse kpraden.bin files
"""
alld = self._read_table()
kpraden_labels = self.kpraden_labels[: alld.shape[-1]]
for kit, it in enumerate(kpraden_labels):
if it not in ['istep']:
self[it] = np.squeeze(alld)[:, kit]
def _plot_kpraden(self):
"""
Default plot for kpraden.bin files
"""
kit = 0
for it in self:
if it not in ['istep', 'time']:
kit += 1
if kit == 1:
ax = pyplot.subplot(6, 3, kit)
else:
pyplot.subplot(6, 3, kit, sharex=ax)
pyplot.plot(self['time'] * 1e3, self[it])
title_inside(it, 0.5, 0.7)
pyplot.xlabel('time [ms]')
autofmt_sharex()
pyplot.suptitle('kprad radiation')
def _read_kpradnz(self):
"""
Parse kpradnz.bin files
"""
alld = self._read_table()
kpradnz_labels = self.kpradnz_labels[: alld.shape[-1]]
for kit, it in enumerate(kpradnz_labels):
if it not in ['istep']:
self[it] = np.squeeze(alld)[:, kit]
def _plot_kpradnz(self):
"""
Default plot for kpradnz.bin files
"""
kit = 0
for it in self:
if it not in ['istep', 'time']:
kit += 1
if kit == 1:
ax = pyplot.subplot(3, 3, kit)
else:
pyplot.subplot(3, 3, kit, sharex=ax)
pyplot.plot(self['time'] * 1e3, self[it])
title_inside(it, 0.5, 0.7)
pyplot.xlabel('time [ms]')
autofmt_sharex()
pyplot.suptitle('kprad impurities')
def _read_energy(self):
"""
Parse energy.bin files
"""
alld = self._read_table_check()
energy_labels = self.energy_labels[: alld.shape[-1]]
for kit, it in enumerate(energy_labels):
if it in ['k', 'imode']:
continue
elif it in ['time', 'step', 'prad']:
self[it] = alld[:, 0, kit]
else:
self['modes_k'] = []
for k in range(alld.shape[1]):
kmode = alld[0, k, energy_labels.index('k')]
imode = int(alld[0, k, energy_labels.index('imode')])
self.setdefault(imode - 1, SortedDict())
self[imode - 1][it] = alld[:, imode - 1, kit]
self[imode - 1]['keff'] = kmode
self['modes_k'].append(kmode)
# self['modes_k']=np.array(self['modes_k']).astype(int)
def _plot_energy(self):
"""
Default plot for energy.bin files
"""
colors = cm.rainbow(np.linspace(0, 1, len(self['modes_k'])))
ax1 = pyplot.subplot(2, 1, 1)
pyplot.ylabel('$E_{\\rm mag}$')
ax2 = pyplot.subplot(2, 1, 2, sharex=ax1)
pyplot.ylabel('$E_{\\rm kin}$')
autofmt_sharex()
for k in range(len(self['modes_k'])):
ax1.semilogy(self['time'] * 1e3, self[k]['E_mag'], label=str(self['modes_k'][k]), color=colors[k])
for k in range(len(self['modes_k'])):
ax2.semilogy(self['time'] * 1e3, self[k]['E_kin'], label=str(self['modes_k'][k]), color=colors[k])
ax2.legend(loc=0).draggable(True)
pyplot.xlim([0, max(self['time'] * 1e3)])
pyplot.xlabel('time [ms]')
def _plot_prad(self):
"""
Prad plot for energy.bin files
"""
pyplot.semilogy(self['time'] * 1e3, self['prad'], 'k')
pyplot.ylabel('$P_{\\rm rad}$')
pyplot.xlim([0, max(self['time'] * 1e3)])
pyplot.xlabel('time [ms]')
def _read_grid(self):
"""
Parse grid.bin files
"""
alld = self._read_table()
self['r'] = []
self['z'] = []
for k in range(len(alld)):
self['r'].append(alld[k][:, 0])
self['z'].append(alld[k][:, 1])
def _plot_grid(self, alpha=1, linewidth=1, linestyle='-', color=None):
"""
Default plot for grid.bin files
"""
pyplot.gca().set_aspect('equal')
if color is None:
colors = color_cycle(len(self['r']))
else:
colors = len(self['r']) * [color]
for k in range(len(colors)):
pyplot.plot(self['r'][k], self['z'][k], color=colors[k], linewidth=linewidth, linestyle=linestyle, alpha=alpha)
pyplot.xlabel('R [m]')
pyplot.ylabel('Z [m]')
def _read_xy_slice(self):
"""
Parse xy_slice.bin files
"""
alld = self._read_table()
nmodes = int((np.size(alld, 2) - 17) // 30)
for j in range(0, 17):
self[self.xy_slice_labels[j]] = alld[:, :, j]
slice = (17, 23, 29, 35, 37, 39, 41, 43, 45, 47)
for k in range(len(slice) - 1):
# print(slice[k],slice[k+1],slice[k]-slice[0],slice[k+1]-slice[k])
for j in range(slice[k], slice[k + 1]):
label = self.xy_slice_labels[j]
if label[:3] == 'Im ':
continue
for n in range(nmodes):
self.setdefault(n, SortedDict())
if 'Im ' + label in self.xy_slice_labels:
jI = self.xy_slice_labels.index('Im ' + label)
self[n][label] = (
alld[:, :, j + (slice[k] - slice[0]) * (nmodes - 1) + n * (slice[k + 1] - slice[k])]
+ 1j * alld[:, :, jI + (slice[k] - slice[0]) * (nmodes - 1) + n * (slice[k + 1] - slice[k])]
)
else:
self[n][label] = alld[:, :, j + (slice[k] - slice[0]) * (nmodes - 1) + n * (slice[k + 1] - slice[k])]
def _plot_xy_slice(self, nlevels=21):
"""
Default plot for xy_slice.bin files
"""
for k, label in enumerate(self.xy_slice_labels[4:16]):
pyplot.subplot(3, 4, k + 1)
pyplot.gca().set_aspect('equal')
try:
contour(self['ix/mx'][:, :].T, self['iy/my'][:, :].T, self[label][:, :].T, nlevels)
except Exception:
pass
if k in [8, 9, 10, 11]:
pyplot.xlabel('ix/mx')
if k in [0, 4, 8]:
pyplot.ylabel('iy/my')
pyplot.title(label)
autofmt_sharexy()
pyplot.subplots_adjust(wspace=0.0, hspace=0.2)
def _read_xt_slice(self):
"""
Parse xt_slice.bin files
"""
alld = self._read_table()
nslice = np.size(alld, 0)
for n in range(0, nslice):
self.setdefault(n, SortedDict())
for j in range(0, 48):
label = self.xt_slice_labels[j]
if label[:3] == 'Im ':
continue
if 'Im ' + label in self.xt_slice_labels:
jI = self.xt_slice_labels.index('Im ' + label)
self[n][label] = alld[n, :, j] + 1j * alld[n, :, jI]
else:
self[n][label] = alld[n, :, j]
if np.size(alld, 2) >= 59:
for j in range(48, 66):
label = self.xt_slice_kprad_labels[j - 48]
if label[:3] == 'Im ':
continue
if 'Im ' + label in self.xt_slice_kprad_labels:
jI = self.xt_slice_kprad_labels.index('Im ' + label)
self[n][label] = alld[n, :, j] + 1j * alld[n, :, jI]
else:
self[n][label] = alld[n, :, j]
if np.size(alld, 2) >= 61:
zimp = int((np.size(alld, 2) - 66) / 2)
for j in range(66, 66 + zimp):
label = 'nz+' + str(j - 66)
self[n][label] = alld[n, :, j] + 1j * alld[n, :, j + zimp]
def _plot_xt_slice(self, nlevels=21):
"""
Default plot for xt_slice.bin files
"""
colors = color_cycle(len(self))
for k, label in enumerate(self.xt_slice_labels[i] for i in [18, 20, 24, 26, 30, 32, 36, 40, 44]):
tlabel = label
pyplot.subplot(3, 3, k + 1)
for n in self:
try:
pyplot.plot(self[n]['ix/mx'][:], self[n][label][:], color=colors[n])
if k in [0, 2, 4]:
pyplot.plot(self[n]['ix/mx'][:], self[n][label[0] + 'Z'][:], linestyle='--', color=colors[n])
tlabel = label + ',' + label[0] + 'Z'
if k in [6]:
pyplot.plot(self[n]['ix/mx'][:], self[n][label[0] + 'E'][:], linestyle='--', color=colors[n])
tlabel = label + ',' + label[0] + 'E'
if k in [8]:
pyplot.plot(self[n]['ix/mx'][:], self[n][label[0] + 'e'][:], linestyle='--', color=colors[n])
tlabel = label + ',' + label[0] + 'i'
except Exception:
pass
pyplot.xlabel('ix/mx')
pyplot.title(tlabel)
if k == 1:
pyplot.gca().legend(self)
autofmt_sharex()
pyplot.subplots_adjust(wspace=0.3, hspace=0.2)
def _read_nimhist(self):
"""
Parse nimhist.bin files
"""
alld = self._read_table()
nmodes = np.size(alld, 1)
for n in range(0, nmodes):
self.setdefault(n, SortedDict())
for j in range(0, 34):
label = self.nimhist_labels[j]
if label[:3] == 'Im ':
continue
if 'Im ' + label in self.nimhist_labels:
jdrhoI = self.nimhist_labels.index('Im ' + label)
self[n][label] = alld[:, n, j] + 1j * alld[:, n, jdrhoI]
else:
self[n][label] = alld[:, n, j]
def _read_SPIhist(self):
"""
Parse SPIhist.bin files
"""
alld = self._read_table()
SPIhist_labels = self.SPIhist_labels[: alld.shape[-1]]
for kit, it in enumerate(SPIhist_labels):
self[it] = alld[:, :, kit]
def _plot_nimhist(self, nlevels=21):
"""
Default plot for nimhist.bin files
"""
colors = cm.rainbow(np.linspace(0, 1, len(self)))
for k, label in enumerate(self.nimhist_labels[i] for i in [4, 6, 10, 12, 16, 18, 22, 26, 30]):
tlabel = label
pyplot.subplot(3, 3, k + 1)
for n in self:
try:
pyplot.plot(self[n]['t'][:], self[n][label][:], color=colors[n])
if k in [0, 2, 4]:
pyplot.plot(self[n]['t'][:], self[n][label[0] + 'Z'][:], linestyle='--', color=colors[n])
tlabel = label + ',' + label[0] + 'Z'
if k in [6]:
pyplot.plot(self[n]['t'][:], self[n][label[0] + 'E'][:], linestyle='--', color=colors[n])
tlabel = label + ',' + label[0] + 'E'
if k in [8]:
pyplot.plot(self[n]['t'][:], self[n][label[0] + 'i'][:], linestyle='--', color=colors[n])
tlabel = label + ',' + label[0] + 'i'
except Exception:
pass
pyplot.xlabel('t')
pyplot.title(tlabel)
if k == 1:
pyplot.gca().legend(self).draggable()
autofmt_sharex()
pyplot.subplots_adjust(wspace=0.3, hspace=0.2)
def _read_nimfl(self):
"""
Parse nimfl.bin files
"""
alld = self._read_table()
for k in range(0, len(alld) - 1):
self[k] = SortedDict()
self[k]['r'] = alld[k][:, 0]
self[k]['z'] = alld[k][:, 1]
def _plot_nimfl(self):
"""
Default plot for nimfl.bin files
"""
colors = color_cycle(len(self), cmap_name='hsv')
limits = {'rmin': 0, 'rmax': 0, 'zmin': 0, 'zmax': 0}
for k in list(self.keys()):
pyplot.plot(self[k]['r'], self[k]['z'], '.', color=colors[k])
limits['zmin'] = min(limits['zmin'], min(self[k]['z']))
limits['zmax'] = max(limits['zmax'], max(self[k]['z']))
pyplot.gca().set_aspect('equal')
pyplot.ylim([limits['zmin'], limits['zmax']])
[docs] @dynaLoad
def load(self):
if 'energy' in os.path.split(self.filename)[1]:
self._read_energy()
elif 'discharge' in os.path.split(self.filename)[1]:
self._read_discharge()
elif 'kpraden' in os.path.split(self.filename)[1]:
self._read_kpraden()
elif 'kpradnz' in os.path.split(self.filename)[1]:
self._read_kpradnz()
elif 'flsurf' in os.path.split(self.filename)[1]:
self._read_flsurf()
elif 'polflux' in os.path.split(self.filename)[1]:
self._read_polflux()
elif 'contour' in os.path.split(self.filename)[1]:
self._read_contour()
elif 'conrz' in os.path.split(self.filename)[1]:
self._read_contour()
elif 'grid' in os.path.split(self.filename)[1]:
self._read_grid()
elif 'xy_slice' in os.path.split(self.filename)[1]:
self._read_xy_slice()
elif 'xyrz' in os.path.split(self.filename)[1]:
self._read_xy_slice()
elif 'xyrz' in os.path.split(self.filename)[1]:
self._read_xy_slice()
elif 'xt_slice' in os.path.split(self.filename)[1]:
self._read_xt_slice()
elif 'nimfl' in os.path.split(self.filename)[1]:
self._read_nimfl()
elif 'nimhist' in os.path.split(self.filename)[1]:
self._read_nimhist()
elif 'SPIhist' in os.path.split(self.filename)[1]:
self._read_SPIhist()
else:
self['data'] = self._read_table()
[docs] def plot(self, slice=0, phase=0, nlevels=21, linewidth=1, linestyle='-', color=None, alpha=1):
"""
Default plot of energy.bin, discharge.bin, contour.bin and _.bin files
:param slice: (contour.bin) slice to plot
:param phase: (contour.bin) plot real part of complex quantities multiplied by np.exp(1j*phase)
:param nlevels: (contour.bin) number of levels in the contours
"""
if 'energy' in os.path.split(self.filename)[1]:
self._plot_energy()
elif 'discharge' in os.path.split(self.filename)[1]:
self._plot_discharge()
elif 'kpraden' in os.path.split(self.filename)[1]:
self._plot_kpraden()
elif 'kpradnz' in os.path.split(self.filename)[1]:
self._plot_kpradnz()
elif 'flsurf' in os.path.split(self.filename)[1]:
self._plot_flsurf()
elif 'polflux' in os.path.split(self.filename)[1]:
self._plot_polflux()
elif 'contour' in os.path.split(self.filename)[1]:
self._plot_contour(slice=slice, phase=phase, nlevels=nlevels)
elif 'conrz' in os.path.split(self.filename)[1]:
self._plot_contour(slice=slice, phase=phase, nlevels=nlevels)
elif 'grid' in os.path.split(self.filename)[1]:
self._plot_grid(linewidth=linewidth, linestyle=linestyle, alpha=alpha, color=color)
elif 'xy_slice' in os.path.split(self.filename)[1]:
self._plot_xy_slice(nlevels=nlevels)
elif 'xyrz' in os.path.split(self.filename)[1]:
self._plot_xy_slice(nlevels=nlevels)
elif 'xt_slice' in os.path.split(self.filename)[1]:
self._plot_xt_slice(nlevels=nlevels)
elif 'nimfl' in os.path.split(self.filename)[1]:
self._plot_nimfl()
elif 'nimhist' in os.path.split(self.filename)[1]:
self._plot_nimhist()
############################################
if '__main__' == __name__:
os.chdir(OMFITtmpDir)
foo = OMFITnimrod(os.path.dirname(__file__) + '/../../samples/nimrod_discharge.bin')
foo.load()
print(foo)