diff --git a/src/EXTRA-FIX/fix_ave_moments.cpp b/src/EXTRA-FIX/fix_ave_moments.cpp index 901b59d949..8f64cc973d 100644 --- a/src/EXTRA-FIX/fix_ave_moments.cpp +++ b/src/EXTRA-FIX/fix_ave_moments.cpp @@ -22,6 +22,7 @@ #include "compute.h" #include "error.h" #include "input.h" +#include "math_special.h" #include "memory.h" #include "modify.h" #include "update.h" @@ -31,6 +32,8 @@ using namespace LAMMPS_NS; using namespace FixConst; +using MathSpecial::square; +using MathSpecial::cube; enum { MEAN, STDDEV, VARIANCE, SKEW, KURTOSIS }; @@ -552,4 +555,80 @@ void FixAveMoments::append_values() void FixAveMoments::update_results() { + const int count = window_filled ? nrepeat : iwindow; + // Delay until we can safely do all moments. Avoids branching in the hot loop. + if (count<3) return; + + double *result = result_list[iresult]; + + // zero out previous values + + for (int i = 0; i < size_vector; i++) + result[i] = 0.0; + + const double inv_n = 1.0 / count; + const double fk2 = (double)count / (count - 1); + const double fk3 = square((double)count) / ((count - 1) * (count - 2)); + const double np1_nm3 = (count+1.0)/(count-3.0); + const double _3_nm1_nm3 = 3.0 * (count-1.0)/(count-3.0); + + // Each value is a series that can be processed individually + for (int i = 0; i < nvalues; i++) { + const double* series = window_list[i]; + + // first pass: mean + double mean = 0.0; + for (int j = 0; j= nhistory) + iresult = 0; }