source: XIOS/dev/branch_openmp/src/interface/c/icdate.cpp @ 1482

Last change on this file since 1482 was 1482, checked in by yushan, 3 years ago

Branch EP merged with Dev_cmip6 @r1481

  • 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.9 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 "xios.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  void cxios_date_convert_to_string(cxios_date date_c, char* str, int str_size)
46  {
47    xios::CDate date = xios::CDate(getCalendar("void cxios_date_convert_to_string(cxios_date date_c, char* str, int str_size)"),
48                                   date_c.year, date_c.month, date_c.day,
49                                   date_c.hour, date_c.minute, date_c.second);
50
51    if (!string_copy(date.toString(), str, str_size))
52      ERROR("void cxios_date_convert_to_string(cxios_date date_c, char* str, int str_size)", << "Input string is too short");
53  }
54
55  cxios_date cxios_date_convert_from_string(const char* str, int str_size)
56  {
57    std::string date_str;
58    xios::CDate date;
59
60    if (cstr2string(str, str_size, date_str))
61      date = xios::CDate::FromString(date_str,
62                                     getCalendar("cxios_date cxios_date_convert_from_string(const char* str, int str_size)"));
63
64    return { date.getYear(), date.getMonth(), date.getDay(), date.getHour(), date.getMinute(), date.getSecond() };
65  }
66
67  cxios_date cxios_date_add_duration(cxios_date date_c, cxios_duration dur_c)
68  {
69    xios::CDate date = xios::CDate(getCalendar("cxios_date cxios_date_add_duration(cxios_date date_c, cxios_duration dur_c)"),
70                                   date_c.year, date_c.month, date_c.day,
71                                   date_c.hour, date_c.minute, date_c.second);
72
73    xios::CDuration dur( dur_c.year, dur_c.month, dur_c.day, dur_c.hour, dur_c.minute, dur_c.second, dur_c.timestep );
74    xios::CDate res = date + dur;
75    return { res.getYear(), res.getMonth(), res.getDay(), res.getHour(), res.getMinute(), res.getSecond() };
76  }
77
78  cxios_date cxios_date_sub_duration(cxios_date date_c, cxios_duration dur_c)
79  {
80    xios::CDate date = xios::CDate(getCalendar("cxios_date cxios_date_sub_duration(cxios_date date_c, cxios_duration dur_c)"),
81                                   date_c.year, date_c.month, date_c.day,
82                                   date_c.hour, date_c.minute, date_c.second);
83    xios::CDuration dur( dur_c.year, dur_c.month, dur_c.day, dur_c.hour, dur_c.minute, dur_c.second, dur_c.timestep );
84    xios::CDate res = date - dur;
85    return { res.getYear(), res.getMonth(), res.getDay(), res.getHour(), res.getMinute(), res.getSecond() };
86  }
87
88  cxios_duration cxios_date_sub(cxios_date date1_c, cxios_date date2_c)
89  {
90    xios::CDate date1 = xios::CDate(getCalendar("cxios_duration cxios_date_sub(cxios_date date1_c, cxios_date date2_c)"),
91                                    date1_c.year, date1_c.month, date1_c.day,
92                                    date1_c.hour, date1_c.minute, date1_c.second);
93    xios::CDate date2 = xios::CDate(getCalendar("cxios_duration cxios_date_sub(cxios_date date1_c, cxios_date date2_c)"),
94                                    date2_c.year, date2_c.month, date2_c.day,
95                                    date2_c.hour, date2_c.minute, date2_c.second);
96    xios::CDuration res = date1 - date2;
97    return { res.year, res.month, res.day, res.hour, res.minute, res.second, res.timestep };
98  }
99
100  bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)
101  {
102    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
103                                    date1_c.year, date1_c.month, date1_c.day,
104                                    date1_c.hour, date1_c.minute, date1_c.second);
105    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
106                                    date2_c.year, date2_c.month, date2_c.day,
107                                    date2_c.hour, date2_c.minute, date2_c.second);
108    return (date1 == date2);
109  }
110
111  bool cxios_date_neq(cxios_date date1_c, cxios_date date2_c)
112  {
113    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
114                                    date1_c.year, date1_c.month, date1_c.day,
115                                    date1_c.hour, date1_c.minute, date1_c.second);
116    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
117                                    date2_c.year, date2_c.month, date2_c.day,
118                                    date2_c.hour, date2_c.minute, date2_c.second);
119    return (date1 != date2);
120  }
121
122  bool cxios_date_lt(cxios_date date1_c, cxios_date date2_c)
123  {
124    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
125                                    date1_c.year, date1_c.month, date1_c.day,
126                                    date1_c.hour, date1_c.minute, date1_c.second);
127    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
128                                    date2_c.year, date2_c.month, date2_c.day,
129                                    date2_c.hour, date2_c.minute, date2_c.second);
130    return (date1 < date2);
131  }
132
133  bool cxios_date_le(cxios_date date1_c, cxios_date date2_c)
134  {
135    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
136                                    date1_c.year, date1_c.month, date1_c.day,
137                                    date1_c.hour, date1_c.minute, date1_c.second);
138    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
139                                    date2_c.year, date2_c.month, date2_c.day,
140                                    date2_c.hour, date2_c.minute, date2_c.second);
141    return (date1 <= date2);
142  }
143
144  bool cxios_date_gt(cxios_date date1_c, cxios_date date2_c)
145  {
146    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
147                                    date1_c.year, date1_c.month, date1_c.day,
148                                    date1_c.hour, date1_c.minute, date1_c.second);
149    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
150                                    date2_c.year, date2_c.month, date2_c.day,
151                                    date2_c.hour, date2_c.minute, date2_c.second);
152    return (date1 > date2);
153  }
154
155  bool cxios_date_ge(cxios_date date1_c, cxios_date date2_c)
156  {
157    xios::CDate date1 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
158                                    date1_c.year, date1_c.month, date1_c.day,
159                                    date1_c.hour, date1_c.minute, date1_c.second);
160    xios::CDate date2 = xios::CDate(getCalendar("bool cxios_date_eq(cxios_date date1_c, cxios_date date2_c)"),
161                                    date2_c.year, date2_c.month, date2_c.day,
162                                    date2_c.hour, date2_c.minute, date2_c.second);
163    return (date1 >= date2);
164  }
165
166  int cxios_date_get_second_of_year(cxios_date date_c)
167  {
168    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_second_of_year(cxios_date date_c)"),
169                                   date_c.year, date_c.month, date_c.day,
170                                   date_c.hour, date_c.minute, date_c.second);
171    return date.getSecondOfYear();
172  }
173
174  double cxios_date_get_day_of_year(cxios_date date_c)
175  {
176    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_day_of_year(cxios_date date_c)"),
177                                   date_c.year, date_c.month, date_c.day,
178                                   date_c.hour, date_c.minute, date_c.second);
179    return date.getDayOfYear();
180  }
181
182  double cxios_date_get_fraction_of_year(cxios_date date_c)
183  {
184    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_fraction_of_year(cxios_date date_c)"),
185                                   date_c.year, date_c.month, date_c.day,
186                                   date_c.hour, date_c.minute, date_c.second);
187    return date.getFractionOfYear();
188  }
189
190  int cxios_date_get_second_of_day(cxios_date date_c)
191  {
192    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_second_of_day(cxios_date date_c)"),
193                                   date_c.year, date_c.month, date_c.day,
194                                   date_c.hour, date_c.minute, date_c.second);
195    return date.getSecondOfDay();
196  }
197
198  double cxios_date_get_fraction_of_day(cxios_date date_c)
199  {
200    xios::CDate date = xios::CDate(getCalendar("int cxios_date_get_fraction_of_day(cxios_date date_c)"),
201                                   date_c.year, date_c.month, date_c.day,
202                                   date_c.hour, date_c.minute, date_c.second);
203    return date.getFractionOfDay();
204  }
205} // extern "C"
Note: See TracBrowser for help on using the repository browser.