AKARI Tech Blog

燈株式会社のエンジニア・開発メンバーによる技術ブログです

Pythonを使った製品や構造物の挙動のシミュレーション入門

こんばんは! 今週のAKARI Tech Blogは、DX Solution 事業本部 Dev の小山が担当いたします。

CAEはComputer Aided Engineering(コンピューター支援エンジニアリング)の略でものづくり分野で、製品の開発や設計の効率化にコンピューターを活用する技術のことです。その処理の流れは次の3つに分けられます。

  1. プレ処理
  2. ソルバー実行
  3. ポスト処理

私は燈に入社する前はCAEソフトウェアベンダーのエンジニアとしてキャリアを積んできました。その経験を活かし、燈でもCAEへのAI応用という観点からAIの社会実装に取り組んでいます。その際に使用しているPythonは、適用範囲も非常に広く、データ解析、機械学習、Webなどの分野で広く使用されています。それはCAEの分野でも例外ではありません。CAEをAIの共通言語であるPythonで行うことで、AIのCAEへの導入をスムーズに進めることがきます。また、CAEの専門家でなくても、LLMにPythonのコードを生成してもらうことで、CAEを手軽に導入することが期待できます。

それぞれのステップの説明とそれをPythonでどのように実現できるかを示していきます。

本記事では、Python 製の有限要素法(FEM)ライブラリ Felupe を使用します。Felupe は柔軟なメッシュ定義や物性設定が可能で、熱伝導や構造解析などのシミュレーションを比較的シンプルなコードで記述できるのが特徴です。特に、教育用途や研究におけるプロトタイピングに適しており、Pythonで3次元CGを作りたい人のためのPyVista入門で紹介したPyVista などの可視化ライブラリと組み合わせることで、解析結果を直感的に表示できます。Felupe は Python パッケージとして提供されており、pip で簡単にインストールできます。

pip install felupe[all]

プレ処理

プレ処理とは、CADで作成されたモデルをCAE解析用に準備するステップです。具体的には、CADで定義された3Dデータを読み込み、それを有限要素やセルと呼ばれる小さな要素に分割して「メッシュ」を生成します。その後、解析に必要な境界条件(固定や荷重、温度、流速など)や材料特性を設定し、CAEソルバーが数値計算を行える状態に整えます。

今回は、片持ち梁の重力による変位を線形弾性解析を行ってみます。

https://felupe-ja.readthedocs.io/ja/latest/_images/ex01_beam_sketch.png

まずはインストールしたfelupeをインポートします。

import felupe as fem


次に、計算に使う「メッシュ(細かく分割した格子)」を作成します。ここでは、

  • 範囲は a = (0, 0, 0) から b = (2000, 100, 100) までの直方体の空間
  • 各方向に分割する点の数は n = (101, 6, 6)

と指定しています。これは、X方向に101点、Y方向に6点、Z方向に6点を並べて区切り、全体を小さな六面体(サイコロのような形の要素)に分割するという意味です。イメージとしてはレゴブロックをたくさん並べて大きな形を作るような感じです。このように分割することで、大きな物体を小さな要素に置き換えて計算できるようになります。CAEライブラリは、この要素ごとに物理法則を計算し、全体の挙動を近似的に求めていきます。

cube = fem.Cube(a=(0, 0, 0), b=(2000, 100, 100), n=(101, 6, 6))

メッシュを作成した後は、そのメッシュを使って「どの部分にどんな条件を与えるか」を決める必要があります。これを 境界条件 の設定といいます。例えば:

  • 「ここは固定されて動かない」→ 固定条件
  • 「ここに重力をかける」→ 荷重条件

といったように、実際の物理的な状況を計算モデルに反映させる作業です。もし境界条件を設定しないと、APIは「このモデルに何をすればいいのか?」がわからず、正しい解析ができません。つまり、境界条件の設定は解析の出発点になります。

CAE解析では、メッシュを作成して境界条件を与えると、その結果として「変位フィールド」が求められます。変位とは、物体のある点が最初にあった位置から変形後にどれだけ移動したかを表す量です。そしてフィールドとは「空間の中のすべての点に値が割り当てられている状態」を意味します。つまり変位フィールドとは、物体全体のあらゆる点について「どの方向に、どれだけ動いたか」を示す情報の集合です。

region = fem.RegionHexahedron(cube, uniform=True)
displacement = fem.Field(region, dim=3)
field = fem.FieldContainer([displacement])

具体的には、メッシュの各節点ごとに「X方向に何mm動いた」「Y方向に何mm動いた」といった変位の値が計算されます。これを可視化することで、物体が全体としてどのように変形したかを直感的に理解できます。イメージとしては、ゴムのシートにマス目を書き、そのシートを引っ張ったときにマス目の交点が移動していく様子を思い浮かべるとわかりやすいでしょう。

梁の左端に固定境界条件を適用する、というのは「その部分をまったく動かないように固定する」という意味です。具体的には、固定された点では:

  • 移動(変位)ができない
  • 回転もできない

つまり、完全に壁に埋め込まれているような状態になります。

イメージとしては、梁の左端を壁にしっかり取り付けた状態を想像するとわかりやすいです。このように一部を固定することで、荷重をかけたときにどのように変形するかを解析できるようになります。

boundaries = fem.BoundaryDict(fixed=fem.dof.Boundary(displacement, fx=0))

