示例#1
0
def compare_pre_post_1100_noise(X,L=31,latbounds=None):
    time1=('1100-1-1','1399-12-31')
    c1=cm.Purples(.8)
    time2=('1400-1-1','2005-12-31')
    if latbounds is not None:
        obs=X.obs(latitude=latbounds)
        mma = MV.average(X.model(latitude=latbounds),axis=0)
        mma = mask_data(mma,obs[0].mask)
        solver = Eof(mma)
        obs = mask_data(obs,solver.eofs()[0].mask)
        truncnoise=solver.projectField(obs)[:,0]*da.get_orientation(solver)
        noisy1=truncnoise(time=time1)
        noisy2=truncnoise(time=time2)
    else:
        noisy1=X.noise(time=time1)
        noisy2=X.noise(time=time2)
    c2=cm.viridis(.1)
    plt.subplot(121)
    Plotting.Plotting.time_plot(noisy1,c=c1)
    Plotting.Plotting.time_plot(noisy2,c=c2)
    plt.ylabel("Projection")
    plt.title("(a): Noise time series")
    plt.subplot(122)
   
    plt.hist(b.bootstrap_slopes(noisy1,L),color=c1,normed=True,alpha=.5)
    da.fit_normals_to_data(b.bootstrap_slopes(noisy1,L),c=c1,label="1100-1400")
    plt.hist(b.bootstrap_slopes(noisy2,L),color=c2,normed=True,alpha=.5)
    da.fit_normals_to_data(b.bootstrap_slopes(noisy2,L),c=c2,label="1400-2005")
    plt.legend()
    plt.title("(b): 31-year trend distributions")
    return np.std(b.bootstrap_slopes(noisy1,L)),np.std(b.bootstrap_slopes(noisy2,L))
示例#2
0
    def project_piControl_on_solver(self, solver=None):
        direc = "/Volumes/Marvel/PICTRL/PDSI_REGRIDDED_SUMMER/"
        files = glob.glob(direc + "*")
        npiC = len(files)

        fname = files[0]

        f = cdms.open(fname)
        piC_pdsi_regrid = f("pdsi_summer")
        piC_pdsi_regrid = MV.masked_where(np.isnan(piC_pdsi_regrid),
                                          piC_pdsi_regrid)
        mask = self.solver.eofs()[0].mask
        # grid=self.model.getGrid()
        nyears = piC_pdsi_regrid.shape[0]
        # tax=cdms.createAxis(np.arange(piC_pdsi.shape[0]))
        # tax.designateTime()
        # tax.units = 'years since 0000-7-1'
        # tax.id="time"
        # piC_pdsi.setAxis(0,tax)

        # piC_pdsi_regrid = piC_pdsi.regrid(grid,regridTool='regrid2')

        piC_mask = mask_data(piC_pdsi_regrid, mask)
        newmask = np.prod(~piC_mask.mask, axis=0)
        if solver is None:
            solver = Eof(mask_data(self.mma, newmask == 0), weights='area')
        fac = da.get_orientation(solver)
        p = solver.projectField(piC_mask)[:, 0] * fac
        for i in range(npiC)[1:]:
            fname = files[i]
            f = cdms.open(fname)
            piC_pdsi_regrid = f("pdsi_summer")
            piC_pdsi_regrid = MV.masked_where(np.isnan(piC_pdsi_regrid),
                                              piC_pdsi_regrid)
            # piC_pdsi = MV.masked_where(np.isnan(piC_pdsi),piC_pdsi)
            nyears += piC_pdsi_regrid.shape[0]
            # tax=cdms.createAxis(np.arange(piC_pdsi.shape[0]))
            # tax.designateTime()
            # tax.units = 'years since 0000-7-1'
            # tax.id="time"
            # piC_pdsi.setAxis(0,tax)

            # piC_pdsi_regrid = piC_pdsi.regrid(grid,regridTool='regrid2')
            piC_mask = mask_data(piC_pdsi_regrid, mask)
            newmask = np.prod(~piC_mask.mask, axis=0)
            solver = Eof(mask_data(self.mma, newmask == 0), weights='area')
            fac = da.get_orientation(solver)
            f.close()
            p = MV.concatenate((p, fac * solver.projectField(piC_mask)[:, 0]))
        tax = cdms.createAxis(np.arange(nyears))
        tax.designateTime()
        tax.units = 'years since 0000-7-1'
        tax.id = "time"
        p.setAxis(0, tax)
        return p
