![]() |
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 "status.h"
00022 #include "names-and-paths.h"
00023 #include "util.h"
00024 #include "file-handle.h"
00025
00026 int mhdf_haveNodes( mhdf_FileHandle file, mhdf_Status* status )
00027 {
00028 FileHandle* file_ptr = (FileHandle*)file;
00029 hid_t root_id, node_id;
00030 int result;
00031 API_BEGIN;
00032
00033 if( !mhdf_check_valid_file( file_ptr, status ) ) return -1;
00034
00035 #if defined( H5Gopen_vers ) && H5Gopen_vers > 1
00036 root_id = H5Gopen2( file_ptr->hdf_handle, ROOT_GROUP, H5P_DEFAULT );
00037 #else
00038 root_id = H5Gopen( file_ptr->hdf_handle, ROOT_GROUP );
00039 #endif
00040 if( root_id < 0 )
00041 {
00042 mhdf_setFail( status, "H5Gopen( \"%s\" ) failed.", ROOT_GROUP );
00043 return -1;
00044 }
00045
00046 result = mhdf_is_in_group( root_id, NODE_GROUP_NAME, status );
00047 if( result < 1 )
00048 {
00049 H5Gclose( root_id );
00050 return result;
00051 }
00052
00053 #if defined( H5Gopen_vers ) && H5Gopen_vers > 1
00054 node_id = H5Gopen2( root_id, NODE_GROUP_NAME, H5P_DEFAULT );
00055 #else
00056 node_id = H5Gopen( root_id, NODE_GROUP_NAME );
00057 #endif
00058 H5Gclose( root_id );
00059 if( node_id < 0 )
00060 {
00061 mhdf_setFail( status, "H5Gopen( \"%s\" ) failed.", NODE_GROUP );
00062 return -1;
00063 }
00064
00065 result = mhdf_is_in_group( node_id, NODE_COORD_NAME, status );
00066 if( result >= 0 ) mhdf_setOkay( status );
00067 H5Gclose( node_id );
00068 API_END;
00069 return result;
00070 }
00071
00072 hid_t mhdf_createNodeCoords( mhdf_FileHandle file_handle,
00073 int dimension,
00074 long num_nodes,
00075 long* first_id_out,
00076 mhdf_Status* status )
00077 {
00078 FileHandle* file_ptr = (FileHandle*)file_handle;
00079 hid_t table_id;
00080 hsize_t dims[2];
00081 long first_id;
00082 API_BEGIN;
00083
00084 if( !mhdf_check_valid_file( file_ptr, status ) ) return -1;
00085
00086 if( dimension < 1 )
00087 {
00088 mhdf_setFail( status, "Invalid argument: dimension = %d.", dimension );
00089 return -1;
00090 }
00091
00092 dims[0] = (hsize_t)num_nodes;
00093 dims[1] = (hsize_t)dimension;
00094 table_id = mhdf_create_table( file_ptr->hdf_handle, NODE_COORD_PATH, H5T_NATIVE_DOUBLE, 2, dims, status );
00095 if( table_id < 0 ) return -1;
00096
00097 first_id = file_ptr->max_id + 1;
00098 if( !mhdf_create_scalar_attrib( table_id, START_ID_ATTRIB, H5T_NATIVE_LONG, &first_id, status ) )
00099 {
00100 H5Dclose( table_id );
00101 return -1;
00102 }
00103
00104 *first_id_out = first_id;
00105 file_ptr->max_id += num_nodes;
00106 if( !mhdf_write_max_id( file_ptr, status ) )
00107 {
00108 H5Dclose( table_id );
00109 return -1;
00110 }
00111 file_ptr->open_handle_count++;
00112 mhdf_setOkay( status );
00113
00114 API_END_H( 1 );
00115 return table_id;
00116 }
00117
00118 hid_t mhdf_openNodeCoords( mhdf_FileHandle file_handle,
00119 long* num_nodes_out,
00120 int* dimension_out,
00121 long* first_id_out,
00122 mhdf_Status* status )
00123 {
00124 FileHandle* file_ptr = (FileHandle*)file_handle;
00125 hid_t table_id;
00126 hsize_t dims[2];
00127 API_BEGIN;
00128
00129 if( !mhdf_check_valid_file( file_ptr, status ) ) return -1;
00130
00131 table_id = mhdf_open_table2( file_ptr->hdf_handle, NODE_COORD_PATH, 2, dims, first_id_out, status );
00132 if( table_id < 0 ) return -1;
00133
00134 *num_nodes_out = dims[0];
00135 *dimension_out = dims[1];
00136 file_ptr->open_handle_count++;
00137 mhdf_setOkay( status );
00138 API_END_H( 1 );
00139 return table_id;
00140 }
00141
00142 hid_t mhdf_openNodeCoordsSimple( mhdf_FileHandle file_handle, mhdf_Status* status )
00143 {
00144 FileHandle* file_ptr = (FileHandle*)file_handle;
00145 hid_t table_id;
00146 API_BEGIN;
00147
00148 if( !mhdf_check_valid_file( file_ptr, status ) ) return -1;
00149
00150 table_id = mhdf_open_table_simple( file_ptr->hdf_handle, NODE_COORD_PATH, status );
00151 if( table_id < 0 ) return -1;
00152
00153 file_ptr->open_handle_count++;
00154 mhdf_setOkay( status );
00155 API_END_H( 1 );
00156 return table_id;
00157 }
00158
00159 void mhdf_writeNodeCoords( hid_t table_id, long offset, long count, const double* coords, mhdf_Status* status )
00160 {
00161 API_BEGIN;
00162 mhdf_write_data( table_id, offset, count, H5T_NATIVE_DOUBLE, coords, H5P_DEFAULT, status );
00163 API_END;
00164 }
00165 void mhdf_writeNodeCoordsWithOpt( hid_t table_id,
00166 long offset,
00167 long count,
00168 const double* coords,
00169 hid_t prop,
00170 mhdf_Status* status )
00171 {
00172 API_BEGIN;
00173 mhdf_write_data( table_id, offset, count, H5T_NATIVE_DOUBLE, coords, prop, status );
00174 API_END;
00175 }
00176
00177 void mhdf_readNodeCoords( hid_t table_id, long offset, long count, double* coords, mhdf_Status* status )
00178 {
00179 API_BEGIN;
00180 mhdf_read_data( table_id, offset, count, H5T_NATIVE_DOUBLE, coords, H5P_DEFAULT, status );
00181 API_END;
00182 }
00183 void mhdf_readNodeCoordsWithOpt( hid_t table_id,
00184 long offset,
00185 long count,
00186 double* coords,
00187 hid_t prop,
00188 mhdf_Status* status )
00189 {
00190 API_BEGIN;
00191 mhdf_read_data( table_id, offset, count, H5T_NATIVE_DOUBLE, coords, prop, status );
00192 API_END;
00193 }
00194
00195 void mhdf_writeNodeCoord( hid_t table_id,
00196 long offset,
00197 long count,
00198 int dimension,
00199 const double* coords,
00200 mhdf_Status* status )
00201 {
00202 API_BEGIN;
00203 mhdf_write_column( table_id, dimension, offset, count, H5T_NATIVE_DOUBLE, coords, H5P_DEFAULT, status );
00204 API_END;
00205 }
00206 void mhdf_writeNodeCoordWithOpt( hid_t table_id,
00207 long offset,
00208 long count,
00209 int dimension,
00210 const double* coords,
00211 hid_t prop,
00212 mhdf_Status* status )
00213 {
00214 API_BEGIN;
00215 mhdf_write_column( table_id, dimension, offset, count, H5T_NATIVE_DOUBLE, coords, prop, status );
00216 API_END;
00217 }
00218
00219 void mhdf_readNodeCoord( hid_t table_id, long offset, long count, int dimension, double* coords, mhdf_Status* status )
00220 {
00221 API_BEGIN;
00222 mhdf_read_column( table_id, dimension, offset, count, H5T_NATIVE_DOUBLE, coords, H5P_DEFAULT, status );
00223 API_END;
00224 }
00225 void mhdf_readNodeCoordWithOpt( hid_t table_id,
00226 long offset,
00227 long count,
00228 int dimension,
00229 double* coords,
00230 hid_t prop,
00231 mhdf_Status* status )
00232 {
00233 API_BEGIN;
00234 mhdf_read_column( table_id, dimension, offset, count, H5T_NATIVE_DOUBLE, coords, prop, status );
00235 API_END;
00236 }