#define PETSCMAT_DLL /* Factorization code for BAIJ format. */ #include "src/mat/impls/baij/seq/baij.h" #include "src/inline/ilu.h" /* ------------------------------------------------------------*/ /* Version for when blocks are 4 by 4 */ #undef __FUNCT__ #define __FUNCT__ "MatLUFactorNumeric_SeqBAIJ_4" PetscErrorCode MatLUFactorNumeric_SeqBAIJ_4(Mat A,MatFactorInfo *info,Mat *B) { Mat C = *B; Mat_SeqBAIJ *a = (Mat_SeqBAIJ*)A->data,*b = (Mat_SeqBAIJ *)C->data; IS isrow = b->row,isicol = b->icol; PetscErrorCode ierr; PetscInt *r,*ic,i,j,n = a->mbs,*bi = b->i,*bj = b->j; PetscInt *ajtmpold,*ajtmp,nz,row; PetscInt *diag_offset = b->diag,idx,*ai=a->i,*aj=a->j,*pj; MatScalar *pv,*v,*rtmp,*pc,*w,*x; MatScalar p1,p2,p3,p4,m1,m2,m3,m4,m5,m6,m7,m8,m9,x1,x2,x3,x4; MatScalar p5,p6,p7,p8,p9,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16; MatScalar p10,p11,p12,p13,p14,p15,p16,m10,m11,m12; MatScalar m13,m14,m15,m16; MatScalar *ba = b->a,*aa = a->a; PetscTruth pivotinblocks = b->pivotinblocks; PetscReal shift = info->shiftinblocks; PetscFunctionBegin; ierr = ISGetIndices(isrow,&r);CHKERRQ(ierr); ierr = ISGetIndices(isicol,&ic);CHKERRQ(ierr); ierr = PetscMalloc(16*(n+1)*sizeof(MatScalar),&rtmp);CHKERRQ(ierr); for (i=0; ia */ pv = ba + 16*bi[i]; pj = bj + bi[i]; nz = bi[i+1] - bi[i]; for (j=0; jops->solve = MatSolve_SeqBAIJ_4; C->ops->solvetranspose = MatSolveTranspose_SeqBAIJ_4; C->assembled = PETSC_TRUE; ierr = PetscLogFlops(1.3333*64*b->mbs);CHKERRQ(ierr); /* from inverting diagonal blocks */ PetscFunctionReturn(0); }