Пример #1
0
def assemble_vector(L,
                    a,
                    bcs: typing.List[DirichletBC],
                    block_type: cpp.fem.BlockType,
                    scale: float = 1.0) -> cpp.la.PETScVector:
    """Assemble linear form into vector"""
    L_cpp = [_create_cpp_form(form) for form in L]
    a_cpp = [[_create_cpp_form(form) for form in row] for row in a]
    return cpp.fem.assemble_blocked_vector(L_cpp, a_cpp, bcs, block_type,
                                           scale)
Пример #2
0
def _assemble_matrix(A: cpp.la.PETScMatrix, a, bcs=[]) -> cpp.la.PETScMatrix:
    """Re-assemble bilinear form into a vector, with rows and columns with Dirichlet
    boundary conditions zeroed.

    """
    try:
        a_cpp = [[_create_cpp_form(form) for form in row] for row in a]
    except TypeError:
        a_cpp = [[_create_cpp_form(a)]]
    cpp.fem.reassemble_blocked_matrix(A, a_cpp, bcs)
    return A
Пример #3
0
def reassemble_vector(b: PETSc.Vec,
                      L,
                      a=[],
                      bcs: typing.List[DirichletBC] = [],
                      x0: typing.Optional[PETSc.Vec] = None,
                      scale: float = 1.0) -> PETSc.Vec:
    """Re-assemble linear forms into a block vector, with modification for Dirichlet
    boundary conditions

    """
    L_cpp = [_create_cpp_form(form) for form in L]
    a_cpp = [[_create_cpp_form(form) for form in row] for row in a]
    cpp.fem.reassemble_vector(b, L_cpp, a_cpp, bcs, x0, scale)
    return b
Пример #4
0
def assemble_vector_block(L: typing.List[typing.Union[Form, cpp.fem.Form]],
                          a,
                          bcs: typing.List[DirichletBC],
                          x0: typing.Optional[PETSc.Vec] = None,
                          scale: float = 1.0) -> PETSc.Vec:
    """Assemble linear forms into a monolithic vector. The vector is not
    zeroed and it is not finalised, i.e. ghost values are not
    accumulated.

    """
    L_cpp = [_create_cpp_form(form) for form in L]
    a_cpp = [[_create_cpp_form(form) for form in row] for row in a]
    b = cpp.fem.create_vector(L_cpp)
    cpp.fem.assemble_vector(b, L_cpp, a_cpp, bcs, x0, scale)
    return b
Пример #5
0
def assemble_matrix(a,
                    bcs: typing.List[DirichletBC],
                    block_type,
                    diagonal: float = 1.0) -> cpp.la.PETScMatrix:
    """Assemble bilinear forms into matrix"""
    a_cpp = [[_create_cpp_form(form) for form in row] for row in a]
    return cpp.fem.assemble_blocked_matrix(a_cpp, bcs, block_type, diagonal)
Пример #6
0
def _assemble_vector(b: cpp.la.PETScVector,
                     L,
                     a=[],
                     bcs: typing.List[DirichletBC] = [],
                     scale: float = 1.0) -> cpp.la.PETScVector:
    """Re-assemble linear form into a vector, with modification for Dirichlet
    boundary conditions

    """
    try:
        L_cpp = [_create_cpp_form(form) for form in L]
        a_cpp = [[_create_cpp_form(form) for form in row] for row in a]
    except TypeError:
        L_cpp = [_create_cpp_form(L)]
        a_cpp = [[_create_cpp_form(form) for form in a]]

    cpp.fem.reassemble_blocked_vector(b, L_cpp, a_cpp, bcs, scale)
    return b
Пример #7
0
def assemble_matrix_block(a,
                          bcs: typing.List[DirichletBC],
                          diagonal: float = 1.0) -> PETSc.Mat:
    """Assemble bilinear forms into matrix"""
    a_cpp = [[_create_cpp_form(form) for form in row] for row in a]
    A = cpp.fem.create_matrix_block(a_cpp)
    A.zeroEntries()
    cpp.fem.assemble_blocked_matrix(A, a_cpp, bcs, diagonal)
    return A
