You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ludcmp_CX.cc 1.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include "ABACUS.h"
  2. using namespace std;
  3. void ABACUS::ludcmp_CX (SQMat_CX& a, Vect_INT& indx, DP& d)
  4. {
  5. const complex<DP> TINY = 1.0e-200;
  6. int i, j, k;
  7. int imax = 0;
  8. complex<DP> big, dum, sum, temp;
  9. int n = a.size();
  10. if (n == 0) ABACUSerror("Zero-sized array in ludcmp_CX");
  11. Vect_CX vv(n);
  12. d = 1.0;
  13. for (i = 0; i < n; i++) {
  14. big = 0.0;
  15. for (j = 0; j < n; j++)
  16. if ((abs(temp = a[i][j])) > abs(big)) big = temp;
  17. if (big == 0.0) throw Divide_by_zero();
  18. vv[i] = 1.0/big;
  19. }
  20. for (j = 0; j < n; j++) {
  21. for (i = 0; i < j; i++) {
  22. sum = a[i][j];
  23. for (k = 0; k < i; k++) sum -= a[i][k] * a[k][j];
  24. a[i][j] = sum;
  25. }
  26. big = 0.0;
  27. for (i = j; i < n; i++) {
  28. sum = a[i][j];
  29. for (k = 0; k < j; k++) sum -= a[i][k] * a[k][j];
  30. a[i][j] = sum;
  31. if ((abs(dum = vv[i]*sum)) >= abs(big)) {
  32. big = dum;
  33. imax = i;
  34. }
  35. }
  36. if (j != imax) {
  37. for (k = 0; k < n; k++) {
  38. dum = a[imax][k];
  39. a[imax][k] = a[j][k];
  40. a[j][k] = dum;
  41. }
  42. d = -d;
  43. vv[imax] = vv[j];
  44. }
  45. indx[j] = imax;
  46. if (a[j][j] == 0.0) a[j][j] = TINY;
  47. if (j !=n-1) {
  48. dum = 1.0/(a[j][j]);
  49. for (i = j + 1; i < n; i++) a[i][j] *= dum;
  50. }
  51. }
  52. }