source: Sophya/trunk/SophyaLib/Samba/lambuilder.cc@ 514

Last change on this file since 514 was 461, checked in by ansari, 26 years ago

Importation de LambdaBuilder A. Kim, G. Le Meur et Reza 12/10/99

File size: 7.2 KB
Line 
1#include <math.h>
2#include "lambuilder.h"
3#include <iostream.h>
4
5Lambda2Builder::Lambda2Builder(){}
6
7Lambda2Builder::Lambda2Builder(double theta, int lmax, int mmax):
8 LambdaBuilder(theta, lmax, mmax){
9 fact_=0;
10 w_=0;
11 ix_=0;
12}
13
14Lambda2Builder::Lambda2Builder(const Lambda2Builder& lb):
15 LambdaBuilder(lb){
16 fact_=lb.fact_;
17 w_=lb.w_;
18 ix_=lb.ix_;
19}
20
21void Lambda2Builder::reset(){
22 LambdaBuilder::reset();
23 fact_=0;
24 w_=0;
25 ix_=0;
26}
27
28double Lambda2Builder::lam2lmp(int flip){
29 if (flip < 0){
30 return -fact_*par_lm_*(w_+ix_);
31 } else{
32 return lam2lmp();
33 }
34}
35
36double Lambda2Builder::lam2lmp(int l, int m){
37 if ((l <= lmax_ && l==l_+1 && m==m_) ||
38 (m <= mmax_ && m==m_+1 && l==m && l_==lmax_)){
39 step();
40 return lam2lmp();
41 } else if (l==l_ && m==m_){
42 return lam2lmp();
43 } else if ((l < l_ && m <= mmax_) || (m == m_ && l < l_) || m<m_){
44 reset();
45 while (l != l_ || m != m_){
46 step();
47 }
48 return lam2lmp();
49 } else if (l <= lmax_ && m <= mmax_ && (m > m_ || (m==m_ && l > l_))){
50 while (l != l_ || m != m_){
51 step();
52 }
53 return lam2lmp();
54 } else{
55 return -1;
56 }
57}
58
59double Lambda2Builder::lam2lmp(int l, int m, int flip){
60
61 if ((l <= lmax_ && l==l_+1 && m==m_) ||
62 (m <= mmax_ && m==m_+1 && l==m && l_==lmax_)){
63 step();
64 return lam2lmp(flip);
65 } else if (l==l_ && m==m_){
66 return lam2lmp(flip);
67 } else if ((l < l_ && m <= mmax_) || (m == m_ && l < l_) || m<m_){
68 reset();
69 while (l != l_ || m != m_){
70 step();
71 }
72 return lam2lmp(flip);
73 } else if (l <= lmax_ && m <= mmax_ && (m > m_ || (m==m_ && l > l_))){
74 while (l != l_ || m != m_){
75 step();
76 }
77 return lam2lmp(flip);
78 } else{
79 return -1;
80 }
81}
82
83double Lambda2Builder::lam2lmm(int flip){
84 if (flip < 0){
85 return -fact_*par_lm_*(w_-ix_);
86 } else{
87 return lam2lmp();
88 }
89}
90
91double Lambda2Builder::lam2lmm(int l, int m){
92 if ((l <= lmax_ && l==l_+1 && m==m_) ||
93 (m <= mmax_ && m==m_+1 && l==m && l_==lmax_)){
94 step();
95 return lam2lmm();
96 } else if (l==l_ && m==m_){
97 return lam2lmm();
98 } else if ((l < l_ && m <= mmax_) || (m == m_ && l < l_) || m<m_){
99 reset();
100 while (l != l_ || m != m_){
101 step();
102 }
103 return lam2lmm();
104 } else if (l <= lmax_ && m <= mmax_ && (m > m_ || (m==m_ && l > l_))){
105 while (l != l_ || m != m_){
106 step();
107 }
108 return lam2lmm();
109 } else{
110 return -1;
111 }
112}
113
114double Lambda2Builder::lam2lmm(int l, int m, int flip){
115 if ((l <= lmax_ && l==l_+1 && m==m_) ||
116 (m <= mmax_ && m==m_+1 && l==m && l_==lmax_)){
117 step();
118 return lam2lmm(flip);
119 } else if (l==l_ && m==m_){
120 return lam2lmm(flip);
121 } else if ((l < l_ && m <= mmax_) || (m == m_ && l < l_) || m<m_){
122 reset();
123 while (l != l_ || m != m_){
124 step();
125 }
126 return lam2lmm(flip);
127 } else if (l <= lmax_ && m <= mmax_ && (m > m_ || (m==m_ && l > l_))){
128 while (l != l_ || m != m_){
129 step();
130 }
131 return lam2lmm(flip);
132 } else{
133 return -1;
134 }
135}
136
137void Lambda2Builder::step(){
138 if (l_>=lmax_ && m_>=mmax_){return;}
139 if (l_==lmax_){//move on to the next m and calculate l=m
140 LambdaBuilder::step();
141 if (l_>=2){
142 w_=-2.*(m_*(2.*m_+1.)-m_*(m_-1.)/sth_/sth_)*lamlm_;
143 ix_=-2.*m_*(m_-1.)*cth_/sth_/sth_*lamlm_;
144 fact_=sqrt(1./(m_-1.)/m_/(m_+1.)/(m_+2.));
145 } else{
146 w_=0;
147 ix_=0;
148 fact_=0;
149 }
150 } else{
151 double lastlamlm=lamlm_;
152 LambdaBuilder::step();
153 if (l_>=2){
154 w_=-2.*(-((l_-m_*m_)/sth_/sth_+.5*l_*(l_-1.))*lamlm_+
155 (l_+m_)*cth_/sth_/sth_*sqrt((2.*l_+1.)/(2.*l_-1.)*(l_-m_)/(l_+m_))*
156 lastlamlm);
157 ix_=-2.*m_/sth_/sth_*((l_-1.)*cth_*lamlm_-(l_+m_)*
158 sqrt((2.*l_+1.)/(2.*l_-1.)*(l_-m_)/(l_+m_))*
159 lastlamlm);
160 fact_=sqrt(1./(l_-1.)/l_/(l_+1.)/(l_+2.));
161 } else{
162 w_=0;
163 ix_=0;
164 fact_=0;
165 }
166 }
167}
168
169LambdaBuilder::LambdaBuilder(){}
170
171LambdaBuilder::LambdaBuilder(double theta, int lmax, int mmax){
172 lmax_=lmax;
173 mmax_=mmax;
174 l_=0;
175 m_=0;
176 lamlm_=1. / sqrt(4.*M_PI);
177 cth_=cos(theta);
178 sth_=sin(theta);
179 lammm_=1. / sqrt(4.*M_PI) *bignorm;
180 par_lm_=1.;
181 lam_0_=0.;
182 lam_1_=1./bignorm;
183 a_rec_=sqrt(3.);
184 b_rec_=0;
185 fm2_=0;
186}
187
188LambdaBuilder::LambdaBuilder(const LambdaBuilder& lb){
189 lmax_=lb.lmax_;
190 mmax_=lb.mmax_;
191 l_=lb.l_;
192 m_=lb.m_;
193 lamlm_=lb.lamlm_;
194 cth_=lb.cth_;
195 sth_=lb.sth_;
196 lammm_=lb.lammm_;
197 par_lm_=lb.par_lm_;
198 lam_0_=lb.lam_0_;
199 lam_1_=lb.lam_1_;
200 a_rec_=lb.a_rec_;
201 b_rec_=lb.b_rec_;
202 fm2_=lb.fm2_;
203}
204
205void LambdaBuilder::reset(){
206 l_=0;
207 m_=0;
208 lamlm_=1. / sqrt(4.*M_PI);
209 lammm_=1. / sqrt(4.*M_PI) *bignorm;
210 par_lm_=1.;
211 lam_0_=0.;
212 lam_1_=1./bignorm;
213 a_rec_=sqrt(3.);
214 b_rec_=0;
215 fm2_=0;
216}
217
218double LambdaBuilder::lamlm(int flip){
219 if (flip < 0){
220 return par_lm_*lamlm();
221 } else{
222 return lamlm();
223 }
224}
225
226double LambdaBuilder::lamlm(int l, int m){
227 if ((l <= lmax_ && l==l_+1 && m==m_) ||
228 (m <= mmax_ && m==m_+1 && l==m && l_==lmax_)){
229 step();
230 return lamlm();
231 } else if (l==l_ && m==m_){
232 return lamlm_;
233 } else if ((l < l_ && m <= mmax_) || (m == m_ && l < l_) || m<m_){
234 reset();
235 while (l != l_ || m != m_){
236 step();
237 }
238 return lamlm();
239 } else if (l <= lmax_ && m <= mmax_ && (m > m_ || (m==m_ && l > l_))){
240 while (l != l_ || m != m_){
241 step();
242 }
243 return lamlm();
244 } else{
245 return -1;
246 }
247}
248
249double LambdaBuilder::lamlm(int l, int m, int flip){
250 if ((l <= lmax_ && l==l_+1 && m==m_) ||
251 (m <= mmax_ && m==m_+1 && l==m && l_==lmax_)){
252 step();
253 return lamlm(flip);
254 } else if (l==l_ && m==m_){
255 return lamlm(flip);
256 } else if ((l < l_ && m <= mmax_) || (m == m_ && l < l_) || m<m_){
257 reset();
258 while (l != l_ || m != m_){
259 step();
260 }
261 return lamlm(flip);
262 } else if (l <= lmax_ && m <= mmax_ && (m > m_ || (m==m_ && l > l_))){
263 while (l != l_ || m != m_){
264 step();
265 }
266 return lamlm(flip);
267 } else{
268 return -1;
269 }
270}
271
272void LambdaBuilder::step(){
273 /*-----------------------------------------------------------------------
274 computes lambda_lm(theta) in an optimal fashion
275 looping over m
276 For example, if nlmax =3 and nmmax=3 the order is
277 (l,m)=(0,0),(1,0),(2,0),(3,0),(1,1),(2,1),(3,1),(2,2),(3,2),(3,3)
278 -----------------------------------------------------------------------*/
279 if (l_>=lmax_ && m_>=mmax_){return;}
280 if (l_==lmax_){//move on to the next m and calculate l=m
281 m_=m_+1;
282 l_=m_;
283 double f2m = 2. * m_;
284 fm2_ = ((double) m_)*m_;
285 par_lm_ = 1.; // = (-1)^(l+m)
286 if (m_ >= 1) { /* lambda_0_0 for m>0*/
287 lammm_ = - lammm_ * sth_ * sqrt( (f2m+1.)/ f2m );
288 }
289 lamlm_ = lammm_ / bignorm;
290 lam_0_ = 0.;
291 lam_1_ = 1. / bignorm; /*small number --> to avoid overflow*/
292 a_rec_ = sqrt( f2m + 3.);
293 b_rec_ = 0.;
294 } else{
295 l_=l_+1;
296 par_lm_ = - par_lm_; /* = (-1)^(l+m)*/
297 double lam_2 = (cth_ * lam_1_ - b_rec_ * lam_0_) * a_rec_;
298 // cout<<lam_2<<" "<<cth_<<" "<<lam_1_<<" "<<b_rec_<<" "<<lam_0_<<" "<<a_rec_<<endl;
299 //actual lambda_lm (small and big numbers cancel out)
300 lamlm_ = lam_2 * lammm_;
301
302 b_rec_ = 1. / a_rec_;
303 double fl2 = (l_+1.)*(l_+1.);
304 a_rec_ = sqrt( (4. * fl2 - 1.) / (fl2-fm2_) );
305 // cout <<fl2<<" "<<fm2<<endl;
306 lam_0_ = lam_1_;
307 lam_1_ = lam_2;
308 }
309}
Note: See TracBrowser for help on using the repository browser.