![]() |
Mesh Oriented datABase
(version 5.4.1)
Array-based unstructured mesh datastructure
|
00001 #include "mhdf.h"
00002 #include "util.h"
00003 #include "status.h"
00004 #include
00005 #include
00006 #include
00007 #include
00008 #include
00009 #include
00010
00011 static struct mhdf_FileDesc* alloc_file_desc( mhdf_Status* status );
00012 static void* realloc_data( struct mhdf_FileDesc** data, size_t append_bytes, mhdf_Status* status, int alignment );
00013 static char buffer[512];
00014
00015 static struct mhdf_FileDesc* alloc_file_desc( mhdf_Status* status )
00016 {
00017 struct mhdf_FileDesc* result;
00018 /* allocate a little short of a page */
00019 result = (struct mhdf_FileDesc*)mhdf_malloc( 4000, status );
00020 if( mhdf_isError( status ) ) return 0;
00021
00022 memset( result, 0, sizeof( struct mhdf_FileDesc ) );
00023 result->total_size = 4000;
00024 result->offset = ( (unsigned char*)result ) + sizeof( struct mhdf_FileDesc );
00025 return result;
00026 }
00027
00028 static void* realloc_data( struct mhdf_FileDesc** data, size_t append_bytes, mhdf_Status* status, int alignment)
00029 {
00030 void* result_ptr;
00031 struct mhdf_FileDesc* const input_ptr = *data;
00032 unsigned char* mem_ptr = (unsigned char*)input_ptr;
00033
00034 size_t new_size, occupied_size = input_ptr->offset - mem_ptr;
00035
00036 int append_bytes_padded = append_bytes + alignment - 1;
00037 /* if the end of the allocated space is before the end of the required space */
00038 if( mem_ptr + input_ptr->total_size < input_ptr->offset + append_bytes_padded )
00039 {
00040 if( append_bytes_padded < input_ptr->total_size )
00041 new_size = 2 * input_ptr->total_size;
00042 else
00043 new_size = input_ptr->total_size + append_bytes_padded;
00044 *data = (struct mhdf_FileDesc*)mhdf_realloc( *data, new_size, status );
00045 if( mhdf_isError( status ) ) return 0;
00046
00047 /* if realloc moved us to a different location in memory,
00048 * we need to update all of the internal pointers to
00049 * new locations relative to the start of the struct */
00050 if( *data != input_ptr )
00051 {
00052 mhdf_fixFileDesc( *data, input_ptr );
00053 mem_ptr = (unsigned char*)( *data );
00054 ( *data )->offset = mem_ptr + occupied_size;
00055 }
00056 ( *data )->total_size = new_size;
00057 }
00058
00059 result_ptr = ( *data )->offset;
00060 /* need to make this return pointer aligned */
00061 uintptr_t addr = (uintptr_t)(( *data )->offset);
00062 int pad = addr%alignment;
00063 if (pad > 0)
00064 {
00065 ( *data )->offset += (alignment-pad);
00066 result_ptr = ( *data )->offset;
00067 }
00068 /*printf("new address %p \n", result_ptr);*/
00069 ( *data )->offset += append_bytes;
00070 return result_ptr;
00071 }
00072
00073 #define FIX_OFFSET( TYPE, FIELD ) \
00074 if( copy_ptr->FIELD != NULL ) \
00075 copy_ptr->FIELD = (TYPE)( ( (char*)( copy_ptr->FIELD ) - (char*)orig_addr ) + (char*)copy_ptr )
00076
00077 void mhdf_fixFileDesc( struct mhdf_FileDesc* copy_ptr, const struct mhdf_FileDesc* orig_addr )
00078 {
00079 int i;
00080
00081 API_BEGIN;
00082 FIX_OFFSET( int*, nodes.dense_tag_indices );
00083 FIX_OFFSET( int*, sets.dense_tag_indices );
00084 FIX_OFFSET( struct mhdf_ElemDesc*, elems );
00085 FIX_OFFSET( struct mhdf_TagDesc*, tags );
00086
00087 FIX_OFFSET( int*, numEntSets );
00088 FIX_OFFSET( int**, defTagsEntSets );
00089 FIX_OFFSET( int**, defTagsVals );
00090
00091 for( i = 0; i < 5; i++ )
00092 {
00093 if( copy_ptr->defTagsEntSets ) FIX_OFFSET( int*, defTagsEntSets[i] );
00094 if( copy_ptr->defTagsVals ) FIX_OFFSET( int*, defTagsVals[i] );
00095 }
00096
00097 if( copy_ptr->elems != NULL )
00098 {
00099 for( i = 0; i < copy_ptr->num_elem_desc; ++i )
00100 {
00101 FIX_OFFSET( const char*, elems[i].handle );
00102 FIX_OFFSET( const char*, elems[i].type );
00103 FIX_OFFSET( int*, elems[i].desc.dense_tag_indices );
00104 }
00105 }
00106
00107 if( copy_ptr->tags != NULL )
00108 {
00109 for( i = 0; i < copy_ptr->num_tag_desc; ++i )
00110 {
00111 FIX_OFFSET( const char*, tags[i].name );
00112 FIX_OFFSET( void*, tags[i].default_value );
00113 FIX_OFFSET( void*, tags[i].global_value );
00114 FIX_OFFSET( int*, tags[i].dense_elem_indices );
00115 }
00116 }
00117 API_END;
00118 }
00119
00120 static struct mhdf_FileDesc* get_elem_desc( mhdf_FileHandle file_handle,
00121 struct mhdf_FileDesc* result,
00122 const char* elem_handle,
00123 int idx,
00124 mhdf_Status* status )
00125 {
00126 hid_t id_pair[2];
00127 int poly;
00128 void* ptr;
00129 long junk;
00130
00131 ptr = realloc_data( &result, strlen( elem_handle ) + 1, status, sizeof(char) );
00132 if( !ptr ) return NULL;
00133 strcpy( ptr, elem_handle );
00134 result->elems[idx].handle = ptr;
00135
00136 mhdf_getElemTypeName( file_handle, elem_handle, buffer, sizeof( buffer ), status );
00137 if( mhdf_isError( status ) )
00138 {
00139 free( result );
00140 return NULL;
00141 }
00142
00143 ptr = realloc_data( &result, strlen( buffer ) + 1, status, sizeof(char) );
00144 if( !ptr ) return NULL;
00145 strcpy( ptr, buffer );
00146 result->elems[idx].type = ptr;
00147
00148 poly = mhdf_isPolyElement( file_handle, elem_handle, status );
00149 if( mhdf_isError( status ) )
00150 {
00151 free( result );
00152 return NULL;
00153 }
00154
00155 if( !poly )
00156 {
00157 id_pair[0] = mhdf_openConnectivity( file_handle, elem_handle, &result->elems[idx].desc.vals_per_ent,
00158 &result->elems[idx].desc.count, &result->elems[idx].desc.start_id, status );
00159 if( id_pair[0] < 0 )
00160 {
00161 free( result );
00162 return NULL;
00163 }
00164 mhdf_closeData( file_handle, id_pair[0], status );
00165 }
00166 else
00167 {
00168 result->elems[idx].desc.vals_per_ent = -1;
00169 mhdf_openPolyConnectivity( file_handle, elem_handle, &result->elems[idx].desc.count, &junk,
00170 &result->elems[idx].desc.start_id, id_pair, status );
00171 if( id_pair[0] < 0 )
00172 {
00173 free( result );
00174 return NULL;
00175 }
00176 mhdf_closeData( file_handle, id_pair[0], status );
00177 mhdf_closeData( file_handle, id_pair[1], status );
00178 }
00179
00180 result->elems[idx].desc.dense_tag_indices = NULL;
00181 result->elems[idx].desc.num_dense_tags = 0;
00182 result->elems[idx].have_adj = mhdf_haveAdjacency( file_handle, result->elems[idx].handle, status );
00183 if( mhdf_isError( status ) )
00184 {
00185 free( result );
00186 return 0;
00187 }
00188
00189 return result;
00190 }
00191
00192 static unsigned get_file_id_size( hid_t file_id_type, mhdf_Status* status )
00193 {
00194 if( H5Tget_class( file_id_type ) != H5T_INTEGER )
00195 {
00196 mhdf_setFail( status, "Invalid handle or type class for file ID type." );
00197 return 0;
00198 }
00199
00200 return H5Tget_size( file_id_type );
00201 }
00202
00203 static struct mhdf_FileDesc* get_tag_desc( mhdf_FileHandle file_handle,
00204 struct mhdf_FileDesc* result,
00205 const char* name,
00206 int idx,
00207 hid_t type,
00208 mhdf_Status* status )
00209 {
00210 void* ptr;
00211 int have_default, have_global;
00212 int valsize, size, close_type = 0;
00213 hsize_t array_len;
00214
00215 ptr = realloc_data( &result, strlen( name ) + 1, status, sizeof(char) );
00216 if( NULL == ptr ) return NULL;
00217 strcpy( ptr, name );
00218 result->tags[idx].name = ptr;
00219
00220 mhdf_getTagInfo( file_handle, name, &result->tags[idx].type, &result->tags[idx].size, &result->tags[idx].storage,
00221 &have_default, &have_global, &result->tags[idx].have_sparse, status );
00222 if( mhdf_isError( status ) )
00223 {
00224 free( result );
00225 return NULL;
00226 }
00227
00228 /* For variable length tags, have_default and have_global will
00229 contain the size of the respective values. For fixed-length
00230 tags, they are either zero or one. Simplify later code by
00231 making them contain the size for both cases. */
00232 valsize = result->tags[idx].size;
00233 if( result->tags[idx].size >= 0 )
00234 {
00235 if( have_default ) have_default = valsize;
00236 if( have_global ) have_global = valsize;
00237 }
00238
00239 result->tags[idx].default_value = NULL;
00240 result->tags[idx].default_value_size = have_default;
00241 result->tags[idx].global_value = NULL;
00242 result->tags[idx].global_value_size = have_global;
00243
00244 switch( result->tags[idx].type )
00245 {
00246 case mhdf_OPAQUE:
00247 type = 0;
00248 break;
00249 case mhdf_BOOLEAN:
00250 type = H5T_NATIVE_UCHAR;
00251 break;
00252 case mhdf_INTEGER:
00253 type = H5T_NATIVE_INT;
00254 have_default *= sizeof( int );
00255 have_global *= sizeof( int );
00256 valsize *= sizeof( int );
00257 break;
00258 case mhdf_FLOAT:
00259 type = H5T_NATIVE_DOUBLE;
00260 have_default *= sizeof( double );
00261 have_global *= sizeof( double );
00262 valsize *= sizeof( double );
00263 break;
00264 case mhdf_BITFIELD:
00265 have_default = ( have_default + 7 ) / 8;
00266 have_global = ( have_global + 7 ) / 8;
00267 valsize = ( valsize + 7 ) / 8;
00268 switch( valsize )
00269 {
00270 case 1:
00271 type = H5Tcopy( H5T_NATIVE_B8 );
00272 break;
00273 case 2:
00274 type = H5Tcopy( H5T_NATIVE_B16 );
00275 break;
00276 case 3:
00277 case 4:
00278 valsize += 4 - valsize; // to avoid fallthrough warning
00279 type = H5Tcopy( H5T_NATIVE_B32 );
00280 break;
00281 case 5:
00282 case 6:
00283 case 7:
00284 case 8:
00285 valsize += 8 - valsize; // to avoid fallthrough warning
00286 type = H5Tcopy( H5T_NATIVE_B64 );
00287 break;
00288 default:
00289 free( result );
00290 mhdf_setFail( status, "Cannot create a bit tag larger than 64-bits. %d bits requested.\n",
00291 (int)valsize );
00292 return NULL;
00293 }
00294 close_type = 1;
00295 break;
00296 case mhdf_ENTITY_ID:
00297 if( 0 == type ) type = H5T_NATIVE_ULONG;
00298 size = get_file_id_size( type, status );
00299 if( !size )
00300 {
00301 free( result );
00302 return NULL;
00303 }
00304 have_default *= size;
00305 have_global *= size;
00306 valsize *= size;
00307 break;
00308 default:
00309 mhdf_setFail( status, "Unknown mhdf_TagDataType value (%d) for tag (\"%s\")", (int)result->tags[idx].type,
00310 name );
00311 free( result );
00312 return NULL;
00313 }
00314 result->tags[idx].bytes = valsize;
00315
00316 if( result->tags[idx].type != mhdf_OPAQUE && result->tags[idx].type != mhdf_BITFIELD && result->tags[idx].size > 1 )
00317 {
00318 close_type = 1;
00319 array_len = result->tags[idx].size;
00320 #if defined( H5Tarray_create_vers ) && H5Tarray_create_vers > 1
00321 type = H5Tarray_create2( type, 1, &array_len );
00322 #else
00323 type = H5Tarray_create( type, 1, &array_len, 0 );
00324 #endif
00325 if( type < 0 )
00326 {
00327 mhdf_setFail( status, "H5Tarray_create failed for tag (\"%s\")", name );
00328 free( result );
00329 return NULL;
00330 }
00331 }
00332
00333 if( have_default || have_global )
00334 {
00335 if( have_default )
00336 {
00337 ptr = realloc_data( &result, have_default, status, sizeof(int) );
00338 if( NULL == ptr )
00339 {
00340 if( close_type )
00341 {
00342 H5Tclose( type );
00343 }
00344 return NULL;
00345 }
00346 result->tags[idx].default_value = ptr;
00347 }
00348 if( have_global )
00349 {
00350 ptr = realloc_data( &result, have_global, status, sizeof(int) );
00351 if( NULL == ptr )
00352 {
00353 if( close_type )
00354 {
00355 H5Tclose( type );
00356 }
00357 return NULL;
00358 }
00359 result->tags[idx].global_value = ptr;
00360 }
00361 mhdf_getTagValues( file_handle, name, type, result->tags[idx].default_value, result->tags[idx].global_value,
00362 status );
00363 if( close_type )
00364 {
00365 H5Tclose( type );
00366 }
00367 if( mhdf_isError( status ) )
00368 {
00369 free( result );
00370 return NULL;
00371 }
00372 }
00373
00374 return result;
00375 }
00376
00377 static void free_string_list( char** list, int count )
00378 {
00379 int i;
00380 for( i = 0; i < count; ++i )
00381 free( list[i] );
00382 free( list );
00383 }
00384
00385 struct mhdf_FileDesc* mhdf_getFileSummary( mhdf_FileHandle file_handle,
00386 hid_t file_id_type,
00387 mhdf_Status* status,
00388 int extraSetInfo )
00389 {
00390 struct mhdf_FileDesc* result;
00391 hid_t table_id;
00392 int i, i1, numtags, j, k, size, *indices, have, num_tag_names = 0;
00393 unsigned int ui;
00394 void* ptr;
00395 char **elem_handles = 0, **tag_names = 0;
00396 unsigned char *array, *matrix;
00397 const char* pname[5] = { "PARALLEL_PARTITION", "MATERIAL_SET", "NEUMANN_SET", "DIRICHLET_SET", "GEOM_DIMENSION" };
00398
00399 long* id_list;
00400 struct mhdf_TagDesc* tag_desc;
00401 long int nval, junk;
00402 hid_t table[3];
00403 hid_t data_type;
00404
00405 API_BEGIN;
00406
00407 mhdf_setOkay( status );
00408 result = alloc_file_desc( status );
00409 if( NULL == result ) return NULL;
00410
00411 /* get node info */
00412 have = mhdf_haveNodes( file_handle, status );
00413 if( mhdf_isError( status ) )
00414 {
00415 free( result );
00416 return NULL;
00417 }
00418 if( have )
00419 {
00420 table_id = mhdf_openNodeCoords( file_handle, &result->nodes.count, &result->nodes.vals_per_ent,
00421 &result->nodes.start_id, status );
00422 if( table_id < 0 )
00423 {
00424 free( result );
00425 return NULL;
00426 }
00427 mhdf_closeData( file_handle, table_id, status );
00428 }
00429 else
00430 {
00431 result->nodes.count = 0;
00432 result->nodes.vals_per_ent = 0;
00433 result->nodes.start_id = 0;
00434 }
00435
00436 /* get set info */
00437 result->sets.vals_per_ent = -1;
00438 have = mhdf_haveSets( file_handle, &result->have_set_contents, &result->have_set_children,
00439 &result->have_set_parents, status );
00440 if( mhdf_isError( status ) )
00441 {
00442 free( result );
00443 return NULL;
00444 }
00445 if( have )
00446 {
00447 table_id = mhdf_openSetMeta( file_handle, &result->sets.count, &result->sets.start_id, status );
00448 if( table_id < 0 )
00449 {
00450 free( result );
00451 return NULL;
00452 }
00453 mhdf_closeData( file_handle, table_id, status );
00454 }
00455 else
00456 {
00457 result->sets.count = 0;
00458 result->sets.start_id = 0;
00459 }
00460
00461 /* get element list */
00462 elem_handles = mhdf_getElemHandles( file_handle, &ui, status );
00463 if( elem_handles == NULL )
00464 {
00465 free( result );
00466 return NULL;
00467 }
00468 result->num_elem_desc = ui;
00469
00470 /* allocate array of element descriptors */
00471 size = result->num_elem_desc * sizeof( struct mhdf_ElemDesc );
00472 ptr = realloc_data( &result, size, status, sizeof( char* ) );
00473 if( NULL == ptr )
00474 {
00475 free( elem_handles );
00476 return NULL;
00477 }
00478 memset( ptr, 0, size );
00479 result->elems = ptr;
00480
00481 /* Initialize each element descriptor */
00482 for( i = 0; i < result->num_elem_desc; ++i )
00483 {
00484 result = get_elem_desc( file_handle, result, elem_handles[i], i, status );
00485 if( NULL == result )
00486 {
00487 free( elem_handles );
00488 return NULL;
00489 }
00490 }
00491
00492 /* get tag list */
00493 tag_names = mhdf_getTagNames( file_handle, &num_tag_names, status );
00494 if( mhdf_isError( status ) )
00495 {
00496 free( elem_handles );
00497 free( result );
00498 return NULL;
00499 }
00500
00501 /* allocate array of tag descriptors */
00502 size = num_tag_names * sizeof( struct mhdf_TagDesc );
00503 ptr = realloc_data( &result, size, status, sizeof( char* ) );
00504 if( NULL == ptr )
00505 {
00506 free( elem_handles );
00507 free_string_list( tag_names, result->num_tag_desc );
00508 return NULL;
00509 }
00510 memset( ptr, 0, size );
00511 result->tags = ptr;
00512 result->num_tag_desc = num_tag_names;
00513 memset( result->tags, 0, size );
00514
00515 /* Initialize each tag descriptor */
00516 for( i = 0; i < result->num_tag_desc; ++i )
00517 {
00518 result = get_tag_desc( file_handle, result, tag_names[i], i, file_id_type, status );
00519 if( NULL == result )
00520 {
00521 free( elem_handles );
00522 free_string_list( tag_names, num_tag_names );
00523 return NULL;
00524 }
00525 }
00526
00527 /* Determine which dense tags are present */
00528
00529 size = ( 2 + result->num_elem_desc ) * result->num_tag_desc;
00530 array = mhdf_malloc( size, status );
00531 if( NULL == array )
00532 {
00533 free( elem_handles );
00534 free_string_list( tag_names, num_tag_names );
00535 free( result );
00536 return NULL;
00537 }
00538 memset( array, 0, size );
00539 matrix = array + ( 2 * result->num_tag_desc );
00540
00541 for( j = 0; j < result->num_tag_desc; ++j )
00542 {
00543 if( mhdf_haveDenseTag( file_handle, tag_names[j], mhdf_node_type_handle(), status ) )
00544 matrix[-1 * result->num_tag_desc + j] = 1;
00545 if( mhdf_haveDenseTag( file_handle, tag_names[j], mhdf_set_type_handle(), status ) )
00546 matrix[-2 * result->num_tag_desc + j] = 1;
00547 for( i = 0; i < result->num_elem_desc; ++i )
00548 if( mhdf_haveDenseTag( file_handle, tag_names[j], elem_handles[i], status ) )
00549 matrix[i * result->num_tag_desc + j] = 1;
00550 }
00551 free( elem_handles );
00552 free_string_list( tag_names, result->num_tag_desc );
00553
00554 /* Populate dense tag lists for element types */
00555 for( i = -2; i < result->num_elem_desc; ++i )
00556 {
00557 size = 0;
00558 for( j = 0; j < result->num_tag_desc; ++j )
00559 size += matrix[i * result->num_tag_desc + j];
00560 if( !size )
00561 {
00562 indices = NULL;
00563 }
00564 else
00565 {
00566 indices = realloc_data( &result, size * sizeof( int ), status, sizeof( int ) );
00567 if( NULL == indices )
00568 {
00569 free( array );
00570 return NULL;
00571 }
00572
00573 k = 0;
00574 for( j = 0; j < result->num_tag_desc; ++j )
00575 if( matrix[i * result->num_tag_desc + j] ) indices[k++] = j;
00576 assert( k == size );
00577 }
00578
00579 if( i == -2 )
00580 {
00581 result->sets.dense_tag_indices = indices;
00582 result->sets.num_dense_tags = size;
00583 }
00584 else if( i == -1 )
00585 {
00586 result->nodes.dense_tag_indices = indices;
00587 result->nodes.num_dense_tags = size;
00588 }
00589 else
00590 {
00591 result->elems[i].desc.dense_tag_indices = indices;
00592 result->elems[i].desc.num_dense_tags = size;
00593 }
00594 }
00595
00596 /* Populate dense tag lists for each tag */
00597 for( j = 0; j < result->num_tag_desc; ++j )
00598 {
00599 size = 0;
00600 for( i = -2; i < result->num_elem_desc; ++i )
00601 size += matrix[i * result->num_tag_desc + j];
00602 if( !size )
00603 {
00604 indices = 0;
00605 }
00606 else
00607 {
00608 indices = realloc_data( &result, size * sizeof( int ), status, sizeof( int ) );
00609 if( NULL == ptr )
00610 {
00611 free( array );
00612 return NULL;
00613 }
00614
00615 k = 0;
00616 for( i = -2; i < result->num_elem_desc; ++i )
00617 if( matrix[i * result->num_tag_desc + j] ) indices[k++] = i;
00618 assert( k == size );
00619 }
00620
00621 result->tags[j].num_dense_indices = size;
00622 result->tags[j].dense_elem_indices = indices;
00623 }
00624
00625 if( extraSetInfo )
00626 {
00627 /* open the table for parallel partitions, material sets, neumann sets,
00628 * dirichlet sets
00629 * to determine number of parts, etc
00630 * this is needed for iMOAB and VisIt plugin */
00631 const int NPRIMARY_SETS = 5;
00632 ptr = realloc_data( &result, NPRIMARY_SETS * sizeof( int ), status, sizeof( int ) );
00633 if( NULL == ptr || mhdf_isError( status ) )
00634 {
00635 free( array );
00636 return NULL;
00637 }
00638 result->numEntSets = ptr;
00639 for( i = 0; i < NPRIMARY_SETS; ++i )
00640 result->numEntSets[i] = 0;
00641
00642 ptr = realloc_data( &result, NPRIMARY_SETS * sizeof( int* ), status, sizeof( int* ) );
00643 if( NULL == ptr || mhdf_isError( status ) )
00644 {
00645 free( array );
00646 return NULL;
00647 }
00648 result->defTagsEntSets = ptr;
00649
00650 ptr = realloc_data( &result, NPRIMARY_SETS * sizeof( int* ), status, sizeof( int* ) );
00651 if( NULL == ptr || mhdf_isError( status ) )
00652 {
00653 free( array );
00654 return NULL;
00655 }
00656 result->defTagsVals = ptr;
00657 numtags = result->num_tag_desc;
00658
00659 for( i = 0; i < numtags; i++ )
00660 {
00661 tag_desc = &( result->tags[i] );
00662 for( k = 0; k < NPRIMARY_SETS; k++ ) /* number of default tags to consider */
00663 {
00664 if( strcmp( pname[k], tag_desc->name ) == 0 )
00665 {
00666 if( tag_desc->have_sparse )
00667 {
00668 mhdf_openSparseTagData( file_handle, pname[k], &nval, &junk, table, status );
00669 if( mhdf_isError( status ) )
00670 {
00671 free( array );
00672 return NULL;
00673 }
00674 /* for sparse tags, read */
00675 result->numEntSets[k] = nval;
00676 if( nval <= 0 ) continue; /* do not do anything */
00677
00678 ptr = realloc_data( &result, nval * sizeof( int ), status, sizeof( int ) );
00679 if( NULL == ptr || mhdf_isError( status ) )
00680 {
00681 free( array );
00682 return NULL;
00683 }
00684 memset( ptr, 0, nval * sizeof( int ) );
00685 result->defTagsEntSets[k] = ptr;
00686 tag_desc = &( result->tags[i] );
00687
00688 ptr = realloc_data( &result, nval * sizeof( int ), status, sizeof( int ) );
00689 if( NULL == ptr || mhdf_isError( status ) )
00690 {
00691 free( array );
00692 return NULL;
00693 }
00694 memset( ptr, 0, nval * sizeof( int ) );
00695 result->defTagsVals[k] = ptr;
00696 tag_desc = &( result->tags[i] ); /* this is because the tag might point to
00697 something else*/
00698
00699 /* make room for the long array type
00700 is it long or something else? */
00701 id_list = mhdf_malloc( nval * sizeof( long ), status );
00702 /* fill the id with values, then convert to int type (-set start)
00703
00704 mhdf_read_data( table_id, offset, count, int_type, id_list, H5P_DEFAULT,
00705 status );*/
00706
00707 data_type = H5Dget_type( table[0] );
00708
00709 mhdf_read_data( table[0], 0, nval, data_type, id_list, H5P_DEFAULT, status );
00710 if( mhdf_isError( status ) )
00711 {
00712 free( array );
00713 return NULL;
00714 }
00715 H5Tclose( data_type );
00716
00717 for( i1 = 0; i1 < nval; i1++ )
00718 result->defTagsEntSets[k][i1] = (int)( id_list[i1] - result->sets.start_id + 1 );
00719 /* now read values, integer type */
00720 data_type = H5Dget_type( table[1] );
00721 mhdf_read_data( table[1], 0, nval, data_type, result->defTagsVals[k], H5P_DEFAULT, status );
00722 if( mhdf_isError( status ) )
00723 {
00724 free( array );
00725 return NULL;
00726 }
00727 H5Tclose( data_type );
00728 mhdf_closeData( file_handle, table[0], status );
00729 if( mhdf_isError( status ) )
00730 {
00731 free( array );
00732 return NULL;
00733 }
00734 mhdf_closeData( file_handle, table[1], status );
00735 if( mhdf_isError( status ) )
00736 {
00737 free( array );
00738 return NULL;
00739 }
00740 free( id_list );
00741 }
00742 else if( 0 == k || 1 == k )
00743 { /* parallel partition or material sets should still work if dense
00744 could be dense tags on sets */
00745 if( !mhdf_haveDenseTag( file_handle, pname[k], mhdf_set_type_handle(), status ) ) continue;
00746 table[0] =
00747 mhdf_openDenseTagData( file_handle, pname[k], mhdf_set_type_handle(), &nval, status );
00748 if( mhdf_isError( status ) )
00749 {
00750 continue; /* do not error out if not a dense tag either */
00751 }
00752 result->numEntSets[k] = nval;
00753 if( nval <= 0 ) continue; /* do not do anything */
00754
00755 /*
00756 * if dense parallel partition or material set, we know what to expect
00757 */
00758 result->numEntSets[k] = nval; /* k could be 0 or 1 */
00759 if( nval <= 0 ) continue; /* do not do anything */
00760
00761 ptr = realloc_data( &result, nval * sizeof( int ), status, sizeof( int ) );
00762 if( NULL == ptr || mhdf_isError( status ) )
00763 {
00764 free( array );
00765 return NULL;
00766 }
00767 memset( ptr, 0, nval * sizeof( int ) );
00768 result->defTagsEntSets[k] = ptr;
00769 tag_desc = &( result->tags[i] );
00770
00771 ptr = realloc_data( &result, nval * sizeof( int ), status, sizeof( int ) );
00772 if( NULL == ptr || mhdf_isError( status ) )
00773 {
00774 free( array );
00775 return NULL;
00776 }
00777 memset( ptr, 0, nval * sizeof( int ) );
00778 result->defTagsVals[k] = ptr;
00779 tag_desc = &( result->tags[i] ); /* this is because the tag might point to
00780 something else*/
00781
00782 for( i1 = 0; i1 < nval; i1++ )
00783 {
00784 result->defTagsEntSets[k][i1] = i1 + 1;
00785 /*result -> defTagsVals[k][i1] = i1; we know how the partition looks
00786 * like */
00787 }
00788 /* fill in the data with the dense tag values
00789 because dense, sets will be in order
00790
00791 we know it has to be integer */
00792 mhdf_readTagValues( table[0], 0, nval, H5T_NATIVE_INT, result->defTagsVals[k], status );
00793 if( mhdf_isError( status ) )
00794 {
00795 free( array );
00796 return NULL;
00797 }
00798 mhdf_closeData( file_handle, table[0], status );
00799 if( mhdf_isError( status ) )
00800 {
00801 free( array );
00802 return NULL;
00803 }
00804 }
00805 }
00806 }
00807 }
00808 }
00809 /* Compact memory and return */
00810 free( array );
00811 result->total_size = result->offset - (unsigned char*)result;
00812
00813 API_END;
00814 return result;
00815 }