如何计算C ++中文件的均方位移?

时间:2016-11-09 15:55:01

标签: c++

我想计算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是原子的数量。

0 个答案:

没有答案