分子动力学代码的时间步独立性

时间:2015-06-15 16:03:29

标签: c++ simulation modeling

我正在使用LJ潜在的NVE系统在C ++中编写基本的MD代码。起始配置是FCC,并且随机生成起始速度。

我面临一个奇怪的问题,即系统的演变似乎与我实施的时间步骤无关,我的理解是,对于小时间步长,能量损失较小,对于较大时间步长,能量损失较大。然而,无论是运行(0.0001步)*(10000步)还是0.001 * 1000等,我都会在模拟结束时获得相同的结果。

整个代码对我来说很重要,所以我发布了我认为相关的内容并省略了分类等,如果需要任何其他信息,请告诉我。我已经浏览了无数的在线代码,虽然它们看起来与我的相似,但我无法弄清楚差异是什么以及我哪里出错了。

主cpp包含以下循环

for (int i=0; i<t;i++)
{
    potential_calc(neighlist,fromfile, run_parameters,i);//calculating the force fields
    velverlet(neighlist,fromfile, run_parameters, bin, dt);//calculating the velocities
}

用于潜在计算的2 cpp文件的声明&amp; verlet集成

void potential_calc(neighborlist_type *neighlist, config_type *fromfile, potential *run_parameters, int t)

void velverlet(neighborlist_type *neighlist, config_type *fromfile, potential *run_parameters, bin_type *bin, double dt)

计算力的代码 - potential_calc.cpp低于

for (long i=0; i<fromfile->N; i++)
{
long atom_p=i;


for (long j=0; j<neighlist[i].countsn; j++)
    {

    long atom_s=neighlist[i].numb[j];

    for (int k=0; k<Dim; k++)
        {
        dist[k]= fromfile->r[atom_p][k] - (fromfile->r[atom_s][k] + neighlist[atom_p].xyz[j][k]*fromfile->L[k]);
//the .xyz indicates the image being considered real or mirror(if mirror then in which direction)
        }
    disp2 = pow(dist[0],2)+pow(dist[1],2)+pow(dist[2],2);
    if (disp2<rb2)
        {
        int c1=fromfile->c[atom_p];
        int c2=fromfile->c[atom_s];
        double long force_temp;
        disp=pow(disp2,0.5);

        sig_r6=pow(run_parameters->sigma[c1-1][c2-1]/disp,6);//(sigma/r)^6
        sig_r8=pow(run_parameters->sigma[c1-1][c2-1]/disp,8);//(sigma/r)^8

        run_parameters->pe[atom_p] += (4*run_parameters->epsilon[c1-1][c2-1]*((sig_r6*sig_r6)-sig_r6)) - potential_correction[c1-1][c2-1];

        force_temp=(-1*((48*run_parameters->epsilon[c1-1][c2-1])/pow(run_parameters->sigma[c1-1][c2-1],2)*((sig_r6*sig_r8)-((sig_r8)*0.5))));
        for (int k=0; k<Dim;k++)
            {
            run_parameters->force[atom_p][k]+=force_temp*(-1*dist[k]);
            }
        }
    }
//calculating kinetic energy
run_parameters->ke[atom_p] = 0.5*(pow(fromfile->v[atom_p][0],2)+pow(fromfile->v[atom_p][1],2)+pow(fromfile->v[atom_p][2],2));

}

一旦力计算完成,它将转到velverlet.cpp中的速度和位置的更新

for (long i=0; i<fromfile->N; i++)
{
for (int j=0; j<Dim; j++)
    {
    fromfile->v[i][j] += (dt*run_parameters->force[i][j]);
    }
}

for (long i=0; i<fromfile->N; i++)
{
for (int j=0; j<Dim; j++)
    {
    fromfile->r[i][j] += dt*fromfile->v[i][j];
    }
}

不同的人如何实现速度verlet可能会略有不同,但我无法弄清楚如何获得时间步长独立的结果。

请帮忙。任何输入都表示赞赏 很抱歉,如果任何格式/标记错误,这是我第一次发布此处

0 个答案:

没有答案