Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : ReadNC.hpp
3 : : //
4 : : // Purpose : Climate NC file reader
5 : : //
6 : : // Creator : Tim Tautges
7 : : //-------------------------------------------------------------------------
8 : :
9 : : #ifndef READNC_HPP
10 : : #define READNC_HPP
11 : :
12 : : #ifndef IS_BUILDING_MB
13 : : #error "ReadNC.hpp isn't supposed to be included into an application"
14 : : #endif
15 : :
16 : : #include <vector>
17 : : #include <map>
18 : : #include <set>
19 : : #include <string>
20 : :
21 : : #include "moab/ReaderIface.hpp"
22 : : #include "moab/ScdInterface.hpp"
23 : : #include "DebugOutput.hpp"
24 : :
25 : : #ifdef MOAB_HAVE_MPI
26 : : #include "moab_mpi.h"
27 : : #include "moab/ParallelComm.hpp"
28 : : #endif
29 : :
30 : : #ifdef MOAB_HAVE_PNETCDF
31 : : #include "pnetcdf.h"
32 : : #define NCFUNC( func ) ncmpi_##func
33 : :
34 : : //! Collective I/O mode get
35 : : #define NCFUNCAG( func ) ncmpi_get##func##_all
36 : :
37 : : //! Independent I/O mode get
38 : : #define NCFUNCG( func ) ncmpi_get##func
39 : :
40 : : //! Nonblocking get (request aggregation), used so far only for ucd mesh
41 : : #define NCFUNCREQG( func ) ncmpi_iget##func
42 : :
43 : : #define NCDF_SIZE MPI_Offset
44 : : #define NCDF_DIFF MPI_Offset
45 : : #else
46 : : #include "netcdf.h"
47 : : #define NCFUNC( func ) nc_##func
48 : : #define NCFUNCAG( func ) nc_get##func
49 : : #define NCFUNCG( func ) nc_get##func
50 : : #define NCDF_SIZE size_t
51 : : #define NCDF_DIFF ptrdiff_t
52 : : #endif
53 : :
54 : : namespace moab
55 : : {
56 : :
57 : : class ReadUtilIface;
58 : : class ScdInterface;
59 : : class NCHelper;
60 : :
61 : : //! Output Exodus File for VERDE
62 : : class ReadNC : public ReaderIface
63 : : {
64 : : friend class NCHelper;
65 : : friend class ScdNCHelper;
66 : : friend class UcdNCHelper;
67 : : friend class NCHelperEuler;
68 : : friend class NCHelperFV;
69 : : friend class NCHelperDomain;
70 : : friend class NCHelperHOMME;
71 : : friend class NCHelperMPAS;
72 : : friend class NCHelperGCRM;
73 : :
74 : : public:
75 : : static ReaderIface* factory( Interface* );
76 : :
77 : : //! Load an NC file
78 : : ErrorCode load_file( const char* file_name, const EntityHandle* file_set, const FileOptions& opts,
79 : : const SubsetList* subset_list = 0, const Tag* file_id_tag = 0 );
80 : :
81 : : //! Constructor
82 : : ReadNC( Interface* impl = NULL );
83 : :
84 : : //! Destructor
85 : : virtual ~ReadNC();
86 : :
87 : : virtual ErrorCode read_tag_values( const char* file_name, const char* tag_name, const FileOptions& opts,
88 : : std::vector< int >& tag_values_out, const SubsetList* subset_list = 0 );
89 : :
90 : : //! ENTLOCNSEDGE for north/south edge
91 : : //! ENTLOCWEEDGE for west/east edge
92 : : enum EntityLocation
93 : : {
94 : : ENTLOCVERT = 0,
95 : : ENTLOCNSEDGE,
96 : : ENTLOCEWEDGE,
97 : : ENTLOCFACE,
98 : : ENTLOCSET,
99 : : ENTLOCEDGE,
100 : : ENTLOCREGION
101 : : };
102 : :
103 : : private:
104 : 0 : class AttData
105 : : {
106 : : public:
107 : 0 : AttData() : attId( -1 ), attLen( 0 ), attVarId( -2 ) {}
108 : : int attId;
109 : : NCDF_SIZE attLen;
110 : : int attVarId;
111 : : nc_type attDataType;
112 : : std::string attName;
113 : : };
114 : :
115 [ # # ][ # # ]: 0 : class VarData
[ # # ][ # # ]
[ # # ][ # # ]
116 : : {
117 : : public:
118 [ # # ][ # # ]: 0 : VarData() : varId( -1 ), numAtts( -1 ), entLoc( ENTLOCSET ), numLev( 0 ), sz( 0 ), has_tsteps( false ) {}
[ # # ][ # # ]
[ # # ][ # # ]
119 : : int varId;
120 : : int numAtts;
121 : : nc_type varDataType;
122 : : std::vector< int > varDims; // The dimension indices making up this multi-dimensional variable
123 : : std::map< std::string, AttData > varAtts;
124 : : std::string varName;
125 : : std::vector< Tag > varTags; // Tags created for this variable, e.g. one tag per timestep
126 : : std::vector< void* > varDatas;
127 : : std::vector< NCDF_SIZE > readStarts; // Starting index for reading data values along each dimension
128 : : std::vector< NCDF_SIZE > readCounts; // Number of data values to be read along each dimension
129 : : int entLoc;
130 : : int numLev;
131 : : int sz;
132 : : bool has_tsteps; // Indicate whether timestep numbers are appended to tag names
133 : : };
134 : :
135 : : ReadUtilIface* readMeshIface;
136 : :
137 : : //! Read the header information
138 : : ErrorCode read_header();
139 : :
140 : : //! Get all global attributes in the file
141 : : ErrorCode get_attributes( int var_id, int num_atts, std::map< std::string, AttData >& atts,
142 : : const char* prefix = "" );
143 : :
144 : : //! Get all dimensions in the file
145 : : ErrorCode get_dimensions( int file_id, std::vector< std::string >& dim_names, std::vector< int >& dim_lens );
146 : :
147 : : //! Get the variable names and other info defined for this file
148 : : ErrorCode get_variables();
149 : :
150 : : ErrorCode parse_options( const FileOptions& opts, std::vector< std::string >& var_names,
151 : : std::vector< int >& tstep_nums, std::vector< double >& tstep_vals );
152 : :
153 : : //------------member variables ------------//
154 : :
155 : : //! Interface instance
156 : : Interface* mbImpl;
157 : :
158 : : //! File name
159 : : std::string fileName;
160 : :
161 : : //! File numbers assigned by netcdf
162 : : int fileId;
163 : :
164 : : //! Dimension names
165 : : std::vector< std::string > dimNames;
166 : :
167 : : //! Dimension lengths
168 : : std::vector< int > dimLens;
169 : :
170 : : //! Global attribs
171 : : std::map< std::string, AttData > globalAtts;
172 : :
173 : : //! Variable info
174 : : std::map< std::string, VarData > varInfo;
175 : :
176 : : //! Cached tags for reading. Note that all these tags are defined when the
177 : : //! core is initialized.
178 : : Tag mGlobalIdTag;
179 : :
180 : : //! This is a pointer to the file id tag that is passed from ReadParallel
181 : : //! it gets deleted at the end of resolve sharing, but it will have same data
182 : : //! as the global id tag
183 : : //! global id tag is preserved, and is needed later on.
184 : : const Tag* mpFileIdTag;
185 : :
186 : : //! Debug stuff
187 : : DebugOutput dbgOut;
188 : :
189 : : //! Are we reading in parallel?
190 : : bool isParallel;
191 : :
192 : : //! Partitioning method
193 : : int partMethod;
194 : :
195 : : //! Scd interface
196 : : ScdInterface* scdi;
197 : :
198 : : //! Parallel data object, to be cached with ScdBox
199 : : ScdParData parData;
200 : :
201 : : #ifdef MOAB_HAVE_MPI
202 : : ParallelComm* myPcomm;
203 : : #endif
204 : :
205 : : //! Read options
206 : : bool noMesh;
207 : : bool noVars;
208 : : bool spectralMesh;
209 : : bool noMixedElements;
210 : : bool noEdges;
211 : : int gatherSetRank;
212 : : int tStepBase;
213 : : int trivialPartitionShift;
214 : :
215 : : //! Helper class instance
216 : : NCHelper* myHelper;
217 : : };
218 : :
219 : : } // namespace moab
220 : :
221 : : #endif
|