Esempio n. 1
0
File: flood.py Progetto: ESMG/pyroms
def flood(varz, Cgrd, Cpos='t', irange=None, jrange=None, \
          spval=-9.99e+33, dmax=0, cdepth=0, kk=0):
    """
    var = flood(var, Cgrd)

    optional switch:
      - Cpos='t', 'u', 'v'           specify the grid position where
                                     the variable resides
      - irange                       specify grid sub-sample for i direction
      - jrange                       specify grid sub-sample for j direction
      - spval=1e35                   define spval value
      - dmax=0                       if dmax>0, maximum horizontal 
                                     flooding distance
      - cdepth=0                     critical depth for flooding
                                     if depth<cdepth => no flooding
      - kk

    Flood varz on Cgrd
    """

    varz = varz.copy()
    varz = np.array(varz)

    assert len(varz.shape) == 3, 'var must be 3D'

    # replace spval by nan
    idx = np.where(abs((varz-spval)/spval)<=1e-5)
    varz[idx] = np.nan

    x = Cgrd.lon_t
    y = Cgrd.lat_t
    h = Cgrd.h
    if Cpos is 't':
        mask = Cgrd.mask_t[0,:,:]
    elif Cpos is 'u':
        mask = Cgrd.mask_u[0,:,:]
    elif Cpos is 'v':
        mask = Cgrd.mask_v[0,:,:]

    nlev, Mm, Lm = varz.shape

    if irange is None:
        irange = (0,Lm)
    else:
        assert varz.shape[2] == irange[1]-irange[0], \
               'var shape and irange must agreed'

    if jrange is None:
        jrange = (0,Mm)
    else:
        assert varz.shape[1] == jrange[1]-jrange[0], \
               'var shape and jrange must agreed'

    x = x[jrange[0]:jrange[1], irange[0]:irange[1]]
    y = y[jrange[0]:jrange[1], irange[0]:irange[1]]
    h = h[jrange[0]:jrange[1], irange[0]:irange[1]]
    mask = mask[jrange[0]:jrange[1], irange[0]:irange[1]]

    # Finding nearest values in horizontal
    # critical deph => no change if depth is less than specified value
    cdepth = abs(cdepth)
    if cdepth != 0:
        idx = np.where(h >= cdepth)
        msk = np.zeros(mask.shape)
        msk[idx] = 1
    else:
        msk = mask.copy()
    for k in range(nlev-1,0,-1):
        c1 = np.array(msk, dtype=bool)
        c2 = np.isnan(varz[k,:,:]) == 1
        if kk == 0:
            c3 = np.ones(mask.shape).astype(bool)
        else:
            c3 = np.isnan(varz[min(k-kk,0),:,:]) == 0
        c = c1 & c2 & c3
        idxnan = np.where(c == True)
        idx = np.where(c2 == False)
        if list(idx[0]):
            wet = np.zeros((len(idx[0]),2))
            dry = np.zeros((len(idxnan[0]),2))
            wet[:,0] = idx[0]+1
            wet[:,1] = idx[1]+1
            dry[:,0] = idxnan[0]+1
            dry[:,1] = idxnan[1]+1

            varz[k,:] = _remapping.flood(varz[k,:], wet, dry, x, y, dmax)

    # drop the deepest values down
    idx = np.where(np.isnan(varz) == 1)
    varz[idx] = spval
    bottom = pyroms.utility.get_bottom(varz[::-1,:,:], mask, spval=spval)
    bottom = (nlev-1) - bottom
    for i in range(Lm):
        for j in range(Mm):
            if mask[j,i] == 1:
                varz[bottom[j,i]:,j,i] = varz[bottom[j,i],j,i]

    return varz
