ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/SHAPES/SHFunc.cpp
Revision: 1291
Committed: Wed Jun 23 22:43:54 2004 UTC (20 years ago) by gezelter
File size: 2806 byte(s)
Log Message:
Added evaluation stuff

File Contents

# User Rev Content
1 gezelter 1291 #include <stdio.h>
2     #include <cmath>
3 gezelter 1290 #include "SHFunc.hpp"
4    
5     SHFunc::SHFunc() {
6     }
7    
8     double SHFunc::getValueAt(double costheta, double phi) {
9    
10 gezelter 1291 double f, p, phase;
11    
12     // incredibly inefficient way to get the normalization, but
13     // we use a lookup table in the factorial code:
14    
15     // normalization factor:
16     f = sqrt( (2*L+1)/(4.0*M_PI) * Fac(L-M) / Fac(L+M) );
17     // associated Legendre polynomial
18     p = LegendreP(L,M,costheta);
19 gezelter 1290
20 gezelter 1291 if (funcType == SH_SIN) {
21     phase = sin((double)M * phi);
22     } else {
23     phase = cos((double)M * phi);
24     }
25 gezelter 1290
26 gezelter 1291
27     return coefficient*f*p*phase;
28 gezelter 1290
29     }
30 gezelter 1291 //-----------------------------------------------------------------------------//
31     //
32     // double LegendreP (int l, int m, double x);
33     //
34     // Computes the value of the associated Legendre polynomial P_lm (x)
35     // of order l at a given point.
36     //
37     // Input:
38     // l = degree of the polynomial >= 0
39     // m = parameter satisfying 0 <= m <= l,
40     // x = point in which the computation is performed, range -1 <= x <= 1.
41     // Returns:
42     // value of the polynomial in x
43     //
44     //-----------------------------------------------------------------------------//
45    
46     double SHFunc::LegendreP (int l, int m, double x) {
47     // check parameters
48     if (m < 0 || m > l || fabs(x) > 1.0) {
49     printf("LegendreP got a bad argument\n");
50     return NAN;
51     }
52    
53     double pmm = 1.0;
54     if (m > 0) {
55     double h = sqrt((1.0-x)*(1.0+x)),
56     f = 1.0;
57     for (int i = 1; i <= m; i++) {
58     pmm *= -f * h;
59     f += 2.0;
60     }
61     }
62     if (l == m)
63     return pmm;
64     else {
65     double pmmp1 = x * (2 * m + 1) * pmm;
66     if (l == (m+1))
67     return pmmp1;
68     else {
69     double pll = 0.0;
70     for (int ll = m+2; ll <= l; ll++) {
71     pll = (x * (2 * ll - 1) * pmmp1 - (ll + m - 1) * pmm) / (ll - m);
72     pmm = pmmp1;
73     pmmp1 = pll;
74     }
75     return pll;
76     }
77     }
78     }
79    
80     double SHFunc::Fac (int n) {
81    
82     static double facn[31] = {
83     1.0,
84     1.0,
85     2.0,
86     6.0,
87     24.0,
88     120.0,
89     720.0,
90     5040.0,
91     40320.0,
92     362880.0,
93     3628800.0,
94     39916800.0,
95     479001600.0,
96     6227020800.0,
97     87178291200.0,
98     1.307674368e12,
99     2.0922789888e13,
100     3.55687428096e14,
101     6.402373705728e15,
102     1.21645100408832e17,
103     2.43290200817664e18,
104     5.109094217170944e19,
105     1.12400072777760768e21,
106     2.585201673888497664e22,
107     6.2044840173323943936e23,
108     1.5511210043330985984e25,
109     4.03291461126605635584e26,
110     1.0888869450418352160768e28,
111     3.04888344611713860501504e29,
112     8.841761993739701954543616e30,
113     2.6525285981219105863630848e32
114     };
115    
116    
117     static int nmax = 0;
118     static double xmin, xmax;
119    
120     if (n < 0) {
121     printf("factorial of negative integer undefined\n");
122     return NAN;
123     }
124    
125     if (n <= 30) return facn[n];
126     else {
127     printf("n is so large that Fac(n) will overflow\n");
128     return NAN;
129     }
130     }