Ignore:
Timestamp:
05/26/15 16:13:48 (9 years ago)
Author:
rlacroix
Message:

Implement reading fields from NetCDF files.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • XIOS/trunk/src/input/inetcdf4.hpp

    r591 r599  
    1111 
    1212#ifndef UNLIMITED_DIM 
    13    #define UNLIMITED_DIM (size_t)(-1) 
    14 #endif  //UNLIMITED_DIM 
     13#define UNLIMITED_DIM (size_t)(-1) 
     14#endif  // UNLIMITED_DIM 
    1515 
    1616namespace xios 
    1717{ 
    18       /// ////////////////////// Déclarations ////////////////////// /// 
    19       typedef std::vector<StdString> CVarPath; 
    20  
    21       class CINetCDF4 
    22       { 
    23          public : 
    24  
    25             /// Constructeurs /// 
    26             CINetCDF4(void);                             // Not implemented. 
    27             CINetCDF4(const StdString & filename); 
    28             CINetCDF4(const CINetCDF4 & inetcdf4);       // Not implemented. 
    29             CINetCDF4(const CINetCDF4 * const inetcdf4); // Not implemented. 
    30  
    31          //------------------------------------------------------------- 
    32  
    33             /// Accesseurs /// 
    34             StdSize getNbOfTimestep(const CVarPath  * const path = NULL); 
    35  
    36             StdString getUnlimitedDimensionName(const CVarPath  * const path = NULL); 
    37  
    38             StdString getCoordinatesId(const StdString & name, 
    39                                        const CVarPath  * const path = NULL); 
    40  
    41             StdString getBoundsId(const StdString & name, 
    42                                   const CVarPath  * const path = NULL); 
    43  
    44             StdString getLonCoordName(const StdString & varname, 
    45                                       const CVarPath  * const path = NULL); 
    46             StdString getLatCoordName(const StdString & varname, 
    47                                        const CVarPath  * const path = NULL); 
    48             StdString getVertCoordName(const StdString & varname, 
    49                                        const CVarPath  * const path = NULL); 
    50  
    51             std::set<StdString> getCoordVariables(const CVarPath * const path = NULL); 
    52             std::set<StdString> getBoundVariables(const CVarPath * const path = NULL); 
    53  
    54             std::list<StdString> getGroups   (const CVarPath * const path = NULL); 
    55             std::list<StdString> getVariables(const CVarPath * const path = NULL); 
    56  
    57             std::list<StdString> getDataVariables(bool _is3D       = true, 
    58                                                   bool _isRecti    = true, 
    59                                                   bool _isCurvi    = true, 
    60                                                   bool _isUnstr    = true, 
    61                                                   bool _isCellData = true, 
    62                                                   bool _isTemporal = true, 
    63                                                   const CVarPath * const path = NULL); 
    64  
    65             std::list<StdString> getAttributes 
    66                                 (const StdString * const var  = NULL, 
    67                                  const CVarPath  * const path = NULL); 
    68  
    69             std::list<StdString> getDimensionsList 
    70                                 (const StdString * const var  = NULL, 
    71                                  const CVarPath  * const path = NULL); 
    72  
    73             std::list<StdString> getCoordinatesIdList(const StdString & name, 
    74                                                       const CVarPath  * const path = NULL); 
    75  
    76             std::map<StdString, StdSize> getDimensions (const StdString * const var  = NULL, 
    77                                                         const CVarPath  * const path = NULL); 
    78  
    79             StdSize getNbVertex(const StdString & name, 
    80                                 const CVarPath  * const path = NULL); 
    81          //------------------------------------------------------------- 
    82  
    83             template <class T> 
    84                T getMissingValue(const StdString & name, 
    85                                  const CVarPath  * const path = NULL); 
    86  
    87             template <class T> 
    88                T getAttributeValue(const StdString & name, 
    89                                    const StdString * const var  = NULL, 
    90                                    const CVarPath  * const path = NULL); 
    91  
    92             template <class T> 
    93                void getData(CArray<T, 1>& data, 
    94                             const StdString & var, 
    95                             const CVarPath  * const path = NULL, 
    96                             StdSize record   = UNLIMITED_DIM); 
    97  
    98          //------------------------------------------------------------- 
    99  
    100             /// Tests /// 
    101             bool hasMissingValue(const StdString & name, 
    102                                  const CVarPath  * const path = NULL); 
    103  
    104             bool hasAttribute(const StdString & name, 
    105                               const StdString * const var  = NULL, 
    106                               const CVarPath  * const path = NULL); 
    107  
    108             bool hasVariable(const StdString & name, 
    109                              const CVarPath  * const path = NULL); 
    110  
    111             bool hasCoordinates(const StdString & name, 
    112                                 const CVarPath  * const path = NULL); 
    113  
    114             bool hasTemporalDim(const CVarPath  * const path = NULL); 
    115  
    116             bool hasBounds(const StdString & name, 
    117                            const CVarPath  * const path = NULL); 
    118  
    119          //------------------------------------------------------------- 
    120  
    121             bool isBound(const StdString & name, 
    122                          const CVarPath  * const path = NULL); 
    123             bool isCoordinate(const StdString & name, 
    124                               const CVarPath  * const path = NULL); 
    125             bool isRectilinear(const StdString & name, 
    126                                const CVarPath  * const path = NULL); 
    127             bool isCurvilinear(const StdString & name, 
    128                                const CVarPath  * const path = NULL); 
    129             bool isUnknown(const StdString & name, 
    130                                const CVarPath  * const path = NULL); 
    131             bool isUnstructured(const StdString & name, 
    132                                 const CVarPath  * const path = NULL); 
    133  
    134             bool isTemporal(const StdString & name, 
    135                             const CVarPath  * const path = NULL); 
    136             bool is3Dim(const StdString & name, 
    137                         const CVarPath  * const path = NULL); 
    138             bool isCellGrid(const StdString & name, 
    139                             const CVarPath  * const path = NULL); 
    140  
    141          //------------------------------------------------------------- 
    142  
    143             /// Destructeur /// 
    144             virtual ~CINetCDF4(void); 
    145  
    146          protected : 
    147  
    148          //------------------------------------------------------------- 
    149  
    150             /// Accesseurs /// 
    151             int getGroup   (const CVarPath * const path = NULL); 
    152             int getVariable(const StdString & varname, 
    153                             const CVarPath * const path = NULL); 
    154             int getDimension(const StdString & dimname, 
    155                              const CVarPath  * const path = NULL); 
    156             int getUnlimitedDimension(const CVarPath  * const path = NULL); 
    157             int getAttributeId(const StdString & name, 
    158                                const StdString * const var  = NULL, 
    159                                const CVarPath  * const path = NULL); 
    160  
    161             std::pair<nc_type , StdSize> getAttribute(const StdString & attname, 
    162                                                       const StdString * const var  = NULL, 
    163                                                       const CVarPath  * const path = NULL); 
    164  
    165          //------------------------------------------------------------- 
    166  
    167             void getDataInfo(const StdString & var, const CVarPath  * const path, StdSize record, 
    168                              std::vector<StdSize> & start, std::vector<StdSize> & count, 
    169                              StdSize & array_size); 
    170  
    171          private : 
    172  
    173             /// Vérification des erreurs NetCDF /// 
    174             static void CheckError(int status); 
    175  
    176             int ncidp; // Identifiant de fichier netcdf. 
    177  
    178       }; // class CINetCDF4 
    179  
    180       ///-------------------------------------------------------------- 
    181       template <> 
    182          StdString CINetCDF4::getAttributeValue 
    183             (const StdString & name, const StdString * const var, 
    184                                      const CVarPath  * const path); 
    185  
    186       template <> 
    187          std::vector<double> CINetCDF4::getAttributeValue 
    188             (const StdString & name, const StdString * const var, 
    189                                      const CVarPath  * const path); 
    190  
    191       template <> 
    192          std::vector<float> CINetCDF4::getAttributeValue 
    193             (const StdString & name, const StdString * const var, 
    194                                      const CVarPath  * const path); 
    195  
    196       template <> 
    197          std::vector<int>  CINetCDF4::getAttributeValue 
    198             (const StdString & name, const StdString * const var, 
    199                                      const CVarPath  * const path); 
    200  
    201       template <> 
    202          std::vector<char>  CINetCDF4::getAttributeValue 
    203             (const StdString & name, const StdString * const var, 
    204                                      const CVarPath  * const path); 
    205  
    206       //--------------------------------------------------------------- 
    207       template <> 
    208          int CINetCDF4::getMissingValue 
    209             (const StdString & name, const CVarPath  * const path); 
    210  
    211       template <> 
    212          double CINetCDF4::getMissingValue 
    213             (const StdString & name, const CVarPath  * const path); 
    214  
    215       template <> 
    216          float CINetCDF4::getMissingValue 
    217             (const StdString & name, const CVarPath  * const path); 
    218  
    219       //--------------------------------------------------------------- 
    220       template <> 
    221          void CINetCDF4::getData(CArray<int, 1>& data, const StdString & var, 
    222                                  const CVarPath  * const path, StdSize record); 
    223  
    224       template <> 
    225          void CINetCDF4::getData(CArray<double, 1>& data, const StdString & var, 
    226                                  const CVarPath  * const path, StdSize record); 
    227  
    228       template <> 
    229          void CINetCDF4::getData(CArray<float, 1>& data, const StdString & var, 
    230                                  const CVarPath  * const path, StdSize record); 
    231       ///-------------------------------------------------------------- 
    232  
     18  typedef std::vector<StdString> CVarPath; 
     19 
     20  class CINetCDF4 
     21  { 
     22    public: 
     23      /// Constructors /// 
     24      CINetCDF4(const StdString& filename, const MPI_Comm* comm = NULL, bool multifile = true); 
     25      CINetCDF4(const CINetCDF4& inetcdf4);       // Not implemented. 
     26      CINetCDF4(const CINetCDF4* const inetcdf4); // Not implemented. 
     27 
     28      //------------------------------------------------------------- 
     29 
     30      /// Destructor /// 
     31      virtual ~CINetCDF4(void); 
     32 
     33      //------------------------------------------------------------- 
     34 
     35      void close(void); 
     36 
     37      //------------------------------------------------------------- 
     38 
     39      /// Getters /// 
     40      StdSize getNbOfTimestep(const CVarPath* const path = NULL); 
     41 
     42      StdString getUnlimitedDimensionName(const CVarPath* const path = NULL); 
     43 
     44      StdString getCoordinatesId(const StdString& name, const CVarPath* const path = NULL); 
     45 
     46      StdString getBoundsId(const StdString& name, const CVarPath* const path = NULL); 
     47 
     48      StdString getLonCoordName(const StdString& varname, const CVarPath* const path = NULL); 
     49      StdString getLatCoordName(const StdString& varname, const CVarPath* const path = NULL); 
     50      StdString getVertCoordName(const StdString& varname, const CVarPath* const path = NULL); 
     51 
     52      std::set<StdString> getCoordVariables(const CVarPath* const path = NULL); 
     53      std::set<StdString> getBoundVariables(const CVarPath* const path = NULL); 
     54 
     55      std::list<StdString> getGroups   (const CVarPath* const path = NULL); 
     56      std::list<StdString> getVariables(const CVarPath* const path = NULL); 
     57 
     58      std::list<StdString> getDataVariables(bool _is3D       = true, 
     59                                            bool _isRecti    = true, 
     60                                            bool _isCurvi    = true, 
     61                                            bool _isUnstr    = true, 
     62                                            bool _isCellData = true, 
     63                                            bool _isTemporal = true, 
     64                                            const CVarPath* const path = NULL); 
     65 
     66      std::list<StdString> getAttributes(const StdString* const var  = NULL, 
     67                                         const CVarPath* const path = NULL); 
     68 
     69      std::list<StdString> getDimensionsList(const StdString* const var  = NULL, 
     70                                             const CVarPath* const path = NULL); 
     71 
     72      std::list<StdString> getCoordinatesIdList(const StdString& name, 
     73                                                const CVarPath* const path = NULL); 
     74 
     75      std::map<StdString, StdSize> getDimensions(const StdString* const var  = NULL, 
     76                                                 const CVarPath* const path = NULL); 
     77 
     78      StdSize getNbVertex(const StdString& name, const CVarPath* const path = NULL); 
     79 
     80      //------------------------------------------------------------- 
     81 
     82      template <class T> 
     83      T getMissingValue(const StdString& name, const CVarPath* const path = NULL); 
     84 
     85      template <class T> 
     86      T getAttributeValue(const StdString& name, 
     87                          const StdString* const var  = NULL, 
     88                          const CVarPath* const path = NULL); 
     89 
     90      template <class T> 
     91      void getData(CArray<T, 1>& data, 
     92                   const StdString& var, 
     93                   const CVarPath* const path = NULL, 
     94                   StdSize record = UNLIMITED_DIM); 
     95 
     96      template <class T> 
     97      void getData(CArray<T, 1>& data, const StdString& var, 
     98                   bool collective, StdSize record, 
     99                   const std::vector<StdSize>* start = NULL, 
     100                   const std::vector<StdSize>* count = NULL); 
     101 
     102      //------------------------------------------------------------- 
     103 
     104      /// Tests /// 
     105      bool hasMissingValue(const StdString& name, const CVarPath* const path = NULL); 
     106 
     107      bool hasAttribute(const StdString& name, const StdString* const var  = NULL, const CVarPath* const path = NULL); 
     108 
     109      bool hasVariable(const StdString& name, const CVarPath* const path = NULL); 
     110 
     111      bool hasCoordinates(const StdString& name, const CVarPath* const path = NULL); 
     112 
     113      bool hasTemporalDim(const CVarPath* const path = NULL); 
     114 
     115      bool hasBounds(const StdString& name, const CVarPath* const path = NULL); 
     116 
     117      //------------------------------------------------------------- 
     118 
     119      bool isBound(const StdString& name, const CVarPath* const path = NULL); 
     120      bool isCoordinate(const StdString& name, const CVarPath* const path = NULL); 
     121      bool isRectilinear(const StdString& name, const CVarPath* const path = NULL); 
     122      bool isCurvilinear(const StdString& name, const CVarPath* const path = NULL); 
     123      bool isUnknown(const StdString& name, const CVarPath* const path = NULL); 
     124      bool isUnstructured(const StdString& name, const CVarPath* const path = NULL); 
     125 
     126      bool isTemporal(const StdString& name, const CVarPath* const path = NULL); 
     127      bool is3Dim(const StdString& name, const CVarPath* const path = NULL); 
     128      bool isCellGrid(const StdString& name, const CVarPath* const path = NULL); 
     129 
     130    protected: 
     131      /// Getters /// 
     132      int getGroup   (const CVarPath* const path = NULL); 
     133      int getVariable(const StdString& varname, const CVarPath* const path = NULL); 
     134      int getDimension(const StdString& dimname, const CVarPath* const path = NULL); 
     135      int getUnlimitedDimension(const CVarPath* const path = NULL); 
     136      int getAttributeId(const StdString& name, 
     137                         const StdString* const var = NULL, 
     138                         const CVarPath* const path = NULL); 
     139 
     140      std::pair<nc_type , StdSize> getAttribute(const StdString& attname, 
     141                                                const StdString* const var  = NULL, 
     142                                                const CVarPath* const path = NULL); 
     143 
     144      //------------------------------------------------------------- 
     145 
     146      void getDataInfo(const StdString& var, const CVarPath* const path, StdSize record, 
     147                       std::vector<StdSize>& sstart, std::vector<StdSize>& scount, StdSize& array_size, 
     148                       const std::vector<StdSize>* start = NULL, const std::vector<StdSize>* count = NULL); 
     149 
     150    private: 
     151      /// Vérification des erreurs NetCDF /// 
     152      static void CheckError(int status); 
     153 
     154      int ncidp; // Identifiant de fichier netcdf. 
     155      bool mpi; //< Whether parallel file access is used 
     156  }; // class CINetCDF4 
     157 
     158  ///-------------------------------------------------------------- 
     159 
     160  template <> 
     161  StdString CINetCDF4::getAttributeValue(const StdString& name, const StdString* const var, 
     162                                         const CVarPath* const path); 
     163 
     164  template <> 
     165  std::vector<double> CINetCDF4::getAttributeValue(const StdString& name, const StdString* const var, 
     166                                                   const CVarPath* const path); 
     167 
     168  template <> 
     169  std::vector<float> CINetCDF4::getAttributeValue(const StdString& name, const StdString* const var, 
     170                                                  const CVarPath* const path); 
     171 
     172  template <> 
     173  std::vector<int> CINetCDF4::getAttributeValue(const StdString& name, const StdString* const var, 
     174                                                const CVarPath* const path); 
     175 
     176  template <> 
     177  std::vector<char> CINetCDF4::getAttributeValue(const StdString& name, const StdString* const var, 
     178                                                 const CVarPath* const path); 
     179 
     180  //--------------------------------------------------------------- 
     181 
     182  template <> 
     183  int CINetCDF4::getMissingValue(const StdString& name, const CVarPath* const path); 
     184 
     185  template <> 
     186  double CINetCDF4::getMissingValue(const StdString& name, const CVarPath* const path); 
     187 
     188  template <> 
     189  float CINetCDF4::getMissingValue(const StdString& name, const CVarPath* const path); 
     190 
     191  //--------------------------------------------------------------- 
     192 
     193  template <> 
     194  void CINetCDF4::getData(CArray<int, 1>& data, const StdString& var, 
     195                          const CVarPath* const path, StdSize record); 
     196 
     197  template <> 
     198  void CINetCDF4::getData(CArray<double, 1>& data, const StdString& var, 
     199                          const CVarPath* const path, StdSize record); 
     200 
     201  template <> 
     202  void CINetCDF4::getData(CArray<float, 1>& data, const StdString& var, 
     203                          const CVarPath* const path, StdSize record); 
     204 
     205  template <> 
     206  void CINetCDF4::getData(CArray<double, 1>& data, const StdString& var, 
     207                          bool collective, StdSize record, 
     208                          const std::vector<StdSize>* start /*= NULL*/, 
     209                          const std::vector<StdSize>* count /*= NULL*/); 
    233210} // namespace xios 
    234211 
Note: See TracChangeset for help on using the changeset viewer.