Esempio n. 2
0
def flood(varz, Bgrd, Bpos='t', irange=None, jrange=None, \
          spval=-9.99e+33, dmax=0, cdepth=0, kk=0):
    """
    var = flood(var, Bgrd)

    optional switch:
      - Bpos='t', 'uv'               specify the grid position where
                                     the variable rely 
      - irange                       specify grid sub-sample for i direction
      - jrange                       specify grid sub-sample for j direction
      - spval=1e35                   define spval value
      - dmax=0                       if dmax>0, maximum horizontal 
                                     flooding distance
      - cdepth=0                     critical depth for flooding
                                     if depth<cdepth => no flooding
      - kk

    Flood varz on Bgrd
    """

    varz = varz.copy()
    varz = np.array(varz)

    assert len(varz.shape) == 3, 'var must be 3D'

    # replace spval by nan
    idx = np.where(abs((varz - spval) / spval) <= 1e-5)
    varz[idx] = np.nan

    x = Bgrd.lon_t
    y = Bgrd.lat_t
    h = Bgrd.h
    if Bpos is 't':
        mask = Bgrd.mask_t[0, :, :]
    elif Bpos is 'uv':
        mask = Bgrd.mask_uv[0, :, :]

    nlev, Mm, Lm = varz.shape

    if irange is None:
        irange = (0, Lm)
    else:
        assert varz.shape[2] == irange[1]-irange[0], \
               'var shape and irange must agreed'

    if jrange is None:
        jrange = (0, Mm)
    else:
        assert varz.shape[1] == jrange[1]-jrange[0], \
               'var shape and jrange must agreed'

    x = x[jrange[0]:jrange[1], irange[0]:irange[1]]
    y = y[jrange[0]:jrange[1], irange[0]:irange[1]]
    h = h[jrange[0]:jrange[1], irange[0]:irange[1]]
    mask = mask[jrange[0]:jrange[1], irange[0]:irange[1]]

    # Finding nearest values in horizontal
    # critical deph => no change if depth is less than specified value
    cdepth = abs(cdepth)
    if cdepth != 0:
        idx = np.where(h >= cdepth)
        msk = np.zeros(mask.shape)
        msk[idx] = 1
    else:
        msk = mask.copy()
    for k in range(nlev - 1, 0, -1):
        c1 = np.array(msk, dtype=bool)
        c2 = np.isnan(varz[k, :, :]) == 1
        if kk == 0:
            c3 = np.ones(mask.shape).astype(bool)
        else:
            c3 = np.isnan(varz[min(k - kk, 0), :, :]) == 0
        c = c1 & c2 & c3
        idxnan = np.where(c == True)
        idx = np.where(c2 == False)
        if list(idx[0]):
            wet = np.zeros((len(idx[0]), 2))
            dry = np.zeros((len(idxnan[0]), 2))
            wet[:, 0] = idx[0] + 1
            wet[:, 1] = idx[1] + 1
            dry[:, 0] = idxnan[0] + 1
            dry[:, 1] = idxnan[1] + 1

            varz[k, :] = _remapping.flood(varz[k, :], wet, dry, x, y, dmax)

    # drop the deepest values down
    idx = np.where(np.isnan(varz) == 1)
    varz[idx] = spval
    bottom = pyroms.utility.get_bottom(varz[::-1, :, :], mask, spval=spval)
    bottom = (nlev - 1) - bottom
    for i in range(Lm):
        for j in range(Mm):
            if mask[j, i] == 1:
                varz[bottom[j, i]:, j, i] = varz[bottom[j, i], j, i]

    return varz
