分子座標の原子数の読み取り方

今回は、解析プログラムの非常に初歩的なことについて解説します。

分子座標の原子数の読み取り方です。

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; }

間違いなどございましたら、コメントにて教えていただけたら幸いです。
よろしくお願い致します。

コメントを残す(投稿者名のみ必須)