| ²é¿´: 1218 | »Ø¸´: 6 | |||
| µ±Ç°Ö÷ÌâÒѾ´æµµ¡£ | |||
zxzj05ÈÙÓþ°æÖ÷ (ÖøÃûдÊÖ)
|
[½»Á÷]
¡¾·ÖÏí¡¿Code for creating EAM potential
|
||
|
EAMÊÆº¯ÊýÊǽðÊôMDÄ£Äâ·Ç³£ÓÐÓõÄÊÆº¯Êý£¬ Æä´´½¨·½·¨¶àÖÖ¶àÑù£¬ ÏÖÔÚÌù³öÒ»¸öCÓïÑÔ³ÌÐò£¬ºÍ´ó¼Ò·ÖÏí£º ££££££££££££££££££££££££££££££££££ /* --------------------------------------------------------------- * Create Cu EAM potential file from Phys. Rev. B 63, 224106 * SMD, XMD and IMD format * * Compilation: g++ -DXXX -O mishincu.cpp -o mishincu * Here XXX=SMD/XMD/IMD * * Usage: ./mishincu * Then enter an inter number for the table size when prompted * Copyright Sunny Bird * sunzhmd@hotmail.com --------------------------------------------------------------- */ #include #include #include #include /* ============================================== Fitting parameter for Cu potential functions ============================================== */ #define rc 5.50679 #define h 0.50037 #define E1 201.458 #define E2 6.59288e-3 #define r01 0.83591 #define r02 4.46867 #define r03 -2.19885 #define r04 -2.61984e2 #define afa1 2.97758 #define afa2 1.54927 #define delta 0.86225e-2 #define rs1 2.24000 #define rs2 1.80000 #define rs3 1.20000 #define S1 4.00000 #define S2 40.00000 #define S3 1.15000e3 #define a 3.80362 #define beta1 0.17394 #define beta2 5.35661e2 #define F0 -2.28235 #define F2 1.35535 #define q1 -1.27775 #define q2 -0.86074 #define q3 1.78804 #define q4 2.97571 #define Q1 0.40000 #define Q2 0.30000 /* ================================== constants for differential function ================================== */ #define CON 1.4 #define CON2 (CON*CON) #define BIG 1.0e30 #define NTAB 200 #define SAFE 2.0 double matrix[NTAB][NTAB]; /* ========================= Mcros ========================= */ #define SEP ", \t\n" #define FMAX(x,y) ((x>y)?(x) y)) /* =========================== Local subroutine prototype =========================== */ static double dfridr(double (*func)(double), double, double, double *); static double pairfun(double); static double denfun(double); static double embfun(double); int main( ) { FILE *fp; int n, nTable; #if defined(SMD) || defined(XMD) double rMin; double deltaR; #elif defined(IMD) double r2Min, r2c; double deltaR2; double rr; #endif double rhoMax, deltaRho; double r, rho; double fpair, fden, femb; #ifdef SMD double dpair, dden, demb; double errpair, errden, erremb; #endif /* ========================================= Set parameter for tables ========================================= */ fprintf(stdout, " >>> Please input the size of the potential table to be created:"); scanf("%d", &nTable); fprintf(stdout, " - Thank you!\n\n"); #if defined(SMD) || defined(XMD) rMin=1.0; deltaR=(rc-rMin)/((double)(nTable-1)); #elif defined(IMD) r2Min=1.0; r2c=rc*rc; deltaR2=(r2c-r2Min)/((double)(nTable-1)); #endif rhoMax=2.0; deltaRho=rhoMax/((double)(nTable-1)); #if defined(SMD) || defined(XMD) if( (fp=fopen("cu.pot", "w"))==NULL) { fprintf(stderr, " ***ERROR: Cannot create potential file cu.pot!***\n"); fprintf(stderr, " ---Location is line %d in file %s\n", __LINE__, __FILE__); exit(1); } #elif defined(IMD) if( (fp=fopen("cu.pair", "w"))==NULL) { fprintf(stderr, " ***ERROR: Cannot create pair potential file in IMD format!***\n"); fprintf(stderr, " ---Location is line %d in file %s\n", __LINE__, __FILE__); exit(1); } #else fprintf(stderr, " ***ERROR: Please specify potential file format! ***\n"); fprintf(stderr, " ---Location is line %d in file %s\n", __LINE__, __FILE__); exit(1); #endif /* =============================== Potential file header =============================== */ #if defined(SMD) fprintf(fp, " -------------------------------------------\n"); fprintf(fp, " Cu EAM potential, Phys. Rev. B 63, 224106\n"); fprintf(fp, " -------------------------------------------\n"); fprintf(fp, " %5d %16.8e %16.8e %16.8e\n", nTable, rMin, rc, rhoMax); #elif defined(XMD) fprintf(fp, "# -------------------------------------------\n"); fprintf(fp, "# Cu EAM potential, Phys. Rev. B 63, 224106\n"); fprintf(fp, "# -------------------------------------------\n"); fprintf(fp, "potential set eam 1\n"); fprintf(fp, "eunit ev\n"); fprintf(fp, "POTENTIAL PAIR 1 1 %d %16.8e %16.8e\n", nTable, rMin, rc); #elif defined(IMD) fprintf(fp, "## -------------------------------------------\n"); fprintf(fp, "## Cu EAM potential, Phys. Rev. B 63, 224106\n"); fprintf(fp, "## -------------------------------------------\n"); fprintf(fp, "#F 2 1\n"); fprintf(fp, "#E\n"); fprintf(fp, "%16.8e %16.8e %16.8e\n", r2Min, r2c, deltaR2); #endif /* ============================= Create pair potential table ============================= */ #if defined(SMD) || defined(XMD) r=rMin; #elif defined(IMD) rr=r2Min; #endif for(n=0; n #if defined(SMD) || defined(XMD) fpair=pairfun(r); #elif defined(IMD) r=sqrt(rr); fpair=pairfun(r); #endif #if defined(SMD) dpair=dfridr(pairfun, r, deltaR*5, &errpair); fden=denfun(r); dden=dfridr(denfun, r, deltaR*5, &errden); if(fabs(errpair)/fabs(dpair)<1e-0 && fabs(errden)/fabs(dden)<1e-0) { fprintf(fp, "%16.8e %16.8e %16.8e %16.8e\n", fpair, fden, dpair/r, dden/r); /* !!! This line defines the format of the potential file !!! */ } else { fprintf(stderr, " ***ERROR: Too big relative error for pairwise functions!***\n"); fprintf(stderr, " %10.7f %16.8e %16.8e %16.8e %16.8e\n", r, fabs(errpair)/fabs(dpair), fabs(errden)/fabs(dden), dpair, dden); fprintf(stderr, " ---Location is line %d in file %s\n", __LINE__, __FILE__); exit(1); } #elif defined(XMD) || defined(IMD) fprintf(fp, "%16.8e\n",fpair); #endif #if defined(SMD) || defined(XMD) r+=deltaR; #elif defined(IMD) rr+=deltaR2; #endif } /* ================================ Create electron density table ================================ */ #if defined(XMD) fprintf(fp, "POTENTIAL DENS 1 %d %16.8e %16.8e\n", nTable, rMin, rc); #elif defined(IMD) fclose(fp); if( (fp=fopen("cu.den", "w"))==NULL) { fprintf(stderr, " ***ERROR: Cannot create electron density file in IMD format!***\n"); fprintf(stderr, " ---Location is line %d in file %s\n", __LINE__, __FILE__); exit(1); } fprintf(fp, "## -------------------------------------------\n"); fprintf(fp, "## Cu EAM potential, Phys. Rev. B 63, 224106\n"); fprintf(fp, "## -------------------------------------------\n"); fprintf(fp, "#F 2 1\n"); fprintf(fp, "#E\n"); fprintf(fp, "%16.8e %16.8e %16.8e\n",r2Min, r2c,deltaR2); #endif #if defined(XMD) r=rMin; #elif defined(IMD) rr=r2Min; #endif for(n=0; n #if defined(XMD) fden=denfun(r); #elif defined(IMD) r=sqrt(rr); fden=denfun(r); #endif fprintf(fp,"%16.8e\n",fden); #if defined(XMD) r+=deltaR; #elif defined(IMD) rr+=deltaR2; #endif } /* =============================== Create embedding energy table =============================== */ #if defined(XMD) fprintf(fp, "POTENTIAL EMBED 1 %d %16.8e %16.8e\n", nTable, 0.0, rhoMax); #elif defined(IMD) fclose(fp); if( (fp=fopen("cu.emb", "w"))==NULL) { fprintf(stderr, " ***ERROR: Cannot create embedding energy file in IMD format!***\n"); fprintf(stderr, " ---Location is line %d in file %s\n", __LINE__, __FILE__); exit(1); } fprintf(fp, "## -------------------------------------------\n"); fprintf(fp, "## Cu EAM potential, Phys. Rev. B 63, 224106\n"); fprintf(fp, "## -------------------------------------------\n"); fprintf(fp, "#F 2 1\n"); fprintf(fp, "#E\n"); fprintf(fp, "%16.8e %16.8e %16.8e\n",0.0, rhoMax, deltaRho); #endif rho=0.0; for(n=0; n femb=embfun(rho); #if defined(SMD) demb=dfridr(embfun, rho, deltaRho*10, &erremb); if(fabs(erremb)/fabs(demb)<1e-0) { fprintf(fp, "%16.8e %16.8e\n", femb, demb);/* !!! This line defines the format of the potential file !!! */ } else { printf(" ***ERROR: Too big relative error for eam function!***\n"); printf(" %10.7f %16.8e %16.8e\n", rho, fabs(erremb)/fabs(demb), demb); exit(1); } #elif defined(XMD) || defined (IMD) fprintf(fp, "%16.8e\n",femb); #endif rho+=deltaRho; } fclose(fp); return 0; } /* =============================== Subroutine to calculate numeric direvatie =============================== */ double dfridr(double (*func)(double), double x, double dx, double *err) { int i,j; double errt,fac,ans; if (dx == 0.0) { printf(" ***ERROR: dx must be non-zero!***\n"); exit(1); } matrix[1][1]=((*func)(x+dx)-(*func)(x-dx))/(2.0*dx); *err=BIG; for (i=2;i<=NTAB;i++) { dx /= CON; matrix[1]=((*func)(x+dx)-(*func)(x-dx))/(2.0*dx); fac=CON2; for (j=2;j<=i;j++) { matrix[j]=(matrix[j-1]*fac-matrix[j-1][i-1])/(fac-1.0); fac=CON2*fac; errt=FMAX(fabs(matrix[j]-matrix[j-1]),fabs(matrix[j]-matrix[j-1][i-1])); if (errt <= *err) { *err=errt; ans=matrix[j]; } } if (fabs(matrix-matrix[i-1][i-1]) >= SAFE*(*err)) { break; } } return ans; } /* ================================= Cu Pair Potential function ================================= */ static double pairfun(double r) { double morse1, morse2; double psi; double tempair; double x; morse1=exp(-2.0*afa1*(r-r01))-2.0*exp(-afa1*(r-r01)); morse2=exp(-2.0*afa2*(r-r02))-2.0*exp(-afa2*(r-r02)); x=(r-rc)/h; if(x<0) { psi=pow(x,4.0)/(1.0+pow(x,4.0)); } else { psi=0; } if(r tempair=S1*pow(rs1-r,4.0)+S2*pow(rs2-r,4.0)+S3*pow(rs3-r,4.0); } else if(r tempair=S1*pow(rs1-r,4.0)+S2*pow(rs2-r,4.0); } else if(r tempair=S1*pow(rs1-r,4.0); } else { tempair=0; } tempair=-tempair+(E1*morse1+E2*morse2+delta)*psi; return tempair; } /* =============================== Cu Electronic Dencity Function =============================== */ static double denfun(double r) { double tmpden; double psi; double x; tmpden=a*exp(-beta1*(r-r03)*(r-r03))+exp(-beta2*(r-r04)); x=(r-rc)/h; if(x<0) { psi=pow(x,4.0)/(1.0+pow(x,4.0)); } else { psi=0; } tmpden*=psi; return tmpden; } /* ==================================== Cu Embedding Function ==================================== */ static double embfun(double den) { double tmpemb;; tmpemb=F0+0.5*F2*(den-1.0)*(den-1.0); if(den<=1.0) { tmpemb=tmpemb +q1*pow(den-1.0,3.0) +q2*pow(den-1.0,4.0) +q3*pow(den-1.0,5.0) +q4*pow(den-1.0,6.0); } else { tmpemb=tmpemb+q1*pow(den-1.0,3.0)+Q1*pow(den-1.0,4.0); tmpemb=tmpemb/(1.0+Q2*pow(den-1.0,3.0)); } return tmpemb; } [ Last edited by lei0736 on 2009-11-25 at 13:49 ] |
» ²ÂÄãϲ»¶
»ï°éÃÇ£¬×£ÎÒÉúÈÕ¿ìÀÖ°É
ÒѾÓÐ26È˻ظ´
»úеר˶325£¬Ñ°ÕÒµ÷¼ÁԺУ
ÒѾÓÐ4È˻ظ´
333Çóµ÷¼Á
ÒѾÓÐ7È˻ظ´
¿¼Ñл¯Ñ§Ñ§Ë¶µ÷¼Á£¬Ò»Ö¾Ô¸985
ÒѾÓÐ4È˻ظ´
0854¿ØÖƹ¤³Ì 359Çóµ÷¼Á ¿É¿çרҵ
ÒѾÓÐ9È˻ظ´
Áº³ÉΰÀÏʦ¿ÎÌâ×é»¶ÓÄãµÄ¼ÓÈë
ÒѾÓÐ9È˻ظ´
»¯Ñ§µ÷¼Á0703
ÒѾÓÐ8È˻ظ´
»·¾³¹¤³Ìµ÷¼Á
ÒѾÓÐ6È˻ظ´
326Çóµ÷¼Á
ÒѾÓÐ7È˻ظ´
Ò»Ö¾Ô¸985£¬±¾¿Æ211£¬0817»¯Ñ§¹¤³ÌÓë¼¼Êõ319Çóµ÷¼Á
ÒѾÓÐ5È˻ظ´

