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

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

Add possibility to make inheritance of attributes and reference before closing the context definition.
New fortran fonction : xios_solve inheritance()
After this call, the value of attribute have the inherited value of their parent.

YM

  • Property svn:eol-style set to native
File size: 7.4 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   void cxios_solve_inheritance()
105   {
106     CTimer::get("XIOS").resume() ;
107     CContext* context = CContext::getCurrent() ;
108     context->solveAllInheritance(false) ;
109     CTimer::get("XIOS").suspend() ;
110   } 
111   
112   // ---------------------- Ecriture des données ------------------------------
113   
114   void cxios_write_data_k81(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize)
115   {
116      std::string fieldid_str;
117      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
118     
119      CTimer::get("XIOS").resume() ;
120      CTimer::get("XIOS send field").resume() ;
121      CContext* context = CContext::getCurrent() ;
122      if (!context->hasServer) context->client->checkBuffers() ;
123      CArray<double,(StdSize)1> data(data_k8,shape(data_Xsize),neverDeleteData) ;
124      CField::get(fieldid_str)->setData(data) ;
125      CField toto ;
126      toto.setData(data) ;
127      CTimer::get("XIOS send field").suspend() ;
128      CTimer::get("XIOS").suspend() ;
129   }
130   
131   void cxios_write_data_k82(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize)
132   {
133      std::string fieldid_str;
134      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
135     
136      CTimer::get("XIOS").resume() ;
137      CTimer::get("XIOS send field").resume() ;
138      CContext* context = CContext::getCurrent() ;
139      if (!context->hasServer) context->client->checkBuffers() ;
140     
141      CArray<double,2>data(data_k8,shape(data_Xsize,data_Ysize),neverDeleteData) ;
142      CField::get(fieldid_str)->setData(data) ;
143      CTimer::get("XIOS send field").suspend() ;
144      CTimer::get("XIOS").suspend() ;
145   }
146   
147   void cxios_write_data_k83(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize, int data_Zsize)
148   {
149      std::string fieldid_str;
150      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
151
152      CTimer::get("XIOS").resume() ;
153      CTimer::get("XIOS send field").resume() ;
154      CContext* context = CContext::getCurrent() ;
155      if (!context->hasServer) context->client->checkBuffers() ;
156
157      CArray<double,3>data(data_k8,shape(data_Xsize,data_Ysize,data_Zsize),neverDeleteData) ;
158      CField::get(fieldid_str)->setData(data) ;
159      CTimer::get("XIOS send field").suspend() ;
160      CTimer::get("XIOS").suspend() ;
161   }
162   
163   void cxios_write_data_k41(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize)
164   {
165      std::string fieldid_str;
166     if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
167
168      CTimer::get("XIOS").resume() ;
169      CTimer::get("XIOS send field").resume() ;
170      CContext* context = CContext::getCurrent() ;
171      if (!context->hasServer) context->client->checkBuffers() ;
172
173      CArray<float,1> data_tmp(data_k4,shape(data_Xsize),neverDeleteData) ;
174      CArray<double,1> data(data_Xsize) ;
175      data=data_tmp ;
176      CField::get(fieldid_str)->setData(data) ;
177      CTimer::get("XIOS send field").suspend() ;
178      CTimer::get("XIOS").suspend() ;
179   }
180   
181   void cxios_write_data_k42(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize)
182   {
183      std::string fieldid_str;
184      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
185
186      CTimer::get("XIOS").resume() ;
187      CTimer::get("XIOS send field").resume() ;
188      CContext* context = CContext::getCurrent() ;
189      if (!context->hasServer) context->client->checkBuffers() ;
190
191      CArray<float,2> data_tmp(data_k4,shape(data_Xsize,data_Ysize),neverDeleteData) ;
192      CArray<double,2> data(data_Xsize,data_Ysize) ;
193      data=data_tmp ;
194      CField::get(fieldid_str)->setData(data) ;
195      CTimer::get("XIOS send field").suspend() ;
196      CTimer::get("XIOS").suspend() ;
197   }
198   
199   void cxios_write_data_k43(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize, int data_Zsize)
200   {
201      std::string fieldid_str;
202 
203      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
204 
205      CTimer::get("XIOS").resume() ;
206      CTimer::get("XIOS send field").resume() ;
207      CContext* context = CContext::getCurrent() ;
208      if (!context->hasServer) context->client->checkBuffers() ;
209
210      CArray<float,3> data_tmp(data_k4,shape(data_Xsize,data_Ysize,data_Zsize),neverDeleteData) ;
211      CArray<double,3> data(data_Xsize,data_Ysize,data_Zsize) ;
212      data=data_tmp ;
213 
214      CField::get(fieldid_str)->setData(data) ;
215      CTimer::get("XIOS send field").suspend() ;
216      CTimer::get("XIOS").suspend() ;
217
218    } 
219
220} // extern "C"
Note: See TracBrowser for help on using the repository browser.