Mesh Oriented datABase  (version 5.4.1)
Array-based unstructured mesh datastructure
ReadHDF5VarLen.hpp
Go to the documentation of this file.
00001 /** \file   ReadHDF5VarLen.hpp
00002  *  \author Jason Kraftcheck
00003  *  \date   2010-09-04
00004  */
00005 
00006 #ifndef moab_READ_HDF5_VAR_LEN_HPP
00007 #define moab_READ_HDF5_VAR_LEN_HPP
00008 
00009 #include "moab/MOABConfig.h"
00010 #ifdef MOAB_HAVE_MPI
00011 #include "moab_mpi.h"
00012 #endif
00013 #include "DebugOutput.hpp"
00014 #include "moab/Range.hpp"
00015 #include "H5Ipublic.h"
00016 
00017 namespace moab
00018 {
00019 
00020 class ReadHDF5Dataset;
00021 
00022 /**\brief Read variable-length data from 1-D array dataset
00023  *
00024  * Utility class for reading variable-length data from an HDF5 dataset.
00025  * Used for reading set contents, set parents, set children,
00026  * polygon and polyhedron connectivity, and variable-length tag
00027  * data.
00028  *
00029  * This is an abstract class.  The pure virtual \c store_data method
00030  * must be implemented to create a concrete instance.
00031  */
00032 class ReadHDF5VarLen
00033 {
00034   protected:
00035     DebugOutput& dbgOut;
00036 
00037   private:
00038     void* const dataBuffer;
00039     const size_t bufferSize;
00040 
00041     /**\brief Test if passed file_id is value pointed to by ranged_iter,
00042      *        and if so, incremenet ranged_iter
00043      */
00044     static bool is_ranged( EntityHandle file_id, Range::const_iterator& ranged_iter, Range::const_iterator ranged_end );
00045 
00046   protected:
00047     /**\brief Store data list for a single entity
00048      *
00049      * The is the pure virtual method that must be provided.
00050      * It is responsible for storing the data read for a single
00051      * entity.
00052      *
00053      * This function will always be called in the order of the
00054      * file_ids in the range passed to the \c read method.
00055      *
00056      *\param file_id  The file ID for the entity
00057      *\param data     A pointer to the data for the entity
00058      *\param num_data Number of values for the entity
00059      *\param ranged   For set contents, true if in ranged format.
00060      */
00061     virtual ErrorCode store_data( EntityHandle file_id, void* data, long num_data, bool ranged ) = 0;
00062 
00063   public:
00064     /**\brief Constructor
00065      *\param buffer      A temporary buffer to use during read
00066      *\param buffer_size Size of \c buffer, in bytes.
00067      */
00068     ReadHDF5VarLen( DebugOutput& debug_output, void* buffer, size_t buffer_size )
00069         : dbgOut( debug_output ), dataBuffer( buffer ), bufferSize( buffer_size )
00070     {
00071     }
00072 
00073     virtual ~ReadHDF5VarLen() {}
00074 
00075     /**\brief Do actual read of data set
00076      *\param data_set         The data set to read.
00077      *\param file_ids         The file ids of the entities to read.
00078      *\param start_file_id    The file id corresponding to the first row of the dataset
00079      *\param data_type        The desired, in-memory data type for values
00080      *\param vals_per_ent     The number of values for each entity
00081      *\param ranged_file_ids  Those file ids for which the 'ranged'
00082      *                        argument to \c storedata should be passed
00083      *                        as \c true.
00084      */
00085     ErrorCode read_data( ReadHDF5Dataset& data_set,
00086                          const Range& offsets,
00087                          EntityHandle start_offset,
00088                          hid_t data_type,
00089                          const Range& file_ids,
00090                          const std::vector< unsigned >& vals_per_ent,
00091                          const Range& ranged_file_ids );
00092 
00093     /**\brief Read set description table or offset vector for
00094      *        var-len tags or old-format poly(gon|hedra) connectivity.
00095      *\param data_set         The data set to read.
00096      *\param file_ids         The file ids of the entities to read.
00097      *\param start_file_id    The file id corresponding to the first row of the dataset
00098      *\param num_columns      The number of columns of offsets in the dataset
00099      *\param indices          Array of length \c num_columns contaning the
00100      *                        indices of the columns to read.
00101      *\param nudge            Amount by which to offset values in
00102      *                        \c offset_out to avoid putting zeros in
00103      *                        Range.  Must be greater than 0.  Probably 1.
00104      *\param offsets_out      An array of length \c num_columns which will
00105      *                        be populated with the resulting list of offsets
00106      *                        into the contents list calculated from reading
00107      *                        the offsets from the passed data set.
00108      *\param counts_out       An array of length \c num_columns of std::vectors,
00109      *                        where each vector will be filled with one value
00110      *                        per file ID indicating the length of the data for
00111      *                        the corresponding file ID.
00112      *\param ranged_file_ids  If non-null, the last column of the table will
00113      *                        be read and tested for the ranged bit.  For
00114      *                        all file_ids for which the range bit is set,
00115      *                        the file ID will be added to this list.
00116      */
00117     /*
00118        ErrorCode read_offsets( ReadHDF5Dataset& data_set,
00119                                const Range& file_ids,
00120                                EntityHandle start_file_id,
00121                                unsigned num_columns,
00122                                const unsigned indices[],
00123                                EntityHandle nudge,
00124                                Range offsets_out[],
00125                                std::vector<unsigned> counts_out[],
00126                                Range* ranged_file_ids = 0 );
00127    */
00128     ErrorCode read_offsets( ReadHDF5Dataset& data_set,
00129                             const Range& file_ids,
00130                             EntityHandle start_file_id,
00131                             EntityHandle nudge,
00132                             Range& offsets_out,
00133                             std::vector< unsigned >& counts_out );
00134 
00135     ErrorCode read( ReadHDF5Dataset& offset_data,
00136                     ReadHDF5Dataset& value_data,
00137                     const Range& file_ids,
00138                     EntityHandle start_file_id,
00139                     hid_t data_type,
00140                     const Range* ranged = 0 )
00141     {
00142         ErrorCode rval;
00143         const EntityHandle nudge = 1;
00144         Range offsets;
00145         std::vector< unsigned > counts;
00146         rval = read_offsets( offset_data, file_ids, start_file_id, nudge, offsets, counts );
00147         if( MB_SUCCESS != rval ) return rval;
00148         Range empty;
00149         rval = read_data( value_data, offsets, nudge, data_type, file_ids, counts, ranged ? *ranged : empty );
00150         return rval;
00151     }
00152 };
00153 
00154 }  // namespace moab
00155 
00156 #endif  // moab_READ_HDF5_VAR_LEN_HPP
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines