Loading [MathJax]/extensions/tex2jax.js
Mesh Oriented datABase  (version 5.5.1)
An array-based unstructured mesh library
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
moab::NCHelper Class Referenceabstract

Helper class to isolate reading of several different nc file formats. More...

#include <NCHelper.hpp>

+ Inheritance diagram for moab::NCHelper:
+ Collaboration diagram for moab::NCHelper:

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 NCHelperget_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...
 

Detailed Description

Helper class to isolate reading of several different nc file formats.

Definition at line 24 of file NCHelper.hpp.

Constructor & Destructor Documentation

◆ NCHelper()

moab::NCHelper::NCHelper ( ReadNC readNC,
int  fileId,
const FileOptions opts,
EntityHandle  fileSet 
)
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  }

◆ ~NCHelper()

virtual moab::NCHelper::~NCHelper ( )
inlinevirtual

Definition at line 32 of file NCHelper.hpp.

32 {}

Member Function Documentation

◆ check_existing_mesh()

virtual ErrorCode moab::NCHelper::check_existing_mesh ( )
pure virtual

◆ create_attrib_string()

ErrorCode moab::NCHelper::create_attrib_string ( const std::map< std::string, ReadNC::AttData > &  attMap,
std::string &  attString,
std::vector< int > &  attLen 
)
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().

◆ 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().

◆ create_dummy_variables()

ErrorCode moab::NCHelper::create_dummy_variables ( )
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().

◆ create_mesh()

virtual ErrorCode moab::NCHelper::create_mesh ( Range faces)
pure virtual

◆ get_default_ncformat_options()

std::string moab::NCHelper::get_default_ncformat_options ( ReadNC::NCFormatType  format)
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.

◆ get_mesh_type_name()

virtual std::string moab::NCHelper::get_mesh_type_name ( )
pure virtual

◆ get_nc_format()

ReadNC::NCFormatType moab::NCHelper::get_nc_format ( ReadNC readNC,
int  fileId 
)
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().

◆ get_nc_helper()

NCHelper * moab::NCHelper::get_nc_helper ( ReadNC readNC,
int  fileId,
const FileOptions opts,
EntityHandle  fileSet 
)
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().

◆ get_tag_to_nonset()

ErrorCode moab::NCHelper::get_tag_to_nonset ( ReadNC::VarData var_data,
int  tstep_num,
Tag tagh,
int  num_lev 
)
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().

◆ get_tag_to_set()

ErrorCode moab::NCHelper::get_tag_to_set ( ReadNC::VarData var_data,
int  tstep_num,
Tag tagh 
)
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().

◆ init_mesh_vals()

virtual ErrorCode moab::NCHelper::init_mesh_vals ( )
pure virtual

◆ read_coordinate()

ErrorCode moab::NCHelper::read_coordinate ( const char *  var_name,
int  lmin,
int  lmax,
std::vector< double > &  cvals 
)
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().

◆ read_variables()

virtual ErrorCode moab::NCHelper::read_variables ( std::vector< std::string > &  var_names,
std::vector< int > &  tstep_nums 
)
pure virtual

Implemented in moab::UcdNCHelper, and moab::ScdNCHelper.

Referenced by moab::ReadNC::load_file().

◆ read_variables_setup()

ErrorCode moab::NCHelper::read_variables_setup ( std::vector< std::string > &  var_names,
std::vector< int > &  tstep_nums,
std::vector< ReadNC::VarData > &  vdatas,
std::vector< ReadNC::VarData > &  vsetdatas 
)
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().

◆ read_variables_to_set()

ErrorCode moab::NCHelper::read_variables_to_set ( std::vector< ReadNC::VarData > &  vdatas,
std::vector< int > &  tstep_nums 
)
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().

◆ read_variables_to_set_allocate()

ErrorCode moab::NCHelper::read_variables_to_set_allocate ( std::vector< ReadNC::VarData > &  vdatas,
std::vector< int > &  tstep_nums 
)
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().

◆ update_time_tag_vals()

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().

Member Data Documentation

◆ _fileId

◆ _fileSet

◆ _opts

const FileOptions& moab::NCHelper::_opts
protected

◆ _readNC

ReadNC* moab::NCHelper::_readNC
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().

◆ dummyVarNames

std::set< std::string > moab::NCHelper::dummyVarNames
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().

◆ ignoredVarNames

std::set< std::string > moab::NCHelper::ignoredVarNames
protected

◆ levDim

◆ levVals

◆ nLevels

◆ nTimeSteps

◆ tDim

◆ tVals


The documentation for this class was generated from the following files: