00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "swsige.h"
00010
00011 void SWFrame::initvars()
00012 {
00013
00014 #ifdef _SW_ORIG
00015
00016 aa_si=15.27991323; bb_si=11.60319228; plam_si=45.51575;
00017 pgam_si=2.51412; acut_si=3.77118; pss_si=2.0951;
00018 #else
00019
00020 aa_si=16.31972277; bb_si=11.60319228; plam_si=48.61499998;
00021 pgam_si=2.51412; acut_si=3.77118; pss_si=2.0951;
00022 #endif
00023
00024
00025
00026 aa_ge=13.60564361; bb_ge=13.62639971; plam_ge=59.83;
00027 pgam_ge=2.6172; acut_ge=3.9258; pss_ge=2.181;
00028
00029 rho=4.0;
00030
00031 acut=acut_ge;
00032 _RLIST=acut*1.2;
00033
00034 _SKIN=_RLIST-acut;
00035 rho1=rho+1; acutsq=acut*acut;
00036
00037 strcpy(incnfile,"../si.cn");
00038 DUMP(HIG"SWFrame initvars"NOR);
00039 MDPARALLELFrame::initvars();
00040 }
00041
00042 void SWFrame::stillinger_weber()
00043 {
00044 #ifndef NNM
00045 #define NNM 60
00046 #endif
00047
00048 double aa, bb, pgam, pss, acut_sp;
00049 double plam_i, pgam_ij, pgam_ik;
00050 int i,j,k,ipt,jpt,kpt;
00051 int neg;
00052 Vector3 sij,rij,f3i,f3j,f3k,f2;
00053 Vector3 rg[NNM],rt[NNM];
00054 double rr[NNM],ri[NNM],rdi[NNM],rdi2[NNM],xpon[NNM],xpon2[NNM];
00055 int list2[NNM];
00056 double r2ij,rrij;
00057 double ang,tm1,tm2,tm3,dhij,dhik,dhmu,tmij,tmik,tm2ij,tm2ik,
00058 tm3ik,tm3ij,eterm,tote3,au,pplm,ff2,eterm2,tote2;
00059 int n0, n1;
00060
00061 DUMP("SW");
00062
00063 refreshneighborlist();
00064
00065
00066 _EPOT=0;tote2=tote3=0;
00067 for(i=0;i<_NP;i++)
00068 { _F[i].clear(); _EPOT_IND[i]=0;}
00069 _VIRIAL.clear();
00070
00071
00072
00073
00074 n0=0;
00075 n1=_NP;
00076
00077 for(ipt=n0;ipt<n1;ipt++)
00078 {
00079
00080 if(fixed[ipt]==-1) continue;
00081 neg=0;
00082
00083 if(species[ipt]==0)
00084 plam_i=plam_si;
00085 else
00086 plam_i=plam_ge;
00087
00088 for(j=0;j<nn[ipt];j++)
00089 {
00090 jpt=nindex[ipt][j];
00091
00092 if(fixed[jpt]==-1) continue;
00093
00094
00095 sij.subtract(_SR[jpt],_SR[ipt]);
00096 sij.subint();
00097
00098 _H.multiply(sij,rij);
00099
00100 if((species[ipt]==0)&&(species[jpt]==0))
00101 {
00102 pgam=pgam_si; pss=pss_si; acut_sp = acut_si;
00103 }
00104 else if((species[ipt]==1)&&(species[jpt]==1))
00105 {
00106 pgam=pgam_ge; pss=pss_ge; acut_sp = acut_ge;
00107 }
00108 else
00109 {
00110 pgam=(pgam_ge+pgam_si)/2; pss=(pss_ge+pss_si)/2;
00111 acut_sp = (acut_si+acut_ge)/2;
00112 }
00113
00114 r2ij=rij.norm2();
00115 rrij=sqrt(r2ij);
00116
00117 if(r2ij>acut_sp*acut_sp) continue;
00118
00119 rg[neg]=rij;
00120
00121 rt[neg]=rij; rt[neg]/=rrij;
00122 rr[neg]=rrij;
00123 ri[neg]=1./rrij;
00124
00125 rdi[neg]=1./(rrij-acut_sp);
00126 rdi2[neg]=rdi[neg]*rdi[neg];
00127
00128 if(fabs(pgam*rdi[neg])>30) xpon[neg]=0;
00129 else xpon[neg]=exp(pgam*rdi[neg]);
00130 if(fabs(pss*rdi[neg])>30) xpon2[neg]=0;
00131 else xpon2[neg]=exp(pss*rdi[neg]);
00132 list2[neg]=jpt;
00133 neg++;
00134 }
00135
00136
00137
00138
00139
00140
00141 for(j=0;j<neg;j++)
00142 {
00143
00144 jpt=list2[j];
00145
00146 if((species[ipt]==0)&&(species[jpt]==0))
00147 {
00148 pgam_ij=pgam_si;
00149 }
00150 else if((species[ipt]==1)&&(species[jpt]==1))
00151 {
00152 pgam_ij=pgam_ge;
00153 }
00154 else
00155 {
00156 pgam_ij=(pgam_ge+pgam_si)/2;
00157 }
00158
00159
00160 if(fixed[jpt]==-1) continue;
00161
00162 for(k=j+1;k<neg;k++)
00163 {
00164 kpt=list2[k];
00165
00166 if((species[ipt]==0)&&(species[kpt]==0))
00167 {
00168 pgam_ik=pgam_si;
00169 }
00170 else if((species[ipt]==1)&&(species[kpt]==1))
00171 {
00172 pgam_ik=pgam_ge;
00173 }
00174 else
00175 {
00176 pgam_ik=(pgam_ge+pgam_si)/2;
00177 }
00178
00179
00180 if(fixed[kpt]==-1) continue;
00181 ang=rg[j]*rg[k]/(rr[j]*rr[k]);
00182 tm1=ang+1./3.;
00183
00184 tm2=plam_i*tm1*tm1;
00185 tm3=xpon[j]*xpon[k];
00186
00187 eterm=tm2*tm3;
00188
00189 dhij=-1.*tm2*pgam_ij*rdi[j]*rdi[j]*tm3;
00190
00191
00192 dhik=-1.*tm2*pgam_ik*rdi[k]*rdi[k]*tm3;
00193 dhmu=2.*plam_i*tm3*tm1;
00194
00195 tmij=dhij+dhmu*(ri[k]-ang*ri[j]);
00196 tmik=dhik+dhmu*(ri[j]-ang*ri[k]);
00197 tm2ij=-dhij+dhmu*ang*ri[j];
00198 tm2ik=-dhmu*ri[j];
00199 tm3ik=-dhik+dhmu*ang*ri[k];
00200 tm3ij=-dhmu*ri[k];
00201
00202
00203 f3i.clear();f3i.addnv(tmij,rt[j]);f3i.addnv(tmik,rt[k]);
00204 _F[ipt]+=f3i;
00205
00206
00207 f3j.clear();f3j.addnv(tm2ij,rt[j]);f3j.addnv(tm2ik,rt[k]);
00208 _F[jpt]+=f3j;
00209
00210
00211 f3k.clear();f3k.addnv(tm3ik,rt[k]);f3k.addnv(tm3ij,rt[j]);
00212 _F[kpt]+=f3k;
00213
00214 if(fixedatomenergypartition==0)
00215 {
00216 _VIRIAL.addnvv(1.,f3j,rg[j]);
00217 _VIRIAL.addnvv(1.,f3k,rg[k]);
00218 }
00219 else
00220 {
00221 if(!(fixed[ipt]||fixed[jpt]))
00222 _VIRIAL.addnvv(1.,f3j,rg[j]);
00223 else if(!(fixed[ipt]&&fixed[jpt]))
00224 _VIRIAL.addnvv(0.5,f3j,rg[j]);
00225 if(!(fixed[ipt]||fixed[kpt]))
00226 _VIRIAL.addnvv(1.,f3k,rg[k]);
00227 else if(!(fixed[ipt]&&fixed[kpt]))
00228 _VIRIAL.addnvv(0.5,f3k,rg[k]);
00229 }
00230
00231
00232
00233
00234 if(fixedatomenergypartition==0)
00235 {
00236 tote3+=eterm;
00237 }
00238 else
00239 {
00240 if(!(fixed[ipt]&&fixed[jpt]&&fixed[kpt]))
00241 tote3+=eterm;
00242
00243
00244 }
00245 _EPOT_IND[ipt]+=eterm/3;
00246 _EPOT_IND[jpt]+=eterm/3;
00247 _EPOT_IND[kpt]+=eterm/3;
00248 }
00249
00250
00251 if(!Bond(ipt,jpt)) continue;
00252 if((species[ipt]==0)&&(species[jpt]==0))
00253 {
00254 aa=aa_si; bb=bb_si; pss=pss_si;
00255 }
00256 else if((species[ipt]==1)&&(species[jpt]==1))
00257 {
00258 aa=aa_ge; bb=bb_ge; pss=pss_ge;
00259 }
00260 else
00261 {
00262 aa=(aa_ge+aa_si)/2; bb=(bb_ge+bb_si)/2; pss=(pss_ge+pss_si)/2;
00263 }
00264 au=aa*xpon2[j];
00265 pplm=pss*(bb*pow(ri[j],rho)-1.);
00266 ff2=au*(rho*bb*pow(ri[j],rho1)+pplm*rdi2[j]);
00267
00268 f2.clear();f2.addnv(ff2,rt[j]);
00269
00270 _F[ipt]-=f2;
00271 _F[jpt]+=f2;
00272
00273 eterm2=aa*(bb*pow(ri[j],rho)-1.)*xpon2[j];
00274
00275
00276 if(fixedatomenergypartition==0)
00277 {
00278 tote2+=eterm2;
00279 }
00280 else
00281 {
00282 if(!(fixed[ipt]&&fixed[jpt]))
00283 tote2+=eterm2;
00284 }
00285
00286
00287 _EPOT_IND[ipt]+=eterm2/2;
00288 _EPOT_IND[jpt]+=eterm2/2;
00289
00290 if(fixedatomenergypartition==0)
00291 {
00292 _VIRIAL.addnvv(1.,f2,rg[j]);
00293 }
00294 else
00295 {
00296 if(!(fixed[ipt]||fixed[jpt]))
00297 _VIRIAL.addnvv(1.,f2,rg[j]);
00298 else if(!(fixed[ipt]&&fixed[jpt]))
00299 _VIRIAL.addnvv(0.5,f2,rg[j]);
00300
00301 }
00302 }
00303 }
00304 _EPOT=tote2+tote3;
00305
00306
00307 for(i=0;i<_NP;i++)
00308 {
00309 if(fixed[i])
00310 _F[i].clear();
00311 }
00312
00313 DUMP("SW complete");
00314 }
00315
00316
00317
00318 void SWFrame::potential()
00319 {
00320 stillinger_weber();
00321 }
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333 #ifdef _TEST
00334
00335
00336 class SWFrame sim;
00337
00338
00339 #include "main.cpp"
00340
00341 #endif//_TEST
00342