Changeset 645 for XIOS/trunk/src/node/field.cpp
- Timestamp:
- 07/17/15 13:58:14 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/trunk/src/node/field.cpp
r644 r645 32 32 , refObject(), baseRefObject() 33 33 , grid(), file() 34 , freq_operation(), freq_write() 35 , nstep(0), nstepMax(0), isEOF(false) 36 , last_Write(), last_operation() 37 , foperation(), hasInstantData(false), hasExpression(false) 38 , active(false) , hasOutputFile(false),hasFieldOut(false), slotUpdateDate(NULL) 39 , processed(false), domAxisIds_("", ""), areAllReferenceSolved(false), areAllExpressionBuilt(false) 34 , nstep(0), nstepMax(0) 35 , hasOutputFile(false) 36 , domAxisIds_("", ""), areAllReferenceSolved(false) 40 37 , isReadDataRequestPending(false) 41 , filterSources_()42 38 { setVirtualVariableGroup(); } 43 39 … … 46 42 , refObject(), baseRefObject() 47 43 , grid(), file() 48 , freq_operation(), freq_write() 49 , nstep(0), nstepMax(0), isEOF(false) 50 , last_Write(), last_operation() 51 , foperation(), hasInstantData(false), hasExpression(false) 52 , active(false), hasOutputFile(false), hasFieldOut(false), slotUpdateDate(NULL) 53 , processed(false), domAxisIds_("", ""), areAllReferenceSolved(false), areAllExpressionBuilt(false) 44 , nstep(0), nstepMax(0) 45 , hasOutputFile(false) 46 , domAxisIds_("", ""), areAllReferenceSolved(false) 54 47 , isReadDataRequestPending(false) 55 , filterSources_()56 48 { setVirtualVariableGroup(); } 57 49 58 50 CField::~CField(void) 59 { 60 // this->grid.reset(); 61 // this->file.reset(); 62 this->foperation.reset(); 63 if (hasExpression) delete expression; 64 if (slotUpdateDate != NULL) delete slotUpdateDate; 65 66 } 67 51 {} 68 52 69 53 //---------------------------------------------------------------- … … 95 79 this->getVirtualVariableGroup()->solveDescInheritance(apply, NULL); 96 80 } 97 //---------------------------------------------------------------- 98 //---------------------------------------------------------------- 99 100 bool CField::updateDataServer 101 (const CDate& currDate, 102 const std::deque< CArray<double, 1>* > storedClient) 103 { 104 const CDate opeDate = *last_operation + freq_operation; 105 const CDate writeDate = *last_Write + freq_write; 106 107 if (opeDate <= currDate) 108 { 109 if (this->data.numElements() != this->grid->storeIndex[0]->numElements()) 110 { 111 this->data.resize(this->grid->storeIndex[0]->numElements()); 112 } 113 CArray<double,1> input(data.numElements()); 114 this->grid->inputFieldServer(storedClient, input); 115 (*this->foperation)(input); 116 *last_operation = currDate; 117 } 118 if (writeDate < (currDate + freq_operation)) 119 { 120 this->foperation->final(); 121 this->incrementNStep(); 122 *last_Write = writeDate; 123 return true; 124 } 125 return false; 126 } 81 82 //---------------------------------------------------------------- 127 83 128 84 bool CField::dispatchEvent(CEventServer& event) … … 163 119 } 164 120 } 165 }166 167 void CField::sendUpdateData(void)168 {169 CContext* context = CContext::getCurrent();170 CContextClient* client = context->client;171 172 CEventClient event(getType(),EVENT_ID_UPDATE_DATA);173 174 map<int,CArray<int, 1>* >::iterator it;175 list<shared_ptr<CMessage> > list_msg;176 list< CArray<double,1>* > list_data;177 178 if (!grid->doGridHaveDataDistributed())179 {180 if (0 == client->clientRank)181 {182 for(it=grid->storeIndex_toSrv.begin();it!=grid->storeIndex_toSrv.end();it++)183 {184 int rank=(*it).first ;185 CArray<int,1>& index = *(it->second) ;186 CArray<double,1> data_tmp(index.numElements()) ;187 for(int n=0;n<data_tmp.numElements();n++) data_tmp(n)=data(index(n)) ;188 189 list_msg.push_back(shared_ptr<CMessage>(new CMessage)) ;190 list_data.push_back(new CArray<double,1>(data_tmp)) ;191 *list_msg.back()<<getId()<<*list_data.back() ;192 event.push(rank,1,*list_msg.back()) ;193 }194 client->sendEvent(event) ;195 } else client->sendEvent(event);196 }197 else198 {199 for(it=grid->storeIndex_toSrv.begin();it!=grid->storeIndex_toSrv.end();it++)200 {201 int rank=(*it).first ;202 CArray<int,1>& index = *(it->second) ;203 CArray<double,1> data_tmp(index.numElements()) ;204 for(int n=0;n<data_tmp.numElements();n++) data_tmp(n)=data(index(n)) ;205 list_msg.push_back(shared_ptr<CMessage>(new CMessage)) ;206 list_data.push_back(new CArray<double,1>(data_tmp)) ;207 *list_msg.back()<<getId()<<*list_data.back() ;208 event.push(rank,grid->nbSenders[rank],*list_msg.back()) ;209 }210 client->sendEvent(event) ;211 }212 213 for (list< CArray<double,1>* >::iterator it = list_data.begin(); it != list_data.end(); it++) delete *it;214 121 } 215 122 … … 467 374 std::map<int, CArray<double,1> > data; 468 375 376 bool isEOF = false; 377 469 378 for (int i = 0; i < ranks.size(); i++) 470 379 { … … 484 393 serverSourceFilter->streamDataFromServer(lastDataRequestedFromServer, data); 485 394 486 /*for (int i = 0; i < ranks.size(); i++)487 {488 int rank = ranks[i];489 *buffers[i] >> record;490 isEOF = (record == size_t(-1));491 492 if (!isEOF)493 {494 CArray<int,1>& index = *grid->storeIndex_toSrv[rank];495 CArray<double,1> data_tmp(index.numElements());496 *buffers[i] >> data_tmp;497 for (int n = 0; n < data_tmp.numElements(); n++)498 instantData(index(n)) = data_tmp(n);499 }500 else501 break;502 }503 504 if (!isEOF)505 {506 for (list< pair<CField*, int> >::iterator it = fieldDependency.begin(); it != fieldDependency.end(); ++it)507 it->first->setSlot(it->second);508 509 if (!hasExpression) // Should be always true ?510 {511 const std::vector<CField*>& refField = getAllReference();512 std::vector<CField*>::const_iterator it = refField.begin(), end = refField.end();513 514 for (; it != end; it++) (*it)->setDataFromExpression(instantData);515 if (hasFieldOut) updateDataFromExpression(instantData);516 }517 }*/518 519 395 isReadDataRequestPending = false; 520 396 } … … 553 429 } 554 430 431 func::CFunctor::ETimeType CField::getOperationTimeType() const 432 { 433 return operationTimeType; 434 } 435 436 //---------------------------------------------------------------- 437 555 438 void CField::incrementNStep(void) 556 439 { … … 570 453 //---------------------------------------------------------------- 571 454 572 const CDuration& CField::getFreqOperation(void) const573 {574 return this->freq_operation;575 }576 577 //----------------------------------------------------------------578 579 const CDuration& CField::getFreqWrite(void) const580 {581 return this->freq_write;582 }583 584 //----------------------------------------------------------------585 586 boost::shared_ptr<func::CFunctor> CField::getFieldOperation(void) const587 {588 return this->foperation;589 }590 591 455 bool CField::isActive(void) const 592 456 { 593 457 return !this->refObject.empty(); 594 }595 596 //----------------------------------------------------------------597 598 CArray<double, 1> CField::getData(void) const599 {600 return(this->data);601 }602 603 //----------------------------------------------------------------604 605 boost::shared_ptr<CDate> CField::getLastWriteDate(void) const606 {607 return(this->last_Write);608 }609 610 //----------------------------------------------------------------611 612 boost::shared_ptr<CDate> CField::getLastOperationDate(void) const613 {614 return(this->last_operation);615 458 } 616 459 … … 637 480 if (hasDirectFieldReference()) getDirectFieldReference()->solveAllReferenceEnabledField(false); 638 481 } 639 640 solveOperation(); 482 else if (context->hasServer) 483 solveServerOperation(); 484 641 485 solveGridReference(); 486 487 lastDataRequestedFromServer.setRelCalendar(*context->getCalendar()); 642 488 } 643 489 solveGridDomainAxisRef(doSending2Sever); … … 654 500 } 655 501 656 void CField::buildAllExpressionEnabledField() 657 { 658 if (!areAllReferenceSolved) solveAllReferenceEnabledField(true); 659 if (!areAllExpressionBuilt) 660 { 661 areAllExpressionBuilt = true; 662 if (hasDirectFieldReference() && (grid_ref.isEmpty())) baseRefObject->buildAllExpressionEnabledField(); 663 buildExpression(); 664 active = true; 665 } 666 } 667 668 //---------------------------------------------------------------- 669 670 void CField::solveOperation(void) 671 { 672 using namespace func; 673 502 //---------------------------------------------------------------- 503 504 void CField::solveServerOperation(void) 505 { 674 506 CContext* context = CContext::getCurrent(); 675 507 676 508 if (!context->hasServer || !hasOutputFile) return; 677 509 678 StdString id; 679 if (hasId()) id = getId(); 680 else if (!name.isEmpty()) id = name; 681 else if (hasDirectFieldReference()) id = baseRefObject->getId(); 682 683 if (freq_op.isEmpty()) freq_op.setValue(TimeStep); 684 685 if (operation.isEmpty()) 686 { 687 ERROR("CField::solveOperation(void)", 688 << "[ id = " << id << "]" 689 << "Impossible to define an operation for this field !"); 690 } 510 if (freq_op.isEmpty()) 511 freq_op.setValue(TimeStep); 691 512 692 513 if (freq_offset.isEmpty()) 693 514 freq_offset.setValue(NoneDu); 694 515 695 // if (CXIOSManager::GetStatus() == CXIOSManager::LOC_SERVER) 696 if (context->hasServer) 697 { 698 if (hasOutputFile) 699 { 700 this->freq_operation_srv = this->file->output_freq.getValue(); 701 this->freq_write_srv = this->file->output_freq.getValue(); 702 } 703 this->lastlast_Write_srv = boost::shared_ptr<CDate> 704 (new CDate(context->getCalendar()->getInitDate())); 705 this->last_Write_srv = boost::shared_ptr<CDate> 706 (new CDate(context->getCalendar()->getInitDate())); 707 this->last_operation_srv = boost::shared_ptr<CDate> 708 (new CDate(context->getCalendar()->getInitDate())); 709 // this->foperation_srv = 710 // boost::shared_ptr<func::CFunctor>(new CInstant(this->data_srv)); 711 712 if (hasOutputFile) 713 { 714 const CDuration toffset = this->freq_operation_srv - freq_offset.getValue() - context->getCalendar()->getTimeStep(); 715 *this->last_operation_srv = *this->last_operation_srv - toffset; 716 } 717 } 718 719 // if (context->hasClient) 720 // { 721 this->freq_operation = freq_op.getValue(); 722 if (hasOutputFile) this->freq_write = this->file->output_freq.getValue(); 723 if (hasFieldOut) 724 { 725 this->freq_write = this->fieldOut->freq_op.getValue(); 726 } 727 this->last_Write = boost::shared_ptr<CDate> 728 (new CDate(context->getCalendar()->getInitDate())); 729 this->last_operation = boost::shared_ptr<CDate> 730 (new CDate(context->getCalendar()->getInitDate())); 731 732 const CDuration toffset = this->freq_operation - freq_offset.getValue() - context->getCalendar()->getTimeStep(); 733 *this->last_operation = *this->last_operation - toffset; 734 735 lastDataRequestedFromServer.setRelCalendar(*context->getCalendar()); 736 737 if (operation.get() == "once") isOnceOperation = true; 738 else isOnceOperation = false; 739 isFirstOperation = true; 516 freq_operation_srv = file->output_freq.getValue(); 517 freq_write_srv = file->output_freq.getValue(); 518 519 lastlast_Write_srv = boost::shared_ptr<CDate>(new CDate(context->getCalendar()->getInitDate())); 520 last_Write_srv = boost::shared_ptr<CDate>(new CDate(context->getCalendar()->getInitDate())); 521 last_operation_srv = boost::shared_ptr<CDate>(new CDate(context->getCalendar()->getInitDate())); 522 523 const CDuration toffset = freq_operation_srv - freq_offset.getValue() - context->getCalendar()->getTimeStep(); 524 *last_operation_srv = *last_operation_srv - toffset; 525 526 if (operation.isEmpty()) 527 ERROR("void CField::solveServerOperation(void)", 528 << "An operation must be defined for field \"" << getId() << "\"."); 529 530 boost::shared_ptr<func::CFunctor> functor; 531 CArray<double, 1> dummyData; 740 532 741 533 #define DECLARE_FUNCTOR(MType, mtype) \ 742 if (operation.getValue().compare(#mtype) == 0) \ 743 { \ 744 if (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true) \ 534 if (operation.getValue().compare(#mtype) == 0) \ 745 535 { \ 746 boost::shared_ptr<func::CFunctor> foperation_(new C##MType(this->data,default_value)); \ 747 this->foperation = foperation_; \ 748 } \ 749 else \ 750 { \ 751 boost::shared_ptr<func::CFunctor> foperation_(new C##MType(this->data)); \ 752 this->foperation = foperation_; \ 753 } \ 754 return; \ 755 } 536 functor.reset(new func::C##MType(dummyData)); \ 537 } 756 538 757 539 #include "functor_type.conf" 758 540 759 ERROR("CField::solveOperation(void)", 760 << "[ operation = " << operation.getValue() << "]" 761 << "The operation is not defined !"); 762 // } 541 if (!functor) 542 ERROR("void CField::solveServerOperation(void)", 543 << "\"" << operation << "\" is not a valid operation."); 544 545 operationTimeType = functor->timeType(); 763 546 } 764 547 … … 974 757 } 975 758 976 CGrid* CField::getGridRefOfBaseReference()977 {978 solveRefInheritance(true);979 solveBaseReference();980 baseRefObject->solveGridReference();981 982 return baseRefObject->grid;983 }984 985 759 void CField::solveTransformedGrid() 986 760 { … … 988 762 && grid_ref.getValue() != getDirectFieldReference()->grid_ref.getValue() && !grid->isTransformed()) 989 763 grid->transformGrid(getDirectFieldReference()->grid); 990 991 /*if (!grid_ref.isEmpty() && (!field_ref.isEmpty()))992 {993 CField* fieldRef = this;994 CGrid* gridRefOfFieldRef = 0;995 while (fieldRef->hasDirectFieldReference())996 {997 if ((!(fieldRef->grid_ref.isEmpty())) &&998 (fieldRef->grid_ref.getValue() != grid_ref.getValue()))999 {1000 gridRefOfFieldRef = fieldRef->getGridRefOfBaseReference();1001 fieldRef->addReference(this);1002 fieldRef->solveGridDomainAxisRef(false);1003 break;1004 }1005 CField* tmp = fieldRef->getDirectFieldReference();1006 fieldRef = tmp;1007 }1008 1009 if ((0 == gridRefOfFieldRef) &&1010 (!(fieldRef->grid_ref.isEmpty())) &&1011 (fieldRef->grid_ref.getValue() != grid_ref.getValue()))1012 {1013 gridRefOfFieldRef = fieldRef->getGridRefOfBaseReference();1014 fieldRef->addReference(this);1015 fieldRef->solveGridDomainAxisRef(false);1016 }1017 1018 CGrid* relGridRef = CGrid::get(grid_ref.getValue());1019 if ((0 != gridRefOfFieldRef) && (relGridRef != gridRefOfFieldRef) && (!(relGridRef->isTransformed())))1020 {1021 relGridRef->transformGrid(gridRefOfFieldRef);1022 filterSources_.push_back(fieldRef);1023 }1024 }*/1025 }1026 1027 const std::vector<CField*>& CField::getFilterSources()1028 {1029 return filterSources_;1030 }1031 1032 void CField::applyFilter(const CArray<double, 1>& dataToSend, CArray<double,1>& dataToReceive)1033 {1034 std::vector<CField*>::iterator itFilterSrc, iteFilterSrc;1035 if (!filterSources_.empty())1036 {1037 itFilterSrc = filterSources_.begin(); iteFilterSrc = filterSources_.end();1038 dataToReceive = 0.0; // Reset all data destination1039 for (; itFilterSrc != iteFilterSrc; ++itFilterSrc)1040 {1041 if (0 != grid->getTransformations())1042 {1043 const std::map<int, CArray<int,1>* >& localIndexToSend = grid->getTransformations()->getLocalIndexToSendFromGridSource();1044 const std::map<int,std::vector<std::vector<std::pair<int,double> > > >& localIndexToReceive = grid->getTransformations()->getLocalIndexToReceiveOnGridDest();1045 1046 sendAndReceiveTransformedData(localIndexToSend, dataToSend,1047 localIndexToReceive, dataToReceive);1048 }1049 1050 }1051 }1052 }1053 1054 void CField::sendAndReceiveTransformedData(const std::map<int, CArray<int,1>* >& localIndexToSend,1055 const CArray<double, 1>& dataSrc,1056 const std::map<int,std::vector<std::vector<std::pair<int,double> > > >& localIndexToReceive,1057 CArray<double,1>& dataDest)1058 {1059 CContext* context = CContext::getCurrent();1060 CContextClient* client=context->client;1061 1062 // Sending data from field sources to do transformations1063 std::map<int, CArray<int,1>* >::const_iterator itbSend = localIndexToSend.begin(), itSend,1064 iteSend = localIndexToSend.end();1065 int sendBuffSize = 0;1066 for (itSend = itbSend; itSend != iteSend; ++itSend) sendBuffSize = (sendBuffSize < (itSend->second)->numElements())1067 ? (itSend->second)->numElements(): sendBuffSize;1068 double* sendBuff;1069 if (0 != sendBuffSize) sendBuff = new double [sendBuffSize];1070 for (itSend = itbSend; itSend != iteSend; ++itSend)1071 {1072 int destRank = itSend->first;1073 CArray<int,1>* localIndex_p = itSend->second;1074 int countSize = localIndex_p->numElements();1075 for (int idx = 0; idx < countSize; ++idx)1076 {1077 sendBuff[idx] = dataSrc((*localIndex_p)(idx));1078 }1079 MPI_Send(sendBuff, countSize, MPI_DOUBLE, destRank, 12, client->intraComm);1080 }1081 1082 // Receiving data on destination fields1083 std::map<int,std::vector<std::vector<std::pair<int,double> > > >::const_iterator itbRecv = localIndexToReceive.begin(), itRecv,1084 iteRecv = localIndexToReceive.end();1085 int recvBuffSize = 0;1086 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv) recvBuffSize = (recvBuffSize < (itRecv->second).size())1087 ? (itRecv->second).size() : recvBuffSize;1088 double* recvBuff;1089 if (0 != recvBuffSize) recvBuff = new double [recvBuffSize];1090 for (itRecv = itbRecv; itRecv != iteRecv; ++itRecv)1091 {1092 MPI_Status status;1093 int srcRank = itRecv->first;1094 int countSize = (itRecv->second).size();1095 MPI_Recv(recvBuff, recvBuffSize, MPI_DOUBLE, srcRank, 12, client->intraComm, &status);1096 for (int idx = 0; idx < countSize; ++idx)1097 {1098 const std::vector<std::pair<int,double> >& localIndex_p = (itRecv->second)[idx];1099 int numIndex = localIndex_p.size();1100 for (int i = 0; i < numIndex; ++i)1101 {1102 // if ((localIndex_p)[i].first >= dataDest.numElements() )1103 dataDest((localIndex_p)[i].first) += recvBuff[idx] * ((localIndex_p)[i].second);1104 }1105 }1106 }1107 1108 if (0 != sendBuffSize) delete [] sendBuff;1109 if (0 != recvBuffSize) delete [] recvBuff;1110 764 } 1111 765 … … 1221 875 } 1222 876 } 1223 1224 CArray<double,1>* CField::getInstantData(void)1225 {1226 if (!hasInstantData)1227 {1228 instantData.resize(grid->storeIndex_client.numElements());1229 hasInstantData = true;1230 }1231 return &instantData;1232 }1233 1234 void CField::addDependency(CField* field, int slotId)1235 {1236 fieldDependency.push_back(pair<CField*,int>(field,slotId));1237 }1238 1239 void CField::buildExpression(void)1240 {1241 if (content.size() > 0)1242 {1243 CSimpleNodeExpr* simpleExpr;// = parseExpr(content+'\0');1244 expression = CFieldNode::newNode(simpleExpr);1245 delete simpleExpr;1246 set<string> instantFieldIds;1247 map<string,CField*> associatedInstantFieldIds;1248 expression->getInstantFieldIds(instantFieldIds);1249 for (set<string>::iterator it = instantFieldIds.begin(); it != instantFieldIds.end(); ++it)1250 {1251 if (*it != "this")1252 {1253 if (CField::has(*it))1254 {1255 CField* field = CField::get(*it);1256 // field->processEnabledField();1257 field->buildAllExpressionEnabledField();1258 associatedInstantFieldIds[*it] = field;1259 }1260 else ERROR("void CField::buildExpression(void)", << " Field " << *it << " does not exist");1261 }1262 }1263 1264 set<string> averageFieldIds;1265 map<string,CField*> associatedAverageFieldIds;1266 1267 expression->getAverageFieldIds(averageFieldIds);1268 for (set<string>::iterator it = averageFieldIds.begin(); it != averageFieldIds.end(); ++it)1269 {1270 if (CField::has(*it))1271 {1272 CFieldGroup* root = CFieldGroup::get("field_definition");1273 CField* averageField = root->createChild();1274 CField* instantField = root->createChild();1275 averageField->field_ref = *it;1276 averageField->hasFieldOut = true;1277 averageField->fieldOut = instantField;1278 instantField->freq_op = freq_op;1279 // averageField-> processEnabledField();1280 averageField->buildAllExpressionEnabledField();1281 instantField->SuperClassAttribute::setAttributes(averageField, true);1282 instantField->field_ref.reset();1283 instantField->operation.reset();1284 1285 // instantField-> processEnabledField();1286 instantField->buildAllExpressionEnabledField();1287 associatedAverageFieldIds[*it] = instantField;1288 }1289 else ERROR("void CField::buildExpression(void)", << " Field " << *it << " does not exist");1290 }1291 1292 expression->reduce(this,associatedInstantFieldIds,associatedAverageFieldIds);1293 1294 slots.resize(instantFieldIds.size() + averageFieldIds.size());1295 resetSlots();1296 int slotId = 0;1297 set<CField*> fields;1298 expression->getFields(fields);1299 for (set<CField*>::iterator it = fields.begin(); it != fields.end(); ++it, ++slotId) (*it)->addDependency(this,slotId);1300 hasExpression = true;1301 }1302 }1303 1304 void CField::resetSlots(void)1305 {1306 for (vector<bool>::iterator it = slots.begin(); it != slots.end(); ++it) *it = false;1307 }1308 1309 bool CField::slotsFull(void)1310 {1311 bool ret = true;1312 for (vector<bool>::iterator it = slots.begin(); it != slots.end(); ++it) ret &= *it;1313 return ret;1314 }1315 1316 void CField::setSlot(int slotId)1317 {1318 CContext* context = CContext::getCurrent();1319 const CDate& currDate = context->getCalendar()->getCurrentDate();1320 if (slotUpdateDate == NULL || currDate != *slotUpdateDate)1321 {1322 resetSlots();1323 if (slotUpdateDate == NULL) slotUpdateDate = new CDate(currDate);1324 else *slotUpdateDate = currDate;1325 }1326 slots[slotId] = true;1327 if (slotsFull())1328 {1329 CArray<double,1> expr(expression->compute());1330 1331 if (hasInstantData)1332 {1333 instantData = expr;1334 for (list< pair<CField *,int> >::iterator it = fieldDependency.begin(); it != fieldDependency.end(); ++it)1335 if (it->first != this) it->first->setSlot(it->second);1336 }1337 1338 if (hasOutputFile) updateDataFromExpression(expr);1339 1340 const std::vector<CField*>& refField = getAllReference();1341 for (std::vector<CField*>::const_iterator it = refField.begin(); it != refField.end(); it++)1342 {1343 if (!(*it)->hasExpression)1344 (*it)->setDataFromExpression(expr);1345 }1346 }1347 }1348 877 1349 878 /*! … … 1484 1013 1485 1014 DEFINE_REF_FUNC(Field,field) 1486 1487 // void CField::addReference(CField* field)1488 // {1489 // refObject.push_back(field);1490 // }1491 //1492 // //----------------------------------------------------------------1493 //1494 // bool CField::hasDirectFieldReference(void) const1495 // {1496 // return !this->field_ref.isEmpty();1497 // }1498 //1499 // //----------------------------------------------------------------1500 //1501 // const StdString& CField::getBaseFieldId(void) const1502 // {1503 // return this->getBaseFieldReference()->getId();1504 // }1505 //1506 // //----------------------------------------------------------------1507 //1508 // /*!1509 // \brief Get pointer to direct field to which the current field refers.1510 // */1511 // CField* CField::getDirectFieldReference(void) const1512 // {1513 // if (this->field_ref.isEmpty())1514 // return this->getBaseFieldReference();1515 //1516 // if (!CField::has(this->field_ref.getValue()))1517 // ERROR("CField::getDirectFieldReference(void)",1518 // << "[ ref_name = " << this->field_ref.getValue() << "]"1519 // << " invalid field name !");1520 //1521 // return CField::get(this->field_ref.getValue());1522 // }1523 //1524 // //----------------------------------------------------------------1525 //1526 // CField* CField::getBaseFieldReference(void) const1527 // {1528 // return baseRefObject;1529 // }1530 //1531 // //----------------------------------------------------------------1532 //1533 // const std::vector<CField*>& CField::getAllReference(void) const1534 // {1535 // return refObject;1536 // }1537 //1538 // /*!1539 // \brief Searching for all reference of a field1540 // If a field refers to (an)other field(s), we will search for all its referenced parents.1541 // Moreover, if any father, direct or indirect (e.g: two levels up), has non-empty attributes,1542 // all its attributes will be added to the current field1543 // \param [in] apply Flag to specify whether current field uses attributes of its father1544 // in case the attribute is empty (true) or its attributes are replaced by ones of its father (false)1545 // */1546 // void CField::solveRefInheritance(bool apply)1547 // {1548 // std::set<CField *> sset;1549 // CField* refer_sptr;1550 // CField* refer_ptr = this;1551 //1552 // while (refer_ptr->hasDirectFieldReference())1553 // {1554 // refer_sptr = refer_ptr->getDirectFieldReference();1555 // refer_ptr = refer_sptr;1556 //1557 // if(sset.end() != sset.find(refer_ptr))1558 // {1559 // DEBUG (<< "Circular dependency stopped for field object on "1560 // << "\"" + refer_ptr->getId() + "\" !");1561 // break;1562 // }1563 //1564 // SuperClassAttribute::setAttributes(refer_ptr, apply);1565 // sset.insert(refer_ptr);1566 // }1567 // }1568 //1569 // /*!1570 // \brief Only on SERVER side. Remove all field_ref from current field1571 // On creating a new field on server side, redundant "field_ref" is still kept in the attribute list1572 // of the current field. This function removes this from current field1573 // */1574 // void CField::removeRefInheritance()1575 // {1576 // if (this->field_ref.isEmpty()) return;1577 // this->clearAttribute("field_ref");1578 // }1579 //1580 // void CField::solveBaseReference(void)1581 // {1582 // std::set<CField *> sset;1583 // CField* refer_sptr;1584 // CField* refer_ptr = this;1585 //1586 // if (this->hasDirectFieldReference()) baseRefObject = getDirectFieldReference();1587 // else baseRefObject = CField::get(this);1588 //1589 // while (refer_ptr->hasDirectFieldReference())1590 // {1591 // refer_sptr = refer_ptr->getDirectFieldReference();1592 // refer_ptr = refer_sptr;1593 //1594 // if(sset.end() != sset.find(refer_ptr))1595 // {1596 // DEBUG (<< "Circular dependency stopped for field object on "1597 // << "\"" + refer_ptr->getId() + "\" !");1598 // break;1599 // }1600 //1601 // sset.insert(refer_ptr);1602 // }1603 //1604 // if (hasDirectFieldReference()) baseRefObject->addReference(this);1605 // }1606 1015 } // namespace xios
Note: See TracChangeset
for help on using the changeset viewer.