Exemple #1
0
def evaluate_sparse_function_at_dofs(input_function, dofs_list, output_V=None, reduced_dofs_list=None):
    assert (output_V is None) == (reduced_dofs_list is None)
    if output_V is None:
        return evaluate_sparse_vector_at_dofs(input_function.vector(), dofs_list)
    else:
        vec = to_petsc4py(input_function.vector())
        output_function = Function(output_V)
        out = to_petsc4py(output_function.vector())
        _evaluate_sparse_function_at_dofs(vec, dofs_list, out, reduced_dofs_list)
        return output_function
Exemple #2
0
def evaluate_sparse_vector_at_dofs(sparse_vector, dofs_list):
    vec = to_petsc4py(sparse_vector)
    row_start, row_end = vec.getOwnershipRange()
    out_size = len(dofs_list)
    out = OnlineVector(out_size)
    mpi_comm = vec.comm.tompi4py()
    for (index, dofs) in enumerate(dofs_list):
        assert len(dofs) == 1
        i = dofs[0]
        out_index = None
        vec_i_processor = -1
        if i >= row_start and i < row_end:
            out_index = vec.getValue(i)
            vec_i_processor = mpi_comm.rank
        vec_i_processor = mpi_comm.allreduce(vec_i_processor, op=MAX)
        assert vec_i_processor >= 0
        out[index] = mpi_comm.bcast(out_index, root=vec_i_processor)
    return out
Exemple #3
0
def evaluate_and_vectorize_sparse_matrix_at_dofs(sparse_matrix, dofs_list):
    mat = to_petsc4py(sparse_matrix)
    row_start, row_end = mat.getOwnershipRange()
    out_size = len(dofs_list)
    out = OnlineVector(out_size)
    mpi_comm = mat.comm.tompi4py()
    for (index, dofs) in enumerate(dofs_list):
        assert len(dofs) == 2
        i = dofs[0]
        out_index = None
        mat_ij_processor = -1
        if i >= row_start and i < row_end:
            j = dofs[1]
            out_index = mat.getValue(i, j)
            mat_ij_processor = mpi_comm.rank
        mat_ij_processor = mpi_comm.allreduce(mat_ij_processor, op=MAX)
        assert mat_ij_processor >= 0
        out[index] = mpi_comm.bcast(out_index, root=mat_ij_processor)
    return out
Exemple #4
0
 def vectorized_matrix_inner_vectorized_matrix(matrix, other_matrix):
     matrix = to_petsc4py(matrix)
     other_matrix = to_petsc4py(other_matrix)
     # petsc4py does not expose MatGetTrace, we do this by hand
     return matrix.transposeMatMult(other_matrix).getDiagonal().sum()