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