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

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

extension de la classe NTupInt_TArray<T> pour adaptateur de TArray ds piapp, pour prise en compte future avec plot3dw , Reza 3/07/2006

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