28 #ifndef DOXYGEN_SHOULD_SKIP_THIS
30 __fct_id(
double val ) {
35 __fct_conj(
double val ) {
36 #if defined(PRECISION_c) || defined(PRECISION_z)
46 #if defined(PASTIX_WITH_MPI)
91 bcsc_dstore_data(
const spmatrix_t *spm,
97 double *values = (
double*)(spm->values);
110 #if defined(PRECISION_z) || defined(PRECISION_c)
111 int sym = (spm->mtxtype == SpmSymmetric) || (spm->mtxtype == SpmSymmetric);
113 int sym = (spm->mtxtype == SpmSymmetric);
117 bcsc_allocate_buf( bcsc_comm, PastixTagMemSend );
125 data_cntAt = data_cntA + clustnbr;
126 data_cntAAt = data_cntA + clustnbr * 2;
128 baseval = spm->baseval;
131 for ( jl = 0; jl < spm->n; jl++, colptr++, loc2glob++ ) {
132 jg = *loc2glob - baseval;
134 jgpe = ( dof > 0 ) ? jgp * dof : dofs[ jg ] - baseval;
135 dofj = ( dof > 0 ) ? dof : dofs[ jg+1 ] - dofs[ jg ];
137 frow = colptr[0] - baseval;
138 lrow = colptr[1] - baseval;
139 assert( (lrow - frow) >= 0 );
141 ownerj = col2cblk[ jgpe ];
145 ownerj = - ownerj - 1;
146 data_comm = bcsc_comm->
data_comm + ownerj;
147 data_sendA = &( data_comm->
sendA );
150 for ( il = frow; il < lrow; il++ ) {
151 ig = rowptr[il] - baseval;
153 igpe = ( dof > 0 ) ? igp * dof : dofs[ ig ] - baseval;
154 dofi = ( dof > 0 ) ? dof : dofs[ ig+1 ] - dofs[ ig ];
155 owneri = col2cblk[ igpe ];
161 if ( sym && ( ig == jg ) ) {
164 data_cntA[ownerj].
idxcnt += 2;
166 values_c = ((
double*)(data_sendA->
valbuf)) + data_cntA[ownerj].valcnt;
167 memcpy( values_c, values, dofi * dofj *
sizeof(
double) );
168 data_cntA[ownerj].
valcnt += dofi * dofj;
170 values += dofi * dofj;
176 owneri = - owneri - 1;
177 data_comm = bcsc_comm->
data_comm + owneri;
183 if ( owneri == ownerj ) {
184 data_sendAAt = &( data_comm->
sendAAt );
186 data_sendAAt->
idxbuf[data_cntAAt[ownerj].
idxcnt ] = igp;
187 data_sendAAt->
idxbuf[data_cntAAt[ownerj].
idxcnt+1] = jgp;
188 data_cntAAt[ownerj].
idxcnt += 2;
190 values_c = ((
double*)(data_sendAAt->
valbuf)) + data_cntAAt[ownerj].valcnt;
191 memcpy( values_c, values, dofi * dofj *
sizeof(
double) );
192 data_cntAAt[ownerj].
valcnt += dofi * dofj;
199 data_sendAt = &( data_comm->
sendAt );
203 data_cntAt[owneri].
idxcnt += 2;
205 values_c = ((
double*)(data_sendAt->
valbuf)) + data_cntAt[owneri].valcnt;
206 memcpy( values_c, values, dofi * dofj *
sizeof(
double) );
207 data_cntAt[owneri].
valcnt += dofi * dofj;
211 data_cntA[ownerj].
idxcnt += 2;
213 values_c = ((
double*)(data_sendA->
valbuf)) + data_cntA[ownerj].valcnt;
214 memcpy( values_c, values, dofi * dofj *
sizeof(
double) );
215 data_cntA[ownerj].
valcnt += dofi * dofj;
226 data_cntA[ownerj].
idxcnt += 2;
228 values_c = ((
double*)(data_sendA->
valbuf)) + data_cntA[ownerj].valcnt;
229 memcpy( values_c, values, dofi * dofj *
sizeof(
double) );
230 data_cntA[ownerj].
valcnt += dofi * dofj;
232 values += dofi * dofj;
238 for ( il = frow; il < lrow; il++ ) {
239 ig = rowptr[il] - baseval;
241 igpe = ( dof > 0 ) ? igp * dof : dofs[ ig ] - baseval;
242 dofi = ( dof > 0 ) ? dof : dofs[ ig+1 ] - dofs[ ig ];
243 owneri = col2cblk[ igpe ];
249 if ( sym && ( ig == jg ) ) {
250 values += dofi * dofj;
256 owneri = - owneri - 1;
257 data_comm = bcsc_comm->
data_comm + owneri;
258 data_sendAt = &( data_comm->
sendAt );
266 data_cntAt[owneri].
idxcnt += 2;
268 values_c = ((
double*)(data_sendAt->
valbuf)) + data_cntAt[owneri].valcnt;
269 memcpy( values_c, values, dofi * dofj *
sizeof(
double) );
270 data_cntAt[owneri].
valcnt += dofi * dofj;
272 values += dofi * dofj;
277 memFree_null( data_cntA );
318 bcsc_dhandle_recv_A(
const spmatrix_t *spm,
337 double *Values = bcsc->Lvalues;
347 for ( k = 0; k < idx_size; k+=2, indexes+=2 ) {
354 igpe = (dof > 0) ? igp * dof : dofs[ ig ] - spm->baseval;
355 jgpe = (dof > 0) ? jgp * dof : dofs[ jg ] - spm->baseval;
356 dofi = (dof > 0) ? dof : dofs[ig+1] - dofs[ig];
357 dofj = (dof > 0) ? dof : dofs[jg+1] - dofs[jg];
359 itercblk = bcsc->col2cblk[ jgpe ];
360 assert( itercblk >= 0 );
363 cblk = solvmtx->
cblktab + itercblk;
364 coltab = bcsc->cscftab[cblk->
bcscnum].coltab;
368 for ( idofj = 0; idofj < dofj; idofj++, colidx++ ) {
370 pos = coltab[ colidx ];
371 for ( idofi = 0; idofi < dofi; idofi++, rowidx++, pos++, values_buf++ ) {
373 assert( rowidx >= 0 );
374 assert( rowidx < spm->gNexp );
375 bcsc->rowtab[ pos ] = rowidx;
377 Values[ pos ] = *values_buf;
380 coltab[ colidx ] += dofi;
381 assert( coltab[colidx] <= coltab[colidx+1] );
429 bcsc_dhandle_recv_At(
const spmatrix_t *spm,
452 double (*_bcsc_conj)(double) = __fct_id;
456 if ( spm->mtxtype == SpmGeneral ) {
457 _bcsc_conj = __fct_id;
458 Values = (
double*)(bcsc->Uvalues);
461 if( spm->mtxtype == SpmSymmetric ) {
462 _bcsc_conj = __fct_conj;
464 if( spm->mtxtype == SpmSymmetric ) {
465 _bcsc_conj = __fct_id;
467 Values = (
double*)(bcsc->Lvalues);
475 for ( k = 0; k < idx_size; k+=2, indexes+=2 ) {
482 igpe = (dof > 0) ? igp * dof : dofs[ ig ] - spm->baseval;
483 jgpe = (dof > 0) ? jgp * dof : dofs[ jg ] - spm->baseval;
484 dofi = (dof > 0) ? dof : dofs[ig+1] - dofs[ig];
485 dofj = (dof > 0) ? dof : dofs[jg+1] - dofs[jg];
487 itercblk = bcsc->col2cblk[ igpe ];
488 assert( itercblk >= 0 );
491 cblk = solvmtx->
cblktab + itercblk;
492 coltab = bcsc->cscftab[cblk->
bcscnum].coltab;
495 for ( idofj = 0; idofj < dofj; idofj++ ) {
496 rowidx = jgpe + idofj;
498 for ( idofi = 0; idofi < dofi; idofi++, colidx++, values_buf++ ) {
499 pos = coltab[ colidx ];
501 assert( rowidx >= 0 );
502 assert( rowidx < spm->gNexp );
503 rowtab[ pos ] = rowidx;
506 Values[ pos ] = _bcsc_conj( *values_buf );
508 assert( coltab[colidx] <= coltab[colidx+1] );
554 bcsc_dhandle_recv_AAt(
const spmatrix_t *spm,
575 double *ValuesA, *ValuesAt;
576 double (*_bcsc_conj)(double) = __fct_id;
580 if ( spm->mtxtype == SpmGeneral ) {
581 _bcsc_conj = __fct_id;
582 ValuesAt = (
double*)(bcsc->Uvalues);
585 if( spm->mtxtype == SpmSymmetric ) {
586 _bcsc_conj = __fct_conj;
588 if( spm->mtxtype == SpmSymmetric ) {
589 _bcsc_conj = __fct_id;
591 ValuesAt = (
double*)(bcsc->Lvalues);
593 ValuesA = (
double*)(bcsc->Lvalues);
600 for ( k = 0; k < idx_size; k+=2, indexes+=2 ) {
607 igpe = (dof > 0) ? igp * dof : dofs[ ig ] - spm->baseval;
608 jgpe = (dof > 0) ? jgp * dof : dofs[ jg ] - spm->baseval;
609 dofi = (dof > 0) ? dof : dofs[ig+1] - dofs[ig];
610 dofj = (dof > 0) ? dof : dofs[jg+1] - dofs[jg];
612 itercblki = bcsc->col2cblk[ igpe ];
613 itercblkj = bcsc->col2cblk[ jgpe ];
614 assert( itercblki >= 0 );
615 assert( itercblkj >= 0 );
618 cblki = solvmtx->
cblktab + itercblki;
619 cblkj = solvmtx->
cblktab + itercblkj;
620 coltabi = bcsc->cscftab[cblki->
bcscnum].coltab;
621 coltabj = bcsc->cscftab[cblkj->
bcscnum].coltab;
625 for ( idofj = 0; idofj < dofj; idofj++ ) {
627 posj = coltabj[ colj ];
630 for ( idofi = 0; idofi < dofi; idofi++, coli++, rowj++, posj++, values_buf++ ) {
631 posi = coltabi[ coli ];
635 assert( rowi < spm->gNexp );
636 assert( rowj < spm->gNexp );
638 rowtab[ posi ] = rowi;
639 bcsc->rowtab[ posj ] = rowj;
642 ValuesAt[ posi ] = _bcsc_conj( *values_buf );
643 ValuesA [ posj ] = *values_buf;
645 assert( coltabi[coli] <= coltabi[coli+1] );
648 coltabj[ colj ] += dofi;
649 assert( coltabj[colj] <= coltabj[colj+1] );
681 bcsc_dexchange_values_A(
const spmatrix_t *spm,
684 pastix_bcsc_t *bcsc )
692 double *val_buf = NULL;
698 MPI_Status statuses[clustnbr-1];
699 MPI_Request requests[clustnbr-1];
704 if ( bcsc_comm->
max_idx != 0 ) {
705 MALLOC_INTERN( val_buf, bcsc_comm->
max_val,
double );
708 for ( k = 0; k < clustnbr; k++ ) {
709 if ( k == clustnum ) {
718 c_send = (clustnum+1) % clustnbr;
719 for ( k = 0; k < clustnbr-1; k++ ) {
720 data_send = data_comm + c_send;
722 if ( c_send == clustnum ) {
727 if ( sends->
valcnt != 0 ) {
729 c_send, PastixTagValuesA, bcsc_comm->
comm, &requests[counter_req++] );
731 c_send = (c_send+1) % clustnbr;
735 c_recv = (clustnum-1+clustnbr) % clustnbr;
736 for ( k = 0; k < clustnbr-1; k++ ) {
737 data_recv = data_comm + c_recv;
738 recvs = &( data_recv->
recvA );
739 if ( c_recv == clustnum ) {
744 if ( recvs->
valcnt != 0 ) {
745 MPI_Recv( val_buf, recvs->
valcnt, PASTIX_MPI_DOUBLE,
746 c_recv, PastixTagValuesA, bcsc_comm->
comm, MPI_STATUS_IGNORE );
748 nbelt_recv += bcsc_dhandle_recv_A( spm, ord, solvmtx, bcsc,
749 val_buf, idx_cnt[c_recv], idx_size, 0 );
751 c_recv = (c_recv-1+clustnbr) % clustnbr;
754 MPI_Waitall( counter_req, requests, statuses );
757 bcsc_free_buf( bcsc_comm, PastixTagMemSendValA );
758 bcsc_free_buf( bcsc_comm, PastixTagMemRecvIdxA );
790 bcsc_dexchange_values_At(
const spmatrix_t *spm,
794 pastix_bcsc_t *bcsc )
802 double *val_buf = NULL;
808 MPI_Status statuses[clustnbr-1];
809 MPI_Request requests[clustnbr-1];
814 if ( bcsc_comm->
max_idx != 0 ) {
815 MALLOC_INTERN( val_buf, bcsc_comm->
max_val,
double );
818 for ( k = 0; k < clustnbr; k++ ) {
819 if ( k == clustnum ) {
828 c_send = (clustnum+1) % clustnbr;
829 for ( k = 0; k < clustnbr-1; k++ ) {
830 data_send = data_comm + c_send;
832 if ( c_send == clustnum ) {
837 if ( sends->
valcnt != 0 ) {
839 c_send, PastixTagValuesAt, bcsc_comm->
comm, &requests[counter_req++] );
841 c_send = (c_send+1) % clustnbr;
845 c_recv = (clustnum-1+clustnbr) % clustnbr;
846 for ( k = 0; k < clustnbr-1; k++ ) {
847 data_recv = data_comm + c_recv;
848 recvs = &( data_recv->
recvAt );
849 if ( c_recv == clustnum ) {
854 if ( recvs->
valcnt != 0 ) {
855 MPI_Recv( val_buf, recvs->
valcnt, PASTIX_MPI_DOUBLE,
856 c_recv, PastixTagValuesAt, bcsc_comm->
comm, MPI_STATUS_IGNORE );
858 nbelt_recv += bcsc_dhandle_recv_At( spm, ord, solvmtx, rowtab, bcsc,
859 val_buf, idx_cnt[c_recv], idx_size, 0 );
861 c_recv = (c_recv-1+clustnbr) % clustnbr;
864 MPI_Waitall( counter_req, requests, statuses );
867 bcsc_free_buf( bcsc_comm, PastixTagMemSendValAt );
868 bcsc_free_buf( bcsc_comm, PastixTagMemRecvIdxAt );
900 bcsc_dexchange_values_AAt(
const spmatrix_t *spm,
904 pastix_bcsc_t *bcsc )
912 double *val_buf = NULL;
918 MPI_Status statuses[clustnbr-1];
919 MPI_Request requests[clustnbr-1];
925 if ( bcsc_comm->
max_idx != 0 ) {
926 if ( spm->mtxtype != SpmGeneral ) {
927 MALLOC_INTERN( val_buf, bcsc_comm->
max_val,
double );
930 if ( rowtabAt == bcsc->rowtab ) {
931 bcsc_allocate_buf( bcsc_comm, PastixTagMemRecvValAAt);
936 for ( k = 0; k < clustnbr; k++ ) {
937 if ( k == clustnum ) {
946 c_send = (clustnum+1) % clustnbr;
947 for ( k = 0; k < clustnbr-1; k++ ) {
948 if ( rowtabAt != bcsc->rowtab ) {
951 data_send = data_comm + c_send;
953 if ( c_send == clustnum ) {
958 if ( sends->
valcnt != 0 ) {
960 c_send, PastixTagValuesAAt, bcsc_comm->
comm, &requests[counter_req++] );
962 c_send = (c_send+1) % clustnbr;
966 c_recv = (clustnum-1+clustnbr) % clustnbr;
967 for ( k = 0; k < clustnbr-1; k++ ) {
968 data_recv = data_comm + c_recv;
969 recvs = &( data_recv->
recvAAt );
970 if ( c_recv == clustnum ) {
976 if ( spm->mtxtype == SpmGeneral ) {
979 if ( rowtabAt == bcsc->rowtab ) {
980 MPI_Recv( val_buf, recvs->
size.
valcnt, PASTIX_MPI_DOUBLE,
981 c_recv, PastixTagValuesAAt, bcsc_comm->
comm, MPI_STATUS_IGNORE );
985 if ( spm->mtxtype != SpmGeneral ) {
986 nbelt_recv += bcsc_dhandle_recv_AAt( spm, ord, solvmtx, rowtabAt, bcsc,
987 val_buf, idx_cnt[c_recv], idx_size );
990 if ( rowtabAt == bcsc->rowtab ) {
991 nbelt_recv += bcsc_dhandle_recv_A( spm, ord, solvmtx, bcsc, val_buf,
992 idx_cnt[c_recv], idx_size, 1 );
995 nbelt_recv += bcsc_dhandle_recv_At( spm, ord, solvmtx, rowtabAt, bcsc,
996 val_buf, idx_cnt[c_recv], idx_size, 1 );
1000 c_recv = (c_recv-1+clustnbr) % clustnbr;
1003 if ( rowtabAt == bcsc->rowtab ) {
1004 MPI_Waitall( counter_req, requests, statuses );
1006 if ( spm->mtxtype != SpmGeneral ) {
1010 if ( ( spm->mtxtype != SpmGeneral ) || ( rowtabAt != bcsc->rowtab ) ) {
1011 bcsc_free_buf( bcsc_comm, PastixTagMemRecvIdxAAt );
1012 bcsc_free_buf( bcsc_comm, PastixTagMemSendValAAt );
1014 if ( ( spm->mtxtype == SpmGeneral ) && ( rowtabAt != bcsc->rowtab ) ) {
1015 bcsc_free_buf( bcsc_comm, PastixTagMemRecvAAt );
1053 pastix_bcsc_t *bcsc )
1055 double *values = (
double*)(spm->values);
1056 double *Lvalues = (
double*)(bcsc->Lvalues);
1070 baseval = spm->baseval;
1080 for ( j = 0; j < spm->n; j++, colptr++, loc2glob++ ) {
1081 jg = ( spm->loc2glob == NULL ) ? j : *loc2glob - baseval;
1083 jgpe = ( dof > 0 ) ? jgp * dof : dofs[ jg ] - baseval;
1084 dofj = ( dof > 0 ) ? dof : dofs[ jg+1 ] - dofs[ jg ];
1086 itercblk = bcsc->col2cblk[ jgpe ];
1093 if ( itercblk >= 0 ) {
1095 cblk = solvmtx->
cblktab + itercblk;
1096 coltab = bcsc->cscftab[cblk->
bcscnum].coltab;
1102 for ( k = colptr[0]; k < colptr[1]; k++, rowptr++ ) {
1103 ig = *rowptr - baseval;
1105 igpe = ( dof > 0 ) ? igp * dof : dofs[ ig ] - baseval;
1106 dofi = ( dof > 0 ) ? dof : dofs[ ig+1 ] - dofs[ ig ];
1109 colidx = jgpe - cblk->
fcolnum;
1110 for ( idofj = 0; idofj < dofj; idofj++, colidx++ ) {
1112 pos = coltab[ colidx ];
1113 for ( idofi = 0; idofi < dofi; idofi++, rowidx++, pos++, values++ ) {
1114 assert( rowidx >= 0 );
1115 assert( rowidx < spm->gNexp );
1116 bcsc->rowtab[ pos ] = rowidx;
1117 Lvalues[ pos ] = *values;
1120 coltab[ colidx ] += dofi;
1121 assert( coltab[ colidx ] <= coltab[ colidx+1 ] );
1127 for ( k = colptr[0]; k < colptr[1]; k++, rowptr++ ) {
1128 ig = *rowptr - baseval;
1129 dofi = ( dof > 0 ) ? dof : dofs[ ig+1 ] - dofs[ ig ];
1131 values += dofi * dofj;
1180 pastix_bcsc_t *bcsc )
1182 double *values = (
double*)(spm->values);
1196 double (*_bcsc_conj)(double) = NULL;
1199 if ( spm->mtxtype == SpmGeneral ) {
1200 _bcsc_conj = __fct_id;
1201 Uvalues = (
double*)(bcsc->Uvalues);
1209 if( spm->mtxtype == SpmSymmetric ) {
1210 _bcsc_conj = __fct_conj;
1212 if( spm->mtxtype == SpmSymmetric ) {
1213 _bcsc_conj = __fct_id;
1215 Uvalues = (
double*)(bcsc->Lvalues);
1217 assert( _bcsc_conj != NULL );
1219 baseval = spm->baseval;
1229 for ( j = 0; j < spm->n; j++, colptr++, loc2glob++ ) {
1230 jg = ( spm->loc2glob == NULL ) ? j : *loc2glob - baseval;
1232 jgpe = ( dof > 0 ) ? jgp * dof : dofs[ jg ] - baseval;
1233 dofj = ( dof > 0 ) ? dof : dofs[ jg+1 ] - dofs[ jg ];
1240 for ( k = colptr[0]; k < colptr[1]; k++, rowptr++ ) {
1241 ig = *rowptr - baseval;
1243 igpe = ( dof > 0 ) ? igp * dof : dofs[ ig ] - baseval;
1244 dofi = ( dof > 0 ) ? dof : dofs[ ig+1 ] - dofs[ ig ];
1247 if ( ( ig == jg ) && ( spm->mtxtype != SpmGeneral ) ) {
1248 values += dofi * dofj;
1251 itercblk = bcsc->col2cblk[ igpe ];
1258 if ( itercblk >= 0 ) {
1260 cblk = solvmtx->
cblktab + itercblk;
1261 coltab = bcsc->cscftab[cblk->
bcscnum].coltab;
1264 for ( idofj = 0; idofj < dofj; idofj++ ) {
1265 rowidx = jgpe + idofj;
1266 colidx = igpe - cblk->
fcolnum;
1267 for ( idofi = 0; idofi < dofi; idofi++, colidx++, values++ ) {
1268 pos = coltab[ colidx ];
1271 assert( rowidx >= 0 );
1272 assert( rowidx < spm->gNexp );
1273 rowtab[ pos ] = rowidx;
1274 Uvalues[ pos ] = _bcsc_conj( *values );
1283 values += dofi * dofj;
1317 pastix_int_t block_num, col, len_col_block, block_nbr, col_nbr;
1320 block_nbr = bcsc->cscfnbr;
1321 block = bcsc->cscftab;
1322 for ( block_num = 0; block_num < block_nbr; block_num++, block++ ) {
1325 for ( col = 0; col < col_nbr; col++ ) {
1327 sortptr[0] = (
void*)(rowtab + block->
coltab[col]);
1328 sortptr[1] = (
void*)(valtab + block->
coltab[col]);
1330 len_col_block = block->
coltab[col+1] - block->
coltab[col];
1331 #if !defined(NDEBUG)
1336 for ( i = 0; i < len_col_block; i++ ) {
1337 assert( rowtab[ block->
coltab[col] + i ] >= 0 );
1338 assert( rowtab[ block->
coltab[col] + i ] < gN );
1343 d_qsortIntFloatAsc( sortptr, len_col_block );
1382 pastix_bcsc_t *bcsc,
1386 #if defined(PASTIX_WITH_MPI)
1392 #if defined(PASTIX_WITH_MPI)
1393 if ( bcsc_comm != NULL ) {
1394 nbelt_recv = bcsc_dexchange_values_A( spm, ord, solvmtx, bcsc );
1395 nbelt_recv += bcsc_dexchange_values_AAt( spm, ord, solvmtx, bcsc->rowtab, bcsc );
1396 nbelt += nbelt_recv;
1404 if ( spm->mtxtype != SpmGeneral ) {
1406 #if defined(PASTIX_WITH_MPI)
1407 if ( bcsc_comm != NULL ) {
1408 nbelt_recv = bcsc_dexchange_values_At( spm, ord, solvmtx, bcsc->rowtab, bcsc );
1409 nbelt += nbelt_recv;
1412 nbelt +=
bcsc_dinit_At( spm, ord, solvmtx, bcsc->rowtab, bcsc );
1419 bcsc_dsort( bcsc, bcsc->rowtab, bcsc->Lvalues );
1422 if ( spm->mtxtype == SpmGeneral ) {
1426 MALLOC_INTERN( bcsc->Uvalues, valuesize,
double );
1429 for (i=0; i<valuesize; i++) {
1433 #if defined(PASTIX_WITH_MPI)
1434 if ( bcsc_comm != NULL ) {
1435 nbelt_recv = bcsc_dexchange_values_At( spm, ord, solvmtx, trowtab, bcsc );
1436 nbelt_recv += bcsc_dexchange_values_AAt( spm, ord, solvmtx, trowtab, bcsc );
1437 nbelt += nbelt_recv;
1450 bcsc->Uvalues = bcsc->Lvalues;
1454 #if defined(PASTIX_WITH_MPI)
BEGIN_C_DECLS typedef int pastix_int_t
static pastix_int_t bcsc_dinit_At(const spmatrix_t *spm, const pastix_order_t *ord, const SolverMatrix *solvmtx, pastix_int_t *rowtab, pastix_bcsc_t *bcsc)
Initializes the At values in the block cscstored in the given spm.
void bcsc_restore_coltab(pastix_bcsc_t *bcsc)
Restores the coltab array when it has been modified to initialize the row and values arrays.
static void bcsc_dsort(const pastix_bcsc_t *bcsc, pastix_int_t *rowtab, double *valtab)
Sorts the block csc subarray associated to each column block.
static pastix_int_t bcsc_dinit_A(const spmatrix_t *spm, const pastix_order_t *ord, const SolverMatrix *solvmtx, pastix_bcsc_t *bcsc)
Initializes the A values of the block csc stored in the given spm.
void bcsc_dinit(const spmatrix_t *spm, const pastix_order_t *ord, const SolverMatrix *solvmtx, int initAt, pastix_bcsc_t *bcsc, pastix_int_t valuesize)
Initializes a centralize double block csc.
bcsc_proc_comm_t data_comm[1]
bcsc_data_amount_t recvAt
Compressed colptr format for the bcsc.
Information about the amount of data.
Information about the sending data.
Structure to manage communications with distributed spm.
Informations of the data exchanged with other processors.
SolverCblk *restrict cblktab
Solver column block structure.
Solver column block structure.