source: XIOS/trunk/src/interface/c/icdata.cpp @ 369

Last change on this file since 369 was 369, checked in by ymipsl, 12 years ago

Major Update

  • redesign Type and attribute manipulation
  • add enumerate type and attribute
  • use blitz class array instead of boost class array

YM

  • Property svn:eol-style set to native
File size: 6.8 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#include <string>
8#include <iostream>
9
10
11#include "xmlioserver.hpp"
12#include "oasis_cinterface.hpp"
13
14#include "attribute_template.hpp"
15#include "object_template.hpp"
16#include "group_template.hpp"
17
18#include "icutil.hpp"
19#include "cxios.hpp"
20#include "client.hpp"
21#include "field.hpp"
22#include "context.hpp"
23#include <mpi.h>
24#include "timer.hpp"
25#include "array_new.hpp"
26
27extern "C"
28{
29// /////////////////////////////// Définitions ////////////////////////////// //
30
31   // ----------------------- Redéfinition de types ----------------------------
32   
33   typedef enum { NETCDF4 = 0 } XFileType;
34   
35   typedef xios::CContext * XContextPtr;
36
37   // -------------------- Traitement des données ------------------------------
38   void cxios_init_server(void)
39   {
40     CXios::initServerSide();     
41   }
42
43   void cxios_init_client(const char * client_id , int len_client_id, MPI_Fint* f_local_comm, MPI_Fint* f_return_comm )
44   {
45      std::string str; 
46      MPI_Comm local_comm ;
47      MPI_Comm return_comm ;
48     
49      if (!cstr2string(client_id, len_client_id, str)) return;
50
51      int initialized ;
52      MPI_Initialized(&initialized) ;
53      if (initialized) local_comm=MPI_Comm_f2c(*f_local_comm) ;
54      else local_comm=MPI_COMM_NULL ;
55      CXios::initClientSide(str,local_comm,return_comm);
56      *f_return_comm=MPI_Comm_c2f(return_comm) ;
57      CTimer::get("XIOS init").suspend() ;
58      CTimer::get("XIOS").suspend() ;
59   }
60
61   void cxios_context_initialize(const char * context_id , int len_context_id, MPI_Fint* f_comm)
62   {
63     std::string str; 
64     MPI_Comm comm ;
65     
66     if (!cstr2string(context_id, len_context_id, str)) return;
67     CTimer::get("XIOS").resume() ;
68     CTimer::get("XIOS init context").resume() ;
69     comm=MPI_Comm_f2c(*f_comm) ;
70     CClient::registerContext(str,comm) ;
71     CTimer::get("XIOS init context").suspend() ;
72     CTimer::get("XIOS").suspend() ;
73   }
74 
75    void cxios_context_close_definition()
76   {
77     CTimer::get("XIOS").resume() ;
78     CTimer::get("XIOS close definition").resume() ;
79     CContext* context = CContext::getCurrent() ;
80     context->closeDefinition() ;
81     CTimer::get("XIOS close definition").suspend() ;
82     CTimer::get("XIOS").suspend() ;
83   } 
84
85   void cxios_context_finalize()
86   {
87     CTimer::get("XIOS").resume() ;
88     CTimer::get("XIOS context finalize").resume() ;
89     CContext* context = CContext::getCurrent() ;
90     context->finalize() ;
91     CTimer::get("XIOS context finalize").suspend() ;
92     CTimer::get("XIOS").suspend() ;
93   }
94   
95   void cxios_finalize()
96   {
97     CTimer::get("XIOS").resume() ;
98     CTimer::get("XIOS finalize").resume() ;
99     CXios::clientFinalize() ;
100   }
101
102 
103   
104   // ---------------------- Ecriture des données ------------------------------
105   
106   void cxios_write_data_k81(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize)
107   {
108      std::string fieldid_str;
109      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
110     
111      CTimer::get("XIOS").resume() ;
112      CTimer::get("XIOS send field").resume() ;
113      CContext* context = CContext::getCurrent() ;
114
115      CArray<double,(StdSize)1> data(data_k8,shape(data_Xsize),neverDeleteData) ;
116      CField::get(fieldid_str)->setData(data) ;
117      CField toto ;
118      toto.setData(data) ;
119      CTimer::get("XIOS send field").suspend() ;
120      CTimer::get("XIOS").suspend() ;
121   }
122   
123   void cxios_write_data_k82(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize)
124   {
125      std::string fieldid_str;
126      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
127     
128      CTimer::get("XIOS").resume() ;
129      CTimer::get("XIOS send field").resume() ;
130      CContext* context = CContext::getCurrent() ;
131     
132      CArray<double,2>data(data_k8,shape(data_Xsize,data_Ysize),neverDeleteData) ;
133      CField::get(fieldid_str)->setData(data) ;
134      CTimer::get("XIOS send field").suspend() ;
135      CTimer::get("XIOS").suspend() ;
136   }
137   
138   void cxios_write_data_k83(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize, int data_Zsize)
139   {
140      std::string fieldid_str;
141      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
142
143      CTimer::get("XIOS").resume() ;
144      CTimer::get("XIOS send field").resume() ;
145      CContext* context = CContext::getCurrent() ;
146
147      CArray<double,3>data(data_k8,shape(data_Xsize,data_Ysize,data_Zsize),neverDeleteData) ;
148      CField::get(fieldid_str)->setData(data) ;
149      CTimer::get("XIOS send field").suspend() ;
150      CTimer::get("XIOS").suspend() ;
151   }
152   
153   void cxios_write_data_k41(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize)
154   {
155      std::string fieldid_str;
156     if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
157
158      CTimer::get("XIOS").resume() ;
159      CTimer::get("XIOS send field").resume() ;
160      CContext* context = CContext::getCurrent() ;
161      CArray<float,1> data_tmp(data_k4,shape(data_Xsize),neverDeleteData) ;
162      CArray<double,1> data(data_Xsize) ;
163      data=data_tmp ;
164      CField::get(fieldid_str)->setData(data) ;
165      CTimer::get("XIOS send field").suspend() ;
166      CTimer::get("XIOS").suspend() ;
167   }
168   
169   void cxios_write_data_k42(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize)
170   {
171      std::string fieldid_str;
172      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
173
174      CTimer::get("XIOS").resume() ;
175      CTimer::get("XIOS send field").resume() ;
176      CContext* context = CContext::getCurrent() ;
177      CArray<float,2> data_tmp(data_k4,shape(data_Xsize,data_Ysize),neverDeleteData) ;
178      CArray<double,2> data(data_Xsize,data_Ysize) ;
179      data=data_tmp ;
180      CField::get(fieldid_str)->setData(data) ;
181      CTimer::get("XIOS send field").suspend() ;
182      CTimer::get("XIOS").suspend() ;
183   }
184   
185   void cxios_write_data_k43(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize, int data_Zsize)
186   {
187      std::string fieldid_str;
188 
189      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
190 
191      CTimer::get("XIOS").resume() ;
192      CTimer::get("XIOS send field").resume() ;
193      CContext* context = CContext::getCurrent() ;
194
195      CArray<float,3> data_tmp(data_k4,shape(data_Xsize,data_Ysize,data_Zsize),neverDeleteData) ;
196      CArray<double,3> data(data_Xsize,data_Ysize,data_Zsize) ;
197      data=data_tmp ;
198 
199      CField::get(fieldid_str)->setData(data) ;
200      CTimer::get("XIOS send field").suspend() ;
201      CTimer::get("XIOS").suspend() ;
202
203    } 
204
205} // extern "C"
Note: See TracBrowser for help on using the repository browser.