def setup_IR(): config = Container() seviriRttov = pyrttov.Rttov() chan_list_seviri = (6, 9) # 4 # https://nwp-saf.eumetsat.int/downloads/rtcoef_rttov12/ir_srf/rtcoef_msg_4_seviri_srf.html config.nchan = len(chan_list_seviri) config.chan_seviri_names = ('WV73', 'IR108') # 'NIR16', 'IR39', seviriRttov.FileCoef = '{}/{}'.format( path_RTTOV, "/rtcoef_rttov13/rttov13pred54L/rtcoef_msg_4_seviri_o3co2.dat") seviriRttov.FileSccld = '{}/{}'.format( path_RTTOV, "/rtcoef_rttov13/cldaer_visir/sccldcoef_msg_4_seviri.dat") seviriRttov.Options.StoreRad = False seviriRttov.Options.Nthreads = 48 seviriRttov.Options.NprofsPerCall = 840 seviriRttov.Options.AddInterp = True seviriRttov.Options.AddSolar = True # true with MFASIS seviriRttov.Options.AddClouds = True seviriRttov.Options.GridBoxAvgCloud = True seviriRttov.Options.UserCldOptParam = False seviriRttov.Options.VisScattModel = 1 # MFASIS=3 / 1 for IR sim necessary! seviriRttov.Options.IrScattModel = 2 seviriRttov.Options.OzoneData = False seviriRttov.Options.VerboseWrapper = False seviriRttov.Options.Verbose = False # False: do not print warnings # ApplyRegLimits=True: Input profiles can be clipped to the regression limits when the limits are exceeded seviriRttov.Options.ApplyRegLimits = True try: seviriRttov.loadInst(chan_list_seviri) except pyrttov.RttovError as e: sys.stderr.write("Error loading instrument(s): {!s}".format(e)) sys.exit(1) irAtlas = pyrttov.Atlas() irAtlas.AtlasPath = '{}/{}'.format(path_RTTOV, "/emis_data") #brdfAtlas = pyrttov.Atlas() #brdfAtlas.AtlasPath = '{}/{}'.format(path_RTTOV, "/brdf_data") config.seviriRttov = seviriRttov config.irAtlas = irAtlas #config.brdfAtlas = brdfAtlas return config
def do_init(self, opt): """Initialize the Rttov object. Optionally accepts instrument as input.""" self.instrument = opt if opt else 'iasi' # Set up Rttov object self.Rttov = pyrttov.Rttov() if self.instrument in list(INSTRUMENTS.keys()): self.Rttov.FileCoef = INSTRUMENTS[self.instrument] else: self.Rttov.FileCoef = self.instrument # Set options self.Rttov.Options.AddInterp = True self.Rttov.Options.InterpMode = 4 #4 is highest fidelity, 5 is all-around self.Rttov.Options.VerboseWrapper = 0 self.Rttov.Options.StoreTrans = True self.Rttov.Options.StoreRad2 = True # Load instrument self.Rttov.loadInst() return
def setup_rttov(chan_list, chanfile, cldfile, in_prof, n_threads): """Main RTTOV setup functions.""" my_rttov = pyrttov.Rttov() my_rttov.FileCoef = chanfile my_rttov.FileSccld = cldfile my_rttov.Options.AddInterp = True my_rttov.Options.AddSolar = False my_rttov.Options.VerboseWrapper = True my_rttov.Options.AddClouds = True my_rttov.Options.CheckOpts = True my_rttov.Options.DoCheckinput = True my_rttov.Options.Nthreads = n_threads my_rttov.Options.NprofsPerCall = 5 my_rttov.loadInst(chan_list) my_rttov.Profiles = in_prof in_prof.Icede[:, :] = 0 return my_rttov, len(chan_list)
def runRTTOV(profileDict): nlevels = profileDict['P'].shape[1] nprofiles = profileDict['P'].shape[0] myProfiles = pyrttov.Profiles(nprofiles, nlevels) myProfiles.GasUnits = 2 myProfiles.P = profileDict['P'] myProfiles.T = profileDict['T'] myProfiles.Q = profileDict['Q'] myProfiles.Angles = profileDict['Angles'] myProfiles.S2m = profileDict['S2m'] myProfiles.Skin = profileDict['Skin'] myProfiles.SurfType = profileDict['SurfType'] myProfiles.SurfGeom = profileDict['SurfGeom'] myProfiles.DateTimes = profileDict['Datetimes'] month = profileDict['Datetimes'][0, 1] # ------------------------------------------------------------------------ # Set up Rttov instance # ------------------------------------------------------------------------ # Create Rttov object for the TIRS instrument tirsRttov = pyrttov.Rttov() # nchan_tirs = 1 # Set the options for each Rttov instance: # - the path to the coefficient file must always be specified # - specify paths to the emissivity and BRDF atlas data in order to use # the atlases (the BRDF atlas is only used for VIS/NIR channels so here # it is unnecessary for HIRS or MHS) # - turn RTTOV interpolation on (because input pressure levels differ from # coefficient file levels) # - set the verbose_wrapper flag to true so the wrapper provides more # information # - enable solar simulations for SEVIRI # - enable CO2 simulations for HIRS (the CO2 profiles are ignored for # the SEVIRI and MHS simulations) # - enable the store_trans wrapper option for MHS to provide access to # RTTOV transmission structure s = pyrttov.__file__ envPath = os.sep.join(s.split(os.sep)[:-6]) rttovPath = os.path.join(envPath, 'share') rttovCoeffPath = os.path.join(rttovPath, 'rttov') rttovEmisPath = os.path.join(rttovCoeffPath, 'emis_data') rttovBRDFPath = os.path.join(rttovCoeffPath, 'brdf_data') if not os.path.exists(rttovBRDFPath): print("downloading atlases.....") ftp = ftplib.FTP("ftp.star.nesdis.noaa.gov") ftp.login("anonymous", "") ftp.cwd('/pub/smcd/emb/mschull/') # change directory to /pub/ getFile(ftp, 'rttov_atlas.tar') ftp.quit() untar('rttov_atlas.tar', rttovPath) subprocess.check_output("chmod 755 %s%s*.H5" % (rttovEmisPath, os.sep), shell=True) subprocess.check_output("chmod 755 %s%s*.H5" % (rttovBRDFPath, os.sep), shell=True) tirsRttov.FileCoef = '{}/{}'.format(rttovCoeffPath, "rtcoef_landsat_8_tirs.dat") tirsRttov.EmisAtlasPath = rttovEmisPath tirsRttov.BrdfAtlasPath = rttovBRDFPath tirsRttov.Options.AddInterp = True tirsRttov.Options.StoreTrans = True tirsRttov.Options.StoreRad2 = True tirsRttov.Options.VerboseWrapper = True # Load the instruments: try: tirsRttov.loadInst() except pyrttov.RttovError as e: sys.stderr.write("Error loading instrument(s): {!s}".format(e)) sys.exit(1) # Associate the profiles with each Rttov instance tirsRttov.Profiles = myProfiles # ------------------------------------------------------------------------ # Load the emissivity and BRDF atlases # ------------------------------------------------------------------------ # Load the emissivity and BRDF atlases: # - load data for August (month=8) # - note that we only need to load the IR emissivity once and it is # available for both SEVIRI and HIRS: we could use either the seviriRttov # or hirsRttov object to do this # - for the BRDF atlas, since SEVIRI is the only VIS/NIR instrument we can # use the single-instrument initialisation tirsRttov.irEmisAtlasSetup(month) # ------------------------------------------------------------------------ # Call RTTOV # ------------------------------------------------------------------------ # Since we want the emissivity/reflectance to be calculated, the # SurfEmisRefl attribute of the Rttov objects are left uninitialised: # That way they will be automatically initialise to -1 by the wrapper # Call the RTTOV direct model for each instrument: # no arguments are supplied to runDirect so all loaded channels are # simulated try: tirsRttov.runDirect() except pyrttov.RttovError as e: sys.stderr.write("Error running RTTOV direct model: {!s}".format(e)) sys.exit(1) return tirsRttov
def runRTTOV(profileDict): nlevels = profileDict['P'].shape[1] nprofiles = profileDict['P'].shape[0] myProfiles = pyrttov.Profiles(nprofiles, nlevels) myProfiles.GasUnits = 2 myProfiles.P = profileDict['P'] myProfiles.T = profileDict['T'] myProfiles.Q = profileDict['Q'] myProfiles.Angles = profileDict['Angles'] myProfiles.S2m = profileDict['S2m'] myProfiles.Skin = profileDict['Skin'] myProfiles.SurfType = profileDict['SurfType'] myProfiles.SurfGeom = profileDict['SurfGeom'] myProfiles.DateTimes = profileDict['Datetimes'] month = profileDict['Datetimes'][0, 1] # ------------------------------------------------------------------------ # Set up Rttov instance # ------------------------------------------------------------------------ # Create Rttov object for the TIRS instrument tirsRttov = pyrttov.Rttov() nchan_tirs = 1 # Set the options for each Rttov instance: # - the path to the coefficient file must always be specified # - specify paths to the emissivity and BRDF atlas data in order to use # the atlases (the BRDF atlas is only used for VIS/NIR channels so here # it is unnecessary for HIRS or MHS) # - turn RTTOV interpolation on (because input pressure levels differ from # coefficient file levels) # - set the verbose_wrapper flag to true so the wrapper provides more # information # - enable solar simulations for SEVIRI # - enable CO2 simulations for HIRS (the CO2 profiles are ignored for # the SEVIRI and MHS simulations) # - enable the store_trans wrapper option for MHS to provide access to # RTTOV transmission structure tirsRttov.FileCoef = '{}/{}'.format( rttov_installdir, "rtcoef_rttov11/rttov7pred54L/rtcoef_landsat_8_tirs.dat") #tirsRttov.EmisAtlasPath = os.path.join(base,'ALEXIdisALEXIfusion','rttov113','emis_data') tirsRttov.EmisAtlasPath = '{}/{}'.format(rttov_installdir, "emis_data") print "%s" % tirsRttov.EmisAtlasPath tirsRttov.BrdfAtlasPath = '{}/{}'.format(rttov_installdir, "brdf_data") #tirsRttov.BrdfAtlasPath = os.path.join(base,'ALEXIdisALEXIfusion','rttov113','brdf_data') tirsRttov.Options.AddInterp = True tirsRttov.Options.StoreTrans = True tirsRttov.Options.StoreRad2 = True tirsRttov.Options.VerboseWrapper = True # Load the instruments: try: tirsRttov.loadInst() except pyrttov.RttovError as e: sys.stderr.write("Error loading instrument(s): {!s}".format(e)) sys.exit(1) # Associate the profiles with each Rttov instance tirsRttov.Profiles = myProfiles # ------------------------------------------------------------------------ # Load the emissivity and BRDF atlases # ------------------------------------------------------------------------ # Load the emissivity and BRDF atlases: # - load data for August (month=8) # - note that we only need to load the IR emissivity once and it is # available for both SEVIRI and HIRS: we could use either the seviriRttov # or hirsRttov object to do this # - for the BRDF atlas, since SEVIRI is the only VIS/NIR instrument we can # use the single-instrument initialisation tirsRttov.irEmisAtlasSetup(month) # ------------------------------------------------------------------------ # Call RTTOV # ------------------------------------------------------------------------ # Since we want the emissivity/reflectance to be calculated, the # SurfEmisRefl attribute of the Rttov objects are left uninitialised: # That way they will be automatically initialise to -1 by the wrapper # Call the RTTOV direct model for each instrument: # no arguments are supplied to runDirect so all loaded channels are # simulated try: tirsRttov.runDirect() except pyrttov.RttovError as e: sys.stderr.write("Error running RTTOV direct model: {!s}".format(e)) sys.exit(1) return tirsRttov
crtmOb.nThreads = 1 crtmOb.StoreTrans = True crtmOb.StoreEmis = True crtmOb.loadInst() crtmOb.runDirect() ######################### # End Run CRTM ######################### ######################### # Run RTTOV ######################### # Create Rttov object rttovObj = pyrttov.Rttov() # set options. rttovObj.Options.AddInterp = False rttovObj.Options.InterpMode = 3 rttovObj.Options.FixHgpl = True rttovObj.Options.RegLimitExtrap = False rttovObj.Options.Spacetop = False rttovObj.Options.Lgradp = False rttovObj.Options.StoreTrans = True rttovObj.Options.StoreRad = True rttovObj.Options.StoreRad2 = True rttovObj.Options.StoreEmisTerms = True rttovObj.Options.VerboseWrapper = True rttovObj.Options.CO2Data = True rttovObj.Options.OzoneData = True rttovObj.Options.COData = True
def setup_VIS(): config = Container() seviriRttov = pyrttov.Rttov() # select channels chan_list_seviri = ( 1, ) # 2 ) # https://nwp-saf.eumetsat.int/downloads/rtcoef_rttov12/ir_srf/rtcoef_msg_4_seviri_srf.html config.nchan = len(chan_list_seviri) config.chan_seviri_names = ( 'VIS06', ) # 'VIS08') #, 'NIR16', 'IR39', 'WV73', 'IR108') # Set the options for each Rttov instance: # - the path to the coefficient file must always be specified # - turn RTTOV interpolation on (because input pressure levels differ from # coefficient file levels) # - set the verbose_wrapper flag to true so the wrapper provides more # information # - enable solar simulations for SEVIRI # - enable CO2 simulations for HIRS (the CO2 profiles are ignored for # the SEVIRI and MHS simulations) seviriRttov.FileCoef = '{}/{}'.format( path_RTTOV, "/rtcoef_rttov13/rttov13pred54L/rtcoef_msg_4_seviri_o3co2.dat") # CLOUD COEFFICIENTS seviriRttov.FileSccld = '{}/{}'.format( path_RTTOV, "/rtcoef_rttov13/cldaer_visir/sccldcoef_msg_4_seviri.dat") # MFASIS LOOKUPTABLE # seviriRttov.FileMfasisCld = '{}/{}'.format(path_RTTOV, # "/rtcoef_rttov12/mfasis_lut/rttov_mfasis_cld_msg_4_seviri_opac.H5") seviriRttov.FileMfasisCld = '{}/{}'.format( path_RTTOV, "/rtcoef_rttov13/mfasis_lut/rttov_mfasis_cld_msg_4_seviri_deff.H5") seviriRttov.Options.StoreRad = False seviriRttov.Options.Nthreads = 48 seviriRttov.Options.NprofsPerCall = 840 seviriRttov.Options.AddInterp = True seviriRttov.Options.AddSolar = True seviriRttov.Options.AddClouds = True seviriRttov.Options.GridBoxAvgCloud = True seviriRttov.Options.UserCldOptParam = False seviriRttov.Options.VisScattModel = 3 # MFASIS=3 seviriRttov.Options.IrScattModel = 2 seviriRttov.Options.OzoneData = False seviriRttov.Options.VerboseWrapper = False #True seviriRttov.Options.Verbose = False # False: do not print warnings # ApplyRegLimits=True: Input profiles can be clipped to the regression limits when the limits are exceeded seviriRttov.Options.ApplyRegLimits = True # Load the instruments: for HIRS and MHS do not supply a channel list and try: seviriRttov.loadInst(chan_list_seviri) except pyrttov.RttovError as e: sys.stderr.write("Error loading instrument(s): {!s}".format(e)) sys.exit(1) irAtlas = pyrttov.Atlas() irAtlas.AtlasPath = '{}/{}'.format(path_RTTOV, "/emis_data") brdfAtlas = pyrttov.Atlas() brdfAtlas.AtlasPath = '{}/{}'.format(path_RTTOV, "/brdf_data") config.seviriRttov = seviriRttov config.irAtlas = irAtlas config.brdfAtlas = brdfAtlas return config