大家好,我是小馬老師。
最近幾天,在咨詢中遇到幾例控溫失敗的案例,覺得這類案例具有一定的代表性,和大家分享一下。
在一些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加油站。