天天看點

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加油站。

繼續閱讀