예제 #1
0
def abs(ctx):
    vlog(ctx, 'Calculating the absolute value')
    pushChain(ctx, 'transform.log')
    for s in ctx.obj['sets']:
        values = ctx.obj['dataSets'][s].getValues()
        values = np.abs(values)
        ctx.obj['dataSets'][s].push(values)
예제 #2
0
def pow(ctx, **kwargs):
    vlog(ctx, 'Calculating the power of {:f}'.format(kwargs['power']))
    pushChain(ctx, 'temp.pow', **kwargs)
    for s in ctx.obj['sets']:
        values = ctx.obj['dataSets'][s].getValues()
        values = values**kwargs['power']
        ctx.obj['dataSets'][s].push(values)
예제 #3
0
def recovery(ctx, **kwargs):
    vlog(ctx, 'Starting recovery')
    pushChain(ctx, 'recovery', **kwargs)
    data = ctx.obj['data']

    if kwargs['basistype'] is not None:
        if kwargs['basistype'] == 'ms' or kwargs['basistype'] == 'ns':
            basisType = 'serendipity'
        elif kwargs['basistype'] == 'mo':
            basisType = 'maximal-order'
    else:
        basisType = None
    #end

    for dat in data.iterator(kwargs['use']):
        dg = GInterpModal(dat, kwargs['polyorder'], basisType,
                          kwargs['interp'], kwargs['periodic'])
        numNodes = dg.numNodes
        numComps = int(dat.getNumComps() / numNodes)

        #vlog(ctx, 'interplolate: interpolating dataset #{:d}'.format(s))
        #dg.recovery(tuple(range(numComps)), stack=True)
        if kwargs['tag']:
            out = Data(tag=kwargs['tag'],
                       label=kwargs['label'],
                       compgrid=ctx.obj['compgrid'],
                       meta=dat.meta)
            grid, values = dg.recovery(0, kwargs['c1'])
            out.push(grid, values)
            data.add(out)
        else:
            dg.recovery(0, kwargs['c1'], overwrite=True)
        #end
    #end
    vlog(ctx, 'Finishing recovery')
예제 #4
0
파일: mask.py 프로젝트: ammarhakim/postgkyl
def mask(ctx, **kwargs):
    vlog(ctx, 'Starting mask')
    pushChain(ctx, 'mask', **kwargs)
    data = ctx.obj('data')

    if kwargs['filename']:
        maskFld = Data(kwargs['filename']).getValues()
    #end

    for dat in data.interator(kwargs['use']):
        values = dat.getValues()

        if kwargs['filename']:
            maskFldRep = np.repeat(maskFld, dat.getNumComps(), axis=-1)
            data.push(np.ma.masked_where(maskFldRep < 0.0, values))
        elif kwargs['lower'] is not None and kwargs['upper'] is not None:
            dat.push(
                np.ma.masked_outside(values, kwargs['lower'], kwargs['upper']),
                grid)
        elif kwargs['lower'] is not None:
            dat.push(np.ma.masked_less(values, kwargs['lower']))
        elif kwargs['upper'] is not None:
            dat.push(np.ma.masked_greater(values, kwargs['upper']))
        else:
            data.push(values, grid)
            click.echo(
                click.style(
                    "WARNING in 'mask': No masking information specified.",
                    fg='yellow'))
        #end
    #end

    vlog(ctx, 'Finishing mask')
예제 #5
0
def mult(ctx, **kwargs):
    vlog(ctx, 'Multiplying by {:f}'.format(kwargs['factor']))
    pushChain(ctx, 'temp.mult', **kwargs)
    for s in ctx.obj['sets']:
        values = ctx.obj['dataSets'][s].getValues()
        values = values * kwargs['factor']
        ctx.obj['dataSets'][s].push(values)
