21 #include "common/common.h"
57 pastix_int_t fcblknm = blok->
fcblknm;
61 assert( cblk->
cblktype & CBLK_LAYOUT_2D );
62 assert( lrblok != NULL );
64 for (; (blok < lblok) && (blok->
fcblknm == fcblknm); blok++, lrblok++)
68 lrblok->
rkmax = nrows;
105 assert( cblk->
cblktype & CBLK_LAYOUT_2D );
106 assert( lrblok != NULL );
108 for (; blok<lblok; blok++, lrblok++)
112 lrblok->
rkmax = nrows;
151 size_t size = lblok - blok;
154 assert( cblk->
cblktype & CBLK_LAYOUT_2D );
156 LRblocks = blok->LRblock[0];
158 if ( LRblocks == NULL ) {
162 if (!pastix_atomic_cas_xxb( &(blok->LRblock[0]), (uint64_t)NULL, (uint64_t)LRblocks,
sizeof(
void*) )) {
164 LRblocks = blok->LRblock[0];
167 assert( LRblocks != NULL );
169 for (; blok<lblok; blok++)
172 blok->LRblock[0] = LRblocks;
173 blok->LRblock[1] = LRblocks + size;
221 size_t coefnbr = cblk->
stride * ncols;
225 MALLOC_INTERN( cblk->
lcoeftab, coefnbr,
double );
226 memset( cblk->
lcoeftab, 0, coefnbr *
sizeof(
double) );
232 MALLOC_INTERN( cblk->
lcoeftab, 2 * coefnbr,
double );
233 memset( cblk->
lcoeftab, 0, 2 * coefnbr *
sizeof(
double) );
271 pastix_cblk_lock( cblk );
282 pastix_cblk_unlock( cblk );
287 if ( cblk->
cblktype & CBLK_COMPRESSED ) {
293 pastix_cblk_unlock( cblk );
320 pastix_cblk_lock( cblk );
323 if ( cblk->
cblktype & CBLK_COMPRESSED ) {
327 assert( blok->
LRblock[0] != NULL );
328 for (; blok<lblok; blok++) {
332 if ( cblk->
lcoeftab != (
void*)-1 ) {
343 if ( cblk->
cblktype & CBLK_COMPRESSED ) {
347 assert( blok->
LRblock[1] != NULL );
348 for (; blok<lblok; blok++) {
354 if ( (cblk->
cblktype & CBLK_COMPRESSED) &&
362 pastix_cblk_unlock( cblk );
391 const SolverMatrix *solvmtx,
393 pastix_int_t itercblk )
395 SolverCblk *solvcblk = solvmtx->cblktab + itercblk;
398 SolverBlok *lsolvblok = (solvcblk+1)->fblokptr;
399 double *lcoeftab = solvcblk->
lcoeftab;
400 double *ucoeftab = solvcblk->
ucoeftab;
401 double *Lvalues = bcsc->
Lvalues;
402 double *Uvalues = bcsc->
Uvalues;
403 pastix_int_t ldd = solvcblk->
stride;
404 pastix_int_t itercoltab, iterval, coefindx;
405 int is2d = solvcblk->
cblktype & CBLK_LAYOUT_2D;
407 assert( (side !=
PastixUCoef) || (ucoeftab != NULL) );
409 for (itercoltab=0; itercoltab<csccblk->
colnbr; itercoltab++)
411 pastix_int_t frow = csccblk->
coltab[itercoltab];
412 pastix_int_t lrow = csccblk->
coltab[itercoltab+1];
418 for (iterval=frow; iterval<lrow; iterval++)
420 pastix_int_t rownum = bcsc->
rowtab[iterval];
423 if (rownum >= (solvcblk->
fcolnum+itercoltab))
425 while ((solvblok < lsolvblok) &&
426 ((solvblok->
lrownum < rownum) ||
435 if ( solvblok < lsolvblok )
438 coefindx += rownum - solvblok->
frownum;
439 coefindx += itercoltab * ldd;
440 pastix_cblk_lock( solvcblk );
442 pastix_cblk_unlock( solvcblk );
445 lcoeftab[coefindx] = Lvalues[iterval];
449 (rownum > (solvcblk->
fcolnum + itercoltab)) )
451 #if defined(PRECISION_z) || defined(PRECISION_c)
453 ucoeftab[coefindx] = (Uvalues[iterval]);
458 ucoeftab[coefindx] = Uvalues[iterval];
463 #if defined(PASTIX_DEBUG_COEFTAB)
464 fprintf(stderr,
"cpucblk_dfillin: drop coeff from CSC c=%ld(%ld) l=%ld(%ld) cblk=%ld fcol=%ld lcol=%ld\n",
465 (
long)solvcblk->
fcolnum + itercoltab, (
long)itercoltab,
466 (
long)rownum, (
long)iterval, (
long)itercblk,
501 const SolverMatrix *solvmtx,
503 pastix_int_t itercblk )
505 SolverCblk *solvcblk = solvmtx->cblktab + itercblk;
508 SolverBlok *lsolvblok = (solvcblk+1)->fblokptr;
509 double *lcoeftab, *ucoeftab;
510 double *Lvalues = bcsc->
Lvalues;
511 double *Uvalues = bcsc->
Uvalues;
512 pastix_int_t itercoltab, iterval, coefindx, ldd;
514 assert( solvcblk->
cblktype & CBLK_LAYOUT_2D );
516 for (itercoltab=0; itercoltab<csccblk->
colnbr; itercoltab++)
518 pastix_int_t frow = csccblk->
coltab[itercoltab];
519 pastix_int_t lrow = csccblk->
coltab[itercoltab+1];
523 lcoeftab = (
double*)(solvblok->
LRblock[0]->
u);
524 ucoeftab = (
double*)(solvblok->
LRblock[1]->
u);
526 for (iterval=frow; iterval<lrow; iterval++)
528 pastix_int_t rownum = bcsc->
rowtab[iterval];
531 if (rownum >= (solvcblk->
fcolnum+itercoltab))
533 while ((solvblok < lsolvblok) &&
534 ((solvblok->
lrownum < rownum) ||
539 lcoeftab = (
double*)(solvblok->
LRblock[0]->
u);
540 ucoeftab = (
double*)(solvblok->
LRblock[1]->
u);
543 if ( solvblok < lsolvblok )
545 coefindx = rownum - solvblok->
frownum;
546 coefindx += itercoltab * ldd;
547 pastix_cblk_lock( solvcblk );
549 pastix_cblk_unlock( solvcblk );
552 lcoeftab[coefindx] = Lvalues[iterval];
556 (rownum > (solvcblk->
fcolnum + itercoltab)) )
558 #if defined(PRECISION_z) || defined(PRECISION_c)
560 ucoeftab[coefindx] = (Uvalues[iterval]);
563 ucoeftab[coefindx] = Uvalues[iterval];
567 #if defined(PASTIX_DEBUG_COEFTAB)
568 fprintf(stderr,
"cpucblk_dfillin: drop coeff from CSC c=%ld(%ld) l=%ld(%ld) cblk=%ld fcol=%ld lcol=%ld\n",
569 (
long)solvcblk->
fcolnum + itercoltab, (
long)itercoltab,
570 (
long)rownum, (
long)iterval, (
long)itercblk,
605 const SolverMatrix *solvmtx,
607 pastix_int_t itercblk )
609 if ( (solvmtx->cblktab + itercblk)->cblktype & CBLK_COMPRESSED ) {