def norm2diff_id_matrix(mvma, a, solveb, solvetransb, b, rows: int, cols: int) -> float: cmvma = libkrylov.CFuncMvmT(mvma) ca = a.as_voidp() csolveb = libkrylov.CFuncPrcdT(solveb) csolvetransb = libkrylov.CFuncPrcdT(solvetransb) cb = b.as_voidp() return libkrylov.norm2diff_id_pre_matrix(cmvma, ca, csolveb, csolvetransb, cb, rows, cols)
def norm2diff_pre_matrix(mvma, a, evalb, evaltransb, b, rows: int, cols: int) -> float: cmvma = libkrylov.CFuncMvmT(mvma) ca = a.as_voidp() cevalb = libkrylov.CFuncPrcdT(evalb) cevaltransb = libkrylov.CFuncPrcdT(evaltransb) cb = b.as_voidp() return libkrylov.norm2diff_pre_matrix(cmvma, ca, cevalb, cevaltransb, cb, rows, cols)
def step_puzawa(solve_a11, matrix_a11, mvm_a21, matrix_a21, prcd, pdata, b1: 'vec.AVector', b2: 'vec.AVector', x1: 'vec.AVector', x2: 'vec.AVector', r2: 'vec.AVector', q2: 'vec.AVector', p2: 'vec.AVector', a1: 'vec.AVector', s2: 'vec.AVector'): csolvea11 = libkrylov.CFuncPrcdT(solve_a11) cmatrixa11 = matrix_a11.as_voidp() cmvma21 = libkrylov.CFuncMvmT(mvm_a21) cmatrixa21 = matrix_a21.as_voidp() cprcd = libkrylov.CFuncPrcdT(prcd) cpdata = cast(pdata, c_void_p) libkrylov.step_puzawa(csolvea11, cmatrixa11, cmvma21, cmatrixa21, cprcd, cpdata, b1, b2, x1, x2, r2, q2, p2, a1, s2)
def step_pcg(addeval, matrix, prcd, pdata, b: 'vec.AVector', x: 'vec.AVector', r: 'vec.AVector', q: 'vec.AVector', p: 'vec.AVector', a: 'vec.AVector'): caddeval = libkrylov.CFuncAddevalT(addeval) cmatrix = matrix.as_voidp() cprcd = libkrylov.CFuncPrcdT(prcd) cpdata = cast(pdata, c_void_p) libkrylov.step_pcg(caddeval, cmatrix, cprcd, cpdata, b, x, r, q, p, a)
def solve_pcg_avector(a, addeval, prcd, pdata, b: 'vec.AVector', x: 'vec.AVector', eps: float, maxiter: int) -> int: ca = a.as_voidp() caddeval = libkrylov.CFuncAddevalT(addeval) cprcd = libkrylov.CFuncPrcdT(prcd) cpdata = cast(pdata, c_void_p) return libkrylovsolvers.solve_pcg_avector(ca, caddeval, cprcd, cpdata, b, x, eps, maxiter)
def step_uzawa(solve_a11, matrix_a11, mvm_a21, matrix_a21, b1: 'vec.AVector', b2: 'vec.AVector', x1: 'vec.AVector', x2: 'vec.AVector', r2: 'vec.AVector', p2: 'vec.AVector', a1: 'vec.AVector', s2: 'vec.AVector'): csolvea11 = libkrylov.CFuncPrcdT(solve_a11) cmatrixa11 = matrix_a11.as_voidp() cmvma21 = libkrylov.CFuncMvmT(mvm_a21) cmatrixa21 = matrix_a21.as_voidp() libkrylov.step_uzawa(csolvea11, cmatrixa11, cmvma21, cmatrixa21, b1, b2, x1, x2, r2, p2, a1, s2)
def finish_pgmres(addeval, matrix, prcd, pdata, b: 'vec.AVector', x: 'vec.AVector', rhat: 'vec.AVector', q: 'vec.AVector', kk: List[int], qr: 'mat.AMatrix', tau: 'vec.AVector'): caddeval = libkrylov.CFuncAddevalT(addeval) cmatrix = matrix.as_voidp() cprcd = libkrylov.CFuncPrcdT(prcd) cpdata = cast(pdata, c_void_p) ckk = pylist_to_ptr(kk, c_uint) libkrylov.finish_pgmres(caddeval, cmatrix, cprcd, cpdata, b, x, rhat, q, ckk, qr, tau)
def solve_pcg(a: matrix_union, prcd, pdata, b: 'vec.AVector', x: 'vec.AVector', eps: float, maxiter: int) -> int: verify_type(a, matrix_types) cprcd = libkrylov.CFuncPrcdT(prcd) cpdata = cast(pdata, c_void_p) if isinstance(a, mat.AMatrix): solve_func = libkrylovsolvers.solve_pcg_amatrix_avector elif isinstance(a, mat.SparseMatrix): solve_func = libkrylovsolvers.solve_pcg_sparsematrix_avector elif isinstance(a, mat.HMatrix): solve_func = libkrylovsolvers.solve_pcg_hmatrix_avector elif isinstance(a, mat.H2Matrix): solve_func = libkrylovsolvers.solve_pcg_h2matrix_avector elif isinstance(a, mat.DH2Matrix): solve_func = libkrylovsolvers.solve_pcg_dh2matrix_avector return solve_func(a, cprcd, cpdata, b, x, eps, maxiter)