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()
Exemple #2
0
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())
Exemple #4
0
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', 
Exemple #12
0
        '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)
Exemple #13
0
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))