Changeset 745


Ignore:
Timestamp:
10/21/15 11:50:10 (5 years ago)
Author:
rlacroix
Message:

Grid: Don't recreate a temporary grid if an existing temporary grid can be reused.

Location:
XIOS/trunk/src/node
Files:
3 edited

Legend:

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

    r744 r745  
    790790        } 
    791791 
    792         this->grid = CGrid::createGrid(vecDom, vecAxis); 
     792        // Warning: the gridId shouldn't be set as the grid_ref since it could be inherited 
     793        StdString gridId = CGrid::generateId(vecDom, vecAxis); 
     794        if (CGrid::has(gridId)) 
     795          this->grid = CGrid::get(gridId); 
     796        else 
     797          this->grid = CGrid::createGrid(gridId, vecDom, vecAxis); 
    793798      } 
    794799      else 
  • XIOS/trunk/src/node/grid.cpp

    r742 r745  
    453453   CGrid* CGrid::createGrid(CDomain* domain) 
    454454   { 
    455       std::vector<CDomain*> vecDom(1,domain); 
     455      std::vector<CDomain*> vecDom(1, domain); 
    456456      std::vector<CAxis*> vecAxis; 
    457       CArray<bool,1> axisDomainOrder; 
    458       CGrid* grid = createGrid(vecDom, vecAxis, axisDomainOrder); 
    459  
    460       return grid; 
     457 
     458      return createGrid(vecDom, vecAxis); 
    461459   } 
    462460 
    463461   CGrid* CGrid::createGrid(CDomain* domain, CAxis* axis) 
    464462   { 
    465       std::vector<CDomain*> vecDom(1,domain); 
    466       std::vector<CAxis*> vecAxis(1,axis); 
    467       CArray<bool,1> axisDomainOrder; 
    468       CGrid* grid = createGrid(vecDom, vecAxis, axisDomainOrder); 
    469  
    470       return grid; 
    471    } 
    472  
    473    CGrid* CGrid::createGrid(std::vector<CDomain*> domains, std::vector<CAxis*> axis, CArray<bool,1> axisDomainOrder) 
    474    { 
    475       StdString new_id = StdString("__"); 
    476       if (!domains.empty()) for (int i = 0; i < domains.size(); ++i) new_id += domains[i]->getId() + StdString("_"); 
    477       if (!axis.empty()) for (int i = 0; i < axis.size(); ++i) new_id += axis[i]->getId() + StdString("_"); 
    478       if (domains.empty() && axis.empty()) new_id += StdString("scalar_grid"); 
    479       new_id += StdString("_"); 
    480  
    481       CGrid* grid = CGridGroup::get("grid_definition")->createChild(new_id); 
     463      std::vector<CDomain*> vecDom(1, domain); 
     464      std::vector<CAxis*> vecAxis(1, axis); 
     465 
     466      return createGrid(vecDom, vecAxis); 
     467   } 
     468 
     469   CGrid* CGrid::createGrid(const std::vector<CDomain*>& domains, const std::vector<CAxis*>& axis, 
     470                            const CArray<bool,1>& axisDomainOrder) 
     471   { 
     472      return createGrid(generateId(domains, axis, axisDomainOrder), domains, axis, axisDomainOrder); 
     473   } 
     474 
     475   CGrid* CGrid::createGrid(StdString id, const std::vector<CDomain*>& domains, const std::vector<CAxis*>& axis, 
     476                            const CArray<bool,1>& axisDomainOrder) 
     477   { 
     478      if (axisDomainOrder.numElements() > 0 && axisDomainOrder.numElements() != (domains.size() + axis.size())) 
     479        ERROR("CGrid* CGrid::createGrid(...)", 
     480              << "The size of axisDomainOrder (" << axisDomainOrder.numElements() 
     481              << ") is not coherent with the number of elements (" << domains.size() + axis.size() <<")."); 
     482 
     483      CGrid* grid = CGridGroup::get("grid_definition")->createChild(id); 
    482484      grid->setDomainList(domains); 
    483485      grid->setAxisList(axis); 
    484486 
    485       //By default, domains are always the first ones of a grid 
     487      // By default, domains are always the first elements of a grid 
    486488      if (0 == axisDomainOrder.numElements()) 
    487489      { 
    488         int size = domains.size()+axis.size(); 
     490        int size = domains.size() + axis.size(); 
    489491        grid->axis_domain_order.resize(size); 
    490492        for (int i = 0; i < size; ++i) 
     
    500502      } 
    501503 
    502  
    503504      grid->solveDomainAxisRefInheritance(true); 
    504505 
    505506      return grid; 
    506507   } 
     508 
     509   StdString CGrid::generateId(const std::vector<CDomain*>& domains, const std::vector<CAxis*>& axis, 
     510                               const CArray<bool,1>& axisDomainOrder) 
     511   { 
     512      if (axisDomainOrder.numElements() > 0 && axisDomainOrder.numElements() != (domains.size() + axis.size())) 
     513        ERROR("CGrid* CGrid::generateId(...)", 
     514              << "The size of axisDomainOrder (" << axisDomainOrder.numElements() 
     515              << ") is not coherent with the number of elements (" << domains.size() + axis.size() <<")."); 
     516 
     517      std::ostringstream id; 
     518 
     519      if (domains.empty() && axis.empty()) 
     520        id << "__scalar_grid__"; 
     521      else 
     522      { 
     523        id << "__grid"; 
     524 
     525        if (0 == axisDomainOrder.numElements()) 
     526        { 
     527          for (size_t i = 0; i < domains.size(); ++i) id << "_" << domains[i]->getId(); 
     528          for (size_t i = 0; i < axis.size(); ++i) id << "_" << axis[i]->getId(); 
     529        } 
     530        else 
     531        { 
     532          size_t iDomain = 0, iAxis = 0; 
     533          for (size_t i = 0; i < axisDomainOrder.numElements(); ++i) 
     534          { 
     535            if (axisDomainOrder(i)) 
     536              id << "_" << domains[iDomain++]->getId(); 
     537            else 
     538              id << "_" << axis[iAxis++]->getId(); 
     539          } 
     540        } 
     541 
     542        id << "__"; 
     543      } 
     544 
     545      return id.str(); 
     546   } 
     547 
     548   //---------------------------------------------------------------- 
    507549 
    508550   CDomainGroup* CGrid::getVirtualDomainGroup() const 
  • XIOS/trunk/src/node/grid.hpp

    r742 r745  
    121121         static CGrid* createGrid(CDomain* domain); 
    122122         static CGrid* createGrid(CDomain* domain, CAxis* axis); 
    123          static CGrid* createGrid(std::vector<CDomain*> domains, std::vector<CAxis*> axis, CArray<bool,1> axisDomainOrder = CArray<bool,1>()); 
     123         static CGrid* createGrid(const std::vector<CDomain*>& domains, const std::vector<CAxis*>& axis, 
     124                                  const CArray<bool,1>& axisDomainOrder = CArray<bool,1>()); 
     125         static CGrid* createGrid(StdString id, const std::vector<CDomain*>& domains, const std::vector<CAxis*>& axis, 
     126                                  const CArray<bool,1>& axisDomainOrder = CArray<bool,1>()); 
     127         static StdString generateId(const std::vector<CDomain*>& domains, const std::vector<CAxis*>& axis, 
     128                                     const CArray<bool,1>& axisDomainOrder = CArray<bool,1>()); 
    124129 
    125130      public: 
Note: See TracChangeset for help on using the changeset viewer.