示例#3
0
    def project_dai_on_solver(self,start='1970-1-1'):

        f = cdms.open("../DROUGHT_ATLAS/OBSERVATIONS/DAI_selfcalibrated.nc")
        dai_jja=f("pdsi")
        f.close()
        dai_jja_mask = mask_data(dai_jja,self.obs[0].mask)(time=(start,'2018-12-31'))
        newmask = np.prod(~dai_jja_mask.mask,axis=0)
        dai_jja_mask = mask_data(dai_jja_mask,newmask==0)
        solver = Eof(mask_data(self.mma,newmask==0))
        dai_jja_mask = mask_data(dai_jja_mask,solver.eofs()[0].mask)
        fac = da.get_orientation(solver)
        return solver.projectField(dai_jja_mask)[:,0]*fac
示例#4
0
 def model_projections(self):
     to_proj = mask_data(self.model,self.solver.eofs()[0].mask)
     P=MV.zeros(to_proj.shape[:2])
     for i in range(to_proj.shape[0]):
         tp = to_proj[i]
         mma_mask = mask_data(self.mma,tp[0].mask)
         solver = Eof(mma_mask)
         fac=da.get_orientation(solver)
         
         P[i] = solver.projectField(tp)[:,0]*fac
     P.setAxisList(to_proj.getAxisList()[:2])
     self.P=P
示例#5
0
    def project_cru_on_solver(self, start='1970-1-1', solver=None):

        f = cdms.open("../DROUGHT_ATLAS/OBSERVATIONS/CRU_selfcalibrated.nc")
        cru_jja = f("pdsi")
        f.close()
        cru_jja_mask = mask_data(cru_jja,
                                 self.obs[0].mask)(time=(start, '2018-12-31'))
        newmask = np.prod(~cru_jja_mask.mask, axis=0)
        cru_jja_mask = mask_data(cru_jja_mask, newmask == 0)
        if solver is None:
            solver = Eof(mask_data(self.mma, newmask == 0), weights='area')
        cru_jja_mask = mask_data(cru_jja_mask, solver.eofs()[0].mask)
        fac = da.get_orientation(solver)
        return solver.projectField(cru_jja_mask)[:, 0] * fac
示例#6
0
    def project_piControl_on_solver(self, depth):
        if depth in self.noise.keys():

            pass
        else:
            direc = "/Volumes/Marvel/PICTRL/SM" + depth + "_REGRIDDED_SUMMER/"
            files = glob.glob(direc + "*")
            npiC = len(files)

            fname = files[0]

            f = cdms.open(fname)
            piC_pdsi_regrid = f("sm" + depth + "_summer")
            piC_pdsi_regrid = MV.masked_where(np.isnan(piC_pdsi_regrid),
                                              piC_pdsi_regrid)
            mask = self.solvers[depth].eofs()[0].mask
            grid = self.soilmoisture[depth].getGrid()
            nyears = piC_pdsi_regrid.shape[0]

            piC_mask = mask_data(piC_pdsi_regrid, mask)
            newmask = np.prod(~piC_mask.mask, axis=0)

            solver = Eof(mask_data(self.mma[depth], newmask == 0),
                         weights='area')
            fac = da.get_orientation(solver)
            p = solver.projectField(piC_mask)[:, 0] * fac
            for i in range(npiC)[1:]:
                fname = files[i]
                f = cdms.open(fname)
                piC_pdsi_regrid = f("sm" + depth + "_summer")
                piC_pdsi_regrid = MV.masked_where(np.isnan(piC_pdsi_regrid),
                                                  piC_pdsi_regrid)
                nyears += piC_pdsi_regrid.shape[0]

                piC_mask = mask_data(piC_pdsi_regrid, mask)
                newmask = np.prod(~piC_mask.mask, axis=0)

                solver = Eof(mask_data(self.mma[depth], newmask == 0),
                             weights='area')
                fac = da.get_orientation(solver)
                f.close()
                p = MV.concatenate(
                    (p, fac * solver.projectField(piC_mask)[:, 0]))
            tax = cdms.createAxis(np.arange(nyears))
            tax.designateTime()
            tax.units = 'years since 0000-7-1'
            tax.id = "time"
            p.setAxis(0, tax)
            self.noise[depth] = p
