source: XIOS3/trunk/src/node/file.hpp @ 2551

Last change on this file since 2551 was 2509, checked in by jderouillat, 13 months ago

Add a comparison operator to the filesToWrite_ std:: set to force the file creation ordering

  • 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: 8.5 KB
RevLine 
[591]1#ifndef __XIOS_CFile__
2#define __XIOS_CFile__
[219]3
[591]4/// XIOS headers ///
5#include "xios_spl.hpp"
[219]6#include "field.hpp"
[300]7#include "data_output.hpp"
[599]8#include "data_input.hpp"
[219]9#include "declare_group.hpp"
[318]10#include "date.hpp"
[369]11#include "attribute_enum.hpp"
12#include "attribute_enum_impl.hpp"
[1021]13#include "context_client.hpp"
[382]14#include "mpi.hpp"
[219]15
[335]16namespace xios {
[509]17
[219]18   /// ////////////////////// Déclarations ////////////////////// ///
19
20   class CFileGroup;
21   class CFileAttributes;
22   class CFile;
23
[640]24   class CGarbageCollector;
25
[219]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
[509]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   */
[219]43   class CFile
44      : public CObjectTemplate<CFile>
45      , public CFileAttributes
46   {
47         /// typedef ///
48         typedef CObjectTemplate<CFile>   SuperClass;
49         typedef CFileAttributes SuperClassAttribute;
[509]50
[219]51      public :
[300]52         enum EEventId
53         {
[2326]54           EVENT_ID_COLLECTIVE=100,
[651]55           EVENT_ID_ADD_FIELD, EVENT_ID_ADD_FIELD_GROUP, EVENT_ID_ADD_VARIABLE,
[2326]56           EVENT_ID_ADD_VARIABLE_GROUP, EVENT_ID_CREATE_ENABLED_FIELDS,
57           EVENT_ID_NO_COLLECTIVE=1000,
[651]58         };
[509]59
[219]60         typedef CFileAttributes RelAttributes;
61         typedef CFileGroup      RelGroup;
62
63         /// Constructeurs ///
64         CFile(void);
[651]65         explicit CFile(const StdString& id);
66         CFile(const CFile& file);       // Not implemented yet.
67         CFile(const CFile* const file); // Not implemented yet.
[219]68
[509]69         /// Destructeur ///
70         virtual ~CFile(void);
71
72      public:
[219]73         /// Accesseurs ///
[1158]74         const StdString getFileOutputName(void) const;
[1542]75         std::shared_ptr<CDataOutput> getDataOutput(void) const;
76         std::shared_ptr<CDataInput> getDataInput(void) const;
[347]77         CFieldGroup* getVirtualFieldGroup(void) const;
[472]78         CVariableGroup* getVirtualVariableGroup(void) const;
[347]79         std::vector<CField*> getAllFields(void) const;
[472]80         std::vector<CVariable*> getAllVariables(void) const;
[219]81
[347]82         std::vector<CField* > getEnabledFields(int default_outputlevel = 5,
83                                                int default_level = 1,
84                                                bool default_enabled = true);
[2507]85         void replaceEnabledFields(CField* fieldIn, CField* fieldOut) ;
[219]86
[1622]87         StdString dumpClassAttributes(void);
88
[219]89      public :
[509]90         // Some functions to verify state of file
[651]91         bool isSyncTime(void);
92         bool checkSplit(void);
93         bool checkSync(void);
[1136]94         void checkWriteFile(void);
95         void checkReadFile(void);
[1232]96         void initWrite(void);
97         void initRead(void);
98         bool isEmptyZone();
[219]99
100         /// Mutateurs ///
[509]101         // Set some root definitions in a file
[347]102         void setVirtualFieldGroup(CFieldGroup* newVFieldGroup);
[472]103         void setVirtualVariableGroup(CVariableGroup* newVVariableGroup);
[509]104
[300]105         void createHeader(void);
[1232]106         void openInReadMode(void);
[651]107         void close(void);
[775]108         void readAttributesOfEnabledFieldsInReadMode();
[1871]109         void readFieldAttributesMetaData(CField* field) ;
110         void readFieldAttributesValues(CField* field) ;
[509]111         // Some processing on file
[445]112         void solveFieldRefInheritance(bool apply);
[651]113         void processEnabledFile(void);
[1129]114         
[598]115         void prefetchEnabledReadModeFields();
[1318]116         void doPostTimestepOperationsForEnabledReadModeFields();
[219]117
[1025]118         void checkGridOfEnabledFields();
119         void sendGridOfEnabledFields();
[1494]120         void sendGridComponentOfEnabledFields();
[1025]121
[1494]122         void sortEnabledFieldsForUgrid();
123
[509]124         // Add component into file
[651]125         CField* addField(const string& id = "");
126         CFieldGroup* addFieldGroup(const string& id = "");
127         CVariable* addVariable(const string& id = "");
128         CVariableGroup* addVariableGroup(const string& id = "");
[2458]129         
130         
131         void getWriterServicesId(bool defaultUsingServer2_, const string& defaultPoolWriterId_, const string& defaultWriterId_, const string& defaultPoolGathererId_, const string& defaultGathererId_,
132                                  bool& usingServer2, string& poolWriterId, string& writerId, string& poolGathererId, string& gathererId) ;
133         void getReaderServicesId(const string& defaultPoolReaderId_, const string& defaultReaderId_, string& poolReaderId, string& readerId) ;
134 
135
136         void setContextClient(const string& defaultPoolId, const string& defaultServiceId, int partitionId) ;
[1021]137         void setContextClient(CContextClient* newContextClient);
138         CContextClient* getContextClient();
[509]139
[1144]140         // Send info to server         
141         void sendEnabledFields(CContextClient* client);         
142         void sendAddField(const string& id, CContextClient* client);         
143         void sendAddFieldGroup(const string& id, CContextClient* client);                           
[1021]144         void sendAddVariable(const string& id, CContextClient* client);
[1132]145         void sendAddVariableGroup(const string& id, CContextClient* client);
[1144]146         void sendAddAllVariables(CContextClient* client);
[1870]147      public:
148         void sendFileToFileServer(CContextClient* client) ;
149      private:
150         std::set<CContextClient*> sendFileToFileServer_done_ ;
151
152      public:
[509]153         // Receive info from client
[651]154         static void recvAddField(CEventServer& event);
155         void recvAddField(CBufferIn& buffer);
156         static void recvAddFieldGroup(CEventServer& event);
157         void recvAddFieldGroup(CBufferIn& buffer);
158         static void recvAddVariable(CEventServer& event);
159         void recvAddVariable(CBufferIn& buffer);
160         static void recvAddVariableGroup(CEventServer& event);
161         void recvAddVariableGroup(CBufferIn& buffer);
[509]162
163         // Dispatch event
[651]164         static bool dispatchEvent(CEventServer& event);
[509]165
166      public:
167         /// Accesseurs statiques ///
168         static StdString GetName(void);
169         static StdString GetDefName(void);
170
171         static ENodeType GetType(void);
172      public:
173         /// Traitements ///
[651]174         virtual void solveDescInheritance(bool apply, const CAttributeMap* const parent = 0);
[509]175
176          /// Autres ///
[651]177         virtual void parse(xml::CXMLNode& node);
[509]178         virtual StdString toString(void) const;
179      public:
180
[651]181         CDate lastSync;
182         CDate lastSplit;
[1961]183         
184         const CDate& getLastSplit(void) { return lastSplit ; }
185       
[609]186         int nbAxis, nbDomains;
[1232]187         bool isOpen;         
[1639]188         MPI_Comm fileComm;
[509]189
[1232]190      private:
191         void createSubComFile();
192         bool checkRead;
193         bool allZoneEmpty;
194         
[219]195      private :
196         /// Propriétés privées ///
[1054]197         CContextClient* client;
[347]198         CFieldGroup* vFieldGroup;
[651]199         CVariableGroup* vVariableGroup;
[1542]200         std::shared_ptr<CDataOutput> data_out;
201         std::shared_ptr<CDataInput> data_in;
[347]202         std::vector<CField*> enabledFields;
[219]203
[1871]204       private: 
205         bool isClientSide_ ; // the file is on client side or on server side ?
206       public:
207         bool isClientSide(void) { return isClientSide_ ;}
208         bool isServerSide(void) { return !isClientSide_ ;}
209         void setClientSide(void) { isClientSide_=true ;}
210         void setServerSide(void) { isClientSide_=false ;}
211       
212       private:
[2507]213         bool isOnline_=false;
214       public:
215         bool isOnline(void) { return isOnline_ ;}
216         void setOnline(bool online=true) { isOnline_=online ;} 
[509]217      public:
[651]218        //         virtual void toBinary  (StdOStream& os) const;
219        //         virtual void fromBinary(StdIStream& is);
[509]220
[219]221   }; // class CFile
222
223   ///--------------------------------------------------------------
224
225   // Declare/Define CFileGroup and CFileDefinition
226   DECLARE_GROUP(CFile);
227
228   ///--------------------------------------------------------------
229
[2509]230   struct FilePtrCompare {
231     bool operator() (CFile const *l, CFile const *r) const {
232       return l->getFileOutputName() < r->getFileOutputName();
233     }
234   };
[335]235} // namespace xios
[219]236
[591]237#endif // __XIOS_CFile__
Note: See TracBrowser for help on using the repository browser.