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

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

Bug correction : using MPI_WTIME MPI function for tracing before MPI_Init is called.

YM

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