HDF5データタイプ

HDF5は、モデルと結果のデータが階層データフォーマットで含まれるバイナリファイルです。

データベースでは、データセットが階層構造で格納されているため、アプリケーションでのデータセットの追加、削除、または更新が容易です。データベースは、高精度、圧縮、および無制限のデータ量をサポートします。そのオープンなフォーマットと複数のプログラミング言語のサポートは、FEAアプリケーションにとって理想的です。

OptiStruct HDF5出力は、.h5ファイルフォーマットで利用できます。これは、結果データのみが含まれる.hdf5(旧)ファイルフォーマットとは異なります。

サポートされている出力要求

サポートされている出力の詳細については、.h5ファイルをご参照ください。

データタイプ

データタイプスキーマを使用して、データベース構造とそのデータセットフォーマットを定義します。データベースは、データセットのノードからなるツリー構造をしています。各データセットでは、ツリー内のパスを識別子として使用し、構造データフォーマットを定義します。スキーマはXMLで、<typedef><group><dataset>などの要素があります。OptiStructのHDF5データの構造の簡単な説明を以下に示します。


図 1. OptiStructのHDF5データの構造

サポートされているグループ名

HDF5ファイル内のデータは、グループの形式で階層的に構造化されています。最も基本的なツリー内のデータ形式をデータセットと言います。次の表に、現在サポートされているグループとその関連データセットをまとめます。

OptiStruct INPUTグループ

