Ignore:
Timestamp:
07/24/15 16:40:06 (9 years ago)
Author:
rlacroix
Message:

Distributions and transformations: Avoid using heap allocations.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/transformation/grid_transformation.cpp

    r634 r653  
    7272{ 
    7373  CContext* context = CContext::getCurrent(); 
    74   CContextClient* client=context->client; 
     74  CContextClient* client = context->client; 
    7575 
    7676  CDistributionClient distribution(client->clientRank, originalGridSource_); 
    7777  const CArray<size_t,1>& globalIndexGridDestSendToServer = distribution.getGlobalDataIndexSendToServer(); 
    7878 
    79   globalIndexOfCurrentGridSource_   = new CArray<size_t,1>(globalIndexGridDestSendToServer.numElements()); 
    80   globalIndexOfOriginalGridSource_  = new CArray<size_t,1>(globalIndexGridDestSendToServer.numElements()); 
    81   weightOfGlobalIndexOfOriginalGridSource_  = new CArray<double,1>(globalIndexGridDestSendToServer.numElements()); 
    82   *globalIndexOfCurrentGridSource_  = globalIndexGridDestSendToServer; 
    83   *globalIndexOfOriginalGridSource_ = globalIndexGridDestSendToServer; 
    84   *weightOfGlobalIndexOfOriginalGridSource_ = 1.0; 
     79  globalIndexOfCurrentGridSource_.resize(globalIndexGridDestSendToServer.numElements()); 
     80  globalIndexOfOriginalGridSource_.resize(globalIndexGridDestSendToServer.numElements()); 
     81  weightOfGlobalIndexOfOriginalGridSource_.resize(globalIndexGridDestSendToServer.numElements()); 
     82  globalIndexOfCurrentGridSource_  = globalIndexGridDestSendToServer; 
     83  globalIndexOfOriginalGridSource_ = globalIndexGridDestSendToServer; 
     84  weightOfGlobalIndexOfOriginalGridSource_ = 1.0; 
    8585} 
    8686 
     
    9090                                                              ite = algoTransformation_.end(); 
    9191  for (it = itb; it != ite; ++it) delete (*it); 
    92  
    93   std::map<int, CArray<int,1>* >::const_iterator itMap, iteMap; 
    94   itMap = localIndexToSendFromGridSource_.begin(); 
    95   iteMap = localIndexToSendFromGridSource_.end(); 
    96   for (; itMap != iteMap; ++itMap) delete (itMap->second); 
    97  
    98   if (0 != globalIndexOfCurrentGridSource_) delete globalIndexOfCurrentGridSource_; 
    99   if (0 != globalIndexOfOriginalGridSource_) delete globalIndexOfOriginalGridSource_; 
    100   if (0 != weightOfGlobalIndexOfOriginalGridSource_) delete weightOfGlobalIndexOfOriginalGridSource_; 
    10192} 
    10293 
     
    344335{ 
    345336  CContext* context = CContext::getCurrent(); 
    346   CContextClient* client=context->client; 
     337  CContextClient* client = context->client; 
    347338 
    348339  ListAlgoType::const_iterator itb = listAlgos_.begin(), 
     
    394385{ 
    395386  CContext* context = CContext::getCurrent(); 
    396   CContextClient* client=context->client; 
     387  CContextClient* client = context->client; 
    397388 
    398389  //First of all, retrieve info of local mask of grid destination 
     
    406397 
    407398  // Then find out which index became invalid (become masked after being applied the algorithms, or demande some masked points from grid source) 
    408   int num = globalIndexOfOriginalGridSource_->numElements(); 
     399  int num = globalIndexOfOriginalGridSource_.numElements(); 
    409400  const size_t sfmax = NumTraits<unsigned long>::sfmax(); 
    410401  int maskIndexNum = 0; 
    411402  for (int idx = 0; idx < num; ++idx) 
    412403  { 
    413     if (sfmax == (*globalIndexOfOriginalGridSource_)(idx)) 
    414     { 
    415       size_t maskedGlobalIndex = (*globalIndexOfCurrentGridSource_)(idx); 
     404    if (sfmax == globalIndexOfOriginalGridSource_(idx)) 
     405    { 
     406      size_t maskedGlobalIndex = globalIndexOfCurrentGridSource_(idx); 
    416407      itArr = std::find(itbArr, iteArr, maskedGlobalIndex); 
    417408      if (iteArr != itArr) ++maskIndexNum; 
     
    419410  } 
    420411 
    421   CArray<int,1>* maskIndexToModify = new CArray<int,1>(maskIndexNum); 
     412  CArray<int,1> maskIndexToModify(maskIndexNum); 
    422413  maskIndexNum = 0; 
    423414  for (int idx = 0; idx < num; ++idx) 
    424415  { 
    425     if (sfmax == (*globalIndexOfOriginalGridSource_)(idx)) 
    426     { 
    427       size_t maskedGlobalIndex = (*globalIndexOfCurrentGridSource_)(idx); 
     416    if (sfmax == globalIndexOfOriginalGridSource_(idx)) 
     417    { 
     418      size_t maskedGlobalIndex = globalIndexOfCurrentGridSource_(idx); 
    428419      itArr = std::find(itbArr, iteArr, maskedGlobalIndex); 
    429420      if (iteArr != itArr) 
    430421      { 
    431422        int localIdx = std::distance(itbArr, itArr); 
    432         (*maskIndexToModify)(maskIndexNum) = (localMaskIndexOnClientDest)(localIdx); 
     423        maskIndexToModify(maskIndexNum) = localMaskIndexOnClientDest(localIdx); 
    433424        ++maskIndexNum; 
    434425      } 
     
    436427  } 
    437428 
    438   gridDestination_->modifyMask(*maskIndexToModify); 
    439  
    440   delete maskIndexToModify; 
     429  gridDestination_->modifyMask(maskIndexToModify); 
    441430} 
    442431 
     
    449438{ 
    450439  CContext* context = CContext::getCurrent(); 
    451   CContextClient* client=context->client; 
     440  CContextClient* client = context->client; 
    452441 
    453442  CTransformationMapping transformationMap(gridDestination_, gridSource_); 
     
    462451  std::map<int,std::vector<size_t> >::const_iterator itbSend = globalIndexToSend.begin(), itSend, 
    463452                                                     iteSend = globalIndexToSend.end(); 
    464   CArray<size_t,1>::const_iterator itbArr = globalIndexOfCurrentGridSource_->begin(), itArr, 
    465                                    iteArr = globalIndexOfCurrentGridSource_->end(); 
     453  CArray<size_t,1>::const_iterator itbArr = globalIndexOfCurrentGridSource_.begin(), itArr, 
     454                                   iteArr = globalIndexOfCurrentGridSource_.end(); 
    466455 int sendBuffSize = 0; 
    467456 for (itSend = itbSend; itSend != iteSend; ++itSend) sendBuffSize += (itSend->second).size(); 
     
    486475     { 
    487476       int index = std::distance(itbArr, itArr); 
    488        sendBuff[idx+currentBuffPosition] = (*globalIndexOfOriginalGridSource_)(index); 
     477       sendBuff[idx+currentBuffPosition] = globalIndexOfOriginalGridSource_(index); 
    489478     } 
    490479   } 
     
    525514 } 
    526515 
    527  if (globalIndexOfCurrentGridSource_->numElements() != nbCurrentGridSource) 
     516 if (globalIndexOfCurrentGridSource_.numElements() != nbCurrentGridSource) 
    528517 { 
    529    delete globalIndexOfCurrentGridSource_; 
    530    globalIndexOfCurrentGridSource_ = new CArray<size_t,1>(nbCurrentGridSource); 
    531    delete globalIndexOfOriginalGridSource_; 
    532    globalIndexOfOriginalGridSource_ = new CArray<size_t,1>(nbCurrentGridSource); 
    533    delete weightOfGlobalIndexOfOriginalGridSource_; 
    534    weightOfGlobalIndexOfOriginalGridSource_ = new CArray<double,1>(nbCurrentGridSource); 
     518   globalIndexOfCurrentGridSource_.resize(nbCurrentGridSource); 
     519   globalIndexOfOriginalGridSource_.resize(nbCurrentGridSource); 
     520   weightOfGlobalIndexOfOriginalGridSource_.resize(nbCurrentGridSource); 
    535521 } 
    536522 
     
    545531     for (int i = 0; i < ssize; ++i) 
    546532     { 
    547        (*globalIndexOfCurrentGridSource_)(k) = ((itRecv->second)[idx][i]).first; 
    548        (*weightOfGlobalIndexOfOriginalGridSource_)(k) = ((itRecv->second)[idx][i]).second; 
    549        (*globalIndexOfOriginalGridSource_)(k) = *currentRecvBuff; 
     533       globalIndexOfCurrentGridSource_(k) = ((itRecv->second)[idx][i]).first; 
     534       weightOfGlobalIndexOfOriginalGridSource_(k) = ((itRecv->second)[idx][i]).second; 
     535       globalIndexOfOriginalGridSource_(k) = *currentRecvBuff; 
    550536       ++k; 
    551537     } 
     
    569555{ 
    570556  CContext* context = CContext::getCurrent(); 
    571   CContextClient* client=context->client; 
     557  CContextClient* client = context->client; 
    572558 
    573559  CTransformationMapping transformationMap(gridDestination_, originalGridSource_); 
    574560 
    575561  std::map<size_t, std::vector<std::pair<size_t,double> > > globaIndexWeightFromDestToSource; 
    576   int nb = globalIndexOfCurrentGridSource_->numElements(); 
     562  int nb = globalIndexOfCurrentGridSource_.numElements(); 
    577563  const size_t sfmax = NumTraits<unsigned long>::sfmax(); 
    578564  for (int idx = 0; idx < nb; ++idx) 
    579565  { 
    580     if (sfmax != (*globalIndexOfOriginalGridSource_)(idx)) 
    581       globaIndexWeightFromDestToSource[(*globalIndexOfCurrentGridSource_)(idx)].push_back(make_pair((*globalIndexOfOriginalGridSource_)(idx),(*weightOfGlobalIndexOfOriginalGridSource_)(idx))) ; 
     566    if (sfmax != globalIndexOfOriginalGridSource_(idx)) 
     567      globaIndexWeightFromDestToSource[globalIndexOfCurrentGridSource_(idx)].push_back(make_pair(globalIndexOfOriginalGridSource_(idx), weightOfGlobalIndexOfOriginalGridSource_(idx))) ; 
    582568  } 
    583569 
     
    638624  for (itMap = itbMap; itMap != iteMap; ++itMap) 
    639625  { 
    640     CArray<int,1>* ptr = new CArray<int,1>((itMap->second).size()); 
    641     localIndexToSendFromGridSource_[itMap->first] = ptr; 
    642626    int destRank = itMap->first; 
    643     int vecSize = (itMap->second).size(); 
     627    int vecSize = itMap->second.size(); 
     628    localIndexToSendFromGridSource_[destRank].resize(vecSize); 
    644629    for (int idx = 0; idx < vecSize; ++idx) 
    645630    { 
    646       itArr = std::find(itbArr, iteArr, (itMap->second)[idx]); 
     631      itArr = std::find(itbArr, iteArr, itMap->second[idx]); 
    647632      if (iteArr != itArr) 
    648633      { 
    649634        int localIdx = std::distance(itbArr, itArr); 
    650         (*localIndexToSendFromGridSource_[destRank])(idx) = (localIdx); 
     635        localIndexToSendFromGridSource_[destRank](idx) = localIdx; 
    651636      } 
    652637    } 
     
    658643  \return local index of data 
    659644*/ 
    660 const std::map<int, CArray<int,1>* >& CGridTransformation::getLocalIndexToSendFromGridSource() const 
     645const std::map<int, CArray<int,1> >& CGridTransformation::getLocalIndexToSendFromGridSource() const 
    661646{ 
    662647  return localIndexToSendFromGridSource_; 
Note: See TracChangeset for help on using the changeset viewer.