Example #1
0
def interp(startgrid):
    num_depths = 30  # to avoid problems with seafloor depth
    z_step = 10
    depth_list = [10, 20, 30, 50, 75, 100, 125, 150, 200, 250, 300, 400]

    new_depth = np.arange(z_step, (num_depths + 1) * z_step, z_step)
    new_depth_index = []
    left = 0
    right = 1
    for i in range(0, len(new_depth)):
        target_value = new_depth[i]
        if target_value > depth_list[right]:
            right += 1
            left += 1
        left_value = depth_list[left]
        right_value = depth_list[right]
        a = target_value - left_value
        b = right_value - left_value
        new_index = a / b + left
        new_depth_index.append(new_index)
        #start grid is shape lat,lon,depth
        lat = startgrid.shape[1]
        lon = startgrid.shape[2]
        depth = startgrid.shape[0]

    interp_grid = np.zeros((len(new_depth_index), lat, lon))
    ip = tricubic.tricubic(list(startgrid), [depth, lat, lon])

    for i in range(0, lat):
        for j in range(0, lon):
            for k in range(0, len(new_depth_index)):
                res = ip.ip([new_depth_index[k], i, j])
                interp_grid[k, i, j] = res

    return interp_grid
def interpolateOnArbitraryGrid(input_vector, N=3, gridOrder=1):
    """
    On a NxNxN grid where each 'point' is indexed by 3 integers (i,j,k), the measurement values
    (which are 3 dimensional w/ components (f1,f2,f3)) are each associated with one grid point. Between any two grid points,
    tricubic interpolation determines the behaviour of the function.

    Args:
        input_vector (ndarray): a vector containing any number of scalar measurements.
        N (int, optional): Size of grid. Defaults to 3.
        gridOrder (int, optional): Order in which the grid is set up. default means we start at the bottom left
                                   corner and increase the third component(vertical), then the second and finally
                                   the first.
        
    Returns:
        3 Interpolator objects: ip_1, ip_2, ip_3
        and 3 ndarrays f1, f2, f3
    """

    f1 = np.zeros((N, N, N), dtype='float')
    f2 = np.zeros((N, N, N), dtype='float')
    f3 = np.zeros((N, N, N), dtype='float')

    gridSize = N**3 - 1
    m = 0
    for i in range(N):
        for j in range(N):
            for k in range(N):
                # some function f(x,y,z) is given on a cubic grid indexed by i,j,k
                if gridOrder == -1:
                    f1[i][j][k] = input_vector[gridSize - m, 0]
                    f2[i][j][k] = input_vector[gridSize - m, 1]
                    f3[i][j][k] = input_vector[gridSize - m, 2]
                elif gridOrder == 1:
                    f1[i][j][k] = input_vector[m, 0]
                    f2[i][j][k] = input_vector[m, 1]
                    f3[i][j][k] = input_vector[m, 2]
                m = m + 1

    # initialize interpolator with input data on cubic grid
    ip_1 = tricubic.tricubic(list(f1), [N, N, N])
    ip_2 = tricubic.tricubic(list(f2), [N, N, N])
    ip_3 = tricubic.tricubic(list(f3), [N, N, N])

    return ip_1, ip_2, ip_3, f1, f2, f3
Example #3
0
 def test_constant(self):
     n = 4
     c = 1
     a = [[[c for k in range(n)] for j in range(n)] for i in range(n)]
     ip = tricubic(a, [n, n, n])
     for i in range(2 * n):
         for j in range(2 * n):
             for k in range(2 * n):
                 v = ip.ip([0.5 * i, 0.5 * j, 0.5 * k])
                 self.assertEqual(v, c)
Example #4
0
 def test_linear(self):
     f = lambda x, y, z: (x + 1.2) + (0.2 * y - 0.1) + z * 4
     n = 5
     a = [[[f(i, j, k) for k in range(n)] for j in range(n)]
          for i in range(n)]
     ip = tricubic(a, [n, n, n])
     x = 1.6
     y = 2.3
     z = 3.7
     v = ip.ip([x, y, z])
     self.assertEqual(v, 19.43)
Example #5
0
 def test_linear_trivial(self):
     f = lambda x, y, z: (x + 1.2) + (0.2 * y - 0.1) + z * 4
     n = 5
     a = [[[f(i, j, k) for k in range(n)] for j in range(n)]
          for i in range(n)]
     ip = tricubic(a, [n, n, n])
     for i in range(n):
         for j in range(n):
             for k in range(n):
                 v = ip.ip([i, j, k])
                 fv = f(i, j, k)
                 self.assertEqual(v, fv)
def get_density(samplegrid, wfvalues, atompos_rel, nx, ny, nz, samplex,
                sampley, samplez):
    shift = +0.5 * np.ones(3, dtype=float)
    sampledens = np.zeros(len(samplegrid), dtype=float)
    for w, p in zip(wfvalues, atompos_rel):
        #initialize interpolator for this partial density
        ip = tricubic.tricubic(list(w), [nx, ny, nz])
        for i, vec in enumerate(samplegrid):
            transformedvec = vec + shift + p[::-1]
            transformedvec = np.remainder(
                transformedvec,
                1)  #transform coordinates and fold back to range 0 ... 1
            transformedvec = list(
                np.multiply(transformedvec,
                            np.array([nx - 1, ny - 1, nz - 1], dtype=float))
            )  #multiply by n-1, because tricubic interpolator has fixed spacing of one between data points
            sampledens[i] += (
                ip.ip(transformedvec))**2  #square to get density from WF
    return sampledens
