# -*- coding: utf-8 -*-				# 日本語のコメントに必要
from mumax2 import *				# mumax2のインポート

# Zhang-Liスピントルク

# セル数の設定
# 2のべき乗がベストです。
Nx = 512
Ny = 8
Nz = 1
setgridsize(Nx, Ny, Nz)

# 試料サイズ(メートル)
sizeX = 1536e-9
sizeY = 24e-9
sizeZ = 3e-9
setcellsize(sizeX/Nx, sizeY/Ny, sizeZ/Nz)

# モジュールの読み込み
load('micromagnetism')
load('solver/rk12')				# adaptive Euler-Heun solver
load('zhang-li')				# zhang-liスピントルク

# solverの設定
setv('dt', 1e-15)				# inital time step
setv('m_maxerror', 1./3000)			# maximum error per step

# 物質定数の設定
setv('Msat', 800e3)				# 飽和磁化 Msat
setv('Aex', 1.3e-11)				# 交換定数 Aex

# 初期磁化を磁壁構造に設定
mv = makearray(3, Nx, Ny, Nz)
for m in range(Nx):
  for n in range(Ny):
    for o in range(Nz):
      xx = float(m)/float(Nx)
      mv[0][m][n][o] = 1.0			# 左側の領域のx成分を1にする
      mv[1][m][n][o] = 0.0
      mv[2][m][n][o] = 0.0
      if (xx > 0.5) :
        mv[0][m][n][o] = -1.0			# 右側の領域のx成分を-1にする
        mv[1][m][n][o] =  0.0
        mv[2][m][n][o] =  0.0
setarray('m', mv)

saveas("m", "png", [], "initial.png")		# png形式で磁化配列mを保存
saveas("m", "omf", ["Text"], "initial.omf")	# omf形式で磁化配列mを保存

setv('alpha', 1)	# 安定状態を求めるために高いダンピング定数αを設定

# 安定状態までシミュレーションを走らせる
run_until_smaller('maxtorque', 1e-3 * gets('gamma') * gets('msat'))

saveas("m", "png", [], "relax.png")		# png形式で磁化配列mを保存
saveas("m", "omf", ["Text"], "relax.omf")	# omf形式で磁化配列mを保存

setv('alpha', 0.01)				# 本来のダンピング定数に設定
setv('xi',0.05)					# 非断熱(β)項
setv('polarisation',0.7)			# スピン偏極率

# 電流の設定
j = makearray(3, Nx, Ny, Nz)
for m in range(Nx):
  for n in range(Ny):
    for o in range(Nz):
      j[0][m][n][o] = 1.0			# +x方向に一様な電流
      j[1][m][n][o] = 0.0
      j[2][m][n][o] = 0.0
setv('j', [1e12, 0, 0])				# 電流密度:1e12 A/m^2
setmask('j', j)

# 時刻を0にリセットする
setv('t', 0)
setv('dt', 0.2e-12)

# 出力の設定
# 20 psごとに保存する
autosave("m", "png", [], 20e-12)		# png形式で磁化配列mを保存

run(1e-8)					# シミュレーション開始
sync()						# 終了
