92 PORD_INT *marker, *mergelink, *indices, *tmp, *xnzl, *xnzlsub, *nzlsub;
93 PORD_INT neqs, maxmem, u, v, col, mergecol, knz, mrk, beg,
end;
94 PORD_INT fast, len, k, p, e, i, istart, istop;
106 for (k = 0; k < neqs; k++)
107 marker[k] = mergelink[k] = -1;
123 for (k = 0; k < neqs; k++)
127 if ((mergecol = mergelink[k]) != -1)
128 { mrk = marker[mergecol];
141 istop = G->
xadj[u+1];
142 for (i = istart; i < istop; i++)
144 if ((col = perm[v]) > k)
145 { indices[knz++] = col;
146 if (marker[col] != mrk) fast =
FALSE;
153 if ((fast) && (mergelink[mergecol] == -1))
154 { xnzlsub[k] = xnzlsub[mergecol] + 1;
155 knz = xnzl[mergecol+1] - xnzl[mergecol] - 1;
158 {
for (i = 0; i < knz; i++)
159 marker[indices[i]] = k;
160 while (mergecol != -1)
161 { len = xnzl[mergecol+1] - xnzl[mergecol];
162 istart = xnzlsub[mergecol];
163 istop = istart + len;
164 for (i = istart; i < istop; i++)
166 if ((col > k) && (marker[col] != k))
167 { indices[knz++] = col;
171 mergecol = mergelink[mergecol];
186 for (i = beg; i <
end; i++)
187 nzlsub[i] = indices[len++];
196 mergelink[k] = mergelink[e];
199 xnzl[k+1] = xnzl[k] + knz;
205 free(marker); free(indices);
206 free(tmp); free(mergelink);
211 css->
nind = xnzlsub[neqs-1] + 1;
224 PORD_INT *xnzf, *nzfsub, *ncolfactor, *xnzl, *xnzlsub;
225 PORD_INT nind, nvtx, K, beg, knz, firstcol, col;
228 xnzf = frontsub->
xnzf;
229 nzfsub = frontsub->
nzfsub;
230 nind = frontsub->
nind;
250 knz = xnzf[K+1] - beg;
251 firstcol = nzfsub[beg];
252 for (col = firstcol; col < firstcol + ncolfactor[K]; col++)
253 { xnzlsub[col] = beg++;
254 xnzl[col+1] = xnzl[col] + knz--;
277 frontsub->
nind = nind;
289 free(frontsub->
xnzf);
300 PORD_INT *xnzf, *nzfsub, *ncolfactor, *ncolupdate, *parent;
304 xnzf = frontsub->
xnzf;
305 nzfsub = frontsub->
nzfsub;
313 printf(
"#fronts %d, root %d\n", nfronts,
root);
315 { printf(
"--- front %d, ncolfactor %d, ncolupdate %d, parent %d\n",
316 K, ncolfactor[K], ncolupdate[K], parent[K]);
320 for (i = istart; i < istop; i++)
321 { printf(
"%5d", nzfsub[i]);
322 if ((++count % 16) == 0)
325 if ((count % 16) != 0)
336 PORD_INT *ncolfactor, *ncolupdate, *firstchild, *silbings, *vtx2front;
337 PORD_INT *xnza, *nzasub, *xnzf, *nzfsub;
338 PORD_INT *marker, *tmp, *first, *indices;
339 PORD_INT nvtx, nfronts, col, firstcol, knz;
359 for (i = 0; i < nvtx; i++)
365 for (u = nvtx-1; u >= 0; u--)
374 xnzf = frontsub->
xnzf;
375 nzfsub = frontsub->
nzfsub;
378 for (K = 0; K < nfronts; K++)
380 knz += (ncolfactor[K] + ncolupdate[K]);
389 indices = nzfsub + xnzf[K];
395 for (col = firstcol; col < firstcol + ncolfactor[K]; col++)
396 { indices[knz++] = col;
403 for (J = firstchild[K]; J != -1; J = silbings[J])
406 for (i = istart; i < istop; i++)
408 if ((col > firstcol) && (marker[col] != K))
410 indices[knz++] = col;
418 for (u = 0; u < ncolfactor[K]; u++)
419 { istart = xnza[firstcol + u];
420 istop = xnza[firstcol + u + 1];
421 for (i = istart; i < istop; i++)
423 if ((col > firstcol) && (marker[col] != K))
425 indices[knz++] = col;
439 free(marker); free(tmp); free(first);
482 PORD_INT neqs, nelem, nind, k, ksub, i, istart, istop;
494 printf(
"#equations %d, #elements (+diag.) %d, #indices (+diag.) %d\n",
496 for (k = 0; k < neqs; k++)
497 { printf(
"--- column %d\n", k);
501 for (i = istart; i < istop; i++)
502 printf(
" row %5d, entry %e\n", nzlsub[ksub++], nzl[i]);
515 FLOAT *nzl, *nza, *diag;
516 PORD_INT *xnzl, *nzlsub, *xnzlsub, *xnza, *nzasub, *xnzf, *nzfsub;
517 PORD_INT nelem, K, k, kstart, h, hstart, dis, i, istart, istop;
530 xnzf = frontsub->
xnzf;
531 nzfsub = frontsub->
nzfsub;
541 for (i = 0; i < nelem; i++)
548 { firstcol = nzfsub[xnzf[K]];
549 lastcol = firstcol + ncolfactor[K];
550 for (k = firstcol; k < lastcol; k++)
556 for (i = istart; i < istop; i++)
557 {
for (; nzlsub[h] != nzasub[i]; h++);
559 nzl[kstart+dis] = nza[i];
561 nzl[kstart] = diag[k];
575 FLOAT *nzl, *nza, *diag, *entriesL;
576 PORD_INT *xnzl, *xnza, *nzasub, *xnzf, *nzfsub;
577 PORD_INT *tmp, neqs, nelem, K, k, len, row, i, istart, istop;
588 xnzf = frontsub->
xnzf;
589 nzfsub = frontsub->
nzfsub;
605 for (i = 0; i < nelem; i++)
615 for (i = istart; i < istop; i++)
616 tmp[nzfsub[i]] = len++;
618 firstcol = nzfsub[istart];
619 lastcol = firstcol + ncolfactor[K];
620 entriesL = nzl + xnzl[firstcol];
621 for (k = firstcol; k < lastcol; k++)
624 for (i = istart; i < istop; i++)
626 entriesL[tmp[row]] = nza[i];
628 entriesL[tmp[k]] = diag[k];
end[inform, rinform, sol, inst, schur, redrhs, pivnul_list, sym_perm, uns_perm, icntl, cntl, colsca_out, rowsca_out, keep_out, dkeep_out]
#define myrealloc(ptr, nr, type)
#define mymalloc(ptr, nr, type)
void qsortUpInts(PORD_INT, PORD_INT *, PORD_INT *)
PORD_INT nextPostorder(elimtree_t *, PORD_INT)
PORD_INT nFactorIndices(elimtree_t *)
PORD_INT firstPostorder(elimtree_t *)
void freeElimTree(elimtree_t *)
void initFactorMtx(factorMtx_t *L, inputMtx_t *PAP)
css_t * setupCSSFromGraph(graph_t *G, PORD_INT *perm, PORD_INT *invp)
css_t * newCSS(PORD_INT neqs, PORD_INT nind, PORD_INT owned)
void printFrontSubscripts(frontsub_t *frontsub)
void freeFrontSubscripts(frontsub_t *frontsub)
frontsub_t * setupFrontSubscripts(elimtree_t *PTP, inputMtx_t *PAP)
void freeFactorMtx(factorMtx_t *L)
void initFactorMtxNEW(factorMtx_t *L, inputMtx_t *PAP)
factorMtx_t * newFactorMtx(PORD_INT nelem)
css_t * setupCSSFromFrontSubscripts(frontsub_t *frontsub)
frontsub_t * newFrontSubscripts(elimtree_t *PTP)
void printFactorMtx(factorMtx_t *L)
struct _frontsub frontsub_t
struct _factorMtx factorMtx_t
struct _inputMtx inputMtx_t
struct _elimtree elimtree_t