XMLIOSERVER 0.4
Serveur d'Entrées/Sorties parallèles
|
00001 /* ************************************************************************** * 00002 * Copyright © IPSL/LSCE, XMLIOServer, Avril 2010 - Octobre 2011 * 00003 * ************************************************************************** */ 00004 00005 #ifndef __INETCDF4_HPP__ 00006 #define __INETCDF4_HPP__ 00007 00016 #ifndef __XIOS_NO_EXTERN 00017 00018 // M(essage) P(assing) I(nterface) headers 00019 #include <mpi.h> 00020 00021 // NetCDF headers 00022 #define MPI_INCLUDED 00023 #include <netcdf.h> 00024 00025 // C++ standard headers 00026 #include <vector> 00027 00028 // boost Headers 00029 #include <boost/multi_array.hpp> 00030 00031 #endif // __XIOS_NO_EXTERN 00032 00033 // XMLIOServer headers 00034 #include "xmlioserver_spl.hpp" 00035 00036 #ifndef UNLIMITED_DIM 00037 #define UNLIMITED_DIM (size_t)(-1) 00038 #endif //UNLIMITED_DIM 00039 00040 // ////////////////////////////// Déclarations ///////////////////////////// // 00041 00042 namespace xmlioserver 00043 { 00045 namespace io 00046 { 00051 class CINetCDF4 00052 { 00053 public : // Définition de type 00054 00056 typedef std::vector<std::string> CNetCDF4Path; 00057 00058 public : // Constructeurs 00059 00061 CINetCDF4(void); // NIY 00062 00067 explicit CINetCDF4(const std::string & _filename); 00068 00073 CINetCDF4(const CINetCDF4 & _inetcdf4);// NIY 00074 00079 CINetCDF4(const CINetCDF4 * const _inetcdf4_ptr); // NIY 00080 00081 public : // Destructeur 00082 00084 virtual ~CINetCDF4(void); 00085 00086 00087 00088 public : // Accesseur de parcours (d'exploration) 00089 00090 std::size_t getNbOfTimestep(void); 00091 00092 std::string getUnlimitedDimensionName(void); 00093 00094 std::map<std::string, std::size_t> 00095 getDimensions(const std::string * const _varname = NULL); 00096 00097 std::vector<std::string> getDimensionsIdList (const std::string * _varname); 00098 00099 std::vector<std::string> getAttributes(const std::string * const _varname = NULL); 00100 std::vector<std::string> getGroups (void); 00101 std::vector<std::string> getVariables(void); 00102 00103 public : // Mutateur 00104 00105 void setCurrentPath(const CNetCDF4Path & _path); 00106 00107 public : // Accesseurs 00108 00109 const CNetCDF4Path & getCurrentPath(void) const; 00110 00111 public : // Lecture 00112 00113 template <class DataType> 00114 void readAttribute 00115 (const std::string & _attname, 00116 std::vector<DataType> & _value, 00117 const std::string * _varname = NULL); 00118 00119 void readAttribute 00120 (const std::string & _attname, 00121 std::string & _value, 00122 const std::string * _varname = NULL); 00123 00124 template <class DataType, std::size_t ndim> 00125 void readData( boost::multi_array<DataType, ndim> & _data, 00126 const std::string & _varname, 00127 std::size_t _record = 0, 00128 const std::vector<std::size_t> * _start = NULL, 00129 const std::vector<std::size_t> * _count = NULL); 00130 00131 protected : // Accesseurs protégés 00132 00139 int getCurrentGroup(void); 00140 00155 int getGroup(const CNetCDF4Path & _path); 00156 00162 int getVariable(const std::string & _varname); 00163 00169 int getDimension(const std::string & _dimname); 00170 00176 std::vector<std::size_t> getDimensions(const std::string & _varname); 00177 00182 int getUnlimitedDimension(void); 00183 00189 bool varExist(const std::string & _varname); 00190 00191 private : // Obtention des informations de lecture 00192 00193 void getReadDataInfos(const std::string & _varname, 00194 std::size_t _record, 00195 std::size_t & _array_size, 00196 std::vector<std::size_t> & _sstart, 00197 std::vector<std::size_t> & _scount, 00198 const std::vector<std::size_t> * _start, 00199 const std::vector<std::size_t> * _count); 00200 00201 private : // Lecture privée 00202 00203 template <class DataType> 00204 void readData_(int _grpid, 00205 int _varid, 00206 const std::vector<std::size_t> & _sstart, 00207 const std::vector<std::size_t> & _scount, 00208 DataType * _data); 00209 00210 template <class DataType> 00211 void readAttribute_ 00212 (const std::string & _attname, 00213 DataType * _value, 00214 int _grpid, 00215 int _varid = NC_GLOBAL); 00216 00217 private : // Vérification des erreurs NetCDF 00218 00232 static void CheckError(int _status) throw (CException); 00233 00234 public : // Propriétés privées 00235 00236 std::vector<std::string> path; 00237 int ncidp; 00239 }; // class CINetCDF4 00240 } // namespace io 00241 00242 } // namespace xmlioserver 00243 00244 #endif // __INETCDF4_HPP__