相平衡状态图研究由一种或数种物质所构成的相平衡系统的性质(如沸点、熔点、蒸汽压、溶解度等)与条件(如温度、压力及组成等) 的函数关系,这种关系的图叫相图(phase diagram)。

相图计算是材料科学和热力学研究中的重要任务之一,它有助于理解物质在不同温度、压力和成分条件下的相变行为。在 Python 中可以使用 pycalphad 库来进行相图计算。
| 特点 | 相图计算 | 实验测量 |
|---|---|---|
| 数据来源 | 使用热力学数据库中的数据进行计算。 | 通过实验室实际测量得到数据。 |
| 精度和可靠性 | 取决于数据库质量和模型准确性。 | 受实验条件和仪器精度的影响,有一定不确定性。 |
| 应用 | 用于预测新材料性质、相变行为。 | 用于验证已知材料性质、实验结果。 |
| 研究范围 | 可以探索广泛的组分、温度和压力范围。 | 受实验条件和材料可用性限制。 |
| 时间和成本 | 相对较快且成本较低,尤其是用于预测。 | 可能需要更多时间和资源来进行实验。 |
| 灵活性 | 可根据需要轻松修改计算条件和组分。 | 实验条件和样品准备可能受限制。 |
| 验证 | 需要与实验数据进行比较和验证。 | 通常用来验证计算结果的准确性。 |
pycalphad 是一个免费使用 CALPHAD 方法计算热力学的 Python 库,用于 设计热力学模型,计算相图和 用calphad方法研究相平衡。
pycalphad 提供读取Thermo Calc TDB文件和 求解多组分多相吉布斯能量最小化程序。
(https://pycalphad.org/)
等压二元相图


al-zn(铝锌)合合金二元相图计算
# 引入 matplotlib 库并设置以内联方式显示图形
%matplotlib inline
import matplotlib.pyplot as plt
# 引入 pycalphad 库中的 Database、binplot 和 variables 模块
from pycalphad import Database, binplot
import pycalphad.variables as v
# 加载数据库文件并选择将要考虑的相位
db_alzn = Database('alzn_mey.tdb')
my_phases_alzn = ['LIQUID', 'FCC_A1', 'HCP_A3']
# 创建一个 matplotlib 的 Figure 对象并获取当前活动的 Axes 对象
fig = plt.figure(figsize=(9, 6))
axes = fig.gca()
# 计算相图并在现有的坐标轴上绘制它,使用 `plot_kwargs={'ax': axes}` 关键字参数
binplot(db_alzn, ['AL', 'ZN', 'VA'], my_phases_alzn, {v.X('ZN'): (0, 1, 0.02), v.T: (300, 1000, 10), v.P: 101325, v.N: 1}, plot_kwargs={'ax': axes})
# 显示图形
plt.show()
计算二元系统的能量面
在 CALPHAD 建模中可检查系统中所有组成相的吉布斯能面。nb-re(铌铼)计算给定温度 (2800 K) 下所有相的吉布斯能量作为成分的函数。chi 相具有额外的内部自由度,使其能够针对给定的整体成分呈现多种状态。只有低能态与计算平衡相图相关。

# 引入matplotlib库并使用"%matplotlib inline"命令以内联方式显示图形
import matplotlib.pyplot as plt
# 引入pycalphad库中的Database、calculate、variables和plot工具中的phase_legend
from pycalphad import Database, calculate, variables as v
from pycalphad.plot.utils import phase_legend
# 引入numpy库并重命名为np
import numpy as np
# 加载热力学数据库文件'nbre_liu.tdb',并创建数据库对象db_nbre
db_nbre = Database('nbre_liu.tdb')
# 定义要绘制的相位名称列表
my_phases_nbre = ['CHI_RENB', 'SIGMARENB', 'FCC_RENB', 'LIQUID_RENB', 'BCC_RENB', 'HCP_RENB']
# 获取相位名称到颜色的映射关系,以用于图例
legend_handles, color_dict = phase_legend(my_phases_nbre)
# 创建一个图形窗口,指定图形大小为(9, 6),并获取坐标轴对象ax
fig = plt.figure(figsize=(9, 6))
ax = fig.gca()
# 遍历相位名称列表,计算吉布斯自由能,并散点绘制GM vs. X(RE)图形
for phase_name in my_phases_nbre:
# 使用calculate函数计算吉布斯自由能,输出为'GM'
result = calculate(db_nbre, ['NB', 'RE'], phase_name, P=101325, T=2800, output='GM')
# 绘制散点图,X轴为'Re'的摩尔分数,Y轴为吉布斯自由能,设置散点标记、大小和颜色
ax.scatter(result.X.sel(component='RE'), result.GM, marker='.', s=5, color=color_dict[phase_name])
# 设置图形的X轴和Y轴标签以及X轴的范围
ax.set_xlabel('X(RE)')
ax.set_ylabel('GM')
ax.set_xlim((0, 1))
# 添加图例,并设置图例位置和相对位置
ax.legend(handles=legend_handles, loc='center left', bbox_to_anchor=(1, 0.6))
# 显示图形
plt.show()
绘制三元相图并使用三角轴
在热力学中可使用二维图来表达三组分系统中的平衡。
原子模拟环境 (ASE, Atomic Simulation Environment https://wiki.fysik.dtu.dk/ase/) 是一个用于分子动力学和材料建模的Python库。它提供了丰富的工具和功能,使科学家和工程师能够模拟原子和分子的行为,以研究材料的性质、结构和相互作用。主要特点和功能:
多样的模拟方法:ASE支持多种分子动力学方法,包括分子动力学、Monte Carlo模拟、自洽场计算等,可以用于不同类型的材料建模。
材料建模:ASE可以用于构建材料的晶格结构、计算能带结构、分析晶格动力学,以及模拟材料的机械性能。
界面友好:ASE提供了简单的Python接口,易于使用和扩展。它还允许用户将ASE与其他科学计算库(如Numpy、SciPy)集成在一起。
广泛的材料性质计算:ASE可以用于计算材料的多种性质,包括能带结构、电子结构、热力学性质、声学性质等。
可视化工具:ASE提供了可视化工具,允许用户可视化模拟过程和结果,以便更好地理解材料的行为。
兼容性:ASE支持多种第三方软件和计算引擎,如VASP、LAMMPS、Gaussian等,使其能够与现有的计算工具无缝集成。
开源和活跃的社区:ASE是一个开源项目,拥有活跃的开发者和用户社区,不断更新和改进库的功能和性能。
# 导入模块
from ase import Atoms # 从ASE库导入Atoms类,用于创建原子和分子结构
from ase.calculators.emt import EMT # 从ASE的emt模块导入EMT计算器,用于计算能量
# 创建单个氮原子
atom = Atoms('N') # 创建一个包含单个氮原子的Atoms对象
atom.calc = EMT() # 使用EMT计算器计算氮原子的能量
e_atom = atom.get_potential_energy() # 获取氮原子的势能能量
# 创建氮分子
d = 1.1 # 定义氮分子的原子间距
molecule = Atoms('2N', [(0., 0., 0.), (0., 0., d)]) # 创建一个包含两个氮原子的Atoms对象
molecule.calc = EMT() # 使用EMT计算器计算氮分子的能量
e_molecule = molecule.get_potential_energy() # 获取氮分子的势能能量
# 计算原子化能
e_atomization = e_molecule - 2 * e_atom # 计算原子化能,即氮分子减去两倍氮原子的能量
# 打印结果
print('氮原子能量: %5.2f eV' % e_atom)
print('氮分子能量: %5.2f eV' % e_molecule)
print('原子化能: %5.2f eV' % -e_atomization) # 注意,这里取负号以得到正数的原子化能
输出:
Nitrogen atom energy: 5.10 eV
Nitrogen molecule energy: 0.44 eV
Atomization energy: 9.76 eV
首先,对不同的晶格常数进行批量计算:
# 导入所需的库
import numpy as np
from ase import Atoms
from ase.calculators.emt import EMT
from ase.io.trajectory import Trajectory
# 定义银晶体的初基格矢和使用EMT势能计算器
a = 4.0 # 初始晶格常数
b = a / 2
ag = Atoms('Ag',
cell=[(0, b, b), (b, 0, b), (b, b, 0)],
pbc=1,
calculator=EMT())
# 获取晶格参数和创建轨迹文件
cell = ag.get_cell()
traj = Trajectory('Ag.traj', 'w')
# 在不同的晶格参数下进行循环
for x in np.linspace(0.95, 1.05, 5):
# 调整晶格参数并重新计算能量
ag.set_cell(cell * x, scale_atoms=True)
ag.get_potential_energy()
# 将构型写入轨迹文件
traj.write(ag)
编写一个轨迹文件,其中包含五种不同晶格常数的 FCC 银的五种配置。EquationOfState现在,使用类和此脚本分析结果:
# 从轨迹文件中读取构型和能量数据
from ase.eos import EquationOfState
from ase.io import read
from ase.units import kJ
configs = read('Ag.traj@0:5') # 读取5个构型
# 提取体积和能量
volumes = [ag.get_volume() for ag in configs]
energies = [ag.get_potential_energy() for ag in configs]
# 使用EquationOfState拟合状态方程
eos = EquationOfState(volumes, energies)
v0, e0, B = eos.fit()
# 打印弹性模量(GPa)
print(B / kJ * 1.0e24, 'GPa')
# 生成状态方程图像
eos.plot('Ag-eos.png')
ASE(Atomic Simulation Environment)是一个功能强大的Python库,可以用来生成VASP(Vienna Ab Initio Simulation Package)的输入文件。ASE生成VASP输入文件的一般步骤:
导入必要的ASE库:
from ase import Atoms
from ase.io import write
创建原子结构:
# 定义原子的种类和坐标
atoms = Atoms(symbols=['H', 'O'],
positions=[(0, 0, 0), (0, 0, 1.0)])
# 设置晶胞参数
atoms.set_cell([5, 5, 5])
# 设置原子间相互作用(例如,使用Lennard-Jones势能)
atoms.set_calculator(EMT())
生成VASP输入文件:
# 指定输出文件名
output_file = 'POSCAR'
# 使用ASE的write函数生成VASP的POSCAR文件
write(output_file, atoms, format='vasp')
生成一个名为'POSCAR'的VASP输入文件,包含原子坐标、晶格常数等信息。
使用ASE库中的ase.build模块创建了两个碳纳米管(Carbon Nanotube,CNT)模型,其中一个是纯碳纳米管,另一个是含有硅(Si)原子的碳纳米管。
# 导入必要的模块
from ase.build import nanotube
# 创建纯碳纳米管(CNT1)
# nanotube()函数用于创建碳纳米管模型。
# 参数6表示CNT的(n, m)索引,其中n和m是整数,指定碳纳米管的结构。
# 参数0表示该碳纳米管的扩展方向是沿着Z轴。
# 参数length=4表示CNT的长度为4个单位。
cnt1 = nanotube(6, 0, length=4)
# 创建含有硅原子的碳纳米管(CNT2)
# 同样,nanotube()函数用于创建碳纳米管模型。
# 参数3和3表示CNT的(n, m)索引。
# 参数length=6表示CNT的长度为6个单位。
# 参数bond=1.4表示CNT中碳-碳键的键长为1.4 Ångströms。
# 参数symbol='Si'表示将硅(Si)原子添加到碳纳米管中。
cnt2 = nanotube(3, 3, length=6, bond=1.4, symbol='Si')

使用ASE库中的ase.build模块创建了两种不同类型的石墨烯纳米带(Graphene Nanoribbon,GNR)模型,分别是“armchair”型和“zigzag”型,以及对这些模型进行了一些特定的设定。
# 导入必要的模块
from ase.build import graphene_nanoribbon
# 创建“armchair”型石墨烯纳米带(GNR1)
# graphene_nanoribbon()函数用于创建石墨烯纳米带模型。
# 参数3和4表示GNR的(n, m)索引,这里为(3, 4)。
# 参数type='armchair'表示创建“armchair”型石墨烯纳米带。
# 参数saturated=True表示饱和边缘,即氢原子饱和。
# 参数vacuum=3.5表示在GNR上方创建3.5 Ångströms的真空层。
gnr1 = graphene_nanoribbon(3, 4, type='armchair', saturated=True, vacuum=3.5)
# 创建“zigzag”型石墨烯纳米带(GNR2)
# 同样,graphene_nanoribbon()函数用于创建石墨烯纳米带模型。
# 参数2和6表示GNR的(n, m)索引,这里为(2, 6)。
# 参数type='zigzag'表示创建“zigzag”型石墨烯纳米带。
# 参数saturated=True表示饱和边缘。
# 参数C_H=1.1和C_C=1.4表示碳-氢键的键长为1.1 Ångströms,碳-碳键的键长为1.4 Ångströms。
# 参数vacuum=3.0表示在GNR上方创建3.0 Ångströms的真空层。
# 参数magnetic=True表示在GNR上引入磁性。
# 参数initial_mag=1.12表示初始化的磁矩为1.12 Bohr magnetons。
gnr2 = graphene_nanoribbon(2, 6, type='zigzag', saturated=True, C_H=1.1, C_C=1.4,
vacuum=3.0, magnetic=True, initial_mag=1.12)
