12 #define sparse_cholesky_factor PREFIXED_NAME(sparse_cholesky_factor)
13 #define sparse_cholesky_solve PREFIXED_NAME(sparse_cholesky_solve )
14 #define sparse_cholesky_free PREFIXED_NAME(sparse_cholesky_free )
56 uint p=Arp[
i], pe=Arp[i+1];
57 visit[
i]=
i, parent[
i]=
n;
59 uint j=Aj[
p];
if(j>=i)
break;
60 for(;visit[j]!=
i;j=parent[j]) {
62 if(parent[j]==n) { parent[j]=
i;
break; }
72 uint p=Arp[
i], pe=Arp[i+1], count=0, *Ljr=&Lj[Lrp[
i]];
75 uint j=Aj[
p];
if(j>=i)
break;
76 for(;visit[j]!=
i;j=parent[j]) Ljr[count++]=j, visit[j]=i;
79 Lrp[i+1]=Lrp[
i]+count;
108 uint *visit,
double *
y)
118 uint p,pe;
double a=0;
120 for(p=Lrp[i],pe=Lrp[i+1];p!=pe;++
p) {
121 uint j=Lj[
p]; y[j]=0, visit[j]=
i;
123 for(p=Arp[i],pe=Arp[i+1];p!=pe;++
p) {
125 if(j>=i) {
if(j==i) a=A[
p];
break; }
128 for(p=Lrp[i],pe=Lrp[i+1];p!=pe;++
p) {
129 uint q,qe,j=Lj[
p];
double lij,yj=y[j];
130 for(q=Lrp[j],qe=Lrp[j+1];q!=qe;++q) {
131 uint k=Lj[q];
if(visit[k]==i) yj+=L[q]*y[k];
146 const double *L=fac->
L, *
D=fac->
D;
150 for(p=Lrp[i],pe=Lrp[i+1];p!=pe;++
p) xi+=L[p]*x[Lj[p]];
153 for(i=0;i<
n;++
i) x[i]*=
D[i];
156 for(p=Lrp[i],pe=Lrp[i+1];p!=pe;++
p) x[Lj[p]]+=L[p]*xi;
164 const uint n_uints_as_dbls = (n*
sizeof(
uint)+
sizeof(
double)-1)/
sizeof(
double);
173 free(fac->
D); fac->
L =fac->
D =0;
void sortv(T *out, const T *A, uint n, unsigned stride, buffer *restrict buf)
#define tmalloc(type, count)
static void factor_numeric(uint n, const uint *Arp, const uint *Aj, const double *A, struct sparse_cholesky *out, uint *visit, double *y)
#define buffer_reserve(b, max)
#define sparse_cholesky_solve
static void factor_symbolic(uint n, const uint *Arp, const uint *Aj, struct sparse_cholesky *out, buffer *buf)
#define sparse_cholesky_free
#define sparse_cholesky_factor
establishes some macros to establish naming conventions
static double y[NR *NS *NT *N]