def plot(xx, yy, target, label, figfiles, figfile, lon=None, lat=None, show=False): xs, ys, mask = coord2slice(target, lon=lon, lat=lat) P.figure(figsize=(6, 3.5)) P.title('Target=%(label)s / select: lon=%(lon)s, lat=%(lat)s' % locals()) add_grid((xx, yy)) xx = xx.asma() yy = yy.asma() if isinstance(lon, tuple): P.axvline(lon[0], color='m', ls='--', lw=2) P.axvline(lon[1], color='m', ls='--', lw=2) elif isinstance(lon, slice): i, j, k = lon.indices(xx.shape[1]) P.plot(xx[:, i], yy[:, i], 'c--', lw=2) P.plot(xx[:, j - 1], yy[:, j - 1], 'c--', lw=2) if isinstance(lat, tuple): P.axhline(lat[0], color='m', ls='--', lw=2) P.axhline(lat[1], color='m', ls='--', lw=2) elif isinstance(lat, slice): i, j, k = lat.indices(yy.shape[0]) P.plot(xx[i], yy[i], 'c--', lw=2) P.plot(xx[j - 1], yy[j - 1], 'c--', lw=2) P.xticks(N.arange(xx.min() - 1, xx.max() + 1)) P.yticks(N.arange(yy.min() - 1, yy.max() + 1)) xxi, yyi = xx, yy xx = xx[ys, xs] yy = yy[ys, xs] # mask = mask[ys, xs] xxb, yyb = meshbounds(xx, yy) P.pcolormesh(xxb, yyb, mask, shading='faceted') P.scatter(xx.ravel(), yy.ravel(), c=(0, 1, 0)) P.grid(True) P.axis('image') P.tight_layout() i = len(figfiles) savefig = figfile % i if os.path.exists(savefig): os.remove(savefig) P.savefig(savefig) figfiles.append(savefig) if show: P.show() else: P.close()
def test_fcore_arm_pert(): """Test the EOF decomposition performed by:func:`sonat._fcore.f_arm` function""" # Parameters nstate = 50 nens = 20 r = 0.2 smooth = 10 Hii = [10, 20, 29, 40] # obs oper = simple undersampling at these indices pert = 5e-1 # Sample states ssamples = N.random.random((nens, nstate)) smooth_ = N.ones((smooth, smooth)) ssamples = convolve2d(ssamples, smooth_, mode='same') ssamples /= convolve2d(ssamples * 0 + 1, smooth_, mode='same') ssamples -= ssamples.mean(axis=0) ssamples = N.asfortranarray(ssamples.T) ssamples /= ssamples.std() # Observation error nobs = len(Hii) R = N.asfortranarray(N.diag(N.ones(nobs) * r)) # Generate data-space samples dsamples = ssamples[Hii] # Call ARM ndof = min(dsamples.shape) arm_spect, arm, arm_rep, status = f_arm(ndof, ssamples, dsamples, R) ngood = (arm_spect > 1).sum() # number of valid modes # Setup obs operator Hii = N.array(Hii) xp = N.arange(nstate) interp = interp1d(xp, ssamples, axis=0, kind='cubic') # Loop on obs indices to peturbate diag_ful = [] diag_alt = [] for iobs in range(nobs): # Loop on perturbations der_ful = [] der_alt = [] for ip, dx in enumerate([-pert, pert]): # Generate data-space samples x = Hii.copy().astype('d') x[iobs] += dx dsamples_ = interp(x) # Call ARM arm_spect_ful, arm_, arm_rep_, status = f_arm( ndof, ssamples, dsamples_, R) # Build St = At Ht / sqrt(R * (nens-1)) St = dsamples_.T / N.sqrt(r * (nens - 1)) # Principal components pcs = N.dot(St, arm) # Perturbed spectrum arm_spect_alt = (pcs**2).sum(axis=0) # Results der_ful.append((arm_spect_ful - arm_spect)[:ngood].sum()) der_alt.append((arm_spect_alt - arm_spect)[:ngood].sum()) # Results diag_ful.append(der_ful) diag_alt.append(der_alt) # Checks total = arm_spect[:ngood].sum() diag_ful = 100 * N.array(diag_ful) / total diag_alt = 100 * N.array(diag_alt) / total import pylab as P P.figure(figsize=(8, 10)) P.subplot(211) xx, yy = meshbounds(xp, N.arange(nens)) P.pcolormesh(xx, yy, ssamples.T, cmap=cmocean.cm.balance) for i in Hii: P.axvline(xp[i], color='k', linewidth=2, linestyle='--') P.axis('image') P.xlabel('Space') P.ylabel('Members') P.title('Ensemble') P.subplot(212) P.plot(Hii, diag_ful[:, 0], '--b<', markersize=15, label='left pert, full ARM') P.plot(Hii, diag_ful[:, 1], '--b>', markersize=15, label='right pert, full ARM') P.plot(Hii, diag_alt[:, 0], '--g<', markersize=10, label='left pert, reproj') P.plot(Hii, diag_alt[:, 1], '--g>', markersize=10, label='right pert, reproj') P.xlabel('Space') P.ylabel('Diff. in total variance of retained modes [%]') P.figtext(.01, .01, 'Perturbation: {pert}, data scale: {smooth}'.format(**locals()), family='monospace') P.grid() P.axhline(0, color='k') P.title('Sensitiviy analysis') P.legend(loc='center left') P.xlim(xx.min(), xx.max()) P.tight_layout() P.figtext(.5, .99, 'ARM obs location perturbation analysis', va='top', size=14, ha='center') P.savefig(func_name() + '.png') P.close()
# %% Imports import numpy as N, pylab as P from vcmq import griddata, meshbounds, savefigs # %% Setup a rectangular grid and data xr = N.arange(20.) yr = N.arange(10.) xxr, yyr = N.meshgrid(xr, yr) xrb, yrb = meshbounds(xr, yr) zzr = (N.sin(xxr*N.pi/6)*N.sin(yyr*N.pi/6) + \ N.exp(-((xxr-7.)**2+(yyr-7.)**2)/4.**2))*100. zzr -= zzr.min() vminmax = dict(vmin=zzr.min(), vmax=zzr.max()) # %% Build a random sample from gridded data ij = N.unique((N.random.rand(50) * zzr.size).astype('i')) xi, yi, zi = xxr.flat[ij], yyr.flat[ij], zzr.flat[ij] # %% Interpolation on regular grid # - natgrid zirn = griddata(xi, yi, zi, (xr, yr), method='linear', ext=True, sub=6) # - ifremer cargen zirk = griddata(xi, yi, zi, (xr, yr), method='carg') # %% Plots P.figure(1, figsize=(6, 8)) P.subplots_adjust(hspace=.3, bottom=.05, top=.95, left=.06) # - original P.subplot(311) P.pcolor(xrb, yrb, zzr, **vminmax) P.xlim(xrb.min(), xrb.max())
from vacumm.misc.grid.regridding import GridData, griddata, xy2xy zzov = griddata(xi, yi, zi, (xr, yr), method='nat', ext=True, sub=10) # -> Tester la methode "carg" # -> Testez parametre sub=... # -> Essayer avec GridData zov2 = xy2xy(xi, yi, zi, xo, yo) # Krigeage from vacumm.misc.grid.kriging import krig zzok = krig(xi, yi, zi, xxr.ravel(), yyr.ravel(), nproc=1).reshape(zzr.shape) # -> Tester nproc et npmax # Plots from vcmq import meshbounds, P xxrb, yyrb = meshbounds(xr, yr) P.figure(figsize=(10, 8)) axis = [xxrb.min(), xxrb.max(), yyrb.min(), yyrb.max()] # P.subplot(332) P.pcolormesh(xxrb, yyrb, zzr, **vminmax) P.scatter(xi, yi, c='k') P.title('Original') P.axis(axis) # P.subplot(334) P.pcolormesh(xxrb, yyrb, zzoc, **vminmax) P.title('CDAT/Natgrid') P.axis(axis) # P.subplot(335)
"""Test CDAT conservative regridding""" from vcmq import N, meshbounds, bounds1d, cdms2, MV2, rc, P, add_grid, rcdefaults, \ create_lon, create_lat, savefigs, code_file_name # Input grid x0, y0, nx, ny, dx, dy = 0., 0., 20, 15, 5., 5. x = x0 + N.arange(0, nx * dx, dx) y = y0 + N.arange(0, ny * dy, dy) xxbi, yybi = meshbounds(x, y) xb = bounds1d(x) yb = bounds1d(y) lon = create_lon(x) lat = create_lat(y) lon.setBounds(xb) lat.setBounds(yb) gridi = cdms2.createRectGrid(lat, lon) # Input data vari = MV2.ones(gridi.shape) * 50 vari[5:10, 7:13] = -10 #vari[:, -1] = MV2.masked # <<< THIS MAKES IT WORK! vari.setAxisList([gridi.getLatitude(), gridi.getLongitude()]) vari.setGrid(gridi) # Output grid grido, xxbo, yybo = gridi, xxbi, yybi # Regrid diag = {'dstAreaFractions': None} varo = vari.regrid(grido,
"""Test the fortran function :f:func:`nearest2d`""" from vcmq import N, P, code_file_name, P, os, rotate_grid, add_grid, meshbounds from vacumm.misc.grid._interp_ import nearest2d # Input grid gridi = rotate_grid((N.arange(5), N.arange(4)), 30) xxi = gridi.getLongitude()[:].filled() yyi = gridi.getLatitude()[:].filled() vari = N.resize(yyi, (20, ) + yyi.shape) nb = 10 xxbi, yybi = meshbounds(xxi, yyi) # Output grid grido = rotate_grid((N.linspace(0, 6, 50) - 1, N.linspace(0, 4, 35) + 1.), -20) xxo = grido.getLongitude()[:].filled() yyo = grido.getLatitude()[:].filled() xxbo, yybo = meshbounds(xxo, yyo) # Nearest varo = nearest2d(vari, xxi, yyi, xxo, yyo, nb) # Plot vmin = varo.min() vmax = varo.max() P.figure(figsize=(8, 4)) P.subplot(121, aspect=1) P.pcolor(xxbi, yybi, vari[0], vmin=vmin, vmax=vmax) add_grid(grido) P.title('original') P.subplot(122, aspect=1) P.pcolor(xxbo, yybo, varo[0], vmin=vmin, vmax=vmax)
yi[:] *= 3 xi.designateLongitude() yi.designateLatitude() xi.setBounds(bounds1d(xi)) yi.setBounds(bounds1d(yi)) vari[1:2, 2:4] = MV2.masked gridi = vari.getGrid() # Output grido = create_grid(xi[:]+2*2.5, yi[:]+3*1.5) xo = grido.getLongitude() yo = grido.getLatitude() xo.setBounds(bounds1d(xo)) yo.setBounds(bounds1d(yo)) xxob, yyob = meshbounds(xo, yo) # Regridding varo, wo = vari.regrid(grido, tool='regrid2', returnTuple=1) # Plot kw = dict(fill='pcolor', contour=False, xhide=True, yhide=True, xticks=[], yticks=[], cmap='jet', colorbar=False, show=False) P.figure(figsize=(6, 3)) p = plot2d(vari, subplot=131, title='Original', **kw) add_grid(gridi) add_grid(grido) P.axis('image') p = plot2d(varo, subplot=132, title='Regridded', **kw) add_grid(gridi)
# Input grid x0, y0 = 0., 2. nxi = 3 nyi = 3 dxi = (2., 2.) dyi = (-2., 2.) xxi = N.zeros((nyi, nxi)) xxi[0] = x0 + N.arange(nxi) * dxi[0] for j in range(1, nyi): xxi[j] = xxi[j-1] + dyi[0] yyi = N.zeros((nyi, nxi)) yyi[:, 0] = y0 + N.arange(nyi) * dyi[1] for j in range(1, nyi): yyi[:, j] = yyi[:, j-1] + dxi[1] xxbi, yybi = meshbounds(xxi, yyi) relpos2index = lambda fi, fj, nyi: fj * nyi + fi ii, jj = N.meshgrid(N.arange(nxi)+.5, N.arange(nyi)+.5) iib, jjb = meshbounds(ii, jj) zzi = relpos2index(ii, jj, nyi) zzbi = relpos2index(iib, jjb, nyi) # Input random points N.random.seed(0) np = 100 xxo = N.random.random(np)*(xxbi.max()-xxbi.min()) + xxbi.min() yyo = N.random.random(np)*(yybi.max()-yybi.min()) + yybi.min() xxo = N.concatenate((xxo, xxi.ravel())) yyo = N.concatenate((yyo, yyi.ravel())) np = xxo.size
# Input grid x0, y0 = 0., 2. nxi = 3 nyi = 3 dxi = (2., 2.) dyi = (-2., 2.) xxi = N.zeros((nyi, nxi)) xxi[0] = x0 + N.arange(nxi) * dxi[0] for j in range(1, nyi): xxi[j] = xxi[j - 1] + dyi[0] yyi = N.zeros((nyi, nxi)) yyi[:, 0] = y0 + N.arange(nyi) * dyi[1] for j in range(1, nyi): yyi[:, j] = yyi[:, j - 1] + dxi[1] xxbi, yybi = meshbounds(xxi, yyi) relpos2index = lambda fi, fj: fj * nyi + fi ii, jj = N.meshgrid(N.arange(nxi) + .5, N.arange(nyi) + .5) iib, jjb = meshbounds(ii, jj) zzi = jj * nyi + ii #relpos2index(ii, jj) zzbi = jjb * nyi + iib # ny+1? relpos2index(iib, jjb) # Input random points N.random.seed(0) np = 100 xxo = N.random.random(np) * (xxbi.max() - xxbi.min()) + xxbi.min() yyo = N.random.random(np) * (yybi.max() - yybi.min()) + yybi.min() xxo = N.concatenate((xxo, xxi.ravel())) yyo = N.concatenate((yyo, yyi.ravel())) np = xxo.size
"""Test the fortran function :f:func:`nearest2d`""" from vcmq import N, P, code_file_name, P, os, rotate_grid, add_grid, meshbounds from vacumm.misc.grid._interp_ import nearest2d # Input grid gridi = rotate_grid((N.arange(5), N.arange(4)), 30) xxi = gridi.getLongitude()[:].filled() yyi = gridi.getLatitude()[:].filled() vari = N.resize(yyi, (20, )+ yyi.shape) nb = 10 xxbi, yybi = meshbounds(xxi, yyi) # Output grid grido = rotate_grid((N.linspace(0, 6, 50)-1, N.linspace(0, 4, 35)+1.), -20) xxo = grido.getLongitude()[:].filled() yyo = grido.getLatitude()[:].filled() xxbo, yybo = meshbounds(xxo, yyo) # Nearest varo = nearest2d(vari, xxi, yyi, xxo, yyo, nb) # Plot vmin = varo.min() vmax = varo.max() P.figure(figsize=(8, 4)) P.subplot(121, aspect=1) P.pcolor(xxbi, yybi, vari[0], vmin=vmin, vmax=vmax) add_grid(grido) P.title('original') P.subplot(122, aspect=1)
"""Test CDAT conservative regridding""" from vcmq import N, meshbounds, bounds1d, cdms2, MV2, rc, P, add_grid, rcdefaults, \ create_lon, create_lat, savefigs, code_file_name # Input grid x0, y0, nx, ny, dx, dy = 0., 0., 20, 15, 5., 5. x = x0+N.arange(0, nx*dx, dx) y = y0+N.arange(0, ny*dy, dy) xxbi, yybi = meshbounds(x, y) xb = bounds1d(x) yb = bounds1d(y) lon = create_lon(x) lat = create_lat(y) lon.setBounds(xb) lat.setBounds(yb) gridi = cdms2.createRectGrid(lat, lon) # Input data vari = MV2.ones(gridi.shape)*50 vari[5:10, 7:13] = -10 #vari[:, -1] = MV2.masked # <<< THIS MAKES IT WORK! vari.setAxisList([gridi.getLatitude(), gridi.getLongitude()]) vari.setGrid(gridi) # Output grid grido, xxbo, yybo = gridi, xxbi, yybi # Regrid diag = {'dstAreaFractions':None} varo = vari.regrid(grido, tool='esmf', method='conservative',
'patch', 'conservative', ] ) # Input curved grid nxi = 5 nyi = 4 xxi, yyi = N.meshgrid(N.arange(nxi)+.25, N.arange(nyi)-.25) for j in xrange(nyi): xxi[j,:] -= j*0.5 #yyi[j,:] += j for i in xrange(nxi): yyi[:,i] += i*0.5 gridi = create_grid2d(xxi,yyi) # input cdms grid xxib,yyib = meshbounds(xxi,yyi) # coordinates of cell corners # Output curved grid nxo = 7 nyo = 7 xxo, yyo = N.meshgrid(N.arange(nxo)+.5, N.arange(nyo)-.5) grido = create_grid2d(xxo, yyo) # output cdms grid xxob,yyob = meshbounds(xxo,yyo) # coordinates of cell corners # Input field vari = MV2.array(N.arange(nyi*nxi).reshape(nyi,nxi))+10. vari[1,1:3] = 100 vari[:2,1:3] = MV2.masked set_grid(vari, gridi) # set grid and axes #gridi.setMask(vari.mask)
yi = vari.getAxis(-2) yi[:] *= 3 xi.designateLongitude() yi.designateLatitude() xi.setBounds(bounds1d(xi)) yi.setBounds(bounds1d(yi)) vari[1:2, 2:4] = MV2.masked gridi = vari.getGrid() # Output grido = create_grid(xi[:] + 2 * 2.5, yi[:] + 3 * 1.5) xo = grido.getLongitude() yo = grido.getLatitude() xo.setBounds(bounds1d(xo)) yo.setBounds(bounds1d(yo)) xxob, yyob = meshbounds(xo, yo) # Regridding varo, wo = vari.regrid(grido, tool='regrid2', returnTuple=1) # Plot kw = dict(fill='pcolor', contour=False, xhide=True, yhide=True, xticks=[], yticks=[], cmap='jet', colorbar=False, show=False) P.figure(figsize=(6, 3))