add support for building rigid bodies from custom atom properties or atom style variables

This commit is contained in:
Axel Kohlmeyer
2017-10-04 01:14:57 -04:00
parent f2c1172741
commit f12031f84d

View File

@ -29,6 +29,8 @@
#include "comm.h" #include "comm.h"
#include "random_mars.h" #include "random_mars.h"
#include "force.h" #include "force.h"
#include "input.h"
#include "variable.h"
#include "output.h" #include "output.h"
#include "math_const.h" #include "math_const.h"
#include "memory.h" #include "memory.h"
@ -127,15 +129,55 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) :
// nbody = # of non-zero ncount values // nbody = # of non-zero ncount values
// use nall as incremented ptr to set body[] values for each atom // use nall as incremented ptr to set body[] values for each atom
} else if (strcmp(arg[3],"molecule") == 0) { } else if (strcmp(arg[3],"molecule") == 0 || strcmp(arg[3],"custom") == 0) {
rstyle = MOLECULE; rstyle = MOLECULE;
iarg = 4; tagint *molecule;
int *mask = atom->mask;
int nlocal = atom->nlocal;
int custom_flag = strcmp(arg[3],"custom") == 0;
if (custom_flag) {
if (narg < 5) error->all(FLERR,"Illegal fix rigid command");
// determine whether atom-style variable or atom property is used.
if (strstr(arg[4],"i_") == arg[4]) {
int is_double;
int custom_index = atom->find_custom(arg[4]+2,is_double);
if (custom_index == -1)
error->all(FLERR,"Fix rigid custom requires previously defined property/atom");
else if (is_double)
error->all(FLERR,"Fix rigid custom requires integer-valued property/atom");
int minval = INT_MAX;
int *value = atom->ivector[custom_index];
for (i = 0; i < nlocal; i++)
if (mask[i] & groupbit) minval = MIN(minval,value[i]);
int vmin = minval;
MPI_Allreduce(&vmin,&minval,1,MPI_INT,MPI_MIN,world);
molecule = new tagint[nlocal];
for (i = 0; i < nlocal; i++)
if (mask[i] & groupbit) molecule[i] = (tagint)(value[i] - minval + 1);
} else if (strstr(arg[4],"v_") == arg[4]) {
int ivariable = input->variable->find(arg[4]+2);
if (ivariable < 0)
error->all(FLERR,"Variable name for fix rigid custom does not exist");
if (input->variable->atomstyle(ivariable) == 0)
error->all(FLERR,"Fix rigid custom variable is not atom-style variable");
double *value = new double[nlocal];
input->variable->compute_atom(ivariable,0,value,1,0);
int minval = INT_MAX;
for (i = 0; i < nlocal; i++)
if (mask[i] & groupbit) minval = MIN(minval,(int)value[i]);
int vmin = minval;
MPI_Allreduce(&vmin,&minval,1,MPI_INT,MPI_MIN,world);
molecule = new tagint[nlocal];
for (i = 0; i < nlocal; i++)
if (mask[i] & groupbit) molecule[i] = (tagint)((int)value[i] - minval + 1);
delete[] value;
} else error->all(FLERR,"Unsupported fix rigid custom property");
} else {
if (atom->molecule_flag == 0) if (atom->molecule_flag == 0)
error->all(FLERR,"Fix rigid molecule requires atom attribute molecule"); error->all(FLERR,"Fix rigid molecule requires atom attribute molecule");
molecule = atom->molecule;
int *mask = atom->mask; }
tagint *molecule = atom->molecule; iarg = 4 + custom_flag;
int nlocal = atom->nlocal;
tagint maxmol_tag = -1; tagint maxmol_tag = -1;
for (i = 0; i < nlocal; i++) for (i = 0; i < nlocal; i++)
@ -174,6 +216,7 @@ FixRigid::FixRigid(LAMMPS *lmp, int narg, char **arg) :
} }
memory->destroy(ncount); memory->destroy(ncount);
if (custom_flag) delete [] molecule;
// each listed group is a rigid body // each listed group is a rigid body
// check if all listed groups exist // check if all listed groups exist