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
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")
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")
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")