Example #1
0
def read_gf(fnam):
    gfin = ecc.GribFile(fnam)
    msgs = []
    for i in range(len(gfin)):
        msg = ecc.GribMessage(gfin)
        msgs.append(ecc.GribMessage(clone=msg))
    gfin.close()
    del gfin
    return msgs
Example #2
0
def get_field(fnam, req):
    f = ecc.GribFile(fnam)
    nfound = 0
    msghit = None
    for i in range(len(f)):
        msg = ecc.GribMessage(f)
        matchlist = []
        for key in req:
            if str(msg[key]) == str(req[key]):
                matchlist.append(1)
                continue
            else:
                break
        if len(matchlist) == len(req):
            if msghit:
                print("Ambigous spesification! found more than one match")
                print(req)
                exit(1)
            msghit = msg
            nfound += 1
    if nfound == 0:
        print("No match!")
        print(req)
    nx = msghit['Nx']
    ny = msghit['Ny']
    name = msghit['parameterName']
    val = ma.masked_values(np.flipud(msghit['values'].reshape((ny, nx))),
                           msghit['missingValue'])
    return {'vals': val, 'name': name}
Example #3
0
def compare_file(gf_their, gf_my):

    with ecc.GribFile(gf_their) as tf, ecc.GribFile(gf_my) as mf:
        if len(tf) != len(mf):
            print("different length!")
            raise Exception
        for i in range(len(tf)):
            tmsg = ecc.GribMessage(tf)
            mmsg = ecc.GribMessage(mf)
            nx = tmsg['Nx']
            ny = tmsg['Ny']
            tv = tmsg['values'].reshape((ny, nx))
            mv = mmsg['values'].reshape((ny, nx))
            if 0 in mv:
                denom = 1
            else:
                denom = mv
            plt.imshow((mv - tv) / denom)
            plt.colorbar()
            plt.title("%f - %f" % ((mv - tv).min(), (mv - tv).max()))
            plt.savefig(gf_my + '.png')
            plt.close()
Example #4
0
    def __init__(self, filename, code):
        '''
        The class Data loads data from the .grib file and performs the desired 
        manipulations on it. A Data object is the used by the functions from the
        plot module to produce plots.

        Parameters
        ----------
        filename : str
            location and filename of the .grib file
        code : str
            short name of the dataset to filter the convenient messages

        Returns
        -------
        None.

        '''
        i = 0
        self.mean_time = 0
        self.mean_space = 0
        self.lat = []
        self.lon = []

        with ecc.GribFile(filename) as grib:
            n = len(grib)//2
            for j in range(len(grib)):
                msg = ecc.GribMessage(grib)
                if msg.get('shortName') == code:
                    if i == 0:
                        self.lat = msg.get('distinctLatitudes')
                        self.lon = msg.get('distinctLongitudes')
                        self.name = msg.get('name')+' / '+msg.get('units')
                        self.sname = msg.get('shortName')
                        self.values = np.empty(
                                (n, len(self.lat), len(self.lon)))
                        
                    self.values[i,:,:] = np.reshape(msg.get('values'),
                               (len(self.lat), len(self.lon)))
                    i = i + 1

        return
Example #5
0
    def parse_grib_file(self):
        gribfile = self.source
        self.type, self.date, self.hour, self.levtype, grib2 = os.path.basename(
            gribfile).split('.')

        params = []
        levels = []
        steps = []
        with ecc.GribFile(gribfile) as gf:
            nfields = len(gf)
            for i in range(len(gf)):
                msg = ecc.GribMessage(gf)
                params.append(msg['param'])
                levels.append(msg['level'])
                steps.append(msg['step'])
                if i == 1:
                    self.date = str(msg["dataDate"])
                    self.hour = "%04d" % int(msg["dataTime"])

                    if str(msg['suiteName']) == '1':
                        self.origin = "no-ar-ce"
                    elif str(msg['suiteName']) == '2':
                        self.origin = "no-ar-cw"
                    elif str(msg['suiteName']) == '3':
                        self.origin = "no-ar-pa"
                    else:
                        print("unknown origin/suiteName")
                        exit(1)

        param = list(set(params))
        param.sort()
        self.param = param
        levelist = list(set(levels))
        levelist.sort()
        levelist.reverse()
        self.levelist = levelist
        step = list(set(steps))
        step.sort()
        self.step = step
        self.expect = nfields
Example #6
0
def plot_all(fnam):
    f = ecc.GribFile(fnam)
    dirnam = fnam + "_plots"
    if os.path.isdir(dirnam):
        pass
    else:
        os.mkdir(dirnam)

    for i in range(len(f)):
        msg = ecc.GribMessage(f)
        nx = msg['Nx']
        ny = msg['Ny']
        name = msg['parameterName']
        val = ma.masked_values(np.flipud(msg['values'].reshape((ny, nx))),
                               msg['missingValue'])
        plt.imshow(val, cmap="jet", interpolation="none")
        plt.title("%s [%s] %sH%s" %
                  (name, msg['units'], msg['date'], msg['time']))
        plt.colorbar()
        plt.savefig("%s/%s_%s_lvl%s_stp%s.png" %
                    (dirnam, re.sub("( )+", "_", name), msg['levelType'],
                     msg['level'], msg['step']))
        plt.close()
Example #7
0
print("SWE/SR input file:", infile_raw_snow)
print("SD output file:", outfile_snow_depth)

ikey = 'indicatorOfParameter'  # 13, 191
ikey = 'indicatorOfTypeOfLevel'  # sfc
ikey = 'level'  # 721,722,723

swe_per_level = []
sr_per_level = []
out_message = None

