#ifdef PETSC_RCS_HEADER static char vcid[] = "$Id: baij2.c,v 1.26 1998/04/13 17:39:42 bsmith Exp bsmith $"; #endif #include "pinclude/pviewer.h" #include "sys.h" #include "src/mat/impls/baij/seq/baij.h" #include "src/vec/vecimpl.h" #include "src/inline/spops.h" #include "petsc.h" #include "src/inline/bitarray.h" #undef __FUNC__ #define __FUNC__ "MatIncreaseOverlap_SeqBAIJ" int MatIncreaseOverlap_SeqBAIJ(Mat A,int is_max,IS *is,int ov) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; int row, i,j,k,l,m,n, *idx,ierr, *nidx, isz, val, ival; int start, end, *ai, *aj,bs,*nidx2; BT table; PetscFunctionBegin; m = a->mbs; ai = a->i; aj = a->j; bs = a->bs; if (ov < 0) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,0,"Negative overlap specified"); ierr = BTCreate(m,table); CHKERRQ(ierr); nidx = (int *) PetscMalloc((m+1)*sizeof(int)); CHKPTRQ(nidx); nidx2 = (int *)PetscMalloc((a->m+1)*sizeof(int)); CHKPTRQ(nidx2); for ( i=0; im) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,0,"index greater than mat-dim"); if(!BTLookupSet(table, ival)) { nidx[isz++] = ival;} } ierr = ISRestoreIndices(is[i],&idx); CHKERRQ(ierr); ierr = ISDestroy(is[i]); CHKERRQ(ierr); k = 0; for ( j=0; jdata,*c; int *smap, i, k, kstart, kend, ierr, oldcols = a->nbs,*lens; int row,mat_i,*mat_j,tcol,*mat_ilen; int *irow, *icol, nrows, ncols,*ssmap,bs=a->bs, bs2=a->bs2; int *aj = a->j, *ai = a->i; Scalar *mat_a; Mat C; PetscFunctionBegin; ierr = ISSorted(iscol,(PetscTruth*)&i); if (!i) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"IS is not sorted"); ierr = ISGetIndices(isrow,&irow); CHKERRQ(ierr); ierr = ISGetIndices(iscol,&icol); CHKERRQ(ierr); ierr = ISGetSize(isrow,&nrows); CHKERRQ(ierr); ierr = ISGetSize(iscol,&ncols); CHKERRQ(ierr); smap = (int *) PetscMalloc((1+oldcols)*sizeof(int)); CHKPTRQ(smap); ssmap = smap; lens = (int *) PetscMalloc((1+nrows)*sizeof(int)); CHKPTRQ(lens); PetscMemzero(smap,oldcols*sizeof(int)); for ( i=0; iilen[irow[i]]; lens[i] = 0; for ( k=kstart; kdata); if (c->mbs!=nrows || c->nbs!=ncols || c->bs!=bs) SETERRQ(PETSC_ERR_ARG_SIZ,0,"Submatrix wrong size"); if (PetscMemcmp(c->ilen,lens, c->mbs *sizeof(int))) { SETERRQ(PETSC_ERR_ARG_SIZ,0,"Cannot reuse matrix. wrong no of nonzeros"); } PetscMemzero(c->ilen,c->mbs*sizeof(int)); C = *B; } else { ierr = MatCreateSeqBAIJ(A->comm,bs,nrows*bs,ncols*bs,0,lens,&C);CHKERRQ(ierr); } c = (Mat_SeqBAIJ *)(C->data); for (i=0; iilen[row]; mat_i = c->i[i]; mat_j = c->j + mat_i; mat_a = c->a + mat_i*bs2; mat_ilen = c->ilen + i; for ( k=kstart; kj[k]])) { *mat_j++ = tcol - 1; PetscMemcpy(mat_a,a->a+k*bs2,bs2*sizeof(Scalar)); mat_a+=bs2; (*mat_ilen)++; } } } /* Free work space */ ierr = ISRestoreIndices(iscol,&icol); CHKERRQ(ierr); PetscFree(smap); PetscFree(lens); ierr = MatAssemblyBegin(C,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); ierr = MatAssemblyEnd(C,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); ierr = ISRestoreIndices(isrow,&irow); CHKERRQ(ierr); *B = C; PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatGetSubMatrix_SeqBAIJ" int MatGetSubMatrix_SeqBAIJ(Mat A,IS isrow,IS iscol,int cs,MatGetSubMatrixCall scall,Mat *B) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; IS is1,is2; int *vary,*iary,*irow,*icol,nrows,ncols,i,ierr,bs=a->bs,count; PetscFunctionBegin; ierr = ISGetIndices(isrow,&irow); CHKERRQ(ierr); ierr = ISGetIndices(iscol,&icol); CHKERRQ(ierr); ierr = ISGetSize(isrow,&nrows); CHKERRQ(ierr); ierr = ISGetSize(iscol,&ncols); CHKERRQ(ierr); /* Verify if the indices corespond to each element in a block and form the IS with compressed IS */ vary = (int *) PetscMalloc(2*(a->mbs+1)*sizeof(int)); CHKPTRQ(vary); iary = vary + a->mbs; PetscMemzero(vary,(a->mbs)*sizeof(int)); for ( i=0; imbs; i++) { if (vary[i]!=0 && vary[i]!=bs) SETERRA(1,0,"Index set does not match blocks"); if (vary[i]==bs) iary[count++] = i; } ierr = ISCreateGeneral(PETSC_COMM_SELF, count, iary,&is1); CHKERRQ(ierr); PetscMemzero(vary,(a->mbs)*sizeof(int)); for ( i=0; imbs; i++) { if (vary[i]!=0 && vary[i]!=bs) SETERRA(1,0,"MatGetSubmatrices_SeqBAIJ:"); if (vary[i]==bs) iary[count++] = i; } ierr = ISCreateGeneral(PETSC_COMM_SELF, count, iary,&is2); CHKERRQ(ierr); ierr = ISRestoreIndices(isrow,&irow); CHKERRQ(ierr); ierr = ISRestoreIndices(iscol,&icol); CHKERRQ(ierr); PetscFree(vary); ierr = MatGetSubMatrix_SeqBAIJ_Private(A,is1,is2,cs,scall,B); CHKERRQ(ierr); ISDestroy(is1); ISDestroy(is2); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatGetSubMatrices_SeqBAIJ" int MatGetSubMatrices_SeqBAIJ(Mat A,int n, IS *irow,IS *icol,MatGetSubMatrixCall scall,Mat **B) { int ierr,i; PetscFunctionBegin; if (scall == MAT_INITIAL_MATRIX) { *B = (Mat *) PetscMalloc( (n+1)*sizeof(Mat) ); CHKPTRQ(*B); } for ( i=0; idata; Scalar *x,*z,*v,sum; int mbs=a->mbs,i,*idx,*ii,n,ierr; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); idx = a->j; v = a->a; ii = a->i; for ( i=0; inz - a->m); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMult_SeqBAIJ_2" int MatMult_SeqBAIJ_2(Mat A,Vec xx,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *x,*z,*v,*xb,sum1,sum2; Scalar x1,x2; int ierr,mbs=a->mbs,i,*idx,*ii,j,n; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); idx = a->j; v = a->a; ii = a->i; for ( i=0; inz - a->m); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMult_SeqBAIJ_3" int MatMult_SeqBAIJ_3(Mat A,Vec xx,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *x,*z,*v,*xb,sum1,sum2,sum3,x1,x2,x3; int ierr,mbs=a->mbs,i,*idx,*ii,j,n; #if defined(HAVE_PRAGMA_DISJOINT) #pragma disjoint(*v,*z,*xb) #endif PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); idx = a->j; v = a->a; ii = a->i; for ( i=0; inz - a->m); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMult_SeqBAIJ_4" int MatMult_SeqBAIJ_4(Mat A,Vec xx,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *x,*z,*v,*xb,sum1,sum2,sum3,sum4,x1,x2,x3,x4; int ierr,mbs=a->mbs,i,*idx,*ii,j,n; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); idx = a->j; v = a->a; ii = a->i; for ( i=0; inz - a->m); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMult_SeqBAIJ_5" int MatMult_SeqBAIJ_5(Mat A,Vec xx,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar sum1,sum2,sum3,sum4,sum5,x1,x2,x3,x4,x5; Scalar * v,* xb,* z, * x; int ierr,mbs=a->mbs,i,*idx,*ii,j,n; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); idx = a->j; v = a->a; ii = a->i; for ( i=0; inz - a->m); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMult_SeqBAIJ_7" int MatMult_SeqBAIJ_7(Mat A,Vec xx,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *x,*z,*v,*xb,sum1,sum2,sum3,sum4,sum5,sum6,sum7; Scalar x1,x2,x3,x4,x5,x6,x7; int ierr,mbs=a->mbs,i,*idx,*ii,j,n; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); idx = a->j; v = a->a; ii = a->i; for ( i=0; inz - a->m); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMult_SeqBAIJ_N" int MatMult_SeqBAIJ_N(Mat A,Vec xx,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *x,*z,*v,*xb; Scalar _DOne = 1.0,*work,*workt,_DZero = 0.0; int ierr,mbs=a->mbs,i,*idx,*ii,bs=a->bs,j,n,bs2=a->bs2; int _One = 1,ncols,k; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); idx = a->j; v = a->a; ii = a->i; if (!a->mult_work) { k = PetscMax(a->m,a->n); a->mult_work = (Scalar *) PetscMalloc((k+1)*sizeof(Scalar));CHKPTRQ(a->mult_work); } work = a->mult_work; for ( i=0; inz*bs2 - a->m); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqBAIJ_1" int MatMultAdd_SeqBAIJ_1(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *x,*y,*z,*v,sum; int ierr,mbs=a->mbs,i,*idx,*ii,n; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(yy,&y);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); idx = a->j; v = a->a; ii = a->i; for ( i=0; inz); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqBAIJ_2" int MatMultAdd_SeqBAIJ_2(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *x,*y,*z,*v,*xb,sum1,sum2; Scalar x1,x2; int ierr,mbs=a->mbs,i,*idx,*ii,j,n; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(yy,&y);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); idx = a->j; v = a->a; ii = a->i; for ( i=0; inz); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqBAIJ_3" int MatMultAdd_SeqBAIJ_3(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *x,*y,*z,*v,*xb,sum1,sum2,sum3,x1,x2,x3; int ierr,mbs=a->mbs,i,*idx,*ii,j,n; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(yy,&y);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); idx = a->j; v = a->a; ii = a->i; for ( i=0; inz); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqBAIJ_4" int MatMultAdd_SeqBAIJ_4(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *x,*y,*z,*v,*xb,sum1,sum2,sum3,sum4,x1,x2,x3,x4; int ierr,mbs=a->mbs,i,*idx,*ii; int j,n; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(yy,&y);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); idx = a->j; v = a->a; ii = a->i; for ( i=0; inz); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqBAIJ_5" int MatMultAdd_SeqBAIJ_5(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *x,*y,*z,*v,*xb,sum1,sum2,sum3,sum4,sum5,x1,x2,x3,x4,x5; int ierr,mbs=a->mbs,i,*idx,*ii,j,n; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(yy,&y);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); idx = a->j; v = a->a; ii = a->i; for ( i=0; inz); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqBAIJ_7" int MatMultAdd_SeqBAIJ_7(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *x,*y,*z,*v,*xb,sum1,sum2,sum3,sum4,sum5,sum6,sum7; Scalar x1,x2,x3,x4,x5,x6,x7; int ierr,mbs=a->mbs,i,*idx,*ii,j,n; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(yy,&y);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); idx = a->j; v = a->a; ii = a->i; for ( i=0; inz); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqBAIJ_N" int MatMultAdd_SeqBAIJ_N(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *x,*z,*v,*xb; int mbs=a->mbs,i,*idx,*ii,bs=a->bs,j,n,bs2=a->bs2,ierr; int _One = 1,ncols,k; Scalar _DOne = 1.0, *work,*workt; PetscFunctionBegin; if ( xx != yy) { ierr = VecCopy(yy,zz); CHKERRQ(ierr); } ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); idx = a->j; v = a->a; ii = a->i; if (!a->mult_work) { k = PetscMax(a->m,a->n); a->mult_work = (Scalar *) PetscMalloc(k*sizeof(Scalar));CHKPTRQ(a->mult_work); } work = a->mult_work; for ( i=0; inz*bs2 ); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultTrans_SeqBAIJ" int MatMultTrans_SeqBAIJ(Mat A,Vec xx,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *xg,*zg,*zb; Scalar *x,*z,*v,*xb,x1,x2,x3,x4,x5; int mbs=a->mbs,i,*idx,*ii,*ai=a->i,rval,N=a->n; int bs=a->bs,j,n,bs2=a->bs2,*ib,ierr; PetscFunctionBegin; ierr = VecGetArray(xx,&xg);CHKERRQ(ierr); x = xg; ierr = VecGetArray(zz,&zg);CHKERRQ(ierr); z = zg; PetscMemzero(z,N*sizeof(Scalar)); idx = a->j; v = a->a; ii = a->i; switch (bs) { case 1: for ( i=0; imult_work) { k = PetscMax(a->m,a->n); a->mult_work = (Scalar *) PetscMalloc(k*sizeof(Scalar)); CHKPTRQ(a->mult_work); } work = a->mult_work; for ( i=0; inz*a->bs2 - a->n); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultTransAdd_SeqBAIJ" int MatMultTransAdd_SeqBAIJ(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *xg,*zg,*zb; Scalar *x,*z,*v,*xb,x1,x2,x3,x4,x5; int mbs=a->mbs,i,*idx,*ii,*ai=a->i,rval,N=a->n; int bs=a->bs,j,n,bs2=a->bs2,*ib,ierr; PetscFunctionBegin; ierr = VecGetArray(xx,&xg);CHKERRQ(ierr); x = xg; ierr = VecGetArray(zz,&zg);CHKERRQ(ierr); z = zg; if ( yy != zz ) { ierr = VecCopy(yy,zz); CHKERRQ(ierr); } else PetscMemzero(z,N*sizeof(Scalar)); idx = a->j; v = a->a; ii = a->i; switch (bs) { case 1: for ( i=0; imult_work) { k = PetscMax(a->m,a->n); a->mult_work = (Scalar *) PetscMalloc(k*sizeof(Scalar)); CHKPTRQ(a->mult_work); } work = a->mult_work; for ( i=0; inz*a->bs2); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatScale_SeqBAIJ" int MatScale_SeqBAIJ(Scalar *alpha,Mat inA) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) inA->data; int one = 1, totalnz = a->bs2*a->nz; PetscFunctionBegin; BLscal_( &totalnz, alpha, a->a, &one ); PLogFlops(totalnz); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatNorm_SeqBAIJ" int MatNorm_SeqBAIJ(Mat A,NormType type,double *norm) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; Scalar *v = a->a; double sum = 0.0; int i,nz=a->nz,bs2=a->bs2; PetscFunctionBegin; if (type == NORM_FROBENIUS) { for (i=0; i< bs2*nz; i++ ) { #if defined(USE_PETSC_COMPLEX) sum += real(conj(*v)*(*v)); v++; #else sum += (*v)*(*v); v++; #endif } *norm = sqrt(sum); } else { SETERRQ(PETSC_ERR_SUP,0,"No support for this norm yet"); } PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatEqual_SeqBAIJ" int MatEqual_SeqBAIJ(Mat A,Mat B, PetscTruth* flg) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *)A->data, *b = (Mat_SeqBAIJ *)B->data; PetscFunctionBegin; if (B->type !=MATSEQBAIJ) SETERRQ(PETSC_ERR_ARG_INCOMP,0,"Matrices must be same type"); /* If the matrix/block dimensions are not equal, or no of nonzeros or shift */ if ((a->m != b->m) || (a->n !=b->n) || (a->bs != b->bs)|| (a->nz != b->nz)) { *flg = PETSC_FALSE; PetscFunctionReturn(0); } /* if the a->i are the same */ if (PetscMemcmp(a->i,b->i, (a->mbs+1)*sizeof(int))) { *flg = PETSC_FALSE; PetscFunctionReturn(0); } /* if a->j are the same */ if (PetscMemcmp(a->j,b->j,(a->nz)*sizeof(int))) { *flg = PETSC_FALSE; PetscFunctionReturn(0); } /* if a->a are the same */ if (PetscMemcmp(a->a, b->a,(a->nz)*(a->bs)*(a->bs)*sizeof(Scalar))) { *flg = PETSC_FALSE; PetscFunctionReturn(0); } *flg = PETSC_TRUE; PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatGetDiagonal_SeqBAIJ" int MatGetDiagonal_SeqBAIJ(Mat A,Vec v) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; int ierr,i,j,k,n,row,bs,*ai,*aj,ambs,bs2; Scalar *x, zero = 0.0,*aa,*aa_j; PetscFunctionBegin; if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"Not for factored matrix"); bs = a->bs; aa = a->a; ai = a->i; aj = a->j; ambs = a->mbs; bs2 = a->bs2; ierr = VecSet(&zero,v);CHKERRQ(ierr); ierr = VecGetArray(v,&x);CHKERRQ(ierr); ierr = VecGetLocalSize(v,&n);CHKERRQ(ierr); if (n != a->m) SETERRQ(PETSC_ERR_ARG_SIZ,0,"Nonconforming matrix and vector"); for ( i=0; idata; Scalar *l,*r,x,*v,*aa,*li,*ri; int ierr,i,j,k,lm,rn,M,m,n,*ai,*aj,mbs,tmp,bs,bs2; PetscFunctionBegin; ai = a->i; aj = a->j; aa = a->a; m = a->m; n = a->n; bs = a->bs; mbs = a->mbs; bs2 = a->bs2; if (ll) { ierr = VecGetArray(ll,&l); CHKERRQ(ierr); ierr = VecGetLocalSize(ll,&lm);CHKERRQ(ierr); if (lm != m) SETERRQ(PETSC_ERR_ARG_SIZ,0,"Left scaling vector wrong length"); for ( i=0; idata; PetscFunctionBegin; info->rows_global = (double)a->m; info->columns_global = (double)a->n; info->rows_local = (double)a->m; info->columns_local = (double)a->n; info->block_size = a->bs2; info->nz_allocated = a->maxnz; info->nz_used = a->bs2*a->nz; info->nz_unneeded = (double)(info->nz_allocated - info->nz_used); /* if (info->nz_unneeded != A->info.nz_unneeded) printf("space descrepancy: maxnz-nz = %d, nz_unneeded = %d\n",(int)info->nz_unneeded,(int)A->info.nz_unneeded); */ info->assemblies = A->num_ass; info->mallocs = a->reallocs; info->memory = A->mem; if (A->factor) { info->fill_ratio_given = A->info.fill_ratio_given; info->fill_ratio_needed = A->info.fill_ratio_needed; info->factor_mallocs = A->info.factor_mallocs; } else { info->fill_ratio_given = 0; info->fill_ratio_needed = 0; info->factor_mallocs = 0; } PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatZeroEntries_SeqBAIJ" int MatZeroEntries_SeqBAIJ(Mat A) { Mat_SeqBAIJ *a = (Mat_SeqBAIJ *) A->data; PetscFunctionBegin; PetscMemzero(a->a,a->bs2*a->i[a->mbs]*sizeof(Scalar)); PetscFunctionReturn(0); }