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

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

nouvelle interface fortran et corrections

File size: 8.4 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
42         boost::shared_ptr<CDataTreatment> dt(new CDataTreatment (context));
43         context->setDataTreatment(dt);
44
45         oss << StdString("def_client_end.")
46             << CMPIManager::GetCommRank(CMPIManager::GetCommWorld());
47         CTreeManager::PrintTreeToFile(oss.str());
48
49         if ((comm_client_server != -1))
50         {
51            MPI_Request request = 0;
52            StdOStringStream ostrs;
53            if (CMPIManager::GetCommRank(comm_client_server) == 1)
54            {
55               CTreeManager::ToBinary(ostrs);
56               CLinearBuffer lbuffer(ostrs.str().size()+13);
57               lbuffer.appendString(ostrs.str());
58               CMPIManager::SendLinearBuffer(comm_client_server, 0, lbuffer, request);
59               CMPIManager::Wait(request);  // Pas encore en mode RPC
60            }
61            else
62            {
63               CTreeManager::DomainsToBinary(ostrs);
64               CLinearBuffer lbuffer(ostrs.str().size()+13);
65               lbuffer.appendString(ostrs.str());
66               CMPIManager::SendLinearBuffer(comm_client_server, 0, lbuffer, request);
67               CMPIManager::Wait(request);  // Pas encore en mode RPC
68            }
69         }
70         else
71         {
72            dt->createDataOutput<CNc4DataOutput>();
73         }
74      }
75      catch (CException & exc)
76      {
77         std::cerr << exc.getMessage() << std::endl;
78         exit (EXIT_FAILURE);
79      }
80   }
81   
82   void xios_dtreatment_end(void)
83   {
84      try
85      {
86         CMPIManager::Finalize();
87      }
88      catch (CException & exc)
89      {
90         std::cerr << exc.getMessage() << std::endl;
91         exit (EXIT_FAILURE);
92      }
93   }
94
95   // ---------------------- Initialisation du serveur -------------------------
96
97   void xios_init_ioserver(MPIComm * comm_client)
98   {
99      try
100      {
101         MPIComm comm_client_server, comm_server;
102         CMPIManager::Initialise(NULL, NULL);
103         CMPIManager::DispatchClient(false, *comm_client, comm_client_server, comm_server);
104      }
105      catch (CException & exc)
106      {
107         std::cerr << exc.getMessage() << std::endl;
108         exit (EXIT_FAILURE);
109      }
110   }
111   
112   // ---------------------- Ecriture des données ------------------------------
113   
114   void xios_write_data_k81(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize)
115   {
116      std::string fieldid_str;
117      boost::shared_ptr<CContext> context =
118      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
119      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
120      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
121     
122//      boost::const_multi_array_ref<double, 1> array_(data_k8,
123//          boost::extents [data_Xsize],
124//          boost::fortran_storage_order());
125      ARRAY(double, 1) data(new CArray<double, 1>(boost::extents [data_Xsize]));
126      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
127      dtreat->write_data(fieldid_str, data);
128   }
129   
130   void xios_write_data_k82(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize)
131   {
132      std::string fieldid_str;
133      boost::shared_ptr<CContext> context =
134      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
135      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
136      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return;
137     
138//      boost::const_multi_array_ref<double, 2> array_(data_k8,
139//          boost::extents [data_Xsize][data_Ysize],
140//          boost::fortran_storage_order());
141      ARRAY(double, 2) data(new CArray<double, 2>(boost::extents [data_Xsize][data_Ysize]));
142      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
143      dtreat->write_data(fieldid_str, data);
144   }
145   
146   void xios_write_data_k83(const char * fieldid, int fieldid_size, double * data_k8, int data_Xsize, int data_Ysize, int data_Zsize)
147   {
148      std::string fieldid_str;
149      boost::shared_ptr<CContext> context =
150      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
151      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
152      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
153     
154//      boost::const_multi_array_ref<double, 3> array_(data_k8,
155//          boost::extents [data_Xsize][data_Ysize][data_Zsize],
156//          boost::fortran_storage_order());
157      ARRAY(double, 3) data(new CArray<double, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize]));
158      std::copy(data_k8, &(data_k8[data->num_elements()]), data->data());
159      dtreat->write_data(fieldid_str, data);
160   }
161   
162   void xios_write_data_k41(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize)
163   {
164      std::string fieldid_str;
165      boost::shared_ptr<CContext> context =
166      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
167      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
168      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
169     
170//      boost::const_multi_array_ref<float, 1> array_(data_k4,
171//          boost::extents [data_Xsize],
172//          boost::fortran_storage_order());
173      ARRAY(float, 1) data(new CArray<float, 1>(boost::extents [data_Xsize]));
174      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
175      dtreat->write_data(fieldid_str, data);
176   }
177   
178   void xios_write_data_k42(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize)
179   {
180      std::string fieldid_str;
181      boost::shared_ptr<CContext> context =
182      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
183      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
184      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
185     
186//      boost::const_multi_array_ref<float, 2> array_(data_k4,
187//          boost::extents [data_Xsize][data_Ysize],
188//          boost::fortran_storage_order());
189      ARRAY(float, 2) data(new CArray<float, 2>(boost::extents [data_Xsize][data_Ysize]));
190      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
191      dtreat->write_data(fieldid_str, data);
192   }
193   
194   void xios_write_data_k43(const char * fieldid, int fieldid_size, float * data_k4, int data_Xsize, int data_Ysize, int data_Zsize)
195   {
196      std::string fieldid_str;
197      boost::shared_ptr<CContext> context =
198      CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId());
199      boost::shared_ptr<data::CDataTreatment> dtreat = context->getDataTreatment();
200      if (!cstr2string(fieldid, fieldid_size, fieldid_str)) return; 
201     
202//      boost::const_multi_array_ref<float, 3> array_(data_k4,
203//          boost::extents [data_Xsize][data_Ysize][data_Zsize],
204//          boost::fortran_storage_order());
205      ARRAY(float, 3) data(new CArray<float, 3>(boost::extents [data_Xsize][data_Ysize][data_Zsize]));
206      std::copy(data_k4, &(data_k4[data->num_elements()]), data->data());
207      dtreat->write_data(fieldid_str, data);
208   } 
209
210} // extern "C"
Note: See TracBrowser for help on using the repository browser.