1 将src下的所有.h 和.cpp文件copy到一个目录下,子文件夹下的文件全部拷出;
2 在VC中打开lammps.cpp,然后编译,建立project,然后把所有文件包含进去;
3 处理循环变量重定义;
4 处理FFT_DATA相关错误:在fft3d.h 文件的开头加入下列语句,
#ifndef FFT_NONE
#define FFT_NONE
#endif
5 input.cpp文件中,#include "unistd.h"在VC中没有,用direct.h代替;
6 关于timeval未定义的错误:这里使用的是单处理器,因此,在mpi.cpp 中会提示timeval未定义,将MPI_Wtime()代码删除,然后加上return 0.;
7 erfc函数:VC中没有该函数,必须自己编写.文后附有从网上找到的代码
8 程序命令行的处理:LAMMPS源程序默认用户从命令行输入命令,为了方便,我们可以直接指定文件,比如in.txt,在system.cpp中,将相应代码修改
80行 inflag=1
83行 iarg=2
175行 infile=fopen("in.txt","r"
然后编译,OK!
附误差函数:
double erfc(double x)
{
double temp;
if(x<0.0)
{
temp=1.0+gammp(0.5,x*x);
}
else
{
temp=gammq(0.5,x*x);
}
return temp;
}
double gammp(double a, double x)
{
double temp,gamser,gln,gammcf;
if(x<0.0 || a<=0.0)
{
cout<<"pause";
exit(1);
}
if(x
{
gser(gamser,a,x,gln);
temp=gamser;
}
else
{
gcf(gammcf,a,x,gln);
temp=1.0-gammcf;
}
return temp;
}
double gammq(double a, double x)
{
double temp,gamser,gammcf,gln;
if(x<0.0||a<=0.0)
{
cout<<"pause";
exit(1);
}
if(x
{
gser(gamser,a,x,gln);
temp=1.-gamser;
}
else
{
gcf(gammcf,a,x,gln);
temp=gammcf;
}
return temp;
}
void gser(double &gamser,double &a ,double &x,double &gln)
{
int itmax,n;
double ap,sum,del,eps;
itmax=100;
eps=0.0000003;
gln=gammln(a);
if(x<=0.0)
{
if(x<0.0)
{
cout<<"pause";
exit(1);
}
gamser=0.0;
//exit(1);
return;
}
ap=a;
sum=1.0/a;
del=sum;
for(n=1;n<=itmax;n++)
{
ap=ap+1.0;
del=del*x/ap;
sum+=del;
if(fabs(del)<(fabs(sum)*eps))
{
gamser=sum*exp(-x+a*log(x)-gln);
return;
}
}
}
void gcf(double &gammcf,double &a,double &x,double &gln)
{
int itmax,n;
double eps,a0,a1,b0,b1,fac,an,ana,anf,gold,g;
itmax=100;
eps=0.0000003;
gln=gammln(a);
gold=0.0;
a0=1.0;
a1=x;
b0=0.0;
b1=1.0;
fac=1.0;
for(n=1;n<=itmax;n++)
{
an=n;
ana=an-a;
a0=(a1+a0*ana)*fac;
b0=(b1+b0*ana)*fac;
anf=an*fac;
a1=x*a0+anf*a1;
b1=x*b0+anf*b1;
if(a!=0.0)
{
fac=1.0/a1;
g=b1*fac;
if(fabs((g-gold)/g)
{
gammcf=exp(-x+a*log(x)-gln)*g;
return;
}
gold=g;
}
}
}
double gammln(double xx)
{
int j;
float temp;
double cof[6]={76.18009173,-86.50532033,24.01409822,-1.231739516,0.00120858003,-0.00000536382},stp,half,one,fpf,x,tmp,ser;
stp=2.50662827465;
half=0.5;
one=1.0;
fpf=5.5;
x=xx-one;
tmp=x+fpf;
tmp=(x+half)*log(tmp)-tmp;
ser=one;
for(j=1;j<=6;j++)
{
x=x+one;
ser=ser+cof[j-1]/x;
}
temp=tmp+log(stp*ser);
return temp;
} |