void lis_matrix_set_bsr_f(LIS_INT *bnr, LIS_INT *bnc, LIS_INT *bnnz, LIS_INT *bptr, LIS_INT *bindex, LIS_SCALAR *value, LIS_MATRIX_F *A, LIS_INT *ierr) { LIS_DEBUG_FUNC_IN; *ierr = lis_matrix_set_bsr(*bnr,*bnc,*bnnz,bptr,bindex,value,((LIS_MATRIX)LIS_V2P(A))); LIS_DEBUG_FUNC_OUT; return; }
LIS_INT lis_matrix_convert_rco2bsr(LIS_MATRIX Ain, LIS_MATRIX Aout) { LIS_INT i,j,k,n,gn,nnz,bnnz,nr,nc,bnr,bnc,err; LIS_INT ii,jj,kk,bj,jpos,ij,kv,bi; LIS_INT *iw,*iw2; LIS_INT *bptr,*bindex; LIS_SCALAR *value; LIS_DEBUG_FUNC_IN; bnr = Ain->conv_bnr; bnc = Ain->conv_bnc; n = Ain->n; gn = Ain->gn; nr = 1 + (n-1)/bnr; nc = 1 + (gn-1)/bnc; bptr = NULL; bindex = NULL; value = NULL; iw = NULL; iw2 = NULL; bptr = (LIS_INT *)lis_malloc( (nr+1)*sizeof(LIS_INT),"lis_matrix_convert_rco2bsr::bptr" ); if( bptr==NULL ) { LIS_SETERR_MEM((nr+1)*sizeof(LIS_INT)); lis_free2(5,bptr,bindex,value,iw,iw2); return LIS_OUT_OF_MEMORY; } #ifdef _OPENMP #pragma omp parallel private(i,k,ii,j,bj,kk,ij,jj,iw,iw2,kv,jpos) #endif { iw = (LIS_INT *)lis_malloc( nc*sizeof(LIS_INT),"lis_matrix_convert_rco2bsr::iw" ); iw2 = (LIS_INT *)lis_malloc( nc*sizeof(LIS_INT),"lis_matrix_convert_rco2bsr::iw2" ); memset(iw,0,nc*sizeof(LIS_INT)); #ifdef _OPENMP #pragma omp for #endif for(i=0;i<nr;i++) { k = 0; kk = bnr*i; jj = 0; for(ii=0;ii+kk<n&&ii<bnr;ii++) { for(j=0;j<Ain->w_row[kk+ii];j++) { bj = Ain->w_index[kk+ii][j]/bnc; jpos = iw[bj]; if( jpos==0 ) { iw[bj] = 1; iw2[jj] = bj; jj++; } } } for(bj=0;bj<jj;bj++) { k++; ii = iw2[bj]; iw[ii]=0; } bptr[i+1] = k; } lis_free(iw); lis_free(iw2); } bptr[0] = 0; for(i=0;i<nr;i++) { bptr[i+1] += bptr[i]; } bnnz = bptr[nr]; nnz = bnnz*bnr*bnc; bindex = (LIS_INT *)lis_malloc( bnnz*sizeof(LIS_INT),"lis_matrix_convert_rco2bsr::bindex" ); if( bindex==NULL ) { LIS_SETERR_MEM((nr+1)*sizeof(LIS_INT)); lis_free2(3,bptr,bindex,value); return LIS_OUT_OF_MEMORY; } value = (LIS_SCALAR *)lis_malloc( nnz*sizeof(LIS_SCALAR),"lis_matrix_convert_rco2bsr::value" ); if( value==NULL ) { LIS_SETERR_MEM(nnz*sizeof(LIS_SCALAR)); lis_free2(3,bptr,bindex,value); return LIS_OUT_OF_MEMORY; } /* convert bsr */ #ifdef _OPENMP #pragma omp parallel private(bi,i,ii,k,j,bj,jpos,kv,kk,ij,jj,iw) #endif { iw = (LIS_INT *)lis_malloc( nc*sizeof(LIS_INT),"lis_matrix_convert_rco2bsr::iw" ); memset(iw,0,nc*sizeof(LIS_INT)); #ifdef _OPENMP #pragma omp for #endif for(bi=0;bi<nr;bi++) { i = bi*bnr; ii = 0; kk = bptr[bi]; while( i+ii<n && ii<=bnr-1 ) { for( k=0;k<Ain->w_row[i+ii];k++) { j = Ain->w_index[i+ii][k]; bj = j/bnc; j = j%bnc; jpos = iw[bj]; if( jpos==0 ) { kv = kk * bnr * bnc; iw[bj] = kv+1; bindex[kk] = bj; for(jj=0;jj<bnr*bnc;jj++) value[kv+jj] = 0.0; ij = j*bnr + ii; value[kv+ij] = Ain->w_value[i+ii][k]; kk = kk+1; } else { ij = j*bnr + ii; value[jpos+ij-1] = Ain->w_value[i+ii][k]; } } ii = ii+1; } for(j=bptr[bi];j<bptr[bi+1];j++) { iw[bindex[j]] = 0; } } lis_free(iw); } err = lis_matrix_set_bsr(bnr,bnc,bnnz,bptr,bindex,value,Aout); if( err ) { lis_free2(3,bptr,bindex,value); return err; } err = lis_matrix_assemble(Aout); if( err ) { lis_matrix_storage_destroy(Aout); return err; } LIS_DEBUG_FUNC_OUT; return LIS_SUCCESS; }