Changeset 334


Ignore:
Timestamp:
03/27/12 10:49:42 (9 years ago)
Author:
ymipsl
Message:
  • Add new attribut : time_origin for time axis origin which appear in nectdf file
  • centered time averaging for time axis
  • correct bug in calendar due to call of virtual function in the constructor

YM

Location:
XIOS/trunk/src
Files:
20 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/calendar.cpp

    r300 r334  
    1212         : CObject() 
    1313         , initDate(*this) 
    14          , currentDate(initDate) 
    15       { /* Ne rien faire de plus */ } 
     14         , timeOrigin(*this) 
     15         , currentDate(*this) 
     16      {   } 
    1617 
     18      CCalendar::CCalendar(const StdString & id) 
     19               : CObject(id) 
     20               , initDate(*this) 
     21               , timeOrigin(*this) 
     22               , currentDate(*this) 
     23      { } 
     24       
    1725      CCalendar::CCalendar(const StdString & id, 
    1826                           int yr, int mth, int d  , 
    1927                           int hr, int min, int sec) 
    2028               : CObject(id) 
    21                , initDate(*this, yr, mth, d, hr, min, sec) 
    22                , currentDate(initDate) 
    23       { /* Ne rien faire de plus */ } 
     29               , initDate(*this) 
     30               , timeOrigin(*this) 
     31               , currentDate(*this) 
     32      {  
     33        initializeDate(yr, mth, d, hr, min, sec) ; 
     34      } 
    2435 
    2536      CCalendar::CCalendar(const StdString & id, const StdString & dateStr) 
    2637               : CObject(id) 
    2738               , initDate(CDate::FromString(dateStr, *this)) 
     39               , timeOrigin(initDate) 
    2840               , currentDate(initDate) 
    29       { /* Ne rien faire de plus */ } 
     41      {  
     42        initializeDate(dateStr) ; 
     43      } 
     44 
     45      CCalendar::CCalendar(const StdString & id, const StdString & dateStr, const StdString & timeOriginStr) 
     46               : CObject(id) 
     47               , initDate(*this) 
     48               , timeOrigin(*this) 
     49               , currentDate(*this) 
     50      {  
     51        initializeDate(dateStr, timeOriginStr) ; 
     52      } 
     53 
     54 
     55      void CCalendar::initializeDate( int yr, int mth, int d  , 
     56                                 int hr, int min, int sec) 
     57      {  
     58        initDate=CDate(*this,yr, mth, d, hr, min, sec) ; 
     59        timeOrigin=initDate; 
     60        currentDate=initDate ; 
     61      } 
     62 
     63      void CCalendar::initializeDate(const StdString & dateStr) 
     64      {  
     65        initDate=CDate::FromString(dateStr, *this) ; 
     66        timeOrigin=initDate ; 
     67        currentDate=initDate ; 
     68      } 
     69 
     70      void CCalendar::initializeDate(const StdString & dateStr, const StdString & timeOriginStr) 
     71      {  
     72        initDate=CDate::FromString(dateStr, *this) ; 
     73        timeOrigin=CDate::FromString(timeOriginStr, *this) ; 
     74        currentDate=initDate ; 
     75      } 
     76       
    3077 
    3178      CCalendar::~CCalendar(void) 
     
    62109      const CDuration & CCalendar::getTimeStep(void) const { return (this->timestep); } 
    63110      const CDate & CCalendar::getInitDate(void) const     { return (this->initDate); } 
     111      const CDate & CCalendar::getTimeOrigin(void) const     { return (this->timeOrigin); } 
    64112      CDate & CCalendar::getCurrentDate(void)              { return (this->currentDate); } 
    65113 
  • XIOS/trunk/src/calendar.hpp

    r219 r334  
    3535            /// Constructeurs /// 
    3636            CCalendar(void); 
     37            CCalendar(const StdString & id) ; 
    3738            CCalendar(const StdString & id, 
    38                       int yr = 0, int mth = 1, int d   = 1, 
     39                      int yr, int mth, int d, 
    3940                      int hr = 0, int min = 0, int sec = 0); 
    4041            CCalendar(const StdString & id, const StdString & dateStr); 
     42            CCalendar(const StdString & id, const StdString & dateStr, const StdString & timeOrigin); 
     43 
    4144            CCalendar(const CCalendar & calendar);       // Not implemented yet. 
    4245            CCalendar(const CCalendar * const calendar); // Not implemented yet. 
     
    5962            const CDuration & getTimeStep(void) const; 
    6063            const CDate & getInitDate(void) const; 
    61             CDate & getCurrentDate(void); 
     64            const CDate & getTimeOrigin(void) const; 
     65             CDate & getCurrentDate(void); 
    6266             
    6367         public : 
    6468          
    6569            //------------------------------------------------------------ 
    66             virtual int getMonthLength(const CDate & date) const; 
     70            virtual int getMonthLength(const CDate & date) const ; 
    6771 
    6872            virtual StdString getType(void) const; 
     
    7983 
    8084            virtual const StdString getMonthShortName(int month_id) const; 
     85            void initializeDate(int yr, int mth, int d, int hr = 0, int min = 0, int sec = 0) ; 
     86            void initializeDate(const StdString & dateStr); 
     87            void initializeDate(const StdString & dateStr, const StdString & timeOrigin); 
    8188 
    8289            //------------------------------------------------------------ 
     
    8592 
    8693            /// Propriétés privées /// 
    87             const CDate initDate; 
     94            CDate initDate; 
     95            CDate timeOrigin; 
    8896            CDate currentDate; 
    8997            CDuration timestep; 
  • XIOS/trunk/src/config/context_attribute.conf

    r278 r334  
    11DECLARE_ATTRIBUTE(StdString, calendar_type) 
    22DECLARE_ATTRIBUTE(StdString, start_date) 
     3DECLARE_ATTRIBUTE(StdString, time_origin) 
    34DECLARE_ATTRIBUTE(StdString, timestep) 
    45DECLARE_ATTRIBUTE(StdString, output_dir) 
  • XIOS/trunk/src/date.cpp

    r321 r334  
    11#include "date.hpp" 
    22#include "calendar.hpp" 
     3#include "calendar_type.hpp" 
    34#include <boost/date_time/gregorian/gregorian.hpp> 
    45#include <boost/date_time/posix_time/posix_time.hpp> 
     
    1213   { 
    1314      /// ////////////////////// Définitions ////////////////////// /// 
     15      CDate::CDate(const CCalendar& calendar) 
     16         : relCalendar(calendar) 
     17         , year(0), month(1) , day(1) 
     18         , hour(0), minute(0), second(0) 
     19      {   } 
     20       
    1421      CDate::CDate(const CCalendar& calendar, 
    1522                   int yr, int mth, int d, 
     
    102109      } 
    103110 
    104       CDate::operator Time(void) // Non vérifiée, pas optimisée ... 
     111      CDate::operator Time(void) const // Non vérifiée, pas optimisée ... 
    105112      { 
    106113         // Todo : Tester si la date courante est supérieure à la date initiale. 
     
    111118             (relCalendar.getId().compare("AllLeap") == 0) || 
    112119             (relCalendar.getId().compare("NoLeap")  == 0)) 
    113          return (retvalue + (getYear() - relCalendar.getInitDate().getYear()) 
     120         return (retvalue + (getYear() - relCalendar.getTimeOrigin().getYear()) 
    114121                                       * relCalendar.getYearTotalLength(*this)); 
    115122 
    116          for(CDate _d(relCalendar.getInitDate()); 
     123         for(CDate _d(relCalendar.getTimeOrigin()); 
    117124            _d.getYear() < getYear(); _d.setYear(_d.getYear()+1)) 
    118125            retvalue += relCalendar.getYearTotalLength(_d); 
     
    133140         // Vérification de la valeur du jour. 
    134141         if (day    < 1) { retValue = false; month  = 1; } 
    135          if (day    > relCalendar.getMonthLength(*this)) 
    136          { retValue = false; day = relCalendar.getMonthLength(*this); } 
     142         if (day    > (&relCalendar)->getMonthLength(*this)) 
     143         { retValue = false; day = (&relCalendar)->getMonthLength(*this); } 
    137144 
    138145         // Vérification de la valeur de l'heure. 
  • XIOS/trunk/src/date.hpp

    r321 r334  
    2020            /// Constructeurs /// 
    2121            CDate(void);                      // Not implemented yet 
    22             CDate(const CCalendar & cal, 
    23                   int yr = 0, int mth = 1, int d   = 1, 
    24                   int hr = 0, int min = 0, int sec = 0); 
     22            CDate(const CCalendar & cal); 
     23            CDate(const CCalendar & cal,int yr, int mth, int d, 
     24                                        int hr = 0, int min = 0, int sec = 0); 
    2525            CDate(const CDate & odate); 
    2626            CDate(const CDate * const odate); // Not implemented yet 
     
    3434            friend StdIStream & operator>>(StdIStream & in, CDate & date); // Non testée. 
    3535 
    36             operator Time(void);  // Retourne le nombre de secondes écoulées depuis la date initiale définie dans le calendrier. 
     36            operator Time(void) const;  // Retourne le nombre de secondes écoulées depuis la date d'origine définie dans le calendrier. 
    3737 
    3838            /// Traitements /// 
  • XIOS/trunk/src/date/allleap.cpp

    r293 r334  
    88 
    99      CAllLeapCalendar::CAllLeapCalendar(const StdString & dateStr) 
    10          : CCalendar("AllLeap", dateStr) 
    11       { /* Ne rien faire de plus */ } 
     10         : CCalendar("AllLeap") 
     11      { initializeDate(dateStr); } 
     12 
     13      CAllLeapCalendar::CAllLeapCalendar(const StdString & dateStr,const StdString & timeOriginStr) 
     14         : CCalendar("AllLeap") 
     15      { initializeDate(dateStr, timeOriginStr); } 
    1216 
    1317      CAllLeapCalendar::CAllLeapCalendar(int yr, int mth, int d, 
    1418                                         int hr, int min, int sec) 
    15          : CCalendar("AllLeap", yr, mth, d, hr, min, sec) 
    16       { /* Ne rien faire de plus */ } 
     19         : CCalendar("AllLeap") 
     20      { initializeDate(yr, mth, d, hr, min, sec) ; } 
    1721 
    1822      CAllLeapCalendar::~CAllLeapCalendar(void) 
  • XIOS/trunk/src/date/allleap.hpp

    r219 r334  
    1919 
    2020            /// Constructeur /// 
    21             CAllLeapCalendar(void);                                   // Not implemented yet. 
     21//            CAllLeapCalendar(void);                                   // Not implemented yet. 
    2222            CAllLeapCalendar(const StdString & dateStr); 
     23            CAllLeapCalendar(const StdString & dateStr,const StdString & timeOriginStr); 
    2324            CAllLeapCalendar(int yr = 0, int mth = 1, int d   = 1, 
    2425                            int hr = 0, int min = 0, int sec = 0); 
  • XIOS/trunk/src/date/d360.cpp

    r293 r334  
    88 
    99      CD360Calendar::CD360Calendar(const StdString & dateStr) 
     10         : CCalendar("D360") 
     11      { initializeDate(dateStr); } 
     12 
     13      CD360Calendar::CD360Calendar(const StdString & dateStr,const StdString & timeOriginStr) 
    1014         : CCalendar("D360", dateStr) 
    11       { /* Ne rien faire de plus */ } 
     15      { initializeDate(dateStr, timeOriginStr); } 
    1216 
    1317      CD360Calendar::CD360Calendar(int yr, int mth, int d, 
    1418                                   int hr, int min, int sec) 
    15          : CCalendar("D360", yr, mth, d, hr, min, sec) 
    16       { /* Ne rien faire de plus */ } 
     19         : CCalendar("D360") 
     20      { initializeDate(yr, mth, d, hr, min, sec) ; } 
    1721 
    1822      CD360Calendar::~CD360Calendar(void) 
  • XIOS/trunk/src/date/d360.hpp

    r219 r334  
    2121            CD360Calendar(void);                                   // Not implemented yet. 
    2222            CD360Calendar(const StdString & dateStr); 
     23            CD360Calendar(const StdString & dateStr,const StdString & timeOriginStr); 
    2324            CD360Calendar(int yr = 0, int mth = 1, int d   = 1, 
    2425                          int hr = 0, int min = 0, int sec = 0); 
  • XIOS/trunk/src/date/gregorian.cpp

    r219 r334  
    88 
    99      CGregorianCalendar::CGregorianCalendar(const StdString & dateStr) 
    10          : CCalendar("Gregorian", dateStr) 
    11       { /* Ne rien faire de plus */ } 
     10         : CCalendar("Gregorian") 
     11      { initializeDate(dateStr); } 
     12 
     13      CGregorianCalendar::CGregorianCalendar(const StdString & dateStr,const StdString & timeOriginStr) 
     14         : CCalendar("Gregorian") 
     15      { initializeDate(dateStr, timeOriginStr); } 
    1216 
    1317      CGregorianCalendar::CGregorianCalendar(int yr, int mth, int d, 
    1418                                             int hr, int min, int sec) 
    15          : CCalendar("Gregorian", yr, mth, d, hr, min, sec) 
    16       { /* Ne rien faire de plus */ } 
     19         : CCalendar("Gregorian") 
     20      { initializeDate(yr, mth, d, hr, min, sec) ; } 
    1721 
    1822      CGregorianCalendar::~CGregorianCalendar(void) 
  • XIOS/trunk/src/date/gregorian.hpp

    r219 r334  
    1919 
    2020            /// Constructeur /// 
    21             CGregorianCalendar(void);                                   // Not implemented yet. 
     21//            CGregorianCalendar(void);                                   // Not implemented yet. 
    2222            CGregorianCalendar(const StdString & dateStr); 
     23            CGregorianCalendar(const StdString & dateStr,const StdString & timeOriginStr); 
    2324            CGregorianCalendar(int yr = 0, int mth = 1, int d   = 1, 
    2425                               int hr = 0, int min = 0, int sec = 0); 
  • XIOS/trunk/src/date/julian.cpp

    r219 r334  
    88 
    99      CJulianCalendar::CJulianCalendar(const StdString & dateStr) 
    10          : CCalendar("Julian", dateStr) 
    11       { /* Ne rien faire de plus */ } 
     10         : CCalendar("Julian") 
     11      { initializeDate(dateStr); } 
     12 
     13      CJulianCalendar::CJulianCalendar(const StdString & dateStr,const StdString & timeOriginStr) 
     14         : CCalendar("Julian") 
     15      { initializeDate(dateStr, timeOriginStr); } 
    1216 
    1317      CJulianCalendar::CJulianCalendar(int yr, int mth, int d, 
    1418                                       int hr, int min, int sec) 
    15          : CCalendar("Julian", yr, mth, d, hr, min, sec) 
    16       { /* Ne rien faire de plus */ } 
     19         : CCalendar("Julian") 
     20      { initializeDate(yr, mth, d, hr, min, sec) ; } 
    1721 
    1822      CJulianCalendar::~CJulianCalendar(void) 
  • XIOS/trunk/src/date/julian.hpp

    r219 r334  
    1919 
    2020            /// Constructeur /// 
    21             CJulianCalendar(void);                                   // Not implemented yet. 
     21//            CJulianCalendar(void);                                   // Not implemented yet. 
    2222            CJulianCalendar(const StdString & dateStr); 
     23            CJulianCalendar(const StdString & dateStr,const StdString & timeOriginStr); 
    2324            CJulianCalendar(int yr = 0, int mth = 1, int d   = 1, 
    2425                            int hr = 0, int min = 0, int sec = 0); 
  • XIOS/trunk/src/date/noleap.cpp

    r219 r334  
    11#include "noleap.hpp" 
     2#include "calendar.hpp" 
    23 
    34namespace xmlioserver 
     
    910      CNoLeapCalendar::CNoLeapCalendar(const StdString & dateStr) 
    1011         : CCalendar("NoLeap", dateStr) 
    11       { /* Ne rien faire de plus */ } 
     12      { initializeDate(dateStr); } 
     13 
     14      CNoLeapCalendar::CNoLeapCalendar(const StdString & dateStr,const StdString & timeOriginStr) 
     15         : CCalendar("NoLeap", dateStr, timeOriginStr) 
     16      { initializeDate(dateStr, timeOriginStr); } 
    1217 
    1318      CNoLeapCalendar::CNoLeapCalendar(int yr, int mth, int d, 
    1419                                       int hr, int min, int sec) 
    15          : CCalendar("NoLeap", yr, mth, d, hr, min, sec) 
    16       { /* Ne rien faire de plus */ } 
     20         : CCalendar("NoLeap") 
     21      { initializeDate(yr, mth, d, hr, min, sec) ; } 
     22 
    1723 
    1824      CNoLeapCalendar::~CNoLeapCalendar(void) 
  • XIOS/trunk/src/date/noleap.hpp

    r219 r334  
    1919 
    2020            /// Constructeur /// 
    21             CNoLeapCalendar(void);                                   // Not implemented yet. 
     21//            CNoLeapCalendar(void);                                   // Not implemented yet. 
    2222            CNoLeapCalendar(const StdString & dateStr); 
     23            CNoLeapCalendar(const StdString & dateStr,const StdString & timeOriginStr); 
    2324            CNoLeapCalendar(int yr = 0, int mth = 1, int d   = 1, 
    2425                            int hr = 0, int min = 0, int sec = 0); 
  • XIOS/trunk/src/node/context.cpp

    r321 r334  
    8787               << "Impossible de définir un calendrier (un attribut est manquant)."); 
    8888 
    89 #define DECLARE_CALENDAR(MType  , mtype)                            \ 
    90    if (calendar_type.getValue().compare(#mtype) == 0)               \ 
    91    {                                                                \ 
    92       this->calendar =  boost::shared_ptr<date::CCalendar>          \ 
    93          (new date::C##MType##Calendar(start_date.getValue()));     \ 
    94       if (!this->timestep.isEmpty())                                \ 
    95        this->calendar->setTimeStep                                  \ 
    96           (date::CDuration::FromString(this->timestep.getValue())); \ 
    97       return;                                                       \ 
     89#define DECLARE_CALENDAR(MType  , mtype)                              \ 
     90   if (calendar_type.getValue().compare(#mtype) == 0)                 \ 
     91   {                                                                  \ 
     92      if (time_origin.isEmpty())                                       \ 
     93        this->calendar =  boost::shared_ptr<date::CCalendar>          \ 
     94           (new date::C##MType##Calendar(start_date.getValue()));     \ 
     95      else this->calendar =  boost::shared_ptr<date::CCalendar>       \ 
     96           (new date::C##MType##Calendar(start_date.getValue(),time_origin.getValue()));     \ 
     97      if (!this->timestep.isEmpty())                                  \ 
     98       this->calendar->setTimeStep                                    \ 
     99          (date::CDuration::FromString(this->timestep.getValue()));   \ 
     100      return;                                                         \ 
    98101   } 
    99102#include "calendar_type.conf" 
     
    535538   void CContext::updateCalendar(int step) 
    536539   { 
     540      info(50)<<"updateCalendar : before : "<<calendar->getCurrentDate()<<endl ; 
    537541      calendar->update(step) ; 
     542      info(50)<<"updateCalendar : after : "<<calendar->getCurrentDate()<<endl ; 
    538543   } 
    539544  
  • XIOS/trunk/src/node/field.cpp

    r321 r334  
    178178      *last_Write_srv = writeDate; 
    179179      writeField() ; 
     180      *lastlast_Write_srv=*last_Write_srv; 
    180181    } 
    181182  } 
     
    384385         this->freq_write_srv     = 
    385386             CDuration::FromString(this->file->output_freq.getValue()); 
     387         this->lastlast_Write_srv     = boost::shared_ptr<xmlioserver::date::CDate> 
     388                        (new date::CDate(context->getCalendar()->getInitDate())); 
    386389         this->last_Write_srv     = boost::shared_ptr<xmlioserver::date::CDate> 
    387390                        (new date::CDate(context->getCalendar()->getInitDate())); 
  • XIOS/trunk/src/node/field.hpp

    r327 r334  
    141141         StdSize nstep; 
    142142         boost::shared_ptr<date::CDate>    last_Write, last_operation; 
    143          boost::shared_ptr<date::CDate>    last_Write_srv, last_operation_srv; 
     143         boost::shared_ptr<date::CDate>    lastlast_Write_srv,last_Write_srv, last_operation_srv; 
    144144          
    145145         boost::shared_ptr<func::CFunctor> foperation; 
  • XIOS/trunk/src/output/nc4_data_output.cpp

    r321 r334  
    483483 //        ARRAY(double, 1) field_data = field->data_srv; 
    484484         ARRAY_CREATE(time_data, double, 1, [1]); 
    485          (*time_data)[0] = date::Time(*field->last_Write_srv); 
    486           
     485         if (field->operation.getValue()=="instant") (*time_data)[0] = date::Time(*field->last_Write_srv) 
     486                                                                      -date::Time(context->calendar->getTimeOrigin()); 
     487         else (*time_data)[0] = (date::Time(*field->last_Write_srv)+date::Time(*field->lastlast_Write_srv))/2 
     488                               -date::Time(context->calendar->getTimeOrigin()); 
     489            
    487490         if (grid->hasAxis()) // 3D 
    488491         { 
     
    574577         { 
    575578            SuperClassWriter::addVariable(axisid, NC_DOUBLE, dims); 
    576             date::CDate initDate=cal->getInitDate() ; 
     579            date::CDate timeOrigin=cal->getTimeOrigin() ; 
    577580//            StdOStringStream oss2; 
    578581//            oss2<<initDate.getYear()<<"-"<<initDate.getMonth()<<"-"<<initDate.getDay()<<" " 
    579582//                <<initDate.getHour()<<"-"<<initDate.getMinute()<<"-"<<initDate.getSecond() ; 
    580583//            StdString strInitdate=oss2.str() ; 
    581             StdString strInitdate=initDate.toString() ; 
     584            StdString strTimeOrigin=timeOrigin.toString() ; 
    582585            this->writeTimeAxisAttributes 
    583586               (axisid, cal->getType(), 
    584                 StdString("seconds since ").append(strInitdate), 
    585                 strInitdate); 
     587                StdString("seconds since ").append(strTimeOrigin), 
     588                strTimeOrigin); 
    586589         } 
    587590 
  • XIOS/trunk/src/test/test.cpp

    r316 r334  
    55#include <boost/date_time/gregorian/gregorian.hpp> 
    66#include <boost/date_time/posix_time/posix_time.hpp> 
     7#include "calendar_type.hpp" 
     8#include "date.hpp" 
     9#include "calendar_util.hpp" 
    710 
    811using namespace std ; 
    912using namespace boost::posix_time ; 
    1013using namespace boost::gregorian ; 
     14using namespace xmlioserver; 
     15using namespace date ; 
    1116 
    1217int main(void) 
    1318{ 
    14       ptime t(time_from_string("2012-02-30 15:24")) ; 
    15        
    16         
    17       std::cout << to_simple_string(t) << std::endl; 
    18  
     19//      ptime t(time_from_string("2012-02-30 15:24")) ; 
     20//      std::cout << to_simple_string(t) << std::endl; 
     21      CGregorianCalendar MyCalendar("2011-03-01 00:00") ; 
     22      cout<<MyCalendar.getInitDate()<<endl; 
     23      cout<<MyCalendar.getCurrentDate()<<endl ; 
     24      cout<<MyCalendar.getCurrentDate()-1*Day<<endl ; 
    1925  return 1 ;   
    2026} 
Note: See TracChangeset for help on using the changeset viewer.