22 #include "common/common.h"
29 #ifndef DOXYGEN_SHOULD_SKIP_THIS
30 #if defined(PRECISION_zc)
31 #define cpucblk_dscheck_overflow( value, overflow ) \
33 double rvalue = fabs( creal( value ) ); \
34 double ivalue = fabs( cimag( value ) ); \
35 if ( pastix_unlikely( (rvalue > overflow) || (ivalue > overflow) ) ) { \
36 pastix_print_warning( "cpucblk_dscheck_overflow, Incorrect value overflow for mixed precision" ); \
41 #define cpucblk_dscheck_overflow( value, overflow ) \
43 double valabs = fabs( value ); \
44 if ( pastix_unlikely( valabs > overflow ) ) { \
45 pastix_print_warning( "cpucblk_dscheck_overflow, Incorrect value overflow for mixed precision" ); \
83 const pastix_bcsc_t *bcsc,
89 SolverBlok *lsolvblok = (solvcblk+1)->fblokptr;
90 float *lcoeftab = solvcblk->
lcoeftab;
91 float *ucoeftab = solvcblk->
ucoeftab;
92 double *Lvalues = bcsc->Lvalues;
93 double *Uvalues = bcsc->Uvalues;
96 int is2d = solvcblk->
cblktype & CBLK_LAYOUT_2D;
97 double overflow = LAPACKE_slamch(
'o' );
99 assert( (side !=
PastixUCoef) || (ucoeftab != NULL) );
101 for (itercoltab=0; itercoltab<csccblk->
colnbr; itercoltab++)
110 for (iterval=frow; iterval<lrow; iterval++)
115 if (rownum >= (solvcblk->
fcolnum+itercoltab))
117 while ((solvblok < lsolvblok) &&
118 ((solvblok->
lrownum < rownum) ||
127 if ( solvblok < lsolvblok )
130 coefindx += rownum - solvblok->
frownum;
131 coefindx += itercoltab * ldd;
132 pastix_cblk_lock( solvcblk );
134 pastix_cblk_unlock( solvcblk );
137 cpucblk_dscheck_overflow( Lvalues[iterval], overflow )
138 lcoeftab[coefindx] = (float) Lvalues[iterval];
142 (rownum > (solvcblk->
fcolnum + itercoltab)) )
144 cpucblk_dscheck_overflow( Uvalues[iterval], overflow );
145 #if defined(PRECISION_zc)
147 ucoeftab[coefindx] = (float) (Uvalues[iterval]);
152 ucoeftab[coefindx] = (float) Uvalues[iterval];
156 #if defined(PASTIX_DEBUG_COEFTAB)
159 fprintf( stderr,
"cpucblk_zfillin: drop coeff from CSC c=%ld(%ld) l=%ld(%ld) cblk=%ld fcol=%ld lcol=%ld\n",
160 (
long)solvcblk->
fcolnum + itercoltab, (
long)itercoltab,
161 (
long)rownum, (
long)iterval, (
long)itercblk,
203 const pastix_bcsc_t *bcsc,
209 SolverBlok *lsolvblok = (solvcblk+1)->fblokptr;
210 float *lcoeftab, *ucoeftab;
211 double *Lvalues = bcsc->Lvalues;
212 double *Uvalues = bcsc->Uvalues;
214 double overflow = LAPACKE_slamch(
'o' );
216 assert( solvcblk->
cblktype & CBLK_LAYOUT_2D );
218 for (itercoltab=0; itercoltab<csccblk->
colnbr; itercoltab++)
225 lcoeftab = (
float*)(solvblok->
LRblock[0]->
u);
226 ucoeftab = (
float*)(solvblok->
LRblock[1]->
u);
228 for (iterval=frow; iterval<lrow; iterval++)
233 if (rownum >= (solvcblk->
fcolnum+itercoltab))
235 while ((solvblok < lsolvblok) &&
236 ((solvblok->
lrownum < rownum) ||
241 lcoeftab = (
float*)(solvblok->
LRblock[0]->
u);
242 ucoeftab = (
float*)(solvblok->
LRblock[1]->
u);
245 if ( solvblok < lsolvblok )
247 coefindx = rownum - solvblok->
frownum;
248 coefindx += itercoltab * ldd;
249 pastix_cblk_lock( solvcblk );
251 pastix_cblk_unlock( solvcblk );
254 cpucblk_dscheck_overflow( Lvalues[iterval], overflow );
255 lcoeftab[coefindx] = (float) Lvalues[iterval];
259 (rownum > (solvcblk->
fcolnum + itercoltab)) )
261 cpucblk_dscheck_overflow( Uvalues[iterval], overflow);
262 #if defined(PRECISION_zc)
264 ucoeftab[coefindx] = (float) (Uvalues[iterval]);
269 ucoeftab[coefindx] = (float) Uvalues[iterval];
273 #if defined(PASTIX_DEBUG_COEFTAB)
276 fprintf( stderr,
"cpucblk_zfillin: drop coeff from CSC c=%ld(%ld) l=%ld(%ld) cblk=%ld fcol=%ld lcol=%ld\n",
277 (
long)solvcblk->
fcolnum + itercoltab, (
long)itercoltab,
278 (
long)rownum, (
long)iterval, (
long)itercblk,
320 const pastix_bcsc_t *bcsc,
324 if ( (solvmtx->
cblktab + itercblk)->cblktype & CBLK_COMPRESSED ) {
static int cpucblk_dsfillin_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.
static int cpucblk_dsfillin_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.
int cpucblk_dsfillin(pastix_coefside_t side, const SolverMatrix *solvmtx, const pastix_bcsc_t *bcsc, pastix_int_t itercblk)
Initialize the coeftab structure from the internal bcsc.
BEGIN_C_DECLS typedef int pastix_int_t
Compressed colptr format for the bcsc.
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.
pastix_lrblock_t * LRblock[2]
SolverCblk *restrict cblktab
Solver column block structure.
Solver column block structure.