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

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

Amelioration methode GetInfoString() pour les adaptateurs TMatrix, TArray et DataTable (acces au DVList Info() en particulier, et recuperation des lignes de DataTable), Reza 12/04/2007

File size: 13.4 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] == "info") { // Acces aux valeurs stockes ds le DVList Info()
97 if (opts.size() < 2) return string("");
98 else if (mArr->Info().HasKey(opts[1]) == false) return string("");
99 else return mArr->Info().GetS(opts[1]);
100 }
101 else return "TArray.Att: rank sizes size/nelts sum";
102 }
103}
104
105/* --Methode-- */
106template <class T>
107int NOMAdapter_TArray<T>::PerformOperation(vector<string>& opts)
108{
109 bool ok = false;
110 if ((mArr->Rank() >= 3) && (opts.size() >= 2)) {
111 int_4 ks = atoi(opts[1].c_str());
112 TMatrix<T> * slice = new TMatrix<T>;
113 char buff[40];
114 if (opts[0] == "slicexy") {
115 slice->Share(mArr->SubArray(Range::all(), Range::all(), Range(ks),
116 Range::first(), Range::first()) );
117 ok = true;
118 sprintf(buff,"slicexy_%ld",(long)ks);
119 cout << "PerformOperation(): Extracting SliceXY(" << ks << ") from array" << endl;
120 }
121 else if (opts[0] == "sliceyz") {
122 slice->Share(mArr->SubArray(Range(ks), Range::all(), Range::all(), Range::first(),
123 Range::first()).CompactAllDimensions() );
124 ok = true;
125 sprintf(buff,"sliceyz_%ld",(long)ks);
126 cout << "PerformOperation(): Extracting SliceYZ(" << ks << ") from array" << endl;
127 }
128 else if (opts[0] == "slicexz") {
129 slice->Share(mArr->SubArray(Range::all(), Range(ks), Range::all(), Range::first(),
130 Range::first()).CompactAllDimensions() );
131 ok = true;
132 sprintf(buff,"slicexz_%ld",(long)ks);
133 cout << "PerformOperation(): Extracting SliceYZ(" << ks << ") from array" << endl;
134 }
135 if (ok) {
136 string nslice;
137 if (opts.size() > 2) nslice = opts[2];
138 else nslice = buff;
139 NamedObjMgr omg;
140 omg.AddObj(slice, nslice, true);
141 return 0;
142 }
143 }
144
145 cout << "NOMAdapter_TArray<T>::PerformOperation(): Error operation/arguments !" << endl;
146 cout << "...Valid args: slicexy idxZ [slicename], sliceyz idxX [nm] slicexz idxY [nm]" << endl;
147 return 1;
148}
149
150/* --Methode-- */
151template <class T>
152void NOMAdapter_TArray<T>::SavePPF(POutPersist& pos, string const & nom)
153{
154FIO_TArray<T> fio(mArr);
155fio.Write(pos, nom);
156}
157
158/* --Methode-- */
159template <class T>
160void NOMAdapter_TArray<T>::Print(ostream& os, int lev)
161{
162if (lev < 3) mArr->Show(os, false);
163else mArr->Show(os, true);
164if (lev > 0) mArr->Print(os, 10*lev);
165}
166
167/* --Methode-- */
168template <class T>
169PIDrawer * NOMAdapter_TArray<T>::GetDrawer(string & dopt)
170{
171if (mArr->NbDimensions() == 1) {
172 // On peut en faire un vecteur ...
173 TVector<T>* v = new TVector<T>(*mArr, true); // on partage les donnees
174 dopt = "thinline," + dopt;
175 return( new PIYfXDrawer( new POTVectorAdapter<T>(v, true), NULL, true) );
176}
177 else return(NULL);
178}
179
180/* --Methode-- */
181template <class T>
182P2DArrayAdapter* NOMAdapter_TArray<T>::Get2DArray(string &)
183{
184if (mArr->NbDimensions() <= 2) {
185 // On peut en faire un tableau 2-D ...
186 TMatrix<T>* m = new TMatrix<T>(*mArr, true); // on partage les donnees
187 return ( new POTMatrixAdapter<T>(m, true) );
188}
189else return(NULL);
190}
191
192/* --Methode-- */
193template <class T>
194NTupleInterface* NOMAdapter_TArray<T>::GetNTupleInterface(bool& adel)
195{
196adel = true;
197return( new NTupInt_TArray<T>(mArr) );
198}
199
200
201
202
203// -------------------------------------------------------------
204
205/* --Methode-- */
206template <class T>
207NTupInt_TArray<T>::NTupInt_TArray(TArray<T>* a)
208{
209mArr = a;
210}
211
212/* --Methode-- */
213template <class T>
214NTupInt_TArray<T>::~NTupInt_TArray()
215{
216}
217
218/* --Methode-- */
219template <class T>
220sa_size_t NTupInt_TArray<T>::NbLines() const
221{
222return( mArr->Size() );
223}
224
225/* --Methode-- */
226template <class T>
227sa_size_t NTupInt_TArray<T>::NbColumns() const
228{
229return(11);
230}
231
232/* --Methode-- */
233template <class T>
234r_8 NTupInt_TArray<T>::GetCell(sa_size_t n, sa_size_t k) const
235{
236 if ((n < 0) || (n >= (int)(mArr->Size()) ) )
237 return 0.;
238 if ((k < 0) || (k > 10)) return 0.;
239 GetLineD(n);
240 return mRet[k];
241}
242
243/* --Methode-- */
244template <class T>
245sa_size_t NTupInt_TArray<T>::ColumnIndex(string const & nom) const
246{
247string vardec = "double n,x,y,z,t,u,val,real,imag,mod,phas; \n";
248 if (nom == "n") return 0;
249 else if (nom == "x") return 1;
250 else if (nom == "y") return 2;
251 else if (nom == "z") return 3;
252 else if (nom == "t") return 4;
253 else if (nom == "u") return 5;
254 else if (nom == "val") return 6;
255 else if (nom == "real") return 7;
256 else if (nom == "imag") return 8;
257 else if (nom == "mod") return 9;
258 else if (nom == "phase") return 10;
259 else return -1;
260}
261
262/* --Methode-- */
263template <class T>
264void NTupInt_TArray<T>::GetMinMax(sa_size_t k, double& min, double& max) const
265{
266 if (k == 0) {
267 min = 0.; max = (r_8)(mArr->Size()); }
268 else if (k == 1) {
269 min = 0.; max = (r_8)(mArr->SizeX()); }
270 else if (k == 2) {
271 min = 0.; max = (r_8)(mArr->SizeY()); }
272 else if (k == 3) {
273 min = 0.; max = (r_8)(mArr->SizeZ()); }
274 else if (k == 4) {
275 min = 0.; max = (r_8)(mArr->Size(3)); }
276 else if (k == 5) {
277 min = 0.; max = (r_8)(mArr->Size(4)); }
278 else if ((k == 6) || (k == 7) || (k == 9)) {
279 T tmin, tmax;
280 mArr->MinMax(tmin, tmax);
281 min = (r_8)(tmin);
282 max = (r_8)(tmax);
283 }
284 else { min = max = 0.; }
285 return;
286}
287
288/* --Methode-- */
289template <class T>
290r_8* NTupInt_TArray<T>::GetLineD(sa_size_t n) const
291{
292if ((n < 0) || (n >= (int)(mArr->Size()) ) ) {
293 mRet[0] = n;
294 for(int i=1; i<11; i++) mRet[i] = 0.;
295}
296else {
297 sa_size_t ix, iy, iz, it, iu;
298 mArr->IndexAtPosition(n, ix, iy, iz, it, iu);
299 mRet[0] = n; mRet[1] = ix; mRet[2] = iy;
300 mRet[3] = iz; mRet[4] = it; mRet[5] = iu;
301 mRet[6] = (*mArr)(ix,iy,iz,it,iu);
302 mRet[7] = mRet[6]; mRet[8] = 0.;
303 mRet[9] = mRet[6]; mRet[10] = 0.;
304 }
305return(mRet);
306}
307
308/* --Methode-- */
309template <class T>
310string NTupInt_TArray<T>::VarList_C(const char* nx) const
311{
312string nomx;
313if (nx) nomx = nx;
314else nomx = "_xh_";
315string vardec = "double n,x,y,z,t,u,val,real,imag,mod,phas; \n";
316vardec += "n = " + nomx + "[0]; x = " + nomx + "[1]; y = " + nomx + "[2]; \n";
317vardec += "z = " + nomx + "[3]; t = " + nomx + "[4]; u = " + nomx + "[5]; \n";
318vardec += "val = " + nomx + "[6]; \n";
319vardec += "real = " + nomx + "[7]; imag = " + nomx + "[8]; \n";
320vardec += "mod = " + nomx + "[9]; phas = " + nomx + "[10]; \n";
321return(vardec);
322}
323
324/* --Methode-- */
325DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
326r_8* NTupInt_TArray< complex<r_4> >::GetLineD(sa_size_t n) const
327{
328if ((n < 0) || (n >= (int)(mArr->Size()) ) ) {
329 mRet[0] = n;
330 for(int i=1; i<11; i++) mRet[i] = 0.;
331}
332else {
333 sa_size_t ix, iy, iz, it, iu;
334 mArr->IndexAtPosition(n, ix, iy, iz, it, iu);
335 mRet[0] = n; mRet[1] = ix; mRet[2] = iy;
336 mRet[3] = iz; mRet[4] = it; mRet[5] = iu;
337 mRet[7] = (*mArr)(ix,iy,iz,it,iu).real();
338 mRet[8] = (*mArr)(ix,iy,iz,it,iu).imag();
339 mRet[6] = mRet[9] = sqrt(mRet[7]*mRet[7]+mRet[8]*mRet[8]);
340 mRet[10] = atan2(mRet[8], mRet[7]);
341}
342return(mRet);
343}
344
345DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
346r_8* NTupInt_TArray< complex<r_8> >::GetLineD(sa_size_t n) const
347{
348if ((n < 0) || (n >= (int)(mArr->Size()) ) ) {
349 mRet[0] = n;
350 for(int i=1; i<11; i++) mRet[i] = 0.;
351}
352else {
353 sa_size_t ix, iy, iz, it, iu;
354 mArr->IndexAtPosition(n, ix, iy, iz, it, iu);
355 mRet[0] = n; mRet[1] = ix; mRet[2] = iy;
356 mRet[3] = iz; mRet[4] = it; mRet[5] = iu;
357 mRet[7] = (*mArr)(ix,iy,iz,it,iu).real();
358 mRet[8] = (*mArr)(ix,iy,iz,it,iu).imag();
359 mRet[6] = mRet[9] = sqrt(mRet[7]*mRet[7]+mRet[8]*mRet[8]);
360 mRet[10] = atan2(mRet[8], mRet[7]);
361}
362return(mRet);
363}
364
365DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
366void NTupInt_TArray< complex<r_4> >::GetMinMax(sa_size_t k, double& min, double& max) const
367{
368 if (k == 0) {
369 min = 0.; max = (r_8)(mArr->Size()); }
370 else if (k == 1) {
371 min = 0.; max = (r_8)(mArr->SizeX()); }
372 else if (k == 2) {
373 min = 0.; max = (r_8)(mArr->SizeY()); }
374 else if (k == 3) {
375 min = 0.; max = (r_8)(mArr->SizeZ()); }
376 else if (k == 4) {
377 min = 0.; max = (r_8)(mArr->Size(3)); }
378 else if (k == 5) {
379 min = 0.; max = (r_8)(mArr->Size(4)); }
380 else if ((k >= 6) || (k <= 9)) {
381 r_8 tmin[3] = {9.e39,9.e39,9.e39};
382 r_8 tmax[3] = {-9.e39,-9.e39,-9.e39};
383 for(sa_size_t jj=0; jj<mArr->Size(); jj++) {
384 sa_size_t ix, iy, iz, it, iu;
385 mArr->IndexAtPosition(jj, ix, iy, iz, it, iu);
386 r_8 cv[3];
387 cv[0] = (*mArr)(ix,iy,iz,it,iu).real();
388 cv[1] = (*mArr)(ix,iy,iz,it,iu).imag();
389 cv[2] = sqrt(cv[0]*cv[0]+cv[1]*cv[1]);
390 for(int i=0; i<3; i++) {
391 if (cv[i] < tmin[i]) tmin[i] = cv[i];
392 if (cv[i] > tmax[i]) tmax[i] = cv[i];
393 }
394 }
395 if (k == 7) { min = tmin[0]; max = tmax[0]; }
396 else if (k == 8) { min = tmin[0]; max = tmax[0]; }
397 else { min = tmin[2]; max = tmax[2]; }
398 }
399 else { min = max = 0.; }
400 return;
401}
402DECL_TEMP_SPEC /* equivalent a template <> , pour SGI-CC en particulier */
403void NTupInt_TArray< complex<r_8> >::GetMinMax(sa_size_t k, double& min, double& max) const
404{
405 if (k == 0) {
406 min = 0.; max = (r_8)(mArr->Size()); }
407 else if (k == 1) {
408 min = 0.; max = (r_8)(mArr->SizeX()); }
409 else if (k == 2) {
410 min = 0.; max = (r_8)(mArr->SizeY()); }
411 else if (k == 3) {
412 min = 0.; max = (r_8)(mArr->SizeZ()); }
413 else if (k == 4) {
414 min = 0.; max = (r_8)(mArr->Size(3)); }
415 else if (k == 5) {
416 min = 0.; max = (r_8)(mArr->Size(4)); }
417 else if ((k >= 6) || (k <= 9)) {
418 r_8 tmin[3] = {9.e39,9.e39,9.e39};
419 r_8 tmax[3] = {-9.e39,-9.e39,-9.e39};
420 for(sa_size_t jj=0; jj<mArr->Size(); jj++) {
421 sa_size_t ix, iy, iz, it, iu;
422 mArr->IndexAtPosition(jj, ix, iy, iz, it, iu);
423 r_8 cv[3];
424 cv[0] = (*mArr)(ix,iy,iz,it,iu).real();
425 cv[1] = (*mArr)(ix,iy,iz,it,iu).imag();
426 cv[2] = sqrt(cv[0]*cv[0]+cv[1]*cv[1]);
427 for(int i=0; i<3; i++) {
428 if (cv[i] < tmin[i]) tmin[i] = cv[i];
429 if (cv[i] > tmax[i]) tmax[i] = cv[i];
430 }
431 }
432 if (k == 7) { min = tmin[0]; max = tmax[0]; }
433 else if (k == 8) { min = tmin[0]; max = tmax[0]; }
434 else { min = tmin[2]; max = tmax[2]; }
435 }
436 else { min = max = 0.; }
437 return;
438}
439
440#ifdef __CXX_PRAGMA_TEMPLATES__
441#pragma define_template NOMAdapter_TArray<uint_2>
442#pragma define_template NOMAdapter_TArray<int_2>
443#pragma define_template NOMAdapter_TArray<int_4>
444#pragma define_template NOMAdapter_TArray<int_8>
445#pragma define_template NOMAdapter_TArray<r_4>
446#pragma define_template NOMAdapter_TArray<r_8>
447#pragma define_template NOMAdapter_TArray< complex<r_4> >
448#pragma define_template NOMAdapter_TArray< complex<r_8> >
449#pragma define_template NTupInt_TArray<uint_2>
450#pragma define_template NTupInt_TArray<int_2>
451#pragma define_template NTupInt_TArray<int_4>
452#pragma define_template NTupInt_TArray<int_8>
453#pragma define_template NTupInt_TArray<r_4>
454#pragma define_template NTupInt_TArray<r_8>
455#pragma define_template NTupInt_TArray< complex<r_4> >
456#pragma define_template NTupInt_TArray< complex<r_8> >
457#endif
458
459#if defined(ANSI_TEMPLATES)
460template class NOMAdapter_TArray<uint_2>;
461template class NOMAdapter_TArray<int_2>;
462template class NOMAdapter_TArray<int_4>;
463template class NOMAdapter_TArray<int_8>;
464template class NOMAdapter_TArray<r_4>;
465template class NOMAdapter_TArray<r_8>;
466template class NOMAdapter_TArray< complex<r_4> >;
467template class NOMAdapter_TArray< complex<r_8> >;
468template class NTupInt_TArray<uint_2>;
469template class NTupInt_TArray<int_2>;
470template class NTupInt_TArray<int_4>;
471template class NTupInt_TArray<int_8>;
472template class NTupInt_TArray<r_4>;
473template class NTupInt_TArray<r_8>;
474template class NTupInt_TArray< complex<r_4> >;
475template class NTupInt_TArray< complex<r_8> >;
476#endif
Note: See TracBrowser for help on using the repository browser.