![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 /**
00002 * MOAB, a Mesh-Oriented datABase, is a software component for creating,
00003 * storing and accessing finite element mesh data.
00004 *
00005 * Copyright 2004 Sandia Corporation. Under the terms of Contract
00006 * DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government
00007 * retains certain rights in this software.
00008 *
00009 * This library is free software; you can redistribute it and/or
00010 * modify it under the terms of the GNU Lesser General Public
00011 * License as published by the Free Software Foundation; either
00012 * version 2.1 of the License, or (at your option) any later version.
00013 *
00014 */
00015
00016 #ifndef WRITE_HDF5_HPP
00017 #define WRITE_HDF5_HPP
00018
00019 #include
00020 #include "moab/MOABConfig.h"
00021 #ifdef MOAB_HAVE_MPI // include this before HDF5 headers to avoid conflicts
00022 #include "moab_mpi.h"
00023 #endif
00024 #include "moab_mpe.h"
00025 #include "mhdf.h"
00026 #include "moab/Forward.hpp"
00027 #include "moab/Range.hpp"
00028 #include "moab/WriterIface.hpp"
00029 #include "moab/RangeMap.hpp"
00030 #include "moab/WriteUtilIface.hpp"
00031 #include "DebugOutput.hpp"
00032 #include "HDF5Common.hpp"
00033
00034 namespace moab
00035 {
00036
00037 class IODebugTrack;
00038
00039 /* If this define is not set, node->entity adjacencies will not be written */
00040 #undef MB_H5M_WRITE_NODE_ADJACENCIES
00041
00042 /**
00043 * \brief Write mesh database to MOAB's native HDF5-based file format.
00044 * \author Jason Kraftcheck
00045 * \date 01 April 2004
00046 */
00047 class WriteHDF5 : public WriterIface
00048 {
00049
00050 public:
00051 static WriterIface* factory( Interface* );
00052
00053 WriteHDF5( Interface* iface );
00054
00055 virtual ~WriteHDF5();
00056
00057 /** Export specified meshsets to file
00058 * \param filename The filename to export.
00059 * \param export_sets Array of handles to sets to export, or NULL to export all.
00060 * \param export_set_count Length of export_sets
array.
00061 */
00062 ErrorCode write_file( const char* filename,
00063 const bool overwrite,
00064 const FileOptions& opts,
00065 const EntityHandle* export_sets,
00066 const int export_set_count,
00067 const std::vector< std::string >& qa_records,
00068 const Tag* tag_list = NULL,
00069 int num_tags = 0,
00070 int user_dimension = 3 );
00071
00072 /** The type to use for entity IDs w/in the file.
00073 *
00074 * NOTE: If this is changed, the value of id_type
00075 * MUST be changed accordingly.
00076 */
00077 typedef EntityHandle wid_t; // change the name,
00078 // to avoid conflicts to /usr/include/x86_64-linux-gnu/bits/types.h : id_t , which is unsigned
00079 // int
00080
00081 /** HDF5 type corresponding to type of wid_t */
00082 static const hid_t id_type;
00083
00084 struct ExportType
00085 {
00086 //! The type of the entities in the range
00087 EntityType type;
00088 //! The number of nodes per entity - not used for nodes and sets
00089 int num_nodes;
00090
00091 virtual ~ExportType() {}
00092
00093 bool operator==( const ExportType& t ) const
00094 {
00095 return t.type == type && t.num_nodes == num_nodes;
00096 }
00097 bool operator!=( const ExportType& t ) const
00098 {
00099 return t.type != type || t.num_nodes != num_nodes;
00100 }
00101 bool operator<( const ExportType& t ) const
00102 {
00103 return type < t.type || ( type == t.type && num_nodes < t.num_nodes );
00104 }
00105 };
00106
00107 //! Range of entities, grouped by type, to export
00108 struct ExportSet : public ExportType
00109 {
00110 //! The range of entities.
00111 Range range;
00112 //! The first Id allocated by the mhdf library. Entities in range have sequential IDs.
00113 wid_t first_id;
00114 //! The offset at which to begin writing this processor's data.
00115 //! Always zero except for parallel IO.
00116 long offset;
00117 //! Offset for adjacency data. Always zero except for parallel IO
00118 long adj_offset;
00119 //! If doing parallel IO, largest number of entities to write
00120 //! for any processor (needed to do collective IO). Zero if unused.
00121 long max_num_ents, max_num_adjs;
00122 //! The total number of entities that will be written to the file
00123 //! for this group. For serial IO, this should always be range.size().
00124 //! For parallel IO, it will be the sum of range size over all processors.
00125 //! For parallel IO, this value is undefined except for on the root
00126 //! processor.
00127 long total_num_ents;
00128
00129 bool operator<( const ExportType& other ) const
00130 {
00131 return type < other.type || ( type == other.type && num_nodes < other.num_nodes );
00132 }
00133
00134 bool operator<( std::pair< int, int > other ) const
00135 {
00136 return type < other.first || ( type == other.first && num_nodes < other.second );
00137 }
00138
00139 bool operator==( const ExportType& other ) const
00140 {
00141 return ( type == other.type && num_nodes == other.num_nodes );
00142 }
00143
00144 bool operator==( std::pair< int, int > other ) const
00145 {
00146 return ( type == other.first && num_nodes == other.second );
00147 }
00148
00149 const char* name() const;
00150 };
00151
00152 //! Tag to write to file.
00153 struct TagDesc
00154 {
00155 //! The tag handle
00156 Tag tag_id;
00157 //! The offset at which to begin writting this processor's data.
00158 //! Always zero except for parallel IO.
00159 wid_t sparse_offset;
00160 //! For variable-length tags, a second offset for the tag data table,
00161 //! separate from the offset used for the ID and Index tables.
00162 //! Always zero except for parallel IO.
00163 wid_t var_data_offset;
00164 //! Write sparse tag data (for serial, is always equal to !range.empty())
00165 bool write_sparse;
00166 //! If doing parallel IO, largest number, over all processes, of entities
00167 //! for which to write tag data. Zero if unused.
00168 unsigned long max_num_ents;
00169 //! For variable-length tags during parallel IO: the largest number
00170 //! of tag values to be written on by any process, used to calculate
00171 //! the total number of collective writes that all processes must do.
00172 //! Zero for fixed-length tags or if not doing parallel IO.
00173 unsigned long max_num_vals;
00174
00175 //! List of entity groups for which to write tag data in
00176 //! dense format
00177 std::vector< ExportType > dense_list;
00178
00179 bool have_dense( const ExportType& type ) const
00180 {
00181 return std::find( dense_list.begin(), dense_list.end(), type ) != dense_list.end();
00182 }
00183
00184 bool operator<( const TagDesc& ) const;
00185 };
00186
00187 /** Create attributes holding the HDF5 type handle for the
00188 * type of a bunch of the default tags.
00189 */
00190 // static ErrorCode register_known_tag_types( Interface* );
00191
00192 //! Store old HDF5 error handling function
00193 struct HDF5ErrorHandler
00194 {
00195 HDF5_Error_Func_Type func;
00196 void* data;
00197 };
00198
00199 mhdf_FileHandle file_ptr()
00200 {
00201 return filePtr;
00202 }
00203
00204 WriteUtilIface* write_util()
00205 {
00206 return writeUtil;
00207 }
00208
00209 protected:
00210 //! Store old HDF5 error handling function
00211 HDF5ErrorHandler errorHandler;
00212
00213 /** Function to create the file. Virtual to allow override
00214 * for parallel version.
00215 */
00216 virtual ErrorCode parallel_create_file( const char* filename,
00217 bool overwrite,
00218 const std::vector< std::string >& qa_records,
00219 const FileOptions& opts,
00220 const Tag* tag_list,
00221 int num_tags,
00222 int dimension = 3,
00223 double* times = 0 );
00224 virtual ErrorCode write_finished();
00225 virtual void debug_barrier_line( int lineno );
00226
00227 //! Gather tags
00228 ErrorCode gather_tags( const Tag* user_tag_list, int user_tag_list_length );
00229
00230 /** Check if tag values for a given ExportSet should be written in dense format
00231 *
00232 *\param ents ExportSet to consider
00233 *\param all_tagged Range containing all the entities in ents.range for
00234 * which an explicit tag value is stored. Range may
00235 * also contain entities not in ents.range, but may
00236 * not contain entities in ents.range for which no tag
00237 * value is stored.
00238 *\param prefer_dense If true, will return true if at least 2/3 of the
00239 * entities are tagged. This should not be passed as
00240 * true if the tag does not have a default value, as
00241 * tag values must be stored for all entities in the
00242 * ExportSet for dense-formatted data.
00243 */
00244 bool check_dense_format_tag( const ExportSet& ents, const Range& all_tagged, bool prefer_dense );
00245
00246 /** Helper function for create-file
00247 *
00248 * Calculate the sum of the number of non-set adjacencies
00249 * of all entities in the passed range.
00250 */
00251 ErrorCode count_adjacencies( const Range& elements, wid_t& result );
00252
00253 public: // make these public so helper classes in WriteHDF5Parallel can use them
00254 /** Helper function for create-file
00255 *
00256 * Create zero-ed tables where element connectivity and
00257 * adjacency data will be stored.
00258 */
00259 ErrorCode create_elem_table( const ExportSet& block, long num_ents, long& first_id_out );
00260
00261 /** Helper function for create-file
00262 *
00263 * Create zero-ed table where set descriptions will be written
00264 */
00265 ErrorCode create_set_meta( long num_sets, long& first_id_out );
00266
00267 protected:
00268 /** Helper function for create-file
00269 *
00270 * Calculate total length of set contents and child tables.
00271 */
00272 ErrorCode count_set_size( const Range& sets,
00273 long& contents_length_out,
00274 long& children_length_out,
00275 long& parents_length_out );
00276
00277 //! Get information about a meshset
00278 ErrorCode get_set_info( EntityHandle set,
00279 long& num_entities,
00280 long& num_children,
00281 long& num_parents,
00282 unsigned long& flags );
00283
00284 /** Helper function for create-file
00285 *
00286 * Create zero-ed tables where set data will be written.
00287 */
00288 ErrorCode create_set_tables( long contents_length, long children_length, long parents_length );
00289
00290 //! Write exodus-type QA info
00291 ErrorCode write_qa( const std::vector< std::string >& list );
00292
00293 //!\brief Get tagged entities for which to write tag values
00294 ErrorCode get_num_sparse_tagged_entities( const TagDesc& tag, size_t& count );
00295 //!\brief Get tagged entities for which to write tag values
00296 ErrorCode get_sparse_tagged_entities( const TagDesc& tag, Range& range );
00297 //!\brief Get entities that will be written to file
00298 void get_write_entities( Range& range );
00299
00300 //! The size of the data buffer (dataBuffer
).
00301 size_t bufferSize;
00302 //! A memory buffer to use for all I/O operations.
00303 char* dataBuffer;
00304
00305 //! Interface pointer passed to constructor
00306 Interface* iFace;
00307 //! Cached pointer to writeUtil interface.
00308 WriteUtilIface* writeUtil;
00309
00310 //! The file handle from the mhdf library
00311 mhdf_FileHandle filePtr;
00312
00313 //! Map from entity handles to file IDs
00314 RangeMap< EntityHandle, wid_t > idMap;
00315
00316 //! The list elements to export.
00317 std::list< ExportSet > exportList;
00318 //! The list of nodes to export
00319 ExportSet nodeSet;
00320 //! The list of sets to export
00321 ExportSet setSet;
00322
00323 const ExportSet* find( const ExportType& type ) const
00324 {
00325 if( type.type == MBVERTEX )
00326 return &nodeSet;
00327 else if( type.type == MBENTITYSET )
00328 return &setSet;
00329 else
00330 {
00331 std::list< ExportSet >::const_iterator it;
00332 it = std::find( exportList.begin(), exportList.end(), type );
00333 return it == exportList.end() ? 0 : &*it;
00334 }
00335 }
00336
00337 //! Offset into set contents table (zero except for parallel)
00338 unsigned long setContentsOffset;
00339 //! Offset into set children table (zero except for parallel)
00340 unsigned long setChildrenOffset, setParentsOffset;
00341 //! The largest number of values to write
00342 //! for any processor (needed to do collective IO).
00343 long maxNumSetContents, maxNumSetChildren, maxNumSetParents;
00344 //! Flags idicating if set data should be written.
00345 //! For the normal (non-parallel) case, these values
00346 //! will depend only on whether or not there is any
00347 //! data to be written. For parallel-meshes, opening
00348 //! the data table is collective so the values must
00349 //! depend on whether or not any processor has meshsets
00350 //! to be written.
00351 bool writeSets, writeSetContents, writeSetChildren, writeSetParents;
00352
00353 //! Struct describing a set for which the contained and linked entity
00354 //! lists are something other than the local values. Used to store
00355 //! data for shared sets owned by this process when writing in parallel.
00356 struct SpecialSetData
00357 {
00358 EntityHandle setHandle;
00359 unsigned setFlags;
00360 std::vector< wid_t > contentIds;
00361 std::vector< wid_t > childIds;
00362 std::vector< wid_t > parentIds;
00363 };
00364 struct SpecSetLess
00365 {
00366 bool operator()( const SpecialSetData& a, SpecialSetData b ) const
00367 {
00368 return a.setHandle < b.setHandle;
00369 }
00370 };
00371
00372 //! Array of special/shared sets, in order of handle value.
00373 std::vector< SpecialSetData > specialSets;
00374 const SpecialSetData* find_set_data( EntityHandle h ) const
00375 {
00376 return const_cast< WriteHDF5* >( this )->find_set_data( h );
00377 }
00378 SpecialSetData* find_set_data( EntityHandle h );
00379
00380 //! The list of tags to export
00381 std::list< TagDesc > tagList;
00382
00383 //! True if doing parallel write
00384 bool parallelWrite;
00385 //! True if using collective IO calls for parallel write
00386 bool collectiveIO;
00387 //! True if writing dense-formatted tag data
00388 bool writeTagDense;
00389
00390 //! Property set to pass to H5Dwrite calls.
00391 //! For serial, should be H5P_DEFAULTS.
00392 //! For parallel, may request collective IO.
00393 hid_t writeProp;
00394
00395 //! Utility to log debug output
00396 DebugOutput dbgOut;
00397
00398 static MPEState topState;
00399 static MPEState subState;
00400
00401 //! Look for overlapping and/or missing writes
00402 bool debugTrack;
00403
00404 void print_id_map() const;
00405 void print_id_map( std::ostream& str, const char* prefix = "" ) const;
00406
00407 /** Helper function for create-file
00408 *
00409 * Write tag meta-info and create zero-ed table where
00410 * tag values will be written.
00411 *\param num_entities Number of entities for which to write tag data.
00412 *\param var_len_total For variable-length tags, the total number of values
00413 * in the data table.
00414 */
00415 ErrorCode create_tag( const TagDesc& tag_data, unsigned long num_entities, unsigned long var_len_total );
00416
00417 /**\brief add entities to idMap */
00418 ErrorCode assign_ids( const Range& entities, wid_t first_id );
00419
00420 /** Get possibly compacted list of IDs for passed entities
00421 *
00422 * For the passed range of entities, determine if IDs
00423 * can be compacted and write IDs to passed list.
00424 *
00425 * If the IDs are not compacted, the output list will contain
00426 * a simple ordered list of IDs.
00427 *
00428 * If IDs are compacted, the output list will contain
00429 * {start,count} pairs.
00430 *
00431 * If the ID list is compacted, ranged_list will be 'true'.
00432 * Otherwise it will be 'false'.
00433 */
00434 ErrorCode range_to_blocked_list( const Range& input_range,
00435 std::vector< wid_t >& output_id_list,
00436 bool& ranged_list );
00437
00438 /** Get possibly compacted list of IDs for passed entities
00439 *
00440 * For the passed range of entities, determine if IDs
00441 * can be compacted and write IDs to passed list.
00442 *
00443 * If the IDs are not compacted, the output list will contain
00444 * a simple ordered list of IDs.
00445 *
00446 * If IDs are compacted, the output list will contain
00447 * {start,count} pairs.
00448 *
00449 * If the ID list is compacted, ranged_list will be 'true'.
00450 * Otherwise it will be 'false'.
00451 */
00452 ErrorCode range_to_blocked_list( const EntityHandle* input_ranges,
00453 size_t num_input_ranges,
00454 std::vector< wid_t >& output_id_list,
00455 bool& ranged_list );
00456
00457 ErrorCode range_to_id_list( const Range& input_range, wid_t* array );
00458 //! Get IDs for entities
00459 ErrorCode vector_to_id_list( const std::vector< EntityHandle >& input,
00460 std::vector< wid_t >& output,
00461 bool remove_non_written = false );
00462 //! Get IDs for entities
00463 ErrorCode vector_to_id_list( const EntityHandle* input, wid_t* output, size_t num_entities );
00464 //! Get IDs for entities
00465 ErrorCode vector_to_id_list( const EntityHandle* input,
00466 size_t input_len,
00467 wid_t* output,
00468 size_t& output_len,
00469 bool remove_non_written );
00470
00471 /** When writing tags containing EntityHandles to file, need to convert tag
00472 * data from EntityHandles to file IDs. This function does that.
00473 *
00474 * If the handle is not valid or does not correspond to an entity that will
00475 * be written to the file, the file ID is set to zero.
00476 *\param data The data buffer. As input, an array of EntityHandles. As
00477 * output an array of file IDS, where the size of each integral
00478 * file ID is the same as the size of EntityHandle.
00479 *\param count The number of handles in the buffer.
00480 *\return true if at least one of the handles is valid and will be written to
00481 * the file or at least one of the handles is NULL (zero). false
00482 * otherwise
00483 */
00484 bool convert_handle_tag( EntityHandle* data, size_t count ) const;
00485 bool convert_handle_tag( const EntityHandle* source, EntityHandle* dest, size_t count ) const;
00486
00487 /** Get IDs of adjacent entities.
00488 *
00489 * For all entities adjacent to the passed entity, if the
00490 * adjacent entity is to be exported (ID is not zero), append
00491 * the ID to the passed list.
00492 */
00493 ErrorCode get_adjacencies( EntityHandle entity, std::vector< wid_t >& adj );
00494
00495 //! get sum of lengths of tag values (as number of type) for
00496 //! variable length tag data.
00497 ErrorCode get_tag_data_length( const TagDesc& tag_info, const Range& range, unsigned long& result );
00498
00499 private:
00500 //! Do the actual work of write_file. Separated from write_file
00501 //! for easier resource cleanup.
00502 ErrorCode write_file_impl( const char* filename,
00503 const bool overwrite,
00504 const FileOptions& opts,
00505 const EntityHandle* export_sets,
00506 const int export_set_count,
00507 const std::vector< std::string >& qa_records,
00508 const Tag* tag_list,
00509 int num_tags,
00510 int user_dimension = 3 );
00511
00512 ErrorCode init();
00513
00514 ErrorCode serial_create_file( const char* filename,
00515 bool overwrite,
00516 const std::vector< std::string >& qa_records,
00517 const Tag* tag_list,
00518 int num_tags,
00519 int dimension = 3 );
00520
00521 /** Get all mesh to export from given list of sets.
00522 *
00523 * Populate exportSets, nodeSet and setSet with lists of
00524 * entities to write.
00525 *
00526 * \param export_sets The list of meshsets to export
00527 */
00528 ErrorCode gather_mesh_info( const std::vector< EntityHandle >& export_sets );
00529
00530 //! Same as gather_mesh_info, except for entire mesh
00531 ErrorCode gather_all_mesh();
00532
00533 //! Initialize internal data structures from gathered mesh
00534 ErrorCode initialize_mesh( const Range entities_by_dim[5] );
00535
00536 /** Write out the nodes.
00537 *
00538 * Note: Assigns IDs to nodes.
00539 */
00540 ErrorCode write_nodes();
00541
00542 /** Write out element connectivity.
00543 *
00544 * Write connectivity for passed set of elements.
00545 *
00546 * Note: Assigns element IDs.
00547 * Note: Must do write_nodes first so node IDs get assigned.
00548 */
00549 ErrorCode write_elems( ExportSet& elemset );
00550
00551 /** Write out meshsets
00552 *
00553 * Write passed set of meshsets, including parent/child relations.
00554 *
00555 * Note: Must have written nodes and element connectivity
00556 * so entities have assigned IDs.
00557 */
00558 ErrorCode write_sets( double* times );
00559
00560 /** Write set contents/parents/children lists
00561 *
00562 *\param which_data Which set data to write (contents, parents, or children)
00563 *\param handle HDF5 handle for data set in which to write data
00564 *\param track Debugging tool
00565 *\param ranged Will be populated with handles of sets for which
00566 * contents were written in a range-compacted format.
00567 * (mhdf_SET_RANGE_BIT). Should be null for parents/children.
00568 *\param null_stripped Will be populated with handles of sets for which
00569 * invalid or null handles were stripped from the contents
00570 * list. This is only done for unordered sets. This argument
00571 * should be null if writing parents/children because those
00572 * lists are always ordered.
00573 *\param set_sizes Will be populated with the length of the data written
00574 * for those sets for which the handles were added to
00575 * either \c ranged or \c null_stripped. Values are
00576 * in handle order.
00577 */
00578 ErrorCode write_set_data( const WriteUtilIface::EntityListType which_data,
00579 const hid_t handle,
00580 IODebugTrack& track,
00581 Range* ranged = 0,
00582 Range* null_stripped = 0,
00583 std::vector< long >* set_sizes = 0 );
00584
00585 /** Write adjacency info for passed set of elements
00586 *
00587 * Note: Must have written element connectivity so elements
00588 * have IDs assigned.
00589 */
00590 ErrorCode write_adjacencies( const ExportSet& export_set );
00591
00592 /** Write tag information and data.
00593 *
00594 * Note: Must have already written nodes, elem connectivity and
00595 * sets so that entities have IDs assigned.
00596 */
00597
00598 //! Write tag for all entities.
00599 ErrorCode write_tag( const TagDesc& tag_data, double* times );
00600
00601 //! Get element connectivity
00602 ErrorCode get_connectivity( Range::const_iterator begin,
00603 Range::const_iterator end,
00604 int nodes_per_element,
00605 wid_t* id_data_out );
00606
00607 //! Get size data for tag
00608 //!\param tag MOAB tag ID
00609 //!\param moab_type Output: DataType for tag
00610 //!\param num_bytes Output: MOAB tag size (bits for bit tags).
00611 //! MB_VARIABLE_LENGTH for variable-length tags.
00612 //!\param elem_size Output: Size of of the base data type of the
00613 //! tag data (e.g. sizeof(double) if
00614 //! moab_type == MB_TYPE_DOUBLE).
00615 //! One for bit and opaque tags.
00616 //!\param array_size Output: The number of valeus of size elem_size
00617 //! for each tag. Always 1 for opaque data.
00618 //! Nubmer of bits for bit tags.
00619 //!\param file_type Output: mhdf type enumeration
00620 //!\param hdf_type Output: Handle to HDF5 type object. Caller is
00621 //! responsible for releasing this object
00622 //! (calling H5Tclose).
00623 ErrorCode get_tag_size( Tag tag,
00624 DataType& moab_type,
00625 int& num_bytes,
00626 int& elem_size,
00627 int& file_size,
00628 mhdf_TagDataType& file_type,
00629 hid_t& hdf_type );
00630
00631 //! Write ID table for sparse tag
00632 ErrorCode write_sparse_ids( const TagDesc& tag_data,
00633 const Range& range,
00634 hid_t table_handle,
00635 size_t table_size,
00636 const char* name = 0 );
00637
00638 //! Write fixed-length tag data in sparse format
00639 ErrorCode write_sparse_tag( const TagDesc& tag_data,
00640 const std::string& tag_name,
00641 DataType tag_data_type,
00642 hid_t hdf5_data_type,
00643 int hdf5_type_size );
00644
00645 //! Write end index data_set for a variable-length tag
00646 ErrorCode write_var_len_indices( const TagDesc& tag_data,
00647 const Range& range,
00648 hid_t idx_table,
00649 size_t table_size,
00650 int type_size,
00651 const char* name = 0 );
00652
00653 //! Write tag value data_set for a variable-length tag
00654 ErrorCode write_var_len_data( const TagDesc& tag_data,
00655 const Range& range,
00656 hid_t table,
00657 size_t table_size,
00658 bool handle_tag,
00659 hid_t hdf_type,
00660 int type_size,
00661 const char* name = 0 );
00662
00663 //! Write varialbe-length tag data
00664 ErrorCode write_var_len_tag( const TagDesc& tag_info,
00665 const std::string& tag_name,
00666 DataType tag_data_type,
00667 hid_t hdf5_type,
00668 int hdf5_type_size );
00669
00670 //! Write dense-formatted tag data
00671 ErrorCode write_dense_tag( const TagDesc& tag_data,
00672 const ExportSet& elem_data,
00673 const std::string& tag_name,
00674 DataType tag_data_type,
00675 hid_t hdf5_data_type,
00676 int hdf5_type_size );
00677
00678 //! Write data for fixed-size tag
00679 ErrorCode write_tag_values( Tag tag_id,
00680 hid_t data_table,
00681 unsigned long data_offset,
00682 const Range& range,
00683 DataType tag_data_type,
00684 hid_t hdf5_data_type,
00685 int hdf5_type_size,
00686 unsigned long max_num_ents,
00687 IODebugTrack& debug_track );
00688
00689 protected:
00690 enum TimingValues
00691 {
00692 TOTAL_TIME = 0,
00693 GATHER_TIME,
00694 CREATE_TIME,
00695 CREATE_NODE_TIME,
00696 NEGOTIATE_TYPES_TIME,
00697 CREATE_ELEM_TIME,
00698 FILEID_EXCHANGE_TIME,
00699 CREATE_ADJ_TIME,
00700 CREATE_SET_TIME,
00701 SHARED_SET_IDS,
00702 SHARED_SET_CONTENTS,
00703 SET_OFFSET_TIME,
00704 CREATE_TAG_TIME,
00705 COORD_TIME,
00706 CONN_TIME,
00707 SET_TIME,
00708 SET_META,
00709 SET_CONTENT,
00710 SET_PARENT,
00711 SET_CHILD,
00712 ADJ_TIME,
00713 TAG_TIME,
00714 DENSE_TAG_TIME,
00715 SPARSE_TAG_TIME,
00716 VARLEN_TAG_TIME,
00717 NUM_TIMES
00718 };
00719
00720 virtual void print_times( const double times[NUM_TIMES] ) const;
00721 };
00722
00723 } // namespace moab
00724
00725 #endif