source: XMLIO_V2/dev/dev_rv/src/xmlio/iface/interface.cpp.in @ 189

Last change on this file since 189 was 189, checked in by hozdoba, 10 years ago
File size: 13.1 KB
Line 
1#include "macro.inc"
2
3INCLUDE "../xmlioserver.hpp"
4
5INCLUDE "attribute_template_impl.hpp"
6INCLUDE "object_template_impl.hpp"
7INCLUDE "group_template_impl.hpp"
8
9INCLUDE "calendar_type.hpp"
10
11#ifdef __cplusplus
12extern "C"
13{
14#endif //__cplusplus
15
16typedef xmlioserver::tree::CAxis    caxis;
17typedef xmlioserver::tree::CField   cfield;
18typedef xmlioserver::tree::CDomain  cdomain;
19typedef xmlioserver::tree::CGrid    cgrid;
20typedef xmlioserver::tree::CFile    cfile;
21typedef xmlioserver::tree::CContext ccontext;
22
23typedef xmlioserver::tree::CAxisGroup    caxisgroup;
24typedef xmlioserver::tree::CFieldGroup   cfieldgroup;
25typedef xmlioserver::tree::CDomainGroup  cdomaingroup;
26typedef xmlioserver::tree::CGridGroup    cgridgroup;
27typedef xmlioserver::tree::CFileGroup    cfilegroup;
28typedef xmlioserver::tree::CContextGroup ccontextgroup;
29
30
31typedef long int XInt, XSize; // Integer
32typedef bool     XBool;       // Logical
33typedef void   * XPtr;        // Pointeur C non typé
34typedef char   * XString;     // Pointeur C non typé
35
36typedef enum
37{
38   NOTYPE = 0,
39   DTREATMENT/* UNUSED */, DATE, CALENDAR, ECONTEXT,
40   EAXIS, EDOMAIN, EFIELD, EFILE, EGRID,
41   GAXIS, GDOMAIN, GFIELD, GFILE, GGRID
42} XDType;
43
44typedef enum
45{
46   NETCDF4 = 0
47} XFileType;
48
49typedef enum
50{ D360 = 0 , ALLLEAP, NOLEAP, JULIAN, GREGORIAN } XCalendarType ;
51
52//-------------------------------------------------------------------
53
54#define DECLARE_ATTRIBUTE(type, name) \
55        DECLARE_INTERFACE(axis, type, name)
56#include "../config/axis_attribute.conf"
57
58#undef  DECLARE_ATTRIBUTE
59#define DECLARE_ATTRIBUTE(type, name) \
60        DECLARE_INTERFACE(field, type, name)
61#include "../config/field_attribute.conf"
62
63#undef  DECLARE_ATTRIBUTE
64#define DECLARE_ATTRIBUTE(type, name) \
65        DECLARE_INTERFACE(context, type, name)
66#include "../config/context_attribute.conf"
67
68#undef  DECLARE_ATTRIBUTE
69#define DECLARE_ATTRIBUTE(type, name) \
70        DECLARE_INTERFACE(domain, type, name)
71#include "../config/domain_attribute.conf"
72
73#undef  DECLARE_ATTRIBUTE
74#define DECLARE_ATTRIBUTE(type, name) \
75        DECLARE_INTERFACE(file, type, name)
76#include "../config/file_attribute.conf"
77
78#undef  DECLARE_ATTRIBUTE
79#define DECLARE_ATTRIBUTE(type, name) \
80        DECLARE_INTERFACE(grid, type, name)
81#include "../config/grid_attribute.conf"
82
83//-------------------------------------------------------------------
84
85#define CASE_ELEM(elem_enum, elem_class)                                         \
86   case (E##elem_enum): ;; { ;;                                                  \
87      *_ret = (!CObjectFactory::HasObject<C##elem_class>(__id));;                \
88            ? 0 : CObjectFactory::GetObject<C##elem_class>(__id).get(); ;;       \
89      return; ;;};;                                                              \
90   case (G##elem_enum): ;; { ;;                                                  \
91      *_ret = (!CObjectFactory::HasObject<C##elem_class##Group>(__id));;         \
92            ? 0 : CObjectFactory::GetObject<C##elem_class##Group>(__id).get(); ;;\
93      return; ;;};;
94
95//-------------------------------------------------------------------
96
97void xios_handle_create (XPtr * const _ret, XDType _dtype, const XString _id, XSize _id_len)
98{
99   MAKE_STRING(__id, _id, _id_len);
100   switch(_dtype)
101   {
102      case (ECONTEXT):
103         // Si le context n'existe pas, on retourne un handle vide/nul.
104         *_ret = (!CObjectFactory::HasObject<CContext>(__id))
105               ? 0 : CObjectFactory::GetObject<CContext>(__id).get();
106         return ;
107      CASE_ELEM(AXIS   , Axis)
108      CASE_ELEM(DOMAIN , Domain)
109      CASE_ELEM(FIELD  , Field)
110      CASE_ELEM(FILE   , File)
111      CASE_ELEM(GRID   , Grid)
112      default :
113         *_ret = 0;
114         return;
115   }
116}
117
118#undef CASE_ELEM
119
120//-------------------------------------------------------------------
121
122void xios_xml_parse_file  (const XString _filename, XSize _filename_len)
123{
124   try
125   {
126      MAKE_STRING(__filename, _filename, _filename_len)
127      CTreeManager::ParseFile(__filename);
128      //~ StdOStringStream oss;
129      //~ oss << StdString("data/def/def_client_pre.")
130      //~     << CMPIManager::GetCommRank(CMPIManager::GetCommWorld());
131      //~ CTreeManager::PrintTreeToFile(oss.str());
132   }
133   catch (CException & exc)
134   {
135      std::cerr << exc.getMessage() << std::endl;
136      exit (EXIT_FAILURE);
137   }
138}
139
140//-------------------------------------------------------------------
141
142void xios_xml_parse_string(const XString _xmlcontent, XSize _xmlcontent_len)
143{
144   try
145   {
146      MAKE_STRING(__xmlcontent, _xmlcontent, _xmlcontent_len)
147      CTreeManager::ParseString(__xmlcontent);
148      //~ StdOStringStream oss;
149      //~ oss << StdString("data/def/def_client_pre.")
150      //~     << CMPIManager::GetCommRank(CMPIManager::GetCommWorld());
151      //~ CTreeManager::PrintTreeToFile(oss.str());
152   }
153   catch (CException & exc)
154   {
155      std::cerr << exc.getMessage() << std::endl;
156      exit (EXIT_FAILURE);
157   }
158}
159
160//-------------------------------------------------------------------
161
162void xios_context_set_current (XPtr const _ctx, bool _wswap)
163{
164   boost::shared_ptr<CContext> context = CObjectFactory::GetObject<CContext> ((CContext*)_ctx);
165   CTreeManager::SetCurrentContextId(context->getId());
166}
167
168//-------------------------------------------------------------------
169
170void xios_context_create (XPtr * _ctxt, const XString _ctxt_id,
171                          XSize _ctxt_id_len, XCalendarType _calType,
172                          XInt yr, XInt mth, XInt dd,
173                          XInt hr, XInt min, XInt sec)
174{
175   try
176   {
177      MAKE_STRING(__ctxt_id, _ctxt_id, _ctxt_id_len)
178      boost::shared_ptr<CContext> context = CTreeManager::CreateContext(__ctxt_id);
179      *_ctxt = context.get();
180      switch(_calType)
181      {
182         case (D360)     :
183            context->setCalendar(boost::shared_ptr<date::CCalendar>
184               (new date::CD360Calendar(yr, mth, dd, hr, min, sec)));
185            break;
186         case (ALLLEAP)  :
187            context->setCalendar(boost::shared_ptr<date::CCalendar>
188               (new date::CAllLeapCalendar(yr, mth, dd, hr, min, sec)));
189            break;
190         case (NOLEAP)   :
191            context->setCalendar(boost::shared_ptr<date::CCalendar>
192               (new date::CNoLeapCalendar(yr, mth, dd, hr, min, sec)));
193            break;
194         case (JULIAN)   :
195            context->setCalendar(boost::shared_ptr<date::CCalendar>
196               (new date::CJulianCalendar(yr, mth, dd, hr, min, sec)));
197            break;
198         case (GREGORIAN):
199            context->setCalendar(boost::shared_ptr<date::CCalendar>
200               (new date::CGregorianCalendar(yr, mth, dd, hr, min, sec)));
201             break;
202         default:
203            std::cerr << "Le calendrier n'est pas identifié" << std::endl;
204            exit (EXIT_FAILURE);
205      }   
206   }
207   catch (CException & exc)
208   {
209      std::cerr << exc.getMessage() << std::endl;
210      exit (EXIT_FAILURE);
211   }
212}
213
214//-------------------------------------------------------------------
215
216#define CASE_ELEM0(elem_enum, elem_class, group_enum, group_class)                     \
217      case (group_enum) : ;;                                                           \
218      { ;;                                                                             \
219         group_class * _group = (group_class *) _parent;                               \
220         boost::shared_ptr<group_class> group = ;;                                     \
221            CObjectFactory::GetObject<group_class>(_group); ;;                         \
222         switch(_child_type) ;;                                                        \
223         { ;;                                                                          \
224            case (group_enum) : ;;                                                     \
225               if ((_child_id_len != -1) && ;;                                         \
226                   (CObjectFactory::HasObject<group_class>(__child_id))) ;;            \
227                  return; ;;                                                           \
228               *_child = CGroupFactory::CreateGroup(group, __child_id).get(); ;;       \
229               break; ;;                                                               \
230            case (elem_enum) : ;;                                                      \
231               if ((_child_id_len != -1) && ;;                                         \
232                   (CObjectFactory::HasObject<elem_class>(__child_id))) ;;             \
233                  return; ;;                                                           \
234               *_child = CGroupFactory::CreateChild(group, __child_id).get(); ;;       \
235               break; ;;                                                               \
236            default : ;;                                                               \
237               std::cerr << "[xml_tree_add] Type enfant invalide" << std::endl; ;;     \
238         }; ;;                                                                         \
239         return; ;;                                                                    \
240      }
241
242//-------------------------------------------------------------------
243
244void xios_xml_tree_add(const XPtr _parent, XDType _parent_type, XPtr * _child,
245                       XDType _child_type, const XString _child_id, XSize _child_id_len)
246{
247   MAKE_STRING(__child_id, _child_id, _child_id_len);
248   try
249   {
250      switch (_parent_type)
251      {
252         case (EFILE) :
253         {
254            CFile * _file = (CFile *) _parent;
255            boost::shared_ptr<CFile> file = CObjectFactory::GetObject<CFile>(_file);
256            if (!CObjectFactory::HasObject<CFieldGroup>(file->getId()))
257               file->setVirtualFieldGroup(file->getId());
258            xios_xml_tree_add (file->getVirtualFieldGroup().get(), GFIELD,
259                              _child, EFIELD, _child_id, _child_id_len);
260            return;
261         }
262         CASE_ELEM0(EAXIS  , CAxis  , GAXIS  , CAxisGroup);
263         CASE_ELEM0(EGRID  , CGrid  , GGRID  , CGridGroup);
264         CASE_ELEM0(EDOMAIN, CDomain, GDOMAIN, CDomainGroup);
265         CASE_ELEM0(EFIELD , CField , GFIELD , CFieldGroup);
266         CASE_ELEM0(EFILE  , CFile  , GFILE  , CFileGroup);
267         default :
268            std::cerr << "[xml_tree_add] Type parent invalide" << std::endl;
269            return;
270      }
271   }
272   catch (CException & exc)
273   {
274      std::cerr << exc.getMessage() << std::endl;
275      exit (EXIT_FAILURE);
276   }
277}
278
279#undef CASE_ELEM0
280
281//-------------------------------------------------------------------
282
283void xios_xml_tree_show(const XString _filename, XSize _filename_len)
284{
285   MAKE_STRING(__filename, _filename, _filename_len);
286   if (_filename_len != -1)
287      CTreeManager::PrintTreeToFile(__filename);
288   else
289      CTreeManager::PrintTreeToStream(std::clog);
290}
291
292//-------------------------------------------------------------------
293
294void xios_dtreatment_start(XPtr const _context, XFileType filetype, MPIComm comm_client_server)
295{
296   try
297   {
298      StdOStringStream oss;
299      //~ oss << StdString("data/def/def_client_next.")
300      //~     << CMPIManager::GetCommRank(CMPIManager::GetCommWorld());
301      //~ CTreeManager::PrintTreeToFile(oss.str());
302      //~ oss.str("");
303
304      CDataTreatment dt;   
305      oss << StdString("data/def/def_client_end.")
306          << CMPIManager::GetCommRank(CMPIManager::GetCommWorld());
307      CTreeManager::PrintTreeToFile(oss.str());
308     
309      if ((comm_client_server != -1))
310      {
311         MPIRequest request = 0;
312         StdOStringStream ostrs;
313         if (CMPIManager::GetCommRank(comm_client_server) == 1)
314         {
315            CTreeManager::ToBinary(ostrs);     
316            CLinearBuffer lbuffer(ostrs.str().size()+13);           
317            lbuffer.appendString(ostrs.str());
318            CMPIManager::SendLinearBuffer(comm_client_server, 0, lbuffer, request);
319            CMPIManager::Wait(request);  // Pas encore en mode RPC
320         }
321         else
322         {
323            CTreeManager::DomainsToBinary(ostrs);
324            CLinearBuffer lbuffer(ostrs.str().size()+13);
325            lbuffer.appendString(ostrs.str());
326            CMPIManager::SendLinearBuffer(comm_client_server, 0, lbuffer, request);
327            CMPIManager::Wait(request);  // Pas encore en mode RPC
328         }
329      }
330      else
331      {
332         dt.createDataOutput<CNc4DataOutput>();
333      }     
334   }
335   catch (CException & exc)
336   {
337      std::cerr << exc.getMessage() << std::endl;
338      exit (EXIT_FAILURE);
339   }
340}
341
342//-------------------------------------------------------------------
343
344void xios_dtreatment_end(void)
345{
346
347}
348
349//-------------------------------------------------------------------
350
351void xios_write_data(const XString _field_id, XSize _field_id_len, double * data_k8,
352                     XSize data_Xsize, XSize data_Ysize, XSize data_Zsize)
353{
354
355}
356
357//-------------------------------------------------------------------
358
359void xios_update_calendar(int step)
360{
361
362}
363
364//-------------------------------------------------------------------
365
366void xios_set_timestep(double ts_year, double ts_month, double ts_day,
367                       double ts_hour, double ts_minute, double ts_second)
368{
369
370
371}
372
373//-------------------------------------------------------------------
374
375#ifdef __cplusplus
376}
377#endif //__cplusplus
Note: See TracBrowser for help on using the repository browser.