source: XIOS/trunk/src/output/onetcdf4.hpp @ 606

Last change on this file since 606 was 606, checked in by rlacroix, 6 years ago

Support NetCDF4 compression.

Only available for non-parallel output so either if only one server is used or if the multiple file mode is enabled).

  • 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: 5.0 KB
Line 
1#ifndef __XIOS_ONETCDF4__
2#define __XIOS_ONETCDF4__
3
4/// XIOS headers ///
5#include "xios_spl.hpp"
6#include "exception.hpp"
7#include "data_output.hpp"
8#include "array_new.hpp"
9#include "mpi.hpp"
10#include "netcdf.hpp"
11
12#ifndef UNLIMITED_DIM
13   #define UNLIMITED_DIM (size_t)(-1)
14#endif  //UNLIMITED_DIM
15
16namespace xios
17{
18      /// ////////////////////// Déclarations ////////////////////// ///
19      class CONetCDF4
20         : public virtual CDataOutput
21      {
22         public :
23
24            /// Définition de type ///
25            typedef std::vector<StdString> CONetCDF4Path;
26
27            /// Constructeurs ///
28            CONetCDF4(const StdString & filename, bool append, bool useClassicFormat = false,
29                      const MPI_Comm * comm = NULL, bool multifile = true);
30
31            CONetCDF4(const CONetCDF4 & onetcdf4);       // Not implemented.
32            CONetCDF4(const CONetCDF4 * const onetcdf4); // Not implemented.
33
34
35            /// Initialisation ///
36            void initialize(const StdString & filename, bool append, bool useClassicFormat,
37                            const MPI_Comm * comm, bool multifile);
38            void close(void) ;
39            void sync(void) ;
40            void definition_start(void);
41            void definition_end(void);
42
43            /// Mutateurs ///
44            void setCurrentPath(const CONetCDF4Path & path);
45
46            int addGroup(const StdString & name);
47            int addDimension(const StdString& name, const StdSize size = UNLIMITED_DIM);
48            int addVariable(const StdString & name, nc_type type,
49                            const std::vector<StdString> & dim);
50
51      //----------------------------------------------------------------
52         public :
53
54            template <class T>
55               void setDefaultValue(const StdString & varname, const T * value = NULL);
56
57            void setCompressionLevel(const StdString& varname, int compressionLevel);
58
59            template <class T>  void addAttribute (const StdString & name, const T & value, const StdString * varname = NULL);
60
61            /// Ecriture des données ///
62            template <class T, int ndim>
63               void writeData(const CArray<T,ndim>& data, const StdString & name,
64                              bool collective, StdSize record,
65                              const std::vector<StdSize> * start = NULL,
66                              const std::vector<StdSize> * count = NULL);
67
68            void writeData(const CArray<int, 2>& data, const StdString & name);
69            void writeTimeAxisData(const CArray<double,1>& data, const StdString & name,
70                                   bool collective, StdSize record, bool Isroot) ;
71            /// Accesseur ///
72            const CONetCDF4Path & getCurrentPath(void) const;
73
74            /// Destructeur ///
75            virtual ~CONetCDF4(void);
76
77      //----------------------------------------------------------------
78
79         protected :
80
81            /// Ecriture ///
82            virtual void writeField_ (CField*  field)  = 0;
83            virtual void writeDomain_(CDomain* domain) = 0;
84            virtual void writeAxis_  (CAxis*   axis)   = 0;
85
86            /// Accesseurs ///
87            int getCurrentGroup(void);
88            int getGroup(const CONetCDF4Path & path);
89            int getVariable(const StdString & varname);
90            int getDimension(const StdString & dimname);
91            std::vector<StdSize>   getDimensions       (const StdString & varname);
92            std::vector<StdString> getDimensionsIdList (const StdString * varname);
93            int       getUnlimitedDimension(void);
94            StdString getUnlimitedDimensionName(void);
95
96            bool varExist(const StdString & varname);
97
98            bool useClassicFormat; //!< If true, NetCDF4 will use the classic NetCDF3 format
99
100      //----------------------------------------------------------------
101
102         private :
103
104            template <class T>
105               void writeData_(int grpid, int varid,
106                               const std::vector<StdSize> & sstart,
107                               const std::vector<StdSize> & scount, T * data);
108
109            void getWriteDataInfos(const StdString & name, StdSize record, StdSize & array_size,
110                                   std::vector<StdSize> & sstart,
111                                   std::vector<StdSize> & scount,
112                                   const std::vector<StdSize> * start,
113                                   const std::vector<StdSize> * count);
114
115            /// Vérification des erreurs NetCDF ///
116            void CheckError(int status);
117
118            /// Propriétés privées ///
119            CONetCDF4Path path;
120            int ncidp;
121            bool wmpi;
122            /*! Number of records already written when opening an existing file.
123             *  always 0 when creating a new file */
124            size_t recordOffset;
125            map<int,size_t> timeAxis ;
126      }; // class CONetCDF4
127
128      ///---------------------------------------------------------------
129
130
131
132} // namespace xios
133
134#endif //__XIOS_ONETCDF4__
Note: See TracBrowser for help on using the repository browser.