xref: /petsc/src/mat/impls/baij/seq/dgedi.c (revision fe310e63a350c64b2e1853960f9e2afb86a3d427)
1 #ifndef lint
2 static char vcid[] = "$Id: dgedi.c,v 1.4 1996/12/18 00:01:36 balay Exp balay $";
3 #endif
4 
5 /*
6               This file creating by running f2c
7             linpack. this version dated 08/14/78
8       cleve moler, university of new mexico, argonne national lab.
9 
10       Computes the inverse of a matrix given its factors and pivots
11     calculated by Linpack_DGEFA().
12 */
13 
14 #include "petsc.h"
15 
16 #undef __FUNC__
17 #define __FUNC__ "Linpack_DGEDI"
18 int Linpack_DGEDI(Scalar *a,int n,int *ipvt,Scalar *work)
19 {
20     int     i__2,kb, kp1, nm1,i, j, k, l, ll,kn,knp1,jn;
21     Scalar  t, *aa,*ax,*ay,tmp;
22 
23     --work;
24     --ipvt;
25     a       -= n + 1;
26 
27    /*     compute inverse(u) */
28 
29     for (k = 1; k <= n; ++k) {
30         kn           = k*n;
31         knp1         = kn + k;
32 	a[knp1]      = 1.0 / a[knp1];
33 	t            = -a[knp1];
34 	i__2         = k - 1;
35         aa           = &a[1 + kn];
36         for ( ll=0; ll<i__2; ll++ ) aa[ll] *= t;
37 	kp1 = k + 1;
38 	if (n < kp1) continue;
39         ax = aa;
40         for (j = kp1; j <= n; ++j) {
41             jn = j*n;
42 	    t = a[k + jn];
43 	    a[k + jn] = 0.;
44             ay = &a[1 + jn];
45             for ( ll=0; ll<k; ll++ ) {
46               ay[ll] += t*ax[ll];
47             }
48 	}
49     }
50 
51    /*    form inverse(u)*inverse(l) */
52 
53     nm1 = n - 1;
54     if (nm1 < 1) {
55 	return 0;
56     }
57     for (kb = 1; kb <= nm1; ++kb) {
58 	k   = n - kb;
59         kn  = k*n;
60 	kp1 = k + 1;
61         aa  = a + kn;
62 	for (i = kp1; i <= n; ++i) {
63 	    work[i] = aa[i];
64 	    aa[i]   = 0.;
65 	}
66 	for (j = kp1; j <= n; ++j) {
67 	    t = work[j];
68             ax = &a[j * n + 1];
69             ay = &a[kn + 1];
70             for ( ll=0; ll<n; ll++ ) {
71               ay[ll] += t*ax[ll];
72             }
73 	}
74 	l = ipvt[k];
75 	if (l != k) {
76             ax = &a[kn + 1];
77             ay = &a[l * n + 1];
78             for ( ll=0; ll<n; ll++ ) {
79               tmp    = ax[ll];
80               ax[ll] = ay[ll];
81               ay[ll] = tmp;
82             }
83 	}
84     }
85     return 0;
86 }
87 
88