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
Exemple #2
0
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
Exemple #3
0
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
Exemple #4
0
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')
Exemple #5
0
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')
Exemple #6
0
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')
Exemple #7
0
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,...]
Exemple #12
0
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)
Exemple #14
0
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
Exemple #16
0
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'
Exemple #17
0
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
Exemple #18
0
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
Exemple #19
0
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
Exemple #21
0
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
Exemple #22
0
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
Exemple #23
0
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'
Exemple #25
0
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')
Exemple #27
0
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,