def load_nclatlon(field, last='last100',includeyr1=False,verb=False,local=False): """ return lat,lon from given field nc file. Uses preipreiice casename if local=True, just gets lat/lon from DJF mean files (full globe...). ignores 'field', 'last' """ timepers,timesels=get_timeinfo(last,includeyr1) casename = 'preipreiice' if local: #bd='/Users/kelly/DropboxWork/UWashCanSISE/DATA/relaxationruns/' #limited fields here bd='/Users/kelly/DATA/DataDisk/' # limited but not shared so there are more data fname=bd+'preipreiice/preipreiice_st_2922-3121_DJF_mean.nc' else: fname= basedir + casename +'/ts/' + casename + '_' + field + '_' + timepers[casename] + '_ts.nc' if verb: print fname tmplat=cnc.getNCvar(fname,'lat') if verb: print 'lat.shape ' + str(tmplat.shape) tmplon=cnc.getNCvar(fname,'lon') if verb: print 'lon.shape ' + str(tmplon.shape) return tmplat,tmplon
def load_nclatlon(field, last='last100',includeyr1=False,verb=False): """ return lat,lon from given field nc file. Uses preipreiice casename """ timepers,timesels=get_timeinfo(last,includeyr1) casename = 'preipreiice' fname= basedir + casename +'/ts/' + casename + '_' + field + '_' + timepers[casename] + '_ts.nc' if verb: print fname tmplat=cnc.getNCvar(fname,'lat') if verb: print 'lat.shape ' + str(tmplat.shape) tmplon=cnc.getNCvar(fname,'lon') if verb: print 'lon.shape ' + str(tmplon.shape) return tmplat,tmplon
def load_nclev(field,verb=False): timepers,timesels=get_timeinfo() casename = 'preipreiice' fname= basedir + casename +'/ts/' + casename + '_' + field + '_' + timepers[casename] + '_ts.nc' if verb: print fname lev=cnc.getNCvar(fname,'plev') return lev
def get_t63lat(): #plat = platform.system() basepath = get_constantsbasepath() #if plat == "Linux": # basepath = '/HOME/rkm/work/DATA/CanAM4/constants/' #else: # #basepath = '/Users/kelly/CCCma/CanSISE/DATA/constants/' #@@ # basepath = '/Volumes/KellyDataDisk/work/DATA/CanESM2/' #@@@@ don't have the other dir on imac fname = basepath + 't63_landmask.nc' return cnc.getNCvar(fname,'lat')
def get_t63lev(): # prob isn't tied to t63.. #plat = platform.system() basepath = get_constantsbasepath() #if plat == "Linux": # basepath = '/HOME/rkm/work/DATA/CanAM4/constants/' #else: # #basepath = '/Users/kelly/CCCma/CanSISE/DATA/constants/' # basepath = '/Volumes/KellyDataDisk/work/DATA/CanESM2/' #@@@@ don't have the other dir on imac fname = basepath + 'kem1rcp85a_v_001-061_climo.nc' return cnc.getNCvar(fname,'plev')
def get_t63latbounds(): """ returns the lat_bnds from grid area file. Dims are [64,2] """ #plat = platform.system() basepath = get_constantsbasepath() #if plat == "Linux": # basepath = '/HOME/rkm/work/DATA/CanAM4/constants/' #else: # #basepath = '/Users/kelly/CCCma/CanSISE/DATA/constants/' #@@ # basepath = '/Volumes/KellyDataDisk/work/DATA/CanESM2/' #@@@@ don't have the other dir on imac fname = basepath + 'areacella_fx_CanESM2_historical-r1_r0i0p0.nc' return cnc.getNCvar(fname,'lat_bnds')
def get_t63lon(remcyclic=False): #plat = platform.system() basepath = get_constantsbasepath() #if plat == "Linux": # basepath = '/HOME/rkm/work/DATA/CanAM4/constants/' #else: # #basepath = '/Users/kelly/CCCma/CanSISE/DATA/constants/' #@@ # basepath = '/Volumes/KellyDataDisk/work/DATA/CanESM2/' #@@@@ don't have the other dir on imac fname = basepath + 't63_landmask.nc' lon=cnc.getNCvar(fname,'lon') if remcyclic: # if an extra lon exists, remove it. if np.mod(lon.shape[0],2) != 0: # if lon is odd, remove extra lon=lon[:-1] return lon
basepath = '/home/rkm/work/DATA/' basepath2 = '/home/rkm/work/BCs/' # read in HadISST SST & Thickness (and SIC for comparison) # read in NSIDC SIC timeper='2002-2011' timeperc='1979-1989' # NSIDC first dset = 'NSIDC' nsicfnamep = basepath2 + dset + '/nsidc_bt_128x64_1978m11_2011m12_sicn_' + timeper + 'climo.nc' nsicfnamec = basepath2 + dset + '/nsidc_bt_128x64_1978m11_2011m12_sicn_' + timeperc + 'climo.nc' nsicp = cnc.getNCvar(nsicfnamep,'SICN') nsicc = cnc.getNCvar(nsicfnamec,'SICN') # HadISST dset='HadISST' sstfnamep = basepath2 + dset + '/hadisst1.1_bc_128_64_1870_2013m03_gt_' + timeper + 'climo.nc' sstfnamec = basepath2 + dset + '/hadisst1.1_bc_128_64_1870_2013m03_gt_' + timeperc + 'climo.nc' sitfnamep = basepath2 + dset + '/hadisst1.1_bc_128_64_1870_2013m03_sic_' + timeper + 'climo.nc' sitfnamec = basepath2 + dset + '/hadisst1.1_bc_128_64_1870_2013m03_sic_' + timeperc + 'climo.nc' hsicfnamep = basepath2 + dset + '/hadisst1.1_bc_128_64_1870_2013m03_sicn_' + timeper + 'climo.nc' hsicfnamec = basepath2 + dset + '/hadisst1.1_bc_128_64_1870_2013m03_sicn_' + timeperc + 'climo.nc' hsicp = cnc.getNCvar(hsicfnamep,'SICN') hsicc = cnc.getNCvar(hsicfnamec,'SICN')
# cmincg = 238; cmaxcg = 308 cmincg = -35 cmaxcg = 35 cmincnhg = -45 cmaxcnhg = 45 # polar NH cming = -2 cmaxg = 2 cminmg = -3 cmaxmg = 3 cmapg = "blue2red_20" fnamecs = basepath + casename + subdir + casename + "_" + fields + "_" + timstr + "_ts.nc" fnamep2s = basepath + casenamep2 + subdir + casenamep2 + "_" + fields + "_" + timstr + "_ts.nc" fldcs = cnc.getNCvar(fnamecs, fields.upper(), timesel="0002-01-01,0111-12-31") * convs fldp2s = cnc.getNCvar(fnamep2s, fields.upper(), timesel="0002-01-01,0111-12-31") * convs fnamecg = basepath + casename + subdir + casename + "_" + fieldg + "_" + timstr + "_ts.nc" fnamep2g = basepath + casenamep2 + subdir + casenamep2 + "_" + fieldg + "_" + timstr + "_ts.nc" fldcg = cnc.getNCvar(fnamecg, fieldg.upper(), timesel="0002-01-01,0111-12-31") * convg fldp2g = cnc.getNCvar(fnamep2g, fieldg.upper(), timesel="0002-01-01,0111-12-31") * convg lat = cnc.getNCvar(fnamecs, "lat") lon = cnc.getNCvar(fnamecs, "lon") fldcsclim, fldcsstd = cutl.climatologize3d(fldcs) fldpsclim, fldpsstd = cutl.climatologize3d(fldp2s) fldcgclim, fldcgstd = cutl.climatologize3d(fldcg)
cminn = -0.25 cmaxn = 0.25 # for nudge vs original ylims = (0, 0.15) conv = 1 / 913.0 fontP = fm.FontProperties() fontP.set_size("small") seasons = ("SON", "DJF", "MAM", "JJA") flddt = {} for sii, skey in enumerate(sims): fname = basepath + skey + subdir + skey + "_" + field + "_" + timeperdt[skey] + "_ts.nc" if sii == 0: # only get once time = cnc.getNCvar(fname, "time", timesel=timeseldt[skey]) ntime = len(time) lat = cnc.getNCvar(fname, "lat") lon = cnc.getNCvar(fname, "lon") flddt[skey] = cnc.getNCvar(fname, ncfield, timesel=timeseldt[skey]) * conv # <headingcell level=3> # SICN: Below are sea ice concentration comparisons for various combinations # (figure titles are below figures) # <codecell> if showmaps: fldc = flddt["iga"]
ncfield='PHI' conv=1/con.get_g() if field in ('gz','t','u','v','q'): # only 'gz' is implemented here officially @@ fieldstr=field+str(level/100) # for figure names field=field+str(level) # for filename fdict = {'field':field, 'ncfield': ncfield, 'conv': conv, 'fieldstr': fieldstr, 'level': level} # ########### get baseline data: monthly and seasonal ################## # get baseline to which to compare fnamecc = basepath + cmpcasenamec + subdir + cmpcasenamec + '_' + field + '_001-121_ts.nc' fnamepc = basepath + cmpcasenamep + subdir + cmpcasenamep + '_' + field + '_001-121_ts.nc' fldcc = cnc.getNCvar(fnamecc,ncfield,timesel=timesel)*conv fldpc = cnc.getNCvar(fnamepc,ncfield,timesel=timesel)*conv flddc = fldpc-fldcc lat = cnc.getNCvar(fnamecc,'lat') lon = cnc.getNCvar(fnamecc,'lon') # seasonal baseline to which to compare fldccsea = np.zeros((4,len(lat),len(lon))) fldpcsea = np.zeros((4,len(lat),len(lon))) flddcsea = np.zeros((4,len(lat),len(lon))) for seaii,sea in enumerate(seasons): fldccsea[seaii,...] = np.mean(cnc.getNCvar(fnamecc,ncfield,timesel=timesel,seas=sea)*conv,axis=0) fldpcsea[seaii,...] = np.mean(cnc.getNCvar(fnamepc,ncfield,timesel=timesel,seas=sea)*conv,axis=0) flddcsea[seaii,...] = fldpcsea[seaii,...]-fldccsea[seaii,...]
def get_lon(local=False): fnames=build_filenames({'field':'Z3500','comp':'cam'},'B20TRC5CNBDRD-BRCP85C5CNBDRD',verb=False,local=local) return cnc.getNCvar(fnames[1],'lon')
## ccasename='historicalrcp45' # loop through ens members: cfldcall = np.zeros((ensnum,12)) # a climo cfldpall = np.zeros((ensnum,163*12)) # hard-coded monthly timeseries 1850-2012 for eii in range(1,ensnum+1): # five ens members cfnamec = basepath + ccasename + '/' + cfield + '/' + cfield +\ '_' + comp + '_' + cmodel + '_' + ccasename +\ '_r' + str(eii) + 'i1p1_' + ctimstr + 'climo.nc' # to take anomaly from cfnamep = basepath + ccasenamep + '/' + cfield + '/' + cfield +\ '_' + comp + '_' + cmodel + '_' + ccasenamep +\ '_r' + str(eii) + 'i1p1_' + ctimeper + '.nc' # sic, 128x64 cfldc = cnc.getNCvar(cfnamec,cfield)*cconv # ctl time period avg cfldp = cnc.getNCvar(cfnamep,cfield)*cconv # full timeseries lat = cnc.getNCvar(cfnamec,'lat') lon = cnc.getNCvar(cfnamec,'lon') ## cfldc = np.dstack((cfldc,cfldc[...,0])) # add wraparound lon ## cfldp = np.dstack((cfldp,cfldp[...,0])) # add wraparound lon # if sea ice frac: calc area and save it if cfield == 'sic': # calc sea ice area # mult fraction by grid cell area & sum areas = cutl.calc_cellareas(lat,lon) careasp = np.tile(areas,(cfldp.shape[0],1,1)) # need one per time careasc = np.tile(areas,(cfldc.shape[0],1,1)) # need one per month (climo)
def get_lon(local=False): fnames=build_filenames({'field':'tas','comp':'Amon'},'historical',verb=False,local=local) return cnc.getNCvar(fnames[0],'lon')
def load_ncfield(field, ncfield, zonal=True,conv=1,mo=0,season=None,last='last100', includeyr1=False,verb=False,local=False,seacyc=False,pulse=False): """ If zonal=True, compute zonal mean. zonal can also be a region, defined in regiondict in constants.py If local, use local data (which is limited) If seacycle, return the 12 month climo average, which only exists 1. locally (as of Mar 24 2017) and 2. is only avail for the last200 returns dictionaries: full field w/ time, zonal mean w/ time """ timepers,timesels = get_timeinfo(last,includeyr1) if local: #bd='/Users/kelly/DropboxWork/UWashCanSISE/DATA/relaxationruns/' #limited fields here bd='/Users/kelly/DATA/DataDisk/' # limited but not shared so there are more data subdir='/' else: bd=basedir subdir='/ts/' seasonalizedt = {'mo':mo, 'season': season} ncflddt={}; ncfldtmdt={}; ncfldzmdt={} for casename in casenames: if pulse==False and ('pulse' in casename): continue if seacyc: if last!='last200': raise Exception('load_ncfield(): if seacyc=True, last must = last200') if local!=True: raise Exception('load_ncfield(): if seacyc=True, local must be True (as of Mar 24 2017)') fname = bd + casename+subdir+casename + '_' + field + '_' + timepers[casename] + '_seacycle.nc' else: fname= bd + casename +subdir + casename + '_' + field + '_' + timepers[casename] + '_ts.nc' timesel=timesels[casename] if verb: print fname try: fld=cnc.getNCvar(fname,ncfield,timesel=timesel)*conv # remlon not operational??? why commented out?? if verb: print fname + ', fld.shape ' + str(fld.shape) # @@@ except IOError as rte: # previously this was a RuntimeError. Not sure what changed. 10/14/2016 print rte if 'No such file or directory' in rte.args: # Here the problem is most likely that pico2ipulse filename fails b/c # there is no NH version of it (for when last200=True). Remove the NH and try again. # @@ Of course this could be a problem too b/c now we have full globe for just this run. if field[-2:] != 'NH': print 'not an NH versus global problem...File really not found' raise fname= basedir + casename +'/ts/' + casename + '_' + field[:-2] + '_' + timepers[casename] + '_ts.nc' print 'Try again: ' + fname fld=cnc.getNCvar(fname,ncfield,timesel=timesel)*conv tmplat=cnc.getNCvar(fname,'lat') if last=='last200': # how to tell which spot lat is? if zonal: # then it is likely time x lat x lon #print 'zonal is true. fld dims? ' + str(fld.shape) fld=fld[...,tmplat>0,:] else: # likely time x lev x lat fld=fld[...,tmplat>0] else: raise # just get the full timeseries, and zonal mean if asked. if 1: #timeseries: # do not time average (actually save time average anyway) if (season==None and mo==0): pass else: fld = cutl.seasonalize(fld,**seasonalizedt) #fldtm = fld # zonal average if zonal==True: fldzm = fld[...,:-1].mean(axis=2) # remove extra lon elif zonal in con.get_regiondict().keys(): print 'lat,lon shapes ' + str(lat.shape),str(lon.shape) tempo, _ = cutl.mask_region(fld,lat,lon,region=zonal) fldzm = tempo.mean(axis=2) else: fldzm = None #fldtm = fldtmzm.mean(axis=0) # else: # # seasonal & time mean # fldtm = np.mean(cutl.seasonalize(fld,**seasonalizedt),axis=0) # # zonal average # if zonal: # fldtmzm = fldtm[...,:-1].mean(axis=1) # elif zonal in con.get_regiondict().keys(): # tempo, _ = cutl.mask_region(fldtm,lat,lon,region=zonal) # fldtmzm = tempo.mean(axis=1) # else: # fldtmzm = fldtm print 'fld.shape: ' + str(fld.shape) if fldzm!=None: print 'fldzm.shape: ' + str(fldzm.shape) ncflddt[casename] = fld # keep all dims #ncfldtmdt[casename] = fldtm # time mean ncfldzmdt[casename] = fldzm # zonal mean (w/ time dim) # try this: add coords # @@@@@@@@@@ lat,lon = load_nclatlon(field,last=last,includeyr1=includeyr1,verb=verb,local=local) ncflddt['lat'] = lat; ncflddt['lon'] = lon; try: lev = load_nclev(field,last=last,includeyr1=includeyr1,verb=verb) ncflddt['lev'] = lev except: print "No lev coord. Leave it" ncfldzmdt['lat'] = lat return ncflddt, ncfldzmdt
plat = platform.system() if plat == 'Darwin': # means I'm on my mac basepath2 = '/Volumes/MyPassport1TB/DATA/CanSISE/' basepath = '/Users/kelly/CCCma/CanSISE/BoundaryConditionFiles/' # @@ not sure else: # on linux workstation in Vic basepath = '/home/rkm/work/BCs/' if checkpert1s: # New Pert1 dataset that checks for open water colder than 271.2 pert1newf = 'GTfrzchkhistoricalrcp452002-2012_BC_CanESM2_historical_1979-1989_1870010100-2010120100.nc' lat = cnc.getNCvar(pert1newf,'lat') lon = cnc.getNCvar(pert1newf,'lon') pert1n = cnc.getNCvar(pert1newf,'GT') pert1n = pert1n[0:12,...] # original BC files for PERT1. I expected that the ssts would be below freezing in some places # where SICN was gone in PERT1 but not control. pert1f = '/home/rkm/work/BCs/CanESM2/GT_BC_CanESM2_historical1979-1989_1870010100-2011020100.nc' pert1=cnc.getNCvar(pert1f,'GT') pert1 = pert1[0:12,...] pert1sicf = '/home/rkm/work/BCs/CanESM2/SICN_BC_CanESM2_historical2002-2012_1870010100-2011020100.nc'
def loaddata(fields, simulations, ncfields=None,model='CanAM4',timeper='001-121',timefreq=None, levsel=None,meantype=None,filetype='diff',region=None,alsomask=None,rettype='dict'): """ loaddata(fields, simulations,ncfields=None,model='CanAM4',timeper='001-121',timefreq=None, levsel=None, meantype=None,filetype='diff',region=None) fields: tuple of field names [@@update. only one field now but still need tuple] simulations: tuple of simulation names (diff names='E1'...'ENS','NSIDC' etc) ncfields: tuple of ncfield names (var name in file itself). Default to upper case of field model: for now only 'CanAM4' is implemented timeper: time period of the data (used for filename). default '001-121' timefreq: time frequency TO RETURN. default all data 'monthly'|'seasonal'|'climo'|'ANN'|'DJF'|'JJA'|'NDJ'|'MAM'|'SON'| 1,2,3,4,5,6,7,8,9,10,11,12 levsel: select level in Pa (e.g. 50000 for 500hPa). default all levels meantype: 'time','zonal' @@for now. default None, but recommended to choose one if loading multiple variables and multiple simulations at once. It is assumed that time is the first dimension. filetype: 'diff','ctl','pert','pval' Default is diff where both ctl and pert are read in and differenced. region: any of the regions in constants -> region dict. default None. alsomask: if specified as 'land' or 'ocean', then calc_regmean() will mask before computing regional avg (ie. will NOT include it in average). Only used if region!=None. Default None. returns: nested dictionary@@ FIELDS->SIMULATIONS->TIMEFREQ Load requested fields from requested CanAM4 simulations into dictionaries (dataframes?). Function automatically skips first year of simulation and gets a timeseries (or climo if requested) of the rest (assumed through year 121). 3D data and 'turb' not yet implemented! @@ """ if model!='CanAM4': print 'model not supported!' return -1 print '@@ probably should invert the order such that it is field, season, sim?' #bp=con.get_basepath() #basepath=bp['basepath'] + model + '/'; subdir=bp['subdir'] timesel='0002-01-01,0121-12-31' seabool=False # set to True if requested time freq is one season or climo monbool=False # set to True if requested time freq is one month if timefreq=='monthly': # get all months tf = con.get_mon() elif timefreq=='seasonal': # get all 4 seasons tf = 'DJF','MAM','JJA','SON' elif timefreq in range(1,13): # choose an individual month tf=timefreq monbool=True elif timefreq in ('climo','ANN','DJF','JJA','NDJ','MAM','SON','ND','JF','SO'): tf=timefreq seabool=True print tf # @@ # @@@@@ add handling of sia! #datadict = dict.fromkeys(fields,{}) #for fii,field in enumerate(fields): if 1: # GET RID OF FIELD dim too 5/8/2015 fii=0; field=fields[0] if ncfields==None: ncfield=field.upper() else: ncfield=ncfields[fii] print field,ncfield #@@ # assume simulations entered are of the form: E1, R3, ENSE etc. Then # filetype input arg tells which simulation to get (or both) simdict = dict.fromkeys(simulations,{}) for sim in simulations: print sim # @@ #timdict = dict.fromkeys(tf) # construct filename here @@ fnamec,fnamep = con.build_filepathpair(sim,field) #fname = basepath+sim+subdir+sim+'_'+field+'_'+timeper+'_ts.nc' print fnamec tfkey = tf #for tfkey in tf: # print tfkey # @@ #print 'too many levels in the dict...get rid of seasonal keys and just do one@@@ 5/1/2015' # @@ get the data with cnc.getNCvar() here ncparams = {} if monbool: ncparams = {'monsel': tfkey} elif seabool: ncparams = {'seas': tfkey} if levsel!=None: ncparams['levsel'] = levsel if meantype=='zonal': ncparams['calc'] = 'zm' if filetype=='diff' or filetype=='pval': if field in ('turb','net'): fnamec,fnamep = con.build_filepathpair(sim,'hfl') fnamecb,fnamepb = con.build_filepathpair(sim,'hfs') ctl = cnc.getNCvar(fnamec,'HFL',timesel=timesel,**ncparams) +\ cnc.getNCvar(fnamecb,'HFS',timesel=timesel, **ncparams) pert = cnc.getNCvar(fnamep,'HFL',timesel=timesel,**ncparams) +\ cnc.getNCvar(fnamepb,'HFS',timesel=timesel,**ncparams) if field=='net': fnamecc,fnamepc = con.build_filepathpair(sim,'flg') ctl = ctl - cnc.getNCvar(fnamecc,'FLG',timesel=timesel,**ncparams) pert = pert - cnc.getNCvar(fnamepc,'FLG',timesel=timesel,**ncparams) else: pert = cnc.getNCvar(fnamep,ncfield,timesel=timesel,**ncparams) ctl = cnc.getNCvar(fnamec,ncfield,timesel=timesel,**ncparams) fld = pert - ctl elif filetype=='ctl': if field in ('turb','net'): fnamec,fnamep = con.build_filepathpair(sim,'hfl') fnamecb,fnamepb = con.build_filepathpair(sim,'hfs') fld = cnc.getNCvar(fnamec,'HFL',timesel=timesel,**ncparams) +\ cnc.getNCvar(fnamecb,'HFS',timesel=timesel, **ncparams) if field=='net': fnamecc,fnamepc = con.build_filepathpair(sim,'flg') fld = fld - cnc.getNCvar(fnamecc,'FLG',timesel=timesel,**ncparams) else: fld = cnc.getNCvar(fnamec,ncfield,timesel=timesel,**ncparams) elif filetype=='pert': if field in ('turb','net'): fnamec,fnamep = con.build_filepathpair(sim,'hfl') fnamecb,fnamepb = con.build_filepathpair(sim,'hfs') fld = cnc.getNCvar(fnamep,'HFL',timesel=timesel,**ncparams) +\ cnc.getNCvar(fnamepb,'HFS',timesel=timesel,**ncparams) if field=='net': fnamecc,fnamepc = con.build_filepathpair(sim,'flg') fld = fld - cnc.getNCvar(fnamepc,'FLG',timesel=timesel,**ncparams) else: fld = cnc.getNCvar(fnamep,ncfield,timesel=timesel,**ncparams) else: print "filetype not supported! ['diff'|'ctl'|'pert'|'pval']" return -1 if region != None: lat=cnc.getNCvar(fnamec,'lat'); lon=cnc.getNCvar(fnamec,'lon') if filetype=='pval': pert = cutl.calc_regmean(pert,lat,lon,region,alsomask=alsomask) ctl = cutl.calc_regmean(ctl,lat,lon,region,alsomask=alsomask) (tstat,pval) = cutl.ttest_ind(pert,ctl) fld=pval else: fld = cutl.calc_regmean(fld,lat,lon,region,alsomask=alsomask) if meantype=='time': if filetype=='pval': # this is an error. filetype supercedes meantype so time avg won't be done print 'filetype=pval and meantype-time. Ignore meantype and return pvals @@' timdict=fld else: #fldstd = np.std(fld,axis=0) fld = np.mean(fld,axis=0) #timdict[tfkey] = fld #,fldstd timdict=fld else: #timdict[tfkey] = fld timdict=fld simdict[sim] = timdict #datadict[field]=simdict # can I set attributes to a dictionary? @@ like for nfields, nsims, ntimes? #return datadict if rettype=='ndarray': # convert the dict to an array: # get the last sim data to initialize ndarray initshape=simdict[sim].shape initshape=(len(simulations),) + initshape tmp=np.zeros(initshape) for sii,skey in enumerate(simulations): tmp[sii,:] = simdict[skey] return tmp else: return simdict
def load_LEdata(fielddict, ens, seas=None, timesel=None,infodict=None,ftype='fullts', calctype=None, calcdict=None, rettype='dict',conv=1, region=None,local=False, subens=False,verb=True,zonal=False): """ ftype: type of filename to build. Default 'fullts' for full timeseries (assumes 192001-202012) Also can override default time period of file by setting ftype to timeperiod. e.g. ftype = '192001-200512' seas has to be a tuple (but will only get one season) rettype: 'dict' or 'ndarray' as return type. default is dict of DataFrames (to make a Panel). else, 'ndarray' is a 4D array local: is data in ~/work/DATA (local=True) or /raid/rc40 subens: overrides getting all ensemble members. Must be tuple (e.g. (5,10) get ens mems 5 thru 9) @@ add regional avg functionality? returns an object of type rettype """ field = fielddict['field'] ncfield=fielddict['ncfield'] comp = fielddict['comp'] flist = build_filenames(fielddict, ens,ftype=ftype,timesel=timesel,local=local, subens=subens,verb=verb) fname1 = flist[0] if verb: print ' @@ fname1 ' + fname1 if rettype=='dict': fldret={} elif rettype=='ndarray': if zonal: tmp = cnc.getNCvar(fname1,ncfield,timesel=timesel,calc='zm')*conv else: tmp = cnc.getNCvar(fname1,ncfield,timesel=timesel)*conv if len(tmp.shape)>3: print '4D variable not supported! @@@@' return -1 elif len(tmp.shape)==3: # first dim is time, reshape the 2nd two into one spatial dim n0=tmp.shape[0] n1=tmp.shape[1] n2=tmp.shape[2] initshape=(len(flist), n0, n1*n2) # 3D, ens x time x space rshape=initshape[1:] # what to reshape individual data to elif len(tmp.shape)==2: initshape=list(tmp.shape) initshape.insert(0,len(flist)) initshape=tuple(initshape) # 3D, ens x time x space rshape=None elif len(tmp.shape)==1: initshape = (len(flist),tmp.shape[0]) rshape=None print initshape fldret = np.zeros(initshape) print fldret.shape # @@@ else: raise Exception('return type not supported!! @@@') return -1 numens = len(flist) #fldall = np.zeros(numens) #dlist=[] if rettype=='dict': timedim = cnc.getNCvar(fname1,'time',timesel=timesel) if verb: print timedim for eii,fname in enumerate(flist): if seas==None: # don't average, return all months if zonal: fld = cnc.getNCvar(fname,ncfield,timesel=timesel,calc='zm')*conv else: fld = cnc.getNCvar(fname,ncfield,timesel=timesel)*conv #if region!=None: # lat=cnc.getNCvar(fname,'lat') # lon=cnc.getNCvar(fname,'lon') # fld = cutl.calc_regmean(fld,lat,lon,region=region) # do calcs: if calctype!=None: print 'calcs not implemented yet!! @@@' if rettype=='ndarray': fldseas=fld.reshape(rshape) else: if len(fld.shape)!=3: raise Exception('load CESM LE with rettype dict will break if dim of var is not 3 @@@') return -1 n0,n1,n2=fld.shape fldseas=fld.reshape((n0,n1*n2)) # flattening else: fldseas={} for sea in seas: if zonal: # @@@ not expecting this to work. fld = cnc.getNCvar(fname,ncfield,timesel=timesel,seas=sea,calc='zm')*conv else: fld = cnc.getNCvar(fname,ncfield,timesel=timesel,seas=sea)*conv # do calcs if calctype!=None: print 'calcs not implemented yet!! @@@' fldseas[sea]=fld if rettype=='dict': fldret[fname]= pd.DataFrame(fldseas,index=timedim) elif rettype=='ndarray': if seas!=None: print 'ndarray return type with a seasonal avg does not work yet @@@@' fldret[eii,...] = fldseas #dlist.append(fldseas) return fldret
def load_ncfield(field, ncfield, zonal=True,conv=1,mo=0,season=None,last='last100',includeyr1=False,verb=False): """ If zonal=True, compute zonal mean. zonal can also be a region, defined in regiondict in constants.py returns dictionaries: full field w/ time, zonal mean w/ time """ timepers,timesels = get_timeinfo(last,includeyr1) seasonalizedt = {'mo':mo, 'season': season} ncflddt={}; ncfldtmdt={}; ncfldzmdt={} for casename in casenames: fname= basedir + casename +'/ts/' + casename + '_' + field + '_' + timepers[casename] + '_ts.nc' timesel=timesels[casename] if verb: print fname try: fld=cnc.getNCvar(fname,ncfield,timesel=timesel)*conv # remlon not operational??? why commented out?? if verb: print fname + ', fld.shape ' + str(fld.shape) # @@@ except IOError as rte: # previously this was a RuntimeError. Not sure what changed. 10/14/2016 print rte if 'No such file or directory' in rte.args: # Here the problem is most likely that pico2ipulse filename fails b/c # there is no NH version of it (for when last200=True). Remove the NH and try again. # @@ Of course this could be a problem too b/c now we have full globe for just this run. if field[-2:] != 'NH': print 'not an NH versus global problem...File really not found' raise fname= basedir + casename +'/ts/' + casename + '_' + field[:-2] + '_' + timepers[casename] + '_ts.nc' print 'Try again: ' + fname fld=cnc.getNCvar(fname,ncfield,timesel=timesel)*conv tmplat=cnc.getNCvar(fname,'lat') if last=='last200': # how to tell which spot lat is? if zonal: # then it is likely time x lat x lon #print 'zonal is true. fld dims? ' + str(fld.shape) fld=fld[...,tmplat>0,:] else: # likely time x lev x lat fld=fld[...,tmplat>0] else: raise # just get the full timeseries, and zonal mean if asked. if 1: #timeseries: # do not time average (actually save time average anyway) if (season==None and mo==0): pass else: fld = cutl.seasonalize(fld,**seasonalizedt) #fldtm = fld # zonal average if zonal==True: fldzm = fld[...,:-1].mean(axis=2) # remove extra lon elif zonal in con.get_regiondict().keys(): print 'lat,lon shapes ' + str(lat.shape),str(lon.shape) tempo, _ = cutl.mask_region(fld,lat,lon,region=zonal) fldzm = tempo.mean(axis=2) else: fldzm = None #fldtm = fldtmzm.mean(axis=0) # else: # # seasonal & time mean # fldtm = np.mean(cutl.seasonalize(fld,**seasonalizedt),axis=0) # # zonal average # if zonal: # fldtmzm = fldtm[...,:-1].mean(axis=1) # elif zonal in con.get_regiondict().keys(): # tempo, _ = cutl.mask_region(fldtm,lat,lon,region=zonal) # fldtmzm = tempo.mean(axis=1) # else: # fldtmzm = fldtm print 'fld.shape: ' + str(fld.shape) if fldzm!=None: print 'fldzm.shape: ' + str(fldzm.shape) ncflddt[casename] = fld # keep all dims #ncfldtmdt[casename] = fldtm # time mean ncfldzmdt[casename] = fldzm # zonal mean (w/ time dim) return ncflddt, ncfldzmdt
+ "_" + timeperc + "climo.nc" ) landmask = con.get_t63landmask() if doobs: pass # do not remove wraparound lon else: landmask = landmask[..., :-1] landmask = np.tile(landmask, (12, 1, 1)) print filename timefldp = cnc.getNCvar(filename, "time") lat = cnc.getNCvar(filename, "lat") lon = cnc.getNCvar(filename, "lon") if doobs: fldp = cnc.getNCvar(filename, bcfield) fldc = cnc.getNCvar(filenamec, bcfield) else: fldp = cnc.getNCvar(filename, field) fldc = cnc.getNCvar(filenamec, field) # we should only need this to set SSTs in near-future BCs print filenamec if field == "ts" and adjustsst: # assume adjustsst will always be true now
def pattcorr_withinensemble(ename,fdict,latlim=60,timesel='0002-01-01,0121-12-31'): """ pattcorr_withinensemble(ename,field,latlim=60) pattern corr each member of ensemble with each other one return pctable, pctablesea (DataFrames) """ # @@ need diffdict field=fdict['field'] ncfield=fdict['ncfield'] conv=fdict['conv'] seasons=('SON','DJF','MAM','JJA') if ename=='ANT': ename='histIC' elif ename=='TOT': ename='histBC' enssims = con.build_ensemblesims(ename) ensnum=len(enssims) print 'ENSSIMS: ' # @@@ print enssims # @@ # generate weights for the pattern corr lat = con.get_t63lat() lon = con.get_t63lon() areas = cutl.calc_cellareas(lat,lon) areas = areas[lat>latlim,:] weights = areas / np.sum(np.sum(areas,axis=1),axis=0) # ========= create diffdict first ===== diffdict={} seadiffdict={} for skey in enssims: fnamec,fnamep = con.build_filepathpair(skey,field) # monthly calc fldc = cnc.getNCvar(fnamec,ncfield,timesel=timesel)*conv fldp = cnc.getNCvar(fnamep,ncfield,timesel=timesel)*conv fldd = fldp-fldc # Monthly flddclimo,flddstd = cutl.climatologize(fldd) # climo first (don't need to do for BCs technically) #flddcclimo,flddcstd = cutl.climatologize(flddc) # climo first. baseline diff data diffdict[skey] = flddclimo print skey + ' ' + str(flddclimo.shape) # @@@ # Seasonal flddsea = np.zeros((4,len(lat),len(lon))) for seaii,sea in enumerate(seasons): fldcsea = np.mean(cnc.getNCvar(fnamec,ncfield,timesel=timesel,seas=sea)*conv,axis=0) fldpsea = np.mean(cnc.getNCvar(fnamep,ncfield,timesel=timesel,seas=sea)*conv,axis=0) flddsea[seaii,...] = fldpsea-fldcsea seadiffdict[skey] = flddsea # ======= Now do pattern corrs within ensemble ==== # ======= copied from Canam4_BCpatterncorr-Copy0.py =========== outterdict= dict.fromkeys(enssims) for skey1 in enssims: outfld = diffdict[skey1] innerdict = dict.fromkeys(enssims) for skey2 in enssims: #print skey1 + ' compared to ' + skey2 infld = diffdict[skey2] # for each month, compute pattern corr pc = np.zeros((12)) for mii,mon in enumerate(con.get_mon()): tmp = np.squeeze(infld[mii,lat>latlim,...]) tmpcmp = np.squeeze(outfld[mii,lat>latlim,...]) pc[mii] = cutl.pattcorr(tmp.flatten()*weights.flatten(), tmpcmp.flatten()*weights.flatten()) innerdict[skey2] = pc outterdict[skey1] = innerdict pctable = pd.DataFrame(outterdict) # 5x5 # seasonal outterdictsea= dict.fromkeys(enssims) for skey1 in enssims: outfld = seadiffdict[skey1] innerdictsea = dict.fromkeys(enssims) for skey2 in enssims: #print skey1 + ' compared to ' + skey2 infld = seadiffdict[skey2] # for each season, compute pattern corr pcsea = np.zeros((4)) for seaii,sea in enumerate(seasons): tmp = np.squeeze(infld[seaii,lat>latlim,...]) tmpcmp = np.squeeze(outfld[seaii,lat>latlim,...]) pcsea[seaii] = cutl.pattcorr(tmp.flatten()*weights.flatten(), tmpcmp.flatten()*weights.flatten()) innerdictsea[skey2] = pcsea outterdictsea[skey1] = innerdictsea pctablesea = pd.DataFrame(outterdictsea) # 5x5 return pctable, pctablesea
def load_LEdata(fielddict, ens, seas=None, timesel=None,infodict=None,ftype='fullts', calctype=None, calcdict=None, rettype='dict',conv=1, region=None,local=True, orig=None,subens=False,verb=True,zonal=False): """ def loadLEdata(fielddict, seas=('DJF','MAM','JJA','SON'), timesel=None, infodict=None, calctype=None, calcdict=None) ftype: type of filename to build. Default 'fullts' for full timeseries. 'fullclimo' for '1950-2020_climo' or, given timesel: for styr-enyr_climo. or 'ensmean'. Also can override default time period of file by setting ftype to timeperiod. e.g. ftype = '195001-201012' seas has to be a tuple rettype: 'dict' or 'ndarray' as return type. default is dict of DataFrames (to make a Panel). else, 'ndarray' is a 4D array local: is data in /Volumes/KellyDataDisk/home/work/DATA (local=True) or /raid/ra40 orig='just' means just load the original 5 (historical+rcp85) runs (consistent w/ LE). orig='just45' means just load original 5 (historical+rcp45) to the full LE. orig='add' means add the original 5 (historical+rcp85) to the full LE (consistent w/ LE) orig='add45' means add the original 5 (historical+rcp45) to the full LE. subens: overrides getting all sim groups in ensemble. must be tuple. e.g. ('historical-r1',) @@ add regional avg functionality? returns an object of type rettype """ field = fielddict['field'] ncfield=fielddict['ncfield'] comp = fielddict['comp'] flist = build_filenames(fielddict, ens,ftype=ftype,timesel=timesel,local=local, orig=orig,subens=subens,verb=verb) fname1 = flist[0] if verb: print ' @@ fname1 ' + fname1 timedim = cnc.getNCvar(fname1,'time',timesel=timesel) #print timedim if rettype=='dict': fldret={} elif rettype=='ndarray': if zonal: tmp = cnc.getNCvar(fname1,ncfield,timesel=timesel,calc='zm')*conv else: tmp = cnc.getNCvar(fname1,ncfield,timesel=timesel)*conv if len(tmp.shape)>3: print '4D variable not supported! @@@@' return -1 elif len(tmp.shape)==3: # first dim is time, reshape the 2nd two into one spatial dim n0=tmp.shape[0] n1=tmp.shape[1] n2=tmp.shape[2] initshape=(len(flist), n0, n1*n2) # 3D, ens x time x space rshape=initshape[1:] # what to reshape individual data to elif len(tmp.shape)==2: initshape=list(tmp.shape) initshape.insert(0,len(flist)) initshape=tuple(initshape) # 3D, ens x time x space rshape=None elif len(tmp.shape)==1: initshape = (len(flist),tmp.shape[0]) rshape=None print initshape fldret = np.zeros(initshape) print fldret.shape # @@@ else: print 'return type not supported!! @@@' return -1 numens = len(flist) #fldall = np.zeros(numens) #dlist=[] for eii,fname in enumerate(flist): if seas==None: # don't average, return all months if zonal: fld = cnc.getNCvar(fname,ncfield,timesel=timesel,calc='zm')*conv else: fld = cnc.getNCvar(fname,ncfield,timesel=timesel)*conv #if region!=None: # lat=cnc.getNCvar(fname,'lat') # lon=cnc.getNCvar(fname,'lon') # fld = cutl.calc_regmean(fld,lat,lon,region=region) # do calcs: if calctype!=None: print 'calcs not implemented yet!! @@@' if rettype=='ndarray': fldseas=fld.reshape(rshape) else: if len(fld.shape)!=3: print 'load LE with rettype dict will break if dim of var is not 3 @@@' return -1 n0,n1,n2=fld.shape fldseas=fld.reshape((n0,n1*n2)) # flattening else: fldseas={} for sea in seas: if zonal: # @@@ not expecting this to work. fld = cnc.getNCvar(fname,ncfield,timesel=timesel,seas=sea,calc='zm')*conv else: fld = cnc.getNCvar(fname,ncfield,timesel=timesel,seas=sea)*conv # do calcs if calctype!=None: print 'calcs not implemented yet!! @@@' fldseas[sea]=fld if rettype=='dict': fldret[fname]= pd.DataFrame(fldseas,index=timedim) elif rettype=='ndarray': if seas!=None: print 'ndarray return type with a seasonal avg does not work yet @@@@' fldret[eii,...] = fldseas #dlist.append(fldseas) return fldret
def pattcorr_ensemble(ename, field, latlim=60): # @@@@@@@@@@@@ is this fully implemented? Don't think so. 12/2/14 if ename=='ANT': ename='HistIC' elif ename=='TOT': ename='HistBC' enssims = con.build_ensemblesims(ename) ensnum=len(enssims) # ======= copied from Canam4_BCpatterncorr-Copy0.py =========== #ensnum=5 diffdict = {} pcmeandict = {} # fldp-fldc pattern corr compared to mean BC pchaddict = {} # fldp-fldc pattern corr compared to hadisst seadiffdict = {} # seasonal mean pcseameandict = {} pcsea2meandict = {} # to test the other pattern corr calc pcsea2pvalmeandict = {} # to test the other pattern corr calc # generate weights for the pattern corr lat = con.get_t63lat() lon = con.get_t63lon() areas = cutl.calc_cellareas(lat,lon) areas = areas[lat>latlim,:] weights = areas / np.sum(np.sum(areas,axis=1),axis=0) #for eii in range(1,ensnum+1): for skey in enssims: #skey = etype + str(eii) #casenamec = bcasenamec + skey #casenamep = bcasenamep + skey #fnamec = basepath + casenamec+ subdir + casenamec + '_' + field + '_001-121_ts.nc' #fnamep = basepath + casenamep+ subdir + casenamep + '_' + field + '_001-121_ts.nc' fnamec,fnamep = con.build_filepathpair(skey,field) # monthly calc fldc = cnc.getNCvar(fnamec,ncfield,timesel=timesel)*conv fldp = cnc.getNCvar(fnamep,ncfield,timesel=timesel)*conv fldd = fldp-fldc # take the pattern correlation flddclimo,flddstd = cutl.climatologize(fldd) # climo first (don't need to do for BCs technically) flddcclimo,flddcstd = cutl.climatologize(flddc) # climo first. baseline diff data diffdict[skey] = flddclimo # for each month, compute pattern corr pc = np.zeros((12)) for mii,mon in enumerate(con.get_mon()): tmp = np.squeeze(flddclimo[mii,lat>latlim,...]) tmpcmp = np.squeeze(flddcclimo[mii,lat>latlim,...]) pc[mii] = cutl.pattcorr(tmp.flatten()*weights.flatten(),tmpcmp.flatten()*weights.flatten()) pcmeandict[skey] = pc # monthly # seasonal calc fldcsea = np.zeros((4,len(lat),len(lon))) fldpsea = np.zeros((4,len(lat),len(lon))) flddsea = np.zeros((4,len(lat),len(lon))) pcsea = np.zeros((4)) pcsea2 = np.zeros((4)) # test pattcorr_pearson() @@ pcsea2pval = np.zeros((4)) # test pattcorr_pearson() for seaii,sea in enumerate(seasons): fldcsea[seaii,...] = np.mean(cnc.getNCvar(fnamec,ncfield,timesel=timesel,seas=sea)*conv,axis=0) fldpsea[seaii,...] = np.mean(cnc.getNCvar(fnamep,ncfield,timesel=timesel,seas=sea)*conv,axis=0) flddsea[seaii,...] = fldpsea[seaii,...]-fldcsea[seaii,...] tmp = np.squeeze(flddsea[seaii,lat>latlim,...]) tmpcmp = np.squeeze(flddcsea[seaii,lat>latlim,...]) pcsea[seaii] = cutl.pattcorr(tmp.flatten()*weights.flatten(), tmpcmp.flatten()*weights.flatten()) pcsea2[seaii],pcsea2pval[seaii] = cutl.pattcorr_pearson(tmp.flatten()*weights.flatten(), tmpcmp.flatten()*weights.flatten()) seadiffdict[skey] = flddsea pcseameandict[skey] = pcsea pcsea2meandict[skey] = pcsea2 pcsea2pvalmeandict[skey] = pcsea2pval
subdir = '/ts/' ##### set up file info and read data ####### if field == 'turb': field='hfl'; fieldb='hfs' fnamec = basepath + casename + subdir + casename + '_' + field + '_' + timstr + '_ts.nc' fnamep1 = basepath + casenamep1 + subdir + casenamep1 + '_' + field + '_' + timstrp + '_ts.nc' fnamep2 = basepath + casenamep2 + subdir + casenamep2 + '_' + field + '_' + timstrp + '_ts.nc' fnamep3 = basepath + casenamep3 + subdir + casenamep3 + '_' + field + '_' + timstrp + '_ts.nc' fnamecb = basepath + casename + subdir + casename + '_' + fieldb + '_' + timstr + '_ts.nc' fnamep1b = basepath + casenamep1 + subdir + casenamep1 + '_' + fieldb + '_' + timstrp + '_ts.nc' fnamep2b = basepath + casenamep2 + subdir + casenamep2 + '_' + fieldb + '_' + timstrp + '_ts.nc' fnamep3b = basepath + casenamep3 + subdir + casenamep3 + '_' + fieldb + '_' + timstrp + '_ts.nc' fldc = cnc.getNCvar(fnamec,field.upper(),timesel=timesel)*conv +\ cnc.getNCvar(fnamecb,fieldb.upper(),timesel=timesel)*conv fldp1 = cnc.getNCvar(fnamep1,field.upper(),timesel=timesel)*conv +\ cnc.getNCvar(fnamep1b,fieldb.upper(),timesel=timesel)*conv fldp2 = cnc.getNCvar(fnamep2,field.upper(),timesel=timesel)*conv +\ cnc.getNCvar(fnamep2b,fieldb.upper(),timesel=timesel)*conv fldp3 = cnc.getNCvar(fnamep3,field.upper(),timesel=timesel)*conv +\ cnc.getNCvar(fnamep3b,fieldb.upper(),timesel=timesel)*conv field='turb' else: fnamec = basepath + casename + subdir + casename + '_' + field + '_' + timstr + '_ts.nc' fnamep1 = basepath + casenamep1 + subdir + casenamep1 + '_' + field + '_' + timstrp + '_ts.nc' fnamep2 = basepath + casenamep2 + subdir + casenamep2 + '_' + field + '_' + timstrp + '_ts.nc' fnamep3 = basepath + casenamep3 + subdir + casenamep3 + '_' + field + '_' + timstrp + '_ts.nc'
def load_data(fielddict, casename, seas=None, timesel=None,infodict=None,ftype='fullts', calctype=None, calcdict=None,conv=1, region=None,local=False, orig=None,verb=True, detrend=True): """ def load_data(fielddict, seas=('DJF','MAM','JJA','SON'), timesel=None, infodict=None, calctype=None, calcdict=None) fielddict: should have {'field': field, 'ncfield': ncfield, 'comp': comp} at minimum ftype: type of filename to build. Right now just 'fullts' for full timeseries or '1950-2020_climo' or 'ensmean' seas has to be a tuple rettype: 'dict' or 'ndarray' as return type. default is dict of DataFrames (to make a Panel). else, 'ndarray' is a 4D array local: is data in ~/work/DATA (local=True) or /raid/ra40 detrend: removes any spurious trend (drift) found in data, for e/ grid point @@ add regional avg functionality? @@ region, calctype, calcdict? not implemented returns an object of type rettype """ field = fielddict['field'] ncfield=fielddict['ncfield'] comp = fielddict['comp'] flist = build_filenames(fielddict, casename,ftype=ftype,timesel=timesel,local=local,verb=verb) for fii,fname in enumerate(flist): if seas==None: # don't average, return all months fld = cnc.getNCvar(fname,ncfield,timesel=timesel)*conv #if region!=None: # lat=cnc.getNCvar(fname,'lat') # lon=cnc.getNCvar(fname,'lon') # fld = cutl.calc_regmean(fld,lat,lon,region=region) # do calcs: if calctype!=None: print 'calcs not implemented yet!! @@@' fldseas=fld else: sea = seas[0] fld = cnc.getNCvar(fname,ncfield,timesel=timesel,seas=sea)*conv # do calcs if calctype!=None: print 'calcs not implemented yet!! @@@' fldseas=fld # hstack for 1D if fii==0: fldret=fldseas else: if fldseas.ndim==1: fldret = np.hstack((fldret,fldseas)) else: fldret = np.vstack((fldret,fldseas)) if detrend and seas!=None: # @@@ eventually implement for monthly too flddtr = sp.signal.detrend(fldret,axis=0,type='linear') + fldret.mean(axis=0) fldret = flddtr return fldret
fldctmvanNOLON = fldctmvan[:,:,0:-1] fldctmzmvanNOLON = np.average(fldctmvanNOLON,2) # vanilla but time-weight fldczmvan = np.average(fldc,3) fldczmvanann = cutl.annualize_monthlyts(fldczmvan) fldczmvananntm = np.average(fldczmvanann,0) # vanilla but remove extra lon and time-weight fldcNOLON = fldc[:,:,:,0:-1] fldczmvanNOLON = np.average(fldcNOLON,3) fldczmvanannNOLON = cutl.annualize_monthlyts(fldczmvanNOLON) fldczmvananntmNOLON = np.average(fldczmvanannNOLON,0) ################################# PY/NC ######################################## lat = cnc.getNCvar(fnamec,'lat') lev = cnc.getNCvar(fnamec,'plev') #fldczm = cnc.getNCvar(fnamec,ncfield,calc='zm',timechunk=((styr-1)*12,enyr*12+1) )*conv fldczm = cnc.getNCvar(fnamec,ncfield,calc='zm')*conv #fldpzm = cnc.getNCvar(fnamep2,ncfield,calc='zm',timechunk=((styr-1)*12,enyr*12+1) )*conv fldczmtm = np.mean(cutl.annualize_monthlyts(fldczm),0) fldpzmtm = np.mean(cutl.annualize_monthlyts(fldpzm),0) fldczmtm2 = np.average(fldczm,0) fldpzmtm2 = np.average(fldpzm,0) # not month-weighted ################################# CDO ########################################### ## @@ test out cdo bindings and compare # xm_fgco2 = cdo.zonmean( input = ifile ,returnMaArray ='fgco2' ) # OR: select out specific dates, time-mean then zonal mean # xm_fgco2 = cdo.zonmean( input = cdo.timmean( input = cdo.seldate('1990-01-01,2005-12-31', input=ifile ) ) ,returnMaArray ='fgco2')
if sicn: field = 'sicn' # @@ check what the units are: are they all fraction? fhadsic = basepath + 'HadISST/hadisst1.1_bc_128_64_1870_2013m03_sicn_' + timeper + 'climo.nc' #SICN, 129x64 fhadsicts = basepath2 + 'HadISST/SICN_BC_HadISST_' + timeper + '_1870010100-2011020100.nc' #0000120100-0125120100.nc' # test matlab generated BC file fhurrsic = basepath + 'HURRELL/MODEL_ICE.T42_' + timeper + 'climo.nc' #SEAICE (%), 128x64 fnsidcsic = basepath + 'NSIDC/nsidc_bt_128x64_1978m11_2011m12_sicn_' + timeper + 'climo.nc' #SICN, 129x64 fhadsicp = basepath + 'HadISST/hadisst1.1_bc_128_64_1870_2013m03_sicn_' + timeperp2 + 'climo.nc' #SICN, 129x64 fhadsicpts = basepath2 + 'HadISST/SICN_BC_HadISST_' + timeperp2 + '_1870010100-2011020100.nc' #0000120100-0125120100.nc' # test matlab generated BC file fhurrsicp = basepath + 'HURRELL/MODEL_ICE.T42_' + timeperp2 + 'climo.nc' #SEAICE (%), 128x64 fnsidcsicp = basepath + 'NSIDC/nsidc_bt_128x64_1978m11_2011m12_sicn_' + timeperp2 + 'climo.nc' #SICN, 129x64 hadsicc = cnc.getNCvar(fhadsic,'SICN') hadsiccts = cnc.getNCvar(fhadsicts,'SICN') hadsiccclimo,junk = cutl.climatologize3d(hadsiccts) hurrsicc = cnc.getNCvar(fhurrsic,'SEAICE')/100. hurrtimes = cnc.getNCvar(fhurrsic,'time') #hurrsicc.resize(hadsicc.shape) # can't resize like this. ?? #np.append(hurrsicc,hurrsicc[:,:,0])#,axis=2) # could not get append to work #hurrsicc[:,:,len(lon)-1] = hurrsicc[:,:,0] # add a wraparound. nope. hurrsicc = np.flipud(hurrsicc) # the lats are flipped compared to hadisst and nsidc nsidcsicc = cnc.getNCvar(fnsidcsic,'SICN') hadsicp = cnc.getNCvar(fhadsicp,'SICN') hadsicpts = cnc.getNCvar(fhadsicpts,'SICN') hadsicpclimo,junk = cutl.climatologize3d(hadsicpts)
## fldctmvanNOLON = fldctmvan[:,:,0:-1] ## fldctmzmvanNOLON = np.average(fldctmvanNOLON,2) ## # vanilla but time-weight ## fldczmvan = np.average(fldc,3) ## fldczmvanann = cutl.annualize_monthlyts(fldczmvan) ## fldczmvananntm = np.average(fldczmvanann,0) ## # vanilla but remove extra lon and time-weight ## fldcNOLON = fldc[:,:,:,0:-1] ## fldczmvanNOLON = np.average(fldcNOLON,3) ## fldczmvanannNOLON = cutl.annualize_monthlyts(fldczmvanNOLON) ## fldczmvananntmNOLON = np.average(fldczmvanannNOLON,0) ################################# PY/NC/CDO ################################### lat = cnc.getNCvar(fnamec, "lat") lev = cnc.getNCvar(fnamec, "plev") nlev = len(lev) nlat = len(lat) fldczmnew = np.append( cnc.getNCvar(fnamec, ncfield, calc="zm") * conv, cnc.getNCvar(fnamec2, ncfield, calc="zm") * conv, axis=0 ) fldczmnewtm = np.mean(cutl.annualize_monthlyts(fldczmnew), 0) fldczmnewtm2 = np.mean(fldczmnew, 0) # not time-weighted fldczmnewANN = np.append( cnc.getNCvar(fnamec, ncfield, calc="zm", seas="ANN") * conv, cnc.getNCvar(fnamec2, ncfield, calc="zm", seas="ANN") * conv, axis=0,