043114076
ľ³æ (ÕýʽдÊÖ)
- Ó¦Öú: 49 (СѧÉú)
- ½ð±Ò: 3364.9
- É¢½ð: 52
- ºì»¨: 23
- Ìû×Ó: 788
- ÔÚÏß: 369.5Сʱ
- ³æºÅ: 570592
- ×¢²á: 2008-06-07
- ÐÔ±ð: GG
- רҵ: ÀíÂۺͼÆË㻯ѧ
2Â¥2009-06-14 00:23:00
wuchenwf
ÈÙÓþ°æÖ÷ (Ö°Òµ×÷¼Ò)
- Ó¦Öú: 0 (Ó×¶ùÔ°)
- ¹ó±ö: 3.433
- ½ð±Ò: 19419.2
- É¢½ð: 10
- ºì»¨: 4
- Ìû×Ó: 3560
- ÔÚÏß: 1035.7Сʱ
- ³æºÅ: 398569
- ×¢²á: 2007-06-10
- ÐÔ±ð: GG
- רҵ: Äý¾Û̬ÎïÐÔI:½á¹¹¡¢Á¦Ñ§ºÍ
- ¹ÜϽ: µÚÒ»ÐÔÔÀí
3Â¥2009-06-15 23:46:27
![]() |
4Â¥2009-08-27 16:58:30
cxz314
ľ³æ (ÕýʽдÊÖ)
- Ó¦Öú: 1 (Ó×¶ùÔ°)
- ¹ó±ö: 0.2
- ½ð±Ò: 3815.1
- É¢½ð: 993
- ºì»¨: 1
- Ìû×Ó: 997
- ÔÚÏß: 189Сʱ
- ³æºÅ: 475745
- ×¢²á: 2007-12-07
- ÐÔ±ð: GG
- רҵ: Äý¾Û̬ÎïÐÔI:½á¹¹¡¢Á¦Ñ§ºÍ
5Â¥2009-08-28 11:03:56
huangyc
ľ³æ (ÕýʽдÊÖ)
- Ó¦Öú: 2 (Ó×¶ùÔ°)
- ½ð±Ò: 2242.1
- É¢½ð: 12
- ºì»¨: 2
- Ìû×Ó: 411
- ÔÚÏß: 312.5Сʱ
- ³æºÅ: 624241
- ×¢²á: 2008-10-12
- רҵ: ÀíÂۺͼÆË㻯ѧ
6Â¥2009-09-09 15:19:30
bawdy
гæ (СÓÐÃûÆø)
- Ó¦Öú: 2 (Ó×¶ùÔ°)
- ½ð±Ò: 1448.5
- Ìû×Ó: 263
- ÔÚÏß: 59.1Сʱ
- ³æºÅ: 283442
- ×¢²á: 2006-10-08
- רҵ: ½ðÊô²ÄÁϵÄÄ¥ËðÓëĥʴ
7Â¥2009-09-10 10:21:24













»Ø¸´´ËÂ¥
