# -*- coding: utf-8 -*-				# 日本語のコメントに必要
from mumax2 import *				# mumax2のインポート
from math import *				# mathのインポート

# 線上にのみ発生する磁場

# セル数の設定
# 2のべき乗がベストです。
Nx = 601
Ny = 10
Nz = 2
setgridsize(Nx, Ny, Nz)

#セルサイズ
cellX = 5e-9
cellY = 5e-9
cellZ = 5e-9
setcellsize(cellX, cellY, cellZ)

# モジュールの読み込み
load('micromagnetism')
load('solver/rk12')				# adaptive Euler-Heun solver

# solverの設定
setv('dt', 1e-12)
setv('m_maxerror', 1./3000)			# maximum error per step

# 物質定数の設定
setv('Msat', 8.6e5)				# 飽和磁化 Msat
setv('Aex', 1.3e-11)				# 交換定数 Aex

# 初期磁化の設定
m=[ [[[1]]], [[[0]]], [[[0]]] ]
setarray('m', m)

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)
# 時刻を0にリセットする
setv('t', 0)
setv('dt', 0.2e-12)

# 局所磁場の設定
# y方向、z方向のセル数が1、x方向のセル数がNxのarrayを用意します。
# x=100のy成分のみ1を設定します。
# このarrayは実行時に試料サイズに引き延ばされます。
# 最終的にマスクはx=100の位置に1×Nx×Nzの大きさとなります。
mask1 = makearray(3, Nx, 1, 1)	# 3 x Nx x 1 x 1 array
mask1[1][100][0][0] = 1		# mask1[｛x,y,z｝成分][x座標][y座標][z座標]
# ↑セル(100,0,0)のy成分に1を設定します。他は0となります。
setmask('B_ext', mask1)

# 振動磁場の設定
By = 0.5		# 振動磁場の振幅(T)
runTime = 25e-9		# シミュレーションを走らせる時間
freq = 18e9		# 周波数(Hz)
T = 1/freq		# 周期(sec)
timeStep = T / 30	# 磁場を計算する時間間隔(1周期につき30回計算)
# N:磁場を計算する回数(誤動作を防ぐため、10回多く計算します)↓
N = int(runTime / timeStep) + 10
for i in range(N):	# N回計算する
  t = i*timeStep	# 時刻
  # 時刻tでの磁場を設定↓
  setpointwise('B_ext', t, [0, By*sin(2*pi*freq*t), 0])

# 出力の設定
# 20 psごとに保存する
autosave("m", "omf", ["Text"], 20e-12)		# omf形式で磁化配列mを保存
autosave("m", "png", [], 20e-12)		# png形式で磁化配列mを保存
autosave("B_ext", "omf", ["Text"], 20e-12)	# omf形式で外部磁場B_extを保存
autosave("B_ext", "png", [], 20e-12)		# png形式で外部磁場B_extを保存
# テキストファイルに時刻t、平均磁化m、平均磁場B_extを保存↓
autotabulate(["t", "<m>", "<B_ext>"], "data.txt", 20e-12)

run(runTime)					# シミュレーション開始
sync()						# 終了
