source: XIOS/dev/XIOS_DEV_CMIP6/src/calendar_util.cpp @ 1436

Last change on this file since 1436 was 643, checked in by rlacroix, 9 years ago

Use the filter infrastructure to handle the temporal operations.

Add a temporal filter to do so.

  • Property copyright set to
    Software name : XIOS (Xml I/O Server)
    http://forge.ipsl.jussieu.fr/ioserver
    Creation date : January 2009
    Licence : CeCCIL version2
    see license file in root directory : Licence_CeCILL_V2-en.txt
    or http://www.cecill.info/licences/Licence_CeCILL_V2-en.html
    Holder : CEA/LSCE (Laboratoire des Sciences du CLimat et de l'Environnement)
    CNRS/IPSL (Institut Pierre Simon Laplace)
    Project Manager : Yann Meurdesoif
    yann.meurdesoif@cea.fr
File size: 7.9 KB
Line 
1#include "calendar_util.hpp"
2
3namespace xios
4{
5    /// ////////////////////// Définitions ////////////////////// ///
6
7    CDuration operator*(const double& scal, const CDuration& ddr)
8    { return (ddr * scal); }
9
10    CDuration operator-(const CDuration& ddr, const CDuration& dr)
11    {
12      CDuration dur(ddr);
13      dur.year -= dr.year; dur.month  -= dr.month;  dur.day    -= dr.day;
14      dur.hour -= dr.hour; dur.minute -= dr.minute; dur.second -= dr.second; dur.timestep -= dr.timestep;
15      return dur;
16    }
17
18    CDuration operator+(const CDuration& ddr, const CDuration& dr)
19    {
20      CDuration dur(ddr);
21      dur.year += dr.year; dur.month  += dr.month;  dur.day    += dr.day;
22      dur.hour += dr.hour; dur.minute += dr.minute; dur.second += dr.second; dur.timestep += dr.timestep;
23      return dur;
24    }
25
26    CDuration operator*(const CDuration& ddr, const double& scal)
27    {
28      CDuration dur(ddr);
29      dur.year *= scal; dur.month  *= scal; dur.day    *= scal;
30      dur.hour *= scal; dur.minute *= scal; dur.second *= scal; dur.timestep *= scal;
31      return dur;
32    }
33
34    CDuration operator-(const CDuration& ddr)
35    {
36      CDuration dur(ddr);
37      dur.year     = -dur.year;
38      dur.month    = -dur.month;
39      dur.day      = -dur.day;
40      dur.hour     = -dur.hour;
41      dur.minute   = -dur.minute;
42      dur.second   = -dur.second;
43      dur.timestep = -dur.timestep;
44      return dur;
45    }
46
47    //-----------------------------------------------------------------
48
49    CDate operator+(const CDate& dt, const CDuration& dr)
50    {
51      CDuration drr(dr);
52      int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0;
53      const CCalendar& c = dt.getRelCalendar();
54      const bool calendarHasMonths = (c.getYearLength() > 0);
55
56      drr.timestep = 0;
57      if (dr.timestep)
58      {
59        if (c.getTimeStep() == NoneDu)
60          ERROR("operator+(const CDate& dt, const CDuration& dr)",
61                << "Impossible to use the timestep before it is set.");
62        drr = drr + dr.timestep * c.getTimeStep();
63      }
64
65      // Handle the time part of the date
66      drr.second += dt.getSecond();
67      drr.minute += dt.getMinute();
68      drr.hour   += dt.getHour();
69
70      if (!calendarHasMonths) // Handle the day and year immediately if there is no months
71      {
72        drr.day  += dt.getDay() - 1;
73        drr.year += dt.getYear();
74      }
75
76      drr.resolve(c, true); // Force the time to be positive
77
78      second = drr.second;
79      minute = drr.minute;
80      hour   = drr.hour;
81
82      if (calendarHasMonths)
83      {
84        // Ajustement des mois en fonction des jours.
85        CDate dtt(dt);
86        drr.day += dtt.getDay() - 1;
87        dtt.setDay(1);
88
89        if (drr.day >= 0)
90        {
91          for(; c.getMonthLength(dtt) <= drr.day; dtt.addMonth(1))
92          { drr.day -= c.getMonthLength(dtt); drr.month += 1; }
93
94          day = drr.day + 1;
95        }
96        else
97        {
98          dtt.addMonth(-1);
99          drr.month -= 1;
100          for(; c.getMonthLength(dtt) < -drr.day; dtt.addMonth(-1))
101          { drr.day += c.getMonthLength(dtt); drr.month -= 1; }
102          day = c.getMonthLength(dtt) + drr.day + 1;
103        }
104
105        drr.resolve(c);
106
107        // Ajustement des années en fonction des mois.
108        month += dt.getMonth() + drr.month;
109        if (month < 0) { drr.year--; month += c.getYearLength(); }
110        if (month > c.getYearLength()) { drr.year++; month -= c.getYearLength(); }
111        if (month == 0){ month = c.getYearLength(); drr.year--; }
112
113        year += dt.getYear() + drr.year;
114      }
115      else // if (!calendarHasMonths)
116      {
117        day   = drr.day + 1;
118        month = 1;
119        year  = drr.year;
120      }
121
122      return (CDate(c, year, month, day, hour, minute, second));
123    }
124
125    CDate operator-(const CDate& dt, const CDuration& dr) { return (dt + (-dr)); }
126
127    //-----------------------------------------------------------------
128
129    CDuration operator-(const CDate& dt0, const CDate& dt1)
130    {
131      // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.
132      CDuration dur =
133      { dt0.getYear() - dt1.getYear(), dt0.getMonth()  - dt1.getMonth() , dt0.getDay()   - dt1.getDay(),
134        dt0.getHour() - dt1.getHour(), dt0.getMinute() - dt1.getMinute(), dt0.getSecond() - dt1.getSecond() };
135      return (dur.resolve(dt0.getRelCalendar()));
136    }
137
138    //-----------------------------------------------------------------
139
140    /// Les opérateurs de comparaison. (Non testés pour le moment)
141
142    bool operator==(const CDuration& ddr, const CDuration& dr)
143    {
144      return ((ddr.year == dr.year) && (ddr.month  == dr.month)  && (dr.day    == ddr.day) &&
145              (ddr.hour == dr.hour) && (ddr.minute == dr.minute) && (dr.second == ddr.second) &&
146              (ddr.timestep == dr.timestep));
147    }
148
149    bool operator!=(const CDuration& ddr, const CDuration& dr)
150    {
151      return !(ddr == dr);
152    }
153
154    bool operator==(const CDate& dt0, const CDate& dt1)
155    {
156      // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.
157      return ((dt0.getYear() == dt1.getYear()) && (dt0.getMonth()  == dt1.getMonth())  && (dt1.getDay()    == dt0.getDay()) &&
158              (dt0.getHour() == dt1.getHour()) && (dt0.getMinute() == dt1.getMinute()) && (dt1.getSecond() == dt0.getSecond()));
159    }
160
161    bool operator<(const CDate& dt0, const CDate& dt1)
162    {
163      // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.
164      if (dt0.getYear() < dt1.getYear())
165      {
166        return true;
167      }
168      else if (dt0.getYear() == dt1.getYear())
169      {
170        if (dt0.getMonth() < dt1.getMonth())
171        {
172          return true;
173        }
174        else if (dt0.getMonth() == dt1.getMonth())
175        {
176          if (dt0.getDay() < dt1.getDay())
177          {
178             return true;
179          }
180          else if (dt0.getDay() == dt1.getDay())
181          {
182            if (dt0.getHour() < dt1.getHour())
183            {
184              return true;
185            }
186            else if (dt0.getHour() == dt1.getHour())
187            {
188              if (dt0.getMinute() < dt1.getMinute())
189              {
190                return true;
191              }
192              else if (dt0.getMinute() == dt1.getMinute())
193              {
194                if (dt0.getSecond() < dt1.getSecond())
195                  return true;
196              }
197            }
198          }
199        }
200      }
201      return false;
202    }
203
204    //-----------------------------------------------------------------
205
206    bool operator!=(const CDate& dt0, const CDate& dt1) { return !(dt1 == dt0); }
207    bool operator> (const CDate& dt0, const CDate& dt1) { return (dt1 < dt0); }
208    bool operator>=(const CDate& dt0, const CDate& dt1) { return (dt0 > dt1 || dt1 == dt0); }
209    bool operator<=(const CDate& dt0, const CDate& dt1) { return (dt0 < dt1 || dt1 == dt0); }
210
211    ///----------------------------------------------------------------
212
213    bool DurationFakeLessComparator::operator()(const CDuration& dur1, const CDuration& dur2) const
214    {
215      if (dur1.year < dur2.year)
216        return true;
217      else if (dur1.year == dur2.year)
218      {
219        if (dur1.month < dur2.month)
220          return true;
221        else if (dur1.month == dur2.month)
222        {
223          if (dur1.day < dur2.day)
224            return true;
225          else if (dur1.day == dur2.day)
226          {
227            if (dur1.hour < dur2.hour)
228              return true;
229            else if (dur1.hour == dur2.hour)
230            {
231              if (dur1.minute < dur2.minute)
232                return true;
233              else if (dur1.minute == dur2.minute)
234              {
235                if (dur1.second < dur2.second)
236                  return true;
237                else if (dur1.second == dur2.second)
238                  return (dur1.timestep < dur2.timestep);
239              }
240            }
241          }
242        }
243      }
244      return false;
245    }
246
247    ///----------------------------------------------------------------
248
249} // namespace xios
250
251
252
253
254
255
Note: See TracBrowser for help on using the repository browser.