Esempio n. 3
0
def flood(varz, grdz, Cpos='rho', irange=None, jrange=None, \
          spval=1e37, dmax=0, cdepth=0, kk=0):
    """
    var = flood(var, grdz)

    optional switch:
      - Cpos='rho', 'u' or 'v'	     specify the C-grid position where 
				     the variable rely
      - irange                       specify grid sub-sample for i direction
      - jrange                       specify grid sub-sample for j direction
      - spval=1e37                   define spval value
      - dmax=0                       if dmax>0, maximum horizontal 
                                     flooding distance
      - cdepth=0                     critical depth for flooding
                                     if depth<cdepth => no flooding
      - kk

    Flood varz on gridz
    """

    varz = varz.copy()
    varz = np.array(varz)

    assert len(varz.shape) == 3, 'var must be 3D'

    # replace spval by nan
    idx = np.where(abs((varz-spval)/spval)<=1e-5)
    varz[idx] = np.nan

    if Cpos is 'rho':
        x = grdz.hgrid.lon_rho
        y = grdz.hgrid.lat_rho
        z = grdz.vgrid.z[:]
        h = grdz.vgrid.h
        mask = grdz.hgrid.mask_rho
    elif Cpos is 'u':
        x = grdz.hgrid.lon_u
        y = grdz.hgrid.lat_u
        z = 0.5 * (grdz.vgrid.z[:,:,:-1] + grdz.vgrid.z[:,:,1:])
        h = 0.5 * (grdz.vgrid.h[:,:-1] + grdz.vgrid.h[:,1:])
        mask = grdz.hgrid.mask_u
    elif Cpos is 'v':
        x = grdz.hgrid.lon_v
        y = grdz.hgrid.lat_v
        z = 0.5 * (grdz.vgrid.z[:,:-1,:] + grdz.vgrid.z[:,1:,:])
        h = 0.5 * (grdz.vgrid.h[:-1,:] + grdz.vgrid.h[1:,:])
        mask = grdz.hgrid.mask_v
    elif Cpos is 'w':
        x = grdz.hgrid.lon_rho
        y = grdz.hgrid.lat_rho
        z = grdz.vgrid.z[:]
        h = grdz.vgrid.h
        mask = grdz.hgrid.mask_rho
    else:
        raise Warning, '%s bad position. Use depth at Arakawa-C rho points instead.' % Cpos

    nlev, Mm, Lm = varz.shape

    if irange is None:
        irange = (0,Lm)
    else:
        assert varz.shape[2] == irange[1]-irange[0], \
               'var shape and irange must agree'

    if jrange is None:
        jrange = (0,Mm)
    else:
        assert varz.shape[1] == jrange[1]-jrange[0], \
               'var shape and jrange must agree'

    x = x[jrange[0]:jrange[1], irange[0]:irange[1]]
    y = y[jrange[0]:jrange[1], irange[0]:irange[1]]
    z = z[:,jrange[0]:jrange[1], irange[0]:irange[1]]
    h = h[jrange[0]:jrange[1], irange[0]:irange[1]]
    mask = mask[jrange[0]:jrange[1], irange[0]:irange[1]]

    # Finding nearest values in horizontal
    # critical deph => no change if depth is less than specified value
    cdepth = abs(cdepth)
    if cdepth != 0:
        idx = np.where(h >= cdepth)
        msk = np.zeros(mask.shape)
        msk[idx] = 1
    else:
        msk = mask.copy()
    for k in range(nlev-1):
        c1 = np.array(msk, dtype=bool)
        c2 = np.isnan(varz[k,:,:]) == 1
        if kk == 0:
            c3 = np.ones(mask.shape).astype(bool)
        else:
            c3 = np.isnan(varz[min(k+kk,nlev-1),:,:]) == 0
        c = c1 & c2 & c3
        idxnan = np.where(c == True)
        idx = np.where(c2 == False)
        if list(idx[0]):
            wet = np.zeros((len(idx[0]),2))
            dry = np.zeros((len(idxnan[0]),2))
            wet[:,0] = idx[0]+1
            wet[:,1] = idx[1]+1
            dry[:,0] = idxnan[0]+1
            dry[:,1] = idxnan[1]+1

            varz[k,:] = _remapping.flood(varz[k,:], wet, dry, x, y, dmax)

    # drop the deepest values down
    idx = np.where(np.isnan(varz) == 1)
    varz[idx] = spval
    bottom = pyroms.utility.get_bottom(varz, mask, spval=spval)
    surface = pyroms.utility.get_surface(varz, mask, spval=spval)
    for i in range(Lm):
        for j in range(Mm):
            if mask[j,i] == 1:
                varz[:bottom[j,i],j,i] = varz[bottom[j,i],j,i]
                varz[surface[j,i]:,j,i] = varz[surface[j,i],j,i]

    return varz
