source: XMLIO_V2/dev/common/src/data_treatment.cpp @ 300

Last change on this file since 300 was 300, checked in by ymipsl, 12 years ago

nouvelle version de developpement de xios

  • nouvelle interface fortran
  • recodage complet de la couche de communication
  • et bien d'autres choses...

YM

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