30 namespace DenseMatrixOperations
32 template<
typename T,
typename Int>
33 void ludcmp(T **a, Int n, Int *indx,
double *d)
35 Int i, imax = 0, j, k;
36 T big, dum, sum, temp;
37 T *vv = malloc_with_check<T>(n);
40 for (i = 0; i < n; i++)
43 for (j = 0; j < n; j++)
46 if (std::abs(temp) > std::abs(big))
56 for (j = 0; j < n; j++)
58 for (i = 0; i < j; i++)
61 for (k = 0; k < i; k++) sum -= a[i][k] * a[k][j];
65 for (i = j; i < n; i++)
68 for (k = 0; k < j; k++) sum -= a[i][k] * a[k][j];
70 dum = vv[i] * std::abs(sum);
71 if (std::abs(dum) >= std::abs(big))
79 for (k = 0; k < n; k++)
89 if (a[j][j] == 0.0) a[j][j] = 1.0e-20;
92 dum = 1.0 / (a[j][j]);
93 for (i = j + 1; i < n; i++) a[i][j] *= dum;
99 template<
typename T,
typename S,
typename Int>
100 void lubksb(T **a, Int n, Int *indx, S *b)
106 for (i = 0; i < n; i++)
111 for (j = 0; j < i; j++)
112 sum = sum - a[i][j] * b[j];
115 for (i = n - 1; i >= 0; i--)
118 for (j = i + 1; j < n; j++)
119 sum -= a[i][j] * b[j];
120 b[i] = sum / a[i][i];
124 template<
typename T,
typename Int>
128 for (i = 0; i < n; i++)
130 for (j = i; j < n; j++)
136 sum -= a[i][k - 1] * a[j][k - 1];
141 if ((std::complex<double>(sum)).real() <= 0.0)
143 else p[i] = sqrt(sum);
145 else a[j][i] = sum / p[i];
150 template HERMES_API
void ludcmp<double, int>(
double **a,
int n,
int *indx,
double *d);
151 template HERMES_API
void ludcmp<std::complex<double>,
int>(std::complex<double> **a,
int n,
int *indx,
double *d);
153 template HERMES_API
void ludcmp<double, unsigned short>(
double **a,
unsigned short n,
unsigned short *indx,
double *d);
154 template HERMES_API
void ludcmp<std::complex<double>,
unsigned short>(std::complex<double> **a,
unsigned short n,
unsigned short *indx,
double *d);
156 template HERMES_API
void ludcmp<double, unsigned char>(
double **a,
unsigned char n,
unsigned char *indx,
double *d);
157 template HERMES_API
void ludcmp<std::complex<double>,
unsigned char>(std::complex<double> **a,
unsigned char n,
unsigned char *indx,
double *d);
159 template HERMES_API
void lubksb<double, std::complex<double>,
int>(
double **a,
int n,
int *indx, std::complex<double> *d);
160 template HERMES_API
void lubksb<double, double, int>(
double **a,
int n,
int *indx,
double *d);
161 template HERMES_API
void lubksb<std::complex<double>, std::complex<double>,
int>(std::complex<double> **a,
int n,
int *indx, std::complex<double> *d);
163 template HERMES_API
void lubksb<double, std::complex<double>,
unsigned short>(
double **a,
unsigned short n,
unsigned short *indx, std::complex<double> *d);
164 template HERMES_API
void lubksb<double, double, unsigned short>(
double **a,
unsigned short n,
unsigned short *indx,
double *d);
165 template HERMES_API
void lubksb<std::complex<double>, std::complex<double>,
unsigned short>(std::complex<double> **a,
unsigned short n,
unsigned short *indx, std::complex<double> *d);
167 template HERMES_API
void lubksb<double, std::complex<double>,
unsigned char>(
double **a,
unsigned char n,
unsigned char *indx, std::complex<double> *d);
168 template HERMES_API
void lubksb<double, double, unsigned char>(
double **a,
unsigned char n,
unsigned char *indx,
double *d);
169 template HERMES_API
void lubksb<std::complex<double>, std::complex<double>,
unsigned char>(std::complex<double> **a,
unsigned char n,
unsigned char *indx, std::complex<double> *d);
171 template HERMES_API
void choldc<double, int>(
double **a,
int n,
double p[]);
172 template HERMES_API
void choldc<std::complex<double>,
int>(std::complex<double> **a,
int n, std::complex<double> p[]);
174 template HERMES_API
void choldc<double, unsigned short>(
double **a,
unsigned short n,
double p[]);
175 template HERMES_API
void choldc<std::complex<double>,
unsigned short>(std::complex<double> **a,
unsigned short n, std::complex<double> p[]);
177 template HERMES_API
void choldc<double, unsigned char>(
double **a,
unsigned char n,
double p[]);
178 template HERMES_API
void choldc<std::complex<double>,
unsigned char>(std::complex<double> **a,
unsigned char n, std::complex<double> p[]);
HERMES_API void ludcmp(T **a, Int n, Int *indx, double *d)
General namespace for the Hermes library.
Exception interface Basically a std::exception, but with a constructor with string and with print_msg...
File containing common definitions, and basic global enums etc. for HermesCommon. ...
File containing definition of exceptions classes.
HERMES_API void choldc(T **a, Int n, T p[])
Dense (small) simply stored matrix operations.
HERMES_API void lubksb(T **a, Int n, Int *indx, S *b)