Example #7
0
    def _interpolate_spher_mms(vdf0, speed, theta, phi, grid_s, interp_schem):
        """Interpolates particles' VDF, tailored for MMS data."""
        vdf_interp_shape = grid_s.shape[1:]
        # Preparing the interpoplation.
        phi_period = np.zeros(34)
        phi_period[1:-1] = phi
        phi_period[0] = phi[-1] - 2 * np.pi
        phi_period[-1] = phi[0] + 2 * np.pi
        theta_period = np.zeros(18)
        theta_period[1:-1] = theta
        theta_period[0] = theta[-1] - np.pi
        theta_period[-1] = theta[0] + np.pi
        vdf_period = np.zeros((32, 18, 34))
        vdf_period[:, 1:-1, 1:-1] = vdf0
        vdf_period[:, 1:-1, 0] = vdf0[:, :, -1]
        vdf_period[:, 1:-1, -1] = vdf0[:, :, 0]
        vdf_period[:, 0] = vdf_period[:, 1]
        vdf_period[:, 17] = vdf_period[:, 16]
        itkR = ~np.isnan(speed)
        if 0:  ## For "partial" moments.
            itkRtmp = speed < 4e6
            vdf_period[itkRtmp] = 0.
        # INTERPOLATION!

        if interp_schem in ['near', 'lin']:

            if interp_schem == 'near':
                interp_schem_str = 'nearest'
            elif interp_schem == 'lin':
                interp_schem_str = 'linear'

            interp_func = RegularGridInterpolator(
                (speed[itkR], theta_period, phi_period), (vdf_period[itkR]),
                bounds_error=False,
                method=interp_schem_str,
                fill_value=np.nan)
            d = interp_func(grid_s.reshape(3, -1).T)
            d = d.T.reshape(vdf_interp_shape)  # (res,res,res)

        elif interp_schem == 'cub':
            if not tricubic_imported:
                raise NotImplementedError('The tricubic module was not found. '
                                          'Try: pip install tricubic')

            d = np.zeros(vdf_interp_shape).flatten()
            ip = tricubic.tricubic(list(vdf_period), [
                vdf_period.shape[0], vdf_period.shape[1], vdf_period.shape[2]
            ])
            ds = speed[1:] - speed[:-1]
            delta_theta = theta[1] - theta[0]
            delta_phi = phi[1] - phi[0]
            vMin_theta = 0.
            vMin_phi = 0.
            #
            bi = np.digitize(grid_s[0], speed) - 1
            grid_s[0] = bi + (grid_s[0] - speed[bi]) / ds[bi]
            grid_s[1] = (grid_s[1] - vMin_theta) / delta_theta + .5
            grid_s[2] = (grid_s[2] - vMin_phi) / delta_phi + .5
            for j, node in enumerate(grid_s.reshape((3, -1)).T):
                d[j] = ip.ip(list(node))
            d = d.reshape(vdf_interp_shape)
            # "fill_value". Should also be done for values larger than,
            # and not only smaller than.
            d[grid_s[0] < 0] = np.nan
        return d