COORDINATE_SYSTEMグループ内のデータセットを以下に示します。
表 1. OPTISTRUCT/INPUT/COORDINATE_SYSTEM
データセット名 フィールド タイプ 説明
CORD1C CID integer 座標系の識別番号。
G1 integer 座標系を定義するための節点ID。
G2 integer
G3 integer
DOMAIN_ID integer ドメイン識別子
CORD1R CID integer 座標系の識別番号。
G1 integer 座標系を定義するための節点ID。
G2 integer
G3 integer
DOMAIN_ID integer ドメイン識別子
CORD1S CID integer 座標系の識別番号。
G1 integer 座標系を定義するための節点ID。
G2 integer
G3 integer
DOMAIN_ID integer ドメイン識別子
CORD2C CID integer 座標系の識別番号。
RID integer 参照座標系識別番号。
A1 double 座標系を定義するための節点ID。
A2 double
A3 double
B1 double
B2 double
B3 double
C1 double
C2 double
C3 double
DOMAIN_ID integer ドメイン識別子
CORD2R CID integer 座標系の識別番号。
RID integer 参照座標系識別番号。
A1 double 座標系を定義するための節点ID。
A2 double
A3 double
B1 double
B2 double
B3 double
C1 double
C2 double
C3 double
DOMAIN_ID integer ドメイン識別子
CORD2S CID integer 座標系ID。
RID integer 参照座標系ID。
A1 double 座標系を定義するための節点ID。
A2 double
A3 double
B1 double
B2 double
B3 double
C1 double
C2 double
C3 double
DOMAIN_ID integer ドメイン識別子
ELEMENTグループ内のデータセットを以下に示します。
表 2. OPTISTRUCT/INPUT/ELEMENT
データセット名 フィールド タイプ 説明
CBAR EID integer 要素識別番号。
PID integer プロパティ識別番号。
GA integer 結合ポイントの節点識別番号。
GB integer
FLAG integer 方向ベクトルオプション
= 0
XYZ基準
= 1
XYZ全体
= 2
グリッド
X1 double GAの変位座標系の成分に対して平行なベクトルvの成分、終点Aの成分、終点Aで測定した成分、または基本座標系。これにより、(終端Aから終端Bへのベクトルで)BAR要素の要素座標系の向きを決定します。
X2 double
X3 double
G0 integer オプションでX1、X2、X3を指定するための節点識別番号。
PA integer バー終端Aのピンフラグ。
PB integer バー終端Bのピンフラグ。
W1A double ポイントGAとGBそれぞれにおける変位座標系内または要素座標系内のオフセットベクトルwaおよびwbの成分。
W2A double
W3A double
W1B double
W2B double
W3B double
DOMAIN_ID integer ドメイン識別子
CBEAM EID integer 要素識別番号。
PID integer プロパティ識別番号。
GA integer 結合ポイントの節点識別番号。
GB integer
SA integer 現在未使用
SB integer
X double 方向ベクトルの成分(X1、X2、およびX3から)
G0 integer オプションでX1、X2、X3を指定するための節点識別番号。
F integer G0の存在を示すためのフラグ
-1
G0が使用されていないことを意味する
0
G0がアクティブになっていることを意味する
PA integer ビーム終端Aのピンフラグ。
PB integer ビーム終端Bのピンフラグ。
WA double オフセットベクトルの成分。節点AおよびBの変位座標系または要素座標系において、節点から、せん断中心の軸の終了ポイントまでを測定します。
WB double
DOMAIN_ID integer ドメイン識別子
CBUSH EID integer 要素識別番号。
PID integer プロパティ識別番号。
GA integer 第1結合ポイントの節点識別番号。
GB integer 第2結合ポイントの節点識別番号。
FLAG integer 方向ベクトルオプション:
= -1
CID
= 0
XYZ基準
= 1
XYZ全体
= 1
グリッド
X1 double GAの変位座標系でのGAを起点とする方向ベクトルの成分。
X2 double
X3 double
G0 integer 節点G0を使用して方向ベクトルを指定するための別の方法。
CID integer 要素座標系識別番号。
S double GAとGB間の線分に沿った割合としてのスプリング-ダンパの位置。
OCID integer スプリング-ダンパオフセットの座標系ID。
S1 double OCID座標系でのスプリング-ダンパオフセットの成分。
S2 double
S3 double
DOMAIN_ID integer ドメイン識別子
CELAS1 EID integer 要素識別番号。
PID integer プロパティエントリ識別番号。
G1 double 形状節点またはスカラーポイントの識別番号。
G2 double
C1 double GRIDデータのCDエントリによって指定される変位座標系上の成分番号。
C2 double
DOMAIN_ID integer ドメイン識別子
CELAS2 EID integer 固有の要素識別番号。
K double スプリングの剛性。
G1 double 形状節点またはスカラーポイントの識別番号。
G2 double
C1 double GRIDデータのCDエントリによって指定される変位座標系上の成分番号。
C2 double
GE double 減衰係数。
S double 応力係数。
DOMAIN_ID integer ドメイン識別子
CHEXA EID integer 要素識別番号。
PID integer プロパティ識別番号。
G integer 結合ポイントの節点識別番号。
DOMAIN_ID integer ドメイン識別子
CPENTA EID integer 要素識別番号。
PID integer プロパティ識別番号。
G integer 結合ポイントの節点識別番号。
DOMAIN_ID integer ドメイン識別子
CQUAD4 EID integer 要素識別番号。
PID integer プロパティ識別番号。
G integer 結合ポイントの節点識別番号。
THETA double 材料方向角(度単位)。
ZOFFS double 要素節点によって定義された平面からシェル基準面までのオフセット。
TFLAG integer Tの存在を示すためのフラグ。
-1
Tが指定されていないことを意味する。
他の値はTが指定されていることを意味する。
T double 節点における要素の厚さ。
MCID integer 材料座標系識別番号。
DOMAIN_ID integer ドメイン識別子
CQUAD8 EID integer 要素識別番号。
PID integer プロパティ識別番号。
G integer 結合ポイントの節点識別番号。
THETA double 材料方向角(度単位)。
ZOFFS double 要素節点によって定義された平面からシェル基準面までのオフセット。
TFLAG integer Tの存在を示すためのフラグ。
-1
Tが指定されていないことを意味する。
他の値はTが指定されていることを意味する。
T double 節点における要素の厚さ。
MCID integer 材料座標系識別番号。
DOMAIN_ID integer ドメイン識別子
CSHEAR EID integer 要素識別番号。
PID integer プロパティ識別番号。
G integer 結合ポイントの節点識別番号。
DOMAIN_ID integer ドメイン識別子
CTETRA EID integer 要素識別番号。
PID integer プロパティ識別番号。
G integer 結合された節点の識別番号。
DOMAIN_ID integer ドメイン識別子
CTRIA3 EID integer 要素識別番号。
PID integer プロパティ識別番号。
G integer 結合された節点の識別番号。
THETA double 材料方向角(度単位)。
ZOFFS double 要素節点によって定義された平面からシェル基準面までのオフセット。
TFLAG integer Tの存在を示すためのフラグ。
-1
Tが指定されていないことを意味する。
他の値はTが指定されていることを意味する。
T double 節点における要素の厚さ。
MCID integer 材料座標系識別番号。
DOMAIN_ID integer ドメイン識別子
CTRIA6 EID integer 要素識別番号。
PID integer プロパティ識別番号。
G integer 結合された節点の識別番号。
THETA double 材料方向角(度単位)。
ZOFFS double 要素節点によって定義された平面からシェル基準面までのオフセット。
TFLAG integer Tの存在を示すためのフラグ。
-1
Tが指定されていないことを意味する。
他の値はTが指定されていることを意味する。
T double 節点における要素の厚さ。
MCID integer 材料座標系識別番号。
DOMAIN_ID integer ドメイン識別子
NODEグループ内のデータセットを以下に示します。
表 3. OPTISTRUCT/INPUT/NODE
データセット名 フィールド タイプ 説明
GRID ID integer グリッド識別番号。
CP integer 座標系の識別番号。
X double 座標系CP内の節点の位置。
CD integer 節点において変位、自由度、制約条件、およびソリューションベクトルが定義される座標系の識別番号。
PS integer 節点に関連付けられる永続的な単点拘束。
SEIDE integer 現在未使用
DOMAIN_ID integer ドメイン識別子
MATERIALグループ内のデータセットを以下に示します。
表 4. OPTISTRUCT/INPUT/PROPERTY
データセット名 フィールド タイプ 説明
PBAR PID integer プロパティ識別番号。
MID double 材料識別番号。
A double 断面の面積。
I1 double 平面1の断面2次モーメント。
I2 double 平面2の断面2次モーメント。
NSM double 断面相乗モーメント。
FE double 現在未使用
C1 double 応力リカバリー係数。
C2 double
D1 double
D2 double
E1 double
E2 double
F1 double
F2 double
K1 double せん断の面積係数。
K2 double
I12 double 断面相乗モーメント。
DOMAIN_ID integer ドメイン識別子
PBARL PID integer プロパティ識別番号。
MID integer 材料識別番号。
GROUP character 任意のビーム断面定義を使用するかどうかを示します。
TYPE character 断面のタイプ。
INFO_POS integer  
INFO_LEN integer
DOMAIN_ID integer ドメイン識別子
PBEAM PID integer プロパティ識別番号。
MID integer 材料識別番号。
NSEGS integer 断面の数
CCF integer 現在未使用
CWELD integer 現在未使用
SECTION BEAM_SECTION これは、ビームの断面プロパティを定義するために使用される係数のグループです。
K1 double 平面1のせん断剛性係数。
K2 double 平面2のせん断剛性係数。
S1 double せん断リリーフ係数
S2 double
NSIA double 終端Aにおける非構造質量重心周りの単位長さあたりの非構造質量慣性モーメント。
NSIB double 終端Bにおける非構造質量重心周りの単位長さあたりの非構造質量慣性モーメント。
CWA double 終端Aの反り係数。
CWB double 終端Bの反り係数。
M1A double 終端Aにおける非構造質量の重心の(y,z)座標。
M2A double
M1B double 終端Bにおける非構造質量の重心の(y,z)座標。
M2B double
N1A double 終端Aにおける中立軸の(y,z)座標。
N2A double
N1B double 終端Bにおける中立軸の(y,z)座標。
N2B double
DOMAIN_ID integer ドメイン識別子
PBUSH PID integer プロパティ識別番号。
K double 方向1~6の公称剛性値。
B double 方向1~6の公称減衰係数。
GE double 方向1~6の公称構造減衰定数。
SA double 並進成分の応力リカバリー係数。
ST double 回転成分の応力リカバリー係数。
EA double 並進成分のひずみリカバリー係数。
ET double 回転成分のひずみリカバリー係数。
M double 方向1~6の公称質量値。
DOMAIN_ID integer ドメイン識別子
PELAS PID integer プロパティ識別番号。
K double 弾性プロパティ値。
GE double 減衰係数。
S double 応力係数。
DOMAIN_ID integer ドメイン識別子
PSHEAR PID integer プロパティ識別番号。
MID integer 材料識別番号。
T double せん断パネルの厚み。
NSM double 単位面積あたりの非構造質量。
F1 double エッジ1-2および3-4に沿った引張剛性の有効係数。
F2 double エッジ2-3および1-4に沿った引張剛性の有効係数。
DOMAIN_ID integer ドメイン識別子
PSHELL PID integer プロパティ識別番号。
MID1 integer 膜の材料識別番号。
T double 膜厚。
MID2 integer 曲げの材料識別番号。
BK double 現在未使用
MID3 integer 横せん断の材料識別番号。
TS double 横せん断厚を膜厚で割った値。
NSM double 単位面積あたりの非構造質量。
Z1 double 応力計算用の板厚方向距離。
Z2 double
MID4 integer 膜-曲げ連成の材料識別番号。
DOMAIN_ID integer ドメイン識別子
PSOLID PID integer プロパティ識別番号。
MID integer 材料識別番号。
CORDM integer 材料座標系のMID。
IN integer 統合ネットワーク
STRESS integer 応力出力の位置選択。
ISOP integer 弾塑性陰的非線形静解析の積分スキーム。
FCTN character 流体要素フラグ。
DOMAIN_ID integer ドメイン識別子

