/*$Id: dgefa3.c,v 1.16 2000/04/09 04:36:19 bsmith Exp bsmith $*/ /* Inverts 3 by 3 matrix using partial pivoting. Used by the sparse factorization routines in src/mat/impls/baij/seq and src/mat/impls/bdiag/seq See also src/inline/ilu.h This is a combination of the Linpack routines dgefa() and dgedi() specialized for a size of 3. */ #include "petsc.h" #undef __FUNC__ #define __FUNC__ /**/"Kernel_A_gets_inverse_A_3" int Kernel_A_gets_inverse_A_3(MatScalar *a) { int i__2,i__3,kp1,j,k,l,ll,i,ipvt_l[3],*ipvt = ipvt_l-1,kb,k3; int k4,j3; MatScalar *aa,*ax,*ay,work_l[9],*work = work_l-1,stmp; MatReal tmp,max; /* gaussian elimination with partial pivoting */ PetscFunctionBegin; /* Parameter adjustments */ a -= 4; for (k = 1; k <= 2; ++k) { kp1 = k + 1; k3 = 3*k; k4 = k3 + k; /* find l = pivot index */ i__2 = 4 - k; aa = &a[k4]; max = PetscAbsScalar(aa[0]); l = 1; for (ll=1; ll max) { max = tmp; l = ll+1;} } l += k - 1; ipvt[k] = l; if (a[l + k3] == 0.) { SETERRQ(k,0,"Zero pivot"); } /* interchange if necessary */ if (l != k) { stmp = a[l + k3]; a[l + k3] = a[k4]; a[k4] = stmp; } /* compute multipliers */ stmp = -1. / a[k4]; i__2 = 3 - k; aa = &a[1 + k4]; for (ll=0; ll