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 "nbrandom.h"
|
---|
9 | #include "nbmath.h"
|
---|
10 | #include "triangmtx.h"
|
---|
11 | #include "tvector.h"
|
---|
12 |
|
---|
13 | namespace SOPHYA {
|
---|
14 |
|
---|
15 | /*! class for the coefficients \f$a_{lm}\f$ of the development of a function defined on a sphere, in spherical harmonics */
|
---|
16 | template <class T>
|
---|
17 | class Alm : public TriangularMatrix<complex<T> >
|
---|
18 | {
|
---|
19 | public :
|
---|
20 |
|
---|
21 | Alm() : TriangularMatrix<complex<T> >() {;};
|
---|
22 | /* instanciate the class from the maximum value of the index \f$l\f$ in the sequence of the \f$a_{lm}\f$'s */
|
---|
23 | Alm(int nlmax) : TriangularMatrix<complex<T> >(nlmax+1) {;}
|
---|
24 | Alm(const Alm<T>& a, bool share=false) : TriangularMatrix<complex<T> >(a, share) {;}
|
---|
25 |
|
---|
26 | Alm(const TVector<T>& clin, const r_8 fwhm) ;
|
---|
27 | /*! resize with a new lmax */
|
---|
28 | inline void ReSizeToLmax(int_4 nlmax) {ReSizeRow(nlmax+1);}
|
---|
29 | inline int_4 Lmax() const {return rowNumber()-1;}
|
---|
30 | TVector<T> powerSpectrum() const;
|
---|
31 |
|
---|
32 | inline Alm<T>& SetComplexT(complex<T> a)
|
---|
33 | {
|
---|
34 | this->SetT(a);
|
---|
35 | return *this;
|
---|
36 | }
|
---|
37 | inline Alm<T>& operator = (complex<T> a)
|
---|
38 | {
|
---|
39 | return SetComplexT(a);
|
---|
40 | }
|
---|
41 |
|
---|
42 | };
|
---|
43 | /*! class for a vector with an index running from \f$-m_{max}\f$ to \f$+m_{max}\f$ (then the size of the vector will be actually \f$2m_{max}+1)\f$ */
|
---|
44 | template <class T>
|
---|
45 | class Bm
|
---|
46 | {
|
---|
47 | public :
|
---|
48 | Bm(): nmmax_(0) {;};
|
---|
49 | /* instanciate from the maximum absolute value of the index */
|
---|
50 | Bm(int mmax) : nmmax_((uint_4)mmax) { bm_.ReSize( (uint_4)(2*mmax+1) );}
|
---|
51 | Bm(const Bm<T>& b, bool share=false) : nmmax_(b.nmmax_), bm_(b.bm_, share) {;}
|
---|
52 | /*! resize with a new value of mmax */
|
---|
53 | inline void ReSizeToMmax(int_4 mmax)
|
---|
54 | {
|
---|
55 | nmmax_=(uint_4)mmax;
|
---|
56 | bm_.ReSize(2* nmmax_+1);
|
---|
57 | }
|
---|
58 | //inline int_4 Size() const {return 2*nmmax_+1;};
|
---|
59 | inline T& operator()(int m) {return bm_( adr_i(m));};
|
---|
60 | inline T const& operator()(int m) const {return *(bm_.Begin()+ adr_i(m));};
|
---|
61 | /*! return the current value of the maximum absolute value of the index */
|
---|
62 | inline int_4 Mmax() const
|
---|
63 | {
|
---|
64 | return (int_4)nmmax_;
|
---|
65 | }
|
---|
66 | inline Bm<T>& operator = (const Bm<T>& b)
|
---|
67 | {
|
---|
68 | if (this != &b)
|
---|
69 | {
|
---|
70 | nmmax_= b.nmmax_;
|
---|
71 | bm_= b.bm_;
|
---|
72 | }
|
---|
73 | return *this;
|
---|
74 | }
|
---|
75 |
|
---|
76 | private:
|
---|
77 | /*! return the address in the array representing the vector */
|
---|
78 | inline uint_4 adr_i(int i) const
|
---|
79 | {
|
---|
80 | return(uint_4)(i+nmmax_);
|
---|
81 | }
|
---|
82 |
|
---|
83 |
|
---|
84 |
|
---|
85 | uint_4 nmmax_;
|
---|
86 | NDataBlock<T> bm_;
|
---|
87 |
|
---|
88 | };
|
---|
89 |
|
---|
90 | } // namespace SOPHYA
|
---|
91 |
|
---|
92 | #endif
|
---|