Ejemplo n.º 1
0
def verticalIntegral(grid):
    """ Computes a vertical coordinate integral of a 3D grid.
  """
    from visad import Real
    levels = getLevels(grid)
    dlevels = getAbsCDiff(levels)
    vavg = GridUtil.make2DGridFromSlice(
        GridUtil.sliceAtLevel(grid,
                              levels[len(levels) - 1])).multiply(Real(0.0))
    for level, dlevel in zip(levels, dlevels):
        vavg = vavg + GridUtil.make2DGridFromSlice(
            GridUtil.sliceAtLevel(grid, float(level)), 0).multiply(
                Real(dlevel))
    return vavg
Ejemplo n.º 2
0
def areaWeights(grid):
    """ Computes area weights of a grid and returns the grid with 
      weights at each grid.
  """
    from visad import Real
    areaW = createAreaField(grid)
    areaSum = sum(areaW.getValues()[0])
    return areaW.divide(Real(areaSum))
Ejemplo n.º 3
0
def computeGridAreaAverage(variable):
    from ucar.unidata.util.Misc import getAverage
    from visad import Real
    #print GridUtil.isTimeSequence(variable)
    areaW = createAreaField(variable)
    sumareaW = sum(areaW.getValues()[0])
    areaW = areaW.divide(Real(sumareaW))
    test = variable.getSample(0).multiply(areaW)
    aavg = sum(test.getValues()[0]) / len(test.getValues()[0])
    return aavg
Ejemplo n.º 4
0
def getSliceAtAltitude(fieldimpl, alt, unit="m"):
    """ Extract a 2D horizontal slice from a 3D grid at the given altitude;
      level is a real number; if unit is supplied, it must
      be compatible with meters (ft, fathoms, etc)
      param fieldimpl is a grid which may have
      one or more time steps.  """
    #import methods from
    from visad import RealType
    from visad import Real
    alt = float(alt)
    unit = Util.parseUnit(unit)
    altitude = Real(RealType.Altitude, alt, unit)
    ff = GridUtil.sliceAtLevel(fieldimpl, altitude)
    return ff
Ejemplo n.º 5
0
def ddt(grid, timegradunit):
    """ compute tendency (time derivative) using forward difference, 
      units of returned grid are units of grid per timegradient unit 
      timegradient unit can be month, day, hour, minute, seconds
      
  """
    from visad import Real
    from visad import FunctionType
    from visad import FieldImpl
    from visad import RealType
    from visad import Gridded1DDoubleSet
    from ucar.visad.data import CalendarDateTime
    from visad import CommonUnit
    from visad import VisADException
    if (GridUtil.isTimeSequence(grid) == 1):
        newTimeValues = []
        timediffs = []
        ts = GridUtil.getTimeSet(grid)
        if (str(timegradunit).lower() in ("mon", "month", "months")):
            timefactor = 86400.0 * 30
            timegradunit = "month"
        elif (str(timegradunit).lower() in ("day", "d", "days")):
            timefactor = 86400.0
            timegradunit = "day"
        elif (str(timegradunit).lower() in ("hr", "hour", "hours")):
            timefactor = 3600.0
            timegradunit = "hr"
        elif (str(timegradunit).lower() in ("m", "min", "minute", "minutes")):
            timefactor = 60.0
            timegradunit = "min"
        elif (str(timegradunit).lower() in ("s", "sec", "second", "seconds")):
            timefactor = 1.0
            timegradunit = "s"
        else:
            raise VisADException(
                "Requested time gradient unit is ambigious,use month,day,hour etc"
            )
        for i in range(grid.getDomainSet().getLength() - 1):
            newTimeValues.append((ts[i].getValue() + ts[i + 1].getValue()) / 2)
            prevtime = float(ts[i].getValue(CommonUnit.secondsSinceTheEpoch))
            nexttime = float(ts[i + 1].getValue(
                CommonUnit.secondsSinceTheEpoch))
            timediffs.append((nexttime - prevtime) / timefactor)
        newTimes = Gridded1DDoubleSet(RealType.Time, [newTimeValues],
                                      len(newTimeValues), None,
                                      ts.getSetUnits(), None)
        ddtgrid = FieldImpl(
            FunctionType(RealType.Time,
                         grid.getSample(0).getType()), newTimes)
        for i in range(grid.getDomainSet().getLength() - 1):
            diff = (grid.getSample(i + 1) - grid.getSample(i)).divide(
                Real(timediffs[i]))
            ddtgrid.setSample(i, diff)
        unitname = str(
            GridUtil.getParamType(grid).getComponent(0).getDefaultUnit())
        print("[" + unitname + "]/" + str(timegradunit))
        newunit = Util.parseUnit("(" + unitname + ")/" + str(timegradunit))
        newType = Util.makeRealType("ddt of " + getVarName(grid), newunit)
    else:
        raise VisADException(
            "Well, this data is not a time series, hard to do a time derivative!"
        )
    return GridUtil.setParamType(ddtgrid, newType, 0)
