優化晶格常數腳本詳細介紹

2021-02-18 DFT計算

本文以及所有腳本版權都歸李雲海博士,裡面提到的腳本可以免費使用!

第一種實現方法腳本:

以石墨烯為例,其晶格常數約為2.47埃。我們在2.30埃和2.70埃之間,每隔0.05埃取一個點。腳本中主循環如下(opt_1.sh):

for a in $(seq 2.30 0.05 2.70); do

geninp

mpirun -np 20 vasp_std &> log.$a

wait

mv OUTCAR OUTCAR.$a

done

每一個晶格常數對應的POSCAR通過geninp函數生成:

#! /bin/bash

function geninp {

local a1x=$(awk 'BEGIN {print '$a' * 0.5}')

local a1y=$(awk 'BEGIN {print '$a' * 0.5 * sqrt(3)}')

local a2x=$(awk 'BEGIN {print '$a' * -0.5}')

local a2y=$(awk 'BEGIN {print '$a' * 0.5 * sqrt(3)}')

cat > POSCAR << EOF

Graphene

1.0

$a1x $a1y 0.0

$a2x $a2y 0.0

0.0 0.0 15.0

C

2

Direct

0.0 0.0 0.5

0.333333333 0.333333333 0.5

EOF

}

需要注意的幾個地方

① 因為變量a是全局變量,所以在函數geninp中可以直接使用
② 因為Shell不支持浮點計算,所以要用awk來計算原胞基矢的各個分量,在awk命令中引用變量需要加單引號; ③ cat和EOF之間的部分相當於模板,將模板中的變量用相應的值替換,就生成了POSACR;

如果POSCAR中原子較多,再把模板放到腳本中,腳本就顯得十分冗長。這時可以用宏展開程序m4生成POSCAR。首先創建模板POSCAR.m4,內容如下:

Graphene

1.0

A1X A1Y 0.0

A2X A2Y 0.0

0.0 0.0 15.0

C

2

Direct

0.0 0.0 0.5

0.333333333 0.333333333 0.5

其中A1X, A1Y, A2X, A2Y都是待展開的宏。這些宏的定義在geninp中給出(opt_2.sh):

#! /bin/bash

function geninp {

local a1x=$(awk 'BEGIN {print '$a' * 0.5}')

local a1y=$(awk 'BEGIN {print '$a' * 0.5 * sqrt(3)}')

local a2x=$(awk 'BEGIN {print '$a' * -0.5}')

local a2y=$(awk 'BEGIN {print '$a' * 0.5 * sqrt(3)}')

m4 -DA1X=$a1x -DA1Y=$a1y -DA2X=$a2x -DA2Y=$a2y POSCAR.m4 > POSCAR

}

for a in $(seq 2.30 0.05 2.70); do

geninp

mpirun -np 20 vasp_std &> log.$a

wait

mv OUTCAR OUTCAR.$a

done

-DFOO=bar的意思是將宏FOO定義為bar。因為m4將處理後的文本直接寫入到標準輸出,所以末尾還要重定向到POSCAR。

第二種實現方法腳本:

由於宏處理器m4比較艱深晦澀,對數學計算的支持也不是很完美。因此我決定用Python自己寫一個宏處理器。核心算法是字符串遞歸替換,因此主程序(mace.py)非常簡單:

"""

Library for generating files using MACro Expansion.

You need to call the main() function, which accepts the following arguments:

macro: dictionary, macro definitions

template: string, filename of the template

output: string, filename of the output file

An auxiliary function include() is provided for including a file and defining

a macro from it.

"""

def expand_line(macro, line):

flag = False

for mac_name, mac_text in macro.items():

word = "<%s>" % mac_name

if line.find(word) is not -1:

line = line.replace(word, str(mac_text).lstrip("\n").rstrip("\n"))

flag = True

return line, flag

def include(filename, nl0=None, nl1=None):

with open(filename, "r") as infile:

content = infile.readlines()

nl_start = nl0 if nl0 is not None else 1

nl_end = nl1 if nl1 is not None else len(content)

longline = "".join(content[(nl_start-1):nl_end])

return longline

def main(macro, template, output):

with open(template, "r") as in_file:

content_raw = in_file.readlines()

content_expanded = []

