00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "silica-bksmod.h"
00012
00013 void BKSFrame::initparser()
00014 {
00015 MDPARALLELFrame::initparser();
00016
00017
00018 bindvar("ALPHA_BKS",&_ALPHA_BKS,DOUBLE);
00019 }
00020
00021 int BKSFrame::exec(char *name)
00022 {
00023 if(MDPARALLELFrame::exec(name)==0) return 0;
00024 bindcommand(name,"initBKS",initBKS());
00025 return -1;
00026 }
00027
00028 void BKSFrame::initvars()
00029 {
00030 initBKS();
00031
00032 _RLIST=BKS_RC+1.1;
00033 _SKIN=_RLIST-BKS_RC;
00034 MDPARALLELFrame::initvars();
00035 }
00036
00037 void BKSFrame::initBKS()
00038 {
00039 _A_00 = 0; _B_00 = 0; _C_00 = 0;
00040 _A_01 = 18003.7572;
00041 _B_01 = 4.87318;
00042 _C_01 = 133.5381;
00043 _A_11 = 1388.7730;
00044 _B_11 = 2.760;
00045 _C_11 = 175.00;
00046 _Q_0 = 2.4;
00047 _Q_1 =-1.2;
00048
00049 BKS_RC = 8.0;
00050
00051
00052
00053 _ALPHA_BKS = 0.192;
00054
00055
00056 _ALPHA_BKS = 0.5;
00057
00058
00059 _EPS_00 = 1219.45 *1e3/P_E/N_A;
00060 _SIG_00 = 0.42;
00061 _EPS_01 = 1.083 *1e3/P_E/N_A;
00062 _SIG_01 = 1.31;
00063 _EPS_11 = 0.0344 *1e3/P_E/N_A;
00064 _SIG_11 = 2.20;
00065
00066 #if 0
00067 _EPS_00 = _EPS_01 = _EPS_11 = 0.0;
00068 #endif
00069 }
00070
00071 void BKSFrame::calcprop()
00072 {
00073 MDPARALLELFrame::calcprop();
00074 }
00075
00076 void BKSFrame::bks_mod()
00077 {
00078
00079
00080
00081
00082
00083
00084 int i,j,ipt,jpt;
00085 double U,r,r2,ri6;
00086 double Aij,Bij,Cij,SIGij,EPSij,QiQj;
00087 double SIG2, SIG6, SIG_ri6, SIG_ri12, SIG_ri24, U_coulomb, tmp;
00088 Vector3 sij, rij, fij;
00089
00090 DUMP(HIG"Lennard Jones"NOR);
00091
00092 refreshneighborlist();
00093
00094 _EPOT=0;
00095
00096 for(i=0;i<_NP;i++)
00097 {_F[i].clear(); _EPOT_IND[i]=0;}
00098 _VIRIAL.clear();
00099
00100 for(ipt=0;ipt<_NP;ipt++)
00101 {
00102 for(j=0;j<nn[ipt];j++)
00103 {
00104 jpt=nindex[ipt][j];
00105 if(ipt>jpt) continue;
00106 sij=_SR[jpt]-_SR[ipt];
00107 sij.subint();
00108 rij=_H*sij;
00109 r2=rij.norm2();
00110 r=sqrt(r2);
00111 if(r<=BKS_RC)
00112 {
00113 if((species[ipt]==0)&&(species[jpt]==0))
00114 {
00115 Aij = _A_00; Bij = _B_00; Cij = _C_00;
00116 SIGij = _SIG_00; EPSij = _EPS_00;
00117 QiQj = _Q_0*_Q_0;
00118 }
00119 else if((species[ipt]==1)&&(species[jpt]==1))
00120 {
00121 Aij = _A_11; Bij = _B_11; Cij = _C_11;
00122 SIGij = _SIG_11; EPSij = _EPS_11;
00123 QiQj = _Q_1*_Q_1;
00124 }
00125 else
00126 {
00127 Aij = _A_01; Bij = _B_01; Cij = _C_01;
00128 SIGij = _SIG_01; EPSij = _EPS_01;
00129 QiQj = _Q_0*_Q_1;
00130 }
00131
00132 SIG2=SIGij*SIGij;
00133 SIG6=SIG2*SIG2*SIG2;
00134
00135 ri6=1./(r2*r2*r2);
00136 SIG_ri6 = SIG6 * ri6;
00137 SIG_ri12 = SIG_ri6 * SIG_ri6;
00138 SIG_ri24 = SIG_ri12 * SIG_ri12;
00139
00140 U_coulomb = QiQj * erfc(_ALPHA_BKS * r) / r ;
00141
00142 U = U_coulomb +
00143 Aij * exp(-Bij * r) - Cij * ri6 +
00144 4*EPSij * ( SIG_ri24 - SIG_ri6 );
00145
00146 tmp = (U_coulomb + QiQj*2*_ALPHA_BKS/sqrt(M_PI) *
00147 exp(-_ALPHA_BKS*_ALPHA_BKS*r2)) / r2 +
00148 Aij*Bij*exp(-Bij * r) / r - 6*Cij*ri6 / r2 +
00149 4*EPSij * ( 24*SIG_ri24 - 6*SIG_ri6 ) / r2;
00150
00151 fij = rij*tmp;
00152
00153 _F[ipt]-=fij;
00154 _F[jpt]+=fij;
00155 _EPOT_IND[ipt]+=U*0.5;
00156 _EPOT_IND[jpt]+=U*0.5;
00157 _EPOT+=U;
00158 _VIRIAL.addnvv(1.,fij,rij);
00159 }
00160 }
00161 }
00162 }
00163
00164
00165 void BKSFrame::potential()
00166 {
00167 int i;
00168 bks_mod();
00169
00170
00171 if(Ewald_CE_or_PME==0){CE();}
00172
00173 else{PME();}
00174
00175
00176 _EPOT += _EPOT_Ewald;
00177 _VIRIAL += _VIRIAL_Ewald;
00178 for(i=0;i<_NP;i++)
00179 {
00180 _F[i]+=_F_Ewald[i];
00181 _EPOT_IND[i]+=_EPOT_IND_Ewald[i];
00182 }
00183
00184 }
00185
00186 #ifdef _TEST
00187
00188
00189 class BKSFrame sim;
00190
00191
00192 #include "main.cpp"
00193
00194 #endif//_TEST
00195