예제 #6
0
def energetics(ctx, **kwargs):
    vlog(ctx, 'Starting energetics decomposition')
    pushChain(ctx, 'energetics', **kwargs)

    data = ctx.obj['data']  # shortcut

    for elc, ion, em in zip(data.iterator(kwargs['elc']),
                            data.iterator(kwargs['ion']),
                            data.iterator(kwargs['field'])):
        grid = em.getGrid()
        outEnergetics = np.zeros(em.getValues()[..., 0:7].shape)
        out = Data(tag=kwargs['tag'],
                   compgrid=ctx.obj['compgrid'],
                   label=kwargs['label'],
                   meta=em.meta)
        grid, outEnergetics = diag.energetics(elc, ion, em)
        out.push(grid, outEnergetics)
        data.add(out)
    #end

    data.deactivateAll(tag=kwargs['elc'])
    data.deactivateAll(tag=kwargs['ion'])
    data.deactivateAll(tag=kwargs['field'])

    vlog(ctx, 'Finishing energetics decomposition')


#end
예제 #7
0
def perprotate(ctx, **kwargs):
    """Rotate an array perpendicular to the unit vectors of a second array.
    For two arrays u and v, where v is the rotator, operation is u - (u dot v_hat) v_hat.
    """
    vlog(ctx, 'Starting rotation perpendicular to rotator array')
    pushChain(ctx, 'rotarraypar', **kwargs)

    data = ctx.obj['data']  # shortcut

    for a, rot in zip(data.iterator(kwargs['array']),
                      data.iterator(kwargs['rotator'])):
        grid, outrot = diag.perprotate(a, rot)
        # Create new GData structure with appropriate outtag and labels to store output.
        out = Data(tag=kwargs['tag'],
                   compgrid=ctx.obj['compgrid'],
                   label=kwargs['label'],
                   meta=a.meta)
        out.push(outrot, grid)
        data.add(out)
    #end

    data.deactivateAll(tag=kwargs['array'])
    data.deactivateAll(tag=kwargs['rotator'])

    vlog(ctx, 'Finishing rotation perpendicular to rotator array')
예제 #8
0
def listoutputs(ctx, **kwargs):
    """List Gkeyll filename stems in the current directory
    """
    vlog(ctx, 'Starting listoutputs')
        
    files = glob('*.{:s}'.format(kwargs['extension']))
    unique = []
    for fn in files:
        # remove extension
        s = fn[:-(len(kwargs['extension'])+1)]
        # strip "restart"
        if s.endswith('_restart'):
            s = s[:-8]
        #end
        #strip digits
        s = re.sub(r'_\d+$', '', s)
        if s not in unique:
            unique.append(s)
        #end
    #end
    for s in sorted(unique):
        click.echo(s)
    #end
    
    vlog(ctx, 'Finishing listoutputs')
예제 #9
0
def bparrotate(ctx, **kwargs):
    """Rotate an array parallel to the unit vectors of the magnetic field.
    For two arrays u and b, where b is the unit vector in the direction of the magnetic field, 
    the operation is (u dot b_hat) b_hat. Note that the magnetic field is a three-component field, 
    so the output is a new vector whose components are (u_{b_x}, u_{b_y}, u_{b_z}), i.e.,
    the x, y, and z components of the vector u parallel to the magnetic field. 
    """
    vlog(ctx, 'Starting rotation parallel to magnetic field')
    pushChain(ctx, 'arrayBpar', **kwargs)

    data = ctx.obj['data']  # shortcut

    for a, rot in zip(data.iterator(kwargs['array']),
                      data.iterator(kwargs['field'])):
        # Magnetic field is components 3, 4, & 5 in field array
        grid, outrot = diag.parrotate(a, rot, '3:6')
        # Create new GData structure with appropriate outtag and labels to store output.
        out = Data(tag=kwargs['tag'],
                   compgrid=ctx.obj['compgrid'],
                   label=kwargs['label'],
                   meta=a.meta)
        out.push(grid, outrot)
        data.add(out)
    #end

    data.deactivateAll(tag=kwargs['array'])
    data.deactivateAll(tag=kwargs['field'])

    vlog(ctx, 'Finishing rotation parallel to magnetic field')
예제 #10
0
def log(ctx):
    vlog(ctx, 'Calculating the natural log')
    pushChain(ctx, 'temp.log')
    for s in ctx.obj['sets']:
        values = ctx.obj['dataSets'][s].getValues()
        values = np.log(values)
        ctx.obj['dataSets'][s].push(values)
