source: XMLIO_V2/dev/common/src/fortran/icdata.cpp @ 300

Last change on this file since 300 was 300, checked in by ymipsl, 12 years ago

nouvelle version de developpement de xios

  • nouvelle interface fortran
  • recodage complet de la couche de communication
  • et bien d'autres choses...

YM

File size: 11.7 KB
Line 
1/* ************************************************************************** *
2 *      Copyright © IPSL/LSCE, XMLIOServer, 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_impl.hpp"
15#include "object_template_impl.hpp"
16#include "group_template_impl.hpp"
17
18#include "icutil.hpp"
19#include "mpi_manager.hpp"
20#include "buffer.hpp"
21#include "cxios.hpp"
22#include "client_ym.hpp"
23#include "field.hpp"
24
25extern "C"
26{
27// /////////////////////////////// Définitions ////////////////////////////// //
28
29   // ----------------------- Redéfinition de types ----------------------------
30   
31   typedef enum { NETCDF4 = 0 } XFileType;
32   
33   typedef xmlioserver::tree::CContext * XContextPtr;
34
35   // -------------------- Traitement des données ------------------------------
36   void cxios_init_server(void)
37   {
38     CXios::initServerSide();     
39   }
40
41   void cxios_init_client(const char * client_id , int len_client_id, MPI_Fint* f_local_comm, MPI_Fint* f_return_comm )
42   {
43      std::string str; 
44      MPI_Comm local_comm ;
45      MPI_Comm return_comm ;
46     
47      if (!cstr2string(client_id, len_client_id, str)) return;
48     
49      int initialized ;
50      MPI_Initialized(&initialized) ;
51      if (initialized) local_comm=MPI_Comm_f2c(*f_local_comm) ;
52      else local_comm=MPI_COMM_NULL ;
53      CXios::initClientSide(str,local_comm,return_comm);
54      *f_return_comm=MPI_Comm_c2f(return_comm) ;
55   }
56
57   void cxios_context_initialize(const char * context_id , int len_context_id, MPI_Fint* f_comm)
58   {
59     std::string str; 
60     MPI_Comm comm ;
61     
62     if (!cstr2string(context_id, len_context_id, str)) return;
63     comm=MPI_Comm_f2c(*f_comm) ;
64     ym::CClient::registerContext(context_id,comm) ;
65   }
66 
67    void cxios_context_close_definition()
68   {
69     boost::shared_ptr<CContext> context =
70            CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
71     context->closeDefinition() ;
72   } 
73
74   void cxios_context_finalize()
75   {
76     boost::shared_ptr<CContext> context =
77            CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
78     context->finalize() ;
79   }
80   
81   void cxios_finalize()
82   {
83     CXios::clientFinalize() ;
84   }
85
86   
87   void cxios_dtreatment_start()
88   {
89      using namespace xmlioserver::tree;
90      using namespace xmlioserver;
91      try
92      {
93        MPI_Comm comm_client_server=comm::CMPIManager::GetCommClientServer() ;
94        MPI_Comm comm_server=comm::CMPIManager::GetCommServer() ;
95       
96         boost::shared_ptr<CContext> context =
97            CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
98               
99         StdOStringStream oss;
100         oss << StdString("def_client_next.")
101             << CMPIManager::GetCommRank(CMPIManager::GetCommClient());
102         CTreeManager::PrintTreeToFile(oss.str());
103         oss.str("");
104         boost::shared_ptr<CDataTreatment> dt(new CDataTreatment (context));
105         context->setDataTreatment(dt);
106
107         oss << StdString("def_client_end.")
108             << CMPIManager::GetCommRank(CMPIManager::GetCommClient());
109         CTreeManager::PrintTreeToFile(oss.str());
110
111         if ( !comm::CMPIManager::IsConnected() )
112         {
113            MPI_Request request = 0;
114            StdOStringStream ostrs;
115
116            CTreeManager::ToBinary(ostrs);
117            CLinearBuffer lbuffer(ostrs.str().size()+CBuffer::getDataHeaderSize());
118            lbuffer.appendString(ostrs.str());
119            CMPIManager::SendLinearBuffer(comm_client_server, 0, lbuffer, request);
120            CMPIManager::Wait(request);  // Pas encore en mode RPC
121               
122               
123            CXIOSManager::RunClient(false, CMPIManager::GetCommClient());
124            CClient::CreateClient(CMPIManager::GetCommClientServer());
125         }
126         else
127         {
128            dt->createDataOutput<CNc4DataOutput>(CMPIManager::GetCommClient());
129         }
130      }
131      catch (CException & exc)
132      {
133         std::cerr << exc.getMessage() << std::endl;
134         exit (EXIT_FAILURE);
135      }
136   }
137   
138   void cxios_dtreatment_end(void)
139   {
140      try
141      {
142         boost::shared_ptr<xmlioserver::tree::CContext> context =
143         xmlioserver::CObjectFactory::GetObject<xmlioserver::tree::CContext>
144            (CObjectFactory::GetCurrentContextId());
145         boost::shared_ptr<xmlioserver::data::CDataTreatment> dtreat = context->getDataTreatment();
146         dtreat->finalize();
147         
148//         CMPIManager::Finalize();
149      }
150      catch (CException & exc)
151      {
152         std::cerr << exc.getMessage() << std::endl;
153         exit (EXIT_FAILURE);
154      }
155   }
156
157   // ---------------------- Finalize du serveur -------------------------
158
159   void cxios_finalize_ioserver(void)
160   {
161      try
162      {
163         CMPIManager::Finalize();
164      }
165      catch (CException & exc)
166      {
167         std::cerr << exc.getMessage() << std::endl;
168         exit (EXIT_FAILURE);
169      }
170    }
171
172   // ---------------------- Initialisation du serveur -------------------------
173
174   void cxios_init_ioserver(MPIComm * f_comm_client, MPIComm * f_comm_parent)
175   {
176      try
177      {
178         MPI_Comm comm_client_server, comm_server,comm_client,comm_parent;
179         xmlioserver::CTreeManager::ParseFile("iodef.xml");
180         CTreeManager::SetCurrentContextId(StdString("xios"));
181         CMPIManager::InitialiseClient(NULL, NULL);
182         comm_parent=MPI_Comm_f2c(*f_comm_parent) ;
183         CMPIManager::DispatchClient(false, comm_client, comm_client_server, comm_server,comm_parent);
184         *f_comm_client=MPI_Comm_c2f(comm_client) ;
185      }
186      catch (CException & exc)
187      {
188         std::cerr << exc.getMessage() << std::endl;
189         exit (EXIT_FAILURE);
190      }
191   }
192   
193   // ---------------------- Ecriture des données ------------------------------
194   
195   void cxios_write_data_k81(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize)
196   {
197      std::string fieldid_str;
198      boost::shared_ptr<CContext> context =
199      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
200      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
201      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
202     
203//      boost::const_multi_array_ref<double, 1> array_(data_k8,
204//          boost::extents [data_Xsize],
205//          boost::fortran_storage_order());
206      ARRAY(double, 1) data(new CArray<double, 1>(boost::extents [data_Xsize]));
207      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
208     
209//      dtreat->write_data(fieldid_str, data);
210      CField::get(fieldid)->setData(data) ;
211   }
212   
213   void cxios_write_data_k82(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize)
214   {
215      std::string fieldid_str;
216      boost::shared_ptr<CContext> context =
217      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
218      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
219      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
220     
221//      boost::const_multi_array_ref<double, 2> array_(data_k8,
222//          boost::extents [data_Xsize][data_Ysize],
223//          boost::fortran_storage_order());
224      ARRAY(double, 2) data(new CArray<double, 2>(boost::extents [data_Xsize][data_Ysize]));
225      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
226//      dtreat->write_data(fieldid_str, data);
227      CField::get(fieldid)->setData(data) ;
228   }
229   
230   void cxios_write_data_k83(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize, int data_Zsize)
231   {
232      std::string fieldid_str;
233      boost::shared_ptr<CContext> context =
234      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
235      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
236      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
237     
238//      boost::const_multi_array_ref<double, 3> array_(data_k8,
239//          boost::extents [data_Xsize][data_Ysize][data_Zsize],
240//          boost::fortran_storage_order());
241      ARRAY(double, 3) data(new CArray<double, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize]));
242      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
243//      dtreat->write_data(fieldid_str, data);
244      CField::get(fieldid)->setData(data) ;
245
246   }
247   
248   void cxios_write_data_k41(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize)
249   {
250      std::string fieldid_str;
251      boost::shared_ptr<CContext> context =
252      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
253      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
254      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
255     
256//      boost::const_multi_array_ref<float, 1> array_(data_k4,
257//          boost::extents [data_Xsize],
258//          boost::fortran_storage_order());
259//      ARRAY(float, 1) data(new CArray<float, 1>(boost::extents [data_Xsize]));
260//      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
261//      dtreat->write_data(fieldid_str, data);
262      ARRAY(double, 1) data(new CArray<double, 1>(boost::extents [data_Xsize]));
263      double* ptr_data=data->data() ; 
264      for(int i=0;i<data->num_elements();i++) ptr_data[i]=data_k4[i];
265      CField::get(fieldid)->setData(data) ;
266   }
267   
268   void cxios_write_data_k42(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize)
269   {
270      std::string fieldid_str;
271      boost::shared_ptr<CContext> context =
272      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
273      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
274      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
275     
276//      boost::const_multi_array_ref<float, 2> array_(data_k4,
277//          boost::extents [data_Xsize][data_Ysize],
278//          boost::fortran_storage_order());
279//      ARRAY(float, 2) data(new CArray<float, 2>(boost::extents [data_Xsize][data_Ysize]));
280//      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
281//      dtreat->write_data(fieldid_str, data);
282      ARRAY(double, 2) data(new CArray<double, 2>(boost::extents [data_Xsize][data_Ysize]));
283      double* ptr_data=data->data() ; 
284      for(int i=0;i<data->num_elements();i++) ptr_data[i]=data_k4[i];
285      CField::get(fieldid)->setData(data) ;
286   }
287   
288   void cxios_write_data_k43(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize, int data_Zsize)
289   {
290      std::string fieldid_str;
291      boost::shared_ptr<CContext> context =
292      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
293      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
294      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
295     
296//      boost::const_multi_array_ref<float, 3> array_(data_k4,
297//          boost::extents [data_Xsize][data_Ysize][data_Zsize],
298//          boost::fortran_storage_order());
299//      ARRAY(float, 3) data(new CArray<float, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize]));
300//      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
301//      dtreat->write_data(fieldid_str, data);
302      ARRAY(double, 3) data(new CArray<double, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize]));
303      double* ptr_data=data->data() ; 
304      for(int i=0;i<data->num_elements();i++) ptr_data[i]=data_k4[i];
305      CField::get(fieldid)->setData(data) ;
306    } 
307
308} // extern "C"
Note: See TracBrowser for help on using the repository browser.