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

Last change on this file since 359 was 359, 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   }
57
58   void cxios_context_initialize(const char * context_id , int len_context_id, MPI_Fint* f_comm)
59   {
60     std::string str; 
61     MPI_Comm comm ;
62     
63     if (!cstr2string(context_id, len_context_id, str)) return;
64     CTimer::get("XIOS").resume() ;
65     CTimer::get("XIOS init context").resume() ;
66     comm=MPI_Comm_f2c(*f_comm) ;
67     CClient::registerContext(str,comm) ;
68     CTimer::get("XIOS init context").suspend() ;
69     CTimer::get("XIOS").suspend() ;
70   }
71 
72    void cxios_context_close_definition()
73   {
74     CTimer::get("XIOS").resume() ;
75     CTimer::get("XIOS close definition").resume() ;
76     CContext* context = CContext::getCurrent() ;
77     context->closeDefinition() ;
78     CTimer::get("XIOS close definition").suspend() ;
79     CTimer::get("XIOS").suspend() ;
80   } 
81
82   void cxios_context_finalize()
83   {
84     CTimer::get("XIOS").resume() ;
85     CTimer::get("XIOS context finalize").resume() ;
86     CContext* context = CContext::getCurrent() ;
87     context->finalize() ;
88     CTimer::get("XIOS context finalize").suspend() ;
89     CTimer::get("XIOS").suspend() ;
90   }
91   
92   void cxios_finalize()
93   {
94     CTimer::get("XIOS").resume() ;
95     CTimer::get("XIOS finalize").resume() ;
96     CXios::clientFinalize() ;
97     CTimer::get("XIOS finalize").suspend() ;
98     CTimer::get("XIOS").suspend() ;
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.