예제 #11
0
def info(ctx, **kwargs):
    vlog(ctx, 'Starting info')
    pushChain(ctx, 'info', **kwargs)
    data = ctx.obj['data']
    if kwargs['allsets']:
        onlyActive = False
    else:
        onlyActive = True
    #end

    for i, dat in data.iterator(kwargs['use'], enum=True, onlyActive=onlyActive):
        if dat.getStatus():
            color = 'green'
            bold = True
        else:
            color = None
            bold = False
        #end
        click.echo(click.style("Set {:s} ({:s}#{:d})".format(dat.getLabel(), dat.getTag(), i,),
                               fg=color, bold=bold))
        if not kwargs['compact']:
            click.echo(dat.info() + "\n")
        #end
    #end

    vlog(ctx, 'Finishing info')
예제 #12
0
def deactivate(ctx, **kwargs):
    """Select datasets(s) to pass further down the command
    chain. Datasets are indexed starting 0. Multiple datasets can be
    selected using a comma separated list or a range specifier. Unless
    '--focused' is selected, all unselected datasets will be
    activated.

    '--tag' and '--index' allow to specify tags and indices. The not
    specified, 'deactivate' applies to all. Both parameters support
    comma-separated values. '--index' also supports slices following
    the Python conventions, e.g., '3:7' or ':-5:2'.

    'info' command (especially with the '-ac' flags) can be helpful
    when activating/deactivating multiple datasets.

    """
    vlog(ctx, 'Starting deactivate')
    pushChain(ctx, 'deactivate', **kwargs)
    data = ctx.obj['data']

    if kwargs['focused']:
        data.activateAll()
    #end

    for dat in data.iterator(tag=kwargs['tag'],
                             onlyActive=False,
                             select=kwargs['index']):
        dat.deactivate()
    #end

    vlog(ctx, 'Finishing deactivate')
예제 #13
0
def bperprotate(ctx, **kwargs):
    """Rotate an array perpendicular to the unit vectors of the magnetic field.
    For two arrays u and b, where b is the unit vector in the direction of the magnetic field, 
    the operation is u - (u dot b_hat) b_hat.
    """
    vlog(ctx, 'Starting rotation perpendicular to magnetic field')
    pushChain(ctx, 'arrayBpar', **kwargs)

    data = ctx.obj['data']  # shortcut

    for a, rot in zip(data.iterator(kwargs['array']),
                      data.iterator(kwargs['field'])):
        # Magnetic field is components 3, 4, & 5 in field array
        grid, outrot = diag.perprotate(a, rot, '3:6')
        # Create new GData structure with appropriate outtag and labels to store output.
        out = Data(tag=kwargs['tag'],
                   compgrid=ctx.obj['compgrid'],
                   label=kwargs['label'],
                   meta=a.meta)
        out.push(grid, outrot)
        data.add(out)
    #end

    data.deactivateAll(tag=kwargs['array'])
    data.deactivateAll(tag=kwargs['field'])

    vlog(ctx, 'Finishing rotation perpendicular to magnetic field')
예제 #14
0
def agyro(ctx, **kwargs):
    """Compute a measure of agyrotropy. Default measure is taken from
    Swisdak 2015. Optionally computes agyrotropy as Frobenius norm of
    agyrotropic pressure tensor. Pressure-tensor must be the first
    dataset and magnetic field the second dataset.

    """
    vlog(ctx, 'Starting agyro')
    pushChain(ctx, 'agyro', **kwargs)

    grid = ctx.obj['dataSets'][ctx.obj['sets'][0]].getGrid()
    lo, up = ctx.obj['dataSets'][ctx.obj['sets'][0]].getBounds()

    pij = ctx.obj['dataSets'][ctx.obj['sets'][0]].getValues()
    B = ctx.obj['dataSets'][ctx.obj['sets'][1]].getValues()

    if kwargs['forb']:
        tmp = getForb(pij, B)
    else:
        tmp = getSwisdak(pij, B)

    tmp = tmp[..., np.newaxis]

    ctx.obj['dataSets'].append(GData())
    idx = len(ctx.obj['dataSets']) - 1
    ctx.obj['dataSets'][idx].push(tmp, grid)
    ctx.obj['sets'] = [idx]

    vlog(ctx, 'Finishing agyro')
