Ignore:
Timestamp:
07/05/16 15:59:02 (8 years ago)
Author:
mhnguyen
Message:

Adding a new type of element into grid: Scalar

+) Add a new node Scalar for xml
+) Make some change on writing scalar value
+) Reorganize some codes
+) Remove some redundant codes

Test
+) On Curie
+) All tests pass

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/distribution_client.cpp

    r874 r887  
    5656  std::vector<CDomain*> domList = grid->getDomains(); 
    5757  std::vector<CAxis*> axisList = grid->getAxis(); 
    58   CArray<bool,1> axisDomainOrder = grid->axis_domain_order; 
    59  
    60   std::vector<CDomain*>::iterator itbDom, iteDom, itDom; 
    61   std::vector<CAxis*>::iterator itbAxis, iteAxis, itAxis; 
    62  
    63   itbDom  = itDom  = domList.begin();  iteDom  = domList.end(); 
    64   itbAxis = itAxis = axisList.begin(); iteAxis = axisList.end(); 
    65  
    66   readDistributionInfo(domList, axisList, axisDomainOrder); 
     58  std::vector<CScalar*> scalarList = grid->getScalars(); 
     59  CArray<int,1> axisDomainOrder = grid->axis_domain_order; 
     60 
     61  readDistributionInfo(domList, axisList, scalarList, axisDomainOrder); 
    6762 
    6863  // Then check mask of grid 
     
    9287  \param [in] domList List of domains of grid 
    9388  \param [in] axisList List of axis of grid 
    94   \param [in] axisDomainOrder order of axis and domain inside a grid. True if domain, false if axis 
     89  \param [in] scalarList List of scalar of grid 
     90  \param [in] axisDomainOrder order of axis and domain inside a grid. 2 if domain, 1 if axis and zero if scalar 
    9591//  \param [in] gridMask Mask of grid, for now, keep it 3 dimension, but it needs changing 
    9692*/ 
    9793void CDistributionClient::readDistributionInfo(const std::vector<CDomain*>& domList, 
    9894                                               const std::vector<CAxis*>& axisList, 
    99                                                const CArray<bool,1>& axisDomainOrder) 
     95                                               const std::vector<CScalar*>& scalarList, 
     96                                               const CArray<int,1>& axisDomainOrder) 
    10097{ 
    10198  domainNum_ = domList.size(); 
     
    129126  { 
    130127    indexMap_[i] = idx; 
    131     if (true == axisDomainOrder(i)) 
     128    if (2 == axisDomainOrder(i)) 
    132129    { 
    133130      ++(this->dims_); 
     
    155152 
    156153  // A trick to determine position of each domain in domainList 
    157   int domIndex = 0, axisIndex = 0; 
     154  int domIndex = 0, axisIndex = 0, scalarIndex = 0; 
    158155  idx = 0; 
    159156 
     
    172169  for (idx = 0; idx < numElement_; ++idx) 
    173170  { 
    174     bool isDomain = axisDomainOrder(idx); 
     171    int eleDim = axisDomainOrder(idx); 
    175172    elementNLocal_[idx] = localSize; 
    176173    elementNGlobal_[idx] = globalSize; 
    177174 
    178175    // If this is a domain 
    179     if (isDomain) 
     176    if (2 == eleDim) 
    180177    { 
    181178      // On the j axis 
     
    188185 
    189186      dataBegin_.at(indexMap_[idx]+1) = domList[domIndex]->data_jbegin.getValue(); //(2 == domList[domIndex]->data_dim) ? domList[domIndex]->data_jbegin.getValue() : -1; 
    190       dataIndex_.at(indexMap_[idx]+1) = &(domList[domIndex]->data_j_index); 
    191       infoIndex_.at(indexMap_[idx]+1) = &(domList[domIndex]->j_index); 
     187//      dataIndex_.at(indexMap_[idx]+1) = &(domList[domIndex]->data_j_index); 
     188//      infoIndex_.at(indexMap_[idx]+1) = &(domList[domIndex]->j_index); 
     189      dataIndex_.at(indexMap_[idx]+1).reference(domList[domIndex]->data_j_index); 
     190      infoIndex_.at(indexMap_[idx]+1).reference(domList[domIndex]->j_index); 
    192191 
    193192      // On the i axis 
     
    200199 
    201200      dataBegin_.at(indexMap_[idx]) = domList[domIndex]->data_ibegin.getValue(); 
    202       dataIndex_.at(indexMap_[idx]) = &(domList[domIndex]->data_i_index); 
    203       infoIndex_.at(indexMap_[idx]) = &(domList[domIndex]->i_index); 
     201//      dataIndex_.at(indexMap_[idx]) = &(domList[domIndex]->data_i_index); 
     202//      infoIndex_.at(indexMap_[idx]) = &(domList[domIndex]->i_index); 
     203      dataIndex_.at(indexMap_[idx]).reference(domList[domIndex]->data_i_index); 
     204      infoIndex_.at(indexMap_[idx]).reference(domList[domIndex]->i_index); 
    204205 
    205206      dataNIndex_.at(idx) = domList[domIndex]->data_i_index.numElements(); 
     
    212213      ++domIndex; 
    213214    } 
    214     else // So it's an axis 
     215    else if (1 == eleDim)// So it's an axis 
    215216    { 
    216217      nLocal_.at(indexMap_[idx]) = axisList[axisIndex]->n.getValue(); 
     
    222223 
    223224      dataBegin_.at(indexMap_[idx]) = axisList[axisIndex]->data_begin.getValue(); 
    224       dataIndex_.at(indexMap_[idx]) = &(axisList[axisIndex]->data_index); 
    225       infoIndex_.at(indexMap_[idx]) = &(axisList[axisIndex]->index); 
     225//      dataIndex_.at(indexMap_[idx]) = &(axisList[axisIndex]->data_index); 
     226//      infoIndex_.at(indexMap_[idx]) = &(axisList[axisIndex]->index); 
     227      dataIndex_.at(indexMap_[idx]).reference(axisList[axisIndex]->data_index); 
     228      infoIndex_.at(indexMap_[idx]).reference(axisList[axisIndex]->index); 
    226229      dataNIndex_.at(idx) = axisList[axisIndex]->data_index.numElements(); 
    227230      dataDims_.at(idx) = 1; 
     
    233236 
    234237      ++axisIndex; 
     238    } 
     239    else // scalar 
     240    { 
     241      nLocal_.at(indexMap_[idx]) = 1; 
     242      nGlob_.at(indexMap_[idx]) = 1; 
     243      nBeginLocal_.at(indexMap_[idx]) = 0; 
     244      nBeginGlobal_.at(indexMap_[idx]) = 1; 
     245      nZoomBegin_.at((indexMap_[idx])) = 0; 
     246      nZoomEnd_.at((indexMap_[idx])) = 0; 
     247 
     248      dataBegin_.at(indexMap_[idx]) = 0; 
     249      dataIndex_.at(indexMap_[idx]).resize(1); dataIndex_.at(indexMap_[idx])(0) = 0; 
     250      infoIndex_.at(indexMap_[idx]).resize(1); infoIndex_.at(indexMap_[idx])(0) = 0; 
     251      dataNIndex_.at(idx) = 1; 
     252      dataDims_.at(idx) = 1; 
     253 
     254      isDataDistributed_ |= false; 
     255 
     256      localSize *= nLocal_.at(indexMap_[idx]); 
     257      globalSize *= nGlob_.at(indexMap_[idx]); 
     258 
     259      ++scalarIndex; 
    235260    } 
    236261  } 
     
    248273  for (int i = 0; i < axisDomainOrder_.numElements(); ++i) 
    249274  { 
    250     if (axisDomainOrder_(i)) 
     275    if (2 == axisDomainOrder_(i)) 
    251276    { 
    252277      elementIndexData_[i].resize(dataNIndex_[i]); 
     
    255280      for (int j = 0; j < dataNIndex_[i]; ++j) 
    256281      { 
    257         iIdx = getDomainIndex((*dataIndex_[indexMap_[i]])(j), (*dataIndex_[indexMap_[i]+1])(j), 
     282        iIdx = getDomainIndex((dataIndex_[indexMap_[i]])(j), (dataIndex_[indexMap_[i]+1])(j), 
    258283                              dataBegin_[indexMap_[i]], dataBegin_[indexMap_[i]+1], 
    259284                              dataDims_[i], nLocal_[indexMap_[i]], jIdx); 
     
    281306        if (tmpIndexElementData(j)) 
    282307        { 
    283           iIdx = getDomainIndex((*dataIndex_[indexMap_[i]])(j), (*dataIndex_[indexMap_[i]+1])(j), 
     308          iIdx = getDomainIndex((dataIndex_[indexMap_[i]])(j), (dataIndex_[indexMap_[i]+1])(j), 
    284309                                dataBegin_[indexMap_[i]], dataBegin_[indexMap_[i]+1], 
    285310                                dataDims_[i], nLocal_[indexMap_[i]], jIdx); 
    286311          localIndex = tmpLocalElementIndex(count) = iIdx + jIdx * nLocal_[indexMap_[i]]; 
    287           tmpGlobalElementIndex(count) = (*infoIndex_[indexMap_[i]])(localIndex) + ((*infoIndex_[indexMap_[i]+1])(localIndex))*nGlob_[indexMap_[i]]; 
    288           if ((((*infoIndex_[indexMap_[i]])(localIndex)) <= nZoomEnd_[indexMap_[i]]) 
    289              && (nZoomBegin_[indexMap_[i]] <= ((*infoIndex_[indexMap_[i]])(localIndex))) 
    290              && (((*infoIndex_[indexMap_[i]+1])(localIndex)) <= nZoomEnd_[indexMap_[i]+1]) 
    291              && (nZoomBegin_[indexMap_[i]+1] <= ((*infoIndex_[indexMap_[i]+1])(localIndex)))) 
     312          tmpGlobalElementIndex(count) = (infoIndex_[indexMap_[i]])(localIndex) + ((infoIndex_[indexMap_[i]+1])(localIndex))*nGlob_[indexMap_[i]]; 
     313          if ((((infoIndex_[indexMap_[i]])(localIndex)) <= nZoomEnd_[indexMap_[i]]) 
     314             && (nZoomBegin_[indexMap_[i]] <= ((infoIndex_[indexMap_[i]])(localIndex))) 
     315             && (((infoIndex_[indexMap_[i]+1])(localIndex)) <= nZoomEnd_[indexMap_[i]+1]) 
     316             && (nZoomBegin_[indexMap_[i]+1] <= ((infoIndex_[indexMap_[i]+1])(localIndex)))) 
    292317          { 
    293318            tmpZoomMaskElement(count) = true; 
     
    309334  for (int i = 0; i < axisDomainOrder_.numElements(); ++i) 
    310335  { 
    311     if (!axisDomainOrder_(i)) 
     336    if (1 == axisDomainOrder_(i)) 
    312337    { 
    313338      elementIndexData_[i].resize(dataNIndex_[i]); 
     
    316341      for (int j = 0; j < dataNIndex_[i]; ++j) 
    317342      { 
    318         iIdx = getAxisIndex((*dataIndex_[indexMap_[i]])(j), dataBegin_[indexMap_[i]], nLocal_[indexMap_[i]]); 
     343        iIdx = getAxisIndex((dataIndex_[indexMap_[i]])(j), dataBegin_[indexMap_[i]], nLocal_[indexMap_[i]]); 
    319344        if ((iIdx >= nBeginLocal_[indexMap_[i]]) && 
    320345           (iIdx < nLocal_[indexMap_[i]]) && (axisMasks_[idxAxis](iIdx))) 
     
    338363        if (tmpIndexElementData(j)) 
    339364        { 
    340           iIdx = tmpLocalElementIndex(count) = getAxisIndex((*dataIndex_[indexMap_[i]])(j), dataBegin_[indexMap_[i]], nLocal_[indexMap_[i]]); 
    341           tmpGlobalElementIndex(count) = (*infoIndex_[indexMap_[i]])(iIdx); 
    342           if ((((*infoIndex_[indexMap_[i]])(iIdx)) <= nZoomEnd_[indexMap_[i]]) 
    343              && (nZoomBegin_[indexMap_[i]] <= ((*infoIndex_[indexMap_[i]])(iIdx)))) 
     365          iIdx = tmpLocalElementIndex(count) = getAxisIndex((dataIndex_[indexMap_[i]])(j), dataBegin_[indexMap_[i]], nLocal_[indexMap_[i]]); 
     366          tmpGlobalElementIndex(count) = (infoIndex_[indexMap_[i]])(iIdx); 
     367          if ((((infoIndex_[indexMap_[i]])(iIdx)) <= nZoomEnd_[indexMap_[i]]) 
     368             && (nZoomBegin_[indexMap_[i]] <= ((infoIndex_[indexMap_[i]])(iIdx)))) 
    344369          { 
    345370            tmpZoomMaskElement(count) = true; 
     
    349374      } 
    350375      ++idxAxis; 
     376    } 
     377  } 
     378} 
     379 
     380/*! 
     381  Create local index of scalar. 
     382*/ 
     383void CDistributionClient::createLocalScalarDataIndex() 
     384{ 
     385  int idxAxis = 0; 
     386  for (int i = 0; i < axisDomainOrder_.numElements(); ++i) 
     387  { 
     388    if (0 == axisDomainOrder_(i)) 
     389    { 
     390      elementIndexData_[i].resize(dataNIndex_[i]); 
     391      elementIndexData_[i] = true; 
     392      int count = 1; 
     393 
     394      elementLocalIndex_[i].resize(count); 
     395      elementLocalIndex_[i] = 0; 
     396      elementGlobalIndex_[i].resize(count); 
     397      elementGlobalIndex_[i] = 0; 
     398      elementZoomMask_[i].resize(count); 
     399      elementZoomMask_[i] = true; 
    351400    } 
    352401  } 
     
    530579void CDistributionClient::createGlobalIndex() 
    531580{ 
    532   size_t ssize = 1, idx = 0; 
    533   for (int i = 0; i < this->dims_; ++i) 
    534   ssize *= nLocal_[i]; 
    535  
    536   this->globalIndex_.resize(ssize); 
    537   std::vector<int> idxLoop(this->numElement_,0); 
    538   int innnerLoopSize = (*infoIndex_[0]).numElements(); 
    539   while (idx < ssize) 
    540   { 
    541     for (int i = 0; i < this->numElement_; ++i) 
    542     { 
    543       if (idxLoop[i] == (*infoIndex_[indexMap_[i]]).numElements()) 
    544       { 
    545         idxLoop[i] = 0; 
    546         ++idxLoop[i+1]; 
    547       } 
    548     } 
    549  
    550     for (int i = 0; i < innnerLoopSize; ++i) 
    551     { 
    552       size_t globalIndex = (*infoIndex_[0])(idxLoop[0]); 
    553       size_t mulDim = 1; 
    554       for (int idxElement = 0; idxElement < this->numElement_; ++idxElement) 
    555       { 
    556         if (axisDomainOrder_(idxElement)) 
    557         { 
    558           int jb = (0 == idxElement) ? 1 : 0; 
    559           for (int j = jb; j <= 1; ++j) 
    560           { 
    561             mulDim *= nGlob_[indexMap_[idxElement]+j-1]; 
    562             globalIndex += ((*infoIndex_[indexMap_[idxElement]+j])(idxLoop[idxElement]))*mulDim; 
    563           } 
    564         } 
    565         else 
    566         { 
    567           if (0 != idxElement) 
    568           { 
    569             mulDim *= nGlob_[indexMap_[idxElement]-1]; 
    570             globalIndex += ((*infoIndex_[indexMap_[idxElement]])(idxLoop[idxElement]))*mulDim; 
    571           } 
    572         } 
    573       } 
    574  
    575       this->globalIndex_(idx) = globalIndex; 
    576       ++idxLoop[0]; 
    577       ++idx; 
    578     } 
    579   } 
    580  
     581//  size_t ssize = 1, idx = 0; 
     582//  for (int i = 0; i < this->dims_; ++i) 
     583//  ssize *= nLocal_[i]; 
     584// 
     585//  this->globalIndex_.resize(ssize); 
     586//  std::vector<int> idxLoop(this->numElement_,0); 
     587//  int innnerLoopSize = (infoIndex_[0]).numElements(); 
     588//  while (idx < ssize) 
     589//  { 
     590//    for (int i = 0; i < this->numElement_; ++i) 
     591////    { 
     592//      if (idxLoop[i] == (infoIndex_[indexMap_[i]]).numElements()) 
     593//      { 
     594//        idxLoop[i] = 0; 
     595//        ++idxLoop[i+1]; 
     596//      } 
     597//    } 
     598// 
     599//    for (int i = 0; i < innnerLoopSize; ++i) 
     600//    { 
     601//      size_t globalIndex = (infoIndex_[0])(idxLoop[0]); 
     602//      size_t mulDim = 1; 
     603//      for (int idxElement = 0; idxElement < this->numElement_; ++idxElement) 
     604//      { 
     605//        if (axisDomainOrder_(idxElement)) 
     606//        { 
     607//          int jb = (0 == idxElement) ? 1 : 0; 
     608//          for (int j = jb; j <= 1; ++j) 
     609//          { 
     610//            mulDim *= nGlob_[indexMap_[idxElement]+j-1]; 
     611//            globalIndex += ((infoIndex_[indexMap_[idxElement]+j])(idxLoop[idxElement]))*mulDim; 
     612//          } 
     613//        } 
     614//        else 
     615//        { 
     616//          if (0 != idxElement) 
     617//          { 
     618//            mulDim *= nGlob_[indexMap_[idxElement]-1]; 
     619//            globalIndex += ((infoIndex_[indexMap_[idxElement]])(idxLoop[idxElement]))*mulDim; 
     620//          } 
     621//        } 
     622//      } 
     623// 
     624//      this->globalIndex_(idx) = globalIndex; 
     625//      ++idxLoop[0]; 
     626//      ++idx; 
     627//    } 
     628//  } 
    581629} 
    582630 
Note: See TracChangeset for help on using the changeset viewer.