import numpy as np
from blocksolver import blqmr
from scipy.sparse import diags
n = 5000
A = diags([-1, 4+0.1j, -1], [-1, 0, 1], shape=(n, n), dtype=complex)
B = np.random.randn(n, 16) + 0j
result = blqmr(A, B, tol=1e-10, precond_type='diag')
print(f"Converged: {result.converged}")
n = 5000;
K = spdiags([-ones(n,1) 4*ones(n,1) -ones(n,1)], -1:1, n, n);
A = K + 0.1i * speye(n);
B = rand(n, 16) + 1i*rand(n, 16);
opt.precond = 'diag';
[X, flag] = blqmr(A, B, 1e-10, 1000, [], [], [], opt);
program solve_fem
use blit_blqmr_real
implicit none
type(BLQMRSolver) :: qmr
integer :: n, nnz, nrhs
integer, allocatable :: Ap(:), Ai(:)
real(8), allocatable :: Ax(:), B(:,:), X(:,:)
n = 5000; nnz = 14998; nrhs = 16
call BLQMRCreate(qmr, n)
qmr%maxit = 1000
qmr%qtol = 1.0d-10
qmr%pcond_type = 3
call BLQMRPrep(qmr, Ap, Ai, Ax, nnz)
call BLQMRSolve(qmr, Ap, Ai, Ax, nnz, X, B, nrhs)
call BLQMRDestroy(qmr)
end program
#include "blit_solvers.h"
int main() {
const int n = 5000, nnz = 14998, nrhs = 16;
std::vector<int> Ap(n+1), Ai(nnz);
std::vector<double> Ax(nnz), b(n*nrhs), x(n*nrhs);
BlitBLQMR<double> solver(n, nrhs, 1000, 1e-3);
solver.Prepare(Ap.data(), Ai.data(), Ax.data(), nnz);
solver.Solve(x.data(), b.data(), nrhs);
return 0;
}