Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : NCHelper.hpp
3 : : //
4 : : // Purpose : Climate NC file helper
5 : : //
6 : : // Creator : Danqing Wu
7 : : //-------------------------------------------------------------------------
8 : :
9 : : #ifndef NCHELPER_HPP
10 : : #define NCHELPER_HPP
11 : :
12 : : #include "ReadNC.hpp"
13 : :
14 : : #ifdef WIN32
15 : : #ifdef size_t
16 : : #undef size_t
17 : : #endif
18 : : #endif
19 : :
20 : : namespace moab
21 : : {
22 : :
23 : : //! Helper class to isolate reading of several different nc file formats
24 : : class NCHelper
25 : : {
26 : : public:
27 : 0 : NCHelper( ReadNC* readNC, int fileId, const FileOptions& opts, EntityHandle fileSet )
28 : : : _readNC( readNC ), _fileId( fileId ), _opts( opts ), _fileSet( fileSet ), nTimeSteps( 0 ), nLevels( 1 ),
29 [ # # ][ # # ]: 0 : tDim( -1 ), levDim( -1 )
[ # # ]
30 : : {
31 : 0 : }
32 [ # # ]: 0 : virtual ~NCHelper() {}
33 : :
34 : : //! Get appropriate helper instance for ReadNC class
35 : : static NCHelper* get_nc_helper( ReadNC* readNC, int fileId, const FileOptions& opts, EntityHandle fileSet );
36 : :
37 : : //! Interfaces to be implemented in child classes
38 : : virtual ErrorCode init_mesh_vals() = 0;
39 : : virtual ErrorCode check_existing_mesh() = 0;
40 : : virtual ErrorCode create_mesh( Range& faces ) = 0;
41 : : virtual ErrorCode read_variables( std::vector< std::string >& var_names, std::vector< int >& tstep_nums ) = 0;
42 : : virtual std::string get_mesh_type_name() = 0;
43 : :
44 : : //! Create NC conventional tags
45 : : ErrorCode create_conventional_tags( const std::vector< int >& tstep_nums );
46 : :
47 : : //! Update time tag values if timesteps spread across files
48 : : ErrorCode update_time_tag_vals();
49 : :
50 : : protected:
51 : : //! Separate set and non-set variables (common to scd mesh and ucd mesh)
52 : : ErrorCode read_variables_setup( std::vector< std::string >& var_names, std::vector< int >& tstep_nums,
53 : : std::vector< ReadNC::VarData >& vdatas, std::vector< ReadNC::VarData >& vsetdatas );
54 : :
55 : : //! Read set variables (common to scd mesh and ucd mesh)
56 : : ErrorCode read_variables_to_set( std::vector< ReadNC::VarData >& vdatas, std::vector< int >& tstep_nums );
57 : :
58 : : ErrorCode read_coordinate( const char* var_name, int lmin, int lmax, std::vector< double >& cvals );
59 : :
60 : : ErrorCode get_tag_to_set( ReadNC::VarData& var_data, int tstep_num, Tag& tagh );
61 : :
62 : : ErrorCode get_tag_to_nonset( ReadNC::VarData& var_data, int tstep_num, Tag& tagh, int num_lev );
63 : :
64 : : //! Create a character string attString of attMap. with '\0'
65 : : //! terminating each attribute name, ';' separating the data type
66 : : //! and value, and ';' separating one name/data type/value from
67 : : //! the next'. attLen stores the end position for each name/data
68 : : //! type/ value.
69 : : ErrorCode create_attrib_string( const std::map< std::string, ReadNC::AttData >& attMap, std::string& attString,
70 : : std::vector< int >& attLen );
71 : :
72 : : //! For a dimension that does not have a corresponding coordinate variable (e.g. ncol for
73 : : //! HOMME), create a dummy variable with a sparse tag to store the dimension length
74 : : ErrorCode create_dummy_variables();
75 : :
76 : : private:
77 : : //! Used by read_variables_to_set()
78 : : ErrorCode read_variables_to_set_allocate( std::vector< ReadNC::VarData >& vdatas, std::vector< int >& tstep_nums );
79 : :
80 : : protected:
81 : : //! Allow NCHelper to directly access members of ReadNC
82 : : ReadNC* _readNC;
83 : :
84 : : //! Cache some information from ReadNC
85 : : int _fileId;
86 : : const FileOptions& _opts;
87 : : EntityHandle _fileSet;
88 : :
89 : : //! Dimensions of time and level
90 : : int nTimeSteps, nLevels;
91 : :
92 : : //! Values for time and level
93 : : std::vector< double > tVals, levVals;
94 : :
95 : : //! Dimension numbers for time and level
96 : : int tDim, levDim;
97 : :
98 : : //! Ignored variables
99 : : std::set< std::string > ignoredVarNames;
100 : :
101 : : //! Dummy variables
102 : : std::set< std::string > dummyVarNames;
103 : : };
104 : :
105 : : //! Child helper class for scd mesh, e.g. CAM_EL or CAM_FV
106 : : class ScdNCHelper : public NCHelper
107 : : {
108 : : public:
109 : 0 : ScdNCHelper( ReadNC* readNC, int fileId, const FileOptions& opts, EntityHandle fileSet )
110 [ # # ][ # # ]: 0 : : NCHelper( readNC, fileId, opts, fileSet ), iDim( -1 ), jDim( -1 ), iCDim( -1 ), jCDim( -1 )
[ # # ][ # # ]
111 : : {
112 [ # # ]: 0 : for( unsigned int i = 0; i < 6; i++ )
113 : : {
114 : 0 : gDims[i] = -1;
115 : 0 : lDims[i] = -1;
116 : 0 : gCDims[i] = -1;
117 : 0 : lCDims[i] = -1;
118 : : }
119 : :
120 : 0 : locallyPeriodic[0] = locallyPeriodic[1] = locallyPeriodic[2] = 0;
121 : 0 : globallyPeriodic[0] = globallyPeriodic[1] = globallyPeriodic[2] = 0;
122 : 0 : }
123 [ # # ]: 0 : virtual ~ScdNCHelper() {}
124 : :
125 : : private:
126 : : //! Implementation of NCHelper::check_existing_mesh()
127 : : virtual ErrorCode check_existing_mesh();
128 : : //! Implementation of NCHelper::create_mesh()
129 : : virtual ErrorCode create_mesh( Range& faces );
130 : : //! Implementation of NCHelper::read_variables()
131 : : virtual ErrorCode read_variables( std::vector< std::string >& var_names, std::vector< int >& tstep_nums );
132 : :
133 : : //! Read non-set variables for scd mesh
134 : : ErrorCode read_scd_variables_to_nonset_allocate( std::vector< ReadNC::VarData >& vdatas,
135 : : std::vector< int >& tstep_nums );
136 : : ErrorCode read_scd_variables_to_nonset( std::vector< ReadNC::VarData >& vdatas, std::vector< int >& tstep_nums );
137 : :
138 : : //! Create COORDS tag for quads coordinate
139 : : ErrorCode create_quad_coordinate_tag();
140 : :
141 : : template < typename T >
142 : 0 : void kji_to_jik( size_t ni, size_t nj, size_t nk, void* dest, T* source )
143 : : {
144 : 0 : size_t nik = ni * nk, nij = ni * nj;
145 : 0 : T* tmp_data = reinterpret_cast< T* >( dest );
146 [ # # ][ # # ]: 0 : for( std::size_t j = 0; j != nj; j++ )
[ # # ]
147 [ # # ][ # # ]: 0 : for( std::size_t i = 0; i != ni; i++ )
[ # # ]
148 [ # # ][ # # ]: 0 : for( std::size_t k = 0; k != nk; k++ )
[ # # ]
149 : 0 : tmp_data[j * nik + i * nk + k] = source[k * nij + j * ni + i];
150 : 0 : }
151 : :
152 : : protected:
153 : : //! Dimensions of global grid in file
154 : : int gDims[6];
155 : :
156 : : //! Dimensions of my local part of grid
157 : : int lDims[6];
158 : :
159 : : //! Center dimensions of global grid in file
160 : : int gCDims[6];
161 : :
162 : : //! Center dimensions of my local part of grid
163 : : int lCDims[6];
164 : :
165 : : //! Values for i/j
166 : : std::vector< double > ilVals, jlVals;
167 : :
168 : : //! Center values for i/j
169 : : std::vector< double > ilCVals, jlCVals;
170 : :
171 : : //! Dimension numbers for i/j
172 : : int iDim, jDim;
173 : :
174 : : //! Center dimension numbers for i/j
175 : : int iCDim, jCDim;
176 : :
177 : : //! Whether mesh is locally periodic in i or j or k
178 : : int locallyPeriodic[3];
179 : :
180 : : //! Whether mesh is globally periodic in i or j or k
181 : : int globallyPeriodic[3];
182 : : };
183 : :
184 : : //! Child helper class for ucd mesh, e.g. CAM_SE (HOMME) or MPAS
185 : : class UcdNCHelper : public NCHelper
186 : : {
187 : : public:
188 : 0 : UcdNCHelper( ReadNC* readNC, int fileId, const FileOptions& opts, EntityHandle fileSet )
189 : : : NCHelper( readNC, fileId, opts, fileSet ), nCells( 0 ), nEdges( 0 ), nVertices( 0 ), nLocalCells( 0 ),
190 [ # # ][ # # ]: 0 : nLocalEdges( 0 ), nLocalVertices( 0 ), cDim( -1 ), eDim( -1 ), vDim( -1 )
[ # # ][ # # ]
[ # # ][ # # ]
191 : : {
192 : 0 : }
193 [ # # ]: 0 : virtual ~UcdNCHelper() {}
194 : :
195 : : private:
196 : : //! Implementation of NCHelper::read_variables()
197 : : virtual ErrorCode read_variables( std::vector< std::string >& var_names, std::vector< int >& tstep_nums );
198 : :
199 : : //! Read non-set variables for ucd mesh (implemented differently in child classes)
200 : : virtual ErrorCode read_ucd_variables_to_nonset_allocate( std::vector< ReadNC::VarData >& vdatas,
201 : : std::vector< int >& tstep_nums ) = 0;
202 : : #ifdef MOAB_HAVE_PNETCDF
203 : : virtual ErrorCode read_ucd_variables_to_nonset_async( std::vector< ReadNC::VarData >& vdatas,
204 : : std::vector< int >& tstep_nums ) = 0;
205 : : #else
206 : : virtual ErrorCode read_ucd_variables_to_nonset( std::vector< ReadNC::VarData >& vdatas,
207 : : std::vector< int >& tstep_nums ) = 0;
208 : : #endif
209 : :
210 : : protected:
211 : : //! This version takes as input the moab range, from which we actually need just the
212 : : //! size of each sequence, for a proper transpose of the data
213 : : template < typename T >
214 : 0 : void kji_to_jik_stride( size_t, size_t nj, size_t nk, void* dest, T* source, Range& localGid )
215 : : {
216 : 0 : std::size_t idxInSource = 0; // Position of the start of the stride
217 : : // For each subrange, we will transpose a matrix of size
218 : : // subrange*nj*nk (subrange takes the role of ni)
219 : 0 : T* tmp_data = reinterpret_cast< T* >( dest );
220 [ # # ][ # # ]: 0 : for( Range::pair_iterator pair_iter = localGid.pair_begin(); pair_iter != localGid.pair_end(); ++pair_iter )
[ # # ][ # # ]
[ # # ]
221 : : {
222 [ # # ][ # # ]: 0 : std::size_t size_range = pair_iter->second - pair_iter->first + 1;
223 : 0 : std::size_t nik = size_range * nk, nij = size_range * nj;
224 [ # # ]: 0 : for( std::size_t j = 0; j != nj; j++ )
225 [ # # ]: 0 : for( std::size_t i = 0; i != size_range; i++ )
226 [ # # ]: 0 : for( std::size_t k = 0; k != nk; k++ )
227 : 0 : tmp_data[idxInSource + j * nik + i * nk + k] =
228 : 0 : source[idxInSource + k * nij + j * size_range + i];
229 : 0 : idxInSource += ( size_range * nj * nk );
230 : : }
231 : 0 : }
232 : :
233 : : //! Dimensions of global grid in file
234 : : int nCells;
235 : : int nEdges;
236 : : int nVertices;
237 : :
238 : : //! Dimensions of my local part of grid
239 : : int nLocalCells;
240 : : int nLocalEdges;
241 : : int nLocalVertices;
242 : :
243 : : //! Coordinate values for vertices
244 : : std::vector< double > xVertVals, yVertVals, zVertVals;
245 : :
246 : : //! Dimension numbers for nCells, nEdges and nVertices
247 : : int cDim, eDim, vDim;
248 : :
249 : : //! Local global ID for cells, edges and vertices
250 : : Range localGidCells, localGidEdges, localGidVerts;
251 : : };
252 : :
253 : : } // namespace moab
254 : :
255 : : #endif
|