16d84be18SBarry Smith #ifndef lint 2*5615d1e5SSatish Balay static char vcid[] = "$Id: dgedi.c,v 1.4 1996/12/18 00:01:36 balay Exp balay $"; 36d84be18SBarry Smith #endif 46d84be18SBarry Smith 56d84be18SBarry Smith /* 66d84be18SBarry Smith This file creating by running f2c 76d84be18SBarry Smith linpack. this version dated 08/14/78 86d84be18SBarry Smith cleve moler, university of new mexico, argonne national lab. 96d84be18SBarry Smith 106d84be18SBarry Smith Computes the inverse of a matrix given its factors and pivots 116d84be18SBarry Smith calculated by Linpack_DGEFA(). 122bb67c89SBarry Smith */ 132bb67c89SBarry Smith 146d84be18SBarry Smith #include "petsc.h" 152bb67c89SBarry Smith 16*5615d1e5SSatish Balay #undef __FUNC__ 17*5615d1e5SSatish Balay #define __FUNC__ "Linpack_DGEDI" 186d84be18SBarry Smith int Linpack_DGEDI(Scalar *a,int n,int *ipvt,Scalar *work) 192bb67c89SBarry Smith { 2039d66777SBarry Smith int i__2,kb, kp1, nm1,i, j, k, l, ll,kn,knp1,jn; 216d84be18SBarry Smith Scalar t, *aa,*ax,*ay,tmp; 222bb67c89SBarry Smith 236d84be18SBarry Smith --work; 246d84be18SBarry Smith --ipvt; 2539d66777SBarry Smith a -= n + 1; 262bb67c89SBarry Smith 272bb67c89SBarry Smith /* compute inverse(u) */ 282bb67c89SBarry Smith 296d84be18SBarry Smith for (k = 1; k <= n; ++k) { 3039d66777SBarry Smith kn = k*n; 3139d66777SBarry Smith knp1 = kn + k; 3239d66777SBarry Smith a[knp1] = 1.0 / a[knp1]; 3339d66777SBarry Smith t = -a[knp1]; 342bb67c89SBarry Smith i__2 = k - 1; 3539d66777SBarry Smith aa = &a[1 + kn]; 366d84be18SBarry Smith for ( ll=0; ll<i__2; ll++ ) aa[ll] *= t; 372bb67c89SBarry Smith kp1 = k + 1; 386d84be18SBarry Smith if (n < kp1) continue; 396d84be18SBarry Smith ax = aa; 406d84be18SBarry Smith for (j = kp1; j <= n; ++j) { 4139d66777SBarry Smith jn = j*n; 4239d66777SBarry Smith t = a[k + jn]; 4339d66777SBarry Smith a[k + jn] = 0.; 4439d66777SBarry Smith ay = &a[1 + jn]; 456d84be18SBarry Smith for ( ll=0; ll<k; ll++ ) { 466d84be18SBarry Smith ay[ll] += t*ax[ll]; 472bb67c89SBarry Smith } 482bb67c89SBarry Smith } 492bb67c89SBarry Smith } 502bb67c89SBarry Smith 512bb67c89SBarry Smith /* form inverse(u)*inverse(l) */ 522bb67c89SBarry Smith 536d84be18SBarry Smith nm1 = n - 1; 542bb67c89SBarry Smith if (nm1 < 1) { 556d84be18SBarry Smith return 0; 562bb67c89SBarry Smith } 576d84be18SBarry Smith for (kb = 1; kb <= nm1; ++kb) { 586d84be18SBarry Smith k = n - kb; 5939d66777SBarry Smith kn = k*n; 602bb67c89SBarry Smith kp1 = k + 1; 6139d66777SBarry Smith aa = a + kn; 626d84be18SBarry Smith for (i = kp1; i <= n; ++i) { 636d84be18SBarry Smith work[i] = aa[i]; 646d84be18SBarry Smith aa[i] = 0.; 652bb67c89SBarry Smith } 666d84be18SBarry Smith for (j = kp1; j <= n; ++j) { 672bb67c89SBarry Smith t = work[j]; 686d84be18SBarry Smith ax = &a[j * n + 1]; 6939d66777SBarry Smith ay = &a[kn + 1]; 706d84be18SBarry Smith for ( ll=0; ll<n; ll++ ) { 716d84be18SBarry Smith ay[ll] += t*ax[ll]; 726d84be18SBarry Smith } 732bb67c89SBarry Smith } 742bb67c89SBarry Smith l = ipvt[k]; 752bb67c89SBarry Smith if (l != k) { 7639d66777SBarry Smith ax = &a[kn + 1]; 776d84be18SBarry Smith ay = &a[l * n + 1]; 786d84be18SBarry Smith for ( ll=0; ll<n; ll++ ) { 796d84be18SBarry Smith tmp = ax[ll]; 806d84be18SBarry Smith ax[ll] = ay[ll]; 816d84be18SBarry Smith ay[ll] = tmp; 822bb67c89SBarry Smith } 832bb67c89SBarry Smith } 846d84be18SBarry Smith } 852bb67c89SBarry Smith return 0; 866d84be18SBarry Smith } 872bb67c89SBarry Smith 88