Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
分子动力学程序的时间步长无关性 我在C++中使用一个NJ系统的LJ潜力编写一个基本的MD代码。启动配置为FCC,启动速度随机生成_C++_Simulation_Modeling - Fatal编程技术网

分子动力学程序的时间步长无关性 我在C++中使用一个NJ系统的LJ潜力编写一个基本的MD代码。启动配置为FCC,启动速度随机生成

分子动力学程序的时间步长无关性 我在C++中使用一个NJ系统的LJ潜力编写一个基本的MD代码。启动配置为FCC,启动速度随机生成,c++,simulation,modeling,C++,Simulation,Modeling,我面临一个奇怪的问题,因为系统的演化似乎与我实施的时间步长无关,据我所知,小时间步长的能量损失较小,而大时间步长的能量损失较大。但是,无论我运行(0.0001步)*(10000步)还是0.001*1000,在模拟结束时,我都会得到相同的能量结果 整个代码对我来说太大了,所以我在这里发布了我认为相关的内容,并省略了binning等,如果需要其他信息,请告诉我。我在网上查阅了无数的代码,虽然它们看起来和我的代码很相似,但我无法找出它们之间的区别以及我的错误所在 主cpp包含以下循环 for (int

我面临一个奇怪的问题,因为系统的演化似乎与我实施的时间步长无关,据我所知,小时间步长的能量损失较小,而大时间步长的能量损失较大。但是,无论我运行(0.0001步)*(10000步)还是0.001*1000,在模拟结束时,我都会得到相同的能量结果

整个代码对我来说太大了,所以我在这里发布了我认为相关的内容,并省略了binning等,如果需要其他信息,请告诉我。我在网上查阅了无数的代码,虽然它们看起来和我的代码很相似,但我无法找出它们之间的区别以及我的错误所在

主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
}
计算力势_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));

}
for(长i=0;iN;i++)
{
长原子p=i;
对于(长j=0;jr[atom_s][k]+neighlist[atom_p].xyz[j][k]*fromfile->L[k]);
//.xyz表示被视为真实或镜像的图像(如果是镜像,则在哪个方向)
}
disp2=功率(dist[0],2)+功率(dist[1],2)+功率(dist[2],2);
if(disp2c[atom_p];
int c2=fromfile->c[atom_s];
双倍长力温度;
disp=功率(disp2,0.5);
sig_r6=pow(运行参数->西格玛[c1-1][c2-1]/disp,6);/(西格玛/r)^6
sig_r8=pow(运行参数->西格玛[c1-1][c2-1]/disp,8);/(西格玛/r)^8
运行参数->pe[atom_p]+=(4*运行参数->ε[c1-1][c2-1]*((sig_r6*sig_r6)-sig_r6))-电势校正[c1-1][c2-1];
力温度=(-1*((48*运行参数->ε[c1-1][c2-1])/pow(运行参数->西格玛[c1-1][c2-1],2)*((西格玛r6*西格玛r8)-(西格玛r8)*0.5));
对于(int k=0;kforce[atom_p][k]+=force_temp*(-1*dist[k]);
}
}
}
//计算动能
运行参数->ke[atom_p]=0.5*(pow(从文件->v[atom_p][0],2)+pow(从文件->v[atom_p][1],2)+pow(从文件->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];
    }
}
for(长i=0;iN;i++)
{
对于(int j=0;jv[i][j]+=(dt*运行参数->力[i][j]);
}
}
for(长i=0;iN;i++)
{
对于(int j=0;jr[i][j]+=dt*fromfile->v[i][j];
}
}
不同的人如何实现velocity verlet可能略有不同,但我不知道如何获得独立于时间步长的结果

请帮忙。任何意见都将不胜感激
很抱歉,如果任何格式/标记错误,这是我第一次在此处发布

您能否发布包含此内容的循环的代码(每个“时间步”将运行一次的循环) thanks@MagikM18-我编辑了这篇文章,为每个时间步添加了主循环和声明,以表示发送的指针。谢谢。如果有什么不清楚,请告诉我。
dt
computed在哪里?dt-每个时间步的值/增量和t-时间步数都是用户输入。我打算以不同的方式运行1s-100步*0.01增量、1000*0.001、10000*0.0001等等,以更小的离散化时间获得更好的节能。我有点困惑,在相同的模拟总时间内,您是否得到相同的结果(例如,无论细分多少步,都是1秒)?
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];
    }
}