ここまでで、解析に使う「メッシュ」と「境界条件」を設定してきました。これらが正しく定義できているかを確認することはとても大切です。なぜなら、メッシュの形や境界条件の位置に間違いがあると、解析結果が現実と大きくずれてしまうからです。CAEソフトでは、コードに用意されているメソッドを呼び出すことで、メッシュの分割の様子や、どの部分に境界条件が与えられているかを画面上で可視化できます。たとえば、梁の端が固定されている部分が色や記号で表示されたり、荷重がかかる位置が矢印で示されたりします。イメージとしては、地図を作ったあとに「ちゃんと道路や建物の位置が合っているか」を目で確認する作業に似ています。解析に進む前にこの確認をしておくことで、後のトラブルを防ぎ、安心して計算を実行できるようになります。

boundaries.plot().show()

注意:以下の画像はインタラクティブです。回転して全体を確認してください。

CAE解析では、物体の変形や応力を計算するために、材料の性質をモデルとして定義する必要があります。ここでいう「材料の挙動」とは、力を加えたときに材料がどのように伸びたり縮んだりするか、また応力がどのように分布するかを表すものです。この材料を設定することで、CAEソフトは物体に力がかかったときに、どのくらい変形し、どこに応力が集中するかを計算できるようになります。

umat = fem.LinearElastic(E=206000, nu=0.3)
solid = fem.SolidBody(umat=umat, field=field)

CAE解析では、物体に働く力をモデルとして与える必要があります。ここでいう「物体力」とは、物体全体に均等に働く力のことです。今回の例では、固体全体にかかる一定の重力として定義されています。具体的には、地球上にある物体が自然に受ける重力をイメージするとわかりやすいです。物体のすべての部分に同じ方向に力がかかると考えます。この重力を材料やメッシュの各節点に自動的に分配して計算することで、物体がどのようにたわむかを解析できます。

density = 7850 * 1e-12
gravity = [0, 0, 9810]
force = fem.SolidBodyForce(field, values=gravity, scale=density)

ソルバー実行

CAE解析では、物体にかかる力と材料の性質をもとに、行列計算を使って変形を求めます。まず、物体の「硬さ」を表す剛性マトリックスという行列が作られ、同時に重力などの力は物体力ベクトルとしてまとめられます。ソルバーはこの剛性マトリックスと物体力ベクトルを使って、各節点がどれだけ変位するかを計算します。簡単にイメージすると、剛性マトリックスは「ばねの固さ」、物体力ベクトルは「ばねにかかる力」を表しており、ソルバーは「力に対してばねがどれだけ伸びるか」を行列計算で一度に求めているようなものです。このように、CAEソフトは複雑な構造でも、行列計算を通じて効率的に変形や応力を求めることができます。

step = fem.Step(items=[solid, force], boundaries=boundaries)
job = fem.Job(steps=[step]).evaluate()

ポスト処理

ソルバーを実行すると、各節点の変位や要素の応力といった数値データが得られます。しかし、数値だけでは全体の様子を直感的に理解することが難しいため、これらの結果を図として表示して確認する作業を「ポスト処理」と呼びます。ポスト処理では、計算結果が適切かどうか、境界条件や荷重が想定通りに設定されているか、そして物体が物理的に妥当な変形をしているかを視覚的に確かめることができます。

変位フィールドは、物体の中のすべての点がどれだけ動いたかを表すもので、解析のもっとも基本的な出力のひとつです。ただし実際の変位量は非常に小さいことが多いため、そのまま表示しても目では変形を確認できません。そこでCAEソフトでは、変位を任意の倍率で拡大して可視化するのが一般的です。今回の例では、変位フィールドの大きさを300倍に拡大し、その変形した形状上にプロットしています。たとえば、ある点の実際の変位がわずか0.5mmであっても、表示上では150mm動いたように見えるわけです。

このように拡大表示することで、解析の傾向や境界条件の影響を直感的につかむことができますが、注意すべき点もあります。表示はあくまで誇張された見やすさのためのものなので、見た目の大きさと実際の数値を混同しないようにしなければなりません。必ずカラーバーや凡例を確認し、最大変位の実際の値を読み取ることが重要です。また、メッシュの分割や表示方法によって見え方が変わることもあるため、数値と図を合わせて確認することが欠かせません。

注意:以下の画像はインタラクティブです。回転して全体を確認してください。

MVP(Minimum Viable Product)

ここまで、CAE解析をPythonで行う手順を紹介してきました。処理のすべてをPythonで記述しているため、LLMを活用してコードを生成することも容易です。一方で、非プログラマでも直感的に触れられるインタラクティブな解析体験を早期に提供し、 技術的妥当性・ユーザー価値・事業的ポテンシャル を迅速に検証することも重要です。そこで、本記事で作成してきたPythonコードをStreamlitに組み込み、MVP(Minimum Viable Product)のUIを構築しました。このコードもLLMを用いて生成しています。以下のボタンから、Streamlit Community CloudにデプロイしたMVPをご確認いただけます。


stpyvista examples and documentation


Screen recording of stpyvista and felupe

コードは https://github.com/tkoyama010/stpyvista-felupe で公開しています。

最後に


Felupeを開発していただいたAndreas Dutzler氏に感謝いたします。また、MVPの開発において🧊 stpyvista + felupe · adtzlr felupe · Discussion #1001 · GitHubにて有用なアドバイスをいただきました。

ライセンス

本記事はFElupe ドキュメントをCAEの入門者向けに改変したものです。記事とコードのライセンスはFElupeのライセンスを継承しGNU General Public Licenseとなります。

We’re Hiring!

燈では、Pythonで科学や工学の最新技術を社会実装するAIエンジニアを募集しています! 興味がある方は、ぜひカジュアル面談でお話しましょう!
ぜひカジュアル面談でお話ししましょう!
また、採用サイトがリニューアルされましたので、ぜひご覧ください。
akariinc.co.jp