Ejemplo n.º 6
0
def createTimeMeans(grid, meanType="None"):
    """ Create time mean of a grid at periods specified by type.
      meanType can be yearly, monthly, daily, hourly, minutes, seconds
  """
    from visad import Real
    from visad import Gridded1DDoubleSet
    from visad import FieldImpl
    from visad import FunctionType
    from visad import RealType
    from visad import VisADException

    if (str(meanType).lower() in ("year", "yr", "years", "yearly")):
        searchFormat = "yyyy"
    elif (str(meanType).lower() in ("mon", "month", "months", "monthly")):
        searchFormat = "MM"
    elif (str(meanType).lower() in ("day", "d", "days", "daily")):
        searchFormat = "dd"
    elif (str(meanType).lower() in ("hr", "hour", "hours", "hourly")):
        searchFormat = "hh"
    elif (str(meanType).lower()
          in ("m", "min", "minute", "minutes", "minutely")):
        searchFormat = "mm"
    elif (str(meanType).lower() in ("s", "sec", "second", "seconds")):
        searchFormat = "ss"
    else:
        raise VisADException(
            "Unrecognized time mean type, use yearly or monthly etc")
    alltimes = getSampleTimesInFormat(grid, searchFormat)
    timeSet = GridUtil.getTimeSet(grid)
    timeset = GridUtil.getTimeSet(grid).getSamples()[0]
    timevalues = [i for i in timeset]
    oldtime = alltimes[0]
    temptime = 0
    count = 0
    newtimelist = []
    for currt, tv, i in zip(alltimes, timevalues, range(len(alltimes))):
        #values are always accumulated next time
        if currt == oldtime:
            #takes care of multiple times,first time,last time
            temptime = temptime + tv
            count = count + 1
            if (i == (len(alltimes) - 1)):
                newtimeval = temptime / count
                newtimelist.append(newtimeval)
        else:
            #prev values are accumulated join to list
            newtimeval = temptime / count
            newtimelist.append(newtimeval)
            count = 1
            temptime = tv
            oldtime = currt
            if (i == (len(alltimes) - 1)):
                newtimelist.append(temptime)
    #create new time set
    newTimes = Gridded1DDoubleSet(RealType.Time,
                                  [newtimelist], len(newtimelist), None,
                                  timeSet.getSetUnits(), None)
    newdatalist = FieldImpl(
        FunctionType(RealType.Time,
                     grid.getSample(0).getType()), newTimes)
    timindices = range(len(newtimelist))
    oldtime = alltimes[0]
    tempdata = grid.getSample(0).multiply(Real(0.0))
    count = 0
    newind = 0
    for currt, i in zip(alltimes, range(len(alltimes))):
        #values are always accumulated next time
        if currt == oldtime:
            #takes care of multiple times,first time,last time
            tempdata = tempdata.add(grid.getSample(i))
            count = count + 1
            if (i == (len(alltimes) - 1)):
                newdatalist.setSample(newind, tempdata.divide(Real(count)))
                newind = newind + 1
        else:
            #prev values are accumulated join to list
            newdatalist.setSample(newind, tempdata.divide(Real(count)))
            newind = newind + 1
            count = 1
            tempdata = grid.getSample(i)
            oldtime = currt
            if (i == (len(alltimes) - 1)):
                newdatalist.setSample(newind, tempdata.divide(Real(count)))
    newParamName = "Time Mean " + str(
        Util.cleanTypeName(GridUtil.getParamType(grid)))
    return newName(newdatalist, newParamName)
Ejemplo n.º 7
0
rangetype = a.getType().getRange()
maps = subs.makeMaps(RealType.Latitude, "y", RealType.Longitude, "x",
                     rangetype[0], "text")
disp = subs.makeDisplay3D(maps)

pcontrol = disp.getProjectionControl()
dzoom = DiscoverableZoom()
pcontrol.addControlListener(dzoom)

tcontrol = maps[2].getControl()
tcontrol.setAutoSize(1)

rends = []

for i in range(ydim / 2, ydim / 2 + 20):
    for j in range(xdim / 2, xdim / 2 + 20):

        ref = DataReferenceImpl("data")
        latlon = cs.toReference(((j, ), (i, )))
        tuple = RealTuple(
            (a[i * xdim + j][0], Real(RealType.Latitude, latlon[0][0]),
             Real(RealType.Longitude, latlon[1][0])))

        ref.setData(tuple)
        rend = DefaultRendererJ3D()
        rends.append(rend)
        disp.addReferences(rend, ref, None)

dzoom.setRenderers(rends, .1)
subs.showDisplay(disp)