Esempio n. 4
0
def flood2d(varz, grdz, Cpos='rho', irange=None, jrange=None, \
          spval=1e37, dmax=0, cdepth=0, kk=0):
    """
    var = flood(var, grdz)

    optional switch:
      - Cpos='rho', 'u' or 'v'	     specify the C-grid position where 
				     the variable rely
      - irange                       specify grid sub-sample for i direction
      - jrange                       specify grid sub-sample for j direction
      - spval=1e37                   define spval value
      - dmax=0                       if dmax>0, maximum horizontal 
                                     flooding distance
    Flood varz on gridz
    """

    varz = varz.copy()
    varz = np.array(varz)

    assert len(varz.shape) == 2, 'var must be 2D'

    # replace spval by nan
    idx = np.where(abs((varz - spval) / spval) <= 1e-5)
    varz[idx] = np.nan

    if Cpos is 'rho':
        x = grdz.hgrid.lon_rho
        y = grdz.hgrid.lat_rho
        z = grdz.vgrid.z[:]
        mask = grdz.hgrid.mask_rho
    elif Cpos is 'u':
        x = grdz.hgrid.lon_u
        y = grdz.hgrid.lat_u
        z = 0.5 * (grdz.vgrid.z[:, :, :-1] + grdz.vgrid.z[:, :, 1:])
        mask = grdz.hgrid.mask_u
    elif Cpos is 'v':
        x = grdz.hgrid.lon_v
        y = grdz.hgrid.lat_v
        z = 0.5 * (grdz.vgrid.z[:, :-1, :] + grdz.vgrid.z[:, 1:, :])
        mask = grdz.hgrid.mask_v
    elif Cpos is 'w':
        x = grdz.hgrid.lon_rho
        y = grdz.hgrid.lat_rho
        z = grdz.vgrid.z[:]
        mask = grdz.hgrid.mask_rho
    else:
        raise Warning, '%s bad position. Use depth at Arakawa-C rho points instead.' % Cpos

    Mm, Lm = varz.shape

    if irange is None:
        irange = (0, Lm)
    else:
        assert varz.shape[1] == irange[1]-irange[0], \
               'var shape and irange must agree'

    if jrange is None:
        jrange = (0, Mm)
    else:
        assert varz.shape[0] == jrange[1]-jrange[0], \
               'var shape and jrange must agree'

    x = x[jrange[0]:jrange[1], irange[0]:irange[1]]
    y = y[jrange[0]:jrange[1], irange[0]:irange[1]]
    z = z[:, jrange[0]:jrange[1], irange[0]:irange[1]]
    mask = mask[jrange[0]:jrange[1], irange[0]:irange[1]]

    # Finding nearest values in horizontal
    # critical deph => no change if depth is less than specified value
    msk = mask.copy()
    #    c1 = np.array(msk, dtype=bool)
    c2 = np.isnan(varz[:, :]) == 1
    #    c = c1 & c2
    #    idxnan = np.where(c == True)
    idxnan = np.where(c2 == True)
    idx = np.where(c2 == False)
    if list(idx[0]):
        #	print "inside test", len(idx[0]), len(idxnan[0])
        wet = np.zeros((len(idx[0]), 2))
        dry = np.zeros((len(idxnan[0]), 2))
        wet[:, 0] = idx[0] + 1
        wet[:, 1] = idx[1] + 1
        dry[:, 0] = idxnan[0] + 1
        dry[:, 1] = idxnan[1] + 1

        varz = _remapping.flood(varz, wet, dry, x, y, dmax)

    return varz
