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

Last change on this file since 403 was 403, checked in by ymipsl, 9 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.