aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetReduce/src
diff options
context:
space:
mode:
authorschnetter <>2002-08-02 12:57:00 +0000
committerschnetter <>2002-08-02 12:57:00 +0000
commitce0ced4bba910424d519ff78167cbe461a624719 (patch)
treed2cceb52ef7668757c167e9b083f9625c94a4afe /Carpet/CarpetReduce/src
parentf1d6dad1fcc50971399e5d502e1c671c34ff833f (diff)
Added "product" reduction.
darcs-hash:20020802125726-07bb3-eafbaa7db980420ad077192ce6e7ef163d1bf79a.gz
Diffstat (limited to 'Carpet/CarpetReduce/src')
-rw-r--r--Carpet/CarpetReduce/src/reduce.cc24
1 files changed, 21 insertions, 3 deletions
diff --git a/Carpet/CarpetReduce/src/reduce.cc b/Carpet/CarpetReduce/src/reduce.cc
index 5b602f3b6..f32964fd8 100644
--- a/Carpet/CarpetReduce/src/reduce.cc
+++ b/Carpet/CarpetReduce/src/reduce.cc
@@ -1,4 +1,4 @@
-// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetReduce/src/reduce.cc,v 1.10 2002/06/06 14:20:16 schnetter Exp $
+// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetReduce/src/reduce.cc,v 1.11 2002/08/02 14:57:26 schnetter Exp $
#include <assert.h>
#include <float.h>
@@ -19,7 +19,7 @@
#include "reduce.hh"
-static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetReduce/src/reduce.cc,v 1.10 2002/06/06 14:20:16 schnetter Exp $";
+static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetReduce/src/reduce.cc,v 1.11 2002/08/02 14:57:26 schnetter Exp $";
CCTK_FILEVERSION(CarpetReduce_reduce_cc)
@@ -41,7 +41,7 @@ namespace CarpetReduce {
// Poor man's RTTI
- enum ared { do_count, do_minimum, do_maximum, do_sum, do_sum_abs,
+ enum ared { do_count, do_minimum, do_maximum, do_product, do_sum, do_sum_abs,
do_sum_squared, do_average, do_norm1, do_norm2, do_norm_inf };
@@ -139,6 +139,18 @@ namespace CarpetReduce {
template<> inline void maximum::op<complex<long double> > ::reduce (complex<long double>& accum, const complex<long double>& val) { accum = complex<long double>(max(accum.real(), val.real()), max(accum.imag(), val.imag())); }
#endif
+ struct product : reduction {
+ ared thered () const { return do_product; }
+ bool uses_cnt () const { return false; }
+ template<class T>
+ struct op {
+ static inline void initialise (T& accum) { accum = 1; }
+ static inline void reduce (T& accum, const T& val) { accum *= val; }
+ static inline void finalise (T& accum, const T& cnt) { }
+ };
+ MPI_Op mpi_op () const { return MPI_PROD; }
+ };
+
struct sum : reduction {
ared thered () const { return do_sum; }
bool uses_cnt () const { return false; }
@@ -301,6 +313,7 @@ namespace CarpetReduce {
INITIALISE(count,T); \
INITIALISE(minimum,T); \
INITIALISE(maximum,T); \
+ INITIALISE(product,T); \
INITIALISE(sum,T); \
INITIALISE(sum_abs,T); \
INITIALISE(sum_squared,T); \
@@ -373,6 +386,7 @@ namespace CarpetReduce {
REDUCE(count,T); \
REDUCE(minimum,T); \
REDUCE(maximum,T); \
+ REDUCE(product,T); \
REDUCE(sum,T); \
REDUCE(sum_abs,T); \
REDUCE(sum_squared,T); \
@@ -461,6 +475,7 @@ namespace CarpetReduce {
FINALISE(count,T); \
FINALISE(minimum,T); \
FINALISE(maximum,T); \
+ FINALISE(product,T); \
FINALISE(sum,T); \
FINALISE(sum_abs,T); \
FINALISE(sum_squared,T); \
@@ -673,6 +688,7 @@ namespace CarpetReduce {
REDUCTION(count);
REDUCTION(minimum);
REDUCTION(maximum);
+ REDUCTION(product);
REDUCTION(sum);
REDUCTION(sum_abs);
REDUCTION(sum_squared);
@@ -690,6 +706,7 @@ namespace CarpetReduce {
CCTK_RegisterReductionOperator (count_GVs, "count");
CCTK_RegisterReductionOperator (minimum_GVs, "minimum");
CCTK_RegisterReductionOperator (maximum_GVs, "maximum");
+ CCTK_RegisterReductionOperator (product_GVs, "product");
CCTK_RegisterReductionOperator (sum_GVs, "sum");
CCTK_RegisterReductionOperator (sum_abs_GVs, "sum_abs");
CCTK_RegisterReductionOperator (sum_squared_GVs, "sum_squared");
@@ -701,6 +718,7 @@ namespace CarpetReduce {
CCTK_RegisterReductionArrayOperator (count_arrays, "count");
CCTK_RegisterReductionArrayOperator (minimum_arrays, "minimum");
CCTK_RegisterReductionArrayOperator (maximum_arrays, "maximum");
+ CCTK_RegisterReductionArrayOperator (product_arrays, "product");
CCTK_RegisterReductionArrayOperator (sum_arrays, "sum");
CCTK_RegisterReductionArrayOperator (sum_abs_arrays, "sum_abs");
CCTK_RegisterReductionArrayOperator (sum_squared_arrays, "sum_squared");