extern "C" { #include "ldl.h" #include "amd.h" } struct NRldl { Doub Info [AMD_INFO]; Int lnz,n,nz; VecInt PP,PPinv,PPattern,LLnz,LLp,PParent,FFlag,*LLi; VecDoub YY,DD,*LLx; Doub *Ax, *Lx, *B, *D, *X, *Y; Int *Ai, *Ap, *Li, *Lp, *P, *Pinv, *Flag,*Pattern, *Lnz, *Parent; NRldl(NRsparseMat &adat); void order(); void factorize(); void solve(VecDoub_O &y,VecDoub &rhs); ~NRldl(); }; Doub dotprod(VecDoub_I &x, VecDoub_I &y) { Doub sum=0.0; for (Int i=0;i::max(); Int i,j,iter,status; Int m=a.nrows; Int n=a.ncols; VecDoub y(m),z(n),ax(m),aty(n),rp(m),rd(n),d(n),dx(n),dy(m),dz(n), rhs(m),tempm(m),tempn(n); NRsparseMat at=a.transpose(); ADAT adat(a,at); NRldl solver(adat.ref()); solver.order(); Doub rpfact=1.0+sqrt(dotprod(b,b)); Doub rdfact=1.0+sqrt(dotprod(c,c)); for (j=0;j 1000*normrp_old && normrp > EPS) return status=1; if (normrd > 1000*normrd_old && normrd > EPS) return status=2; for (j=0;j