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

Last change on this file since 352 was 352, checked in by ymipsl, 12 years ago
  • Property svn:eol-style set to native
File size: 9.0 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
26extern "C"
27{
28// /////////////////////////////// Définitions ////////////////////////////// //
29
30   // ----------------------- Redéfinition de types ----------------------------
31   
32   typedef enum { NETCDF4 = 0 } XFileType;
33   
34   typedef xios::CContext * XContextPtr;
35
36   // -------------------- Traitement des données ------------------------------
37   void cxios_init_server(void)
38   {
39     CTimer::get("XIOS").resume() ;
40     CXios::initServerSide();     
41     CTimer::get("XIOS").suspend() ;
42   }
43
44   void cxios_init_client(const char * client_id , int len_client_id, MPI_Fint* f_local_comm, MPI_Fint* f_return_comm )
45   {
46      std::string str; 
47      MPI_Comm local_comm ;
48      MPI_Comm return_comm ;
49     
50      if (!cstr2string(client_id, len_client_id, str)) return;
51
52      CTimer::get("XIOS").resume() ;
53      CTimer::get("XIOS init").resume() ;
54      int initialized ;
55      MPI_Initialized(&initialized) ;
56      if (initialized) local_comm=MPI_Comm_f2c(*f_local_comm) ;
57      else local_comm=MPI_COMM_NULL ;
58      CXios::initClientSide(str,local_comm,return_comm);
59      *f_return_comm=MPI_Comm_c2f(return_comm) ;
60      CTimer::get("XIOS init").suspend() ;
61      CTimer::get("XIOS").suspend() ;
62   }
63
64   void cxios_context_initialize(const char * context_id , int len_context_id, MPI_Fint* f_comm)
65   {
66     std::string str; 
67     MPI_Comm comm ;
68     
69     if (!cstr2string(context_id, len_context_id, str)) return;
70     CTimer::get("XIOS").resume() ;
71     CTimer::get("XIOS init context").resume() ;
72     comm=MPI_Comm_f2c(*f_comm) ;
73     CClient::registerContext(str,comm) ;
74     CTimer::get("XIOS init context").suspend() ;
75     CTimer::get("XIOS").suspend() ;
76   }
77 
78    void cxios_context_close_definition()
79   {
80     CTimer::get("XIOS").resume() ;
81     CTimer::get("XIOS close definition").resume() ;
82     CContext* context = CContext::getCurrent() ;
83     context->closeDefinition() ;
84     CTimer::get("XIOS close definition").suspend() ;
85     CTimer::get("XIOS").suspend() ;
86   } 
87
88   void cxios_context_finalize()
89   {
90     CTimer::get("XIOS").resume() ;
91     CTimer::get("XIOS context finalize").resume() ;
92     CContext* context = CContext::getCurrent() ;
93     context->finalize() ;
94     CTimer::get("XIOS context finalize").suspend() ;
95     CTimer::get("XIOS").suspend() ;
96   }
97   
98   void cxios_finalize()
99   {
100     CTimer::get("XIOS").resume() ;
101     CTimer::get("XIOS finalize").resume() ;
102     CXios::clientFinalize() ;
103     CTimer::get("XIOS finalize").suspend() ;
104     CTimer::get("XIOS").suspend() ;
105   }
106
107 
108   
109   // ---------------------- Ecriture des données ------------------------------
110   
111   void cxios_write_data_k81(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize)
112   {
113      std::string fieldid_str;
114      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
115     
116      CTimer::get("XIOS").resume() ;
117      CTimer::get("XIOS send field").resume() ;
118      CContext* context = CContext::getCurrent() ;
119//      boost::const_multi_array_ref<double, 1> array_(data_k8,
120//          boost::extents [data_Xsize],
121//          boost::fortran_storage_order());
122      ARRAY(double, 1) data(new CArray<double, 1>(boost::extents [data_Xsize]));
123      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
124     
125//      dtreat->write_data(fieldid_str, data);
126      CField::get(fieldid_str)->setData(data) ;
127      CTimer::get("XIOS send field").suspend() ;
128      CTimer::get("XIOS").suspend() ;
129   }
130   
131   void cxios_write_data_k82(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize)
132   {
133      std::string fieldid_str;
134      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
135     
136      CTimer::get("XIOS").resume() ;
137      CTimer::get("XIOS send field").resume() ;
138      CContext* context = CContext::getCurrent() ;
139     
140//      boost::const_multi_array_ref<double, 2> array_(data_k8,
141//          boost::extents [data_Xsize][data_Ysize],
142//          boost::fortran_storage_order());
143      ARRAY(double, 2) data(new CArray<double, 2>(boost::extents [data_Xsize][data_Ysize]));
144      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
145//      dtreat->write_data(fieldid_str, data);
146      CField::get(fieldid_str)->setData(data) ;
147      CTimer::get("XIOS send field").suspend() ;
148      CTimer::get("XIOS").suspend() ;
149   }
150   
151   void cxios_write_data_k83(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize, int data_Zsize)
152   {
153      std::string fieldid_str;
154      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
155
156      CTimer::get("XIOS").resume() ;
157      CTimer::get("XIOS send field").resume() ;
158      CContext* context = CContext::getCurrent() ;
159//      boost::const_multi_array_ref<double, 3> array_(data_k8,
160//          boost::extents [data_Xsize][data_Ysize][data_Zsize],
161//          boost::fortran_storage_order());
162      ARRAY(double, 3) data(new CArray<double, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize]));
163      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
164//      dtreat->write_data(fieldid_str, data);
165      CField::get(fieldid_str)->setData(data) ;
166      CTimer::get("XIOS send field").suspend() ;
167      CTimer::get("XIOS").suspend() ;
168   }
169   
170   void cxios_write_data_k41(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize)
171   {
172      std::string fieldid_str;
173     if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
174
175      CTimer::get("XIOS").resume() ;
176      CTimer::get("XIOS send field").resume() ;
177      CContext* context = CContext::getCurrent() ;
178//      boost::const_multi_array_ref<float, 1> array_(data_k4,
179//          boost::extents [data_Xsize],
180//          boost::fortran_storage_order());
181//      ARRAY(float, 1) data(new CArray<float, 1>(boost::extents [data_Xsize]));
182//      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
183//      dtreat->write_data(fieldid_str, data);
184      ARRAY(double, 1) data(new CArray<double, 1>(boost::extents [data_Xsize]));
185      double* ptr_data=data->data() ; 
186      for(int i=0;i<data->num_elements();i++) ptr_data[i]=data_k4[i];
187      CField::get(fieldid_str)->setData(data) ;
188      CTimer::get("XIOS send field").suspend() ;
189      CTimer::get("XIOS").suspend() ;
190   }
191   
192   void cxios_write_data_k42(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize)
193   {
194      std::string fieldid_str;
195      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
196
197      CTimer::get("XIOS").resume() ;
198      CTimer::get("XIOS send field").resume() ;
199      CContext* context = CContext::getCurrent() ;
200//      boost::const_multi_array_ref<float, 2> array_(data_k4,
201//          boost::extents [data_Xsize][data_Ysize],
202//          boost::fortran_storage_order());
203//      ARRAY(float, 2) data(new CArray<float, 2>(boost::extents [data_Xsize][data_Ysize]));
204//      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
205//      dtreat->write_data(fieldid_str, data);
206      ARRAY(double, 2) data(new CArray<double, 2>(boost::extents [data_Xsize][data_Ysize]));
207      double* ptr_data=data->data() ; 
208      for(int i=0;i<data->num_elements();i++) ptr_data[i]=data_k4[i];
209      CField::get(fieldid_str)->setData(data) ;
210      CTimer::get("XIOS send field").suspend() ;
211      CTimer::get("XIOS").suspend() ;
212   }
213   
214   void cxios_write_data_k43(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize, int data_Zsize)
215   {
216      std::string fieldid_str;
217 
218      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
219 
220      CTimer::get("XIOS").resume() ;
221      CTimer::get("XIOS send field").resume() ;
222      CContext* context = CContext::getCurrent() ;
223     
224//      boost::const_multi_array_ref<float, 3> array_(data_k4,
225//          boost::extents [data_Xsize][data_Ysize][data_Zsize],
226//          boost::fortran_storage_order());
227//      ARRAY(float, 3) data(new CArray<float, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize]));
228//      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
229//      dtreat->write_data(fieldid_str, data);
230      ARRAY(double, 3) data(new CArray<double, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize]));
231      double* ptr_data=data->data() ; 
232      for(int i=0;i<data->num_elements();i++) ptr_data[i]=data_k4[i];
233      CField::get(fieldid_str)->setData(data) ;
234      CTimer::get("XIOS send field").suspend() ;
235      CTimer::get("XIOS").suspend() ;
236
237    } 
238
239} // extern "C"
Note: See TracBrowser for help on using the repository browser.