/*$Id: sbaij2.c,v 1.7 2000/09/06 19:53:50 hzhang Exp hzhang $*/ #include "petscsys.h" #include "src/mat/impls/baij/seq/baij.h" #include "src/vec/vecimpl.h" #include "src/inline/spops.h" #include "src/inline/ilu.h" #include "petscbt.h" #include "sbaij.h" #undef __FUNC__ #define __FUNC__ "MatIncreaseOverlap_SeqSBAIJ" int MatIncreaseOverlap_SeqSBAIJ(Mat A,int is_max,IS *is,int ov) { PetscFunctionBegin; SETERRQ(1,1,"Function not yet written for SBAIJ format"); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatGetSubMatrix_SeqSBAIJ_Private" int MatGetSubMatrix_SeqSBAIJ_Private(Mat A,IS isrow,IS iscol,int cs,MatReuse scall,Mat *B) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data,*c; int *smap,i,k,kstart,kend,ierr,oldcols = a->mbs,*lens; int row,mat_i,*mat_j,tcol,*mat_ilen; int *irow,nrows,*ssmap,bs=a->bs,bs2=a->bs2; int *aj = a->j,*ai = a->i; MatScalar *mat_a; Mat C; PetscTruth flag; PetscFunctionBegin; if (isrow != iscol) SETERRA(1,0,"MatGetSubmatrices_SeqSBAIJ: For symm. format, iscol must equal isro"); ierr = ISSorted(iscol,(PetscTruth*)&i);CHKERRQ(ierr); if (!i) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,0,"IS is not sorted"); ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); ierr = ISGetSize(isrow,&nrows);CHKERRQ(ierr); smap = (int*)PetscMalloc((1+oldcols)*sizeof(int));CHKPTRQ(smap); ssmap = smap; lens = (int*)PetscMalloc((1+nrows)*sizeof(int));CHKPTRQ(lens); ierr = PetscMemzero(smap,oldcols*sizeof(int));CHKERRQ(ierr); for (i=0; iilen[irow[i]]; lens[i] = 0; for (k=kstart; kdata); if (c->mbs!=nrows || c->bs!=bs) SETERRQ(PETSC_ERR_ARG_SIZ,0,"Submatrix wrong size"); ierr = PetscMemcmp(c->ilen,lens,c->mbs *sizeof(int),&flag);CHKERRQ(ierr); if (flag == PETSC_FALSE) { SETERRQ(PETSC_ERR_ARG_SIZ,0,"Cannot reuse matrix. wrong no of nonzeros"); } ierr = PetscMemzero(c->ilen,c->mbs*sizeof(int));CHKERRQ(ierr); C = *B; } else { ierr = MatCreateSeqSBAIJ(A->comm,bs,nrows*bs,nrows*bs,0,lens,&C);CHKERRQ(ierr); } c = (Mat_SeqSBAIJ *)(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; ierr = PetscMemcpy(mat_a,a->a+k*bs2,bs2*sizeof(MatScalar));CHKERRQ(ierr); mat_a += bs2; (*mat_ilen)++; } } } /* Free work space */ ierr = PetscFree(smap);CHKERRQ(ierr); ierr = PetscFree(lens);CHKERRQ(ierr); 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_SeqSBAIJ" int MatGetSubMatrix_SeqSBAIJ(Mat A,IS isrow,IS iscol,int cs,MatReuse scall,Mat *B) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; IS is1; int *vary,*iary,*irow,nrows,i,ierr,bs=a->bs,count; PetscFunctionBegin; if (isrow != iscol) SETERRA(1,0,"MatGetSubmatrices_SeqSBAIJ: For symm. format, iscol must equal isro"); ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); ierr = ISGetSize(isrow,&nrows);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; ierr = PetscMemzero(vary,(a->mbs)*sizeof(int));CHKERRQ(ierr); 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); ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); ierr = PetscFree(vary);CHKERRQ(ierr); ierr = MatGetSubMatrix_SeqSBAIJ_Private(A,is1,is1,cs,scall,B);CHKERRQ(ierr); ISDestroy(is1); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatGetSubMatrices_SeqSBAIJ" int MatGetSubMatrices_SeqSBAIJ(Mat A,int n,IS *irow,IS *icol,MatReuse 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,*xb,x1,zero=0.0; MatScalar *v; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,ierr,*ib,cval,j; PetscFunctionBegin; ierr = VecSet(&zero,zz);CHKERRQ(ierr); ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); v = a->a; xb = x; for (i=0; is_nz*2 - a->m) - a->m); /* s_nz = (nz+m)/2 */ PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMult_SeqSBAIJ_2" int MatMult_SeqSBAIJ_2(Mat A,Vec xx,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*z,*xb,x1,x2,zero=0.0; MatScalar *v; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,ierr,*ib,cval,j; PetscFunctionBegin; ierr = VecSet(&zero,zz);CHKERRQ(ierr); ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); v = a->a; xb = x; for (i=0; is_nz*2 - a->m) - a->m); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMult_SeqSBAIJ_3" int MatMult_SeqSBAIJ_3(Mat A,Vec xx,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*z,*xb,x1,x2,x3,zero=0.0; MatScalar *v; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,ierr,*ib,cval,j; PetscFunctionBegin; ierr = VecSet(&zero,zz);CHKERRQ(ierr); ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); v = a->a; xb = x; for (i=0; is_nz*2 - a->m) - a->m); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMult_SeqSBAIJ_4" int MatMult_SeqSBAIJ_4(Mat A,Vec xx,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*z,*xb,x1,x2,x3,x4,zero=0.0; MatScalar *v; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,ierr,*ib,cval,j; PetscFunctionBegin; ierr = VecSet(&zero,zz);CHKERRQ(ierr); ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); v = a->a; xb = x; for (i=0; is_nz*2 - a->m) - a->m); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMult_SeqSBAIJ_5" int MatMult_SeqSBAIJ_5(Mat A,Vec xx,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*z,*xb,x1,x2,x3,x4,x5,zero=0.0; MatScalar *v; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,ierr,*ib,cval,j; PetscFunctionBegin; ierr = VecSet(&zero,zz);CHKERRQ(ierr); ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); v = a->a; xb = x; for (i=0; is_nz*2 - a->m) - a->m); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMult_SeqSBAIJ_6" int MatMult_SeqSBAIJ_6(Mat A,Vec xx,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*z,*xb,x1,x2,x3,x4,x5,x6,zero=0.0; MatScalar *v; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,ierr,*ib,cval,j; PetscFunctionBegin; ierr = VecSet(&zero,zz);CHKERRQ(ierr); ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); v = a->a; xb = x; for (i=0; is_nz*2 - a->m) - a->m); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMult_SeqSBAIJ_7" int MatMult_SeqSBAIJ_7(Mat A,Vec xx,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*z,*xb,x1,x2,x3,x4,x5,x6,x7,zero=0.0; MatScalar *v; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,ierr,*ib,cval,j; PetscFunctionBegin; ierr = VecSet(&zero,zz);CHKERRQ(ierr); ierr = VecGetArray(xx,&x);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); v = a->a; xb = x; for (i=0; is_nz*2 - a->m) - a->m); PetscFunctionReturn(0); } /* This will not work with MatScalar == float because it calls the BLAS */ #undef __FUNC__ #define __FUNC__ "MatMult_SeqSBAIJ_N" int MatMult_SeqSBAIJ_N(Mat A,Vec xx,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*x_ptr,*z,*z_ptr,*xb,*zb,*work,*workt,zero=0.0; MatScalar *v; int ierr,mbs=a->mbs,i,*idx,*aj,*ii,bs=a->bs,j,n,bs2=a->bs2; int ncols,k; PetscFunctionBegin; ierr = VecSet(&zero,zz);CHKERRQ(ierr); ierr = VecGetArray(xx,&x);CHKERRQ(ierr); x_ptr=x; ierr = VecGetArray(zz,&z);CHKERRQ(ierr); z_ptr=z; aj = a->j; v = a->a; ii = a->i; if (!a->mult_work) { k = a->m; a->mult_work = (Scalar*)PetscMalloc((k+1)*sizeof(Scalar));CHKPTRQ(a->mult_work); } work = a->mult_work; for (i=0; i 0){ workt = work; ierr = PetscMemzero(workt,ncols*sizeof(Scalar));CHKERRQ(ierr); Kernel_w_gets_w_plus_trans_Ar_times_v(bs,ncols,x,v+bs2,workt); idx=aj+ii[0]+1; for (j=1; js_nz*2 - a->m)*bs2 - a->m); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqSBAIJ_1" int MatMultAdd_SeqSBAIJ_1(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*y,*z,*xb,x1; MatScalar *v; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,ierr,*ib,cval,j; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); if (yy != xx) { ierr = VecGetArray(yy,&y);CHKERRQ(ierr); } else { y = x; } if (zz != yy) { ierr = VecCopy(yy,zz);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); } else { z = y; } v = a->a; xb = x; for (i=0; is_nz*2 - a->m)); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqSBAIJ_2" int MatMultAdd_SeqSBAIJ_2(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*y,*z,*xb,x1,x2; MatScalar *v; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,ierr,*ib,cval,j; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); if (yy != xx) { ierr = VecGetArray(yy,&y);CHKERRQ(ierr); } else { y = x; } if (zz != yy) { ierr = VecCopy(yy,zz);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); } else { z = y; } v = a->a; xb = x; for (i=0; is_nz*2 - a->m)); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqSBAIJ_3" int MatMultAdd_SeqSBAIJ_3(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*y,*z,*xb,x1,x2,x3; MatScalar *v; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,ierr,*ib,cval,j; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); if (yy != xx) { ierr = VecGetArray(yy,&y);CHKERRQ(ierr); } else { y = x; } if (zz != yy) { ierr = VecCopy(yy,zz);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); } else { z = y; } v = a->a; xb = x; for (i=0; is_nz*2 - a->m)); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqSBAIJ_4" int MatMultAdd_SeqSBAIJ_4(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*y,*z,*xb,x1,x2,x3,x4; MatScalar *v; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,ierr,*ib,cval,j; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); if (yy != xx) { ierr = VecGetArray(yy,&y);CHKERRQ(ierr); } else { y = x; } if (zz != yy) { ierr = VecCopy(yy,zz);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); } else { z = y; } v = a->a; xb = x; for (i=0; is_nz*2 - a->m)); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqSBAIJ_5" int MatMultAdd_SeqSBAIJ_5(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*y,*z,*xb,x1,x2,x3,x4,x5; MatScalar *v; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,ierr,*ib,cval,j; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); if (yy != xx) { ierr = VecGetArray(yy,&y);CHKERRQ(ierr); } else { y = x; } if (zz != yy) { ierr = VecCopy(yy,zz);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); } else { z = y; } v = a->a; xb = x; for (i=0; is_nz*2 - a->m)); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqSBAIJ_6" int MatMultAdd_SeqSBAIJ_6(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*y,*z,*xb,x1,x2,x3,x4,x5,x6; MatScalar *v; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,ierr,*ib,cval,j; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); if (yy != xx) { ierr = VecGetArray(yy,&y);CHKERRQ(ierr); } else { y = x; } if (zz != yy) { ierr = VecCopy(yy,zz);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); } else { z = y; } v = a->a; xb = x; for (i=0; is_nz*2 - a->m)); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqSBAIJ_7" int MatMultAdd_SeqSBAIJ_7(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*y,*z,*xb,x1,x2,x3,x4,x5,x6,x7; MatScalar *v; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,ierr,*ib,cval,j; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); if (yy != xx) { ierr = VecGetArray(yy,&y);CHKERRQ(ierr); } else { y = x; } if (zz != yy) { ierr = VecCopy(yy,zz);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); } else { z = y; } v = a->a; xb = x; for (i=0; is_nz*2 - a->m)); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultAdd_SeqSBAIJ_N" int MatMultAdd_SeqSBAIJ_N(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; Scalar *x,*x_ptr,*y,*z,*z_ptr=0,*xb,*zb,*work,*workt; MatScalar *v; int ierr,mbs=a->mbs,i,*idx,*aj,*ii,bs=a->bs,j,n,bs2=a->bs2; int ncols,k; PetscFunctionBegin; ierr = VecGetArray(xx,&x);CHKERRQ(ierr); x_ptr=x; if (yy != xx) { ierr = VecGetArray(yy,&y);CHKERRQ(ierr); } else { y = x; } if (zz != yy) { ierr = VecCopy(yy,zz);CHKERRQ(ierr); ierr = VecGetArray(zz,&z);CHKERRQ(ierr); z_ptr=z; } else { z = y; } aj = a->j; v = a->a; ii = a->i; if (!a->mult_work) { k = a->m; a->mult_work = (Scalar*)PetscMalloc((k+1)*sizeof(Scalar));CHKPTRQ(a->mult_work); } work = a->mult_work; for (i=0; i 0){ workt = work; ierr = PetscMemzero(workt,ncols*sizeof(Scalar));CHKERRQ(ierr); Kernel_w_gets_w_plus_trans_Ar_times_v(bs,ncols,x,v+bs2,workt); idx=aj+ii[0]+1; for (j=1; js_nz*2 - a->m)); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultTranspose_SeqSBAIJ" int MatMultTranspose_SeqSBAIJ(Mat A,Vec xx,Vec zz) { PetscFunctionBegin; SETERRQ(1,1,"Matrix is symmetric. Call MatMult()."); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatMultTransposeAdd_SeqSBAIJ" int MatMultTransposeAdd_SeqSBAIJ(Mat A,Vec xx,Vec yy,Vec zz) { PetscFunctionBegin; SETERRQ(1,1,"Matrix is symmetric. Call MatMultAdd()."); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatScale_SeqSBAIJ" int MatScale_SeqSBAIJ(Scalar *alpha,Mat inA) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)inA->data; int one = 1,totalnz = a->bs2*a->s_nz; PetscFunctionBegin; BLscal_(&totalnz,alpha,a->a,&one); PLogFlops(totalnz); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatNorm_SeqSBAIJ" int MatNorm_SeqSBAIJ(Mat A,NormType type,PetscReal *norm) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; MatScalar *v = a->a; PetscReal sum_diag = 0.0, sum_off = 0.0, *sum; int i,j,k,bs = a->bs,bs2=a->bs2,k1,mbs=a->mbs; int *jl,*il,jmin,jmax,ierr,nexti,ik; PetscFunctionBegin; if (type == NORM_FROBENIUS) { for (k=0; ki[k]; jmax = a->i[k+1]; /* diagonal block */ for (i=0; ia + ik*bs2 + j*bs; for (k1=0; k1i[i+1]; if (jmin < jmax){ il[i] = jmin; j = a->j[jmin]; jl[i] = jl[j]; jl[j]=i; } i = nexti; } /*-- row sum --*/ jmin = a->i[k]; jmax = a->i[k+1]; for (i=jmin; ia + i*bs2 + j; for (k1=0; k1j[jmin]; jl[k] = jl[j]; jl[j] = k; } for (j=0; j *norm) *norm = sum[j]; } } ierr = PetscFree(il);CHKERRQ(ierr); ierr = PetscFree(jl);CHKERRQ(ierr); ierr = PetscFree(sum);CHKERRQ(ierr); } else { SETERRQ(PETSC_ERR_SUP,0,"No support for this norm yet"); } PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatEqual_SeqSBAIJ" int MatEqual_SeqSBAIJ(Mat A,Mat B,PetscTruth* flg) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ *)A->data,*b = (Mat_SeqSBAIJ *)B->data; int ierr; PetscFunctionBegin; if (B->type !=MATSEQSBAIJ) 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->s_nz != b->s_nz)) { *flg = PETSC_FALSE; PetscFunctionReturn(0); } /* if the a->i are the same */ ierr = PetscMemcmp(a->i,b->i,(a->mbs+1)*sizeof(int),flg);CHKERRQ(ierr); if (*flg == PETSC_FALSE) { PetscFunctionReturn(0); } /* if a->j are the same */ ierr = PetscMemcmp(a->j,b->j,(a->s_nz)*sizeof(int),flg);CHKERRQ(ierr); if (*flg == PETSC_FALSE) { PetscFunctionReturn(0); } /* if a->a are the same */ ierr = PetscMemcmp(a->a,b->a,(a->s_nz)*(a->bs)*(a->bs)*sizeof(Scalar),flg);CHKERRQ(ierr); PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatGetDiagonal_SeqSBAIJ" int MatGetDiagonal_SeqSBAIJ(Mat A,Vec v) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; int ierr,i,j,k,n,row,bs,*ai,*aj,ambs,bs2; Scalar *x,zero = 0.0; MatScalar *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,*li,*ri; MatScalar *aa,*v; int ierr,i,j,k,lm,rn,M,m,*ai,*aj,mbs,tmp,bs,bs2; PetscFunctionBegin; ai = a->i; aj = a->j; aa = a->a; m = a->m; bs = a->bs; mbs = a->mbs; bs2 = a->bs2; if (ll != rr) { SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,0,"For symmetric format, left and right scaling vectors must be same\n"); } 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; is_nz); } /* will be deleted */ if (rr) { ierr = VecGetArray(rr,&r);CHKERRQ(ierr); ierr = VecGetLocalSize(rr,&rn);CHKERRQ(ierr); if (rn != m) SETERRQ(PETSC_ERR_ARG_SIZ,0,"Right scaling vector wrong length"); for (i=0; is_nz); } PetscFunctionReturn(0); } #undef __FUNC__ #define __FUNC__ "MatGetInfo_SeqSBAIJ" int MatGetInfo_SeqSBAIJ(Mat A,MatInfoType flag,MatInfo *info) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscFunctionBegin; info->rows_global = (double)a->m; info->columns_global = (double)a->m; info->rows_local = (double)a->m; info->columns_local = (double)a->m; info->block_size = a->bs2; info->nz_allocated = a->s_maxnz; /*num. of nonzeros in upper triangular part */ info->nz_used = a->bs2*a->s_nz; /*num. of nonzeros in upper triangular part */ info->nz_unneeded = (double)(info->nz_allocated - info->nz_used); 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_SeqSBAIJ" int MatZeroEntries_SeqSBAIJ(Mat A) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; int ierr; PetscFunctionBegin; ierr = PetscMemzero(a->a,a->bs2*a->i[a->mbs]*sizeof(MatScalar));CHKERRQ(ierr); PetscFunctionReturn(0); }