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

Last change on this file since 286 was 286, checked in by ymipsl, 13 years ago

reprise en main de la version de H. Ozdoba. Correction de différentes erreurs de conception et bug.
Version NEMO operationnel en client/server, interoperabilita avec OASIS, reconstition de fichiers via netcdf4/HDF5

YM

File size: 10.3 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
22extern "C"
23{
24// /////////////////////////////// Définitions ////////////////////////////// //
25
26   // ----------------------- Redéfinition de types ----------------------------
27   
28   typedef enum { NETCDF4 = 0 } XFileType;
29   
30   typedef xmlioserver::tree::CContext * XContextPtr;
31
32   // -------------------- Traitement des données ------------------------------
33   
34   void cxios_dtreatment_start()
35   {
36      using namespace xmlioserver::tree;
37      using namespace xmlioserver;
38      try
39      {
40        MPI_Comm comm_client_server=comm::CMPIManager::GetCommClientServer() ;
41        MPI_Comm comm_server=comm::CMPIManager::GetCommServer() ;
42       
43         boost::shared_ptr<CContext> context =
44            CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
45               
46         StdOStringStream oss;
47         oss << StdString("def_client_next.")
48             << CMPIManager::GetCommRank(CMPIManager::GetCommClient());
49         CTreeManager::PrintTreeToFile(oss.str());
50         oss.str("");
51         boost::shared_ptr<CDataTreatment> dt(new CDataTreatment (context));
52         context->setDataTreatment(dt);
53
54         oss << StdString("def_client_end.")
55             << CMPIManager::GetCommRank(CMPIManager::GetCommClient());
56         CTreeManager::PrintTreeToFile(oss.str());
57
58         if ( !comm::CMPIManager::IsConnected() )
59         {
60            MPI_Request request = 0;
61            StdOStringStream ostrs;
62/*
63            if (CMPIManager::GetCommRank(comm_client_server) == 1)
64            {
65               CTreeManager::ToBinary(ostrs);
66               CLinearBuffer lbuffer(ostrs.str().size()+CBuffer::getDataHeaderSize());
67               std::cout<<"lbuffer size "<<ostrs.str().size()<<std::endl ;
68               lbuffer.appendString(ostrs.str());
69               CMPIManager::SendLinearBuffer(comm_client_server, 0, lbuffer, request);
70               CMPIManager::Wait(request);  // Pas encore en mode RPC
71            }
72            else
73            {
74               CTreeManager::DomainsToBinary(ostrs);
75               CLinearBuffer lbuffer(ostrs.str().size()+CBuffer::getDataHeaderSize());
76               std::cout<<"lbuffer size "<<ostrs.str().size()<<std::endl ;
77               lbuffer.appendString(ostrs.str());
78               CMPIManager::SendLinearBuffer(comm_client_server, 0, lbuffer, request);
79               CMPIManager::Wait(request);  // Pas encore en mode RPC
80            }
81*/
82            CTreeManager::ToBinary(ostrs);
83            CLinearBuffer lbuffer(ostrs.str().size()+CBuffer::getDataHeaderSize());
84            lbuffer.appendString(ostrs.str());
85            CMPIManager::SendLinearBuffer(comm_client_server, 0, lbuffer, request);
86            CMPIManager::Wait(request);  // Pas encore en mode RPC
87               
88               
89            CXIOSManager::RunClient(false, CMPIManager::GetCommClient());
90            CClient::CreateClient(CMPIManager::GetCommClientServer());
91         }
92         else
93         {
94            dt->createDataOutput<CNc4DataOutput>(CMPIManager::GetCommClient());
95         }
96      }
97      catch (CException & exc)
98      {
99         std::cerr << exc.getMessage() << std::endl;
100         exit (EXIT_FAILURE);
101      }
102   }
103   
104   void cxios_dtreatment_end(void)
105   {
106      try
107      {
108         boost::shared_ptr<xmlioserver::tree::CContext> context =
109         xmlioserver::CObjectFactory::GetObject<xmlioserver::tree::CContext>
110            (CObjectFactory::GetCurrentContextId());
111         boost::shared_ptr<xmlioserver::data::CDataTreatment> dtreat = context->getDataTreatment();
112         dtreat->finalize();
113         
114//         CMPIManager::Finalize();
115      }
116      catch (CException & exc)
117      {
118         std::cerr << exc.getMessage() << std::endl;
119         exit (EXIT_FAILURE);
120      }
121   }
122
123   // ---------------------- Finalize du serveur -------------------------
124
125   void cxios_finalize_ioserver(void)
126   {
127      try
128      {
129         CMPIManager::Finalize();
130      }
131      catch (CException & exc)
132      {
133         std::cerr << exc.getMessage() << std::endl;
134         exit (EXIT_FAILURE);
135      }
136    }
137
138   // ---------------------- Initialisation du serveur -------------------------
139
140   void cxios_init_ioserver(MPIComm * f_comm_client, MPIComm * f_comm_parent)
141   {
142      try
143      {
144         MPI_Comm comm_client_server, comm_server,comm_client,comm_parent;
145         xmlioserver::CTreeManager::ParseFile("iodef.xml");
146         CTreeManager::SetCurrentContextId(StdString("xios"));
147         CMPIManager::InitialiseClient(NULL, NULL);
148         comm_parent=MPI_Comm_f2c(*f_comm_parent) ;
149         CMPIManager::DispatchClient(false, comm_client, comm_client_server, comm_server,comm_parent);
150         *f_comm_client=MPI_Comm_c2f(comm_client) ;
151      }
152      catch (CException & exc)
153      {
154         std::cerr << exc.getMessage() << std::endl;
155         exit (EXIT_FAILURE);
156      }
157   }
158   
159   // ---------------------- Ecriture des données ------------------------------
160   
161   void cxios_write_data_k81(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize)
162   {
163      std::string fieldid_str;
164      boost::shared_ptr<CContext> context =
165      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
166      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
167      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
168     
169//      boost::const_multi_array_ref<double, 1> array_(data_k8,
170//          boost::extents [data_Xsize],
171//          boost::fortran_storage_order());
172      ARRAY(double, 1) data(new CArray<double, 1>(boost::extents [data_Xsize]));
173      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
174      dtreat->write_data(fieldid_str, data);
175   }
176   
177   void cxios_write_data_k82(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize)
178   {
179      std::string fieldid_str;
180      boost::shared_ptr<CContext> context =
181      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
182      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
183      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
184     
185//      boost::const_multi_array_ref<double, 2> array_(data_k8,
186//          boost::extents [data_Xsize][data_Ysize],
187//          boost::fortran_storage_order());
188      ARRAY(double, 2) data(new CArray<double, 2>(boost::extents [data_Xsize][data_Ysize]));
189      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
190      dtreat->write_data(fieldid_str, data);
191   }
192   
193   void cxios_write_data_k83(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize, int data_Zsize)
194   {
195      std::string fieldid_str;
196      boost::shared_ptr<CContext> context =
197      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
198      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
199      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
200     
201//      boost::const_multi_array_ref<double, 3> array_(data_k8,
202//          boost::extents [data_Xsize][data_Ysize][data_Zsize],
203//          boost::fortran_storage_order());
204      ARRAY(double, 3) data(new CArray<double, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize]));
205      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
206      dtreat->write_data(fieldid_str, data);
207   }
208   
209   void cxios_write_data_k41(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize)
210   {
211      std::string fieldid_str;
212      boost::shared_ptr<CContext> context =
213      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
214      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
215      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
216     
217//      boost::const_multi_array_ref<float, 1> array_(data_k4,
218//          boost::extents [data_Xsize],
219//          boost::fortran_storage_order());
220      ARRAY(float, 1) data(new CArray<float, 1>(boost::extents [data_Xsize]));
221      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
222      dtreat->write_data(fieldid_str, data);
223   }
224   
225   void cxios_write_data_k42(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize)
226   {
227      std::string fieldid_str;
228      boost::shared_ptr<CContext> context =
229      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
230      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
231      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
232     
233//      boost::const_multi_array_ref<float, 2> array_(data_k4,
234//          boost::extents [data_Xsize][data_Ysize],
235//          boost::fortran_storage_order());
236      ARRAY(float, 2) data(new CArray<float, 2>(boost::extents [data_Xsize][data_Ysize]));
237      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
238      dtreat->write_data(fieldid_str, data);
239   }
240   
241   void cxios_write_data_k43(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize, int data_Zsize)
242   {
243      std::string fieldid_str;
244      boost::shared_ptr<CContext> context =
245      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
246      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
247      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
248     
249//      boost::const_multi_array_ref<float, 3> array_(data_k4,
250//          boost::extents [data_Xsize][data_Ysize][data_Zsize],
251//          boost::fortran_storage_order());
252      ARRAY(float, 3) data(new CArray<float, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize]));
253      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
254      dtreat->write_data(fieldid_str, data);
255   } 
256
257} // extern "C"
Note: See TracBrowser for help on using the repository browser.