#include "src/mat/impls/baij/seq/baij.h" #include "src/inline/spops.h" #include "src/inline/ilu.h" #include "petscbt.h" #include "src/mat/impls/sbaij/seq/sbaij.h" #undef __FUNCT__ #define __FUNCT__ "MatIncreaseOverlap_SeqSBAIJ" PetscErrorCode MatIncreaseOverlap_SeqSBAIJ(Mat A,int is_max,IS is[],int ov) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscErrorCode ierr; int brow,i,j,k,l,mbs,n,*idx,*nidx,isz,bcol,bcol_max, start,end,*ai,*aj,bs,*nidx2; PetscBT table; PetscBT table0; PetscFunctionBegin; mbs = a->mbs; ai = a->i; aj = a->j; bs = a->bs; if (ov < 0) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Negative overlap specified"); ierr = PetscBTCreate(mbs,table);CHKERRQ(ierr); ierr = PetscMalloc((mbs+1)*sizeof(int),&nidx);CHKERRQ(ierr); ierr = PetscMalloc((A->m+1)*sizeof(int),&nidx2);CHKERRQ(ierr); ierr = PetscBTCreate(mbs,table0);CHKERRQ(ierr); for (i=0; i= mbs) SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"index greater than mat-dim"); if(!PetscBTLookupSet(table,brow)) { nidx[isz++] = brow; if (bcol_max < brow) bcol_max = brow; } } ierr = ISRestoreIndices(is[i],&idx);CHKERRQ(ierr); ierr = ISDestroy(is[i]);CHKERRQ(ierr); k = 0; for (j=0; j= n) break; /* for (brow=0; brow bcol_max) break; if (PetscBTLookup(table0,bcol)){ if (!PetscBTLookupSet(table,brow)) {nidx[isz++] = brow;} break; /* for l = start; ldata,*c; PetscErrorCode ierr; int *smap,i,k,kstart,kend,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) SETERRQ(1,"MatGetSubmatrices_SeqSBAIJ: For symm. format, iscol must equal isro"); ierr = ISSorted(iscol,(PetscTruth*)&i);CHKERRQ(ierr); if (!i) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"IS is not sorted"); ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); ierr = ISGetSize(isrow,&nrows);CHKERRQ(ierr); ierr = PetscMalloc((1+oldcols)*sizeof(int),&smap);CHKERRQ(ierr); ssmap = smap; ierr = PetscMalloc((1+nrows)*sizeof(int),&lens);CHKERRQ(ierr); 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,"Submatrix wrong size"); ierr = PetscMemcmp(c->ilen,lens,c->mbs *sizeof(int),&flag);CHKERRQ(ierr); if (flag == PETSC_FALSE) { SETERRQ(PETSC_ERR_ARG_SIZ,"Cannot reuse matrix. wrong no of nonzeros"); } ierr = PetscMemzero(c->ilen,c->mbs*sizeof(int));CHKERRQ(ierr); C = *B; } else { ierr = MatCreate(A->comm,nrows*bs,nrows*bs,PETSC_DETERMINE,PETSC_DETERMINE,&C);CHKERRQ(ierr); ierr = MatSetType(C,A->type_name);CHKERRQ(ierr); ierr = MatSeqSBAIJSetPreallocation(C,bs,0,lens);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 __FUNCT__ #define __FUNCT__ "MatGetSubMatrix_SeqSBAIJ" PetscErrorCode MatGetSubMatrix_SeqSBAIJ(Mat A,IS isrow,IS iscol,int cs,MatReuse scall,Mat *B) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; IS is1; PetscErrorCode ierr; int *vary,*iary,*irow,nrows,i,bs=a->bs,count; PetscFunctionBegin; if (isrow != iscol) SETERRQ(1,"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 */ ierr = PetscMalloc(2*(a->mbs+1)*sizeof(int),&vary);CHKERRQ(ierr); 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) SETERRQ(1,"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 __FUNCT__ #define __FUNCT__ "MatGetSubMatrices_SeqSBAIJ" PetscErrorCode MatGetSubMatrices_SeqSBAIJ(Mat A,int n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) { PetscErrorCode ierr; int i; PetscFunctionBegin; if (scall == MAT_INITIAL_MATRIX) { ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr); } for (i=0; idata; PetscScalar *x,*z,*xb,x1,zero=0.0; MatScalar *v; PetscErrorCode ierr; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,*ib,cval,j,jmin; 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; inz*2 - A->m) - A->m); /* nz = (nz+m)/2 */ PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMult_SeqSBAIJ_2" PetscErrorCode MatMult_SeqSBAIJ_2(Mat A,Vec xx,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*z,*xb,x1,x2,zero=0.0; MatScalar *v; PetscErrorCode ierr; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,*ib,cval,j,jmin; 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; inz*2 - A->m) - A->m); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMult_SeqSBAIJ_3" PetscErrorCode MatMult_SeqSBAIJ_3(Mat A,Vec xx,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*z,*xb,x1,x2,x3,zero=0.0; MatScalar *v; PetscErrorCode ierr; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,*ib,cval,j,jmin; 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; inz*2 - A->m) - A->m); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMult_SeqSBAIJ_4" PetscErrorCode MatMult_SeqSBAIJ_4(Mat A,Vec xx,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*z,*xb,x1,x2,x3,x4,zero=0.0; MatScalar *v; PetscErrorCode ierr; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,*ib,cval,j,jmin; 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; inz*2 - A->m) - A->m); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMult_SeqSBAIJ_5" PetscErrorCode MatMult_SeqSBAIJ_5(Mat A,Vec xx,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*z,*xb,x1,x2,x3,x4,x5,zero=0.0; MatScalar *v; PetscErrorCode ierr; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,*ib,cval,j,jmin; 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; inz*2 - A->m) - A->m); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMult_SeqSBAIJ_6" PetscErrorCode MatMult_SeqSBAIJ_6(Mat A,Vec xx,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*z,*xb,x1,x2,x3,x4,x5,x6,zero=0.0; MatScalar *v; PetscErrorCode ierr; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,*ib,cval,j,jmin; 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; inz*2 - A->m) - A->m); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMult_SeqSBAIJ_7" PetscErrorCode MatMult_SeqSBAIJ_7(Mat A,Vec xx,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*z,*xb,x1,x2,x3,x4,x5,x6,x7,zero=0.0; MatScalar *v; PetscErrorCode ierr; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,*ib,cval,j,jmin; 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; inz*2 - A->m) - A->m); PetscFunctionReturn(0); } /* This will not work with MatScalar == float because it calls the BLAS */ #undef __FUNCT__ #define __FUNCT__ "MatMult_SeqSBAIJ_N" PetscErrorCode MatMult_SeqSBAIJ_N(Mat A,Vec xx,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*x_ptr,*z,*z_ptr,*xb,*zb,*work,*workt,zero=0.0; MatScalar *v; PetscErrorCode ierr; int 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) { ierr = PetscMalloc((A->m+1)*sizeof(PetscScalar),&a->mult_work);CHKERRQ(ierr); } work = a->mult_work; for (i=0; i 0){ workt = work; ierr = PetscMemzero(workt,ncols*sizeof(PetscScalar));CHKERRQ(ierr); Kernel_w_gets_w_plus_trans_Ar_times_v(bs,ncols,x,v,workt); for (j=0; jnz*2 - A->m)*bs2 - A->m); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMultAdd_SeqSBAIJ_1" PetscErrorCode MatMultAdd_SeqSBAIJ_1(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*y,*z,*xb,x1; MatScalar *v; PetscErrorCode ierr; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,*ib,cval,j,jmin; 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); ierr = PetscMemcpy(z,y,yy->n*sizeof(PetscScalar));CHKERRQ(ierr); } else { z = y; } v = a->a; xb = x; for (i=0; inz*2 - A->m)); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMultAdd_SeqSBAIJ_2" PetscErrorCode MatMultAdd_SeqSBAIJ_2(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*y,*z,*xb,x1,x2; MatScalar *v; PetscErrorCode ierr; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,*ib,cval,j,jmin; 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); ierr = PetscMemcpy(z,y,yy->n*sizeof(PetscScalar));CHKERRQ(ierr); } else { z = y; } v = a->a; xb = x; for (i=0; inz*2 - A->m)); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMultAdd_SeqSBAIJ_3" PetscErrorCode MatMultAdd_SeqSBAIJ_3(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*y,*z,*xb,x1,x2,x3; MatScalar *v; PetscErrorCode ierr; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,*ib,cval,j,jmin; 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); ierr = PetscMemcpy(z,y,yy->n*sizeof(PetscScalar));CHKERRQ(ierr); } else { z = y; } v = a->a; xb = x; for (i=0; inz*2 - A->m)); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMultAdd_SeqSBAIJ_4" PetscErrorCode MatMultAdd_SeqSBAIJ_4(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*y,*z,*xb,x1,x2,x3,x4; MatScalar *v; PetscErrorCode ierr; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,*ib,cval,j,jmin; 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); ierr = PetscMemcpy(z,y,yy->n*sizeof(PetscScalar));CHKERRQ(ierr); } else { z = y; } v = a->a; xb = x; for (i=0; inz*2 - A->m)); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMultAdd_SeqSBAIJ_5" PetscErrorCode MatMultAdd_SeqSBAIJ_5(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*y,*z,*xb,x1,x2,x3,x4,x5; MatScalar *v; PetscErrorCode ierr; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,*ib,cval,j,jmin; 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); ierr = PetscMemcpy(z,y,yy->n*sizeof(PetscScalar));CHKERRQ(ierr); } else { z = y; } v = a->a; xb = x; for (i=0; inz*2 - A->m)); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMultAdd_SeqSBAIJ_6" PetscErrorCode MatMultAdd_SeqSBAIJ_6(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*y,*z,*xb,x1,x2,x3,x4,x5,x6; MatScalar *v; PetscErrorCode ierr; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,*ib,cval,j,jmin; 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); ierr = PetscMemcpy(z,y,yy->n*sizeof(PetscScalar));CHKERRQ(ierr); } else { z = y; } v = a->a; xb = x; for (i=0; inz*2 - A->m)); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMultAdd_SeqSBAIJ_7" PetscErrorCode MatMultAdd_SeqSBAIJ_7(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*y,*z,*xb,x1,x2,x3,x4,x5,x6,x7; MatScalar *v; PetscErrorCode ierr; int mbs=a->mbs,i,*aj=a->j,*ai=a->i,n,*ib,cval,j,jmin; 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); ierr = PetscMemcpy(z,y,yy->n*sizeof(PetscScalar));CHKERRQ(ierr); } else { z = y; } v = a->a; xb = x; for (i=0; inz*2 - A->m)); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMultAdd_SeqSBAIJ_N" PetscErrorCode MatMultAdd_SeqSBAIJ_N(Mat A,Vec xx,Vec yy,Vec zz) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscScalar *x,*x_ptr,*y,*z,*z_ptr=0,*xb,*zb,*work,*workt; MatScalar *v; PetscErrorCode ierr; int 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; ierr = PetscMemcpy(z,y,yy->n*sizeof(PetscScalar));CHKERRQ(ierr); } else { z = y; } aj = a->j; v = a->a; ii = a->i; if (!a->mult_work) { ierr = PetscMalloc((A->m+1)*sizeof(PetscScalar),&a->mult_work);CHKERRQ(ierr); } work = a->mult_work; for (i=0; i 0){ workt = work; ierr = PetscMemzero(workt,ncols*sizeof(PetscScalar));CHKERRQ(ierr); Kernel_w_gets_w_plus_trans_Ar_times_v(bs,ncols,x,v,workt); for (j=0; jnz*2 - A->m)); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMultTranspose_SeqSBAIJ" PetscErrorCode MatMultTranspose_SeqSBAIJ(Mat A,Vec xx,Vec zz) { PetscErrorCode ierr; PetscFunctionBegin; ierr = MatMult(A,xx,zz);CHKERRQ(ierr); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatMultTransposeAdd_SeqSBAIJ" PetscErrorCode MatMultTransposeAdd_SeqSBAIJ(Mat A,Vec xx,Vec yy,Vec zz) { PetscErrorCode ierr; PetscFunctionBegin; ierr = MatMultAdd(A,xx,yy,zz);CHKERRQ(ierr); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatScale_SeqSBAIJ" PetscErrorCode MatScale_SeqSBAIJ(const PetscScalar *alpha,Mat inA) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)inA->data; int one = 1,totalnz = a->bs2*a->nz; PetscFunctionBegin; BLscal_(&totalnz,(PetscScalar*)alpha,a->a,&one); PetscLogFlops(totalnz); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatNorm_SeqSBAIJ" PetscErrorCode 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,*aj=a->j; PetscErrorCode ierr; int *jl,*il,jmin,jmax,nexti,ik,*col; PetscFunctionBegin; if (type == NORM_FROBENIUS) { for (k=0; ki[k]; jmax = a->i[k+1]; col = aj + jmin; if (*col == k){ /* 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,"No support for this norm yet"); } PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatEqual_SeqSBAIJ" PetscErrorCode MatEqual_SeqSBAIJ(Mat A,Mat B,PetscTruth* flg) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ *)A->data,*b = (Mat_SeqSBAIJ *)B->data; PetscErrorCode ierr; PetscFunctionBegin; /* 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 */ 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->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->nz)*(a->bs)*(a->bs)*sizeof(PetscScalar),flg);CHKERRQ(ierr); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatGetDiagonal_SeqSBAIJ" PetscErrorCode MatGetDiagonal_SeqSBAIJ(Mat A,Vec v) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscErrorCode ierr; int i,j,k,n,row,bs,*ai,*aj,ambs,bs2; PetscScalar *x,zero = 0.0; MatScalar *aa,*aa_j; PetscFunctionBegin; bs = a->bs; if (A->factor && bs>1) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix with bs>1"); 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,"Nonconforming matrix and vector"); for (i=0; ifactor && bs==1){ for (k=0; kdata; PetscScalar *l,*r,x,*li,*ri; MatScalar *aa,*v; PetscErrorCode ierr; int 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,"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,"Left scaling vector wrong length"); for (i=0; inz); } /* 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,"Right scaling vector wrong length"); for (i=0; inz); } PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatGetInfo_SeqSBAIJ" PetscErrorCode 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->maxnz; /*num. of nonzeros in upper triangular part */ info->nz_used = a->bs2*a->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 __FUNCT__ #define __FUNCT__ "MatZeroEntries_SeqSBAIJ" PetscErrorCode MatZeroEntries_SeqSBAIJ(Mat A) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscMemzero(a->a,a->bs2*a->i[a->mbs]*sizeof(MatScalar));CHKERRQ(ierr); PetscFunctionReturn(0); } #undef __FUNCT__ #define __FUNCT__ "MatGetRowMax_SeqSBAIJ" PetscErrorCode MatGetRowMax_SeqSBAIJ(Mat A,Vec v) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data; PetscErrorCode ierr; int i,j,n,row,col,bs,*ai,*aj,mbs; PetscReal atmp; MatScalar *aa; PetscScalar zero = 0.0,*x; int ncols,brow,bcol,krow,kcol; PetscFunctionBegin; if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); bs = a->bs; aa = a->a; ai = a->i; aj = a->j; mbs = a->mbs; 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,"Nonconforming matrix and vector"); for (i=0; i i && PetscRealPart(x[col]) < atmp) x[col] = atmp; } } aj++; } } ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); PetscFunctionReturn(0); }