XMLIOSERVER 0.4
Serveur d'Entrées/Sorties parallèles
inetcdf4.hpp
Aller à la documentation de ce fichier.
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__
 Tout Classes Espaces de nommage Fichiers Fonctions Variables Définition de type Énumérations Valeurs énumérées Amis Macros