我想计算C ++中文件中原子的均方位移。我有一个文件,其中每个时间步骤中的原子位置写成如下所示,其中1..5列分别表示该原子的时间步长,原子和x,y,z坐标。
Timestep = 0000000
0000000 Fe 0 0 0
0000000 Fe 0 1 0
...... .. .. .. ..
Timestep = 1000000
1000000 Fe 0 0 1
1000000 Fe 0 0 2
....... .. .. .. ..
And so on...
我想要的是原子的矢量差异的长度和时间差,然后在一个单独的文件中计算MSD(比如说' msd.txt'),其中第一列将是这个特定的情况1000000和第二列将是([001-000] ^ 2 + [002 010] ^ 2)/ 2,即原子位移的平方。单个原子的位移只是单个原子的矢量差的长度。在这种情况下,第一原子从[000]位置移动到[001]位置。一个简单的C ++代码在这方面真的很有用,因为我是C ++的新手。我已经为此编写了一个示例代码,如下所示:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int Natoms = 16; //Number of atoms
double length() const // computes the length of the vector
{
return sqrt(x * x + y * y + z * z);
}
int main ()
{
ofstream oFile("msd.txt");
oFile << "# time msd" << endl;
vector<vector<double> > table; // stores 'dr' for all the atoms and different time steps
for (int t = 0; t < MaxSteps; t++)
{
timestep = 1000
ct = (t+1)*timestep;
vector<double> column;
vector<double> rt; vector<double> r0;
for (int i = 0; i < Natoms; i++)
{
double dr = rt[iTarget] - r0[iOrigin];
double dr2 = dr * dr;
column.push_back(dr2);
}
double sum_of_dr2 = 0. ; double MSD = 0. ;
for(std::vector<double>::iterator it = column.begin(); it != column.end(); ++it)
sum_of_dr2 += *it;
MSD = sum_of_dr2 * (1./(double)Natoms);
table.push_back(column);
oFile << ct << "\t" << MSD << endl;
}
oFile.close();
return 0;
}
但我不知道如何从给定文件中读取,以便我可以为示例代码中length
中存储的每个原子提供dr
向量差异。在时间步长1000000之后,第一和第二原子的向量的length
将是sqrt((0-0)^ 2 +(0-0)^ 2 +(0-1)^ 2)和sqrt( (0-0)^ 2 +(0-0)^ 2 +(0-2)^ 2)resp。这些数据应该存储在dr[i]
(比如)i
= 1,2,...中,N是原子的数量。