/* Factorization code for BAIJ format. */ #include "src/mat/impls/baij/seq/baij.h" #include "src/inline/ilu.h" /* ------------------------------------------------------------*/ /* Version for when blocks are 2 by 2 */ #undef __FUNCT__ #define __FUNCT__ "MatLUFactorNumeric_SeqBAIJ_2" PetscErrorCode MatLUFactorNumeric_SeqBAIJ_2(Mat A,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; int *r,*ic,i,j,n = a->mbs,*bi = b->i,*bj = b->j; int *ajtmpold,*ajtmp,nz,row; int *diag_offset=b->diag,idx,*ai=a->i,*aj=a->j,*pj; MatScalar *pv,*v,*rtmp,m1,m2,m3,m4,*pc,*w,*x,x1,x2,x3,x4; MatScalar p1,p2,p3,p4; MatScalar *ba = b->a,*aa = a->a; PetscFunctionBegin; ierr = ISGetIndices(isrow,&r);CHKERRQ(ierr); ierr = ISGetIndices(isicol,&ic);CHKERRQ(ierr); ierr = PetscMalloc(4*(n+1)*sizeof(MatScalar),&rtmp);CHKERRQ(ierr); for (i=0; ia */ pv = ba + 4*bi[i]; pj = bj + bi[i]; nz = bi[i+1] - bi[i]; for (j=0; jfactor = FACTOR_LU; C->assembled = PETSC_TRUE; PetscLogFlops(1.3333*8*b->mbs); /* from inverting diagonal blocks */ PetscFunctionReturn(0); } /* Version for when blocks are 2 by 2 Using natural ordering */ #undef __FUNCT__ #define __FUNCT__ "MatLUFactorNumeric_SeqBAIJ_2_NaturalOrdering" PetscErrorCode MatLUFactorNumeric_SeqBAIJ_2_NaturalOrdering(Mat A,Mat *B) { Mat C = *B; Mat_SeqBAIJ *a = (Mat_SeqBAIJ*)A->data,*b = (Mat_SeqBAIJ *)C->data; PetscErrorCode ierr; int i,j,n = a->mbs,*bi = b->i,*bj = b->j; int *ajtmpold,*ajtmp,nz,row; int *diag_offset = b->diag,*ai=a->i,*aj=a->j,*pj; MatScalar *pv,*v,*rtmp,*pc,*w,*x; MatScalar p1,p2,p3,p4,m1,m2,m3,m4,x1,x2,x3,x4; MatScalar *ba = b->a,*aa = a->a; PetscFunctionBegin; ierr = PetscMalloc(4*(n+1)*sizeof(MatScalar),&rtmp);CHKERRQ(ierr); for (i=0; ia */ pv = ba + 4*bi[i]; pj = bj + bi[i]; nz = bi[i+1] - bi[i]; for (j=0; jfactor = FACTOR_LU; C->assembled = PETSC_TRUE; PetscLogFlops(1.3333*8*b->mbs); /* from inverting diagonal blocks */ PetscFunctionReturn(0); } /* ----------------------------------------------------------- */ /* Version for when blocks are 1 by 1. */ #undef __FUNCT__ #define __FUNCT__ "MatLUFactorNumeric_SeqBAIJ_1" PetscErrorCode MatLUFactorNumeric_SeqBAIJ_1(Mat A,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; int *r,*ic,i,j,n = a->mbs,*bi = b->i,*bj = b->j; int *ajtmpold,*ajtmp,nz,row,*ai = a->i,*aj = a->j; int *diag_offset = b->diag,diag,*pj; MatScalar *pv,*v,*rtmp,multiplier,*pc; MatScalar *ba = b->a,*aa = a->a; PetscFunctionBegin; ierr = ISGetIndices(isrow,&r);CHKERRQ(ierr); ierr = ISGetIndices(isicol,&ic);CHKERRQ(ierr); ierr = PetscMalloc((n+1)*sizeof(MatScalar),&rtmp);CHKERRQ(ierr); for (i=0; ia */ pv = ba + bi[i]; pj = bj + bi[i]; nz = bi[i+1] - bi[i]; for (j=0; jfactor = FACTOR_LU; C->assembled = PETSC_TRUE; PetscLogFlops(C->n); PetscFunctionReturn(0); } /* ----------------------------------------------------------- */ #undef __FUNCT__ #define __FUNCT__ "MatLUFactor_SeqBAIJ" PetscErrorCode MatLUFactor_SeqBAIJ(Mat A,IS row,IS col,MatFactorInfo *info) { PetscErrorCode ierr; Mat C; PetscFunctionBegin; ierr = MatLUFactorSymbolic(A,row,col,info,&C);CHKERRQ(ierr); ierr = MatLUFactorNumeric(A,&C);CHKERRQ(ierr); ierr = MatHeaderCopy(A,C);CHKERRQ(ierr); PetscLogObjectParent(A,((Mat_SeqBAIJ*)(A->data))->icol); PetscFunctionReturn(0); }