Codexで2D線形FEMアプリを作ってみた
この記事のポイント
Codexに「作りたいCAEアプリの範囲」を小さく、具体的に伝えることで、2D線形静解析ソルバ、GUI、サンプルモデル作成までを一気通貫で作りました。
今回のポイントは次の通りです。
- 解析は線形静解析だけに限定する
- 要素は2Dの三角形/四角形だけにする
- 入力はカード型のテキストデッキにする
- 出力は節点変位、要素応力、支持反力のテキストにする
- 100節点程度の軽いサンプルを作らせる
- GUI、README、テストまで段階的に追加する
標準Pythonだけで動く、実験用の小さな2D線形有限要素法アプリです。
注意: 学習・プロトタイプ用途の最小実装です。実務CAEソルバの代替ではありません。
Codexに投げたプロンプトの概要
最初の指示は、次のような形です。
カード型入力デッキを読み込む、構造解析のシミュレータアプリを作ってください。
線形静解析だけでよいです。必要最低限のシンプルな機能で構いません。
入力:
- 節点
- 要素
- 材料
- 境界条件
- 荷重
出力:
- 各節点の変位
- 各要素の応力
- 支持反力
100節点くらいの軽いサンプル入力も作ってください。
その後、最終版に向けて次のような追加指示を出しました。
簡単なGUIアプリも作ってください。
macOSでダブルクリック起動できるアプリにしてください。
公開しやすいように、固有製品名や特定製品を連想させる用語は使わないでください。
入力モデルと解析後モデルを1枚の画像として可視化してください。
解析後の変形イメージを元にアプリアイコンも設定してください。
README内の環境依存パスはマスクしてください。
投稿用に、実行イメージ、サンプルデータ、理論値比較をMarkdownまとめてください。
公開用リポジトリを作成し、実行に関係ないファイルは除外してください。
曖昧に「CAEを作って」ではなく、解析範囲、入力、出力、サンプルサイズ、公開時の方針、公開形態まで指定すると、Codexの作業が安定しました。
GitHub公開版
公開したリポジトリはこちらです。
GitHub公開版には、実行に必要なアプリ本体、ソースコード、README、サンプルデータ、テストだけを含めています。
simple-linear-fea/
├── Simple Linear FEA.app
├── Open Simple Linear FEA.command
├── README.md
├── simple_linear_fea.py
├── simple_linear_fea_ui.py
├── examples/
│ ├── cantilever_plate_100_nodes.deck
│ └── cantilever_plate_100_nodes.out.txt
└── tests/
└── test_basic.py
主なファイルは次の通りです。
-
simple_linear_fea.py: 2D線形静解析ソルバ本体 -
simple_linear_fea_ui.py: Tkinterベースの簡易GUI -
Simple Linear FEA.app: macOSでダブルクリック起動するアプリバンドル -
Open Simple Linear FEA.command: ターミナル経由の補助起動ファイル -
examples/cantilever_plate_100_nodes.deck: 100節点サンプル入力 -
examples/cantilever_plate_100_nodes.out.txt: サンプル解析結果 -
tests/test_basic.py: サンプルモデルのテスト
対応範囲
今回の実装範囲はかなり絞っています。
| 項目 | 内容 |
|---|---|
| 解析 | 2D平面応力、微小変形、線形静解析 |
| 自由度 | 各節点 UX, UY
|
| 要素 |
CQUAD4, CTRIA3
|
| 材料/特性 |
MAT1, PSHELL
|
| 境界条件 |
SPC, SPC1
|
| 荷重 | FORCE |
| ソルバ | 標準Pythonのみ、密行列のガウス消去 |
| GUI | Tkinter |
回転自由度、シェル曲げ、ソリッド、座標変換、非線形解析、固有値解析、動解析などは対象外です。
最終版のアプリ画面
起動直後の画面です。Load Sample で同梱サンプルを読み込み、Run Analysis で解析し、Result タブで結果を確認して、Save Result... でテキスト保存できます。
UIは最小限のボタンと3つのタブだけにしました。
-
Input: 入力デッキの内容、または起動直後の使い方 -
Summary: 読み込んだモデルの節点数、要素数、荷重数など -
Result: 解析結果テキスト
入力モデルと解析後モデルの可視化
入力デッキの元メッシュと、解析結果から得た変形後メッシュを1枚の画像イメージにまとめました。右側は要素のvon Mises応力で色付けしています。変形は見やすくするため自動倍率で拡大しています。
注意: この画像は説明素材で、アプリに可視化機能は含みません。
サンプル入力データ
サンプルは、長さ9m、高さ3m、厚さ0.1mの2D片持ち板です。左端を固定し、右端10節点へ合計10,000Nの下向き荷重を分配しています。
サンプルは examples/cantilever_plate_100_nodes.deck にあります。ここでは主要部分だけ抜粋します。
$ Simple Linear FEA sample: 2D cantilever plate, 100 GRID / 81 CQUAD4
$ Supported by simple_linear_fea.py. Units are SI-like: m, N, Pa.
BEGIN
MAT1,1,2.10E11,,0.30
PSHELL,1,1,0.10
GRID,1,,0.000000,0.000000,0.0
GRID,2,,1.000000,0.000000,0.0
GRID,3,,2.000000,0.000000,0.0
...
GRID,99,,8.000000,3.000000,0.0
GRID,100,,9.000000,3.000000,0.0
CQUAD4,1,1,1,2,12,11
CQUAD4,2,1,2,3,13,12
...
CQUAD4,80,1,88,89,99,98
CQUAD4,81,1,89,90,100,99
SPC1,1,12,1,11,21,31,41,51,61,71,81,91
FORCE,1,10,0,1000.000000,0.0,-1.0,0.0
FORCE,1,20,0,1000.000000,0.0,-1.0,0.0
...
FORCE,1,90,0,1000.000000,0.0,-1.0,0.0
FORCE,1,100,0,1000.000000,0.0,-1.0,0.0
ENDDATA
サンプル出力データ
出力はテキストです。節点変位、要素重心応力、支持反力を出しています。
SIMPLE LINEAR FEA RESULT
========================
INPUT: cantilever_plate_100_nodes.deck
ANALYSIS: 2D plane stress, small displacement, linear static
NODES: 100
ELEMENTS: 81
MATERIALS: 1
PROPERTIES: 1
FORCES: 10
CONSTRAINED DOFS: 20
NODAL DISPLACEMENTS
-------------------
GRID UX UY UMAG
1 0.00000000e+00 0.00000000e+00 0.00000000e+00
10 -1.23749814e-05 -5.30028629e-05 5.44283350e-05
50 -1.33612009e-06 -5.28232527e-05 5.28401480e-05
100 1.23749814e-05 -5.30028629e-05 5.44283350e-05
ELEMENT CENTROID STRESSES
-------------------------
EID TYPE SX SY TXY VON_MISES
1 CQUAD4 -4.96438622e+05 -6.62163068e+04 -3.80641538e+04 4.71497839e+05
81 CQUAD4 3.08702360e+04 -1.20258004e+04 -1.34279190e+04 4.48303208e+04
SUPPORT REACTIONS
-----------------
GRID DOF REACTION
1 UY 5.51906303e+03
91 UY 5.51906303e+03
理論値との比較
2D平面応力モデルなので厳密な梁理論そのものではありませんが、片持ち梁として近似し、結果のオーダーを確認しました。
モデル条件
| 項目 | 値 |
|---|---|
長さ L
|
9.0 m |
高さ H
|
3.0 m |
厚さ t
|
0.10 m |
ヤング率 E
|
2.10e11 Pa |
合計荷重 P
|
10,000 N |
断面二次モーメント I = tH^3/12
|
0.225 m^4 |
先端たわみ
片持ち梁の先端集中荷重の式を使います。
delta = P L^3 / (3 E I)
理論値:
delta = 10000 * 9^3 / (3 * 2.10e11 * 0.225)
= 5.142857e-05 m
解析結果では、右端10節点の UY 絶対値平均は次の通りでした。
FEA average tip |UY| = 5.290548e-05 m
比較:
| 項目 | 値 |
|---|---|
| 梁理論 先端たわみ | 5.142857e-05 m |
| FEA 右端平均たわみ | 5.290548e-05 m |
| 差分 | +2.87 % |
| FEA 右端最大たわみ | 5.300286e-05 m |
| 最大値ベース差分 | +3.06 % |
このくらいの粗いメッシュ、2D平面応力、右端分布荷重の条件で、数%程度の差に収まっています。
固定端近傍の曲げ応力
固定端直近の外側要素の重心位置で、梁理論の曲げ応力と比較しました。
重心位置は、おおよそ x = 0.5 m、中立軸からの距離 y = 1.333333 m です。
M = P (L - x)
sigma = M y / I
理論値:
M = 10000 * (9.0 - 0.5) = 85000 N m
sigma = 85000 * 1.333333 / 0.225
= 5.037037e+05 Pa
解析結果:
max |SX| = 4.964386e+05 Pa
比較:
| 項目 | 値 |
|---|---|
| 梁理論 曲げ応力 | 5.037037e+05 Pa |
| FEA 最大 ` | SX |
| 差分 | -1.44 % |
| FEA 最大von Mises応力 | 4.714978e+05 Pa |
固定端近傍の曲げ応力も、簡易実装としては妥当な値になりました。
反力チェック
荷重合計は下向き10,000Nです。支持反力を合計すると次のようになりました。
| 項目 | 値 |
|---|---|
UX 反力合計 |
3.64e-12 N |
UY 反力合計 |
9,999.999994 N |
力の釣り合いもほぼ取れています。
Codexに任せたこと
Codexには以下を順番に頼みました。
- 標準Pythonのみの2D線形静解析ソルバ
- 100節点の片持ち板サンプル入力
- Tkinter GUI
- macOSの起動用
.app - 起動直後に使い方が分かる画面
- 入力モデルと解析結果の可視化画像
- 解析後メッシュを元にしたアプリアイコン
- README内の環境依存パスのマスク
- 公開用リポジトリの作成と不要ファイル除外
- テストと全文検索による公開前チェック
このように、実装、GUI化、配布形態、検証、ドキュメント化、公開まで1つの流れで進められました。
まとめ
CodexでCAEアプリを作るときは、最初に「どこまで作るか」を狭く決めるのが重要でした。
今回うまくいった指示のポイントは次の通りです。
- 解析対象を線形静解析だけに絞る
- 入力カード、出力項目、要素種別を明示する
- 100節点程度の軽いサンプルを指定する
- GUI、アプリ化、可視化、比較検証を段階的に追加する
- アプリアイコンなど配布時の見た目も、解析結果から派生させる
- 公開前提なら命名、README、除外ファイル、表現もレビューさせる
「まず最小の解析器を作り、サンプルで動かし、GUIを足し、理論値で妥当性確認して、最後にGitHub公開用に整理する」という流れなら、Codex上でも短時間でCAEアプリのプロトタイプを作れます。




