系列文章目录
对于现阶段微磁学仿真发展的思考1-理论篇
对于现阶段微磁学仿真发展的思考2-工具篇
文章目录
- 系列文章目录
- 前言
- 一、微磁学的数学区
- 二、微磁学的物理区
- 三、微磁学仿真现存的一些问题
- 四、微磁学代码区:上手操作,理解更深入
- 栗子1: 能量最小化原理
- 栗子2: 动力学方程(LLG 方程)求解
- 总结
前言
做了一些微磁学的研究,但是意识到自己还需要一些更深入的思考和更多的框架整理。这个模块为理论模块,说明做微磁学研究相关的数理基础是什么。喜欢物理的研友们如果还有更多的补充请私信我。
这里给一些收藏过的给我一些灵感的前辈们的帖子。
知乎:微磁学模拟研究专栏
本篇部分内容表述会通过GPT润色增加可读性。
一、微磁学的数学区
概念 | 概念描述 |
---|---|
LL方程 | LL方程,即Landau-Lifshitz方程。磁学最开始的方程,由Landau和Lifshitz提出,这个方程已经可以分析磁化运动。 d M d t = − γ M × H eff + α M s M × ( M × H eff ) \frac{d\mathbf{M}}{dt} = -\gamma \mathbf{M} \times \mathbf{H}_{\text{eff}} + \frac{\alpha}{M_s} \mathbf{M} \times \left(\mathbf{M} \times \mathbf{H}_{\text{eff}}\right) dtdM=−γM×Heff+MsαM×(M×Heff) |
LLG方程 | 在这之后,Gilbert对于LL方程的组你想经常了重新表述。阻尼项被表述为磁矩与其对有效磁场的进动的叉积。这种表述更直观地反映了阻尼力与磁矩进动方向垂直的物理事实,同时也常常带来更好的数值稳定性。在这个方程中,阻尼项与LL方程不同,它直接与磁矩的时间导数相关,这反映了一个更真实的物理阻尼过程,即阻尼力与磁矩变化率成正比。 d M d t = − γ M × H eff + α M s ( M × d M d t ) \frac{d\mathbf{M}}{dt} = -\gamma \mathbf{M} \times \mathbf{H}_{\text{eff}} + \frac{\alpha}{M_s} \left(\mathbf{M} \times \frac{d\mathbf{M}}{dt}\right) dtdM=−γM×Heff+Msα(M×dtdM) |
有限差分法(FDM) | 有限差分法是一种通过离散化连续的物理方程(如微分方程)来求解问题的数值方法。在微磁学中,FDM主要被用于求解LLG方程和计算磁场分布。其步骤主要分为:(1) 空间离散化:将连续的磁性介质离散成有限的网格点。在每个网格点,磁矩和有效磁场被离散化处理。(2) 方程离散化:将微分方程(如LLG方程)中的导数转换为差分形式。这种转换使得方程可以在离散的网格上求解。(3) 时间演化:使用适当的时间积分方法(如欧拉方法、Runge-Kutta方法等)来更新每个时间步的磁矩状态。 |
有限元法 | 有限元法通过将问题域划分为一系列的小区域或“元素”(可以是三角形、四边形、多边形等),在这些元素上定义局部的近似函数(通常是多项式),然后通过最小化整个域的能量(或其他适当的积分形式)来求解问题。但是通常需要更复杂的算法和更大的计算资源,尤其是在三维问题上。 |
快速傅里叶变换(FFT) | 快速傅里叶变换是一种高效计算离散傅里叶变换(DFT)的算法,它在微磁学中主要用于计算磁场,特别是去磁场(demagnetizing field)。 |
二、微磁学的物理区
概念 | 概念描述 |
---|---|
微磁学 | 与微磁对应的是宏磁,宏磁关注整体的磁化强度和磁性材料的磁性行为。微磁学的理论框架使得研究者能够理解和预测磁性材料内部的复杂磁结构,如畴、畴壁以及其他磁性纹理。 |
热力学 | 热力学平衡。e.g.自由能最低原则:这是热力学第二定律的一个表现形式,用于描述系统在平衡状态下的行为。在微磁学中,系统的平衡态是指磁体系统的自由能达到最低。自由能通常包括磁体的内能、磁场能和其他相关的能量形式。 |
能量分析 | e.g.能量最小化原理。变分原理:求解磁体系统状态的平衡态,即寻找使得能量函数达到最小值的状态。这可以通过设置能量泛函的变分为零来实现,这涉及到对偏微分方程的求解。能量泛函通常包括磁化的交换能、各向异性能、去磁能等。 |
动力学方程分析 | 偏微分方程和时间演化等等,关于这部分的数学内核可看上一段。物理内核就是方程中的每部分的物理意义:进动项,阻尼项等等。 |
磁矩变化的分析 | 向量场分析:磁矩是一个向量场,其在空间中的分布和变化需通过矢量微积分来描述和计算。磁矩的空间变化与时间变化通常涉及对向量场的散度、旋度等的计算。 |
有效场的分析 | 场论:在微磁学中,有效场包括外部磁场、交换场、各向异性场等。这些场的作用影响磁矩的行为,其计算通常涉及电磁理论中的基本方程,如麦克斯韦方程。 |
STT(spin-transfer torque)与SOT(spin-orbit torque)效应 | 自旋力矩的表达形式一般分为两种:Zhang-Li 和Slonczewski的形式。Slonczewski模型主要描述的是垂直于薄膜的自旋电流如何影响磁矩,而Zhang-Li模型关注的是在薄膜平面内的电流如何通过自旋流和扩散作用于磁矩。Slonczewski模型常用于多层结构,Zhang-Li模型则适用于单层或多层结构中的扩散效应分析。Slonczewski的两项包含平行扭矩和垂直扭矩,Zhang-Li的两项是绝热项和非绝热项。STT和SOT力矩之间是可以相互转换的,转换关系可以参考mumax3的教程。 |
三、微磁学仿真现存的一些问题
即使微磁学的发现已经很迅速成熟,但是明显的确实有一些问题存在。以下想法来源于仿真过程和一些论文的提示。
- 有限差分法/有限元法的计算耗时。画格子求解的过程会需要离散满足一定的条件,数据点之间的离散程度不能过大。像反铁磁这种结构,相邻磁矩反平行排列的情况,有限差分法基本就做不成。微磁学理论的基本假设就是磁化强度缓慢变化,特殊的结构,亚铁磁反铁磁这种情况下就遇到了麻烦。
- GPU的加速也是有局限性的。即使是mumax3这样集成了GPU的微磁模拟器,实际上在运行时也会发现在外加变化过多的时候,求解会很慢。
- 微磁学领域的现存解释相对于来说较少,还有很多作用项可能能够存在更好的表达。不能所有的外加条件,都认为他们是有效场吧。
四、微磁学代码区:上手操作,理解更深入
上面的数学物理概念让人有了想象力,但是不实际整点东西出来又容易让人不明觉厉。用一些简单的例子去理解这些概念吧。
栗子1: 能量最小化原理
内容在注释里。
使用Python来优化一个简单的能量函数,代表一个非常简化的能量最小化问题。
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
# 定义一个简化的能量函数
def energy_function(m):
# 假设磁矩 m 由两个分量 m_x 和 m_y 组成
m_x, m_y = m
# 简单的二次能量函数
return m_x**2 + m_y**2 + 10 * np.sin(m_x) + 5 * np.cos(m_y)
# 初始磁矩猜测
initial_m = np.array([1.0, 1.0])
# 使用scipy的minimize函数来找到能量最小化
result = minimize(energy_function, initial_m)
print("Optimal magnetization:", result.x)
print("Minimum energy:", result.fun)
plt.plot(result.x[0], result.x[1], 'ro')
会得到一个求得最小化能量的输出结果:
Optimal magnetization: [-1.30644005 2.12534518]
Minimum energy: -6.061530325123093
然后我们再来一个有酷炫可视化结果的升级版本:
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
# 定义一个简化的能量函数
def energy_function(m):
m_x, m_y = m
return m_x**2 + m_y**2 + 10 * np.sin(m_x) + 5 * np.cos(m_y)
# 初始磁矩猜测
initial_m = np.array([1.0, 1.0])
# 可视化能量函数
x = np.linspace(-3, 3, 400)
y = np.linspace(-3, 3, 400)
X, Y = np.meshgrid(x, y)
Z = energy_function([X, Y])
fig, ax = plt.subplots(figsize=(8, 6))
CS = ax.contour(X, Y, Z, levels=50)
ax.set_xlabel('$m_x$')
ax.set_ylabel('$m_y$')
# 使用scipy的minimize函数来找到能量最小化
path = [initial_m]
def callback(x):
path.append(x.copy())
result = minimize(energy_function, initial_m, callback=callback)
# 画出优化路径
path = np.array(path)
ax.plot(path[:, 0], path[:, 1], 'ro-', label='Optimization Path')
ax.legend()
plt.show()
print("Optimal magnetization:", result.x)
print("Minimum energy:", result.fun)
结果:
栗子2: 动力学方程(LLG 方程)求解
这个例子展示了如何使用Euler方法来数值解一个简化的LLG方程。
import numpy as np
# 参数
gamma = 2.211e5 # 旋磁比
alpha = 0.01 # 阻尼系数
H_eff = np.array([0, 0, 1]) # 简化的有效场方向为z方向
# LLG 方程
def llg_equation(m, t):
return -gamma * np.cross(m, H_eff) + alpha * np.cross(m, np.cross(m, H_eff))
# Euler方法更新磁矩
def euler_step(m, dt):
return m + dt * llg_equation(m, 0)
# 初始磁矩
m = np.array([1.0, 0.0, 0.0])
dt = 0.01 # 时间步长
# 进行100步迭代
for step in range(100):
m = euler_step(m, dt)
m /= np.linalg.norm(m) # 归一化磁矩
print("Final magnetization:", m)
输出结果:
Final magnetization: [ 9.98977370e-01 -4.52129820e-02 -4.52488641e-08]
给出有可视化的酷炫升级版本。
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 参数
gamma = 2e5 # 旋磁比
alpha = 0.01 # 阻尼系数
H_eff = np.array([0, 0, 1]) # 简化的有效场方向为z方向
# LLG 方程
def llg_equation(m, t):
return -gamma * np.cross(m, H_eff) + alpha * np.cross(m, np.cross(m, H_eff))
# Euler方法更新磁矩
def euler_step(m, dt):
return m + dt * llg_equation(m, 0)
# 初始磁矩
m = np.array([1.0, 0.0, 0.0])
dt = 0.01 # 时间步长
steps = 1000
path = []
# 进行迭代
for step in range(steps):
m = euler_step(m, dt)
m /= np.linalg.norm(m) # 归一化磁矩
path.append(m.copy())
# 可视化磁矩动态
path = np.array(path)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(path[:, 0], path[:, 1], path[:, 2], 'r-')
ax.set_xlabel('$M_x$')
ax.set_ylabel('$M_y$')
ax.set_zlabel('$M_z$')
plt.title('Magnetization Dynamics')
plt.show()
结果:
这里的参数随便给的,非正式,只是展示一下代码的设计结构,自己写代码的话建议查论文。
总结
这里给出了一些所研究领域的自我思考,感觉就是常复盘常新,科研需要框架意识。