最終更新日: 2023/02/22 作成日: 2023/02/20

TL;DR

マイクロマグネティックシミュレーションのソフトウェアmumax の基本的な使い方について.

大まかには以下のような流れでシミュレーションを実行するためのスクリプトを作る.

  1. 扱いたい空間を格子状(grid)に離散化する.その1つずつをセル(cell)と呼び,そのセルに1つの磁化が割り当てられる.
  2. 離散化した空間に,形状(shape)を指定して幾何学的構造(geometry)を決める.
  3. 指定した形状を領域(region)に分ける.
  4. 各領域の物質パラメタ(material parameters)を指定する.
  5. 磁化の初期条件(initial magnetization)を決める.
  6. 磁気励起(excitation)を生じさせる方法を指定する.
  7. 実行する計算を指定する.
  8. 最後に,出力する変数を指定する.

1. 空間グリッドを決める

mumax では空間を gird で分けて,その1つずつを cell と呼ぶようだ. cell の1つずつに$\bm{m}_{ijk} = \bm{m} (x_i, y_j, z_k)$が配置される.

  • 直方体(原点が中心)のグリッドを作る:

    example2.mx3
    1
    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)で作成できる.widthheightの単位はメートル.

    example2.mx3
    1
    
    rq := rect(100e-9, 50e-9)

    ただし,上の例でrqを定義しただけでは,まだ1.で作成したグリッドには配置されない.

    example2.mx3
    1
    
    setgeom(rq)

    とすることで,1.で作った空間の原点に配置される.(中心が原点になるように配置されるようだ.)

  • 作ったgeometryを保存することができる.

    example2.mx3
    1
    
    saveas(geom, "rect")

    geomは geometry を保存することを示していてrect は自分で決める文字列.

  • 作った geometry が意図したものになっているか確認したい場合,mumax3-convertが役に立つと思われる.

    test1.mx3
     1
     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")

    上記の内容のファイルを作成して,ターミナル上で

    bash
    1
    2
    
    mumax3 test1.mx3
    mumax3-convert -png test1.out/rect.ovf

    を実行すると,test1.out/rect.pngというファイルが生成されているので,それで確認できる.

    mumax3-convertで生成された画像.長方形なので特に見栄えはしないが確かにできていることが確認できる.
    長方形のshape: mumax3-convertで生成された画像.長方形なので特に見栄えはしないが確かにできていることが確認できる.
    setgeomを書かなかったり,gridより大きいshapeを指定するなどの失敗すると灰色の画像が生成される.
    失敗例: setgeomを書かなかったり,gridより大きいshapeを指定するなどの失敗すると灰色の画像が生成される.

  • もう少し手の込んだ例としてmumax3 workshopSeesion1 (PDF)にあるものを借用すると,

    test2.mx3
     1
     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")

    上記の内容のファイルを作って,

    bash
    1
    2
    
    mumax3 test2.mx3
    mumax3-convert -png test2.out/cheese.ovf

    と実行すると,test2.out/cheese.pngというファイルが生成される.

    mumax3-convertで生成された画像.穴の空いたチーズを模している.黒い部分が grid で,白い部分が shape で作った geometry.
    チーズの shape: mumax3-convertで生成された画像.穴の空いたチーズを模している.黒い部分が grid で,白い部分が shape で作った geometry.

注意点
shapeで指定する数値の単位はメートル.
shapeの端は滑らかにすることができる.edgesmooth = nは,1つのcellあたり$n^3$のサンプルを使ってその体積を決める. edgesmooth = 0は滑らかにしない近似でedgesmooth = 8は高精細な端を表現する.
1
edgesmooth = 8

test2.mx3でedgesmooth = 8を指定した場合.確かに端が高精細に表現されている.
チーズの shape(高精細版): test2.mx3edgesmooth = 8を指定した場合.確かに端が高精細に表現されている.

3. Regionを決める

shapeで幾何学的な構造を決めて,それぞれにregionを割り当てることで,regionごとに物質パラメタ(後述)を決めることができる. ここでは region の指定の仕方を見る. region の指定方法は2つある.

  1. 1つの cell に対して region を指定する方法

    1
    
    defregioncell(2, 10, 10, 0) // 位置(10,10,0)の cell に 2 という region を割り当てる
    
  2. 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.mx3
     1
     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というファイルを作成して

    bash
    1
    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.ovfcurrent.ovfで指定するような空間依存性などを取り込める.

    1
    2
    
    B_ext.add(loadfile("antenna.ovf"), sin(2*pi*f*t))
    J.add(loadfile("current.ovf"), 1)

    antenna.ovfcurrent.ovfはどうやって作るかが問題ではある.)

7. 実行する計算を指定する

mumaxは,Landau-Lifshitz-Gilbert (LLG)方程式を解くときに,以下の2つが選べる.

  1. LLG方程式を時間発展させる:run(time), steps(step_num), runwhile(condition)
  2. 定常状態の磁化配置を求める: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 成分の平均が負である限り実行する
      
  • 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. テーブルで出力する方法

    1
    2
    3
    4
    
    tableadd(E_total) // 全エネルギーを出力するように指定する
    tablesave() // 1回だけ出力する
    tableautosave(1e-10) // 1e-10 秒の周期で出力する.
    tableautosave(0) // saveしない
    
  2. .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の使い方③実行サンプル:磁場による磁壁駆動


  1. 正確には,cell に磁化を割り当てるときに,割り当てるか割り当てないかを shape で判断する仕様. たとえば,半径$r$の球を例にとると,$x^2 + y^2 + z^2 \le r^2$が成り立つならば,磁化を配置し,成り立たないならば磁化を配置しない. ↩︎