Ignore:
Timestamp:
11/15/17 12:14:34 (7 years ago)
Author:
yushan
Message:

dev_omp

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/branch_openmp/src/node/field.cpp

    r1209 r1328  
    2424#include "spatial_transform_filter.hpp" 
    2525 
     26#include <stdio.h> 
     27 
    2628namespace xios{ 
    2729 
    2830   /// ////////////////////// 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 
    2947 
    3048   CField::CField(void) 
     
    3856      , hasTimeInstant(false) 
    3957      , hasTimeCentered(false) 
     58      , wasDataRequestedFromServer(false) 
    4059      , wasDataAlreadyReceivedFromServer(false) 
    4160      , isEOF(false) 
     
    5271      , hasTimeInstant(false) 
    5372      , hasTimeCentered(false) 
     73      , wasDataRequestedFromServer(false) 
    5474      , wasDataAlreadyReceivedFromServer(false) 
    5575      , isEOF(false) 
     
    261281    lastDataRequestedFromServer = tsDataRequested; 
    262282 
    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) 
    264285    { 
    265286      CEventClient event(getType(), EVENT_ID_READ_DATA); 
     
    277298    else 
    278299      serverSourceFilter->signalEndOfStream(tsDataRequested); 
     300 
     301    wasDataRequestedFromServer = true; 
    279302 
    280303    return !isEOF; 
     
    293316    while (currentDate >= lastDataRequestedFromServer) 
    294317    { 
    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 
    302323      dataRequested |= sendReadDataRequest(lastDataRequestedFromServer + file->output_freq); 
    303324    } 
     
    435456  { 
    436457    CContext* context = CContext::getCurrent(); 
    437     int record; 
    438458    std::map<int, CArray<double,1> > data; 
     459    const bool wasEOF = isEOF; 
    439460 
    440461    for (int i = 0; i < ranks.size(); i++) 
    441462    { 
    442463      int rank = ranks[i]; 
     464      int record; 
    443465      *buffers[i] >> record; 
    444466      isEOF = (record == int(-1)); 
     
    459481 
    460482    if (isEOF) 
     483    { 
     484      if (!wasEOF) 
     485        dateEOF = lastDataReceivedFromServer; 
     486 
    461487      serverSourceFilter->signalEndOfStream(lastDataReceivedFromServer); 
     488    } 
    462489    else 
    463490      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    } 
    464524  } 
    465525 
     
    694754     CContext* context = CContext::getCurrent(); 
    695755     solveOnlyReferenceEnabledField(doSending2Server); 
    696      int myRank; 
    697      MPI_Comm_rank(context->client->intraComm, &myRank); 
     756 
     757     //std::cout<<"Field "<<this->getId()<<" areAllReferenceSolved = "<<areAllReferenceSolved<<std::endl;  
    698758 
    699759     if (!areAllReferenceSolved) 
    700760     { 
    701761        areAllReferenceSolved = true; 
    702  
     762        //std::cout<<"Field "<<this->getId()<<" all reference solved"<<std::endl;  
    703763        if (context->hasClient) 
    704764        { 
     
    825885       // Check if the data is to be read from a file 
    826886       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                                                                                                      true, 
     887       { 
     888         checkAttributes(); 
     889         instantDataFilter = serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, freq_offset, true, 
    830890                                                                                                     detectMissingValues, defaultValue)); 
     891       } 
    831892       else // The data might be passed from the model 
    832893       { 
     
    910971       { 
    911972         if (!serverSourceFilter) 
    912            serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, 
    913                                                                                    freq_offset.isEmpty() ? NoneDu : freq_offset, 
    914                                                                                    true, 
     973         { 
     974           checkAttributes(); 
     975           serverSourceFilter = boost::shared_ptr<CSourceFilter>(new CSourceFilter(gc, grid, freq_offset, true, 
    915976                                                                                   detectMissingValues, defaultValue)); 
     977         } 
    916978 
    917979         selfReferenceFilter = serverSourceFilter; 
     
    9581020               << "An operation must be defined for field \"" << getId() << "\"."); 
    9591021 
    960        if (freq_op.isEmpty()) 
    961          freq_op.setValue(TimeStep); 
    962        if (freq_offset.isEmpty()) 
    963          freq_offset.setValue(NoneDu); 
     1022       checkAttributes(); 
    9641023 
    9651024       const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    966         
    9671025       boost::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation, 
    9681026                                                                             CContext::getCurrent()->getCalendar()->getInitDate(), 
     
    10001058               << "An operation must be defined for field \"" << getId() << "\"."); 
    10011059 
    1002        if (freq_op.isEmpty()) freq_op.setValue(TimeStep); 
    1003        if (freq_offset.isEmpty()) freq_offset.setValue(NoneDu); 
     1060       checkAttributes(); 
    10041061 
    10051062       const bool detectMissingValues = (!detect_missing_value.isEmpty() && !default_value.isEmpty() && detect_missing_value == true); 
    1006  
    10071063       boost::shared_ptr<CTemporalFilter> temporalFilter(new CTemporalFilter(gc, operation, 
    10081064                                                                             CContext::getCurrent()->getCalendar()->getInitDate(), 
     
    14501506 
    14511507   /*! 
     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   /*! 
    14521530    * Returns string arithmetic expression associated to the field. 
    14531531    * \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.