Esempio n. 5
0
def flood(varz, grdz, Cpos='rho', irange=None, jrange=None, \
          spval=1e37, dmax=0, cdepth=0, kk=0):
    """
    var = flood(var, grdz)

    optional switch:
      - Cpos='rho', 'u' or 'v'       specify the C-grid position where 
                                     the variable rely
      - irange                       specify grid sub-sample for i direction
      - jrange                       specify grid sub-sample for j direction
      - spval=1e37                   define spval value
      - dmax=0                       if dmax>0, maximum horizontal 
                                     flooding distance
      - cdepth=0                     critical depth for flooding
                                     if depth<cdepth => no flooding
      - kk

    Flood varz on gridz
    """

    varz = varz.copy()
    varz = np.array(varz)

    assert len(varz.shape) == 3, 'var must be 3D'

    # replace spval by nan
    idx = np.where(abs((varz-spval)/spval)<=1e-5)
    varz[idx] = np.nan

    if Cpos is 'rho':
        x = grdz.hgrid.lon_rho
        y = grdz.hgrid.lat_rho
        z = grdz.vgrid.z[:]
        h = grdz.vgrid.h
        mask = grdz.hgrid.mask_rho
    elif Cpos is 'u':
        x = grdz.hgrid.lon_u
        y = grdz.hgrid.lat_u
        z = 0.5 * (grdz.vgrid.z[:,:,:-1] + grdz.vgrid.z[:,:,1:])
        h = 0.5 * (grdz.vgrid.h[:,:-1] + grdz.vgrid.h[:,1:])
        mask = grdz.hgrid.mask_u
    elif Cpos is 'v':
        x = grdz.hgrid.lon_v
        y = grdz.hgrid.lat_v
        z = 0.5 * (grdz.vgrid.z[:,:-1,:] + grdz.vgrid.z[:,1:,:])
        h = 0.5 * (grdz.vgrid.h[:-1,:] + grdz.vgrid.h[1:,:])
        mask = grdz.hgrid.mask_v
    elif Cpos is 'w':
        x = grdz.hgrid.lon_rho
        y = grdz.hgrid.lat_rho
        z = grdz.vgrid.z[:]
        h = grdz.vgrid.h
        mask = grdz.hgrid.mask_rho
    else:
        raise Warning('%s bad position. Use depth at Arakawa-C rho points instead.' % Cpos)

    nlev, Mm, Lm = varz.shape

    if irange is None:
        irange = (0,Lm)
    else:
        assert varz.shape[2] == irange[1]-irange[0], \
               'var shape and irange must agree'

    if jrange is None:
        jrange = (0,Mm)
    else:
        assert varz.shape[1] == jrange[1]-jrange[0], \
               'var shape and jrange must agree'

    x = x[jrange[0]:jrange[1], irange[0]:irange[1]]
    y = y[jrange[0]:jrange[1], irange[0]:irange[1]]
    z = z[:,jrange[0]:jrange[1], irange[0]:irange[1]]
    h = h[jrange[0]:jrange[1], irange[0]:irange[1]]
    mask = mask[jrange[0]:jrange[1], irange[0]:irange[1]]

    # Finding nearest values in horizontal
    # critical depth => no change if depth is less than specified value
    cdepth = abs(cdepth)
    if cdepth != 0:
        idx = np.where(h >= cdepth)
        msk = np.zeros(mask.shape)
        msk[idx] = 1
    else:
        msk = mask.copy()
    for k in range(nlev-1):
        c1 = np.array(msk, dtype=bool)
        c2 = np.isnan(varz[k,:,:]) == 1
        if kk == 0:
            c3 = np.ones(mask.shape).astype(bool)
        else:
            c3 = np.isnan(varz[min(k+kk,nlev-1),:,:]) == 0
        c = c1 & c2 & c3
        idxnan = np.where(c == True)
        idx = np.where(c2 == False)
        if list(idx[0]):
            wet = np.zeros((len(idx[0]),2))
            dry = np.zeros((len(idxnan[0]),2))
            wet[:,0] = idx[0]+1
            wet[:,1] = idx[1]+1
            dry[:,0] = idxnan[0]+1
            dry[:,1] = idxnan[1]+1

            varz[k,:] = _remapping.flood(varz[k,:], wet, dry, x, y, dmax)

    # drop the deepest values down
    idx = np.where(np.isnan(varz) == 1)
    varz[idx] = spval
    bottom = pycnal.utility.get_bottom(varz, mask, spval=spval)
    surface = pycnal.utility.get_surface(varz, mask, spval=spval)
    for i in range(Lm):
        for j in range(Mm):
            if mask[j,i] == 1:
                varz[:bottom[j,i],j,i] = varz[bottom[j,i],j,i]
                varz[surface[j,i]:,j,i] = varz[surface[j,i],j,i]

    return varz