示例#7
0
def standardize_soilmoisture(dataset):
    f = cdms.open("../DROUGHT_ATLAS/PROCESSED/ALL_ANZDA.nc")
    obs = f("pdsi")
    obs = MV.masked_where(np.isnan(obs), obs)
    obs = MV.masked_where(np.abs(obs) > 90, obs)
    obs = obs(time=('1921-1-1', '2000-12-31'))
    pdsi = mask_data(
        obs, obs.mask[0]
    )  #Make all the obs have the same mask as the first datapoint
    f.close()
    mu_p = MV.average(pdsi, axis=0)
    sig_p = genutil.statistics.std(pdsi, axis=0)

    f = cdms.open("../DROUGHT_ATLAS/OBSERVATIONS/" + dataset +
                  "_soilmoisture_summerseason.nc")
    gleam30cm = f("smsurf")
    mask = pdsi[0].mask
    gleam30cmmask = b.mask_data(gleam30cm, mask)
    mu_s = MV.average(gleam30cmmask, axis=0)
    sig_s = genutil.statistics.std(gleam30cmmask, axis=0)

    surf = (gleam30cmmask - mu_s + mu_p) * (sig_p / sig_s)

    gleam2m = f("smroot")
    mask = pdsi[0].mask
    gleam2mmask = b.mask_data(gleam2m, mask)
    mu_s2 = MV.average(gleam2mmask, axis=0)
    sig_s2 = genutil.statistics.std(gleam2mmask, axis=0)
    root = (gleam2mmask - mu_s2 + mu_p) * (sig_p / sig_s)
    return surf, root
示例#8
0
 def get_tree_ring_projection(self, solver=None):
     if solver is None:
         return self.projection
     else:
         fac = da.get_orientation(solver)
         projection = solver.projectField(mask_data(
             self.obs, self.eofmask))[:, 0] * fac
         return projection
示例#9
0
 def get_noise(self, solver=None):
     if solver is None:
         return self.noise
     else:
         proj = solver.projectField(mask_data(
             self.obs, self.eofmask))[:, 0] * da.get_orientation(solver)
         noise = proj(time=('1-1-1', '1850-1-1'))
         return noise
示例#10
0
def regional_DA(OWDA,
                region,
                start_time=None,
                typ='fingerprint',
                return_noise=False):
    if start_time is None:
        start_time = cdtime.comptime(2000, 1, 1)
    times = np.arange(10, 76)
    modeldata = mask_data(OWDA.model(region), OWDA.obs(region)[0].mask)
    if typ == 'fingerprint':
        mma = MV.average(modeldata, axis=0)
        solver = Eof(mma, weights='area')

        to_proj = mask_data(modeldata, solver.eofs()[0].mask)
        P = MV.zeros(to_proj.shape[:2])
        for i in range(to_proj.shape[0]):
            tp = to_proj[i]
            mma_mask = mask_data(mma, tp[0].mask)
            solver = Eof(mma_mask, weights='area')
            fac = da.get_orientation(solver)
            P[i] = solver.projectField(tp)[:, 0] * fac
        P.setAxisList(to_proj.getAxisList()[:2])
        noise = solver.projectField(OWDA.obs(region))[:, 0]
    else:
        P = cdutil.averager(modeldata, axis='xy')
        noise = cdutil.averager(OWDA.obs(region), axis='xy')
    if return_noise:
        return P, noise
    else:
        nmod, nyears = P.shape
        TOE = MV.zeros((nmod, len(times)))
        for i in range(len(times)):
            L = times[i]
            stop_time = start_time.add(L, cdtime.Years)
            modslopes = cmip5.get_linear_trends(P(time=(start_time,
                                                        stop_time)))

            noiseterm = np.std(bootstrap_slopes(noise, L))

            TOE[:, i] = modslopes / noiseterm
        TOE.setAxis(0, P.getAxis(0))
        return TOE
