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