Implement a aveabs and sumabs reduce command
This commit is contained in:
@ -56,10 +56,12 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) :
|
||||
|
||||
if (strcmp(arg[iarg],"sum") == 0) mode = SUM;
|
||||
else if (strcmp(arg[iarg],"sumsq") == 0) mode = SUMSQ;
|
||||
else if (strcmp(arg[iarg],"sumabs") == 0) mode = SUMABS;
|
||||
else if (strcmp(arg[iarg],"min") == 0) mode = MINN;
|
||||
else if (strcmp(arg[iarg],"max") == 0) mode = MAXX;
|
||||
else if (strcmp(arg[iarg],"ave") == 0) mode = AVE;
|
||||
else if (strcmp(arg[iarg],"avesq") == 0) mode = AVESQ;
|
||||
else if (strcmp(arg[iarg],"aveabs") == 0) mode = AVEABS;
|
||||
else error->all(FLERR,"Illegal compute reduce command");
|
||||
iarg++;
|
||||
|
||||
@ -261,14 +263,14 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) :
|
||||
|
||||
if (nvalues == 1) {
|
||||
scalar_flag = 1;
|
||||
if (mode == SUM || mode == SUMSQ) extscalar = 1;
|
||||
if (mode == SUM || mode == SUMSQ || mode == SUMABS) extscalar = 1;
|
||||
else extscalar = 0;
|
||||
vector = onevec = nullptr;
|
||||
indices = owner = nullptr;
|
||||
} else {
|
||||
vector_flag = 1;
|
||||
size_vector = nvalues;
|
||||
if (mode == SUM || mode == SUMSQ) extvector = 1;
|
||||
if (mode == SUM || mode == SUMSQ || mode == SUMABS) extvector = 1;
|
||||
else extvector = 0;
|
||||
vector = new double[size_vector];
|
||||
onevec = new double[size_vector];
|
||||
@ -346,13 +348,13 @@ double ComputeReduce::compute_scalar()
|
||||
|
||||
double one = compute_one(0,-1);
|
||||
|
||||
if (mode == SUM || mode == SUMSQ) {
|
||||
if (mode == SUM || mode == SUMSQ || mode == SUMABS) {
|
||||
MPI_Allreduce(&one,&scalar,1,MPI_DOUBLE,MPI_SUM,world);
|
||||
} else if (mode == MINN) {
|
||||
MPI_Allreduce(&one,&scalar,1,MPI_DOUBLE,MPI_MIN,world);
|
||||
} else if (mode == MAXX) {
|
||||
MPI_Allreduce(&one,&scalar,1,MPI_DOUBLE,MPI_MAX,world);
|
||||
} else if (mode == AVE || mode == AVESQ) {
|
||||
} else if (mode == AVE || mode == AVESQ || mode == AVEABS) {
|
||||
MPI_Allreduce(&one,&scalar,1,MPI_DOUBLE,MPI_SUM,world);
|
||||
bigint n = count(0);
|
||||
if (n) scalar /= n;
|
||||
@ -373,7 +375,7 @@ void ComputeReduce::compute_vector()
|
||||
indices[m] = index;
|
||||
}
|
||||
|
||||
if (mode == SUM || mode == SUMSQ) {
|
||||
if (mode == SUM || mode == SUMSQ || mode == AVEABS) {
|
||||
for (int m = 0; m < nvalues; m++)
|
||||
MPI_Allreduce(&onevec[m],&vector[m],1,MPI_DOUBLE,MPI_SUM,world);
|
||||
|
||||
@ -421,7 +423,7 @@ void ComputeReduce::compute_vector()
|
||||
}
|
||||
}
|
||||
|
||||
} else if (mode == AVE || mode == AVESQ) {
|
||||
} else if (mode == AVE || mode == AVESQ || mode == AVEABS) {
|
||||
for (int m = 0; m < nvalues; m++) {
|
||||
MPI_Allreduce(&onevec[m],&vector[m],1,MPI_DOUBLE,MPI_SUM,world);
|
||||
bigint n = count(m);
|
||||
@ -644,6 +646,7 @@ void ComputeReduce::combine(double &one, double two, int i)
|
||||
{
|
||||
if (mode == SUM || mode == AVE) one += two;
|
||||
else if (mode == SUMSQ || mode == AVESQ) one += two*two;
|
||||
else if (mode == SUMABS || mode == AVEABS) one += std::fabs(two);
|
||||
else if (mode == MINN) {
|
||||
if (two < one) {
|
||||
one = two;
|
||||
|
||||
@ -26,7 +26,7 @@ namespace LAMMPS_NS {
|
||||
|
||||
class ComputeReduce : public Compute {
|
||||
public:
|
||||
enum { SUM, SUMSQ, MINN, MAXX, AVE, AVESQ };
|
||||
enum { SUM, SUMSQ, SUMABS, MINN, MAXX, AVE, AVESQ, AVEABS };
|
||||
enum { PERATOM, LOCAL };
|
||||
|
||||
ComputeReduce(class LAMMPS *, int, char **);
|
||||
|
||||
Reference in New Issue
Block a user