1 | // Class for representing spherical harmonic coefficients
|
---|
2 | // G. Le Meur 2000
|
---|
3 | // DAPNIA/SPP (Saclay) / CEA LAL - IN2P3/CNRS (Orsay)
|
---|
4 |
|
---|
5 | #ifndef ALM_SEEN
|
---|
6 | #define ALM_SEEN
|
---|
7 |
|
---|
8 | #include "randinterf.h"
|
---|
9 | #include "nbmath.h"
|
---|
10 | #include "trngmtx.h"
|
---|
11 | #include "tvector.h"
|
---|
12 |
|
---|
13 | namespace SOPHYA {
|
---|
14 |
|
---|
15 | // ----- Classe Alm
|
---|
16 | template <class T>
|
---|
17 | class Alm : public LowerTriangularMatrix< complex<T> > {
|
---|
18 | public :
|
---|
19 |
|
---|
20 | Alm() : LowerTriangularMatrix<complex<T> >() {}
|
---|
21 | //! instanciate the class from the maximum value of the index \f$l\f$ in the sequence of the \f$a_{lm}\f$'s
|
---|
22 | Alm(sa_size_t nlmax) : LowerTriangularMatrix<complex<T> >(nlmax+1) {}
|
---|
23 | //! copy constructor
|
---|
24 | Alm(const Alm<T>& a, bool share=false) : LowerTriangularMatrix<complex<T> >(a, share) {}
|
---|
25 | //! Constructor, generates alm from a cl vector
|
---|
26 | Alm(const TVector<T> & clin, const r_8 fwhm) ;
|
---|
27 | //! Constructor, generates alm from a cl vector, using the specified random generator object
|
---|
28 | Alm(const TVector<T> & clin, const r_8 fwhm, RandomGeneratorInterface& rg);
|
---|
29 |
|
---|
30 | //! Resize with a new lmax
|
---|
31 | inline void ReSizeToLmax(sa_size_t nlmax) {this->ReSizeRow(nlmax+1);}
|
---|
32 | inline sa_size_t Lmax() const {return this->rowNumber()-1;}
|
---|
33 |
|
---|
34 | //! Computes the corresponding pwer spectrum (Cl vector)
|
---|
35 | TVector<T> powerSpectrum() const;
|
---|
36 |
|
---|
37 | inline Alm<T>& SetComplexT(complex<T> a)
|
---|
38 | { this->SetT(a); return *this; }
|
---|
39 | inline Alm<T>& operator = (complex<T> a)
|
---|
40 | { return SetComplexT(a); }
|
---|
41 |
|
---|
42 | private:
|
---|
43 | void GenFromCl(const TVector<T> & clin, const r_8 fwhm, RandomGeneratorInterface& rg);
|
---|
44 | };
|
---|
45 |
|
---|
46 |
|
---|
47 | //------------ Classe Bm , vecteur avec index -mMax <= index <= +mMax
|
---|
48 | template <class T>
|
---|
49 | class Bm {
|
---|
50 | public :
|
---|
51 | Bm(): nmmax_(0) {;};
|
---|
52 | //! Constructor with the specification of the maximum absolute value of the index : |mMax|
|
---|
53 | //! Copy contrsuctor
|
---|
54 | Bm(sa_size_t mmax) : nmmax_(mmax) { bm_.ReSize( (2*mmax+1) );}
|
---|
55 | Bm(const Bm<T>& b, bool share=false) : nmmax_(b.nmmax_), bm_(b.bm_, share) { }
|
---|
56 | //! resize with a new value of mmax
|
---|
57 | inline void ReSizeToMmax(sa_size_t mmax)
|
---|
58 | { nmmax_= mmax; bm_.ReSize(2* nmmax_+1); }
|
---|
59 |
|
---|
60 | //! Acces to element with index m ( -mMax <= m <= +mMax )
|
---|
61 | inline T operator()(sa_size_t m) const { return bm_( m+nmmax_); }
|
---|
62 | //! Acces to element with index m ( -mMax <= m <= +mMax )
|
---|
63 | inline T& operator()(sa_size_t m) { return bm_( m+nmmax_); }
|
---|
64 |
|
---|
65 | //! Return the current value of the maximum absolute value of the index
|
---|
66 | inline sa_size_t Mmax() const { return nmmax_; }
|
---|
67 |
|
---|
68 | inline Bm<T>& operator = (const Bm<T>& b)
|
---|
69 | {
|
---|
70 | if (this != &b) {
|
---|
71 | nmmax_= b.nmmax_;
|
---|
72 | bm_= b.bm_;
|
---|
73 | }
|
---|
74 | return *this;
|
---|
75 | }
|
---|
76 |
|
---|
77 |
|
---|
78 | private:
|
---|
79 | sa_size_t nmmax_;
|
---|
80 | NDataBlock<T> bm_;
|
---|
81 | };
|
---|
82 |
|
---|
83 | } // namespace SOPHYA
|
---|
84 |
|
---|
85 | #endif
|
---|