示例#11
0
    def model_projections(self, depth):

        if depth in self.P.keys():
            pass

        else:
            to_proj = mask_data(self.soilmoisture[depth],
                                self.solvers[depth].eofs()[0].mask)
            P = MV.zeros(to_proj.shape[:2])
            for i in range(to_proj.shape[0]):

                tp = to_proj[i]
                mma_mask = mask_data(self.mma[depth], tp[0].mask)
                solver = Eof(mma_mask, weights='area')
                tp = mask_data(tp, solver.eofs()[0].mask)
                fac = da.get_orientation(solver)

                P[i] = solver.projectField(tp)[:, 0] * fac
            P.setAxisList(to_proj.getAxisList()[:2])
            self.P[depth] = P
            self.P[depth].getTime().id = "time"
示例#12
0
def mask_models(CO, writename=None):
    """Create mask based on availability of observations at first time step and apply to CMIP5 hist+85 PDSI."""
    f = cdms.open("../DROUGHT_ATLAS/CMIP5/pdsi.ensemble.hist.rcp85.nc")
    models = f("pdsi")
    models = MV.masked_where(np.isnan(models), models)
    masked_models = mask_data(models, CO[0].mask)
    masked_models.id = 'pdsi'
    if writename is not None:
        fw = cdms.open(writename, "w")
        fw.write(masked_models)
        fw.close()
    return masked_models
示例#13
0
def truncated_solver(D,the_start=None,the_stop=None,include_cru=False,include_dai=False):
   
    thedata = D.ALL.model(time=(the_start,the_stop))
    the_mma=MV.average(cmip5.ensemble2multimodel(thedata),axis=0)
    if include_cru:
        f = cdms.open("../DROUGHT_ATLAS/OBSERVATIONS/CRU_selfcalibrated.nc")
        cru_jja=f("pdsi")
        f.close()
        cru_jja_mask = mask_data(cru_jja,D.ALL.obs[0].mask)(time=(the_start,'2018-12-31'))
        newmask = np.prod(~cru_jja_mask.mask,axis=0)
        cru_jja_mask = mask_data(cru_jja_mask,newmask==0)
        
        thesolver = Eof(mask_data(D.ALL.mma(time=(the_start,the_stop)),newmask==0),weights='area')
    elif include_dai:
        f = cdms.open("../DROUGHT_ATLAS/OBSERVATIONS/DAI_selfcalibrated.nc")
        dai_jja=f("pdsi")
        f.close()
        dai_jja_mask = mask_data(dai_jja,D.ALL.obs[0].mask)(time=(the_start,'2018-12-31'))
        newmask = np.prod(~dai_jja_mask.mask,axis=0)
        dai_jja_mask = mask_data(dai_jja_mask,newmask==0)
        
        thesolver = Eof(mask_data(D.ALL.mma(time=(the_start,the_stop)),newmask==0),weights='area')
    else:
        thesolver = Eof(the_mma,weights="area")
    return thesolver
示例#14
0
def soilmoisture(depth,mask=None):
    if depth == "pdsi":
        f = cdms.open("../DROUGHT_ATLAS/CMIP5/pdsi.ensemble.hist.rcp85.nc")
        variable="pdsi"
    else:
        f = cdms.open("../DROUGHT_ATLAS/CMIP5/sm"+depth+".ensemble.hist.rcp85.nc")
        variable = "sm"+depth
    sm = get_rid_of_bad(f(variable))
    sm = MV.masked_where(np.isnan(sm),sm)
    f.close()
    if mask is not None:
        sm = mask_data(sm,mask)
    return sm