OptiStruct RESULTSグループ

ELEMENTAL/ELEMENT_FORCEグループ内のデータセットを以下に示します。
表 5. OPTISTRUCT/RESULT/ELEMENTAL/ELEMENT_FORCE
データセット名 フィールド タイプ 説明
BAR EID integer 要素識別番号
BM1A double 終端A平面1における曲げモーメント
BM2A double 終端A平面2における曲げモーメント
BM1B double 終端B平面1における曲げモーメント
BM2B double 終端B平面2における曲げモーメント
TS1 double 平面1におけるせん断
TS2 double 平面2におけるせん断
AF double 軸力
TRA integer トルク
DOMAIN_ID integer ドメイン識別子
BEAM EID integer 要素識別番号
FORCE integer BEAMの要素力構造
DOMAIN_ID integer ドメイン識別子
BUSH EID integer 要素識別番号
FX double 力x
FY double 力y
FZ double 力z
MX double 膜力x
MY double 膜力y
MZ integer z方向の曲げモーメント
DOMAIN_ID integer ドメイン識別子
CONROD/ROD EID integer 要素識別番号
AF double 軸力
TRQ double トルク
DOMAIN_ID integer ドメイン識別子
ELAS1 EID integer 要素識別番号
F double
DOMAIN_ID integer ドメイン識別子
TRIA3/QUAD4 EID integer 要素識別番号
FORCE double
DOMAIN_ID integer ドメイン識別子
QUAD8 EID integer 要素識別番号
TERM character 文字列
FORCE double
DOMAIN_ID integer ドメイン識別子
ROD EID integer 要素識別番号
AF character 軸力
TRQ double トルク
DOMAIN_ID integer ドメイン識別子
SHEAR EID integer 要素識別番号
F41 double 力4→力1
F21 double 力2→力1
F12 double 力1→力2
F32 double 力3→力2
F23 double 力2→力3
F43 double 力4→力3
F14 double 力1→力4
KF1 double 1のキック力
S12 double せん断1 2
KF2 double 2のキック力
S23 double せん断2 3
KF3 double 3のキック力
S34 double せん断3 4
KF4 double 4のキック力
S41 double せん断4 1
DOMAIN_ID integer ドメイン識別子
TRIA6 EID integer 要素識別番号
TERM character 位置
FORCE double typedefセクションで定義されるデータ構造
DOMAIN_ID integer ドメイン識別子
ELEMENTAL/STRESSグループ内のデータセットを以下に示します。
表 6. OPTISTRUCT/RESULT/ELEMENTAL/STRESS
データセット名 フィールド タイプ 説明
BAR* EID integer 要素識別番号
X1A double SA1
X2A double SA2
X3A double SA3
X4A double SA4
X double
MAXA double SA最大
MINA double SA最小
MST double 引張の安全余裕度
X1B double SB1
X2B double SB2
X3B double SB3
X4B double SB4
MAXB double SB最大
MINB double SB最小
MSC double 圧縮の安全余裕度
DOMAIN_ID integer ドメイン識別子
BEAM* EID integer 要素識別番号
SS integer BEAMのひずみと応力の構造
DOMAIN_ID integer ドメイン識別子
BUSH* EID integer 要素識別番号
TX double x方向のせん断力
TY double y方向のせん断力
TZ double z方向のせん断力
RX double x方向の回転
MY double y方向の回転
MZ integer z方向の回転
DOMAIN_ID integer ドメイン識別子
CONROD*/ROD* EID integer 要素識別番号
AF double 軸力
TRQ double トルク
DOMAIN_ID integer ドメイン識別子
ELAS1* EID integer 要素識別番号
S double 応力
DOMAIN_ID integer ドメイン識別子
TRIA3*/QUAD4* EID integer 要素識別番号
FD1 double 繊維距離(Z1)
X1 double Z1におけるX方向の法線
Y1 double Z1におけるY方向の法線
XY1 double Z1におけるXY方向のせん断
FD2 double 繊維距離(Z2)
X2 double Z2におけるX方向の法線
Y2 double Z2におけるY方向の法線
XY2 double Z2におけるXY方向のせん断
DOMAIN_ID integer ドメイン識別子
QUAD8* EID integer 要素識別番号
TERM character 文字列
SS double typedefセクションで定義されるデータ構造。
DOMAIN_ID integer ドメイン識別子
ROD* EID integer 要素識別番号
A double 軸応力
MSA double 軸の安全余裕度
T double 合計応力
MST double 引張の安全余裕度
DOMAIN_ID integer ドメイン識別子
SHEAR* EID integer 要素識別番号
TMAX double 最大せん断
TAVG double 平均せん断
MS double 安全余裕度
DOMAIN_ID double ドメイン識別子
TETRA* EID integer 要素識別番号。
CID integer 応力座標系
CTYPE character 座標系タイプ(BCD)
NODEF integer アクティブポイントの数。
SS GRID_SS 節点のひずみと応力の構造。
DOMAIN_ID integer ドメイン識別子
TRIA3* EID integer 要素識別番号。
SS CENTER_2D_SS typedefセクションで定義されるデータ構造。
DOMAIN_ID integer ドメイン識別子
TRIA6* EID integer 要素識別番号。
TERM character 位置
SS GRID_2D_SS typedefセクションで定義されるデータ構造。
DOMAIN_ID integer ドメイン識別子

