source: Sophya/trunk/SophyaLib/TArray/basarr.cc@ 804

Last change on this file since 804 was 804, checked in by ansari, 25 years ago

Amelioation / debugging de la classe TArray<T> - TVector et TMatrix

heritent maintenant de TArray<T> - Classe RCMatrix rendu prive au fichier
sopemtx.cc - linfit.cc integre a sopemtx.cc

Reza 03/04/2000

File size: 8.3 KB
Line 
1// Base class for numerical arrays
2// R. Ansari, C.Magneville 03/2000
3
4#include "machdefs.h"
5#include <stdio.h>
6#include <stdlib.h>
7#include "pexceptions.h"
8#include "basarr.h"
9
10
11
12// Variables statiques globales
13char * BaseArray::ck_op_msg_[6] = {"???", "Size(int )", "IsPacked(int )",
14 "Stride(int )", "ElemCheckBound()", "operator()" };
15uint_4 BaseArray::max_nprt_ = 50;
16short BaseArray::default_memory_mapping = CMemoryMapping;
17
18// Methodes statiques globales
19void BaseArray::SetMaxPrint(uint_4 nprt)
20{
21 max_nprt_ = nprt;
22}
23
24
25uint_8 BaseArray::ComputeTotalSize(uint_4 ndim, const uint_4 * siz, uint_4 step, uint_8 offset)
26{
27 uint_8 rs = step;
28 for(int k=0; k<ndim; k++) rs *= siz[k];
29 return(rs+offset);
30}
31
32short BaseArray::SetDefaultMemoryMapping(short mm)
33{
34 default_memory_mapping = ( (mm == CMemoryMapping) ? CMemoryMapping : FortranMemoryMapping) ;
35 return default_memory_mapping;
36}
37
38
39short BaseArray::SelectMemoryMapping(short mm)
40// si mm == CMemoryMapping, elements d'une ligne suivant X (consecutif)
41// sinon (mm == FortranMemoryMapping) elements d'une colonne suivant X
42{
43 if ( (mm == CMemoryMapping) || (mm == FortranMemoryMapping) ) return (mm) ;
44 else return (default_memory_mapping);
45}
46
47void BaseArray::UpdateMemoryMapping(short mm, uint_4 & nx, uint_4 & ny)
48{
49 if ( (mm != CMemoryMapping) && (mm != FortranMemoryMapping) ) mm = default_memory_mapping;
50 if (mm == CMemoryMapping) {
51 marowi_ = veceli_ = 1; macoli_ = 0;
52 uint_4 nr = nx;
53 nx = ny; ny = nr;
54 }
55 else {
56 marowi_ = veceli_ = 0; macoli_ = 1;
57 }
58}
59
60void BaseArray::UpdateMemoryMapping(BaseArray const & a, short mm)
61{
62 if (mm == SameMemoryMapping)
63 mm = ((a.marowi_ == 1) ? CMemoryMapping : FortranMemoryMapping);
64 if ( (mm != CMemoryMapping) && (mm != FortranMemoryMapping) ) mm = default_memory_mapping;
65 if (mm == CMemoryMapping) {
66 marowi_ = veceli_ = 1; macoli_ = 0;
67 }
68 else {
69 marowi_ = veceli_ = 0; macoli_ = 1;
70 }
71}
72
73
74// -------------------------------------------------------
75// Methodes de la classe
76// -------------------------------------------------------
77
78// Les constructeurs
79BaseArray::BaseArray()
80 : mInfo(NULL)
81// Default constructor
82{
83 ndim_ = 0;
84 for(int k=0; k<BASEARRAY_MAXNDIMS; k++) step_[k] = size_[k] = 0;
85 totsize_ = 0;
86 minstep_ = 0;
87 moystep_ = 0;
88 offset_ = 0;
89 // Default for matrices : Lines = Y , Columns = X, Default Vectore= ColumnVector
90 macoli_ = 0;
91 veceli_ = marowi_ = 1;
92}
93
94// Destructeur
95BaseArray::~BaseArray()
96{
97}
98
99
100bool BaseArray::CompareSizes(const BaseArray& a)
101{
102 if (ndim_ != a.ndim_) return(false);
103 for(int k=0; k<ndim_; k++)
104 if (size_[k] != a.size_[k]) return(false);
105 if ( (macoli_ != a.macoli_) || (marowi_ != a.marowi_) ||
106 (veceli_ != a.veceli_) ) return(false);
107 return(true);
108}
109
110void BaseArray::CompactAllDim()
111{
112 if (ndim_ < 2) return;
113 uint_4 ndim = 0;
114 uint_4 size[BASEARRAY_MAXNDIMS];
115 uint_4 step[BASEARRAY_MAXNDIMS];
116 for(int k=0; k<ndim_; k++) {
117 if (size_[k] < 2) continue;
118 size[ndim] = size_[k];
119 step[ndim] = step_[k];
120 ndim++;
121 }
122 if (ndim == 0) {
123 size[0] = size_[0];
124 step[0] = step_[0];
125 ndim = 1;
126 }
127 string exmsg = "BaseArray::CompactAllDim() ";
128 if (!UpdateSizes(ndim, size, step, offset_, exmsg)) throw( ParmError(exmsg) );
129 return;
130}
131
132void BaseArray::CompactTrailingDim()
133{
134 if (ndim_ < 2) return;
135 uint_4 ndim = 0;
136 uint_4 size[BASEARRAY_MAXNDIMS];
137 uint_4 step[BASEARRAY_MAXNDIMS];
138 for(int k=0; k<ndim_; k++) {
139 size[ndim] = size_[k];
140 step[ndim] = step_[k];
141 if (size_[k] > 1) ndim=k;
142 }
143 if (ndim == 0) ndim = 1;
144 string exmsg = "BaseArray::CompactTrailingDim() ";
145 if (!UpdateSizes(ndim, size, step, offset_, exmsg)) throw( ParmError(exmsg) );
146 return;
147}
148
149
150uint_4 BaseArray::MinStepKA() const
151{
152 for(int ka=0; ka<ndim_; ka++)
153 if (step_[ka] == minstep_) return(ka);
154 return(0);
155}
156
157uint_4 BaseArray::MaxSizeKA() const
158{
159 uint_4 ka = 0;
160 uint_4 mx = size_[0];
161 for(int k=0; k<ndim_; k++)
162 if (size_[k] > mx) { ka = k; mx = size_[k]; }
163 return(ka);
164}
165
166
167// Acces lineaire aux elements .... Calcul d'offset
168
169uint_8 BaseArray::Offset(uint_8 ip) const
170{
171if (ip == 0) return(offset_);
172uint_4 idx[BASEARRAY_MAXNDIMS];
173int k;
174uint_8 rest = ip;
175for(k=0; k<ndim_; k++) { idx[k] = rest%size_[k]; rest /= size_[k]; }
176uint_8 off = offset_;
177for(k=0; k<ndim_; k++) off += idx[k]*step_[k];
178return (off);
179}
180
181
182// ----------------------------------------------------
183// Impression, etc ...
184// ----------------------------------------------------
185
186void BaseArray::Show(ostream& os, bool si) const
187{
188 os << " TArray< " << DataType() << " > NDim= " << ndim_
189 << "(" << typeid(*this).name() << " )" << endl;
190 os << "TotSize=" << totsize_ << " Size(X*Y*...)= " ;
191 for(int k=0; k<ndim_; k++) {
192 os << size_[k];
193 if (k<ndim_-1) os << " x ";
194 }
195 os << endl;
196 os << " Step(X Y ...)= " ;
197 for(int k=0; k<ndim_; k++) os << step_[k] << " " ;
198 os << " Offset= " << offset_ << "\n " << endl;
199 if (si && (mInfo != NULL)) os << (*mInfo) << endl;
200
201}
202
203
204DVList& BaseArray::Info()
205{
206if (mInfo == NULL) mInfo = new DVList;
207return(*mInfo);
208}
209
210
211bool BaseArray::UpdateSizes(uint_4 ndim, const uint_4 * siz, uint_4 step, uint_8 offset, string & exmsg)
212{
213 if (ndim >= BASEARRAY_MAXNDIMS) {
214 exmsg += " NDim Error"; return false;
215 }
216 if (step < 1) {
217 exmsg += " Step(=0) Error"; return false;
218 }
219
220 minstep_ = moystep_ = step;
221
222 // Flagging bad updates ...
223 ndim_ = 0;
224
225 totsize_ = 1;
226 int k;
227 for(k=0; k<BASEARRAY_MAXNDIMS; k++) {
228 size_[k] = 1;
229 step_[k] = 0;
230 }
231 for(k=0; k<ndim; k++) {
232 size_[k] = siz[k] ;
233 step_[k] = totsize_*step;
234 totsize_ *= size_[k];
235 }
236 if (totsize_ < 1) {
237 exmsg += " Size Error"; return false;
238 }
239 offset_ = offset;
240 // Default for matrices : Lines = Y , Columns = X
241 macoli_ = 0;
242 marowi_ = veceli_ = 1;
243 // Update OK
244 ndim_ = ndim;
245 return true;
246}
247
248bool BaseArray::UpdateSizes(uint_4 ndim, const uint_4 * siz, const uint_4 * step, uint_8 offset, string & exmsg)
249{
250 if (ndim >= BASEARRAY_MAXNDIMS) {
251 exmsg += " NDim Error"; return false;
252 }
253
254 // Flagging bad updates ...
255 ndim_ = 0;
256
257 totsize_ = 1;
258 int k;
259 for(k=0; k<BASEARRAY_MAXNDIMS; k++) {
260 size_[k] = 1;
261 step_[k] = 0;
262 }
263 uint_4 minstep = step[0];
264 for(k=0; k<ndim; k++) {
265 size_[k] = siz[k] ;
266 step_[k] = step[k];
267 totsize_ *= size_[k];
268 if (step_[k] < minstep) minstep = step_[k];
269 }
270 if (minstep < 1) {
271 exmsg += " Step(=0) Error"; return false;
272 }
273 if (totsize_ < 1) {
274 exmsg += " Size Error"; return false;
275 }
276 uint_8 plast = 0;
277 for(k=0; k<ndim; k++) plast += (siz[k]-1)*step[k];
278 if (plast == minstep*totsize_ ) moystep_ = minstep;
279 else moystep_ = 0;
280 minstep_ = minstep;
281 offset_ = offset;
282 // Default for matrices : Lines = Y , Columns = X
283 macoli_ = 0;
284 marowi_ = veceli_ = 1;
285 // Update OK
286 ndim_ = ndim;
287 return true;
288}
289
290bool BaseArray::UpdateSizes(const BaseArray& a, string & exmsg)
291{
292 if (a.ndim_ >= BASEARRAY_MAXNDIMS) {
293 exmsg += " NDim Error"; return false;
294 }
295
296 // Flagging bad updates ...
297 ndim_ = 0;
298
299 totsize_ = 1;
300 int k;
301 for(k=0; k<BASEARRAY_MAXNDIMS; k++) {
302 size_[k] = 1;
303 step_[k] = 0;
304 }
305 uint_4 minstep = a.step_[0];
306 for(k=0; k<a.ndim_; k++) {
307 size_[k] = a.size_[k] ;
308 step_[k] = a.step_[k];
309 totsize_ *= size_[k];
310 if (step_[k] < minstep) minstep = step_[k];
311 }
312 if (minstep < 1) {
313 exmsg += " Step(=0) Error"; return false;
314 }
315 if (totsize_ < 1) {
316 exmsg += " Size Error"; return false;
317 }
318
319 minstep_ = a.minstep_;
320 moystep_ = a.moystep_;
321 offset_ = a.offset_;
322 macoli_ = a.macoli_;
323 marowi_ = a.marowi_;
324 veceli_ = a.veceli_;
325 // Update OK
326 ndim_ = a.ndim_;
327 return true;
328}
329
330
331void BaseArray::UpdateSubArraySizes(BaseArray & ra, uint_4 ndim, uint_4 * siz, uint_4 * pos, uint_4 * step) const
332{
333 if ( (ndim > ndim_) || (ndim < 1) )
334 throw(SzMismatchError("BaseArray::UpdateSubArraySizes( ... ) NDim Error") );
335 int k;
336 for(k=0; k<ndim; k++)
337 if ( (siz[k]*step[k]+pos[k]) > size_[k] )
338 throw(SzMismatchError("BaseArray::UpdateSubArraySizes( ... ) Size/Pos Error") );
339 uint_8 offset = offset_;
340 for(k=0; k<ndim_; k++) {
341 offset += pos[k]*step_[k];
342 step[k] *= step_[k];
343 }
344 string exm = "BaseArray::UpdateSubArraySizes() ";
345 if (!ra.UpdateSizes(ndim, siz, step, offset, exm))
346 throw( ParmError(exm) );
347 return;
348}
349
350
Note: See TracBrowser for help on using the repository browser.