roninkoi

Clenshaw spherical harmonics

Nov 15th, 2019
220
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 0.88 KB | None | 0 0
  1. #include <math.h>
  2.  
  3. #define PI 3.1415926535898
  4.  
  5. // Clenshaw Legendre normalized (Spherical harmonics)
  6. float Pgn(int l, int m, float x)
  7. {
  8.     float p0 = 0.;
  9.    
  10.     float p1 = 0.;
  11.    
  12.     float p2 = 0.;
  13.    
  14.     for (int k = l; k >= 0; k--) {
  15.         float k1 = (float) (k + 1);
  16.         float m1 = (float) (2 * m) + k1;
  17.         float m2 = (float) (2 * (m + k) + 1);
  18.        
  19.         p2 = p1;
  20.         p1 = p0;
  21.        
  22.         p0 = 0.;
  23.         if (l == m + k)
  24.             p0 += 1.;
  25.        
  26.         float u0 = sqrt(
  27.                         (m2 * (m2 + 2.0)) /
  28.                         (k1 * m1)
  29.                         );
  30.        
  31.         float u1 = sqrt(
  32.                         (k1 * m1 * (m2 + 4.0)) /
  33.                         ((k1 + 1.0) * (m1 + 1.0) * m2)
  34.                         );
  35.        
  36.         p0 += p1 * u0 * x;
  37.         p0 += -u1 * p2;
  38.     }
  39.  
  40.     for (int k = 1; k <= m; k++) {
  41.         p0 *= sqrt(
  42.                    (1.0 - 0.5/(float) k) * (1.0 - x) * (1.0 + x)
  43.                    );
  44.     }
  45.    
  46.     p0 *= sqrt((0.5 * (float) m + 0.25)/PI);
  47.    
  48.     return p0;
  49. }
Add Comment
Please, Sign In to add comment