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
RevLine 
[325]1/* ************************************************************************** *
[335]2 *      Copyright © IPSL/LSCE, xios, Avril 2010 - Octobre 2011         *
[325]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
[352]14#include "attribute_template.hpp"
15#include "object_template.hpp"
16#include "group_template.hpp"
[325]17
18#include "icutil.hpp"
19#include "cxios.hpp"
[342]20#include "client.hpp"
[325]21#include "field.hpp"
[352]22#include "context.hpp"
[325]23#include <mpi.h>
[347]24#include "timer.hpp"
[325]25
26extern "C"
27{
28// /////////////////////////////// Définitions ////////////////////////////// //
29
30   // ----------------------- Redéfinition de types ----------------------------
31   
32   typedef enum { NETCDF4 = 0 } XFileType;
33   
[345]34   typedef xios::CContext * XContextPtr;
[325]35
36   // -------------------- Traitement des données ------------------------------
37   void cxios_init_server(void)
38   {
[347]39     CTimer::get("XIOS").resume() ;
[325]40     CXios::initServerSide();     
[347]41     CTimer::get("XIOS").suspend() ;
[325]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;
[347]51
52      CTimer::get("XIOS").resume() ;
53      CTimer::get("XIOS init").resume() ;
[325]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) ;
[347]60      CTimer::get("XIOS init").suspend() ;
61      CTimer::get("XIOS").suspend() ;
[325]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;
[347]70     CTimer::get("XIOS").resume() ;
71     CTimer::get("XIOS init context").resume() ;
[325]72     comm=MPI_Comm_f2c(*f_comm) ;
[342]73     CClient::registerContext(str,comm) ;
[347]74     CTimer::get("XIOS init context").suspend() ;
75     CTimer::get("XIOS").suspend() ;
[325]76   }
77 
78    void cxios_context_close_definition()
79   {
[347]80     CTimer::get("XIOS").resume() ;
81     CTimer::get("XIOS close definition").resume() ;
82     CContext* context = CContext::getCurrent() ;
[325]83     context->closeDefinition() ;
[347]84     CTimer::get("XIOS close definition").suspend() ;
85     CTimer::get("XIOS").suspend() ;
[325]86   } 
87
88   void cxios_context_finalize()
89   {
[347]90     CTimer::get("XIOS").resume() ;
91     CTimer::get("XIOS context finalize").resume() ;
92     CContext* context = CContext::getCurrent() ;
[325]93     context->finalize() ;
[347]94     CTimer::get("XIOS context finalize").suspend() ;
95     CTimer::get("XIOS").suspend() ;
[325]96   }
97   
98   void cxios_finalize()
99   {
[347]100     CTimer::get("XIOS").resume() ;
101     CTimer::get("XIOS finalize").resume() ;
[325]102     CXios::clientFinalize() ;
[347]103     CTimer::get("XIOS finalize").suspend() ;
104     CTimer::get("XIOS").suspend() ;
[325]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     
[347]116      CTimer::get("XIOS").resume() ;
117      CTimer::get("XIOS send field").resume() ;
118      CContext* context = CContext::getCurrent() ;
[325]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) ;
[347]127      CTimer::get("XIOS send field").suspend() ;
128      CTimer::get("XIOS").suspend() ;
[325]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     
[347]136      CTimer::get("XIOS").resume() ;
137      CTimer::get("XIOS send field").resume() ;
138      CContext* context = CContext::getCurrent() ;
139     
[325]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) ;
[347]147      CTimer::get("XIOS send field").suspend() ;
148      CTimer::get("XIOS").suspend() ;
[325]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; 
[347]155
156      CTimer::get("XIOS").resume() ;
157      CTimer::get("XIOS send field").resume() ;
158      CContext* context = CContext::getCurrent() ;
[325]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) ;
[347]166      CTimer::get("XIOS send field").suspend() ;
167      CTimer::get("XIOS").suspend() ;
[325]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;
[347]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() ;
[325]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) ;
[347]188      CTimer::get("XIOS send field").suspend() ;
189      CTimer::get("XIOS").suspend() ;
[325]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; 
[347]196
197      CTimer::get("XIOS").resume() ;
198      CTimer::get("XIOS send field").resume() ;
199      CContext* context = CContext::getCurrent() ;
[325]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) ;
[347]210      CTimer::get("XIOS send field").suspend() ;
211      CTimer::get("XIOS").suspend() ;
[325]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;
[347]217 
[325]218      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
[347]219 
220      CTimer::get("XIOS").resume() ;
221      CTimer::get("XIOS send field").resume() ;
222      CContext* context = CContext::getCurrent() ;
223     
[325]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) ;
[347]234      CTimer::get("XIOS send field").suspend() ;
235      CTimer::get("XIOS").suspend() ;
236
[325]237    } 
238
239} // extern "C"
Note: See TracBrowser for help on using the repository browser.