Changeset 460


Ignore:
Timestamp:
01/20/14 11:16:48 (10 years ago)
Author:
ymipsl
Message:

New functionnalities : expression may combine fields after temporal operation (averaging, min, max ...) using the operator @

YM

Location:
XIOS/trunk/src
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/attribute.hpp

    r445 r460  
    4242//            template <typename T> inline bool isType(void) const; 
    4343            virtual void set(const CAttribute& ) =0 ; 
     44            virtual void reset(void ) =0 ; 
    4445            /// Destructeur /// 
    4546            virtual ~CAttribute(void); 
  • XIOS/trunk/src/attribute_array.hpp

    r445 r460  
    3636            void set(const CAttribute& attr) ; 
    3737            void set(const CAttributeArray& attr) ; 
    38              
     38            void reset(void) ;             
    3939            void setInheritedValue(const CAttributeArray& attr ); 
    4040            void setInheritedValue(const CAttribute& attr ); 
  • XIOS/trunk/src/attribute_array_impl.hpp

    r447 r460  
    4141      ///-------------------------------------------------------------- 
    4242 
     43      template <typename T_numtype, int N_rank> 
     44      void CAttributeArray<T_numtype, N_rank>::reset(void) 
     45      { 
     46        CArray<T_numtype, N_rank>::reset() ; 
     47        inheritedValue.reset() ; 
     48      } 
     49       
    4350      template <typename T_numtype, int N_rank> 
    4451      CArray<T_numtype,N_rank> CAttributeArray<T_numtype, N_rank>::getValue(void) const 
  • XIOS/trunk/src/attribute_enum.hpp

    r445 r460  
    3939            void set(const CAttribute& attr) ; 
    4040            void set(const CAttributeEnum& attr) ; 
     41            void reset(void); 
    4142             
    4243            void setInheritedValue(const CAttributeEnum& attr ); 
  • XIOS/trunk/src/attribute_enum_impl.hpp

    r445 r460  
    4444 
    4545      ///-------------------------------------------------------------- 
    46  
     46      template <class T> 
     47      void CAttributeEnum<T>::reset(void) 
     48      { 
     49         CEnum<T>::reset() ; 
     50         inheritedValue.reset() ; 
     51      } 
     52       
    4753      template <class T> 
    4854      typename T::t_enum CAttributeEnum<T>::getValue(void) const 
  • XIOS/trunk/src/attribute_template.hpp

    r445 r460  
    4848            void set(const CAttribute& attr) ; 
    4949            void set(const CAttributeTemplate& attr) ; 
     50            void reset(void) ; 
    5051 
    5152            void setInheritedValue(const CAttributeTemplate& attr ); 
  • XIOS/trunk/src/attribute_template_impl.hpp

    r445 r460  
    6060*/ 
    6161      ///-------------------------------------------------------------- 
     62      template <class T> 
     63      void CAttributeTemplate<T>::reset(void) 
     64      { 
     65        CType<T>::reset() ; 
     66        inheritedValue.reset() ; 
     67      } 
     68 
    6269 
    6370      template <class T> 
  • XIOS/trunk/src/node/field.cpp

    r459 r460  
    2525      , last_Write(), last_operation() 
    2626      , foperation(), hasInstantData(false), hasExpression(false) 
    27       , active(false) , hasOutputFile(false), slotUpdateDate(NULL) 
     27      , active(false) , hasOutputFile(false),hasFieldOut(false), slotUpdateDate(NULL) 
    2828      , processed(false) 
    2929      { /* Ne rien faire de plus */ } 
     
    3737      , last_Write(), last_operation() 
    3838      , foperation(), hasExpression(false) 
    39       , active(false), hasOutputFile(false), slotUpdateDate(NULL) 
     39      , active(false), hasOutputFile(false), hasFieldOut(false), slotUpdateDate(NULL) 
    4040      , processed(false) 
    4141   { /* Ne rien faire de plus */ } 
     
    387387      using namespace func; 
    388388       
    389       if (!hasOutputFile) return ; 
     389      if (!hasOutputFile && !hasFieldOut) return ; 
    390390       
    391391      StdString id ; 
     
    418418      if (context->hasServer) 
    419419      { 
    420          this->freq_operation_srv = 
    421              CDuration::FromString(this->file->output_freq.getValue()); 
    422          this->freq_write_srv     = 
    423              CDuration::FromString(this->file->output_freq.getValue()); 
     420         if (hasOutputFile)  
     421         { 
     422           this->freq_operation_srv =CDuration::FromString(this->file->output_freq.getValue()); 
     423           this->freq_write_srv = CDuration::FromString(this->file->output_freq.getValue()); 
     424         } 
    424425         this->lastlast_Write_srv     = boost::shared_ptr<CDate> 
    425426                        (new CDate(context->getCalendar()->getInitDate())); 
     
    431432//             boost::shared_ptr<func::CFunctor>(new CInstant(this->data_srv)); 
    432433              
    433          const CDuration toffset = this->freq_operation_srv - freq_offset_ - context->getCalendar()->getTimeStep();  
    434          *this->last_operation_srv   = *this->last_operation_srv - toffset;  
     434         if (hasOutputFile)  
     435         { 
     436           const CDuration toffset = this->freq_operation_srv - freq_offset_ - context->getCalendar()->getTimeStep();  
     437           *this->last_operation_srv   = *this->last_operation_srv - toffset; 
     438         } 
    435439      } 
    436440       
     
    438442//      {                   
    439443         this->freq_operation = CDuration::FromString(freq_op.getValue()); 
    440          this->freq_write     = CDuration::FromString(this->file->output_freq.getValue()); 
     444         if (hasOutputFile) this->freq_write     = CDuration::FromString(this->file->output_freq.getValue()); 
     445         if (hasFieldOut)  
     446         { 
     447           this->freq_write = CDuration::FromString(this->fieldOut->freq_op.getValue()); 
     448         } 
    441449         this->last_Write     = boost::shared_ptr<CDate> 
    442450                        (new CDate(context->getCalendar()->getInitDate())); 
     
    665673      expression=CFieldNode::newNode(simpleExpr) ; 
    666674      delete simpleExpr ; 
    667       set<string> fieldIds ; 
    668       expression->getFieldIds(fieldIds) ; 
    669       for (set<string>::iterator it=fieldIds.begin() ; it!=fieldIds.end();++it) if (*it!="this") CField::get(*it)->processEnabledField() ; 
    670        
    671       expression->reduce(this) ; 
    672  
    673       slots.resize(fieldIds.size()) ; 
     675      set<string> instantFieldIds ; 
     676      map<string,CField*> associatedInstantFieldIds ; 
     677      expression->getInstantFieldIds(instantFieldIds) ; 
     678      for (set<string>::iterator it=instantFieldIds.begin() ; it!=instantFieldIds.end();++it)  
     679      { 
     680        if (*it!="this")  
     681        { 
     682          if (CField::has(*it))  
     683          { 
     684            CField* field=CField::get(*it) ; 
     685            field->processEnabledField() ; 
     686            associatedInstantFieldIds[*it]=field ; 
     687          } 
     688          else  ERROR("void CField::buildExpression(void)",<<" Field "<<*it<<" does not exist") ; 
     689        } 
     690      } 
     691       
     692      set<string> averageFieldIds ; 
     693      map<string,CField*> associatedAverageFieldIds ; 
     694 
     695      expression->getAverageFieldIds(averageFieldIds) ; 
     696      for (set<string>::iterator it=averageFieldIds.begin() ; it!=averageFieldIds.end();++it)  
     697      {       
     698        if (CField::has(*it))  
     699        { 
     700           CFieldGroup* root=CFieldGroup::get("field_definition") ; 
     701           CField* averageField=root->createChild() ; 
     702           CField* instantField=root->createChild() ; 
     703           averageField->field_ref=*it ; 
     704           averageField->hasFieldOut=true ; 
     705           averageField->fieldOut=instantField ; 
     706           instantField->freq_op=freq_op ; 
     707           averageField-> processEnabledField() ; 
     708           cout<<" outputfreq of averageField "<<  freq_op <<"  "<<instantField->freq_op<<"  "<< averageField->freq_write << endl ; 
     709           instantField->SuperClassAttribute::setAttributes(averageField, true); 
     710           instantField->field_ref.reset() ; 
     711           instantField->operation.reset() ; 
     712 
     713           instantField-> processEnabledField() ; 
     714           associatedAverageFieldIds[*it]=instantField  ; 
     715        } 
     716        else ERROR("void CField::buildExpression(void)",<<" Field "<<*it<<" does not exist") ; 
     717      } 
     718 
     719      expression->reduce(this,associatedInstantFieldIds,associatedAverageFieldIds) ; 
     720 
     721      slots.resize(instantFieldIds.size()+averageFieldIds.size()) ; 
    674722      resetSlots() ; 
    675723      int slotId=0 ; 
  • XIOS/trunk/src/node/field.hpp

    r459 r460  
    9595         template <int N> bool updateData(const CArray<double, N>&   data); 
    9696         bool updateDataFromExpression(const CArray<double, 1>&   data); 
     97         void setDataFromExpression(const CArray<double, 1>& _data) ;          
    9798          
    9899         bool updateDataServer 
     
    107108         bool active ; 
    108109         bool hasOutputFile ; 
     110         bool hasFieldOut ; 
    109111 
    110112         /// Traitements /// 
     
    143145         CGrid*  grid ; 
    144146         CFile*  file; 
     147         CField* fieldOut ; 
    145148 
    146149         CDuration freq_operation, freq_write; 
  • XIOS/trunk/src/node/field_impl.hpp

    r459 r460  
    2828      
    2929      for (; it != end; it++) (*it)->setData(_data) ; 
    30       if (hasOutputFile) updateData(_data) ; 
     30      if (hasOutputFile || hasFieldOut) updateData(_data) ; 
    3131    } 
    3232      
    3333  } 
    3434 
     35  void CField::setDataFromExpression(const CArray<double, 1>& _data) 
     36  { 
     37    if (hasInstantData)  
     38    { 
     39      instantData=_data;  
     40      for(list< pair<CField *,int> >::iterator it=fieldDependency.begin(); it!=fieldDependency.end(); ++it)  it->first->setSlot(it->second) ; 
     41    } 
     42     
     43    if (!hasExpression) 
     44    { 
     45      const std::vector<CField*>& refField=getAllReference(); 
     46      std::vector<CField*>::const_iterator  it = refField.begin(), end = refField.end(); 
     47      
     48      for (; it != end; it++) (*it)->setData(_data) ; 
     49      if (hasOutputFile || hasFieldOut) updateData(_data) ; 
     50    } 
     51      
     52  } 
    3553 
    3654   template <int N> 
     
    82100         this->foperation->final(); 
    83101         *last_Write = writeDate; 
    84          info(50) << "(*last_Write = currDate) : " << *last_Write << " = " << currDate << std::endl; 
    85          CTimer::get("XIOS Send Data").resume() ; 
    86          sendUpdateData() ; 
    87          CTimer::get("XIOS Send Data").suspend() ; 
     102         if (hasOutputFile) 
     103         { 
     104           info(50) << "(*last_Write = currDate) : " << *last_Write << " = " << currDate << std::endl; 
     105           CTimer::get("XIOS Send Data").resume() ; 
     106           sendUpdateData() ; 
     107           CTimer::get("XIOS Send Data").suspend() ; 
     108         } 
     109          
     110         if (hasFieldOut) 
     111         { 
     112           fieldOut->setDataFromExpression(data) ; 
     113         } 
    88114         return (true);         
    89115      } 
  • XIOS/trunk/src/parse_expr/expr_node.cpp

    r458 r460  
    3434  }; 
    3535 
    36   void CInstantFieldNode::reduce(CField* thisField) 
     36  void CInstantFieldNode::reduce(CField* thisField, map<string,CField*>& associatedInstantField, map<string,CField*>& associatedAverageField) 
    3737  { 
    3838    if (!reduced) 
     
    4444        reduced=true ; 
    4545      } 
    46       else if (CField::has(fieldId))  
     46      else 
    4747      { 
    48         field =CField::get(fieldId) ; 
     48        field=associatedInstantField[fieldId] ; 
    4949        array=field->getInstantData() ; 
    5050        reduced=true ; 
    5151      } 
    52       else ERROR("void CInstantFieldNode::reduce(void)",<<" Field "<<fieldId<<" does not exist") 
    53       } 
     52    } 
    5453  }    
    5554 
    56   void CAverageFieldNode::reduce(CField* thisField) 
     55  void CAverageFieldNode::reduce(CField* thisField, map<string,CField*>& associatedInstantField, map<string,CField*>& associatedAverageField) 
    5756  { 
    5857    if (!reduced) 
    5958    { 
    60       if (CField::has(fieldId))  
    61       { 
    62         field=thisField ; 
    63         array=CField::get(fieldId)->getInstantData() ; 
    64         reduced=true ; 
    65       } 
    66       else ERROR("void CAverageFieldNode::reduce(void)",<<" Field "<<fieldId<<" does not exist") 
    67       } 
     59      field=associatedAverageField[fieldId] ; 
     60      array=field->getInstantData() ; 
     61      reduced=true ; 
     62    } 
    6863  } 
    6964   
  • XIOS/trunk/src/parse_expr/expr_node.hpp

    r458 r460  
    193193    CFieldNode(void) : CNodeExpr() {} 
    194194    static CFieldNode* newNode(CSimpleNodeExpr* simpleNode) ; 
    195     virtual void reduce(CField* thisField = NULL) =0 ;  
     195    virtual void reduce(CField* thisField, map<string,CField*>& associatedInstantField, map<string,CField*>& associatedAverageField) =0 ;  
    196196    virtual CArray<double,1> compute(void)=0 ; 
    197197    virtual void getFieldIds(set<string>& fieldIds)=0 ; 
     198    virtual void getInstantFieldIds(set<string>& fieldIds)=0 ; 
     199    virtual void getAverageFieldIds(set<string>& fieldIds)=0 ; 
    198200    virtual void getFields(set<CField*>& fields)=0 ; 
     201    virtual void getInstantFields(set<CField*>& fields)=0 ; 
     202    virtual void getAverageFields(set<CField*>& fields)=0 ; 
    199203       
    200204    virtual ~CFieldNode() {} 
     
    212216    public: 
    213217    CInstantFieldNode(CSimpleNodeExpr* simpleNode) : CFieldNode(), fieldId(simpleNode->id) {} 
    214     virtual void reduce(CField* thisField = NULL) ; 
     218    virtual void reduce(CField* thisField, map<string,CField*>& associatedInstantField, map<string,CField*>& associatedAverageField) ;  
    215219    virtual CArray<double,1> compute(void) { return CArray<double,1>(*array);} 
    216220    virtual ~CInstantFieldNode() { } 
    217221    virtual void getFieldIds(set<string>& fieldIds) { fieldIds.insert(fieldId) ;} 
     222    virtual void getInstantFieldIds(set<string>& fieldIds) { fieldIds.insert(fieldId) ;} 
     223    virtual void getAverageFieldIds(set<string>& fieldIds) { } 
    218224    virtual void getFields(set<CField*>& fields) { fields.insert(field) ;} 
     225    virtual void getInstantFields(set<CField*>& fields) { fields.insert(field) ;} 
     226    virtual void getAverageFields(set<CField*>& fields) { } 
    219227        
    220228    string fieldId; 
     
    238246    CAverageFieldNode(CSimpleNodeExpr* simpleNode) : CFieldNode(), fieldId(simpleNode->id) {} 
    239247     
    240     virtual void reduce(CField* thisField = NULL) ; 
     248    virtual void reduce(CField* thisField, map<string,CField*>& associatedInstantField, map<string,CField*>& associatedAverageField) ;  
    241249    virtual CArray<double,1> compute(void) { return CArray<double,1>(*array); } 
    242250    virtual void getFieldIds(set<string>& fieldIds) { fieldIds.insert(fieldId) ;} 
     251    virtual void getInstantFieldIds(set<string>& fieldIds) { } 
     252    virtual void getAverageFieldIds(set<string>& fieldIds) { fieldIds.insert(fieldId) ;} 
    243253    virtual void getFields(set<CField*>& fields) { fields.insert(field) ;} 
     254    virtual void getInstantFields(set<CField*>& fields) { }  
     255    virtual void getAverageFields(set<CField*>& fields) { fields.insert(field) ;} 
    244256    virtual ~CAverageFieldNode() {} 
    245257    string fieldId; 
     
    264276    } 
    265277     
    266     virtual void reduce(CField* thisField = NULL) 
    267     { 
    268       child->reduce(thisField) ; 
     278    virtual void reduce(CField* thisField, map<string,CField*>& associatedInstantField, map<string,CField*>& associatedAverageField)  
     279    { 
     280      child->reduce(thisField, associatedInstantField, associatedAverageField) ; 
    269281      op=operatorExpr.getOpField(opId) ; 
    270282      reduced=true ; 
     
    272284     
    273285    virtual void getFieldIds(set<string>& fieldIds) {child-> getFieldIds(fieldIds);} 
    274     virtual void getFields(set<CField*>& fields) {child-> getFields(fields);} 
    275      
     286    virtual void getInstantFieldIds(set<string>& fieldIds) {child->  getInstantFieldIds(fieldIds) ;} 
     287    virtual void getAverageFieldIds(set<string>& fieldIds) {child->  getAverageFieldIds(fieldIds) ;} 
     288    virtual void getFields(set<CField*>& fields) { child-> getFields(fields) ;} 
     289    virtual void getInstantFields(set<CField*>& fields) {child-> getInstantFields(fields) ; }  
     290    virtual void getAverageFields(set<CField*>& fields) {child-> getAverageFields(fields) ; }     
    276291    virtual CArray<double,1> compute(void) 
    277292    { 
     
    303318    } 
    304319     
    305     virtual void reduce(CField* thisField = NULL) 
    306     { 
    307       child1->reduce(thisField) ; 
    308       child2->reduce(thisField) ; 
     320    virtual void reduce(CField* thisField, map<string,CField*>& associatedInstantField, map<string,CField*>& associatedAverageField) 
     321    { 
     322      child1->reduce(thisField, associatedInstantField, associatedAverageField) ; 
     323      child2->reduce(thisField, associatedInstantField, associatedAverageField) ; 
    309324      op=operatorExpr.getOpFieldField(opId) ; 
    310325      reduced=true ; 
     
    312327 
    313328    virtual void getFieldIds(set<string>& fieldIds) {child1-> getFieldIds(fieldIds); child2-> getFieldIds(fieldIds);} 
     329    virtual void getInstantFieldIds(set<string>& fieldIds) {child1-> getInstantFieldIds(fieldIds); child2-> getInstantFieldIds(fieldIds);} 
     330    virtual void getAverageFieldIds(set<string>& fieldIds) {child1-> getAverageFieldIds(fieldIds); child2-> getAverageFieldIds(fieldIds);} 
    314331    virtual void getFields(set<CField*>& fields) {child1-> getFields(fields); child2-> getFields(fields);} 
     332    virtual void getInstantFields(set<CField*>& fields) {child1-> getInstantFields(fields); child2-> getInstantFields(fields);} 
     333    virtual void getAverageFields(set<CField*>& fields) {child1-> getAverageFields(fields); child2-> getAverageFields(fields);} 
    315334 
    316335    virtual CArray<double,1> compute(void) 
     
    344363    } 
    345364     
    346     virtual void reduce(CField* thisField = NULL) 
     365    virtual void reduce(CField* thisField, map<string,CField*>& associatedInstantField, map<string,CField*>& associatedAverageField) 
    347366    { 
    348367      child1->reduce() ; 
    349       child2->reduce(thisField) ; 
     368      child2->reduce(thisField, associatedInstantField, associatedAverageField) ; 
    350369      op=operatorExpr.getOpScalarField(opId) ; 
    351370      reduced=true ; 
     
    353372    
    354373    virtual void getFieldIds(set<string>& fieldIds) {child2-> getFieldIds(fieldIds);} 
     374    virtual void getInstantFieldIds(set<string>& fieldIds) {child2-> getInstantFieldIds(fieldIds);} 
     375    virtual void getAverageFieldIds(set<string>& fieldIds) {child2-> getAverageFieldIds(fieldIds);} 
    355376    virtual void getFields(set<CField*>& fields) {child2-> getFields(fields);} 
     377    virtual void getInstantFields(set<CField*>& fields) {child2-> getInstantFields(fields);} 
     378    virtual void getAverageFields(set<CField*>& fields) {child2-> getAverageFields(fields);} 
    356379 
    357380    virtual CArray<double,1> compute(void) 
     
    385408    } 
    386409     
    387     virtual void reduce(CField* thisField = NULL) 
    388     { 
    389       child1->reduce(thisField) ; 
     410    virtual void reduce(CField* thisField, map<string,CField*>& associatedInstantField, map<string,CField*>& associatedAverageField) 
     411    { 
     412      child1->reduce(thisField, associatedInstantField, associatedAverageField) ; 
    390413      child2->reduce() ; 
    391414      op=operatorExpr.getOpFieldScalar(opId) ; 
     
    399422     
    400423    virtual void getFieldIds(set<string>& fieldIds) {child1-> getFieldIds(fieldIds);} 
     424    virtual void getInstantFieldIds(set<string>& fieldIds) {child1-> getInstantFieldIds(fieldIds);} 
     425    virtual void getAverageFieldIds(set<string>& fieldIds) {child1-> getAverageFieldIds(fieldIds);} 
    401426    virtual void getFields(set<CField*>& fields) {child1-> getFields(fields);} 
     427    virtual void getInstantFields(set<CField*>& fields) {child1-> getInstantFields(fields);} 
     428    virtual void getAverageFields(set<CField*>& fields) {child1-> getAverageFields(fields);} 
    402429 
    403430    ~COperatorFieldScalarNode() {delete child1, delete child2; } 
Note: See TracChangeset for help on using the changeset viewer.