void PairLJCutalpha::compute(int eflag, int vflag) { int i,j,ii,jj,inum,jnum,itype,jtype; double xtmp,ytmp,ztmp,delx,dely,delz,evdwl,fpair; double rsq,r2inv,r6inv,forcelj,factor_lj; int *ilist,*jlist,*numneigh,**firstneigh; evdwl = 0.0; ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; int *type = atom->type; int nlocal = atom->nlocal; double *special_lj = force->special_lj; int newton_pair = force->newton_pair; inum = list->inum; ilist = list->ilist; numneigh = list->numneigh; firstneigh = list->firstneigh; // loop over neighbors of my atoms for (ii = 0; ii < inum; ii++) { i = ilist[ii]; xtmp = x[i][0]; ytmp = x[i][1]; ztmp = x[i][2]; itype = type[i]; jlist = firstneigh[i]; jnum = numneigh[i]; for (jj = 0; jj < jnum; jj++) { j = jlist[jj]; factor_lj = special_lj[sbmask(j)]; j &= NEIGHMASK; delx = xtmp - x[j][0]; dely = ytmp - x[j][1]; delz = ztmp - x[j][2]; rsq = delx*delx + dely*dely + delz*delz; jtype = type[j]; if (rsq < cutsq[itype][jtype]) { r2inv = 1.0/rsq; r6inv = r2inv*r2inv*r2inv; forcelj = r6inv * (lj1[itype][jtype]*r6inv - lj2[itype][jtype]); fpair = factor_lj*forcelj*r2inv; f[i][0] += delx*fpair; f[i][1] += dely*fpair; f[i][2] += delz*fpair; if (newton_pair || j < nlocal) { f[j][0] -= delx*fpair; f[j][1] -= dely*fpair; f[j][2] -= delz*fpair; } if (eflag) { evdwl = r6inv*(lj3[itype][jtype]*r6inv-lj4[itype][jtype]) - offset[itype][jtype]-1.0*epsilon[itype][jtype]; evdwl *= factor_lj; } if (evflag) ev_tally(i,j,nlocal,newton_pair, evdwl,0.0,fpair,delx,dely,delz); } else if (rsq < FACT*cutsq[itype][jtype]) { forcelj=epsilon[itype][jtype]*1.0*GAMMA/sigma[itype][jtype]/sigma[itype][jtype]* sin(GAMMA/sigma[itype][jtype]/sigma[itype][jtype]*rsq+BETA); fpair=factor_lj*forcelj; f[i][0] += delx*fpair; f[i][1] += dely*fpair; f[i][2] += delz*fpair; if (newton_pair || j < nlocal) { f[j][0] -= delx*fpair; f[j][1] -= dely*fpair; f[j][2] -= delz*fpair; } if (eflag) { evdwl = 0.5*epsilon[itype][jtype]*1.0* (cos(GAMMA*rsq/sigma[itype][jtype]/sigma[itype][jtype]+BETA)-1.0); //!!!modificato qui evdwl *= factor_lj; } if (evflag) ev_tally(i,j,nlocal,newton_pair, evdwl,0.0,fpair,delx,dely,delz); } } } if (vflag_fdotr) virial_fdotr_compute(); } //////////////////////////////////////////////// //////////////////////////////////////////////// //////////////////////////////////////////////// void BondFENEalpha::compute(int eflag, int vflag) { int i1,i2,n,type; double delx,dely,delz,ebond,fbond; double rsq,r0sq,rlogarg,sr2,sr6,sf; ebond = sr6 = 0.0; ev_init(eflag,vflag); double **x = atom->x; double **f = atom->f; int **bondlist = neighbor->bondlist; int nbondlist = neighbor->nbondlist; int nlocal = atom->nlocal; int newton_bond = force->newton_bond; for (n = 0; n < nbondlist; n++) { i1 = bondlist[n][0]; i2 = bondlist[n][1]; type = bondlist[n][2]; delx = x[i1][0] - x[i2][0]; dely = x[i1][1] - x[i2][1]; delz = x[i1][2] - x[i2][2]; /////////////////////// // force from log term /////////////////////// rsq = delx*delx + dely*dely + delz*delz; r0sq = r0[type] * r0[type]; rlogarg = 1.0 - rsq/r0sq; // if r -> r0, then rlogarg < 0.0 which is an error // issue a warning and reset rlogarg = epsilon // if r > 2*r0 something serious is wrong, abort if (rlogarg < 0.1) { char str[128]; sprintf(str,"FENE bond too long: " BIGINT_FORMAT " " TAGINT_FORMAT " " TAGINT_FORMAT " %g", update->ntimestep,atom->tag[i1],atom->tag[i2],sqrt(rsq)); error->warning(FLERR,str,0); if (rlogarg <= -3.0) error->one(FLERR,"Bad FENE bond"); rlogarg = 0.1; } fbond = -k[type]/rlogarg; ////////////////////// // force from LJ term ////////////////////// if (rsq < TWO_1_3*sigma[type]*sigma[type]) { sr2 = sigma[type]*sigma[type]/rsq; sr6 = sr2*sr2*sr2; //fbond += 48.0*epsilon[type]*sr6*(sr6-0.5)/rsq; fbond += 48.0*1.0*sr6*(sr6-0.5)/rsq; } ///////////////////////// // force from ALPHA term ///////////////////////// if ((rsq < r0sq*sigma[type]*sigma[type]) && (rsq > TWO_1_3*sigma[type]*sigma[type])) { //if (rsq < r0sq*sigma[type]*sigma[type]) { //sf = alpha*epsilon[type]*GAMMA/sigma[type]/sigma[type]*sin(GAMMA/sigma[type]/sigma[type]*rsq+BETA); sf = epsilon[type]*1.0*GAMMA/sigma[type]/sigma[type]*sin(GAMMA/sigma[type]/sigma[type]*rsq+BETA); fbond += sf; } // energy if (eflag) { ebond = -0.5 * k[type]*r0sq*log(rlogarg); if (rsq < TWO_1_3*sigma[type]*sigma[type]) { //ebond += 4.0*epsilon[type]*sr6*(sr6-1.0) + epsilon[type]-epsilon[type]*alpha; ebond += 4.0*1.0*sr6*(sr6-1.0) + 1.0-1.0*epsilon[type]; } else if (rsq < r0sq*sigma[type]*sigma[type]) { //ebond += 0.5*alpha*epsilon[type]*(cos(GAMMA*rsq/sigma[type]/sigma[type]+BETA)-1.0); ebond += 0.5*epsilon[type]*1.0*(cos(GAMMA*rsq/sigma[type]/sigma[type]+BETA)-1.0); } } // apply force to each of 2 atoms if (newton_bond || i1 < nlocal) { f[i1][0] += delx*fbond; f[i1][1] += dely*fbond; f[i1][2] += delz*fbond; } if (newton_bond || i2 < nlocal) { f[i2][0] -= delx*fbond; f[i2][1] -= dely*fbond; f[i2][2] -= delz*fbond; } if (evflag) ev_tally(i1,i2,nlocal,newton_bond,ebond,fbond,delx,dely,delz); } }