13 {
14 int i, j, k;
15 int imax = 1;
16 double big, sum, dum;
17 double *vv;
18
20 *d = 1.0;
21#ifdef _OPENMP
22#pragma omp parallel for private(j, big)
23#endif
24 for (i = 1; i <= n; i++) {
25 big = 0.0;
26 for (j = 1; j <= n; j++)
27 if (
fabs(a[i][j]) > big) big =
fabs(a[i][j]);
28 if (big == 0.0)
nrerror(
"Singular matrix in routine LUDCMP");
29 vv[i] = 1.0 / big;
30 }
31
32 for (j = 1; j <= n; j++)
33 {
34 for (i = 1; i < j; i++) {
35 sum = a[i][j];
36#ifdef _OPENMP
37#pragma omp parallel for private(k) reduction(- : sum)
38#endif
39 for (k = 1; k < i; k++)
40 sum = sum - a[i][k] * a[k][j];
41 a[i][j] = sum;
42 }
43
44 big = 0.0;
45 for (i = j; i <= n; i++) {
46 sum = a[i][j];
47#ifdef _OPENMP
48#pragma omp parallel for private(k) reduction(- : sum)
49#endif
50 for (k = 1; k < j; k++)
51 sum = sum - a[i][k] * a[k][j];
52 a[i][j] = sum;
53
54 dum = vv[i] *
fabs(sum);
55 if (dum >= big) {
56 big = dum;
57 imax = i;
58 }
59 }
60
61 if (j != imax) {
62#ifdef _OPENMP
63#pragma omp parallel for private(k, dum)
64#endif
65 for (k = 1; k <= n; k++) {
66 dum = a[imax][k];
67 a[imax][k] = a[j][k];
68 a[j][k] = dum;
69 }
70 *d = -(*d);
71 vv[imax] = vv[j];
72 }
73 index[j] = imax;
74 if (a[j][j] == 0.0)
76
77
78 if (j != n)
79 {
80 dum = 1.0 / a[j][j];
81#ifdef _OPENMP
82#pragma omp parallel for private(i)
83#endif
84 for (i = j + 1; i <= n; i++) a[i][j] = a[i][j] * dum;
85 }
86 }
87
89}
DoubleAc fabs(const DoubleAc &f)
void free_dvector(double *v, long nl, long)
double * dvector(long nl, long nh)