def to_dense(A):
    """
    Convert a sparse matrix A to dense.
    For debugging only.
    """
    v = Vector()
    A.init_vector(v)
    mpi_comm = v.mpi_comm()
    nprocs = MPI.size(mpi_comm)

    if nprocs > 1:
        raise Exception("to_dense is only serial")

    if hasattr(A, "getrow"):
        n = A.size(0)
        m = A.size(1)
        B = np.zeros((n, m), dtype=np.float64)
        for i in range(0, n):
            [j, val] = A.getrow(i)
            B[i, j] = val

        return B
    else:
        x = Vector()
        Ax = Vector()
        A.init_vector(x, 1)
        A.init_vector(Ax, 0)

        n = Ax.array().shape[0]
        m = x.array().shape[0]
        B = np.zeros((n, m), dtype=np.float64)
        for i in range(0, m):
            i_ind = np.array([i], dtype=np.intc)
            x.set_local(np.ones(i_ind.shape), i_ind)
            x.apply("sum_values")
            A.mult(x, Ax)
            B[:, i] = Ax.array()
            x.set_local(np.zeros(i_ind.shape), i_ind)
            x.apply("sum_values")

        return B
Beispiel #2
0
def to_dense(A, mpi_comm = mpi_comm_world() ):
    """
    Convert a sparse matrix A to dense.
    For debugging only.
    """
    v = Vector(mpi_comm)
    A.init_vector(v)
    nprocs = MPI.size(mpi_comm)
    
    if nprocs > 1:
        raise Exception("to_dense is only serial")
    
    if hasattr(A, "getrow"):
        n  = A.size(0)
        m  = A.size(1)
        B = np.zeros( (n,m), dtype=np.float64)
        for i in range(0,n):
            [j, val] = A.getrow(i)
            B[i,j] = val
        
        return B
    else:
        x = Vector(mpi_comm)
        Ax = Vector(mpi_comm)
        A.init_vector(x,1)
        A.init_vector(Ax,0)
        
        n = Ax.get_local().shape[0]
        m = x.get_local().shape[0]
        B = np.zeros( (n,m), dtype=np.float64) 
        for i in range(0,m):
            i_ind = np.array([i], dtype=np.intc)
            x.set_local(np.ones(i_ind.shape), i_ind)
            x.apply("sum_values")
            A.mult(x,Ax)
            B[:,i] = Ax.get_local()
            x.set_local(np.zeros(i_ind.shape), i_ind)
            x.apply("sum_values")
            
        return B
    def gradab(self, m1, m2):
        self.gradm1 = project(nabla_grad(m1), self.Vd)
        self.gradm2 = project(nabla_grad(m2), self.Vd)

        uwv00, uwv00ind = [], []
        uwv10, uwv10ind = [], []
        uwv01, uwv01ind = [], []
        uwv11, uwv11ind = [], []
        for ii, x in enumerate(self.x):
            G = np.array([self.gradm1(x), self.gradm2(x)]).T
            u, s, v = np.linalg.svd(G)
            sqrts2eps = np.sqrt(s**2 + self.eps)
            W = np.diag(s / sqrts2eps)
            uwv = u.dot(W.dot(v))

            uwv00.append(uwv[0][0])
            uwv00ind.append(ii)

            uwv10.append(uwv[1][0])
            uwv10ind.append(ii)

            uwv01.append(uwv[0][1])
            uwv01ind.append(ii)

            uwv11.append(uwv[1][1])
            uwv11ind.append(ii)

        Grad = Function(self.VV)
        grad = Grad.vector()
        rhsG = Vector()
        self.Gx1test.init_vector(rhsG, 1)

        rhsG.set_local(np.array(uwv00), np.array(uwv00ind, dtype=np.intc))
        rhsG.apply('insert')
        grad.axpy(1.0, self.Gx1test * rhsG)

        rhsG.zero()
        rhsG.set_local(np.array(uwv10), np.array(uwv10ind, dtype=np.intc))
        rhsG.apply('insert')
        grad.axpy(1.0, self.Gy1test * rhsG)

        rhsG.set_local(np.array(uwv01), np.array(uwv01ind, dtype=np.intc))
        rhsG.apply('insert')
        grad.axpy(1.0, self.Gx2test * rhsG)

        rhsG.set_local(np.array(uwv11), np.array(uwv11ind, dtype=np.intc))
        rhsG.apply('insert')
        grad.axpy(1.0, self.Gy2test * rhsG)

        return grad * self.k
def get_diagonal(A, d):
    """
    Compute the diagonal of the square operator A.
    Use Solver2Operator if A^-1 is needed.
    """
    ej, xj = Vector(), Vector()
    A.init_vector(ej, 1)
    A.init_vector(xj, 0)

    g_size = ej.size()
    d.zero()
    for gid in xrange(g_size):
        owns_gid = ej.owns_index(gid)
        if owns_gid:
            SetToOwnedGid(ej, gid, 1.)
        ej.apply("insert")
        A.mult(ej, xj)
        if owns_gid:
            val = GetFromOwnedGid(xj, gid)
            SetToOwnedGid(d, gid, val)
            SetToOwnedGid(ej, gid, 0.)
        ej.apply("insert")

    d.apply("insert")
Beispiel #5
0
def get_diagonal(A, d):
    """
    Compute the diagonal of the square operator :math:`A`.
    Use :code:`Solver2Operator` if :math:`A^{-1}` is needed.
    """
    ej, xj = Vector(d.mpi_comm()), Vector(d.mpi_comm())
    A.init_vector(ej, 1)
    A.init_vector(xj, 0)

    g_size = ej.size()
    d.zero()
    for gid in range(g_size):
        owns_gid = ej.owns_index(gid)
        if owns_gid:
            SetToOwnedGid(ej, gid, 1.)
        ej.apply("insert")
        A.mult(ej, xj)
        if owns_gid:
            val = GetFromOwnedGid(xj, gid)
            SetToOwnedGid(d, gid, val)
            SetToOwnedGid(ej, gid, 0.)
        ej.apply("insert")

    d.apply("insert")
Beispiel #6
0
def get_diagonal(A, d):
    """
    Compute the diagonal of the square operator :math:`A`.
    Use :code:`Solver2Operator` if :math:`A^{-1}` is needed.
    """
    ej, xj = Vector(d.mpi_comm()), Vector(d.mpi_comm())
    A.init_vector(ej,1)
    A.init_vector(xj,0)
                    
    g_size = ej.size()    
    d.zero()
    for gid in range(g_size):
        owns_gid = ej.owns_index(gid)
        if owns_gid:
            SetToOwnedGid(ej, gid, 1.)
        ej.apply("insert")
        A.mult(ej,xj)
        if owns_gid:
            val = GetFromOwnedGid(xj, gid)
            SetToOwnedGid(d, gid, val)
            SetToOwnedGid(ej, gid, 0.)
        ej.apply("insert")
        
    d.apply("insert")