source: XIOS/dev/dev_rv/src/xmlio/data_treatment.hpp @ 1478

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

Corrections de bugs

File size: 5.5 KB
Line 
1#ifndef __XMLIO_CDataTreatment__
2#define __XMLIO_CDataTreatment__
3
4/// xmlioserver headers ///
5#include "xmlioserver_spl.hpp"
6#include "node_type.hpp"
7#include "mpi_manager.hpp"
8#include "data_output.hpp"
9#include "duration.hpp"
10#include "client.hpp"
11#include "xios_manager.hpp"
12
13namespace xmlioserver
14{
15   namespace data
16   {
17      /// ////////////////////// Déclarations ////////////////////// ///
18      class CDataTreatment
19      {
20         public :
21
22            /// Construteurs ///
23            CDataTreatment
24               (boost::shared_ptr<CContext> _ctxt =
25                  CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId()));
26
27            CDataTreatment(const CDataTreatment & data_treatment);       // Not implemented yet.
28            CDataTreatment(const CDataTreatment * const data_treatment); // Not implemented yet.
29
30            /// Accesseurs ///
31            const boost::shared_ptr<CContext> getCurrentContext(void) const;
32            const std::vector<boost::shared_ptr<CFile> > & getEnabledFiles  (void) const;
33
34            /// Ecriture et mise à jour du calendrier ///
35            void write_data(const StdString & fieldId,
36                            const StdString & fileId,
37                            const std::deque<ARRAY(double, 1)> & data);
38
39            template <StdSize N>
40               void write_data(const StdString & fieldId, const ARRAY(double, N) & data);
41
42            template <StdSize N>
43               void write_data(const StdString & fieldId, const ARRAY(float, N) & data);
44
45            void update_calendar(int step);
46            void set_timestep(const date::CDuration & duration);
47
48            /// Création des sorties ///
49            template <class T> void createDataOutput(comm::MPIComm comm_server = CXIOSManager::Comm_Server);
50
51            /// Destructeur ///
52            ~CDataTreatment(void);
53
54         private :
55
56            /// Traitements ///
57            void doTreatment(void);
58
59            void findAllEnabledFields(void);
60            void solveAllGridRef(void);
61            void solveAllOperation(void);
62            void solveAllInheritance(void) const;
63            void findEnabledFiles(void);
64
65            /// Propriétés privées ///
66            boost::shared_ptr<CContext> currentContext;
67            std::vector<boost::shared_ptr<CFile> > enabledFiles;
68
69      }; // CDataTreatment
70
71      //----------------------------------------------------------------
72
73      template <class T>
74         void CDataTreatment::createDataOutput(comm::MPIComm comm_server )
75      {
76         std::vector<boost::shared_ptr<CFile> >::const_iterator
77            it = this->enabledFiles.begin(), end = this->enabledFiles.end();
78         
79         for (; it != end; it++)
80         {
81            CXIOSManager::Comm_Server = comm_server;
82            boost::shared_ptr<CFile> file = *it;
83            StdString filename = (!file->name.isEmpty())
84                               ?   file->name.getValue() : file->getId();
85            StdOStringStream oss;
86            if (!CObjectFactory::GetObject<CContext>
87                (CObjectFactory::GetCurrentContextId())->output_dir.isEmpty())
88                oss << CObjectFactory::GetObject<CContext>(CObjectFactory::GetCurrentContextId())->output_dir.getValue();
89            oss << filename;
90            if (!file->name_suffix.isEmpty())
91                oss << file->name_suffix.getValue();
92            if (comm::CMPIManager::GetCommSize(comm_server) > 1)
93                     oss << "." << comm::CMPIManager::GetCommRank(comm_server);
94                 oss << ".nc";
95            boost::shared_ptr<io::CDataOutput> dout(new T(oss.str(), false));
96            file->initializeDataOutput(dout);
97         }
98      }
99
100      template <StdSize N>
101         void CDataTreatment::write_data
102            (const StdString & fieldId, const ARRAY(float, N) & data)
103      {
104         typedef typename boost::multi_array<double, N>::size_type sizetp;
105         std::vector<sizetp> shape;
106         const sizetp * shapearr = data->shape();
107
108         shape.assign(shapearr, shapearr + N);
109         ARRAY(double, N) datad(new CArray<double, N>(shape));
110         for (StdSize i = 0; i < datad->num_elements(); i++)
111          datad->data()[i] = data->data()[i];
112
113         this->write_data(fieldId, datad);
114      }
115
116      template <StdSize N>
117         void CDataTreatment::write_data
118            (const StdString & fieldId, const ARRAY(double, N) & data)
119      {
120         const date::CDate & currDate =
121                this->currentContext->getCalendar()->getCurrentDate();
122         const date::CDuration & timestep = 
123               this->currentContext->getCalendar()->getTimeStep();
124         const std::vector<boost::shared_ptr<CField> > & refField=
125               CObjectFactory::GetObject<CField>(fieldId)->getAllReference();
126         std::vector<boost::shared_ptr<CField> >::const_iterator
127               it = refField.begin(), end = refField.end();
128         for (; it != end; it++)
129         {
130            boost::shared_ptr<CField> field = *it;
131            boost::shared_ptr<CFile>  file  = field->getRelFile();
132            if (field->updateData(currDate, timestep, data))
133            {
134               if (CXIOSManager::GetStatus() == CXIOSManager::LOC_CLIENT)
135               { 
136                   boost::shared_ptr<comm::CClient> client = comm::CClient::GetClient();
137                   client->sendData(fieldId, file->getId(), field->getData());
138               }
139               else
140               {
141                  file->getDataOutput()->writeFieldData(field);
142               }
143            }
144         }
145
146      }
147
148   } // namespace data
149
150} // namespace xmlioserver
151
152#endif // __XMLIO_CDataTreatment__
Note: See TracBrowser for help on using the repository browser.