* これらのデータセットは、ELEMENTAL/STRAINグループにも適用できます。

NODAL/APPLIED_LOADグループ内のデータセットを以下に示します。
表 7. OPTISTRUCT/RESULT/NODAL/APPLIED_LOAD
データセット名 フィールド タイプ 説明
APPLIED_LOAD ID integer グリッド識別番号
X double X成分
Y double Y成分
Z double Z成分
RX double RX成分
RY double RY成分
RZ double RZ成分
DOMAIN_ID integer ドメイン識別子
DISPLACEMENT ID integer グリッド識別番号
X double X成分
Y double Y成分
Z double Z成分
RX double RX成分
RY double RY成分
RZ double RZ成分
_nmd_5rb"> DOMAIN_ID integer ドメイン識別子
EIGENVECTOR ID integer グリッド識別番号
X double X成分
Y double Y成分
Z double Z成分
RX double RX成分
RY double RY成分
RZ double RZ成分
DOMAIN_ID integer ドメイン識別子
MPC_FORCE ID integer グリッド識別番号
X double X成分
Y double Y成分
Z double Z成分
RX double RX成分
RY double RY成分
RZ double RZ成分
DOMAIN_ID integer ドメイン識別子
SPC_FORCE ID integer グリッド識別番号
X double X成分
Y double Y成分
Z double Z成分
RX double RX成分
RY double RY成分
RZ double RZ成分
DOMAIN_ID integer ドメイン識別子

