トポロジー最適化用設計領域の設定方法#

pyemsol では,トポロジー最適化用の設計領域を設定することができます。

有限要素の材料特性を変更しながら最適化の反復計算を行うことができます。

Note

pyemsol のインストール方法,基本情報については, Pythonによる実行 を参照してください。

トポロジー最適化#

ここでいうトポロジー最適化とは,設計領域内の材料分布を最適化する手法です。有限要素メッシュの変更は行わず,材料特性を変更することで最適化を行います。そのため,メッシュの形状は変更されません。

(メッシュ形状を変更する方法は今後追加予定です)

Caution

ここでいうトポロジー最適化は, 要素の材料特性をOn-Offする方法 のことを指します。材料特性を変更することは,トポロジー最適化の一手法であり,トポロジー最適化の全てではありません。 そのため,トポロジー最適化の手法は様々なものがあり,ここで説明する手法は一例です。

また,実際にトポロジー最適化を行う場合は,最適化手法や目的関数に応じて,設計領域の要素情報を変更する必要があります。ここでは最適化手法の説明やそれを用いた説明は行いません。あくまで pyemsol を用いたトポロジー最適化の手法を説明します。 トポロジー最適化の手法については,文献等を参照してください。

pyemsol の実行手順(簡単に)#

pyemsol をPythonスクリプトで実行するには,以下の関数を順番に呼び出します。

Python code#
import pyemsol

# 初期化して、設計領域情報を取得
# json_data は input.json のデータ
# current_directory は input.json のあるディレクトリ
design_space = pyemsol.initialize(json_data, current_directory)

for i in range(num_iterations):
    # 設計領域の要素情報を更新
    pyemsol.update_properties_to_elements(new_design_space)
    # 計算実行, 計算結果の取得
    output = pyemsol.solve()
    # 最適化判定。収束するまで繰り返す

# 計算終了
pyemsol.finalize()

pyemsol.initialize を使用して初期化し, pyemsol.solve を複数回実行することができます。 pyemsol.finalize で終了します。

pyemsol.solve を複数回実行できるようになったことで,計算条件を変更して,複数回計算を行うことができます。

トポロジー最適化の設定方法#

トポロジー最適化を行うためには,以下の手順で設定を行います。

設計領域の指定#

input.json にて,トポロジー最適化用の設計領域を指定するプロパティ ( MAT_ID(16.1) ) に,is_DESIGN_DOMAIN(16.1) を指定します。

設計領域の指定は,以下のように,設計領域に指定したいプロパティに, "is_DESIGN_DOMAIN" : 1 と指定します。

"is_DESIGN_DOMAIN" : 1 と指定されたプロパティは,次に示す反復計算手順内で材料物性を変更することが可能です。

JSON format from 2024.11#
"16_Material_Properties" :
{
    "EXTEND_TOTAL_for_COIL" : I,
    "16_1_3D_Element_Properties" :
    [
        {
            "MAT_ID" : I,
            "POTENTIAL" : I,
            "ElectricProperty" :
            {
                "conductivity" :
                {
                    "comment" : "SIGMA_XYZ for anisotropic, or isotropic SIGMA if not defined.",
                    "SIGMA" : E
                }
            },
            "MagneticProperty" :
            {
                "comment" : "MU_XYZ for anisotropic, or isotropic MU if not defined.",
                "MU" : E,
                "BH_CURVE_ID" : I
            },
            "is_DESIGN_DOMAIN" : 1
        }
    ]
}

最適化計算手順#

トポロジー最適化を行うためには,以下の手順で設定を行います。

  1. pyemsol の初期化

  2. 設計領域情報の設定・更新

  3. pyemsol の実行

  4. 計算結果の取得。最適化判定

    2~4 を繰り返す。

  5. 最適化計算終了

pyemsol の初期化#

pyemsol の初期化を行います。初期化の際に,トポロジー最適化用の設計領域を指定した input.json を引数として渡します。

設計領域に, "is_DESIGN_DOMAIN" : 1 を指定しておきます。

リターン値として,JSONデータの設計領域情報 design_space を取得します。

pyemsol の初期化は,以下のように行います。これはトポロジー最適化(ここでは材料特性の変更)の計算に関わらず,pyemsol を使用する際の初期化手順です。