Esempio n. 6
0
def flood(varz, Bgrd, Bpos='t', irange=None, jrange=None, spval=-32767, dmax=0, cdepth=0, kk=0):
    #print varz
    #print type(varz)
    varz = varz.copy()
    #print type(varz)
    assert len(varz.shape) == 3, 'var must be 3D'

    # replace spval by nan
    idx = np.where(varz.mask==True)
    #print np.where(varz==-32767)
    varz[idx] = np.nan
    #print varz

    x = Bgrd.lon_t
    y = Bgrd.lat_t
    h = Bgrd.h
    if Bpos is 't':
        mask = Bgrd.mask_t[0,:,:]
    elif Bpos is 'uv':
        mask = Bgrd.mask_uv[0,:,:]

    nlev, Mm, Lm = varz.shape
    #print varz.shape

    if irange is None:
        irange = (0,Lm)
    else:
        assert varz.shape[2] == irange[1]-irange[0], \
               'var shape and irange must agreed'

    if jrange is None:
        jrange = (0,Mm)
    else:
        assert varz.shape[1] == jrange[1]-jrange[0], \
               'var shape and jrange must agreed'

    x = x[jrange[0]:jrange[1], irange[0]:irange[1]]
    y = y[jrange[0]:jrange[1], irange[0]:irange[1]]
    h = h[jrange[0]:jrange[1], irange[0]:irange[1]]
    mask = mask[jrange[0]:jrange[1], irange[0]:irange[1]]
    #print np.shape(x), np.shape(y), np.shape(h), np.shape(mask)

    # Finding nearest values in horizontal
    # critical deph => no change if depth is less than specified value
    cdepth = abs(cdepth)
    if cdepth != 0:
        idx = np.where(h >= cdepth)
        msk = np.zeros(mask.shape)
        msk[idx] = 1
    else:
        msk = mask.copy()
    for k in range(nlev-1,0,-1):
        c1 = np.array(msk, dtype=bool)
	#print 	c1
        c2 = np.isnan(varz[k,:,:]) == 1
	#print c2
        if kk == 0:
            c3 = np.ones(mask.shape).astype(bool)
        else:
            c3 = np.isnan(varz[min(k-kk,0),:,:]) == 0
	#print np.shape(c1)
	#print np.shape(c2)
	#print np.shape(c3)
        c = c1 & c2 & c3
        idxnan = np.where(c == True)
        idx = np.where(c2 == False)
        if list(idx[0]):
            wet = np.zeros((len(idx[0]),2))
            dry = np.zeros((len(idxnan[0]),2))
            wet[:,0] = idx[0]+1
            wet[:,1] = idx[1]+1
            dry[:,0] = idxnan[0]+1
            dry[:,1] = idxnan[1]+1
	    #print np.round(varz[:,30,30],2)
            varz[k,:] = _remapping.flood(varz[k,:], wet, dry, x, y, dmax)

    # drop the deepest values down
    idx = np.where(np.isnan(varz) == 1)
    varz[idx] = spval
    bottom = pyroms.utility.get_bottom(varz[::-1,:,:], mask, spval=spval)
    bottom = (nlev-1) - bottom
    #print bottom
    for i in range(Lm):
        for j in range(Mm):
            if mask[j,i] == 1:
                varz[bottom[j,i]:,j,i] = varz[bottom[j,i],j,i]
    return varz
