def rotate( dat, lons, to_pacific=False ): '''rotate longitudes in WGS84 Global Extent''' if to_pacific == True: # to 0 - 360 dat, lons = utils.shiftgrid( 0., dat, lons ) elif to_pacific == False: # to -180.0 - 180.0 dat, lons = utils.shiftgrid( 180., dat, lons, start=False ) else: raise AttributeError( 'to_pacific must be boolean True:False' ) return dat, lons
def rotate( dat, lons, to_pacific=False ): '''rotate longitudes in WGS84 Global Extent''' if to_pacific == False: # to -180.0 - 180.0 dat, lons = utils.shiftgrid( 180., dat, lons, start=False ) elif to_pacific == True: # to 0 - 360 dat, lons = utils.shiftgrid( 0., dat, lons ) else: raise AttributeError( 'to_pacific can be only one of True or False' ) return dat, lons
def downscale( self, output_dir, prefix=None, ncpus=32 ): import affine import itertools from functools import partial # import multiprocessing from pathos import multiprocessing # output_filenames time = self.anomalies.time.to_pandas() time_suffix = [ '_'.join([str(t.month), str(t.year)]) for t in time ] if prefix: output_filenames = [ os.path.join( output_dir, '_'.join([prefix, ts]) + '.tif' ) for ts in time_suffix ] else: if not self.historical.units: units = 'units' else: units = self.historical.units output_filenames = [ os.path.join( output_dir, '_'.join([self.historical.variable, units, \ self.metric, self.historical.model, ts]) + '.tif') for ts in time_suffix ] # rotate if ( self.anomalies.lon > 200.0 ).any() == True: dat, lons = utils.shiftgrid( 180., self.anomalies, self.anomalies.lon, start=False ) a,b,c,d,e,f,g,h,i = self.affine # flip it to the greenwich-centering src_transform = affine.Affine( a, b, -180.0, d, e, 180.0 ) else: dat, lons = ( self.anomalies, self.anomalies.lon ) src_transform = self.affine # run and output rstlist = self.baseline.filelist * (self.anomalies.shape[0] / 12) args = zip( self.anomalies, rstlist, output_filenames ) args = [{'anom':i.data, 'base':j, 'output_filename':k} for i,j,k in args ] # determine operation type downscaling_operation_switch = {'absolute':'add', 'relative':'mult'} downscaling_operation = downscaling_operation_switch[ self.ds_type ] # partial and wrapper f = partial( self.interp_ds, src_transform=src_transform, downscaling_operation=downscaling_operation, \ post_downscale_function=None, mask=None, mask_value=0 ) def wrap( d ): return f( **d ) pool = multiprocessing.Pool( ncpus ) # out = pool.map( lambda x: f( **x ), args ) out = pool.map( wrap, args ) # pool.join() pool.close() return output_dir
def downscale( self, output_dir, prefix=None ): import affine from affine import Affine import itertools from functools import partial from pathos.mp_map import mp_map operation_switch = { 'add':self.add, 'mult':self.mult } def two_digit_month( x ): ''' make 1 digit month a standard 2-digit for output filenames ''' month = str( x ) if len(month) == 1: month = '0'+month return month time_suffix = [ '_'.join([two_digit_month( t.month ), str(t.year)]) for t in self.anomalies.time.to_pandas() ] # handle missing variable / model names if self.varname != None: variable = self.varname elif self.historical.variable != None: variable = self.historical.variable else: variable = 'variable' if self.modelname != None: model = self.modelname elif self.historical.model != None: model = self.historical.model else: model = 'model' output_filenames = [ os.path.join( output_dir, '_'.join([variable, self.historical.metric, self.historical.units, \ self.historical.project, model, self.historical.scenario, ts]) + '.tif') for ts in time_suffix ] # if there is a specific name prefix, use it if prefix != None: output_filenames = [ os.path.join( output_dir, '_'.join([prefix, ts]) + '.tif' ) for ts in time_suffix ] # rotate to pacific-centered if ( self.anomalies.lon.data > 200.0 ).any() == True: dat, lons = ( self.anomalies, self.anomalies.lon ) self.anomalies_rot = dat src_transform = self.historical.transform_from_latlon( self.historical.ds.lat, lons ) print( 'anomalies NOT rotated!' ) else: dat, lons = utils.shiftgrid( 0., self.anomalies, self.anomalies.lon ) self.anomalies_rot = dat src_transform = self.historical.transform_from_latlon( self.historical.ds.lat, lons ) print( src_transform ) print( 'anomalies rotated!' ) # run and output rstlist = self.baseline.filelist * (self.anomalies_rot.shape[0] / 12) if isinstance( self.anomalies_rot, xr.Dataset ): self.anomalies_rot = self.anomalies_rot[ self.historical.variable ].data elif isinstance( self.anomalies_rot, xr.DataArray ): self.anomalies_rot = self.anomalies_rot.data else: self.anomalies_rot = self.anomalies_rot args = zip( self.anomalies_rot, rstlist, output_filenames ) args = [{'anom':i, 'base':j, 'output_filename':k,\ 'downscaling_operation':self.downscaling_operation, \ 'post_downscale_function':self.post_downscale_function,\ 'mask':self.mask, 'mask_value':self.mask_value } for i,j,k in args ] # partial and wrapper f = partial( self.interp_ds, src_crs=self.src_crs, src_nodata=self.src_nodata, \ dst_nodata=self.dst_nodata, src_transform=src_transform, resample_type=self.resample_type ) run = partial( self._run_ds, f=f, operation_switch=operation_switch, anom=self.anom, mask_value=self.mask_value ) # run it out = mp_map( run, args, nproc=self.ncpus ) return output_dir