00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include "ljbond.h"
00014
00015 void LJBONDFrame::initparser()
00016 {
00017 int i, j;
00018 char s[100];
00019 MDPARALLELFrame::initparser();
00020
00021
00022 for(i=0;i<MAXSP;i++)
00023 for(j=i;j<MAXSP;j++)
00024 {
00025 sprintf(s,"C12_%d%d",i,j);
00026 bindvar(s,&(_ALJ[i][j]),DOUBLE);
00027 sprintf(s,"C6_%d%d",i,j);
00028 bindvar(s,&(_BLJ[i][j]),DOUBLE);
00029 }
00030
00031 bindvar("BOND_R0",&BOND_R0,DOUBLE);
00032 bindvar("BOND_K", &BOND_K, DOUBLE);
00033 bindvar("Rcut",&LJ_RC,DOUBLE);
00034 }
00035
00036 int LJBONDFrame::exec(char *name)
00037 {
00038 if(MDPARALLELFrame::exec(name)==0) return 0;
00039 bindcommand(name,"initLJ",initLJ());
00040 bindcommand(name,"makelipids",makelipids());
00041 bindcommand(name,"linklipids",linklipids());
00042 return -1;
00043 }
00044
00045 void LJBONDFrame::Alloc()
00046 {
00047 int size;
00048 MDPARALLELFrame::Alloc();
00049
00050 size = _NP*allocmultiple;
00051 Realloc(num_bonds, int,size);
00052 Realloc(bond_index,int,size*MAXNUMBOND);
00053
00054 memset(num_bonds, 0,sizeof(int)*size);
00055 memset(bond_index,0,sizeof(int)*size*MAXNUMBOND);
00056 }
00057
00058
00059 void LJBONDFrame::initvars()
00060 {
00061 int i, j;
00062 for(i=0;i<MAXSP;i++)
00063 for(j=i;j<MAXSP;j++)
00064 {
00065 _ALJ[i][j] = 4;
00066 _BLJ[i][j] = 4;
00067 }
00068
00069 BOND_R0 = LJ_LENGTH;
00070 BOND_K = 2;
00071 LJ_RC = 2.37343077641 * LJ_LENGTH;
00072 _RLIST=LJ_RC+1.1;
00073 _SKIN=_RLIST-LJ_RC;
00074 MDPARALLELFrame::initvars();
00075 }
00076
00077 void LJBONDFrame::initLJ()
00078 {
00079 int i, j;
00080
00081 for(i=0;i<MAXSP;i++)
00082 for(j=i;j<MAXSP;j++)
00083 {
00084 ALJ[i][j]=_ALJ[i][j]*LJ_ENERGY*POW12(LJ_LENGTH);
00085 BLJ[i][j]=_BLJ[i][j]*LJ_ENERGY*POW6(LJ_LENGTH);
00086 Uc[i][j]=(ALJ[i][j]*POW6(1/LJ_RC)-BLJ[i][j])*POW6(1/LJ_RC);
00087 DUDRc[i][j]=-(12*ALJ[i][j]/POW6(LJ_RC)-6*BLJ[i][j])/POW6(LJ_RC)/LJ_RC;
00088 }
00089
00090 for(i=1;i<MAXSP;i++)
00091 for(j=0;j<i;j++)
00092 {
00093 _ALJ[i][j] = _ALJ[j][i];
00094 _BLJ[i][j] = _BLJ[j][i];
00095 ALJ[i][j] = ALJ[j][i];
00096 BLJ[i][j] = BLJ[j][i];
00097 Uc[i][j] = Uc[j][i];
00098 DUDRc[i][j] =DUDRc[j][i];
00099 }
00100
00101 _RLIST=LJ_RC+1.1;
00102 _SKIN=_RLIST-LJ_RC;
00103
00104 }
00105
00106 void LJBONDFrame::calcprop()
00107 {
00108 MDPARALLELFrame::calcprop();
00109 }
00110
00111 void LJBONDFrame::lennard_jones_bond()
00112 {
00113 int i,j,ipt,jpt,k, bonded;
00114 double U,r,r2,ri6, R0,U0,K0,ri02,ri06;
00115 double ALJ_local,BLJ_local,Uc_local,DUDRc_local;
00116 Vector3 sij, rij, fij;
00117
00118 DUMP(HIG"Lennard Jones"NOR);
00119
00120 refreshneighborlist();
00121
00122 _EPOT=0;
00123
00124 for(i=0;i<_NP;i++)
00125 {_F[i].clear(); _EPOT_IND[i]=0;}
00126 _VIRIAL.clear();
00127
00128 for(ipt=0;ipt<_NP;ipt++)
00129 {
00130 for(j=0;j<nn[ipt];j++)
00131 {
00132 jpt=nindex[ipt][j];
00133 if(ipt>jpt) continue;
00134
00135
00136 bonded = 0;
00137 for(k=0;k<num_bonds[ipt];k++)
00138 {
00139 if(bond_index[ipt*MAXNUMBOND+k] == jpt)
00140 {
00141 bonded = 1;
00142 break;
00143 }
00144 }
00145
00146 if(bonded) continue;
00147
00148 sij=_SR[jpt]-_SR[ipt];
00149 sij.subint();
00150 rij=_H*sij;
00151 r2=rij.norm2();
00152 r=sqrt(r2);
00153 if(r<=LJ_RC)
00154 {
00155 ALJ_local = ALJ[species[ipt]][species[jpt]];
00156 BLJ_local = BLJ[species[ipt]][species[jpt]];
00157 Uc_local = Uc[species[ipt]][species[jpt]];
00158 DUDRc_local = DUDRc[species[ipt]][species[jpt]];
00159
00160 R0 = 0.8;
00161 if(r<R0)
00162 {
00163 ri02 = 1./(R0*R0);
00164 ri06 = ri02*ri02*ri02;
00165 U0 = (7*ALJ_local*ri06 - 4*BLJ_local)*ri06;
00166 K0 = (6*ALJ_local*ri06 - 3*BLJ_local)*ri06*ri02;
00167 U = U0 - K0*r2 - r*DUDRc_local + (LJ_RC*DUDRc_local-Uc_local);
00168 fij = rij*(2*K0 + DUDRc_local/r);
00169 }
00170 else {
00171
00172 ri6=1./(r2*r2*r2);
00173
00174 U=(ALJ_local*ri6-BLJ_local)*ri6-r*DUDRc_local+(LJ_RC*DUDRc_local-Uc_local);
00175 fij=rij*((12*ALJ_local*ri6-6*BLJ_local)*ri6/r2+DUDRc_local/r);
00176 }
00177
00178 _F[ipt]-=fij;
00179 _F[jpt]+=fij;
00180 _EPOT_IND[ipt]+=U*0.5;
00181 _EPOT_IND[jpt]+=U*0.5;
00182 _EPOT+=U;
00183 _VIRIAL.addnvv(1.,fij,rij);
00184 }
00185 }
00186 }
00187
00188
00189 if(BOND_K != 0)
00190 {
00191 for(ipt=0;ipt<_NP;ipt++)
00192 {
00193
00194 for(j=0;j<num_bonds[ipt];j++)
00195 {
00196 jpt = bond_index[ipt*MAXNUMBOND + j];
00197
00198
00199 if(ipt>jpt) continue;
00200
00201 sij=_SR[jpt]-_SR[ipt];
00202 sij.subint();
00203 rij=_H*sij;
00204 r2=rij.norm2();
00205 r=sqrt(r2);
00206
00207 U = BOND_K * SQR(r-BOND_R0);
00208 fij = rij * (-2*BOND_K*(1-BOND_R0/r));
00209
00210 _F[ipt]-=fij;
00211 _F[jpt]+=fij;
00212 _EPOT_IND[ipt]+=U*0.5;
00213 _EPOT_IND[jpt]+=U*0.5;
00214 _EPOT+=U;
00215 _VIRIAL.addnvv(1.,fij,rij);
00216 }
00217
00218 }
00219 }
00220 }
00221
00222 void LJBONDFrame::linklipids()
00223 {
00224 int nsolvent, nlipid, chainlen, headid;
00225 int ipt, i, j;
00226 double bond_len;
00227 Vector3 dr, dr1, ds;
00228 Matrix33 hinv;
00229
00230 nsolvent = (int) input[0];
00231 nlipid = (int) input[1];
00232 chainlen = (int) input[2];
00233 headid = (int) input[3];
00234 bond_len = input[4];
00235
00236 ipt = 0;
00237 for(i=0;i<nlipid;i++)
00238 {
00239 for(j=0;j<chainlen;j++)
00240 {
00241 if(j==0)
00242 {
00243
00244 num_bonds[ipt] = 1;
00245 bond_index[ipt*MAXNUMBOND + 0] = ipt+1;
00246
00247 } else if (j==(chainlen-1))
00248 {
00249 num_bonds[ipt]=1;
00250 bond_index[ipt*MAXNUMBOND + 0] = ipt-1;
00251 } else
00252 {
00253 num_bonds[ipt]=2;
00254 bond_index[ipt*MAXNUMBOND + 0] = ipt-1;
00255 bond_index[ipt*MAXNUMBOND + 1] = ipt+1;
00256 }
00257 ipt ++;
00258 }
00259 }
00260 }
00261
00262 void LJBONDFrame::makelipids()
00263 {
00264 int nsolvent, nlipid, chainlen, headid;
00265 int ipt, i, j;
00266 double bond_len;
00267 Vector3 dr, dr1, ds;
00268 Matrix33 hinv;
00269
00270 nsolvent = (int) input[0];
00271 nlipid = (int) input[1];
00272 chainlen = (int) input[2];
00273 headid = (int) input[3];
00274 bond_len = input[4];
00275
00276 _H.clear();
00277 _H[0][0] = input[5];
00278 _H[1][1] = input[6];
00279 _H[2][2] = input[7];
00280
00281 _NP = nlipid*chainlen + nsolvent;
00282 Alloc();
00283
00284 hinv = _H.inv();
00285 ipt = 0;
00286 for(i=0;i<nlipid;i++)
00287 {
00288 for(j=0;j<chainlen;j++)
00289 {
00290 if(j==0)
00291 {
00292
00293 _SR[ipt].set(drand48()-0.5,drand48()-0.5,drand48()-0.5);
00294
00295
00296 dr.set(drand48()-0.5,drand48()-0.5,drand48()-0.5);
00297 dr/=dr.norm(); dr*=bond_len; ds = hinv*dr;
00298
00299 } else {
00300
00301 _SR[ipt] = _SR[ipt-1] + ds;
00302 }
00303
00304 if(j==headid)
00305 {
00306 species[ipt] = 2;
00307
00308
00309 dr1.set(drand48()-0.5,drand48()-0.5,drand48()-0.5);
00310 dr1/=dr1.norm(); dr1*=(bond_len*0.5); dr*=-1; dr+=dr1;
00311 dr/=dr.norm(); dr*=bond_len; ds = hinv*dr;
00312
00313 } else {
00314 species[ipt] = 1;
00315 }
00316
00317 ipt ++;
00318 }
00319 }
00320 linklipids();
00321
00322 for(i=0;i<nsolvent;i++)
00323 {
00324
00325 _SR[ipt].set(drand48()-0.5,drand48()-0.5,drand48()-0.5);
00326 species[ipt] = 0;
00327 ipt ++;
00328 }
00329 }
00330
00331 void LJBONDFrame::potential()
00332 {
00333 lennard_jones_bond();
00334 }
00335
00336 #ifdef _TEST
00337
00338
00339 class LJBONDFrame sim;
00340
00341
00342 #include "main.cpp"
00343
00344 #endif//_TEST
00345