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
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}
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()
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
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
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()
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)
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)
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)