示例#15
0
    def model_projections(self, solver=None):
        if solver is None:
            make_own_solver = True
        else:
            make_own_solver = False
        if solver is None:
            to_proj = mask_data(self.model, self.solver.eofs()[0].mask)
        else:
            to_proj = cmip5.cdms_clone(MV.filled(self.model, fill_value=0),
                                       self.model)
            to_proj = mask_data(to_proj, solver.eofs()[0].mask)
        P = MV.zeros(to_proj.shape[:2])
        for i in range(to_proj.shape[0]):
            tp = to_proj[i]
            if make_own_solver:
                mma_mask = mask_data(self.mma, tp[0].mask)

                solver = Eof(mma_mask, weights='area')
            fac = da.get_orientation(solver)

            P[i] = solver.projectField(tp)[:, 0] * fac
        P.setAxisList(to_proj.getAxisList()[:2])
        return P
示例#16
0
def write_combinations():
    """
    Make t combined NH drought atlases: ALL_OBS, which starts in 1100 and includes MADA, OWDA, and NADA, and ALL_OBS_plus_MEX, which includes the former + MXDA
    """
    list_of_obs = []
    for atlas_name in ["OWDA2.5", "MADA2.5", "NADA2.5"]:
        f = cdms.open("../DROUGHT_ATLAS/PROCESSED/" + atlas_name + ".nc")
        obs = f("pdsi")
        obs = MV.masked_where(np.isnan(obs), obs)
        obs = MV.masked_where(np.abs(obs) > 90, obs)
        obs = obs(time=('1100-7-1', '2020-12-31'))
        obs = mask_data(
            obs, obs.mask[0]
        )  #Make all the obs have the same mask as the first datapoint
        f.close()
        list_of_obs += [obs]
    writename = "../DROUGHT_ATLAS/PROCESSED/ALL_OBS.nc"
    CO = combine_observations(list_of_obs, writename=writename)
    modelwritename = "../DROUGHT_ATLAS/CMIP5/pdsi.ALL_OBS.hist.rcp85.nc"
    mm = mask_models(CO, writename=modelwritename)
    #now add in MXDA:
    atlas_name = "MXDA2.5"
    f = cdms.open("../DROUGHT_ATLAS/PROCESSED/" + atlas_name + ".nc")
    obs = f("pdsi")
    obs = MV.masked_where(np.isnan(obs), obs)
    obs = MV.masked_where(np.abs(obs) > 90, obs)
    obs = obs(time=('1100-7-1', '2020-12-31'))
    obs = mask_data(
        obs, obs.mask[0]
    )  #Make all the obs have the same mask as the first datapoint
    f.close()
    list_of_obs += [obs]
    writename = "../DROUGHT_ATLAS/PROCESSED/ALL_OBS_plus_MEX.nc"
    CO = combine_observations(list_of_obs, writename=writename)
    modelwritename = "../DROUGHT_ATLAS/CMIP5/pdsi.ALL_OBS_plus_MEX.hist.rcp85.nc"
    mm = mask_models(CO, writename=modelwritename)
示例#17
0
def write_big_drought_atlas():
    list_of_obs = []
    for atlas_name in ["OWDA2.5", "MADA2.5", "NADA2.5", "MXDA2.5", "ANZDA2.5"]:
        f = cdms.open("../DROUGHT_ATLAS/PROCESSED/" + atlas_name + ".nc")
        obs = f("pdsi")
        obs = MV.masked_where(np.isnan(obs), obs)
        obs = MV.masked_where(np.abs(obs) > 90, obs)
        obs = obs(time=('1100-7-1', '2020-12-31'))
        obs = mask_data(
            obs, obs.mask[0]
        )  #Make all the obs have the same mask as the first datapoint
        f.close()
        list_of_obs += [obs]
    writename = "../DROUGHT_ATLAS/PROCESSED/ALL_ANZDA.nc"
    CO = combine_observations(list_of_obs, writename=writename)
    modelwritename = "../DROUGHT_ATLAS/CMIP5/pdsi.ALL_ANZDA.hist.rcp85.nc"
    mm = mask_models(CO, writename=modelwritename)
