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

Last change on this file since 3141 was 3141, checked in by cmv, 19 years ago

chgt HProf->HistoErr + spectre 2D cmv 17/01/2007

File size: 3.2 KB
RevLine 
[3115]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{
[3141]71 T x = 0;
[3115]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{
[3141]80 complex<T> x = 0;
[3115]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{
[3141]91 T x = 0;
[3115]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{
[3141]100 T x = 0;
[3115]101 return ArrayCast(a, x, 1, 2);
102}
103
104
105#endif
Note: See TracBrowser for help on using the repository browser.