source: XIOS/dev/dev_trunk_omp/src/calendar_util.cpp @ 1628

Last change on this file since 1628 was 1628, checked in by yushan, 2 years ago

bug fix (Nb of files less than Nb of servers)

  • 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#include "calendar.hpp"
3
4namespace xios
5{
6    /// ////////////////////// Définitions ////////////////////// ///
7
8    CDuration operator*(const double& scal, const CDuration& ddr)
9    { return (ddr * scal); }
10
11    CDuration operator-(const CDuration& ddr, const CDuration& dr)
12    {
13      CDuration dur(ddr);
14      dur.year -= dr.year; dur.month  -= dr.month;  dur.day    -= dr.day;
15      dur.hour -= dr.hour; dur.minute -= dr.minute; dur.second -= dr.second; dur.timestep -= dr.timestep;
16      return dur;
17    }
18
19    CDuration operator+(const CDuration& ddr, const CDuration& dr)
20    {
21      CDuration dur(ddr);
22      dur.year += dr.year; dur.month  += dr.month;  dur.day    += dr.day;
23      dur.hour += dr.hour; dur.minute += dr.minute; dur.second += dr.second; dur.timestep += dr.timestep;
24      return dur;
25    }
26
27    CDuration operator*(const CDuration& ddr, const double& scal)
28    {
29      CDuration dur(ddr);
30      dur.year *= scal; dur.month  *= scal; dur.day    *= scal;
31      dur.hour *= scal; dur.minute *= scal; dur.second *= scal; dur.timestep *= scal;
32      return dur;
33    }
34
35    CDuration operator-(const CDuration& ddr)
36    {
37      CDuration dur(ddr);
38      dur.year     = -dur.year;
39      dur.month    = -dur.month;
40      dur.day      = -dur.day;
41      dur.hour     = -dur.hour;
42      dur.minute   = -dur.minute;
43      dur.second   = -dur.second;
44      dur.timestep = -dur.timestep;
45      return dur;
46    }
47
48    //-----------------------------------------------------------------
49
50    CDate operator+(const CDate& dt, const CDuration& dr)
51    {
52      CDuration drr(dr);
53      int year = 0, month = 0, day = 0, hour = 0, minute = 0, second = 0;
54      const CCalendar& c = dt.getRelCalendar();
55      const bool calendarHasMonths = (c.getYearLength() > 0);
56
57      drr.timestep = 0;
58      if (dr.timestep)
59      {
60        if (c.getTimeStep() == NoneDu)
61          ERROR("operator+(const CDate& dt, const CDuration& dr)",
62                << "Impossible to use the timestep before it is set.");
63        drr = drr + dr.timestep * c.getTimeStep();
64      }
65
66      // Handle the time part of the date
67      drr.second += dt.getSecond();
68      drr.minute += dt.getMinute();
69      drr.hour   += dt.getHour();
70
71      if (!calendarHasMonths) // Handle the day and year immediately if there is no months
72      {
73        drr.day  += dt.getDay() - 1;
74        drr.year += dt.getYear();
75      }
76
77      drr.resolve(c, true); // Force the time to be positive
78
79      second = drr.second;
80      minute = drr.minute;
81      hour   = drr.hour;
82
83      if (calendarHasMonths)
84      {
85        // Ajustement des mois en fonction des jours.
86        CDate dtt(dt);
87        drr.day += dtt.getDay() - 1;
88        dtt.setDay(1);
89
90        if (drr.day >= 0)
91        {
92          for(; c.getMonthLength(dtt) <= drr.day; dtt.addMonth(1))
93          { drr.day -= c.getMonthLength(dtt); drr.month += 1; }
94
95          day = drr.day + 1;
96        }
97        else
98        {
99          dtt.addMonth(-1);
100          drr.month -= 1;
101          for(; c.getMonthLength(dtt) < -drr.day; dtt.addMonth(-1))
102          { drr.day += c.getMonthLength(dtt); drr.month -= 1; }
103          day = c.getMonthLength(dtt) + drr.day + 1;
104        }
105
106        drr.resolve(c);
107
108        // Ajustement des années en fonction des mois.
109        month += dt.getMonth() + drr.month;
110        if (month < 0) { drr.year--; month += c.getYearLength(); }
111        if (month > c.getYearLength()) { drr.year++; month -= c.getYearLength(); }
112        if (month == 0){ month = c.getYearLength(); drr.year--; }
113
114        year += dt.getYear() + drr.year;
115      }
116      else // if (!calendarHasMonths)
117      {
118        day   = drr.day + 1;
119        month = 1;
120        year  = drr.year;
121      }
122
123      return (CDate(c, year, month, day, hour, minute, second));
124    }
125
126    CDate operator-(const CDate& dt, const CDuration& dr) { return (dt + (-dr)); }
127
128    //-----------------------------------------------------------------
129
130    CDuration operator-(const CDate& dt0, const CDate& dt1)
131    {
132      // TODO :: Vérifier que les deux dates (dt0 et dt1) ont une référence vers le même calendrier.
133      CDuration dur( 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.