Python code#
import pyemsol
# 初期化して、設計領域情報を取得
# json_data は input.json のデータ
# current_directory は input.json のあるディレクトリ
design_space = pyemsol.initialize(json_data, current_directory)

設計領域情報の設定・更新#

設計領域情報を設定・更新します。

pyemsol.initilize のリターン値として,JSONデータの設計領域情報 design_space を取得します。

JSONデータは, design_space_elements.json ファイルとしても出力され,以下のような構造をしています。

JSON format from 2024.11#
{
    "element_id" : [ I, I, I, ... ],
    "centroid" :
    [
        [ E, E, E ],
        [ E, E, E ],
        ...
    ],
    "volume" : [ E, E, E, ... ],
    "property_id" : [ I, I, ..., I ],
    "property_to_elements" :
    {
        "I" : [ I, I, ..., I ],
        "I" : [ I, I, ..., I ]
    }
}

最初の三つのデータは,設計領域の要素情報です。

element_id:

要素ID

:

整数配列 (I)

説明:

要素IDの配列。要素IDは,メッシュファイルに記載されている要素IDと同じものが出力されます。

centroid:

要素重心座標

:

浮動小数点数配列 (E)

説明:

要素重心座標の配列。要素IDに対応する要素重心座標が出力されます。

volume:

要素体積

:

浮動小数点数配列 (E)

説明:

要素体積の配列。要素IDに対応する要素体積が出力されます。

以下の二つは,設計領域の要素とプロパティの対応情報です。

property_id:

プロパティID

:

整数配列 (I)

説明:

プロパティIDの配列。要素IDに対応するプロパティIDが出力されます。

property_to_elements:

プロパティIDと要素IDの対応

:

整数配列 (I)

説明:

プロパティIDと要素IDの対応を示すデータ型。プロパティIDをキーに,そのプロパティIDに対応する要素IDの配列が出力されます。

:

プロパティID 71 に対応する要素IDの配列は, "71" : [ I, I, ..., I ] のように出力されます。

所望のトポロジー最適化手法で要素情報を使用して,要素の材料情報を更新します。

材料情報を更新するとは,設計領域の要素のプロパティ番号を変更することを意味します。 具体的には,以下の二つの情報を更新します。

  • property_id の配列の中の要素IDに対応するプロパティIDを変更します。

  • property_to_elements の中の要素IDに対応するプロパティIDを変更します。

そのため,設計領域に指定したいプロパティIDは, ``"is_DESIGN_DOMAIN" : 1`` を指定したプロパティIDの中から選択する必要があります。あらかじめ,設計領域に指定したいプロパティIDを用意しておく必要があります。

pyemsol.update_properties_to_elements は,設計領域の要素情報を更新する関数です。引数として,更新した設計領域の要素情報 new_design_space を渡します。

Python code#
# 設計領域の要素情報を更新
pyemsol.update_properties_to_elements(new_design_space)

Note

材料特性 ( SIGMA(16.1) , MU(16.1) など ) を更新することもできますが,プロパティ自体の変更になるため,トポロジー最適化には適さないと思われます。

プロパティの材料特性の変更については, パラメータサーベイの実行方法 を参照してください。

pyemsol の実行#

pyemsol を実行します。計算結果はリターン値である output.json データ に格納されます。

通常の``EMSolution`` と同様に,JSONデータは, output.json ファイルに出力されます。

pyemsol.solve() を実行することで,計算が実行されます。

Python code#
# 計算実行, 計算結果の取得
output = pyemsol.solve()

計算結果の取得。最適化判定#

計算結果は,リターン値である output.json データ に格納されます。

output.json データについては, VI-4. output and output.json を参照してください。

例えば,モータ解析でのトルクデータの取得は以下のように行います。

Python code#
# Extract "torque" data
force_json = data["postData"]["forceNodal"]["forceNodalData"]
for j in range(len(force_json)):
    if force_json[j]["propertyNum"] == "rotor":
        torque = force_json[j]["forceMZ"]

取得したトルクデータより,所望の最適化判定などを行います。

pyemsol の終了#

pyemsol の終了を行います。終了は,以下のように行います。

pyemsol.finalize() を実行することで,終了処理が行われます。

finalizeするまでメッシュデータや行列データの情報を保持していますので,続けて他の処理や新しい計算を実行する場合は必ずfinalizeしてください

Python code#
# 計算終了
pyemsol.finalize()