Changeset 813 in Sophya for trunk/SophyaLib/TArray/basarr.cc


Ignore:
Timestamp:
Apr 5, 2000, 5:44:19 PM (25 years ago)
Author:
ansari
Message:

Correction bug/amelioarions TArray,TMatrix,TVector - Reza 5/4/2000

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/TArray/basarr.cc

    r804 r813  
    1414                                 "Stride(int )", "ElemCheckBound()", "operator()" };
    1515uint_4 BaseArray::max_nprt_ = 50;
     16uint_4 BaseArray::prt_lev_ = 0;
    1617short  BaseArray::default_memory_mapping = CMemoryMapping;
    17 
    18 // Methodes statiques globales
    19 void BaseArray::SetMaxPrint(uint_4 nprt)
     18short  BaseArray::default_vector_type = ColumnVector;
     19uint_8 BaseArray::openmp_size_threshold = 200000;
     20
     21// ------ Methodes statiques globales --------
     22
     23//  1/ Gestion des impressions
     24void BaseArray::SetMaxPrint(uint_4 nprt, uint_4 lev)
    2025{
    2126  max_nprt_ = nprt;
     27  prt_lev_ = (lev < 3) ? lev : 3;
     28}
     29
     30void BaseArray::SetOpenMPSizeThreshold(uint_8 thr)
     31{
     32  openmp_size_threshold = thr;
    2233}
    2334
     
    3243short BaseArray::SetDefaultMemoryMapping(short mm)
    3344{
    34   default_memory_mapping = ( (mm == CMemoryMapping) ? CMemoryMapping : FortranMemoryMapping) ;
     45  default_memory_mapping = (mm != CMemoryMapping) ? FortranMemoryMapping : CMemoryMapping;
    3546  return default_memory_mapping;
    3647}
    3748
    38 
     49short BaseArray::SetDefaultVectorType(short vt)
     50{
     51  default_vector_type = (vt != ColumnVector) ? RowVector : ColumnVector ;
     52  return default_vector_type;
     53}
     54
     55// Memory organisation
    3956short BaseArray::SelectMemoryMapping(short mm)
    4057// si mm == CMemoryMapping, elements d'une ligne suivant X (consecutif)
     
    4461  else return (default_memory_mapping);
    4562}
    46 
    47 void BaseArray::UpdateMemoryMapping(short mm, uint_4 & nx, uint_4 & ny)
    48 {
     63short BaseArray::SelectVectorType(short vt)
     64{
     65  if ((vt == ColumnVector) || (vt == RowVector))  return(vt);
     66  else return(default_vector_type);
     67}
     68
     69void BaseArray::UpdateMemoryMapping(short mm)
     70{
     71  short vt = default_vector_type;
    4972  if ( (mm != CMemoryMapping) && (mm != FortranMemoryMapping) ) mm = default_memory_mapping;
    5073  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   } 
     74    marowi_  = 1;  macoli_ = 0;
     75  }
     76  else {
     77    marowi_ = 0;  macoli_ = 1;
     78  }
     79
     80  if ( (ndim_ == 2) && ((size_[0] == 1) || (size_[1] == 1)) ) {
     81    // Choix automatique Vecteur ligne ou colonne
     82    if ( size_[macoli_] == 1)  veceli_ = marowi_;
     83    else veceli_ = macoli_;
     84  }
     85  else veceli_ = (vt ==  ColumnVector ) ?  marowi_ : macoli_;
     86  ck_memo_vt_ = true;   // Check MemMapping and VectorType for CompareSize 
    5887}
    5988
    6089void BaseArray::UpdateMemoryMapping(BaseArray const & a, short mm)
    6190{
    62   if (mm == SameMemoryMapping)
     91  short vt = default_vector_type;
     92  if (mm == SameMemoryMapping) {
    6393    mm = ((a.marowi_ == 1) ? CMemoryMapping : FortranMemoryMapping);
     94    vt = (a.marowi_ == a.veceli_) ? ColumnVector : RowVector;
     95  }
     96  else if (mm == AutoMemoryMapping)   mm = default_memory_mapping;
     97
    6498  if ( (mm != CMemoryMapping) && (mm != FortranMemoryMapping) ) mm = default_memory_mapping;
    6599  if (mm == CMemoryMapping) {
    66     marowi_ = veceli_ = 1;  macoli_ = 0;
    67   }
    68   else {
    69     marowi_ = veceli_ = 0;  macoli_ = 1;
    70   } 
    71 }
    72 
     100    marowi_  = 1;  macoli_ = 0;
     101  }
     102  else {
     103    marowi_ = 0;  macoli_ = 1;
     104  }
     105  if ( (ndim_ == 2) && ((size_[0] == 1) || (size_[1] == 1)) ) {
     106    // Choix automatique Vecteur ligne ou colonne
     107    if ( size_[macoli_] == 1)  veceli_ = marowi_;
     108    else veceli_ = marowi_;
     109  }
     110  else veceli_ = (vt ==  ColumnVector ) ?  marowi_ : macoli_;
     111  ck_memo_vt_ = true;   // Check MemMapping and VectorType for CompareSize 
     112}
     113
     114void BaseArray::SetMemoryMapping(short mm)
     115{
     116  if (mm == SameMemoryMapping) return;
     117  if (mm == AutoMemoryMapping)  mm = default_memory_mapping;
     118  if ( (mm != CMemoryMapping) && (mm != FortranMemoryMapping) ) return;
     119  short vt = (marowi_ == veceli_) ? ColumnVector : RowVector;
     120  if (mm == CMemoryMapping) {
     121    marowi_ =  1;  macoli_ = 0;
     122  }
     123  else {
     124    marowi_ =  0;  macoli_ = 1;
     125  }
     126  if ( (ndim_ == 2) && ((size_[0] == 1) || (size_[1] == 1)) ) {
     127    // Choix automatique Vecteur ligne ou colonne
     128    if ( size_[macoli_] == 1)  veceli_ = marowi_;
     129    else veceli_ = macoli_;
     130  }
     131  else   veceli_ = (vt ==  ColumnVector ) ?  marowi_ : macoli_;
     132  ck_memo_vt_ = true;   // Check MemMapping and VectorType for CompareSize 
     133}
     134
     135void BaseArray::SetVectorType(short vt)
     136{
     137  if (vt == SameVectorType) return;
     138  if (vt == AutoVectorType) vt =  default_vector_type;
     139  if ( (ndim_ == 2) && ((size_[0] == 1) || (size_[1] == 1)) ) {
     140    // Choix automatique Vecteur ligne ou colonne
     141    if ( size_[macoli_] == 1)  veceli_ = marowi_;
     142    else veceli_ = macoli_;
     143  }
     144  else  veceli_ = (vt ==  ColumnVector ) ?  marowi_ : macoli_;
     145  ck_memo_vt_ = true;   // Check MemMapping and VectorType for CompareSize 
     146}
    73147
    74148// -------------------------------------------------------
     
    87161  moystep_ = 0;
    88162  offset_ = 0;
    89   // Default for matrices : Lines = Y , Columns = X, Default Vectore= ColumnVector
    90   macoli_ = 0;
    91   veceli_ = marowi_ = 1;
     163  // Default for matrices : Memory organisation and Vector type
     164  if (default_memory_mapping == CMemoryMapping) {
     165    marowi_ =  1;  macoli_ = 0;
     166  }
     167  else {
     168    marowi_ =  0;  macoli_ = 1;
     169  }
     170  veceli_ = (default_vector_type ==  ColumnVector ) ?  marowi_ : macoli_;
     171  ck_memo_vt_ = false;   // Default : Don't Check MemMapping and VectorType for CompareSize 
    92172}
    93173
     
    103183  for(int k=0; k<ndim_; k++)
    104184    if (size_[k] != a.size_[k])  return(false);
    105   if ( (macoli_ != a.macoli_) || (marowi_ != a.marowi_) ||
    106        (veceli_ != a.veceli_) )  return(false);
     185  //  $CHECK$   Reza doit-on verifier ca
     186  if (ck_memo_vt_ && a.ck_memo_vt_)
     187    if ( (macoli_ != a.macoli_) || (marowi_ != a.marowi_) ||
     188         (veceli_ != a.veceli_) )  return(false);
    107189  return(true);
    108190}
     
    166248
    167249//  Acces lineaire aux elements ....  Calcul d'offset
     250// --------------------------------------------------
     251// Position de l'element 0 du vecteur i selon l'axe ka
     252// --------------------------------------------------
     253uint_8 BaseArray::Offset(uint_4 ka, uint_8 i) const
     254{
     255
     256  if ( (ndim_ < 1) || (i == 0) )  return(offset_);
     257  //#ifdef SO_BOUNDCHECKING
     258  if (ka >= ndim_)
     259    throw RangeCheckError("BaseArray::Offset(uint_4 ka, uint_8 i) Axe KA Error");
     260  if ( i*size_[ka] >= totsize_ ) 
     261    throw RangeCheckError("BaseArray::Offset(uint_4 ka, uint_8 i) Index Error");
     262  //#endif
     263  uint_4 idx[BASEARRAY_MAXNDIMS];
     264  int k;
     265  uint_8 rest = i;
     266  idx[ka] = 0;
     267  for(k=0; k<ndim_; k++) {
     268    if (k == ka) continue;
     269    idx[k] = rest%size_[k];   rest /= size_[k];
     270  }
     271  uint_8 off = offset_;
     272  for(k=0; k<ndim_; k++)  off += idx[k]*step_[k];
     273  return (off);
     274}
    168275
    169276uint_8 BaseArray::Offset(uint_8 ip) const
    170277{
    171 if (ip == 0)  return(offset_);
    172 uint_4 idx[BASEARRAY_MAXNDIMS];
    173 int k;
    174 uint_8 rest = ip;
    175 for(k=0; k<ndim_; k++)   { idx[k] = rest%size_[k];   rest /= size_[k];  }   
    176 uint_8 off = offset_;
    177 for(k=0; k<ndim_; k++)  off += idx[k]*step_[k];
    178 return (off);
     278  if ( (ndim_ < 1) || (ip == 0) )  return(offset_);
     279  //#ifdef SO_BOUNDCHECKING
     280  if (ip >= totsize_)
     281    throw RangeCheckError("BaseArray::Offset(uint_8 ip) Out of range index ip");
     282  //#endif
     283
     284  uint_4 idx[BASEARRAY_MAXNDIMS];
     285  int k;
     286  uint_8 rest = ip;
     287  for(k=0; k<ndim_; k++) {
     288    idx[k] = rest%size_[k];   rest /= size_[k];
     289  }
     290  //#ifdef SO_BOUNDCHECKING
     291  if (rest != 0)
     292    throw PError("BaseArray::Offset(uint_8 ip) GUG !!! rest != 0");
     293  //#endif
     294//   if (rest != 0) cerr << " BUG ---- BaseArray::Offset( " << ip << " )" << rest << endl;
     295//   cerr << " DBG-Offset( " << ip << ")" ;
     296//   for(k=0; k<ndim_; k++) cerr << idx[k] << "," ;
     297//   cerr << " ZZZZ " << endl;
     298  uint_8 off = offset_;
     299  for(k=0; k<ndim_; k++)  off += idx[k]*step_[k];
     300  return (off);
    179301}
    180302
     
    186308void BaseArray::Show(ostream& os, bool si) const
    187309{
    188   os << " TArray< " << DataType() << " >  NDim= " << ndim_
    189      << "(" << typeid(*this).name() << " )" << endl;
    190   os << "TotSize=" << totsize_ << " Size(X*Y*...)= " ;
     310  os << "\n--- " << InfoString() ;
     311  os << " ND=" << ndim_ << " SizeX*Y*...= " ;
    191312  for(int k=0; k<ndim_; k++) {
    192313    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;
     314    if (k<ndim_-1)  os << "x";
     315  }
     316  os << " ---" << endl;
     317  if (prt_lev_ > 0) {
     318    os <<  " TotSize= " << totsize_ << " Step(X Y ...)="  ;
     319    for(int k=0; k<ndim_; k++)     os << step_[k] << "  " ;
     320    os << " Offset= " << offset_  << endl;
     321  }
     322  if (prt_lev_ > 1) {
     323    os << " MemoryMapping=" << GetMemoryMapping() << " VecType= " << GetVectorType()
     324       << " RowsKA= " << RowsKA() << " ColsKA= " << ColsKA()
     325       << " VectKA=" << VectKA() << endl;
     326  }
     327  if (!si && (prt_lev_ < 2)) return;
     328  if (mInfo != NULL) os << (*mInfo) << endl;
    200329 
    201330}
    202331
     332string BaseArray::InfoString() const
     333{
     334  string rs = "BaseArray Type= ";
     335  rs +=  typeid(*this).name() ;
     336  return rs;
     337}
    203338
    204339DVList& BaseArray::Info()
     
    238373  }
    239374  offset_ = offset;
    240   // Default for matrices : Lines = Y , Columns = X
    241   macoli_ = 0;
    242   marowi_ = veceli_ = 1;
     375  // Default for matrices : Memory organisation and Vector type
     376  if (default_memory_mapping == CMemoryMapping) {
     377    marowi_ =  1;  macoli_ = 0;
     378  }
     379  else {
     380    marowi_ =  0;  macoli_ = 1;
     381  }
     382  veceli_ = (default_vector_type ==  ColumnVector ) ?  marowi_ : macoli_;
     383  ck_memo_vt_ = false;   // Default : Don't Check MemMapping and VectorType for CompareSize 
    243384  // Update OK
    244385  ndim_ = ndim;
     
    280421  minstep_ = minstep;
    281422  offset_ = offset;
    282   // Default for matrices : Lines = Y , Columns = X
    283   macoli_ = 0;
    284   marowi_ = veceli_ = 1;
     423  // Default for matrices : Memory organisation and Vector type
     424  if (default_memory_mapping == CMemoryMapping) {
     425    marowi_ =  1;  macoli_ = 0;
     426  }
     427  else {
     428    marowi_ =  0;  macoli_ = 1;
     429  }
     430  veceli_ = (default_vector_type ==  ColumnVector ) ?  marowi_ : macoli_;
     431  ck_memo_vt_ = false;   // Default : Don't Check MemMapping and VectorType for CompareSize 
    285432  // Update OK
    286433  ndim_ = ndim;
     
    323470  marowi_ = a.marowi_;
    324471  veceli_ = a.veceli_;
     472  ck_memo_vt_ = a.ck_memo_vt_;
    325473  // Update OK
    326474  ndim_ = a.ndim_;
Note: See TracChangeset for help on using the changeset viewer.