Changeset 1328 for XIOS/dev/branch_openmp/src/node/field.cpp
- Timestamp:
- 11/15/17 12:14:34 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/branch_openmp/src/node/field.cpp
r1209 r1328 24 24 #include "spatial_transform_filter.hpp" 25 25 26 #include <stdio.h> 27 26 28 namespace xios{ 27 29 28 30 /// ////////////////////// Dfinitions ////////////////////// /// 31 32 CField* CField::my_getDirectFieldReference(void) const 33 { 34 // if (this->field_ref.isEmpty()) 35 // ERROR("C" #type "* C" #type "::getDirect" #type "Reference(void)", 36 // << "The " #name_ " with id = '" << getId() << "'" 37 // << " has no " #name_ "_ref."); 38 39 // if (!C##type::has(this->name_##_ref)) 40 // ERROR("C" #type "* C" #type "::getDirect" #type "Reference(void)", 41 // << this->name_##_ref 42 // << " refers to an unknown " #name_ " id."); 43 44 return CField::get(this->field_ref); 45 } 46 29 47 30 48 CField::CField(void) … … 38 56 , hasTimeInstant(false) 39 57 , hasTimeCentered(false) 58 , wasDataRequestedFromServer(false) 40 59 , wasDataAlreadyReceivedFromServer(false) 41 60 , isEOF(false) … … 52 71 , hasTimeInstant(false) 53 72 , hasTimeCentered(false) 73 , wasDataRequestedFromServer(false) 54 74 , wasDataAlreadyReceivedFromServer(false) 55 75 , isEOF(false) … … 261 281 lastDataRequestedFromServer = tsDataRequested; 262 282 263 if (!isEOF) // No need to send the request if we already know we are at EOF 283 // No need to send the request if we are sure that we are already at EOF 284 if (!isEOF || context->getCalendar()->getCurrentDate() <= dateEOF) 264 285 { 265 286 CEventClient event(getType(), EVENT_ID_READ_DATA); … … 277 298 else 278 299 serverSourceFilter->signalEndOfStream(tsDataRequested); 300 301 wasDataRequestedFromServer = true; 279 302 280 303 return !isEOF; … … 293 316 while (currentDate >= lastDataRequestedFromServer) 294 317 { 295 #pragma omp critical (_output) 296 { 297 info(20) << "currentDate : " << currentDate << endl ; 298 info(20) << "lastDataRequestedFromServer : " << lastDataRequestedFromServer << endl ; 299 info(20) << "file->output_freq.getValue() : " << file->output_freq.getValue() << endl ; 300 info(20) << "lastDataRequestedFromServer + file->output_freq.getValue() : " << lastDataRequestedFromServer + file->output_freq << endl ; 301 } 318 info(20) << "currentDate : " << currentDate << endl ; 319 info(20) << "lastDataRequestedFromServer : " << lastDataRequestedFromServer << endl ; 320 info(20) << "file->output_freq.getValue() : " << file->output_freq.getValue() << endl ; 321 info(20) << "lastDataRequestedFromServer + file->output_freq.getValue() : " << lastDataRequestedFromServer + file->output_freq << endl ; 322 302 323 dataRequested |= sendReadDataRequest(lastDataRequestedFromServer + file->output_freq); 303 324 } … … 435 456 { 436 457 CContext* context = CContext::getCurrent(); 437 int record;438 458 std::map<int, CArray<double,1> > data; 459 const bool wasEOF = isEOF; 439 460 440 461 for (int i = 0; i < ranks.size(); i++) 441 462 { 442 463 int rank = ranks[i]; 464 int record; 443 465 *buffers[i] >> record; 444 466 isEOF = (record == int(-1)); … … 459 481 460 482 if (isEOF) 483 { 484 if (!wasEOF) 485 dateEOF = lastDataReceivedFromServer; 486 461 487 serverSourceFilter->signalEndOfStream(lastDataReceivedFromServer); 488 } 462 489 else 463 490 serverSourceFilter->streamDataFromServer(lastDataReceivedFromServer, data); 491 } 492 493 void CField::checkForLateDataFromServer(void) 494 { 495 CContext* context = CContext::getCurrent(); 496 const CDate& currentDate = context->getCalendar()->getCurrentDate(); 497 498 // Check if data previously requested has been received as expected 499 if (wasDataRequestedFromServer && (!isEOF || currentDate <= dateEOF)) 500 { 501 CTimer timer("CField::checkForLateDataFromServer"); 502 503 bool isDataLate; 504 do 505 { 506 const CDate nextDataDue = wasDataAlreadyReceivedFromServer ? (lastDataReceivedFromServer + file->output_freq) : context->getCalendar()->getInitDate(); 507 isDataLate = nextDataDue < currentDate; 508 509 if (isDataLate) 510 { 511 timer.resume(); 512 513 context->checkBuffersAndListen(); 514 515 timer.suspend(); 516 } 517 } 518 while (isDataLate && timer.getCumulatedTime() < CXios::recvFieldTimeout); 519 520 if (isDataLate) 521 ERROR("void CField::checkForLateDataFromServer(void)", 522 << "Late data at timestep = " << currentDate); 523 } 464 524 } 465 525 … … 694 754 CContext* context = CContext::getCurrent(); 695 755 solveOnlyReferenceEnabledField(doSending2Server); 696 int myRank; 697 MPI_Comm_rank(context->client->intraComm, &myRank);756 757 //std::cout<<"Field "<<this->getId()<<" areAllReferenceSolved = "<<areAllReferenceSolved<<std::endl; 698 758 699 759 if (!areAllReferenceSolved) 700 760 { 701 761 areAllReferenceSolved = true; 702 762 //std::cout<<"Field "<<this->getId()<<" all reference solved"<<std::endl; 703 763 if (context->hasClient) 704 764 { … … 825 885 // Check if the data is to be read from a file 826 886 else if (file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read) 827 instantDataFilter = serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid,828 freq_offset.isEmpty() ? NoneDu : freq_offset,829 887 { 888 checkAttributes(); 889 instantDataFilter = serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, freq_offset, true, 830 890 detectMissingValues, defaultValue)); 891 } 831 892 else // The data might be passed from the model 832 893 { … … 910 971 { 911 972 if (!serverSourceFilter) 912 serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid,913 freq_offset.isEmpty() ? NoneDu : freq_offset,914 973 { 974 checkAttributes(); 975 serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, freq_offset, true, 915 976 detectMissingValues, defaultValue)); 977 } 916 978 917 979 selfReferenceFilter = serverSourceFilter; … … 958 1020 << "An operation must be defined for field \"" << getId() << "\"."); 959 1021 960 if (freq_op.isEmpty()) 961 freq_op.setValue(TimeStep); 962 if (freq_offset.isEmpty()) 963 freq_offset.setValue(NoneDu); 1022 checkAttributes(); 964 1023 965 1024 const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 966 967 1025 boost::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation, 968 1026 CContext::getCurrent()->getCalendar()->getInitDate(), … … 1000 1058 << "An operation must be defined for field \"" << getId() << "\"."); 1001 1059 1002 if (freq_op.isEmpty()) freq_op.setValue(TimeStep); 1003 if (freq_offset.isEmpty()) freq_offset.setValue(NoneDu); 1060 checkAttributes(); 1004 1061 1005 1062 const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 1006 1007 1063 boost::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation, 1008 1064 CContext::getCurrent()->getCalendar()->getInitDate(), … … 1450 1506 1451 1507 /*! 1508 * Check on freq_off and freq_op attributes. 1509 */ 1510 void CField::checkAttributes(void) 1511 { 1512 bool isFieldRead = file && !file->mode.isEmpty() && file->mode == CFile::mode_attr::read; 1513 if (isFieldRead && operation.getValue() != "instant") 1514 ERROR("void CField::checkAttributes(void)", 1515 << "Unsupported operation for field '" << getFieldOutputName() << "'." << std::endl 1516 << "Currently only \"instant\" is supported for fields read from file.") 1517 1518 if (freq_op.isEmpty()) 1519 { 1520 if (operation.getValue() == "instant") 1521 freq_op.setValue(file->output_freq.getValue()); 1522 else 1523 freq_op.setValue(TimeStep); 1524 } 1525 if (freq_offset.isEmpty()) 1526 freq_offset.setValue(isFieldRead ? NoneDu : (freq_op.getValue() - TimeStep)); 1527 } 1528 1529 /*! 1452 1530 * Returns string arithmetic expression associated to the field. 1453 1531 * \return if content is defined return content string, otherwise, if "expr" attribute is defined, return expr string.
Note: See TracChangeset
for help on using the changeset viewer.