Implement a aveabs and sumabs reduce command

This commit is contained in:
Tim Bernhard
2022-05-02 17:34:08 +02:00
parent d51017ff50
commit 0e5a66b1cd
3 changed files with 17 additions and 11 deletions

View File

@ -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;

View File

@ -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 **);