00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #include "lu.h"
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 int LUDCMP(REAL **A, int n, int *INDX, int *d) {
00029
00030 REAL AMAX,DUM, SUM;
00031 int I,IMAX,J,K;
00032 IMAX = 0;
00033
00034 REAL *VV;
00035 void *vmblock = NULL;
00036
00037 vmblock = vminit();
00038 VV = (REAL *) vmalloc(vmblock, VEKTOR, NMAX, 0);
00039
00040 if (! vmcomplete(vmblock))
00041 {
00042
00043 return -1;
00044 }
00045
00046 *d=1;
00047
00048 for (I=1; I<n+1; I++) {
00049 AMAX=0.0;
00050 for (J=1; J<n+1; J++)
00051 if (ABS(A[I][J]) > AMAX) AMAX=ABS(A[I][J]);
00052
00053 if(AMAX < TINY)
00054 return 1;
00055 VV[I] = 1.0 / AMAX;
00056 }
00057
00058 for (J=1; J<n+1;J++) {
00059
00060 for (I=1; I<J; I++) {
00061 SUM = A[I][J];
00062 for (K=1; K<I; K++)
00063 SUM = SUM - A[I][K]*A[K][J];
00064 A[I][J] = SUM;
00065 }
00066 AMAX = 0.0;
00067
00068 for (I=J; I<n+1; I++) {
00069 SUM = A[I][J];
00070 for (K=1; K<J; K++)
00071 SUM = SUM - A[I][K]*A[K][J];
00072 A[I][J] = SUM;
00073 DUM = VV[I]*ABS(SUM);
00074 if (DUM >= AMAX) {
00075 IMAX = I;
00076 AMAX = DUM;
00077 }
00078 }
00079
00080 if (J != IMAX) {
00081 for (K=1; K<n+1; K++) {
00082 DUM = A[IMAX][K];
00083 A[IMAX][K] = A[J][K];
00084 A[J][K] = DUM;
00085 }
00086 *d = -*d;
00087 VV[IMAX] = VV[J];
00088 }
00089
00090 INDX[J] = IMAX;
00091
00092 if (ABS(A[J][J]) < TINY) A[J][J] = TINY;
00093
00094 if (J != n) {
00095 DUM = 1.0 / A[J][J];
00096 for (I=J+1; I<n+1; I++)
00097 A[I][J] *= DUM;
00098 }
00099 }
00100
00101 free(vmblock);
00102 return 0;
00103
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 void LUBKSB(REAL **A, int n, int *INDX, REAL *B) {
00118 REAL SUM;
00119 int I,II,J,LL;
00120
00121 II = 0;
00122
00123 for (I=1; I<n+1; I++) {
00124 LL = INDX[I];
00125 SUM = B[LL];
00126 B[LL] = B[I];
00127 if (II != 0)
00128 for (J=II; J<I; J++)
00129 SUM = SUM - A[I][J]*B[J];
00130 else if (SUM != 0.0) II = I;
00131 B[I] = SUM;
00132 }
00133
00134 for (I=n; I>0; I--) {
00135 SUM = B[I];
00136 if (I < n) {
00137 for (J=I+1; J<n+1; J++)
00138 SUM = SUM - A[I][J]*B[J];
00139 }
00140 B[I] = SUM / A[I][I];
00141 }
00142
00143
00144 }
00145
00146
00147
00148