大家好,我是小马老师。
最近几天,在咨询中遇到几例控温失败的案例,觉得这类案例具有一定的代表性,和大家分享一下。
在一些lammps模拟中,会设置固定层、恒温层,在控温时,不同的区域设置不同的控温策略。
如固定层速度和受力会设为0(温度肯定也为0),恒温层会设置一个恒温器进行控温。
但是在实际运行过程中,会发现log文件输出的温度要低于设定温度,或者恒温层温度高于设定温度。
出现这种现象的主要原因是忽略了一个细节,在分区域控温时,输出或者设定温度必须指定特定原子组,否则默认的是全部原子温度。
下面以一个案例解释这个细节,Cu分为上下两侧,上层为恒温区,控温目标300k,下层为固定边界层,不控温,设置受力和速度为0。
模型如下图所示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5CMxczM5EWYkJjMjhDM4ImNyYzX4AzNwQTM5IzLcRDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
控温代码如下:
#上层原子温度初始化为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
这是一段比较常用的代码,运行后,屏幕输出结果为:
左侧第一列为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
再次运行,得到结果如下:
这时候,top层温度接近300K,全局温度只有150K,这时候就达到top准确控温的目的了。
lammps模拟过程中出现问题时,一定要仔细分析原因,从基本原理入手是最有效的方法。
公众号案例代码以及学习交流,请加QQ群:754749935
扫描关注微信公众号:lammps加油站。