# -*- coding: utf-8 -*-				# 日本語のコメントに必要
from mumax2 import *				# mumax2のインポート

# 細線のヒステリシス(エネルギーも出力)

# セル数の設定
# 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('micromag/energy')				# エネルギーを出力するモジュール

# 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
setv('alpha', 1)				# ダンピング定数 α

# 初期磁化の設定
m=[ [[[1]]], [[[0]]], [[[0]]] ]
setarray('m', m)

saveas("m", "png", [], "initial.png")		# png形式で磁化配列mを保存
saveas("m", "omf", ["Text"], "initial.omf")	# omf形式で磁化配列mを保存

B_high = 1					# +側の磁場
B_lo = -1					# -側の磁場
B_step = 0.1					# 刻み幅
N = int((B_high - B_lo) / B_step)		# 繰り返し回数
B = B_high					# B: 現在の磁場

for i in range(N):				# B: + → -
  echo('B =' + str(B))				# 現在の磁場を表示
  setv('B_ext', [B, 0, 0])			# シミュレータに磁場を設定
  # 磁化の安定状態までシミュレーションを走らせる↓
  run_until_smaller('maxtorque', 1e-3 * gets('gamma') * gets('msat'))
  saveas("m","png",[],"B="+str(B)+"down.png")	# png形式で磁化配列mを保存
  # 外部磁場、試料の磁化、エネルギーを出力↓
  tabulate(["B_ext","<m>","E","E_zeeman","E_ex","E_demag"], "data.txt")	
  echo('-------------------')			# 区切り線
  B = B - B_step				# 磁場を変化させる

for i in range(N+1):				# B: - → +
  echo('B =' + str(B))				# 現在の磁場を表示
  setv('B_ext', [B, 0, 0])			# シミュレータに磁場を設定
  # 磁化の安定状態までシミュレーションを走らせる↓
  run_until_smaller('maxtorque', 1e-3 * gets('gamma') * gets('msat'))
  saveas("m","png",[],"B="+str(B)+"up.png")	# png形式で磁化配列mを保存
  # 外部磁場、試料の磁化、エネルギーを出力↓
  tabulate(["B_ext","<m>","E","E_zeeman","E_ex","E_demag"], "data.txt")	
  echo('-------------------')			# 区切り線
  B = B + B_step				# 磁場を変化させる

# 終了
sync()
