QE使用經驗總結:讀取波函數

2021-03-01 學術之友

聲明:本文轉自李雲海科學網博客的博文,本文只做學術交流,不做商業用途,原文請點擊文末閱讀原文。


波函數是量子力學中很重要的一個物理量。只要能讀取第一性原理程序生成的波函數,很多分析和後續計算就順理成章了。為節省硬碟空間,程序生成的波函數往往以二進位格式存儲。必須先研究程序原始碼,了解數據類型和寫入順序,才能按部就班,把波函數讀出來。所幸,最近很多第一性原理程序逐步採用HDF5和NetCDF等庫解決二進位文件讀寫問題,為我們讀取波函數提供了很大便利。在這篇博文中,簡單介紹下啟用HDF5庫後QE波函數文件的格式,以及用h5py庫讀取波函數的方法。波函數格式:QE自6.x版本開始支持HDF5庫,編譯時加入--with-hdf5=yes即可啟用該特性。計算結束後,在prefix.save目錄下面會有若干個以hdf5為後綴名的文件。其中,charge-density.hdf5為電荷密度,wfcX.hdf5(X=1,2, ...)為波函數,每個k點對應一個文件。以MoS2自洽計算後生成的Gamma點波函數文件為例,我們用HDF5庫附帶的hd5dump工具,看看裡面有什麼內容:
[me@jacs mos2.save]$ h5dump wfc1.hdf5 > wfc1.txt[me@jacs mos2.save]$ vi wfc1.txt

文件一開始是一些屬性信息:

