35 , nstep(0), nstepMax(0)
36 , hasOutputFile(false)
37 , domAxisScalarIds_(vector<
StdString>(3,
""))
38 , areAllReferenceSolved(false), isReferenceSolved(false), isReferenceSolvedAndTransformed(false)
39 , isGridChecked(false)
40 , useCompressedOutput(false)
41 , hasTimeInstant(false)
42 , hasTimeCentered(false)
43 , wasDataRequestedFromServer(false)
44 , wasDataAlreadyReceivedFromServer(false)
45 , mustAutoTrigger(false)
46 , isEOF(false), nstepMaxRead(false)
53 , nstep(0), nstepMax(0)
54 , hasOutputFile(false)
55 , domAxisScalarIds_(vector<
StdString>(3,
""))
56 , areAllReferenceSolved(false), isReferenceSolved(false), isReferenceSolvedAndTransformed(false)
57 , isGridChecked(false)
58 , useCompressedOutput(false)
59 , hasTimeInstant(false)
60 , hasTimeCentered(false)
61 , wasDataRequestedFromServer(false)
62 , wasDataAlreadyReceivedFromServer(false)
63 , mustAutoTrigger(false)
64 , isEOF(false), nstepMaxRead(false)
75 this->vVariableGroup = newVVariableGroup;
96 SuperClassAttribute::setAttributes(parent, apply);
97 this->getVirtualVariableGroup()->solveDescInheritance(apply, NULL);
106 if (SuperClass::dispatchEvent(event))
return true;
111 case EVENT_ID_UPDATE_DATA :
112 recvUpdateData(event);
116 case EVENT_ID_READ_DATA :
117 recvReadDataRequest(event);
121 case EVENT_ID_READ_DATA_READY :
122 recvReadDataReady(event);
126 case EVENT_ID_ADD_VARIABLE :
127 recvAddVariable(event);
131 case EVENT_ID_ADD_VARIABLE_GROUP :
132 recvAddVariableGroup(event);
137 ERROR(
"bool CField::dispatchEvent(CEventServer& event)", <<
"Unknown Event");
155 map<int, CArray<int,1> >::iterator it;
156 list<CMessage> list_msg;
157 list<CArray<double,1> > list_data;
159 if (!grid->doGridHaveDataDistributed(client))
163 for (it = grid->storeIndex_toSrv[client].begin(); it != grid->storeIndex_toSrv[client].end(); it++)
165 int rank = it->first;
172 for (
int n = 0; n < data_tmp.numElements(); n++) data_tmp(n) = data(index(n));
174 list_msg.back() << getId() << data_tmp;
175 event.push(rank, 1, list_msg.back());
183 for (it = grid->storeIndex_toSrv[client].begin(); it != grid->storeIndex_toSrv[client].end(); it++)
185 int rank = it->first;
192 for (
int n = 0; n < data_tmp.numElements(); n++) data_tmp(n) = data(index(n));
194 list_msg.back() << getId() << data_tmp;
195 event.push(rank, grid->nbSenders[receiverSize][rank], list_msg.back());
207 std::map<int,CBufferIn*> rankBuffers;
209 list<CEventServer::SSubEvent>::iterator it;
212 for (it = event.subEvents.begin(); it !=
event.subEvents.end(); ++it)
217 rankBuffers[rank] = buffer;
219 get(fieldId)->recvUpdateData(rankBuffers);
230 if (0 == recvDataSrv.numElements())
235 recvDataSrv.
resize(storeClient.numElements());
236 recvFoperationSrv = std::shared_ptr<func::CFunctor>(
new func::CInstant(recvDataSrv));
241 CDuration offsetAllButMonth (freq_offset.getValue().year, 0 , freq_offset.getValue().day,
242 freq_offset.getValue().hour, freq_offset.getValue().minute,
243 freq_offset.getValue().second, freq_offset.getValue().timestep);
244 const CDate opeDate = (last_operation_srv - offsetAllButMonth + context->
getCalendar()->getTimeStep())
245 + freq_op + freq_operation_srv - freq_op - context->
getCalendar()->getTimeStep() + offsetAllButMonth;
247 if (opeDate <= currDate)
249 for (map<
int,
CArray<size_t, 1> >::iterator it = grid->outLocalIndexStoreOnClient.begin(); it != grid->outLocalIndexStoreOnClient.end(); ++it)
253 *(rankBuffers[it->first]) >> tmp;
254 for (
int idx = 0; idx < indexTmp.numElements(); ++idx)
256 recv_data_tmp(indexTmp(idx)) = tmp(idx);
261 this->setData(recv_data_tmp);
263 recvFoperationSrv.reset() ;
264 recvDataSrv.reset() ;
274 CDuration offsetAllButMonth (freq_offset.getValue().year, 0 , freq_offset.getValue().day,
275 freq_offset.getValue().hour, freq_offset.getValue().minute,
276 freq_offset.getValue().second, freq_offset.getValue().timestep);
277 const CDate opeDate = (last_operation_srv - offsetAllButMonth + context->
getCalendar()->getTimeStep())
278 + freq_op + freq_operation_srv - freq_op - context->
getCalendar()->getTimeStep() + offsetAllButMonth;
279 const CDate writeDate = last_Write_srv + freq_write_srv;
281 if (opeDate <= currDate)
283 (*recvFoperationSrv)(data);
284 last_operation_srv = currDate;
287 if (writeDate < (currDate + freq_operation_srv))
289 recvFoperationSrv->final();
290 last_Write_srv = writeDate;
291 grid->computeWrittenIndex();
293 lastlast_Write_srv = last_Write_srv;
329 lastDataRequestedFromServer = tsDataRequested;
332 if (!isEOF || context->
getCalendar()->getCurrentDate() <= dateEOF)
340 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank)
341 event.
push(*itRank, 1, msg);
347 serverSourceFilter->signalEndOfStream(tsDataRequested);
349 wasDataRequestedFromServer =
true;
364 bool dataRequested =
false;
368 info(20) <<
"currentDate : " << currentDate << endl ;
370 info(20) <<
"file->output_freq.getValue() : " <<
file->output_freq.getValue() << endl ;
376 return dataRequested;
386 get(fieldId)->recvReadDataRequest();
403 std::list<CMessage> msgs;
407 map<int, CArray<double,1> >::iterator it;
415 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank)
434 event.push(*itRank, 1, msg);
451 for (
int idx = 0; idx < indexTmp.numElements(); ++idx)
465 msg << int(-2) << tmp;
552 vector<CBufferIn*> buffers;
554 list<CEventServer::SSubEvent>::iterator it;
555 for (it = event.subEvents.begin(); it !=
event.subEvents.end(); ++it)
557 ranks.push_back(it->rank);
560 buffers.push_back(buffer);
562 get(fieldId)->recvReadDataReady(ranks, buffers);
575 std::map<int, CArray<double,1> > data;
576 const bool wasEOF = isEOF;
578 for (
int i = 0; i < ranks.size(); i++)
582 *buffers[i] >> record;
583 isEOF = (record == int(-1));
586 *buffers[i] >> data[rank];
591 if (wasDataAlreadyReceivedFromServer)
592 lastDataReceivedFromServer = lastDataReceivedFromServer + file->output_freq;
595 lastDataReceivedFromServer = context->
getCalendar()->getInitDate();
596 wasDataAlreadyReceivedFromServer =
true;
602 dateEOF = lastDataReceivedFromServer;
604 serverSourceFilter->signalEndOfStream(lastDataReceivedFromServer);
607 serverSourceFilter->streamDataFromServer(lastDataReceivedFromServer, data);
620 CTimer timer(
"CField::checkForLateDataFromServer");
626 isDataLate = (nextDataDue <= currentDate);
640 ERROR(
"void CField::checkForLateDataFromServer(void)",
641 <<
"Late data at timestep = " << currentDate);
667 hasOutputFile =
true;
738 if (clientSourceFilter)
740 else if (storeFilter)
742 else if (instantDataFilter)
743 ERROR(
"bool CField::isActive(bool atCurrentTimestep)",
744 <<
"Impossible to check if field [ id = " << getId() <<
" ] is active as it cannot be used to receive nor send data.");
821 if (1 < gridSrcMap.size())
826 std::vector<CField*> hieraField;
828 while (currField->hasDirectFieldReference() && (gridSrc ==
grid))
830 hieraField.push_back(currField);
831 CField* tmp = currField->getDirectFieldReference();
833 gridSrc = currField->
grid;
836 if (gridSrcMap.end() != gridSrcMap.find(gridSrc))
839 std::pair<bool,StdString> newGridDest = gridSrcMap[gridSrc];
840 if (newGridDest.first)
842 StdString newIdGridDest = newGridDest.second;
845 ERROR(
"CGrid* CGrid::generateNewTransformationGridDest()",
846 <<
" Something wrong happened! Grid whose id " << newIdGridDest
856 (gridSrcMap[gridSrc]).first =
true;
857 (gridSrcMap[gridSrc]).second = newIdGridDest;
861 for (std::vector<CField*>::iterator it = hieraField.begin(); it != hieraField.end(); ++it)
863 (*it)->grid = gridTmp;
864 (*it)->updateRef((*it)->grid);
875 if (!grid_ref.isEmpty()) grid_ref.setValue(grid->getId());
878 std::vector<CAxis*> axisTmp = grid->getAxis();
879 std::vector<CDomain*> domainTmp = grid->getDomains();
880 if ((1<axisTmp.size()) || (1<domainTmp.size()))
881 ERROR(
"void CField::updateRef(CGrid* grid)",
882 <<
"More than one domain or axis is available for domain_ref/axis_ref of field " << this->getId());
884 if ((!domain_ref.isEmpty()) && (domainTmp.empty()))
885 ERROR(
"void CField::updateRef(CGrid* grid)",
886 <<
"Incoherent between available domain and domain_ref of field " << this->getId());
887 if ((!axis_ref.isEmpty()) && (axisTmp.empty()))
888 ERROR(
"void CField::updateRef(CGrid* grid)",
889 <<
"Incoherent between available axis and axis_ref of field " << this->getId());
891 if (!domain_ref.isEmpty()) domain_ref.setValue(domainTmp[0]->getId());
892 if (!axis_ref.isEmpty()) axis_ref.setValue(axisTmp[0]->getId());
912 if (hasClient && !hasServer)
914 solveRefInheritance(
true);
915 if (hasDirectFieldReference()) getDirectFieldReference()->solveAllEnabledFieldsAndTransform();
923 if (hasClient && !hasServer)
931 if (hasClient && !hasServer)
972 if (!isReferenceSolved)
974 isReferenceSolved =
true;
978 solveRefInheritance(
true);
979 if (hasDirectFieldReference()) getDirectFieldReference()->solveOnlyReferenceEnabledField(
false);
983 solveServerOperation();
985 solveGridReference();
986 grid->solveDomainAxisRefInheritance(
true);
991 buildGridTransformationGraph();
1001 solveOnlyReferenceEnabledField(doSending2Server);
1003 if (!areAllReferenceSolved)
1005 areAllReferenceSolved =
true;
1009 solveRefInheritance(
true);
1010 if (hasDirectFieldReference()) getDirectFieldReference()->solveAllReferenceEnabledField(
false);
1013 solveServerOperation();
1015 solveGridReference();
1018 solveGridDomainAxisRef(doSending2Server);
1022 solveTransformedGrid();
1025 solveCheckMaskIndex(doSending2Server);
1032 return grid->getAttributesBufferSize(client, bufferForWriting);
1039 return grid->getDataBufferSize(client, getId(), bufferForWriting);
1059 if (freq_op.isEmpty())
1062 if (freq_offset.isEmpty())
1063 freq_offset.setValue(
NoneDu);
1075 if (operation.isEmpty())
1076 ERROR(
"void CField::solveServerOperation(void)",
1077 <<
"An operation must be defined for field \"" <<
getId() <<
"\".");
1079 std::shared_ptr<func::CFunctor> functor;
1082 #define DECLARE_FUNCTOR(MType, mtype) \
1083 if (operation.getValue().compare(#mtype) == 0) \
1085 functor.reset(new func::C##MType(dummyData)); \
1091 ERROR(
"void CField::solveServerOperation(void)",
1092 <<
"\"" << operation <<
"\" is not a valid operation.");
1111 if (!isReferenceSolvedAndTransformed) solveAllEnabledFieldsAndTransform();
1112 if (!isGridChecked) checkGridOfEnabledFields();
1114 const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value ==
true);
1115 const double defaultValue = detectMissingValues ? default_value : (!default_value.isEmpty() ? default_value : 0.0);
1121 if (hasWriterServer)
1123 if (!instantDataFilter)
1124 instantDataFilter = clientSourceFilter = std::shared_ptr<CSourceFilter>(
new CSourceFilter(gc, grid,
true,
false));
1128 if (enableOutput && !storeFilter && !fileWriterFilter)
1130 if (file && (file->mode.isEmpty() || file->mode == CFile::mode_attr::write))
1133 instantDataFilter->connectOutput(fileServerWriterFilter, 0);
1137 else if (hasIntermediateServer)
1139 if (!instantDataFilter)
1140 instantDataFilter = clientSourceFilter = std::shared_ptr<CSourceFilter>(
new CSourceFilter(gc, grid,
false,
false));
1143 if (enableOutput && !storeFilter && !fileWriterFilter)
1145 if (file && (file->mode.isEmpty() || file->mode == CFile::mode_attr::write))
1147 fileWriterFilter = std::shared_ptr<CFileWriterFilter>(
new CFileWriterFilter(gc,
this));
1148 instantDataFilter->connectOutput(fileWriterFilter, 0);
1155 if (!instantDataFilter)
1158 if (hasExpression())
1160 boost::scoped_ptr<IFilterExprNode> expr(
parseExpr(getExpression() +
'\0'));
1161 std::shared_ptr<COutputPin> filter = expr->reduce(gc, *
this);
1164 if (!field_ref.isEmpty())
1172 filter->connectOutput(filters.first, 0);
1173 filter = filters.second;
1177 instantDataFilter = filter;
1180 else if (!field_ref.isEmpty())
1181 instantDataFilter = getFieldReference(gc);
1183 else if (file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read)
1185 checkTimeAttributes();
1186 instantDataFilter = serverSourceFilter = std::shared_ptr<CSourceFilter>(
new CSourceFilter(gc, grid,
true,
false, freq_offset,
true,
1187 detectMissingValues, defaultValue));
1191 if (check_if_active.isEmpty()) check_if_active =
false;
1192 instantDataFilter = clientSourceFilter = std::shared_ptr<CSourceFilter>(
new CSourceFilter(gc, grid,
false,
true,
NoneDu,
false,
1193 detectMissingValues, defaultValue));
1198 if (enableOutput && !storeFilter && !fileWriterFilter)
1200 if (!read_access.isEmpty() && read_access)
1203 detectMissingValues, defaultValue));
1204 instantDataFilter->connectOutput(storeFilter, 0);
1207 if (file && (file->mode.isEmpty() || file->mode == CFile::mode_attr::write))
1209 fileWriterFilter = std::shared_ptr<CFileWriterFilter>(
new CFileWriterFilter(gc,
this));
1210 getTemporalDataFilter(gc, file->output_freq)->connectOutput(fileWriterFilter, 0);
1227 if (instantDataFilter || field_ref.isEmpty())
1228 ERROR(
"COutputPin* CField::getFieldReference(CGarbageCollector& gc)",
1229 "Impossible to get the field reference for a field which has already been parsed or which does not have a field_ref.");
1234 std::pair<std::shared_ptr<CFilter>, std::shared_ptr<CFilter> > filters;
1238 bool hasMissingValue = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value ==
true);
1239 double defaultValue = hasMissingValue ? default_value : (!default_value.isEmpty() ? default_value : 0.0);
1243 filters.first = filters.second = std::shared_ptr<CFilter>(
new CPassThroughFilter(gc));
1247 return filters.second;
1263 if (instantDataFilter || !hasExpression())
1264 ERROR(
"COutputPin* CField::getSelfReference(CGarbageCollector& gc)",
1265 "Impossible to add a self reference to a field which has already been parsed or which does not have an expression.");
1267 if (!selfReferenceFilter)
1269 const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value ==
true);
1270 const double defaultValue = detectMissingValues ? default_value : (!default_value.isEmpty() ? default_value : 0.0);
1272 if (file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read)
1274 if (!serverSourceFilter)
1276 checkTimeAttributes();
1277 serverSourceFilter = std::shared_ptr<CSourceFilter>(
new CSourceFilter(gc, grid,
true,
false, freq_offset,
true,
1278 detectMissingValues, defaultValue));
1281 selfReferenceFilter = serverSourceFilter;
1283 else if (!field_ref.isEmpty())
1291 if (!clientSourceFilter)
1293 if (check_if_active.isEmpty()) check_if_active =
false;
1294 clientSourceFilter = std::shared_ptr<CSourceFilter>(
new CSourceFilter(gc, grid,
true,
true,
NoneDu,
false,
1295 detectMissingValues, defaultValue));
1298 selfReferenceFilter = clientSourceFilter;
1302 return selfReferenceFilter;
1318 std::map<CDuration, std::shared_ptr<COutputPin> >::iterator it = temporalDataFilters.find(outFreq);
1320 if (it == temporalDataFilters.end())
1322 if (operation.isEmpty())
1323 ERROR(
"void CField::getTemporalDataFilter(CGarbageCollector& gc, CDuration outFreq)",
1324 <<
"An operation must be defined for field \"" << getId() <<
"\".");
1326 checkTimeAttributes(&outFreq);
1328 const bool detectMissingValues = (!detect_missing_value.isEmpty() && detect_missing_value ==
true);
1329 std::shared_ptr<CTemporalFilter> temporalFilter(
new CTemporalFilter(gc, operation,
1331 freq_op, freq_offset, outFreq, detectMissingValues));
1333 instantDataFilter->connectOutput(temporalFilter, 0);
1335 it = temporalDataFilters.insert(std::make_pair(outFreq, temporalFilter)).first;
1354 if (instantDataFilter || !hasExpression())
1355 ERROR(
"COutputPin* CField::getSelfTemporalDataFilter(CGarbageCollector& gc)",
1356 "Impossible to add a self reference to a field which has already been parsed or which does not have an expression.");
1358 if (!selfReferenceFilter) getSelfReference(gc) ;
1360 if (serverSourceFilter || clientSourceFilter)
1362 if (operation.isEmpty())
1363 ERROR(
"void CField::getSelfTemporalDataFilter(CGarbageCollector& gc, CDuration outFreq)",
1364 <<
"An operation must be defined for field \"" << getId() <<
"\".");
1366 checkTimeAttributes(&outFreq);
1368 const bool detectMissingValues = (!detect_missing_value.isEmpty() && detect_missing_value ==
true);
1369 std::shared_ptr<CTemporalFilter> temporalFilter(
new CTemporalFilter(gc, operation,
1371 freq_op, freq_offset, outFreq, detectMissingValues));
1373 selfReferenceFilter->connectOutput(temporalFilter, 0);
1374 return temporalFilter ;
1376 else if (!field_ref.isEmpty())
1404 if (grid_ref.isEmpty() && domain_ref.isEmpty() && axis_ref.isEmpty() && scalar_ref.isEmpty())
1406 ERROR(
"CField::solveGridReference(void)",
1407 <<
"A grid must be defined for field '" << getFieldOutputName() <<
"' .");
1409 else if (!grid_ref.isEmpty() && (!domain_ref.isEmpty() || !axis_ref.isEmpty() || !scalar_ref.isEmpty()))
1411 ERROR(
"CField::solveGridReference(void)",
1412 <<
"Field '" << getFieldOutputName() <<
"' has both a grid and a domain/axis/scalar." << std::endl
1413 <<
"Please define either 'grid_ref' or 'domain_ref'/'axis_ref'/'scalar_ref'.");
1416 if (grid_ref.isEmpty())
1418 std::vector<CDomain*> vecDom;
1419 std::vector<CAxis*> vecAxis;
1420 std::vector<CScalar*> vecScalar;
1421 std::vector<int> axisDomainOrderTmp;
1423 std::vector<CDomain*> vecDomRef;
1424 std::vector<CAxis*> vecAxisRef;
1425 std::vector<CScalar*> vecScalarRef;
1428 if (!domain_ref.isEmpty())
1435 vecDomRef.back()->domain_ref=domain_ref;
1436 axisDomainOrderTmp.push_back(2);
1438 else ERROR(
"CField::solveGridReference(void)",
1439 <<
"Invalid reference to domain '" << domain_ref.getValue() <<
"'.");
1442 if (!axis_ref.isEmpty())
1448 vecAxisRef.back()->axis_ref=axis_ref;
1449 axisDomainOrderTmp.push_back(1);
1451 else ERROR(
"CField::solveGridReference(void)",
1452 <<
"Invalid reference to axis '" << axis_ref.getValue() <<
"'.");
1455 if (!scalar_ref.isEmpty())
1461 vecScalarRef.back()->scalar_ref=scalar_ref;
1462 axisDomainOrderTmp.push_back(0);
1464 else ERROR(
"CField::solveGridReference(void)",
1465 <<
"Invalid reference to scalar '" << scalar_ref.getValue() <<
"'.");
1469 for (
int idx = 0; idx < axisDomainOrderTmp.size(); ++idx)
1471 axisDomainOrder(idx) = axisDomainOrderTmp[idx];
1482 else ERROR(
"CField::solveGridReference(void)",
1483 <<
"Invalid reference to grid '" << grid_ref.getValue() <<
"'.");
1491 grid->solveDomainAxisRef(checkAtt);
1498 grid->checkMaskIndex(doSendingIndex);
1507 std::vector<CGrid*> grids;
1509 grids.push_back(getDirectFieldReference()->
grid);
1511 if (!grid_path.isEmpty())
1514 size_t start = 0, end;
1518 end = grid_path.getValue().find(
',', start);
1519 if (end != std::string::npos)
1521 gridId = grid_path.getValue().substr(start, end - start);
1525 gridId = grid_path.getValue().substr(start);
1528 ERROR(
"void CField::solveTransformedGrid()",
1529 <<
"Invalid grid_path, the grid '" << gridId <<
"' does not exist.");
1533 while (end != std::string::npos);
1536 grids.push_back(
grid);
1538 for (
size_t i = 0,
count = grids.size() - 1; i <
count; ++i)
1540 CGrid *gridSrc = grids[i];
1541 CGrid *gridDest = grids[i + 1];
1578 if (this->group_ref.isEmpty())
return;
1579 StdString gref = this->group_ref.getValue();
1581 if (!CFieldGroup::has(gref))
1582 ERROR(
"CGroupTemplate<CField, CFieldGroup, CFieldAttributes>::solveRefInheritance(void)",
1583 <<
"[ gref = " << gref <<
"]"
1584 <<
" invalid group name !");
1586 CFieldGroup* group = CFieldGroup::get(gref);
1587 CFieldGroup* owner = CFieldGroup::get(boost::polymorphic_downcast<CFieldGroup*>(
this));
1588 owner->setAttributes(group);
1590 std::vector<CField*> allChildren = group->getAllChildren();
1591 std::vector<CField*>::iterator it = allChildren.begin(), end = allChildren.end();
1593 for (; it != end; it++)
1596 if (child->
hasId()) owner->createChild()->field_ref.setValue(child->
getId());
1605 recvDataSrv = (recvDataSrv - addOffset) / scaleFactor;
1612 recvDataSrv = recvDataSrv * scaleFactor + addOffset;
1621 for (
size_t idx = 0; idx < outIndexServer.numElements(); ++idx)
1623 fieldOut(outIndexServer(idx)) = recvDataSrv(outIndexClient(idx));
1633 for (
size_t idx = 0; idx < outIndexServer.numElements(); ++idx)
1635 recvDataSrv(outIndexClient(idx)) = fieldIn(outIndexServer(idx));
1645 for (
size_t idx = 0; idx < outIndexServer.numElements(); ++idx)
1647 fieldOut((idx)) = recvDataSrv(outIndexClient(idx));
1658 SuperClass::parse(node);
1659 if (node.goToChildElement())
1663 if (node.getElementName() ==
"variable" || node.getElementName() ==
"variable_group") this->getVirtualVariableGroup()->parseChild(node);
1664 else if (node.getElementName() ==
"expr")
if (node.getContent(newContent)) content+=newContent ;
1665 }
while (node.goToNextElement());
1666 node.goToParentElement();
1668 if (node.getContent(newContent)) content=newContent ;
1683 std::vector<StdString>::iterator it;
1684 if (!domain_ref.isEmpty())
1687 it = std::find(domainList.begin(), domainList.end(), domain_ref.getValue());
1691 if (!axis_ref.isEmpty())
1693 std::vector<StdString> axisList = cgPtr->
getAxisList();
1694 it = std::find(axisList.begin(), axisList.end(), axis_ref.getValue());
1698 if (!scalar_ref.isEmpty())
1701 it = std::find(scalarList.begin(), scalarList.end(), scalar_ref.getValue());
1712 return vVariableGroup->createChild(
id);
1719 return vVariableGroup->createChildGroup(
id);
1727 client = contextClient;
1733 if (file->mode.isEmpty() || (!file->mode.isEmpty() && file->mode == CFile::mode_attr::write))
1734 grid->setContextClient(contextClient);
1737 grid->setContextClient(contextClient);
1752 std::vector<CVariable*> allVar = getAllVariables();
1753 std::vector<CVariable*>::const_iterator it = allVar.begin();
1754 std::vector<CVariable*>::const_iterator itE = allVar.end();
1756 for (; it != itE; ++it)
1758 this->sendAddVariable((*it)->getId(), client);
1759 (*it)->sendAllAttributesToServer(client);
1760 (*it)->sendValue(client);
1773 if (grid_ref.isEmpty())
1775 grid_ref=grid->getId() ;
1776 SuperClass::sendAllAttributesToServer(client) ;
1779 else SuperClass::sendAllAttributesToServer(client) ;
1786 sendAddItem(
id, (
int)EVENT_ID_ADD_VARIABLE, client);
1793 sendAddItem(
id, (
int)EVENT_ID_ADD_VARIABLE_GROUP, client);
1804 get(id)->recvAddVariable(*buffer);
1824 get(id)->recvAddVariableGroup(*buffer);
1833 addVariableGroup(
id);
1843 bool isFieldRead = file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read;
1844 bool isFieldWrite = file && ( file->mode.isEmpty() || file->mode == CFile::mode_attr::write);
1845 if (isFieldRead && !(operation.getValue() ==
"instant" || operation.getValue() ==
"once") )
1846 ERROR(
"void CField::checkTimeAttributes(void)",
1847 <<
"Unsupported operation for field '" << getFieldOutputName() <<
"'." << std::endl
1848 <<
"Currently only \"instant\" is supported for fields read from file.")
1850 if (freq_op.isEmpty())
1852 if (operation.getValue() ==
"instant")
1854 if (isFieldRead || isFieldWrite) freq_op.setValue(file->output_freq.getValue());
1855 else freq_op=*freqOp ;
1860 if (freq_offset.isEmpty())
1861 freq_offset.setValue(isFieldRead ?
NoneDu : (freq_op.getValue() -
TimeStep));
1872 if (!expr.isEmpty() &&
content.empty())
1885 return (!expr.isEmpty() || !
content.empty());
std::map< int, StdSize > getGridAttributesBufferSize(CContextClient *client, bool bufferForWriting=false)
void solveTransformedGrid()
A simple pass-through filter with one input slot.
void checkWriteFile(void)
void buildFilterGraph(CGarbageCollector &gc, bool enableOutput)
Constructs the graph filter for the field, enabling or not the data output.
void sendEvent(CEventClient &event)
In case of attached mode, the current context must be reset to context for client.
std::shared_ptr< CDataOutput > getDataOutput(void) const
Get data writer object.
#define DEFINE_REF_FUNC(type, name_)
static ENodeType GetType(void)
void inputField(CArray< double, 3 > &fieldOut)
void autoTriggerIfNeeded(void)
const CDuration TimeStep(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0)
void solveDomainAxisRef(bool areAttributesChecked)
CFile * getRelFile(void) const
EReadField readField(void)
Read field from a file.
A generic temporal filter with one input slot wrapping any type of temporal operation.
CDuration freq_operation_srv
std::shared_ptr< COutputPin > getTemporalDataFilter(CGarbageCollector &gc, CDuration outFreq)
Returns the temporal filter corresponding to the field's temporal operation for the specified operati...
void outputField(CArray< double, 3 > &fieldOut)
void parse(xml::CXMLNode &node)
static bool has(const string &id)
std::shared_ptr< COutputPin > getFieldReference(CGarbageCollector &gc)
Returns the filter needed to handle the field reference.
void setRelFile(CFile *_file)
Mutateur ///.
static CAxis * createAxis()
std::shared_ptr< CCalendar > getCalendar(void) const
Accesseurs ///.
double getCumulatedTime(void)
CContextServer * server
Concrete context server.
IFilterExprNode * parseExpr(const std::string &strExpr)
void sendAllAttributesToServer()
static void recvReadDataReady(CEventServer &event)
void solveOnlyReferenceEnabledField(bool doSending2Server)
const CDuration NoneDu(0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0)
std::shared_ptr< COutputPin > getInstantDataFilter()
void outputCompressedField(CArray< double, 1 > &fieldOut)
A terminal filter which transmits the packets it receives to a field for writting in a file...
void completeGrid(CGrid *transformGridSrc=0)
Complete all the necessary (and lacking) attributes of a grid This function is similar to gridTransfo...
static StdString GetName(void)
Accesseurs statiques ///.
CField(void)
Constructeurs ///.
static double recvFieldTimeout
Time to wait for data before issuing an error when receiving a field.
std::map< CContextClient *, std::map< int, int > > nbReadSenders
static CGrid * cloneGrid(const StdString &idNewGrid, CGrid *gridSrc)
const std::list< int > & getRanksServerLeader(void) const
Get leading server in the group of connected server.
const StdString & getId(void) const
Accesseurs ///.
CVariableGroup * addVariableGroup(const string &id="")
void setContextClient(CContextClient *newContextClient)
CGrid * getRelGrid(void) const
Accesseurs ///.
A terminal filter which stores all the packets it receives.
////////////////////// Déclarations ////////////////////// ///
void invertScaleFactorAddOffset(double scaleFactor, double addOffset)
bool doGridHaveDataToWrite()
Verify whether one server need to write data There are some cases on which one server has nodata to w...
void generateNewTransformationGridDest()
Generate a new grid destination if there are more than one grid source pointing to a same grid destin...
void computeWrittenIndex()
Compute the index to for write data into a file.
void solveDomainAxisBaseRef()
A terminal filter which writes the packets it receives in a file.
virtual void solveDescInheritance(bool apply, const CAttributeMap *const parent=0)
Traitements ///.
void setUseCompressedOutput()
std::map< int, StdSize > getGridDataBufferSize(CContextClient *client, bool bufferForWriting=false)
void solveServerOperation(void)
void solveAllReferenceEnabledField(bool doSending2Server)
virtual ~CField(void)
Destructeur ///.
bool sendReadDataRequestIfNeeded(void)
Send request new data read from file if need be, that is the current data is out-of-date.
void solveGridDomainAxisBaseRef()
static StdString GetDefName(void)
void checkIfMustAutoTrigger(void)
CDate lastDataRequestedFromServer
static void recvUpdateData(CEventServer &event)
void sendAddAllVariables(CContextClient *client)
vector< CVariable * > getAllVariables(void) const
void sendGridComponentOfEnabledFields()
CATCH CScalarAlgorithmReduceScalar::CScalarAlgorithmReduceScalar(CScalar *scalarDestination, CScalar *scalarSource, CReduceScalarToScalar *algo ERROR)("CScalarAlgorithmReduceScalar::CScalarAlgorithmReduceScalar(CScalar* scalarDestination, CScalar* scalarSource, CReduceScalarToScalar* algo)",<< "Operation must be defined."<< "Scalar source "<< scalarSource->getId()<< std::endl<< "Scalar destination "<< scalarDestination->getId())
std::shared_ptr< COutputPin > getSelfReference(CGarbageCollector &gc)
Returns the filter needed to handle a self reference in the field's expression.
A context can be both on client and on server side.
std::vector< StdString > getScalarList()
Get list of id of scalar.
////////////////////// Déclarations ////////////////////// ///
void writeUpdateData(const CArray< double, 1 > &data)
void push(int rank, int nbSender, CMessage &msg)
void checkForLateDataFromServer(void)
CContextClient * getContextClient()
void setVirtualVariableGroup(CVariableGroup *newVVariableGroup)
std::map< CGrid *, std::pair< bool, StdString > > & getTransGridSource()
std::shared_ptr< COutputPin > instantDataFilter
The output pin of the filter providing the instant data for the field.
const std::vector< StdString > & getRefDomainAxisIds()
This function retrieves Id of corresponding domain_ref and axis_ref (if any) of a field...
void sendGridOfEnabledFields()
void sendUpdateData(const CArray< double, 1 > &data)
bool hasGridMask(void) const
void solveGridReference(void)
Traitements ///.
static bool dispatchEvent(CEventServer &event)
map< int, CArray< size_t, 1 > > outLocalIndexStoreOnClient
bool wasDataRequestedFromServer
void initRead(void)
Initialize a file in order to write into it.
int serverSize
Size of server group.
bool wasDataAlreadyReceivedFromServer
static const xios::CCalendar & getCalendar(const std::string &idFunc)
bool sendReadDataRequest(const CDate &tsDataRequested)
static CGrid * createGrid(CDomain *domain)
Instanciateurs Statiques ///.
CArray< double, 1 > recvDataSrv
bool hasId(void) const
Tests ///.
void buildGridTransformationGraph()
Build up graph of grids which plays role of destination and source in grid transformation This functi...
void solveRefInheritance(void)
CArray< int, 1 > storeIndex_client
void checkTimeAttributes(CDuration *freqOp=NULL)
Vérifications ///.
static StdString generateId(const std::vector< CDomain * > &domains, const std::vector< CAxis * > &axis, const std::vector< CScalar * > &scalars, const CArray< int, 1 > &axisDomainOrder=CArray< int, 1 >())
void checkGridOfEnabledFields()
CVariableGroup * vVariableGroup
Propriétés privées ///.
void transformGrid(CGrid *transformGridSrc)
bool isReferenceSolvedAndTransformed
////////////////////// Déclarations ////////////////////// ///
void resetNStep(int nstep=0)
enum xios::_node_type ENodeType
////////////////////// Définitions ////////////////////// ///
void scaleFactorAddOffset(double scaleFactor, double addOffset)
void incrementNStep(void)
void sendAddVariable(const string &id, CContextClient *client)
static CTimer & get(std::string name)
void addTransGridSource(CGrid *gridSrc)
CDate lastDataReceivedFromServer
void updateRef(CGrid *grid)
bool hasExpression(void) const
func::CFunctor::ETimeType getOperationTimeType() const
CVariable * addVariable(const string &id="")
void recvReadDataRequest(void)
Receive data request sent from client and process it Every time server receives this request...
static void recvAddVariable(CEventServer &event)
const string & getExpression(void)
Returns string arithmetic expression associated to the field.
std::vector< StdString > domAxisScalarIds_
void solveAllEnabledFieldsAndTransform()
Solve reference of all enabled fields even the source fields .
bool doGridHaveDataDistributed(CContextClient *client=0)
A basic garbage collector which ensures no old packets linger in the filter graph.
std::vector< StdString > getAxisList()
Get list of id of axis.
std::shared_ptr< COutputPin > getSelfTemporalDataFilter(CGarbageCollector &gc, CDuration outFreq)
Returns the temporal filter corresponding to the field's temporal operation for the specified operati...
ENodeType getType(void) const
Accesseurs ///.
func::CFunctor::ETimeType operationTimeType
The type of operation attached to the field.
static CScalar * createScalar()
A source filter is the entry point of the data in the graph of filters.
std::shared_ptr< CSourceFilter > serverSourceFilter
The source filter for data provided by the server.
void sendAddVariableGroup(const string &id, CContextClient *client)
bool getUseCompressedOutput() const
void solveCheckMaskIndex(bool doSendingIndex)
bool checkBuffersAndListen(bool enableEventsProcessing=true)
Try to send the buffers and receive possible answers.
std::vector< StdString > getDomainList()
Get list of id of domains.
CVariableGroup * getVirtualVariableGroup(void) const
static void recvAddVariableGroup(CEventServer &event)
bool isActive(bool atCurrentTimestep=false) const
static CContext * getCurrent(void)
Get current context.
CContextClient * client
Concrete contex client.
bool isServerLeader(void) const
Check if client connects to leading server.
std::shared_ptr< CDataInput > getDataInput(void) const
Get data reader object.
static CDomain * createDomain()
size_t getGlobalWrittenSize(void)
size_t getGlobalWrittenSize(void)
void solveGridDomainAxisRef(bool checkAtt)