106 assert( symbmtx->
baseval == 0 );
110#ifdef PASTIX_DYNSCHED
111 solvmtx->btree = ctrl->btree;
114 solvmtx->clustnbr = clustnbr;
118 solvmtx->solv_comm = comm;
127 if ( clustnbr > 1 ) {
135 MALLOC_INTERN( faninnbr_tab, clustnbr * 4,
pastix_int_t );
136 memset( faninnbr_tab, 0, clustnbr * 4 *
sizeof(
pastix_int_t ) );
141 cblklocalnum, bloklocalnum, tasklocalnum,
142 ftgttab, faninnbr_tab );
174 for ( i = 0; i < symbmtx->
cblknbr; i++, symbcblk++, candcblk++ ) {
178 int tasks2D, flaglocal;
180 flaglocal = ( simuctrl->
cblktab[i].
owned ) || ( ftgttab[i] != NULL );
185 tasks2D = candcblk->
cblktype & CBLK_TASKS_2D;
195 ftgtcblk = ftgttab[i];
196 while( ftgtcblk != NULL ) {
197 assert( (ftgtcblk->ownerid != -1) &&
198 (ftgtcblk->ownerid != ctrl->
clustnum) );
206 candcblk, cblklocalnum,
208 cblknum, brownum, i, faninnbr_tab );
216 solvmtx->colmax = pastix_imax( solvmtx->colmax,
cblk_colnbr(solvcblk) );
221 if ( solvcblk->
cblktype & CBLK_COMPRESSED ) {
222 cblksize += (solvblok - solvcblk->
fblokptr);
242 solvcblk->
gfaninnum = faninnbr_tab[2 * (clustnbr + ftgtcblk->ownerid)] + solvmtx->
gcblknbr;
243 faninnbr_tab[2 * (clustnbr + ftgtcblk->ownerid)]++;
248 ftgtcblk = ftgtcblk->next;
259 cblknum, brownum, i, ctrl->
clustnum );
267 assert( ((clustnbr > 1) && (nodenbr <= solvcblk->fcolnum)) ||
268 ((clustnbr == 1) && (nodenbr == solvcblk->
fcolnum)) );
273 coefnbr += solvcblk->
stride * nbcols;
279 ftgtcblk = ftgttab[i];
281 assert( ftgtcblk != NULL );
282 assert( (ftgtcblk->ownerid != -1) &&
283 (ftgtcblk->ownerid != ctrl->
clustnum) );
291 candcblk, cblklocalnum,
293 cblknum, brownum, i, faninnbr_tab );
301 faninnbr_tab[2 * ftgtcblk->ownerid]++;
306 solvmtx->colmax = pastix_imax( solvmtx->colmax, nbcols );
314 (solvblok - solvcblk->
fblokptr), tasks2D, cblknum );
316#if defined(PASTIX_WITH_MPI)
317 if ( clustnbr > 1 ) {
318#if defined(PASTIX_BLEND_FANIN_FR)
319 if ( ( solvcblk->
cblktype & CBLK_COMPRESSED ) &&
320 ( solvcblk->
cblktype & ( CBLK_FANIN | CBLK_RECV ) ) ) {
321 solvcblk->
cblktype &= ( ~CBLK_COMPRESSED );
325 if( solvcblk->
cblktype & CBLK_IN_SCHUR ) {
326 static int warning_schur = 1;
327 if ( warning_schur && (solvmtx->clustnum == 0) ) {
329 "Warning: Schur complement support is not yet available with multiple MPI processes\n"
330 " It is thus disabled and the factorization will be fully performed\n" );
333 solvcblk->
cblktype &= (~CBLK_IN_SCHUR);
339 if ( (cblknum < solvmtx->cblkschur) &&
340 (solvcblk->
cblktype & CBLK_IN_SCHUR) )
346 assert( cblknum == (solvcblk - solvmtx->
cblktab) );
362 browtmp, cblklocalnum, bloklocalnum, brownum );
366 fblokptr = solvcblk[-recvcnt].
fblokptr;
367 solvmtx->
browtab[brownum + brownbr] = fblokptr - solvmtx->
bloktab;
368 fblokptr->
browind = brownum + brownbr;
378 assert( brownum <= solvmtx->brownbr );
390 solvcblk[-1].lcolnum + 1, solvcblk[-1].lcolnum + 1,
391 brownum, 0, -1, solvmtx->clustnum );
409 assert( solvmtx->
brownbr == brownum );
410 assert( solvmtx->
cblknbr == cblknum );
415 memFree_null( browtmp );
419 tasklocalnum, cblklocalnum,
422 memFree_null(cblklocalnum);
423 memFree_null(bloklocalnum);
424 memFree_null(tasklocalnum);
425 memFree_null(ftgttab);
427 if ( clustnbr > 1 ) {
428 memFree_null( faninnbr_tab );
501 assert( symbmtx->
baseval == 0 );
510 solvmtx->solv_comm = comm;
513 solvmtx->tasknbr = simuctrl->
tasknbr;
544 for(i=0; i<symbmtx->
cblknbr; i++, symbcblk++, candcblk++)
547 int tasks2D = candcblk->
cblktype & CBLK_TASKS_2D;
562 assert( nodenbr == solvcblk->
fcolnum );
565 coefnbr += solvcblk->
stride * nbcols;
568 (solvblok - solvcblk->
fblokptr), tasks2D, cblknum );
570#if defined(PASTIX_WITH_MPI)
571 if ( (solvcblk->
cblktype & CBLK_COMPRESSED) &&
572 (solvcblk->
cblktype & (CBLK_FANIN | CBLK_RECV)) )
574 solvcblk->
cblktype &= (~CBLK_COMPRESSED);
579 if ( (cblknum < solvmtx->cblkschur) &&
580 (solvcblk->
cblktype & CBLK_IN_SCHUR) )
599 browtmp, NULL, NULL, brownum );
603 assert( brownum <= solvmtx->brownbr );
614 solvcblk[-1].lcolnum + 1, solvcblk[-1].lcolnum + 1,
633 assert( solvmtx->
cblknbr == cblknum );
636 memFree_null( browtmp );
641 for(i=0; i<solvmtx->
brownbr; i++)
649 NULL, NULL, NULL, ctrl->
clustnum, is_dbg );
SolverBlok * solvMatGen_register_remote_cblk(const SolverMatrix *solvmtx, const symbol_matrix_t *symbmtx, const solver_cblk_recv_t *recvcblk, const Cand *candcblk, const pastix_int_t *cblklocalnum, SolverCblk *solvcblk, SolverBlok *solvblok, pastix_int_t lcblknm, pastix_int_t brownum, pastix_int_t gcblknm, pastix_int_t *faninnbr_tab)
Register a remote cblk from a solver_recv_cblk_t structure (Fanin|Recv)