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 の単位変換のみに起因する。