예제 #15
0
def interpolate(ctx, **kwargs):
    vlog(ctx, 'Starting interpolate')
    pushChain(ctx, 'interpolate', **kwargs)
    data = ctx.obj['data']

    basisType = None
    isModal = None
    if kwargs['basistype'] is not None:
        if kwargs['basistype'] == 'ms':
            basisType = 'serendipity'
            isModal = True
        elif kwargs['basistype'] == 'ns':
            basisType = 'serendipity'
            isModal = False
        elif kwargs['basistype'] == 'mo':
            basisType = 'maximal-order'
            isModal = True
        elif kwargs['basistype'] == 'mt':
            basisType = 'tensor'
            isModal = True
        #end
    #end
    
    for dat in data.iterator(kwargs['use']):
        if kwargs['basistype'] is None and dat.meta['basisType'] is None:
            ctx.fail(click.style("ERROR in interpolate: no 'basistype' was specified and dataset {:s} does not have required metadata".format(dat.getLabel()), fg='red'))
        #end
        
        if isModal or dat.meta['isModal']:
            dg = GInterpModal(dat,
                              kwargs['polyorder'], kwargs['basistype'], 
                              kwargs['interp'], kwargs['read'])
        else:
            dg = GInterpNodal(dat,
                              kwargs['polyorder'], basisType,
                              kwargs['interp'], kwargs['read'])
        #end
            
        numNodes = dg.numNodes
        numComps = int(dat.getNumComps() / numNodes)
        
        if not kwargs['new']:
            if kwargs['tag']:
                out = Data(tag=kwargs['tag'],
                           label=kwargs['label'],
                           compgrid=ctx.obj['compgrid'],
                           meta=dat.meta)
                grid, values = dg.interpolate(tuple(range(numComps)))
                out.push(grid, values)
                data.add(out)
            else:
                dg.interpolate(tuple(range(numComps)), overwrite=True)
            #end
        else:
            interpFn(dat, kwargs['polyorder'])
        #end
    #end
    vlog(ctx, 'Finishing interpolate')
예제 #16
0
def trajectory(ctx, **kwargs):
    vlog(ctx, 'Starting trajectory')
    pushChain(ctx, 'trajectory', **kwargs)
    data = ctx.obj['data']

    tags = list(data.tagIterator(kwargs['use']))
    if len(tags) > 1:
        ctx.fail(
            click.echo(
                "'trajectory' supports only one 'tag', was provided {:d}".
                format(len(tags)),
                fg='red'))
    else:
        tag = tags[0]
    #end

    numSets = len(ctx.obj['sets'])
    fig = plt.figure()
    ax = Axes3D(fig)
    kwargs['figure'] = fig
    kwargs['legend'] = False

    dat = ctx.obj['data'].getDataset(tag, 0)
    numPos = dat.getNumCells()[0]

    jump = 1
    if kwargs['numframes'] is not None:
        jump = int(math.floor(numPos / kwargs['numframes']))
        numPos = int(kwargs['numframes'])
    #end

    anim = FuncAnimation(fig,
                         update,
                         numPos,
                         fargs=(ax, ctx, jump, kwargs['velocity'],
                                kwargs['xmin'], kwargs['xmax'], kwargs['ymin'],
                                kwargs['ymax'], kwargs['zmin'], kwargs['zmax'],
                                tag),
                         interval=kwargs['interval'])

    ax.view_init(elev=kwargs['elevation'], azim=kwargs['azimuth'])

    if kwargs['fixaspect']:
        plt.setp(ax, aspect=1.0)

    fName = 'anim.mp4'
    if kwargs['saveas']:
        fName = str(kwargs['saveas'])
    #end
    if kwargs['save'] or kwargs['saveas']:
        anim.save(fName, writer='ffmpeg')
    #end

    if kwargs['show']:
        plt.show()
    #end
    vlog(ctx, 'Finishing trajectory')
