Changeset 540 for XIOS/trunk/src/node/grid.cpp
- Timestamp:
- 12/16/14 12:55:53 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/node/grid.cpp
r518 r540 21 21 , withAxis(false), isChecked(false), isDomainAxisChecked(false), axis(), domain() 22 22 , 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 } 24 28 25 29 CGrid::CGrid(const StdString & id) … … 27 31 , withAxis(false), isChecked(false), isDomainAxisChecked(false), axis(), domain() 28 32 , 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 } 30 38 31 39 CGrid::~CGrid(void) … … 317 325 void CGrid::solveDomainRef(bool sendAtt) 318 326 { 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() ; 329 347 } 330 348 else ERROR("CGrid::solveDomainRef(void)", … … 336 354 void CGrid::solveAxisRef(bool checkAtt) 337 355 { 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 // } 349 392 else withAxis = false ; 350 393 } … … 445 488 StdString new_id = StdString("__") + domain->getId() + StdString("__") ; 446 489 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()); 448 494 return (grid); 449 495 } … … 454 500 StdString("_") + axis->getId() + StdString("__") ; 455 501 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()); 458 509 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_); 459 533 } 460 534 … … 679 753 } 680 754 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 */ 681 762 bool CGrid::dispatchEvent(CEventServer& event) 682 763 { … … 692 773 break ; 693 774 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 ; 694 784 default : 695 785 ERROR("bool CDomain::dispatchEvent(CEventServer& event)", … … 724 814 ///--------------------------------------------------------------- 725 815 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 726 1112 } // namespace xios
Note: See TracChangeset
for help on using the changeset viewer.