Implement maxabs and minabs atom reduction operations

This commit is contained in:
Tim Bernhard
2023-04-11 18:52:34 +02:00
parent ff5b4e971d
commit 7a32152ee5
3 changed files with 65 additions and 17 deletions

View File

@ -33,6 +33,34 @@ using namespace LAMMPS_NS;
#define BIG 1.0e20
//----------------------------------------------------------------
void abs_max(void *in, void *inout, int *len, MPI_Datatype *type)
{
// r is the already reduced value, n is the new value
double n = std::fabs(*(double *) in), r = *(double *) inout;
double m;
if (n > r) {
m = n;
} else {
m = r;
}
*(double *) inout = m;
}
void abs_min(void *in, void *inout, int *len, MPI_Datatype *type)
{
// r is the already reduced value, n is the new value
double n = std::fabs(*(double *) in), r = *(double *) inout;
double m;
if (n < r) {
m = n;
} else {
m = r;
}
*(double *) inout = m;
}
/* ---------------------------------------------------------------------- */
ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) :
@ -67,10 +95,28 @@ ComputeReduce::ComputeReduce(LAMMPS *lmp, int narg, char **arg) :
mode = AVESQ;
else if (strcmp(arg[iarg], "aveabs") == 0)
mode = AVEABS;
else if (strcmp(arg[iarg], "maxabs") == 0)
mode = MAXABS;
else if (strcmp(arg[iarg], "minabs") == 0)
mode = MINABS;
else
error->all(FLERR, "Unknown compute {} mode: {}", style, arg[iarg]);
iarg++;
if (mode == SUM || mode == SUMSQ || mode == SUMABS) {
this->scalar_reduction_operation = MPI_SUM;
} else if (mode == AVE || mode == AVESQ || mode == AVEABS) {
this->scalar_reduction_operation = MPI_SUM;
} else if (mode == MINN) {
this->scalar_reduction_operation = MPI_MIN;
} else if (mode == MAXX) {
this->scalar_reduction_operation = MPI_MAX;
} else if (mode == MAXABS) {
MPI_Op_create(&abs_max, 1, &this->scalar_reduction_operation);
} else if (mode == MINABS) {
MPI_Op_create(&abs_min, 1, &this->scalar_reduction_operation);
}
// expand args if any have wildcard character "*"
int expand = 0;
@ -329,14 +375,9 @@ double ComputeReduce::compute_scalar()
double one = compute_one(0, -1);
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 || mode == AVEABS) {
MPI_Allreduce(&one, &scalar, 1, MPI_DOUBLE, MPI_SUM, world);
MPI_Allreduce(&one, &scalar, 1, MPI_DOUBLE, this->scalar_reduction_operation, world);
if (mode == AVE || mode == AVESQ || mode == AVEABS) {
bigint n = count(0);
if (n) scalar /= n;
}
@ -441,7 +482,7 @@ double ComputeReduce::compute_one(int m, int flag)
int nlocal = atom->nlocal;
double one = 0.0;
if (mode == MINN) one = BIG;
if (mode == MINN || mode == MINABS) one = BIG;
if (mode == MAXX) one = -BIG;
if (val.which == ArgInfo::X) {
@ -637,6 +678,11 @@ void ComputeReduce::combine(double &one, double two, int i)
one = two;
index = i;
}
} else if (mode == MAXABS) {
if (std::fabs(two) > one) {
one = std::fabs(two);
index = i;
}
}
}