#define PETSCMAT_DLL #include "src/mat/impls/sbaij/seq/sbaij.h" #include "src/inline/ilu.h" /* Version for when blocks are 6 by 6 */ #undef __FUNCT__ #define __FUNCT__ "MatCholeskyFactorNumeric_SeqSBAIJ_6" PetscErrorCode MatCholeskyFactorNumeric_SeqSBAIJ_6(Mat A,MatFactorInfo *info,Mat *B) { Mat C = *B; Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data,*b = (Mat_SeqSBAIJ *)C->data; IS perm = b->row; PetscErrorCode ierr; PetscInt *perm_ptr,i,j,mbs=a->mbs,*bi=b->i,*bj=b->j; PetscInt *ai,*aj,*a2anew,k,k1,jmin,jmax,*jl,*il,vj,nexti,ili; MatScalar *ba = b->a,*aa,*ap,*dk,*uik; MatScalar *u,*d,*w,*wp,u0,u1,u2,u3,u4,u5,u6,u7,u8,u9,u10,u11,u12; MatScalar u13,u14,u15,u16,u17,u18,u19,u20,u21,u22,u23,u24,u25,u26,u27; MatScalar u28,u29,u30,u31,u32,u33,u34,u35; PetscReal shift = info->shiftinblocks; PetscFunctionBegin; /* initialization */ ierr = PetscMalloc(36*mbs*sizeof(MatScalar),&w);CHKERRQ(ierr); ierr = PetscMemzero(w,36*mbs*sizeof(MatScalar));CHKERRQ(ierr); ierr = PetscMalloc(2*mbs*sizeof(PetscInt),&il);CHKERRQ(ierr); jl = il + mbs; for (i=0; ipermute){ ai = a->i; aj = a->j; aa = a->a; } else { ai = a->inew; aj = a->jnew; ierr = PetscMalloc(36*ai[mbs]*sizeof(MatScalar),&aa);CHKERRQ(ierr); ierr = PetscMemcpy(aa,a->a,36*ai[mbs]*sizeof(MatScalar));CHKERRQ(ierr); ierr = PetscMalloc(ai[mbs]*sizeof(PetscInt),&a2anew);CHKERRQ(ierr); ierr = PetscMemcpy(a2anew,a->a2anew,(ai[mbs])*sizeof(PetscInt));CHKERRQ(ierr); for (i=0; i aj[j]){ /* printf("change orientation, row: %d, col: %d\n",i,aj[j]); */ ap = aa + j*36; /* ptr to the beginning of j-th block of aa */ for (k=0; k<36; k++) dk[k] = ap[k]; /* dk <- j-th block of aa */ for (k=0; k<6; k++){ /* j-th block of aa <- dk^T */ for (k1=0; k1<6; k1++) *ap++ = dk[k + 6*k1]; } } } } ierr = PetscFree(a2anew);CHKERRQ(ierr); } /* for each row k */ for (k = 0; kpermute){ ierr = PetscFree(aa);CHKERRQ(ierr); } ierr = ISRestoreIndices(perm,&perm_ptr);CHKERRQ(ierr); C->ops->solve = MatSolve_SeqSBAIJ_6; C->ops->solvetranspose = MatSolve_SeqSBAIJ_6; C->assembled = PETSC_TRUE; C->preallocated = PETSC_TRUE; ierr = PetscLogFlops(1.3333*216*b->mbs);CHKERRQ(ierr); /* from inverting diagonal blocks */ PetscFunctionReturn(0); }