source: XIOS/trunk/src/interface/c/icdate.cpp @ 587

Last change on this file since 587 was 549, checked in by rlacroix, 9 years ago

Revised calendar functionalities:

  • the calendar is now configured from a specific calendar child node of the context in the XML configuration file. Example: <calendar type="Gregorian" start_date="2012-03-01 15:00:00" time_origin="2012-02-29 15:00:00" timestep="1h" />
  • the calendar type should now be configured when defining the start time and/or the time origin.
  • the start time and the time origin are now optional, 0000-01-01 00:00:00 will be used by default. It is also possible to define them partially. For example, 2015 and 2014-12 are valid dates corresponding respectively to 2015-01-01 00:00:00 and 2014-12-01 00:00:00.
  • an optional duration offset can be added to the start date and time origin. For example, it's possible to define the date 2015-01-12 12:00:00 as 2015-01-11 + 36h or 2015-01-11 12:00:00 + 1d. The duration format is the same as the time step. Being that the date is optional, it is possible to only use a duration (for example + 42s is the same as 0000-01-01 00:00:00 + 42s). An error will be raised if a duration based on the time step is used before the time step was configured. For example, the following would cause an error: <calendar type="Gregorian" start_date="+ 1ts" /> but <calendar type="Gregorian" start_date="+ 1ts" timestep="0.5h" /> would not.
  • new Fortran interface to define the calendar:
    • xios_define_calendar(type[, timestep, start_date, time_origin]) will create a calendar when none had previously been defined. Only the type argument is mandatory, the rest is optional. Calendar operations on dates and durations are possible as soon as the calendar is created (either using this procedure or directly from the XML configuration file).
    • the following getter and setter procedures are available: xios_set_timestep, xios_set_start_date, xios_set_time_origin, xios_get_calendar_type, xios_get_timestep, xios_get_start_date, xios_get_time_origin.
  • new Fortran interface to interact with the calendar: xios_update_calendar, xios_get_current_date, xios_get_year_length_in_seconds, xios_get_day_length_in_seconds.
  • new Fortran interface for date conversion: xios_date_get_second_of_year, xios_date_get_day_of_year, xios_date_get_fraction_of_year, xios_date_get_second_of_day, xios_date_get_fraction_of_day.
  • two new placeholders are available to format the file name when splitting the output (split_freq_format attribute):
    • %S the number of seconds since the time origin
    • %D the integral number of days since the time origin
  • 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
  • Property svn:eol-style set to native