for line in content_raw:

flag = True

while flag is True:

line, flag = expand_line(macro, line)

content_expanded.append(line)

with open(output, "w") as out_file:

for line in content_expanded:

out_file.write(line)

使用時只需編寫一個腳本(runmace.py)調用main函數即可。調用main函數需要三個參數:存儲宏定義的字典macro,模板文件名template和生成的輸入文件名output。除main函數外,還提供了一個include函數,用於把指定文件中的內容包含進模板。include函數除文件名filename外,另有兩個可選參數nl0和nl1用於指定行號,即可以只包含從開始行到結束行的內容(含這兩行)。行號從1開始,nl0默認為第一行,nl1默認為最後一行。runmace.py示例如下:

#! /usr/bin/env python

from mace import main

from math import sqrt

m = dict()

for a in [2.46, 2.47, 2.48]:

m["ax"] = a * 0.5

m["ay"] = a * 0.5 * sqrt(3.0)

m["bx"] = -m["ax"]

m["by"] = m["ay"]

for key, val in m.items():

m[key] = str("%14.9f" % val)

main(m, "POSCAR.tpl", "POSCAR.%4.2f" % a)

接下來給一個實用性較強的例子,首先是生成不同晶格常數下的石墨烯POSCAR。這種操作在優化晶體結構時很常見,所用模板(POSCAR.tpl)如下:

Graphene

1.0

<ax><ay> 0.000000000

<bx><by> 0.000000000

0.000000000 0.000000000 15.000000000

C

2

Direct

0.000000000 0.000000000 0.000000000

0.333333333 0.333333333 0.333333333

運行上面的run_mace.py腳本即可產生POSCAR.2.46、POSCAR.2.47和POSCAR.2.48,其中一個內容如下:

Graphene

1.0

1.230000000 2.130422493 0.000000000

-1.230000000 2.130422493 0.000000000

0.000000000 0.000000000 15.000000000

C

2

Direct

0.000000000 0.000000000 0.000000000

0.333333333 0.333333333 0.333333333

李雲海博士科學網博客地址: 
http://blog.sciencenet.cn/blog-2909108-1176842.html

李雲海博士程序源碼分享網站: 
https://gitee.com/yhli/misc

分享一個算平均電勢和面內積分電荷密度的程序

MobaXterm詳細使用教程系列二

