from mumaxplus import Ferromagnet, Grid, World
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Simulation parameter
world = World(cellsize=(1e-9, 1e-9, 1e-9))
grid_size = (256, 64, 1)
fm = Ferromagnet(world, Grid(grid_size))
fm.msat = 750e3
fm.aex = 15e-12
fm.dind = 1e-3
fm.ku1 = 5e5
fm.alpha = 0.03
fm.anisU = (0, 0, 1)
# initial magnetization and direction
init_mag = np.zeros(fm.grid.size + (3,))
init_mag[:, :, :, 0] = 0.0
init_mag[:, :, :, 1] = 0.0
init_mag[:, :, :, 2] = 1.0
fm.magnetization.set(init_mag.transpose(3, 2, 1, 0))
fm.minimize()
# Field sweep simulation
B_max = 2 # T
B_step = 0.04 # T
field_sweep = np.concatenate([
np.arange(0, B_max + B_step, B_step),
np.arange(B_max, -B_max - B_step, -B_step),
np.arange(-B_max, B_max + B_step, B_step)
])
loop_log = []
for B in field_sweep:
fm.bias_magnetic_field.set((0, 0, B)) # 반드시 .set() 사용
fm.minimize()
m = np.mean(fm.magnetization.get(), axis=(1, 2, 3))
loop_log.append([B, m[2]])
# convert the data
df = pd.DataFrame(loop_log, columns=["B_T", "mz"])
# draw the hysteresis loop
plt.figure(figsize=(10, 6))
plt.plot(df['B_T'], df['mz'], 'b.-', linewidth=2, markersize=4)
plt.xlabel('External Magnetic Field B (Tesla)', fontsize=12)
plt.ylabel('Normalized Magnetization mz', fontsize=12)
plt.title('Magnetic Hysteresis (M-H) Loop', fontsize=14)
plt.grid(True, alpha=0.3)
plt.axhline(y=0, color='k', linestyle='--', alpha=0.5)
plt.axvline(x=0, color='k', linestyle='--', alpha=0.5)
plt.show()