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