forked from lijiext/lammps
git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@631 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
parent
e69f74203e
commit
3cc0908415
|
@ -42,7 +42,6 @@ enum{SPHERE_SPHERE,SPHERE_ELLIPSE,ELLIPSE_ELLIPSE};
|
|||
|
||||
PairGayBerne::PairGayBerne(LAMMPS *lmp) : Pair(lmp)
|
||||
{
|
||||
respa_enable = 0;
|
||||
single_enable = 0;
|
||||
}
|
||||
|
||||
|
@ -57,8 +56,8 @@ PairGayBerne::~PairGayBerne()
|
|||
memory->destroy_2d_double_array(cutsq);
|
||||
|
||||
memory->destroy_2d_int_array(form);
|
||||
memory->destroy_2d_double_array(epsi);
|
||||
memory->destroy_2d_double_array(sig);
|
||||
memory->destroy_2d_double_array(epsilon);
|
||||
memory->destroy_2d_double_array(sigma);
|
||||
memory->destroy_2d_double_array(shape);
|
||||
memory->destroy_2d_double_array(well);
|
||||
memory->destroy_2d_double_array(cut);
|
||||
|
@ -66,7 +65,9 @@ PairGayBerne::~PairGayBerne()
|
|||
memory->destroy_2d_double_array(lj2);
|
||||
memory->destroy_2d_double_array(lj3);
|
||||
memory->destroy_2d_double_array(lj4);
|
||||
memory->destroy_2d_double_array(offset);
|
||||
delete [] lshape;
|
||||
delete [] setwell;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -74,8 +75,8 @@ PairGayBerne::~PairGayBerne()
|
|||
|
||||
void PairGayBerne::compute(int eflag, int vflag)
|
||||
{
|
||||
int i,j,k,m,numneigh;
|
||||
double one_eng,rsq;
|
||||
int i,j,k,m,numneigh,itype,jtype;
|
||||
double one_eng,rsq,r2inv,r6inv,forcelj,phi;
|
||||
double fforce[3],ttor[3],rtor[3],r12[3];
|
||||
double a1[3][3],b1[3][3],g1[3][3],a2[3][3],b2[3][3],g2[3][3],temp[3][3];
|
||||
int *neighs;
|
||||
|
@ -99,15 +100,14 @@ void PairGayBerne::compute(int eflag, int vflag)
|
|||
// loop over neighbors of my atoms
|
||||
|
||||
for (i = 0; i < nlocal; i++) {
|
||||
itype = type[i];
|
||||
neighs = neighbor->firstneigh[i];
|
||||
numneigh = neighbor->numneigh[i];
|
||||
|
||||
// precomputations for force calculation
|
||||
|
||||
MathExtra::quat_to_mat_trans(quat[i],a1);
|
||||
MathExtra::diag_times3(well[type[i]],a1,temp);
|
||||
MathExtra::diag_times3(well[itype],a1,temp);
|
||||
MathExtra::transpose_times3(a1,temp,b1);
|
||||
MathExtra::diag_times3(shape[type[i]],a1,temp);
|
||||
MathExtra::diag_times3(shape[itype],a1,temp);
|
||||
MathExtra::transpose_times3(a1,temp,g1);
|
||||
|
||||
for (k = 0; k < numneigh; k++) {
|
||||
|
@ -125,10 +125,11 @@ void PairGayBerne::compute(int eflag, int vflag)
|
|||
r12[1] = x[j][1]-x[i][1];
|
||||
r12[2] = x[j][2]-x[i][2];
|
||||
rsq = MathExtra::dot3(r12,r12);
|
||||
jtype = type[j];
|
||||
|
||||
// compute if less than cutoff
|
||||
|
||||
if (rsq < cutsq[type[i]][type[j]]) {
|
||||
if (rsq < cutsq[itype][jtype]) {
|
||||
|
||||
switch (form[itype][jtype]) {
|
||||
case SPHERE_SPHERE:
|
||||
|
@ -144,21 +145,11 @@ void PairGayBerne::compute(int eflag, int vflag)
|
|||
ttor[0] = ttor[1] = ttor[2] = 0.0;
|
||||
break;
|
||||
|
||||
case SPHERE_ELLIPSE:
|
||||
default:
|
||||
MathExtra::quat_to_mat_trans(quat[j],a2);
|
||||
MathExtra::diag_times3(well[type[j]],a2,temp);
|
||||
MathExtra::diag_times3(well[jtype],a2,temp);
|
||||
MathExtra::transpose_times3(a2,temp,b2);
|
||||
MathExtra::diag_times3(shape[type[j]],a2,temp);
|
||||
MathExtra::transpose_times3(a2,temp,g2);
|
||||
one_eng = gayberne_analytic(i,j,a1,a2,b1,b2,g1,g2,r12,rsq,
|
||||
fforce,ttor,rtor);
|
||||
break;
|
||||
|
||||
case ELLIPSE_ELLIPSE:
|
||||
MathExtra::quat_to_mat_trans(quat[j],a2);
|
||||
MathExtra::diag_times3(well[type[j]],a2,temp);
|
||||
MathExtra::transpose_times3(a2,temp,b2);
|
||||
MathExtra::diag_times3(shape[type[j]],a2,temp);
|
||||
MathExtra::diag_times3(shape[jtype],a2,temp);
|
||||
MathExtra::transpose_times3(a2,temp,g2);
|
||||
one_eng = gayberne_analytic(i,j,a1,a2,b1,b2,g1,g2,r12,rsq,
|
||||
fforce,ttor,rtor);
|
||||
|
@ -229,8 +220,8 @@ void PairGayBerne::allocate()
|
|||
cutsq = memory->create_2d_double_array(n+1,n+1,"pair:cutsq");
|
||||
|
||||
form = memory->create_2d_int_array(n+1,n+1,"pair:form");
|
||||
epsi = memory->create_2d_double_array(n+1,n+1,"pair:epsi");
|
||||
sig = memory->create_2d_double_array(n+1,n+1,"pair:sig");
|
||||
epsilon = memory->create_2d_double_array(n+1,n+1,"pair:epsilon");
|
||||
sigma = memory->create_2d_double_array(n+1,n+1,"pair:sigma");
|
||||
shape = memory->create_2d_double_array(n+1,3,"pair:shape");
|
||||
well = memory->create_2d_double_array(n+1,3,"pair:well");
|
||||
cut = memory->create_2d_double_array(n+1,n+1,"pair:cut");
|
||||
|
@ -238,7 +229,11 @@ void PairGayBerne::allocate()
|
|||
lj2 = memory->create_2d_double_array(n+1,n+1,"pair:lj2");
|
||||
lj3 = memory->create_2d_double_array(n+1,n+1,"pair:lj3");
|
||||
lj4 = memory->create_2d_double_array(n+1,n+1,"pair:lj4");
|
||||
offset = memory->create_2d_double_array(n+1,n+1,"pair:offset");
|
||||
|
||||
lshape = new double[n+1];
|
||||
setwell = new int[n+1];
|
||||
for (int i = 1; i <= n; i++) setwell[i] = 0;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------
|
||||
|
@ -278,8 +273,8 @@ void PairGayBerne::coeff(int narg, char **arg)
|
|||
force->bounds(arg[0],atom->ntypes,ilo,ihi);
|
||||
force->bounds(arg[1],atom->ntypes,jlo,jhi);
|
||||
|
||||
double epsi_one = atof(arg[2]);
|
||||
double sig_one = atof(arg[3]);
|
||||
double epsilon_one = atof(arg[2]);
|
||||
double sigma_one = atof(arg[3]);
|
||||
double eia_one = atof(arg[4]);
|
||||
double eib_one = atof(arg[5]);
|
||||
double eic_one = atof(arg[6]);
|
||||
|
@ -293,13 +288,22 @@ void PairGayBerne::coeff(int narg, char **arg)
|
|||
int count = 0;
|
||||
for (int i = ilo; i <= ihi; i++) {
|
||||
for (int j = MAX(jlo,i); j <= jhi; j++) {
|
||||
epsi[i][j] = epsi_one;
|
||||
sig[i][j] = sig_one;
|
||||
epsilon[i][j] = epsilon_one;
|
||||
sigma[i][j] = sigma_one;
|
||||
cut[i][j] = cut_one;
|
||||
if (i == j) {
|
||||
well[i][0] = pow(ea_one,-1.0/mu);
|
||||
well[i][1] = pow(eb_one,-1.0/mu);
|
||||
well[i][2] = pow(ec_one,-1.0/mu);
|
||||
if (eia_one != 0.0 || eib_one != 0.0 || eic_one != 0.0) {
|
||||
well[i][0] = pow(eia_one,-1.0/mu);
|
||||
well[i][1] = pow(eib_one,-1.0/mu);
|
||||
well[i][2] = pow(eic_one,-1.0/mu);
|
||||
if (eia_one == 1.0 && eib_one == 1.0 && eic_one == 1.0) setwell[i] = 2;
|
||||
else setwell[i] = 1;
|
||||
}
|
||||
if (eja_one != 0.0 || ejb_one != 0.0 || ejc_one != 0.0) {
|
||||
well[j][0] = pow(eja_one,-1.0/mu);
|
||||
well[j][1] = pow(ejb_one,-1.0/mu);
|
||||
well[j][2] = pow(ejc_one,-1.0/mu);
|
||||
if (eja_one == 1.0 && ejb_one == 1.0 && ejc_one == 1.0) setwell[j] = 2;
|
||||
else setwell[j] = 1;
|
||||
}
|
||||
setflag[i][j] = 1;
|
||||
count++;
|
||||
|
@ -315,28 +319,50 @@ void PairGayBerne::coeff(int narg, char **arg)
|
|||
|
||||
double PairGayBerne::init_one(int i, int j)
|
||||
{
|
||||
if (setwell[i] == 0 || setwell[j] == 0)
|
||||
error->all("Pair gayberne epsilon a,b,c coeffs are not all set");
|
||||
|
||||
if (setflag[i][j] == 0) {
|
||||
epsi[i][j] = mix_energy(epsi[i][i],epsi[j][j],sig[i][i],sig[j][j]);
|
||||
sig[i][j] = mix_distance(sig[i][i],sig[j][j]);
|
||||
epsilon[i][j] = mix_energy(epsilon[i][i],epsilon[j][j],
|
||||
sigma[i][i],sigma[j][j]);
|
||||
sigma[i][j] = mix_distance(sigma[i][i],sigma[j][j]);
|
||||
cut[i][j] = mix_distance(cut[i][i],cut[j][j]);
|
||||
}
|
||||
|
||||
int itype = 0;
|
||||
lj1[i][j] = 48.0 * epsilon[i][j] * pow(sigma[i][j],12.0);
|
||||
lj2[i][j] = 24.0 * epsilon[i][j] * pow(sigma[i][j],6.0);
|
||||
lj3[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j],12.0);
|
||||
lj4[i][j] = 4.0 * epsilon[i][j] * pow(sigma[i][j],6.0);
|
||||
|
||||
if (offset_flag) {
|
||||
double ratio = sigma[i][j] / cut[i][j];
|
||||
offset[i][j] = 4.0 * epsilon[i][j] * (pow(ratio,12.0) - pow(ratio,6.0));
|
||||
} else offset[i][j] = 0.0;
|
||||
|
||||
int ishape = 0;
|
||||
if (atom->shape[i][0] != atom->shape[i][1] ||
|
||||
atom->shape[i][0] != atom->shape[i][2] ||
|
||||
atom->shape[i][1] != atom->shape[i][2]) itype = 0;
|
||||
if (atom->shape[i][0] != atom->shape[i][1] ||
|
||||
atom->shape[i][0] != atom->shape[i][2] ||
|
||||
atom->shape[i][1] != atom->shape[i][2]) itype = 0;
|
||||
atom->shape[i][1] != atom->shape[i][2]) ishape = 1;
|
||||
if (setwell[i] == 1) ishape = 1;
|
||||
int jshape = 0;
|
||||
if (atom->shape[j][0] != atom->shape[j][1] ||
|
||||
atom->shape[j][0] != atom->shape[j][2] ||
|
||||
atom->shape[j][1] != atom->shape[j][2]) jshape = 1;
|
||||
if (setwell[j] == 1) jshape = 1;
|
||||
|
||||
if (itype = 0 && jtype = 0) form[i][j] = SPHERE_SPHERE;
|
||||
else if (itype = 0 || jtype == 0) form[i][j] = SPHERE_ELLIPSE;
|
||||
if (ishape == 0 && jshape == 0) form[i][j] = SPHERE_SPHERE;
|
||||
else if (ishape == 0 || jshape == 0) form[i][j] = SPHERE_ELLIPSE;
|
||||
else form[i][j] = ELLIPSE_ELLIPSE;
|
||||
|
||||
form[j][i] = form[i][j];
|
||||
epsi[j][i] = epsi[i][j];
|
||||
sig[j][i] = sig[i][j];
|
||||
epsilon[j][i] = epsilon[i][j];
|
||||
sigma[j][i] = sigma[i][j];
|
||||
cut[j][i] = cut[i][j];
|
||||
lj1[j][i] = lj1[i][j];
|
||||
lj2[j][i] = lj2[i][j];
|
||||
lj3[j][i] = lj3[i][j];
|
||||
lj4[j][i] = lj4[i][j];
|
||||
offset[j][i] = offset[i][j];
|
||||
|
||||
return cut[i][j];
|
||||
}
|
||||
|
@ -353,11 +379,13 @@ void PairGayBerne::init_style()
|
|||
// per-type shape precalculations
|
||||
|
||||
for (int i = 1; i <= atom->ntypes; i++) {
|
||||
double *one = atom->shape[i];
|
||||
shape[i][0] = one[0]*one[0];
|
||||
shape[i][1] = one[1]*one[1];
|
||||
shape[i][2] = one[2]*one[2];
|
||||
lshape[i] = (one[0]*one[1]+one[2]*one[2])*sqrt(one[0]*one[1]);
|
||||
if (setwell[i]) {
|
||||
double *one = atom->shape[i];
|
||||
shape[i][0] = one[0]*one[0];
|
||||
shape[i][1] = one[1]*one[1];
|
||||
shape[i][2] = one[2]*one[2];
|
||||
lshape[i] = (one[0]*one[1]+one[2]*one[2])*sqrt(one[0]*one[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -375,8 +403,8 @@ void PairGayBerne::write_restart(FILE *fp)
|
|||
for (j = i; j <= atom->ntypes; j++) {
|
||||
fwrite(&setflag[i][j],sizeof(int),1,fp);
|
||||
if (setflag[i][j]) {
|
||||
fwrite(&epsi[i][j],sizeof(double),1,fp);
|
||||
fwrite(&sig[i][j],sizeof(double),1,fp);
|
||||
fwrite(&epsilon[i][j],sizeof(double),1,fp);
|
||||
fwrite(&sigma[i][j],sizeof(double),1,fp);
|
||||
fwrite(&cut[i][j],sizeof(double),1,fp);
|
||||
}
|
||||
}
|
||||
|
@ -403,12 +431,12 @@ void PairGayBerne::read_restart(FILE *fp)
|
|||
MPI_Bcast(&setflag[i][j],1,MPI_INT,0,world);
|
||||
if (setflag[i][j]) {
|
||||
if (me == 0) {
|
||||
fread(&epsi[i][j],sizeof(double),1,fp);
|
||||
fread(&sig[i][j],sizeof(double),1,fp);
|
||||
fread(&epsilon[i][j],sizeof(double),1,fp);
|
||||
fread(&sigma[i][j],sizeof(double),1,fp);
|
||||
fread(&cut[i][j],sizeof(double),1,fp);
|
||||
}
|
||||
MPI_Bcast(&epsi[i][j],1,MPI_DOUBLE,0,world);
|
||||
MPI_Bcast(&sig[i][j],1,MPI_DOUBLE,0,world);
|
||||
MPI_Bcast(&epsilon[i][j],1,MPI_DOUBLE,0,world);
|
||||
MPI_Bcast(&sigma[i][j],1,MPI_DOUBLE,0,world);
|
||||
MPI_Bcast(&cut[i][j],1,MPI_DOUBLE,0,world);
|
||||
}
|
||||
}
|
||||
|
@ -493,10 +521,10 @@ double PairGayBerne::gayberne_analytic(const int i,const int j,double a1[3][3],
|
|||
// energy
|
||||
// compute u_r
|
||||
|
||||
double varrho = sig[type[i]][type[j]]/(h12+gamma*sig[type[i]][type[j]]);
|
||||
double varrho = sigma[type[i]][type[j]]/(h12+gamma*sigma[type[i]][type[j]]);
|
||||
double varrho6 = pow(varrho,6.0);
|
||||
double varrho12 = varrho6*varrho6;
|
||||
double u_r = 4.0*epsi[type[i]][type[j]]*(varrho12-varrho6);
|
||||
double u_r = 4.0*epsilon[type[i]][type[j]]*(varrho12-varrho6);
|
||||
|
||||
// compute eta_12
|
||||
|
||||
|
@ -522,8 +550,8 @@ double PairGayBerne::gayberne_analytic(const int i,const int j,double a1[3][3],
|
|||
// force
|
||||
// compute dUr/dr
|
||||
|
||||
temp1 = (2.0*varrho12*varrho-varrho6*varrho)/sig[type[i]][type[j]];
|
||||
temp1 = temp1*24.0*epsi[type[i]][type[j]];
|
||||
temp1 = (2.0*varrho12*varrho-varrho6*varrho)/sigma[type[i]][type[j]];
|
||||
temp1 = temp1*24.0*epsilon[type[i]][type[j]];
|
||||
double u_slj = temp1*pow(sigma12,3.0)/2.0;
|
||||
double dUr[3];
|
||||
temp2 = MathExtra::dot3(kappa,r12hat);
|
||||
|
@ -586,8 +614,8 @@ double PairGayBerne::gayberne_analytic(const int i,const int j,double a1[3][3],
|
|||
deta[0] = deta[1] = deta[2] = 0.0;
|
||||
compute_eta_torque(g12,a1,shape[type[i]],temp);
|
||||
temp1 = -eta*upsilon;
|
||||
for (unsigned m = 0; m < 3; m++) {
|
||||
for (unsigned y = 0; y < 3; y++) tempv[y] = temp1*temp[m][y];
|
||||
for (int m = 0; m < 3; m++) {
|
||||
for (int y = 0; y < 3; y++) tempv[y] = temp1*temp[m][y];
|
||||
MathExtra::cross3(a1[m],tempv,tempv2);
|
||||
deta[0] += tempv2[0];
|
||||
deta[1] += tempv2[1];
|
||||
|
@ -600,8 +628,8 @@ double PairGayBerne::gayberne_analytic(const int i,const int j,double a1[3][3],
|
|||
if (newton_pair || j < nlocal) {
|
||||
deta2[0] = deta2[1] = deta2[2] = 0.0;
|
||||
compute_eta_torque(g12,a2,shape[type[j]],temp);
|
||||
for (unsigned m = 0; m < 3; m++) {
|
||||
for (unsigned y = 0; y < 3; y++) tempv[y] = temp1*temp[m][y];
|
||||
for (int m = 0; m < 3; m++) {
|
||||
for (int y = 0; y < 3; y++) tempv[y] = temp1*temp[m][y];
|
||||
MathExtra::cross3(a2[m],tempv,tempv2);
|
||||
deta2[0] += tempv2[0];
|
||||
deta2[1] += tempv2[1];
|
||||
|
|
|
@ -32,16 +32,20 @@ class PairGayBerne : public Pair {
|
|||
void write_restart_settings(FILE *);
|
||||
void read_restart_settings(FILE *);
|
||||
|
||||
protected:
|
||||
private:
|
||||
double cut_global;
|
||||
double **cut;
|
||||
|
||||
double gamma,upsilon,mu; // Gay-Berne parameters
|
||||
double **shape; // radii in x, y and z SQUARED
|
||||
double *lshape; // precalculation based on the shape
|
||||
double **well; // well depth scaling along each axis
|
||||
// raised to -1.0/mu
|
||||
double **epsi,**sig; // epsilon and sigma values for atom-type pairs
|
||||
double **well; // well depth scaling along each axis ^ -1.0/mu
|
||||
double **epsilon,**sigma; // epsilon and sigma values for atom-type pairs
|
||||
|
||||
int **form;
|
||||
double **lj1,**lj2,**lj3,**lj4;
|
||||
double **offset;
|
||||
int *setwell;
|
||||
|
||||
void allocate();
|
||||
double gayberne_analytic(const int i, const int j, double a1[3][3],
|
||||
|
|
|
@ -51,8 +51,9 @@ package:
|
|||
@echo 'make no-all to exclude all packages'
|
||||
|
||||
yes-all:
|
||||
make yes-asphere yes-class2 yes-colloid yes-dpd yes-granular \
|
||||
yes-kspace yes-manybody yes-meam yes-molecule yes-opt yes-poems yes-xtc
|
||||
make yes-asphere yes-class2 yes-colloid yes-dipole \
|
||||
yes-dpd yes-granular yes-kspace yes-manybody yes-meam \
|
||||
yes-molecule yes-opt yes-poems yes-xtc
|
||||
|
||||
no-all:
|
||||
@echo 'Removing files, ignore any rm errors ...'
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
/* ----------------------------------------------------------------------
|
||||
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
|
||||
www.cs.sandia.gov/~sjplimp/lammps.html
|
||||
Steve Plimpton, sjplimp@sandia.gov, Sandia National Laboratories
|
||||
|
||||
Copyright (2003) Sandia Corporation. Under the terms of Contract
|
||||
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
|
||||
certain rights in this software. This software is distributed under
|
||||
the GNU General Public License.
|
||||
|
||||
See the README file in the top-level LAMMPS directory.
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
#ifdef AtomInclude
|
||||
#include "atom_vec_dipole.h"
|
||||
#endif
|
||||
|
||||
#ifdef AtomClass
|
||||
AtomStyle(dipole,AtomVecDipole)
|
||||
#endif
|
||||
|
||||
#ifdef ComputeInclude
|
||||
#include "compute_temp_dipole.h"
|
||||
#endif
|
||||
|
||||
#ifdef ComputeClass
|
||||
ComputeStyle(temp/dipole,ComputeTempDipole)
|
||||
#endif
|
||||
|
||||
#ifdef FixInclude
|
||||
#include "fix_nve_dipole.h"
|
||||
#endif
|
||||
|
||||
#ifdef FixClass
|
||||
FixStyle(nve/dipole,FixNVEDipole)
|
||||
#endif
|
||||
|
||||
#ifdef PairInclude
|
||||
#include "pair_dipole_cut.h"
|
||||
#endif
|
||||
|
||||
#ifdef PairClass
|
||||
PairStyle(dipole/cut,PairDipoleCut)
|
||||
#endif
|
Loading…
Reference in New Issue