相關焦點

  • 計算應力應變曲線腳本idealdeform.sh使用指南
    使用第一性原理模擬理想拉伸(不局限於拉伸,但要注意,不要將宏觀應力應變與DFT計算的理想應力應變混淆)曲線當然是一種很fancy的方法,但是目前我沒有看到一個自動化實現這個過程的腳本。我用bash寫了一個idealdeform.sh腳本,可以自動化實現理想拉伸或者剪切過程,目前主要用於VASP。
  • 低介電常數微波介質陶瓷基覆銅板的研究
    ,介質特性及應用領域加以分類,較為常見的是按其介電常數的大小來分類,可分為低介電常數類(20~40);中介電常數類(40~80);高介電常數(>80)。由於BN的介電常數較小,但AIN陶瓷中加入了h-BN,根據復相材料的介電常數公式計算,將h-BN加入到AIN中,還可以降低AIN陶瓷介電常數。本文旨在研製出滿足陶瓷基覆銅板使用要求的高熱導率、低介電損耗AIN及BN-AIN基陶瓷材料,以替代BeO陶瓷材料。因為BN,AIN均為共價化合物,難以燒結,為了獲得高緻密度陶瓷,需添加燒結助劑。
  • 西瓜視頻分鏡頭腳本怎麼寫?分鏡頭腳本概念介紹
    想要在西瓜視頻發布好看、優質的視頻,在拍攝前做好準備工作,寫好分鏡頭腳本能夠有效地提高拍攝效率和拍攝質量 。在寫腳本的時候,其實我們就把視頻的框架和拍攝的流程都梳理了一遍,熟練以後甚至可以把劇本以影像的形式在腦海裡放映一遍,這樣在拍攝的時候往往能事半功倍,避免漏拍、錯拍的情況。以下是關於西瓜視頻分鏡頭腳本的概念的詳細介紹。
  • 美食直播腳本怎麼寫?北京開學教育直播腳本設計模板
    直播時,我們需制定一份清晰的、詳細、可執行的直播腳本(plan A),並且還要有應對各種突發狀況的一套方案(plan B),是一場直播順暢並取得效果的有力保障。需要注意的是,腳本不是一成不變的,是需要不斷優化的。包括以下幾點:(1)直播時間根據不同的而時區來安排直播,可以把直播分為5個單元,先按美國時間上午排2個單元,下午排3個。
  • 米氏常數測定方法詳細比較
    小編這次主要介紹Km以及Vmax的測定方法(喂!你上面不是說Kcat嗎,這裡咋冒出了Vmax? 請點上面連結複習Kcat和Vmax之間的關係)。為了方便後文的介紹,有必要在這裡出現一下米氏方程 (Michaelis-Menten Equation):
  • VASPKIT軟體介紹
    很多用戶開發並貢獻了自己所在領域用到的的腳本或者小程序,本人就開發了一款用來處理結構文件的POSCARtookit腳本。但是對於新用戶來說,找到並成功使用這些腳本是不太容易的。因此一款容易上手、功能強大的預-後數據處理軟體VASPKIT應運而生。最新版的VASPKIT是王偉老師、許楠、劉錦程,唐剛和李強共同努力的成果。
  • 合肥研究院在五氧化二鉭晶格結構研究中取得進展
    近期,中國科學院合肥物質科學研究院固體物理研究所物質計算科學研究室研究員楊勇在五氧化二鉭晶格結構研究方面取得新進展,相關結果發表在Physical Review Materials (Phys. Rev.
  • 使用VASP計算Au(100)的表面能-1優化晶胞
    能帶結構5、怎樣進行截斷能的測試6、怎樣進行k點的測試VESTA1、使用VESTA把MS構建的結構模型轉換為VASP可讀的POSCAR☆ 個人公眾號,更新較慢,多多支持本次教程我們以往期構建的Au(100)表面為例,簡單地介紹表面能的計算
  • 引流腳本,APP引流腳本,引流腳本是什麼意思?
    2017年引流腳本很空出世多功能的引流腳本自動化操作多個APP平臺的引流軟體,從出世以來顛覆網際網路,迅速火爆了引流市場。其中極速引流腳本脫穎而出實用有效,作為缺乏流量的你,絕對是不二之選。相信這個時候肯定就會有人這麼想了,既然可以這麼方便,那引流的效果好嗎?
  • 太陽常數之謎和日珥的介紹
    大家好,歡迎收看我的百家號小車看科技,今天小編要給大家介紹的是太陽常數之謎和日珥的介紹。太陽常數之謎太陽每時每刻都在釋放著巨大的能量,而地球接受到的僅僅是其中的一小部分—二十二億分之一。因此,精確地測量出「太陽常數」即地球接受的太陽能量,是十分重要的。20世紀50年代,美國的天文學家艾博特經50年的測算,得到的太陽常數是2卡/釐米2·分,並為其他科學家廣泛應用。現在的測定值更精確一點是1.97卡/釐米2·分。說它是個常數,但沒有多少人相信它是個不變量。
  • 武漢大學付磊Matter綜述:二維莫爾超晶格——青取於藍而勝於藍
    近日,武漢大學付磊教授課題組在Cell Press細胞出版社旗下期刊Matter上發表綜述文章,系統介紹了莫爾超晶格的起源與調製,以及二維材料中發現的一系列新特性,並提出了展望。本文從莫爾超晶格的起源出發,介紹了少層石墨烯、石墨烯/六方氮化硼(h-BN)異質結構、過渡金屬二硫屬化合物(TMD)、TMD異質結構等具有莫爾超晶格的材料的新特性,然後介紹了如何形成莫爾條紋以及如何調控扭轉角度,最後總結了莫爾超晶格的重要性,並提出了該領域存在的若干挑戰。
  • 新手主播如何撰寫腳本 為什麼一定要有腳本
    "腳本"這詞用得最多的是在程序編程上,但如今也被用到了表演戲劇和拍攝電影還有直播上了。有人問新手主播如何撰寫腳本?為什麼一定要有腳本?今天就來給大家詳細解答一下。為什麼一定要有腳本?今天就來給大家詳細解答一下。