source: XIOS/trunk/src/interface/c/iccalendar_wrapper.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
File size: 4.4 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 "icutil.hpp"
15#include "icdate.hpp"
16#include "timer.hpp"
17#include "calendar_wrapper.hpp"
18
19extern "C"
20{
21// /////////////////////////////// Définitions ////////////////////////////// //
22
23  // ----------------------- Redéfinition de type ----------------------------
24
25  typedef xios::CCalendarWrapper *XCalendarWrapperPtr;
26
27  // ------------------------ Création des handle -----------------------------
28
29  void cxios_calendar_wrapper_handle_create(XCalendarWrapperPtr* _ret, const char* _id, int _id_len)
30  {
31    std::string id;
32    if (!cstr2string(_id, _id_len, id)) return;
33    CTimer::get("XIOS").resume();
34    *_ret = CCalendarWrapper::get(id);
35    CTimer::get("XIOS").suspend();
36  }
37
38  void cxios_get_current_calendar_wrapper(XCalendarWrapperPtr* _ret)
39  {
40    CTimer::get("XIOS").resume();
41    *_ret = CCalendarWrapper::get(CCalendarWrapper::GetDefName());
42    CTimer::get("XIOS").suspend();
43  }
44
45  // -------------------- Vérification des identifiants -----------------------
46
47  void cxios_calendar_wrapper_valid_id(bool* _ret, const char* _id, int _id_len)
48  {
49    std::string id;
50    if (!cstr2string(_id, _id_len, id)) return;
51    CTimer::get("XIOS").resume();
52    *_ret = CCalendarWrapper::has(id);
53    CTimer::get("XIOS").suspend();
54  }
55
56  // ----------------------- Custom getters and setters -----------------------
57
58  void cxios_set_calendar_wrapper_date_start_date(XCalendarWrapperPtr calendarWrapper_hdl, cxios_date start_date_c)
59  {
60    CTimer::get("XIOS").resume();
61    CDate start_date(*calendarWrapper_hdl->getCalendar(true),
62                     start_date_c.year,
63                     start_date_c.month,
64                     start_date_c.day,
65                     start_date_c.hour,
66                     start_date_c.minute,
67                     start_date_c.second);
68    calendarWrapper_hdl->setInitDate(start_date);
69    CTimer::get("XIOS").suspend();
70  }
71
72  void cxios_get_calendar_wrapper_date_start_date(XCalendarWrapperPtr calendarWrapper_hdl, cxios_date* start_date_c)
73  {
74    CTimer::get("XIOS").resume();
75    const CDate& start_date = calendarWrapper_hdl->getInitDate();
76    start_date_c->year = start_date.getYear();
77    start_date_c->month = start_date.getMonth();
78    start_date_c->day = start_date.getDay();
79    start_date_c->hour = start_date.getHour();
80    start_date_c->minute = start_date.getMinute();
81    start_date_c->second = start_date.getSecond();
82    CTimer::get("XIOS").suspend();
83  }
84
85  void cxios_set_calendar_wrapper_date_time_origin(XCalendarWrapperPtr calendarWrapper_hdl, cxios_date time_origin_c)
86  {
87    CTimer::get("XIOS").resume();
88    CDate time_origin(*calendarWrapper_hdl->getCalendar(true),
89                      time_origin_c.year,
90                      time_origin_c.month,
91                      time_origin_c.day,
92                      time_origin_c.hour,
93                      time_origin_c.minute,
94                      time_origin_c.second);
95    calendarWrapper_hdl->setTimeOrigin(time_origin);
96    CTimer::get("XIOS").suspend();
97  }
98
99  void cxios_get_calendar_wrapper_date_time_origin(XCalendarWrapperPtr calendarWrapper_hdl, cxios_date* time_origin_c)
100  {
101    CTimer::get("XIOS").resume();
102    const CDate& time_origin = calendarWrapper_hdl->getTimeOrigin();
103    time_origin_c->year = time_origin.getYear();
104    time_origin_c->month = time_origin.getMonth();
105    time_origin_c->day = time_origin.getDay();
106    time_origin_c->hour = time_origin.getHour();
107    time_origin_c->minute = time_origin.getMinute();
108    time_origin_c->second = time_origin.getSecond();
109    CTimer::get("XIOS").suspend();
110  }
111
112  // ----------------------- Calendar creation and update ----------------------
113
114  void cxios_create_calendar(XCalendarWrapperPtr calendarWrapper_hdl)
115  {
116    CTimer::get("XIOS").resume();
117    calendarWrapper_hdl->createCalendar();
118    CTimer::get("XIOS").suspend();
119  }
120
121  void cxios_update_calendar_timestep(XCalendarWrapperPtr calendarWrapper_hdl)
122  {
123    CTimer::get("XIOS").resume();
124    calendarWrapper_hdl->updateTimestep();
125    CTimer::get("XIOS").suspend();
126  }
127} // extern "C"
Note: See TracBrowser for help on using the repository browser.