Esempio n. 7
0
def flood2d(varz, grdz, Cpos='rho', irange=None, jrange=None, \
          spval=1e37, dmax=0, cdepth=0, kk=0):
    """
    var = flood(var, grdz)

    optional switch:
      - Cpos='rho', 'u' or 'v'	     specify the C-grid position where 
				     the variable rely
      - irange                       specify grid sub-sample for i direction
      - jrange                       specify grid sub-sample for j direction
      - spval=1e37                   define spval value
      - dmax=0                       if dmax>0, maximum horizontal 
                                     flooding distance
    Flood varz on gridz
    """

    varz = varz.copy()
    varz = np.array(varz)

    assert len(varz.shape) == 2, 'var must be 2D'

    # replace spval by nan
    idx = np.where(abs((varz-spval)/spval)<=1e-5)
    varz[idx] = np.nan

    if Cpos is 'rho':
        x = grdz.hgrid.lon_rho
        y = grdz.hgrid.lat_rho
        z = grdz.vgrid.z[:]
        mask = grdz.hgrid.mask_rho
    elif Cpos is 'u':
        x = grdz.hgrid.lon_u
        y = grdz.hgrid.lat_u
        z = 0.5 * (grdz.vgrid.z[:,:,:-1] + grdz.vgrid.z[:,:,1:])
        mask = grdz.hgrid.mask_u
    elif Cpos is 'v':
        x = grdz.hgrid.lon_v
        y = grdz.hgrid.lat_v
        z = 0.5 * (grdz.vgrid.z[:,:-1,:] + grdz.vgrid.z[:,1:,:])
        mask = grdz.hgrid.mask_v
    elif Cpos is 'w':
        x = grdz.hgrid.lon_rho
        y = grdz.hgrid.lat_rho
        z = grdz.vgrid.z[:]
        mask = grdz.hgrid.mask_rho
    else:
        raise Warning, '%s bad position. Use depth at Arakawa-C rho points instead.' % Cpos

    Mm, Lm = varz.shape

    if irange is None:
        irange = (0,Lm)
    else:
        assert varz.shape[1] == irange[1]-irange[0], \
               'var shape and irange must agree'

    if jrange is None:
        jrange = (0,Mm)
    else:
        assert varz.shape[0] == jrange[1]-jrange[0], \
               'var shape and jrange must agree'

    x = x[jrange[0]:jrange[1], irange[0]:irange[1]]
    y = y[jrange[0]:jrange[1], irange[0]:irange[1]]
    z = z[:,jrange[0]:jrange[1], irange[0]:irange[1]]
    mask = mask[jrange[0]:jrange[1], irange[0]:irange[1]]

    # Finding nearest values in horizontal
    # critical deph => no change if depth is less than specified value
    msk = mask.copy()
#    c1 = np.array(msk, dtype=bool)
    c2 = np.isnan(varz[:,:]) == 1
#    c = c1 & c2
#    idxnan = np.where(c == True)
    idxnan = np.where(c2 == True)
    idx = np.where(c2 == False)
    if list(idx[0]):
#	print "inside test", len(idx[0]), len(idxnan[0])
        wet = np.zeros((len(idx[0]),2))
        dry = np.zeros((len(idxnan[0]),2))
        wet[:,0] = idx[0]+1
        wet[:,1] = idx[1]+1
        dry[:,0] = idxnan[0]+1
        dry[:,1] = idxnan[1]+1

        varz = _remapping.flood(varz, wet, dry, x, y, dmax)

    return varz