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

Last change on this file since 403 was 403, checked in by ymipsl, 11 years ago

Give the hand at each time step to the mpi library for better asynchronism

YM

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