Source code for omfit_classes.omfit_efit

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_hdf5 import OMFIThdf5
from omfit_classes.utils_fusion import available_EFITs
import numpy as np

__all__ = ['OMFITefitCDF', 'available_EFITs']


[docs]class OMFITefitCDF(OMFIThdf5): r""" class used to interface CDF files generated by EFIT++ :param filename: filename passed to OMFITascii class :param \**kw: keyword dictionary passed to OMFITascii class """ @property def times(self): return self['time']['data']
[docs] def plot(self, time=None): """ Function used to plot input constraints and outputs This method is called by .plot() when the object is a CDF file :param time: time in seconds :return: None """ if time is None: time = self.times[0] fig = pyplot.gcf() fig.set_size_inches(11, 8) self.ax = pyplot.subplot(221) self.plot_trace('boundaries', title='Boundary', yname='[m]', xname='Time [s]', tgtName='rCoords', sigName='rSigmas') self.ax = pyplot.subplot(222) self.plot_trace('plasmaCurrent', title='Current', yname='[A]', xname='Time [s]', sigName='sigma') self.ax = pyplot.subplot(223) self.plot_profile('pressures', time, title='Pressure', yname='[Pa]', rName="rCoords") self.ax = pyplot.subplot(224) self.plot_profile('mse', time, title='MSE', yname='[Radians]', ylim_min=-5, ylim_max=5)
[docs] def plot_trace( self, grpName, yname=None, xname='Radius [m]', tgtName="target", cmpName="computed", sigName="sigmas", title=None, ylim_min=None, ylim_max=None, ): """ :param grpName: EFIT++ constraint dictionary name e.g. [input][constraints][grpName] :param yname: y-axis figure title :param xname: x-axis figure title :param tgtName: EFIT++ target profile dictionary name e.g. [input][constraints][grpName][tgtName] :param cmpName: EFIT++ computed profile dictionary name e.g. [input][constraints][grpName][cmpName] :param sigName: EFIT++ sigma profile dictionary name e.g. [input][constraints][grpName][sigName] :param title: figure title :param ylim_min: y-axis figure minimum value :param ylim_max: y-axis figure maximum value :return: """ if grpName not in self['input']['constraints']: print(grpName + " constraint does not exist") self.ax.set_visible(False) return # target profiles target = np.squeeze(self['input']['constraints'][grpName][tgtName]['data']) sigmas = np.squeeze(self['input']['constraints'][grpName][sigName]['data']) # computed profiles if grpName == 'boundaries': computed = np.squeeze(self['output']['separatrixGeometry']['rmidplaneOut']['data']) else: computed = np.squeeze(self['input']['constraints'][grpName][cmpName]['data']) self.ax.ticklabel_format(style='sci', scilimits=(0, 0), axis='y') self.ax.errorbar(self.times, target, marker='o', markersize=5, yerr=sigmas, label='Target', color='b') self.ax.plot(self.times, computed, marker='x', markersize=5, label='Computed', linewidth=2, color='r') self.ax.set_ylim(ylim_min, ylim_max) self.ax.legend(title=title, prop={'size': 10}, bbox_to_anchor=[0.98, 0.98], fancybox=True) self.ax.set_ylabel(yname) self.ax.set_xlabel(xname) self.ax.grid(True, linestyle='-', color='0.75', linewidth=0.2)
[docs] def plot_profile( self, grpName, time=None, yname=None, xname='Radius [m]', tgtName="target", cmpName="computed", sigName="sigmas", rName="r", title=None, ylim_min=None, ylim_max=None, ): ''' :param grpName: EFIT++ constraint dictionary name e.g. [input][constraints][grpName] :param time: single time slice in seconds to plot profile data :param yname: y-axis figure title :param xname: x-axis figure title :param tgtName: EFIT++ target profile dictionary name e.g. [input][constraints][grpName][tgtName] :param cmpName: EFIT++ computed profile dictionary name e.g. [input][constraints][grpName][cmpName] :param sigName: EFIT++ sigma profile dictionary name e.g. [input][constraints][grpName][sigName] :param rName: EFIT++ radius profile dictionary name e.g. [input][constraints][grpName][rName] :param title: figure title :param ylim_min: y-axis figure minimum value :param ylim_max: y-axis figure maximum value :return: ''' if time is None: time = self.times[0] if grpName not in self['input']['constraints']: print(grpName + " constraint does not exist") self.ax.set_visible(False) return # profile time slice tind = np.abs(time - self.times).argmin() # target profiles target = self['input']['constraints'][grpName][tgtName]['data'] sigmas = self['input']['constraints'][grpName][sigName]['data'] # computed profiles computed = self['input']['constraints'][grpName][cmpName]['data'] # radius radius = self['input']['constraints'][grpName][rName]['data'] # separatrix rSepOut = self['output']['separatrixGeometry']['rmidplaneOut']['data'] if len(np.shape(radius)) > 1: radius = radius[tind, :] self.ax.ticklabel_format(style='sci', scilimits=(0, 0), axis='y') self.ax.errorbar(radius, target[tind, :], marker='o', markersize=5, yerr=sigmas[tind, :], label='Target', color='b') self.ax.plot(radius, computed[tind, :], marker='x', markersize=5, label='Computed', linewidth=2, color='r') self.ax.set_ylim(ylim_min, ylim_max) self.ax.plot([rSepOut[tind], rSepOut[tind]], self.ax.get_ylim(), linestyle='--', color='r', label='Separatrix') self.ax.legend(title=title + '; t= ' + str(time) + ' s', prop={'size': 10}, bbox_to_anchor=[0.98, 0.98], fancybox=True) self.ax.set_ylabel(yname) self.ax.set_xlabel(xname) self.ax.grid(True, linestyle='-', color='0.75', linewidth=0.2)
############################################ if '__main__' == __name__: test_classes_main_header() tmp = OMFITefitCDF(OMFITsrc + '/../samples/efitOut.nc') print(tmp)