データの読み取り

ここでは、CとPythonでの読み取りの例を示します。

最小要件は次のとおりです:
  • Python: h5pynumpy
  • C: hdf5およびhdf5_hlライブラリ

Pythonの例1:.h5ファイルからの変位の読み取り

この例は、.h5ファイルからの変位データを読み取ります。
# ****************************************************** 
# Example 1: Reading displacement from h5 file
# ****************************************************** 

import h5py
def ex1():
    # file path
    inp_file = "cbar_strstn_static.h5"

    # open file in read-only mode
    f = h5py.File(inp_file, "r")

    # DISPLACEMENT path
    disp_path = "/OPTISTRUCT/RESULT/NODAL/DISPLACEMENT"

    # acquire DISP table
    t = f[disp_path]

    # print data
    print('DISPLACEMENT:\n')
    print(t[:])
    f.close()

if __name__ == "__main__":
    ex1()

Pythonの例2:.h5ファイル内の変位からの特定データの読み取り

この例では、変位の特定データへのアクセス方法を示します。ここでは、データがフィルタリングされ、節点17の変位が取得されます。
# ****************************************************** 
# Example 2: Reading specific data from displacement in h5 file
# ****************************************************** 

# In this example, some senior functions would be used
# to show how to access specific data

import h5py
import numpy as np