예제 #17
0
def val2coord(ctx, **kwargs):
    """Given a dataset (typically a DynVector) selects columns from it to
    create new datasets. For example, you can choose say column 1 to
    be the X-axis of the new dataset and column 2 to be the
    Y-axis. Multiple columns can be choosen using range specifiers and
    as many datasets are then created.

    """
    vlog(ctx, 'Starting val2coord')
    pushChain(ctx, 'val2coord', **kwargs)
    data = ctx.obj['data']

    activeSets = []
    colors = ['C0', 'C1', 'C2', 'C3', 'C4', 'C5', 'C6', 'C7', 'C8', 'C9']

    tags = list(data.tagIterator())
    outTag = kwargs['tag']
    if outTag is None:
        if len(tags) == 1:
            outTag = tags[0]
        else:
            outTag = 'val2coord'
        #end
    #end
    
    for setIdx, dat in data.iterator(kwargs['use'], enum=True):
        values = dat.getValues()
        xComps = _getRange(kwargs['x'], len(values[0, :]))
        yComps = _getRange(kwargs['y'], len(values[0, :]))

        if len(xComps) > 1 and len(xComps) != len(yComps):
            click.echo(click.style("ERROR 'val2coord': Length of the x-components ({:d}) is greater than 1 and not equal to the y-components ({:d}).".format(len(xComps), len(yComps)), fg='red'))
            ctx.exit()
        #end
        
        for i, yc in enumerate(yComps):
            if len(xComps) > 1:
                xc = xComps[i]
            else:
                xc = xComps[0]
            #end

            x = values[..., xc]
            y = values[..., yc, np.newaxis]

            out = Data(tag=outTag,
                       label=kwargs['label'],
                       compgrid=ctx.obj['compgrid'],
                       meta=dat.meta)
            out.push([x], y)
            out.color = 'C0'
            data.add(out)
        #end
        dat.deactivate()
    #end
    vlog(ctx, 'Finishing val2coord')
예제 #18
0
파일: blot.py 프로젝트: ammarhakim/postgkyl
def blot(ctx, **kwargs):
    vlog(ctx, 'Starting blot')
    pushChain(ctx, 'blot', **kwargs)

    # if kwargs['group'] is not None:
    #     kwargs['group'] = int(kwargs['group'])
    #end

    fName = ""
    for dat in ctx.obj['data'].iterator(kwargs['use']):
        # if len(ctx.obj['sets']) > 1 or kwargs['forcelegend']:
        #     label = ctx.obj['labels'][s]
        # else:
        #     label = ''
        #end
        # if kwargs['arg'] is not None:
        #     gplot(dat, kwargs['arg'], labelPrefix=label,
        #          **kwargs)
        # else:
        #     gplot(dat, labelPrefix=label,
        #          **kwargs)
        # #end
        fig = postgkyl.output.blot(dat, **kwargs)

        # if (kwargs['save'] or kwargs['saveas']):
        #     if kwargs['saveas']:
        #         fName = kwargs['saveas']
        #     else:
        #         if fName != "":
        #             fName = fName + "_"
        #             #end
        #         if dat.fName:
        #             fName = fName + dat.fName.split('.')[0]
        #         else:
        #             fName = fName + 'ev_'+ctx.obj['labels'][s].replace(' ', '_')
        #         #end
        #     #end
        # #end
        # if (kwargs['save'] or kwargs['saveas']) and kwargs['figure'] is None:
        #     fName = str(fName) + '.png'
        #     plt.savefig(fName, dpi=kwargs['dpi'])
        #     fName = ""
        # #end
    #end
    #if (kwargs['save'] or kwargs['saveas']) and kwargs['figure'] is not None:
    #    fName = str(fName) + '.png'
    #    plt.savefig(fName, dpi=kwargs['dpi'])
    #end

    if kwargs['show']:
        blt.show(fig)
    #end
    vlog(ctx, 'Finishing blot')
