📑

Mumax3の公式ドキュメントが少し分かりにくかったのでまとめ

2024/03/21に公開

はじめに

mumax3 (https://mumax.github.io/) は磁性体中の磁気モーメントの挙動をシミュレーションする際に有用なシミュレータです.大きな特徴としてサンプルを細かい領域(セル)に区切って計算ができるため,マクロスピンシミュレーションではできなかった磁区や磁壁の挙動についても計算が可能です.

ただ,公式ドキュメントでは使い方について少しわかりにくい箇所もありましたので,利用した範囲でこちらに簡単にまとめました.

計算方法

Mumax3では各セルでLLG方程式を解いており,有効磁場は以下磁場ベクトルの総和として表されます.

  • 外部磁場
    • 指定可能でデフォルトでゼロ
  • 反磁場
    • シミュレーション前に自動で算出される
  • Heisenberg交換磁場
    • シミュレーション前に自動で算出される
  • Dzyaloshinskii-Moriya交換磁場
    • シミュレーション前に自動で算出される
  • 結晶磁気異方性磁場
    • 指定可能でデフォルトでゼロ
  • 熱磁場
    • 温度によって指定可能でデフォルトでゼロ

パラメータ

セル構築の設定

SetGridsize(128, 32, 1)
SetCellsize(500e-9/128, 125e-9/32, 3e-9)
  • SetGridsize(int, int, int)
    • シミュレーションしたい図形などをどの範囲に置くか設定する
    • 例ではX軸方向に128個,Y軸方向に32個,Z軸方向に1個配置するように設定
  • SetCellsize(float, float, float)
    • 1つのセルの大きさを設定し,単位は[m]
    • 例ではX軸方向に500/128[nm],Y軸方向に125/32[nm],Z軸方向に3[nm]のセルを設定

定数パラメータの設定

Msat  = 800e3
Aex   = 13e-12
alpha = 0.02
Temp = 300
fixdt = 1e-9
  • Msat
    • 飽和磁化を設定し,単位は[A/m]
    • 例では800e3[A/m] (およそ1.5[T])を設定
  • Aex
    • 交換スティフネス係数を設定し,単位は[J/m]
    • 例では13e-12[J/m]を設定
  • alpha
    • ダンピング定数を設定し,単位は無次元
    • 例では0.02を設定
  • Temp
    • 温度を設定し,単位は[K]
    • 例では300[K]を設定
  • fixdt
    • シミュレーションにおける刻み時間を設定し,単位は[s]
    • 例では1e-9[s] (1[ns])を設定

形状設定

hoge1 := elipse(100e-9, 50e-9) //hoge1は任意名
hoge2 := circle(200e-9)        //hoge2は任意名
hoge3 := hoge1.add(hoge2)
setgeom(hoge3)

defregion(1, hoge1) //1は任意数値
defregion(2, hoge2) //1は任意数値
  • elipse(float, float) -> shape
    • 長軸と短軸を引数に楕円形を設定
    • 返り値はShape型(独自型)
  • circle(float) -> shape
    • 半径を引数に円形を設定
    • 返り値はShape型(独自型)
  • (shape).add(shape) -> shape
    • 複数の図形を結合して新たなShape型を返す
    • 例では楕円形hoge1に円形hoge2を結合している
  • getgeom(shape)
    • 設定した図形をシミュレーション対象として登録する
  • defregion(int, shape)
    • 図形のID割り振りを行い,例では図形hoge1,2にID:1,2を割り振っている
    • 後述の設定においてこのIDを参照する

他の図形や編集メソッドの詳細については以下のGeometoryに記載されています
https://mumax.github.io/examples.html

磁化設定

# すべての領域に対して指定の磁化を付与
m = uniform(-1, 0, 0)
m = randomMag()

# 一部の領域に対して指定の磁化を付与
m.setRegion(1, uniform(1,0,0))

# 一部領域の磁化の向きを固定
frozenspins.setRegion(1,1)

  • m = uniform(float, float, float)
    • すべての領域に一様磁化を付与する
    • 例では(mx,my,mz)=(-1,0,0)の一様磁化を付与
  • m = randomMag()
    • すべての領域にランダムな磁化を付与する
  • m.setRegion(int, uniform(float, float, float))
    • 指定IDの領域にのみ一様磁化を付与し,例ではID:1のhoge1に一様磁場を付与している
    • uniformをrandomに置換えることも可能
  • frozenspins.setRegion(int ,int)
    • 指定IDの領域の磁化を固定する
    • 固定する場合は第二引数に1, 固定しない場合は0を指定する

シミュレーション設定

relax()
save(m)

# 画像保存
autosave(m, 10e-9)

# テーブル保存
tableadd(m.region(1))
tableautosave(1e-9)

# シミュレーション開始
run(100e-9)
  • relax()
    • 設定した磁化からエネルギー的に最安定な状態へ緩和させる
    • 熱は考慮しない
  • save(m)
    • 磁化状態をovfファイルで保存
    • mumax3 convertで画像に変換することが可能
  • tableadd(m.region(1))
    • テーブルテキストファイルに保存する磁化情報のカラムを追加
    • デフォルトでは全体の平均磁化しか保存されず,例ではID:1のhoge1の磁化を追加で保存させるように設定している
  • tableautosave(float)
    • 磁化状態を引数の時間ごとにテーブルテキストファイルに保存するように設定している
    • 例では1ns毎の保存を指定
  • run()
    • シミュレーション実行を命令するとともに,そのシミュレーション時間を指定する
    • 例では100nsのシミュレーションを指定

参考資料

Discussion