File size: 9.0 KB
Line 
1/* ************************************************************************** *
2 *      Copyright © IPSL/LSCE, xios, Avril 2010 - Octobre 2011         *
3 * ************************************************************************** */
4
5#include <boost/multi_array.hpp>
6#include <boost/shared_ptr.hpp>
7
8#include "xmlioserver.hpp"
9
10#include "attribute_template.hpp"
11#include "object_template.hpp"
12#include "group_template.hpp"
13
14#include "calendar_type.hpp"
15
16#include "icutil.hpp"
17#include "icdate.hpp"
18#include "exception.hpp"
19#include "calendar_util.hpp"
20#include "timer.hpp"
21#include "context.hpp"
22#include "context_client.hpp"
23
24static const xios::CCalendar& getCalendar(const std::string& idFunc)
25{
26  const xios::CContext* context = CContext::getCurrent();
27  if (!context)
28    ERROR(idFunc, << "Impossible to do calendar operations: no current context available.");
29  const boost::shared_ptr<xios::CCalendar> cal = context->getCalendar();
30  if (!cal)
31    ERROR(idFunc, << "Impossible to do calendar operations: no calendar was defined.");
32  return *cal;
33}
34
35extern "C"
36{
37  long long int cxios_date_convert_to_seconds(cxios_date date_c)
38  {
39    xios::CDate date = xios::CDate(getCalendar("long long int cxios_date_convert_to_seconds(cxios_date date_c)"),
40                                   date_c.year, date_c.month, date_c.day,
41                                   date_c.hour, date_c.minute, date_c.second);
42    return date;
43  }
44
45  cxios_date cxios_date_add_duration(cxios_date date_c, cxios_duration dur_c)
46  {
47    xios::CDate date = xios::CDate(getCalendar("cxios_date cxios_date_add_duration(cxios_date date_c, cxios_duration dur_c)"),
48                                   date_c.year, date_c.month, date_c.day,
49                                   date_c.hour, date_c.minute, date_c.second);
50    xios::CDuration dur = { dur_c.year, dur_c.month, dur_c.day,
51                            dur_c.hour, dur_c.minute, dur_c.second,
52                            dur_c.timestep };
53    xios::CDate res = date + dur;
54    return { res.getYear(), res.getMonth(), res.getDay(), res.getHour(), res.getMinute(), res.getSecond() };
55  }
56
57  cxios_date cxios_date_sub_duration(cxios_date date_c, cxios_duration dur_c)
58  {
59    xios::CDate date = xios::CDate(getCalendar("cxios_date cxios_date_sub_duration(cxios_date date_c, cxios_duration dur_c)"),
60                                   date_c.year, date_c.month, date_c.day,
61                                   date_c.hour, date_c.minute, date_c.second);
62    xios::CDuration dur = { dur_c.year, dur_c.month, dur_c.day,
63                            dur_c.hour, dur_c.minute, dur_c.second,
64                            dur_c.timestep };
65    xios::CDate res = date - dur;
66    return { res.getYear(), res.getMonth(), res.getDay(), res.getHour(), res.getMinute(), res.getSecond() };
67  }
68
69  cxios_duration cxios_date_sub(cxios_date date1_c, cxios_date date2_c)
70  {
71    xios::CDate date1 = xios::CDate(getCalendar("cxios_duration cxios_date_sub(cxios_date date1_c, cxios_date date2_c)"),
72                                    date1_c.year, date1_c.month, date1_c.day,
73                                    date1_c.hour, date1_c.minute, date1_c.second);
74    xios::CDate date2 = xios::CDate(getCalendar("cxios_duration cxios_date_sub(cxios_date date1_c, cxios_date date2_c)"),
75                                    date2_c.year, date2_c.month, date2_c.day,
76                                    date2_c.hour, date2_c.minute, date2_c.second);
77    xios::CDuration res = date1 - date2;
78    return { res.year, res.month, res.day, res.hour, res.minute, res.second, res.timestep };
79  }
80
81  bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)
82  {
83    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
84                                    date1_c.year, date1_c.month, date1_c.day,
85                                    date1_c.hour, date1_c.minute, date1_c.second);
86    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
87                                    date2_c.year, date2_c.month, date2_c.day,
88                                    date2_c.hour, date2_c.minute, date2_c.second);
89    return (date1 == date2);
90  }
91
92  bool cxios_date_neq(cxios_date date1_c, cxios_date date2_c)
93  {
94    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
95                                    date1_c.year, date1_c.month, date1_c.day,
96                                    date1_c.hour, date1_c.minute, date1_c.second);
97    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
98                                    date2_c.year, date2_c.month, date2_c.day,
99                                    date2_c.hour, date2_c.minute, date2_c.second);
100    return (date1 != date2);
101  }
102
103  bool cxios_date_lt(cxios_date date1_c, cxios_date date2_c)
104  {
105    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
106                                    date1_c.year, date1_c.month, date1_c.day,
107                                    date1_c.hour, date1_c.minute, date1_c.second);
108    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
109                                    date2_c.year, date2_c.month, date2_c.day,
110                                    date2_c.hour, date2_c.minute, date2_c.second);
111    return (date1 < date2);
112  }
113
114  bool cxios_date_le(cxios_date date1_c, cxios_date date2_c)
115  {
116    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
117                                    date1_c.year, date1_c.month, date1_c.day,
118                                    date1_c.hour, date1_c.minute, date1_c.second);
119    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
120                                    date2_c.year, date2_c.month, date2_c.day,
121                                    date2_c.hour, date2_c.minute, date2_c.second);
122    return (date1 <= date2);
123  }
124
125  bool cxios_date_gt(cxios_date date1_c, cxios_date date2_c)
126  {
127    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
128                                    date1_c.year, date1_c.month, date1_c.day,
129                                    date1_c.hour, date1_c.minute, date1_c.second);
130    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
131                                    date2_c.year, date2_c.month, date2_c.day,
132                                    date2_c.hour, date2_c.minute, date2_c.second);
133    return (date1 > date2);
134  }
135
136  bool cxios_date_ge(cxios_date date1_c, cxios_date date2_c)
137  {
138    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
139                                    date1_c.year, date1_c.month, date1_c.day,
140                                    date1_c.hour, date1_c.minute, date1_c.second);
141    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
142                                    date2_c.year, date2_c.month, date2_c.day,
143                                    date2_c.hour, date2_c.minute, date2_c.second);
144    return (date1 >= date2);
145  }
146
147  int cxios_date_get_second_of_year(cxios_date date_c)
148  {
149    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_second_of_year(cxios_date date_c)"),
150                                   date_c.year, date_c.month, date_c.day,
151                                   date_c.hour, date_c.minute, date_c.second);
152    return date.getSecondOfYear();
153  }
154
155  double cxios_date_get_day_of_year(cxios_date date_c)
156  {
157    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_day_of_year(cxios_date date_c)"),
158                                   date_c.year, date_c.month, date_c.day,
159                                   date_c.hour, date_c.minute, date_c.second);
160    return date.getDayOfYear();
161  }
162
163  double cxios_date_get_fraction_of_year(cxios_date date_c)
164  {
165    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_fraction_of_year(cxios_date date_c)"),
166                                   date_c.year, date_c.month, date_c.day,
167                                   date_c.hour, date_c.minute, date_c.second);
168    return date.getFractionOfYear();
169  }
170
171  int cxios_date_get_second_of_day(cxios_date date_c)
172  {
173    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_second_of_day(cxios_date date_c)"),
174                                   date_c.year, date_c.month, date_c.day,
175                                   date_c.hour, date_c.minute, date_c.second);
176    return date.getSecondOfDay();
177  }
178
179  double cxios_date_get_fraction_of_day(cxios_date date_c)
180  {
181    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_fraction_of_day(cxios_date date_c)"),
182                                   date_c.year, date_c.month, date_c.day,
183                                   date_c.hour, date_c.minute, date_c.second);
184    return date.getFractionOfDay();
185  }
186} // extern "C"
Note: See TracBrowser for help on using the repository browser.