基板上の発熱体(並列計算)

wat_ex14_parametric を 3 つの Femtet インスタンスで並列化します。 サンプルコード及び実行結果以外の項目は 基板上の発熱体 と同じです。

サンプルファイル

注釈

サンプルプロジェクト を Femtet で開いたまま、 サンプルコード をダブルクリックして実行してください。

注釈

FEM 問題としての詳細については、FemtetHelp / 例題集 / 熱伝導解析 / 例題14 を参照してください。

設計変数

../../_images/wat_ex14_model1.png

モデルの外観

変数名

説明

substrate_w

基板の幅

substrate_d

基板の奥行き

目的関数

  • メインチップの最高温度(最小にする)

  • サブチップの最高温度(最小にする)

  • 基板の平面上の専有面積(最小にする)

サンプルコード

wat_ex14_parametric_parallel.py
 1"""多目的最適化: プリント基板上ICの発熱
 2
 3Femtetの熱伝導解析ソルバを使用して、ICチップの発熱を抑えつつ
 4基板サイズを小さくする設計を行います。
 5
 6対応プロジェクト: wat_ex14_parametric_jp.femprj
 7"""
 8from pyfemtet.opt import FEMOpt
 9
10
11def chip_temp(Femtet, chip_name):
12    """チップの最高温度を取得します。
13
14    Note:
15        目的関数または制約関数は、
16        第一引数としてFemtetを受け取り、
17        戻り値としてfloat型を返す必要があります。
18
19    Params:
20        Femtet: Femtet をマクロで操作するためのインスタンスです。詳細な情報については、「Femtet マクロヘルプ」をご覧ください。
21        chip_name (str): femprj 内で定義されているボディ属性名です。有効な値は 'MAINCHIP' 又は 'SUBCHIP' です。
22
23    Returns:
24        float: 指定されたボディ属性名のボディの最高温度です。
25    """
26    Gogh = Femtet.Gogh
27
28    max_temperature, min_temperature, mean_temperature = Gogh.Watt.GetTemp(chip_name)
29
30    return max_temperature  # 単位: 度
31
32
33def substrate_size(Femtet):
34    """基板のXY平面上での専有面積を計算します。"""
35    substrate_w = Femtet.GetVariableValue('substrate_w')
36    substrate_d = Femtet.GetVariableValue('substrate_d')
37    return substrate_w * substrate_d  # 単位: mm2
38
39
40if __name__ == '__main__':
41
42    # FEMOpt オブジェクトの初期化 (最適化問題とFemtetとの接続を行います)
43    femopt = FEMOpt()
44
45    # 設計変数を最適化問題に追加 (femprj ファイルに登録されている変数を指定してください)
46    femopt.add_parameter("substrate_w", 40, lower_bound=22, upper_bound=60)
47    femopt.add_parameter("substrate_d", 60, lower_bound=34, upper_bound=60)
48
49    # 目的関数を最適化問題に追加
50    femopt.add_objective(fun=chip_temp, name='MAINCHIP<br>最高温度(度)', direction='minimize', args=('MAINCHIP',))
51    femopt.add_objective(fun=chip_temp, name='SUBCHIP<br>最高温度(度)', direction='minimize', args=('SUBCHIP',))
52    femopt.add_objective(fun=substrate_size, name='基板サイズ(mm2)')
53
54    # 最適化を実行
55    femopt.set_random_seed(42)
56    femopt.optimize(n_trials=15, n_parallel=3)  # この部分のみ変更します

注釈

optimize() メソッドの引数 n_parallel に並列化したい数を渡すだけです。

サンプルコードの実行結果

実行環境

OS

windows 10

CPU

Intel Core-i7 12700 (12 cores, 20 threads)

Memory

32 GB

実行結果

並列化なし

3 並列

117 sec

74 sec

このデモでは 3 つの Femtet インスタンスでの計算を行いました。 基板上の発熱体 の問題について、 上記実行環境で並列を用いない場合は 20 回の解析に 117 秒を要しましたが、 このデモでは 74 秒で 21 回の試行が終了し、実行時間を 37% 低減しています。

注釈

一般に数値計算を N 並列した場合、実行時間は単純に 1/N にはなりません。

警告

実行環境や解析モデルによって並列化による高速化効果は変動します。

注釈

Femtet, PyFemtet および依存する最適化エンジンのバージョンにより、結果は多少異なる場合があります。