Magnetostatistics のコード FEMM を Python から呼び出す
FEMM 4.0 (Finite Element Method Magnetics) は、静磁場解析および、Magnetoquasistatistics の 2D FEM モデルの解析を行うことができる。
スクリプト言語 Lua が組み込まれていて、スクリプトによってパラメータを変化させながら計算を行うことが想定されている。マニュアルの Chapter 5. に、ActiveX Interface がある、と簡単にふれられている。
以下のコードによって、Python から、呼び出して使うことができる。実際のコマンドは、Lua によっていて、call2femm() の呼び出しを繰り返すのである。Python からの呼び出しにすることで、返された結果を配列に溜めて、matplotlib でプロットすることなどが、容易になる。
モデル化そのものは、FEMM の GUI を使って作ったものを、読み込む。
from win32com.client import gencache, Dispatch import os gencache.EnsureModule('{04EF434A-1A91-495A-85AA-C625602B4AF4}', 0, 1, 0) # win32com で、make_py を用いて、この情報を入手した。 wd = "/200803/Coil/" myfile = "Hz01_test_01" femfile = os.path.join(wd, myfile) fe = 1000. femm = Dispatch('femm.ActiveFEMM') # # 'femm.ActiveFEMM' だということも、win32com の make_py の結果のファイルの中を見てわかったこと。 # C:\temp\gen_py\2.4\04EF434A-1A91-495A-85AA-C625602B4AF4x0x1x0.py の中に # # This CoClass is known by the name 'femm.ActiveFEMM' # と書いてある。 # femm.call2femm('showconsole()') femm.call2femm('open("%s.fem")' % (femfile)) femm.call2femm('mi_probdef(%.1f, "millimeters", "axi", 1e-8)' % fr) femm.call2femm('mi_saveas("%s%d.fem")' % (fmpfile, fe)) femm.call2femm('mi_analyze()') femm.call2femm('mi_loadsolution()') h00 = femm.call2femm('mo_getpointvalues(0, 0)') (par, pai, pb1r, pb1i, pb2r, pb2i, ps, pe, ph1r, ph1i, ph2r, ph2i, pjer, pjei, pjsr, pjsi, pm1r, pm1i, pm2r, pm2i, pe, ph, zz ) = [eval(s) for s in h00.split("\n")[:-1]] ## 計算結果のタプルの仕様は、 'manual.pdf' 76 ページに記載されている。 c00 = femm.call2femm('mo_getcircuitproperties("coil")') (ir, ii, vr, vi, fr, fi) = [eval(c) for c in c00.split("\n")[:-1]] # これらのデータを処理する。
呼び出しの Python より先に FEMM をクローズするなど、終わり方を間違えると、次の呼び出しが機能しなくなるようだ。こうなってしまったら、Windows そのものを再起動しなければならないみたい。