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

Last change on this file since 464 was 461, checked in by ymipsl, 10 years ago

New function available form fortran interface : LOGICAL xios_context_is_initialized("context_id")
Return .true. if the context "context_id" has been initialized before.

YM

  • Property svn:eol-style set to native
File size: 7.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 "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_is_initialized(const char * context_id , int len_context_id, bool* initialized)
78   {
79     std::string str; 
80     
81     if (!cstr2string(context_id, len_context_id, str)) return;
82     CTimer::get("XIOS").resume() ;
83     CContext* context = CContext::get(str,str) ;
84     *initialized=context->isInitialized() ;
85     CTimer::get("XIOS").suspend() ;
86   } 
87   
88    void cxios_context_close_definition()
89   {
90     CTimer::get("XIOS").resume() ;
91     CTimer::get("XIOS close definition").resume() ;
92     CContext* context = CContext::getCurrent() ;
93     context->closeDefinition() ;
94     CTimer::get("XIOS close definition").suspend() ;
95     CTimer::get("XIOS").suspend() ;
96   } 
97
98   void cxios_context_finalize()
99   {
100     CTimer::get("XIOS").resume() ;
101     CTimer::get("XIOS context finalize").resume() ;
102     CContext* context = CContext::getCurrent() ;
103     context->finalize() ;
104     CTimer::get("XIOS context finalize").suspend() ;
105     CTimer::get("XIOS").suspend() ;
106   }
107   
108   void cxios_finalize()
109   {
110     CTimer::get("XIOS").resume() ;
111     CTimer::get("XIOS finalize").resume() ;
112     CXios::clientFinalize() ;
113   }
114
115   void cxios_solve_inheritance()
116   {
117     CTimer::get("XIOS").resume() ;
118     CContext* context = CContext::getCurrent() ;
119     context->solveAllInheritance(false) ;
120     CTimer::get("XIOS").suspend() ;
121   } 
122   
123   // ---------------------- Ecriture des données ------------------------------
124   
125   void cxios_write_data_k81(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize)
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      CArray<double,(StdSize)1> data(data_k8,shape(data_Xsize),neverDeleteData) ;
135      CField::get(fieldid_str)->setData(data) ;
136      CField toto ;
137      toto.setData(data) ;
138      CTimer::get("XIOS send field").suspend() ;
139      CTimer::get("XIOS").suspend() ;
140   }
141   
142   void cxios_write_data_k82(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize)
143   {
144      std::string fieldid_str;
145      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
146     
147      CTimer::get("XIOS").resume() ;
148      CTimer::get("XIOS send field").resume() ;
149      CContext* context = CContext::getCurrent() ;
150      if (!context->hasServer) context->client->checkBuffers() ;
151     
152      CArray<double,2>data(data_k8,shape(data_Xsize,data_Ysize),neverDeleteData) ;
153      CField::get(fieldid_str)->setData(data) ;
154      CTimer::get("XIOS send field").suspend() ;
155      CTimer::get("XIOS").suspend() ;
156   }
157   
158   void cxios_write_data_k83(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize, int data_Zsize)
159   {
160      std::string fieldid_str;
161      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
162
163      CTimer::get("XIOS").resume() ;
164      CTimer::get("XIOS send field").resume() ;
165      CContext* context = CContext::getCurrent() ;
166      if (!context->hasServer) context->client->checkBuffers() ;
167
168      CArray<double,3>data(data_k8,shape(data_Xsize,data_Ysize,data_Zsize),neverDeleteData) ;
169      CField::get(fieldid_str)->setData(data) ;
170      CTimer::get("XIOS send field").suspend() ;
171      CTimer::get("XIOS").suspend() ;
172   }
173   
174   void cxios_write_data_k41(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize)
175   {
176      std::string fieldid_str;
177     if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
178
179      CTimer::get("XIOS").resume() ;
180      CTimer::get("XIOS send field").resume() ;
181      CContext* context = CContext::getCurrent() ;
182      if (!context->hasServer) context->client->checkBuffers() ;
183
184      CArray<float,1> data_tmp(data_k4,shape(data_Xsize),neverDeleteData) ;
185      CArray<double,1> data(data_Xsize) ;
186      data=data_tmp ;
187      CField::get(fieldid_str)->setData(data) ;
188      CTimer::get("XIOS send field").suspend() ;
189      CTimer::get("XIOS").suspend() ;
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; 
196
197      CTimer::get("XIOS").resume() ;
198      CTimer::get("XIOS send field").resume() ;
199      CContext* context = CContext::getCurrent() ;
200      if (!context->hasServer) context->client->checkBuffers() ;
201
202      CArray<float,2> data_tmp(data_k4,shape(data_Xsize,data_Ysize),neverDeleteData) ;
203      CArray<double,2> data(data_Xsize,data_Ysize) ;
204      data=data_tmp ;
205      CField::get(fieldid_str)->setData(data) ;
206      CTimer::get("XIOS send field").suspend() ;
207      CTimer::get("XIOS").suspend() ;
208   }
209   
210   void cxios_write_data_k43(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize, int data_Zsize)
211   {
212      std::string fieldid_str;
213 
214      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
215 
216      CTimer::get("XIOS").resume() ;
217      CTimer::get("XIOS send field").resume() ;
218      CContext* context = CContext::getCurrent() ;
219      if (!context->hasServer) context->client->checkBuffers() ;
220
221      CArray<float,3> data_tmp(data_k4,shape(data_Xsize,data_Ysize,data_Zsize),neverDeleteData) ;
222      CArray<double,3> data(data_Xsize,data_Ysize,data_Zsize) ;
223      data=data_tmp ;
224 
225      CField::get(fieldid_str)->setData(data) ;
226      CTimer::get("XIOS send field").suspend() ;
227      CTimer::get("XIOS").suspend() ;
228
229    } 
230
231} // extern "C"
Note: See TracBrowser for help on using the repository browser.