source: Sophya/trunk/SophyaLib/SkyMap/spherethetaphi.cc@ 2968

Last change on this file since 2968 was 2968, checked in by ansari, 19 years ago

Ajout methode ThetaOfSlice() a l'interface SphericalMap et propagation , Reza 06/06/2006

File size: 20.7 KB
Line 
1#include "sopnamsp.h"
2#include "spherethetaphi.h"
3#include "smathconst.h"
4#include <complex>
5#include "fiondblock.h"
6#include <iostream>
7
8
9/*!
10 \class SOPHYA::SphereThetaPhi
11 \ingroup SkyMap
12
13 \brief Spherical map with equal latitude (iso-theta) rings
14
15
16 Class implementing spherical maps, with equal latitude (iso-theta) rings
17 pixelisation scheme - with template data types (double, float, complex, ...)
18
19 sphere splitted with respect to theta, phi : each hemisphere is
20 splitted into (m-1) parallels (equator does not enter into account).
21 This operation defines m slices, each of which is splitted into
22 equidistant meridians. This splitting is realized in such a way that
23 all pixels have the same area and are as square as possible.
24
25 One begins with the hemisphere with positive z, starting from the pole
26 toward the equator. The first pixel is the polar cap ; it is circular
27 and centered on theta=0.
28*/
29
30//***************************************************************
31//++
32// Class SphereThetaPhi
33//
34//
35// include spherethetaphi.h
36//--
37//++
38//
39// Links Parents
40//
41// SphericalMap
42//--
43
44/* --Methode-- */
45//++
46// Titre Constructors
47//--
48//++
49
50template <class T>
51SphereThetaPhi<T>::SphereThetaPhi()
52 : NPhi_(), TNphi_(), Theta_(), pixels_()
53
54//--
55{
56 InitNul();
57}
58
59
60/* --Methode-- */
61
62/*!
63 \brief Constructor with specification of number of slices (in a hemisphere)
64 \param m is the number of slices in theta on an hemisphere (the polar cap
65 forms the first slice).
66*/
67template <class T>
68SphereThetaPhi<T>::SphereThetaPhi(int_4 m)
69{
70 InitNul();
71 Pixelize(m);
72}
73
74//! Copy constructor (shares the pixel data if share==true)
75template <class T>
76SphereThetaPhi<T>::SphereThetaPhi(const SphereThetaPhi<T>& s, bool share)
77 : NPhi_(s.NPhi_, share), TNphi_(s.TNphi_, share), Theta_(s.Theta_, share),
78 pixels_(s.pixels_ , share)
79{
80
81 NTheta_= s.NTheta_;
82 NPix_ = s.NPix_;
83 Omega_ = s.Omega_;
84 if(s.mInfo_) this->mInfo_= new DVList(*s.mInfo_);
85}
86
87//! Copy constructor (shares the pixel data)
88template <class T>
89SphereThetaPhi<T>::SphereThetaPhi(const SphereThetaPhi<T>& s)
90 : NPhi_(s.NPhi_), TNphi_(s.TNphi_), Theta_(s.Theta_), pixels_(s.pixels_)
91{
92
93 NTheta_= s.NTheta_;
94 NPix_ = s.NPix_;
95 Omega_ = s.Omega_;
96 if(s.mInfo_) this->mInfo_= new DVList(*s.mInfo_);
97}
98
99//++
100// Titre Destructor
101//--
102//++
103template <class T>
104SphereThetaPhi<T>::~SphereThetaPhi()
105
106//--
107{}
108
109template <class T>
110void SphereThetaPhi<T>::InitNul()
111//
112{
113 NTheta_= 0;
114 NPix_ = 0;
115// pixels_.Reset(); Pas de reset par InitNul (en cas de share) - Reza 20/11/99 $CHECK$
116}
117
118
119//! re-pixelize the sphere if (m > 0)
120template <class T>
121void SphereThetaPhi<T>::Resize(int_4 m)
122{
123 if ((m <= 0) && (NTheta_ > 0) ) {
124 cout << "SphereThetaPhi<T>::Resize(m) with m<=0 - NOT resized" << endl;
125 return;
126 }
127 InitNul();
128 Pixelize(m);
129}
130
131//! Clone or share the SphereThetaPhi object \b a
132template<class T>
133void SphereThetaPhi<T>::CloneOrShare(const SphereThetaPhi<T>& a)
134{
135
136 NTheta_= a.NTheta_;
137 NPix_ = a.NPix_;
138 Omega_ = a.Omega_;
139 NPhi_.CloneOrShare(a.NPhi_);
140 TNphi_.CloneOrShare(a.TNphi_);
141 Theta_.CloneOrShare(a.Theta_);
142 pixels_.CloneOrShare(a.pixels_);
143 if (this->mInfo_) {delete this->mInfo_; this->mInfo_ = NULL;}
144 if (a.mInfo_) this->mInfo_ = new DVList(*(a.mInfo_));
145}
146//! Share the pixel data with object \b a
147template<class T>
148void SphereThetaPhi<T>::Share(const SphereThetaPhi<T>& a)
149{
150
151 NTheta_= a.NTheta_;
152 NPix_ = a.NPix_;
153 Omega_ = a.Omega_;
154 NPhi_.Share(a.NPhi_);
155 TNphi_.Share(a.TNphi_);
156 Theta_.Share(a.Theta_);
157 pixels_.Share(a.pixels_);
158 if (this->mInfo_) {delete this->mInfo_; this->mInfo_ = NULL;}
159 if (a.mInfo_) this->mInfo_ = new DVList(*(a.mInfo_));
160}
161
162////////////////////////// methodes de copie/share
163//! Perform data copy or shares the data
164template<class T>
165SphereThetaPhi<T>& SphereThetaPhi<T>::Set(const SphereThetaPhi<T>& a)
166{
167 if (this != &a)
168 {
169
170
171 if (a.NbPixels() < 1)
172 throw RangeCheckError("SphereThetaPhi<T>::Set(a ) - Array a not allocated ! ");
173 if (NbPixels() < 1) CloneOrShare(a);
174 else CopyElt(a);
175 if (this->mInfo_) delete this->mInfo_;
176 this->mInfo_ = NULL;
177 if (a.mInfo_) this->mInfo_ = new DVList(*(a.mInfo_));
178 }
179 return(*this);
180}
181
182//! Perform data copy or shares the data
183template<class T>
184SphereThetaPhi<T>& SphereThetaPhi<T>::CopyElt(const SphereThetaPhi<T>& a)
185{
186 if (NbPixels() < 1)
187 throw RangeCheckError("SphereThetaPhi<T>::CopyElt(const SphereThetaPhi<T>& ) - Not Allocated Array ! ");
188 if (NbPixels() != a.NbPixels())
189 throw(SzMismatchError("SphereThetaPhi<T>::CopyElt(const SphereThetaPhi<T>&) SizeMismatch")) ;
190
191 NTheta_= a.NTheta_;
192 NPix_ = a.NPix_;
193 Omega_ = a.Omega_;
194 int k;
195 for (k=0; k< NPix_; k++) pixels_(k) = a.pixels_(k);
196 for (k=0; k< a.NPhi_.Size(); k++) NPhi_(k) = a.NPhi_(k);
197 for (k=0; k< a.TNphi_.Size(); k++) TNphi_(k) = a.TNphi_(k);
198 for (k=0; k< a.Theta_.Size(); k++) Theta_(k) = a.Theta_(k);
199 return(*this);
200
201}
202
203/* --Methode-- */
204//! Return total number of pixels
205template <class T>
206int_4 SphereThetaPhi<T>::NbPixels() const
207{
208 return(NPix_);
209}
210
211/* --Methode-- */
212//! Return value of pixel with index k
213template <class T>
214T& SphereThetaPhi<T>::PixVal(int_4 k)
215{
216 if((k < 0) || (k >= NPix_))
217 {
218 throw RangeCheckError("SphereThetaPhi::PIxVal Pixel index out of range");
219 }
220 return pixels_(k);
221}
222
223//! Return value of pixel with index k
224template <class T>
225T const& SphereThetaPhi<T>::PixVal(int_4 k) const
226{
227 if((k < 0) || (k >= NPix_))
228 {
229 throw RangeCheckError("SphereThetaPhi::PIxVal Pixel index out of range");
230 }
231 return *(pixels_.Data()+k);
232}
233
234/* --Methode-- */
235//! Return true if teta,phi in map
236template <class T>
237bool SphereThetaPhi<T>::ContainsSph(double /*theta*/, double /*phi*/) const
238{
239 return(true);
240}
241
242/* --Methode-- */
243//! Return index of the pixel corresponding to direction (theta, phi).
244template <class T>
245int_4 SphereThetaPhi<T>::PixIndexSph(double theta, double phi) const
246{
247 double dphi;
248 int i,k;
249 bool fgzn = false;
250
251 if((theta > Pi) || (theta < 0.)) return(-1);
252 if((phi < 0.) || (phi > DeuxPi)) return(-1);
253 if(theta > Pi*0.5) {fgzn = true; theta = Pi-theta;}
254
255 // La bande d'indice kt est limitée par les valeurs de theta contenues dans
256 // Theta_[kt] et Theta_[kt+1]
257 for( i=1; i< NTheta_; i++ )
258 if( theta < Theta_(i) ) break;
259
260 dphi= DeuxPi/(double)NPhi_(i-1);
261
262 if (fgzn) k= NPix_-TNphi_(i)+(int_4)(phi/dphi);
263 else k= TNphi_(i-1)+(int_4)(phi/dphi);
264 return(k);
265}
266
267/* --Methode-- */
268//! Return (theta,phi) coordinates of middle of pixel with index k
269template <class T>
270void SphereThetaPhi<T>::PixThetaPhi(int_4 k,double& theta,double& phi) const
271{
272 int i;
273 bool fgzn = false;
274
275 if((k < 0) || (k >= NPix_)) {theta = -99999.; phi = -99999.; return; }
276 if( k >= NPix_/2) {fgzn = true; k = NPix_-1-k;}
277
278 // recupère l'indice i de la tranche qui contient le pixel k
279 for( i=0; i< NTheta_; i++ )
280 if( k < TNphi_(i+1) ) break;
281
282 // angle theta
283 theta= 0.5*(Theta_(i)+Theta_(i+1));
284 if (fgzn) theta= Pi-theta;
285
286 // angle phi
287 k -= TNphi_(i);
288 phi= DeuxPi/(double)NPhi_(i)*(double)(k+.5);
289 if (fgzn) phi= DeuxPi-phi;
290}
291
292//! Setting pixel values to a constant
293template <class T>
294T SphereThetaPhi<T>::SetPixels(T v)
295{
296pixels_.Reset(v);
297return(v);
298}
299
300/*!
301 \brief Pixel Solid angle (steradians)
302 All the pixels have the same solid angle. The dummy argument is
303 for compatibility with eventual pixelizations which would not
304 fulfil this requirement.
305*/
306template <class T>
307double SphereThetaPhi<T>::PixSolAngle(int_4 /*dummy*/) const
308
309{
310 return Omega_;
311}
312
313/* --Methode-- */
314//! Return values of theta,phi which limit the pixel with index k
315template <class T>
316void SphereThetaPhi<T>::Limits(int_4 k,double& tetMin,double& tetMax,double& phiMin,double& phiMax)
317 {
318 int j;
319 double dphi;
320 bool fgzn= false;
321
322 if((k < 0) || (k >= NPix_)) {
323 tetMin= -99999.;
324 phiMin= -99999.;
325 tetMax= -99999.;
326 phiMax= -99999.;
327 return;
328 }
329
330 // si on se trouve dans l'hémisphère Sud
331 if(k >= NPix_/2) {
332 fgzn= true;
333 k= NPix_-1-k;
334 }
335
336 // on recupere l'indice i de la tranche qui contient le pixel k
337 int i;
338 for( i=0; i< NTheta_; i++ )
339 if(k < TNphi_(i+1)) break;
340
341 // valeurs limites de theta dans l'hemisphere Nord
342 tetMin= Theta_(i);
343 tetMax= Theta_(i+1);
344 // valeurs limites de theta dans l'hemisphere Sud
345 if (fgzn) {
346 tetMin= Pi - Theta_(i+1);
347 tetMax= Pi - Theta_(i);
348 }
349
350 // pixel correspondant dans l'hemisphere Nord
351 if (fgzn) k= TNphi_(i+1)-k+TNphi_(i)-1;
352
353 // indice j de discretisation ( phi= j*dphi )
354 j= k-TNphi_(i);
355 dphi= DeuxPi/(double)NPhi_(i);
356
357 // valeurs limites de phi
358 phiMin= dphi*(double)(j);
359 phiMax= dphi*(double)(j+1);
360 return;
361}
362
363/* --Methode-- */
364//! Return number of theta-slices on the sphere
365template <class T>
366uint_4 SphereThetaPhi<T>::NbThetaSlices() const
367{
368 if (NTheta_<=0)
369 {
370 throw PException(" sphere not pixelized, NbSlice=0 ");
371 }
372 return( 2*NTheta_);
373}
374
375/* --Methode-- */
376//! Return number of pixels along the phi-direction of the kt-th slice
377template <class T>
378int_4 SphereThetaPhi<T>::NPhi(int_4 kt) const
379{
380 int nbpix;
381 // verification
382 if((kt < 0) || (kt >= 2*NTheta_)) return(-1);
383
384 // si on se trouve dans l'hemisphere Sud
385 if(kt >= NTheta_) {
386 kt= 2*NTheta_-1-kt;
387 }
388
389 // nombre de pixels
390 nbpix= NPhi_(kt);
391 return(nbpix);
392}
393
394
395/* --Methode-- */
396//! Return theta values which limit the slice kt
397template <class T>
398void SphereThetaPhi<T>::Theta(int_4 kt,double& tetMin,double& tetMax)
399{
400 bool fgzn= false;
401 // verification
402 if( (kt< 0) || (kt>= 2*NTheta_) ) {
403 tetMin= -99999.;
404 tetMax= -99999.;
405 return;
406 }
407
408 // si on se trouve dans l'hemisphere Sud
409 if( kt >= NTheta_ ) {
410 fgzn= true;
411 kt= 2*NTheta_-1-kt;
412 }
413
414 // valeurs limites de theta dans l'hemisphere Nord
415 tetMin= Theta_(kt);
416 tetMax= Theta_(kt+1);
417 // valeurs limites de theta dans l'hemisphere Sud
418 if (fgzn) {
419 tetMin= Pi - Theta_(kt+1);
420 tetMax= Pi - Theta_(kt);
421 }
422}
423
424/* --Methode-- */
425//! Return values of phi which limit the jp-th pixel of the kt-th slice
426template <class T>
427void SphereThetaPhi<T>::Phi(int_4 kt,int_4 jp,double& phiMin,double& phiMax)
428{
429 // verification
430 if((kt < 0) || (kt >= 2*NTheta_)) {
431 phiMin= -99999.;
432 phiMax= -99999.;
433 return;
434 }
435
436 // si on se trouve dans l'hemisphere Sud
437 if(kt >= NTheta_) kt= 2*NTheta_-1-kt;
438
439 // verifie si la tranche kt contient au moins jp pixels
440 if( (jp< 0) || (jp >= NPhi_(kt)) ) {
441 phiMin= -88888.;
442 phiMax= -88888.;
443 return;
444 }
445
446 double dphi= DeuxPi/(double)NPhi_(kt);
447 phiMin= dphi*(double)(jp);
448 phiMax= dphi*(double)(jp+1);
449 return;
450}
451
452/* --Methode-- */
453//! Return pixel index with sequence index jp in the slice kt
454template <class T>
455int_4 SphereThetaPhi<T>::Index(int_4 kt,int_4 jp) const
456{
457 int k;
458 bool fgzn= false;
459
460 // si on se trouve dans l'hemisphere Sud
461 if(kt >= NTheta_) {
462 fgzn= true;
463 kt= 2*NTheta_-1-kt;
464 }
465
466 // si la tranche kt contient au moins i pixels
467 if( (jp>=0) && (jp<NPhi_(kt)) )
468 {
469 // dans l'hemisphere Sud
470 if (fgzn) k= NPix_-TNphi_(kt+1)+jp;
471 // dans l'hemisphere Nord
472 else k= TNphi_(kt)+jp;
473 }
474 else
475 {
476 k= 9999;
477 printf("\n la tranche %d ne contient pas un pixel de rang %d",kt,jp);
478 }
479 return(k);
480}
481
482/* --Methode-- */
483//! Return indices kt (theta) and jp (phi) of pixel with index k
484template <class T>
485void SphereThetaPhi<T>::ThetaPhiIndex(int_4 k,int_4& kt,int_4& jp)
486{
487 bool fgzn= false;
488 // si on se trouve dans l'hemisphere Sud
489 if(k >= NPix_/2)
490 {
491 fgzn= true;
492 k= NPix_-1-k;
493 }
494
495 // on recupere l'indice kt de la tranche qui contient le pixel k
496 int i;
497 for(i = 0; i < NTheta_; i++)
498 if(k < TNphi_(i+1)) break;
499
500 // indice kt de tranche
501 if (fgzn) kt= 2*NTheta_-1-i;
502 else kt= i;
503
504 // indice jp de pixel
505 if (fgzn) jp= TNphi_(i+1)-k-1;
506 else jp= k-TNphi_(i);
507}
508/*!
509 \brief achieve the splitting into pixels
510 m has the same signification as for the constructor
511
512 Each theta-slice of the north hemisphere will be spitted starting f
513 from phi=0 ...
514
515 South hemisphere is scanned in the same direction according to phi
516 and from equator to the pole (the pixel following the last one of
517 the slice closest to the equator with z>0, is the pixel with lowest
518 phi of the slice closest of the equator with z<0).
519*/
520template <class T>
521void SphereThetaPhi<T>::Pixelize(int_4 m)
522
523//--
524{
525 int ntotpix,j;
526
527 // Decodage et controle des arguments d'appel :
528 // au moins 2 et au plus 524288 bandes d'un hemisphere en theta
529 if (m < 2) m = 2;
530 if (m > 524288) m = 524288;
531
532 // On memorise les arguments d'appel
533 NTheta_ = m;
534
535 // On commence par decouper l'hemisphere z>0.
536 // Creation des vecteurs contenant :
537 // Les valeurs limites de theta (une valeur de plus que le nombre de bandes...)
538 // Theta_= new double[m+1];
539 Theta_.ReSize(m+1);
540
541 // Le nombre de pixels en phi de chacune des bandes en theta
542 // NPhi_ = new int_4[m];
543 // une taille de m suffit, mais je mets m+1 pour que les 3 tableaux aient
544 // la meme taille pour une manipulation plus faciles par la librairie
545 // cfitsio -- GLM (13-04-00)
546 NPhi_.ReSize(m+1);
547
548 // Le nombre/Deuxpi total des pixels contenus dans les bandes de z superieur a une
549 // bande donnee (mTPphi[m] contient le nombre de pixels total de l'hemisphere)
550 // TNphi_= new int_4[m+1];
551 TNphi_.ReSize(m+1);
552
553 // Calcul du nombre total de pixels dans chaque bande pour optimiser
554 // le rapport largeur/hauteur des pixels
555
556 //calotte polaire
557 TNphi_(0)= 0;
558 NPhi_(0) = 1;
559
560 //bandes jusqu'a l'equateur
561 for(j = 1; j < m; j++)
562 {
563 TNphi_(j)= TNphi_(j-1)+NPhi_(j-1);
564 NPhi_(j) = (int_4)(.5+4.*(double)(m-.5)*sin(Pi*(double)j/(double)(2.*m-1.))) ;
565 }
566
567 // Nombre total de pixels sur l'hemisphere
568 ntotpix = TNphi_(m-1)+NPhi_(m-1);
569 TNphi_(m)= ntotpix;
570 // et sur la sphere entiere
571 NPix_= 2*ntotpix;
572
573 // Creation et initialisation du vecteur des contenus des pixels
574 pixels_.ReSize(NPix_);
575 pixels_.Reset();
576
577 // Determination des limites des bandes en theta :
578 // omeg est l'angle solide couvert par chaque pixel,
579 // une bande donnee kt couvre un angle solide NPhi_[kt]*omeg
580 // egal a 2* Pi*(cos Theta_[kt]-cos Theta_[kt+1]). De meme, l'angle solide
581 //de la
582 // calotte allant du pole a la limite haute de la bande kt vaut
583 // 2* Pi*(1.-cos Theta_[kt+1])= TNphi_[kt]*omeg...
584
585 double omeg2pi= 1./(double)ntotpix;
586 Omega_ = omeg2pi*DeuxPi;
587
588 for(j=0; j <= m; j++)
589 {
590 Theta_(j)= acos(1.-(double)TNphi_(j)*omeg2pi);
591 }
592}
593
594//! Return the theta angle for slice defined by \b index
595template <class T>
596r_8 SphereThetaPhi<T>::ThetaOfSlice(int_4 index) const
597{
598 if(index < 0 || index >= 2*NTheta_)
599 throw RangeCheckError("SphereThetaPhi::ThetaOfSlice() index out of range");
600 double tet1, tet2;
601 Theta(index, tet1, tet2);
602 return 0.5*(tet1+tet2);
603}
604
605/*!
606 \brief return a Theta slice information
607 For a theta-slice with index 'index', return :
608 the corresponding "theta"
609 a vector containing the phi's of the pixels of the slice
610 a vector containing the corresponding values of pixels
611*/
612template <class T>
613void SphereThetaPhi<T>::GetThetaSlice(int_4 index,r_8& theta, TVector<r_8>& phi, TVector<T>& value) const
614
615{
616
617 if(index < 0 || index >= NbThetaSlices())
618 throw RangeCheckError("SphereThetaPhi::GetThetaSlice() index out of range");
619
620
621 int iring= Index(index,0);
622 int lring = NPhi(index);
623
624 phi.ReSize(lring);
625 value.ReSize(lring);
626 double Te= 0.;
627 double Fi= 0.;
628 for(int kk = 0; kk < lring; kk++)
629 {
630 PixThetaPhi(kk+iring,Te,Fi);
631 phi(kk)= Fi;
632 value(kk)= PixVal(kk+iring);
633 }
634 theta= Te;
635}
636
637/*
638 \brief return information on a theta slice
639 For a theta-slice with index 'index', return :
640 the corresponding "theta"
641 the corresponding "phi" for first pixel of the slice
642 a vector containing the indices of the pixels of the slice
643 (equally distributed in phi)
644 a vector containing the corresponding values of pixels
645*/
646template <class T>
647void SphereThetaPhi<T>::GetThetaSlice(int_4 index,r_8& theta, r_8& phi0,TVector<int_4>& pixelIndices, TVector<T>& value) const
648
649{
650
651 if(index < 0 || index >= NbThetaSlices())
652 {
653 throw RangeCheckError("SphereThetaPhi::PIxVal Pixel index out of range");
654
655 }
656
657 int iring= Index(index,0);
658 int lring = NPhi(index);
659
660 pixelIndices.ReSize(lring);
661 value.ReSize(lring);
662 double Te= 0.;
663 double Fi= 0.;
664 for(int kk = 0; kk < lring; kk++)
665 {
666 pixelIndices(kk)=kk+iring ;
667 value(kk)= PixVal(kk+iring);
668 }
669 PixThetaPhi(iring,theta,phi0);
670}
671
672
673
674
675template <class T>
676void SphereThetaPhi<T>::print(ostream& os) const
677{
678 if(this->mInfo_) os << " DVList Info= " << *(this->mInfo_) << endl;
679 //
680 os << " NTheta_= " << NTheta_ << endl;
681 os << " NPix_ = " << NPix_ << endl;
682 os << " Omega_ = " << Omega_ << endl;
683
684 os << " contenu de NPhi_ : ";
685 int i;
686 for(i=0; i < NTheta_; i++)
687 {
688 if(i%5 == 0) os << endl;
689 os << NPhi_(i) <<", ";
690 }
691 os << endl;
692
693 os << " contenu de Theta_ : ";
694 for(i=0; i < NTheta_+1; i++)
695 {
696 if(i%5 == 0) os << endl;
697 os << Theta_(i) <<", ";
698 }
699 os << endl;
700
701 os << " contenu de TNphi_ : ";
702 for(i=0; i < NTheta_+1; i++)
703 {
704 if(i%5 == 0) os << endl;
705 os << TNphi_(i) <<", ";
706 }
707 os << endl;
708
709 os << " contenu de pixels : ";
710 for(i=0; i < NPix_; i++)
711 {
712 if(i%5 == 0) os << endl;
713 os << pixels_(i) <<", ";
714 }
715 os << endl;
716}
717
718// ...... Operations de calcul ......
719
720
721//! Fill a SphereThetaPhi with a constant value \b a
722template <class T>
723SphereThetaPhi<T>& SphereThetaPhi<T>::SetT(T a)
724{
725 if (NbPixels() < 1)
726 throw RangeCheckError("SphereThetaPhi<T>::SetT(T ) - SphereThetaPhi not dimensionned ! ");
727 pixels_ = a;
728 return (*this);
729}
730
731/*! Add a constant value \b x to a SphereThetaPhi */
732template <class T>
733SphereThetaPhi<T>& SphereThetaPhi<T>::Add(T a)
734 {
735 if (NbPixels()< 1)
736 throw RangeCheckError("SphereThetaPhi<T>::Add(T ) - SphereThetaPhi not dimensionned ! ");
737 pixels_ += a;
738 return (*this);
739}
740
741/*! Substract a constant value \b a to a SphereThetaPhi */
742template <class T>
743SphereThetaPhi<T>& SphereThetaPhi<T>::Sub(T a,bool fginv)
744{
745 if (NbPixels()< 1)
746 throw RangeCheckError("SphereThetaPhi<T>::Sub(T ) - SphereThetaPhi not dimensionned ! ");
747 pixels_.Sub(a,fginv);
748 return (*this);
749}
750
751/*! multiply a SphereThetaPhi by a constant value \b a */
752template <class T>
753SphereThetaPhi<T>& SphereThetaPhi<T>::Mul(T a)
754{
755 if (NbPixels()< 1)
756 throw RangeCheckError("SphereThetaPhi<T>::Mul(T ) - SphereThetaPhi not dimensionned ! ");
757 pixels_ *= a;
758 return (*this);
759}
760
761/*! divide a SphereThetaPhi by a constant value \b a */
762template <class T>
763SphereThetaPhi<T>& SphereThetaPhi<T>::Div(T a)
764{
765 if (NbPixels()< 1)
766 throw RangeCheckError("SphereThetaPhi<T>::Div(T ) - SphereThetaPhi not dimensionned ! ");
767 pixels_ /= a;
768 return (*this);
769}
770
771// >>>> Operations avec 2nd membre de type SphereThetaPhi
772//! Add two SphereThetaPhi
773
774template <class T>
775SphereThetaPhi<T>& SphereThetaPhi<T>::AddElt(const SphereThetaPhi<T>& a)
776{
777 if (NbPixels()!= a.NbPixels())
778 {
779 throw(SzMismatchError("SphereThetaPhi<T>::AddElt(const SphereThetaPhi<T>&) SizeMismatch")) ;
780 }
781 pixels_ += a.pixels_;
782 return (*this);
783}
784
785//! Substract two SphereThetaPhi
786template <class T>
787SphereThetaPhi<T>& SphereThetaPhi<T>::SubElt(const SphereThetaPhi<T>& a)
788{
789 if (NbPixels()!= a.NbPixels())
790 {
791 throw(SzMismatchError("SphereThetaPhi<T>::SubElt(const SphereThetaPhi<T>&) SizeMismatch")) ;
792 }
793 pixels_ -= a.pixels_;
794 return (*this);
795}
796
797//! Multiply two SphereThetaPhi (elements by elements)
798template <class T>
799SphereThetaPhi<T>& SphereThetaPhi<T>::MulElt(const SphereThetaPhi<T>& a)
800{
801 if (NbPixels()!= a.NbPixels())
802 {
803 throw(SzMismatchError("SphereThetaPhi<T>::MulElt(const SphereThetaPhi<T>&) SizeMismatch")) ;
804 }
805 pixels_ *= a.pixels_;
806 return (*this);
807}
808
809//! Divide two SphereThetaPhi (elements by elements) - No protection for divide by 0
810template <class T>
811SphereThetaPhi<T>& SphereThetaPhi<T>::DivElt(const SphereThetaPhi<T>& a)
812{
813 if (NbPixels()!= a.NbPixels())
814 {
815 throw(SzMismatchError("SphereThetaPhi<T>::DivElt(const SphereThetaPhi<T>&) SizeMismatch")) ;
816 }
817 pixels_ /= a.pixels_;
818 return (*this);
819}
820
821
822
823#ifdef __CXX_PRAGMA_TEMPLATES__
824#pragma define_template SphereThetaPhi<int_4>
825#pragma define_template SphereThetaPhi<r_8>
826#pragma define_template SphereThetaPhi<r_4>
827#pragma define_template SphereThetaPhi< complex<r_4> >
828#pragma define_template SphereThetaPhi< complex<r_8> >
829#endif
830#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
831namespace SOPHYA {
832template class SphereThetaPhi<int_4>;
833template class SphereThetaPhi<r_8>;
834template class SphereThetaPhi<r_4>;
835template class SphereThetaPhi< complex<r_4> >;
836template class SphereThetaPhi< complex<r_8> >;
837}
838#endif
Note: See TracBrowser for help on using the repository browser.