| [1371] | 1 | //   Class for representing spherical harmonic coefficients
 | 
|---|
 | 2 | //              G. Le Meur      2000
 | 
|---|
 | 3 | // DAPNIA/SPP (Saclay) / CEA    LAL - IN2P3/CNRS  (Orsay)
 | 
|---|
 | 4 | 
 | 
|---|
| [729] | 5 | #ifndef ALM_SEEN
 | 
|---|
 | 6 | #define ALM_SEEN
 | 
|---|
| [758] | 7 | 
 | 
|---|
| [729] | 8 | #include "nbrandom.h"
 | 
|---|
 | 9 | #include "nbmath.h"
 | 
|---|
| [758] | 10 | #include "triangmtx.h"
 | 
|---|
| [729] | 11 | #include "tvector.h"
 | 
|---|
 | 12 | 
 | 
|---|
| [1371] | 13 | namespace SOPHYA {  
 | 
|---|
| [729] | 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 |  
 | 
|---|
| [1756] | 21 | Alm() : TriangularMatrix<complex<T> >()  {;};
 | 
|---|
| [729] | 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 | 
 | 
|---|
| [1683] | 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 |  } 
 | 
|---|
| [729] | 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)l;
 | 
|---|
 | 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 | 
 | 
|---|
| [1371] | 90 | } // namespace SOPHYA
 | 
|---|
| [729] | 91 | 
 | 
|---|
 | 92 | #endif
 | 
|---|