天天看点

lammps模拟中,控温失败的一个原因及解决方案

大家好,我是小马老师。

最近几天,在咨询中遇到几例控温失败的案例,觉得这类案例具有一定的代表性,和大家分享一下。

在一些lammps模拟中,会设置固定层、恒温层,在控温时,不同的区域设置不同的控温策略。

如固定层速度和受力会设为0(温度肯定也为0),恒温层会设置一个恒温器进行控温。

但是在实际运行过程中,会发现log文件输出的温度要低于设定温度,或者恒温层温度高于设定温度。

出现这种现象的主要原因是忽略了一个细节,在分区域控温时,输出或者设定温度必须指定特定原子组,否则默认的是全部原子温度。

下面以一个案例解释这个细节,Cu分为上下两侧,上层为恒温区,控温目标300k,下层为固定边界层,不控温,设置受力和速度为0。

模型如下图所示:

lammps模拟中,控温失败的一个原因及解决方案

控温代码如下:

#上层原子温度初始化为300k
velocity top create 300 8989
#固定下层原子
velocity botom set 0 0 0
fix 01 botom setforce 0 0 0
#计算上下层温度
compute topTemp top temp
compute botTemp botom temp
#输出上下层和全局温度
thermo          100
thermo_style    custom step c_topTemp c_botTemp  temp 
#保存结构文件
dump            1 all atom 100 cu.xyz
fix             2 all nvt temp 300 300 0.01
run             1000      

这是一段比较常用的代码,运行后,屏幕输出结果为:

lammps模拟中,控温失败的一个原因及解决方案

左侧第一列为top层温度最终温度为602k,中间列为下部边界层,温度为0k,最右侧为全局温度,最终300k。

我们的本意是控制上层的温度为300k,结果最终导致上层的温度为600k,造成控温失败。

主要原因是fix nvt命令中的temp默认为全部原子的平均温度,因边界层原子温度为0k,只能提高top层原子温度才能保证全局温度为300k。

解决的办法也比较简单,在fix nvt后面加一句fix_modify命令,把fix nvt命令中的temp控温对象设为top组原子:

dump            1 all atom 100 cu.xyz
fix             2 all nvt temp 300 300 0.01
fix_modify      2 temp topTemp
run             1000      

再次运行,得到结果如下:

lammps模拟中,控温失败的一个原因及解决方案

这时候,top层温度接近300K,全局温度只有150K,这时候就达到top准确控温的目的了。

lammps模拟过程中出现问题时,一定要仔细分析原因,从基本原理入手是最有效的方法。

公众号案例代码以及学习交流,请加QQ群:754749935

扫描关注微信公众号:lammps加油站。

继续阅读