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

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

Protection integrite TMatrix,TVector - operateur = (BaseArray & pour TVector et operations entre matrices avec <> MemMapping (Pas termine) Reza 27/6/2000

File size: 19.2 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 \class SOPHYA::BaseArray
12 \ingroup TArray
13 Base class for template arrays
14 No data are connected to this class.
15
16 Define base methods, enum and defaults for TArray , TMatrix and TVector.
17*/
18
19// Variables statiques globales
20char * BaseArray::ck_op_msg_[6] =
21 {"???", "Size(int )", "IsPacked(int )"
22 ,"Stride(int )", "ElemCheckBound()", "operator()" };
23uint_4 BaseArray::max_nprt_ = 50;
24uint_4 BaseArray::prt_lev_ = 0;
25short BaseArray::default_memory_mapping = CMemoryMapping;
26short BaseArray::default_vector_type = ColumnVector;
27uint_8 BaseArray::openmp_size_threshold = 200000;
28
29// ------ Methodes statiques globales --------
30
31//! Set maximum number of printed elements and print level
32/*!
33 \param nprt : maximum number of print
34 \param lev : print level
35*/
36void BaseArray::SetMaxPrint(uint_4 nprt, uint_4 lev)
37{
38 max_nprt_ = nprt;
39 prt_lev_ = (lev < 3) ? lev : 3;
40}
41
42//! Set Size threshold for parallel routine call
43/*!
44 \param thr : thresold value
45*/
46void BaseArray::SetOpenMPSizeThreshold(uint_8 thr)
47{
48 openmp_size_threshold = thr;
49}
50
51
52//! Compute totale size
53/*!
54 \param ndim : number of dimensions
55 \param siz : array of size along the \b ndim dimensions
56 \param step[ndim] : step value
57 \param offset : offset value
58 \return Total size of the array
59*/
60uint_8 BaseArray::ComputeTotalSize(uint_4 ndim, const uint_4 * siz, uint_4 step, uint_8 offset)
61{
62 uint_8 rs = step;
63 for(uint_4 k=0; k<ndim; k++) rs *= siz[k];
64 return(rs+offset);
65}
66
67//! Set Default Memory Mapping
68/*!
69 \param mm : Memory Mapping type
70 \verbatim
71 mm == CMemoryMapping : C like memory mapping
72 mm == FortranMemoryMapping : Fortran like memory mapping
73 \endverbatim
74 \verbatim
75 # ===== For Matrices
76 *** MATHEMATICS: m(row,column) with indexes running [1,n])
77 | 11 12 13 |
78 matrix Math = Mmath= | 21 22 23 |
79 | 31 32 33 |
80 *** IDL, \b FORTRAN: indexes data in \b row-major format:
81 indexes arrays in (column,row) order.
82 index IDL running [0,n[ ; index FORTRAN running [1,n]
83 M in memory: [ 11 12 13 : 21 22 23 : 31 32 33 : ... ]
84 line 1 : line 2 : line 3 : ...
85 ex: Midl(0,2) = Mfor(1,3) = Mmath(3,1) = 31
86 Midl(2,0) = Mfor(3,1) = Mmath(1,3) = 13
87 *** C: indexes data in \b column-major format:
88 indexes arrays in [row][column] order.
89 index C running [0,n[
90 M in memory: [ 11 21 31 : 12 22 32 : 13 23 33 : ... ]
91 column 1 : column 2 : column 3 : ...
92 ex: Mc[2][0] = Mmath(3,1) = 31
93 Mc[0][2] = Mmath(1,3) = 13
94 *** RESUME diff Idl/Fortan/C/Math:
95 Midl(col-1,row-1) = Mfor(col,row) = Mc[row-1][col-1] = Mmath(row,col)
96 TRANSPOSE(column-major array) --> row-major array
97 \endverbatim
98 \return default memory mapping value
99 */
100short BaseArray::SetDefaultMemoryMapping(short mm)
101{
102 default_memory_mapping = (mm != CMemoryMapping) ? FortranMemoryMapping : CMemoryMapping;
103 return default_memory_mapping;
104}
105
106//! Set Default Vector Type
107/*!
108 \param vt : vector type (ColumnVector,RowVector)
109 \return default vector type value
110 */
111short BaseArray::SetDefaultVectorType(short vt)
112{
113 default_vector_type = (vt != ColumnVector) ? RowVector : ColumnVector ;
114 return default_vector_type;
115}
116
117//! Select Memory Mapping
118/*!
119 Do essentially nothing.
120 \param mm : type of Memory Mapping (CMemoryMapping,FortranMemoryMapping)
121 \return return \b mm if it makes sense or default memory mapping value
122 \sa SetDefaultMemoryMapping
123 */
124short BaseArray::SelectMemoryMapping(short mm)
125{
126 if ( (mm == CMemoryMapping) || (mm == FortranMemoryMapping) ) return (mm) ;
127 else return (default_memory_mapping);
128}
129
130//! Select Vector type
131/*!
132 Do essentially nothing.
133 \param vt : vector type (ColumnVector,RowVector)
134 \return return \b vt if it makes sense or default vector type
135 \sa SetDefaultVectorType
136 */
137short BaseArray::SelectVectorType(short vt)
138{
139 if ((vt == ColumnVector) || (vt == RowVector)) return(vt);
140 else return(default_vector_type);
141}
142
143//! Update Memory Mapping
144/*!
145 Update variables marowi_ macoli_ veceli_
146 \param mm : type of Memory Mapping (CMemoryMapping,FortranMemoryMapping)
147 \sa SetDefaultMemoryMapping
148 */
149void BaseArray::UpdateMemoryMapping(short mm)
150{
151 short vt = default_vector_type;
152 if ( (mm != CMemoryMapping) && (mm != FortranMemoryMapping) ) mm = default_memory_mapping;
153 if (mm == CMemoryMapping) {
154 marowi_ = 1; macoli_ = 0;
155 }
156 else {
157 marowi_ = 0; macoli_ = 1;
158 }
159
160 if ( (ndim_ == 2) && ((size_[0] == 1) || (size_[1] == 1)) ) {
161 // Choix automatique Vecteur ligne ou colonne
162 if ( size_[macoli_] == 1) veceli_ = marowi_;
163 else veceli_ = macoli_;
164 }
165 else veceli_ = (vt == ColumnVector ) ? marowi_ : macoli_;
166}
167
168//! Update Memory Mapping
169/*!
170 \param a : Array to be compared with
171 \param mm : type of Memory Mapping or memory mapping transfert
172 (SameMemoryMapping,AutoMemoryMapping,CMemoryMapping,FortranMemoryMapping)
173 \sa SetDefaultMemoryMapping
174 */
175void BaseArray::UpdateMemoryMapping(BaseArray const & a, short mm)
176{
177 short vt = default_vector_type;
178 if (mm == SameMemoryMapping) {
179 mm = ((a.marowi_ == 1) ? CMemoryMapping : FortranMemoryMapping);
180 vt = (a.marowi_ == a.veceli_) ? ColumnVector : RowVector;
181 }
182 else if (mm == AutoMemoryMapping) mm = default_memory_mapping;
183
184 if ( (mm != CMemoryMapping) && (mm != FortranMemoryMapping) ) mm = default_memory_mapping;
185 if (mm == CMemoryMapping) {
186 marowi_ = 1; macoli_ = 0;
187 }
188 else {
189 marowi_ = 0; macoli_ = 1;
190 }
191 if ( (ndim_ == 2) && ((size_[0] == 1) || (size_[1] == 1)) ) {
192 // Choix automatique Vecteur ligne ou colonne
193 if ( size_[macoli_] == 1) veceli_ = marowi_;
194 else veceli_ = marowi_;
195 }
196 else veceli_ = (vt == ColumnVector ) ? marowi_ : macoli_;
197}
198
199//! Set Memory Mapping type
200/*!
201 Compute values for variables marowi_ macoli_ veceli_
202 \param mm : Memory Mapping type (SameMemoryMapping,AutoMemoryMapping
203 ,CMemoryMapping,FortranMemoryMapping)
204 \sa SetDefaultMemoryMapping
205 */
206void BaseArray::SetMemoryMapping(short mm)
207{
208 if (mm == SameMemoryMapping) return;
209 if (mm == AutoMemoryMapping) mm = default_memory_mapping;
210 if ( (mm != CMemoryMapping) && (mm != FortranMemoryMapping) ) return;
211 short vt = (marowi_ == veceli_) ? ColumnVector : RowVector;
212 if (mm == CMemoryMapping) {
213 marowi_ = 1; macoli_ = 0;
214 }
215 else {
216 marowi_ = 0; macoli_ = 1;
217 }
218 if ( (ndim_ == 2) && ((size_[0] == 1) || (size_[1] == 1)) ) {
219 // Choix automatique Vecteur ligne ou colonne
220 if ( size_[macoli_] == 1) veceli_ = marowi_;
221 else veceli_ = macoli_;
222 }
223 else veceli_ = (vt == ColumnVector ) ? marowi_ : macoli_;
224}
225
226//! Set Vector Type
227/*!
228 Compute values for variable veceli_
229 \param vt : vector type ()
230 \sa SetDefaultVectorType
231 */
232void BaseArray::SetVectorType(short vt)
233{
234 if (vt == SameVectorType) return;
235 if (vt == AutoVectorType) vt = default_vector_type;
236 if ( (ndim_ == 2) && ((size_[0] == 1) || (size_[1] == 1)) ) {
237 // Choix automatique Vecteur ligne ou colonne
238 if ( size_[macoli_] == 1) veceli_ = marowi_;
239 else veceli_ = macoli_;
240 }
241 else veceli_ = (vt == ColumnVector ) ? marowi_ : macoli_;
242}
243
244// -------------------------------------------------------
245// Methodes de la classe
246// -------------------------------------------------------
247
248//! Default constructor
249BaseArray::BaseArray()
250 : mInfo(NULL)
251{
252 ndim_ = 0;
253 for(int k=0; k<BASEARRAY_MAXNDIMS; k++) step_[k] = size_[k] = 0;
254 totsize_ = 0;
255 minstep_ = 0;
256 moystep_ = 0;
257 offset_ = 0;
258 // Default for matrices : Memory organisation and Vector type
259 if (default_memory_mapping == CMemoryMapping) {
260 marowi_ = 1; macoli_ = 0;
261 }
262 else {
263 marowi_ = 0; macoli_ = 1;
264 }
265 veceli_ = (default_vector_type == ColumnVector ) ? marowi_ : macoli_;
266 arrtype_ = 0; // Default Array type, not a Matrix or Vector
267
268}
269
270//! Destructor
271BaseArray::~BaseArray()
272{
273}
274
275
276//! Returns true if the two arrays have compatible dimensions.
277/*!
278 \param a : array to be compared
279 \param smo : Return flag = true if the two arrays have the same memory organisation
280 \return true if \c NbDimensions() and \c Size() are equal, false if not
281
282 If the array (on which the operation is being performed, \c this)
283 is a \b Matrix or a \b Vector, the matrix dimensions \c NRows() \c NCols()
284 are checked. The flag \c smo is returned true if the two arrays, viewed
285 as a matrix have the same memory organisation.
286 Otherwise, (if the array is of not a Matrix or a Vector)
287 the size compatibility viewed as a TArray is checked <tt>
288 (Size(k) == a.Size(k), k=0,...NbDimensions()), </tt> disregard of the memory
289 organisation and the row and column index. The flag \c smo is returned true
290 in this case.
291*/
292bool BaseArray::CompareSizes(const BaseArray& a, bool& smo)
293{
294 if (ndim_ != a.ndim_) return(false);
295 if (arrtype_ == 0) { // Simple TArray, not a matrix
296 smo = true;
297 for(uint_4 k=0; k<ndim_; k++)
298 if (size_[k] != a.size_[k]) return(false);
299 return(true);
300 }
301 else {
302 smo = false;
303 if ( (size_[marowi_] != a.size_[marowi_]) ||
304 (size_[macoli_] != a.size_[macoli_]) ) return(false);
305 if ( (macoli_ == a.macoli_) && (marowi_ == a.marowi_) ||
306 (veceli_ == a.veceli_) ) smo = true;
307 return(true);
308 }
309}
310
311//! Change dimension if some size == 1
312void BaseArray::CompactAllDim()
313{
314 if (ndim_ < 2) return;
315 uint_4 ndim = 0;
316 uint_4 size[BASEARRAY_MAXNDIMS];
317 uint_4 step[BASEARRAY_MAXNDIMS];
318 for(uint_4 k=0; k<ndim_; k++) {
319 if (size_[k] < 2) continue;
320 size[ndim] = size_[k];
321 step[ndim] = step_[k];
322 ndim++;
323 }
324 if (ndim == 0) {
325 size[0] = size_[0];
326 step[0] = step_[0];
327 ndim = 1;
328 }
329 string exmsg = "BaseArray::CompactAllDim() ";
330 if (!UpdateSizes(ndim, size, step, offset_, exmsg)) throw( ParmError(exmsg) );
331 return;
332}
333
334//! Change dimension if some trailed size == 1
335void BaseArray::CompactTrailingDim()
336{
337 if (ndim_ < 2) return;
338 uint_4 ndim = 0;
339 uint_4 size[BASEARRAY_MAXNDIMS];
340 uint_4 step[BASEARRAY_MAXNDIMS];
341 for(uint_4 k=0; k<ndim_; k++) {
342 size[ndim] = size_[k];
343 step[ndim] = step_[k];
344 if (size_[k] > 1) ndim=k;
345 }
346 if (ndim == 0) ndim = 1;
347 string exmsg = "BaseArray::CompactTrailingDim() ";
348 if (!UpdateSizes(ndim, size, step, offset_, exmsg)) throw( ParmError(exmsg) );
349 return;
350}
351
352//! return minimum value for step[ndim]
353int BaseArray::MinStepKA() const
354{
355 for(int ka=0; ka<ndim_; ka++)
356 if (step_[ka] == minstep_) return(ka);
357 return(0);
358}
359
360//! return maximum value for step[ndim]
361int BaseArray::MaxSizeKA() const
362{
363 int ka = 0;
364 uint_4 mx = size_[0];
365 for(int k=0; k<ndim_; k++)
366 if (size_[k] > mx) { ka = k; mx = size_[k]; }
367 return(ka);
368}
369
370
371// Acces lineaire aux elements .... Calcul d'offset
372// --------------------------------------------------
373// Position de l'element 0 du vecteur i selon l'axe ka
374// --------------------------------------------------
375//! return position of first element for vector \b i alond \b ka th axe.
376uint_8 BaseArray::Offset(uint_4 ka, uint_8 i) const
377{
378
379 if ( (ndim_ < 1) || (i == 0) ) return(offset_);
380 //#ifdef SO_BOUNDCHECKING
381 if (ka >= ndim_)
382 throw RangeCheckError("BaseArray::Offset(uint_4 ka, uint_8 i) Axe KA Error");
383 if ( i*size_[ka] >= totsize_ )
384 throw RangeCheckError("BaseArray::Offset(uint_4 ka, uint_8 i) Index Error");
385 //#endif
386 uint_4 idx[BASEARRAY_MAXNDIMS];
387 uint_4 k;
388 uint_8 rest = i;
389 idx[ka] = 0;
390 for(k=0; k<ndim_; k++) {
391 if (k == ka) continue;
392 idx[k] = rest%size_[k]; rest /= size_[k];
393 }
394 uint_8 off = offset_;
395 for(k=0; k<ndim_; k++) off += idx[k]*step_[k];
396 return (off);
397}
398
399//! return position of element \b ip.
400uint_8 BaseArray::Offset(uint_8 ip) const
401{
402 if ( (ndim_ < 1) || (ip == 0) ) return(offset_);
403 //#ifdef SO_BOUNDCHECKING
404 if (ip >= totsize_)
405 throw RangeCheckError("BaseArray::Offset(uint_8 ip) Out of range index ip");
406 //#endif
407
408 uint_4 idx[BASEARRAY_MAXNDIMS];
409 uint_4 k;
410 uint_8 rest = ip;
411 for(k=0; k<ndim_; k++) {
412 idx[k] = rest%size_[k]; rest /= size_[k];
413 }
414 //#ifdef SO_BOUNDCHECKING
415 if (rest != 0)
416 throw PError("BaseArray::Offset(uint_8 ip) GUG !!! rest != 0");
417 //#endif
418// if (rest != 0) cerr << " BUG ---- BaseArray::Offset( " << ip << " )" << rest << endl;
419// cerr << " DBG-Offset( " << ip << ")" ;
420// for(k=0; k<ndim_; k++) cerr << idx[k] << "," ;
421// cerr << " ZZZZ " << endl;
422 uint_8 off = offset_;
423 for(k=0; k<ndim_; k++) off += idx[k]*step_[k];
424 return (off);
425}
426
427//! return various parameters for double loop operations on two arrays.
428void BaseArray::GetOpeParams(const BaseArray& a, bool smo, int& ax, int& axa, uint_8& step,
429 uint_8& stepa, uint_8& gpas, uint_8& naxa)
430{
431 if (smo) { // Same memory organisation
432 ax = axa = MaxSizeKA();
433 }
434 else {
435 if (Size(RowsKA()) >= Size(ColsKA()) ) {
436 ax = RowsKA();
437 axa = a.RowsKA();
438 }
439 else {
440 ax = ColsKA();
441 axa = a.ColsKA();
442 }
443 }
444 step = Step(ax);
445 stepa = a.Step(axa);
446 gpas = Size(ax)*step;
447 naxa = Size()/Size(ax);
448 return;
449}
450
451// ----------------------------------------------------
452// Impression, etc ...
453// ----------------------------------------------------
454
455//! Show infos on stream \b os (\b si to display DvList)
456void BaseArray::Show(ostream& os, bool si) const
457{
458 if (ndim_ < 1) {
459 os << "\n--- " << BaseArray::InfoString() << " Unallocated Array ! " << endl;
460 return;
461 }
462 os << "\n--- " << InfoString() ;
463 os << " ND=" << ndim_ << " SizeX*Y*...= " ;
464 for(uint_4 k=0; k<ndim_; k++) {
465 os << size_[k];
466 if (k<ndim_-1) os << "x";
467 }
468 os << " ---" << endl;
469 if (prt_lev_ > 0) {
470 os << " TotSize= " << totsize_ << " Step(X Y ...)=" ;
471 for(uint_4 k=0; k<ndim_; k++) os << step_[k] << " " ;
472 os << " Offset= " << offset_ << endl;
473 }
474 if (prt_lev_ > 1) {
475 os << " MemoryMapping=" << GetMemoryMapping() << " VecType= " << GetVectorType()
476 << " RowsKA= " << RowsKA() << " ColsKA= " << ColsKA()
477 << " VectKA=" << VectKA() << endl;
478 }
479 if (!si && (prt_lev_ < 2)) return;
480 if (mInfo != NULL) os << (*mInfo) << endl;
481
482}
483
484//! Return BaseArray Type
485string BaseArray::InfoString() const
486{
487 string rs = "BaseArray Type= ";
488 rs += typeid(*this).name() ;
489 return rs;
490}
491
492//! Return attached DVList
493DVList& BaseArray::Info()
494{
495if (mInfo == NULL) mInfo = new DVList;
496return(*mInfo);
497}
498
499//! Update sizes and information for array
500/*!
501 \param ndim : dimension
502 \param siz[ndim] : sizes
503 \param step : step (must be the same on all dimensions)
504 \param offset : offset of the first element
505 \return true if all OK, false if problems appear
506 \return string \b exmsg for explanation in case of problems
507 */
508bool BaseArray::UpdateSizes(uint_4 ndim, const uint_4 * siz, uint_4 step, uint_8 offset, string & exmsg)
509{
510 if (ndim >= BASEARRAY_MAXNDIMS) {
511 exmsg += " NDim Error"; return false;
512 }
513 if (step < 1) {
514 exmsg += " Step(=0) Error"; return false;
515 }
516
517 minstep_ = moystep_ = step;
518
519 // Flagging bad updates ...
520 ndim_ = 0;
521
522 totsize_ = 1;
523 uint_4 k;
524 for(k=0; k<BASEARRAY_MAXNDIMS; k++) {
525 size_[k] = 1;
526 step_[k] = 0;
527 }
528 for(k=0; k<ndim; k++) {
529 size_[k] = siz[k] ;
530 step_[k] = totsize_*step;
531 totsize_ *= size_[k];
532 }
533 if (totsize_ < 1) {
534 exmsg += " Size Error"; return false;
535 }
536 offset_ = offset;
537 // Default for matrices : Memory organisation and Vector type
538 if (default_memory_mapping == CMemoryMapping) {
539 marowi_ = 1; macoli_ = 0;
540 }
541 else {
542 marowi_ = 0; macoli_ = 1;
543 }
544 veceli_ = (default_vector_type == ColumnVector ) ? marowi_ : macoli_;
545 // Update OK
546 ndim_ = ndim;
547 return true;
548}
549
550//! Update sizes and information for array
551/*!
552 \param ndim : dimension
553 \param siz[ndim] : sizes
554 \param step[ndim] : steps
555 \param offset : offset of the first element
556 \return true if all OK, false if problems appear
557 \return string \b exmsg for explanation in case of problems
558 */
559bool BaseArray::UpdateSizes(uint_4 ndim, const uint_4 * siz, const uint_4 * step, uint_8 offset, string & exmsg)
560{
561 if (ndim >= BASEARRAY_MAXNDIMS) {
562 exmsg += " NDim Error"; return false;
563 }
564
565 // Flagging bad updates ...
566 ndim_ = 0;
567
568 totsize_ = 1;
569 uint_4 k;
570 for(k=0; k<BASEARRAY_MAXNDIMS; k++) {
571 size_[k] = 1;
572 step_[k] = 0;
573 }
574 uint_4 minstep = step[0];
575 for(k=0; k<ndim; k++) {
576 size_[k] = siz[k] ;
577 step_[k] = step[k];
578 totsize_ *= size_[k];
579 if (step_[k] < minstep) minstep = step_[k];
580 }
581 if (minstep < 1) {
582 exmsg += " Step(=0) Error"; return false;
583 }
584 if (totsize_ < 1) {
585 exmsg += " Size Error"; return false;
586 }
587 uint_8 plast = 0;
588 for(k=0; k<ndim; k++) plast += (siz[k]-1)*step[k];
589 if (plast == minstep*totsize_ ) moystep_ = minstep;
590 else moystep_ = 0;
591 minstep_ = minstep;
592 offset_ = offset;
593 // Default for matrices : Memory organisation and Vector type
594 if (default_memory_mapping == CMemoryMapping) {
595 marowi_ = 1; macoli_ = 0;
596 }
597 else {
598 marowi_ = 0; macoli_ = 1;
599 }
600 veceli_ = (default_vector_type == ColumnVector ) ? marowi_ : macoli_;
601 // Update OK
602 ndim_ = ndim;
603 return true;
604}
605
606//! Update sizes and information relative to array \b a
607/*!
608 \param a : array to be compare with
609 \return true if all OK, false if problems appear
610 \return string \b exmsg for explanation in case of problems
611 */
612bool BaseArray::UpdateSizes(const BaseArray& a, string & exmsg)
613{
614 if (a.ndim_ >= BASEARRAY_MAXNDIMS) {
615 exmsg += " NDim Error"; return false;
616 }
617
618 // Flagging bad updates ...
619 ndim_ = 0;
620
621 totsize_ = 1;
622 uint_4 k;
623 for(k=0; k<BASEARRAY_MAXNDIMS; k++) {
624 size_[k] = 1;
625 step_[k] = 0;
626 }
627 uint_4 minstep = a.step_[0];
628 for(k=0; k<a.ndim_; k++) {
629 size_[k] = a.size_[k] ;
630 step_[k] = a.step_[k];
631 totsize_ *= size_[k];
632 if (step_[k] < minstep) minstep = step_[k];
633 }
634 if (minstep < 1) {
635 exmsg += " Step(=0) Error"; return false;
636 }
637 if (totsize_ < 1) {
638 exmsg += " Size Error"; return false;
639 }
640
641 minstep_ = a.minstep_;
642 moystep_ = a.moystep_;
643 offset_ = a.offset_;
644 macoli_ = a.macoli_;
645 marowi_ = a.marowi_;
646 veceli_ = a.veceli_;
647 // Update OK
648 ndim_ = a.ndim_;
649 return true;
650}
651
652
653//! Update sizes and information relative to array \b a
654/*!
655 \param a : array to be compare with
656 \param ndim : could be change (but should be less than the ndim of the current class)
657 \param siz[ndim],pos[ndim],step[ndim] : could be changed but must be
658 compatible within the memory size with those of the current class.
659 \return true if all OK, false if problems appear
660 \return string \b exmsg for explanation in case of problems
661 */
662void BaseArray::UpdateSubArraySizes(BaseArray & ra, uint_4 ndim, uint_4 * siz, uint_4 * pos, uint_4 * step) const
663{
664 if ( (ndim > ndim_) || (ndim < 1) )
665 throw(SzMismatchError("BaseArray::UpdateSubArraySizes( ... ) NDim Error") );
666 uint_4 k;
667 for(k=0; k<ndim; k++)
668 if ( (siz[k]*step[k]+pos[k]) > size_[k] )
669 throw(SzMismatchError("BaseArray::UpdateSubArraySizes( ... ) Size/Pos Error") );
670 uint_8 offset = offset_;
671 for(k=0; k<ndim_; k++) {
672 offset += pos[k]*step_[k];
673 step[k] *= step_[k];
674 }
675 string exm = "BaseArray::UpdateSubArraySizes() ";
676 if (!ra.UpdateSizes(ndim, siz, step, offset, exm))
677 throw( ParmError(exm) );
678 return;
679}
680
681
Note: See TracBrowser for help on using the repository browser.