source: Sophya/trunk/Cosmo/SimLSS/arrctcast.h@ 3115

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

Creation initiale du groupe Cosmo avec le repertoire SimLSS de
simulation de distribution de masse 3D des galaxies par CMV+Rz
18/12/2006

File size: 3.2 KB
Line 
1#ifndef ARRCTCAST_SEEN
2#define ARRCTCAST_SEEN
3
4#include "tarray.h"
5#include "sopnamsp.h"
6
7//-----------------------------------------------------------------------
8// Classe de Bridge et fonctions utilitaires pour permettre des
9// cast de type de donnees - sans conversion - pour des tableaux (TArray)
10// R. Ansari - Oct 2006
11//-----------------------------------------------------------------------
12
13//******************************************
14// Classe NDCBridge : Bridge sur NDataBlock, utile pour cast - sans conversion - de type
15
16template <class T>
17class NDCBridge : public Bridge {
18 public:
19 NDCBridge(NDataBlock< T > & db) : dbcs_(db) {
20 //DBG cout << "+++ NDCBridge() this= " << hex << (long int)this << dec << endl;
21 }
22 virtual ~NDCBridge() {
23 //DBG cout << "--- ~NDCBridge() this= " << hex << (long int)this << dec << endl;
24 }
25 protected:
26 NDataBlock< T > dbcs_;
27};
28
29//******************************************
30// Fonction de cast de type de conteny - sans conversion - de tableaux
31// pour tableau packe en memoire
32template <class T1, class T2>
33TArray< T2 > ArrayCast( TArray< T1 > & a, T2 ct, sa_size_t doff=0, sa_size_t dstep=1)
34{
35 NDCBridge< T1 > * db = new NDCBridge< T1 >(a.DataBlock());
36 // if (a.AvgStep() != 1)
37 if (a.IsPacked() == false)
38 throw ParmError("ArrayCast - Pb: Not a packed array");
39 float rs = (float)sizeof(T1)/(float)sizeof(T2);
40 //DBG cout << "--DBG-ArrayCast SizeOf T1= " << sizeof(T1)
41 //DBG << " T2= " << sizeof(T2) << " rs=T1/T2= " << rs << endl;
42
43 int_4 ndim = a.Rank();
44 sa_size_t sz[BASEARRAY_MAXNDIMS];
45 for(int_4 k=0; k<BASEARRAY_MAXNDIMS; k++) sz[k] = 0;
46 for(int_4 k=0; k<ndim; k++) sz[k] = a.Size(k);
47 // Pour gerer correctement les vecteurs colonnes
48 int kszsc = 0;
49 if ((sz[0] == 1) && (sz[1] > 1)) kszsc = 1;
50 if (dstep > 1)
51 sz[kszsc] = sz[kszsc]*sizeof(T1)/sizeof(T2)/dstep;
52 else
53 sz[kszsc] = sz[kszsc]*sizeof(T1)/sizeof(T2);
54 //DBG cout << " --DBG-ArrayCast SzX=" << a.SizeX()
55 // << " rs=" << rs << " dstep=" << dstep << " --> SzX=" << sz[0] << endl;
56
57 sa_size_t step = dstep;
58 sa_size_t off = doff;
59 TArray< T2 > ac(ndim, sz, (T2 *)(a.Data()), step, off, db);
60 ac.SetMemoryMapping(a.GetMemoryMapping());
61 ac.SetTemp(true);
62 return ac;
63}
64
65
66//******************************************
67// cast de contenu - sans conversion - tableau complex vers float
68template <class T>
69TArray<T> ArrCastC2R(TArray< complex<T> > & a)
70{
71 T x;
72 return ArrayCast(a, x);
73}
74
75//******************************************
76// cast de contenu - sans conversion - tableau float vers complex
77template <class T>
78TArray< complex<T> > ArrCastR2C(TArray< T > & a)
79{
80 complex<T> x;
81 // return ArrayCast< TArray< T > , complex<T> > (a, x);
82 return ArrayCast(a, x);
83}
84
85
86//******************************************
87// Acces a la partie reelle d'un tableau complex - en shared data
88template <class T>
89TArray<T> SDRealPart(TArray< complex<T> > & a)
90{
91 T x;
92 return ArrayCast(a, x, 0, 2);
93}
94
95//******************************************
96// Acces a la partie imaginaire d'un tableau complex - en shared data
97template <class T>
98TArray<T> SDImagPart(TArray< complex<T> > & a)
99{
100 T x;
101 return ArrayCast(a, x, 1, 2);
102}
103
104
105#endif
Note: See TracBrowser for help on using the repository browser.