예제 #19
0
def extractinput(ctx, **kwargs):
    vlog(ctx, 'Starting ')
    pushChain(ctx, 'extractinput', **kwargs)
    data = ctx.obj['data']

    for dat in data.iterator(kwargs['use']):
        encInp = dat.getInputFile()
        if encInp:
            inpfile = base64.decodebytes(
                encInp.encode('utf-8')).decode('utf-8')
            click.echo(inpfile)
        else:
            click.echo("No embedded input file!")
        #end
    #end
    vlog(ctx, 'Finishing extractinput')
예제 #20
0
파일: pr.py 프로젝트: ammarhakim/postgkyl
def pr(ctx, **kwargs):
    vlog(ctx, 'Starting pr')
    pushChain(ctx, 'pr', **kwargs)
    data = ctx.obj['data']

    for dat in data.iterator(kwargs['use']):
        if kwargs['grid']:
            grid = dat.getGrid()
            for g in grid:
                click.echo(g)
            #end
        else:
            click.echo(dat.getValues().squeeze())
        #end
    #end

    vlog(ctx, 'Finishing pr')
예제 #21
0
def write(ctx, **kwargs):
    """Write active dataset to a file. The output file format can be set 
    with ``--mode``, and is ADIOS BP by default. If data is
    saved as BP file it can be later loaded back into pgkyl to further
    manipulate or plot it.

    """
    vlog(ctx, 'Starting write')
    pushChain(ctx, 'write', **kwargs)
    data = ctx.obj['data']

    for dat in data.iterator(kwargs['use']):
        dat.write(outName=kwargs['filename'],
                  mode=kwargs['mode'],
                  bufferSize=kwargs['buffersize'])
    #end
    vlog(ctx, 'Finishing write')
예제 #22
0
def norm(ctx, **kwargs):
    vlog(ctx, 'Normalizing data')
    pushChain(ctx, 'temp.norm', **kwargs)
    for s in ctx.obj['sets']:
        values = ctx.obj['dataSets'][s].getValues()
        numComps = ctx.obj['dataSets'][s].getNumComps()
        valuesOut = values.copy()
        for comp in range(numComps):
            if kwargs['shift']:
                valuesOut[..., comp] -= valuesOut[..., comp].min()
            if kwargs["usefirst"]:
                valuesOut[..., comp] /= valuesOut[..., comp].item(0)
            else:
                valuesOut[..., comp] /= np.abs(valuesOut[..., comp]).max()
            #end
        #end
        ctx.obj['dataSets'][s].push(valuesOut)
예제 #23
0
def current(ctx, **kwargs):
    vlog(ctx, 'Starting current accumulation')
    pushChain(ctx, 'current', **kwargs)
    data = ctx.obj['data']

    for dat in data.iterator(kwargs['use']):
        grid = dat.getGrid()
        outcurrent = np.zeros(dat.getValues().shape)
        grid, outcurrent = diag.accumulate_current(dat, kwargs['qbym'])
        dat.deactivate()
        out = Data(tag=kwargs['tag'],
                   compgrid=ctx.obj['compgrid'],
                   label=kwargs['label'],
                   meta=dat.meta)
        out.push(grid, outcurrent)
        data.add(out)
    #end
    vlog(ctx, 'Finishing current accumulation')
예제 #24
0
def integrate(ctx, **kwargs):
    vlog(ctx, 'Starting integrate')
    pushChain(ctx, 'integrate', **kwargs)
    data = ctx.obj['data']
    
    for dat in data.iterator(kwargs['use']):
        if kwargs['tag']:
            grid, values = diag.integrate(dat, kwargs['axis'])
            out = Data(tag=kwargs['tag'],
                       label=kwargs['label'],
                       compgrid=ctx.obj['compgrid'],
                       meta=dat.meta)
            out.push(grid, values)
            data.add(out)
        else:
            diag.integrate(dat, kwargs['axis'], overwrite=True)
        #en
    #end
        
    vlog(ctx, 'Finishing integrate')
