source: XIOS/trunk/src/array_new.hpp @ 576

Last change on this file since 576 was 501, checked in by ymipsl, 9 years ago

Add licence copyright to all file ond directory src using the command :
svn propset -R copyright -F header_licence src

XIOS is now officialy under CeCILL licence

YM

  • Property copyright set to
    Software name : XIOS (Xml I/O Server)
    http://forge.ipsl.jussieu.fr/ioserver
    Creation date : January 2009
    Licence : CeCCIL version2
    see license file in root directory : Licence_CeCILL_V2-en.txt
    or http://www.cecill.info/licences/Licence_CeCILL_V2-en.html
    Holder : CEA/LSCE (Laboratoire des Sciences du CLimat et de l'Environnement)
    CNRS/IPSL (Institut Pierre Simon Laplace)
    Project Manager : Yann Meurdesoif
    yann.meurdesoif@cea.fr
File size: 12.1 KB
Line 
1#ifndef __XIOS_ARRAY_HPP__
2#define __XIOS_ARRAY_HPP__
3
4#define BZ_COLUMN_MAJOR_ARRAY
5#include <blitz/array.h>
6#include "buffer_in.hpp"
7#include "buffer_out.hpp"
8#include "message.hpp"
9#include <cmath>
10
11using namespace blitz ;
12BZ_DECLARE_FUNCTION(round)
13namespace xios
14{
15   
16template <typename T_numtype,int N_rank>
17class CArray : public Array<T_numtype,N_rank>, public virtual CBaseType
18{
19  public :
20  using Array<T_numtype,N_rank>::operator = ;
21  typedef typename Array<T_numtype,N_rank>::T_default_storage T_default_storage;
22 
23    template<typename T_expr> explicit CArray(_bz_ArrayExpr<T_expr> expr) : Array<T_numtype,N_rank>(expr) {} 
24
25    CArray(GeneralArrayStorage<N_rank> storage=T_default_storage()) : Array<T_numtype,N_rank>(storage) {}
26
27    explicit CArray(int length0,GeneralArrayStorage<N_rank> storage=T_default_storage() ) : Array<T_numtype,N_rank>(length0,storage ) {}
28
29    CArray(int length0, int length1, GeneralArrayStorage<N_rank> storage=T_default_storage() ) : Array<T_numtype,N_rank>(length0, length1, storage ) {}
30
31    CArray(int length0, int length1, int length2, GeneralArrayStorage<N_rank> storage=T_default_storage() ) : Array<T_numtype,N_rank>(length0, length1, length2, storage ) {}
32
33    CArray(int length0, int length1, int length2, int length3, GeneralArrayStorage<N_rank> storage=T_default_storage() )
34           : Array<T_numtype,N_rank>(length0, length1, length2, length3, storage ) {}
35   
36    CArray(int length0, int length1, int length2, int length3, int length4, GeneralArrayStorage<N_rank> storage=T_default_storage() )
37           : Array<T_numtype,N_rank>(length0,length1, length2, length3, length4, storage ) {}
38
39    CArray(int length0, int length1, int length2, int length3, int length4, int length5, GeneralArrayStorage<N_rank> storage=T_default_storage() )
40           : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, storage ) {}
41       
42    CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, GeneralArrayStorage<N_rank> storage=T_default_storage() )
43           : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, storage ) {}
44
45    CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6, int length7,
46           GeneralArrayStorage<N_rank> storage=T_default_storage() ) : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, length7, storage ) {}
47
48    CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6,
49           int length7, int length8, GeneralArrayStorage<N_rank> storage=T_default_storage() )
50           : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, length7, length8, storage ) {}
51
52    CArray(int length0, int length1, int length2, int length3, int length4,
53           int length5, int length6, int length7, int length8, int length9, GeneralArrayStorage<N_rank> storage=T_default_storage() )
54          : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, length7, length8, length9, storage ) {}
55         
56    CArray(int length0, int length1, int length2, int length3, int length4, int length5, int length6,
57           int length7, int length8, int length9, int length10, GeneralArrayStorage<N_rank> storage=T_default_storage() )
58           : Array<T_numtype,N_rank>(length0, length1, length2, length3, length4, length5, length6, length7, length8,
59                   length9, length10, storage ) {}
60           
61
62    CArray(T_numtype* restrict dataFirst, TinyVector<int, N_rank> shape, GeneralArrayStorage<N_rank> storage=T_default_storage() )
63          : Array<T_numtype,N_rank>(dataFirst, shape, storage ) {}
64
65    CArray(T_numtype* restrict dataFirst, TinyVector<int, N_rank> shape, TinyVector<diffType, N_rank> stride, 
66           GeneralArrayStorage<N_rank> storage=T_default_storage()) : Array<T_numtype,N_rank>(dataFirst, shape, stride, storage ) {}
67
68    CArray(T_numtype* restrict dataFirst, TinyVector<int, N_rank> shape, preexistingMemoryPolicy deletionPolicy,
69          GeneralArrayStorage<N_rank> storage=T_default_storage()) : Array<T_numtype,N_rank>(dataFirst, shape, deletionPolicy, storage) {}
70
71    CArray(T_numtype* restrict dataFirst, TinyVector<int, N_rank> shape, TinyVector<diffType, N_rank> stride,
72           preexistingMemoryPolicy deletionPolicy, GeneralArrayStorage<N_rank> storage=T_default_storage())
73          : Array<T_numtype,N_rank>(dataFirst, shape, stride, deletionPolicy, storage) {}
74
75    CArray(const TinyVector<int, N_rank>& extent, GeneralArrayStorage<N_rank> storage=T_default_storage())
76          : Array<T_numtype,N_rank>(extent, storage) {}
77
78    CArray(const TinyVector<int, N_rank>& lbounds, const TinyVector<int, N_rank>& extent,
79           const GeneralArrayStorage<N_rank>& storage ) : Array<T_numtype,N_rank>(lbounds, extent, storage ) {} 
80
81    CArray(Range r0, GeneralArrayStorage<N_rank> storage=T_default_storage() ) : CArray(r0, storage ) {}
82
83    CArray(Range r0, Range r1, GeneralArrayStorage<N_rank> storage=T_default_storage() ) : Array<T_numtype,N_rank>(r0, r1, storage ) {}
84
85    CArray(Range r0, Range r1, Range r2, GeneralArrayStorage<N_rank> storage=T_default_storage() ) 
86           : Array<T_numtype,N_rank>(r0, r1, r2, storage ) {}
87
88    CArray(Range r0, Range r1, Range r2, Range r3, GeneralArrayStorage<N_rank> storage=T_default_storage() )
89          : Array<T_numtype,N_rank>(r0, r1, r2, r3, storage ) {}
90
91    CArray(Range r0, Range r1, Range r2, Range r3, Range r4, GeneralArrayStorage<N_rank> storage=T_default_storage() )
92          : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, storage ) {}
93
94    CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, GeneralArrayStorage<N_rank> storage=T_default_storage() )
95          : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, storage ) {}
96
97    CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6,
98           GeneralArrayStorage<N_rank> storage=T_default_storage() ) : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, storage ) {}
99
100    CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7,
101           GeneralArrayStorage<N_rank> storage=T_default_storage() ) : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, r7, storage ) {}
102
103    CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5,
104           Range r6, Range r7, Range r8, GeneralArrayStorage<N_rank> storage=T_default_storage() )
105          : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, r7, r8, storage ) {}
106
107    CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5,
108           Range r6, Range r7, Range r8, Range r9, GeneralArrayStorage<N_rank> storage=T_default_storage() )
109          : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, storage ) {}
110
111    CArray(Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6, Range r7,
112           Range r8, Range r9, Range r10, GeneralArrayStorage<N_rank> storage=T_default_storage() )
113          : Array<T_numtype,N_rank>(r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, storage ) {} 
114
115    CArray(const Array<T_numtype, N_rank>& array) : Array<T_numtype,N_rank>(array) {}
116
117    CArray(const TinyVector<int,N_rank-1>& shape, int lastExtent, const GeneralArrayStorage<N_rank>& storage)
118          : Array<T_numtype,N_rank>(shape, lastExtent, storage) {}
119
120    CArray(Array<T_numtype, N_rank>& array, Range r0) : Array<T_numtype,N_rank>(array, r0) {}
121
122    CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1) : Array<T_numtype,N_rank>(array, r0, r1) {}
123
124    CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2) : Array<T_numtype,N_rank>( array, r0, r1, r2) {}
125
126    CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3) : Array<T_numtype,N_rank>(array, r0, r1, r2, r3) {}
127
128    CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2,
129           Range r3, Range r4) : Array<T_numtype,N_rank>(array, r0, r1, r2, r3,  r4) {}
130
131    CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2,
132           Range r3, Range r4, Range r5) : Array<T_numtype,N_rank>( array, r0, r1, r2, r3, r4, r5) {}
133
134    CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3, 
135           Range r4, Range r5, Range r6) : Array<T_numtype,N_rank>( array, r0, r1, r2, r3, r4, r5, r6) {}
136
137    CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3, Range r4,
138           Range r5, Range r6, Range r7) : Array<T_numtype,N_rank>(array, r0, r1, r2, r3, r4, r5, r6, r7) {}
139
140    CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5,
141           Range r6, Range r7, Range r8) : Array<T_numtype,N_rank>(array, r0, r1, r2, r3, r4, r5, r6, r7, r8) {}
142
143    CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5,
144           Range r6, Range r7, Range r8, Range r9) : Array<T_numtype,N_rank>(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9) {}
145
146    CArray(Array<T_numtype, N_rank>& array, Range r0, Range r1, Range r2, Range r3, Range r4, Range r5, Range r6,
147           Range r7, Range r8, Range r9, Range r10) : Array<T_numtype,N_rank>(array, r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10) {}
148
149    CArray(Array<T_numtype, N_rank>& array, const RectDomain<N_rank>& subdomain) : Array<T_numtype,N_rank>(array, subdomain) {}
150
151    CArray(Array<T_numtype, N_rank>& array, const StridedDomain<N_rank>& subdomain) : Array<T_numtype,N_rank>(array, subdomain) {} 
152
153    template<int N_rank2, typename R0, typename R1, typename R2, typename R3, typename R4, typename R5,
154                          typename R6, typename R7, typename R8, typename R9, typename R10>
155    CArray(Array<T_numtype,N_rank2>& array, R0 r0, R1 r1, R2 r2, R3 r3, R4 r4, R5 r5, R6 r6, R7 r7, R8 r8, R9 r9, R10 r10)
156          : Array<T_numtype,N_rank>(array, r0,r1, r2, r3, r4, r5, r6, r7, r8, r9, r10) {}
157
158    virtual ~CArray() {}
159    virtual void fromString(const string& str) { istringstream iss(str) ;  iss>>*this ; }
160    virtual string toString(void) const { ostringstream oss ; oss<<*this ; return oss.str() ; }
161    virtual void reset(void) { this->free(); }
162    virtual bool isEmpty(void) const { if (this->numElements()==0) return true; else return false; }
163    virtual size_t size(void) const { return (this->dimensions()+1)*sizeof(int)+sizeof(size_t) + this->numElements()*sizeof(T_numtype) ;}
164 
165    virtual CBaseType* clone(void) const { return new CArray(*this); }
166       
167    virtual bool toBuffer(CBufferOut& buffer) const
168    {
169      bool ret ;
170      ret=buffer.put(this->dimensions()) ;
171      ret&=buffer.put(this->shape().data(),this->dimensions()) ;
172      ret&=buffer.put(this->numElements()) ;
173      ret&=buffer.put(this->dataFirst(),this->numElements()) ;
174      return ret ;
175    }
176   
177   
178   virtual bool fromBuffer(CBufferIn& buffer)
179   {
180
181    bool ret ;
182    int numDim ;
183    TinyVector<int,N_rank> vect;
184    size_t ne;
185     
186    ret=buffer.get(numDim) ;
187    ret&=buffer.get(vect.data(),N_rank) ;
188    this->resize(vect) ;
189    ret&=buffer.get(ne) ;
190    ret&=buffer.get(this->dataFirst(),ne) ;
191     return ret ;
192  }
193
194} ;
195 
196  template <typename T_numtype,int N_rank> inline CBufferOut& operator<<(CBufferOut& buffer, const CArray<T_numtype,N_rank>& array)
197  {
198    if (!array.toBuffer(buffer)) ERROR(" template <typename T_numtype,int N_rank> inline CBufferOut& operator<<(CBufferOut& buffer, const CArray& array)",
199                                        << "Buffer remain size is to low for size type") ;
200    return buffer ;
201  }
202
203  template <typename T_numtype,int N_rank> inline CBufferIn& operator>>(CBufferIn& buffer, CArray<T_numtype, N_rank>& array)
204  {
205    if (!array.fromBuffer(buffer)) ERROR("template <typename T_numtype,int N_rank> inline CBufferIn& operator>>(CBufferIn& buffer, CArray& array)",
206                                        <<"Buffer remain size is to low for size type");
207    return buffer ;
208  }
209 
210  template <typename T_numtype,int N_rank> inline CMessage& operator<<(CMessage& msg, const CArray<T_numtype, N_rank>& array)
211  {
212    msg.push(array) ;
213    return msg ;
214  }
215
216  template <typename T_numtype,int N_rank> inline CMessage& operator<<(CMessage& msg, CArray<T_numtype, N_rank>& array)
217  {
218    msg.push(array) ;
219    return msg ;
220  }
221
222 
223}
224
225#endif
Note: See TracBrowser for help on using the repository browser.