source: Sophya/trunk/SophyaPI/PIext/pitvmaad.cc@ 4041

Last change on this file since 4041 was 3833, checked in by ansari, 15 years ago

Correction warning xlC, Reza 05/08/2010

File size: 9.2 KB
Line 
1// Adaptateurs pour TMatrix TVector du package Sophya
2// R. Ansari 1/99
3// LAL (Orsay) / IN2P3-CNRS DAPNIA/SPP (Saclay) / CEA
4
5#include "sopnamsp.h"
6#include "pitvmaad.h"
7#include <math.h>
8
9// -------------------------------------------------------
10// Decodage de la presence dans la chaine opt des options d'affichage pour tableaux complexes
11// cdreal , cdimag , cdphase , cdmod , cdmod2
12PICmplxDispOption StringToCmplxDispOption( string & opt )
13{
14PICmplxDispOption dopt=PICDO_Module;
15size_t olen = opt.length();
16if (opt.find("cdmod2")<olen) dopt=PICDO_Module2;
17else if (opt.find("cdmod")<olen) dopt=PICDO_Module;
18else if (opt.find("cdphas")<olen) dopt=PICDO_Phase;
19else if (opt.find("cdimag")<olen) dopt=PICDO_Imag;
20else if (opt.find("cdreal")<olen) dopt=PICDO_Real;
21else dopt=PICDO_Module;
22return dopt;
23}
24
25/* --- Methodes de calcul inline pour valeurs de retour complexes ---- */
26static inline double _z_mod_( complex< r_4 > z)
27{
28 return ( sqrt((double)(z.real()*z.real()+z.imag()*z.imag() ) ) );
29}
30static inline double _z_mod_( complex< r_8 > z)
31{
32 return ( sqrt(z.real()*z.real()+z.imag()*z.imag() ) );
33}
34static inline double _z_mod2_( complex< r_4 > z)
35{
36 return ( (double)(z.real()*z.real()+z.imag()*z.imag() ) );
37}
38static inline double _z_mod2_( complex< r_8 > z)
39{
40 return ( z.real()*z.real()+z.imag()*z.imag() );
41}
42/* ---------------------------- */
43
44/* --Methode-- */
45template <class T>
46POTVectorAdapter<T>::POTVectorAdapter(TVector<T>* v, bool ad, PICmplxDispOption dopt)
47 : P1DArrayAdapter(v->NElts())
48{
49dOpt = dopt;
50aDel = ad;
51mVec = v;
52}
53/* --Methode-- */
54template <class T>
55POTVectorAdapter<T>::~POTVectorAdapter()
56{
57if (aDel) delete mVec;
58}
59
60/* --Methode-- */
61template <class T>
62double POTVectorAdapter<T>::Value(int i)
63{
64 return((double)(*mVec)(i));
65}
66
67/* --Methode-- */
68DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
69double POTVectorAdapter< complex<float> >::Value(int i)
70{
71switch (dOpt) {
72 case PICDO_Module:
73 return _z_mod_( (*mVec)(i) );
74 break;
75 case PICDO_Real:
76 return (double)(((*mVec)(i)).real());
77 break;
78 case PICDO_Imag:
79 return (double)(((*mVec)(i)).imag());
80 break;
81 case PICDO_Phase:
82 return atan2( (double) ((*mVec)(i).real()), (double)((*mVec)(i).imag()) );
83 break;
84 case PICDO_Module2:
85 return _z_mod2_( (*mVec)(i) );
86 break;
87 default:
88 return 0.;
89 break;
90 }
91}
92
93/* --Methode-- */
94DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
95double POTVectorAdapter< complex<double> >::Value(int i)
96{
97switch (dOpt) {
98 case PICDO_Module:
99 return _z_mod_( (*mVec)(i) );
100 break;
101 case PICDO_Real:
102 return (double)(((*mVec)(i)).real());
103 break;
104 case PICDO_Imag:
105 return (double)(((*mVec)(i)).imag());
106 break;
107 case PICDO_Phase:
108 return atan2( (double) ((*mVec)(i).real()), (double)((*mVec)(i).imag()) );
109 break;
110 case PICDO_Module2:
111 return _z_mod2_( (*mVec)(i) );
112 break;
113 default:
114 return 0.;
115 break;
116 }
117}
118
119/* --Methode-- */
120template <class T>
121POTMatrixAdapter<T>::POTMatrixAdapter(TMatrix<T>* mtx, bool ad, PICmplxDispOption dopt)
122 : P2DArrayAdapter(mtx->NCols(), mtx->NRows())
123{
124dOpt = dopt;
125aDel = ad;
126mMtx = mtx;
127}
128/* --Methode-- */
129template <class T>
130POTMatrixAdapter<T>::~POTMatrixAdapter()
131{
132if (aDel) delete mMtx;
133}
134/* --Methode-- */
135template <class T>
136double POTMatrixAdapter<T>::Value(int ix, int iy)
137{
138return((double)(*mMtx)(iy, ix));
139}
140
141/* --Methode-- */
142template <class T>
143double POTMatrixAdapter<T>::MeanVal(int ix1, int ix2, int jy1, int jy2)
144{
145int ec;
146if (ix1>ix2) { ec=ix1; ix1=ix2; ix2=ec; }
147if (jy1>jy2) { ec=jy1; jy1=jy2; jy2=ec; }
148double ss = 0.;
149for(int j=jy1; j<=jy2; j++)
150 for(int i=ix1; i<=ix2; i++) ss += (double)((*mMtx)(j, i));
151ss /= (double)((jy2-jy1+1)*(ix2-ix1+1));
152return ss;
153}
154
155
156/* --Methode-- */
157DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
158double POTMatrixAdapter< complex<float> >::Value(int ix, int iy)
159{
160switch (dOpt) {
161 case PICDO_Module:
162 return _z_mod_( (*mMtx)(iy, ix) );
163 break;
164 case PICDO_Real:
165 return (double)(((*mMtx)(iy, ix)).real());
166 break;
167 case PICDO_Imag:
168 return (double)(((*mMtx)(iy, ix)).imag());
169 break;
170 case PICDO_Phase:
171 return atan2( (double) ((*mMtx)(iy, ix)).real(), (double) ((*mMtx)(iy, ix)).imag() );
172 break;
173 case PICDO_Module2:
174 return _z_mod2_( (*mMtx)(iy, ix) );
175 break;
176 default:
177 return 0.;
178 break;
179 }
180}
181
182/* --Methode-- */
183DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
184double POTMatrixAdapter< complex<double> >::Value(int ix, int iy)
185{
186switch (dOpt) {
187 case PICDO_Module:
188 return _z_mod_( (*mMtx)(iy, ix) );
189 break;
190 case PICDO_Real:
191 return (double)(((*mMtx)(iy, ix)).real());
192 break;
193 case PICDO_Imag:
194 return (double)(((*mMtx)(iy, ix)).imag());
195 break;
196 case PICDO_Phase:
197 return atan2( (double) ((*mMtx)(iy, ix)).real(), (double) ((*mMtx)(iy, ix)).imag() );
198 break;
199 case PICDO_Module2:
200 return _z_mod2_( (*mMtx)(iy, ix) );
201 break;
202 default:
203 return 0.;
204 break;
205 }
206}
207
208/* --Methode-- */
209DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
210double POTMatrixAdapter< complex<float> >::MeanVal(int ix1, int ix2, int jy1, int jy2)
211{
212int ec;
213if (ix1>ix2) { ec=ix1; ix1=ix2; ix2=ec; }
214if (jy1>jy2) { ec=jy1; jy1=jy2; jy2=ec; }
215complex<float> ssz = complex<float>(0.,0.);
216for(int j=jy1; j<=jy2; j++)
217 for(int i=ix1; i<=ix2; i++) ssz += (*mMtx)(j, i);
218switch (dOpt) {
219 case PICDO_Module:
220 return _z_mod_( ssz / complex<float>((float)((jy2-jy1+1)*(ix2-ix1+1)),(float)0.) );
221 break;
222 case PICDO_Real:
223 return ((double)(ssz.real())/(double)((jy2-jy1+1)*(ix2-ix1+1)) ) ;
224 break;
225 case PICDO_Imag:
226 return ((double)(ssz.imag())/(double)((jy2-jy1+1)*(ix2-ix1+1)) ) ;
227 break;
228 case PICDO_Phase:
229 return atan2( (double) ssz.real(), (double) ssz.imag() );
230 break;
231 case PICDO_Module2:
232 return _z_mod2_( ssz / complex<float>((float)((jy2-jy1+1)*(ix2-ix1+1)),(float)0.) );
233 break;
234 }
235return 0.;
236}
237
238/* --Methode-- */
239DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
240double POTMatrixAdapter< complex<double> >::MeanVal(int ix1, int ix2, int jy1, int jy2)
241{
242int ec;
243if (ix1>ix2) { ec=ix1; ix1=ix2; ix2=ec; }
244if (jy1>jy2) { ec=jy1; jy1=jy2; jy2=ec; }
245complex<double> ssz = complex<double>(0.,0.);
246for(int j=jy1; j<=jy2; j++)
247 for(int i=ix1; i<=ix2; i++) ssz += (*mMtx)(j, i);
248switch (dOpt) {
249 case PICDO_Module:
250 return _z_mod_( ssz / complex<double>((double)((jy2-jy1+1)*(ix2-ix1+1)),(double)0.) );
251 break;
252 case PICDO_Real:
253 return ((double)(ssz.real())/(double)((jy2-jy1+1)*(ix2-ix1+1)) ) ;
254 break;
255 case PICDO_Imag:
256 return ((double)(ssz.imag())/(double)((jy2-jy1+1)*(ix2-ix1+1)) ) ;
257 break;
258 case PICDO_Phase:
259 return atan2( (double) ssz.real(), (double) ssz.imag() );
260 break;
261 case PICDO_Module2:
262 return _z_mod2_( ssz / complex<double>((double)((jy2-jy1+1)*(ix2-ix1+1)),(double)0.) );
263 break;
264 }
265return 0.;
266}
267
268
269
270
271
272#ifdef __CXX_PRAGMA_TEMPLATES__
273#pragma define_template POTVectorAdapter< uint_1 >
274#pragma define_template POTVectorAdapter< uint_2 >
275#pragma define_template POTVectorAdapter< uint_4 >
276#pragma define_template POTVectorAdapter< uint_8 >
277#pragma define_template POTVectorAdapter< int_1 >
278#pragma define_template POTVectorAdapter< int_2 >
279#pragma define_template POTVectorAdapter< int_4 >
280#pragma define_template POTVectorAdapter< int_8 >
281#pragma define_template POTVectorAdapter< float >
282#pragma define_template POTVectorAdapter< double >
283#pragma define_template POTVectorAdapter< complex<float> >
284#pragma define_template POTVectorAdapter< complex<double> >
285
286#pragma define_template POTMatrixAdapter< uint_1 >
287#pragma define_template POTMatrixAdapter< uint_2 >
288#pragma define_template POTMatrixAdapter< uint_4 >
289#pragma define_template POTMatrixAdapter< uint_8 >
290#pragma define_template POTMatrixAdapter< int_1 >
291#pragma define_template POTMatrixAdapter< int_2 >
292#pragma define_template POTMatrixAdapter< int_4 >
293#pragma define_template POTMatrixAdapter< int_8 >
294#pragma define_template POTMatrixAdapter< float >
295#pragma define_template POTMatrixAdapter< double >
296#pragma define_template POTMatrixAdapter< complex<float> >
297#pragma define_template POTMatrixAdapter< complex<double> >
298#endif
299
300#if defined(ANSI_TEMPLATES)
301template class POTVectorAdapter< uint_1 >;
302template class POTVectorAdapter< uint_2 >;
303template class POTVectorAdapter< uint_4 >;
304template class POTVectorAdapter< uint_8 >;
305template class POTVectorAdapter< int_1 >;
306template class POTVectorAdapter< int_2 >;
307template class POTVectorAdapter< int_4 >;
308template class POTVectorAdapter< int_8 >;
309template class POTVectorAdapter< float >;
310template class POTVectorAdapter< double >;
311template class POTVectorAdapter< complex<float> >;
312template class POTVectorAdapter< complex<double> >;
313
314template class POTMatrixAdapter< uint_1 >;
315template class POTMatrixAdapter< uint_2 >;
316template class POTMatrixAdapter< uint_4 >;
317template class POTMatrixAdapter< uint_8 >;
318template class POTMatrixAdapter< int_1 >;
319template class POTMatrixAdapter< int_2 >;
320template class POTMatrixAdapter< int_4 >;
321template class POTMatrixAdapter< int_8 >;
322template class POTMatrixAdapter< float >;
323template class POTMatrixAdapter< double >;
324template class POTMatrixAdapter< complex<float> >;
325template class POTMatrixAdapter< complex<double> >;
326#endif
Note: See TracBrowser for help on using the repository browser.