XIOS  1.0
Xml I/O Server
 Tout Classes Espaces de nommage Fichiers Fonctions Variables Définitions de type Énumérations Valeurs énumérées Amis Macros
onetcdf4.hpp
Aller à la documentation de ce fichier.
1 #ifndef __XIOS_ONETCDF4__
2 #define __XIOS_ONETCDF4__
3 
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 
16 namespace xios
17 {
19  class CONetCDF4
20  : public virtual CDataOutput
21  {
22  public :
23 
25  typedef std::vector<StdString> CONetCDF4Path;
26 
28  CONetCDF4(const StdString& filename, bool append, bool useClassicFormat = false,
29  bool useCFConvention = true,
30  const MPI_Comm* comm = NULL, bool multifile = true,
31  const StdString& timeCounterName = "time_counter");
32 
33  CONetCDF4(const CONetCDF4& onetcdf4); // Not implemented.
34  CONetCDF4(const CONetCDF4* const onetcdf4); // Not implemented.
35 
36 
38  void initialize(const StdString& filename, bool append, bool useClassicFormat, bool useCFConvention,
39  const MPI_Comm* comm, bool multifile, const StdString& timeCounterName);
40  void close(void);
41  void sync(void);
42  void definition_start(void);
43  void definition_end(void);
44 
46  void setCurrentPath(const CONetCDF4Path& path);
47 
48  int addGroup(const StdString& name);
49  int addDimension(const StdString& name, const StdSize size = UNLIMITED_DIM);
50  int addVariable(const StdString& name, nc_type type,
51  const std::vector<StdString>& dim, int compressionLevel=0);
52 
53  //----------------------------------------------------------------
54  public :
55 
56  template <class T>
57  void setDefaultValue(const StdString& varname, const T* value = NULL);
58 
59  void setCompressionLevel(const StdString& varname, int compressionLevel);
60 
61  template <class T> void addAttribute (const StdString& name, const T& value, const StdString* varname = NULL);
62 
64  template <class T, int ndim>
65  void writeData(const CArray<T,ndim>& data, const StdString& name,
66  bool collective, StdSize record,
67  const std::vector<StdSize>* start = NULL,
68  const std::vector<StdSize>* count = NULL);
69 
70  void writeData(const CArray<int, 2>& data, const StdString& name);
71  void writeTimeAxisData(const CArray<double,1>& data, const StdString& name,
72  bool collective, StdSize record, bool Isroot);
73  void writeTimeAxisDataBounds(const CArray<double,1>& data, const StdString& name,
74  bool collective, StdSize record, bool Isroot);
76  const CONetCDF4Path& getCurrentPath(void) const;
77 
79  virtual ~CONetCDF4(void);
80 
81  //----------------------------------------------------------------
82 
83  protected :
84 
86  virtual void writeField_ (CField* field) = 0;
87  virtual void writeDomain_(CDomain* domain) = 0;
88  virtual void writeAxis_ (CAxis* axis) = 0;
89 
91  int getCurrentGroup(void);
92  int getGroup(const CONetCDF4Path& path);
93  int getVariable(const StdString& varname);
94  int getDimension(const StdString& dimname);
95  std::vector<StdSize> getDimensions (const StdString& varname);
96  std::vector<StdString> getDimensionsIdList (const StdString* varname);
97  int getUnlimitedDimension(void);
99  const StdString& getTimeCounterName(void) const { return timeCounterName; };
100 
101  void getTimeAxisBounds(CArray<double,2>& timeAxisBounds, const StdString& name, bool collective );
102  void getTimeAxisBounds(CArray<double,2>& timeAxisBounds, const StdString& name, bool collective, size_t record);
103 
104  bool varExist(const StdString& varname);
105  bool dimExist(const StdString& dimname);
106 
109 
110  //----------------------------------------------------------------
111 
112  private :
113  template <class T>
114  void writeData_(int grpid, int varid,
115  const std::vector<StdSize>& sstart,
116  const std::vector<StdSize>& scount, T* data);
117 
118  void getWriteDataInfos(const StdString& name, StdSize record, StdSize& array_size,
119  std::vector<StdSize>& sstart,
120  std::vector<StdSize>& scount,
121  const std::vector<StdSize>* start,
122  const std::vector<StdSize>* count);
123 
126  int ncidp;
127  bool wmpi;
128  map<int,size_t> timeAxis;
130  }; // class CONetCDF4
131 
133 
134 
135 
136 } // namespace xios
137 
138 #endif //__XIOS_ONETCDF4__
void setDefaultValue(const StdString &varname, const T *value=NULL)
////////////////////// Déclarations ////////////////////// ///
Definition: data_output.hpp:14
const CONetCDF4Path & getCurrentPath(void) const
Accesseur ///.
Definition: onetcdf4.cpp:278
bool dimExist(const StdString &dimname)
Definition: onetcdf4.cpp:633
int count
Definition: tracer.cpp:26
std::vector< StdString > CONetCDF4Path
Définition de type ///.
Definition: onetcdf4.hpp:25
int getVariable(const StdString &varname)
Definition: onetcdf4.cpp:133
map< int, size_t > timeAxis
Definition: onetcdf4.hpp:128
virtual void writeDomain_(CDomain *domain)=0
const StdString & getTimeCounterName(void) const
Definition: onetcdf4.hpp:99
#define UNLIMITED_DIM
XIOS headers ///.
Definition: onetcdf4.hpp:13
std::vector< StdSize > getDimensions(const StdString &varname)
Definition: onetcdf4.cpp:174
virtual ~CONetCDF4(void)
Destructeur ///.
Definition: onetcdf4.cpp:28
CONetCDF4Path path
Propriétés privées ///.
Definition: onetcdf4.hpp:125
void sync(void)
Definition: onetcdf4.cpp:639
bool useCFConvention
If true data is written in the CF convention otherwise in UGRID.
Definition: onetcdf4.hpp:108
void getTimeAxisBounds(CArray< double, 2 > &timeAxisBounds, const StdString &name, bool collective)
Definition: onetcdf4.cpp:231
int getCurrentGroup(void)
Accesseurs ///.
Definition: onetcdf4.cpp:110
void addAttribute(const StdString &name, const T &value, const StdString *varname=NULL)
////////////////////// Déclarations ////////////////////// ///
Definition: onetcdf4.hpp:19
void writeTimeAxisData(const CArray< double, 1 > &data, const StdString &name, bool collective, StdSize record, bool Isroot)
Definition: onetcdf4.cpp:572
std::string StdString
Definition: xios_spl.hpp:48
#define xios(arg)
void initialize(const StdString &filename, bool append, bool useClassicFormat, bool useCFConvention, const MPI_Comm *comm, bool multifile, const StdString &timeCounterName)
Initialisation ///.
Definition: onetcdf4.cpp:34
std::vector< StdString > getDimensionsIdList(const StdString *varname)
Definition: onetcdf4.cpp:197
void writeTimeAxisDataBounds(const CArray< double, 1 > &data, const StdString &name, bool collective, StdSize record, bool Isroot)
Definition: onetcdf4.cpp:598
int addDimension(const StdString &name, const StdSize size=(size_t)(-1))
Definition: onetcdf4.cpp:296
void close(void)
Definition: onetcdf4.cpp:87
void writeData(const CArray< T, ndim > &data, const StdString &name, bool collective, StdSize record, const std::vector< StdSize > *start=NULL, const std::vector< StdSize > *count=NULL)
Ecriture des données ///.
void getWriteDataInfos(const StdString &name, StdSize record, StdSize &array_size, std::vector< StdSize > &sstart, std::vector< StdSize > &scount, const std::vector< StdSize > *start, const std::vector< StdSize > *count)
Definition: onetcdf4.cpp:470
virtual void writeAxis_(CAxis *axis)=0
////////////////////// Déclarations ////////////////////// ///
Definition: array.hpp:25
int getDimension(const StdString &dimname)
Definition: onetcdf4.cpp:143
std::size_t StdSize
Definition: xios_spl.hpp:49
bool useClassicFormat
If true, NetCDF4 will use the classic NetCDF3 format.
Definition: onetcdf4.hpp:107
void setCurrentPath(const CONetCDF4Path &path)
Mutateurs ///.
Definition: onetcdf4.cpp:281
EDataOutputType type
Propriétés protégées ///.
Definition: data_output.hpp:64
void writeData_(int grpid, int varid, const std::vector< StdSize > &sstart, const std::vector< StdSize > &scount, T *data)
bool varExist(const StdString &varname)
Definition: onetcdf4.cpp:627
StdString getUnlimitedDimensionName(void)
Definition: onetcdf4.cpp:161
virtual void writeField_(CField *field)=0
Ecriture ///.
int getGroup(const CONetCDF4Path &path)
Definition: onetcdf4.cpp:117
int addVariable(const StdString &name, nc_type type, const std::vector< StdString > &dim, int compressionLevel=0)
Definition: onetcdf4.cpp:309
void setCompressionLevel(const StdString &varname, int compressionLevel)
Definition: onetcdf4.cpp:359
StdString timeCounterName
Definition: onetcdf4.hpp:129
CONetCDF4(const StdString &filename, bool append, bool useClassicFormat=false, bool useCFConvention=true, const MPI_Comm *comm=NULL, bool multifile=true, const StdString &timeCounterName="time_counter")
Constructeurs ///.
Definition: onetcdf4.cpp:15
int getUnlimitedDimension(void)
Definition: onetcdf4.cpp:153
void definition_start(void)
Definition: onetcdf4.cpp:96
void definition_end(void)
Test if the file was opened in append mode.
Definition: onetcdf4.cpp:103
int addGroup(const StdString &name)
Definition: onetcdf4.cpp:286