Gaussian的Link、IOp與非標準計算路徑
1. Gaussian程序的基本結構
高斯是由很多功能不同的獨立可執行程序組成的,它們被稱為Link,在它們之間通過臨時文件來傳遞數據,最主要的是rwf文件,每個Link的功能在高斯手冊里都有簡單介紹。Link間的調用順序實際上是隨意的,但是只有某些固定順序的調用(還包括循環、分支、跳轉方式的調用)才有意義,才能完成特定的任務。每個Link對應的可執行文件名的通式為lyyxx.exe,例如L314對應的可執行程序l314.exe就是yy=3、xx=14。yy代表的是這個Link所屬的overlay,也稱為層,功能相近的子程序被歸在一層,如overlay 6主要是分析波函數,所以包括了L601(布居數和相關的分析)、L607(NBO分析)、L609(AIM分析)等子程序。同一層的Link也經常連在一起被調用,如L301、L302、L303、L311、L314它們總是連在一起調用來完成基組的設定和電子積分。
L0、L1、L9999相對其它Link較為特殊,它們并不用來執行實際的計算,而且不論何種任務,它們都一定會執行。
L0:在程序最開始執行,用來初始化運行環境。與L0對應的程序并不叫L0.exe,若在高斯03中,dos版本它就對應g03.exe,windows GUI版本就是g03W.exe,unix版本就對應g03。L0會創建L1進程,然后在全部Link調用結束前會一直保持睡眠狀態。L0還會把輸入文件復制成一份“內部輸入文件”到用戶設的scratch目錄中,其名字在windows版本下就是gxx.inp,在unix版本下為“進程id號.inp”,任務正常結束后會被自動刪掉,其內容相對于輸入文件沒有了注釋行(開頭為!的行),并且用@來引用的外部文件會在其中被展開。
L1:被Link 0所調用。用來初始化臨時文件、解析輸入文件中route section段落的關鍵詞、生成調用以后Link所需的命令行指令。L1和L0共同組成overlay 0。
L9999:最后一個被調用的Link,進行任務的掃尾工作。它確保最重要的信息已寫入chk,輸出第三方程序所需的文件(如.wfn波函數文件),生成檔案條目(是指在格言之前輸出的那段計算數據的緊湊描述),輸出古怪的格言,最后結束整個任務。
2. 內部選項(IOp,Internal Option)
每個Link都有其IOp,各個選項的選項值決定了這個Link如何運行,每個IOp的解釋可以在高斯官方網站查到,遇見個別查不到的,需用《察看Gaussian全部IOP的方法》(http://www.shanxitv.org/30)文中的方法。
在route section段落所指定的計算任務和方法被L1所解析后,哪些Link會被調用,并且以什么參數來調用就確定了。例如# HF/STO-3G會被解析成下面這樣,稱為非標準路徑(不同高斯版本解析出的結果可能有些不同):
1/38=1/1;
2/17=6,18=5,40=1/2;
3/6=3,11=9,16=1,25=1,30=1/1,2,3;
4//1;
5/5=2,32=1,38=5/2;
6/7=2,8=2,9=2,10=2,28=1/1;
99/5=1,9=1/99;
上面每行內容格式是:yy/選項=數值,選項=數值.../xx1,xx2,xx3...;。例如第5行,yy=5,xx=2說明要調用L502,并且令其選項5的值為2、選項32的值為1、選項38的值為5。再例如第3行,說明要調用L301、L302、L303,并且將選項6的值為3、選項11的值為9...選項30的值為1這樣的設定傳遞給它們,屬于同一層且在同一行的Link會共享IOp設定。
解析出的內容并不是把所有選項和賦值都列出來,選項的值如果是默認的就不會被列出,一般各個IOp默認的值都是0。例如第四行,說明以各個選項都用默認值的方式來調用L401。
可以用IOp關鍵字修改各層選項的值,格式為IOp(層/選項=值,層/選項=值...),比如route section多填上IOp(3/40=2,3/11=1,4/9=2),則第三行成了3/6=3,11=1,16=1,25=1,30=1,40=2/1,2,3;,第四行成了4/9=2/1;。
給某個Link傳遞它本身并沒有的選項設定等于沒有傳遞。例如freq任務被解析出的內容會有7/8=1,10=1,25=1/1,2,3,16;這樣一行,而L701/702/703并沒有選項8,所以雖然寫了,但實際上等價于只給L716傳遞了選項8=1這個設定。同一層的不同Link往往同時具有相同的選項,選項的設定傳遞給它們時所代表的含義有時相同(必定這幾個Link功能有相關性),但也有時不同(這種情況下這些Link不會有機會在一起使用)。例如IOp(1/13)控制L103/113/114(用于幾何優化)及L115(計算IRC)用什么方法更新Hessian矩陣,也控制L121(ADMP計算)的多時間步長參數。對這兩種情況1/13的功能是不相關的,卻只能給這個選項設一個值,看似會有矛盾,但由于ADMP不可能與優化或IRC在一起執行,所以不必擔心這個問題。
想查看route section被解析的結果,可以進入高斯自帶的testrt.exe程序,然后輸入比如HF/STO-3G,按兩次回車就可得到上述結果。或者在windows版高斯的Existing File Job Edit窗口中點對勾按鈕。也可以在任務的輸出文件的開始部分看到(使用#T精簡輸出時除外)。
3. Link的調用順序
來看一個復雜點的例子,# HF/STO-3G opt的非標準路徑如下:
1/18=20,38=1/1,3;
2/9=110,17=6,18=5,40=1/2;
3/6=3,11=1,16=1,25=1,30=1/1,2,3;
4/7=1/1;
5/5=2,38=5/2;
6/7=2,8=2,9=2,10=2,28=1/1;
7//1,2,3,16;
1/18=20/3(3);
2/9=110/2;
6/7=2,8=2,9=2,10=2,19=2,28=1/1;
99//99;
2/9=110/2; 重新定位坐標,計算對稱性,檢查變量
3/6=3,11=1,16=1,25=1,30=1/1,2,3; 產生基組信息,計算積分
4/5=5,7=1,16=3/1; MO初猜
5/5=2,38=5/2; SCF迭代
7//1,2,3,16; 計算導數,處理優化和頻率的信息
1/18=20/3(-5); Berny優化(計算新坐標,判斷是否位移和力已收斂)
2/9=110/2;
6/7=2,8=2,9=2,10=2,19=2,28=1/1;
99/9=1/99;
Link會按照非標準路徑的書寫順序從上往下執行,即L101->L103->L202->L301->L302...,利用#P輸出的文件內的Enter...和Leave Link...提示就能驗證。在某些行末(但在分號之前)會看到括號標識,它表明完成當前層后如何跳轉,若值為n,當n>0表明要往后跳轉n+1次,當n<0表明要往前跳轉n次,默認是0,即按順序執行下一行而不跳轉。比如第8行1/18=20/3(3);說明這行執行結束后(當前位置仍在這行)向后跳4次,執行2/9=110/2;。倒數第四行1/18=20/3(-5);說明運行完L103之后往前跳5次,即接下來執行2/9=110/2;,這樣就形成了一個循環,反復計算新的電子積分、計算導數并移動坐標,構成了幾何優化的最主要過程。
跳轉指令一般都會被執行,但對于某些Link是否跳轉也取決于其執行結果,否則上述循環將無限進行下去。第一次調用L103后遇到的跳轉命令(3)只要當L103正常結束就會執行,所以一般都會跳過L9999,而不會因此直接結束任務。進入循環后,當循環內的L103發現位移和受力都已經收斂,就不再執行(-5)所示的跳轉命令,而是接著向下執行L202輸出當前坐標變量,然后運行L601輸出布居、多極矩等信息,最終到L9999結束任務。
4. 自定義計算路徑
上面的兩個非標準路徑的例子雖然名字含有“非標準”,但實際上Link的調用順序是標準的,是完成程序內設功能的默認流程。用戶也可以自己定制計算路徑,成為真正意義的“非標準”路徑。方法是使用nonstd關鍵字,然后在后面寫上非標準路徑。也可以結合#T、#P、oldconstant等設定,因為它們并不屬于非標準路徑涉及的設定,與nonstd沒有沖突。例如這是一個以HF/STO-3計算水分子的任務所對應的自定義計算路徑輸入文件:
%chk=C:\ltwd\h2o.chk
#P nonstd
1/38=1/1;
2/17=6,18=5,40=1/2;
3/11=9,16=1,25=1,30=1/1,2,3;
4//1;
5/5=2,32=1,38=5/2;
6/7=2,8=2,9=2,10=2,28=1/1;
99/5=1,9=1/99;
Title Card Required
0 1
O 0.00000000 0.00000000 -0.11094313
H -0.00000000 -0.78383672 0.44331313
H -0.00000000 0.78383672 0.44331313
我們可以以此為基礎修改。例如只想獲得距離矩陣及分子點群信息,不想干別的,只需要執行L202就可以了,于是非標準路徑只保留下面這三行:
1/38=1/1; 讀取標題和分子說明部分
2/17=6,18=5,40=1/2; 重新定位坐標,計算對稱性,檢查變量
99/5=1,9=1/99;
5. 自定義計算路徑應用實例
自定義計算路徑有一定實用價值。假設我們想獲取幾何優化中每步的Mulliken電荷,然而高斯默認的是只在內循環前后各調用一次L601,而不會每步都輸出一次電荷。想達成這個目的可以寫腳本提取優化任務的輸出文件中的結構,然后生成一堆單點輸入文件再批量執行,顯然這比較麻煩。利用自定義非標準路徑則容易得多,只需要把6/7=2,8=2,9=2,10=2,28=1/1;這行挪到內循環里面即可,上面的例子即改為:
前略...
7//1,2,3,16;
6/7=2,8=2,9=2,10=2,28=1/1; <---添加此行
1/18=20/3(-6); <---由于前面多加了一行,為了跳回原處,所以(-5)也改成了(-6)。
2/9=110/2;
后略...
當然也可以把此行寫在7//1,2,3,16;的前面,因為它們并不影響密度矩陣,所以結果一樣。但不應寫在5/5=2,38=5/2;之前,因為當前結構收斂的波函數此時尚未生成。也不能寫成:
...
1/18=20/3;
6/7=2,8=2,9=2,10=2,28=1/1(-6);
...
這樣的話會陷入無限循環,因為L601不能判斷什么時候不做跳轉。
再舉一個例子,在scan任務中獲得每一步的AIM鍵臨界點。先用testrt獲知scan關鍵字對應的是:
...前略
2/29=3/2;
3/11=9,16=1,25=1,30=1/1,2,3;
4/5=5,16=3/1;
5/5=2,38=5/2;
1/60=1/8(-4);
99/9=1/99;
再將aim關鍵字輸入testrt,可獲知在非標準路徑中與aim關鍵字有關的是6/7=2,8=2,9=2,10=2,28=1,35=4/1,9;,由于不打算運行L601,而且只有選項35對L609有意義,所以可以只寫6/35=4/9;。故改成下面這樣,并寫在# nonstd之后即可。
...前略
2/29=3/2;
3/11=9,16=1,25=1,30=1/1,2,3;
4/5=5,16=3/1;
5/5=2,38=5/2;
6/35=4/9;
1/60=1/8(-5);
99/9=1/99;
其中L108用來做勢能面掃描,當步數達到所設值時會忽略跳轉命令往下執行。
同理,利用上述方法結合IRC計算,還可以一次得到IRC路徑各點的Mayer鍵級(6/80=1),用腳本提取出來后就能繪制反應路徑上的鍵級變化曲線。
6. 與計算路徑相關的幾個選項
有兩個Link 0命令(寫在%行的設定)值得一提,可以結合非標準路徑使用。
%KJob Lxxx M 說明執行Lxxx M次之后停止任務,此選項方便直接地人為控制Link的調用。比如%kjob L502 3說明執行L502三次后立刻中斷任務,最后不會經過L9999。
%Subst Lxxx dir 從dir目錄下取得Lxxx.exe的執行文件,代替默認路徑下的同名Link執行文件。如果某個子程序自行修改過,有多個版本放在不同文件夾,可以用這個功能來指定調用哪個。如果需要同時指定多個Link的路徑,就寫多次這個條目依次指定。
還有幾個route section關鍵字也與執行路徑相關,雖然也可以直接用nonstd的方法實現相同功能,但直接用這些關鍵字有時更方便,免得把非標準路徑全寫出來。
Skip=M 跳過前M層。比如第一個例子若寫成# HF/STO-3G skip=5,則非標準路徑就只剩下了6/7=2,8=2,9=2,10=2,28=1/1; 和 99/5=1,9=1/99;。
Skip=Ovn 跳過overlay=n前面的層。如使用Skip=Ov4則第一個例子從4//1開始執行。
ExtraLinks=yyxx 每次yy層執行完畢后再執行一次Lyyxx。例如第三節的例子,如果寫成# HF/STO-3G opt ExtraLinks=607,則執行完L602就會接著執行L607(NBO分析),在非標準路徑上也能看到發生了改變,三處6/.../1;都變成了6/.../1,7。
ExtraOverlays 用了這個關鍵詞后,空一行后寫上執行內容(并且與標題行之間留一空行),則這行會被插入到overlay 9之前。例如第一個例子的輸入文件寫成:
# SP ExtraOverlays
2/9=1/2;
Title Card Required
...后略
從非標準路徑上就會看到,2/9=1/2;被插入到了99/5=1,9=1/99;的前面,所以任務臨結束前會調用一次L202。