xref: /petsc/src/mat/impls/baij/seq/dgefa3.c (revision 25783f72aa958f20c04068cba466166d5fb21243)
1*25783f72SBarry Smith #ifndef lint
2*25783f72SBarry Smith static char vcid[] = "$Id: dgefa3.c,v 1.1 1996/04/28 00:57:27 bsmith Exp bsmith $";
3*25783f72SBarry Smith #endif
4ede5e988SBarry Smith /*
5*25783f72SBarry Smith     Inverts 3 by 3 matrix using partial pivoting.
6ede5e988SBarry Smith */
7ede5e988SBarry Smith #include "petsc.h"
8ede5e988SBarry Smith 
9*25783f72SBarry Smith int Kernel_A_gets_inverse_A_3(Scalar *a)
10ede5e988SBarry Smith {
11*25783f72SBarry Smith     int     i__2, i__3, kp1, j, k, l,ll,i,ipvt_l[3],*ipvt = ipvt_l,kb;
12*25783f72SBarry Smith     Scalar  t,*aa,*ax,*ay,work_l[9],*work = work_l,stmp;
13ede5e988SBarry Smith     double  tmp,max;
14ede5e988SBarry Smith 
15ede5e988SBarry Smith /*     gaussian elimination with partial pivoting */
16ede5e988SBarry Smith 
17ede5e988SBarry Smith     /* Parameter adjustments */
18ede5e988SBarry Smith     --ipvt;
19ede5e988SBarry Smith     a       -= 4;
20ede5e988SBarry Smith 
21ede5e988SBarry Smith     /* Function Body */
22ede5e988SBarry Smith     for (k = 1; k <= 2; ++k) {
23ede5e988SBarry Smith 	kp1 = k + 1;
24ede5e988SBarry Smith 
25ede5e988SBarry Smith /*        find l = pivot index */
26ede5e988SBarry Smith 
27ede5e988SBarry Smith 	i__2 = 4 - k;
28ede5e988SBarry Smith         aa = &a[4*k];
29ede5e988SBarry Smith         max = PetscAbsScalar(aa[0]);
30ede5e988SBarry Smith         l = 1;
31ede5e988SBarry Smith         for ( ll=1; ll<i__2; ll++ ) {
32ede5e988SBarry Smith           tmp = PetscAbsScalar(aa[ll]);
33ede5e988SBarry Smith           if (tmp > max) { max = tmp; l = ll+1;}
34ede5e988SBarry Smith         }
35ede5e988SBarry Smith         l += k - 1;
36ede5e988SBarry Smith 	ipvt[k] = l;
37ede5e988SBarry Smith 
38ede5e988SBarry Smith 	if (a[l + 3*k] == 0.) {
39ede5e988SBarry Smith 	  SETERRQ(k,"Linpack_DGEFA:Zero pivot");
40ede5e988SBarry Smith 	}
41ede5e988SBarry Smith 
42ede5e988SBarry Smith /*           interchange if necessary */
43ede5e988SBarry Smith 
44ede5e988SBarry Smith 	if (l != k) {
45ede5e988SBarry Smith 	  t          = a[l + 3*k];
46ede5e988SBarry Smith 	  a[l + 3*k] = a[4*k];
47ede5e988SBarry Smith 	  a[4*k]     = t;
48ede5e988SBarry Smith         }
49ede5e988SBarry Smith 
50ede5e988SBarry Smith /*           compute multipliers */
51ede5e988SBarry Smith 
52ede5e988SBarry Smith 	t = -1. / a[4*k];
53ede5e988SBarry Smith 	i__2 = 3 - k;
54ede5e988SBarry Smith         aa = &a[1 + 4*k];
55ede5e988SBarry Smith         for ( ll=0; ll<i__2; ll++ ) {
56ede5e988SBarry Smith           aa[ll] *= t;
57ede5e988SBarry Smith         }
58ede5e988SBarry Smith 
59ede5e988SBarry Smith /*           row elimination with column indexing */
60ede5e988SBarry Smith 
61ede5e988SBarry Smith 	ax = &a[4*k+1];
62ede5e988SBarry Smith         for (j = kp1; j <= 3; ++j) {
63ede5e988SBarry Smith 	    t = a[l + 3*j];
64ede5e988SBarry Smith 	    if (l != k) {
65ede5e988SBarry Smith 	      a[l + 3*j] = a[k + 3*j];
66ede5e988SBarry Smith 	      a[k + 3*j] = t;
67ede5e988SBarry Smith             }
68ede5e988SBarry Smith 
69ede5e988SBarry Smith 	    i__3 = 3 - k;
70ede5e988SBarry Smith             ay = &a[k+1+3*j];
71ede5e988SBarry Smith             for ( ll=0; ll<i__3; ll++ ) {
72ede5e988SBarry Smith               ay[ll] += t*ax[ll];
73ede5e988SBarry Smith             }
74ede5e988SBarry Smith 	}
75ede5e988SBarry Smith     }
76ede5e988SBarry Smith     ipvt[3] = 3;
77ede5e988SBarry Smith     if (a[12] == 0.) {
78ede5e988SBarry Smith 	SETERRQ(3,"Linpack_DGEFA:Zero pivot,final row");
79ede5e988SBarry Smith     }
80ede5e988SBarry Smith 
81ede5e988SBarry Smith     /*
82*25783f72SBarry Smith          Now form the inverse
83ede5e988SBarry Smith     */
84ede5e988SBarry Smith 
85ede5e988SBarry Smith     --work;
86ede5e988SBarry Smith 
87ede5e988SBarry Smith    /*     compute inverse(u) */
88ede5e988SBarry Smith 
89*25783f72SBarry Smith     for (k = 1; k <= 3; ++k) {
90*25783f72SBarry Smith 	a[k + 3*k] = 1.0 / a[k + 3*k];
91*25783f72SBarry Smith 	t = -a[k + 3*k];
92ede5e988SBarry Smith 	i__2 = k - 1;
93*25783f72SBarry Smith         aa = &a[3*k + 1];
94ede5e988SBarry Smith         for ( ll=0; ll<i__2; ll++ ) aa[ll] *= t;
95ede5e988SBarry Smith 	kp1 = k + 1;
96*25783f72SBarry Smith 	if (3 < kp1) continue;
97ede5e988SBarry Smith         ax = aa;
98*25783f72SBarry Smith         for (j = kp1; j <= 3; ++j) {
99*25783f72SBarry Smith 	    t = a[k + 3*j];
100*25783f72SBarry Smith 	    a[k + 3*j] = 0.;
101*25783f72SBarry Smith             ay = &a[3*j + 1];
102ede5e988SBarry Smith             for ( ll=0; ll<k; ll++ ) {
103ede5e988SBarry Smith               ay[ll] += t*ax[ll];
104ede5e988SBarry Smith             }
105ede5e988SBarry Smith 	}
106ede5e988SBarry Smith     }
107ede5e988SBarry Smith 
108ede5e988SBarry Smith    /*    form inverse(u)*inverse(l) */
109ede5e988SBarry Smith 
110*25783f72SBarry Smith     for (kb = 1; kb <= 2; ++kb) {
111*25783f72SBarry Smith 	k   = 3 - kb;
112ede5e988SBarry Smith 	kp1 = k + 1;
113*25783f72SBarry Smith         aa  = a + 3*k;
114*25783f72SBarry Smith 	for (i = kp1; i <= 3; ++i) {
115ede5e988SBarry Smith 	    work[i] = aa[i];
116ede5e988SBarry Smith 	    aa[i]   = 0.;
117ede5e988SBarry Smith 	}
118*25783f72SBarry Smith 	for (j = kp1; j <= 3; ++j) {
119ede5e988SBarry Smith 	    t = work[j];
120*25783f72SBarry Smith             ax = &a[3*j + 1];
121*25783f72SBarry Smith             ay = &a[3*k + 1];
122*25783f72SBarry Smith             for ( ll=0; ll<3; ll++ ) {
123ede5e988SBarry Smith               ay[ll] += t*ax[ll];
124ede5e988SBarry Smith             }
125ede5e988SBarry Smith 	}
126ede5e988SBarry Smith 	l = ipvt[k];
127ede5e988SBarry Smith 	if (l != k) {
128*25783f72SBarry Smith             ax = &a[3*k + 1];
129*25783f72SBarry Smith             ay = &a[3*l + 1];
130*25783f72SBarry Smith             for ( ll=0; ll<3; ll++ ) {
131*25783f72SBarry Smith               stmp    = ax[ll];
132ede5e988SBarry Smith               ax[ll] = ay[ll];
133*25783f72SBarry Smith               ay[ll] = stmp;
134ede5e988SBarry Smith             }
135ede5e988SBarry Smith 	}
136ede5e988SBarry Smith     }
137ede5e988SBarry Smith     return 0;
138ede5e988SBarry Smith }
139ede5e988SBarry Smith 
140