def ex1_2():
    # file path
    inp_file = "cbar_strstn_static.h5"

    # open file in read-only mode
    f = h5py.File(inp_file, "r")

    # DISPLACEMENT path
    disp_path = "/OPTISTRUCT/RESULT/NODAL/DISPLACEMENT"

    # acquire DISP table
    t = f[disp_path]

    # 1. query all field name in this table
    print("All fields in DISP table:\n")
    for name in t.dtype.fields.keys():
        print(name, end="  ")

    # 2. filter ID data

    fn = 'ID'
    ids = t[fn]
    print("All ID:\n")
    print(ids[:])

    # 3. get disp of grid 17
    # for this one, numpy is needed

    id = 17
    arr_ids = np.array(ids)
    idx = np.where(arr_ids == id)
    disp_17 = t[idx]

    print("The DISP of grid 17: \n")
    print(disp_17)
    f.close()


if __name__ == "__main__":
    ex1_2()

Pythonの例3:.h5ファイルからの応力の読み取り

この例では、.h5ファイル(dang_van_tbl_smallshr.h5)からのCHEXA応力結果の読み取りを示します。
# ****************************************************** 
# Example 3: Reading CHEXA stresses from h5 file
# ****************************************************** 

import h5py

def printbable(name, n):

    if isinstance(n, h5py.Dataset):
        # this is a dataset(table)
        print("the data of {} is :\n".format(name))
        print(n[:])

