source: Sophya/trunk/SophyaPI/PIext/nomtarradapter.cc@ 3333

Last change on this file since 3333 was 3333, checked in by ansari, 18 years ago

Ajout decodage nouveaux attributs (min max sumsq norm2) pour tableaux/matrices/vecteurs (${tab.norm2} ${tab.min} ...) - Reza 02/10/2007 "

File size: 14.1 KB
Line 
1#include "sopnamsp.h"
2#include "machdefs.h"
3#include <stdlib.h>
4#include <typeinfo>
5#include <iostream>
6#include <string>
7#include <complex>
8
9#include "datatype.h"
10
11#include "nomtarradapter.h"
12#include "tvector.h"
13#include "pitvmaad.h"
14#include "piyfxdrw.h"
15
16#include "fioarr.h"
17
18#include "nobjmgr.h"
19
20
21//----------------------------------------------------------------
22// Class Adaptateur d'objet (Pour NamedObjMgr) d'objet TMatrix<T>
23//----------------------------------------------------------------
24
25
26/* --Methode-- */
27template <class T>
28NOMAdapter_TArray<T>::NOMAdapter_TArray(TArray<T>* o)
29 : NObjMgrAdapter(o)
30{
31mArr = o;
32}
33
34/* --Methode-- */
35template <class T>
36NOMAdapter_TArray<T>::~NOMAdapter_TArray()
37{
38}
39
40/* --Methode-- */
41template <class T>
42NObjMgrAdapter* NOMAdapter_TArray<T>::Clone(AnyDataObj* o)
43{
44TArray<T>* a = dynamic_cast<TArray<T> *>(o);
45if (a) return ( new NOMAdapter_TArray<T>(a) );
46return ( new NObjMgrAdapter(o) );
47}
48
49/* --Methode-- */
50template <class T>
51string NOMAdapter_TArray<T>::GetDataObjType()
52{
53string type = "TArray< ";
54
55// type += DecodeTypeIdName(typeid(T).name());
56type += DataTypeInfo<T>::getTypeName();
57type += " > ";
58return(type);
59}
60
61/* --Methode-- */
62template <class T>
63AnyDataObj* NOMAdapter_TArray<T>::CloneDataObj(bool share)
64{
65return ( new TArray<T>(*mArr, share) );
66}
67
68/* --Methode-- */
69template <class T>
70string NOMAdapter_TArray<T>::GetInfoString(vector<string>& opts)
71{
72 if (opts.size() == 0) return mArr->InfoString();
73 else {
74 char buff[128];
75 if (opts[0] == "rank") {
76 sprintf(buff,"%d", (int)mArr->Rank());
77 return string(buff);
78 }
79 if (opts[0] == "sizes") {
80 string rs;
81 for(int_4 kd=0; kd<mArr->Rank(); kd++) {
82 sprintf(buff, "%ld ", (long)mArr->Size(kd));
83 rs += buff;
84 }
85 return rs;
86 }
87 else if ((opts[0] == "size") || (opts[0] == "nelts")) {
88 sprintf(buff, "%ld", (long)mArr->Size());
89 return string(buff);
90 }
91 else if (opts[0] == "sum") {
92 MuTyV mtv(mArr->Sum());
93 string s;
94 return mtv.Convert(s);
95 }
96 else if (opts[0] == "sumsq") {
97 MuTyV mtv(mArr->SumSq());
98 string s;
99 return mtv.Convert(s);
100 }
101 else if (opts[0] == "norm2") {
102 MuTyV mtv(mArr->Norm2());
103 string s;
104 return mtv.Convert(s);
105 }
106 else if ((opts[0] == "min")||(opts[0] == "max")||(opts[0] == "minmax")) {
107 T amin, amax;
108 MuTyV mtv;
109 string s;
110 mArr->MinMax(amin, amax);
111 if (opts[0] == "minmax") {
112 mtv = amin; mtv.Convert(s);
113 s += " ";
114 string mms;
115 mtv = amax; mtv.Convert(mms);
116 s += mms;
117 }
118 else {
119 if (opts[0] == "min") mtv = amin;
120 else if (opts[0] == "max") mtv = amax;
121 mtv.Convert(s);
122 }
123 return s;
124 }
125 else if (opts[0] == "info") { // Acces aux valeurs stockes ds le DVList Info()
126 if (opts.size() < 2) return string("");
127 else if (mArr->Info().HasKey(opts[1]) == false) return string("");
128 else return mArr->Info().GetS(opts[1]);
129 }
130 else return "TArray.Att: rank sizes size/nelts sum sumsq/norm2 min max minmax";
131 }
132}
133
134/* --Methode-- */
135template <class T>
136int NOMAdapter_TArray<T>::PerformOperation(vector<string>& opts)
137{
138 bool ok = false;
139 if ((mArr->Rank() >= 3) && (opts.size() >= 2)) {
140 int_4 ks = atoi(opts[1].c_str());
141 TMatrix<T> * slice = new TMatrix<T>;
142 char buff[40];
143 if (opts[0] == "slicexy") {
144 slice->Share(mArr->SubArray(Range::all(), Range::all(), Range(ks),
145 Range::first(), Range::first()) );
146 ok = true;
147 sprintf(buff,"slicexy_%ld",(long)ks);
148 cout << "PerformOperation(): Extracting SliceXY(" << ks << ") from array" << endl;
149 }
150 else if (opts[0] == "sliceyz") {
151 slice->Share(mArr->SubArray(Range(ks), Range::all(), Range::all(), Range::first(),
152 Range::first()).CompactAllDimensions() );
153 ok = true;
154 sprintf(buff,"sliceyz_%ld",(long)ks);
155 cout << "PerformOperation(): Extracting SliceYZ(" << ks << ") from array" << endl;
156 }
157 else if (opts[0] == "slicexz") {
158 slice->Share(mArr->SubArray(Range::all(), Range(ks), Range::all(), Range::first(),
159 Range::first()).CompactAllDimensions() );
160 ok = true;
161 sprintf(buff,"slicexz_%ld",(long)ks);
162 cout << "PerformOperation(): Extracting SliceYZ(" << ks << ") from array" << endl;
163 }
164 if (ok) {
165 string nslice;
166 if (opts.size() > 2) nslice = opts[2];
167 else nslice = buff;
168 NamedObjMgr omg;
169 omg.AddObj(slice, nslice, true);
170 return 0;
171 }
172 }
173
174 cout << "NOMAdapter_TArray<T>::PerformOperation(): Error operation/arguments !" << endl;
175 cout << "...Valid args: slicexy idxZ [slicename], sliceyz idxX [nm] slicexz idxY [nm]" << endl;
176 return 1;
177}
178
179/* --Methode-- */
180template <class T>
181void NOMAdapter_TArray<T>::SavePPF(POutPersist& pos, string const & nom)
182{
183FIO_TArray<T> fio(mArr);
184fio.Write(pos, nom);
185}
186
187/* --Methode-- */
188template <class T>
189void NOMAdapter_TArray<T>::Print(ostream& os, int lev)
190{
191if (lev < 3) mArr->Show(os, false);
192else mArr->Show(os, true);
193if (lev > 0) mArr->Print(os, 10*lev);
194}
195
196/* --Methode-- */
197template <class T>
198PIDrawer * NOMAdapter_TArray<T>::GetDrawer(string & dopt)
199{
200if (mArr->NbDimensions() == 1) {
201 // On peut en faire un vecteur ...
202 TVector<T>* v = new TVector<T>(*mArr, true); // on partage les donnees
203 dopt = "thinline," + dopt;
204 return( new PIYfXDrawer( new POTVectorAdapter<T>(v, true), NULL, true) );
205}
206 else return(NULL);
207}
208
209/* --Methode-- */
210template <class T>
211P2DArrayAdapter* NOMAdapter_TArray<T>::Get2DArray(string &)
212{
213if (mArr->NbDimensions() <= 2) {
214 // On peut en faire un tableau 2-D ...
215 TMatrix<T>* m = new TMatrix<T>(*mArr, true); // on partage les donnees
216 return ( new POTMatrixAdapter<T>(m, true) );
217}
218else return(NULL);
219}
220
221/* --Methode-- */
222template <class T>
223NTupleInterface* NOMAdapter_TArray<T>::GetNTupleInterface(bool& adel)
224{
225adel = true;
226return( new NTupInt_TArray<T>(mArr) );
227}
228
229
230
231
232// -------------------------------------------------------------
233
234/* --Methode-- */
235template <class T>
236NTupInt_TArray<T>::NTupInt_TArray(TArray<T>* a)
237{
238mArr = a;
239}
240
241/* --Methode-- */
242template <class T>
243NTupInt_TArray<T>::~NTupInt_TArray()
244{
245}
246
247/* --Methode-- */
248template <class T>
249sa_size_t NTupInt_TArray<T>::NbLines() const
250{
251return( mArr->Size() );
252}
253
254/* --Methode-- */
255template <class T>
256sa_size_t NTupInt_TArray<T>::NbColumns() const
257{
258return(11);
259}
260
261/* --Methode-- */
262template <class T>
263r_8 NTupInt_TArray<T>::GetCell(sa_size_t n, sa_size_t k) const
264{
265 if ((n < 0) || (n >= (int)(mArr->Size()) ) )
266 return 0.;
267 if ((k < 0) || (k > 10)) return 0.;
268 GetLineD(n);
269 return mRet[k];
270}
271
272/* --Methode-- */
273template <class T>
274sa_size_t NTupInt_TArray<T>::ColumnIndex(string const & nom) const
275{
276string vardec = "double n,x,y,z,t,u,val,real,imag,mod,phas; \n";
277 if (nom == "n") return 0;
278 else if (nom == "x") return 1;
279 else if (nom == "y") return 2;
280 else if (nom == "z") return 3;
281 else if (nom == "t") return 4;
282 else if (nom == "u") return 5;
283 else if (nom == "val") return 6;
284 else if (nom == "real") return 7;
285 else if (nom == "imag") return 8;
286 else if (nom == "mod") return 9;
287 else if (nom == "phase") return 10;
288 else return -1;
289}
290
291/* --Methode-- */
292template <class T>
293void NTupInt_TArray<T>::GetMinMax(sa_size_t k, double& min, double& max) const
294{
295 if (k == 0) {
296 min = 0.; max = (r_8)(mArr->Size()); }
297 else if (k == 1) {
298 min = 0.; max = (r_8)(mArr->SizeX()); }
299 else if (k == 2) {
300 min = 0.; max = (r_8)(mArr->SizeY()); }
301 else if (k == 3) {
302 min = 0.; max = (r_8)(mArr->SizeZ()); }
303 else if (k == 4) {
304 min = 0.; max = (r_8)(mArr->Size(3)); }
305 else if (k == 5) {
306 min = 0.; max = (r_8)(mArr->Size(4)); }
307 else if ((k == 6) || (k == 7) || (k == 9)) {
308 T tmin, tmax;
309 mArr->MinMax(tmin, tmax);
310 min = (r_8)(tmin);
311 max = (r_8)(tmax);
312 }
313 else { min = max = 0.; }
314 return;
315}
316
317/* --Methode-- */
318template <class T>
319r_8* NTupInt_TArray<T>::GetLineD(sa_size_t n) const
320{
321if ((n < 0) || (n >= (int)(mArr->Size()) ) ) {
322 mRet[0] = n;
323 for(int i=1; i<11; i++) mRet[i] = 0.;
324}
325else {
326 sa_size_t ix, iy, iz, it, iu;
327 mArr->IndexAtPosition(n, ix, iy, iz, it, iu);
328 mRet[0] = n; mRet[1] = ix; mRet[2] = iy;
329 mRet[3] = iz; mRet[4] = it; mRet[5] = iu;
330 mRet[6] = (*mArr)(ix,iy,iz,it,iu);
331 mRet[7] = mRet[6]; mRet[8] = 0.;
332 mRet[9] = mRet[6]; mRet[10] = 0.;
333 }
334return(mRet);
335}
336
337/* --Methode-- */
338template <class T>
339string NTupInt_TArray<T>::VarList_C(const char* nx) const
340{
341string nomx;
342if (nx) nomx = nx;
343else nomx = "_xh_";
344string vardec = "double n,x,y,z,t,u,val,real,imag,mod,phas; \n";
345vardec += "n = " + nomx + "[0]; x = " + nomx + "[1]; y = " + nomx + "[2]; \n";
346vardec += "z = " + nomx + "[3]; t = " + nomx + "[4]; u = " + nomx + "[5]; \n";
347vardec += "val = " + nomx + "[6]; \n";
348vardec += "real = " + nomx + "[7]; imag = " + nomx + "[8]; \n";
349vardec += "mod = " + nomx + "[9]; phas = " + nomx + "[10]; \n";
350return(vardec);
351}
352
353/* --Methode-- */
354DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
355r_8* NTupInt_TArray< complex<r_4> >::GetLineD(sa_size_t n) const
356{
357if ((n < 0) || (n >= (int)(mArr->Size()) ) ) {
358 mRet[0] = n;
359 for(int i=1; i<11; i++) mRet[i] = 0.;
360}
361else {
362 sa_size_t ix, iy, iz, it, iu;
363 mArr->IndexAtPosition(n, ix, iy, iz, it, iu);
364 mRet[0] = n; mRet[1] = ix; mRet[2] = iy;
365 mRet[3] = iz; mRet[4] = it; mRet[5] = iu;
366 mRet[7] = (*mArr)(ix,iy,iz,it,iu).real();
367 mRet[8] = (*mArr)(ix,iy,iz,it,iu).imag();
368 mRet[6] = mRet[9] = sqrt(mRet[7]*mRet[7]+mRet[8]*mRet[8]);
369 mRet[10] = atan2(mRet[8], mRet[7]);
370}
371return(mRet);
372}
373
374DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
375r_8* NTupInt_TArray< complex<r_8> >::GetLineD(sa_size_t n) const
376{
377if ((n < 0) || (n >= (int)(mArr->Size()) ) ) {
378 mRet[0] = n;
379 for(int i=1; i<11; i++) mRet[i] = 0.;
380}
381else {
382 sa_size_t ix, iy, iz, it, iu;
383 mArr->IndexAtPosition(n, ix, iy, iz, it, iu);
384 mRet[0] = n; mRet[1] = ix; mRet[2] = iy;
385 mRet[3] = iz; mRet[4] = it; mRet[5] = iu;
386 mRet[7] = (*mArr)(ix,iy,iz,it,iu).real();
387 mRet[8] = (*mArr)(ix,iy,iz,it,iu).imag();
388 mRet[6] = mRet[9] = sqrt(mRet[7]*mRet[7]+mRet[8]*mRet[8]);
389 mRet[10] = atan2(mRet[8], mRet[7]);
390}
391return(mRet);
392}
393
394DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
395void NTupInt_TArray< complex<r_4> >::GetMinMax(sa_size_t k, double& min, double& max) const
396{
397 if (k == 0) {
398 min = 0.; max = (r_8)(mArr->Size()); }
399 else if (k == 1) {
400 min = 0.; max = (r_8)(mArr->SizeX()); }
401 else if (k == 2) {
402 min = 0.; max = (r_8)(mArr->SizeY()); }
403 else if (k == 3) {
404 min = 0.; max = (r_8)(mArr->SizeZ()); }
405 else if (k == 4) {
406 min = 0.; max = (r_8)(mArr->Size(3)); }
407 else if (k == 5) {
408 min = 0.; max = (r_8)(mArr->Size(4)); }
409 else if ((k >= 6) || (k <= 9)) {
410 r_8 tmin[3] = {9.e39,9.e39,9.e39};
411 r_8 tmax[3] = {-9.e39,-9.e39,-9.e39};
412 for(sa_size_t jj=0; jj<mArr->Size(); jj++) {
413 sa_size_t ix, iy, iz, it, iu;
414 mArr->IndexAtPosition(jj, ix, iy, iz, it, iu);
415 r_8 cv[3];
416 cv[0] = (*mArr)(ix,iy,iz,it,iu).real();
417 cv[1] = (*mArr)(ix,iy,iz,it,iu).imag();
418 cv[2] = sqrt(cv[0]*cv[0]+cv[1]*cv[1]);
419 for(int i=0; i<3; i++) {
420 if (cv[i] < tmin[i]) tmin[i] = cv[i];
421 if (cv[i] > tmax[i]) tmax[i] = cv[i];
422 }
423 }
424 if (k == 7) { min = tmin[0]; max = tmax[0]; }
425 else if (k == 8) { min = tmin[0]; max = tmax[0]; }
426 else { min = tmin[2]; max = tmax[2]; }
427 }
428 else { min = max = 0.; }
429 return;
430}
431DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
432void NTupInt_TArray< complex<r_8> >::GetMinMax(sa_size_t k, double& min, double& max) const
433{
434 if (k == 0) {
435 min = 0.; max = (r_8)(mArr->Size()); }
436 else if (k == 1) {
437 min = 0.; max = (r_8)(mArr->SizeX()); }
438 else if (k == 2) {
439 min = 0.; max = (r_8)(mArr->SizeY()); }
440 else if (k == 3) {
441 min = 0.; max = (r_8)(mArr->SizeZ()); }
442 else if (k == 4) {
443 min = 0.; max = (r_8)(mArr->Size(3)); }
444 else if (k == 5) {
445 min = 0.; max = (r_8)(mArr->Size(4)); }
446 else if ((k >= 6) || (k <= 9)) {
447 r_8 tmin[3] = {9.e39,9.e39,9.e39};
448 r_8 tmax[3] = {-9.e39,-9.e39,-9.e39};
449 for(sa_size_t jj=0; jj<mArr->Size(); jj++) {
450 sa_size_t ix, iy, iz, it, iu;
451 mArr->IndexAtPosition(jj, ix, iy, iz, it, iu);
452 r_8 cv[3];
453 cv[0] = (*mArr)(ix,iy,iz,it,iu).real();
454 cv[1] = (*mArr)(ix,iy,iz,it,iu).imag();
455 cv[2] = sqrt(cv[0]*cv[0]+cv[1]*cv[1]);
456 for(int i=0; i<3; i++) {
457 if (cv[i] < tmin[i]) tmin[i] = cv[i];
458 if (cv[i] > tmax[i]) tmax[i] = cv[i];
459 }
460 }
461 if (k == 7) { min = tmin[0]; max = tmax[0]; }
462 else if (k == 8) { min = tmin[0]; max = tmax[0]; }
463 else { min = tmin[2]; max = tmax[2]; }
464 }
465 else { min = max = 0.; }
466 return;
467}
468
469#ifdef __CXX_PRAGMA_TEMPLATES__
470#pragma define_template NOMAdapter_TArray<uint_2>
471#pragma define_template NOMAdapter_TArray<int_2>
472#pragma define_template NOMAdapter_TArray<int_4>
473#pragma define_template NOMAdapter_TArray<int_8>
474#pragma define_template NOMAdapter_TArray<r_4>
475#pragma define_template NOMAdapter_TArray<r_8>
476#pragma define_template NOMAdapter_TArray< complex<r_4> >
477#pragma define_template NOMAdapter_TArray< complex<r_8> >
478#pragma define_template NTupInt_TArray<uint_2>
479#pragma define_template NTupInt_TArray<int_2>
480#pragma define_template NTupInt_TArray<int_4>
481#pragma define_template NTupInt_TArray<int_8>
482#pragma define_template NTupInt_TArray<r_4>
483#pragma define_template NTupInt_TArray<r_8>
484#pragma define_template NTupInt_TArray< complex<r_4> >
485#pragma define_template NTupInt_TArray< complex<r_8> >
486#endif
487
488#if defined(ANSI_TEMPLATES)
489template class NOMAdapter_TArray<uint_2>;
490template class NOMAdapter_TArray<int_2>;
491template class NOMAdapter_TArray<int_4>;
492template class NOMAdapter_TArray<int_8>;
493template class NOMAdapter_TArray<r_4>;
494template class NOMAdapter_TArray<r_8>;
495template class NOMAdapter_TArray< complex<r_4> >;
496template class NOMAdapter_TArray< complex<r_8> >;
497template class NTupInt_TArray<uint_2>;
498template class NTupInt_TArray<int_2>;
499template class NTupInt_TArray<int_4>;
500template class NTupInt_TArray<int_8>;
501template class NTupInt_TArray<r_4>;
502template class NTupInt_TArray<r_8>;
503template class NTupInt_TArray< complex<r_4> >;
504template class NTupInt_TArray< complex<r_8> >;
505#endif
Note: See TracBrowser for help on using the repository browser.