source: XMLIO_V2/dev/common/src/xmlio/data_treatment.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: 7.0 KB
Line 
1#include "data_treatment.hpp"
2
3#include "attribute_template_impl.hpp"
4#include "object_template_impl.hpp"
5#include "group_template_impl.hpp"
6#include "object_factory_impl.hpp"
7
8
9namespace xmlioserver
10{
11   namespace data
12   {
13      /// ////////////////////// Définitions ////////////////////// ///
14      CDataTreatment::CDataTreatment (boost::shared_ptr<CContext> _ctxt)
15         : currentContext(_ctxt), enabledFiles()
16      { this->doTreatment(); }
17
18      CDataTreatment::~CDataTreatment(void)
19      { /* Ne rien faire de plus */ }
20
21      ///---------------------------------------------------------------
22
23      const boost::shared_ptr<CContext>
24         CDataTreatment::getCurrentContext(void) const
25      {
26         return (this->currentContext);
27      }
28
29      const std::vector<boost::shared_ptr<CFile> > &
30         CDataTreatment::getEnabledFiles (void) const
31      {
32         return (this->enabledFiles);
33      }
34      //----------------------------------------------------------------
35
36      void CDataTreatment::update_calendar(int step)
37      {
38         // Mise à jour cÃŽté client
39         this->currentContext->getCalendar()->update(step);
40//         std::cout <<  "current date : " << this->currentContext->getCalendar()->getCurrentDate() << std::endl;
41         if (CXIOSManager::GetStatus() == CXIOSManager::LOC_CLIENT)
42         { // Mise à jour cÃŽté serveur
43            boost::shared_ptr<comm::CClient> client = comm::CClient::GetClient();
44            client->updateCalendar(step);
45         }
46      }
47
48      void CDataTreatment::set_timestep(const date::CDuration & duration)
49      {
50         // Mise à jour cÃŽté client
51         this->currentContext->getCalendar()->setTimeStep(duration);
52         this->currentContext->timestep.setValue(duration.toString());
53         if (CXIOSManager::GetStatus() == CXIOSManager::LOC_CLIENT)
54         { // Mise à jour cÃŽté serveur
55            boost::shared_ptr<comm::CClient> client = comm::CClient::GetClient();
56            client->setTimestep(duration);
57         }
58      }
59
60      void CDataTreatment::finalize(void)
61      {
62         // Mise à jour cÃŽté client
63         if (CXIOSManager::GetStatus() == CXIOSManager::LOC_CLIENT)
64         { // Mise à jour cÃŽté serveur
65            boost::shared_ptr<comm::CClient> client = comm::CClient::GetClient();
66            client->finalize();
67         }
68         else closeAllFile() ;
69      }
70
71      void CDataTreatment::closeAllFile(void )
72      {
73         std::vector<boost::shared_ptr<CFile> >::const_iterator
74            it = this->enabledFiles.begin(), end = this->enabledFiles.end();
75         
76         for (; it != end; it++)
77         {
78            (*it)->close();
79         }
80      }
81      //----------------------------------------------------------------
82     
83      void CDataTreatment::write_data
84                           (const StdString & fieldId,
85                            const StdString & fileId,
86                            const std::deque<ARRAY(double, 1)> & data)
87      {
88         const date::CDate & currDate =
89                this->currentContext->getCalendar()->getCurrentDate();
90         const std::vector<boost::shared_ptr<CField> > & refField=
91               CObjectFactory::GetObject<CField>(fieldId)->getAllReference();
92         std::vector<boost::shared_ptr<CField> >::const_iterator
93               it = refField.begin(), end = refField.end();
94
95         for (; it != end; it++)
96         {
97            boost::shared_ptr<CField> field = *it;
98            boost::shared_ptr<CFile>  file  = field->getRelFile();
99           
100            if (file->getId().compare(fileId) == 0)
101            {
102               if (field->updateDataServer(currDate, data))
103               {
104                  file->getDataOutput()->writeFieldData(field);
105               }
106               return;
107            }
108         }
109
110      }
111
112      //----------------------------------------------------------------
113
114      void CDataTreatment::doTreatment(void)
115      {         
116         // Résolution du calendrier
117         this->currentContext->solveCalendar();         
118         
119         // Résolution des héritages pour le context actuel.
120         //std::cout << "(Message temporaire) Résolution des héritages ..." << std::endl;
121         this->solveAllInheritance();
122
123         //Initialisation du vecteur 'enabledFiles' contenant la liste des fichiers à sortir.
124         //std::cout << "(Message temporaire) Initialisation du vecteur enabledFiles ..." << std::endl;
125         this->findEnabledFiles();
126
127         //Recherche des champs à sortir (enable à true + niveau de sortie correct)
128         // pour chaque fichier précédemment listé.
129         //std::cout << "(Message temporaire) Recherche des champs à sortir ..." << std::endl;
130         this->findAllEnabledFields();
131
132         // Résolution des références de grilles pour chacun des champs.
133         //std::cout << "(Message temporaire) Résolution des références de grilles ..." << std::endl;
134         this->solveAllGridRef();
135
136         // Traitement des opérations.
137         this->solveAllOperation();
138
139         // Nettoyage de l'arborescence
140         CContext::CleanTree();
141
142         //std::cout << "(Message temporaire) fin traitement sorties ..." << std::endl;
143      }
144
145      void CDataTreatment::findAllEnabledFields(void)
146      {
147         for (unsigned int i = 0; i < this->enabledFiles.size(); i++)
148            (void)this->enabledFiles[i]->getEnabledFields();
149      }
150
151      void CDataTreatment::solveAllGridRef(void)
152      {
153         for (unsigned int i = 0; i < this->enabledFiles.size(); i++)
154            this->enabledFiles[i]->solveEFGridRef();
155      }
156
157      void CDataTreatment::solveAllOperation(void)
158      {
159         for (unsigned int i = 0; i < this->enabledFiles.size(); i++)
160            this->enabledFiles[i]->solveEFOperation();
161      }
162
163      void CDataTreatment::solveAllInheritance(void) const
164      {
165         // Résolution des héritages descendants (càd des héritages de groupes)
166         // pour chacun des contextes.
167         this->currentContext->solveDescInheritance();
168
169         // Résolution des héritages par référence au niveau des fichiers.
170          const std::vector<boost::shared_ptr<CFile> > & allFiles
171            = CObjectFactory::GetObjectVector<CFile>();
172
173         for (unsigned int i = 0; i < allFiles.size(); i++)
174            allFiles[i]->solveFieldRefInheritance();
175      }
176
177      void CDataTreatment::findEnabledFiles(void)
178      {
179         const std::vector<boost::shared_ptr<CFile> > & allFiles
180            = CObjectFactory::GetObjectVector<CFile>();
181
182         for (unsigned int i = 0; i < allFiles.size(); i++)
183            if (!allFiles[i]->enabled.isEmpty()) // Si l'attribut 'enabled' est défini.
184               if (allFiles[i]->enabled.getValue()) // Si l'attribut 'enabled' est fixé à vrai.
185                  enabledFiles.push_back(allFiles[i]);
186
187         if (enabledFiles.size() == 0)
188            DEBUG(<<"Aucun fichier ne va être sorti dans le contexte nommé \""
189                  << this->currentContext->getId() << "\" !");
190      }
191
192      ///---------------------------------------------------------------
193
194   } // namespace data
195} // namespace xmlioserver
Note: See TracBrowser for help on using the repository browser.