今回は、解析プログラムの非常に初歩的なことについて解説します。
分子座標の原子数の読み取り方です。
input ファイル
input ファイルの典型例を下に示します。
%chk=saple.chk # hf/3-21g geom=connectivity Title Card Required 0 1 C -2.50553506 -2.10376000 0.00119900 C -1.11037506 -2.10376000 0.00119900 C -0.41283706 -0.89600900 0.00119900 C -1.11049106 0.31250000 0.00000000 C -2.50531606 0.31242200 -0.00047900 C -3.20291706 -0.89578400 0.00051700 H -3.05529406 -3.05607700 0.00164900 H -0.56086706 -3.05627300 0.00251400 H 0.68684294 -0.89592900 0.00183300 H -3.05543806 1.26470300 -0.00143200 H -4.30252106 -0.89560100 0.00033700 C -0.33998699 1.64588796 -0.00008262 C -1.03764099 2.85439696 -0.00128162 C 1.05483697 1.64596664 0.00168463 C -0.34010287 4.06214788 -0.00143189 H -2.13732058 2.85431670 -0.00241856 C 1.75243649 2.85417361 0.00252999 H 1.60495899 0.69368563 0.00262183 C 1.05505532 4.06214907 0.00081499 H -0.88961146 5.01466127 -0.00200634 H 2.85203935 2.85399136 0.00412107 H 1.60481369 5.01446648 0.00114609 1 2 1.5 6 1.5 7 1.0 2 3 1.5 8 1.0 3 4 1.5 9 1.0 4 5 1.5 12 1.0 5 6 1.5 10 1.0 6 11 1.0 7 8 9 10 11 12 13 1.5 14 1.5 13 15 1.5 16 1.0 14 17 1.5 18 1.0 15 19 1.5 20 1.0 16 17 19 1.5 21 1.0 18 19 22 1.0 20 21 22
ポイントとなるのは、キーワードセクションの後と charge & spin の行の前に空行があること、座標の後ろに空行があることです。
分子座標の開始行は、2 つ目の空行の 2 行後です。
また、分子座標の最終行は、3 つ目の空行の 1 つ前の行です。
つまり、原子数は (3 つ目の空行)–(2 つ目の空行)- 2 となります。
これをプログラムで表現します。今回も C++ で例を示します。
// input ファイルの原子数を数えるプログラム。 #include<iostream> #include <fstream> using namespace std; int main(int argc, char *argv[]){ int *Blank_Line; Blank_Line = new int[4]; // 空行の行番号を記録する配列 string str; ifstream ifs(argv[1]); int l(0); int i(0); while(getline(ifs,str)){ l++; if(str == "// input ファイルの原子数を数えるプログラム。 #include<iostream> #include <fstream> using namespace std; int main(int argc, char *argv[]){ int *Blank_Line; Blank_Line = new int[4]; // 空行の行番号を記録する配列 string str; ifstream ifs(argv[1]); int l(0); int i(0); while(getline(ifs,str)){ l++; if(str == "\0"){ Blank_Line[i]=l; i++; }if(i==3)break; } int atom_number = Blank_Line[2] - Blank_Line[1] - 2; cout << "ファイル: " << argv[1] << "の原子数は" << atom_number << endl; delete[] Blank_Line; }"){ Blank_Line[i]=l; i++; }if(i==3)break; } int atom_number = Blank_Line[2] - Blank_Line[1] - 2; cout << "ファイル: " << argv[1] << "の原子数は" << atom_number << endl; delete[] Blank_Line; }
間違いなどございましたら、コメントにて教えていただけたら幸いです。
よろしくお願い致します。