xref: /petsc/src/mat/impls/baij/seq/dgedi.c (revision 3f1db9ec2fd39765c6c3a00831044586630c4cca)
1a5eb4965SSatish Balay #ifdef PETSC_RCS_HEADER
2*3f1db9ecSBarry Smith static char vcid[] = "$Id: dgedi.c,v 1.8 1998/04/21 17:47:46 bsmith Exp bsmith $";
36d84be18SBarry Smith #endif
46d84be18SBarry Smith 
56d84be18SBarry Smith /*
66d84be18SBarry Smith               This file creating by running f2c
76d84be18SBarry Smith             linpack. this version dated 08/14/78
86d84be18SBarry Smith       cleve moler, university of new mexico, argonne national lab.
96d84be18SBarry Smith 
106d84be18SBarry Smith       Computes the inverse of a matrix given its factors and pivots
116d84be18SBarry Smith     calculated by Linpack_DGEFA().
122bb67c89SBarry Smith */
132bb67c89SBarry Smith 
146d84be18SBarry Smith #include "petsc.h"
152bb67c89SBarry Smith 
165615d1e5SSatish Balay #undef __FUNC__
175615d1e5SSatish Balay #define __FUNC__ "Linpack_DGEDI"
18*3f1db9ecSBarry Smith int Linpack_DGEDI(MatScalar *a,int n,int *ipvt,MatScalar *work)
192bb67c89SBarry Smith {
208d3e6ddaSBarry Smith     int        i__2,kb, kp1, nm1,i, j, k, l, ll,kn,knp1,jn1;
21*3f1db9ecSBarry Smith     MatScalar  *aa,*ax,*ay,tmp;
22*3f1db9ecSBarry Smith     MatScalar  t;
232bb67c89SBarry Smith 
243a40ed3dSBarry Smith     PetscFunctionBegin;
256d84be18SBarry Smith     --work;
266d84be18SBarry Smith     --ipvt;
2739d66777SBarry Smith     a       -= n + 1;
282bb67c89SBarry Smith 
292bb67c89SBarry Smith    /*     compute inverse(u) */
302bb67c89SBarry Smith 
316d84be18SBarry Smith     for (k = 1; k <= n; ++k) {
3239d66777SBarry Smith         kn           = k*n;
3339d66777SBarry Smith         knp1         = kn + k;
3439d66777SBarry Smith 	a[knp1]      = 1.0 / a[knp1];
3539d66777SBarry Smith 	t            = -a[knp1];
362bb67c89SBarry Smith 	i__2         = k - 1;
3739d66777SBarry Smith         aa           = &a[1 + kn];
386d84be18SBarry Smith         for ( ll=0; ll<i__2; ll++ ) aa[ll] *= t;
392bb67c89SBarry Smith 	kp1 = k + 1;
406d84be18SBarry Smith 	if (n < kp1) continue;
416d84be18SBarry Smith         ax = aa;
426d84be18SBarry Smith         for (j = kp1; j <= n; ++j) {
438d3e6ddaSBarry Smith             jn1 = j*n;
448d3e6ddaSBarry Smith 	    t = a[k + jn1];
458d3e6ddaSBarry Smith 	    a[k + jn1] = 0.;
468d3e6ddaSBarry Smith             ay = &a[1 + jn1];
476d84be18SBarry Smith             for ( ll=0; ll<k; ll++ ) {
486d84be18SBarry Smith               ay[ll] += t*ax[ll];
492bb67c89SBarry Smith             }
502bb67c89SBarry Smith 	}
512bb67c89SBarry Smith     }
522bb67c89SBarry Smith 
532bb67c89SBarry Smith    /*    form inverse(u)*inverse(l) */
542bb67c89SBarry Smith 
556d84be18SBarry Smith     nm1 = n - 1;
562bb67c89SBarry Smith     if (nm1 < 1) {
573a40ed3dSBarry Smith 	PetscFunctionReturn(0);
582bb67c89SBarry Smith     }
596d84be18SBarry Smith     for (kb = 1; kb <= nm1; ++kb) {
606d84be18SBarry Smith 	k   = n - kb;
6139d66777SBarry Smith         kn  = k*n;
622bb67c89SBarry Smith 	kp1 = k + 1;
6339d66777SBarry Smith         aa  = a + kn;
646d84be18SBarry Smith 	for (i = kp1; i <= n; ++i) {
656d84be18SBarry Smith 	    work[i] = aa[i];
666d84be18SBarry Smith 	    aa[i]   = 0.;
672bb67c89SBarry Smith 	}
686d84be18SBarry Smith 	for (j = kp1; j <= n; ++j) {
692bb67c89SBarry Smith 	    t = work[j];
706d84be18SBarry Smith             ax = &a[j * n + 1];
7139d66777SBarry Smith             ay = &a[kn + 1];
726d84be18SBarry Smith             for ( ll=0; ll<n; ll++ ) {
736d84be18SBarry Smith               ay[ll] += t*ax[ll];
746d84be18SBarry Smith             }
752bb67c89SBarry Smith 	}
762bb67c89SBarry Smith 	l = ipvt[k];
772bb67c89SBarry Smith 	if (l != k) {
7839d66777SBarry Smith             ax = &a[kn + 1];
796d84be18SBarry Smith             ay = &a[l * n + 1];
806d84be18SBarry Smith             for ( ll=0; ll<n; ll++ ) {
816d84be18SBarry Smith               tmp    = ax[ll];
826d84be18SBarry Smith               ax[ll] = ay[ll];
836d84be18SBarry Smith               ay[ll] = tmp;
842bb67c89SBarry Smith             }
852bb67c89SBarry Smith 	}
866d84be18SBarry Smith     }
873a40ed3dSBarry Smith     PetscFunctionReturn(0);
886d84be18SBarry Smith }
892bb67c89SBarry Smith 
90