with ecc.GribFile(infile_raw_snow) as gfin_raw_snow:
    num_messages = len(gfin_raw_snow)
    for _ in range(num_messages):
        grib_message = ecc.GribMessage(gfin_raw_snow)

        parameter = grib_message['indicatorOfParameter']
        level_type = grib_message['indicatorOfTypeOfLevel']
        level = grib_message['level']
        print(parameter, level_type, level)
        if parameter == 13 and level_type == 'sfc' and level == 721:
            out_message = ecc.GribMessage(clone=grib_message)

        if parameter == 13 and level_type == 'sfc' and level in [
                721, 722, 723
        ]:
            print('Found SWE, layer {}'.format(level))
            raw_data = grib_message['values']
            masked_data = ma.masked_where(
                raw_data == grib_message['missingValue'], raw_data)
Example #8
0
infile_alb = sys.argv[2]
infile_rad = sys.argv[1]
outfile = sys.argv[3]


print("albedo file:",infile_alb)
print("radiation file:",infile_rad)
print("output file:",outfile)

gfin_alb = ecc.GribFile(infile_alb)
gfin_rad = ecc.GribFile(infile_rad)

ikey = 'indicatorOfParameter'

for i in range(len(gfin_alb)):
    msg = ecc.GribMessage(gfin_alb)
    if (msg[ikey] == 84):
        msg2 = ecc.GribMessage(clone=msg)
        break

for i in range(len(gfin_rad)):
    msg = ecc.GribMessage(gfin_rad)
    if (msg[ikey] == 111):
        ssr = msg['values']
    elif (msg[ikey] == 117):
        ssrd = msg['values'] 

undef = msg2['missingValue']

with np.errstate(divide='ignore', invalid='ignore'):
    al = 1 - np.where(ssrd < 1e-4,np.nan,ssr/ssrd)
Example #9
0
    def sendGribData(self,
                     *,
                     requestHandle: dreg.RequestHandle = None,
                     userDataReqs=None):
        if not self.registerAll_ and (not requestHandle or not userDataReqs):
            raise RuntimeError(
                "If not all topics are registered, we need to pass a request handle and list of topics"
            )

        luserDataReqs = userDataReqs
        # timestamp: {fieldname: []}
        fieldsmetadata = {}
        with ecc.GribFile(self.filename_) as grib:
            # Warning do not use/print/etc len(grib), for strange reasons it will always return the same msg
            for i in range(len(grib)):
                msg = ecc.GribMessage(grib)

                fieldname = parseGrib.getGribFieldname(
                    table2Version=msg["table2Version"],
                    indicatorOfParameter=msg["indicatorOfParameter"],
                    indicatorOfTypeOfLevel=msg["indicatorOfTypeOfLevel"],
                    typeOfLevel=msg["typeOfLevel"],
                    timeRangeIndicator=msg["timeRangeIndicator"])
                # fieldname2 = self.getGribFieldname(msg)
                if not fieldname:
                    print(
                        'WARNING: found a grib field with no match in table : ',
                        msg['cfVarName'], msg['table2Version'],
                        msg['indicatorOfParameter'],
                        msg['indicatorOfTypeOfLevel'])
                    continue

                if fieldname in [x.name
                                 for x in luserDataReqs] or self.registerAll_:
                    timestamp = self.getTimestamp(msg)
                    toplevel = msg["topLevel"]
                    levels = fieldsmetadata.setdefault(timestamp,
                                                       {}).setdefault(
                                                           fieldname, [])
                    bisect.insort(levels, toplevel)

        with ecc.GribFile(self.filename_) as grib:
            # Warning do not use/print/etc len(grib), for strange reasons it will always return the same msg
            for i in range(len(grib)):
                msg = ecc.GribMessage(grib)

                fieldname = parseGrib.getGribFieldname(
                    table2Version=msg["table2Version"],
                    indicatorOfParameter=msg["indicatorOfParameter"],
                    indicatorOfTypeOfLevel=msg["indicatorOfTypeOfLevel"],
                    typeOfLevel=msg["typeOfLevel"],
                    timeRangeIndicator=msg["timeRangeIndicator"])
                # fieldname2 = self.getGribFieldname(msg)
                if not fieldname:
                    print(
                        'WARNING: found a grib field with no match in table : ',
                        msg['cfVarName'], msg['table2Version'],
                        msg['indicatorOfParameter'],
                        msg['indicatorOfTypeOfLevel'])
                    continue
                if self.registerAll_:
                    # Only subscribe if the field was not registered yet
                    requestHandle = dreg.DataRegistry.subscribeIfNotExists(
                        self, fieldname)
                    assert requestHandle

                if fieldname in [x.name
                                 for x in luserDataReqs] or self.registerAll_:
                    timestamp = self.getTimestamp(msg)

                    levels = fieldsmetadata[timestamp][fieldname]

                    requestHandle.timestamp_ = timestamp

                    ni = msg['Ni']
                    nj = msg['Nj']

                    lord = 'F'
                    if not msg['jPointsAreConsecutive'] == 0:
                        lord = 'C'

                    arr = np.reshape(ecc.codes_get_values(msg.gid), (ni, nj),
                                     order='F').astype(np.float32)
                    lev = msg["topLevel"]

                    level_index = levels.index(lev)
                    msgkey = data.MsgKey(1, fieldname, 1, 0,
                                         timestamp, 0, 0, level_index, ni, nj,
                                         len(levels), ni, nj,
                                         msg["longitudeOfFirstGridPoint"],
                                         msg["longitudeOfLastGridPoint"],
                                         msg["latitudeOfFirstGridPoint"],
                                         msg["latitudeOfLastGridPoint"])
                    self.insertDataPatch(
                        requestHandle, fieldname,
                        fieldop.SinglePatch(0, 0, ni, nj, level_index, arr),
                        msgkey)