Example #8
0
def cgstki3(velp, zplan, tt, dt, nx, ny, nz, dim, domain, simtstep):
    # x = np.arange(tt)
    ttt = int(tt / dt)
    ttt = np.arange(ttt)
    # print ttt[0], ttt[-1]
    n = len(ttt)
    N = 25  # rk45 int step
    integrator = 'dopri5'  # ou dopri5 pour du dormant-prince rk45a-
    rrk45 = 2  # 0=rk45, 1=heun, 2= euler

    # small (so is your dick) vector d1(d1 0 0) d2(0 d2 0) d3(0 0 d3)
    d1 = np.float(ConfigSectionMap('cauchygreen')['dx'])
    d2 = d1
    d3 = d2

    # tranche = zplan  # index de la tranche evaluee
    integ = 'rk45'

    # if doublegyre
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # print 'WARING DOMAIN CUT FOR TEST PURPOSE'
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # velp = velp[:, :60, :, :, :]
    # ny = velp.shape[1]
    #
    # print 'velp shape'
    # print velp.shape

    # ptlist = np.indices((nx, ny, nz))
    # ptlist = ptlist.astype(float)
    domain = domain.astype(float)
    dx = abs(domain[1] - domain[0]) / nx
    dy = abs(domain[3] - domain[2]) / ny
    dz = abs(domain[5] - domain[4]) / ny
    print 'dx', dx
    print 'dy', dy
    print 'dz', dz
    rr = 1

    nnx = nx * rr
    nny = ny * rr
    nnz = nz * rr  # pas de sous divisions sur z
    ddx = dx / rr
    ddy = dy / rr
    ddz = dz / rr
    zzplan = zplan * rr
    print "domain:", domain
    print 'zplan =', zplan  # * ddz + domain[4]
    tranche = int((zplan - domain[4]) / ((domain[5] - domain[4]) / nz))

    print 'tranche evaluee %i' % tranche

    print 'dt', dt, 't physique', tt, '# time steps', ttt
    # interp spatiale sur une grille r fois plus fine

    grid = np.indices((nnx, nny, nnz))
    grid = grid.astype(float)

    grid_i = np.empty((dim, nnx, nny, nnz))
    grid_i[0, :, :] = grid[0]
    grid_i[1, :, :] = grid[1]
    grid_i[2, :, :] = grid[2]
    # print grid_i
    # grid_iini = np.zeros((dim, nnx, nny, nnz))
    grid_iini = np.empty((dim, nnx, nny, nnz))
    grid_iini[0, :, :] = grid[0]
    grid_iini[1, :, :] = grid[1]
    grid_iini[2, :, :] = grid[2]

    print 'grind ini shape'
    print grid_iini.shape

    print 'interpolation over space, dx/ %i' % rr
    if np.int(ver.full_version[2:4] < 14):
        print 'scipy version %s 2 low. plz upgrade to 0.14.xx' % ver.full_version
        quit()
    else:
        print 'scipy version %s is high, so am I' % ver.full_version

    # x = np.linspace(0, nnx - 1, nnx, dtype=int16)
    # y = np.linspace(0, nny - 1, nny, dtype=int16)
    # z = np.linspace(0, nnz - 1, nnz, dtype=int16)
    # t = np.linspace(0, len(ttt) - 1, len(ttt), dtype=int16)

    velpu = velp[:, :, :, 0, :]
    velpv = velp[:, :, :, 1, :]
    velpw = velp[:, :, :, 2, :]

    interpU_i = velp
    stamp = time.time()

    # def fu(x, y, z, t):
    #     return velpu[x, y, z, t]
    #
    # def fv(x, y, z, t):
    #     return velpv[x, y, z, t]
    #
    # def fw(x, y, z, t):
    #     return velpw[x, y, z, t]
    #
    # datau = fu(*np.meshgrid(x, y, z, t, indexing='ij', sparse=False))
    # datav = fv(*np.meshgrid(x, y, z, t, indexing='ij', sparse=False))
    # dataw = fw(*np.meshgrid(x, y, z, t, indexing='ij', sparse=False))
    #
    # interpu = RegularGridInterpolator((x, y, z, t), datau, method='nearest', bounds_error=False, fill_value=0)
    # interpv = RegularGridInterpolator((x, y, z, t), datav, method='nearest', bounds_error=False, fill_value=0)
    # interpw = RegularGridInterpolator((x, y, z, t), dataw, method='nearest', bounds_error=False, fill_value=0)

    # quit()
    print 'linear interp NOT from Scientific python'

    print 'avection time !'

    # eq dif => x point = v(x,t)
    # ou: y point = f(x,t)
    # fonction f:
    nn = np.array([nnx, nny, nnz])
    invddx = 1 / ddx
    invddy = 1 / ddy
    invddz = 1 / ddz

    def f_u(yy, t):
        coord = np.array([yy[0], yy[1], yy[2], t])
        # a = np.array(
        #     [interpu(coord) * invddx, interpv(coord) * invddy, interpw(coord) * invddz])

        u = ndimage.map_coordinates(velpu, [[yy[0]], [yy[1]], [yy[2]], [t]],
                                    order=3,
                                    mode='constant',
                                    cval=0.0,
                                    prefilter=False) * invddx
        v = ndimage.map_coordinates(velpv, [[yy[0]], [yy[1]], [yy[2]], [t]],
                                    order=3,
                                    mode='constant',
                                    cval=0.0,
                                    prefilter=False) * invddy
        w = ndimage.map_coordinates(velpw, [[yy[0]], [yy[1]], [yy[2]], [t]],
                                    order=3,
                                    mode='constant',
                                    cval=0.0,
                                    prefilter=False) * invddz
        return np.array([u, v, w])[:, 0]

    # print 'fu'. f_u()
    solver = ode(f_u)
    solver.set_integrator('dopri5', rtol=0.001, atol=1e-3)
    t = np.linspace(0, tt, N)
    bobol = np.zeros((nnx, nny))
    if rrk45 == 0:
        print 'rk45 intregration method, a checker'
        toto = 0
        quit()
        for i in xrange(nnx):
            for j in xrange(nny):
                y0 = grid_iini[:, i, j, tranche]
                # if np.all(np.abs(f_u(grid_i[:, i, j, tranche],0)) > np.array([1e-7,1e-7,1e-7])):
                if np.all(
                        np.abs(velp[i, j, tranche, :]) > np.array(
                            [1e-7, 1e-7, 1e-7])):
                    bobol[i, j] = True
                    grid_i[:, i, j, tranche], err = rk45(f_u, y0, t)[-1]
                    if np.max(err) > 1e-5:
                        print err, 'erreur d integ trop grande, my n***a'
                else:
                    grid_i[:, i, j, k] = [0, 0,
                                          0]  # grid_i[:, i, j, tranche] = y0
                    # on en profite pour faire le mask!!!

                    toto += 1
        print '%i point skipped, ie. %f percents of total points of the slice' % (
            toto, 100 * toto / (ny * nx))
    elif rrk45 == 1:
        print 'heun intregration method'
        toto = 0
        for i in xrange(nnx):
            for j in xrange(nny):
                for k in range(tranche - 2, tranche + 3):
                    y0 = grid_iini[:, i, j, k]
                    if np.all(
                            np.abs(velp[i, j, k, :,
                                        0]) > np.array([1e-7, 1e-7, 1e-7])):
                        bobol[i, j] = True
                        grid_i[:, i, j, k] = heun(f_u, y0, t, nx, ny)[-1]
                    else:
                        grid_i[:, i, j, k] = [0, 0, 0]
                        toto += 1
        print '%i point skipped, ie. %f percents of total points of the slice' % (
            toto, 100 * toto / (ny * nx))
    elif rrk45 == 2:
        print 'euler intregration method'
        toto = a = 0
        print('0            50          100%')

        for i in xrange(nnx):
            for j in xrange(nny):
                for k in range(tranche - 0, tranche + 1):
                    y0 = grid_iini[:, i, j, k]

                    if np.all(
                            np.abs(velp[i, j, k, :,
                                        0]) > np.array([1e-7, 1e-7, 1e-7])):
                        bobol[i, j] = True
                        grid_i[:, i, j, k] = euler(f_u, y0, t)[-1]
                    else:
                        # grid_i[:, i, j, k] = [0, 0, 0]
                        toto += 1
            a = 1. * i / nnx
            if (100 * a) % 10 < 1e-3:
                rpog()

        print '\n %i point skipped, ie. %f percents of total points of the domain' % (
            toto, 100 * toto / (ny * nx * 5))
    else:
        print 'wut ?'
        quit()

    # else:
    #     print grid_i[:,35,24,37]
    #     print 'totototot'
    #     t = ttt
    #     t0 = t[0]
    #     t1 = 0.001#t[-1]
    #     i = j = 0
    #     for i in xrange(nnx):
    #         for j in xrange(nny):
    #             y0 = grid_i[:, i, j, tranche]
    #             solver.set_initial_value(y0, t0)
    #             sol = np.empty((N, 3))
    #             sol[0] = y0
    #             k = 1
    #             dt=1e-3
    #             while solver.successful() and solver.t < t1:
    #                 solver.integrate(t[k])
    #                 sol[k] = solver.y
    #                 k += 1
    #             grid_i[:, i, j, tranche] = sol[-1, :]

    print '-----------------------------------------------------'
    print 'Velocity advected  in %f s ' % (time.time() - stamp)
    print '-----------------------------------------------------'

    FTF = True
    if FTF:
        stamp = time.time()
        # gradient of the flow map
        # shadden method
        # (u, v, w) sur (x, y)
        dphi = np.empty((nnx, nny, 3, 3))

        tricu = True

        if tricu:
            print 'tricubic interp'
            du = tricubic.tricubic(
                list(grid_i[0, :, :, :]),
                [nnx, nny, nnz
                 ])  # initialize interpolator with input data on cubic grid
            dv = tricubic.tricubic(
                list(grid_i[1, :, :, :]),
                [nnx, nny, nnz
                 ])  # initialize interpolator with input data on cubic grid
            dw = tricubic.tricubic(
                list(grid_i[2, :, :, :]),
                [nnx, nny, nnz
                 ])  # initialize interpolator with input data on cubic grid

            tata = 0
            print('0            50          100%')

            # 3d version haller ann. rev. fluid 2015
            for i in range(1, nnx - 1):
                for j in range(1, nny - 1):
                    # if np.all(np.abs(velp[i, j, k, :, 0]) > np.array([1e-7, 1e-7, 1e-7])):
                    if bobol[i, j]:

                        dphi[i, j, 0,
                             0] = (du.ip(list(np.array([i + d1, j, tranche])))
                                   - du.ip(list(np.array([i - d1, j, tranche
                                                          ])))) / (2 * d1)

                        dphi[i, j, 0,
                             1] = (du.ip(list(np.array([i, j + d2, tranche])))
                                   - du.ip(list(np.array([i, j - d2, tranche
                                                          ])))) / (2 * d2)
                        dphi[i, j, 0,
                             2] = (du.ip(list(np.array([i, j, tranche + d3])))
                                   - du.ip(list(np.array([i, j, tranche - d3
                                                          ])))) / (2 * d3)

                        dphi[i, j, 1,
                             0] = (dv.ip(list(np.array([i + d1, j, tranche])))
                                   - dv.ip(list(np.array([i - d1, j, tranche
                                                          ])))) / (2 * d1)
                        dphi[i, j, 1,
                             1] = (dv.ip(list(np.array([i, j + d2, tranche])))
                                   - dv.ip(list(np.array([i, j - d2, tranche
                                                          ])))) / (2 * d2)
                        dphi[i, j, 1,
                             2] = (dv.ip(list(np.array([i, j, tranche + d3])))
                                   - dv.ip(list(np.array([i, j, tranche - d3
                                                          ])))) / (2 * d3)

                        dphi[i, j, 2,
                             0] = (dw.ip(list(np.array([i + d1, j, tranche])))
                                   - dw.ip(list(np.array([i - d1, j, tranche
                                                          ])))) / (2 * d1)
                        dphi[i, j, 2,
                             1] = (dw.ip(list(np.array([i, j + d2, tranche])))
                                   - dw.ip(list(np.array([i, j - d2, tranche
                                                          ])))) / (2 * d2)
                        dphi[i, j, 2,
                             2] = (dw.ip(list(np.array([i, j, tranche + d3])))
                                   - dw.ip(list(np.array([i, j, tranche - d3
                                                          ])))) / (2 * d3)

                    else:
                        dphi[i, j, :, :] = np.zeros((3, 3))
                        tata += 1
                a = 1. * i / nnx
                if (100 * a) % 10 < 1e-3:
                    rpog()
            print '\n', tata, ' skipped of,', nnx * nny

            # bords a l arrache;
            dphi[0, :, 0, 0] = dphi[1, :, 0, 0]
            dphi[nnx - 1, :, 0, 0] = dphi[nnx - 2, :, 0, 0]
            dphi[:, 0, 0, 0] = dphi[:, 1, 0, 0]
            dphi[:, nny - 1, 0, 0] = dphi[:, nny - 2, 0, 0]

            dphi[0, :, 0, 1] = dphi[1, :, 0, 1]
            dphi[nnx - 1, :, 0, 1] = dphi[nnx - 2, :, 0, 1]
            dphi[:, 0, 0, 1] = dphi[:, 1, 0, 0]
            dphi[:, nny - 1, 0, 1] = dphi[:, nny - 2, 0, 1]

            dphi[0, :, 1, 0] = dphi[1, :, 1, 0]
            dphi[nnx - 1, :, 1, 0] = dphi[nnx - 2, :, 1, 0]
            dphi[:, 0, 1, 0] = dphi[:, 1, 1, 0]
            dphi[:, nny - 1, 1, 0] = dphi[:, nny - 2, 1, 0]

            dphi[0, :, 1, 1] = dphi[1, :, 1, 1]
            dphi[nnx - 1, :, 1, 1] = dphi[nnx - 2, :, 1, 1]
            dphi[:, 0, 1, 1] = dphi[:, 1, 1, 1]
            dphi[:, nny - 1, 1, 1] = dphi[:, nny - 2, 1, 1]

            gdphi = np.empty((nnx, nny, 3, 3))
            for i in xrange(nnx):
                for j in xrange(nny):
                    gdphi[i, j, :, :] = np.dot(dphi[i, j, :, :].T,
                                               dphi[i, j, :, :])

        else:
            quit()
            # axes = (xx, yy, zz)
            # du = IF(axes, dispu)
            # dv = IF(axes, dispv)
            # dw = IF(axes, dispw)
            #
            # d1 = dx / 3
            # d2 = dy / 3
            # d3 = dz / 3
            #
            # # 3d version haller ann. rev. fluid 2015
            # for i in range(1, nnx - 1):
            #     for j in range(1, nny - 1):
            #         # for k in range(1, nnz - 1):
            #         # ACHTUNG CALCUL 3D MAIS SEED 2D
            #         ii = i * ddx + domain[0]
            #         jj = j * ddy + domain[2]
            #         zzzplan = zplan * dz + domain[4]
            #         # print ii,jj,zzzplan
            #         # print
            #         # print ii, jj, zzzplan
            #
            #         dphi[i, j, 0, 0] = (du(ii + d1, jj, zzzplan) - du(ii - d1, jj, zzzplan)) / (2 * d1)
            #         print dphi[i, j, 0, 0]
            #         dphi[i, j, 0, 1] = (du(ii, jj + d2, zzzplan) - du(ii, jj - d2, zzzplan)) / (2 * d2)
            #         dphi[i, j, 0, 2] = (du(ii, jj, zzzplan + d3) - du(ii, jj, zzzplan - d3)) / (2 * d3)
            #
            #         dphi[i, j, 1, 0] = (dv(ii + d1, jj, zzzplan) - dv(ii - d1, jj, zzzplan)) / (2 * d1)
            #         dphi[i, j, 1, 1] = (dv(ii, jj + d2, zzzplan) - dv(ii, jj - d2, zzzplan)) / (2 * d2)
            #         dphi[i, j, 1, 2] = (dv(ii, jj, zzzplan + d3) - dv(ii, jj, zzzplan - d3)) / (2 * d3)
            #
            #         dphi[i, j, 2, 0] = (dw(ii + d1, jj, zzzplan) - dw(ii - d1, jj, zzzplan)) / (2 * d1)
            #         dphi[i, j, 2, 1] = (dw(ii, jj + d2, zzzplan) - dw(ii, jj - d2, zzzplan)) / (2 * d2)
            #         dphi[i, j, 2, 2] = (dw(ii, jj, zzzplan + d3) - dw(ii, jj, zzzplan - d3)) / (2 * d3)
            #
            # print 'dphi[50,50,1,1]'
            # print dphi[50, 50, 1, 1]
            # # bords a l arrache;
            # dphi[0, :, 0, 0] = dphi[1, :, 0, 0]
            # dphi[nnx - 1, :, 0, 0] = dphi[nnx - 2, :, 0, 0]
            # dphi[:, 0, 0, 0] = dphi[:, 1, 0, 0]
            # dphi[:, nny - 1, 0, 0] = dphi[:, nny - 2, 0, 0]
            #
            # dphi[0, :, 0, 1] = dphi[1, :, 0, 1]
            # dphi[nnx - 1, :, 0, 1] = dphi[nnx - 2, :, 0, 1]
            # dphi[:, 0, 0, 1] = dphi[:, 1, 0, 0]
            # dphi[:, nny - 1, 0, 1] = dphi[:, nny - 2, 0, 1]
            #
            # dphi[0, :, 1, 0] = dphi[1, :, 1, 0]
            # dphi[nnx - 1, :, 1, 0] = dphi[nnx - 2, :, 1, 0]
            # dphi[:, 0, 1, 0] = dphi[:, 1, 1, 0]
            # dphi[:, nny - 1, 1, 0] = dphi[:, nny - 2, 1, 0]
            #
            # dphi[0, :, 1, 1] = dphi[1, :, 1, 1]
            # dphi[nnx - 1, :, 1, 1] = dphi[nnx - 2, :, 1, 1]
            # dphi[:, 0, 1, 1] = dphi[:, 1, 1, 1]
            # dphi[:, nny - 1, 1, 1] = dphi[:, nny - 2, 1, 1]
            #
            # gdphi = np.empty((nnx, nny, 3, 3))
            # for i in xrange(nnx):
            #     for j in xrange(nny):
            #         gdphi[i, j, :, :] = np.dot(dphi[i, j, :, :].T, dphi[i, j, :, :])

        # print dphi.shape, dphi.T.shape,gdphi.shape
        # toto=np.inner(dphi.T, dphi)
        # print np.array_equal(gdphi,toto)
        # print '------------------------'

        eigenValues, eigenVectors = LA.eig(gdphi)

        eigvec1 = np.empty((nnx, nny, 3))
        eigvec3 = np.empty((nnx, nny, 3))
        eigval1 = np.empty((nnx, nny))
        eigval3 = np.empty((nnx, nny))

        # print 'min,max,avg,stdev'
        # a = eigenValues[:, :, 0] * eigenValues[:, :, 1] * eigenValues[:, :, 2]
        # # print np.min(a)
        # # print np.max(a)
        # # print np.average(a)
        # # print np.std(a)
        # # print '{{{{{{'

        for i in xrange(eigenValues.shape[0]):
            for j in xrange(eigenValues.shape[1]):
                eigval1[i, j] = np.min(eigenValues[i, j, :])
                eigval3[i, j] = np.max(eigenValues[i, j, :])
                eigvec1[i, j, :] = eigenVectors[i, j, :,
                                                np.argmin(eigenValues[i,
                                                                      j, :])]
                eigvec3[i, j, :] = eigenVectors[i, j, :,
                                                np.argmax(eigenValues[i,
                                                                      j, :])]
                # print eigvec3[i, j, :]

        # toto = eigval3.astype(short)
        # juliaStacked = np.dstack([toto])
        # x = np.arange(0, nnx)
        # y = np.arange(0, nny)
        # z = np.arange(0, 2)
        # gridToVTK("./julia", x, y, z, cellData = {'julia': juliaStacked})

        print '-----------------------------------------------------'
        print 'Flow map and eigval/eigvec computed in %f s ' % (time.time() -
                                                                stamp)
        print '-----------------------------------------------------'

        # p1 = win.addPlot(title="Basic array plotting", y=np.random.normal(size=100))

        f, ((ax1, ax2, ax3), (ax4, ax5, ax6),
            (ax7, ax8, ax9)) = plt.subplots(3, 3, sharex=True, sharey=True)
        # print didx.shape
        # Y, X = np.mgrid[0:nx * dx:rr * nx * 1j, 0:ny * dy:rr * ny * 1j]

        uu = grid_i[0, :, :, zzplan] - grid_iini[0, :, :,
                                                 zzplan]  # -grid_iini[0,:,:]
        vv = grid_i[1, :, :, zzplan] - grid_iini[1, :, :,
                                                 zzplan]  # -grid_iini[1,:,:]
        ww = grid_i[2, :, :, zzplan] - grid_iini[2, :, :,
                                                 zzplan]  # -grid_iini[1,:,:]
        magx = np.sqrt(uu * uu + vv * vv + ww * ww)
        # U = interpU_i[:, :, 0, 0]
        # V = interpU_i[:, :, 1, 0]
        # magu = np.sqrt(U * U + V * V)
        # print grid_i[0, 5, :]- grid_iini[0, 5, :]
        ax4.imshow(velpu[:, :, tranche, 0],
                   vmin=-0.05,
                   vmax=0.05,
                   cmap='jet',
                   aspect='auto')
        ax5.imshow(velpv[:, :, tranche, 0],
                   vmin=-0.05,
                   vmax=0.05,
                   cmap='jet',
                   aspect='auto')
        ax6.imshow(velpw[:, :, tranche, 0],
                   vmin=-0.05,
                   vmax=0.05,
                   cmap='jet',
                   aspect='auto')
        # ax2.imshow(dispu[:,:,tranche-1]-dispu[:,:,tranche+1])
        # ax3.imshow(dispu[:,:,tranche+1]-grid_iini[0,:,:,tranche+1])
        # ax3.imshow(grid_i[2, :, :,zzplan])
        # ax2.imshow(magx)
        ax1.imshow(grid_i[0, :, :, tranche])
        ax2.imshow(grid_i[1, :, :, tranche])
        ax3.imshow(grid_i[2, :, :, tranche])

        ax7.imshow(dphi[:, :, 0, 0])
        # with file('test.txt', 'w') as outfile:
        # np.savetxt(outfile, dphi[:, :, 0, 0])
        ax8.imshow(dphi[:, :, 0, 1])
        ax9.imshow(dphi[:, :, 1, 1])
        # ax2.imshow(didy)
        # ax3.quiver(X, Y, U, V, color=magu)
        # ax4.streamplot(X, Y, uu, vv, density=0.6, color='k', linewidth=magx)

        plt.show()

    print '-------------------------'
    print 'error', np.random.random_integers(0, 100)
    print '-------------------------'
    return eigval1, eigval3, eigvec1, eigvec3, interpU_i, bobol
