1 #include <../../nrnconf.h>
52 static char rcsid[] =
"conjgrad.c,v 1.1 1997/12/04 17:55:16 hines Exp";
63 typedef VEC *(*MTX_FN)();
94 void *A_params, *M_params;
125 (*M_inv)(M_params,r,z);
140 q = (*A)(A_params,
p,
q);
186 VEC *
p, *
q, *r, *u, *
v, *tmp1, *tmp2;
187 Real alpha, beta, norm_b, rho, old_rho, sigma;
190 if ( !
A || ! x || ! b || ! r0 )
206 (*A)(A_params,x,tmp1);
212 while (
v_norm2(r) > tol*norm_b )
217 if ( old_rho == 0.0 )
233 (*A)(A_params,tmp1,tmp2);
272 VEC *u, *
v, *w, *tmp;
274 rho, rho_bar, rho_max, theta;
301 phi_bar = beta; rho_bar =
alpha;
320 rho =
sqrt(rho_bar*rho_bar+beta*beta);
335 }
while (
fabs(phi_bar*
alpha*
c) > tol*norm_b/rho_max );
VEC * lsqr(MTX_FN A, MTX_FN AT, void *A_params, VEC *b, double tol, VEC *x)
VEC * cgs(MTX_FN A, void *A_params, VEC *b, VEC *r0, double tol, VEC *x)
VEC * spCHsolve(SPMAT *, VEC *, VEC *)
int cg_set_maxiter(int numiter)
VEC * sp_pccg(SPMAT *A, SPMAT *LLT, VEC *b, double eps, VEC *x)
VEC * sp_lsqr(SPMAT *A, VEC *b, double tol, VEC *x)
VEC * pccg(MTX_FN A, void *A_params, MTX_FN M_inv, void *M_params, VEC *b, double eps, VEC *x)
VEC * sp_cgs(SPMAT *A, VEC *b, VEC *r0, double tol, VEC *x)
#define error(err_num, fn_name)
#define tracecatch(ok_part, function)
static Object ** v_add(void *v1)
static Object ** v_sub(void *v1)
static double v_get(void *v)
static Object ** v_resize(void *v)
VEC * v_mltadd(VEC *, VEC *, double, VEC *)
VEC * sv_mlt(double, VEC *, VEC *)
int const size_t const size_t n
static philox4x32_key_t k
VEC * sp_vm_mlt(SPMAT *A, VEC *x, VEC *out)
VEC * sp_mv_mlt(SPMAT *A, VEC *x, VEC *out)