gauss.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include <cmath>
  2. #include "common.h"
  3. #include "Gauss.h"
  4. const long int mu2 = 48;
  5. float Gauss::angmu[10] = { 85.f, 80.f, 70.f, 60.f, 50.f, 40.f, 30.f, 20.f, 10.f, 0.f };
  6. float Gauss::angphi[13] = { 0.f, 30.f, 60.f, 90.f, 120.f, 150.f, 180.f, 210.f, 240.f, 270.f, 300.f, 330.f, 360.f };
  7. /* preliminary computations for gauss integration */
  8. void Gauss::init()
  9. {
  10. int j;
  11. /* convert angphi and angmu to radians */
  12. for (j = 0; j < 13; ++j) angphi[j] = (float)(angphi[j] * M_PI / 180.f);
  13. for (j = 0; j < 10; ++j) angmu[j] = (float)cos(angmu[j] * M_PI / 180.f);
  14. /* calculate rm & gb */
  15. float anglem[mu2];
  16. float weightm[mu2];
  17. gauss (-1.f, 1.f, anglem, weightm, mu2);
  18. gb[STDI(-mu)] = 0;
  19. gb[STDI(0)] = 0;
  20. gb[STDI(mu)] = 0;
  21. rm[STDI(-mu)] = 0;
  22. rm[STDI(0)] = 0;
  23. rm[STDI(mu)] = 0;
  24. /* do shift into rm & gb */
  25. for (j = -mu+1; j <= -1; ++j)
  26. {
  27. rm[-j] = anglem[mu + j - 1];
  28. gb[-j] = weightm[mu + j - 1];
  29. }
  30. for (j = 1; j <= mu-1; ++j)
  31. {
  32. rm[2*mu - j] = anglem[mu + j - 2];
  33. gb[2*mu - j] = weightm[mu + j - 2];
  34. }
  35. /* calculate rp & gp */
  36. gauss (0.f, (float)2 * M_PI, rp, gp, np);
  37. }
  38. /* Compute for a given n, the gaussian quadrature (the n gaussian angles and the
  39. their respective weights). The gaussian quadrature is used in numerical integration involving the
  40. cosine of emergent or incident direction zenith angle. */
  41. void Gauss::gauss (float a, float b, float *x, float *w, long int n)
  42. {
  43. int m = (n + 1) / 2;
  44. double xm = (b + a) / 2;
  45. double xl = (b - a) / 2;
  46. for(int i = 0; i < m; i++)
  47. {
  48. double
  49. z1,
  50. pp,
  51. z = cos(M_PI * (i + 0.75) / (n + 0.5));
  52. do {
  53. double p1 = 1;
  54. double p2 = 0;
  55. for(int j = 0; j < n; j++)
  56. {
  57. double p3 = p2;
  58. p2 = p1;
  59. p1 = ((2 * j + 1) * z * p2 - j * p3) / (j+1);
  60. }
  61. pp = n * (z * p1 - p2) / (z * z - 1);
  62. z1 = z;
  63. z = z1 - p1 / pp;
  64. } while(fabs(z - z1) > 3e-14);
  65. if (fabs(z) < 3e-14) z = 0;
  66. x[i] = (float)(xm - xl * z);
  67. x[n - 1 - i] = (float)(xm + xl * z);
  68. w[i] = (float)(2 * xl / ((1 - z * z) * pp * pp));
  69. w[n - 1 - i] = w[i];
  70. }
  71. }