静磁場を印加するでは試料全体に磁場が印加されますが、ここでは線上にのみ発生する磁場を与えてみます。これは磁性体試料上に電極が配置されたような構造に適用することができます。下図のように100セル目の1×Ny×Nzの領域にのみ磁場を発生させます。磁場はy方向に印加し、さらに18GHzの周波数で振動するように設定します。

上画像のPDFファイル:linefield.pdf

inputファイルの記述

  1. # -*- coding: utf-8 -*- # 日本語のコメントに必要
  2. from mumax2 import * # mumax2のインポート
  3. from math import * # mathのインポート
  4.  
  5. # 線上にのみ発生する磁場
  6.  
  7. # セル数の設定
  8. # 2のべき乗がベストです。
  9. Nx = 601
  10. Ny = 10
  11. Nz = 2
  12. setgridsize(Nx, Ny, Nz)
  13.  
  14. #セルサイズ
  15. cellX = 5e-9
  16. cellY = 5e-9
  17. cellZ = 5e-9
  18. setcellsize(cellX, cellY, cellZ)
  19.  
  20. # モジュールの読み込み
  21. load('micromagnetism')
  22. load('solver/rk12') # adaptive Euler-Heun solver
  23.  
  24. # solverの設定
  25. setv('dt', 1e-12)
  26. setv('m_maxerror', 1./3000) # maximum error per step
  27.  
  28. # 物質定数の設定
  29. setv('Msat', 8.6e5) # 飽和磁化 Msat
  30. setv('Aex', 1.3e-11) # 交換定数 Aex
  31.  
  32. # 初期磁化の設定
  33. m=[ [[[1]]], [[[0]]], [[[0]]] ]
  34. setarray('m', m)
  35.  
  36. saveas("m", "png", [], "initial.png") # png形式で磁化配列mを保存
  37. saveas("m", "omf", ["Text"], "initial.omf") # omf形式で磁化配列mを保存
  38.  
  39. # 安定状態を求めるために高いダンピング定数αを設定
  40. setv('alpha', 1)
  41. # 安定状態までシミュレーションを走らせる
  42. run_until_smaller('maxtorque', 1e-3 * gets('gamma') * gets('msat'))
  43.  
  44. saveas("m", "png", [], "relax.png") # png形式で磁化配列mを保存
  45. saveas("m", "omf", ["Text"], "relax.omf") # omf形式で磁化配列mを保存
  46.  
  47. # 本来のダンピング定数に設定
  48. setv('alpha', 0.01)
  49. # 時刻を0にリセットする
  50. setv('t', 0)
  51. setv('dt', 0.2e-12)
  52.  
  53. # 局所磁場の設定
  54. # y方向、z方向のセル数が1、x方向のセル数がNxのarrayを用意します。
  55. # x=100のy成分のみ1を設定します。
  56. # このarrayは実行時に試料サイズに引き延ばされます。
  57. # 最終的にマスクはx=100の位置に1×Nx×Nzの大きさとなります。
  58. mask1 = makearray(3, Nx, 1, 1) # 3 x Nx x 1 x 1 array
  59. mask1[1][100][0][0] = 1 # mask1[{x,y,z}成分][x座標][y座標][z座標]
  60. # ↑セル(100,0,0)のy成分に1を設定します。他は0となります。
  61. setmask('B_ext', mask1)
  62.  
  63. # 振動磁場の設定
  64. By = 0.5 # 振動磁場の振幅(T)
  65. runTime = 25e-9 # シミュレーションを走らせる時間
  66. freq = 18e9 # 周波数(Hz)
  67. T = 1/freq # 周期(sec)
  68. timeStep = T / 30 # 磁場を計算する時間間隔(1周期につき30回計算)
  69. # N:磁場を計算する回数(誤動作を防ぐため、10回多く計算します)↓
  70. N = int(runTime / timeStep) + 10
  71. for i in range(N): # N回計算する
  72. t = i*timeStep # 時刻
  73. # 時刻tでの磁場を設定↓
  74. setpointwise('B_ext', t, [0, By*sin(2*pi*freq*t), 0])
  75.  
  76. # 出力の設定
  77. # 20 psごとに保存する
  78. autosave("m", "omf", ["Text"], 20e-12) # omf形式で磁化配列mを保存
  79. autosave("m", "png", [], 20e-12) # png形式で磁化配列mを保存
  80. autosave("B_ext", "omf", ["Text"], 20e-12) # omf形式で外部磁場B_extを保存
  81. autosave("B_ext", "png", [], 20e-12) # png形式で外部磁場B_extを保存
  82. # テキストファイルに時刻t、平均磁化m、平均磁場B_extを保存↓
  83. autotabulate(["t", "<m>", "<B_ext>"], "data.txt", 20e-12)
  84.  
  85. run(runTime) # シミュレーション開始
  86. sync() # 終了
ソースコードのダウンロード: linefield.py

53~59行目で磁場が適用される場所を設定しています。
61~72行目で各時間における磁場の強さを設定します。setpointwise関数で時刻tにおける磁場の強さを設定することができます。

実行結果

initial.png
relax.png



autosaveで出力された画像をつなげて動画にしたのが下のファイルです。
movie.mpg(H.264形式)
movie.wmv(wmv形式)

動画より、スピン波が伝搬していることがわかります。









タグ:

+ タグ編集
  • タグ:
最終更新:2012年09月28日 16:20