예제 #25
0
def growth(ctx, **kwargs):
    """Attempts to compute growth rate (i.e. fit e^(2x)) from DynVector
    data, typically an integrated quantity like electric or magnetic
    field energy.
    """
    vlog(ctx, 'Starting growth')
    pushChain( ctx, 'growth', **kwargs) 
    data = ctx.obj['data']
    
    for dat in data.iterator(kwargs['use']):
        time = dat.getGrid()
        values = dat.getValues()
        numDims = dat.getNumDims()
        if numDims > 1:
            click.fail(click.style("'growth' is available only for 1D data (used on {:d}D data)".format(numDims), fg='red'))
        #end
        
        bestParams, bestR2, bestN = fitGrowth(time[0], values[..., 0],
                                              minN=kwargs['minn'],
                                              maxN=kwargs['maxn'],
                                              p0=kwargs['guess'])

        if kwargs['plot'] is True:
            vlog(ctx, 'growth: Plotting data and fit')
            plt.style.use(os.path.dirname(os.path.realpath(__file__)) \
                      + "/../output/postgkyl.mplstyle")
            fig, ax = plt.subplots()
            ax.plot(time[0], values[..., 0], '.')
            ax.set_autoscale_on(False)
            ax.plot(time[0], exp2(time[0], *bestParams))
            ax.grid(True)
            plt.show()
        #end

        if kwargs['instantaneous'] is True:
            vlog(ctx, 'growth: Plotting instantaneous growth rate')
            gammas = []
            for i in range(1,len(time[0])-1):
                gamma = (values[i+1,0] - values[i-1,0])/(2*values[i,0]*(time[0][i+1] - time[0][i-1]))
                gammas.append(gamma)
            
            plt.style.use(os.path.dirname(os.path.realpath(__file__)) \
                      + "/../output/postgkyl.mplstyle")
            fig, ax = plt.subplots()
            ax.plot(time[0][1:-1], gammas)
            #ax.set_autoscale_on(False)
            ax.grid(True)
            plt.show()
        #end
    #end
    vlog(ctx, 'Finishing growth')
예제 #26
0
def magsq(ctx, **kwargs):
    """Calculate the magnitude squared of an input array
    """
    vlog(ctx, 'Starting magnitude squared computation')
    pushChain(ctx, 'magsq', **kwargs)
    data = ctx.obj['data']

    for dat in data.iterator(kwargs['use']):
        if kwargs['tag']:
            out = Data(tag=kwargs['tag'],
                       label=kwargs['label'],
                       compgrid=ctx.obj['compgrid'],
                       meta=dat.meta)
            grid, values = diag.magsq(dat)
            out.push(grid, values)
            data.add(out)
        else:
            diag.magsq(dat, overwrite=True)
        #end
    #end

    vlog(ctx, 'Finishing magnitude squared computation')
예제 #27
0
파일: fft.py 프로젝트: ammarhakim/postgkyl
def fft(ctx, **kwargs):
    """Calculate the Fourier Transform or the power-spectral density of
    input data. Only works on 1D data at present.
    """
    vlog(ctx, 'Starting FFT')
    pushChain(ctx, 'fft', **kwargs)
    data = ctx.obj['data']

    for dat in data.iterator(kwargs['use']):
        if kwargs['tag']:
            out = Data(tag=kwargs['tag'],
                       label=kwargs['label'],
                       compgrid=ctx.obj['compgrid'],
                       meta=dat.meta)
            grid, values = diag.fft(dat, kwargs['psd'], kwargs['iso'])
            out.push(grid, values)
            data.add(out)
        else:
            diag.fft(dat, kwargs['psd'], kwargs['iso'], overwrite=True)
        #end
    #end

    vlog(ctx, 'Finishing FFT')
