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

Field: Avoid some heap allocations.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/node/file.cpp

    r645 r651  
    2525      , vFieldGroup(), data_out(), enabledFields(), fileComm(MPI_COMM_NULL) 
    2626   { 
    27      setVirtualFieldGroup() ; 
    28      setVirtualVariableGroup() ; 
     27     setVirtualFieldGroup(); 
     28     setVirtualVariableGroup(); 
    2929   } 
    3030 
     
    3333      , vFieldGroup(), data_out(), enabledFields(), fileComm(MPI_COMM_NULL) 
    3434    { 
    35       setVirtualFieldGroup() ; 
    36       setVirtualVariableGroup() ; 
     35      setVirtualFieldGroup(); 
     36      setVirtualVariableGroup(); 
    3737    } 
    3838 
     
    129129      std::vector<CField*> newEnabledFields; 
    130130 
    131       for ( it = this->enabledFields.begin() ; it != this->enabledFields.end(); it++ ) 
     131      for ( it = this->enabledFields.begin(); it != this->enabledFields.end(); it++ ) 
    132132      { 
    133133         if (!(*it)->enabled.isEmpty()) // Si l'attribut 'enabled' est défini ... 
     
    138138         else // Si l'attribut 'enabled' n'est pas défini ... 
    139139         { 
    140             if (!default_enabled) continue ; 
     140            if (!default_enabled) continue; 
    141141//            { it--; this->enabledFields.erase(it+1); continue; } 
    142142         } 
     
    144144         if (!(*it)->level.isEmpty()) // Si l'attribut 'level' est défini ... 
    145145         { 
    146             if ((*it)->level.getValue() > _outputlevel) continue ; 
     146            if ((*it)->level.getValue() > _outputlevel) continue; 
    147147//            { it--; this->enabledFields.erase(it+1); continue; } 
    148148         } 
    149149         else // Si l'attribut 'level' n'est pas défini ... 
    150150         { 
    151             if (default_level > _outputlevel) continue ; 
     151            if (default_level > _outputlevel) continue; 
    152152//            { it--; this->enabledFields.erase(it+1); continue; } 
    153153         } 
    154154 
    155 //         CField* field_tmp=(*it).get() ; 
    156 //         shared_ptr<CField> sptfield=*it ; 
    157 //         field_tmp->refObject.push_back(sptfield) ; 
    158          newEnabledFields.push_back(*it) ; 
     155//         CField* field_tmp=(*it).get(); 
     156//         shared_ptr<CField> sptfield=*it; 
     157//         field_tmp->refObject.push_back(sptfield); 
     158         newEnabledFields.push_back(*it); 
    159159         // Le champ est finalement actif, on y ajoute sa propre reference. 
    160160//         (*it)->refObject.push_back(*it); 
     
    164164         // A faire, ajouter les references intermediaires... 
    165165      } 
    166       enabledFields=newEnabledFields ; 
     166      enabledFields = newEnabledFields; 
    167167 
    168168      return (this->enabledFields); 
     
    198198   bool CFile::isSyncTime(void) 
    199199   { 
    200      CContext* context = CContext::getCurrent() ; 
    201      const CDate& currentDate = context->calendar->getCurrentDate() ; 
     200     CContext* context = CContext::getCurrent(); 
     201     const CDate& currentDate = context->calendar->getCurrentDate(); 
    202202     if (!sync_freq.isEmpty()) 
    203203     { 
    204        if (*lastSync + sync_freq.getValue() < currentDate) 
     204       if (lastSync + sync_freq.getValue() < currentDate) 
    205205       { 
    206          *lastSync=currentDate ; 
    207          return true ; 
     206         lastSync = currentDate; 
     207         return true; 
    208208        } 
    209209      } 
    210       return false ; 
     210      return false; 
    211211    } 
    212212 
     
    214214   void CFile::initFile(void) 
    215215   { 
    216       CContext* context = CContext::getCurrent() ; 
    217       const CDate& currentDate = context->calendar->getCurrentDate() ; 
    218       CContextServer* server=context->server ; 
    219  
    220       lastSync=new CDate(currentDate) ; 
    221       lastSplit=new CDate(currentDate) ; 
    222       isOpen=false ; 
    223  
    224       allDomainEmpty=true ; 
     216      CContext* context = CContext::getCurrent(); 
     217      const CDate& currentDate = context->calendar->getCurrentDate(); 
     218      CContextServer* server = context->server; 
     219 
     220      lastSync  = currentDate; 
     221      lastSplit = currentDate; 
     222      isOpen = false; 
     223 
     224      allDomainEmpty = true; 
    225225 
    226226      set<CAxis*> setAxis; 
     
    243243 
    244244      // create sub communicator for file 
    245       int color=allDomainEmpty?0:1 ; 
    246       MPI_Comm_split(server->intraComm,color,server->intraCommRank,&fileComm) ; 
    247       if (allDomainEmpty) MPI_Comm_free(&fileComm) ; 
    248       // 
    249  
     245      int color = allDomainEmpty ? 0 : 1; 
     246      MPI_Comm_split(server->intraComm, color, server->intraCommRank, &fileComm); 
     247      if (allDomainEmpty) MPI_Comm_free(&fileComm); 
    250248    } 
    251249 
     
    273271   bool CFile::checkSync(void) 
    274272   { 
    275      CContext* context = CContext::getCurrent() ; 
    276      const CDate& currentDate = context->calendar->getCurrentDate() ; 
     273     CContext* context = CContext::getCurrent(); 
     274     const CDate& currentDate = context->calendar->getCurrentDate(); 
    277275     if (!sync_freq.isEmpty()) 
    278276     { 
    279        if (*lastSync + sync_freq.getValue() <= currentDate) 
     277       if (lastSync + sync_freq.getValue() <= currentDate) 
    280278       { 
    281          *lastSync=currentDate ; 
    282          data_out->syncFile() ; 
    283          return true ; 
     279         lastSync = currentDate; 
     280         data_out->syncFile(); 
     281         return true; 
    284282        } 
    285283      } 
    286       return false ; 
     284      return false; 
    287285    } 
    288286 
     
    295293    bool CFile::checkSplit(void) 
    296294    { 
    297       CContext* context = CContext::getCurrent() ; 
    298       const CDate& currentDate = context->calendar->getCurrentDate() ; 
     295      CContext* context = CContext::getCurrent(); 
     296      const CDate& currentDate = context->calendar->getCurrentDate(); 
    299297      if (!split_freq.isEmpty()) 
    300298      { 
    301         if (currentDate > *lastSplit + split_freq.getValue()) 
     299        if (currentDate > lastSplit + split_freq.getValue()) 
    302300        { 
    303           *lastSplit = *lastSplit + split_freq.getValue(); 
     301          lastSplit = lastSplit + split_freq.getValue(); 
    304302          std::vector<CField*>::iterator it, end = this->enabledFields.end(); 
    305303          for (it = this->enabledFields.begin(); it != end; it++) 
     
    309307          } 
    310308          if (mode.isEmpty() || mode.getValue() == mode_attr::write) 
    311             createHeader() ; 
     309            createHeader(); 
    312310          else 
    313311            openInReadMode(); 
    314           return true ; 
     312          return true; 
    315313        } 
    316314      } 
    317       return false ; 
     315      return false; 
    318316    } 
    319317 
     
    324322   void CFile::createHeader(void) 
    325323   { 
    326       CContext* context = CContext::getCurrent() ; 
    327       CContextServer* server=context->server ; 
     324      CContext* context = CContext::getCurrent(); 
     325      CContextServer* server = context->server; 
    328326 
    329327      if (!allDomainEmpty) 
     
    336334         if (!split_freq.isEmpty()) 
    337335         { 
    338            string splitFormat ; 
     336           string splitFormat; 
    339337           if (split_freq_format.isEmpty()) 
    340338           { 
     
    346344             else splitFormat = "%y"; 
    347345           } 
    348            else splitFormat=split_freq_format ; 
    349            oss << "_" << lastSplit->getStr(splitFormat) 
    350                << "-" << (*lastSplit + split_freq.getValue() - 1 * Second).getStr(splitFormat); 
     346           else splitFormat = split_freq_format; 
     347           oss << "_" << lastSplit.getStr(splitFormat) 
     348               << "-" << (lastSplit + split_freq.getValue() - 1 * Second).getStr(splitFormat); 
    351349         } 
    352350 
     
    355353         bool useClassicFormat = !format.isEmpty() && format == format_attr::netcdf4_classic; 
    356354 
    357          bool multifile=true ; 
     355         bool multifile = true; 
    358356         if (!type.isEmpty()) 
    359357         { 
    360            if (type==type_attr::one_file) multifile=false ; 
    361            else if (type==type_attr::multiple_file) multifile=true ; 
     358           if (type == type_attr::one_file) multifile = false; 
     359           else if (type == type_attr::multiple_file) multifile = true; 
    362360 
    363361         } 
     
    365363         if (!multifile) 
    366364         { 
    367             info(0)<<"!!! Warning -> Using non parallel version of netcdf, switching in multiple_file mode for file : "<<filename<<" ..."<<endl ; 
    368             multifile=true ; 
     365            info(0) << "!!! Warning -> Using non parallel version of netcdf, switching in multiple_file mode for file : " << filename << " ..." << endl; 
     366            multifile = true; 
    369367          } 
    370368#endif 
    371369         if (multifile) 
    372370         { 
    373             int commSize, commRank ; 
    374             MPI_Comm_size(fileComm,&commSize) ; 
    375             MPI_Comm_rank(fileComm,&commRank) ; 
     371            int commSize, commRank; 
     372            MPI_Comm_size(fileComm, &commSize); 
     373            MPI_Comm_rank(fileComm, &commRank); 
    376374 
    377375            if (server->intraCommSize > 1) 
    378376            { 
    379               oss << "_"  ; 
    380               int width=0 ; int n=commSize-1 ; 
    381               while(n != 0) { n=n/10 ; width++ ;} 
     377              oss << "_" ; 
     378              int width=0; int n = commSize-1; 
     379              while (n != 0) { n = n / 10; width++;} 
    382380              if (!min_digits.isEmpty()) 
    383                 if (width<min_digits) width=min_digits ; 
    384               oss.width(width) ; 
    385               oss.fill('0') ; 
    386               oss<<right<< commRank; 
     381                if (width < min_digits) width = min_digits; 
     382              oss.width(width); 
     383              oss.fill('0'); 
     384              oss << right << commRank; 
    387385            } 
    388386         } 
     
    416414          } 
    417415 
    418           vector<CVariable*> listVars = getAllVariables() ; 
     416          vector<CVariable*> listVars = getAllVariables(); 
    419417          for (vector<CVariable*>::iterator it = listVars.begin(); it != listVars.end(); it++) 
    420418            this->data_out->writeAttribute(*it); 
     
    431429  { 
    432430    CContext* context = CContext::getCurrent(); 
    433     CContextServer* server=context->server; 
     431    CContextServer* server = context->server; 
    434432 
    435433    if (!allDomainEmpty) 
     
    452450          else splitFormat = "%y"; 
    453451        } 
    454         else splitFormat=split_freq_format; 
    455         oss << "_" << lastSplit->getStr(splitFormat) 
    456         << "-" << (*lastSplit + split_freq.getValue() - 1 * Second).getStr(splitFormat); 
     452        else splitFormat = split_freq_format; 
     453        oss << "_" << lastSplit.getStr(splitFormat) 
     454        << "-" << (lastSplit + split_freq.getValue() - 1 * Second).getStr(splitFormat); 
    457455      } 
    458456 
     
    478476        if (server->intraCommSize > 1) 
    479477        { 
    480           oss << "_" ; 
     478          oss << "_"; 
    481479          int width = 0, n = commSize - 1; 
    482480          while (n != 0) { n = n / 10; width++; } 
     
    502500   void CFile::close(void) 
    503501   { 
    504      delete lastSync ; 
    505      delete lastSplit ; 
    506502     if (!allDomainEmpty) 
    507503       if (isOpen) 
     
    512508          this->data_in->closeFile(); 
    513509       } 
    514       if (fileComm != MPI_COMM_NULL) MPI_Comm_free(&fileComm) ; 
     510      if (fileComm != MPI_COMM_NULL) MPI_Comm_free(&fileComm); 
    515511   } 
    516512   //---------------------------------------------------------------- 
     
    530526           if (node.getElementName()=="field" || node.getElementName()=="field_group") this->getVirtualFieldGroup()->parseChild(node); 
    531527           else if (node.getElementName()=="variable" || node.getElementName()=="variable_group") this->getVirtualVariableGroup()->parseChild(node); 
    532         } while (node.goToNextElement()) ; 
     528        } while (node.goToNextElement()); 
    533529        node.goToParentElement(); 
    534530      } 
     
    649645   CField* CFile::addField(const string& id) 
    650646   { 
    651      return vFieldGroup->createChild(id) ; 
     647     return vFieldGroup->createChild(id); 
    652648   } 
    653649 
     
    661657   CFieldGroup* CFile::addFieldGroup(const string& id) 
    662658   { 
    663      return vFieldGroup->createChildGroup(id) ; 
     659     return vFieldGroup->createChildGroup(id); 
    664660   } 
    665661 
     
    676672   CVariable* CFile::addVariable(const string& id) 
    677673   { 
    678      return vVariableGroup->createChild(id) ; 
     674     return vVariableGroup->createChild(id); 
    679675   } 
    680676 
     
    688684   CVariableGroup* CFile::addVariableGroup(const string& id) 
    689685   { 
    690      return vVariableGroup->createChildGroup(id) ; 
     686     return vVariableGroup->createChildGroup(id); 
    691687   } 
    692688 
     
    697693   void CFile::sendAddField(const string& id) 
    698694   { 
    699     CContext* context=CContext::getCurrent() ; 
     695    CContext* context = CContext::getCurrent(); 
    700696 
    701697    if (! context->hasServer ) 
    702698    { 
    703        CContextClient* client=context->client ; 
    704  
    705        CEventClient event(this->getType(),EVENT_ID_ADD_FIELD) ; 
     699       CContextClient* client = context->client; 
     700 
     701       CEventClient event(this->getType(),EVENT_ID_ADD_FIELD); 
    706702       if (client->isServerLeader()) 
    707703       { 
    708          CMessage msg ; 
    709          msg<<this->getId() ; 
    710          msg<<id ; 
     704         CMessage msg; 
     705         msg << this->getId(); 
     706         msg << id; 
    711707         const std::list<int>& ranks = client->getRanksServerLeader(); 
    712708         for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 
    713709           event.push(*itRank,1,msg); 
    714          client->sendEvent(event) ; 
     710         client->sendEvent(event); 
    715711       } 
    716        else client->sendEvent(event) ; 
     712       else client->sendEvent(event); 
    717713    } 
    718714 
     
    725721   void CFile::sendAddFieldGroup(const string& id) 
    726722   { 
    727     CContext* context=CContext::getCurrent() ; 
     723    CContext* context = CContext::getCurrent(); 
    728724    if (! context->hasServer ) 
    729725    { 
    730        CContextClient* client=context->client ; 
    731  
    732        CEventClient event(this->getType(),EVENT_ID_ADD_FIELD_GROUP) ; 
     726       CContextClient* client = context->client; 
     727 
     728       CEventClient event(this->getType(),EVENT_ID_ADD_FIELD_GROUP); 
    733729       if (client->isServerLeader()) 
    734730       { 
    735          CMessage msg ; 
    736          msg<<this->getId() ; 
    737          msg<<id ; 
     731         CMessage msg; 
     732         msg << this->getId(); 
     733         msg << id; 
    738734         const std::list<int>& ranks = client->getRanksServerLeader(); 
    739735         for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 
    740736           event.push(*itRank,1,msg); 
    741          client->sendEvent(event) ; 
     737         client->sendEvent(event); 
    742738       } 
    743        else client->sendEvent(event) ; 
     739       else client->sendEvent(event); 
    744740    } 
    745741 
     
    753749   { 
    754750 
    755       CBufferIn* buffer=event.subEvents.begin()->buffer; 
     751      CBufferIn* buffer = event.subEvents.begin()->buffer; 
    756752      string id; 
    757       *buffer>>id ; 
    758       get(id)->recvAddField(*buffer) ; 
     753      *buffer>>id; 
     754      get(id)->recvAddField(*buffer); 
    759755   } 
    760756 
     
    765761   void CFile::recvAddField(CBufferIn& buffer) 
    766762   { 
    767       string id ; 
    768       buffer>>id ; 
    769       addField(id) ; 
     763      string id; 
     764      buffer>>id; 
     765      addField(id); 
    770766   } 
    771767 
     
    777773   { 
    778774 
    779       CBufferIn* buffer=event.subEvents.begin()->buffer; 
     775      CBufferIn* buffer = event.subEvents.begin()->buffer; 
    780776      string id; 
    781       *buffer>>id ; 
    782       get(id)->recvAddFieldGroup(*buffer) ; 
     777      *buffer>>id; 
     778      get(id)->recvAddFieldGroup(*buffer); 
    783779   } 
    784780 
     
    789785   void CFile::recvAddFieldGroup(CBufferIn& buffer) 
    790786   { 
    791       string id ; 
    792       buffer>>id ; 
    793       addFieldGroup(id) ; 
     787      string id; 
     788      buffer>>id; 
     789      addFieldGroup(id); 
    794790   } 
    795791 
     
    828824   void CFile::sendAddVariable(const string& id) 
    829825   { 
    830     CContext* context=CContext::getCurrent() ; 
     826    CContext* context = CContext::getCurrent(); 
    831827 
    832828    if (! context->hasServer ) 
    833829    { 
    834        CContextClient* client=context->client ; 
    835  
    836        CEventClient event(this->getType(),EVENT_ID_ADD_VARIABLE) ; 
     830       CContextClient* client = context->client; 
     831 
     832       CEventClient event(this->getType(),EVENT_ID_ADD_VARIABLE); 
    837833       if (client->isServerLeader()) 
    838834       { 
    839          CMessage msg ; 
    840          msg<<this->getId() ; 
    841          msg<<id ; 
     835         CMessage msg; 
     836         msg << this->getId(); 
     837         msg << id; 
    842838         const std::list<int>& ranks = client->getRanksServerLeader(); 
    843839         for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 
    844840           event.push(*itRank,1,msg); 
    845          client->sendEvent(event) ; 
     841         client->sendEvent(event); 
    846842       } 
    847        else client->sendEvent(event) ; 
     843       else client->sendEvent(event); 
    848844    } 
    849845 
     
    856852   void CFile::sendAddVariableGroup(const string& id) 
    857853   { 
    858     CContext* context=CContext::getCurrent() ; 
     854    CContext* context = CContext::getCurrent(); 
    859855    if (! context->hasServer ) 
    860856    { 
    861        CContextClient* client=context->client ; 
    862  
    863        CEventClient event(this->getType(),EVENT_ID_ADD_VARIABLE_GROUP) ; 
     857       CContextClient* client = context->client; 
     858 
     859       CEventClient event(this->getType(),EVENT_ID_ADD_VARIABLE_GROUP); 
    864860       if (client->isServerLeader()) 
    865861       { 
    866          CMessage msg ; 
    867          msg<<this->getId() ; 
    868          msg<<id ; 
     862         CMessage msg; 
     863         msg << this->getId(); 
     864         msg << id; 
    869865         const std::list<int>& ranks = client->getRanksServerLeader(); 
    870866         for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 
    871867           event.push(*itRank,1,msg); 
    872          client->sendEvent(event) ; 
     868         client->sendEvent(event); 
    873869       } 
    874        else client->sendEvent(event) ; 
     870       else client->sendEvent(event); 
    875871    } 
    876872 
     
    884880   { 
    885881 
    886       CBufferIn* buffer=event.subEvents.begin()->buffer; 
     882      CBufferIn* buffer = event.subEvents.begin()->buffer; 
    887883      string id; 
    888       *buffer>>id ; 
    889       get(id)->recvAddVariable(*buffer) ; 
     884      *buffer>>id; 
     885      get(id)->recvAddVariable(*buffer); 
    890886   } 
    891887 
     
    896892   void CFile::recvAddVariable(CBufferIn& buffer) 
    897893   { 
    898       string id ; 
    899       buffer>>id ; 
    900       addVariable(id) ; 
     894      string id; 
     895      buffer>>id; 
     896      addVariable(id); 
    901897   } 
    902898 
     
    908904   { 
    909905 
    910       CBufferIn* buffer=event.subEvents.begin()->buffer; 
     906      CBufferIn* buffer = event.subEvents.begin()->buffer; 
    911907      string id; 
    912       *buffer>>id ; 
    913       get(id)->recvAddVariableGroup(*buffer) ; 
     908      *buffer>>id; 
     909      get(id)->recvAddVariableGroup(*buffer); 
    914910   } 
    915911 
     
    920916   void CFile::recvAddVariableGroup(CBufferIn& buffer) 
    921917   { 
    922       string id ; 
    923       buffer>>id ; 
    924       addVariableGroup(id) ; 
     918      string id; 
     919      buffer>>id; 
     920      addVariableGroup(id); 
    925921   } 
    926922 
     
    955951   bool CFile::dispatchEvent(CEventServer& event) 
    956952   { 
    957       if (SuperClass::dispatchEvent(event)) return true ; 
     953      if (SuperClass::dispatchEvent(event)) return true; 
    958954      else 
    959955      { 
     
    961957        { 
    962958           case EVENT_ID_ADD_FIELD : 
    963              recvAddField(event) ; 
    964              return true ; 
    965              break ; 
     959             recvAddField(event); 
     960             return true; 
     961             break; 
    966962 
    967963           case EVENT_ID_ADD_FIELD_GROUP : 
    968              recvAddFieldGroup(event) ; 
    969              return true ; 
    970              break ; 
     964             recvAddFieldGroup(event); 
     965             return true; 
     966             break; 
    971967 
    972968            case EVENT_ID_ADD_VARIABLE : 
    973              recvAddVariable(event) ; 
    974              return true ; 
    975              break ; 
     969             recvAddVariable(event); 
     970             return true; 
     971             break; 
    976972 
    977973           case EVENT_ID_ADD_VARIABLE_GROUP : 
    978              recvAddVariableGroup(event) ; 
    979              return true ; 
    980              break ; 
     974             recvAddVariableGroup(event); 
     975             return true; 
     976             break; 
    981977           default : 
    982               ERROR("bool CFile::dispatchEvent(CEventServer& event)", <<"Unknown Event") ; 
    983            return false ; 
     978              ERROR("bool CFile::dispatchEvent(CEventServer& event)", << "Unknown Event"); 
     979           return false; 
    984980        } 
    985981      } 
Note: See TracChangeset for help on using the changeset viewer.