elif nobsall > nobs: obindx = np.random.choice(np.arange(nobsall),size=nobs,replace=False) oblats = oblatsall[obindx]; oblons = oblonsall[obindx] thetaobs = np.ascontiguousarray(thetaobsall[ntime,obindx]) if use_letkf: covlocal_tmp = np.ascontiguousarray(covlocal1[obindx,:]) else: covlocal_tmp = np.ascontiguousarray(covlocal[obindx,:]) hcovlocal_tmp = np.ascontiguousarray(hcovlocal[obindx,:][:,obindx]) else: raise ValueError('nobsall must be >= nobs') if oberrstdev > 0.: # add observation error thetaobs += np.random.normal(scale=oberrstdev,size=nobs) # add ob errors for nanal in range(nanals): # inverse transform to grid. uens[nanal],vens[nanal] = sp.getuv(vrtspec[nanal],divspec[nanal]) thetaens[nanal] = sp.spectogrd(thetaspec[nanal]) wens[nanal] =\ models[nanal].dp*sp.spectogrd(divspec[nanal,1,...]-divspec[nanal,0,...]) # forward operator calculation. theta = thetaens[nanal,::-1,:] hxens[nanal] = bilintrp(theta,np.degrees(sp.lons),np.degrees(sp.lats[::-1]),oblons,oblats) hxensmean = hxens.mean(axis=0) obfits = ((thetaobs-hxensmean)**2).sum(axis=0)/(nobs-1) obbias = (thetaobs-hxensmean).mean(axis=0) obsprd = (((hxens-hxensmean)**2).sum(axis=0)/(nanals-1)).mean() uensmean = uens.mean(axis=0); vensmean = vens.mean(axis=0) thetensmean = thetaens.mean(axis=0) wensmean = wens.mean(axis=0) theterr = (thetatruth[ntime]-thetensmean)**2 theterrb = np.sqrt((theterr*globalmeanwts).sum())
obindx = np.random.choice(np.arange(nobsall), size=nobs, replace=False) oblats = oblatsall[obindx] oblons = oblonsall[obindx] thetaobs = np.ascontiguousarray(thetaobsall[ntime, obindx]) if use_letkf: covlocal_tmp = np.ascontiguousarray(covlocal1[obindx, :]) else: covlocal_tmp = np.ascontiguousarray(covlocal[obindx, :]) hcovlocal_tmp = np.ascontiguousarray(hcovlocal[obindx, :][:, obindx]) else: raise ValueError("nobsall must be >= nobs") if oberrstdev > 0.0: # add observation error thetaobs += np.random.normal(scale=oberrstdev, size=nobs) # add ob errors for nanal in range(nanals): # inverse transform to grid. uens[nanal], vens[nanal] = sp.getuv(vrtspec[nanal], divspec[nanal]) thetaens[nanal] = sp.spectogrd(thetaspec[nanal]) wens[nanal] = models[nanal].dp * sp.spectogrd(divspec[nanal, 1, ...] - divspec[nanal, 0, ...]) # forward operator calculation. theta = thetaens[nanal, ::-1, :] hxens[nanal] = bilintrp(theta, np.degrees(sp.lons), np.degrees(sp.lats[::-1]), oblons, oblats) hxensmean = hxens.mean(axis=0) obfits = ((thetaobs - hxensmean) ** 2).sum(axis=0) / (nobs - 1) obbias = (thetaobs - hxensmean).mean(axis=0) obsprd = (((hxens - hxensmean) ** 2).sum(axis=0) / (nanals - 1)).mean() uensmean = uens.mean(axis=0) vensmean = vens.mean(axis=0) thetensmean = thetaens.mean(axis=0) wensmean = wens.mean(axis=0) theterr = (thetatruth[ntime] - thetensmean) ** 2 theterrb = np.sqrt((theterr * globalmeanwts).sum())
oblons = oblonsall[obindx] thetaobs = np.ascontiguousarray(thetaobsall[ntime, obindx]) if use_letkf: covlocal_tmp = np.ascontiguousarray(covlocal1[obindx, :]) else: covlocal_tmp = np.ascontiguousarray(covlocal[obindx, :]) hcovlocal_tmp = np.ascontiguousarray(hcovlocal[obindx, :][:, obindx]) else: raise ValueError('nobsall must be >= nobs') if oberrstdev > 0.: # add observation error thetaobs += rs1.normal(scale=oberrstdev, size=nobs) # add ob errors for nanal in range(nanals): # inverse transform to grid at obs time (center of IAU window). uens[nanal], vens[nanal] = sp.getuv( vrtspec_fcst[nsteps / 2, nanal, ...], divspec_fcst[nsteps / 2, nanal, ...]) thetaens[nanal] = sp.spectogrd(thetaspec_fcst[nsteps / 2, nanal, ...]) wens[nanal] = models[nanal].dp * sp.spectogrd(divspec_fcst[ nsteps / 2, nanal, 1, :] - divspec_fcst[nsteps / 2, nanal, 0, :]) # forward operator calculation (obs all at center of assim window). hxens[nanal] = bilintrp(thetaens[nanal, ::-1, :], np.degrees(sp.lons), np.degrees(sp.lats[::-1]), oblons, oblats) hxensmean = hxens.mean(axis=0) obfits = ((thetaobs - hxensmean)**2).sum(axis=0) / (nobs - 1) obbias = (thetaobs - hxensmean).mean(axis=0) obsprd = (((hxens - hxensmean)**2).sum(axis=0) / (nanals - 1)).mean() uensmean = uens.mean(axis=0) vensmean = vens.mean(axis=0) thetensmean = thetaens.mean(axis=0) wensmean = wens.mean(axis=0)
elif nobsall > nobs: obindx = rs1.choice(np.arange(nobsall),size=nobs,replace=False) oblats = oblatsall[obindx]; oblons = oblonsall[obindx] thetaobs = np.ascontiguousarray(thetaobsall[ntime,obindx]) if use_letkf: covlocal_tmp = np.ascontiguousarray(covlocal1[obindx,:]) else: covlocal_tmp = np.ascontiguousarray(covlocal[obindx,:]) hcovlocal_tmp = np.ascontiguousarray(hcovlocal[obindx,:][:,obindx]) else: raise ValueError('nobsall must be >= nobs') if oberrstdev > 0.: # add observation error thetaobs += rs1.normal(scale=oberrstdev,size=nobs) # add ob errors for nanal in range(nanals): # inverse transform to grid at obs time (center of IAU window). uens[nanal],vens[nanal] = sp.getuv(vrtspec_fcst[nsteps/2,nanal,...],divspec_fcst[nsteps/2,nanal,...]) thetaens[nanal] = sp.spectogrd(thetaspec_fcst[nsteps/2,nanal,...]) wens[nanal] = models[nanal].dp*sp.spectogrd(divspec_fcst[nsteps/2,nanal,1,:]-divspec_fcst[nsteps/2,nanal,0,:]) # forward operator calculation (obs all at center of assim window). hxens[nanal] = bilintrp(thetaens[nanal,::-1,:],np.degrees(sp.lons),np.degrees(sp.lats[::-1]),oblons,oblats) hxensmean = hxens.mean(axis=0) obfits = ((thetaobs-hxensmean)**2).sum(axis=0)/(nobs-1) obbias = (thetaobs-hxensmean).mean(axis=0) obsprd = (((hxens-hxensmean)**2).sum(axis=0)/(nanals-1)).mean() uensmean = uens.mean(axis=0); vensmean = vens.mean(axis=0) thetensmean = thetaens.mean(axis=0) wensmean = wens.mean(axis=0) theterr = (thetatruth[ntime]-thetensmean)**2 theterr = np.sqrt((theterr*globalmeanwts).sum()) werr = (wtruth[ntime]-wensmean)**2 werr = np.sqrt((werr*globalmeanwts).sum())