def ex2():
    inp_file = "dang_van_tbl_smallshr.h5"

    # open file in read-only mode
    f = h5py.File(inp_file, 'r')

    stress_path = '/OPTISTRUCT/RESULT/ELEMENTAL/STRESS'

    # visit all table under STRESS group and print them out

    g = f[stress_path]
    g.visititems(printbable)


if __name__ == "__main__":
    ex2()


    fn = 'ID'

Cの例

メイン関数は次のように与えられます:
#include "ex.h"

int main() {
    ex2();
} 
#ifndef CEXPFORH5_EX_H
#define CEXPFORH5_EX_H

int ex1();
int ex2();

#endif //CEXPFORH5_EX_H

Cの例1:変位の読み取りと出力

この例では、.h5ファイル(cbar_strstn_static.h5)からのCHEXA応力の読み取りを示します。
# ****************************************************** 
# Example 1: Reading displacements and printing
# ****************************************************** 
#include "hdf5.h"
#include "hdf5_hl.h"
#include <stdlib.h>

#include "ex.h"

#define FILE    "cbar_strstn_static.h5"
#define TABLE_NAME "/OPTISTRUCT/RESULT/NODAL/DISPLACEMENT"

typedef struct Disp {
    long long id;   // grid id
//    double d[6];  // displacement
    double x;
    double y;
    double z;
    double rx;
    double ry;
    double rz;
    long long domid;  //domain_id
} Disp;

int ex1() {

    herr_t re = 0;

    size_t dst_size = sizeof(Disp);
    size_t dst_offset[]=  {
        HOFFSET(Disp,id),
        HOFFSET(Disp, x),
        HOFFSET(Disp, y),
        HOFFSET(Disp, z),
        HOFFSET(Disp, rx),
        HOFFSET(Disp, ry),
        HOFFSET(Disp, rz),
        HOFFSET(Disp,domid)
    };

    Disp disp;
    size_t dst_sizes[] = {
        sizeof(disp.id),
        sizeof(disp.x),
        sizeof(disp.y),
        sizeof(disp.z),
        sizeof(disp.rx),
        sizeof(disp.ry),
        sizeof(disp.rz),
        sizeof(disp.domid)
    };

    //open file in read-only mode
    hid_t file_id = H5Fopen(FILE,H5F_ACC_RDONLY,H5P_DEFAULT);
    if (file_id < 0) {
        printf("Error: file %s is not here\n",FILE);
        return 0;
    }

    hsize_t nfields, nrecords;
    /* Get table info */
    if (H5TBget_table_info(file_id,TABLE_NAME,&nfields,&nrecords) < 0) {
        printf("Error: Table %s is not here\n",TABLE_NAME);
        goto endact;
    }
    if (nrecords == 0 || nfields == 0) {
        printf("The nrecords or nfields of %s is 0, return\n",TABLE_NAME);
        goto endact;
    }

    Disp* dst_buf = NULL;
    dst_buf = (Disp*)malloc(nrecords * dst_size);
    if (!dst_buf) {
        printf("Error: malloc for rstbuf fail\n");
        goto endact;
    }

    // read disp
    if (H5TBread_table(file_id,TABLE_NAME,dst_size,dst_offset,dst_sizes,dst_buf) < 0) {
        printf("Error: read table fail\n");
        goto clearmem;
    }

    //print disp
    for (int i = 0; i < nrecords;i++) {
        printf("GRID %lld: %e, %e, %e, %e, %e, %e, %lld\n",
               dst_buf[i].id,
               dst_buf[i].x,
               dst_buf[i].y,
               dst_buf[i].z,
               dst_buf[i].rx,
               dst_buf[i].ry,
               dst_buf[i].rz,
               dst_buf[i].domid);
    }

clearmem:
    if (dst_buf!=NULL) free(dst_buf);
endact:
    H5Fclose(file_id);

    return 0;
}

Cの例2:CHEXA要素からの応力の読み取りと出力

