53 const pastix_graph_t *graphA,
68 assert( ordeptr->
baseval == 0 );
73 tmpsize = pastix_iceil( n, 2 );
91 assert( cblknbr == graphL.n );
94 for ( k = 0; k < cblknbr; k++ ) {
95 for ( i = rangtab[k]; i < rangtab[k + 1]; i++ ) {
102 for ( k = 0; k < cblknbr; k++ ) {
103 assert( graphL.nnz[k] >= ( rangtab[k + 1] - rangtab[k] ) );
105#if defined( PASTIX_DEBUG_SYMBOL )
106 for ( l = 0; l < rangtab[k + 1] - rangtab[k]; l++ ) {
107 assert( graphL.rows[k][l] == rangtab[k] + l );
108 assert( node2cblk[graphL.rows[k][l]] == k );
115 while ( j < graphL.nnz[k] ) {
116 cblknum = node2cblk[ja[j]];
118 while ( ( l < graphL.nnz[k] ) && ( ja[l] == ja[l - 1] + 1 ) &&
119 ( node2cblk[ja[l]] == cblknum ) ) {
123 assert( ind < tmpsize );
125 tmp[ind++] = ja[l - 1];
126 assert( ( ja[l - 1] - ja[j] + 1 ) == ( l - j ) );
134 memFree( graphL.rows[k] );
136 memcpy( graphL.rows[k], tmp, ind *
sizeof(
pastix_int_t ) );
143#if defined( PASTIX_DEBUG_SYMBOL )
144 for ( k = 0; k < cblknbr; k++ ) {
145 assert( graphL.nnz[k] > 0 );
146 assert( graphL.rows[k][0] == rangtab[k] );
147 assert( ( graphL.rows[k][1] - graphL.rows[k][0] + 1 ) == ( rangtab[k + 1] - rangtab[k] ) );
164 for ( k = 0; k < cblknbr; k++ ) {
170 for ( i = 0; i < graphL.nnz[k]; i += 2 ) {
171 j = graphL.rows[k][i];
178 assert( node2cblk[j] == node2cblk[graphL.rows[k][i + 1]] );
181#if defined( PASTIX_DEBUG_SYMBOL )
196 assert( ind == symbptr->
bloknbr );
197 memFree( node2cblk );
244 for ( i = 0; i < symbmtx->
cblknbr; i++ ) {
245 for ( j = cblktab[i].bloknum + 1; j < cblktab[i + 1].
bloknum; j++ ) {
251 for ( i = 0; i < symbmtx->
cblknbr; i++ ) {
252 if ( Q.nnz[i] > 0 ) {
266 for ( i = 0; i < symbmtx->
cblknbr; i++ ) {
267 for ( j = cblktab[i].bloknum + 1; j < cblktab[i + 1].
bloknum; j++ ) {
269 Q.rows[k][Q.nnz[k]++] = i;
273 for ( i = 0; i < Q.n; i++ ) {
277 for ( i = 0; i < Q.n; i++ ) {
281 for ( j = 0; j < Q.nnz[i]; j++ ) {
285 while ( ( father[k] != -1 ) && ( father[k] != i ) ) {
292 for ( i = 0; i < Q.n; i++ ) {
293 if ( father[i] == -1 ) {
301 for ( i = 0; i < symbmtx->
cblknbr - 1; i++ ) {
305 memcpy( newbloktab + k, bloktab + fbloknum,
sizeof(
symbol_blok_t ) );
308 odb = cblktab[i + 1].
bloknum - fbloknum;
309 if ( odb <= 1 || bloktab[fbloknum + 1].fcblknm != father[i] ) {
314 newbloktab[k].
fcblknm = father[i];
315#if defined( PASTIX_DEBUG_SYMBOL )
316 if ( father[i] != i ) {
317 assert( cblktab[father[i]].fcolnum > cblktab[i].lcolnum );
324 memcpy( newbloktab + k, bloktab + fbloknum + 1,
sizeof(
symbol_blok_t ) * ( odb - 1 ) );
330 memcpy( newbloktab + k,
338#if defined( PASTIX_DEBUG_SYMBOL )
339 assert( k >= symbmtx->
bloknbr );
340 assert( k < symbmtx->cblknbr + symbmtx->
bloknbr );
350 memFree( newbloktab );
pastix_int_t faxCSRFactILUk(const fax_csr_t *graphA, const pastix_order_t *order, pastix_int_t level, fax_csr_t *graphL)
Compute the non zero pattern of the levelized incomplete factor for a sparse lower triangular matrix ...
int faxCSRGenPA(const pastix_graph_t *graphA, const pastix_int_t *perm, fax_csr_t *graphPA)
Generate the graph of P*A from the graph of A and the permutation vector.
void faxCSRInit(pastix_int_t n, fax_csr_t *csr)
Initialize the data structure by doing the first allocations within the structure and initializing th...
int pastixSymbolFaxILUk(symbol_matrix_t *symbptr, pastix_int_t levelk, const pastix_graph_t *graphA, const pastix_order_t *ordeptr)
Create the symbol matrix from the graph of the non zero pattern of the factorized matrix and the supe...