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