1 2 #ifndef lint 3 static char vcid[] = "$Id: dgefa4.c,v 1.1 1997/06/10 03:18:18 bsmith Exp bsmith $"; 4 #endif 5 /* 6 Inverts 4 by 4 matrix using partial pivoting. 7 */ 8 #include "petsc.h" 9 10 #undef __FUNC__ 11 #define __FUNC__ "Kernel_A_gets_inverse_A_4" 12 int Kernel_A_gets_inverse_A_4(Scalar *a) 13 { 14 int i__2, i__3, kp1, j, k, l,ll,i,ipvt_l[4],*ipvt = ipvt_l-1,kb,k3; 15 int k4,j3; 16 Scalar *aa,*ax,*ay,work_l[16],*work = work_l-1,stmp; 17 double tmp,max; 18 19 /* gaussian elimination with partial pivoting */ 20 21 /* Parameter adjustments */ 22 a -= 5; 23 24 for (k = 1; k <= 3; ++k) { 25 kp1 = k + 1; 26 k3 = 4*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 = 4 - 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 <= 4; ++j) { 66 j3 = 4*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 = 4 - 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[4] = 4; 81 if (a[20] == 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 <= 4; ++k) { 92 k3 = 4*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 (4 < kp1) continue; 101 ax = aa; 102 for (j = kp1; j <= 4; ++j) { 103 j3 = 4*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 <= 3; ++kb) { 116 k = 4 - kb; 117 k3 = 4*k; 118 kp1 = k + 1; 119 aa = a + k3; 120 for (i = kp1; i <= 4; ++i) { 121 work[i] = aa[i]; 122 aa[i] = 0.0; 123 } 124 for (j = kp1; j <= 4; ++j) { 125 stmp = work[j]; 126 ax = &a[4*j + 1]; 127 ay = &a[k3 + 1]; 128 ay[0] += stmp*ax[0]; 129 ay[1] += stmp*ax[1]; 130 ay[2] += stmp*ax[2]; 131 ay[3] += stmp*ax[3]; 132 } 133 l = ipvt[k]; 134 if (l != k) { 135 ax = &a[k3 + 1]; 136 ay = &a[4*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 stmp = ax[3]; ax[3] = ay[3]; ay[3] = stmp; 141 } 142 } 143 return 0; 144 } 145 146