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