HDF5 "wfc1.hdf5" {GROUP "/" {    ATTRIBUTE "gamma_only" {      DATATYPE  H5T_STRING {         STRSIZE 7;         STRPAD H5T_STR_SPACEPAD;         CSET H5T_CSET_ASCII;         CTYPE H5T_C_S1;      }           DATASPACE  SCALAR      DATA {      (0): ".FALSE."      }        }   ATTRIBUTE "igwx" {      DATATYPE  H5T_STD_I32LE      DATASPACE  SCALAR      DATA {      (0): 7401      }        }... ...

gamma_only:布爾型,表明此波函數是否由Gamma point specific算法生成,若為True平面波個數會減半scale_factor:浮點型,倒空間基矢笛卡爾坐標縮放因子

緊跟其後的是數據集MillerIndices中的數據和屬性。這個數據集存儲了每個平面波對應的倒空間矢量,也就是

DATASET "MillerIndices" {      DATATYPE  H5T_STD_I32LE      DATASPACE  SIMPLE { ( 7401, 3 ) / ( 7401, 3 ) }      DATA {      (0,0): 0, 0, 0,      (1,0): 0, 0, -1,      (2,0): 0, 0, 1,      (3,0): 0, 0, -2,      (4,0): 0, 0, 2,      (5,0): 0, 0, -3,      (6,0): 0, 0, 3,... ...      (7399,0): 0, 0, -37,      (7400,0): 0, 0, 37      }      ATTRIBUTE "bg1" {         DATATYPE  H5T_ARRAY { [3] H5T_IEEE_F64LE }         DATASPACE  SCALAR         DATA {         (0): [ 1.04511, 0.603391, -0 ]         }      }      ATTRIBUTE "bg2" {         DATATYPE  H5T_ARRAY { [3] H5T_IEEE_F64LE }         DATASPACE  SCALAR         DATA {         (0): [ 0, 1.20679, 0 ]         }      }      ATTRIBUTE "bg3" {         DATATYPE  H5T_ARRAY { [3] H5T_IEEE_F64LE }         DATASPACE  SCALAR         DATA {         (0): [ 0, -0, 0.209114 ]         }      }      ATTRIBUTE "doc" {         DATATYPE  H5T_STRING {            STRSIZE 77;            STRPAD H5T_STR_SPACEPAD;            CSET H5T_CSET_ASCII;            CTYPE H5T_C_S1;         }         DATASPACE  SCALAR         DATA {         (0): "Miller Indices of the wave-vectors, same ordering as wave-function components"         }      }

根據ngw屬性的值,共有7401個平面波。每個平面波對應的倒空間矢量用三個整數存儲,數組尺寸為7401*3。需注意的是,h5dump是用C語言編寫的,數組下標從0開始,並且行優先。FORTRAN則與之相反,在寫入這部分數據的FORTRAN代碼中,數組下標為1-7401,尺寸為3*7401。若用FORTRAN代碼去讀取這部分數據,也應該申請尺寸為3*7401的數組。緊跟數據的是三個屬性bg1-bg3,分別表示倒空間基矢b1-b3的笛卡爾坐標。屬性doc為注釋,表明G矢量的排列順序和平面波展開係數一致。
DATASET "evc" {      DATATYPE  H5T_IEEE_F64LE      DATASPACE  SIMPLE { ( 9, 14802 ) / ( 9, 14802 ) }      DATA {      (0,0): 0.54088, -0.00350892, -0.385045, -0.203002, -0.382379, 0.20798,      (0,6): 0.110416, 0.163513, 0.108285, -0.164932, 0.00211342, 0.0205407,      (0,12): 0.00184674, -0.0205664, 0.0485897, -0.11843, 0.0501221,      (0,17): 0.11779, -0.101751, 0.0839421, -0.102832, -0.0826149,      (0,22): 0.0918935, 0.00349047, 0.0918404, -0.00468243, 0.0918934,      (0,27): 0.00349047, 0.0918404, -0.00468243, 0.0918402, -0.00468273,      (0,32): 0.0918932, 0.00349077, -0.064341, -0.0387719, -0.0679325,      (0,37): 0.0320652, -0.0683428, -0.0311811, -0.0638325, 0.0396034,... ...      (8,14801): 1.42571e-05      }      ATTRIBUTE "doc:" {         DATATYPE  H5T_STRING {            STRSIZE 145;            STRPAD H5T_STR_SPACEPAD;            CSET H5T_CSET_ASCII;            CTYPE H5T_C_S1;         }         DATASPACE  SCALAR         DATA {         (0): "Wave Functions, (npwx,nbnd), each contiguous line represents a wave function,  each complex coefficient is given by a couple of contiguous floats"         }      }   }

數據部分是一個9*14802的數組,數據類型是雙精度浮點數。9代表9條能帶。由於HDF5庫不支持複數類型,QE把複數的實部和虛部當作兩個相鄰的浮點數處理。根據MillerIndices中的信息,基組中共有7401個平面波,所以每條能帶需要用7401*2=14802個浮點數表示。屬性doc為注釋,由於數據集由FORTRAN程序生成,所以注釋中數組的大小是(npw, nbnd),也就是7401*9,與h5dump顯示方式正好相反。當輸入文件中K點設置方式為K_POINTS {gamma}時,QE會利用平面波展開係數的對稱性把除(0, 0, 0)以外的G矢量約掉一半。此時平面波個數只有1+(7401-1)/2=3401個,波函數展開係數也會減少。在處理波函數(如作內積)時需注意到這一點,把被約掉部分的貢獻考慮進來。波函數讀取我們用一個程序演示下如何用python HDF5庫(h5py)讀取波函數並驗證正交歸一性:
 #! /usr/bin/env python    import h5py  import numpy as np    f1 = h5py.File("wfc1.hdf5")    for i in range(9):        for k in range(9):             vi = f1['evc'][i].view(complex)             vk = f1['evc'][k].view(complex)             prod = np.vdot(vi, vk)             print("%4d%4d%20.9e%20.9e" % (i+1, k+1, prod.real, prod.imag))            f1.close()

第6行打開波函數文件並返回一個HDF5 File對象,第15行關閉該對象。這兩步都是固定操作。在第10-12行中,我們先用f1['evc']獲取波函數展開係數對應的數組,再分別取其第i行和第k行,接著將這兩行從浮點數轉換為複數,最後取其內積。需注意numpy默認的數組行為與C語言一致,下標從0開始,行優先。在使用模守恆贗勢的情況下,波函數的正交歸一性是相當不錯的。對角元都等於1,非對角元非常小:

   1   1     1.000000000e+00     0.000000000e+00   1   2     0.000000000e+00     2.385244779e-16   1   3    -1.301042607e-17     5.862823248e-17   1   4     1.044840369e-17     1.153786310e-16   1   5     1.654001236e-17     6.810257889e-17   1   6     1.353084311e-16     1.973247954e-17   1   7    -4.834652305e-17    -2.871150524e-17   1   8     4.886076366e-17    -5.320187141e-17   1   9     8.326672685e-17    -1.994931997e-17   2   1     0.000000000e+00    -2.385244779e-16   2   2     1.000000000e+00     0.000000000e+00   2   3     1.942890293e-16    -6.559423144e-16   2   4     1.863217563e-16    -7.420547919e-17   2   5     7.047404118e-17    -1.284609837e-17   2   6    -8.326672685e-17     3.534499082e-17   2   7     8.792201992e-18     6.776065055e-17   2   8    -7.430109817e-17    -4.297889677e-17   2   9    -1.665334537e-16    -4.683753385e-17   3   1    -1.301042607e-17    -5.862823248e-17   3   2     1.942890293e-16     6.559423144e-16   3   3     1.000000000e+00     0.000000000e+00... ...

如果用Gamma point specific算法生成波函數,上述驗證正交歸一性的程序就需要做部分修改:

10         vi = f1['evc'][i].view(complex) 11         vk = f1['evc'][k].view(complex) 12         prod = np.vdot(vi, vk) 13         prod += prod.conjugate() 14         prod -= vi[0].conjugate() * vk[0]

第12行計算一次波函數內積,第13行把被約掉部分的貢獻疊加上去。由於(0,0,0)點被計算了兩次,所以要在第14行扣掉一次。正交歸一性如下:
   1   1     1.000000000e+00     0.000000000e+00   1   2    -1.026468407e-16     0.000000000e+00   1   3    -1.040834086e-16     0.000000000e+00   1   4     5.383665643e-17     0.000000000e+00   1   5    -4.516591433e-17     0.000000000e+00   1   6     3.039221779e-16     0.000000000e+00   1   7     6.630590951e-17     0.000000000e+00   1   8    -9.741762322e-18     0.000000000e+00   1   9     2.636779683e-16     0.000000000e+00   2   1    -1.026468407e-16     0.000000000e+00   2   2     1.000000000e+00     0.000000000e+00   2   3    -5.322843979e-16     0.000000000e+00   2   4    -1.117805618e-16     0.000000000e+00   2   5    -1.351550723e-16     0.000000000e+00   2   6    -1.766979661e-16     0.000000000e+00   2   7     3.830849052e-17     0.000000000e+00   2   8    -6.423501709e-17     0.000000000e+00   2   9    -7.960415638e-17     0.000000000e+00   3   1    -1.040834086e-16     0.000000000e+00   3   2    -5.322843979e-16     0.000000000e+00   3   3     1.000000000e+00     0.000000000e+00... ...

讀取波函數以後,計算實空間中某一點的波函數值就很簡單了:程序在這裡就不放了。如果需要計算大量實空間中的點,可以用快速傅立葉變換。如果要驗證波函數空間反演對稱性,只需取一些點,驗證

相關焦點

  • R語言中使用scan函數讀取文件中的數據
    在上一篇文章中介紹了使用scan函數從鍵盤中獲取數據的方法,本篇文章將介紹scan函數的另外一個常用功能:從文件中獲取數據。從文本文件中讀取數據假設在R的當前工作目錄中有一個文件:student.txt,其存儲的數據如下圖所示,每個數據以空格分隔。
  • 【從零學習OpenCV 4】圖像讀取函數imread
    我們在前面已經見過了圖像讀取函數imread()的調用方式,這裡我們給出函數的原型。Mat類變量,如果圖像文件不存在、破損或者格式不受支持時,則無法讀取圖像,此時函數返回一個空矩陣,因此可以通過判斷返回矩陣的data屬性是否為空或者empty()函數是否為真來判斷是否成功讀取圖像,如果讀取圖像失敗,data屬性返回值為0,empty()函數返回值為1。
  • 使用Pandas讀取複雜的Excel數據
    關於Excel數據處理,很多同學可能使用過Pyhton的pandas模塊,用它可以輕鬆地讀取和轉換Excel數據。但是實際中Excel表格結構可能比較雜亂,數據會分散不同的工作表中,而且在表格中分布很亂,這種情況下啊直接使用pandas就會非常吃力。本文蟲蟲給大家介紹使用pandas和openpyxl讀取這樣的數據的方法。
  • 空性譯成波函數?4:波函數與空性不盡相同的地方
    4:波函數與空性不盡相同的地方 上接《空性譯成波函數?3:波函數與空性相通的地方》(點擊閱讀) 五、波函數與空性不盡相同的地方 如上所述,波函數與空性誠有許多相似的地方,但如果做更進一步的比較,即使在這些相似處卻也不盡相同,如下所列: 1、主客一體上的不同:雖然透過波函數所描述的物理世界,觀測行為直接影響到觀測的後果,因而說觀察者不能自外於所分析的系統,而與空性能所為一
  • 空性譯成波函數?1:什麼是波函數
    (2)認為波函數即是空性因此,有心人把次原子世界研究所發展出來的理論——量子力學,應用到空性上來。認為波函數即是空性。在量子力學裡,這用來描述質點行為的函數,因它顯現波的種種特性,一般即叫波函數(WAVEFUNCTION)。
  • 使用文件對象讀取Python文件內容
    使用open函數可以打開文件並返回一個文件對象,返回的文件對象用來讀取和寫入文件內容。那麼,如何使用文件對象來讀取文件內容呢?如何讓讀取的文件內容初始化一個Python列表呢?文本文件和二進位文件使用文件對象讀取文件內容時,要根據文件的不同存儲類型選擇不同的讀取方式。
  • fread函數讀取單細胞數據
    metadata6 <- read.csv("G:/celllungcancer/S01_metacells.csv", header = T, sep = '\t')綜上txt和csv文件有本質區別txt讀取時需要加
  • 個人永久性免費-Excel催化劑功能第43波-文本處理類函數增強
    一般DotNet程序猿可以使用大量微軟團隊寫好的函數,但Excel用戶卻沒這樣的福氣,Excel催化劑也當搬運工,把這些DotNet的文本處理類函數搬到Excel環境中,供普通大眾來使用。文本處理函數清單同時因一般普通用戶使用正則處理函數,特意重新封裝了常用的擷取替換函數
  • 使用readr包高效讀取txt/csv格式文件
    下面讀取的數據文件默認放置於工作目錄中。1. 使用基礎函數讀取txt/csv文件read.table()函數是通用函數,可以用來讀取數據,讀取後的數據在R中以數據框形式存在。除了read.table()外,還有幾種變體函數也可以用於讀取數據,比如說read.csv()、read.csv2()、read.delim()、read.delim2(),每個函數略有區別。
  • Java讀取和寫入txt文件
    1 問題描述對於java的讀取和寫入txt一直心存疑惑,隨著知識的積累,又重新進行學習,對java的文件讀寫理解更加深刻,在這裡將自己的小小經驗總結分享給大家。下面是大家了解java流的一個基本框架。字節流可用於任何類型的對象,包括二進位對象,而字符流只能處理字符或者字符串,字節流提供了處理任何類型的IO操作的功能,但它不能直接處理Unicode字符,而字符流就可以;讓我們來看看java具體的輸入輸出操作:1 使用File類打開一個文件2 通過字節流或字符流的子類,指定輸出的位置
  • 【Python基礎】Python 函數使用總結
    :默認值是聲明在函數定義時,關鍵字參數是在函數調用時使用的此結構。4 可變參數Java和C++在解決同一個函數但參數個數不同時,會使用函數重載的方法。Python使用可變參數的方法,非常靈活。我們還可以這樣調用:foo(1.2) # 1.25 內置函數總結完函數的參數後,再舉幾個Python內置的常用函數。
  • Python 函數3000字使用總結
    :默認值是聲明在函數定義時,關鍵字參數是在函數調用時使用的此結構。4 可變參數Java和C++在解決同一個函數但參數個數不同時,會使用函數重載的方法。Python使用可變參數的方法,非常靈活。使用遞歸函數需要注意找到正確的遞歸基,防止陷入無限遞歸。更多使用遞歸的例子大家可參考此公眾號之前推送。8 匿名函數匿名函數是指使用lambda關鍵字創建的函數。
  • pandas讀取數據(1)
    將表格型數據讀取為DataFrame是pandas的重要特性,下表總結了實現該功能的部分函數。函數描述read_csv讀取csv文件,逗號為默認的分隔符read_table讀取table文件,也就是txt文件,制表符('\t')為默認分隔符read_clipboardread_table的剪貼板版本,在將表格從Web頁面轉換成數據時有用read_excel讀取XLS或XLSX文件read_hdf讀取pandas存儲的HDF5
  • 詳解C語言gets()函數與它的替代者fgets()函數
    在c語言中讀取字符串有多種方法,比如scanf() 配合%s使用,但是這種方法只能獲取一個單詞,即遇到空格等空字符就會返回。如果要讀取一行字符串,比如:I love BIT這種情況,scanf()就無能為力了。這時我們最先想到的是用gets()讀取.gets()函數從標準輸入(鍵盤)讀入一行數據,所謂讀取一行,就是遇到換行符就返回。
  • 波函數與薛丁格方程
    量子力學的學習一定要對波函數以及薛丁格方程這兩個概念有深刻的認識。目前我們已經學習了量子力學第一章內容,對於這些概念應該有自己的思考。      波函數是描述一個物理系統的時間演化規律的唯一基本函數。知道了它,原則上就可以得到該系統的所有物理量。
  • IOS開發使用CNContact讀取手機通訊錄中聯繫人
    那麼如何使用這個類讀取通訊錄中的聯繫人呢,接下來將講解詳細步驟。本經驗代碼使用OC語言編寫。新建一個項目,然後把Contact模型包含進來。在這裡我們使用@import的方法導入,注意@import導入的用法是@import Contacts;後面要添加分號。然後在ViewController.m中的viewDidLoad函數中創建通訊錄對象。
  • 《pandas數據讀取》
    ,需要使用不同的函數讀取,pandas內置了10餘種數據源讀取函數和對應的數據寫入函數,常見的數據源有3種,分別是資料庫數據,文本文件(包含一般文本文件和CSV文件)和Excel文件,掌握這三種數據源讀取方法,便能夠完成80%左右的數據讀取工作。
  • 127、使用pandas讀取文本文件
    pandas提供了一些用於將表格型數據讀取為DataFrame對象的函數,其中常用read_csv和read_table讀取文件。0.png下面出現的例子中需要讀取的文件都存放在我自己的電腦 D:Pytho\notebookpydata-book-masterch06 中。
  • qe是什麼意思_美聯儲qe是什麼意思-金投外匯網-金投網
    是什麼意思和美聯儲qe是什麼意思相關介紹。 qe是什麼意思 qe什麼意思?
  • 2020 的第一波面試題總結
    ,之前主要做平面相關,自己喜歡瞎折騰,從17年開始研究前端,然後公司內部轉崗到開發部門工作,算下來前端經驗也快三年之久。因此總結一波2020年最新面試題,希望對大家有所幫助!後面的答案為自行整理,如有疏漏,歡迎指正!面試總結以下面試均為電話面試一面構造函數 ,是一種特殊的方法。主要用來在創建對象時初始化對象。