static HdfGroup openHdfGroup(const HdfGroup& hdfGroup, const QString& name) { HdfGroup grp = hdfGroup.group(name); if (!grp.isValid()) { throw LoadStatus::Err_UnknownFormat; } return grp; }
bool MDAL::DriverFlo2D::parseHDF5Datasets( const std::string &datFileName ) { //return true on error size_t nFaces = mMesh->facesCount(); std::string timedepFileName = fileNameFromDir( datFileName, "TIMDEP.HDF5" ); if ( !fileExists( timedepFileName ) ) return true; HdfFile file( timedepFileName ); if ( !file.isValid() ) return true; HdfGroup timedataGroup = file.group( "TIMDEP NETCDF OUTPUT RESULTS" ); if ( !timedataGroup.isValid() ) return true; std::vector<std::string> groupNames = timedataGroup.groups(); for ( const std::string &grpName : groupNames ) { HdfGroup grp = timedataGroup.group( grpName ); if ( !grp.isValid() ) return true; HdfAttribute groupType = grp.attribute( "Grouptype" ); if ( !groupType.isValid() ) return true; /* Min and Max arrays in TIMDEP.HDF5 files have dimensions 1xntimesteps . HdfDataset minDs = grp.dataset("Mins"); if (!minDs.isValid()) return true; HdfDataset maxDs = grp.dataset("Maxs"); if (!maxDs.isValid()) return true; */ HdfDataset timesDs = grp.dataset( "Times" ); if ( !timesDs.isValid() ) return true; size_t timesteps = timesDs.elementCount(); HdfDataset valuesDs = grp.dataset( "Values" ); if ( !valuesDs.isValid() ) return true; bool isVector = MDAL::contains( groupType.readString(), "vector", ContainsBehaviour::CaseInsensitive ); // Some sanity checks size_t expectedSize = mMesh->facesCount() * timesteps; if ( isVector ) expectedSize *= 2; if ( valuesDs.elementCount() != expectedSize ) return true; // Read data std::vector<double> times = timesDs.readArrayDouble(); std::vector<float> values = valuesDs.readArray(); // Create dataset now std::shared_ptr<DatasetGroup> ds = std::make_shared< DatasetGroup >( name(), mMesh.get(), datFileName, grpName ); ds->setIsOnVertices( false ); ds->setIsScalar( !isVector ); for ( size_t ts = 0; ts < timesteps; ++ts ) { std::shared_ptr< MemoryDataset > output = std::make_shared< MemoryDataset >( ds.get() ); output->setTime( times[ts] ); if ( isVector ) { // vector for ( size_t i = 0; i < nFaces; ++i ) { size_t idx = 2 * ( ts * nFaces + i ); double x = getDouble( static_cast<double>( values[idx] ) ); double y = getDouble( static_cast<double>( values[idx + 1] ) ); output->values()[2 * i] = x; output->values()[2 * i + 1] = y; } } else { // scalar for ( size_t i = 0; i < nFaces; ++i ) { size_t idx = ts * nFaces + i; double val = getDouble( static_cast<double>( values[idx] ) ); output->values()[i] = val; } } addDatasetToGroup( ds, output ); } // TODO use mins & maxs arrays ds->setStatistics( MDAL::calculateStatistics( ds ) ); mMesh->datasetGroups.push_back( ds ); } return false; }