source: XIOS/dev/XIOS_DEV_CMIP6/src/node/file.hpp @ 1234

Last change on this file since 1234 was 1232, checked in by mhnguyen, 7 years ago

Fixing the blocking problem where there are more servers than the number of grid band distribution

+) Correct this problem not only for writing but also for reading
+) Allow "zero-size" domain, axis (i.e: domain, axis with ni = 0, and/or nj=0)

Test
+) On Curie
+) Work in both cases: Read and Write data

  • Property copyright set to
    Software name : XIOS (Xml I/O Server)
    http://forge.ipsl.jussieu.fr/ioserver
    Creation date : January 2009
    Licence : CeCCIL version2
    see license file in root directory : Licence_CeCILL_V2-en.txt
    or http://www.cecill.info/licences/Licence_CeCILL_V2-en.html
    Holder : CEA/LSCE (Laboratoire des Sciences du CLimat et de l'Environnement)
    CNRS/IPSL (Institut Pierre Simon Laplace)
    Project Manager : Yann Meurdesoif
    yann.meurdesoif@cea.fr
File size: 7.0 KB
Line 
1#ifndef __XIOS_CFile__
2#define __XIOS_CFile__
3
4/// XIOS headers ///
5#include "xios_spl.hpp"
6#include "field.hpp"
7#include "data_output.hpp"
8#include "data_input.hpp"
9#include "declare_group.hpp"
10#include "date.hpp"
11#include "attribute_enum.hpp"
12#include "attribute_enum_impl.hpp"
13#include "context_client.hpp"
14#include "mpi.hpp"
15
16namespace xios {
17
18   /// ////////////////////// Déclarations ////////////////////// ///
19
20   class CFileGroup;
21   class CFileAttributes;
22   class CFile;
23
24   class CGarbageCollector;
25
26   ///--------------------------------------------------------------
27
28   // Declare/Define CFileAttribute
29   BEGIN_DECLARE_ATTRIBUTE_MAP(CFile)
30#  include "file_attribute.conf"
31   END_DECLARE_ATTRIBUTE_MAP(CFile)
32
33   ///--------------------------------------------------------------
34
35   /*!
36   \class CFile
37   This class corresponds to file component of the xml.
38   The class contains all the nessceary information to write data into a netcdf file: The most important thing
39   is the field(s) which will be written into file. Besides, there are some options to write
40   data into file, e.g: writting into only one file or multiple file; splitting a running into several files.
41   Moreover, there are some other attributes of netcdf file which are also stored in this class
42   */
43   class CFile
44      : public CObjectTemplate<CFile>
45      , public CFileAttributes
46   {
47         /// typedef ///
48         typedef CObjectTemplate<CFile>   SuperClass;
49         typedef CFileAttributes SuperClassAttribute;
50
51      public :
52         enum EEventId
53         {
54           EVENT_ID_ADD_FIELD, EVENT_ID_ADD_FIELD_GROUP, EVENT_ID_ADD_VARIABLE,
55           EVENT_ID_ADD_VARIABLE_GROUP, EVENT_ID_CREATE_ENABLED_FIELDS
56         };
57
58         typedef CFileAttributes RelAttributes;
59         typedef CFileGroup      RelGroup;
60
61         /// Constructeurs ///
62         CFile(void);
63         explicit CFile(const StdString& id);
64         CFile(const CFile& file);       // Not implemented yet.
65         CFile(const CFile* const file); // Not implemented yet.
66
67         /// Destructeur ///
68         virtual ~CFile(void);
69
70      public:
71         /// Accesseurs ///
72         const StdString getFileOutputName(void) const;
73         boost::shared_ptr<CDataOutput> getDataOutput(void) const;
74         boost::shared_ptr<CDataInput> getDataInput(void) const;
75         CFieldGroup* getVirtualFieldGroup(void) const;
76         CVariableGroup* getVirtualVariableGroup(void) const;
77         std::vector<CField*> getAllFields(void) const;
78         std::vector<CVariable*> getAllVariables(void) const;
79
80         std::vector<CField* > getEnabledFields(int default_outputlevel = 5,
81                                                int default_level = 1,
82                                                bool default_enabled = true);
83
84      public :
85         // Some functions to verify state of file
86         bool isSyncTime(void);
87         bool checkSplit(void);
88         bool checkSync(void);
89         void checkWriteFile(void);
90         void checkReadFile(void);
91         void initWrite(void);
92         void initRead(void);
93         bool isEmptyZone();
94
95         /// Mutateurs ///
96         // Set some root definitions in a file
97         void setVirtualFieldGroup(CFieldGroup* newVFieldGroup);
98         void setVirtualVariableGroup(CVariableGroup* newVVariableGroup);
99
100         void createHeader(void);
101         void openInReadMode(void);
102         void close(void);
103         void readAttributesOfEnabledFieldsInReadMode();
104
105         // Some processing on file
106         void solveFieldRefInheritance(bool apply);
107         void processEnabledFile(void);
108         void solveOnlyRefOfEnabledFields(bool sendToServer);
109         void generateNewTransformationGridDest();
110         
111         void buildFilterGraphOfEnabledFields(CGarbageCollector& gc);
112         void prefetchEnabledReadModeFields();
113         void prefetchEnabledReadModeFieldsIfNeeded();
114
115         void solveAllRefOfEnabledFieldsAndTransform(bool sendToServer);
116         void checkGridOfEnabledFields();
117         void sendGridOfEnabledFields();
118
119         // Add component into file
120         CField* addField(const string& id = "");
121         CFieldGroup* addFieldGroup(const string& id = "");
122         CVariable* addVariable(const string& id = "");
123         CVariableGroup* addVariableGroup(const string& id = "");
124         void setContextClient(CContextClient* newContextClient);
125         CContextClient* getContextClient();
126
127         void setReadContextClient(CContextClient* newContextClient);
128         CContextClient* getReadContextClient();
129
130         // Send info to server         
131         void sendEnabledFields(CContextClient* client);         
132         void sendAddField(const string& id, CContextClient* client);         
133         void sendAddFieldGroup(const string& id, CContextClient* client);                           
134         void sendAddVariable(const string& id, CContextClient* client);
135         void sendAddVariableGroup(const string& id, CContextClient* client);
136         void sendAddAllVariables(CContextClient* client);
137         
138         // Receive info from client
139         static void recvAddField(CEventServer& event);
140         void recvAddField(CBufferIn& buffer);
141         static void recvAddFieldGroup(CEventServer& event);
142         void recvAddFieldGroup(CBufferIn& buffer);
143         static void recvAddVariable(CEventServer& event);
144         void recvAddVariable(CBufferIn& buffer);
145         static void recvAddVariableGroup(CEventServer& event);
146         void recvAddVariableGroup(CBufferIn& buffer);
147
148         // Dispatch event
149         static bool dispatchEvent(CEventServer& event);
150
151      public:
152         /// Accesseurs statiques ///
153         static StdString GetName(void);
154         static StdString GetDefName(void);
155
156         static ENodeType GetType(void);
157      public:
158         /// Traitements ///
159         virtual void solveDescInheritance(bool apply, const CAttributeMap* const parent = 0);
160
161          /// Autres ///
162         virtual void parse(xml::CXMLNode& node);
163         virtual StdString toString(void) const;
164      public:
165
166         CDate lastSync;
167         CDate lastSplit;
168         int nbAxis, nbDomains;
169         bool isOpen;         
170         MPI_Comm fileComm;
171
172      private:
173         void createSubComFile();
174         bool checkRead;
175         bool allZoneEmpty;
176         
177      private :
178         /// Propriétés privées ///
179         CContextClient* client;
180         CContextClient* read_client; // Context client for reading (channel between server 1 and client)
181         CFieldGroup* vFieldGroup;
182         CVariableGroup* vVariableGroup;
183         boost::shared_ptr<CDataOutput> data_out;
184         boost::shared_ptr<CDataInput> data_in;
185         std::vector<CField*> enabledFields;
186
187
188      public:
189        //         virtual void toBinary  (StdOStream& os) const;
190        //         virtual void fromBinary(StdIStream& is);
191
192   }; // class CFile
193
194   ///--------------------------------------------------------------
195
196   // Declare/Define CFileGroup and CFileDefinition
197   DECLARE_GROUP(CFile);
198
199   ///--------------------------------------------------------------
200
201} // namespace xios
202
203#endif // __XIOS_CFile__
Note: See TracBrowser for help on using the repository browser.