Example #9
0
import numpy as np
import tricubic

n = 3
f = np.zeros((n,n,n), dtype='float')

for i in range(n):
  for j in range(n):
    for k in range(n):
      f[i][j][k] = i+j+k #some function f(x,y,z) is given on a cubic grid indexed by i,j,k
      
ip = tricubic.tricubic(list(f), [n,n,n]) #initialize interpolator with input data on cubic grid
for i in range(100000):
  res = ip.ip(list(np.random.rand(3)*(n-1))) #interpolate the function f at a random point in space
  #print res
Example #10
0
def cgstki3(velp, zplan, tt, dt, nx, ny, nz, dim, domain, simtstep):
    # x = np.arange(tt)
    ttt = int(tt / dt)
    ttt = np.arange(ttt)
    # print ttt[0], ttt[-1]
    n = len(ttt)
    N = 25  # rk45 int step
    integrator = 'dopri5'  # ou dopri5 pour du dormant-prince rk45a-
    rrk45 = 2  # 0=rk45, 1=heun, 2= euler

    # small (so is your dick) vector d1(d1 0 0) d2(0 d2 0) d3(0 0 d3)
    d1 = np.float(ConfigSectionMap('cauchygreen')['dx'])
    d2 = d1
    d3 = d2

    # tranche = zplan  # index de la tranche evaluee
    integ = 'rk45'

    # if doublegyre
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # print 'WARING DOMAIN CUT FOR TEST PURPOSE'
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # print '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
    # velp = velp[:, :60, :, :, :]
    # ny = velp.shape[1]
    #
    # print 'velp shape'
    # print velp.shape

    # ptlist = np.indices((nx, ny, nz))
    # ptlist = ptlist.astype(float)
    domain = domain.astype(float)
    dx = abs(domain[1] - domain[0]) / nx
    dy = abs(domain[3] - domain[2]) / ny
    dz = abs(domain[5] - domain[4]) / ny
    print 'dx', dx
    print 'dy', dy
    print 'dz', dz
    rr = 1

    nnx = nx * rr
    nny = ny * rr
    nnz = nz * rr  # pas de sous divisions sur z
    ddx = dx / rr
    ddy = dy / rr
    ddz = dz / rr
    zzplan = zplan * rr
    print "domain:", domain
    print 'zplan =', zplan  # * ddz + domain[4]
    tranche = int((zplan - domain[4]) / ((domain[5] - domain[4]) / nz))

    print 'tranche evaluee %i' % tranche

    print 'dt', dt, 't physique', tt, '# time steps', ttt
    # interp spatiale sur une grille r fois plus fine

    grid = np.indices((nnx, nny, nnz))
    grid = grid.astype(float)

    grid_i = np.empty((dim, nnx, nny, nnz))
    grid_i[0, :, :] = grid[0]
    grid_i[1, :, :] = grid[1]
    grid_i[2, :, :] = grid[2]
    # print grid_i
    # grid_iini = np.zeros((dim, nnx, nny, nnz))
    grid_iini = np.empty((dim, nnx, nny, nnz))
    grid_iini[0, :, :] = grid[0]
    grid_iini[1, :, :] = grid[1]
    grid_iini[2, :, :] = grid[2]

    print 'grind ini shape'
    print grid_iini.shape

    print 'interpolation over space, dx/ %i' % rr
    if np.int(ver.full_version[2:4] < 14):
        print 'scipy version %s 2 low. plz upgrade to 0.14.xx' % ver.full_version
        quit()
    else:
        print 'scipy version %s is high, so am I' % ver.full_version

    # x = np.linspace(0, nnx - 1, nnx, dtype=int16)
    # y = np.linspace(0, nny - 1, nny, dtype=int16)
    # z = np.linspace(0, nnz - 1, nnz, dtype=int16)
    # t = np.linspace(0, len(ttt) - 1, len(ttt), dtype=int16)

    velpu = velp[:, :, :, 0, :]
    velpv = velp[:, :, :, 1, :]
    velpw = velp[:, :, :, 2, :]

    interpU_i = velp
    stamp = time.time()

    # def fu(x, y, z, t):
    #     return velpu[x, y, z, t]
    #
    # def fv(x, y, z, t):
    #     return velpv[x, y, z, t]
    #
    # def fw(x, y, z, t):
    #     return velpw[x, y, z, t]
    #
    # datau = fu(*np.meshgrid(x, y, z, t, indexing='ij', sparse=False))
    # datav = fv(*np.meshgrid(x, y, z, t, indexing='ij', sparse=False))
    # dataw = fw(*np.meshgrid(x, y, z, t, indexing='ij', sparse=False))
    #
    # interpu = RegularGridInterpolator((x, y, z, t), datau, method='nearest', bounds_error=False, fill_value=0)
    # interpv = RegularGridInterpolator((x, y, z, t), datav, method='nearest', bounds_error=False, fill_value=0)
    # interpw = RegularGridInterpolator((x, y, z, t), dataw, method='nearest', bounds_error=False, fill_value=0)


    # quit()
    print 'linear interp NOT from Scientific python'

    print 'avection time !'

    # eq dif => x point = v(x,t)
    # ou: y point = f(x,t)
    # fonction f:
    nn = np.array([nnx, nny, nnz])
    invddx = 1 / ddx
    invddy = 1 / ddy
    invddz = 1 / ddz

    def f_u(yy, t):
        coord = np.array([yy[0], yy[1], yy[2], t])
        # a = np.array(
        #     [interpu(coord) * invddx, interpv(coord) * invddy, interpw(coord) * invddz])

        u = ndimage.map_coordinates(velpu, [[yy[0]], [yy[1]], [yy[2]], [t]], order=3, mode='constant', cval=0.0, prefilter=False) * invddx
        v = ndimage.map_coordinates(velpv, [[yy[0]], [yy[1]], [yy[2]], [t]], order=3, mode='constant', cval=0.0,
                                    prefilter=False) * invddy
        w = ndimage.map_coordinates(velpw, [[yy[0]], [yy[1]], [yy[2]], [t]], order=3, mode='constant', cval=0.0,
                                    prefilter=False) * invddz
        return np.array([u, v, w])[:, 0]

    # print 'fu'. f_u()
    solver = ode(f_u)
    solver.set_integrator('dopri5', rtol=0.001, atol=1e-3)
    t = np.linspace(0, tt, N)
    bobol = np.zeros((nnx, nny))
    if rrk45 == 0:
        print 'rk45 intregration method, a checker'
        toto = 0
        quit()
        for i in xrange(nnx):
            for j in xrange(nny):
                y0 = grid_iini[:, i, j, tranche]
                # if np.all(np.abs(f_u(grid_i[:, i, j, tranche],0)) > np.array([1e-7,1e-7,1e-7])):
                if np.all(np.abs(velp[i, j, tranche, :]) > np.array([1e-7, 1e-7, 1e-7])):
                    bobol[i, j] = True
                    grid_i[:, i, j, tranche], err = rk45(f_u, y0, t)[-1]
                    if np.max(err) > 1e-5:
                        print err, 'erreur d integ trop grande, my n***a'
                else:
                    grid_i[:, i, j, k] = [0, 0, 0]  # grid_i[:, i, j, tranche] = y0
                    # on en profite pour faire le mask!!!

                    toto += 1
        print '%i point skipped, ie. %f percents of total points of the slice' % (toto, 100 * toto / (ny * nx))
    elif rrk45 == 1:
        print 'heun intregration method'
        toto = 0
        for i in xrange(nnx):
            for j in xrange(nny):
                for k in range(tranche - 2, tranche + 3):
                    y0 = grid_iini[:, i, j, k]
                    if np.all(np.abs(velp[i, j, k, :, 0]) > np.array([1e-7, 1e-7, 1e-7])):
                        bobol[i, j] = True
                        grid_i[:, i, j, k] = heun(f_u, y0, t, nx, ny)[-1]
                    else:
                        grid_i[:, i, j, k] = [0, 0, 0]
                        toto += 1
        print '%i point skipped, ie. %f percents of total points of the slice' % (toto, 100 * toto / (ny * nx))
    elif rrk45 == 2:
        print 'euler intregration method'
        toto = a = 0
        print ('0            50          100%')

        for i in xrange(nnx):
            for j in xrange(nny):
                for k in range(tranche - 0, tranche + 1):
                    y0 = grid_iini[:, i, j, k]

                    if np.all(np.abs(velp[i, j, k, :, 0]) > np.array([1e-7, 1e-7, 1e-7])):
                        bobol[i, j] = True
                        grid_i[:, i, j, k] = euler(f_u, y0, t)[-1]
                    else:
                        # grid_i[:, i, j, k] = [0, 0, 0]
                        toto += 1
            a = 1. * i / nnx
            if (100 * a) % 10 < 1e-3:
                rpog()

        print '\n %i point skipped, ie. %f percents of total points of the domain' % (toto, 100 * toto / (ny * nx * 5))
    else:
        print 'wut ?'
        quit()

    # else:
    #     print grid_i[:,35,24,37]
    #     print 'totototot'
    #     t = ttt
    #     t0 = t[0]
    #     t1 = 0.001#t[-1]
    #     i = j = 0
    #     for i in xrange(nnx):
    #         for j in xrange(nny):
    #             y0 = grid_i[:, i, j, tranche]
    #             solver.set_initial_value(y0, t0)
    #             sol = np.empty((N, 3))
    #             sol[0] = y0
    #             k = 1
    #             dt=1e-3
    #             while solver.successful() and solver.t < t1:
    #                 solver.integrate(t[k])
    #                 sol[k] = solver.y
    #                 k += 1
    #             grid_i[:, i, j, tranche] = sol[-1, :]

    print '-----------------------------------------------------'
    print 'Velocity advected  in %f s ' % (time.time() - stamp)
    print '-----------------------------------------------------'

    FTF = True
    if FTF:
        stamp = time.time()
        # gradient of the flow map
        # shadden method
        # (u, v, w) sur (x, y)
        dphi = np.empty((nnx, nny, 3, 3))

        tricu = True

        if tricu:
            print 'tricubic interp'
            du = tricubic.tricubic(list(grid_i[0, :, :, :]),
                                   [nnx, nny, nnz])  # initialize interpolator with input data on cubic grid
            dv = tricubic.tricubic(list(grid_i[1, :, :, :]),
                                   [nnx, nny, nnz])  # initialize interpolator with input data on cubic grid
            dw = tricubic.tricubic(list(grid_i[2, :, :, :]),
                                   [nnx, nny, nnz])  # initialize interpolator with input data on cubic grid

            tata = 0
            print ('0            50          100%')

            # 3d version haller ann. rev. fluid 2015
            for i in range(1, nnx - 1):
                for j in range(1, nny - 1):
                    # if np.all(np.abs(velp[i, j, k, :, 0]) > np.array([1e-7, 1e-7, 1e-7])):
                    if bobol[i, j]:

                        dphi[i, j, 0, 0] = (du.ip(list(np.array([i + d1, j, tranche]))) - du.ip(
                            list(np.array([i - d1, j, tranche])))) / (2 * d1)

                        dphi[i, j, 0, 1] = (du.ip(list(np.array([i, j + d2, tranche]))) - du.ip(
                            list(np.array([i, j - d2, tranche])))) / (2 * d2)
                        dphi[i, j, 0, 2] = (du.ip(list(np.array([i, j, tranche + d3]))) - du.ip(
                            list(np.array([i, j, tranche - d3])))) / (2 * d3)

                        dphi[i, j, 1, 0] = (dv.ip(list(np.array([i + d1, j, tranche]))) - dv.ip(
                            list(np.array([i - d1, j, tranche])))) / (2 * d1)
                        dphi[i, j, 1, 1] = (dv.ip(list(np.array([i, j + d2, tranche]))) - dv.ip(
                            list(np.array([i, j - d2, tranche])))) / (2 * d2)
                        dphi[i, j, 1, 2] = (dv.ip(list(np.array([i, j, tranche + d3]))) - dv.ip(
                            list(np.array([i, j, tranche - d3])))) / (2 * d3)

                        dphi[i, j, 2, 0] = (dw.ip(list(np.array([i + d1, j, tranche]))) - dw.ip(
                            list(np.array([i - d1, j, tranche])))) / (2 * d1)
                        dphi[i, j, 2, 1] = (dw.ip(list(np.array([i, j + d2, tranche]))) - dw.ip(
                            list(np.array([i, j - d2, tranche])))) / (2 * d2)
                        dphi[i, j, 2, 2] = (dw.ip(list(np.array([i, j, tranche + d3]))) - dw.ip(
                            list(np.array([i, j, tranche - d3])))) / (2 * d3)

                    else:
                        dphi[i, j, :, :] = np.zeros((3, 3))
                        tata += 1
                a = 1. * i / nnx
                if (100 * a) % 10 < 1e-3:
                    rpog()
            print '\n', tata, ' skipped of,', nnx * nny

            # bords a l arrache;
            dphi[0, :, 0, 0] = dphi[1, :, 0, 0]
            dphi[nnx - 1, :, 0, 0] = dphi[nnx - 2, :, 0, 0]
            dphi[:, 0, 0, 0] = dphi[:, 1, 0, 0]
            dphi[:, nny - 1, 0, 0] = dphi[:, nny - 2, 0, 0]

            dphi[0, :, 0, 1] = dphi[1, :, 0, 1]
            dphi[nnx - 1, :, 0, 1] = dphi[nnx - 2, :, 0, 1]
            dphi[:, 0, 0, 1] = dphi[:, 1, 0, 0]
            dphi[:, nny - 1, 0, 1] = dphi[:, nny - 2, 0, 1]

            dphi[0, :, 1, 0] = dphi[1, :, 1, 0]
            dphi[nnx - 1, :, 1, 0] = dphi[nnx - 2, :, 1, 0]
            dphi[:, 0, 1, 0] = dphi[:, 1, 1, 0]
            dphi[:, nny - 1, 1, 0] = dphi[:, nny - 2, 1, 0]

            dphi[0, :, 1, 1] = dphi[1, :, 1, 1]
            dphi[nnx - 1, :, 1, 1] = dphi[nnx - 2, :, 1, 1]
            dphi[:, 0, 1, 1] = dphi[:, 1, 1, 1]
            dphi[:, nny - 1, 1, 1] = dphi[:, nny - 2, 1, 1]

            gdphi = np.empty((nnx, nny, 3, 3))
            for i in xrange(nnx):
                for j in xrange(nny):
                    gdphi[i, j, :, :] = np.dot(dphi[i, j, :, :].T, dphi[i, j, :, :])



        else:
            quit()
            # axes = (xx, yy, zz)
            # du = IF(axes, dispu)
            # dv = IF(axes, dispv)
            # dw = IF(axes, dispw)
            #
            # d1 = dx / 3
            # d2 = dy / 3
            # d3 = dz / 3
            #
            # # 3d version haller ann. rev. fluid 2015
            # for i in range(1, nnx - 1):
            #     for j in range(1, nny - 1):
            #         # for k in range(1, nnz - 1):
            #         # ACHTUNG CALCUL 3D MAIS SEED 2D
            #         ii = i * ddx + domain[0]
            #         jj = j * ddy + domain[2]
            #         zzzplan = zplan * dz + domain[4]
            #         # print ii,jj,zzzplan
            #         # print
            #         # print ii, jj, zzzplan
            #
            #         dphi[i, j, 0, 0] = (du(ii + d1, jj, zzzplan) - du(ii - d1, jj, zzzplan)) / (2 * d1)
            #         print dphi[i, j, 0, 0]
            #         dphi[i, j, 0, 1] = (du(ii, jj + d2, zzzplan) - du(ii, jj - d2, zzzplan)) / (2 * d2)
            #         dphi[i, j, 0, 2] = (du(ii, jj, zzzplan + d3) - du(ii, jj, zzzplan - d3)) / (2 * d3)
            #
            #         dphi[i, j, 1, 0] = (dv(ii + d1, jj, zzzplan) - dv(ii - d1, jj, zzzplan)) / (2 * d1)
            #         dphi[i, j, 1, 1] = (dv(ii, jj + d2, zzzplan) - dv(ii, jj - d2, zzzplan)) / (2 * d2)
            #         dphi[i, j, 1, 2] = (dv(ii, jj, zzzplan + d3) - dv(ii, jj, zzzplan - d3)) / (2 * d3)
            #
            #         dphi[i, j, 2, 0] = (dw(ii + d1, jj, zzzplan) - dw(ii - d1, jj, zzzplan)) / (2 * d1)
            #         dphi[i, j, 2, 1] = (dw(ii, jj + d2, zzzplan) - dw(ii, jj - d2, zzzplan)) / (2 * d2)
            #         dphi[i, j, 2, 2] = (dw(ii, jj, zzzplan + d3) - dw(ii, jj, zzzplan - d3)) / (2 * d3)
            #
            # print 'dphi[50,50,1,1]'
            # print dphi[50, 50, 1, 1]
            # # bords a l arrache;
            # dphi[0, :, 0, 0] = dphi[1, :, 0, 0]
            # dphi[nnx - 1, :, 0, 0] = dphi[nnx - 2, :, 0, 0]
            # dphi[:, 0, 0, 0] = dphi[:, 1, 0, 0]
            # dphi[:, nny - 1, 0, 0] = dphi[:, nny - 2, 0, 0]
            #
            # dphi[0, :, 0, 1] = dphi[1, :, 0, 1]
            # dphi[nnx - 1, :, 0, 1] = dphi[nnx - 2, :, 0, 1]
            # dphi[:, 0, 0, 1] = dphi[:, 1, 0, 0]
            # dphi[:, nny - 1, 0, 1] = dphi[:, nny - 2, 0, 1]
            #
            # dphi[0, :, 1, 0] = dphi[1, :, 1, 0]
            # dphi[nnx - 1, :, 1, 0] = dphi[nnx - 2, :, 1, 0]
            # dphi[:, 0, 1, 0] = dphi[:, 1, 1, 0]
            # dphi[:, nny - 1, 1, 0] = dphi[:, nny - 2, 1, 0]
            #
            # dphi[0, :, 1, 1] = dphi[1, :, 1, 1]
            # dphi[nnx - 1, :, 1, 1] = dphi[nnx - 2, :, 1, 1]
            # dphi[:, 0, 1, 1] = dphi[:, 1, 1, 1]
            # dphi[:, nny - 1, 1, 1] = dphi[:, nny - 2, 1, 1]
            #
            # gdphi = np.empty((nnx, nny, 3, 3))
            # for i in xrange(nnx):
            #     for j in xrange(nny):
            #         gdphi[i, j, :, :] = np.dot(dphi[i, j, :, :].T, dphi[i, j, :, :])

        # print dphi.shape, dphi.T.shape,gdphi.shape
        # toto=np.inner(dphi.T, dphi)
        # print np.array_equal(gdphi,toto)
        # print '------------------------'

        eigenValues, eigenVectors = LA.eig(gdphi)

        eigvec1 = np.empty((nnx, nny, 3))
        eigvec3 = np.empty((nnx, nny, 3))
        eigval1 = np.empty((nnx, nny))
        eigval3 = np.empty((nnx, nny))

        # print 'min,max,avg,stdev'
        # a = eigenValues[:, :, 0] * eigenValues[:, :, 1] * eigenValues[:, :, 2]
        # # print np.min(a)
        # # print np.max(a)
        # # print np.average(a)
        # # print np.std(a)
        # # print '{{{{{{'

        for i in xrange(eigenValues.shape[0]):
            for j in xrange(eigenValues.shape[1]):
                eigval1[i, j] = np.min(eigenValues[i, j, :])
                eigval3[i, j] = np.max(eigenValues[i, j, :])
                eigvec1[i, j, :] = eigenVectors[i, j, :, np.argmin(eigenValues[i, j, :])]
                eigvec3[i, j, :] = eigenVectors[i, j, :, np.argmax(eigenValues[i, j, :])]
                # print eigvec3[i, j, :]

        # toto = eigval3.astype(short)
        # juliaStacked = np.dstack([toto])
        # x = np.arange(0, nnx)
        # y = np.arange(0, nny)
        # z = np.arange(0, 2)
        # gridToVTK("./julia", x, y, z, cellData = {'julia': juliaStacked})


        print '-----------------------------------------------------'
        print 'Flow map and eigval/eigvec computed in %f s ' % (time.time() - stamp)
        print '-----------------------------------------------------'






        # p1 = win.addPlot(title="Basic array plotting", y=np.random.normal(size=100))














        f, ((ax1, ax2, ax3), (ax4, ax5, ax6), (ax7, ax8, ax9)) = plt.subplots(3, 3, sharex=True, sharey=True)
        # print didx.shape
        # Y, X = np.mgrid[0:nx * dx:rr * nx * 1j, 0:ny * dy:rr * ny * 1j]

        uu = grid_i[0, :, :, zzplan] - grid_iini[0, :, :, zzplan]  # -grid_iini[0,:,:]
        vv = grid_i[1, :, :, zzplan] - grid_iini[1, :, :, zzplan]  # -grid_iini[1,:,:]
        ww = grid_i[2, :, :, zzplan] - grid_iini[2, :, :, zzplan]  # -grid_iini[1,:,:]
        magx = np.sqrt(uu * uu + vv * vv + ww * ww)
        # U = interpU_i[:, :, 0, 0]
        # V = interpU_i[:, :, 1, 0]
        # magu = np.sqrt(U * U + V * V)
        # print grid_i[0, 5, :]- grid_iini[0, 5, :]
        ax4.imshow(velpu[:, :, tranche, 0], vmin=-0.05, vmax=0.05, cmap='jet', aspect='auto')
        ax5.imshow(velpv[:, :, tranche, 0], vmin=-0.05, vmax=0.05, cmap='jet', aspect='auto')
        ax6.imshow(velpw[:, :, tranche, 0], vmin=-0.05, vmax=0.05, cmap='jet', aspect='auto')
        # ax2.imshow(dispu[:,:,tranche-1]-dispu[:,:,tranche+1])
        # ax3.imshow(dispu[:,:,tranche+1]-grid_iini[0,:,:,tranche+1])
        # ax3.imshow(grid_i[2, :, :,zzplan])
        # ax2.imshow(magx)
        ax1.imshow(grid_i[0, :, :, tranche])
        ax2.imshow(grid_i[1, :, :, tranche])
        ax3.imshow(grid_i[2, :, :, tranche])

        ax7.imshow(dphi[:, :, 0, 0])
        # with file('test.txt', 'w') as outfile:
        # np.savetxt(outfile, dphi[:, :, 0, 0])
        ax8.imshow(dphi[:, :, 0, 1])
        ax9.imshow(dphi[:, :, 1, 1])
        # ax2.imshow(didy)
        # ax3.quiver(X, Y, U, V, color=magu)
        # ax4.streamplot(X, Y, uu, vv, density=0.6, color='k', linewidth=magx)

        plt.show()






    print '-------------------------'
    print 'error', np.random.random_integers(0, 100)
    print '-------------------------'
    return eigval1, eigval3, eigvec1, eigvec3, interpU_i, bobol