Canoe
Comprehensive Atmosphere N' Ocean Engine
linalg_inline.hpp
Go to the documentation of this file.
1 template <int N>
2 int ludcmp(double a[N][N], int indx[N], double vv[N]) {
3  int i, imax, j, k, d;
4  double big, dum, sum, temp;
5 
6  d = 1;
7  for (i = 0; i < N; i++) {
8  big = 0.0;
9  for (j = 0; j < N; j++)
10  if ((temp = fabs(a[i][j])) > big) big = temp;
11  if (big == 0.0) {
12  fprintf(stderr, "Singular matrix in routine ludcmp");
13  exit(1);
14  }
15  vv[i] = 1.0 / big;
16  }
17  for (j = 0; j < N; j++) {
18  for (i = 0; i < j; i++) {
19  sum = a[i][j];
20  for (k = 0; k < i; k++) sum -= a[i][k] * a[k][j];
21  a[i][j] = sum;
22  }
23  big = 0.0;
24  for (i = j; i < N; i++) {
25  sum = a[i][j];
26  for (k = 0; k < j; k++) sum -= a[i][k] * a[k][j];
27  a[i][j] = sum;
28  if ((dum = vv[i] * fabs(sum)) >= big) {
29  big = dum;
30  imax = i;
31  }
32  }
33  if (j != imax) {
34  for (k = 0; k < N; k++) {
35  dum = a[imax][k];
36  a[imax][k] = a[j][k];
37  a[j][k] = dum;
38  }
39  d = -d;
40  vv[imax] = vv[j];
41  }
42  indx[j] = imax;
43  if (j != N - 1) {
44  dum = (1.0 / a[j][j]);
45  for (i = j + 1; i < N; i++) a[i][j] *= dum;
46  }
47  }
48 
49  return d;
50 }
51 
52 template <int N>
53 void lubksb(double a[N][N], int indx[N], double b[N]) {
54  int i, ii = 0, ip, j;
55  double sum;
56 
57  for (i = 0; i < N; i++) {
58  ip = indx[i];
59  sum = b[ip];
60  b[ip] = b[i];
61  if (ii)
62  for (j = ii - 1; j < i; j++) sum -= a[i][j] * b[j];
63  else if (sum)
64  ii = i + 1;
65  b[i] = sum;
66  }
67  for (i = N - 1; i >= 0; i--) {
68  sum = b[i];
69  for (j = i + 1; j < N; j++) sum -= a[i][j] * b[j];
70  b[i] = sum / a[i][i];
71  }
72 }
int ludcmp(double a[N][N], int indx[N], double vv[N])
void lubksb(double a[N][N], int indx[N], double b[N])
float temp
Definition: fit_ammonia.py:6