![]() |
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 #include
00017 #include
00018 #include
00019 #include
00020 #include "mhdf.h"
00021 #include "util.h"
00022 #include "file-handle.h"
00023 #include "status.h"
00024 #include "names-and-paths.h"
00025
00026 hid_t mhdf_createConnectivity( mhdf_FileHandle file_handle,
00027 const char* elem_handle,
00028 int nodes_per_elem,
00029 long count,
00030 long* first_id_out,
00031 mhdf_Status* status )
00032 {
00033 FileHandle* file_ptr;
00034 hid_t elem_id, table_id;
00035 hsize_t dims[2];
00036 long first_id;
00037 API_BEGIN;
00038
00039 file_ptr = (FileHandle*)( file_handle );
00040 if( !mhdf_check_valid_file( file_ptr, status ) ) return -1;
00041
00042 if( nodes_per_elem <= 0 || count < 0 || !first_id_out )
00043 {
00044 mhdf_setFail( status, "Invalid argument." );
00045 return -1;
00046 }
00047
00048 elem_id = mhdf_elem_group_from_handle( file_ptr, elem_handle, status );
00049 if( elem_id < 0 ) return -1;
00050
00051 dims[0] = (hsize_t)count;
00052 dims[1] = (hsize_t)nodes_per_elem;
00053 table_id = mhdf_create_table( elem_id, CONNECTIVITY_NAME, file_ptr->id_type, 2, dims, status );
00054 H5Gclose( elem_id );
00055 if( table_id < 0 ) return -1;
00056
00057 first_id = file_ptr->max_id + 1;
00058 if( !mhdf_create_scalar_attrib( table_id, START_ID_ATTRIB, H5T_NATIVE_LONG, &first_id, status ) )
00059 {
00060 H5Dclose( table_id );
00061 return -1;
00062 }
00063
00064 *first_id_out = first_id;
00065 file_ptr->max_id += count;
00066 if( !mhdf_write_max_id( file_ptr, status ) )
00067 {
00068 H5Dclose( table_id );
00069 return -1;
00070 }
00071 file_ptr->open_handle_count++;
00072 mhdf_setOkay( status );
00073
00074 API_END_H( 1 );
00075 return table_id;
00076 }
00077
00078 hid_t mhdf_openConnectivity( mhdf_FileHandle file_handle,
00079 const char* elem_handle,
00080 int* num_nodes_per_elem_out,
00081 long* num_elements_out,
00082 long* first_elem_id_out,
00083 mhdf_Status* status )
00084 {
00085 FileHandle* file_ptr;
00086 hid_t elem_id, table_id;
00087 hsize_t dims[2];
00088 API_BEGIN;
00089
00090 file_ptr = (FileHandle*)( file_handle );
00091 if( !mhdf_check_valid_file( file_ptr, status ) ) return -1;
00092
00093 if( !num_nodes_per_elem_out || !num_elements_out || !first_elem_id_out )
00094 {
00095 mhdf_setFail( status, "Invalid argument." );
00096 return -1;
00097 }
00098
00099 elem_id = mhdf_elem_group_from_handle( file_ptr, elem_handle, status );
00100 if( elem_id < 0 ) return -1;
00101
00102 table_id = mhdf_open_table2( elem_id, CONNECTIVITY_NAME, 2, dims, first_elem_id_out, status );
00103
00104 H5Gclose( elem_id );
00105 if( table_id < 0 ) return -1;
00106
00107 *num_elements_out = dims[0];
00108 *num_nodes_per_elem_out = dims[1];
00109
00110 file_ptr->open_handle_count++;
00111 mhdf_setOkay( status );
00112 API_END_H( 1 );
00113 return table_id;
00114 }
00115
00116 hid_t mhdf_openConnectivitySimple( mhdf_FileHandle file_handle, const char* elem_handle, mhdf_Status* status )
00117 {
00118 FileHandle* file_ptr;
00119 hid_t elem_id, table_id;
00120 API_BEGIN;
00121
00122 file_ptr = (FileHandle*)( file_handle );
00123 if( !mhdf_check_valid_file( file_ptr, status ) ) return -1;
00124
00125 elem_id = mhdf_elem_group_from_handle( file_ptr, elem_handle, status );
00126 if( elem_id < 0 ) return -1;
00127
00128 table_id = mhdf_open_table_simple( elem_id, CONNECTIVITY_NAME, status );
00129
00130 H5Gclose( elem_id );
00131 if( table_id < 0 ) return -1;
00132
00133 file_ptr->open_handle_count++;
00134 mhdf_setOkay( status );
00135 API_END_H( 1 );
00136 return table_id;
00137 }
00138
00139 void mhdf_writeConnectivity( hid_t table_id,
00140 long offset,
00141 long count,
00142 hid_t hdf_integer_type,
00143 const void* nodes,
00144 mhdf_Status* status )
00145 {
00146 API_BEGIN;
00147 mhdf_write_data( table_id, offset, count, hdf_integer_type, nodes, H5P_DEFAULT, status );
00148 API_END;
00149 }
00150 void mhdf_writeConnectivityWithOpt( hid_t table_id,
00151 long offset,
00152 long count,
00153 hid_t hdf_integer_type,
00154 const void* nodes,
00155 hid_t prop,
00156 mhdf_Status* status )
00157 {
00158 API_BEGIN;
00159 mhdf_write_data( table_id, offset, count, hdf_integer_type, nodes, prop, status );
00160 API_END;
00161 }
00162
00163 void mhdf_readConnectivity( hid_t table_id,
00164 long offset,
00165 long count,
00166 hid_t hdf_integer_type,
00167 void* nodes,
00168 mhdf_Status* status )
00169 {
00170 API_BEGIN;
00171 mhdf_read_data( table_id, offset, count, hdf_integer_type, nodes, H5P_DEFAULT, status );
00172 API_END;
00173 }
00174 void mhdf_readConnectivityWithOpt( hid_t table_id,
00175 long offset,
00176 long count,
00177 hid_t hdf_integer_type,
00178 void* nodes,
00179 hid_t prop,
00180 mhdf_Status* status )
00181 {
00182 API_BEGIN;
00183 mhdf_read_data( table_id, offset, count, hdf_integer_type, nodes, prop, status );
00184 API_END;
00185 }
00186
00187 void mhdf_createPolyConnectivity( mhdf_FileHandle file_handle,
00188 const char* elem_type,
00189 long num_poly,
00190 long data_list_length,
00191 long* first_id_out,
00192 hid_t handles_out[2],
00193 mhdf_Status* status )
00194 {
00195 FileHandle* file_ptr;
00196 hid_t elem_id, index_id, conn_id;
00197 hsize_t dim;
00198 long first_id;
00199 API_BEGIN;
00200
00201 file_ptr = (FileHandle*)( file_handle );
00202 if( !mhdf_check_valid_file( file_ptr, status ) ) return;
00203
00204 if( num_poly <= 0 || data_list_length <= 0 || !first_id_out )
00205 {
00206 mhdf_setFail( status, "Invalid argument." );
00207 return;
00208 }
00209
00210 if( data_list_length < 3 * num_poly )
00211 {
00212 /* Could check agains 4*num_poly, but allow degenerate polys
00213 (1 for count plus 2 dim-1 defining entities, where > 2
00214 defining entities is a normal poly, 2 defining entities
00215 is a degenerate poly and 1 defning entity is not valid.)
00216 */
00217
00218 mhdf_setFail( status,
00219 "Invalid polygon data: data length of %ld is "
00220 "insufficient for %ld poly(gons/hedra).\n",
00221 data_list_length, num_poly );
00222 return;
00223 }
00224
00225 elem_id = mhdf_elem_group_from_handle( file_ptr, elem_type, status );
00226 if( elem_id < 0 ) return;
00227
00228 dim = (hsize_t)num_poly;
00229 index_id = mhdf_create_table( elem_id, POLY_INDEX_NAME, MHDF_INDEX_TYPE, 1, &dim, status );
00230 if( index_id < 0 )
00231 {
00232 H5Gclose( elem_id );
00233 return;
00234 }
00235
00236 dim = (hsize_t)data_list_length;
00237 conn_id = mhdf_create_table( elem_id, CONNECTIVITY_NAME, file_ptr->id_type, 1, &dim, status );
00238 H5Gclose( elem_id );
00239 if( conn_id < 0 )
00240 {
00241 H5Dclose( index_id );
00242 return;
00243 }
00244
00245 first_id = file_ptr->max_id + 1;
00246 if( !mhdf_create_scalar_attrib( conn_id, START_ID_ATTRIB, H5T_NATIVE_LONG, &first_id, status ) )
00247 {
00248 H5Dclose( index_id );
00249 H5Dclose( conn_id );
00250 return;
00251 }
00252
00253 *first_id_out = first_id;
00254 file_ptr->max_id += num_poly;
00255 if( !mhdf_write_max_id( file_ptr, status ) )
00256 {
00257 H5Dclose( index_id );
00258 H5Dclose( conn_id );
00259 return;
00260 }
00261 file_ptr->open_handle_count++;
00262 mhdf_setOkay( status );
00263 handles_out[0] = index_id;
00264 handles_out[1] = conn_id;
00265 API_END_H( 2 );
00266 }
00267
00268 void mhdf_openPolyConnectivity( mhdf_FileHandle file_handle,
00269 const char* element_handle,
00270 long* num_poly_out,
00271 long* data_list_length_out,
00272 long* first_poly_id_out,
00273 hid_t handles_out[2],
00274 mhdf_Status* status )
00275 {
00276 FileHandle* file_ptr;
00277 hid_t elem_id, table_id, index_id;
00278 hsize_t row_count;
00279 API_BEGIN;
00280
00281 file_ptr = (FileHandle*)( file_handle );
00282 if( !mhdf_check_valid_file( file_ptr, status ) ) return;
00283
00284 if( !num_poly_out || !data_list_length_out || !first_poly_id_out )
00285 {
00286 mhdf_setFail( status, "Invalid argument." );
00287 return;
00288 }
00289
00290 elem_id = mhdf_elem_group_from_handle( file_ptr, element_handle, status );
00291 if( elem_id < 0 ) return;
00292
00293 index_id = mhdf_open_table( elem_id, POLY_INDEX_NAME, 1, &row_count, status );
00294 if( index_id < 0 )
00295 {
00296 H5Gclose( elem_id );
00297 return;
00298 }
00299 *num_poly_out = (int)row_count;
00300
00301 table_id = mhdf_open_table( elem_id, CONNECTIVITY_NAME, 1, &row_count, status );
00302
00303 H5Gclose( elem_id );
00304 if( table_id < 0 )
00305 {
00306 H5Dclose( index_id );
00307 return;
00308 }
00309 *data_list_length_out = (long)row_count;
00310
00311 if( !mhdf_read_scalar_attrib( table_id, START_ID_ATTRIB, H5T_NATIVE_LONG, first_poly_id_out, status ) )
00312 {
00313 H5Dclose( table_id );
00314 H5Dclose( index_id );
00315 return;
00316 }
00317
00318 file_ptr->open_handle_count++;
00319 handles_out[0] = index_id;
00320 handles_out[1] = table_id;
00321 mhdf_setOkay( status );
00322 API_END_H( 2 );
00323 }
00324
00325 void mhdf_writePolyConnIndices( hid_t table_id,
00326 long offset,
00327 long count,
00328 hid_t hdf_integer_type,
00329 const void* index_list,
00330 mhdf_Status* status )
00331 {
00332 API_BEGIN;
00333 mhdf_write_data( table_id, offset, count, hdf_integer_type, index_list, H5P_DEFAULT, status );
00334 API_END;
00335 }
00336 void mhdf_writePolyConnIndicesWithOpt( hid_t table_id,
00337 long offset,
00338 long count,
00339 hid_t hdf_integer_type,
00340 const void* index_list,
00341 hid_t prop,
00342 mhdf_Status* status )
00343 {
00344 API_BEGIN;
00345 mhdf_write_data( table_id, offset, count, hdf_integer_type, index_list, prop, status );
00346 API_END;
00347 }
00348
00349 void mhdf_readPolyConnIndices( hid_t table_id,
00350 long offset,
00351 long count,
00352 hid_t hdf_integer_type,
00353 void* index_list,
00354 mhdf_Status* status )
00355 {
00356 API_BEGIN;
00357 mhdf_read_data( table_id, offset, count, hdf_integer_type, index_list, H5P_DEFAULT, status );
00358 API_END;
00359 }
00360 void mhdf_readPolyConnIndicesWithOpt( hid_t table_id,
00361 long offset,
00362 long count,
00363 hid_t hdf_integer_type,
00364 void* index_list,
00365 hid_t prop,
00366 mhdf_Status* status )
00367 {
00368 API_BEGIN;
00369 mhdf_read_data( table_id, offset, count, hdf_integer_type, index_list, prop, status );
00370 API_END;
00371 }
00372
00373 void mhdf_writePolyConnIDs( hid_t table_id,
00374 long offset,
00375 long count,
00376 hid_t hdf_integer_type,
00377 const void* id_list,
00378 mhdf_Status* status )
00379 {
00380 API_BEGIN;
00381 mhdf_write_data( table_id, offset, count, hdf_integer_type, id_list, H5P_DEFAULT, status );
00382 API_END;
00383 }
00384 void mhdf_writePolyConnIDsWithOpt( hid_t table_id,
00385 long offset,
00386 long count,
00387 hid_t hdf_integer_type,
00388 const void* id_list,
00389 hid_t prop,
00390 mhdf_Status* status )
00391 {
00392 API_BEGIN;
00393 mhdf_write_data( table_id, offset, count, hdf_integer_type, id_list, prop, status );
00394 API_END;
00395 }
00396
00397 void mhdf_readPolyConnIDs( hid_t table_id,
00398 long offset,
00399 long count,
00400 hid_t hdf_integer_type,
00401 void* id_list,
00402 mhdf_Status* status )
00403 {
00404 API_BEGIN;
00405 mhdf_read_data( table_id, offset, count, hdf_integer_type, id_list, H5P_DEFAULT, status );
00406 API_END;
00407 }
00408 void mhdf_readPolyConnIDsWithOpt( hid_t table_id,
00409 long offset,
00410 long count,
00411 hid_t hdf_integer_type,
00412 void* id_list,
00413 hid_t prop,
00414 mhdf_Status* status )
00415 {
00416 API_BEGIN;
00417 mhdf_read_data( table_id, offset, count, hdf_integer_type, id_list, prop, status );
00418 API_END;
00419 }