Helper class to isolate reading of several different nc file formats. More...
#include <NCHelper.hpp>
Classes | |
class | Node3D |
Public Member Functions | |
NCHelper (ReadNC *readNC, int fileId, const FileOptions &opts, EntityHandle fileSet) | |
virtual | ~NCHelper () |
virtual ErrorCode | init_mesh_vals ()=0 |
Interfaces to be implemented in child classes. More... | |
virtual ErrorCode | check_existing_mesh ()=0 |
virtual ErrorCode | create_mesh (Range &faces)=0 |
virtual ErrorCode | read_variables (std::vector< std::string > &var_names, std::vector< int > &tstep_nums)=0 |
virtual std::string | get_mesh_type_name ()=0 |
ErrorCode | create_conventional_tags (const std::vector< int > &tstep_nums) |
Create NC conventional tags. More... | |
ErrorCode | update_time_tag_vals () |
Update time tag values if timesteps spread across files. More... | |
Static Public Member Functions | |
static ReadNC::NCFormatType | get_nc_format (ReadNC *readNC, int fileId) |
Get appropriate format to read the file. More... | |
static std::string | get_default_ncformat_options (ReadNC::NCFormatType format) |
Get appropriate format to read the file. More... | |
static NCHelper * | get_nc_helper (ReadNC *readNC, int fileId, const FileOptions &opts, EntityHandle fileSet) |
Get appropriate helper instance for ReadNC class. More... | |
Protected Member Functions | |
ErrorCode | read_variables_setup (std::vector< std::string > &var_names, std::vector< int > &tstep_nums, std::vector< ReadNC::VarData > &vdatas, std::vector< ReadNC::VarData > &vsetdatas) |
Separate set and non-set variables (common to scd mesh and ucd mesh) More... | |
ErrorCode | read_variables_to_set (std::vector< ReadNC::VarData > &vdatas, std::vector< int > &tstep_nums) |
Read set variables (common to scd mesh and ucd mesh) More... | |
ErrorCode | read_coordinate (const char *var_name, int lmin, int lmax, std::vector< double > &cvals) |
ErrorCode | get_tag_to_set (ReadNC::VarData &var_data, int tstep_num, Tag &tagh) |
ErrorCode | get_tag_to_nonset (ReadNC::VarData &var_data, int tstep_num, Tag &tagh, int num_lev) |
ErrorCode | create_attrib_string (const std::map< std::string, ReadNC::AttData > &attMap, std::string &attString, std::vector< int > &attLen) |
Create a character string attString of attMap. with '\0' terminating each attribute name, ';' separating the data type and value, and ';' separating one name/data type/value from the next'. attLen stores the end position for each name/data type/ value. More... | |
ErrorCode | create_dummy_variables () |
For a dimension that does not have a corresponding coordinate variable (e.g. ncol for HOMME), create a dummy variable with a sparse tag to store the dimension length. More... | |
Protected Attributes | |
ReadNC * | _readNC |
Allow NCHelper to directly access members of ReadNC. More... | |
int | _fileId |
Cache some information from ReadNC. More... | |
const FileOptions & | _opts |
EntityHandle | _fileSet |
int | nTimeSteps |
Dimensions of time and level. More... | |
int | nLevels |
std::vector< double > | tVals |
Values for time and level. More... | |
std::vector< double > | levVals |
int | tDim |
Dimension numbers for time and level. More... | |
int | levDim |
std::set< std::string > | ignoredVarNames |
Ignored variables. More... | |
std::set< std::string > | dummyVarNames |
Dummy variables. More... | |
Private Member Functions | |
ErrorCode | read_variables_to_set_allocate (std::vector< ReadNC::VarData > &vdatas, std::vector< int > &tstep_nums) |
Used by read_variables_to_set() More... | |
Helper class to isolate reading of several different nc file formats.
Definition at line 24 of file NCHelper.hpp.
|
inline |
Definition at line 27 of file NCHelper.hpp.
28 : _readNC( readNC ), _fileId( fileId ), _opts( opts ), _fileSet( fileSet ), nTimeSteps( 0 ), nLevels( 1 ), 29 tDim( -1 ), levDim( -1 ) 30 { 31 }
|
inlinevirtual |
Definition at line 32 of file NCHelper.hpp.
32 {}
|
pure virtual |
Implemented in moab::NCHelperMPAS, moab::NCHelperHOMME, moab::NCHelperGCRM, moab::NCHelperESMF, and moab::ScdNCHelper.
Referenced by moab::ReadNC::load_file().
|
protected |
Create a character string attString of attMap. with '\0' terminating each attribute name, ';' separating the data type and value, and ';' separating one name/data type/value from the next'. attLen stores the end position for each name/data type/ value.
Definition at line 734 of file NCHelper.cpp.
737 {
738 int success;
739 std::stringstream ssAtt;
740 unsigned int sz = 0;
741 std::map< std::string, ReadNC::AttData >::const_iterator attIt = attMap.begin();
742 for( ; attIt != attMap.end(); ++attIt )
743 {
744 ssAtt << attIt->second.attName;
745 ssAtt << '\0';
746 void* attData = NULL;
747 switch( attIt->second.attDataType )
748 {
749 case NC_BYTE:
750 case NC_CHAR:
751 sz = attIt->second.attLen;
752 attData = (char*)malloc( sz );
753 success = NCFUNC( get_att_text )( _fileId, attIt->second.attVarId, attIt->second.attName.c_str(),
754 (char*)attData );
755 if( success )
756 MB_SET_ERR( MB_FAILURE, "Failed to read byte/char data for attribute " << attIt->second.attName );
757 ssAtt << "char;";
758 break;
759 case NC_SHORT:
760 sz = attIt->second.attLen * sizeof( short );
761 attData = (short*)malloc( sz );
762 success = NCFUNC( get_att_short )( _fileId, attIt->second.attVarId, attIt->second.attName.c_str(),
763 (short*)attData );
764 if( success )
765 MB_SET_ERR( MB_FAILURE, "Failed to read short data for attribute " << attIt->second.attName );
766 ssAtt << "short;";
767 break;
768 case NC_INT:
769 sz = attIt->second.attLen * sizeof( int );
770 attData = (int*)malloc( sz );
771 success = NCFUNC( get_att_int )( _fileId, attIt->second.attVarId, attIt->second.attName.c_str(),
772 (int*)attData );
773 if( success )
774 MB_SET_ERR( MB_FAILURE, "Failed to read int data for attribute " << attIt->second.attName );
775 ssAtt << "int;";
776 break;
777 case NC_INT64: // be careful here
778 sz = attIt->second.attLen * sizeof( long );
779 attData = (long*)malloc( sz );
780 success = NCFUNC( get_att_long )( _fileId, attIt->second.attVarId, attIt->second.attName.c_str(),
781 (long*)attData );
782 if( success )
783 MB_SET_ERR( MB_FAILURE, "Failed to read int data for attribute " << attIt->second.attName );
784 ssAtt << "long;";
785 break;
786 case NC_FLOAT:
787 sz = attIt->second.attLen * sizeof( float );
788 attData = (float*)malloc( sz );
789 success = NCFUNC( get_att_float )( _fileId, attIt->second.attVarId, attIt->second.attName.c_str(),
790 (float*)attData );
791 if( success )
792 MB_SET_ERR( MB_FAILURE, "Failed to read float data for attribute " << attIt->second.attName );
793 ssAtt << "float;";
794 break;
795 case NC_DOUBLE:
796 sz = attIt->second.attLen * sizeof( double );
797 attData = (double*)malloc( sz );
798 success = NCFUNC( get_att_double )( _fileId, attIt->second.attVarId, attIt->second.attName.c_str(),
799 (double*)attData );
800 if( success )
801 MB_SET_ERR( MB_FAILURE, "Failed to read double data for attribute " << attIt->second.attName );
802 ssAtt << "double;";
803 break;
804 default:
805 MB_SET_ERR( MB_FAILURE, "Unexpected data type for attribute " << attIt->second.attName );
806 }
807 char* tmpc = (char*)attData;
808 for( unsigned int counter = 0; counter != sz; ++counter )
809 ssAtt << tmpc[counter];
810 free( attData );
811 ssAtt << ';';
812 attLen.push_back( ssAtt.str().size() - 1 );
813 }
814 attVal = ssAtt.str();
815
816 return MB_SUCCESS;
817 }
References _fileId, MB_SET_ERR, MB_SUCCESS, and NCFUNC.
Referenced by create_conventional_tags().
ErrorCode moab::NCHelper::create_conventional_tags | ( | const std::vector< int > & | tstep_nums | ) |
Create NC conventional tags.
Definition at line 120 of file NCHelper.cpp.
121 {
122 Interface*& mbImpl = _readNC->mbImpl;
123 std::vector< std::string >& dimNames = _readNC->dimNames;
124 std::vector< int >& dimLens = _readNC->dimLens;
125 std::map< std::string, ReadNC::AttData >& globalAtts = _readNC->globalAtts;
126 std::map< std::string, ReadNC::VarData >& varInfo = _readNC->varInfo;
127 DebugOutput& dbgOut = _readNC->dbgOut;
128 int& partMethod = _readNC->partMethod;
129 ScdInterface* scdi = _readNC->scdi;
130
131 ErrorCode rval;
132 std::string tag_name;
133
134 // <__NUM_DIMS>
135 Tag numDimsTag = 0;
136 tag_name = "__NUM_DIMS";
137 int numDims = dimNames.size();
138 rval = mbImpl->tag_get_handle( tag_name.c_str(), 1, MB_TYPE_INTEGER, numDimsTag, MB_TAG_SPARSE | MB_TAG_CREAT );MB_CHK_SET_ERR( rval, "Trouble creating conventional tag " << tag_name );
139 rval = mbImpl->tag_set_data( numDimsTag, &_fileSet, 1, &numDims );MB_CHK_SET_ERR( rval, "Trouble setting data to conventional tag " << tag_name );
140 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
141
142 // <__NUM_VARS>
143 Tag numVarsTag = 0;
144 tag_name = "__NUM_VARS";
145 int numVars = varInfo.size();
146 rval = mbImpl->tag_get_handle( tag_name.c_str(), 1, MB_TYPE_INTEGER, numVarsTag, MB_TAG_SPARSE | MB_TAG_CREAT );MB_CHK_SET_ERR( rval, "Trouble creating conventional tag " << tag_name );
147 rval = mbImpl->tag_set_data( numVarsTag, &_fileSet, 1, &numVars );MB_CHK_SET_ERR( rval, "Trouble setting data to conventional tag " << tag_name );
148 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
149
150 // <__DIM_NAMES>
151 Tag dimNamesTag = 0;
152 tag_name = "__DIM_NAMES";
153 std::string dimnames;
154 unsigned int dimNamesSz = dimNames.size();
155 for( unsigned int i = 0; i != dimNamesSz; i++ )
156 {
157 dimnames.append( dimNames[i] );
158 dimnames.push_back( '\0' );
159 }
160 int dimnamesSz = dimnames.size();
161 rval = mbImpl->tag_get_handle( tag_name.c_str(), 0, MB_TYPE_OPAQUE, dimNamesTag,
162 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN );MB_CHK_SET_ERR( rval, "Trouble creating conventional tag " << tag_name );
163 const void* ptr = dimnames.c_str();
164 rval = mbImpl->tag_set_by_ptr( dimNamesTag, &_fileSet, 1, &ptr, &dimnamesSz );MB_CHK_SET_ERR( rval, "Trouble setting data to conventional tag " << tag_name );
165 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
166
167 // <__DIM_LENS>
168 Tag dimLensTag = 0;
169 tag_name = "__DIM_LENS";
170 int dimLensSz = dimLens.size();
171 rval = mbImpl->tag_get_handle( tag_name.c_str(), 0, MB_TYPE_INTEGER, dimLensTag,
172 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN );MB_CHK_SET_ERR( rval, "Trouble creating conventional tag " << tag_name );
173 ptr = &( dimLens[0] );
174 rval = mbImpl->tag_set_by_ptr( dimLensTag, &_fileSet, 1, &ptr, &dimLensSz );MB_CHK_SET_ERR( rval, "Trouble setting data to conventional tag " << tag_name );
175 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
176
177 // <__VAR_NAMES>
178 Tag varNamesTag = 0;
179 tag_name = "__VAR_NAMES";
180 std::string varnames;
181 std::map< std::string, ReadNC::VarData >::iterator mapIter;
182 for( mapIter = varInfo.begin(); mapIter != varInfo.end(); ++mapIter )
183 {
184 varnames.append( mapIter->first );
185 varnames.push_back( '\0' );
186 }
187 int varnamesSz = varnames.size();
188 rval = mbImpl->tag_get_handle( tag_name.c_str(), 0, MB_TYPE_OPAQUE, varNamesTag,
189 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN );MB_CHK_SET_ERR( rval, "Trouble creating conventional tag " << tag_name );
190 ptr = varnames.c_str();
191 rval = mbImpl->tag_set_by_ptr( varNamesTag, &_fileSet, 1, &ptr, &varnamesSz );MB_CHK_SET_ERR( rval, "Trouble setting data to conventional tag " << tag_name );
192 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
193
194 // __<dim_name>_LOC_MINMAX (for time)
195 for( unsigned int i = 0; i != dimNamesSz; i++ )
196 {
197 if( dimNames[i] == "time" || dimNames[i] == "Time" || dimNames[i] == "t" )
198 {
199 // some files might have Time dimension as 0, it will not appear in any
200 // variables, so skip it
201 if( nTimeSteps == 0 ) continue;
202 std::stringstream ss_tag_name;
203 ss_tag_name << "__" << dimNames[i] << "_LOC_MINMAX";
204 tag_name = ss_tag_name.str();
205 Tag tagh = 0;
206 std::vector< int > val( 2, 0 );
207 val[0] = 0;
208 val[1] = nTimeSteps - 1;
209 rval = mbImpl->tag_get_handle( tag_name.c_str(), 2, MB_TYPE_INTEGER, tagh, MB_TAG_SPARSE | MB_TAG_CREAT );MB_CHK_SET_ERR( rval, "Trouble creating conventional tag " << tag_name );
210 rval = mbImpl->tag_set_data( tagh, &_fileSet, 1, &val[0] );MB_CHK_SET_ERR( rval, "Trouble setting data to conventional tag " << tag_name );
211 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
212 }
213 }
214
215 // __<dim_name>_LOC_VALS (for time)
216 for( unsigned int i = 0; i != dimNamesSz; i++ )
217 {
218 if( dimNames[i] == "time" || dimNames[i] == "Time" || dimNames[i] == "t" )
219 {
220 std::vector< int > val;
221 if( !tstep_nums.empty() )
222 val = tstep_nums;
223 else
224 {
225 // some files might have Time dimension as 0, it will not appear in any
226 // variables, so skip it
227 if( tVals.empty() ) continue;
228 val.resize( tVals.size() );
229 for( unsigned int j = 0; j != tVals.size(); j++ )
230 val[j] = j;
231 }
232 Tag tagh = 0;
233 std::stringstream ss_tag_name;
234 ss_tag_name << "__" << dimNames[i] << "_LOC_VALS";
235 tag_name = ss_tag_name.str();
236 rval = mbImpl->tag_get_handle( tag_name.c_str(), val.size(), MB_TYPE_INTEGER, tagh,
237 MB_TAG_SPARSE | MB_TAG_CREAT );MB_CHK_SET_ERR( rval, "Trouble creating conventional tag " << tag_name );
238 rval = mbImpl->tag_set_data( tagh, &_fileSet, 1, &val[0] );MB_CHK_SET_ERR( rval, "Trouble setting data to conventional tag " << tag_name );
239 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
240 }
241 }
242
243 // __<var_name>_DIMS
244 for( mapIter = varInfo.begin(); mapIter != varInfo.end(); ++mapIter )
245 {
246 Tag varNamesDimsTag = 0;
247 std::stringstream ss_tag_name;
248 ss_tag_name << "__" << mapIter->first << "_DIMS";
249 tag_name = ss_tag_name.str();
250 unsigned int varDimSz = varInfo[mapIter->first].varDims.size();
251 if( varDimSz == 0 ) continue;
252 std::vector< Tag > varDimTags( varDimSz );
253 for( unsigned int i = 0; i != varDimSz; i++ )
254 {
255 Tag tmptag = 0;
256 std::string tmptagname = dimNames[varInfo[mapIter->first].varDims[i]];
257 rval = mbImpl->tag_get_handle( tmptagname.c_str(), 0, MB_TYPE_OPAQUE, tmptag, MB_TAG_ANY );MB_CHK_SET_ERR( rval, "Trouble getting tag " << tmptagname );
258 varDimTags[i] = tmptag;
259 }
260 // rval = mbImpl->tag_get_handle(tag_name.c_str(), varDimSz, MB_TYPE_HANDLE,
261 // varNamesDimsTag, MB_TAG_SPARSE | MB_TAG_CREAT); We should not use MB_TYPE_HANDLE for Tag
262 // here. Tag is a pointer, which is 4 bytes on 32 bit machines and 8 bytes on 64 bit
263 // machines. Normally, entity handle is 8 bytes on 64 bit machines, but it can also be
264 // configured to 4 bytes.
265 rval = mbImpl->tag_get_handle( tag_name.c_str(), varDimSz * sizeof( Tag ), MB_TYPE_OPAQUE, varNamesDimsTag,
266 MB_TAG_SPARSE | MB_TAG_CREAT );MB_CHK_SET_ERR( rval, "Trouble creating conventional tag " << tag_name );
267 rval = mbImpl->tag_set_data( varNamesDimsTag, &_fileSet, 1, &( varDimTags[0] ) );MB_CHK_SET_ERR( rval, "Trouble setting data to conventional tag " << tag_name );
268 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
269 }
270
271 // <PARTITION_METHOD>
272 Tag part_tag = scdi->part_method_tag();
273 if( !part_tag ) MB_SET_ERR( MB_FAILURE, "Trouble getting PARTITION_METHOD tag" );
274 rval = mbImpl->tag_set_data( part_tag, &_fileSet, 1, &partMethod );MB_CHK_SET_ERR( rval, "Trouble setting data to PARTITION_METHOD tag" );
275 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
276
277 // <__GLOBAL_ATTRIBS>
278 tag_name = "__GLOBAL_ATTRIBS";
279 Tag globalAttTag = 0;
280 rval = mbImpl->tag_get_handle( tag_name.c_str(), 0, MB_TYPE_OPAQUE, globalAttTag,
281 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN );MB_CHK_SET_ERR( rval, "Trouble creating conventional tag " << tag_name );
282 std::string gattVal;
283 std::vector< int > gattLen;
284 rval = create_attrib_string( globalAtts, gattVal, gattLen );MB_CHK_SET_ERR( rval, "Trouble creating global attribute string" );
285 const void* gattptr = gattVal.c_str();
286 int globalAttSz = gattVal.size();
287 rval = mbImpl->tag_set_by_ptr( globalAttTag, &_fileSet, 1, &gattptr, &globalAttSz );MB_CHK_SET_ERR( rval, "Trouble setting data to conventional tag " << tag_name );
288 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
289
290 // <__GLOBAL_ATTRIBS_LEN>
291 tag_name = "__GLOBAL_ATTRIBS_LEN";
292 Tag globalAttLenTag = 0;
293 if( gattLen.size() == 0 ) gattLen.push_back( 0 );
294 rval = mbImpl->tag_get_handle( tag_name.c_str(), gattLen.size(), MB_TYPE_INTEGER, globalAttLenTag,
295 MB_TAG_SPARSE | MB_TAG_CREAT );MB_CHK_SET_ERR( rval, "Trouble creating conventional tag " << tag_name );
296 rval = mbImpl->tag_set_data( globalAttLenTag, &_fileSet, 1, &gattLen[0] );MB_CHK_SET_ERR( rval, "Trouble setting data to conventional tag " << tag_name );
297 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
298
299 // __<var_name>_ATTRIBS and __<var_name>_ATTRIBS_LEN
300 for( mapIter = varInfo.begin(); mapIter != varInfo.end(); ++mapIter )
301 {
302 std::stringstream ssTagName;
303 ssTagName << "__" << mapIter->first << "_ATTRIBS";
304 tag_name = ssTagName.str();
305 Tag varAttTag = 0;
306 rval = mbImpl->tag_get_handle( tag_name.c_str(), 0, MB_TYPE_OPAQUE, varAttTag,
307 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN );MB_CHK_SET_ERR( rval, "Trouble creating conventional tag " << tag_name );
308
309 std::string varAttVal;
310 std::vector< int > varAttLen;
311 if( mapIter->second.numAtts < 1 )
312 {
313 if( dummyVarNames.find( mapIter->first ) != dummyVarNames.end() )
314 {
315 // This variable is a dummy coordinate variable
316 varAttVal = "DUMMY_VAR";
317 }
318 else
319 {
320 // This variable has no attributes
321 varAttVal = "NO_ATTRIBS";
322 }
323 }
324 else
325 {
326 rval = create_attrib_string( mapIter->second.varAtts, varAttVal, varAttLen );MB_CHK_SET_ERR( rval, "Trouble creating attribute string for variable " << mapIter->first );
327 }
328 const void* varAttPtr = varAttVal.c_str();
329 int varAttSz = varAttVal.size();
330 if( 0 == varAttSz ) varAttSz = 1;
331 rval = mbImpl->tag_set_by_ptr( varAttTag, &_fileSet, 1, &varAttPtr, &varAttSz );MB_CHK_SET_ERR( rval, "Trouble setting data to conventional tag " << tag_name );
332 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
333
334 ssTagName << "_LEN";
335 tag_name = ssTagName.str();
336 Tag varAttLenTag = 0;
337 if( 0 == varAttLen.size() ) varAttLen.push_back( 0 );
338 rval = mbImpl->tag_get_handle( tag_name.c_str(), varAttLen.size(), MB_TYPE_INTEGER, varAttLenTag,
339 MB_TAG_SPARSE | MB_TAG_CREAT );MB_CHK_SET_ERR( rval, "Trouble creating conventional tag " << tag_name );
340 rval = mbImpl->tag_set_data( varAttLenTag, &_fileSet, 1, &varAttLen[0] );MB_CHK_SET_ERR( rval, "Trouble setting data to conventional tag " << tag_name );
341 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
342 }
343
344 // <__VAR_NAMES_LOCATIONS>
345 tag_name = "__VAR_NAMES_LOCATIONS";
346 Tag varNamesLocsTag = 0;
347 std::vector< int > varNamesLocs( varInfo.size() );
348 rval = mbImpl->tag_get_handle( tag_name.c_str(), varNamesLocs.size(), MB_TYPE_INTEGER, varNamesLocsTag,
349 MB_TAG_CREAT | MB_TAG_SPARSE );MB_CHK_SET_ERR( rval, "Trouble creating conventional tag " << tag_name );
350 for( mapIter = varInfo.begin(); mapIter != varInfo.end(); ++mapIter )
351 {
352 varNamesLocs[std::distance( varInfo.begin(), mapIter )] = mapIter->second.entLoc;
353 }
354 rval = mbImpl->tag_set_data( varNamesLocsTag, &_fileSet, 1, &varNamesLocs[0] );MB_CHK_SET_ERR( rval, "Trouble setting data to conventional tag " << tag_name );
355 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
356
357 // <__MESH_TYPE>
358 Tag meshTypeTag = 0;
359 tag_name = "__MESH_TYPE";
360 std::string meshTypeName = get_mesh_type_name();
361
362 rval = mbImpl->tag_get_handle( tag_name.c_str(), 0, MB_TYPE_OPAQUE, meshTypeTag,
363 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN );MB_CHK_SET_ERR( rval, "Trouble creating conventional tag " << tag_name );
364 ptr = meshTypeName.c_str();
365 int leng = meshTypeName.size();
366 rval = mbImpl->tag_set_by_ptr( meshTypeTag, &_fileSet, 1, &ptr, &leng );MB_CHK_SET_ERR( rval, "Trouble setting data to conventional tag " << tag_name );
367 dbgOut.tprintf( 2, "Conventional tag %s created\n", tag_name.c_str() );
368
369 return MB_SUCCESS;
370 }
References _fileSet, _readNC, create_attrib_string(), moab::ReadNC::dbgOut, moab::ReadNC::dimLens, moab::ReadNC::dimNames, dummyVarNames, ErrorCode, get_mesh_type_name(), moab::ReadNC::globalAtts, MB_CHK_SET_ERR, MB_SET_ERR, MB_SUCCESS, MB_TAG_ANY, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TAG_VARLEN, MB_TYPE_INTEGER, MB_TYPE_OPAQUE, moab::ReadNC::mbImpl, nTimeSteps, moab::ScdInterface::part_method_tag(), moab::ReadNC::partMethod, moab::ReadNC::scdi, moab::Interface::tag_get_handle(), moab::Interface::tag_set_by_ptr(), moab::Interface::tag_set_data(), moab::DebugOutput::tprintf(), tVals, and moab::ReadNC::varInfo.
Referenced by moab::ReadNC::load_file().
|
protected |
For a dimension that does not have a corresponding coordinate variable (e.g. ncol for HOMME), create a dummy variable with a sparse tag to store the dimension length.
Definition at line 819 of file NCHelper.cpp.
820 {
821 Interface*& mbImpl = _readNC->mbImpl;
822 std::vector< std::string >& dimNames = _readNC->dimNames;
823 std::vector< int >& dimLens = _readNC->dimLens;
824 std::map< std::string, ReadNC::VarData >& varInfo = _readNC->varInfo;
825 DebugOutput& dbgOut = _readNC->dbgOut;
826
827 // Hack: look at all dimensions, and see if we have one that does not appear in the list of
828 // varInfo names Right now, candidates are from unstructured meshes, such as ncol (HOMME) and
829 // nCells (MPAS) For each of them, create a dummy coordinate variable with a sparse tag to store
830 // the dimension length
831 for( unsigned int i = 0; i < dimNames.size(); i++ )
832 {
833 // If there is a variable with this dimension name, skip
834 if( varInfo.find( dimNames[i] ) != varInfo.end() ) continue;
835
836 // Create a dummy coordinate variable
837 int sizeTotalVar = varInfo.size();
838 std::string var_name( dimNames[i] );
839 ReadNC::VarData& data = varInfo[var_name];
840 data.varName = var_name;
841 data.varId = sizeTotalVar;
842 data.varTags.resize( 1, 0 );
843 data.varDataType = NC_INT;
844 data.varDims.resize( 1 );
845 data.varDims[0] = (int)i;
846 data.numAtts = 0;
847 data.entLoc = ReadNC::ENTLOCSET;
848 dummyVarNames.insert( var_name );
849 dbgOut.tprintf( 2, "Dummy coordinate variable created for dimension %s\n", var_name.c_str() );
850
851 // Create a corresponding sparse tag
852 Tag tagh;
853 ErrorCode rval = mbImpl->tag_get_handle( var_name.c_str(), 0, MB_TYPE_INTEGER, tagh,
854 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN );MB_CHK_SET_ERR( rval, "Trouble creating tag for dummy coordinate variable " << var_name );
855
856 // Tag value is the dimension length
857 const void* ptr = &dimLens[i];
858 // Tag size is 1
859 int size = 1;
860 rval = mbImpl->tag_set_by_ptr( tagh, &_fileSet, 1, &ptr, &size );MB_CHK_SET_ERR( rval, "Trouble setting tag data for dummy coordinate variable " << var_name );
861
862 dbgOut.tprintf( 2, "Sparse tag created for dimension %s\n", var_name.c_str() );
863 }
864
865 return MB_SUCCESS;
866 }
References _fileSet, _readNC, moab::ReadNC::dbgOut, moab::ReadNC::dimLens, moab::ReadNC::dimNames, dummyVarNames, moab::ReadNC::VarData::entLoc, moab::ReadNC::ENTLOCSET, ErrorCode, MB_CHK_SET_ERR, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TAG_VARLEN, MB_TYPE_INTEGER, moab::ReadNC::mbImpl, moab::ReadNC::VarData::numAtts, size, moab::Interface::tag_get_handle(), moab::Interface::tag_set_by_ptr(), moab::DebugOutput::tprintf(), moab::ReadNC::VarData::varDataType, moab::ReadNC::VarData::varDims, moab::ReadNC::VarData::varId, moab::ReadNC::varInfo, moab::ReadNC::VarData::varName, and moab::ReadNC::VarData::varTags.
Referenced by moab::NCHelperESMF::init_mesh_vals(), moab::NCHelperEuler::init_mesh_vals(), moab::NCHelperFV::init_mesh_vals(), moab::NCHelperGCRM::init_mesh_vals(), moab::NCHelperHOMME::init_mesh_vals(), and moab::NCHelperMPAS::init_mesh_vals().
Implemented in moab::NCHelperScrip, moab::NCHelperMPAS, moab::NCHelperHOMME, moab::NCHelperGCRM, moab::NCHelperESMF, moab::NCHelperDomain, and moab::ScdNCHelper.
Referenced by moab::ReadNC::load_file().
|
static |
Get appropriate format to read the file.
Get appropriate file read options depending on the format of the NC file.
Definition at line 66 of file NCHelper.cpp.
67 {
68 switch( format )
69 {
70 case moab::ReadNC::NC_FORMAT_GCRM: // GCRM format reader
71 case moab::ReadNC::NC_FORMAT_MPAS: // MPAS format reader
72 return "PARALLEL=READ_PART;PARTITION_METHOD=RCBZOLTAN;"
73 "PARALLEL_RESOLVE_SHARED_ENTS;NO_EDGES;NO_MIXED_ELEMENTS;VARIABLE=;";
74 case moab::ReadNC::NC_FORMAT_SCRIP: // SCRIP format reader
75 return "PARALLEL=READ_PART;PARTITION_METHOD=RCBZOLTAN;";
76 case moab::ReadNC::NC_FORMAT_ESMF: // ESMF unstructured format reader
77 return "PARALLEL=READ_PART;PARTITION_METHOD=RCBZOLTAN;PARALLEL_RESOLVE_SHARED_ENTS;VARIABLE=;";
78 case moab::ReadNC::NC_FORMAT_DOMAIN: // Climate Domain reader
79 return "PARALLEL=READ_PART;PARTITION_METHOD=SQIJ;VARIABLE=;";
80 case moab::ReadNC::NC_FORMAT_HOMME: // HOMME format reader
81 return "PARALLEL=READ_PART;PARTITION_METHOD=TRIVIAL;PARALLEL_RESOLVE_SHARED_ENTS;";
82 case moab::ReadNC::NC_FORMAT_EULER: // Euler format reader
83 case moab::ReadNC::NC_FORMAT_FV: // FV climate format reader
84 return "PARALLEL=READ_PART;PARTITION;PARALLEL_RESOLVE_SHARED_ENTS;"
85 "PARTITION_METHOD=SQIJ;VARIABLE=;";
86 default:
87 return "PARALLEL=READ_PART;PARTITION_METHOD=RCBZOLTAN;PARALLEL_RESOLVE_SHARED_ENTS;";
88 }
89 }
References moab::ReadNC::NC_FORMAT_DOMAIN, moab::ReadNC::NC_FORMAT_ESMF, moab::ReadNC::NC_FORMAT_EULER, moab::ReadNC::NC_FORMAT_FV, moab::ReadNC::NC_FORMAT_GCRM, moab::ReadNC::NC_FORMAT_HOMME, moab::ReadNC::NC_FORMAT_MPAS, and moab::ReadNC::NC_FORMAT_SCRIP.
|
pure virtual |
Implemented in moab::NCHelperScrip, moab::NCHelperMPAS, moab::NCHelperHOMME, moab::NCHelperGCRM, moab::NCHelperFV, moab::NCHelperEuler, moab::NCHelperESMF, and moab::NCHelperDomain.
Referenced by create_conventional_tags().
|
static |
Get appropriate format to read the file.
Definition at line 24 of file NCHelper.cpp.
25 {
26 // Check if CF convention is being followed
27 bool is_CF = false;
28
29 std::map< std::string, ReadNC::AttData >& globalAtts = readNC->globalAtts;
30 std::map< std::string, ReadNC::AttData >::iterator attIt = globalAtts.find( "conventions" );
31 if( attIt == globalAtts.end() ) attIt = globalAtts.find( "Conventions" );
32
33 if( attIt != globalAtts.end() )
34 {
35 unsigned int sz = attIt->second.attLen;
36 std::string att_data;
37 att_data.resize( sz + 1 );
38 att_data[sz] = '\000';
39 int success =
40 NCFUNC( get_att_text )( fileId, attIt->second.attVarId, attIt->second.attName.c_str(), &att_data[0] );
41 if( 0 == success && att_data.find( "CF" ) != std::string::npos ) is_CF = true;
42 }
43
44 // Depending on the format, update FileOptions as well
45 if( NCHelperMPAS::can_read_file( readNC ) )
46 return ReadNC::NC_FORMAT_MPAS;
47 else if( NCHelperScrip::can_read_file( readNC, fileId ) )
48 return ReadNC::NC_FORMAT_SCRIP;
49 else if( NCHelperESMF::can_read_file( readNC ) )
50 return ReadNC::NC_FORMAT_ESMF;
51 else if( NCHelperDomain::can_read_file( readNC, fileId ) ) // && is_CF )
52 return ReadNC::NC_FORMAT_DOMAIN;
53 else if( NCHelperHOMME::can_read_file( readNC, fileId ) )
54 return ReadNC::NC_FORMAT_HOMME;
55 else if( NCHelperEuler::can_read_file( readNC, fileId ) && is_CF )
56 return ReadNC::NC_FORMAT_EULER;
57 else if( NCHelperGCRM::can_read_file( readNC ) )
58 return ReadNC::NC_FORMAT_GCRM;
59 else if( NCHelperFV::can_read_file( readNC, fileId ) && is_CF )
60 return ReadNC::NC_FORMAT_FV;
61 else // Unknown NetCDF grid (will fill this in later for POP, CICE and CLM)
62 return ReadNC::NC_FORMAT_UNKNOWN_TYPE;
63 }
References moab::NCHelperESMF::can_read_file(), moab::NCHelperGCRM::can_read_file(), moab::NCHelperMPAS::can_read_file(), moab::NCHelperDomain::can_read_file(), moab::NCHelperEuler::can_read_file(), moab::NCHelperFV::can_read_file(), moab::NCHelperHOMME::can_read_file(), moab::NCHelperScrip::can_read_file(), moab::ReadNC::globalAtts, moab::ReadNC::NC_FORMAT_DOMAIN, moab::ReadNC::NC_FORMAT_ESMF, moab::ReadNC::NC_FORMAT_EULER, moab::ReadNC::NC_FORMAT_FV, moab::ReadNC::NC_FORMAT_GCRM, moab::ReadNC::NC_FORMAT_HOMME, moab::ReadNC::NC_FORMAT_MPAS, moab::ReadNC::NC_FORMAT_SCRIP, moab::ReadNC::NC_FORMAT_UNKNOWN_TYPE, and NCFUNC.
Referenced by get_nc_helper().
|
static |
Get appropriate helper instance for ReadNC class.
Definition at line 91 of file NCHelper.cpp.
92 {
93 ReadNC::NCFormatType nctype = NCHelper::get_nc_format( readNC, fileId );
94
95 switch( nctype )
96 {
97 case ReadNC::NC_FORMAT_MPAS: // MPAS format reader
98 return new( std::nothrow ) NCHelperMPAS( readNC, fileId, opts, fileSet );
99 case ReadNC::NC_FORMAT_SCRIP: // SCRIP format reader
100 // SCRIP can be CF or non CF, if it comes from MPAS :)
101 return new( std::nothrow ) NCHelperScrip( readNC, fileId, opts, fileSet );
102 case ReadNC::NC_FORMAT_ESMF: // ESMF unstructured format reader
103 return new( std::nothrow ) NCHelperESMF( readNC, fileId, opts, fileSet );
104 case ReadNC::NC_FORMAT_DOMAIN: // Climate Domain reader
105 return new( std::nothrow ) NCHelperDomain( readNC, fileId, opts, fileSet );
106 case ReadNC::NC_FORMAT_HOMME: // HOMME format reader
107 // For a HOMME connectivity file, there might be no CF convention
108 return new( std::nothrow ) NCHelperHOMME( readNC, fileId, opts, fileSet );
109 case ReadNC::NC_FORMAT_GCRM: // GCRM format reader
110 return new( std::nothrow ) NCHelperGCRM( readNC, fileId, opts, fileSet );
111 case ReadNC::NC_FORMAT_EULER: // Euler format reader
112 return new( std::nothrow ) NCHelperEuler( readNC, fileId, opts, fileSet );
113 case ReadNC::NC_FORMAT_FV: // FV climate format reader
114 return new( std::nothrow ) NCHelperFV( readNC, fileId, opts, fileSet );
115 default: // Unknown NetCDF grid (will fill this in later for POP, CICE and CLM)
116 return nullptr;
117 }
118 }
References get_nc_format(), moab::ReadNC::NC_FORMAT_DOMAIN, moab::ReadNC::NC_FORMAT_ESMF, moab::ReadNC::NC_FORMAT_EULER, moab::ReadNC::NC_FORMAT_FV, moab::ReadNC::NC_FORMAT_GCRM, moab::ReadNC::NC_FORMAT_HOMME, moab::ReadNC::NC_FORMAT_MPAS, and moab::ReadNC::NC_FORMAT_SCRIP.
Referenced by moab::ReadNC::load_file().
|
protected |
Definition at line 694 of file NCHelper.cpp.
695 {
696 Interface*& mbImpl = _readNC->mbImpl;
697 DebugOutput& dbgOut = _readNC->dbgOut;
698 int& tStepBase = _readNC->tStepBase;
699
700 if( tStepBase > 0 ) tstep_num += tStepBase;
701
702 std::ostringstream tag_name;
703 tag_name << var_data.varName << tstep_num;
704
705 ErrorCode rval = MB_SUCCESS;
706 tagh = 0;
707 switch( var_data.varDataType )
708 {
709 case NC_BYTE:
710 case NC_CHAR:
711 rval = mbImpl->tag_get_handle( tag_name.str().c_str(), num_lev, MB_TYPE_OPAQUE, tagh,
712 MB_TAG_DENSE | MB_TAG_CREAT );MB_CHK_SET_ERR( rval, "Trouble creating tag " << tag_name.str() );
713 break;
714 case NC_SHORT:
715 case NC_INT:
716 case NC_INT64:
717 rval = mbImpl->tag_get_handle( tag_name.str().c_str(), num_lev, MB_TYPE_INTEGER, tagh,
718 MB_TAG_DENSE | MB_TAG_CREAT );MB_CHK_SET_ERR( rval, "Trouble creating tag " << tag_name.str() );
719 break;
720 case NC_FLOAT:
721 case NC_DOUBLE:
722 rval = mbImpl->tag_get_handle( tag_name.str().c_str(), num_lev, MB_TYPE_DOUBLE, tagh,
723 MB_TAG_DENSE | MB_TAG_CREAT );MB_CHK_SET_ERR( rval, "Trouble creating tag " << tag_name.str() );
724 break;
725 default:
726 MB_SET_ERR( MB_FAILURE, "Unexpected data type for variable " << var_data.varName );
727 }
728
729 dbgOut.tprintf( 2, "Tag %s created\n", tag_name.str().c_str() );
730
731 return rval;
732 }
References _readNC, moab::ReadNC::dbgOut, ErrorCode, MB_CHK_SET_ERR, MB_SET_ERR, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_DENSE, MB_TYPE_DOUBLE, MB_TYPE_INTEGER, MB_TYPE_OPAQUE, moab::ReadNC::mbImpl, moab::Interface::tag_get_handle(), moab::DebugOutput::tprintf(), moab::ReadNC::tStepBase, moab::ReadNC::VarData::varDataType, and moab::ReadNC::VarData::varName.
Referenced by moab::ScdNCHelper::read_scd_variables_to_nonset_allocate(), moab::NCHelperGCRM::read_ucd_variables_to_nonset_allocate(), moab::NCHelperHOMME::read_ucd_variables_to_nonset_allocate(), and moab::NCHelperMPAS::read_ucd_variables_to_nonset_allocate().
|
protected |
Definition at line 651 of file NCHelper.cpp.
652 {
653 Interface*& mbImpl = _readNC->mbImpl;
654 DebugOutput& dbgOut = _readNC->dbgOut;
655 int& tStepBase = _readNC->tStepBase;
656
657 if( tStepBase > 0 ) tstep_num += tStepBase;
658
659 std::ostringstream tag_name;
660 if( var_data.has_tsteps )
661 tag_name << var_data.varName << tstep_num;
662 else
663 tag_name << var_data.varName;
664
665 ErrorCode rval = MB_SUCCESS;
666 tagh = 0;
667 switch( var_data.varDataType )
668 {
669 case NC_BYTE:
670 case NC_CHAR:
671 rval = mbImpl->tag_get_handle( tag_name.str().c_str(), 0, MB_TYPE_OPAQUE, tagh,
672 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN );MB_CHK_SET_ERR( rval, "Trouble creating tag " << tag_name.str() );
673 break;
674 case NC_SHORT:
675 case NC_INT:
676 case NC_INT64: // this is a big stretch; we should introduce LONG tag
677 rval = mbImpl->tag_get_handle( tag_name.str().c_str(), 0, MB_TYPE_INTEGER, tagh,
678 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN );MB_CHK_SET_ERR( rval, "Trouble creating tag " << tag_name.str() );
679 break;
680 case NC_FLOAT:
681 case NC_DOUBLE:
682 rval = mbImpl->tag_get_handle( tag_name.str().c_str(), 0, MB_TYPE_DOUBLE, tagh,
683 MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN );MB_CHK_SET_ERR( rval, "Trouble creating tag " << tag_name.str() );
684 break;
685 default:
686 MB_SET_ERR( MB_FAILURE, "Unexpected data type for variable " << var_data.varName );
687 }
688
689 dbgOut.tprintf( 2, "Tag %s created\n", tag_name.str().c_str() );
690
691 return rval;
692 }
References _readNC, moab::ReadNC::dbgOut, ErrorCode, moab::ReadNC::VarData::has_tsteps, MB_CHK_SET_ERR, MB_SET_ERR, MB_SUCCESS, MB_TAG_CREAT, MB_TAG_SPARSE, MB_TAG_VARLEN, MB_TYPE_DOUBLE, MB_TYPE_INTEGER, MB_TYPE_OPAQUE, moab::ReadNC::mbImpl, moab::Interface::tag_get_handle(), moab::DebugOutput::tprintf(), moab::ReadNC::tStepBase, moab::ReadNC::VarData::varDataType, and moab::ReadNC::VarData::varName.
Referenced by read_variables_to_set_allocate().
|
pure virtual |
Interfaces to be implemented in child classes.
Implemented in moab::NCHelperScrip, moab::NCHelperMPAS, moab::NCHelperHOMME, moab::NCHelperGCRM, moab::NCHelperFV, moab::NCHelperEuler, moab::NCHelperESMF, and moab::NCHelperDomain.
Referenced by moab::ReadNC::load_file().
|
protected |
Definition at line 619 of file NCHelper.cpp.
620 {
621 std::map< std::string, ReadNC::VarData >& varInfo = _readNC->varInfo;
622 std::map< std::string, ReadNC::VarData >::iterator vmit = varInfo.find( var_name );
623 if( varInfo.end() == vmit ) MB_SET_ERR( MB_FAILURE, "Couldn't find variable " << var_name );
624
625 assert( lmin >= 0 && lmax >= lmin );
626 NCDF_SIZE tstart = lmin;
627 NCDF_SIZE tcount = lmax - lmin + 1;
628 NCDF_DIFF dum_stride = 1;
629 int success;
630
631 // Check size
632 if( (std::size_t)tcount != cvals.size() ) cvals.resize( tcount );
633
634 // Check to make sure it's a float or double
635 switch( ( *vmit ).second.varDataType )
636 {
637 case NC_FLOAT:
638 case NC_DOUBLE:
639 // Read float as double
640 success =
641 NCFUNCAG( _vars_double )( _fileId, ( *vmit ).second.varId, &tstart, &tcount, &dum_stride, &cvals[0] );
642 if( success ) MB_SET_ERR( MB_FAILURE, "Failed to read float/double data for variable " << var_name );
643 break;
644 default:
645 MB_SET_ERR( MB_FAILURE, "Unexpected data type for variable " << var_name );
646 }
647
648 return MB_SUCCESS;
649 }
References _fileId, _readNC, MB_SET_ERR, MB_SUCCESS, NCDF_DIFF, NCDF_SIZE, NCFUNCAG, and moab::ReadNC::varInfo.
Referenced by moab::NCHelperGCRM::create_local_vertices(), moab::NCHelperEuler::init_mesh_vals(), moab::NCHelperFV::init_mesh_vals(), moab::NCHelperGCRM::init_mesh_vals(), moab::NCHelperHOMME::init_mesh_vals(), and moab::NCHelperMPAS::init_mesh_vals().
|
pure virtual |
Implemented in moab::UcdNCHelper, and moab::ScdNCHelper.
Referenced by moab::ReadNC::load_file().
|
protected |
Separate set and non-set variables (common to scd mesh and ucd mesh)
Definition at line 421 of file NCHelper.cpp.
425 {
426 std::map< std::string, ReadNC::VarData >& varInfo = _readNC->varInfo;
427 std::vector< std::string >& dimNames = _readNC->dimNames;
428
429 std::map< std::string, ReadNC::VarData >::iterator mit;
430
431 // If empty read them all (except ignored variables)
432 if( var_names.empty() )
433 {
434 for( mit = varInfo.begin(); mit != varInfo.end(); ++mit )
435 {
436 ReadNC::VarData vd = ( *mit ).second;
437
438 // If read all variables at once, skip ignored ones
439 if( ignoredVarNames.find( vd.varName ) != ignoredVarNames.end() ) continue;
440
441 // Coordinate variables (include dummy ones) were read to the file set by default
442 if( std::find( dimNames.begin(), dimNames.end(), vd.varName ) != dimNames.end() ) continue;
443
444 if( vd.entLoc == ReadNC::ENTLOCSET )
445 vsetdatas.push_back( vd );
446 else
447 vdatas.push_back( vd );
448 }
449 }
450 else
451 {
452 // Read specified variables (might include ignored ones)
453 for( unsigned int i = 0; i < var_names.size(); i++ )
454 {
455 mit = varInfo.find( var_names[i] );
456 if( mit != varInfo.end() )
457 {
458 ReadNC::VarData vd = ( *mit ).second;
459
460 // Upon creation of dummy coordinate variables, tag values have already been set
461 if( dummyVarNames.find( vd.varName ) != dummyVarNames.end() ) continue;
462
463 if( vd.entLoc == ReadNC::ENTLOCSET )
464 vsetdatas.push_back( vd );
465 else
466 vdatas.push_back( vd );
467 }
468 else
469 {
470 MB_SET_ERR( MB_FAILURE, "Couldn't find specified variable " << var_names[i] );
471 }
472 }
473 }
474
475 if( tstep_nums.empty() && nTimeSteps > 0 )
476 {
477 // No timesteps input, get them all
478 for( int i = 0; i < nTimeSteps; i++ )
479 tstep_nums.push_back( i );
480 }
481
482 if( !tstep_nums.empty() )
483 {
484 for( unsigned int i = 0; i < vdatas.size(); i++ )
485 {
486 vdatas[i].varTags.resize( tstep_nums.size(), 0 );
487 vdatas[i].varDatas.resize( tstep_nums.size() );
488 // NC reader assumes that non-set variables always have timesteps
489 assert( std::find( vdatas[i].varDims.begin(), vdatas[i].varDims.end(), tDim ) != vdatas[i].varDims.end() );
490 vdatas[i].has_tsteps = true;
491 }
492
493 for( unsigned int i = 0; i < vsetdatas.size(); i++ )
494 {
495 if( ( std::find( vsetdatas[i].varDims.begin(), vsetdatas[i].varDims.end(), tDim ) !=
496 vsetdatas[i].varDims.end() ) &&
497 ( vsetdatas[i].varName != dimNames[tDim] ) )
498 {
499 // Set variables with timesteps: e.g. xtime(Time) or xtime(Time, StrLen)
500 vsetdatas[i].varTags.resize( tstep_nums.size(), 0 );
501 vsetdatas[i].varDatas.resize( tstep_nums.size() );
502 vsetdatas[i].has_tsteps = true;
503 }
504 else
505 {
506 // Set variables without timesteps: no time dimension, or time itself
507 vsetdatas[i].varTags.resize( 1, 0 );
508 vsetdatas[i].varDatas.resize( 1 );
509 vsetdatas[i].has_tsteps = false;
510 }
511 }
512 }
513
514 return MB_SUCCESS;
515 }
References _readNC, moab::ReadNC::dimNames, dummyVarNames, moab::ReadNC::VarData::entLoc, moab::ReadNC::ENTLOCSET, ignoredVarNames, MB_SET_ERR, MB_SUCCESS, nTimeSteps, tDim, moab::ReadNC::varInfo, and moab::ReadNC::VarData::varName.
Referenced by moab::ScdNCHelper::read_variables(), and moab::UcdNCHelper::read_variables().
|
protected |
Read set variables (common to scd mesh and ucd mesh)
Definition at line 517 of file NCHelper.cpp.
518 {
519 Interface*& mbImpl = _readNC->mbImpl;
520 DebugOutput& dbgOut = _readNC->dbgOut;
521
522 ErrorCode rval = read_variables_to_set_allocate( vdatas, tstep_nums );MB_CHK_SET_ERR( rval, "Trouble allocating space to read set variables" );
523
524 // Finally, read into that space
525 int success;
526 for( unsigned int i = 0; i < vdatas.size(); i++ )
527 {
528 // Note, for set variables without timesteps, loop one time and then break
529 for( unsigned int t = 0; t < tstep_nums.size(); t++ )
530 {
531 void* data = vdatas[i].varDatas[t];
532
533 // Set variables with timesteps, e.g. xtime(Time) or xtime(Time, StrLen)
534 if( vdatas[i].has_tsteps )
535 {
536 // Set readStart for each timestep along time dimension
537 vdatas[i].readStarts[0] = tstep_nums[t];
538 }
539
540 switch( vdatas[i].varDataType )
541 {
542 case NC_BYTE:
543 case NC_CHAR:
544 success = NCFUNCAG( _vara_text )( _fileId, vdatas[i].varId, &vdatas[i].readStarts[0],
545 &vdatas[i].readCounts[0], (char*)data );
546 if( success )
547 MB_SET_ERR( MB_FAILURE, "Failed to read byte/char data for variable " << vdatas[i].varName );
548 break;
549 case NC_SHORT:
550 case NC_INT:
551 success = NCFUNCAG( _vara_int )( _fileId, vdatas[i].varId, &vdatas[i].readStarts[0],
552 &vdatas[i].readCounts[0], (int*)data );
553 if( success )
554 MB_SET_ERR( MB_FAILURE, "Failed to read short/int data for variable " << vdatas[i].varName );
555 break;
556 case NC_INT64:
557 success = NCFUNCAG( _vara_long )( _fileId, vdatas[i].varId, &vdatas[i].readStarts[0],
558 &vdatas[i].readCounts[0], (long*)data );
559 if( success )
560 MB_SET_ERR( MB_FAILURE, "Failed to read long data for variable " << vdatas[i].varName );
561 break;
562 case NC_FLOAT:
563 case NC_DOUBLE:
564 success = NCFUNCAG( _vara_double )( _fileId, vdatas[i].varId, &vdatas[i].readStarts[0],
565 &vdatas[i].readCounts[0], (double*)data );
566 if( success )
567 MB_SET_ERR( MB_FAILURE, "Failed to read float/double data for variable " << vdatas[i].varName );
568 break;
569 default:
570 MB_SET_ERR( MB_FAILURE, "Unexpected data type for variable " << vdatas[i].varName );
571 }
572
573 dbgOut.tprintf( 2, "Setting data for variable %s, time step %d\n", vdatas[i].varName.c_str(),
574 tstep_nums[t] );
575 rval = mbImpl->tag_set_by_ptr( vdatas[i].varTags[t], &_fileSet, 1, &data, &vdatas[i].sz );MB_CHK_SET_ERR( rval, "Trouble setting tag data for variable " << vdatas[i].varName );
576
577 // Memory pointed by pointer data can be deleted, as tag_set_by_ptr() has already copied
578 // the tag values
579 switch( vdatas[i].varDataType )
580 {
581 case NC_BYTE:
582 case NC_CHAR:
583 delete[](char*)data;
584 break;
585 case NC_SHORT:
586 case NC_INT:
587 delete[](int*)data;
588 break;
589 case NC_INT64:
590 delete[](long*)data;
591 break;
592 case NC_FLOAT:
593 case NC_DOUBLE:
594 delete[](double*)data;
595 break;
596 default:
597 break;
598 }
599 vdatas[i].varDatas[t] = NULL;
600
601 // Loop continues only for set variables with timesteps, e.g. xtime(Time) or xtime(Time,
602 // StrLen)
603 if( !vdatas[i].has_tsteps ) break;
604 }
605 }
606
607 // Debug output, if requested
608 if( 1 == dbgOut.get_verbosity() )
609 {
610 dbgOut.printf( 1, "Read variables: %s", vdatas.begin()->varName.c_str() );
611 for( unsigned int i = 1; i < vdatas.size(); i++ )
612 dbgOut.printf( 1, ", %s ", vdatas[i].varName.c_str() );
613 dbgOut.tprintf( 1, "\n" );
614 }
615
616 return rval;
617 }
References _fileId, _fileSet, _readNC, moab::ReadNC::dbgOut, ErrorCode, moab::DebugOutput::get_verbosity(), MB_CHK_SET_ERR, MB_SET_ERR, moab::ReadNC::mbImpl, NCFUNCAG, moab::DebugOutput::printf(), read_variables_to_set_allocate(), moab::Interface::tag_set_by_ptr(), and moab::DebugOutput::tprintf().
Referenced by moab::ScdNCHelper::read_variables(), and moab::UcdNCHelper::read_variables().
|
private |
Used by read_variables_to_set()
Definition at line 868 of file NCHelper.cpp.
870 {
871 std::vector< int >& dimLens = _readNC->dimLens;
872 DebugOutput& dbgOut = _readNC->dbgOut;
873
874 ErrorCode rval = MB_SUCCESS;
875
876 for( unsigned int i = 0; i < vdatas.size(); i++ )
877 {
878 // Set up readStarts and readCounts
879 if( vdatas[i].has_tsteps )
880 {
881 // First: time
882 vdatas[i].readStarts.push_back( 0 ); // This value is timestep dependent, will be set later
883 vdatas[i].readCounts.push_back( 1 );
884
885 // Next: other dimensions
886 for( unsigned int idx = 1; idx != vdatas[i].varDims.size(); idx++ )
887 {
888 vdatas[i].readStarts.push_back( 0 );
889 vdatas[i].readCounts.push_back( dimLens[vdatas[i].varDims[idx]] );
890 }
891 }
892 else
893 {
894 if( vdatas[i].varDims.empty() )
895 {
896 // Scalar variable
897 vdatas[i].readStarts.push_back( 0 );
898 vdatas[i].readCounts.push_back( 1 );
899 }
900 else
901 {
902 for( unsigned int idx = 0; idx != vdatas[i].varDims.size(); idx++ )
903 {
904 vdatas[i].readStarts.push_back( 0 );
905 vdatas[i].readCounts.push_back( dimLens[vdatas[i].varDims[idx]] );
906 }
907 }
908 }
909
910 // Get variable size
911 vdatas[i].sz = 1;
912 for( std::size_t idx = 0; idx != vdatas[i].readCounts.size(); idx++ )
913 vdatas[i].sz *= vdatas[i].readCounts[idx];
914
915 // Note, for set variables without timesteps, loop one time and then break
916 for( unsigned int t = 0; t < tstep_nums.size(); t++ )
917 {
918 dbgOut.tprintf( 2, "Reading variable %s, time step %d\n", vdatas[i].varName.c_str(), tstep_nums[t] );
919
920 if( tstep_nums[t] >= dimLens[tDim] )
921 {
922 MB_SET_ERR( MB_INDEX_OUT_OF_RANGE, "Wrong value for timestep number " << tstep_nums[t] );
923 }
924
925 // Get the tag to read into
926 if( !vdatas[i].varTags[t] )
927 {
928 rval = get_tag_to_set( vdatas[i], tstep_nums[t], vdatas[i].varTags[t] );MB_CHK_SET_ERR( rval, "Trouble getting tag to set variable " << vdatas[i].varName );
929 }
930
931 switch( vdatas[i].varDataType )
932 {
933 case NC_BYTE:
934 case NC_CHAR:
935 vdatas[i].varDatas[t] = new char[vdatas[i].sz];
936 break;
937 case NC_SHORT:
938 case NC_INT:
939 vdatas[i].varDatas[t] = new int[vdatas[i].sz];
940 break;
941 case NC_INT64:
942 vdatas[i].varDatas[t] = new long[vdatas[i].sz];
943 break;
944 case NC_FLOAT:
945 case NC_DOUBLE:
946 vdatas[i].varDatas[t] = new double[vdatas[i].sz];
947 break;
948 default:
949 MB_SET_ERR( MB_FAILURE, "Unexpected data type for variable " << vdatas[i].varName );
950 }
951
952 // Loop continues only for set variables with timesteps, e.g. xtime(Time) or xtime(Time,
953 // StrLen)
954 if( !vdatas[i].has_tsteps ) break;
955 }
956 }
957
958 return rval;
959 }
References _readNC, moab::ReadNC::dbgOut, moab::ReadNC::dimLens, ErrorCode, get_tag_to_set(), MB_CHK_SET_ERR, MB_INDEX_OUT_OF_RANGE, MB_SET_ERR, MB_SUCCESS, tDim, and moab::DebugOutput::tprintf().
Referenced by read_variables_to_set().
ErrorCode moab::NCHelper::update_time_tag_vals | ( | ) |
Update time tag values if timesteps spread across files.
Definition at line 372 of file NCHelper.cpp.
373 {
374 Interface*& mbImpl = _readNC->mbImpl;
375 std::vector< std::string >& dimNames = _readNC->dimNames;
376
377 ErrorCode rval;
378
379 // The time tag might be a dummy one (e.g. 'Time' for MPAS)
380 std::string time_tag_name = dimNames[tDim];
381 if( dummyVarNames.find( time_tag_name ) != dummyVarNames.end() ) return MB_SUCCESS;
382
383 Tag time_tag = 0;
384 const void* data = NULL;
385 int time_tag_size = 0;
386 rval = mbImpl->tag_get_handle( time_tag_name.c_str(), 0, MB_TYPE_DOUBLE, time_tag, MB_TAG_VARLEN );MB_CHK_SET_ERR( rval, "Trouble getting tag " << time_tag_name );
387 rval = mbImpl->tag_get_by_ptr( time_tag, &_fileSet, 1, &data, &time_tag_size );MB_CHK_SET_ERR( rval, "Trouble getting data of tag " << time_tag_name );
388 const double* time_tag_vals = static_cast< const double* >( data );
389
390 // Merge tVals (read from current file) to existing time tag
391 // Assume that time_tag_vals and tVals are both sorted
392 std::vector< double > merged_time_vals;
393 merged_time_vals.reserve( time_tag_size + nTimeSteps );
394 int i = 0;
395 int j = 0;
396
397 // Merge time values from time_tag_vals and tVals
398 while( i < time_tag_size && j < nTimeSteps )
399 {
400 if( time_tag_vals[i] < tVals[j] )
401 merged_time_vals.push_back( time_tag_vals[i++] );
402 else
403 merged_time_vals.push_back( tVals[j++] );
404 }
405
406 // Append remaining time values of time_tag_vals (if any)
407 while( i < time_tag_size )
408 merged_time_vals.push_back( time_tag_vals[i++] );
409
410 // Append remaining time values of tVals (if any)
411 while( j < nTimeSteps )
412 merged_time_vals.push_back( tVals[j++] );
413
414 data = &merged_time_vals[0];
415 time_tag_size = merged_time_vals.size();
416 rval = mbImpl->tag_set_by_ptr( time_tag, &_fileSet, 1, &data, &time_tag_size );MB_CHK_SET_ERR( rval, "Trouble setting data to tag " << time_tag_name );
417
418 return MB_SUCCESS;
419 }
References _fileSet, _readNC, moab::ReadNC::dimNames, dummyVarNames, ErrorCode, MB_CHK_SET_ERR, MB_SUCCESS, MB_TAG_VARLEN, MB_TYPE_DOUBLE, moab::ReadNC::mbImpl, nTimeSteps, moab::Interface::tag_get_by_ptr(), moab::Interface::tag_get_handle(), moab::Interface::tag_set_by_ptr(), tDim, and tVals.
Referenced by moab::ReadNC::load_file().
|
protected |
Cache some information from ReadNC.
Definition at line 109 of file NCHelper.hpp.
Referenced by create_attrib_string(), moab::NCHelperMPAS::create_gather_set_cells(), moab::NCHelperGCRM::create_gather_set_edges(), moab::NCHelperMPAS::create_gather_set_edges(), moab::NCHelperGCRM::create_gather_set_vertices(), moab::NCHelperMPAS::create_gather_set_vertices(), moab::NCHelperGCRM::create_local_edges(), moab::NCHelperMPAS::create_local_edges(), moab::NCHelperESMF::create_local_vertices(), moab::NCHelperGCRM::create_local_vertices(), moab::NCHelperMPAS::create_local_vertices(), moab::NCHelperDomain::create_mesh(), moab::NCHelperESMF::create_mesh(), moab::NCHelperGCRM::create_mesh(), moab::NCHelperMPAS::create_mesh(), moab::NCHelperScrip::create_mesh(), moab::NCHelperGCRM::create_padded_gather_set_cells(), moab::NCHelperMPAS::create_padded_gather_set_cells(), moab::NCHelperESMF::init_mesh_vals(), moab::NCHelperHOMME::init_mesh_vals(), moab::NCHelperScrip::init_mesh_vals(), read_coordinate(), moab::ScdNCHelper::read_scd_variables_to_nonset(), moab::NCHelperGCRM::read_ucd_variables_to_nonset(), moab::NCHelperHOMME::read_ucd_variables_to_nonset(), moab::NCHelperMPAS::read_ucd_variables_to_nonset(), and read_variables_to_set().
|
protected |
Definition at line 111 of file NCHelper.hpp.
Referenced by moab::ScdNCHelper::check_existing_mesh(), moab::NCHelperGCRM::check_existing_mesh(), moab::NCHelperHOMME::check_existing_mesh(), moab::NCHelperMPAS::check_existing_mesh(), create_conventional_tags(), create_dummy_variables(), moab::NCHelperESMF::create_local_cells(), moab::NCHelperMPAS::create_local_cells(), moab::NCHelperGCRM::create_local_edges(), moab::NCHelperMPAS::create_local_edges(), moab::NCHelperESMF::create_local_vertices(), moab::NCHelperGCRM::create_local_vertices(), moab::NCHelperMPAS::create_local_vertices(), moab::ScdNCHelper::create_mesh(), moab::NCHelperDomain::create_mesh(), moab::NCHelperHOMME::create_mesh(), moab::NCHelperMPAS::create_mesh(), moab::NCHelperScrip::create_mesh(), moab::NCHelperESMF::create_padded_local_cells(), moab::NCHelperGCRM::create_padded_local_cells(), moab::NCHelperMPAS::create_padded_local_cells(), moab::ScdNCHelper::create_quad_coordinate_tag(), moab::NCHelperDomain::init_mesh_vals(), moab::NCHelperEuler::init_mesh_vals(), moab::NCHelperFV::init_mesh_vals(), moab::NCHelperScrip::init_mesh_vals(), moab::ScdNCHelper::read_scd_variables_to_nonset_allocate(), moab::NCHelperGCRM::read_ucd_variables_to_nonset_allocate(), moab::NCHelperHOMME::read_ucd_variables_to_nonset_allocate(), moab::NCHelperMPAS::read_ucd_variables_to_nonset_allocate(), read_variables_to_set(), and update_time_tag_vals().
|
protected |
Definition at line 110 of file NCHelper.hpp.
Referenced by moab::NCHelperHOMME::create_mesh(), moab::NCHelperEuler::init_mesh_vals(), and moab::NCHelperFV::init_mesh_vals().
|
protected |
Allow NCHelper to directly access members of ReadNC.
Definition at line 106 of file NCHelper.hpp.
Referenced by moab::ScdNCHelper::check_existing_mesh(), moab::NCHelperGCRM::check_existing_mesh(), moab::NCHelperHOMME::check_existing_mesh(), moab::NCHelperMPAS::check_existing_mesh(), create_conventional_tags(), create_dummy_variables(), moab::NCHelperMPAS::create_gather_set_cells(), moab::NCHelperGCRM::create_gather_set_edges(), moab::NCHelperMPAS::create_gather_set_edges(), moab::NCHelperGCRM::create_gather_set_vertices(), moab::NCHelperMPAS::create_gather_set_vertices(), moab::NCHelperESMF::create_local_cells(), moab::NCHelperMPAS::create_local_cells(), moab::NCHelperGCRM::create_local_edges(), moab::NCHelperMPAS::create_local_edges(), moab::NCHelperESMF::create_local_vertices(), moab::NCHelperGCRM::create_local_vertices(), moab::NCHelperMPAS::create_local_vertices(), moab::ScdNCHelper::create_mesh(), moab::NCHelperDomain::create_mesh(), moab::NCHelperESMF::create_mesh(), moab::NCHelperGCRM::create_mesh(), moab::NCHelperHOMME::create_mesh(), moab::NCHelperMPAS::create_mesh(), moab::NCHelperScrip::create_mesh(), moab::NCHelperGCRM::create_padded_gather_set_cells(), moab::NCHelperMPAS::create_padded_gather_set_cells(), moab::NCHelperESMF::create_padded_local_cells(), moab::NCHelperGCRM::create_padded_local_cells(), moab::NCHelperMPAS::create_padded_local_cells(), moab::ScdNCHelper::create_quad_coordinate_tag(), get_tag_to_nonset(), get_tag_to_set(), moab::NCHelperDomain::init_mesh_vals(), moab::NCHelperESMF::init_mesh_vals(), moab::NCHelperEuler::init_mesh_vals(), moab::NCHelperFV::init_mesh_vals(), moab::NCHelperGCRM::init_mesh_vals(), moab::NCHelperHOMME::init_mesh_vals(), moab::NCHelperMPAS::init_mesh_vals(), moab::NCHelperScrip::init_mesh_vals(), read_coordinate(), moab::ScdNCHelper::read_scd_variables_to_nonset(), moab::ScdNCHelper::read_scd_variables_to_nonset_allocate(), moab::NCHelperGCRM::read_ucd_variables_to_nonset(), moab::NCHelperHOMME::read_ucd_variables_to_nonset(), moab::NCHelperMPAS::read_ucd_variables_to_nonset(), moab::NCHelperGCRM::read_ucd_variables_to_nonset_allocate(), moab::NCHelperHOMME::read_ucd_variables_to_nonset_allocate(), moab::NCHelperMPAS::read_ucd_variables_to_nonset_allocate(), read_variables_setup(), read_variables_to_set(), read_variables_to_set_allocate(), and update_time_tag_vals().
|
protected |
Dummy variables.
Definition at line 126 of file NCHelper.hpp.
Referenced by create_conventional_tags(), create_dummy_variables(), read_variables_setup(), and update_time_tag_vals().
|
protected |
Ignored variables.
Definition at line 123 of file NCHelper.hpp.
Referenced by moab::NCHelperMPAS::init_mesh_vals(), moab::NCHelperGCRM::NCHelperGCRM(), moab::NCHelperMPAS::NCHelperMPAS(), and read_variables_setup().
|
protected |
Definition at line 120 of file NCHelper.hpp.
Referenced by moab::NCHelperDomain::init_mesh_vals(), moab::NCHelperEuler::init_mesh_vals(), moab::NCHelperFV::init_mesh_vals(), moab::NCHelperGCRM::init_mesh_vals(), moab::NCHelperHOMME::init_mesh_vals(), and moab::NCHelperMPAS::init_mesh_vals().
|
protected |
Definition at line 117 of file NCHelper.hpp.
Referenced by moab::NCHelperGCRM::create_gather_set_vertices(), moab::NCHelperGCRM::create_local_vertices(), moab::ScdNCHelper::create_mesh(), moab::NCHelperHOMME::create_mesh(), and moab::NCHelperHOMME::init_mesh_vals().
|
protected |
Definition at line 114 of file NCHelper.hpp.
Referenced by moab::NCHelperGCRM::create_local_vertices(), moab::NCHelperDomain::init_mesh_vals(), moab::NCHelperEuler::init_mesh_vals(), moab::NCHelperFV::init_mesh_vals(), moab::NCHelperGCRM::init_mesh_vals(), moab::NCHelperHOMME::init_mesh_vals(), and moab::NCHelperMPAS::init_mesh_vals().
|
protected |
Dimensions of time and level.
Definition at line 114 of file NCHelper.hpp.
Referenced by create_conventional_tags(), moab::NCHelperDomain::init_mesh_vals(), moab::NCHelperEuler::init_mesh_vals(), moab::NCHelperFV::init_mesh_vals(), moab::NCHelperGCRM::init_mesh_vals(), moab::NCHelperHOMME::init_mesh_vals(), moab::NCHelperMPAS::init_mesh_vals(), read_variables_setup(), and update_time_tag_vals().
|
protected |
Dimension numbers for time and level.
Definition at line 120 of file NCHelper.hpp.
Referenced by moab::NCHelperDomain::init_mesh_vals(), moab::NCHelperEuler::init_mesh_vals(), moab::NCHelperFV::init_mesh_vals(), moab::NCHelperGCRM::init_mesh_vals(), moab::NCHelperHOMME::init_mesh_vals(), moab::NCHelperMPAS::init_mesh_vals(), moab::ScdNCHelper::read_scd_variables_to_nonset_allocate(), moab::NCHelperGCRM::read_ucd_variables_to_nonset_allocate(), moab::NCHelperHOMME::read_ucd_variables_to_nonset_allocate(), moab::NCHelperMPAS::read_ucd_variables_to_nonset_allocate(), read_variables_setup(), read_variables_to_set_allocate(), and update_time_tag_vals().
|
protected |
Values for time and level.
Definition at line 117 of file NCHelper.hpp.
Referenced by create_conventional_tags(), moab::NCHelperDomain::init_mesh_vals(), moab::NCHelperEuler::init_mesh_vals(), moab::NCHelperFV::init_mesh_vals(), moab::NCHelperGCRM::init_mesh_vals(), moab::NCHelperHOMME::init_mesh_vals(), moab::NCHelperMPAS::init_mesh_vals(), and update_time_tag_vals().