径向分布函数
RDF实现算法
RDF是径向分布函数的Radical distribution function的缩写,指的是给定一个空间,在此空间以一个对象为中心,去寻找周围对象的的概率。对于分子模拟的径向分布函数实则也是求解粒子在周期性边界盒子的区域密度和全局密度的比值。
区域密度实则就是每一个球壳的数密度/球壳体积
全局密度实则就是盒子里面的粒子总数/盒子的体积
首先我们需要知道空间每一个粒子的坐标,即xyz坐标;然后选定盒子的几何中心为研究中心,则通过去计算已知i原子得到j原子的概率。算法核心在于如何寻找每一个球壳层的粒子数目。
C++代码演示RDF核心算法如下:
void Calculaterdf()
{//初始化参数
int num=molecules.size() ; %分子数目
double global_rho=num/a_length*b_length*c_length; %全局密度
double ix,iy,iz; % i分子的xyz坐标
double jx,jy,jz; %j分子的xyz坐标
double dx,dy,dz; %相邻分子对的xyz差值
//遍历计算
for(int i=0;i<num;i++)
{
%遍历以i分子为中心找j的分子的概率
ix=molecules[i]->molecule_x; %得到i分子的x坐标
iy=molecules[i]->molecule_y; %得到i分子的y坐标
iz=molecules[i]->molecule_z; %得到i分子的z坐标
for(int j=i+1;j<num;j++)
{
jx=molecules[j]->molecule_x; %得到j分子的x坐标
jy=molecules[j]->molecule_y; %得到j分子的y坐标
jz=molecules[j]->molecule_z; %得到j分子的z坐标
dx=jx-ix; %得到x的差值
dy=jy-ix; %得到y的差值
dz=jz-iz; %得到z的差值
dx=pbcDistance(dx,a_length); %通过周期性边界规范dx
dy=pbcDistance(dy,b_length); %通过周期性边界规范dy
dz=pbcDistance(dz,c_length); %通过周期性边界规范dz
d12=sqrt(dx*dx+dy*dy+dz*dz); %求得ij分子的空间距离
if(d12<rc)
{
int lane=(int)(d12/dr); %求得是在lane层球壳
gr[lane]++; %求得每一壳层搜索到的分子数目
}
}
%由于以上gr是粒子数目,必须要规整为区域密度/全局密度
for(int n=0;i<Ng;n++)
{
gr[n]=gr[n]/num ;
double volume=4*PI*pow((dr*n),2) *dr %第n层球壳的体积
gr[n]=gr[n]/volume; %得到第n层球壳的区域密度
gr[n]=gr[n]/global_rho %得到真正的gr()
}
}