/*$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