예제 #28
0
def velocity(ctx, **kwargs):
    vlog(ctx, 'Starting velocity')
    pushChain(ctx, 'velocity', **kwargs)

    data = ctx.obj['data']  # shortcut

    for m0, m1 in zip(data.iterator(kwargs['density']),
                      data.iterator(kwargs['momentum'])):
        grid = m0.getGrid()
        valsM0 = m0.getValues()
        valsM1 = m1.getValues()

        out = Data(tag=kwargs['tag'],
                   compgrid=ctx.obj['compgrid'],
                   label=kwargs['label'],
                   meta=m0.meta)
        out.push(grid, valsM1 / valsM0)
        data.add(out)
    #end

    data.deactivateAll(tag=kwargs['density'])
    data.deactivateAll(tag=kwargs['momentum'])

    vlog(ctx, 'Finishing velocity')
예제 #29
0
def select(ctx, **kwargs):
    r"""Subselect data from the active dataset(s). This command allows, for
    example, to choose a specific component of a multi-component
    dataset, select a index or coordinate range. Index ranges can also
    be specified using python slice notation (start:end:stride).

    """
    vlog(ctx, 'Starting select')
    pushChain(ctx, 'select', **kwargs)
    data = ctx.obj['data']
    
    for dat in data.iterator(kwargs['use']):
        if kwargs['tag']:
            out = Data(tag=kwargs['tag'],
                       label=kwargs['label'],
                       compgrid=ctx.obj['compgrid'],
                       meta=dat.meta)
            grid, values = postgkyl.data.select(dat,
                                                z0=kwargs['z0'],
                                                z1=kwargs['z1'],
                                                z2=kwargs['z2'],
                                                z3=kwargs['z3'],
                                                z4=kwargs['z4'],
                                                z5=kwargs['z5'],
                                                comp=kwargs['comp'])
            out.push(grid, values)
            data.add(out)
        else:
            postgkyl.data.select(dat, overwrite=True,
                                 z0=kwargs['z0'], z1=kwargs['z1'],
                                 z2=kwargs['z2'], z3=kwargs['z3'],
                                 z4=kwargs['z4'], z5=kwargs['z5'],
                                 comp=kwargs['comp'])
        #end
    #end
    vlog(ctx, 'Finishing select')
예제 #30
0
def cli(ctx, **kwargs):
    """Postprocessing and plotting tool for Gkeyll 
    data. Datasets can be loaded, processed and plotted using a
    command chaining mechanism. For full documentation see the Gkeyll
    documentation webpages. Help for individual commands can be
    obtained using the --help option for that command.
    """
    ctx.obj = {}  # The main contex object
    ctx.obj['startTime'] = time.time(
    )  # Timings are written in the verbose mode
    if kwargs['verbose']:
        ctx.obj['verbose'] = True
        # Monty Python references should be a part of any Python code
        vlog(ctx, 'This is Postgkyl running in verbose mode!')
        vlog(ctx, 'Spam! Spam! Spam! Spam! Lovely Spam! Lovely Spam!')
        vlog(ctx, 'And now for something completelly different...')
    else:
        ctx.obj['verbose'] = False
    #end

    home = os.path.expanduser('~')
    ctx.obj['savechainPath'] = (home + '/.pgkyl/pgkylchain')
    if kwargs['savechain'] or kwargs['savechainas'] is not None:
        ctx.obj['savechain'] = True
        try:
            os.makedirs(home + "/.pgkyl")
        except FileExistsError:
            # directory already exists
            pass
        #end
        if kwargs['savechainas'] is not None:
            ctx.obj['savechainPath'] = (home + '/.pgkyl/' +
                                        str(kwargs['savechainas']))
        #end
        fh = open(ctx.obj['savechainPath'], 'w')  # The default chain name
        fh.close()
    else:
        ctx.obj['savechain'] = False
    #end

    ctx.obj['inDataStrings'] = []
    ctx.obj['inDataStringsLoaded'] = 0

    ctx.obj['data'] = DataSpace()

    ctx.obj['fig'] = ''
    ctx.obj['ax'] = ''

    ctx.obj['compgrid'] = kwargs['compgrid']
    ctx.obj['globalVarNames'] = kwargs['varname']
    ctx.obj['globalCuts'] = (kwargs['z0'], kwargs['z1'], kwargs['z2'],
                             kwargs['z3'], kwargs['z4'], kwargs['z5'],
                             kwargs['component'])