source: Sophya/trunk/SophyaLib/Samba/lambdaBuilder.h@ 2444

Last change on this file since 2444 was 2291, checked in by lemeur, 23 years ago

protections de dimensions

File size: 2.7 KB
RevLine 
[729]1#ifndef LAMBDABUILDER_SEEN
2#define LAMBDABUILDER_SEEN
3
4#include <math.h>
5#include "ndatablock.h"
6#include "tvector.h"
7#include "alm.h"
8
[864]9
10namespace SOPHYA {
11
[1218]12/*! classe pour les polynomes de legendre*/
[729]13class Legendre {
14
15 public :
16Legendre(r_8 x, int_4 lmax);
[2291]17
18inline r_8 getPl(int_4 l) const
[729]19{
20 if (l>lmax_)
21 {
22 throw (" illegal call of Legendre::getPl with index greater than lmax, which Legendre Class was instanciated with : instanciate Legendre with a greater lmax... ");
23 }
24return Pl_(l);
25}
26
[2291]27
[729]28 private :
29
[2291]30Legendre() {;}
31
32void array_init(int_4 lmax);
33
[729]34 r_8 x_;
35 int_4 lmax_;
36 TVector<r_8> Pl_;
37};
38
39
40
41 class LambdaLMBuilder {
42
43 public:
44
45LambdaLMBuilder() {}
46LambdaLMBuilder(r_8 theta,int_4 lmax, int_4 mmax);
[1683]47LambdaLMBuilder(r_8 ct, r_8 st,int_4 lmax, int_4 mmax);
[864]48virtual ~LambdaLMBuilder() {};
[729]49
50 /*! return the value of the coefficient \f$ \lambda_l^m \f$ */
[2291]51inline double lamlm(int l, int m) const
52 {
53 lambda_.CheckRelativeIndices(l,m);
54 return lambda_(l,m);
55 }
[729]56
[2291]57inline double lamlm(int index) const {
58 return lambda_(index);
59}
[1683]60
61
62 //Return pointer to first element address of the alm's
63//inline r_8* Data() {return lambda_.Data();}
64
65
[729]66 private:
67 void updateArrayRecurrence(int_4 lmax);
68
69 void array_init(int lmax, int mmax);
70
71
[1756]72 // static TriangularMatrix<r_8>* a_recurrence_;
73 static TriangularMatrix<r_8> a_recurrence_;
[729]74 TriangularMatrix<r_8> lambda_;
75
76 protected :
77
78 void updateArrayLamNorm();
79
[1756]80 // static TriangularMatrix<r_8>* lam_fact_;
81 static TriangularMatrix<r_8> lam_fact_;
[729]82 static TVector<r_8>* normal_l_;
83 int_4 lmax_;
84 int_4 mmax_;
85 r_8 cth_;
86 r_8 sth_;
87
88 };
89
90
91
92class LambdaWXBuilder : public LambdaLMBuilder
93{
94 public:
95
96
97LambdaWXBuilder() {}
98
99LambdaWXBuilder(r_8 theta, int_4 lmax, int_4 mmax);
100
101 /*! return the value of the coefficients \f$ _{w}\lambda_l^m\f$ and \f$_{x}\lambda_l^m\f$ */
102inline void lam_wx(int l, int m, r_8& w, r_8& x) const
103 {
[2291]104 if (m > l )
105 {
106 throw RangeCheckError("LambdaWXBuilder::lam_wx : l < m !" );
107 }
[729]108 w=lamWlm_(l,m);
109 x=lamXlm_(l,m);
110 }
111
112 private:
113
114 void array_init();
115
116
117 TriangularMatrix<r_8> lamWlm_;
118 TriangularMatrix<r_8> lamXlm_;
119
120
121};
122
123class LambdaPMBuilder : public LambdaLMBuilder
124{
125 public:
126
127LambdaPMBuilder() {}
128
129 LambdaPMBuilder(r_8 theta, int_4 lmax, int_4 mmax);
130 /*! return the value of the coefficients \f$ _{+}\lambda_l^m\f$ and \f$_{-}\lambda_l^m\f$ */
131inline void lam_pm(int l, int m, r_8& lambda_plus, r_8& lambda_moins) const
132 {
[2291]133 if (m > l )
134 {
135 throw RangeCheckError("LambdaPMBuilder::lam_pm : l < m !" );
136 }
[729]137 lambda_plus = lamPlm_(l,m);
138 lambda_moins = lamMlm_(l,m);
139 }
140
141 private:
142 void array_init();
143
144 TriangularMatrix<r_8> lamPlm_;
145 TriangularMatrix<r_8> lamMlm_;
146
[864]147};
[729]148
[864]149} // Fin du namespace
[729]150
151#endif
Note: See TracBrowser for help on using the repository browser.