moab
|
Helper class to isolate reading of several different nc file formats. More...
#include <NCHelper.hpp>
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. | |
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. | |
Static Public Member Functions | |
static NCHelper * | get_nc_helper (ReadNC *readNC, int fileId, const FileOptions &opts, EntityHandle fileSet) |
Get appropriate helper instance for ReadNC class. | |
Protected Member Functions | |
ErrorCode | read_variable_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) | |
ErrorCode | read_variable_to_set (std::vector< ReadNC::VarData > &vdatas, std::vector< int > &tstep_nums) |
Read set variables (common to scd mesh and ucd mesh) | |
ErrorCode | convert_variable (ReadNC::VarData &var_data, int tstep_num) |
Convert variables in place. | |
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) |
ErrorCode | create_dummy_variables () |
Protected Attributes | |
ReadNC * | _readNC |
Allow NCHelper to directly access members of ReadNC. | |
int | _fileId |
Cache some information from ReadNC. | |
const FileOptions & | _opts |
EntityHandle | _fileSet |
int | nTimeSteps |
Dimensions of time and level. | |
int | nLevels |
std::vector< double > | tVals |
Values for time and level. | |
std::vector< double > | levVals |
int | tDim |
Dimension numbers for time and level. | |
int | levDim |
std::set< std::string > | ignoredVarNames |
Ignored variables. | |
std::set< std::string > | dummyVarNames |
Dummy variables. | |
Private Member Functions | |
ErrorCode | read_variable_to_set_allocate (std::vector< ReadNC::VarData > &vdatas, std::vector< int > &tstep_nums) |
Used by read_variable_to_set() |
Helper class to isolate reading of several different nc file formats.
Definition at line 17 of file NCHelper.hpp.
moab::NCHelper::NCHelper | ( | ReadNC * | readNC, |
int | fileId, | ||
const FileOptions & | opts, | ||
EntityHandle | fileSet | ||
) | [inline] |
Definition at line 20 of file NCHelper.hpp.
virtual moab::NCHelper::~NCHelper | ( | ) | [inline, virtual] |
Definition at line 23 of file NCHelper.hpp.
{}
virtual ErrorCode moab::NCHelper::check_existing_mesh | ( | ) | [pure virtual] |
Implemented in moab::ScdNCHelper, moab::NCHelperHOMME, and moab::NCHelperMPAS.
ErrorCode moab::NCHelper::convert_variable | ( | ReadNC::VarData & | var_data, |
int | tstep_num | ||
) | [protected] |
Convert variables in place.
Definition at line 489 of file NCHelper.cpp.
{ DebugOutput& dbgOut = _readNC->dbgOut; // Get ptr to tag space void* data = var_data.varDatas[tstep_num]; // Get variable size std::size_t sz = var_data.sz; assert(sz > 0); // Finally, read into that space int success = 0; int* idata; double* ddata; float* fdata; short* sdata; switch (var_data.varDataType) { case NC_FLOAT: ddata = (double*) var_data.varDatas[tstep_num]; fdata = (float*) var_data.varDatas[tstep_num]; // Convert in-place for (int i = sz - 1; i >= 0; i--) ddata[i] = fdata[i]; break; case NC_SHORT: idata = (int*) var_data.varDatas[tstep_num]; sdata = (short*) var_data.varDatas[tstep_num]; // Convert in-place for (int i = sz - 1; i >= 0; i--) idata[i] = sdata[i]; break; default: success = 1; } if (2 <= dbgOut.get_verbosity() && !success) { double dmin, dmax; int imin, imax; switch (var_data.varDataType) { case NC_DOUBLE: case NC_FLOAT: ddata = (double*) data; if (sz == 0) break; dmin = dmax = ddata[0]; for (unsigned int i = 1; i < sz; i++) { if (ddata[i] < dmin) dmin = ddata[i]; if (ddata[i] > dmax) dmax = ddata[i]; } dbgOut.tprintf(2, "Variable %s (double): min = %f, max = %f\n", var_data.varName.c_str(), dmin, dmax); break; case NC_INT: case NC_SHORT: idata = (int*) data; if (sz == 0) break; imin = imax = idata[0]; for (unsigned int i = 1; i < sz; i++) { if (idata[i] < imin) imin = idata[i]; if (idata[i] > imax) imax = idata[i]; } dbgOut.tprintf(2, "Variable %s (int): min = %d, max = %d\n", var_data.varName.c_str(), imin, imax); break; case NC_NAT: case NC_BYTE: case NC_CHAR: break; default: // Default case added to remove compiler warnings success = 1; } } return MB_SUCCESS; }
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 680 of file NCHelper.cpp.
{ int success; std::stringstream ssAtt; unsigned int sz = 0; std::map<std::string, ReadNC::AttData>::const_iterator attIt = attMap.begin(); for (; attIt != attMap.end(); ++attIt) { ssAtt << attIt->second.attName; ssAtt << '\0'; void* attData = NULL; switch (attIt->second.attDataType) { case NC_BYTE: case NC_CHAR: sz = attIt->second.attLen; attData = (char *) malloc(sz); success = NCFUNC(get_att_text)(_fileId, attIt->second.attVarId, attIt->second.attName.c_str(), (char*) attData); ERRORS(success, "Failed to read attribute char data."); ssAtt << "char;"; break; case NC_DOUBLE: sz = attIt->second.attLen * sizeof(double); attData = (double *) malloc(sz); success = NCFUNC(get_att_double)(_fileId, attIt->second.attVarId, attIt->second.attName.c_str(), (double*) attData); ERRORS(success, "Failed to read attribute double data."); ssAtt << "double;"; break; case NC_FLOAT: sz = attIt->second.attLen * sizeof(float); attData = (float *) malloc(sz); success = NCFUNC(get_att_float)(_fileId, attIt->second.attVarId, attIt->second.attName.c_str(), (float*) attData); ERRORS(success, "Failed to read attribute float data."); ssAtt << "float;"; break; case NC_INT: sz = attIt->second.attLen * sizeof(int); attData = (int *) malloc(sz); success = NCFUNC(get_att_int)(_fileId, attIt->second.attVarId, attIt->second.attName.c_str(), (int*) attData); ERRORS(success, "Failed to read attribute int data."); ssAtt << "int;"; break; case NC_SHORT: sz = attIt->second.attLen * sizeof(short); attData = (short *) malloc(sz); success = NCFUNC(get_att_short)(_fileId, attIt->second.attVarId, attIt->second.attName.c_str(), (short*) attData); ERRORS(success, "Failed to read attribute short data."); ssAtt << "short;"; break; default: success = 1; } char* tmpc = (char *) attData; for (unsigned int counter = 0; counter != sz; ++counter) ssAtt << tmpc[counter]; free(attData); ssAtt << ';'; attLen.push_back(ssAtt.str().size() - 1); } attVal = ssAtt.str(); return MB_SUCCESS; }
ErrorCode moab::NCHelper::create_conventional_tags | ( | const std::vector< int > & | tstep_nums | ) |
Create NC conventional tags.
Definition at line 60 of file NCHelper.cpp.
{ Interface*& mbImpl = _readNC->mbImpl; std::vector<std::string>& dimNames = _readNC->dimNames; std::vector<int>& dimLens = _readNC->dimLens; std::map<std::string, ReadNC::AttData>& globalAtts = _readNC->globalAtts; std::map<std::string, ReadNC::VarData>& varInfo = _readNC->varInfo; DebugOutput& dbgOut = _readNC->dbgOut; int& partMethod = _readNC->partMethod; ScdInterface* scdi = _readNC->scdi; ErrorCode rval; std::string tag_name; // <__NUM_DIMS> Tag numDimsTag = 0; tag_name = "__NUM_DIMS"; int numDims = dimNames.size(); rval = mbImpl->tag_get_handle(tag_name.c_str(), 1, MB_TYPE_INTEGER, numDimsTag, MB_TAG_SPARSE | MB_TAG_CREAT); ERRORR(rval, "Trouble creating __NUM_DIMS tag."); rval = mbImpl->tag_set_data(numDimsTag, &_fileSet, 1, &numDims); ERRORR(rval, "Trouble setting data for __NUM_DIMS tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); // <__NUM_VARS> Tag numVarsTag = 0; tag_name = "__NUM_VARS"; int numVars = varInfo.size(); rval = mbImpl->tag_get_handle(tag_name.c_str(), 1, MB_TYPE_INTEGER, numVarsTag, MB_TAG_SPARSE | MB_TAG_CREAT); ERRORR(rval, "Trouble creating __NUM_VARS tag."); rval = mbImpl->tag_set_data(numVarsTag, &_fileSet, 1, &numVars); ERRORR(rval, "Trouble setting data for __NUM_VARS tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); // <__DIM_NAMES> Tag dimNamesTag = 0; tag_name = "__DIM_NAMES"; std::string dimnames; unsigned int dimNamesSz = dimNames.size(); for (unsigned int i = 0; i != dimNamesSz; i++) { dimnames.append(dimNames[i]); dimnames.push_back('\0'); } int dimnamesSz = dimnames.size(); rval = mbImpl->tag_get_handle(tag_name.c_str(), 0, MB_TYPE_OPAQUE, dimNamesTag, MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN); ERRORR(rval, "Trouble creating __DIM_NAMES tag."); const void* ptr = dimnames.c_str(); rval = mbImpl->tag_set_by_ptr(dimNamesTag, &_fileSet, 1, &ptr, &dimnamesSz); ERRORR(rval, "Trouble setting data for __DIM_NAMES tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); // <__DIM_LENS> Tag dimLensTag = 0; tag_name = "__DIM_LENS"; int dimLensSz = dimLens.size(); rval = mbImpl->tag_get_handle(tag_name.c_str(), 0, MB_TYPE_INTEGER, dimLensTag, MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN); ERRORR(rval, "Trouble creating __DIM_LENS tag."); ptr = &(dimLens[0]); rval = mbImpl->tag_set_by_ptr(dimLensTag, &_fileSet, 1, &ptr, &dimLensSz); ERRORR(rval, "Trouble setting data for __DIM_LENS tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); // <__VAR_NAMES> Tag varNamesTag = 0; tag_name = "__VAR_NAMES"; std::string varnames; std::map<std::string, ReadNC::VarData>::iterator mapIter; for (mapIter = varInfo.begin(); mapIter != varInfo.end(); ++mapIter) { varnames.append(mapIter->first); varnames.push_back('\0'); } int varnamesSz = varnames.size(); rval = mbImpl->tag_get_handle(tag_name.c_str(), 0, MB_TYPE_OPAQUE, varNamesTag, MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN); ERRORR(rval, "Trouble creating __VAR_NAMES tag."); ptr = varnames.c_str(); rval = mbImpl->tag_set_by_ptr(varNamesTag, &_fileSet, 1, &ptr, &varnamesSz); ERRORR(rval, "Trouble setting data for __VAR_NAMES tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); // __<dim_name>_LOC_MINMAX (for time) for (unsigned int i = 0; i != dimNamesSz; i++) { if (dimNames[i] == "time" || dimNames[i] == "Time" || dimNames[i] == "t") { std::stringstream ss_tag_name; ss_tag_name << "__" << dimNames[i] << "_LOC_MINMAX"; tag_name = ss_tag_name.str(); Tag tagh = 0; std::vector<int> val(2, 0); val[0] = 0; val[1] = nTimeSteps - 1; rval = mbImpl->tag_get_handle(tag_name.c_str(), 2, MB_TYPE_INTEGER, tagh, MB_TAG_SPARSE | MB_TAG_CREAT); ERRORR(rval, "Trouble creating __<dim_name>_LOC_MINMAX tag."); rval = mbImpl->tag_set_data(tagh, &_fileSet, 1, &val[0]); ERRORR(rval, "Trouble setting data for __<dim_name>_LOC_MINMAX tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); } } // __<dim_name>_LOC_VALS (for time) for (unsigned int i = 0; i != dimNamesSz; i++) { if (dimNames[i] == "time" || dimNames[i] == "Time" || dimNames[i] == "t") { std::vector<int> val; if (!tstep_nums.empty()) val = tstep_nums; else { val.resize(tVals.size()); for (unsigned int j = 0; j != tVals.size(); j++) val[j] = j; } Tag tagh = 0; std::stringstream ss_tag_name; ss_tag_name << "__" << dimNames[i] << "_LOC_VALS"; tag_name = ss_tag_name.str(); rval = mbImpl->tag_get_handle(tag_name.c_str(), val.size(), MB_TYPE_INTEGER, tagh, MB_TAG_SPARSE | MB_TAG_CREAT); ERRORR(rval, "Trouble creating __<dim_name>_LOC_VALS tag."); rval = mbImpl->tag_set_data(tagh, &_fileSet, 1, &val[0]); ERRORR(rval, "Trouble setting data for __<dim_name>_LOC_VALS tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); } } // __<var_name>_DIMS for (mapIter = varInfo.begin(); mapIter != varInfo.end(); ++mapIter) { Tag varNamesDimsTag = 0; std::stringstream ss_tag_name; ss_tag_name << "__" << mapIter->first << "_DIMS"; tag_name = ss_tag_name.str(); unsigned int varDimSz = varInfo[mapIter->first].varDims.size(); if (varDimSz == 0) continue; varInfo[mapIter->first].varTags.resize(varDimSz, 0); for (unsigned int i = 0; i != varDimSz; i++) { Tag tmptag = 0; std::string tmptagname = dimNames[varInfo[mapIter->first].varDims[i]]; mbImpl->tag_get_handle(tmptagname.c_str(), 0, MB_TYPE_OPAQUE, tmptag, MB_TAG_ANY); varInfo[mapIter->first].varTags[i] = tmptag; } rval = mbImpl->tag_get_handle(tag_name.c_str(), varDimSz, MB_TYPE_HANDLE, varNamesDimsTag, MB_TAG_SPARSE | MB_TAG_CREAT); ERRORR(rval, "Trouble creating __<var_name>_DIMS tag."); rval = mbImpl->tag_set_data(varNamesDimsTag, &_fileSet, 1, &(varInfo[mapIter->first].varTags[0])); ERRORR(rval, "Trouble setting data for __<var_name>_DIMS tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); } // <PARTITION_METHOD> Tag part_tag = scdi->part_method_tag(); if (!part_tag) ERRORR(MB_FAILURE, "Trouble getting partition method tag."); rval = mbImpl->tag_set_data(part_tag, &_fileSet, 1, &partMethod); ERRORR(rval, "Trouble setting data for PARTITION_METHOD tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); // <__GLOBAL_ATTRIBS> tag_name = "__GLOBAL_ATTRIBS"; Tag globalAttTag = 0; rval = mbImpl->tag_get_handle(tag_name.c_str(), 0, MB_TYPE_OPAQUE, globalAttTag, MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN); ERRORR(rval, "Trouble creating __GLOBAL_ATTRIBS tag."); std::string gattVal; std::vector<int> gattLen; rval = create_attrib_string(globalAtts, gattVal, gattLen); ERRORR(rval, "Trouble creating attribute strings."); const void* gattptr = gattVal.c_str(); int globalAttSz = gattVal.size(); rval = mbImpl->tag_set_by_ptr(globalAttTag, &_fileSet, 1, &gattptr, &globalAttSz); ERRORR(rval, "Trouble setting data for __GLOBAL_ATTRIBS tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); // <__GLOBAL_ATTRIBS_LEN> tag_name = "__GLOBAL_ATTRIBS_LEN"; Tag globalAttLenTag = 0; if (gattLen.size() == 0) gattLen.push_back(0); rval = mbImpl->tag_get_handle(tag_name.c_str(), gattLen.size(), MB_TYPE_INTEGER, globalAttLenTag, MB_TAG_SPARSE | MB_TAG_CREAT); ERRORR(rval, "Trouble creating __GLOBAL_ATTRIBS_LEN tag."); rval = mbImpl->tag_set_data(globalAttLenTag, &_fileSet, 1, &gattLen[0]); ERRORR(rval, "Trouble setting data for __GLOBAL_ATTRIBS_LEN tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); // __<var_name>_ATTRIBS and __<var_name>_ATTRIBS_LEN for (mapIter = varInfo.begin(); mapIter != varInfo.end(); ++mapIter) { std::stringstream ssTagName; ssTagName << "__" << mapIter->first << "_ATTRIBS"; tag_name = ssTagName.str(); Tag varAttTag = 0; rval = mbImpl->tag_get_handle(tag_name.c_str(), 0, MB_TYPE_OPAQUE, varAttTag, MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN); ERRORR(rval, "Trouble creating __<var_name>_ATTRIBS tag."); std::string varAttVal; std::vector<int> varAttLen; rval = create_attrib_string(mapIter->second.varAtts, varAttVal, varAttLen); ERRORR(rval, "Trouble creating attribute strings."); const void* varAttPtr = varAttVal.c_str(); int varAttSz = varAttVal.size(); rval = mbImpl->tag_set_by_ptr(varAttTag, &_fileSet, 1, &varAttPtr, &varAttSz); ERRORR(rval, "Trouble setting data for __<var_name>_ATTRIBS tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); if (varAttLen.size() == 0) varAttLen.push_back(0); ssTagName << "_LEN"; tag_name = ssTagName.str(); Tag varAttLenTag = 0; rval = mbImpl->tag_get_handle(tag_name.c_str(), varAttLen.size(), MB_TYPE_INTEGER, varAttLenTag, MB_TAG_SPARSE | MB_TAG_CREAT); ERRORR(rval, "Trouble creating __<var_name>_ATTRIBS_LEN tag."); rval = mbImpl->tag_set_data(varAttLenTag, &_fileSet, 1, &varAttLen[0]); ERRORR(rval, "Trouble setting data for __<var_name>_ATTRIBS_LEN tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); } // <__VAR_NAMES_LOCATIONS> tag_name = "__VAR_NAMES_LOCATIONS"; Tag varNamesLocsTag = 0; std::vector<int> varNamesLocs(varInfo.size()); rval = mbImpl->tag_get_handle(tag_name.c_str(), varNamesLocs.size(), MB_TYPE_INTEGER, varNamesLocsTag, MB_TAG_CREAT | MB_TAG_SPARSE); ERRORR(rval, "Trouble creating __VAR_NAMES_LOCATIONS tag."); for (mapIter = varInfo.begin(); mapIter != varInfo.end(); ++mapIter) { varNamesLocs[std::distance(varInfo.begin(), mapIter)] = mapIter->second.entLoc; } rval = mbImpl->tag_set_data(varNamesLocsTag, &_fileSet, 1, &varNamesLocs[0]); ERRORR(rval, "Trouble setting data for __VAR_NAMES_LOCATIONS tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); // <__MESH_TYPE> Tag meshTypeTag = 0; tag_name = "__MESH_TYPE"; std::string meshTypeName = get_mesh_type_name(); rval = mbImpl->tag_get_handle(tag_name.c_str(), 0, MB_TYPE_OPAQUE, meshTypeTag, MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN); ERRORR(rval, "Trouble creating __MESH_TYPE tag."); ptr = meshTypeName.c_str(); int leng = meshTypeName.size(); rval = mbImpl->tag_set_by_ptr(meshTypeTag, &_fileSet, 1, &ptr, &leng); ERRORR(rval, "Trouble setting data for __MESH_TYPE tag."); if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.c_str()); return MB_SUCCESS; }
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 742 of file NCHelper.cpp.
{ Interface*& mbImpl = _readNC->mbImpl; std::vector<std::string>& dimNames = _readNC->dimNames; std::vector<int>& dimLens = _readNC->dimLens; std::map<std::string, ReadNC::VarData>& varInfo = _readNC->varInfo; DebugOutput& dbgOut = _readNC->dbgOut; // Hack: look at all dimensions, and see if we have one that does not appear in the list of varInfo names // Right now, candidates are from unstructured meshes, such as ncol (HOMME) and nCells (MPAS) // For each of them, create a dummy variable with a sparse tag to store the dimension length for (unsigned int i = 0; i < dimNames.size(); i++) { // If there is a variable with this dimension name, skip if (varInfo.find(dimNames[i]) != varInfo.end()) continue; // Create a dummy variable int sizeTotalVar = varInfo.size(); std::string var_name(dimNames[i]); ReadNC::VarData& data = varInfo[var_name]; data.varName = std::string(var_name); data.varId = sizeTotalVar; data.varTags.resize(1, 0); data.varDataType = NC_INT; data.varDims.resize(1); data.varDims[0] = (int)i; data.numAtts = 0; data.entLoc = ReadNC::ENTLOCSET; dummyVarNames.insert(dimNames[i]); dbgOut.tprintf(2, "Dummy variable created for dimension %s\n", dimNames[i].c_str()); // Create a corresponding sparse tag Tag tagh; ErrorCode rval = mbImpl->tag_get_handle(dimNames[i].c_str(), 0, MB_TYPE_INTEGER, tagh, MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN); ERRORR(rval, "Failed to create tag for a dummy dimension variable."); // Tag value is the dimension length const void* ptr = &dimLens[i]; // Tag size is 1 int size = 1; rval = mbImpl->tag_set_by_ptr(tagh, &_fileSet, 1, &ptr, &size); ERRORR(rval, "Failed to set data for dimension tag."); dbgOut.tprintf(2, "Sparse tag created for dimension %s\n", dimNames[i].c_str()); } return MB_SUCCESS; }
virtual ErrorCode moab::NCHelper::create_mesh | ( | Range & | faces | ) | [pure virtual] |
Implemented in moab::ScdNCHelper, moab::NCHelperHOMME, and moab::NCHelperMPAS.
virtual std::string moab::NCHelper::get_mesh_type_name | ( | ) | [pure virtual] |
Implemented in moab::NCHelperHOMME, moab::NCHelperMPAS, moab::NCHelperEuler, and moab::NCHelperFV.
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 20 of file NCHelper.cpp.
{ // Check if CF convention is being followed bool is_CF = false; std::map<std::string, ReadNC::AttData>& globalAtts = readNC->globalAtts; std::map<std::string, ReadNC::AttData>::iterator attIt = globalAtts.find("conventions"); if (attIt == globalAtts.end()) attIt = globalAtts.find("Conventions"); if (attIt != globalAtts.end()) { unsigned int sz = attIt->second.attLen; std::string att_data; att_data.resize(sz + 1); att_data[sz] = '\000'; int success = NCFUNC(get_att_text)(fileId, attIt->second.attVarId, attIt->second.attName.c_str(), &att_data[0]); if (0 == success && att_data.find("CF") != std::string::npos) is_CF = true; } if (is_CF) { if (NCHelperEuler::can_read_file(readNC, fileId)) return new (std::nothrow) NCHelperEuler(readNC, fileId, opts, fileSet); else if (NCHelperFV::can_read_file(readNC, fileId)) return new (std::nothrow) NCHelperFV(readNC, fileId, opts, fileSet); else if (NCHelperHOMME::can_read_file(readNC, fileId)) return new (std::nothrow) NCHelperHOMME(readNC, fileId, opts, fileSet); } else { if (NCHelperMPAS::can_read_file(readNC)) return new (std::nothrow) NCHelperMPAS(readNC, fileId, opts, fileSet); // For a HOMME connectivity file, there might be no CF convention else if (NCHelperHOMME::can_read_file(readNC, fileId)) return new (std::nothrow) NCHelperHOMME(readNC, fileId, opts, fileSet); } // Unknown NetCDF grid (will fill this in later for POP, CICE and CLM) return NULL; }
ErrorCode moab::NCHelper::get_tag_to_nonset | ( | ReadNC::VarData & | var_data, |
int | tstep_num, | ||
Tag & | tagh, | ||
int | num_lev | ||
) | [protected] |
Definition at line 646 of file NCHelper.cpp.
{ Interface*& mbImpl = _readNC->mbImpl; DebugOutput& dbgOut = _readNC->dbgOut; std::ostringstream tag_name; tag_name << var_data.varName << tstep_num; ErrorCode rval = MB_SUCCESS; tagh = 0; switch (var_data.varDataType) { case NC_BYTE: case NC_CHAR: rval = mbImpl->tag_get_handle(tag_name.str().c_str(), num_lev, MB_TYPE_OPAQUE, tagh, MB_TAG_DENSE | MB_TAG_CREAT); break; case NC_DOUBLE: case NC_FLOAT: rval = mbImpl->tag_get_handle(tag_name.str().c_str(), num_lev, MB_TYPE_DOUBLE, tagh, MB_TAG_DENSE | MB_TAG_CREAT); break; case NC_INT: case NC_SHORT: rval = mbImpl->tag_get_handle(tag_name.str().c_str(), num_lev, MB_TYPE_INTEGER, tagh, MB_TAG_DENSE | MB_TAG_CREAT); break; default: std::cerr << "Unrecognized data type for tag " << tag_name.str() << std::endl; rval = MB_FAILURE; } if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.str().c_str()); return rval; }
ErrorCode moab::NCHelper::get_tag_to_set | ( | ReadNC::VarData & | var_data, |
int | tstep_num, | ||
Tag & | tagh | ||
) | [protected] |
Definition at line 609 of file NCHelper.cpp.
{ Interface*& mbImpl = _readNC->mbImpl; DebugOutput& dbgOut = _readNC->dbgOut; std::ostringstream tag_name; if (var_data.has_tsteps) tag_name << var_data.varName << tstep_num; else tag_name << var_data.varName; ErrorCode rval = MB_SUCCESS; tagh = 0; switch (var_data.varDataType) { case NC_BYTE: case NC_CHAR: rval = mbImpl->tag_get_handle(tag_name.str().c_str(), 0, MB_TYPE_OPAQUE, tagh, MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN); break; case NC_DOUBLE: case NC_FLOAT: rval = mbImpl->tag_get_handle(tag_name.str().c_str(), 0, MB_TYPE_DOUBLE, tagh, MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN); break; case NC_INT: case NC_SHORT: rval = mbImpl->tag_get_handle(tag_name.str().c_str(), 0, MB_TYPE_INTEGER, tagh, MB_TAG_CREAT | MB_TAG_SPARSE | MB_TAG_VARLEN); break; default: std::cerr << "Unrecognized data type for tag " << tag_name << std::endl; rval = MB_FAILURE; } if (MB_SUCCESS == rval) dbgOut.tprintf(2, "Tag created for variable %s\n", tag_name.str().c_str()); return rval; }
virtual ErrorCode moab::NCHelper::init_mesh_vals | ( | ) | [pure virtual] |
Interfaces to be implemented in child classes.
Implemented in moab::NCHelperEuler, moab::NCHelperFV, moab::NCHelperHOMME, and moab::NCHelperMPAS.
ErrorCode moab::NCHelper::read_coordinate | ( | const char * | var_name, |
int | lmin, | ||
int | lmax, | ||
std::vector< double > & | cvals | ||
) | [protected] |
Definition at line 572 of file NCHelper.cpp.
{ std::map<std::string, ReadNC::VarData>& varInfo = _readNC->varInfo; std::map<std::string, ReadNC::VarData>::iterator vmit = varInfo.find(var_name); if (varInfo.end() == vmit) return MB_FAILURE; assert(lmin >= 0 && lmax >= lmin); NCDF_SIZE tstart = lmin; NCDF_SIZE tcount = lmax - lmin + 1; NCDF_DIFF dum_stride = 1; int fail; // Check size if ((std::size_t)tcount != cvals.size()) cvals.resize(tcount); // Check to make sure it's a float or double if (NC_DOUBLE == (*vmit).second.varDataType) { fail = NCFUNCAG(_vars_double)(_fileId, (*vmit).second.varId, &tstart, &tcount, &dum_stride, &cvals[0]); if (fail) ERRORS(MB_FAILURE, "Failed to get coordinate values."); } else if (NC_FLOAT == (*vmit).second.varDataType) { std::vector<float> tcvals(tcount); fail = NCFUNCAG(_vars_float)(_fileId, (*vmit).second.varId, &tstart, &tcount, &dum_stride, &tcvals[0]); if (fail) ERRORS(MB_FAILURE, "Failed to get coordinate values."); std::copy(tcvals.begin(), tcvals.end(), cvals.begin()); } else { ERRORR(MB_FAILURE, "Wrong data type for coordinate variable."); } return MB_SUCCESS; }
ErrorCode moab::NCHelper::read_variable_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 310 of file NCHelper.cpp.
{ std::map<std::string, ReadNC::VarData>& varInfo = _readNC->varInfo; std::map<std::string, ReadNC::VarData>::iterator mit; // If empty read them all (except ignored variables) if (var_names.empty()) { for (mit = varInfo.begin(); mit != varInfo.end(); ++mit) { ReadNC::VarData vd = (*mit).second; // If read all variables at once, skip ignored ones // Upon creation of dummy variables, tag values have already been set if (ignoredVarNames.find(vd.varName) != ignoredVarNames.end() || dummyVarNames.find(vd.varName) != dummyVarNames.end()) continue; if (vd.entLoc == ReadNC::ENTLOCSET) vsetdatas.push_back(vd); else vdatas.push_back(vd); } } else { // Read specified variables (might include ignored ones) for (unsigned int i = 0; i < var_names.size(); i++) { mit = varInfo.find(var_names[i]); if (mit != varInfo.end()) { ReadNC::VarData vd = (*mit).second; // Upon creation of dummy variables, tag values have already been set if (dummyVarNames.find(vd.varName) != dummyVarNames.end()) continue; if (vd.entLoc == ReadNC::ENTLOCSET) vsetdatas.push_back(vd); else vdatas.push_back(vd); } else { ERRORR(MB_FAILURE, "Couldn't find variable."); } } } if (tstep_nums.empty() && nTimeSteps > 0) { // No timesteps input, get them all for (int i = 0; i < nTimeSteps; i++) tstep_nums.push_back(i); } if (!tstep_nums.empty()) { for (unsigned int i = 0; i < vdatas.size(); i++) { vdatas[i].varTags.resize(tstep_nums.size(), 0); vdatas[i].varDatas.resize(tstep_nums.size()); vdatas[i].has_tsteps = true; } for (unsigned int i = 0; i < vsetdatas.size(); i++) { if ((std::find(vsetdatas[i].varDims.begin(), vsetdatas[i].varDims.end(), tDim) != vsetdatas[i].varDims.end()) && (vsetdatas[i].varDims.size() > 1)) { // Set variables with timesteps: time is the first dimension, followed // by other dimensions, e.g. xtime(Time, StrLen) vsetdatas[i].varTags.resize(tstep_nums.size(), 0); vsetdatas[i].varDatas.resize(tstep_nums.size()); vsetdatas[i].has_tsteps = true; } else { // Set variables without timesteps: no time dimension, or time is the only // dimension, e.g. lev(lev), xtime(Time) vsetdatas[i].varTags.resize(1, 0); vsetdatas[i].varDatas.resize(1); vsetdatas[i].has_tsteps = false; } } } return MB_SUCCESS; }
ErrorCode moab::NCHelper::read_variable_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 390 of file NCHelper.cpp.
{ Interface*& mbImpl = _readNC->mbImpl; DebugOutput& dbgOut = _readNC->dbgOut; ErrorCode rval = read_variable_to_set_allocate(vdatas, tstep_nums); ERRORR(rval, "Trouble allocating read variables to set."); // Finally, read into that space int success; for (unsigned int i = 0; i < vdatas.size(); i++) { // Note, for set variables without timesteps, loop one time and then break for (unsigned int t = 0; t < tstep_nums.size(); t++) { void* data = vdatas[i].varDatas[t]; // Set variables with timesteps, e.g. xtime(Time, StrLen) if (vdatas[i].has_tsteps) { // Set readStart for each timestep along time dimension vdatas[i].readStarts[0] = tstep_nums[t]; } switch (vdatas[i].varDataType) { case NC_BYTE: case NC_CHAR: success = NCFUNCAG(_vara_text)(_fileId, vdatas[i].varId, &vdatas[i].readStarts[0], &vdatas[i].readCounts[0], (char*) data); ERRORS(success, "Failed to read char data."); break; case NC_DOUBLE: success = NCFUNCAG(_vara_double)(_fileId, vdatas[i].varId, &vdatas[i].readStarts[0], &vdatas[i].readCounts[0], (double*) data); ERRORS(success, "Failed to read double data."); break; case NC_FLOAT: success = NCFUNCAG(_vara_float)(_fileId, vdatas[i].varId, &vdatas[i].readStarts[0], &vdatas[i].readCounts[0], (float*) data); ERRORS(success, "Failed to read float data."); break; case NC_INT: success = NCFUNCAG(_vara_int)(_fileId, vdatas[i].varId, &vdatas[i].readStarts[0], &vdatas[i].readCounts[0], (int*) data); ERRORS(success, "Failed to read int data."); break; case NC_SHORT: success = NCFUNCAG(_vara_short)(_fileId, vdatas[i].varId, &vdatas[i].readStarts[0], &vdatas[i].readCounts[0], (short*) data); ERRORS(success, "Failed to read short data."); break; default: success = 1; } if (success) ERRORR(MB_FAILURE, "Trouble reading variable."); dbgOut.tprintf(2, "Converting variable %s, time step %d\n", vdatas[i].varName.c_str(), tstep_nums[t]); rval = convert_variable(vdatas[i], t); ERRORR(rval, "Failed to convert variable."); dbgOut.tprintf(2, "Setting data for variable %s, time step %d\n", vdatas[i].varName.c_str(), tstep_nums[t]); rval = mbImpl->tag_set_by_ptr(vdatas[i].varTags[t], &_fileSet, 1, &data, &vdatas[i].sz); ERRORR(rval, "Failed to set data for variable."); // Memory pointed by pointer data can be deleted, as tag_set_by_ptr() has already copied the tag values switch (vdatas[i].varDataType) { case NC_BYTE: case NC_CHAR: delete[] (char*) data; break; case NC_DOUBLE: case NC_FLOAT: delete[] (double*) data; break; case NC_INT: case NC_SHORT: delete[] (int*) data; break; default: break; } vdatas[i].varDatas[t] = NULL; // Loop continues only for set variables with timesteps, e.g. xtime(Time, StrLen) if (!vdatas[i].has_tsteps) break; } } // Debug output, if requested if (1 == dbgOut.get_verbosity()) { dbgOut.printf(1, "Read variables: %s", vdatas.begin()->varName.c_str()); for (unsigned int i = 1; i < vdatas.size(); i++) dbgOut.printf(1, ", %s ", vdatas[i].varName.c_str()); dbgOut.tprintf(1, "\n"); } return rval; }
ErrorCode moab::NCHelper::read_variable_to_set_allocate | ( | std::vector< ReadNC::VarData > & | vdatas, |
std::vector< int > & | tstep_nums | ||
) | [private] |
Used by read_variable_to_set()
Definition at line 792 of file NCHelper.cpp.
{ std::vector<int>& dimLens = _readNC->dimLens; DebugOutput& dbgOut = _readNC->dbgOut; ErrorCode rval = MB_SUCCESS; for (unsigned int i = 0; i < vdatas.size(); i++) { // Set up readStarts and readCounts if (vdatas[i].has_tsteps) { // First: time vdatas[i].readStarts.push_back(0); // This value is timestep dependent, will be set later vdatas[i].readCounts.push_back(1); // Next: other dimensions for (unsigned int idx = 1; idx != vdatas[i].varDims.size(); idx++){ vdatas[i].readStarts.push_back(0); vdatas[i].readCounts.push_back(dimLens[vdatas[i].varDims[idx]]); } } else { if (vdatas[i].varDims.empty()) { // Scalar variable vdatas[i].readStarts.push_back(0); vdatas[i].readCounts.push_back(1); } else { for (unsigned int idx = 0; idx != vdatas[i].varDims.size(); idx++){ vdatas[i].readStarts.push_back(0); vdatas[i].readCounts.push_back(dimLens[vdatas[i].varDims[idx]]); } } } // Get variable size vdatas[i].sz = 1; for (std::size_t idx = 0; idx != vdatas[i].readCounts.size(); idx++) vdatas[i].sz *= vdatas[i].readCounts[idx]; // Note, for set variables without timesteps, loop one time and then break for (unsigned int t = 0; t < tstep_nums.size(); t++) { dbgOut.tprintf(2, "Reading variable %s, time step %d\n", vdatas[i].varName.c_str(), tstep_nums[t]); if (tstep_nums[t] >= dimLens[tDim]) { ERRORR(MB_INDEX_OUT_OF_RANGE, "Wrong value for a timestep number."); } // Get the tag to read into if (!vdatas[i].varTags[t]) { rval = get_tag_to_set(vdatas[i], tstep_nums[t], vdatas[i].varTags[t]); ERRORR(rval, "Trouble getting tag for a set variable."); } switch (vdatas[i].varDataType) { case NC_BYTE: case NC_CHAR: vdatas[i].varDatas[t] = new char[vdatas[i].sz]; break; case NC_DOUBLE: case NC_FLOAT: vdatas[i].varDatas[t] = new double[vdatas[i].sz]; break; case NC_INT: case NC_SHORT: vdatas[i].varDatas[t] = new int[vdatas[i].sz]; break; default: std::cerr << "Unrecognized data type for set variable tag values" << std::endl; rval = MB_FAILURE; } // Loop continues only for set variables with timesteps, e.g. xtime(Time, StrLen) if (!vdatas[i].has_tsteps) break; } } return rval; }
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.
int moab::NCHelper::_fileId [protected] |
Cache some information from ReadNC.
Definition at line 80 of file NCHelper.hpp.
EntityHandle moab::NCHelper::_fileSet [protected] |
Definition at line 82 of file NCHelper.hpp.
const FileOptions& moab::NCHelper::_opts [protected] |
Definition at line 81 of file NCHelper.hpp.
ReadNC* moab::NCHelper::_readNC [protected] |
Allow NCHelper to directly access members of ReadNC.
Definition at line 77 of file NCHelper.hpp.
std::set<std::string> moab::NCHelper::dummyVarNames [protected] |
Dummy variables.
Definition at line 97 of file NCHelper.hpp.
std::set<std::string> moab::NCHelper::ignoredVarNames [protected] |
Ignored variables.
Definition at line 94 of file NCHelper.hpp.
int moab::NCHelper::levDim [protected] |
Definition at line 91 of file NCHelper.hpp.
std::vector<double> moab::NCHelper::levVals [protected] |
Definition at line 88 of file NCHelper.hpp.
int moab::NCHelper::nLevels [protected] |
Definition at line 85 of file NCHelper.hpp.
int moab::NCHelper::nTimeSteps [protected] |
Dimensions of time and level.
Definition at line 85 of file NCHelper.hpp.
int moab::NCHelper::tDim [protected] |
Dimension numbers for time and level.
Definition at line 91 of file NCHelper.hpp.
std::vector<double> moab::NCHelper::tVals [protected] |
Values for time and level.
Definition at line 88 of file NCHelper.hpp.