示例#18
0
def write_regridded():
    fnames = glob.glob("../DROUGHT_ATLAS/PROCESSED/*")
    for fil in fnames:
        atlas_name = fil.split("/")[-1].split(".")[0]
        if atlas_name != "ANZDA":
            f = cdms.open("../DROUGHT_ATLAS/PROCESSED/" + atlas_name + ".nc")
            obs = f("pdsi")
            obs = MV.masked_where(np.isnan(obs), obs)
            obs = MV.masked_where(np.abs(obs) > 90, obs)
            obs = obs(time=('1100-7-1', '2020-12-31'))

            obs = mask_data(
                obs, obs.mask[0]
            )  #Make all the obs have the same mask as the first datapoint
            f.close()
            writefname = "../DROUGHT_ATLAS/PROCESSED/" + atlas_name + "2.5.nc"
            CO = combine_observations([obs], grid='2.5', writename=writefname)
            modelwritename = "../DROUGHT_ATLAS/CMIP5/pdsi." + atlas_name + "2.5.hist.rcp85.nc"
            mm = mask_models(CO, writename=modelwritename)
示例#19
0
def exclude_NADA():
    """
    Make a combined NH drought atlas ALL_NONADA, which starts in 1400 and includes MADA, OWDA, ANZDA but NOT NADA
    """
    list_of_obs = []
    for atlas_name in ["OWDA2.5", "MADA2.5", "MXDA2.5", "ANZDA2.5"]:
        f = cdms.open("../DROUGHT_ATLAS/PROCESSED/" + atlas_name + ".nc")
        obs = f("pdsi")
        obs = MV.masked_where(np.isnan(obs), obs)
        obs = MV.masked_where(np.abs(obs) > 90, obs)
        obs = obs(time=('1400-7-1', '2020-12-31'))
        obs = mask_data(
            obs, obs.mask[0]
        )  #Make all the obs have the same mask as the first datapoint
        f.close()
        list_of_obs += [obs]
    writename = "../DROUGHT_ATLAS/PROCESSED/ALL_NONADA.nc"
    CO = combine_observations(list_of_obs, writename=writename)
    modelwritename = "../DROUGHT_ATLAS/CMIP5/pdsi.ALL_NONADA.hist.rcp85.nc"
    mm = mask_models(CO, writename=modelwritename)
示例#20
0
def individual_plots():
    fnames = glob.glob("../DROUGHT_ATLAS/PROCESSED/ORIGINAL_GRID/*")
    for fil in fnames:
        atlas_name = fil.split("/")[-1].split(".")[0]

        f = cdms.open("../DROUGHT_ATLAS/PROCESSED/ORIGINAL_GRID/" +
                      atlas_name + ".nc")
        obs = f("pdsi")
        obs = MV.masked_where(np.isnan(obs), obs)
        obs = MV.masked_where(np.abs(obs) > 90, obs)
        obs = obs(time=('1400-7-1', '2005-12-31'))

        obs = mask_data(
            obs, obs.mask[0]
        )  #Make all the obs have the same mask as the first datapoint
        f.close()
        plt.figure()
        m = plot_regional(obs[-1], atlas_name, vmin=-6, vmax=6)
        plt.title(atlas_name + ": 2005 PDSI")
        m.drawcoastlines(color="gray")
        plt.tight_layout()
        plt.savefig("../DroughtAtlasPaper/FIGS/ForTalk/" + atlas_name +
                    "_2005.png")
        plt.close()
示例#21
0
    def project_soilmoisture(self, dataset):
        mask = self.mask
        self.OBS_PROJECTIONS[dataset] = {}
        surf, root = standardize_soilmoisture(dataset)

        surfsolver = Eof(mask_data(self.mma["30cm"], mask), weights='area')
        surfmask = mask_data(surf, surfsolver.eofs()[0].mask)
        surfsolver = Eof(mask_data(self.mma["30cm"], surfmask[-1].mask),
                         weights='area')
        surfanom = surfmask - MV.average(surfmask, axis=0)
        self.OBS_PROJECTIONS[dataset]["30cm"] = surfsolver.projectField(
            surfanom)[:, 0] * da.get_orientation(surfsolver)

        rootsolver = Eof(mask_data(self.mma["2m"], mask), weights='area')
        rootmask = mask_data(root, rootsolver.eofs()[0].mask)
        rootsolver = Eof(mask_data(self.mma["2m"], rootmask[-1].mask),
                         weights='area')
        rootanom = rootmask - MV.average(rootmask, axis=0)
        self.OBS_PROJECTIONS[dataset]["2m"] = rootsolver.projectField(
            rootanom)[:, 0] * da.get_orientation(rootsolver)
示例#22
0
def observations():

    # Read in PET and PR files
    #regridded PET
    f = cdms.open("OBS/cru_ts4.01.1901.2016.pet.dat.REGRID.nc")
    pet = f("pet")
    f.close()
    landmask = pet[0].mask
    # Regridded GPCC
    fpr = cdms.open("OBS/precip.mon.total.2.5x2.5.v7.nc")
    pr = fpr("precip")
    fpr.close()
    pr = pr / 30.  #Approximate mm-> mm/day by assuming 30 days/month
    #Put them both on the same time axis
    startpet = cmip5.start_time(pet)
    stoppet = cmip5.stop_time(pet)
    startpr = cmip5.start_time(pr)
    stoppr = cmip5.stop_time(pr)

    if cdtime.compare(startpet, startpr) > 0:
        start = startpet
    else:
        start = startpr
    if cdtime.compare(stoppet, stoppr) > 0:
        stop = stoppr
    else:
        stop = stoppet
    start = cdtime.comptime(start.year, start.month, 1)
    stop = cdtime.comptime(stop.year, stop.month, 31)

    pr = pr(time=(start, stop))
    pet = pet(time=(start, stop))

    #Calculate R and P
    Rpr, Ppr = sc.fast_annual_cycle(pr)
    Rpet, Ppet = sc.fast_annual_cycle(pet)
    #Convert phase to month of maximum (VECTORIZE THIS?)
    #How to handle "month of maximum" if it's fluctuating between 1 and 12?  (physically, what does this mean when our timesteps are every year?)
    #Should we modify the code in phase detection to start at phase 0?  Ie start in a month such that the maximum is 6 months away?

    #Calculate variance maps for p and pet
    test_period = ('1979-1-1', '2004-12-31'
                   )  #for overlap with CMIP5 historical
    pet_vmap = sc.variance_map(pet(time=test_period))
    pr_vmap = sc.variance_map(pr(time=test_period))

    #make phase maps
    variance_threshold = 0.25  #Can we come up with a physically meaningful threshold here? Null hypothesis of no correlation ruled out at 99% confidence?
    Ppet_clim = sc.phase_climatology(Ppet)
    Ppet_clim_month = sc.mask_data(sc.phase_to_month(Ppet_clim), landmask)

    Ppr_clim = sc.phase_climatology(Ppr)
    Ppr_clim_month = sc.mask_data(sc.phase_to_month(Ppr_clim), landmask)
    months = [
        "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT",
        "NOV", "DEC"
    ]
    from land_seasonal_cycle import landplot
    plt.subplot(211)
    m = landplot(MV.masked_where(pet_vmap < variance_threshold,
                                 Ppet_clim_month),
                 cmap=cm.hsv,
                 vmin=0,
                 vmax=12)
    m.drawcoastlines(color='gray')
    cbar = plt.colorbar(orientation="horizontal")
    cbar.set_ticks(np.arange(12))
    cbar.set_ticklabels(months)
    plt.title("PET phase")

    plt.subplot(212)
    m = landplot(MV.masked_where(pr_vmap < variance_threshold, Ppr_clim_month),
                 cmap=cm.hsv,
                 vmin=0,
                 vmax=12)
    m.drawcoastlines(color='gray')
    cbar = plt.colorbar(orientation="horizontal")
    cbar.set_ticks(np.arange(12))
    cbar.set_ticklabels(months)
    plt.title("PR phase")

    #phase trends
    Pa_pet = sc.get_phase_anomalies(Ppet)
    Pa_pet_trends = cmip5.get_linear_trends(Pa_pet)

    Pa_pr = sc.get_phase_anomalies(Ppr)
    Pa_pr_trends = cmip5.get_linear_trends(Pa_pr)
