/*$Id: dgefa2.c,v 1.5 2000/04/09 04:36:19 bsmith Exp bsmith $*/ /* Inverts 2 by 2 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 2. */ #include "petsc.h" #undef __FUNC__ #define __FUNC__ /**/"Kernel_A_gets_inverse_A_2" int Kernel_A_gets_inverse_A_2(MatScalar *a) { int i__2,i__3,kp1,j,k,l,ll,i,ipvt_l[2],*ipvt = ipvt_l-1,k3; int k4,j3; MatScalar *aa,*ax,*ay,work_l[4],*work = work_l-1,stmp; MatReal tmp,max; /* gaussian elimination with partial pivoting */ PetscFunctionBegin; /* Parameter adjustments */ a -= 3; /*for (k = 1; k <= 1; ++k) {*/ k = 1; kp1 = k + 1; k3 = 2*k; k4 = k3 + k; /* find l = pivot index */ i__2 = 2 - 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 = 2 - k; aa = &a[1 + k4]; for (ll=0; ll