IPM8P48S寸法およびトポロジー同時最適化
ここではIPM8P48S_ptoプロジェクトの内容について紹介します。
このプロジェクトでは、IPM8P48Sモデルの寸法およびトポロジーの同時最適化を実行します。
本プロジェクトの最適化の実施にはeMotorSolution APIが必要です。
最適化概要
IPM8P48S_ptoプロジェクトでは下図のように、ロータの部品構造(永久磁石+フラックスバリア)は寸法パラメータによって表現し、ロータ表面の細かいトポロジーはNGnet on/off法によって決定します。
ロータ表面構造は特にトルクリプルに寄与することが一般に知られています。そのため、本最適化ではトルクリプルの最小化を目的として、部品構造には単純な寸法パラメータを採用しつつ、新規的なロータ表面の構造の獲得を狙います。

machine.yaml(IPM8P48S_ptoプロジェクト)
machine.yamlの基本設定はIPM8P48S_mooプロジェクトと同じですが、eMotorSolutionと連携して寸法最適化を行うため、ems_project_filepathコンフィグを追加します。
IPM8P48S_ptoプロジェクトにはすでにeMotorSolutionプロジェクトjsonファイルが含まれているため、そのファイルパスを指定します。
# ems functionality link
ems_project_filepath: "Path/To/EMSOptimizer/projects/IPM8P48S_pto/IPM8P48S.json"
上記のファイルパスはご使用のEMSOptimizerのインストール先に合わせて設定してください。
Implicit Domain Meshing オプション
冒頭で述べた通り、今回はロータ表面のみを細かくトポロジー最適化によって変形させます。
このような場合、Implicit Domain Meshingではメッシュが細かくなりすぎる可能性があるため、IPM8P48S_ptoプロジェクトではデフォルトでオフにしています。
optimization.yaml(IPM8P48S_ptoプロジェクト)
まず、形状決定にかかわるコアオブジェクトから説明します。
レベルセット関数にngnet_mixtureを設定し、半径78.2mm以上(からロータ半径である80.2mm以下)の範囲に限ってNGnet on/off法によるトポロジー最適化を実施します。
同時に、ems_shape_builderをHoleMagnet55に設定しています。これは、IPM8P48Sオリジナルモデルにも使用されているeMotorSolution Hole Magnet Type55(ロータ永久磁石+フラックスバリアモデル)の寸法を10の設計変数から設定するオブジェクトです。
これをlevel_set_functionと同時に設定することで、
- ロータの部品構造は
HoleMagnet55によって決定し、 - ロータ表面の細かいトポロジーの修正はNGnet on/off法により行う
という形状決定が行われます。
level_set_function:
name: ngnet_mixture
kwargs:
sigma: 0.001
design_region: [[0.0782, 0.0802], [0, 22.5]]
coordinate: Polar
boundary_r: 0.0782
inversed: True
ems_shape_builder:
name: HoleMagnet55
今回は単目的形状最適化を行うため、最適化手法にcmaesを設定しています。
ここで、boundsに設定しているのはHoleMagnet55寸法パラメータの上下限値です。IPM8P48Sのオリジナルモデルを参考に設定しています。
evaluator:
name: pyemsol_shape_evaluator
optimizer:
name: cmaes
kwargs:
seed: 42
bounds: [[40, 45], [1.5, 2.5], [1.0, 2.0], [11, 13], [20, 22],
[16, 20], [1.0, 2.0], [0.5, 1.5], [4.0, 6.0], [0.0, 1.0]]
今回のケースではems_shape_builderをls_functionと同時に設定することで、寸法・トポロジーの同時最適化[10]を実行します。このとき、解候補ベクトルは以下のように構成されます。
: 解候補ベクトル(Individual.solution)
: ems_shape_builderに与えられる寸法情報ベクトル
: ls_functionに与えられるレベルセット関数パラメータベクトル
boundsは今回10次元ベクトルのに対する上下限値を設定しています。なお、設定されなかったの上下限値は自動的に[-1, 1]に設定されます。
optimization_problem.yaml(IPM8P48S_ptoプロジェクト)
case_names:
- transient
objectives:
- function_name: torque_ripple_percentage
kwargs:
torque_scale: 8.0
ineq_constraints:
- function_name: average_torque
kwargs:
torque_scale: 8.0
coefficient: -1
baseline: 14.62
eq_constraints:
- function_name: num_connected_components
kwargs:
physical_tag: 20
baseline: 1
other_metrics:
- function_name: average_torque
kwargs:
torque_scale: 8.0
- function_name: torque_ripple_percentage
kwargs:
torque_scale: 8.0
最適化問題は以下の通りです。ここでは、平均トルクがオリジナルモデルの値14.62Nmを下回らないようにトルクリプルを最小化します。また、ロータコアの結合制約も考慮しています。
:平均トルク [Nm]
:トルクリプル率 [%]
: 連結成分数
最適化の実施例
形状の進化経過を以下に示します。ロータ部品構造と表面構造が同時に変化しながら、徐々に一定の構造に収束していく様子が分かります。

100イテレーション最適化完了後のGUIを以下に示します。目的関数値は80イテレーションほどでほぼ横ばいになっており、最適化が収束したと判断できます。
最良形状(81イテレーション目)はオリジナルモデルに類似した永久磁石+フラックスバリア構造を有している一方、ロータ表面がトポロジー最適化によって特徴的な構造となっていることが分かります。平均トルク: 15.597 Nm、トルクリプル率: 12.578 %。
多目的トポロジー最適化の結果ではトルクリプル率の最小値が20%程度だったことを考えると、このロータ表面の構造によってトルクリプルを低減している可能性があると判断できます。
