#include <../src/mat/impls/sbaij/seq/sbaij.h> #include /* Version for when blocks are 5 by 5 */ PetscErrorCode MatCholeskyFactorNumeric_SeqSBAIJ_5(Mat C,Mat A,const MatFactorInfo *info) { Mat_SeqSBAIJ *a = (Mat_SeqSBAIJ*)A->data,*b = (Mat_SeqSBAIJ*)C->data; IS perm = b->row; PetscErrorCode ierr; const PetscInt *ai,*aj,*perm_ptr,mbs=a->mbs,*bi=b->i,*bj=b->j; PetscInt i,j,*a2anew,k,k1,jmin,jmax,*jl,*il,vj,nexti,ili,ipvt[5]; MatScalar *ba = b->a,*aa,*ap,*dk,*uik; MatScalar *u,*d,*rtmp,*rtmp_ptr,work[25]; PetscReal shift = info->shiftamount; PetscBool allowzeropivot,zeropivotdetected; PetscFunctionBegin; /* initialization */ allowzeropivot = PetscNot(A->erroriffailure); ierr = PetscCalloc1(25*mbs,&rtmp);CHKERRQ(ierr); ierr = PetscMalloc2(mbs,&il,mbs,&jl);CHKERRQ(ierr); il[0] = 0; for (i=0; ipermute) { ai = a->i; aj = a->j; aa = a->a; } else { ai = a->inew; aj = a->jnew; ierr = PetscMalloc1(25*ai[mbs],&aa);CHKERRQ(ierr); ierr = PetscArraycpy(aa,a->a,25*ai[mbs]);CHKERRQ(ierr); ierr = PetscMalloc1(ai[mbs],&a2anew);CHKERRQ(ierr); ierr = PetscArraycpy(a2anew,a->a2anew,ai[mbs]);CHKERRQ(ierr); for (i=0; i aj[j]) { /* printf("change orientation, row: %d, col: %d\n",i,aj[j]); */ ap = aa + j*25; /* ptr to the beginning of j-th block of aa */ for (k=0; k<25; k++) dk[k] = ap[k]; /* dk <- j-th block of aa */ for (k=0; k<5; k++) { /* j-th block of aa <- dk^T */ for (k1=0; k1<5; k1++) *ap++ = dk[k + 5*k1]; } } } } ierr = PetscFree(a2anew);CHKERRQ(ierr); } /* for each row k */ for (k = 0; kfactorerrortype = MAT_FACTOR_NUMERIC_ZEROPIVOT; jmin = bi[k]; jmax = bi[k+1]; if (jmin < jmax) { for (j=jmin; jpermute) { ierr = PetscFree(aa);CHKERRQ(ierr); } ierr = ISRestoreIndices(perm,&perm_ptr);CHKERRQ(ierr); C->ops->solve = MatSolve_SeqSBAIJ_5_inplace; C->ops->solvetranspose = MatSolve_SeqSBAIJ_5_inplace; C->assembled = PETSC_TRUE; C->preallocated = PETSC_TRUE; ierr = PetscLogFlops(1.3333*125*b->mbs);CHKERRQ(ierr); /* from inverting diagonal blocks */ PetscFunctionReturn(0); }