source: XMLIO_V2/dev/dev_rv/src/xmlio/fortran/icdata.cpp @ 276

Last change on this file since 276 was 276, checked in by hozdoba, 13 years ago

Corrections de bugs

File size: 8.5 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
8#include "xmlioserver.hpp"
9
10#include "attribute_template_impl.hpp"
11#include "object_template_impl.hpp"
12#include "group_template_impl.hpp"
13
14#include "icutil.hpp"
15
16extern "C"
17{
18// /////////////////////////////// Définitions ////////////////////////////// //
19
20   // ----------------------- Redéfinition de types ----------------------------
21   
22   typedef enum { NETCDF4 = 0 } XFileType;
23   
24   typedef xmlioserver::tree::CContext * XContextPtr;
25
26   // -------------------- Traitement des données ------------------------------
27   
28   void xios_dtreatment_start(XContextPtr context_hdl, XFileType filetype, int comm_client_server, int comm_server)
29   {
30      using namespace xmlioserver::tree;
31      using namespace xmlioserver;
32      try
33      {
34         boost::shared_ptr<CContext> context =
35                CObjectFactory::GetObject<CContext>(context_hdl);
36         StdOStringStream oss;
37         oss << StdString("def_client_next.")
38             << CMPIManager::GetCommRank(CMPIManager::GetCommWorld());
39         CTreeManager::PrintTreeToFile(oss.str());
40         oss.str("");
41         boost::shared_ptr<CDataTreatment> dt(new CDataTreatment (context));
42         context->setDataTreatment(dt);
43
44         oss << StdString("def_client_end.")
45             << CMPIManager::GetCommRank(CMPIManager::GetCommWorld());
46         CTreeManager::PrintTreeToFile(oss.str());
47
48         if ((comm_client_server != -1))
49         {
50            MPI_Request request = 0;
51            StdOStringStream ostrs;
52            if (CMPIManager::GetCommRank(comm_client_server) == 1)
53            {
54               CTreeManager::ToBinary(ostrs);
55               CLinearBuffer lbuffer(ostrs.str().size()+13);
56               lbuffer.appendString(ostrs.str());
57               CMPIManager::SendLinearBuffer(comm_client_server, 0, lbuffer, request);
58               CMPIManager::Wait(request);  // Pas encore en mode RPC
59            }
60            else
61            {
62               CTreeManager::DomainsToBinary(ostrs);
63               CLinearBuffer lbuffer(ostrs.str().size()+13);
64               lbuffer.appendString(ostrs.str());
65               CMPIManager::SendLinearBuffer(comm_client_server, 0, lbuffer, request);
66               CMPIManager::Wait(request);  // Pas encore en mode RPC
67            }
68            CXIOSManager::RunClient(false, CMPIManager::GetCommWorld());
69            CClient::CreateClient(comm_client_server);
70         }
71         else
72         {
73            dt->createDataOutput<CNc4DataOutput>(CMPIManager::GetCommWorld());
74         }
75      }
76      catch (CException & exc)
77      {
78         std::cerr << exc.getMessage() << std::endl;
79         exit (EXIT_FAILURE);
80      }
81   }
82   
83   void xios_dtreatment_end(void)
84   {
85      try
86      {
87         CMPIManager::Finalize();
88      }
89      catch (CException & exc)
90      {
91         std::cerr << exc.getMessage() << std::endl;
92         exit (EXIT_FAILURE);
93      }
94   }
95
96   // ---------------------- Initialisation du serveur -------------------------
97
98   void xios_init_ioserver(MPIComm * comm_client)
99   {
100      try
101      {
102         MPIComm comm_client_server, comm_server;
103         CMPIManager::Initialise(NULL, NULL);
104         CMPIManager::DispatchClient(false, *comm_client, comm_client_server, comm_server);
105      }
106      catch (CException & exc)
107      {
108         std::cerr << exc.getMessage() << std::endl;
109         exit (EXIT_FAILURE);
110      }
111   }
112   
113   // ---------------------- Ecriture des données ------------------------------
114   
115   void xios_write_data_k81(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize)
116   {
117      std::string fieldid_str;
118      boost::shared_ptr<CContext> context =
119      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
120      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
121      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
122     
123//      boost::const_multi_array_ref<double, 1> array_(data_k8,
124//          boost::extents [data_Xsize],
125//          boost::fortran_storage_order());
126      ARRAY(double, 1) data(new CArray<double, 1>(boost::extents [data_Xsize]));
127      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
128      dtreat->write_data(fieldid_str, data);
129   }
130   
131   void xios_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      boost::shared_ptr<CContext> context =
135      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
136      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
137      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
138     
139//      boost::const_multi_array_ref<double, 2> array_(data_k8,
140//          boost::extents [data_Xsize][data_Ysize],
141//          boost::fortran_storage_order());
142      ARRAY(double, 2) data(new CArray<double, 2>(boost::extents [data_Xsize][data_Ysize]));
143      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
144      dtreat->write_data(fieldid_str, data);
145   }
146   
147   void xios_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      boost::shared_ptr<CContext> context =
151      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
152      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
153      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
154     
155//      boost::const_multi_array_ref<double, 3> array_(data_k8,
156//          boost::extents [data_Xsize][data_Ysize][data_Zsize],
157//          boost::fortran_storage_order());
158      ARRAY(double, 3) data(new CArray<double, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize]));
159      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
160      dtreat->write_data(fieldid_str, data);
161   }
162   
163   void xios_write_data_k41(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize)
164   {
165      std::string fieldid_str;
166      boost::shared_ptr<CContext> context =
167      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
168      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
169      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
170     
171//      boost::const_multi_array_ref<float, 1> array_(data_k4,
172//          boost::extents [data_Xsize],
173//          boost::fortran_storage_order());
174      ARRAY(float, 1) data(new CArray<float, 1>(boost::extents [data_Xsize]));
175      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
176      dtreat->write_data(fieldid_str, data);
177   }
178   
179   void xios_write_data_k42(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize)
180   {
181      std::string fieldid_str;
182      boost::shared_ptr<CContext> context =
183      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
184      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
185      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
186     
187//      boost::const_multi_array_ref<float, 2> array_(data_k4,
188//          boost::extents [data_Xsize][data_Ysize],
189//          boost::fortran_storage_order());
190      ARRAY(float, 2) data(new CArray<float, 2>(boost::extents [data_Xsize][data_Ysize]));
191      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
192      dtreat->write_data(fieldid_str, data);
193   }
194   
195   void xios_write_data_k43(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize, int data_Zsize)
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<float, 3> array_(data_k4,
204//          boost::extents [data_Xsize][data_Ysize][data_Zsize],
205//          boost::fortran_storage_order());
206      ARRAY(float, 3) data(new CArray<float, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize]));
207      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
208      dtreat->write_data(fieldid_str, data);
209   } 
210
211} // extern "C"
Note: See TracBrowser for help on using the repository browser.