TL;DR ¶
マイクロマグネティックシミュレーションのソフトウェアmumax の基本的な使い方について.
大まかには以下のような流れでシミュレーションを実行するためのスクリプトを作る.
- 扱いたい空間を格子状(grid)に離散化する.その1つずつをセル(cell)と呼び,そのセルに1つの磁化が割り当てられる.
- 離散化した空間に,形状(shape)を指定して幾何学的構造(geometry)を決める.
- 指定した形状を領域(region)に分ける.
- 各領域の物質パラメタ(material parameters)を指定する.
- 磁化の初期条件(initial magnetization)を決める.
- 磁気励起(excitation)を生じさせる方法を指定する.
- 実行する計算を指定する.
- 最後に,出力する変数を指定する.
1. 空間グリッドを決める ¶
mumax では空間を gird で分けて,その1つずつを cell と呼ぶようだ. cell の1つずつに$\bm{m}_{ijk} = \bm{m} (x_i, y_j, z_k)$が配置される.
-
直方体(原点が中心)のグリッドを作る:
example2.mx31 2
setgridsize(256,64,1) // 256, 64, 1 の意味 → x軸を256,y軸を64,z軸を1に分割する setcellsize(1e-9,1e-9,1e-9) // 1e-9 の意味 → 1つのcellのx方向,y方向,z方向の長さで単位はメートル
これで$x$方向に256nm, $y$方向に64nm, $z$方向に1nmのグリッドが作られて,1つのcellは,1辺が1nmの立方体となる.
変数を導入して書くと
1 2 3 4 5 6 7 8 9
nx := 256 ny := 64 nz := 1 ax := 1e-9 // [m] ay := 1e-9 // [m] az := 1e-9 // [m] setgridsize(nx, ny, nz) setcellsize(ax, ay, az)
- 注意点
- cell の長さ < exchange length でないといけないとのこと. $A_{ex} / l_{ex}^2 = \frac{1}{2} \mu_0 M_s^2$ で決まる$l_{ex}$がexchange length らしい.つまり $$l_{ex} = \sqrt{\frac{A_{ex}}{\frac{1}{2} \mu_0 M_s^2}}$$ ただし$A_{ex}$は交換スティフネスで$M_s$は飽和磁化の大きさ.
- cuda fft ライブラリを demag field の計算で使うので 2, 3 などの素数の累乗で指定すると計算が速くなるとのこと.
- golang では複数の変数を1行で定義できるが,mumax用のスクリプトでは許されていないようだ.
つまり,以下のように書いてもエラーが出る.
1
nx, ny, nz := 256, 64, 1 // multiple assignment not allowed と言われてエラーが出る
-
他にも,考える空間の大きさを指定して,それを指定した分割数に分けるという方法もある.
1 2 3 4 5 6 7 8 9
Nx := 100 Ny := 100 Nz := 50 Lx := 1e-6 // [m] Ly := 1e-6 // [m] Lz := 1e-6 // [m] setgridsize(Nx, Ny, Nz) setcellsize(Lx/Nx, Ly/Ny, Lz/Nz)
この例の場合では,1つの cell が立方体になっておらず,$z$方向に伸びた直方体になっている.
-
周期境界条件の設定:
1
setpbc(4,0,0) // 4, 0, 0 の意味 → x方向に4回, y方向に0回, z方向に空間を0回繰り返す(?)
mumax3.10 API によれば,反磁場を計算するカットオフを決めるために使うらしい(が詳細はよくわかっていない).
2. Geometryを決める ¶
mumaxでは,geometry というものを1.空間グリッドを決める で作ったグリッドに配置するという思想のようだ1. geometry は shape で構成される. shape は,基本的な図形(円,直方体など)で,位置を並進移動させたり回転させたりすることで配置する. 複数の図の和や差を取ることもできる.
-
たとえば2次元の長方形のshapeは
rect(width, height)
で作成できる.width
とheight
の単位はメートル.example2.mx31
rq := rect(100e-9, 50e-9)
ただし,上の例で
rq
を定義しただけでは,まだ1.で作成したグリッドには配置されない.example2.mx31
setgeom(rq)
とすることで,1.で作った空間の原点に配置される.(中心が原点になるように配置されるようだ.)
-
作ったgeometryを保存することができる.
example2.mx31
saveas(geom, "rect")
geom
は geometry を保存することを示していてrect
は自分で決める文字列. -
作った geometry が意図したものになっているか確認したい場合,
mumax3-convert
が役に立つと思われる.test1.mx31 2 3 4 5 6 7 8 9 10 11 12 13
nx := 256 ny := 64 nz := 1 ax := 1e-9 // [m] ay := 1e-9 // [m] az := 1e-9 // [m] setgridsize(nx, ny, nz) setcellsize(ax, ay, az) rq := rect(100e-9, 50e-9) setgeom(rq) saveas(geom, "rect")
上記の内容のファイルを作成して,ターミナル上で
bash1 2
mumax3 test1.mx3 mumax3-convert -png test1.out/rect.ovf
を実行すると,
test1.out/rect.png
というファイルが生成されているので,それで確認できる. -
もう少し手の込んだ例としてmumax3 workshop のSeesion1 (PDF)にあるものを借用すると,
test2.mx31 2 3 4 5 6 7 8 9 10 11 12 13 14
setgridsize(128,64,1) setcellsize(5e-9,5e-9,5e-9) d := 200e-9 sq := square(d) h := 50e-9 hole := cylinder(h, h) hole1 := hole.transl(100e-9, 0, 0) hole2 := hole.transl(0, -50e-9, 0) cheese := sq.sub(hole1).sub(hole2) cheese = cheese.rotz(pi/6) setgeom(cheese) saveas(geom, "cheese")
上記の内容のファイルを作って,
bash1 2
mumax3 test2.mx3 mumax3-convert -png test2.out/cheese.ovf
と実行すると,
test2.out/cheese.png
というファイルが生成される.
- 注意点
- shapeで指定する数値の単位はメートル.
- shapeの端は滑らかにすることができる.
edgesmooth = n
は,1つのcellあたり$n^3$のサンプルを使ってその体積を決める.edgesmooth = 0
は滑らかにしない近似でedgesmooth = 8
は高精細な端を表現する.1
edgesmooth = 8
3. Regionを決める ¶
shapeで幾何学的な構造を決めて,それぞれにregionを割り当てることで,regionごとに物質パラメタ(後述)を決めることができる. ここでは region の指定の仕方を見る. region の指定方法は2つある.
-
1つの cell に対して region を指定する方法
1
defregioncell(2, 10, 10, 0) // 位置(10,10,0)の cell に 2 という region を割り当てる
-
shape を指定して region を割り当てる方法
1 2 3
cir := circle(50e-9) setgeom(cir) defregion(1, cir) // circle に含まれる cell を全て 1 という region に割り当てる
-
region も save できる.
1
saveas(regions, "reg")
ここで
regions
は region を保存することを指定していて,reg
は自分で好きに決めまれる文字列. -
テストスクリプトとして
test3.mx31 2 3 4 5 6 7 8 9 10 11 12
setgridsize(32,16,1) setcellsize(5e-9,5e-9,5e-9) edgesmooth = 0 cir := circle(50e-9) setgeom(cir) defregion(1, cir) defregioncell(2, 10, 10, 0) saveas(regions, "reg")
上記の
test3.mx3
というファイルを作成してbash1 2
mumax3 test3.mx3 mumax3-convert -png test3.out/reg.ovf
のようにコマンドを実行すると,
test3.out/reg.png
が生成されている.
- 注意
- 1. 空間グリッドを決める で作ったグリッドの各 cell は1つの region に割り当てられる.(default region は 0 で,最大 255 まで割り当て可能)
4. 物質パラメタを指定する ¶
物質パラメタ(飽和磁化Msat
, 一軸磁気異方性の軸AnisU
など)はすでに定義されているもののみを使える.
どのような物質パラメタが定義されているかはhttps://mumax.github.io/api.html
で Material parameters を指定して確かめられる.
-
飽和磁化
Msat
,交換スティフネスAex
,Gilbert減衰定数alpha
を指定すれば最低限のテスト計算はできるようになる.-
全ての region に対して物質パラメタを与える場合
1 2 3 4 5
Msat = 800e3 // 飽和磁化 [A/m] Aex = 13e-12 // 交換スティフネス [J/m] alpha = 0.02 // Gilbert減衰定数 (無次元) AnisU = vector(1, 0, 0) // 一軸磁気異方性の軸
-
region を指定して物質パラメタを与える場合
1 2
Msat.setregion(0, 800e3) // region 0 に対する飽和磁化 Msat.setregion(1, 540e3) // region 1 に対する飽和磁化
-
-
物質パラメタは時間の関数とすることができる.
1 2
f := 500e6 // 周波数 [Hz] Ku1 = 500 * sin(2*pi*f*t) // t: 時刻 [s], Ku1: 一軸磁気異方性定数の1次の係数 [J/m3]
- 注意
- 物質パラメタの多くは単位が決まっている (J, J/m3, A/m など).
当然ながら単位を把握せずに値を適当に代入すると意図しないふるまいをするので注意が必要.
# 桁外れな大きさ/小ささの量があると桁落ちが起こりそうだが大丈夫なのだろうか…?という心配がある.
5. 磁化の初期条件を決める ¶
次に磁化m
(単位ベクトル)の初期条件を,定義されている関数を用いて指定する.
どのような条件が定義されているかはhttps://mumax.github.io/api.html
で Initial Magnetization を指定することで確認できる.
-
全ての region に対して磁化を与える場合
1 2
m = uniform(1, 0, 0) // +x方向に向いた一様な磁化 m = randommag() // ランダムな磁化
-
region ごとに与える場合
1 2
m.setregion(1, uniform(1,0,0)) // region 1 では+x方向に向いた一様な磁化 m.setregion(1, randommag()) // region 2 ではランダムな磁化
-
指定した shape に対して直を与える場合
1 2
rq := rect(100e-9, 50e-9) m.setinshape(rq, uniform(1,0,0))
-
他にもファイルから読み込む方法や cell を指定して磁化ベクトルを決める方法がある.
1 2
m.loadfile(filename) // filename から読み込む m.setcell(j,k,l, vector(1,0,0)) // 位置(j,k,l)の cell に +x 方向に向いたベクトルを当てる
6. 磁気励起を指定する ¶
磁場B_ext
を加えたり電流J
を流したりすることで磁気励起を起こす方法を指定する.
物質パラメタを指定するときと同じように,すでに定義されている変数を用いて指定する.
具体的にどのような磁気励起パラメタがあるかはhttps://mumax.github.io/api.html
で Excitation を指定することで確認できる.
-
たとえば磁場
B_ext
の場合,1 2
B_ext = vector(0.01, 1e-6*sin(2*pi*f*t), 0) // 外部磁場 [T] B_ext.setregion(1, vector(0, 0, 0.1)) // region 1 を指定して磁場を加える
-
さらに任意の空間依存性も取り込める.たとえば
antenna.ovf
やcurrent.ovf
で指定するような空間依存性などを取り込める.1 2
B_ext.add(loadfile("antenna.ovf"), sin(2*pi*f*t)) J.add(loadfile("current.ovf"), 1)
(
antenna.ovf
やcurrent.ovf
はどうやって作るかが問題ではある.)
7. 実行する計算を指定する ¶
mumaxは,Landau-Lifshitz-Gilbert (LLG)方程式を解くときに,以下の2つが選べる.
- LLG方程式を時間発展させる:
run(time)
,steps(step_num)
,runwhile(condition)
- 定常状態の磁化配置を求める:
relax()
-
LLG方程式を時間発展させる
1 2 3
run(1e-9) // 1e-9秒まで時間発展させる steps(100) // 100ステップ分時間発展させる runwhile(condition) // condition が true である限り時間発展させる
- condition の使い方は,たとえば
1 2
mx := m.comp(0) // 磁化の x 成分 RunWhile(mx.average() < 0) // 磁化の x 成分の平均が負である限り実行する
- condition の使い方は,たとえば
-
LLG方程式を歳差運動をさせずに解いて定常状態の解を求める.
1
relax()
初期条件で与えた磁化配置から最安定な構造に緩和させる関数だと思ってよさそう.
また,ヒステリシスループのような熱力学的な磁化過程を計算することもできる.
-
steepest descent [1] (よくわかっていない.)
1
minimize()
[1] JOURNAL OF APPLIED PHYSICS115, 17D118 (2014)
- より高度な設定
- LLG方程式の時間発展のソルバーを指定する.
1 2 3 4 5 6 7 8 9
// set Solver setsolver(4) // 1: Euler // 2: Heun // 3: Bogaki-Shampine // 4: Runge-Kutta(RK45) // 5: Dormand-Prince(the default) // 6: Fehlberg //-1: Backward Euler
- 時間刻みを固定する.default では adaptive な時間刻みが採用されている.
1 2
// set timestep fixdt = 1e-12 // [s]
- adaptive な時間刻みについての高度な設定
1 2 3 4 5
// Advanced settings for adaptive timestep (default values are given) Headroom = 0.8 // headroom dt correction MaxDt = 0 // if 0, no maximal timestep MinDt = 0 // if 0, no minimal timestep MaxErr = 1e-5 // maximum allowed error/step
minimize()
に対する高度な設定1 2 3
// Advanced settings for minimizer (default values are given) MinimizerSamples = 10 // Number of max dM for convergence check MinimizerStop = 1e-6 //Stopping max dM for Minimize
8. 出力の仕方 ¶
出力の仕方はテーブルで出力する方法と.ovf
ファイルで出力する方法の2つがある.
-
テーブルで出力する方法
1 2 3 4
tableadd(E_total) // 全エネルギーを出力するように指定する tablesave() // 1回だけ出力する tableautosave(1e-10) // 1e-10 秒の周期で出力する. tableautosave(0) // saveしない
-
.ovf ファイルで出力する方法
1 2 3
save(Edens_total) // 全エネルギー密度を出力する saveas(Edens_total,”edens.ovf”) // 全エネルギー密度を "edens.ovf"というファイル名で出力する autosave(Edens_total, 1e-10) // 全エネルギー密度を 1e-10 秒ごとに出力する
- 出力するときには成分やregionを指定することができる.たとえば
1 2 3
tableadd(m.comp(0)) // 磁化の x 成分 tablesave() // これで「この時点での」磁化の x 成分が保存される // つまり save したいときに毎回呼び出す必要がある
1
save(m.comp(0))
1
saveas(m.comp(0), "mx.ovf")
前の記事: mumaxの使い方① 導入
次の記事: mumaxの使い方③実行サンプル:磁場による磁壁駆動
-
正確には,cell に磁化を割り当てるときに,割り当てるか割り当てないかを shape で判断する仕様. たとえば,半径$r$の球を例にとると,$x^2 + y^2 + z^2 \le r^2$が成り立つならば,磁化を配置し,成り立たないならば磁化を配置しない. ↩︎