Ignore:
Timestamp:
12/16/14 12:55:53 (9 years ago)
Author:
mhnguyen
Message:

Reorganizing structure of grid

+) Grid doesn't have domain_ref and axis_ref anymore.
All domain and axis of a grid must be inside grid (These domain and axis can be defined or refer to others)
+) Grid contains list of domain and axis
+) Reorder some functions to make sure new functionlities work

Test
+) On Curie
+) Mode attached and detached
+) Only test_new_features
+) Passed

File:
1 edited

Legend:

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

    r518 r540  
    2121      , withAxis(false), isChecked(false), isDomainAxisChecked(false), axis(), domain() 
    2222      , storeIndex(1), out_i_index(1), out_j_index(1), out_l_index(1), isDomConServerComputed_(false) 
    23    { /* Ne rien faire de plus */ } 
     23      , vDomainGroup_(), vAxisGroup_(), axisOrder_(), axisList_(), isAxisListSet(false), isDomListSet(false) 
     24   { 
     25     setVirtualDomainGroup(); 
     26     setVirtualAxisGroup(); 
     27   } 
    2428 
    2529   CGrid::CGrid(const StdString & id) 
     
    2731      , withAxis(false), isChecked(false), isDomainAxisChecked(false), axis(), domain() 
    2832      , storeIndex(1), out_i_index(1), out_j_index(1), out_l_index(1), isDomConServerComputed_(false) 
    29    { /* Ne rien faire de plus */ } 
     33      , vDomainGroup_(), vAxisGroup_(), axisOrder_(), axisList_(), isAxisListSet(false), isDomListSet(false) 
     34   { 
     35     setVirtualDomainGroup(); 
     36     setVirtualAxisGroup(); 
     37   } 
    3038 
    3139   CGrid::~CGrid(void) 
     
    317325   void CGrid::solveDomainRef(bool sendAtt) 
    318326   { 
    319       if (!domain_ref.isEmpty()) 
    320       { 
    321          if (CDomain::has(domain_ref.getValue())) 
    322          { 
    323             this->domain = CDomain::get(domain_ref.getValue()) ; 
    324             if (sendAtt) domain->sendCheckedAttributes(); 
    325             else domain->checkAttributesOnClient() ; 
    326          } 
    327          else ERROR("CGrid::solveDomainRef(void)", 
    328                      << "Wrong domain reference") ; 
     327//      if (!domain_ref.isEmpty()) 
     328//      { 
     329//         if (CDomain::has(domain_ref.getValue())) 
     330//         { 
     331//            this->domain = CDomain::get(domain_ref.getValue()) ; 
     332//            if (sendAtt) domain->sendCheckedAttributes(); 
     333//            else domain->checkAttributesOnClient() ; 
     334//         } 
     335//         else ERROR("CGrid::solveDomainRef(void)", 
     336//                     << "Wrong domain reference") ; 
     337//      } 
     338//      else ERROR("CGrid::solveDomainRef(void)", 
     339//                  << "Domain reference is not defined") ; 
     340      setDomainList(); 
     341      this->domain = CDomain::get(domList_.at(0)); 
     342      if (0 != this->domain) 
     343      { 
     344//        this->domain = this->getDomain(); 
     345        if (sendAtt) domain->sendCheckedAttributes(); 
     346        else domain->checkAttributesOnClient() ; 
    329347      } 
    330348      else ERROR("CGrid::solveDomainRef(void)", 
     
    336354   void CGrid::solveAxisRef(bool checkAtt) 
    337355   { 
    338       if (!axis_ref.isEmpty()) 
    339       { 
    340          this->withAxis = true ; 
    341          if (CAxis::get(axis_ref.getValue())) 
    342          { 
    343             this->axis = CAxis::get(axis_ref.getValue()) ; 
    344             axis->checkAttributes() ; 
    345          } 
    346          else ERROR("CGrid::solveAxisRef(void)", 
    347                     << "Wrong axis reference") ; 
    348       } 
     356//      if (!axis_ref.isEmpty()) 
     357//      { 
     358//         this->withAxis = true ; 
     359//         if (CAxis::get(axis_ref.getValue())) 
     360//         { 
     361//            this->axis = CAxis::get(axis_ref.getValue()) ; 
     362//            axis->checkAttributes() ; 
     363//         } 
     364//         else ERROR("CGrid::solveAxisRef(void)", 
     365//                    << "Wrong axis reference") ; 
     366//      } 
     367//      else withAxis = false ; 
     368//      getAllAxis(); 
     369      setAxisList(); 
     370      if (!axisList_.empty()) 
     371      { 
     372        int sizeList = axisList_.size(); 
     373        for (int i = 0; i < sizeList; ++i) 
     374        { 
     375          CAxis::get(axisList_.at(i))->checkAttributes(); 
     376          this->axis = CAxis::get(axisList_.at(i)); 
     377        } 
     378        withAxis = true; 
     379 
     380      } 
     381//      if (!axis_ref.isEmpty()) 
     382//      { 
     383//         this->withAxis = true ; 
     384//         if (CAxis::get(axis_ref.getValue())) 
     385//         { 
     386//            this->axis = CAxis::get(axis_ref.getValue()) ; 
     387//            axis->checkAttributes() ; 
     388//         } 
     389//         else ERROR("CGrid::solveAxisRef(void)", 
     390//                    << "Wrong axis reference") ; 
     391//      } 
    349392      else withAxis = false ; 
    350393   } 
     
    445488      StdString new_id = StdString("__") + domain->getId() + StdString("__") ; 
    446489      CGrid* grid = CGridGroup::get("grid_definition")->createChild(new_id) ; 
    447       grid->domain_ref.setValue(domain->getId()); 
     490 
     491      std::vector<CDomain*> vecDom(1,domain); 
     492      grid->setDomainList(vecDom); 
     493//      grid->domain_ref.setValue(domain->getId()); 
    448494      return (grid); 
    449495   } 
     
    454500                         StdString("_") + axis->getId() + StdString("__") ; 
    455501      CGrid* grid = CGridGroup::get("grid_definition")->createChild(new_id) ; 
    456       grid->domain_ref.setValue(domain->getId()); 
    457       grid->axis_ref.setValue(axis->getId()); 
     502 
     503      std::vector<CDomain*> vecDom(1,domain); 
     504      std::vector<CAxis*> vecAxis(1,axis); 
     505      grid->setDomainList(vecDom); 
     506      grid->setAxisList(vecAxis); 
     507//      grid->domain_ref.setValue(domain->getId()); 
     508//      grid->axis_ref.setValue(axis->getId()); 
    458509      return (grid); 
     510   } 
     511 
     512   CGrid* CGrid::createGrid(std::vector<CDomain*> domains, std::vector<CAxis*> axis) 
     513   { 
     514      StdString new_id = StdString("__"); 
     515      if (!domains.empty()) for (int i = 0; i < domains.size(); ++i) new_id += domains[i]->getId() + StdString("_"); 
     516      if (!axis.empty()) for (int i = 0; i < axis.size(); ++i) new_id += axis[i]->getId() + StdString("_") ; 
     517      new_id += StdString("_"); 
     518 
     519      CGrid* grid = CGridGroup::get("grid_definition")->createChild(new_id) ; 
     520      grid->setDomainList(domains); 
     521      grid->setAxisList(axis); 
     522      return (grid); 
     523   } 
     524 
     525   CDomainGroup* CGrid::getVirtualDomainGroup() const 
     526   { 
     527     return (this->vDomainGroup_); 
     528   } 
     529 
     530   CAxisGroup* CGrid::getVirtualAxisGroup() const 
     531   { 
     532     return (this->vAxisGroup_); 
    459533   } 
    460534 
     
    679753  } 
    680754 
     755   /*! 
     756   \brief Dispatch event received from client 
     757      Whenever a message is received in buffer of server, it will be processed depending on 
     758   its event type. A new event type should be added in the switch list to make sure 
     759   it processed on server side. 
     760   \param [in] event: Received message 
     761   */ 
    681762  bool CGrid::dispatchEvent(CEventServer& event) 
    682763  { 
     
    692773          break ; 
    693774 
     775         case EVENT_ID_ADD_DOMAIN : 
     776           recvAddDomain(event) ; 
     777           return true ; 
     778           break ; 
     779 
     780         case EVENT_ID_ADD_AXIS : 
     781           recvAddAxis(event) ; 
     782           return true ; 
     783           break ; 
    694784        default : 
    695785          ERROR("bool CDomain::dispatchEvent(CEventServer& event)", 
     
    724814   ///--------------------------------------------------------------- 
    725815 
     816   CDomain* CGrid::addDomain(const std::string& id) 
     817   { 
     818     return vDomainGroup_->createChild(id) ; 
     819   } 
     820 
     821   CAxis* CGrid::addAxis(const std::string& id) 
     822   { 
     823     return vAxisGroup_->createChild(id) ; 
     824   } 
     825 
     826   //! Change virtual field group to a new one 
     827   void CGrid::setVirtualDomainGroup(CDomainGroup* newVDomainGroup) 
     828   { 
     829      this->vDomainGroup_ = newVDomainGroup; 
     830   } 
     831 
     832   //! Change virtual variable group to new one 
     833   void CGrid::setVirtualAxisGroup(CAxisGroup* newVAxisGroup) 
     834   { 
     835      this->vAxisGroup_ = newVAxisGroup; 
     836   } 
     837 
     838   //---------------------------------------------------------------- 
     839   //! Create virtual field group, which is done normally on initializing file 
     840   void CGrid::setVirtualDomainGroup(void) 
     841   { 
     842      this->setVirtualDomainGroup(CDomainGroup::create()); 
     843   } 
     844 
     845   //! Create virtual variable group, which is done normally on initializing file 
     846   void CGrid::setVirtualAxisGroup(void) 
     847   { 
     848      this->setVirtualAxisGroup(CAxisGroup::create()); 
     849   } 
     850 
     851   /*! 
     852   \brief Send a message to create a domain on server side 
     853   \param[in] id String identity of domain that will be created on server 
     854   */ 
     855   void CGrid::sendAddDomain(const string& id) 
     856   { 
     857    CContext* context=CContext::getCurrent() ; 
     858 
     859    if (! context->hasServer ) 
     860    { 
     861       CContextClient* client=context->client ; 
     862 
     863       CEventClient event(this->getType(),EVENT_ID_ADD_DOMAIN) ; 
     864       if (client->isServerLeader()) 
     865       { 
     866         CMessage msg ; 
     867         msg<<this->getId() ; 
     868         msg<<id ; 
     869         event.push(client->getServerLeader(),1,msg) ; 
     870         client->sendEvent(event) ; 
     871       } 
     872       else client->sendEvent(event) ; 
     873    } 
     874   } 
     875 
     876   /*! 
     877   \brief Send a message to create an axis on server side 
     878   \param[in] id String identity of axis that will be created on server 
     879   */ 
     880   void CGrid::sendAddAxis(const string& id) 
     881   { 
     882    CContext* context=CContext::getCurrent() ; 
     883 
     884    if (! context->hasServer ) 
     885    { 
     886       CContextClient* client=context->client ; 
     887 
     888       CEventClient event(this->getType(),EVENT_ID_ADD_AXIS) ; 
     889       if (client->isServerLeader()) 
     890       { 
     891         CMessage msg ; 
     892         msg<<this->getId() ; 
     893         msg<<id ; 
     894         event.push(client->getServerLeader(),1,msg) ; 
     895         client->sendEvent(event) ; 
     896       } 
     897       else client->sendEvent(event) ; 
     898    } 
     899   } 
     900 
     901   /*! 
     902   \brief Receive a message annoucing the creation of a domain on server side 
     903   \param[in] event Received event 
     904   */ 
     905   void CGrid::recvAddDomain(CEventServer& event) 
     906   { 
     907 
     908      CBufferIn* buffer=event.subEvents.begin()->buffer; 
     909      string id; 
     910      *buffer>>id ; 
     911      get(id)->recvAddDomain(*buffer) ; 
     912   } 
     913 
     914   /*! 
     915   \brief Receive a message annoucing the creation of a domain on server side 
     916   \param[in] buffer Buffer containing message 
     917   */ 
     918   void CGrid::recvAddDomain(CBufferIn& buffer) 
     919   { 
     920      string id ; 
     921      buffer>>id ; 
     922      addDomain(id) ; 
     923   } 
     924 
     925   /*! 
     926   \brief Receive a message annoucing the creation of an axis on server side 
     927   \param[in] event Received event 
     928   */ 
     929   void CGrid::recvAddAxis(CEventServer& event) 
     930   { 
     931 
     932      CBufferIn* buffer=event.subEvents.begin()->buffer; 
     933      string id; 
     934      *buffer>>id ; 
     935      get(id)->recvAddAxis(*buffer) ; 
     936   } 
     937 
     938   /*! 
     939   \brief Receive a message annoucing the creation of an axis on server side 
     940   \param[in] buffer Buffer containing message 
     941   */ 
     942   void CGrid::recvAddAxis(CBufferIn& buffer) 
     943   { 
     944      string id ; 
     945      buffer>>id ; 
     946      addAxis(id) ; 
     947   } 
     948 
     949  void CGrid::solveDomainAxisRefInheritance(bool apply) 
     950  { 
     951    CContext* context = CContext::getCurrent(); 
     952    unsigned int vecSize, i; 
     953    std::vector<StdString>::iterator it, itE; 
     954    setDomainList(); 
     955    it = domList_.begin(); itE = domList_.end(); 
     956    for (; it != itE; ++it) 
     957    { 
     958      CDomain* pDom = CDomain::get(*it); 
     959      if (context->hasClient) 
     960      { 
     961        pDom->solveRefInheritance(apply); 
     962        pDom->solveBaseReference(); 
     963        if ((!pDom->domain_ref.isEmpty()) && (pDom->name.isEmpty())) 
     964          pDom->name.setValue(pDom->getBaseDomainReference()->getId()); 
     965 
     966      } 
     967    } 
     968 
     969    setAxisList(); 
     970    it = axisList_.begin(); itE = axisList_.end(); 
     971    for (; it != itE; ++it) 
     972    { 
     973      CAxis* pAxis = CAxis::get(*it); 
     974      if (context->hasClient) 
     975      { 
     976        pAxis->solveRefInheritance(apply); 
     977        pAxis->solveBaseReference(); 
     978        if ((!pAxis->axis_ref.isEmpty()) && (pAxis->name.isEmpty())) 
     979          pAxis->name.setValue(pAxis->getBaseAxisReference()->getId()); 
     980      } 
     981    } 
     982  } 
     983 
     984  std::vector<CDomain*> CGrid::getDomains() 
     985  { 
     986    std::vector<CDomain*> domList; 
     987    if (!domList_.empty()) 
     988    { 
     989      for (int i = 0; i < domList_.size(); ++i) domList.push_back(CDomain::get(domList_[i])); 
     990    } 
     991    return domList; 
     992  } 
     993 
     994  std::vector<CAxis*> CGrid::getAxis() 
     995  { 
     996    std::vector<CAxis*> aList; 
     997    if (!axisList_.empty()) 
     998      for (int i =0; i < axisList_.size(); ++i) aList.push_back(CAxis::get(axisList_[i])); 
     999 
     1000    return aList; 
     1001  } 
     1002 
     1003  void CGrid::setDomainList(const std::vector<CDomain*> domains) 
     1004  { 
     1005    if (isDomListSet) return; 
     1006    std::vector<CDomain*> domList = this->getVirtualDomainGroup()->getAllChildren(); 
     1007    if (!domains.empty() && domList.empty()) domList = domains; 
     1008    if (!domList.empty()) 
     1009    { 
     1010      int sizeDom = domList.size(); 
     1011      domList_.resize(sizeDom); 
     1012      for (int i = 0 ; i < sizeDom; ++i) 
     1013      { 
     1014        domList_[i] = domList[i]->getId(); 
     1015      } 
     1016      isDomListSet = true; 
     1017    } 
     1018 
     1019  } 
     1020 
     1021  void CGrid::setAxisList(const std::vector<CAxis*> axis) 
     1022  { 
     1023    if (isAxisListSet) return; 
     1024    std::vector<CAxis*> aList = this->getVirtualAxisGroup()->getAllChildren(); 
     1025    if (!axis.empty() && aList.empty()) aList = axis; 
     1026    if (!aList.empty()) 
     1027    { 
     1028      int sizeAxis = aList.size(); 
     1029      axisList_.resize(sizeAxis); 
     1030      for (int i = 0; i < sizeAxis; ++i) 
     1031      { 
     1032        axisList_[i] = aList[i]->getId(); 
     1033      } 
     1034      isAxisListSet = true; 
     1035    } 
     1036  } 
     1037 
     1038  std::vector<StdString> CGrid::getDomainList() 
     1039  { 
     1040    setDomainList(); 
     1041    return domList_; 
     1042  } 
     1043 
     1044  std::vector<StdString> CGrid::getAxisList() 
     1045  { 
     1046    setAxisList(); 
     1047    return axisList_; 
     1048  } 
     1049 
     1050  void CGrid::sendAllDomains() 
     1051  { 
     1052    std::vector<CDomain*> domList = this->getVirtualDomainGroup()->getAllChildren(); 
     1053    int dSize = domList.size(); 
     1054    for (int i = 0; i < dSize; ++i) 
     1055    { 
     1056      sendAddDomain(domList[i]->getId()); 
     1057      domList[i]->sendAllAttributesToServer(); 
     1058    } 
     1059  } 
     1060 
     1061  void CGrid::sendAllAxis() 
     1062  { 
     1063    std::vector<CAxis*> aList = this->getVirtualAxisGroup()->getAllChildren(); 
     1064    int aSize = aList.size(); 
     1065 
     1066    for (int i = 0; i < aSize; ++i) 
     1067    { 
     1068      sendAddAxis(aList[i]->getId()); 
     1069      aList[i]->sendAllAttributesToServer(); 
     1070    } 
     1071  } 
     1072 
     1073  void CGrid::parse(xml::CXMLNode & node) 
     1074  { 
     1075    SuperClass::parse(node); 
     1076 
     1077    if (node.goToChildElement()) 
     1078    { 
     1079      int domainIdx = -1; 
     1080      int posAxis = 0; 
     1081      StdString domainName("domain"); 
     1082      StdString axisName("axis"); 
     1083      do 
     1084      { 
     1085        if (node.getElementName() == domainName) { 
     1086          axisOrder_.push_back(domainIdx); 
     1087          this->getVirtualDomainGroup()->parseChild(node); 
     1088        } 
     1089        if (node.getElementName() == axisName) { 
     1090          axisOrder_.push_back(posAxis); 
     1091          ++posAxis; 
     1092          this->getVirtualAxisGroup()->parseChild(node); 
     1093        } 
     1094      } while (node.goToNextElement()) ; 
     1095      node.goToParentElement(); 
     1096    } 
     1097 
     1098    if (!axisOrder_.empty()) 
     1099    { 
     1100      int sizeOrd = axisOrder_.size(); 
     1101      axisDomOrder.resize(sizeOrd); 
     1102      for (int i = 0; i < sizeOrd; ++i) 
     1103      { 
     1104        axisDomOrder(i) = axisOrder_[i]; 
     1105      } 
     1106    } 
     1107 
     1108    setDomainList(); 
     1109    setAxisList(); 
     1110   } 
     1111 
    7261112} // namespace xios 
Note: See TracChangeset for help on using the changeset viewer.