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 そのものを再起動しなければならないみたい。