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

This commit is contained in:
sjplimp
2015-07-24 17:57:18 +00:00
parent e91bd244af
commit 052f644d13

View File

@ -29,7 +29,7 @@
using namespace LAMMPS_NS; using namespace LAMMPS_NS;
enum{SUM,MINN,MAXX,AVE}; enum{SUM,SUMSQ,MINN,MAXX,AVE,AVESQ};
enum{X,V,F,COMPUTE,FIX,VARIABLE}; enum{X,V,F,COMPUTE,FIX,VARIABLE};
enum{PERATOM,LOCAL}; enum{PERATOM,LOCAL};
@ -62,9 +62,11 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) :
} }
if (strcmp(arg[iarg],"sum") == 0) mode = SUM; if (strcmp(arg[iarg],"sum") == 0) mode = SUM;
else if (strcmp(arg[iarg],"sumsq") == 0) mode = SUMSQ;
else if (strcmp(arg[iarg],"min") == 0) mode = MINN; else if (strcmp(arg[iarg],"min") == 0) mode = MINN;
else if (strcmp(arg[iarg],"max") == 0) mode = MAXX; else if (strcmp(arg[iarg],"max") == 0) mode = MAXX;
else if (strcmp(arg[iarg],"ave") == 0) mode = AVE; else if (strcmp(arg[iarg],"ave") == 0) mode = AVE;
else if (strcmp(arg[iarg],"avesq") == 0) mode = AVESQ;
else error->all(FLERR,"Illegal compute reduce command"); else error->all(FLERR,"Illegal compute reduce command");
iarg++; iarg++;
@ -257,14 +259,14 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) :
if (nvalues == 1) { if (nvalues == 1) {
scalar_flag = 1; scalar_flag = 1;
if (mode == SUM) extscalar = 1; if (mode == SUM || mode == SUMSQ) extscalar = 1;
else extscalar = 0; else extscalar = 0;
vector = onevec = NULL; vector = onevec = NULL;
indices = owner = NULL; indices = owner = NULL;
} else { } else {
vector_flag = 1; vector_flag = 1;
size_vector = nvalues; size_vector = nvalues;
if (mode == SUM) extvector = 1; if (mode == SUM || mode == SUMSQ) extvector = 1;
else extvector = 0; else extvector = 0;
vector = new double[size_vector]; vector = new double[size_vector];
onevec = new double[size_vector]; onevec = new double[size_vector];
@ -342,13 +344,13 @@ double ComputeReduce::compute_scalar()
double one = compute_one(0,-1); double one = compute_one(0,-1);
if (mode == SUM) { if (mode == SUM || mode == SUMSQ) {
MPI_Allreduce(&one,&scalar,1,MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&one,&scalar,1,MPI_DOUBLE,MPI_SUM,world);
} else if (mode == MINN) { } else if (mode == MINN) {
MPI_Allreduce(&one,&scalar,1,MPI_DOUBLE,MPI_MIN,world); MPI_Allreduce(&one,&scalar,1,MPI_DOUBLE,MPI_MIN,world);
} else if (mode == MAXX) { } else if (mode == MAXX) {
MPI_Allreduce(&one,&scalar,1,MPI_DOUBLE,MPI_MAX,world); MPI_Allreduce(&one,&scalar,1,MPI_DOUBLE,MPI_MAX,world);
} else if (mode == AVE) { } else if (mode == AVE || mode == AVESQ) {
MPI_Allreduce(&one,&scalar,1,MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&one,&scalar,1,MPI_DOUBLE,MPI_SUM,world);
bigint n = count(0); bigint n = count(0);
if (n) scalar /= n; if (n) scalar /= n;
@ -369,7 +371,7 @@ void ComputeReduce::compute_vector()
indices[m] = index; indices[m] = index;
} }
if (mode == SUM) { if (mode == SUM || mode == SUMSQ) {
for (int m = 0; m < nvalues; m++) for (int m = 0; m < nvalues; m++)
MPI_Allreduce(&onevec[m],&vector[m],1,MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&onevec[m],&vector[m],1,MPI_DOUBLE,MPI_SUM,world);
@ -417,7 +419,7 @@ void ComputeReduce::compute_vector()
} }
} }
} else if (mode == AVE) { } else if (mode == AVE || mode == AVESQ) {
for (int m = 0; m < nvalues; m++) { for (int m = 0; m < nvalues; m++) {
MPI_Allreduce(&onevec[m],&vector[m],1,MPI_DOUBLE,MPI_SUM,world); MPI_Allreduce(&onevec[m],&vector[m],1,MPI_DOUBLE,MPI_SUM,world);
bigint n = count(m); bigint n = count(m);
@ -450,11 +452,9 @@ double ComputeReduce::compute_one(int m, int flag)
int *mask = atom->mask; int *mask = atom->mask;
int nlocal = atom->nlocal; int nlocal = atom->nlocal;
double one; double one = 0.0;
if (mode == SUM) one = 0.0; if (mode == MINN) one = BIG;
else if (mode == MINN) one = BIG; if (mode == MAXX) one = -BIG;
else if (mode == MAXX) one = -BIG;
else if (mode == AVE) one = 0.0;
if (which[m] == X) { if (which[m] == X) {
double **x = atom->x; double **x = atom->x;
@ -633,6 +633,7 @@ bigint ComputeReduce::count(int m)
void ComputeReduce::combine(double &one, double two, int i) void ComputeReduce::combine(double &one, double two, int i)
{ {
if (mode == SUM || mode == AVE) one += two; if (mode == SUM || mode == AVE) one += two;
else if (mode == SUMSQ || mode == AVESQ) one += two*two;
else if (mode == MINN) { else if (mode == MINN) {
if (two < one) { if (two < one) {
one = two; one = two;