21 #include "common/common.h"
54 pastix_complex64_t *ws )
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;
98 pastix_complex64_t *ws )
105 assert( cblk->
cblktype & CBLK_LAYOUT_2D );
106 assert( lrblok != NULL );
108 for (; blok<lblok; blok++, lrblok++)
112 lrblok->
rkmax = nrows;
154 size_t size = lblok - blok;
157 assert( cblk->
cblktype & CBLK_LAYOUT_2D );
161 if ( LRblocks == NULL ) {
165 if (!pastix_atomic_cas_xxb( &(blok->
LRblock[0]), (uint64_t)NULL, (uint64_t)LRblocks,
sizeof(
void*) )) {
170 assert( LRblocks != NULL );
172 for (; blok<lblok; blok++)
176 blok->
LRblock[1] = LRblocks + size;
224 size_t coefnbr = cblk->
stride * ncols;
228 MALLOC_INTERN( cblk->
lcoeftab, coefnbr, pastix_complex64_t );
229 memset( cblk->
lcoeftab, 0, coefnbr *
sizeof(pastix_complex64_t) );
235 MALLOC_INTERN( cblk->
lcoeftab, 2 * coefnbr, pastix_complex64_t );
236 memset( cblk->
lcoeftab, 0, 2 * coefnbr *
sizeof(pastix_complex64_t) );
274 pastix_cblk_lock( cblk );
285 pastix_cblk_unlock( cblk );
290 if ( cblk->
cblktype & CBLK_COMPRESSED ) {
296 pastix_cblk_unlock( cblk );
323 pastix_cblk_lock( cblk );
326 if ( cblk->
cblktype & CBLK_COMPRESSED ) {
330 assert( blok->
LRblock[0] != NULL );
331 for (; blok<lblok; blok++) {
335 if ( cblk->
lcoeftab != (
void*)-1 ) {
346 if ( cblk->
cblktype & CBLK_COMPRESSED ) {
350 assert( blok->
LRblock[1] != NULL );
351 for (; blok<lblok; blok++) {
357 if ( (cblk->
cblktype & CBLK_COMPRESSED) &&
365 pastix_cblk_unlock( cblk );
394 const SolverMatrix *solvmtx,
395 const pastix_bcsc_t *bcsc,
396 pastix_int_t itercblk )
398 SolverCblk *solvcblk = solvmtx->cblktab + itercblk;
401 SolverBlok *lsolvblok = (solvcblk+1)->fblokptr;
402 pastix_complex64_t *lcoeftab = solvcblk->
lcoeftab;
403 pastix_complex64_t *ucoeftab = solvcblk->
ucoeftab;
404 pastix_complex64_t *Lvalues = bcsc->Lvalues;
405 pastix_complex64_t *Uvalues = bcsc->Uvalues;
406 pastix_int_t ldd = solvcblk->
stride;
407 pastix_int_t itercoltab, iterval, coefindx;
408 int is2d = solvcblk->
cblktype & CBLK_LAYOUT_2D;
410 assert( (side !=
PastixUCoef) || (ucoeftab != NULL) );
412 for (itercoltab=0; itercoltab<csccblk->
colnbr; itercoltab++)
414 pastix_int_t frow = csccblk->
coltab[itercoltab];
415 pastix_int_t lrow = csccblk->
coltab[itercoltab+1];
421 for (iterval=frow; iterval<lrow; iterval++)
423 pastix_int_t rownum = bcsc->rowtab[iterval];
424 #if !defined(NDEBUG) && defined(PASTIX_DEBUG_DUMP_COEFTAB)
425 if ( isnan( (
double)Lvalues[iterval] ) || isinf( (
double)Lvalues[iterval] ) ) {
426 printf(
"cpucblk_zfillin_fr: Lvalues not initialised correctly.\n" );
429 if ( isnan( (
double)Uvalues[iterval] ) || isinf( (
double)Uvalues[iterval] ) ) {
430 printf(
"cpucblk_zfillin_fr: Uvalues not initialised correctly.\n" );
435 if (rownum >= (solvcblk->
fcolnum+itercoltab))
437 while ((solvblok < lsolvblok) &&
438 ((solvblok->
lrownum < rownum) ||
447 if ( solvblok < lsolvblok )
450 coefindx += rownum - solvblok->
frownum;
451 coefindx += itercoltab * ldd;
452 pastix_cblk_lock( solvcblk );
454 pastix_cblk_unlock( solvcblk );
457 lcoeftab[coefindx] = Lvalues[iterval];
461 (rownum > (solvcblk->
fcolnum + itercoltab)) )
463 #if defined(PRECISION_z) || defined(PRECISION_c)
465 ucoeftab[coefindx] = conj(Uvalues[iterval]);
470 ucoeftab[coefindx] = Uvalues[iterval];
475 #if defined(PASTIX_DEBUG_COEFTAB)
476 fprintf(stderr,
"cpucblk_zfillin: drop coeff from CSC c=%ld(%ld) l=%ld(%ld) cblk=%ld fcol=%ld lcol=%ld\n",
477 (
long)solvcblk->
fcolnum + itercoltab, (
long)itercoltab,
478 (
long)rownum, (
long)iterval, (
long)itercblk,
513 const SolverMatrix *solvmtx,
514 const pastix_bcsc_t *bcsc,
515 pastix_int_t itercblk )
517 SolverCblk *solvcblk = solvmtx->cblktab + itercblk;
520 SolverBlok *lsolvblok = (solvcblk+1)->fblokptr;
521 pastix_complex64_t *lcoeftab, *ucoeftab;
522 pastix_complex64_t *Lvalues = bcsc->Lvalues;
523 pastix_complex64_t *Uvalues = bcsc->Uvalues;
524 pastix_int_t itercoltab, iterval, coefindx, ldd;
526 assert( solvcblk->
cblktype & CBLK_LAYOUT_2D );
528 for (itercoltab=0; itercoltab<csccblk->
colnbr; itercoltab++)
530 pastix_int_t frow = csccblk->
coltab[itercoltab];
531 pastix_int_t lrow = csccblk->
coltab[itercoltab+1];
535 lcoeftab = (pastix_complex64_t*)(solvblok->
LRblock[0]->
u);
536 ucoeftab = (pastix_complex64_t*)(solvblok->
LRblock[1]->
u);
538 for (iterval=frow; iterval<lrow; iterval++)
540 pastix_int_t rownum = bcsc->rowtab[iterval];
543 if ( isnan( (
double)Lvalues[iterval] ) || isinf( (
double)Lvalues[iterval] ) ) {
544 printf(
"cpucblk_zfillin_lr: Lvalues not initialised correctly.\n" );
547 if ( isnan( (
double)Uvalues[iterval] ) || isinf( (
double)Uvalues[iterval] ) ) {
548 printf(
"cpucblk_zfillin_lr: Uvalues not initialised correctly.\n" );
553 if (rownum >= (solvcblk->
fcolnum+itercoltab))
555 while ((solvblok < lsolvblok) &&
556 ((solvblok->
lrownum < rownum) ||
561 lcoeftab = (pastix_complex64_t*)(solvblok->
LRblock[0]->
u);
562 ucoeftab = (pastix_complex64_t*)(solvblok->
LRblock[1]->
u);
565 if ( solvblok < lsolvblok )
567 coefindx = rownum - solvblok->
frownum;
568 coefindx += itercoltab * ldd;
569 pastix_cblk_lock( solvcblk );
571 pastix_cblk_unlock( solvcblk );
574 lcoeftab[coefindx] = Lvalues[iterval];
578 (rownum > (solvcblk->
fcolnum + itercoltab)) )
580 #if defined(PRECISION_z) || defined(PRECISION_c)
582 ucoeftab[coefindx] = conj(Uvalues[iterval]);
585 ucoeftab[coefindx] = Uvalues[iterval];
589 #if defined(PASTIX_DEBUG_COEFTAB)
590 fprintf(stderr,
"cpucblk_zfillin: drop coeff from CSC c=%ld(%ld) l=%ld(%ld) cblk=%ld fcol=%ld lcol=%ld\n",
591 (
long)solvcblk->
fcolnum + itercoltab, (
long)itercoltab,
592 (
long)rownum, (
long)iterval, (
long)itercblk,
627 const SolverMatrix *solvmtx,
628 const pastix_bcsc_t *bcsc,
629 pastix_int_t itercblk )
631 if ( (solvmtx->cblktab + itercblk)->cblktype & CBLK_COMPRESSED ) {
static void cpucblk_zfillin_lr(pastix_coefside_t side, const SolverMatrix *solvmtx, const pastix_bcsc_t *bcsc, pastix_int_t itercblk)
Initialize the low-rank coeftab structure from the internal bcsc.
void cpublok_zalloc_lrws(const SolverCblk *cblk, const SolverBlok *blok, pastix_lrblock_t *lrblok, pastix_complex64_t *ws)
Initialize a lrblock structure from a workspace from a specific block to the end of all blocks.
static void cpucblk_zfillin_fr(pastix_coefside_t side, const SolverMatrix *solvmtx, const pastix_bcsc_t *bcsc, pastix_int_t itercblk)
Initialize the full-rank coeftab structure from the internat bcsc.
Compressed colptr format for the bcsc.
void cpucblk_zalloc(pastix_coefside_t side, SolverCblk *cblk)
Allocate the cblk structure to store the coefficient.
void cpucblk_zalloc_fr(pastix_coefside_t side, SolverCblk *cblk)
Allocate the cblk structure to store the coefficient.
void cpucblk_zalloc_lr(pastix_coefside_t side, SolverCblk *cblk, int rkmax)
Allocate the cblk structure to store the coefficient.
void cpucblk_zfree(pastix_coefside_t side, SolverCblk *cblk)
Free the cblk structure that store the coefficient.
void cpucblk_zalloc_lrws(const SolverCblk *cblk, pastix_lrblock_t *lrblok, pastix_complex64_t *ws)
Initialize lrblock structure from a workspace from all blocks of the cblk associated.
void cpucblk_zfillin(pastix_coefside_t side, const SolverMatrix *solvmtx, const pastix_bcsc_t *bcsc, pastix_int_t itercblk)
Initialize the coeftab structure from the internal bcsc.
The block low-rank structure to hold a matrix in low-rank form.
void core_zlrfree(pastix_lrblock_t *A)
Free a low-rank matrix.
void core_zlralloc(pastix_int_t M, pastix_int_t N, pastix_int_t rkmax, pastix_lrblock_t *A)
Allocate a low-rank matrix.
enum pastix_coefside_e pastix_coefside_t
Data blocks used in the kernel.
static pastix_int_t blok_rownbr(const SolverBlok *blok)
Compute the number of rows of a block.
static pastix_int_t cblk_colnbr(const SolverCblk *cblk)
Compute the number of columns in a column block.
pastix_lrblock_t * LRblock[2]
Solver column block structure.