def get_levels_keys(fileId, nomvar, datev=-1, ip2=-1, ip3=-1, typvar=' ', etiket=' ', vGrid=None, thermoMom='VIPT', verbose=False): """ """ #TODO: try to get the sorted ip1 list w/o vgrid, because vgrid doesn;t support 2 different vertical coor in the same file (or list of linked files) # Get the vgrid definition present in the file if vGrid is None: if verbose: print("Getting vertical grid description") _vgd.vgd_put_opt('ALLOW_SIGMA', _vgd.VGD_ALLOW_SIGMA) vGrid = _vgd.vgd_read(fileId) vip = _vgd.vgd_get(vGrid, thermoMom) if verbose: vkind = _vgd.vgd_get(vGrid, 'KIND') vver = _vgd.vgd_get(vGrid, 'VERS') vtype = _vgd.VGD_KIND_VER_INV[(vkind,vver)] print("Found %d %s levels of type %s" % (len(vip), thermoMom, vtype)) # Trim the list of ip1 to actual levels in files for nomvar # since the vgrid in the file is a super set of all levels # and get their "key" vipkeys = [] for ip1 in vip: (lval, lkind) = _rmn.convertIp(_rmn.CONVIP_DECODE, ip1) key = _rmn.fstinf(fileId, nomvar=nomvar, datev=datev, ip2=ip2, ip3=ip3, ip1=_rmn.ip1_all(lval, lkind), typvar=typvar, etiket=etiket) if key is not None: vipkeys.append((ip1, key['key'])) if datev == -1 or ip2 == -1 or ip3 == -1 or typvar.strip() == '' or etiket.strip() == '': meta = _rmn.fstprm(key) datev = meta['datev'] ip2 = meta['ip2'] ip3 = meta['ip3'] typvar = meta['typvar'] etiket = meta['etiket'] return { 'nomvar' : nomvar, 'datev' : datev, 'ip2' : ip2, 'ip3' : ip3, 'typvar' : typvar, 'etiket' : etiket, 'v' : vGrid, 'ip1keys': vipkeys }
def testGetPutOptInt(self): v1 = vgd.vgd_get_opt('ALLOW_SIGMA') self.assertEqual(v1,vgd.VGD_DISALLOW_SIGMA) vgd.vgd_put_opt('ALLOW_SIGMA', vgd.VGD_ALLOW_SIGMA) v2 = vgd.vgd_get_opt('ALLOW_SIGMA') self.assertEqual(v2,vgd.VGD_ALLOW_SIGMA)
def get_levels_keys(fileId, nomvar, datev=-1, ip2=-1, ip3=-1, typvar=' ', etiket=' ', vGrid=None, thermoMom='VIPT', verbose=False): """ Get from file the list of ip1 and fstd-record-key matching provided filters ipkeys = get_levels_keys(fileId, nomvar) Args: fileId : unit number associated to the file obtained with fnom+fstouv nomvar : variable name datev : valid date ip2 : forecast hour ip3 : user defined identifier typvar : type of field etiket : label vGrid : vertical grid descriptor thermoMom : 'VIPT' to get Thermo levels, 'VIPT' for momentum levels verbose : Print some info when true Returns: { 'nomvar' : nomvar, # variable name 'datev' : datev, # valid date 'ip2' : ip2, # forecast hour 'ip3' : ip3, # user defined identifier 'typvar' : typvar, # type of field 'etiket' : etiket, # label 'vgrid' : vGrid, # vertical grid descriptor as returned by vgd_read 'ip1keys': vipkeys # list of ip1 and corresponding FSTD rec key as # ((ip1,key1), (ip1b, key2), ...) } Raises: TypeError on wrong input arg types ValueError on invalid input arg value FSTDError on any other error Examples: >>> import os, os.path >>> import rpnpy.librmn.all as rmn >>> import rpnpy.utils.fstd3d as fstd3d >>> ATM_MODEL_DFILES = os.getenv('ATM_MODEL_DFILES').strip() >>> filename = os.path.join(ATM_MODEL_DFILES,'bcmk') >>> >>> # Open existing file in Rear Only mode >>> fileId = rmn.fstopenall(filename, rmn.FST_RO) >>> >>> # Find ip1, key for all TT in file >>> ipkeys = fstd3d.get_levels_keys(fileId, 'TT', thermoMom='VIPT', verbose=True) Getting vertical grid description Found 158 VIPT levels of type hyb >>> print('# Found {} levels for TT'.format(len(ipkeys['ip1keys']))) # Found 80 levels for TT >>> rmn.fstcloseall(fileId) See Also: get_levels_press fst_read_3d rpnpy.librmn.fstd98.fstinf rpnpy.librmn.fstd98.fstprm rpnpy.librmn.fstd98.fstopenall rpnpy.librmn.fstd98.fstcloseall rpnpy.vgd.base.vgd_read """ #TODO: try to get the sorted ip1 list w/o vgrid, because vgrid doesn;t support 2 different vertical coor in the same file (or list of linked files) # Get the vgrid definition present in the file if vGrid is None: if verbose: print("Getting vertical grid description") _vgd.vgd_put_opt('ALLOW_SIGMA', _vgd.VGD_ALLOW_SIGMA) vGrid = _vgd.vgd_read(fileId) vip = _vgd.vgd_get(vGrid, thermoMom) if verbose: vkind = _vgd.vgd_get(vGrid, 'KIND') vver = _vgd.vgd_get(vGrid, 'VERS') vtype = _vgd.VGD_KIND_VER_INV[(vkind, vver)] print("Found %d %s levels of type %s" % (len(vip), thermoMom, vtype)) # Trim the list of ip1 to actual levels in files for nomvar # since the vgrid in the file is a super set of all levels # and get their "key" vipkeys = [] for ip1 in vip: (lval, lkind) = _rmn.convertIp(_rmn.CONVIP_DECODE, ip1) key = _rmn.fstinf(fileId, nomvar=nomvar, datev=datev, ip2=ip2, ip3=ip3, ip1=_rmn.ip1_all(lval, lkind), typvar=typvar, etiket=etiket) if key is not None: vipkeys.append((ip1, key['key'])) if (datev == -1 or ip2 == -1 or ip3 == -1 or typvar.strip() == '' or etiket.strip() == ''): meta = _rmn.fstprm(key) datev = meta['datev'] ip2 = meta['ip2'] ip3 = meta['ip3'] typvar = meta['typvar'] etiket = meta['etiket'] return { 'nomvar': nomvar, 'datev': datev, 'ip2': ip2, 'ip3': ip3, 'typvar': typvar, 'etiket': etiket, 'vgrid': vGrid, 'ip1keys': vipkeys }