Пример #8
0
def apply_lifting(b: PETSc.Vec,
                  a: typing.List[typing.Union[Form, cpp.fem.Form]],
                  bcs: typing.List[typing.List[DirichletBC]],
                  x0: typing.Optional[typing.List[PETSc.Vec]] = [],
                  scale: float = 1.0) -> None:
    """Modify vector for lifting of Dirichlet boundary conditions.

    """
    a_cpp = [_create_cpp_form(form) for form in a]
    cpp.fem.apply_lifting(b, a_cpp, bcs, x0, scale)
Пример #9
0
def _(b: PETSc.Vec, L: typing.Union[Form, cpp.fem.Form]) -> PETSc.Vec:
    """Re-assemble linear form into a vector.

    The vector is not zeroed and it is not finalised, i.e. ghost values
    are not accumulated.

    """
    L_cpp = _create_cpp_form(L)
    cpp.fem.assemble_vector(b, L_cpp)
    return b
Пример #10
0
def assemble_vector(L: typing.Union[Form, cpp.fem.Form]) -> PETSc.Vec:
    """Assemble linear form into a vector. The returned vector is not
    finalised, i.e. ghost values are not accumulated.

    """
    L_cpp = _create_cpp_form(L)
    b = cpp.la.create_vector(L_cpp.function_space(0).dofmap().index_map())
    with b.localForm() as b_local:
        b_local.set(0.0)
    cpp.fem.assemble_vector(b, L_cpp)
    return b
Пример #11
0
def _(A,
      a,
      bcs: typing.List[DirichletBC] = [],
      diagonal: float = 1.0) -> PETSc.Mat:
    """Assemble bilinear form into a matrix. The returned matrix is not
    finalised, i.e. ghost values are not accumulated.

    """
    a_cpp = _create_cpp_form(a)
    cpp.fem.assemble_matrix(A, a_cpp, bcs, diagonal)
    return A
Пример #12
0
def _(b: PETSc.Vec, L: typing.Union[Form, cpp.fem.Form]) -> PETSc.Vec:
    """Assemble linear form into an existing vector.

    The vector must already have the correct size and parallel layout
    and wll be zeroed. The returned vector is finalised, i.e. ghost
    values accumulated across MPI processes.

    """
    L_cpp = _create_cpp_form(L)
    with b.localForm() as b_local:
        b_local.set(0.0)
    cpp.fem.assemble_vector(b, L_cpp)
    b.ghostUpdate(addv=PETSc.InsertMode.ADD, mode=PETSc.ScatterMode.REVERSE)
    return b
Пример #13
0
def _(A: PETSc.Mat,
      a: typing.Union[Form, cpp.fem.Form],
      bcs=[],
      diagonal: float = 1.0) -> PETSc.Mat:
    """Assemble bilinear form into an exiting matrix. The matrix is
    zeroed before assembly. Rows and columns of the matrix with
    Dirichlet boundary conditions zeroed, and ``scalar`` is placed on
    the diagonal for entries with a Dirichlet boundary condition.

    The matrix finalised, i.e. ghost values accumulated across MPI
    processes.

    """
    A.zeroEntries()
    a_cpp = _create_cpp_form(a)
    cpp.fem.assemble_matrix(A, a_cpp, bcs, diagonal)
    A.assemble()
    return A
Пример #14
0
def assemble(
    M: typing.Union[Form, cpp.fem.Form]
) -> typing.Union[PETSc.ScalarType, PETSc.Mat, PETSc.Vec]:
    """Assemble a variational form over mesh.

    The returned object is finalised, i.e. accumulated across MPI
    processes.

    """
    _M = _create_cpp_form(M)
    if _M.rank() == 0:
        return cpp.fem.assemble_scalar(_M)
    elif _M.rank() == 1:
        b = cpp.la.create_vector(_M.function_space(0).dofmap().index_map())
        assemble(b, _M)
        return b
    elif _M.rank() == 2:
        A = cpp.fem.create_matrix(_M)
        assemble(A, _M)
        return A
    else:
        raise RuntimeError("Form rank not supported by assembler.")
Пример #15
0
def assemble(
    M: typing.Union[Form, cpp.fem.Form]
) -> typing.Union[float, cpp.la.PETScMatrix, cpp.la.PETScVector]:
    """Assemble a form over mesh"""
    M_cpp = _create_cpp_form(M)
    return cpp.fem.assemble(M_cpp)