示例#23
0
def average_over_biome(K,X,biome):
    basicmask = K!=biome
    biome_mask = sc.mask_data(X,basicmask)
    return cdutil.averager(biome_mask,'xy')
示例#24
0
    def __init__(self, name, cutoff='0001-1-1'):
        if name.find("2.5") >= 0:
            self.name = name.split("2.5")[0]
        else:
            self.name = name
        #if name.find("+")<0:
        f = cdms.open("../DROUGHT_ATLAS/PROCESSED/" + name + ".nc")
        obs = f("pdsi")
        self.obs = MV.masked_where(np.isnan(obs), obs)
        self.obs = MV.masked_where(np.abs(self.obs) > 90, self.obs)
        self.obs = self.obs(time=(cutoff, '2020-12-31'))

        self.obs = mask_data(
            self.obs, self.obs.mask[0]
        )  #Make all the obs have the same mask as the first datapoint
        f.close()
        fm = cdms.open("../DROUGHT_ATLAS/CMIP5/pdsi." + name +
                       ".hist.rcp85.nc")
        self.model = get_rid_of_bad(fm("pdsi"))
        self.model = MV.masked_where(np.isnan(self.model), self.model)
        fm.close()

        # else:
        #DEPRECATED: MERGE observations onto common grid using old code
        #     name1,name2=name.split("+")
        #     f1 = cdms.open("../DROUGHT_ATLAS/PROCESSED/"+name1+".nc")
        #     obs1 = f1("pdsi")
        #     obs1 = MV.masked_where(np.isnan(obs1),obs1)
        #     obs1 = MV.masked_where(np.abs(obs1)>90,obs1)
        #     obs1 = obs1(time=(cutoff,'2017-12-31'))

        #     obs1=mask_data(obs1,obs1.mask[0])
        #     f1.close()
        #     fm1 = cdms.open("../DROUGHT_ATLAS/CMIP5/pdsi."+name1+".hist.rcp85.nc")
        #     model1=get_rid_of_bad(fm1("pdsi"))
        #     model1=MV.masked_where(np.isnan(model1),model1)
        #     fm1.close()

        #     f2 = cdms.open("../DROUGHT_ATLAS/PROCESSED/"+name2+".nc")
        #     obs2 = f2("pdsi")
        #     obs2 = MV.masked_where(np.isnan(obs2),obs2)
        #     obs2 = MV.masked_where(np.abs(obs2)>90,obs2)
        #     obs2 = obs2(time=(cutoff,'2017-12-12'))

        #     obs2=mask_data(obs2,obs2.mask[0])
        #     f2.close()
        #     fm2 = cdms.open("../DROUGHT_ATLAS/CMIP5/pdsi."+name2+".hist.rcp85.nc")
        #     model2=get_rid_of_bad(fm2("pdsi"))
        #     model2=MV.masked_where(np.isnan(model2),model2)
        #     fm2.close()

        #     self.obs=merge.merge(obs1,obs2)
        #     self.model=merge.merge(model1,model2)

        mma = MV.average(self.model, axis=0)
        self.mma = mask_data(
            mma, self.obs[0].mask)  #make all the models have the same mask
        self.solver = Eof(self.mma, weights='area')
        self.eofmask = self.solver.eofs()[0].mask

        self.fac = da.get_orientation(self.solver)
        self.projection = self.solver.projectField(
            mask_data(self.obs, self.eofmask))[:, 0] * self.fac
        self.noise = self.projection(time=('1-1-1', '1850-1-1'))
        self.P = self.model_projections()