source: XIOS/trunk/src/io/nc4_data_input.hpp @ 967

Last change on this file since 967 was 967, checked in by mhnguyen, 8 years ago

Ticket 106: Reading a scalar from file

+) Add method to read scalar value
+) Modify the way to send/receive scalar (and non-distributed) data

Test
+) On Curie
+) OK

  • 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: 3.8 KB
Line 
1#ifndef __XIOS_NC4_DATA_INPUT__
2#define __XIOS_NC4_DATA_INPUT__
3
4/// XIOS headers ///
5#include "xios_spl.hpp"
6#include "data_input.hpp"
7#include "inetcdf4.hpp"
8
9namespace xios
10{
11  class CDomain;
12  class CAxis;
13  class CScalar;
14
15  class CNc4DataInput
16    : protected CINetCDF4
17    , public virtual CDataInput
18  {
19  public:
20    /// Type definitions ///
21    typedef CINetCDF4  SuperClassWriter;
22    typedef CDataInput SuperClass;
23
24    /// Constructors ///
25    CNc4DataInput(const StdString& filename, MPI_Comm comm_file, bool multifile, bool isCollective = true,
26                  const StdString& timeCounterName = "time_counter");
27    CNc4DataInput(const CNc4DataInput& dataInput);       // Not implemented.
28    CNc4DataInput(const CNc4DataInput* const dataInput); // Not implemented.
29
30    /// Destructor ///
31    virtual ~CNc4DataInput(void);
32
33    /// Getters ///
34    const StdString& getFileName(void) const;
35
36  protected:
37    // Read methods
38    virtual StdSize getFieldNbRecords_(CField* field);
39    virtual void readFieldData_(CField* field);
40    virtual void readFieldAttributes_(CField* field, bool readAttributeValues);
41    virtual void closeFile_(void);
42
43  private:
44    void readDomainAttributesFromFile(CDomain* domain, std::list<std::pair<StdString, StdSize> >& dimSizeMap,
45                                      int elementPosition, const StdString& fieldId);
46    void readDomainAttributeValueFromFile(CDomain* domain, std::list<std::pair<StdString, StdSize> >& dimSizeMap,
47                                          int elementPosition, const StdString& fieldId);
48
49    void readAxisAttributesFromFile(CAxis* axis, std::list<std::pair<StdString, StdSize> >& dimSizeMap,
50                                    int elementPosition, const StdString& fieldId);
51    void readAxisAttributeValueFromFile(CAxis* axis, std::list<std::pair<StdString, StdSize> >& dimSizeMap,
52                                        int elementPosition, const StdString& fieldId);
53
54    void readScalarAttributesFromFile(CScalar* scalar, std::list<std::pair<StdString, StdSize> >& dimSizeMap,
55                                      int elementPosition, const StdString& fieldId);
56    void readScalarAttributeValueFromFile(CScalar* scalar, std::list<std::pair<StdString, StdSize> >& dimSizeMap,
57                                          int elementPosition, const StdString& fieldId);
58
59    template <typename T, int Ndim>
60    void readFieldVariableValue(CArray<T, Ndim>& var, const StdString& varId,
61                                const std::vector<StdSize>& nBegin,
62                                const std::vector<StdSize>& nSize,
63                                bool forceIndependent = false);
64
65  private:
66    std::set<StdString> readMetaDataDomains_, readValueDomains_;
67    std::set<StdString> readMetaDataAxis_, readValueAxis_;
68    std::set<StdString> readMetaDataScalar_, readValueScalar_;
69
70  private:
71    /// Private attributes ///
72    MPI_Comm comm_file;
73    const StdString filename;
74    bool isCollective;
75  }; // class CNc4DataInput
76
77template <typename T, int Ndim>
78void CNc4DataInput::readFieldVariableValue(CArray<T,Ndim>& var, const StdString& varId,
79                                           const std::vector<StdSize>& nBegin,
80                                           const std::vector<StdSize>& nSize,
81                                           bool forceIndependent)
82{
83  if (SuperClass::type==MULTI_FILE || !isCollective) return;
84
85  bool openCollective = isCollective;
86  if (forceIndependent) openCollective = !isCollective;
87  switch (SuperClass::type)
88  {
89    case MULTI_FILE:
90      ERROR("CINetCDF4::readFieldVariableValue(...)",
91            << "Only support attributes reading with one_file mode");
92      break;
93    case ONE_FILE:
94    {
95      SuperClassWriter::getData(var, varId, openCollective, 0, &nBegin, &nSize);
96      break;
97    }
98  }
99}
100} // namespace xios
101
102#endif //__XIOS_NC4_DATA_INPUT__
Note: See TracBrowser for help on using the repository browser.