この例は、.h5ファイル(dang_van_tbl_smallshr.h5)内の配列を操作する手順の理解にも役立ちます。
# ****************************************************** 
# Example 2: Reading stresses from CHEXA element and printing
# ****************************************************** 

#include "hdf5.h"
#include "hdf5_hl.h"
#include <stdlib.h>

#include "ex.h"
#define FILE    "dang_van_tbl_smallshr.h5"
#define TABLE_NAME "/OPTISTRUCT/RESULT/ELEMENTAL/STRESS/HEXA"
typedef struct HEXA {
    long long id;   // grid id
    long long cid;
    char ctype[8];
    long long nodef;
    long long grid[9];
    double x[9];
    double y[9];
    double z[9];
    double rx[9];
    double ry[9];
    double rz[9];
    long long domid;  //domain_id
} HEXA;

int ex2 () {
    herr_t re = 0;

    size_t dst_size = sizeof(HEXA);
    size_t dst_offset[]=  {
            HOFFSET(HEXA,id),
            HOFFSET(HEXA,cid),
            HOFFSET(HEXA,ctype),
            HOFFSET(HEXA,nodef),
            HOFFSET(HEXA,grid),
            HOFFSET(HEXA, x),
            HOFFSET(HEXA, y),
            HOFFSET(HEXA, z),
            HOFFSET(HEXA, rx),
            HOFFSET(HEXA, ry),
            HOFFSET(HEXA, rz),
            HOFFSET(HEXA,domid)
    };

    HEXA hexa;
    size_t dst_sizes[] = {
            sizeof(hexa.id),
            sizeof(hexa.cid),
            sizeof(hexa.ctype),
            sizeof(hexa.nodef),
            sizeof(hexa.grid),
            sizeof(hexa.x),
            sizeof(hexa.y),
            sizeof(hexa.z),
            sizeof(hexa.rx),
            sizeof(hexa.ry),
            sizeof(hexa.rz),
            sizeof(hexa.domid)
    };

    //open file in read-only mode
    hid_t file_id = H5Fopen(FILE,H5F_ACC_RDONLY,H5P_DEFAULT);
    if (file_id < 0) {
        printf("Error: file %s is not here\n",FILE);
        return 0;
    }

    hsize_t nfields, nrecords;
    /* Get table info */
    if (H5TBget_table_info(file_id,TABLE_NAME,&nfields,&nrecords) < 0) {
        printf("Error: Table %s is not here\n",TABLE_NAME);
        goto endact;
    }
    if (nrecords == 0 || nfields == 0) {
        printf("The nrecords or nfields of %s is 0, return\n",TABLE_NAME);
        goto endact;
    }

    HEXA* dst_buf = NULL;
    dst_buf = (HEXA*)malloc(nrecords * dst_size);
    if (!dst_buf) {
        printf("Error: malloc for rstbuf fail\n");
        goto endact;
    }

    // read disp
    if (H5TBread_table(file_id,TABLE_NAME,dst_size,dst_offset,dst_sizes,dst_buf) < 0) {
        printf("Error: read table fail\n");
        goto clearmem;
    }

    //print disp
    for (int i = 0; i < nrecords;i++) {
        printf("HEXA %lld: %lld, %s, %lld, %lld\n",
               dst_buf[i].id,
               dst_buf[i].cid,
               dst_buf[i].ctype,
               dst_buf[i].nodef,
               dst_buf[i].domid);

        for (int j = 0; j < 9 ;j++) {
            printf("\t %lld, %e, %e, %e, %e, %e, %e",
                   dst_buf[i].grid[j],
                   dst_buf[i].x[j],
                   dst_buf[i].y[j],
                   dst_buf[i].z[j],
                   dst_buf[i].rx[j],
                   dst_buf[i].ry[j],
                   dst_buf[i].rz[j]);
        }
        printf("\n");
    }

    clearmem:
    if (dst_buf!=NULL) free(dst_buf);
    endact:
    H5Fclose(file_id);

    return 0;
}