git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@13075 f3b2605a-c512-4ea7-a41b-209d697bcdaa

This commit is contained in:
sjplimp 2015-02-06 20:39:07 +00:00
parent 53c37d5bda
commit e57c7828a9
5 changed files with 124 additions and 28 deletions

View File

@ -114,6 +114,7 @@ class Compute : protected Pointers {
virtual int dof_remove(int) {return 0;}
virtual void remove_bias(int, double *) {}
virtual void remove_bias_all() {}
virtual void reapply_bias_all() {}
virtual void restore_bias(int, double *) {}
virtual void restore_bias_all() {}

View File

@ -217,6 +217,38 @@ void ComputeTempPartial::remove_bias_all()
}
}
/* ----------------------------------------------------------------------
reset thermal velocity of atoms to be consistent with bias
called from velocity command after creating thermal velocities
needed to re-zero components that should stay zero
------------------------------------------------------------------------- */
void ComputeTempPartial::reapply_bias_all()
{
double **v = atom->v;
int *mask = atom->mask;
int nlocal = atom->nlocal;
if (nlocal > maxbias) {
memory->destroy(vbiasall);
maxbias = atom->nmax;
memory->create(vbiasall,maxbias,3,"temp/partial:vbiasall");
}
if (!xflag) {
for (int i = 0; i < nlocal; i++)
if (mask[i] & groupbit) v[i][0] = 0.0;
}
if (!yflag) {
for (int i = 0; i < nlocal; i++)
if (mask[i] & groupbit) v[i][1] = 0.0;
}
if (!zflag) {
for (int i = 0; i < nlocal; i++)
if (mask[i] & groupbit) v[i][2] = 0.0;
}
}
/* ----------------------------------------------------------------------
add back in velocity bias to atom I removed by remove_bias()
assume remove_bias() was previously called

View File

@ -36,6 +36,7 @@ class ComputeTempPartial : public Compute {
int dof_remove(int);
void remove_bias(int, double *);
void remove_bias_all();
void reapply_bias_all();
void restore_bias(int, double *);
void restore_bias_all();
double memory_usage();

View File

@ -84,6 +84,7 @@ void Velocity::command(int narg, char **arg)
sum_flag = 0;
momentum_flag = 1;
rotation_flag = 0;
bias_flag = 0;
loop_flag = ALL;
scale_flag = 1;
rfix = -1;
@ -135,41 +136,59 @@ void Velocity::init_external(const char *extgroup)
void Velocity::create(double t_desired, int seed)
{
int i;
double **vhold;
if (seed <= 0) error->all(FLERR,"Illegal velocity create command");
// if temperature = NULL, create a new ComputeTemp with the velocity group
// if sum_flag set, store a copy of current velocities
int tflag = 0;
if (temperature == NULL) {
if (sum_flag) {
double **v = atom->v;
int nlocal = atom->nlocal;
memory->create(vhold,nlocal,3,"velocity:vhold");
for (i = 0; i < nlocal; i++) {
vhold[i][0] = v[i][0];
vhold[i][1] = v[i][1];
vhold[i][2] = v[i][2];
}
}
// if temperature = NULL or bias_flag set,
// create a new ComputeTemp with the velocity group
int tcreate_flag = 0;
Compute *temperature_nobias = NULL;
if (temperature == NULL || bias_flag) {
char **arg = new char*[3];
arg[0] = (char *) "velocity_temp";
arg[1] = group->names[igroup];
arg[2] = (char *) "temp";
temperature = new ComputeTemp(lmp,3,arg);
tflag = 1;
if (temperature == NULL) {
temperature = new ComputeTemp(lmp,3,arg);
tcreate_flag = 1;
} else temperature_nobias = new ComputeTemp(lmp,3,arg);
delete [] arg;
}
// initialize temperature computation
// initialize temperature computation(s)
// warn if groups don't match
if (igroup != temperature->igroup && comm->me == 0)
error->warning(FLERR,"Mismatch between velocity and compute groups");
temperature->init();
temperature->setup();
if (temperature_nobias) {
temperature_nobias->init();
temperature_nobias->setup();
}
// store a copy of current velocities
// if bias_flag set, remove bias velocity from all atoms
// for some temperature computes, must first calculate temp to do that
double **v = atom->v;
int nlocal = atom->nlocal;
double **vhold;
memory->create(vhold,nlocal,3,"velocity:vnew");
for (i = 0; i < nlocal; i++) {
vhold[i][0] = v[i][0];
vhold[i][1] = v[i][1];
vhold[i][2] = v[i][2];
if (bias_flag) {
temperature->compute_scalar();
temperature->remove_bias_all();
}
// create new velocities, in uniform or gaussian distribution
@ -185,13 +204,18 @@ void Velocity::create(double t_desired, int seed)
// via random->reset()
// will always produce same V, independent of P
// adjust by factor for atom mass
// for 2d, set Vz to 0.0
// set xdim,ydim,zdim = 1/0 for whether to create velocity in those dims
// zdim = 0 for 2d
// any dims can be 0 if bias temperature compute turns them off
// currently only temp/partial does
double **v = atom->v;
double *rmass = atom->rmass;
double *mass = atom->mass;
int *type = atom->type;
int *mask = atom->mask;
int dimension = domain->dimension;
int nlocal = atom->nlocal;
int dim = domain->dimension;
int m;
double vx,vy,vz,factor;
@ -244,7 +268,7 @@ void Velocity::create(double t_desired, int seed)
else factor = 1.0/sqrt(mass[type[m]]);
v[m][0] = vx * factor;
v[m][1] = vy * factor;
if (dimension == 3) v[m][2] = vz * factor;
if (dim == 3) v[m][2] = vy * factor;
else v[m][2] = 0.0;
}
}
@ -276,7 +300,7 @@ void Velocity::create(double t_desired, int seed)
else factor = 1.0/sqrt(mass[type[i]]);
v[i][0] = vx * factor;
v[i][1] = vy * factor;
if (dimension == 3) v[i][2] = vz * factor;
if (dim == 3) v[i][2] = vz * factor;
else v[i][2] = 0.0;
}
}
@ -302,7 +326,7 @@ void Velocity::create(double t_desired, int seed)
else factor = 1.0/sqrt(mass[type[i]]);
v[i][0] = vx * factor;
v[i][1] = vy * factor;
if (dimension == 3) v[i][2] = vz * factor;
if (dim == 3) v[i][2] = vz * factor;
else v[i][2] = 0.0;
}
}
@ -314,10 +338,22 @@ void Velocity::create(double t_desired, int seed)
if (rotation_flag) zero_rotation();
// scale temp to desired value
// if bias flag is set, bias velocities have already been removed:
// no-bias compute calculates temp only for new thermal velocities
double t = temperature->compute_scalar();
double t;
if (bias_flag == 0) t = temperature->compute_scalar();
else t = temperature_nobias->compute_scalar();
rescale(t,t_desired);
// if bias_flag set, restore bias velocity to all atoms
// reapply for bias = compute temp/partial to reset v dims to 0.0
if (bias_flag) {
temperature->reapply_bias_all();
temperature->restore_bias_all();
}
// if sum_flag set, add back in previous velocities
if (sum_flag) {
@ -328,14 +364,15 @@ void Velocity::create(double t_desired, int seed)
v[i][2] += vhold[i][2];
}
}
memory->destroy(vhold);
}
// free local memory
// if temperature was created, delete it
// if temperature compute was created, delete it
memory->destroy(vhold);
delete random;
if (tflag) delete temperature;
if (tcreate_flag) delete temperature;
if (temperature_nobias) delete temperature_nobias;
}
/* ---------------------------------------------------------------------- */
@ -535,9 +572,19 @@ void Velocity::scale(int narg, char **arg)
temperature->setup();
// scale temp to desired value
// if bias flag is set:
// temperature calculation will be done accounting for bias
// remove/restore bias velocities before/after rescale
double t = temperature->compute_scalar();
rescale(t,t_desired);
if (bias_flag == 0) {
double t = temperature->compute_scalar();
rescale(t,t_desired);
} else {
double t = temperature->compute_scalar();
temperature->remove_bias_all();
rescale(t,t_desired);
temperature->restore_bias_all();
}
// if temperature was created, delete it
@ -660,6 +707,7 @@ void Velocity::zero(int narg, char **arg)
/* ----------------------------------------------------------------------
rescale velocities of group atoms to t_new from t_old
no bias applied here, since done in create() and scale()
------------------------------------------------------------------------- */
void Velocity::rescale(double t_old, double t_new)
@ -804,6 +852,12 @@ void Velocity::options(int narg, char **arg)
error->all(FLERR,
"Velocity temperature ID does not compute temperature");
iarg += 2;
} else if (strcmp(arg[iarg],"bias") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal velocity command");
if (strcmp(arg[iarg+1],"no") == 0) bias_flag = 0;
else if (strcmp(arg[iarg+1],"yes") == 0) bias_flag = 1;
else error->all(FLERR,"Illegal velocity command");
iarg += 2;
} else if (strcmp(arg[iarg],"loop") == 0) {
if (iarg+2 > narg) error->all(FLERR,"Illegal velocity command");
if (strcmp(arg[iarg+1],"all") == 0) loop_flag = ALL;
@ -824,4 +878,11 @@ void Velocity::options(int narg, char **arg)
iarg += 2;
} else error->all(FLERR,"Illegal velocity command");
}
// error check
if (bias_flag && temperature == NULL)
error->all(FLERR,"Cannot use velocity bias command without temp keyword");
if (bias_flag && temperature->tempbias == 0)
error->all(FLERR,"Velocity temperature ID does calculate a velocity bias");
}

View File

@ -35,7 +35,8 @@ class Velocity : protected Pointers {
private:
int igroup,groupbit;
int style;
int dist_flag,sum_flag,momentum_flag,rotation_flag,loop_flag,scale_flag,rfix;
int dist_flag,sum_flag,momentum_flag,rotation_flag;
int bias_flag,loop_flag,scale_flag,rfix;
double xscale,yscale,zscale;
class Compute *temperature;