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

Last change on this file since 546 was 545, checked in by rlacroix, 10 years ago

Expose the calendar operations through the Fortran interface.

  • Add arithmetic operations on the xios_duration and xios_date types:
    • xios_duration + xios_duration = xios_duration
    • xios_duration - xios_duration = xios_duration
    • scalar * xios_duration = xios_duration * scalar = xios_duration
    • - xios_duration = xios_duration
    • xios_date + xios_duration = xios_date
    • xios_date - xios_duration = xios_date
    • xios_date - xios_date = xios_duration
  • Add comparison operations on the xios_duration and xios_date types:
    • xios_duration: ==, /=
    • xios_date: ==, /=, <, <=, >, >=
  • Add a new function "xios_date_convert_to_seconds" to convert a date into the number of seconds since the time origin of the calendar
  • Define some constant durations "xios_second", "xios_minute", "xios_hour", "xios_day", "xios_month", "xios_year" et "xios_timestep" to ease the definition of new durations (for example, 10h is just 10 * xios_hour)
  • Add a new function "xios_set_calendar" so that one can manually create the calendar attached to the current context and thus use the calendar operations before calling "xios_close_context_definition". This function can accept optional parameters so that the calendar attributes (calendar_type, start_date, time_origin and timestep) can be easily overwritten. Note that you cannot define a new calendar after one was already created (either because "xios_set_calendar" or "xios_close_context_definition" was used)
  • Readd the function "xios_set_timestep" as a simplified alias of "xios_set_context_attr(context, timestep)" for the current context
  • 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: 7.3 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} // extern "C"
Note: See TracBrowser for help on using the repository browser.