flag=1 の繊維角度 angle に度→ラジアン変換が欠落

Bug #3 (closed) — flag=1 の繊維角度 angle に度→ラジアン変換が欠落

対象バージョン: FrontISTR 5.9 — commit 6d3a1684 (2026-05-19) 修正コミット: 8c201218(ブランチ debug/bug3-angle-unit-fix)


1. 現象

直交異方性積層材(flag=1)の繊維角 angle は、マニュアル上「度」で入力する仕様だが、 実装では読み込んだ値をそのままラジアンとして扱っていた。このため angle ≠ 0 を 度で入力すると構成行列の回転角が誤り、剛性・固有振動数が不正になる。

angle = 0 のケースは 0°=0 rad のため影響を受けない。 梁要素(static_LIB_Job_1.f90)では変換が実装済みで、シェルのみ欠落していた。


2. 原因

fistr1/src/common/fstr_get_prop.f90、積層シェル材料読み込み部(line 229 付近)。 angle を mat_val から読むだけで、度→ラジアン変換を行っていなかった。


3. 修正

読み込み時に度→ラジアン変換を加える(1 行修正)。

-          shell_var(count)%angle = hecMESH%material%mat_val(mpos+i+6)
+          shell_var(count)%angle = hecMESH%material%mat_val(mpos+i+6) / 180.0D0 * (4.0D0*datan(1.0D0))

4.0D0*datan(1.0D0) = π。angle[deg] / 180 × π でラジアンに変換する。

FrontISTR では角度入力は度で受ける。ビーム角度も同様で、static_LIB_Job_1.f90:1038 で angle/180.0D0*pi と変換している。シェル繊維角だけこの変換が抜けていたのが本バグ。


4. テストモデル

強異方性素材 の片持ち梁。x=0 端を全 DOF 拘束し、5 モードの固有値解析 (!SOLUTION, TYPE=EIGEN)。

項目 値
要素 MITC4 (type 741)、規則格子
規模 156 節点・125 要素
板厚 1 mm(1 層、積分点 2)
境界条件 x=0 端 全 DOF 固定
E1 140000 MPa
E2 10000 MPa
ν12 0.3
G12 = G23 = G31 5000 MPa
密度 ρ 1.6E-9 t/mm³

材料は flag=1(!ITEM=1, SUBITEM=9)。1 層モデルのため Bug #1 (closed) の影響はなく、 規則格子の MITC4 のため Bug #2 (closed) の影響も軽微。angle 単位の影響を切り分けて確認できる。


5. ケース構成

検証原理(0° ≡ 180° 不変性): 直交異方性材の繊維軸は向きの正負を区別しないため、 繊維角 angle = 0° と angle = 180° は物理的に同一の材料配置であり、剛性・固有振動数は 完全に一致しなければならない。この一致は外部参照を要さない自己完結した検証になる。

  • 角度を正しく度として扱えば、180°→π rad で cos²=1, sin²=0, sin·cos=0 となり 0° と完全一致する。
  • 度→ラジアン変換が抜けていると、180 をラジアンと誤解釈する(180 rad ≈ 4.07 rad ≈ 233°相当)ため 0° と一致しなくなる。

繊維角 angle の入力値だけを変えた 2 シナリオを before/after で実行。フラット構成(01,02=before / 03,04=after): 01_angle0_before / 02_angle180_before / 03_angle0_after / 04_angle180_after(before=fdf8efbe, after=8c201218)。

ケース angle 入力値 意図
angle0(01/03) 0.0(度) 基準。0°=0 rad のため修正前後で不変
angle180(02/04) 180.0(度) 本命。0° と一致すべき。修正前は 180 をラジアンと誤解釈してずれる

期待される対応関係:

  • 修正前: 02(180°)が 01(0°)と一致しない ❌(180 をラジアン扱い)。
  • 修正後: 02(180°)が 01(0°)と一致する ✅。

各ケースディレクトリは入力一式(Job_1.msh / Job_1.cnt / hecmw_ctrl.dat)と 実行ログ・結果(Job_1.res.0.*)を含む。


6. 検証結果

固有振動数 [Hz](5 モード)。before = 修正前(git_hash fdf8efbe、bug3 未修正)、 after = 修正後(git_hash 8c201218)。TOTAL MASS は全ケース 8.0000E-05 で一致。

実行 angle mode1 mode2 mode3 mode4 mode5
01_angle0_before 0° 6.049 20.37 37.90 68.68 106.2
02_angle180_before 180° 1.834 11.45 25.18 32.28 63.85
03_angle0_after 0° 6.049 20.37 37.90 68.68 106.2
04_angle180_after 180° 6.049 20.37 37.90 68.68 106.2

確認ポイント

  • 修正前: 0° と 180° が不一致 ❌(mode1: 6.049 → 1.834)。180 をラジアンと誤解釈し (180 rad ≈ 4.07 rad ≈ 233°相当)、本来同一であるべき配置が別物になっている。
  • 修正後: 0° と 180° が全モードで完全一致 ✅。0°≡180° の物理的不変性が回復した。
  • before/01_angle0 と after/01_angle0 が一致(6.049)することから、0° では修正前後で 挙動が変わらず(0°=0 rad で変換の有無に依らない)、かつ Bug #1 (closed)/ #2 (closed) の差もこのモデルに 影響しないことが確認できる。差は angle の単位変換のみに起因する。

04_angle180_after.7z

03_angle0_after.7z

02_angle180_before.7z

01_angle0_before.7z