Esempio n. 1
0
def nonzero_values(function):
    serialized_vector = Vector(MPI.COMM_SELF)
    function.vector().gather(
        serialized_vector, array(range(function.function_space().dim()),
                                 "intc"))
    indices = nonzero(serialized_vector.get_local())
    return sort(serialized_vector.get_local()[indices])
Esempio n. 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
Esempio n. 3
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