Updated exponential fitting to make it robust.
authorDavid van der Spoel <spoel@xray.bmc.uu.se>
Thu, 8 Jan 2015 10:16:27 +0000 (11:16 +0100)
committerGerrit Code Review <gerrit@gerrit.gromacs.org>
Fri, 17 Apr 2015 10:31:11 +0000 (12:31 +0200)
The exponential fitting code was not robust under different
data. This is improved by ensuring that e.g. time constants
are always positive. For multi-exponential fits the time constants
are guaranteed to be in increasing order. Rewrote test code.

Added test for error estimation that reproduces 5.0 behavior.

Added new manual section "Curve fitting in GROMACS" (8.6).

General cleanups of the code were done.

Change-Id: Ib72fccf7f85742afeeb3fc0fd6fbd44c1c47795a

35 files changed:
docs/manual/analyse.tex
docs/manual/monster.bib
src/external/lmfit/lmcurve.c
src/external/lmfit/lmcurve.h
src/gromacs/correlationfunctions/expfit.c [deleted file]
src/gromacs/correlationfunctions/expfit.cpp [new file with mode: 0644]
src/gromacs/correlationfunctions/expfit.h
src/gromacs/correlationfunctions/tests/expfit.cpp [changed mode: 0755->0644]
src/gromacs/correlationfunctions/tests/refdata/AutocorrTest_EacCos.xml
src/gromacs/correlationfunctions/tests/refdata/AutocorrTest_EacNormal.xml
src/gromacs/correlationfunctions/tests/refdata/AutocorrTest_EacP0.xml
src/gromacs/correlationfunctions/tests/refdata/AutocorrTest_EacP1.xml
src/gromacs/correlationfunctions/tests/refdata/AutocorrTest_EacP2.xml
src/gromacs/correlationfunctions/tests/refdata/AutocorrTest_EacP4.xml
src/gromacs/correlationfunctions/tests/refdata/AutocorrTest_EacVector.xml
src/gromacs/correlationfunctions/tests/refdata/ExpfitTest_EffnERF.xml
src/gromacs/correlationfunctions/tests/refdata/ExpfitTest_EffnERREST.xml
src/gromacs/correlationfunctions/tests/refdata/ExpfitTest_EffnEXP1.xml
src/gromacs/correlationfunctions/tests/refdata/ExpfitTest_EffnEXP2.xml
src/gromacs/correlationfunctions/tests/refdata/ExpfitTest_EffnEXP5.xml
src/gromacs/correlationfunctions/tests/refdata/ExpfitTest_EffnEXP7.xml
src/gromacs/correlationfunctions/tests/refdata/ExpfitTest_EffnEXP9.xml
src/gromacs/correlationfunctions/tests/refdata/ExpfitTest_EffnEXPEXP.xml [moved from src/gromacs/correlationfunctions/tests/refdata/ExpfitTest_EffnEXP3.xml with 63% similarity]
src/gromacs/correlationfunctions/tests/refdata/ExpfitTest_EffnPRES.xml
src/gromacs/correlationfunctions/tests/refdata/ExpfitTest_EffnVAC.xml
src/gromacs/correlationfunctions/tests/testERF.xvg [new file with mode: 0644]
src/gromacs/correlationfunctions/tests/testERREST.xvg [new file with mode: 0644]
src/gromacs/correlationfunctions/tests/testEXP.xvg [deleted file]
src/gromacs/correlationfunctions/tests/testINVEXP.xvg [changed mode: 0755->0644]
src/gromacs/correlationfunctions/tests/testINVEXP79.xvg [new file with mode: 0644]
src/gromacs/gmxana/gmx_analyze.c
src/gromacs/gmxana/gmx_densorder.cpp
src/gromacs/gmxana/gmx_dielectric.c
src/gromacs/gmxana/gmx_hbond.c
src/gromacs/gmxana/gmx_tcaf.c

index ff2a382f06e363e0e6e16755dfc1dfb4f7322994..d235e9c45491fc27a73f753b3453b2cde4365b85 100644 (file)
@@ -1,7 +1,7 @@
 %
 % This file is part of the GROMACS molecular simulation package.
 %
-% Copyright (c) 2013,2014, by the GROMACS development team, led by
+% Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
 % Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
 % and including many others, as listed in the AUTHORS file in the
 % top-level source directory and at http://www.gromacs.org.
@@ -479,6 +479,115 @@ but this is not very accurate~\cite{Hess2002a}, and
 actually the values do not converge.
 %} % Brace matches ifthenelse test for gmxlite
 
+\section{Curve fitting in \gromacs}
+\subsection{Sum of exponential functions}
+Sometimes it is useful to fit a curve to an analytical function, for
+example in the case of autocorrelation functions with noisy
+tails. {\gromacs} is not a general purpose curve-fitting tool however
+and therefore {\gromacs} only supports a limited number of
+functions. 
+Table~\ref{tab:fitfn} lists the available options with the
+corresponding command-line options. The underlying routines for
+fitting use the Levenberg-Marquardt algorithm as implemented in the
+{\tt lmfit} package~\cite{lmfit} (a bare-bones version of which is
+included in {\gromacs} in which an option for error-weighted fitting
+was implemented). 
+\begin{table}[ht]
+\centering
+\caption{Overview of fitting functions supported in (most) analysis tools
+  that compute autocorrelation functions. The ``Note'' column describes
+  properties of the output parameters.}
+\label{tab:fitfn}
+\begin{tabular}{lcc}
+\hline
+Command & Functional form $f(t)$& Note\\
+line option         &           & \\
+\hline
+exp        & $e^{-t/{a_0}}$ &\\
+aexp      & $a_1e^{-t/{a_0}}$ &\\
+exp_exp & $a_1e^{-t/{a_0}}+(1-a_1)e^{-t/{a_2}}$ & $a_2\ge a_0\ge 0$\\
+exp5      & $a_1e^{-t/{a_0}}+a_3e^{-t/{a_2}}+a_4$ &$a_2\ge a_0\ge 0$\\
+exp7     &
+$a_1e^{-t/{a_0}}+a_3e^{-t/{a_2}}+a_5e^{-t/{a_4}}+a_6$&$a_4\ge a_2\ge
+a_0 \ge0$\\
+exp9    &
+$a_1e^{-t/{a_0}}+a_3e^{-t/{a_2}}+a_5e^{-t/{a_4}}+a_7e^{-t/{a_6}}+a_8$&$a_6\ge
+a_4\ge a_2\ge a_0\ge 0$\\
+\hline
+\end{tabular}
+\end{table}
+
+\subsection{Error estimation}
+Under the hood {\gromacs} implements some more fitting functions,
+namely a function to estimate the error in time-correlated data due to Hess~\cite{Hess2002a}:
+\beq
+\varepsilon^2(t) =
+\alpha\tau_1\left(1+\frac{\tau_1}{t}\left(e^{-t/\tau_1}-1\right)\right)
+      + (1-\alpha)\tau_2\left(1+\frac{\tau_2}{t}\left(e^{-t/\tau_2}-1\right)\right)
+\eeq
+where $\tau_1$ and
+$\tau_2$ are time constants (with $\tau_2 \ge \tau_1$) and $\alpha$
+usually is close to 1 (in the fitting procedure it is enforced that
+$0\leq\alpha\leq 1$). This is used in {\tt gmx analyze} for error
+estimation using
+\beq
+\lim_{t\rightarrow\infty}\varepsilon(t) = \sigma\sqrt{\frac{2(\alpha\tau_1+(1-\alpha)\tau_2)}{T}}
+\eeq
+where $\sigma$ is the standard deviation of the data set and $T$ is
+the total simulation time~\cite{Hess2002a}.
+
+\subsection{Interphase boundary demarcation}
+In order to determine the position and width of an interface,
+Steen-S{\ae}thre {\em et al.} fitted a density profile to the
+following function
+\beq
+f(x) ~=~ \frac{a_0+a_1}{2} - \frac{a_0-a_1}{2}{\rm
+  erf}\left(\frac{x-a_2}{a_3^2}\right)
+\eeq
+where $a_0$ and $a_1$ are densities of different phases, $x$ is the
+coordinate normal to the interface, $a_2$ is the position of the
+interface and $a_3$ is the width of the
+interface~\cite{Steen-Saethre2014a}.
+This is implemented in {\tt gmx densorder}.
+
+\subsection{Transverse current autocorrelation function}
+In order to establish the transverse current autocorrelation function
+(useful for computing viscosity~\cite{Palmer1994a})
+the following function is fitted:
+\beq
+f(x) ~=~ e^{-\nu}\left({\rm cosh}(\omega\nu)+\frac{{\rm
+    sinh}(\omega\nu)}{\omega}\right)
+\eeq
+with $\nu = x/(2a_0)$ and $\omega = \sqrt{1-a_1}$.
+This is implemented in {\tt gmx tcaf}.
+
+\subsection{Viscosity estimation from pressure autocorrelation
+  function}
+The viscosity is a notoriously difficult property to extract from
+simulations~\cite{Hess2002a,Wensink2003a}. It is {\em in principle}
+possible to determine it by integrating the pressure autocorrelation
+function~\cite{PSmith93c}, however this is often hampered by the noisy
+tail of the ACF. A workaround to this is fitting the ACF to the
+following function~\cite{Guo2002b}:
+\beq
+f(t)/f(0) = (1-C) {\rm cos}(\omega t) e^{-(t/\tau_f)^{\beta_f}} + C
+e^{-(t/\tau_s)^{\beta_s}}
+\eeq
+where $\omega$ is the frequency of rapid pressure oscillations (mainly
+due to bonded forces in molecular simulations), $\tau_f$ and $\beta_f$
+are the time constant and exponent of fast relaxation in a
+stretched-exponential approximation, $\tau_s$ and $\beta_s$ are constants
+for slow relaxation and $C$ is the pre-factor that determines the
+weight between fast and slow relaxation. After a fit, the integral of
+the function $f(t)$ is used to compute the viscosity:
+\beq
+\eta = \frac{V}{k_B T}\int_0^{\infty} f(t) dt
+\eeq
+This equation has been
+applied to computing the bulk and shear viscosity using different
+elements from the pressure tensor~\cite{Fanourgakis2012a}.
+This is implemented in {\tt gmx viscosity}.
+
 \section{Mean Square Displacement}
 \label{sec:msd}
 {\tt gmx msd}\\
index 0774ae539cbb954bcf42bb600075a03f676570b2..a7ba8b5b9d613a2afa11ec1211c008e5db42666b 100644 (file)
@@ -8691,3 +8691,53 @@ pages = {105--120},
 keywords = {CHARMM, force field, molecular dynamics, parametrization, DNA, RNA},
 year = {2000},
 }
+
+@Misc{lmfit,
+  author =    {Joachim Wuttke},
+  title =     {lmfit},
+  howpublished = {http://apps.jcns.fz-juelich.de/doku/sc/lmfit},
+  year =      2013}
+
+@Article{Steen-Saethre2014a,
+  author =       {B. Steen-S{\ae}thre and A. C. Hoffmann and D. van der Spoel},
+  title =        {Order Parameters and Algorithmic Approaches for Detection and Demarcation of Interfaces in Hydrate−Fluid and Ice−Fluid Systems},
+  journal =      {J. Chem. Theor. Comput.},
+  year =         2014,
+  volume =    10,
+  pages =     {5606-5615}}
+
+@Article{ Wensink2003a,
+  author =      "E. J. W. Wensink and A. C. Hoffmann and P. J. {van
+                  Maaren} and D. {van der Spoel}",
+  title =       "Dynamic properties of water/alcohol mixtures studied
+                  by computer simulation",
+  journal =     BTjcp,
+  year =        2003,
+  volume =      119,
+  pages =       "7308-7317"
+}
+
+@Article{Guo2002b,
+  author =       {Guang-Jun Guo and Yi-Gang Zhang and Keith Refson  and Ya-Juan Zhao},
+  title =        {Viscosity and stress autocorrelation function in supercooled water: a molecular dynamics study},
+  journal =      {Mol. Phys.},
+  year =         2002,
+  volume =    100,
+  pages =     {2617-2627}}
+  
+@Article{Fanourgakis2012a,
+  author =       {George S. Fanourgakis and J. S. Medina and R. Prosmiti},
+  title =        {Determining the Bulk Viscosity of Rigid Water Models},
+  journal =      {J. Phys. Chem. A},
+  year =         2012,
+  volume =    116,
+  pages =     {2564-2570}}
+
+@Article{Palmer1994a,
+  author =       {B. J. Palmer},
+  title =        {Transverse-current autocorrelation-function calculations of the shear viscosity for molecular liquids.},
+  journal =      {Phys. Rev. E},
+  year =         1994,
+  volume =    49,
+  pages =     {359-366}}
+
index 838f884bb6cb05c0cb152bd6e02104e10ca0b47c..4057fbff83672ee16a030060bd4e38311ee9f7e8 100644 (file)
@@ -18,6 +18,7 @@
 typedef struct {
     const double *t;
     const double *y;
+    const double *dy;
     double (*f)(double t, const double *par);
 } lmcurve_data_struct;
 
@@ -25,27 +26,28 @@ typedef struct {
 void lmcurve_evaluate( const double *par, int m_dat, const void *data,
                        double *fvec, gmx_unused int *info )
 {
-    int i;
+    int    i;
+    double fy;
+    lmcurve_data_struct *d = (lmcurve_data_struct*) data;
     for (i = 0; i < m_dat; i++)
     {
-        fvec[i] =
-            ((lmcurve_data_struct*)data)->y[i] -
-            ((lmcurve_data_struct*)data)->f(
-                    ((lmcurve_data_struct*)data)->t[i], par );
+        fy      = d->f(d->t[i], par );
+        fvec[i] = (d->y[i] - fy)/d->dy[i];
     }
 }
 
 
 void lmcurve( int n_par, double *par, int m_dat,
-              const double *t, const double *y,
+              const double *t, const double *y, const double *dy,
               double (*f)( double t, const double *par ),
               const lm_control_struct *control,
               lm_status_struct *status )
 {
     lmcurve_data_struct data;
-    data.t = t;
-    data.y = y;
-    data.f = f;
+    data.t  = t;
+    data.y  = y;
+    data.dy = dy;
+    data.f  = f;
 
     lmmin( n_par, par, m_dat, (const void*) &data,
            lmcurve_evaluate, control, status );
index d74114caaf8f10f7dd526b3f7ccf280f16c10c1d..756805e6e09b0fdda0f9c5b65258dc9a5263d226 100644 (file)
@@ -29,7 +29,7 @@
 __BEGIN_DECLS
 
 void lmcurve( int n_par, double *par, int m_dat,
-              const double *t, const double *y,
+              const double *t, const double *y, const double *dy,
               double (*f)( double t, const double *par ),
               const lm_control_struct *control,
               lm_status_struct *status );
diff --git a/src/gromacs/correlationfunctions/expfit.c b/src/gromacs/correlationfunctions/expfit.c
deleted file mode 100644 (file)
index 490e0be..0000000
+++ /dev/null
@@ -1,698 +0,0 @@
-/*
- * This file is part of the GROMACS molecular simulation package.
- *
- * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
- * Copyright (c) 2001-2004, The GROMACS development team.
- * Copyright (c) 2013,2014, by the GROMACS development team, led by
- * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
- * and including many others, as listed in the AUTHORS file in the
- * top-level source directory and at http://www.gromacs.org.
- *
- * GROMACS is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1
- * of the License, or (at your option) any later version.
- *
- * GROMACS is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with GROMACS; if not, see
- * http://www.gnu.org/licenses, or write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
- *
- * If you want to redistribute modifications to GROMACS, please
- * consider that scientific software is very special. Version
- * control is crucial - bugs must be traceable. We will be happy to
- * consider code for inclusion in the official distribution, but
- * derived work must not be called official GROMACS. Details are found
- * in the README & COPYING files - if they are missing, get the
- * official version at http://www.gromacs.org.
- *
- * To help us fund GROMACS development, we humbly ask that you cite
- * the research papers on the package. Check out http://www.gromacs.org.
- */
-/*! \internal
- * \file
- * \brief
- * Implements routine for fitting a data set to a curve
- *
- * \author David van der Spoel <david.vanderspoel@icm.uu.se>
- * \ingroup module_correlationfunctions
- */
-#include "gmxpre.h"
-
-#include "expfit.h"
-
-#include <math.h>
-#include <string.h>
-
-#include "external/lmfit/lmcurve.h"
-
-#include "gromacs/correlationfunctions/integrate.h"
-#include "gromacs/fileio/xvgr.h"
-#include "gromacs/legacyheaders/macros.h"
-#include "gromacs/math/vec.h"
-#include "gromacs/utility/fatalerror.h"
-#include "gromacs/utility/futil.h"
-#include "gromacs/utility/real.h"
-#include "gromacs/utility/smalloc.h"
-
-/*! \brief Number of parameters for each fitting function */
-static const int   nfp_ffn[effnNR] = { 0, 1, 2, 3, 2, 5, 7, 9, 4, 3, 6};
-
-const char        *s_ffn[effnNR+2] = {
-    NULL, "none", "exp", "aexp", "exp_exp", "vac",
-    "exp5", "exp7", "exp9", "erffit", "effnPRES", NULL, NULL
-};
-/* We don't allow errest as a choice on the command line */
-
-/*! \brief Long description for each fitting function type */
-static const char *longs_ffn[effnNR] = {
-    "no fit",
-    "y = exp(-x/a1)",
-    "y = a2 exp(-x/a1)",
-    "y = a2 exp(-x/a1) + (1-a2) exp(-x/a3)",
-    "y = exp(-v) (cosh(wv) + 1/w sinh(wv)), v = x/(2 a1), w = sqrt(1 - a2)",
-    "y = a1 exp(-x/a2) +  a3 exp(-x/a4) + a5",
-    "y = a1 exp(-x/a2) +  a3 exp(-x/a4) + a5 exp(-x/a6) + a7",
-    "y = a1 exp(-x/a2) +  a3 exp(-x/a4) + a5 exp(-x/a6) + a7 exp(-x/a8) + a9",
-    "y = 1/2*(a1+a2) - 1/2*(a1-a2)*erf( (x-a3) /a4^2)",
-    "y = a2 *2*a1*((exp(-x/a1)-1)*(a1/x)+1)+(1-a2)*2*a3*((exp(-x/a3)-1)*(a3/x)+1)",
-    "y = (1-a1) * exp(-(x/a3)^a4)*cos(x*a2) + a1*exp(-(x/a5)^a6)"
-};
-
-int effnNparams(int effn)
-{
-    if ((0 <= effn) && (effn < effnNR))
-    {
-        return nfp_ffn[effn];
-    }
-    else
-    {
-        return -1;
-    }
-}
-
-const char *effnDescription(int effn)
-{
-    if ((0 <= effn) && (effn < effnNR))
-    {
-        return longs_ffn[effn];
-    }
-    else
-    {
-        return NULL;
-    }
-}
-
-int sffn2effn(const char **sffn)
-{
-    int eFitFn, i;
-
-    eFitFn = 0;
-    for (i = 0; i < effnNR; i++)
-    {
-        if (sffn[i+1] && strcmp(sffn[0], sffn[i+1]) == 0)
-        {
-            eFitFn = i;
-        }
-    }
-
-    return eFitFn;
-}
-
-/*! \brief Compute exponential function A exp(-x/tau) */
-static double myexp(double x, double A, double tau)
-{
-    if ((A == 0) || (tau == 0))
-    {
-        return 0;
-    }
-    return A*exp(-x/tau);
-}
-
-/*! \brief Compute y=(a0+a1)/2-(a0-a1)/2*erf((x-a2)/a3^2) */
-static double lmc_erffit (double x, const double *a)
-{
-    double erfarg;
-
-    erfarg  = (x-a[2])/(a[3]*a[3]);
-    return (a[0]+a[1])/2-(a[0]-a[1])*gmx_erf(erfarg);
-}
-
-/*! \brief Compute y = exp(-x/a0) */
-static double lmc_exp_one_parm(double x, const double *a)
-{
-    return exp(-x/a[0]);
-}
-
-/*! \brief Compute y = a1 exp(-x/a0) */
-static double lmc_exp_two_parm(double x, const double *a)
-{
-    return a[1]*exp(-x/a[0]);
-}
-
-/*! \brief Compute y = a1 exp(-x/a0) + (1-a1) exp(-x/a2) */
-static double lmc_exp_3_parm(double x, const double *a)
-{
-    double e1, e2;
-
-    e1      = exp(-x/a[0]);
-    e2      = exp(-x/a[2]);
-    return a[1]*e1 + (1-a[1])*e2;
-}
-
-/*! \brief Compute y = a0 exp(-x/a1) + a2 exp(-x/a3) + a4 */
-static double lmc_exp_5_parm(double x, const double *a)
-{
-    double e1, e2;
-
-    e1      = exp(-x/a[1]);
-    e2      = exp(-x/a[3]);
-    return a[0]*e1 + a[2]*e2 + a[4];
-}
-
-/*! \brief Compute y = a0 exp(-x/a1) + a2 exp(-x/a3) + a4 exp(-x/a5) + a6 */
-static double lmc_exp_7_parm(double x, const double *a)
-{
-    double e1, e2, e3;
-
-    e1      = exp(-x/a[1]);
-    e2      = exp(-x/a[3]);
-    e3      = exp(-x/a[5]);
-    return a[0]*e1 + a[2]*e2 + a[4]*e3 + a[6];
-}
-
-/*! \brief Compute y = a0 exp(-x/a1) + a2 exp(-x/a3) + a4 exp(-x/a5) + a6 exp(-x/a7) + a8 */
-static double lmc_exp_9_parm(double x, const double *a)
-{
-    double e1, e2, e3, e4;
-
-    e1      = exp(-x/a[1]);
-    e2      = exp(-x/a[3]);
-    e3      = exp(-x/a[5]);
-    e4      = exp(-x/a[7]);
-    return a[0]*e1 + a[2]*e2 + a[4]*e3 + a[6]*e4 + a[8];
-}
-
-/*! \brief Compute y = (1-a1) * exp(-(x/a3)^a4)*cos(x*a2) + a1*exp(-(x/a5)^a6) */
-static double effnPRES_fun(double x, const double *a)
-{
-    double term1, term2, term3;
-
-    if (a[0] != 0)
-    {
-        term3 = a[0] * exp(-pow((x/a[4]), a[5]));
-    }
-    else
-    {
-        term3 = 0;
-    }
-
-    term1 = 1-a[0];
-    if (term1 != 0)
-    {
-        term2 = exp(-pow((x/a[2]), a[3])) * cos(x*a[1]);
-    }
-    else
-    {
-        term2 = 0;
-    }
-
-    return term1*term2 + term3;
-}
-
-/*! \brief Compute vac function */
-static double lmc_vac_2_parm(double x, const double *a)
-{
-    /* Fit to function
-     *
-     * y = 1/2 (1 - 1/w) exp(-(1+w)v) + 1/2 (1 + 1/w) exp(-(1-w)v)
-     *
-     *   = exp(-v) (cosh(wv) + 1/w sinh(wv))
-     *
-     *    v = x/(2 a1)
-     *    w = sqrt(1 - a2)
-     *
-     *    For tranverse current autocorrelation functions:
-     *       a1 = tau
-     *       a2 = 4 tau (eta/rho) k^2
-     *
-     */
-
-    double y, v, det, omega, omega2, em, ec, es;
-
-    v   = x/(2*a[0]);
-    det = 1 - a[1];
-    em  = exp(-v);
-    if (det != 0)
-    {
-        omega2  = fabs(det);
-        omega   = sqrt(omega2);
-        if (det > 0)
-        {
-            ec = em*0.5*(exp(omega*v)+exp(-omega*v));
-            es = em*0.5*(exp(omega*v)-exp(-omega*v))/omega;
-        }
-        else
-        {
-            ec = em*cos(omega*v);
-            es = em*sin(omega*v)/omega;
-        }
-        y      = ec + es;
-    }
-    else
-    {
-        y      = (1+v)*em;
-    }
-    return y;
-}
-
-/*! \brief Compute error estimate */
-static double lmc_errest_3_parm(double x, const double *a)
-{
-    /*
-       e1 = (exp(-x/a1) - 1)
-       e2 = (exp(-x/a3) - 1)
-       v1=  2*a1 * (e1*a1/x + 1)
-       v2 = 2*a3 * (e2*a3/x + 1)
-       fun = a2*v1 + (1 - a2) * v2
-     */
-    double e1, e2, v1, v2;
-
-    if (a[0] != 0)
-    {
-        e1 = gmx_expm1(-x/a[0]);
-    }
-    else
-    {
-        e1 = 0;
-    }
-    if (a[2] != 0)
-    {
-        e2 = gmx_expm1(-x/a[2]);
-    }
-    else
-    {
-        e2 = 0;
-    }
-
-    if (x > 0)
-    {
-        v1      = 2*a[0]*(e1*a[0]/x + 1);
-        v2      = 2*a[2]*(e2*a[2]/x + 1);
-        return a[1]*v1 + (1-a[1])*v2;
-    }
-    else
-    {
-        return 0;
-    }
-}
-
-/*! \brief function type for passing to fitting routine */
-typedef double (*t_lmcurve)(double x, const double *a);
-
-/*! \brief array of fitting functions corresponding to the pre-defined types */
-t_lmcurve lmcurves[effnNR] = {
-    lmc_exp_one_parm, lmc_exp_one_parm, lmc_exp_two_parm,
-    lmc_exp_3_parm, lmc_vac_2_parm,
-    lmc_exp_5_parm,   lmc_exp_7_parm,
-    lmc_exp_9_parm, lmc_erffit,  lmc_errest_3_parm, effnPRES_fun
-};
-
-double fit_function(int eFitFn, double *parm, double x)
-{
-    // TODO: check that eFitFn is within bounds
-    return lmcurves[eFitFn](x, parm);
-}
-
-/*! \brief lmfit_exp supports up to 3 parameter fitting of exponential functions */
-static gmx_bool lmfit_exp(int nfit, double x[], double y[],
-                          real ftol, int maxiter,
-                          double parm[], gmx_bool bVerbose,
-                          int eFitFn)
-{
-    double             chisq, ochisq;
-    gmx_bool           bCont;
-    int                i, j;
-    lm_control_struct *control;
-    lm_status_struct  *status;
-
-    if ((eFitFn < 0) || (eFitFn >= effnNR))
-    {
-        gmx_fatal(FARGS, "fitfn = %d, should be in 0..%d (%s,%d)",
-                  effnNR-1, eFitFn, __FILE__, __LINE__);
-    }
-
-    snew(control, 1);
-    control->ftol       = ftol;
-    control->xtol       = ftol;
-    control->gtol       = ftol;
-    control->epsilon    = 0.1;
-    control->stepbound  = 100;
-    control->patience   = maxiter;
-    control->scale_diag = 1;
-    control->msgfile    = stdout;
-    control->verbosity  = (bVerbose ? 1 : 0);
-    control->n_maxpri   = nfp_ffn[eFitFn];
-    control->m_maxpri   = 0;
-    snew(status, 1);
-    /* Initial params */
-    chisq  = 1e12;
-    j      = 0;
-    if (bVerbose)
-    {
-        fprintf(stderr, "%4s  %10s  Parameters\n",
-                "Step", "chi^2");
-    }
-    do
-    {
-        ochisq = chisq;
-
-        lmcurve(nfp_ffn[eFitFn], parm, nfit, x, y,
-                lmcurves[eFitFn], control, status);
-        chisq = sqr(status->fnorm);
-        if (bVerbose)
-        {
-            int mmm;
-            fprintf(stderr, "%4d  %10.5e", j, chisq);
-            for (mmm = 0; (mmm < nfp_ffn[eFitFn]); mmm++)
-            {
-                fprintf(stderr, "  %10.5e", parm[mmm]);
-            }
-            fprintf(stderr, "\n");
-        }
-        j++;
-        bCont = ((fabs(ochisq - chisq) > fabs(ftol*chisq)) ||
-                 ((ochisq == chisq)));
-    }
-    while (bCont && (j < maxiter));
-    if (bVerbose)
-    {
-        fprintf(stderr, "\n");
-    }
-
-    sfree(control);
-    sfree(status);
-
-    return TRUE;
-}
-
-/*! \brief See description in header file. */
-real do_lmfit(int ndata, real c1[], real sig[], real dt, real x0[],
-              real begintimefit, real endtimefit, const output_env_t oenv,
-              gmx_bool bVerbose, int eFitFn, double fitparms[], int fix)
-{
-    FILE    *fp;
-    char     buf[32];
-
-    int      i, j, nparm, nfitpnts;
-    double   integral, ttt;
-    double  *parm, *dparm;
-    double  *x, *y, *dy;
-#ifdef GMX_DOUBLE
-    real     ftol    = 1e-16;
-#else
-    real     ftol    = 1e-8;
-#endif
-    int      maxiter = 50;
-
-    if (0 != fix)
-    {
-        fprintf(stderr, "Using fixed parameters in curve fitting is not working anymore\n");
-    }
-    nparm = nfp_ffn[eFitFn];
-    if (debug)
-    {
-        fprintf(debug, "There are %d points to fit %d vars!\n", ndata, nparm);
-        fprintf(debug, "Fit to function %d from %g through %g, dt=%g\n",
-                eFitFn, begintimefit, endtimefit, dt);
-    }
-
-    snew(x, ndata);
-    snew(y, ndata);
-    snew(dy, ndata);
-
-    j = 0;
-    for (i = 0; i < ndata; i++)
-    {
-        ttt = x0 ? x0[i] : dt*i;
-        if (ttt >= begintimefit && ttt <= endtimefit)
-        {
-            x[j] = ttt;
-            y[j] = c1[i];
-
-            /* mrqmin does not like sig to be zero */
-            if (sig[i] < 1.0e-7)
-            {
-                dy[j] = 1.0e-7;
-            }
-            else
-            {
-                dy[j] = sig[i];
-            }
-            if (debug)
-            {
-                fprintf(debug, "j= %d, i= %d, x= %g, y= %g, dy= %g\n",
-                        j, i, x[j], y[j], dy[j]);
-            }
-            j++;
-        }
-    }
-    nfitpnts = j;
-    integral = 0;
-    if (nfitpnts < nparm)
-    {
-        fprintf(stderr, "Not enough data points for fitting!\n");
-    }
-    else
-    {
-        snew(parm, nparm);
-        snew(dparm, nparm);
-        if (fitparms)
-        {
-            for (i = 0; (i < nparm); i++)
-            {
-                parm[i] = fitparms[i];
-            }
-        }
-
-        if (!lmfit_exp(nfitpnts, x, y, ftol, maxiter, parm, bVerbose, eFitFn))
-        {
-            fprintf(stderr, "Fit failed!\n");
-        }
-        else if (nparm <= 3)
-        {
-            /* Compute the integral from begintimefit */
-            if (nparm == 3)
-            {
-                integral = (parm[0]*myexp(begintimefit, parm[1],  parm[0]) +
-                            parm[2]*myexp(begintimefit, 1-parm[1], parm[2]));
-            }
-            else if (nparm == 2)
-            {
-                integral = parm[0]*myexp(begintimefit, parm[1],  parm[0]);
-            }
-            else if (nparm == 1)
-            {
-                integral = parm[0]*myexp(begintimefit, 1,  parm[0]);
-            }
-            else
-            {
-                gmx_fatal(FARGS, "nparm = %d in file %s, line %d",
-                          nparm, __FILE__, __LINE__);
-            }
-
-            /* Generate THE output */
-            if (bVerbose)
-            {
-                fprintf(stderr, "FIT: # points used in fit is: %d\n", nfitpnts);
-                fprintf(stderr, "FIT: %21s%21s%21s\n",
-                        "parm0     ", "parm1 (ps)   ", "parm2 (ps)    ");
-                fprintf(stderr, "FIT: ------------------------------------------------------------\n");
-                fprintf(stderr, "FIT: %8.3g +/- %8.3g%9.4g +/- %8.3g%8.3g +/- %8.3g\n",
-                        parm[0], dparm[0], parm[1], dparm[1], parm[2], dparm[2]);
-                fprintf(stderr, "FIT: Integral (calc with fitted function) from %g ps to inf. is: %g\n",
-                        begintimefit, integral);
-
-                sprintf(buf, "test%d.xvg", nfitpnts);
-                fp = xvgropen(buf, "C(t) + Fit to C(t)", "Time (ps)", "C(t)", oenv);
-                fprintf(fp, "# parm0 = %g, parm1 = %g, parm2 = %g\n",
-                        parm[0], parm[1], parm[2]);
-                for (j = 0; (j < nfitpnts); j++)
-                {
-                    ttt = x0 ? x0[j] : dt*j;
-                    fprintf(fp, "%10.5e  %10.5e  %10.5e\n",
-                            ttt, c1[j],
-                            lmcurves[eFitFn](ttt, parm));
-                }
-                xvgrclose(fp);
-            }
-        }
-        if (fitparms)
-        {
-            for (i = 0; (i < nparm); i++)
-            {
-                fitparms[i] = parm[i];
-            }
-        }
-        sfree(parm);
-        sfree(dparm);
-    }
-
-    sfree(x);
-    sfree(y);
-    sfree(dy);
-
-    return integral;
-}
-
-/*! See description in header file. */
-real fit_acf(int ncorr, int fitfn, const output_env_t oenv, gmx_bool bVerbose,
-             real tbeginfit, real tendfit, real dt, real c1[], real *fit)
-{
-    double      fitparm[3];
-    double      tStart, tail_corr, sum, sumtot = 0, c_start, ct_estimate;
-    real       *sig;
-    int         i, j, jmax, nf_int;
-    gmx_bool    bPrint;
-
-    bPrint = bVerbose || bDebugMode();
-
-    if (bPrint)
-    {
-        printf("COR:\n");
-    }
-
-    if (tendfit <= 0)
-    {
-        tendfit = ncorr*dt;
-    }
-    nf_int = min(ncorr, (int)(tendfit/dt));
-    sum    = print_and_integrate(debug, nf_int, dt, c1, NULL, 1);
-
-    /* Estimate the correlation time for better fitting */
-    ct_estimate = 0.5*c1[0];
-    for (i = 1; (i < ncorr) && (c1[i] > 0); i++)
-    {
-        ct_estimate += c1[i];
-    }
-    ct_estimate *= dt/c1[0];
-
-    if (bPrint)
-    {
-        printf("COR: Correlation time (plain integral from %6.3f to %6.3f ps) = %8.5f ps\n",
-               0.0, dt*nf_int, sum);
-        printf("COR: Relaxation times are computed as fit to an exponential:\n");
-        printf("COR:   %s\n", longs_ffn[fitfn]);
-        printf("COR: Fit to correlation function from %6.3f ps to %6.3f ps, results in a\n", tbeginfit, min(ncorr*dt, tendfit));
-    }
-
-    tStart = 0;
-    if (bPrint)
-    {
-        printf("COR:%11s%11s%11s%11s%11s%11s%11s\n",
-               "Fit from", "Integral", "Tail Value", "Sum (ps)", " a1 (ps)",
-               (nfp_ffn[fitfn] >= 2) ? " a2 ()" : "",
-               (nfp_ffn[fitfn] >= 3) ? " a3 (ps)" : "");
-    }
-
-    snew(sig, ncorr);
-
-    if (tbeginfit > 0)
-    {
-        jmax = 3;
-    }
-    else
-    {
-        jmax = 1;
-    }
-    for (j = 0; ((j < jmax) && (tStart < tendfit) && (tStart < ncorr*dt)); j++)
-    {
-        /* Estimate the correlation time for better fitting */
-        c_start     = -1;
-        ct_estimate = 0;
-        for (i = 0; (i < ncorr) && (dt*i < tStart || c1[i] > 0); i++)
-        {
-            if (c_start < 0)
-            {
-                if (dt*i >= tStart)
-                {
-                    c_start     = c1[i];
-                    ct_estimate = 0.5*c1[i];
-                }
-            }
-            else
-            {
-                ct_estimate += c1[i];
-            }
-        }
-        if (c_start > 0)
-        {
-            ct_estimate *= dt/c_start;
-        }
-        else
-        {
-            /* The data is strange, so we need to choose somehting */
-            ct_estimate = tendfit;
-        }
-        if (debug)
-        {
-            fprintf(debug, "tStart %g ct_estimate: %g\n", tStart, ct_estimate);
-        }
-
-        if (fitfn == effnEXP3)
-        {
-            fitparm[0] = 0.002*ncorr*dt;
-            fitparm[1] = 0.95;
-            fitparm[2] = 0.2*ncorr*dt;
-        }
-        else
-        {
-            /* Good initial guess, this increases the probability of convergence */
-            fitparm[0] = ct_estimate;
-            fitparm[1] = 1.0;
-            fitparm[2] = 1.0;
-        }
-
-        /* Generate more or less appropriate sigma's */
-        for (i = 0; i < ncorr; i++)
-        {
-            sig[i] = sqrt(ct_estimate+dt*i);
-        }
-
-        nf_int    = min(ncorr, (int)((tStart+1e-4)/dt));
-        sum       = print_and_integrate(debug, nf_int, dt, c1, NULL, 1);
-        tail_corr = do_lmfit(ncorr, c1, sig, dt, NULL, tStart, tendfit, oenv,
-                             bDebugMode(), fitfn, fitparm, 0);
-        sumtot = sum+tail_corr;
-        if (fit && ((jmax == 1) || (j == 1)))
-        {
-            double mfp[3];
-            for (i = 0; (i < 3); i++)
-            {
-                mfp[i] = fitparm[i];
-            }
-            for (i = 0; (i < ncorr); i++)
-            {
-                fit[i] = lmcurves[fitfn](i*dt, mfp);
-            }
-        }
-        if (bPrint)
-        {
-            printf("COR:%11.4e%11.4e%11.4e%11.4e", tStart, sum, tail_corr, sumtot);
-            for (i = 0; (i < nfp_ffn[fitfn]); i++)
-            {
-                printf(" %11.4e", fitparm[i]);
-            }
-            printf("\n");
-        }
-        tStart += tbeginfit;
-    }
-    sfree(sig);
-
-    return sumtot;
-}
diff --git a/src/gromacs/correlationfunctions/expfit.cpp b/src/gromacs/correlationfunctions/expfit.cpp
new file mode 100644 (file)
index 0000000..3b201bf
--- /dev/null
@@ -0,0 +1,986 @@
+/*
+ * This file is part of the GROMACS molecular simulation package.
+ *
+ * Copyright (c) 1991-2000, University of Groningen, The Netherlands.
+ * Copyright (c) 2001-2004, The GROMACS development team.
+ * Copyright (c) 2013,2014,2015, by the GROMACS development team, led by
+ * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
+ * and including many others, as listed in the AUTHORS file in the
+ * top-level source directory and at http://www.gromacs.org.
+ *
+ * GROMACS is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * GROMACS is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with GROMACS; if not, see
+ * http://www.gnu.org/licenses, or write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
+ *
+ * If you want to redistribute modifications to GROMACS, please
+ * consider that scientific software is very special. Version
+ * control is crucial - bugs must be traceable. We will be happy to
+ * consider code for inclusion in the official distribution, but
+ * derived work must not be called official GROMACS. Details are found
+ * in the README & COPYING files - if they are missing, get the
+ * official version at http://www.gromacs.org.
+ *
+ * To help us fund GROMACS development, we humbly ask that you cite
+ * the research papers on the package. Check out http://www.gromacs.org.
+ */
+/*! \internal
+ * \file
+ * \brief
+ * Implements routine for fitting a data set to a curve
+ *
+ * \author David van der Spoel <david.vanderspoel@icm.uu.se>
+ * \ingroup module_correlationfunctions
+ */
+#include "gmxpre.h"
+
+#include "expfit.h"
+
+#include <math.h>
+#include <string.h>
+
+#include <algorithm>
+
+#include "external/lmfit/lmcurve.h"
+
+#include "gromacs/correlationfunctions/integrate.h"
+#include "gromacs/fileio/xvgr.h"
+#include "gromacs/legacyheaders/macros.h"
+#include "gromacs/math/vec.h"
+#include "gromacs/utility/fatalerror.h"
+#include "gromacs/utility/futil.h"
+#include "gromacs/utility/gmxassert.h"
+#include "gromacs/utility/real.h"
+#include "gromacs/utility/smalloc.h"
+
+/*! \brief Number of parameters for each fitting function */
+static const int nfp_ffn[effnNR] = { 0, 1, 2, 3, 5, 7, 9, 2, 4, 3, 6 };
+
+/* +2 becuase parse_common_args wants leading and concluding NULL.
+ * We only allow exponential functions as choices on the command line,
+ * hence there are many more NULL field (which have to be at the end of
+ * the array).
+ */
+const char      *s_ffn[effnNR+2] = {
+    NULL, "none", "exp", "aexp", "exp_exp",
+    "exp5", "exp7", "exp9",
+    NULL, NULL, NULL, NULL, NULL
+};
+
+/*! \brief Long description for each fitting function type */
+static const char *longs_ffn[effnNR] = {
+    "no fit",
+    "y = exp(-x/|a0|)",
+    "y = a1 exp(-x/|a0|)",
+    "y = a1 exp(-x/|a0|) + (1-a1) exp(-x/(|a2|)), a2 > a0 > 0",
+    "y = a0 exp(-x/|a1|) +  a2 exp(-x/|a3|) + a4, a3 >= a1",
+    "y = a0 exp(-x/|a1|) +  a2 exp(-x/|a3|) + a4 exp(-x/|a5|) + a6, a5 >= a3 >= a1",
+    "y = a0 exp(-x/|a1|) +  a2 exp(-x/|a3|) + a4 exp(-x/|a5|) + a6 exp(-x/|a7|) + a8, a7 >= a5 >= a3 >= a1",
+    "y = exp(-v) (cosh(wv) + 1/w sinh(wv)), v = x/(2 a0), w = sqrt(1 - a1)",
+    "y = 1/2*(a0+a1) - 1/2*(a0-a1)*erf( (x-a2) /a3^2)",
+    "y = a1 *2*a0*((exp(-x/a0)-1)*(a0/x)+1)+(1-a1)*2*a2*((exp(-x/a2)-1)*(a2/x)+1)",
+    "y = (1-a0)*cos(x*a1)*exp(-(x/a2)^a3) + a0*exp(-(x/a4)^a5)"
+};
+
+int effnNparams(int effn)
+{
+    if ((0 <= effn) && (effn < effnNR))
+    {
+        return nfp_ffn[effn];
+    }
+    else
+    {
+        return -1;
+    }
+}
+
+const char *effnDescription(int effn)
+{
+    if ((0 <= effn) && (effn < effnNR))
+    {
+        return longs_ffn[effn];
+    }
+    else
+    {
+        return NULL;
+    }
+}
+
+int sffn2effn(const char **sffn)
+{
+    int eFitFn, i;
+
+    eFitFn = 0;
+    for (i = 0; i < effnNR; i++)
+    {
+        if (sffn[i+1] && strcmp(sffn[0], sffn[i+1]) == 0)
+        {
+            eFitFn = i;
+        }
+    }
+
+    return eFitFn;
+}
+
+/*! \brief Compute exponential function A exp(-x/tau) */
+static double myexp(double x, double A, double tau)
+{
+    if ((A == 0) || (tau == 0))
+    {
+        return 0;
+    }
+    return A*exp(-x/tau);
+}
+
+/*! \brief Compute y=(a0+a1)/2-(a0-a1)/2*erf((x-a2)/a3^2) */
+static double lmc_erffit (double x, const double *a)
+{
+    double erfarg;
+    double myerf;
+
+    if (a[3] != 0)
+    {
+        erfarg = (x-a[2])/(a[3]*a[3]);
+        myerf  = gmx_erfd(erfarg);
+    }
+    else
+    {
+        /* If a[3] == 0, a[3]^2 = 0 and the erfarg becomes +/- infinity */
+        if (x < a[2])
+        {
+            myerf = -1;
+        }
+        else
+        {
+            myerf = 1;
+        }
+    }
+    return 0.5*((a[0]+a[1]) - (a[0]-a[1])*myerf);
+}
+
+/*! \brief Exponent function that prevents overflow */
+static double safe_exp(double x)
+{
+    double exp_max = 200;
+    double exp_min = -exp_max;
+    if (x <= exp_min)
+    {
+        return exp(exp_min);
+    }
+    else if (x >= exp_max)
+    {
+        return exp(exp_max);
+    }
+    else
+    {
+        return exp(x);
+    }
+}
+
+/*! \brief Exponent minus 1 function that prevents overflow */
+static double safe_expm1(double x)
+{
+    double exp_max = 200;
+    double exp_min = -exp_max;
+    if (x <= exp_min)
+    {
+        return -1;
+    }
+    else if (x >= exp_max)
+    {
+        return exp(exp_max);
+    }
+    else
+    {
+        return gmx_expm1(x);
+    }
+}
+
+/*! \brief Compute y = exp(-x/|a0|) */
+static double lmc_exp_one_parm(double x, const double *a)
+{
+    return safe_exp(-x/fabs(a[0]));
+}
+
+/*! \brief Compute y = a1 exp(-x/|a0|) */
+static double lmc_exp_two_parm(double x, const double *a)
+{
+    return a[1]*safe_exp(-x/fabs(a[0]));
+}
+
+/*! \brief Compute y = a1 exp(-x/|a0|) + (1-a1) exp(-x/|a2|) */
+static double lmc_exp_exp(double x, const double *a)
+{
+    double e1, e2;
+
+    e1      = safe_exp(-x/fabs(a[0]));
+    e2      = safe_exp(-x/(fabs(a[0])+fabs(a[2])));
+    return a[1]*e1 + (1-a[1])*e2;
+}
+
+/*! \brief Compute y = a0 exp(-x/|a1|) + a2 exp(-x/(|a1|+|a3|)) + a4 */
+static double lmc_exp_5_parm(double x, const double *a)
+{
+    double e1, e2;
+
+    e1      = safe_exp(-x/fabs(a[1]));
+    e2      = safe_exp(-x/(fabs(a[1])+fabs(a[3])));
+    return a[0]*e1 + a[2]*e2 + a[4];
+}
+
+/*! \brief Compute 7 parameter exponential function value.
+ *
+ * Compute y = a0 exp(-x/|a1|) + a2 exp(-x/(|a1|+|a3|)) +
+ * a4 exp(-x/(|a1|+|a3|+|a5|)) + a6
+ */
+static double lmc_exp_7_parm(double x, const double *a)
+{
+    double e1, e2, e3;
+    double fa1, fa3, fa5;
+
+    fa1 = fabs(a[1]);
+    fa3 = fa1 + fabs(a[3]);
+    fa5 = fa3 + fabs(a[5]);
+    e1  = safe_exp(-x/fa1);
+    e2  = safe_exp(-x/fa3);
+    e3  = safe_exp(-x/fa5);
+    return a[0]*e1 + a[2]*e2 + a[4]*e3 + a[6];
+}
+
+/*! \brief Compute 9 parameter exponential function value.
+ *
+ * Compute y = a0 exp(-x/|a1|) + a2 exp(-x/(|a1|+|a3|)) +
+ * a4 exp(-x/(|a1|+|a3|+|a5|)) + a6 exp(-x/(|a1|+|a3|+|a5|+|a7|)) + a8
+ */
+static double lmc_exp_9_parm(double x, const double *a)
+{
+    double e1, e2, e3, e4;
+    double fa1, fa3, fa5, fa7;
+
+    fa1 = fabs(a[1]);
+    fa3 = fa1 + fabs(a[3]);
+    fa5 = fa3 + fabs(a[5]);
+    fa7 = fa5 + fabs(a[7]);
+
+    e1      = safe_exp(-x/fa1);
+    e2      = safe_exp(-x/fa3);
+    e3      = safe_exp(-x/fa5);
+    e4      = safe_exp(-x/fa7);
+    return a[0]*e1 + a[2]*e2 + a[4]*e3 + a[6]*e4 + a[8];
+}
+
+/*! \brief Compute y = (1-a0)*exp(-(x/|a2|)^|a3|)*cos(x*|a1|) + a0*exp(-(x/|a4|)^|a5|) */
+static double lmc_pres_6_parm(double x, const double *a)
+{
+    double term1, term2, term3;
+    double pow_max = 10;
+
+    term3  = 0;
+    if ((a[4] != 0) && (a[0] != 0))
+    {
+        double power = std::min(fabs(a[5]), pow_max);
+        term3        = a[0] * safe_exp(-pow((x/fabs(a[4])), power));
+    }
+
+    term1  = 1-a[0];
+    term2  = 0;
+    if ((term1 != 0) && (a[2] != 0))
+    {
+        double power = std::min(fabs(a[3]), pow_max);
+        term2        = safe_exp(-pow((x/fabs(a[2])), power)) * cos(x*fabs(a[1]));
+    }
+
+    return term1*term2 + term3;
+}
+
+/*! \brief Compute vac function */
+static double lmc_vac_2_parm(double x, const double *a)
+{
+    /* Fit to function
+     *
+     * y = 1/2 (1 - 1/w) exp(-(1+w)v) + 1/2 (1 + 1/w) exp(-(1-w)v)
+     *
+     *   = exp(-v) (cosh(wv) + 1/w sinh(wv))
+     *
+     *    v = x/(2 a0)
+     *    w = sqrt(1 - a1)
+     *
+     *    For tranverse current autocorrelation functions:
+     *       a0 = tau
+     *       a1 = 4 tau (eta/rho) k^2
+     *
+     */
+
+    double y, v, det, omega, wv, em, ec, es;
+    double wv_max = 100;
+
+    v   = x/(2*fabs(a[0]));
+    det = 1 - a[1];
+    em  = safe_exp(-v);
+    if (det != 0)
+    {
+        omega = sqrt(fabs(det));
+        wv    = std::min(omega*v, wv_max);
+
+        if (det > 0)
+        {
+            ec = em*0.5*(safe_exp(wv)+safe_exp(-wv));
+            es = em*0.5*(safe_exp(wv)-safe_exp(-wv))/omega;
+        }
+        else
+        {
+            ec = em*cos(wv);
+            es = em*sin(wv)/omega;
+        }
+        y      = ec + es;
+    }
+    else
+    {
+        y      = (1+v)*em;
+    }
+    return y;
+}
+
+/*! \brief Compute error estimate */
+static double lmc_errest_3_parm(double x, const double *a)
+{
+    double e1, e2, v1, v2;
+    double fa0 = fabs(a[0]);
+    double fa1;
+    double fa2 = fa0+fabs(a[2]);
+
+    if (a[0] != 0)
+    {
+        e1 = safe_expm1(-x/fa0);
+    }
+    else
+    {
+        e1 = 0;
+    }
+    if (a[2] != 0)
+    {
+        e2 = safe_expm1(-x/fa2);
+    }
+    else
+    {
+        e2 = 0;
+    }
+
+    if (x > 0)
+    {
+        v1      = 2*fa0*(e1*fa0/x + 1);
+        v2      = 2*fa2*(e2*fa2/x + 1);
+        /* We need 0 <= a1 <= 1 */
+        fa1     = std::min(1.0, std::max(0.0, a[1]));
+
+        return fa1*v1 + (1-fa1)*v2;
+    }
+    else
+    {
+        return 0;
+    }
+}
+
+/*! \brief function type for passing to fitting routine */
+typedef double (*t_lmcurve)(double x, const double *a);
+
+/*! \brief array of fitting functions corresponding to the pre-defined types */
+t_lmcurve lmcurves[effnNR+1] = {
+    lmc_exp_one_parm, lmc_exp_one_parm, lmc_exp_two_parm,
+    lmc_exp_exp,      lmc_exp_5_parm,   lmc_exp_7_parm,
+    lmc_exp_9_parm,
+    lmc_vac_2_parm,   lmc_erffit,  lmc_errest_3_parm, lmc_pres_6_parm
+};
+
+double fit_function(const int eFitFn, const double parm[], const double x)
+{
+    if ((eFitFn < 0) || (eFitFn >= effnNR))
+    {
+        fprintf(stderr, "fitfn = %d, should be in the range 0..%d\n",
+                eFitFn, effnNR-1);
+        return 0.0;
+    }
+    return lmcurves[eFitFn](x, parm);
+}
+
+/*! \brief lmfit_exp supports fitting of different functions
+ *
+ * This routine calls the Levenberg-Marquardt non-linear fitting
+ * routine for fitting a data set with errors to a target function.
+ * Fitting routines included in gromacs in src/external/lmfit.
+ */
+static gmx_bool lmfit_exp(int          nfit,
+                          const double x[],
+                          const double y[],
+                          const double dy[],
+                          double       parm[],
+                          gmx_bool     bVerbose,
+                          int          eFitFn,
+                          int          nfix)
+{
+    double             chisq, ochisq;
+    gmx_bool           bCont;
+    int                j;
+    int                maxiter = 100;
+    lm_control_struct  control;
+    lm_status_struct  *status;
+    int                nparam = effnNparams(eFitFn);
+    int                p2;
+    gmx_bool           bSkipLast;
+
+    if ((eFitFn < 0) || (eFitFn >= effnNR))
+    {
+        fprintf(stderr, "fitfn = %d, should be in the range 0..%d\n",
+                eFitFn, effnNR-1);
+        return FALSE;
+    }
+    /* Using default control structure for double precision fitting that
+     * comes with the lmfit package (i.e. from the include file).
+     */
+    control            = lm_control_double;
+    control.verbosity  = (bVerbose ? 1 : 0);
+    control.n_maxpri   = 0;
+    control.m_maxpri   = 0;
+
+    snew(status, 1);
+    /* Initial params */
+    chisq  = 1e12;
+    j      = 0;
+    if (bVerbose)
+    {
+        printf("%4s  %10s  Parameters\n", "Step", "chi^2");
+    }
+    /* Check whether we have to skip some params */
+    if (nfix > 0)
+    {
+        do
+        {
+            p2        = 1 << (nparam-1);
+            bSkipLast = ((p2 & nfix) == p2);
+            if (bSkipLast)
+            {
+                nparam--;
+                nfix -= p2;
+            }
+        }
+        while ((nparam > 0) && (bSkipLast));
+        if (bVerbose)
+        {
+            printf("Using %d out of %d parameters\n", nparam, effnNparams(eFitFn));
+        }
+    }
+    do
+    {
+        ochisq = chisq;
+        lmcurve(nparam, parm, nfit, x, y, dy,
+                lmcurves[eFitFn], &control, status);
+        chisq = sqr(status->fnorm);
+        if (bVerbose)
+        {
+            printf("status: fnorm = %g, nfev = %d, userbreak = %d\noutcome = %s\n",
+                   status->fnorm, status->nfev, status->userbreak,
+                   lm_infmsg[status->outcome]);
+        }
+        if (bVerbose)
+        {
+            int mmm;
+            printf("%4d  %8g", j, chisq);
+            for (mmm = 0; (mmm < effnNparams(eFitFn)); mmm++)
+            {
+                printf("  %8g", parm[mmm]);
+            }
+            printf("\n");
+        }
+        j++;
+        bCont = (fabs(ochisq - chisq) > fabs(control.ftol*chisq));
+    }
+    while (bCont && (j < maxiter));
+
+    sfree(status);
+
+    return TRUE;
+}
+
+/*! \brief Ensure the fitting parameters are well-behaved.
+ *
+ * In order to make sure that fitting behaves according to the
+ * constraint that time constants are positive and increasing
+ * we enforce this here by setting all time constants to their
+ * absolute value and by adding e.g. |a_0| to |a_2|. This is
+ * done in conjunction with the fitting functions themselves.
+ * When there are multiple time constants we make sure that
+ * the successive time constants are at least double the
+ * previous ones and during fitting we enforce the they remain larger.
+ * It may very well help the convergence of the fitting routine.
+ */
+static void initiate_fit_params(int    eFitFn,
+                                double params[])
+{
+    int i, nparm;
+
+    nparm = effnNparams(eFitFn);
+
+    switch (eFitFn)
+    {
+        case effnVAC:
+            GMX_ASSERT(params[0] >= 0, "parameters should be >= 0");
+            break;
+        case effnEXP1:
+        case effnEXP2:
+        case effnEXPEXP:
+            GMX_ASSERT(params[0] >= 0, "parameters should be >= 0");
+            if (nparm > 2)
+            {
+                GMX_ASSERT(params[2] >= 0, "parameters should be >= 0");
+                /* In order to maintain params[2] >= params[0] in the final
+                 * result, we fit the difference between the two, that is
+                 * params[2]-params[0] and in the add add in params[0]
+                 * again.
+                 */
+                params[2] = std::max(fabs(params[2])-params[0], params[0]);
+            }
+            break;
+        case effnEXP5:
+        case effnEXP7:
+        case effnEXP9:
+            GMX_ASSERT(params[1] >= 0, "parameters should be >= 0");
+            params[1] = fabs(params[1]);
+            if (nparm > 3)
+            {
+                GMX_ASSERT(params[3] >= 0, "parameters should be >= 0");
+                /* See comment under effnEXPEXP */
+                params[3] = std::max(fabs(params[3])-params[1], params[1]);
+                if (nparm > 5)
+                {
+                    GMX_ASSERT(params[5] >= 0, "parameters should be >= 0");
+                    /* See comment under effnEXPEXP */
+                    params[5] = std::max(fabs(params[5])-params[3], params[3]);
+                    if (nparm > 7)
+                    {
+                        GMX_ASSERT(params[7] >= 0, "parameters should be >= 0");
+                        /* See comment under effnEXPEXP */
+                        params[7] = std::max(fabs(params[7])-params[5], params[5]);
+                    }
+                }
+            }
+            break;
+        case effnERREST:
+            GMX_ASSERT(params[0] >= 0, "parameters should be >= 0");
+            GMX_ASSERT(params[1] >= 0 && params[1] <= 1, "parameter 1 should in 0 .. 1");
+            GMX_ASSERT(params[2] >= 0, "parameters should be >= 0");
+            /* See comment under effnEXPEXP */
+            params[2] = fabs(params[2])-params[0];
+            break;
+        case effnPRES:
+            for (i = 1; (i < nparm); i++)
+            {
+                GMX_ASSERT(params[i] >= 0, "parameters should be >= 0");
+            }
+            break;
+        default:
+            break;
+    }
+}
+
+/*! \brief Process the fitting parameters to get output parameters.
+ *
+ * See comment at the previous function.
+ */
+static void extract_fit_params(int    eFitFn,
+                               double params[])
+{
+    int i, nparm;
+
+    nparm = effnNparams(eFitFn);
+
+    switch (eFitFn)
+    {
+        case effnVAC:
+            params[0] = fabs(params[0]);
+            break;
+        case effnEXP1:
+        case effnEXP2:
+        case effnEXPEXP:
+            params[0] = fabs(params[0]);
+            if (nparm > 2)
+            {
+                /* Back conversion of parameters from the fitted difference
+                 * to the absolute value.
+                 */
+                params[2] = fabs(params[2])+params[0];
+            }
+            break;
+        case effnEXP5:
+        case effnEXP7:
+        case effnEXP9:
+            params[1] = fabs(params[1]);
+            if (nparm > 3)
+            {
+                /* See comment under effnEXPEXP */
+                params[3] = fabs(params[3])+params[1];
+                if (nparm > 5)
+                {
+                    /* See comment under effnEXPEXP */
+                    params[5] = fabs(params[5])+params[3];
+                    if (nparm > 7)
+                    {
+                        /* See comment under effnEXPEXP */
+                        params[7] = fabs(params[7])+params[5];
+                    }
+                }
+            }
+            break;
+        case effnERREST:
+            params[0] = fabs(params[0]);
+            if (params[1] < 0)
+            {
+                params[1] = 0;
+            }
+            else if (params[1] > 1)
+            {
+                params[1] = 1;
+            }
+            /* See comment under effnEXPEXP */
+            params[2] = params[0]+fabs(params[2]);
+            break;
+        case effnPRES:
+            for (i = 1; (i < nparm); i++)
+            {
+                params[i] = fabs(params[i]);
+            }
+            break;
+        default:
+            break;
+    }
+}
+
+/*! \brief Print chi-squared value and the parameters */
+static void print_chi2_params(FILE        *fp,
+                              const int    eFitFn,
+                              const double fitparms[],
+                              const char  *label,
+                              const int    nfitpnts,
+                              const double x[],
+                              const double y[])
+{
+    int    i;
+    double chi2 = 0;
+
+    for (i = 0; (i < nfitpnts); i++)
+    {
+        double yfit = lmcurves[eFitFn](x[i], fitparms);
+        chi2 += sqr(y[i] - yfit);
+    }
+    fprintf(fp, "There are %d data points, %d parameters, %s chi2 = %g\nparams:",
+            nfitpnts, effnNparams(eFitFn), label, chi2);
+    for (i = 0; (i < effnNparams(eFitFn)); i++)
+    {
+        fprintf(fp, "  %10g", fitparms[i]);
+    }
+    fprintf(fp, "\n");
+}
+
+/*! \brief See description in header file. */
+real do_lmfit(int ndata, real c1[], real sig[], real dt, real x0[],
+              real begintimefit, real endtimefit, const output_env_t oenv,
+              gmx_bool bVerbose, int eFitFn, double fitparms[], int fix,
+              const char *fn_fitted)
+{
+    FILE    *fp;
+    int      i, j, nfitpnts;
+    double   integral, ttt;
+    double  *x, *y, *dy;
+
+    if (0 != fix)
+    {
+        fprintf(stderr, "Using fixed parameters in curve fitting is temporarily not working.\n");
+    }
+    if (debug)
+    {
+        fprintf(debug, "There are %d points to fit %d vars!\n", ndata, effnNparams(eFitFn));
+        fprintf(debug, "Fit to function %d from %g through %g, dt=%g\n",
+                eFitFn, begintimefit, endtimefit, dt);
+    }
+
+    snew(x, ndata);
+    snew(y, ndata);
+    snew(dy, ndata);
+    j    = 0;
+    for (i = 0; i < ndata; i++)
+    {
+        ttt = x0 ? x0[i] : dt*i;
+        if (ttt >= begintimefit && ttt <= endtimefit)
+        {
+            x[j]  = ttt;
+            y[j]  = c1[i];
+            if (NULL == sig)
+            {
+                // No weighting if all values are divided by 1.
+                dy[j] = 1;
+            }
+            else
+            {
+                dy[j] = std::max(1.0e-7, (double)sig[i]);
+            }
+            if (debug)
+            {
+                fprintf(debug, "j= %d, i= %d, x= %g, y= %g, dy=%g, ttt=%g\n",
+                        j, i, x[j], y[j], dy[j], ttt);
+            }
+            j++;
+        }
+    }
+    nfitpnts = j;
+    integral = 0;
+    if (nfitpnts < effnNparams(eFitFn))
+    {
+        fprintf(stderr, "Not enough (%d) data points for fitting, dt = %g!\n",
+                nfitpnts, dt);
+    }
+    else
+    {
+        gmx_bool bSuccess;
+
+        if (bVerbose)
+        {
+            print_chi2_params(stdout, eFitFn, fitparms, "initial", nfitpnts, x, y);
+        }
+        initiate_fit_params(eFitFn, fitparms);
+
+        bSuccess = lmfit_exp(nfitpnts, x, y, dy, fitparms, bVerbose, eFitFn, fix);
+        extract_fit_params(eFitFn, fitparms);
+
+        if (!bSuccess)
+        {
+            fprintf(stderr, "Fit failed!\n");
+        }
+        else
+        {
+            if (bVerbose)
+            {
+                print_chi2_params(stdout, eFitFn, fitparms, "final", nfitpnts, x, y);
+            }
+            switch (eFitFn)
+            {
+                case effnEXP1:
+                    integral = fitparms[0]*myexp(begintimefit, 1,  fitparms[0]);
+                    break;
+                case effnEXP2:
+                    integral = fitparms[0]*myexp(begintimefit, fitparms[1],  fitparms[0]);
+                    break;
+                case effnEXPEXP:
+                    integral = (fitparms[0]*myexp(begintimefit, fitparms[1],  fitparms[0]) +
+                                fitparms[2]*myexp(begintimefit, 1-fitparms[1], fitparms[2]));
+                    break;
+                case effnEXP5:
+                case effnEXP7:
+                case effnEXP9:
+                    integral = 0;
+                    for (i = 0; (i < (effnNparams(eFitFn)-1)/2); i++)
+                    {
+                        integral += fitparms[2*i]*myexp(begintimefit, fitparms[2*i+1], fitparms[2*i]);
+                    }
+                    break;
+                default:
+                    /* Do numerical integration */
+                    integral = 0;
+                    for (i = 0; (i < nfitpnts-1); i++)
+                    {
+                        double y0 = lmcurves[eFitFn](x[i], fitparms);
+                        double y1 = lmcurves[eFitFn](x[i+1], fitparms);
+                        integral += (x[i+1]-x[i])*(y1+y0)*0.5;
+                    }
+                    break;
+            }
+
+            if (bVerbose)
+            {
+                printf("FIT: Integral of fitted function: %g\n", integral);
+                if ((effnEXP5 == eFitFn) || (effnEXP7 == eFitFn) || (effnEXP9 == eFitFn))
+                {
+                    printf("FIT: Note that the constant term is not taken into account when computing integral.\n");
+                }
+            }
+            /* Generate debug output */
+            if (NULL != fn_fitted)
+            {
+                fp = xvgropen(fn_fitted, "Data + Fit", "Time (ps)",
+                              "Data (t)", oenv);
+                for (i = 0; (i < effnNparams(eFitFn)); i++)
+                {
+                    fprintf(fp, "# fitparms[%d] = %g\n", i, fitparms[i]);
+                }
+                for (j = 0; (j < nfitpnts); j++)
+                {
+                    real ttt = x0 ? x0[i] : dt*j;
+                    fprintf(fp, "%10.5e  %10.5e  %10.5e\n",
+                            x[j], y[j], lmcurves[eFitFn](ttt, fitparms));
+                }
+                xvgrclose(fp);
+            }
+        }
+    }
+
+    sfree(x);
+    sfree(y);
+    sfree(dy);
+
+    return integral;
+}
+
+/*! See description in header file. */
+real fit_acf(int ncorr, int fitfn, const output_env_t oenv, gmx_bool bVerbose,
+             real tbeginfit, real tendfit, real dt, real c1[], real *fit)
+{
+    double      fitparm[3];
+    double      tStart, tail_corr, sum, sumtot = 0, c_start, ct_estimate;
+    real       *sig;
+    int         i, j, jmax, nf_int;
+    gmx_bool    bPrint;
+
+    bPrint = bVerbose || bDebugMode();
+
+    if (bPrint)
+    {
+        printf("COR:\n");
+    }
+
+    if (tendfit <= 0)
+    {
+        tendfit = ncorr*dt;
+    }
+    nf_int = std::min(ncorr, (int)(tendfit/dt));
+    sum    = print_and_integrate(debug, nf_int, dt, c1, NULL, 1);
+
+    /* Estimate the correlation time for better fitting */
+    ct_estimate = 0.5*c1[0];
+    for (i = 1; (i < ncorr) && (c1[i] > 0); i++)
+    {
+        ct_estimate += c1[i];
+    }
+    ct_estimate *= dt/c1[0];
+
+    if (bPrint)
+    {
+        printf("COR: Correlation time (plain integral from %6.3f to %6.3f ps) = %8.5f ps\n",
+               0.0, dt*nf_int, sum);
+        printf("COR: Relaxation times are computed as fit to an exponential:\n");
+        printf("COR:   %s\n", effnDescription(fitfn));
+        printf("COR: Fit to correlation function from %6.3f ps to %6.3f ps, results in a\n", tbeginfit, std::min(ncorr*dt, tendfit));
+    }
+
+    tStart = 0;
+    if (bPrint)
+    {
+        printf("COR:%11s%11s%11s%11s%11s%11s%11s\n",
+               "Fit from", "Integral", "Tail Value", "Sum (ps)", " a1 (ps)",
+               (effnNparams(fitfn) >= 2) ? " a2 ()" : "",
+               (effnNparams(fitfn) >= 3) ? " a3 (ps)" : "");
+    }
+
+    snew(sig, ncorr);
+
+    if (tbeginfit > 0)
+    {
+        jmax = 3;
+    }
+    else
+    {
+        jmax = 1;
+    }
+    for (j = 0; ((j < jmax) && (tStart < tendfit) && (tStart < ncorr*dt)); j++)
+    {
+        /* Estimate the correlation time for better fitting */
+        c_start     = -1;
+        ct_estimate = 0;
+        for (i = 0; (i < ncorr) && (dt*i < tStart || c1[i] > 0); i++)
+        {
+            if (c_start < 0)
+            {
+                if (dt*i >= tStart)
+                {
+                    c_start     = c1[i];
+                    ct_estimate = 0.5*c1[i];
+                }
+            }
+            else
+            {
+                ct_estimate += c1[i];
+            }
+        }
+        if (c_start > 0)
+        {
+            ct_estimate *= dt/c_start;
+        }
+        else
+        {
+            /* The data is strange, so we need to choose somehting */
+            ct_estimate = tendfit;
+        }
+        if (debug)
+        {
+            fprintf(debug, "tStart %g ct_estimate: %g\n", tStart, ct_estimate);
+        }
+
+        if (fitfn == effnEXPEXP)
+        {
+            fitparm[0] = 0.002*ncorr*dt;
+            fitparm[1] = 0.95;
+            fitparm[2] = 0.2*ncorr*dt;
+        }
+        else
+        {
+            /* Good initial guess, this increases the probability of convergence */
+            fitparm[0] = ct_estimate;
+            fitparm[1] = 1.0;
+            fitparm[2] = 1.0;
+        }
+
+        /* Generate more or less appropriate sigma's */
+        for (i = 0; i < ncorr; i++)
+        {
+            sig[i] = sqrt(ct_estimate+dt*i);
+        }
+
+        nf_int    = std::min(ncorr, (int)((tStart+1e-4)/dt));
+        sum       = print_and_integrate(debug, nf_int, dt, c1, NULL, 1);
+        tail_corr = do_lmfit(ncorr, c1, sig, dt, NULL, tStart, tendfit, oenv,
+                             bDebugMode(), fitfn, fitparm, 0, NULL);
+        sumtot = sum+tail_corr;
+        if (fit && ((jmax == 1) || (j == 1)))
+        {
+            double mfp[3];
+            for (i = 0; (i < 3); i++)
+            {
+                mfp[i] = fitparm[i];
+            }
+            for (i = 0; (i < ncorr); i++)
+            {
+                fit[i] = lmcurves[fitfn](i*dt, mfp);
+            }
+        }
+        if (bPrint)
+        {
+            printf("COR:%11.4e%11.4e%11.4e%11.4e", tStart, sum, tail_corr, sumtot);
+            for (i = 0; (i < effnNparams(fitfn)); i++)
+            {
+                printf(" %11.4e", fitparm[i]);
+            }
+            printf("\n");
+        }
+        tStart += tbeginfit;
+    }
+    sfree(sig);
+
+    return sumtot;
+}
index ee75f8d7111b9782c6d27d21d12f5d5da04fd65f..e9cb14938dbb49a92504fe796ac9b9a74990d076 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2014, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -55,8 +55,9 @@ extern "C" {
  * Enum to select fitting functions
  */
 enum {
-    effnNONE, effnEXP1, effnEXP2, effnEXP3,   effnVAC,
-    effnEXP5, effnEXP7, effnEXP9, effnERF, effnERREST, effnPRES, effnNR
+    effnNONE, effnEXP1, effnEXP2, effnEXPEXP,
+    effnEXP5, effnEXP7, effnEXP9,
+    effnVAC,  effnERF,  effnERREST, effnPRES, effnNR
 };
 
 /*! \brief
@@ -94,7 +95,7 @@ int sffn2effn(const char **sffn);
  * \param[in] x The value of x
  * \return the value of the fit
  */
-double fit_function(int eFitFn, double *parm, double x);
+double fit_function(const int eFitFn, const double parm[], const double x);
 
 /*! \brief
  * Use Levenberg-Marquardt method to fit to a nfitparm parameter exponential
@@ -103,7 +104,7 @@ double fit_function(int eFitFn, double *parm, double x);
  * If x == NULL, the timestep dt will be used to create a time axis.
  * \param[in] ndata Number of data points
  * \param[in] c1 The data points
- * \param[in] sig The standard deviation in the points
+ * \param[in] sig The standard deviation in the points (can be NULL)
  * \param[in] dt The time step
  * \param[in] x The X-axis (may be NULL, see above)
  * \param[in] begintimefit Starting time for fitting
@@ -111,14 +112,22 @@ double fit_function(int eFitFn, double *parm, double x);
  * \param[in] oenv Output formatting information
  * \param[in] bVerbose Should the routine write to console?
  * \param[in] eFitFn Fitting function (0 .. effnNR)
- * \param[out] fitparms[]
+ * \param[inout] fitparms[] Fitting parameters, see printed manual for a
+ * detailed description. Note that in all implemented cases the parameters
+ * corresponding to time constants will be generated with increasing values.
+ * Such input parameters should therefore be provided in increasing order.
+ * If this is not the case or if subsequent time parameters differ by less than
+ * a factor of 2, they will be modified to ensure tau_i+1 >= 2 tau_i.
  * \param[in] fix Constrains fit parameter i at it's starting value, when the i'th bit
- * of fix is set.
+ * of fix is set. This works only when the N last parameters are fixed
+ * but not when a parameter somewhere in the middle needs to be fixed.
+ * \param[in] fn_fitted If not NULL file to print the data and fitted curve to
  * \return integral.
  */
 real do_lmfit(int ndata, real c1[], real sig[], real dt, real *x,
               real begintimefit, real endtimefit, const output_env_t oenv,
-              gmx_bool bVerbose, int eFitFn, double fitparms[], int fix);
+              gmx_bool bVerbose, int eFitFn, double fitparms[], int fix,
+              const char *fn_fitted);
 
 /*! \brief
  * Fit an autocorrelation function to a pre-defined functional form
@@ -132,7 +141,7 @@ real do_lmfit(int ndata, real c1[], real sig[], real dt, real *x,
  * \param[in] tendfit Ending time for fitting
  * \param[in] dt The time step
  * \param[in] c1 The data points
- * \param[out] fit The fitting parameters
+ * \param[inout] fit The fitting parameters
  * \return the integral over the autocorrelation function?
  */
 real fit_acf(int ncorr, int fitfn, const output_env_t oenv, gmx_bool bVerbose,
old mode 100755 (executable)
new mode 100644 (file)
index c9f518b..74fb2eb
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2014, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
 #include <gtest/gtest.h>
 
 #include "gromacs/fileio/xvgr.h"
+#include "gromacs/legacyheaders/oenv.h"
 #include "gromacs/utility/smalloc.h"
 
 #include "testutils/refdata.h"
 #include "testutils/testasserts.h"
 #include "testutils/testfilemanager.h"
 
-//! Number of data files for testing.
-#define expTestNrTypes 3
-
 namespace gmx
 {
 
 namespace
 {
 
+class ExpfitData
+{
+    public:
+        int               nrLines_;
+        std::vector<real> x_, y_;
+        real              startTime_, endTime_, dt_;
+};
+
 class ExpfitTest : public ::testing::Test
 {
 
     protected:
-        static int                 nrLines_;
-        static std::vector<real>   values_[expTestNrTypes];
-        static int                 nrColumns_;
-        static std::vector<real>   standardDev_;
-        static real                startTime_;
-        static real                endTime_;
-        static real                timeDeriv_;
-        test::TestReferenceData    refData_;
-        test::TestReferenceChecker checker_;
+        static std::vector<ExpfitData> data_;
+        test::TestReferenceData        refData_;
+        test::TestReferenceChecker     checker_;
         ExpfitTest( )
             : checker_(refData_.rootChecker())
         {
@@ -85,40 +85,34 @@ class ExpfitTest : public ::testing::Test
         // Static initiation, only run once every test.
         static void SetUpTestCase()
         {
-            double   ** tempValues;
-            std::string fileName[expTestNrTypes];
-            fileName[0] = test::TestFileManager::getInputFilePath("testINVEXP.xvg");
-            fileName[1] = test::TestFileManager::getInputFilePath("testPRES.xvg");
-            fileName[2] = test::TestFileManager::getInputFilePath("testEXP.xvg");
-            for (int i = 0; i < expTestNrTypes; i++)
+            double                ** tempValues = NULL;
+            std::vector<std::string> fileName;
+            fileName.push_back(test::TestFileManager::getInputFilePath("testINVEXP.xvg"));
+            fileName.push_back(test::TestFileManager::getInputFilePath("testPRES.xvg"));
+            fileName.push_back(test::TestFileManager::getInputFilePath("testINVEXP79.xvg"));
+            fileName.push_back(test::TestFileManager::getInputFilePath("testERF.xvg"));
+            fileName.push_back(test::TestFileManager::getInputFilePath("testERREST.xvg"));
+            for (std::vector<std::string>::iterator i = fileName.begin(); i < fileName.end(); ++i)
             {
-                const char * name = fileName[i].c_str();
-                // TODO: this assumes all files have the same length.
-                nrLines_     = read_xvg(name, &tempValues, &nrColumns_);
-
-                // Generating standard deviation
-                if (i == 0)
+                const char * name = i->c_str();
+                int          nrColumns;
+                ExpfitData   ed;
+                ed.nrLines_   = read_xvg(name, &tempValues, &nrColumns);
+                ed.dt_        = tempValues[0][1] - tempValues[0][0];
+                ed.startTime_ = tempValues[0][0];
+                ed.endTime_   = tempValues[0][ed.nrLines_-1];
+                for (int j = 0; j  < ed.nrLines_; j++)
                 {
-                    double fac = 1.0/nrLines_;
-                    for (int j = 0; j < nrLines_; j++)
-                    {
-                        standardDev_.push_back(fac);
-                    }
-                    timeDeriv_ = tempValues[0][1] - tempValues[0][0];
-                    startTime_ = tempValues[0][0];
-                    endTime_   = tempValues[0][nrLines_-1];
-                }
-
-                for (int j = 0; j  < nrLines_; j++)
-                {
-                    values_[i].push_back((real)tempValues[1][j]);
+                    ed.x_.push_back((real)tempValues[0][j]);
+                    ed.y_.push_back((real)tempValues[1][j]);
                 }
+                data_.push_back(ed);
 
                 // Free memory that was allocated in read_xvg
-                for (int i = 0; i < nrColumns_; i++)
+                for (int j = 0; j < nrColumns; j++)
                 {
-                    sfree(tempValues[i]);
-                    tempValues[i] = NULL;
+                    sfree(tempValues[j]);
+                    tempValues[j] = NULL;
                 }
                 sfree(tempValues);
                 tempValues = NULL;
@@ -129,13 +123,26 @@ class ExpfitTest : public ::testing::Test
         {
         }
 
-        void test(int type, double result[], double tolerance, int testType)
+        void test(int type, double result[], double tolerance,
+                  unsigned int testType)
         {
-            int     nfitparm = effnNparams(type);
-
-            do_lmfit(nrLines_, &values_[testType][0], &standardDev_[0], timeDeriv_,
-                     NULL, startTime_, endTime_, NULL, false, type, result, 0);
+            int          nfitparm = effnNparams(type);
+            output_env_t oenv;
 
+            if (testType >= data_.size())
+            {
+                GMX_THROW(InvalidInputError("testType out of range"));
+            }
+            output_env_init_default(&oenv);
+            do_lmfit(data_[testType].nrLines_,
+                     &(data_[testType].y_[0]),
+                     NULL,
+                     data_[testType].dt_,
+                     &(data_[testType].x_[0]),
+                     data_[testType].startTime_,
+                     data_[testType].endTime_,
+                     oenv, false, type, result, 0, NULL);
+            output_env_done(oenv);
             checker_.setDefaultTolerance(test::relativeToleranceAsFloatingPoint(1, tolerance));
             checker_.checkSequenceArray(nfitparm, result, "result");
         }
@@ -143,63 +150,55 @@ class ExpfitTest : public ::testing::Test
 
 
 //static var
-int               ExpfitTest::nrLines_;
-//cppcheck-suppress arrayIndexOutOfBounds fixed in 1.68-dev
-std::vector<real> ExpfitTest::values_[expTestNrTypes];
-int               ExpfitTest::nrColumns_;
-std::vector<real> ExpfitTest::standardDev_;
-real              ExpfitTest::startTime_;
-real              ExpfitTest::endTime_;
-real              ExpfitTest::timeDeriv_;
+std::vector<ExpfitData> ExpfitTest::data_;
 
 TEST_F (ExpfitTest, EffnEXP1) {
     double  param[] = {25};
-    test(effnEXP1, param, 1e-6, 0);
+    test(effnEXP1, param, 1e-5, 0);
 }
 
 TEST_F (ExpfitTest, EffnEXP2) {
     double  param[] = {35, 0.5};
-    test(effnEXP2, param, 1e-6, 0);
+    test(effnEXP2, param, 3e-5, 0);
 }
 
-TEST_F (ExpfitTest, EffnEXP3) {
-    double param[] = {45, 0.5, 5};
-    test(effnEXP3, param, 1e-4, 0);
+TEST_F (ExpfitTest, EffnEXPEXP) {
+    double param[] = {5, 0.5, 45};
+    test(effnEXPEXP, param, 1e-2, 0);
 }
 
 TEST_F (ExpfitTest, EffnEXP5) {
     double  param[] = {0.5, 5, 0.5, 50, 0.002};
-    test(effnEXP5, param, 1e-4, 0);
+    test(effnEXP5, param, 1e-2, 2);
 }
 
 TEST_F (ExpfitTest, EffnEXP7) {
-    double  param[] = {0.5, 5, -0.02, 0.5, 0.5, 50, -0.002};
-    test(effnEXP7, param, 1e-4, 0);
+    double  param[] = {0.1, 2, 0.5, 30, 0.3, 50, -0.002};
+    test(effnEXP7, param, 1e-2, 2);
 }
 
 TEST_F (ExpfitTest, EffnEXP9) {
-    double  param[] = {2, 1200, -1, 300, 0.7, 70, 0.5, 6, -0.5};
-    test(effnEXP9, param, 4e-2, 0);
+    double  param[] = {0.4, 5, 0.2, 30, 0.1, 70, 0.2, 200, -0.05};
+    test(effnEXP9, param, 4e-2, 2);
 }
 
 TEST_F (ExpfitTest, EffnERF) {
-    double  param[] = {0.5, 0.5, 0.5, 1};
-    test(effnERF, param, 1e-2, 0);
+    double  param[] = {80, 120, 180, 5};
+    test(effnERF, param, 1e-1, 3);
 }
 
 TEST_F (ExpfitTest, EffnERREST) {
-    double  param[] = {0.5, 0.7, 0.3};
-    test(effnERREST, param, 1e-4, 2);
+    double  param[] = {1, 0.9, 100};
+    test(effnERREST, param, 5e-3, 4);
 }
 
 TEST_F (ExpfitTest, EffnVAC) {
-    double param[] = {0.5, 0.05};
-    test(effnVAC, param, 1e-4, 0);
+    double param[] = {30, 0.0};
+    test(effnVAC, param, 0.05, 0);
 }
 
-TEST_F (ExpfitTest, DISABLED_EffnPRES) {
-    //TODO: This test is prodocues NaNs and INFs. Fix and then reactivate.
-    double param[] = {0, 10, 4, 1, 0.5, 1};
+TEST_F (ExpfitTest, EffnPRES) {
+    double param[] = {0.6, 10, 7, 1, 0.25, 2};
     test(effnPRES, param, 1e-4, 1);
 }
 
index 34cba4032bdfcb2d0b08ff16188685bad6ee5675..41316e618e81f5a1918fd803459de59dafd2f56a 100644 (file)
@@ -14,7 +14,7 @@
     <Real>0.98145622</Real>
     <Real>0.97775453</Real>
     <Real>0.97388524</Real>
-    <Real>0.96959651</Real>
+    <Real>0.96959645</Real>
     <Real>0.96521682</Real>
     <Real>0.96071005</Real>
     <Real>0.95656222</Real>
@@ -37,7 +37,7 @@
     <Real>0.92004192</Real>
     <Real>0.92134565</Real>
     <Real>0.92249507</Real>
-    <Real>0.92415452</Real>
+    <Real>0.92415446</Real>
     <Real>0.92598462</Real>
     <Real>0.92835307</Real>
     <Real>0.93056071</Real>
@@ -48,8 +48,8 @@
     <Real>0.9445464</Real>
     <Real>0.94751155</Real>
     <Real>0.95099658</Real>
-    <Real>0.95437491</Real>
-    <Real>0.95766789</Real>
+    <Real>0.95437485</Real>
+    <Real>0.95766783</Real>
     <Real>0.96085715</Real>
     <Real>0.96405703</Real>
     <Real>0.96722084</Real>
     <Real>0.98345906</Real>
     <Real>0.98124063</Real>
     <Real>0.97880316</Real>
-    <Real>0.97668463</Real>
+    <Real>0.97668457</Real>
     <Real>0.97459376</Real>
     <Real>0.97177458</Real>
     <Real>0.9690451</Real>
     <Real>0.96629435</Real>
-    <Real>0.96378684</Real>
+    <Real>0.96378678</Real>
     <Real>0.96081358</Real>
     <Real>0.95825708</Real>
     <Real>0.95578271</Real>
     <Real>0.95307195</Real>
-    <Real>0.95074266</Real>
+    <Real>0.9507426</Real>
     <Real>0.94830912</Real>
-    <Real>0.94601887</Real>
+    <Real>0.94601882</Real>
     <Real>0.94421709</Real>
     <Real>0.94242907</Real>
     <Real>0.94094354</Real>
     <Real>0.94294119</Real>
     <Real>0.94477904</Real>
     <Real>0.94679701</Real>
-    <Real>0.94860345</Real>
+    <Real>0.94860339</Real>
     <Real>0.95079654</Real>
-    <Real>0.95264018</Real>
+    <Real>0.95264012</Real>
     <Real>0.95462155</Real>
     <Real>0.95684212</Real>
     <Real>0.95912236</Real>
     <Real>0.97891223</Real>
     <Real>0.97828108</Real>
     <Real>0.97720605</Real>
-    <Real>0.97623944</Real>
+    <Real>0.97623938</Real>
     <Real>0.97527778</Real>
     <Real>0.97370166</Real>
     <Real>0.97211659</Real>
     <Real>0.97065586</Real>
     <Real>0.96862853</Real>
     <Real>0.96749282</Real>
-    <Real>0.96519589</Real>
+    <Real>0.96519583</Real>
     <Real>0.96352464</Real>
     <Real>0.96173507</Real>
     <Real>0.9598251</Real>
     <Real>0.94696826</Real>
     <Real>0.94605809</Real>
     <Real>0.94519788</Real>
-    <Real>0.94469965</Real>
+    <Real>0.94469959</Real>
     <Real>0.94453776</Real>
     <Real>0.94388711</Real>
     <Real>0.94351792</Real>
     <Real>0.94424397</Real>
     <Real>0.94460499</Real>
     <Real>0.94499773</Real>
-    <Real>0.94563341</Real>
+    <Real>0.94563335</Real>
     <Real>0.94637001</Real>
     <Real>0.94729853</Real>
     <Real>0.94789016</Real>
-    <Real>0.9492957</Real>
+    <Real>0.94929564</Real>
     <Real>0.95013034</Real>
     <Real>0.95128489</Real>
-    <Real>0.95289272</Real>
+    <Real>0.95289266</Real>
     <Real>0.9538911</Real>
     <Real>0.95517474</Real>
     <Real>0.95651346</Real>
     <Real>0.95739591</Real>
     <Real>0.95905453</Real>
-    <Real>0.95995909</Real>
-    <Real>0.96129471</Real>
+    <Real>0.95995903</Real>
+    <Real>0.96129465</Real>
     <Real>0.96225822</Real>
     <Real>0.96320486</Real>
     <Real>0.96370006</Real>
     <Real>0.96682173</Real>
     <Real>0.96666759</Real>
     <Real>0.96608764</Real>
-    <Real>0.96583378</Real>
+    <Real>0.96583372</Real>
     <Real>0.96554524</Real>
     <Real>0.9645654</Real>
     <Real>0.96389264</Real>
     <Real>0.94219875</Real>
     <Real>0.94211328</Real>
     <Real>0.94299912</Real>
-    <Real>0.94275576</Real>
+    <Real>0.9427557</Real>
     <Real>0.94383633</Real>
     <Real>0.94452924</Real>
     <Real>0.94524854</Real>
     <Real>0.00094952446</Real>
     <Real>0.00096428557</Real>
   </Sequence>
-  <Real Name="Integral">240.60057076136582</Real>
+  <Real Name="Integral">240.60056956927292</Real>
 </ReferenceData>
index 415cf1f5565dfe3a2f631dfcd93004c0d4ddf9eb..b61d14bc34077ec7b9fb0e9a2466df6023c9b76b 100644 (file)
     <Real>0.70085573</Real>
     <Real>0.63575351</Real>
     <Real>0.56621635</Real>
-    <Real>0.49021092</Real>
-    <Real>0.41346616</Real>
+    <Real>0.49021095</Real>
+    <Real>0.41346619</Real>
     <Real>0.32695487</Real>
     <Real>0.23947404</Real>
     <Real>0.15114491</Real>
-    <Real>0.068911292</Real>
-    <Real>-0.018343732</Real>
+    <Real>0.068911299</Real>
+    <Real>-0.018343734</Real>
     <Real>-0.10222372</Real>
     <Real>-0.17851034</Real>
-    <Real>-0.2556752</Real>
+    <Real>-0.25567523</Real>
     <Real>-0.33233142</Real>
     <Real>-0.40906069</Real>
-    <Real>-0.47129509</Real>
+    <Real>-0.47129512</Real>
     <Real>-0.52546626</Real>
     <Real>-0.577564</Real>
     <Real>-0.62862134</Real>
     <Real>-0.66793829</Real>
     <Real>-0.70031446</Real>
     <Real>-0.71649045</Real>
-    <Real>-0.73871797</Real>
+    <Real>-0.73871803</Real>
     <Real>-0.74570811</Real>
     <Real>-0.75775838</Real>
     <Real>-0.75111836</Real>
@@ -39,7 +39,7 @@
     <Real>-0.71327382</Real>
     <Real>-0.68468153</Real>
     <Real>-0.65119308</Real>
-    <Real>-0.60643828</Real>
+    <Real>-0.60643834</Real>
     <Real>-0.56428039</Real>
     <Real>-0.52878588</Real>
     <Real>-0.46647781</Real>
     <Real>-0.34746397</Real>
     <Real>-0.28559166</Real>
     <Real>-0.22607948</Real>
-    <Real>-0.15521984</Real>
+    <Real>-0.15521985</Real>
     <Real>-0.087527938</Real>
-    <Real>-0.021420239</Real>
+    <Real>-0.02142024</Real>
     <Real>0.042880654</Real>
     <Real>0.10628833</Real>
-    <Real>0.169659</Real>
+    <Real>0.16965902</Real>
     <Real>0.23284768</Real>
-    <Real>0.29287171</Real>
+    <Real>0.29287174</Real>
     <Real>0.33996987</Real>
     <Real>0.3846795</Real>
     <Real>0.4326345</Real>
     <Real>0.47152123</Real>
     <Real>0.50605392</Real>
-    <Real>0.53039247</Real>
+    <Real>0.53039253</Real>
     <Real>0.552634</Real>
     <Real>0.57193202</Real>
     <Real>0.57857972</Real>
     <Real>0.58289105</Real>
-    <Real>0.5867179</Real>
+    <Real>0.58671796</Real>
     <Real>0.57858908</Real>
     <Real>0.57083881</Real>
     <Real>0.54604369</Real>
     <Real>0.52723479</Real>
     <Real>0.50264382</Real>
     <Real>0.4660213</Real>
-    <Real>0.42628899</Real>
+    <Real>0.42628902</Real>
     <Real>0.38307241</Real>
-    <Real>0.33706102</Real>
+    <Real>0.33706105</Real>
     <Real>0.29605037</Real>
     <Real>0.25652972</Real>
-    <Real>0.20322086</Real>
-    <Real>0.15179904</Real>
+    <Real>0.20322087</Real>
+    <Real>0.15179905</Real>
     <Real>0.1005994</Real>
     <Real>0.053715136</Real>
-    <Real>-0.0024519849</Real>
+    <Real>-0.0024519851</Real>
     <Real>-0.051181242</Real>
-    <Real>-0.098006107</Real>
+    <Real>-0.098006114</Real>
     <Real>-0.15021549</Real>
-    <Real>-0.19438037</Real>
+    <Real>-0.19438039</Real>
     <Real>-0.2419212</Real>
-    <Real>-0.28681141</Real>
+    <Real>-0.28681144</Real>
     <Real>-0.32269096</Real>
     <Real>-0.35785615</Real>
-    <Real>-0.38878986</Real>
+    <Real>-0.38878989</Real>
     <Real>-0.41733515</Real>
-    <Real>-0.44138661</Real>
-    <Real>-0.44811302</Real>
+    <Real>-0.44138664</Real>
+    <Real>-0.44811305</Real>
     <Real>-0.46269119</Real>
     <Real>-0.46645734</Real>
-    <Real>-0.47144547</Real>
-    <Real>-0.47026828</Real>
-    <Real>-0.46132591</Real>
+    <Real>-0.4714455</Real>
+    <Real>-0.47026831</Real>
+    <Real>-0.46132594</Real>
     <Real>-0.44804862</Real>
     <Real>-0.43905067</Real>
     <Real>-0.41386977</Real>
-    <Real>-0.38871932</Real>
-    <Real>-0.36298344</Real>
+    <Real>-0.38871935</Real>
+    <Real>-0.36298347</Real>
     <Real>-0.32728449</Real>
     <Real>-0.28807318</Real>
     <Real>-0.25138158</Real>
-    <Real>-0.20809993</Real>
+    <Real>-0.20809995</Real>
     <Real>-0.17095725</Real>
     <Real>-0.13121751</Real>
     <Real>-0.086369112</Real>
     <Real>-0.040557165</Real>
     <Real>0.0057886061</Real>
-    <Real>0.050152354</Real>
-    <Real>0.082554683</Real>
-    <Real>0.12262377</Real>
+    <Real>0.050152358</Real>
+    <Real>0.082554691</Real>
+    <Real>0.12262378</Real>
     <Real>0.15991174</Real>
     <Real>0.19901413</Real>
     <Real>0.22433081</Real>
     <Real>0.37430125</Real>
     <Real>0.37234989</Real>
     <Real>0.36795545</Real>
-    <Real>0.35466814</Real>
-    <Real>0.34249428</Real>
+    <Real>0.35466817</Real>
+    <Real>0.34249431</Real>
     <Real>0.32283241</Real>
     <Real>0.30485228</Real>
     <Real>0.28708842</Real>
-    <Real>0.25817123</Real>
-    <Real>0.22833388</Real>
+    <Real>0.25817126</Real>
+    <Real>0.22833389</Real>
     <Real>0.20199309</Real>
-    <Real>0.16451561</Real>
-    <Real>0.14491151</Real>
+    <Real>0.16451563</Real>
+    <Real>0.14491153</Real>
     <Real>0.10192882</Real>
-    <Real>0.071294688</Real>
-    <Real>0.03886297</Real>
-    <Real>0.0038909942</Real>
+    <Real>0.071294695</Real>
+    <Real>0.038862973</Real>
+    <Real>0.0038909945</Real>
     <Real>-0.020299936</Real>
     <Real>-0.055376183</Real>
     <Real>-0.092676423</Real>
     <Real>-0.12172776</Real>
     <Real>-0.15591128</Real>
-    <Real>-0.17435807</Real>
+    <Real>-0.17435808</Real>
     <Real>-0.19855703</Real>
     <Real>-0.21759604</Real>
-    <Real>-0.2342567</Real>
+    <Real>-0.23425671</Real>
     <Real>-0.2501609</Real>
-    <Real>-0.26639262</Real>
+    <Real>-0.26639265</Real>
     <Real>-0.27480033</Real>
     <Real>-0.2769354</Real>
     <Real>-0.28888217</Real>
     <Real>-0.29434624</Real>
-    <Real>-0.29110822</Real>
+    <Real>-0.29110825</Real>
     <Real>-0.28738263</Real>
     <Real>-0.27644756</Real>
     <Real>-0.26865044</Real>
-    <Real>-0.26017156</Real>
-    <Real>-0.24633232</Real>
+    <Real>-0.26017159</Real>
+    <Real>-0.24633233</Real>
     <Real>-0.22993366</Real>
-    <Real>-0.21036342</Real>
+    <Real>-0.21036343</Real>
     <Real>-0.19680807</Real>
     <Real>-0.16794714</Real>
-    <Real>-0.14982072</Real>
+    <Real>-0.14982073</Real>
     <Real>-0.1253354</Real>
-    <Real>-0.091874786</Real>
+    <Real>-0.091874793</Real>
     <Real>-0.070614971</Real>
     <Real>-0.043464452</Real>
     <Real>-0.01496042</Real>
     <Real>0.0054097059</Real>
-    <Real>0.039536409</Real>
+    <Real>0.039536413</Real>
     <Real>0.058995754</Real>
     <Real>0.087431222</Real>
-    <Real>0.10856776</Real>
-    <Real>0.12864889</Real>
+    <Real>0.10856777</Real>
+    <Real>0.12864891</Real>
     <Real>0.14001396</Real>
     <Real>0.15372792</Real>
     <Real>0.16890197</Real>
     <Real>0.1832682</Real>
-    <Real>0.19547278</Real>
+    <Real>0.19547279</Real>
     <Real>0.20601526</Real>
-    <Real>0.22224233</Real>
+    <Real>0.22224234</Real>
     <Real>0.22276327</Real>
-    <Real>0.22658545</Real>
+    <Real>0.22658546</Real>
     <Real>0.22071175</Real>
     <Real>0.21529464</Real>
-    <Real>0.21472976</Real>
+    <Real>0.21472977</Real>
     <Real>0.20628634</Real>
     <Real>0.2043854</Real>
-    <Real>0.20099047</Real>
+    <Real>0.20099048</Real>
     <Real>0.18452412</Real>
     <Real>0.17380331</Real>
     <Real>0.15045828</Real>
-    <Real>0.13115592</Real>
+    <Real>0.13115594</Real>
     <Real>0.1251017</Real>
     <Real>0.10887553</Real>
     <Real>0.079097189</Real>
     <Real>0.061385516</Real>
     <Real>0.043582208</Real>
-    <Real>0.026112026</Real>
+    <Real>0.026112027</Real>
     <Real>0.01028904</Real>
     <Real>-0.011082372</Real>
     <Real>-0.031485982</Real>
     <Real>-0.11735611</Real>
     <Real>-0.12887773</Real>
     <Real>-0.14123638</Real>
-    <Real>-0.1465044</Real>
+    <Real>-0.14650442</Real>
     <Real>-0.16701357</Real>
     <Real>-0.16918446</Real>
     <Real>-0.17741001</Real>
-    <Real>-0.18355082</Real>
+    <Real>-0.18355083</Real>
     <Real>-0.17439707</Real>
     <Real>-0.17841232</Real>
     <Real>-0.16846335</Real>
     <Real>-0.16889346</Real>
-    <Real>-0.17227842</Real>
+    <Real>-0.17227843</Real>
     <Real>-0.17070685</Real>
     <Real>-0.15092036</Real>
     <Real>-0.15334848</Real>
     <Real>-0.12954405</Real>
     <Real>-0.11295433</Real>
-    <Real>-0.09564729</Real>
+    <Real>-0.095647298</Real>
     <Real>-0.080270432</Real>
     <Real>-0.06479656</Real>
-    <Real>-0.055495787</Real>
+    <Real>-0.055495791</Real>
     <Real>-0.03828676</Real>
     <Real>-0.026680976</Real>
     <Real>-0.0092150476</Real>
     <Real>-0.0018779703</Real>
-    <Real>0.014258126</Real>
+    <Real>0.014258127</Real>
     <Real>0.023644734</Real>
-    <Real>0.040185757</Real>
+    <Real>0.040185761</Real>
     <Real>0.050761189</Real>
     <Real>0.060287103</Real>
     <Real>0.065608293</Real>
-    <Real>0.080362737</Real>
+    <Real>0.080362745</Real>
     <Real>0.083356142</Real>
     <Real>0.10414003</Real>
     <Real>0.11332227</Real>
     <Real>0.12000805</Real>
     <Real>0.12286837</Real>
-    <Real>0.13463314</Real>
-    <Real>0.14336015</Real>
+    <Real>0.13463315</Real>
+    <Real>0.14336017</Real>
     <Real>0.15017572</Real>
     <Real>1.6947948e-05</Real>
     <Real>1.720169e-05</Real>
     <Real>-0.00016269117</Real>
     <Real>-0.00016905692</Real>
   </Sequence>
-  <Real Name="Integral">0.049695708357404555</Real>
+  <Real Name="Integral">0.049695614293824519</Real>
 </ReferenceData>
index d318d513c0fbc7b356e4170c025ca2fda79319a3..6a528649edb175df560c6cc25615836ce2c15fc5 100644 (file)
@@ -13,7 +13,7 @@
     <Real>0.65127754</Real>
     <Real>0.58396322</Real>
     <Real>0.50845456</Real>
-    <Real>0.43051061</Real>
+    <Real>0.43051064</Real>
     <Real>0.35105249</Real>
     <Real>0.26587203</Real>
     <Real>0.18143819</Real>
@@ -43,7 +43,7 @@
     <Real>-0.56959647</Real>
     <Real>-0.53186774</Real>
     <Real>-0.47233477</Real>
-    <Real>-0.42289308</Real>
+    <Real>-0.42289311</Real>
     <Real>-0.36013916</Real>
     <Real>-0.30238953</Real>
     <Real>-0.23851043</Real>
     <Real>0.033095215</Real>
     <Real>0.064681761</Real>
     <Real>0.10605592</Real>
-    <Real>0.13676096</Real>
+    <Real>0.13676098</Real>
     <Real>0.17619975</Real>
     <Real>0.20634755</Real>
     <Real>0.23424256</Real>
     <Real>0.28315401</Real>
     <Real>0.31159228</Real>
     <Real>0.32296148</Real>
-    <Real>0.3337082</Real>
+    <Real>0.33370823</Real>
     <Real>0.3472271</Real>
     <Real>0.35520938</Real>
     <Real>0.35884556</Real>
     <Real>-0.24391536</Real>
     <Real>-0.23143035</Real>
     <Real>-0.21355876</Real>
-    <Real>-0.19516303</Real>
+    <Real>-0.19516304</Real>
     <Real>-0.17305651</Real>
     <Real>-0.14851433</Real>
     <Real>-0.13391782</Real>
     <Real>-0.0082916291</Real>
     <Real>0.028239559</Real>
     <Real>0.044842608</Real>
-    <Real>0.066723041</Real>
+    <Real>0.066723049</Real>
     <Real>0.086818486</Real>
     <Real>0.11206019</Real>
     <Real>0.13034853</Real>
     <Real>0.16507152</Real>
     <Real>0.14102207</Real>
     <Real>0.13159586</Real>
-    <Real>0.11218439</Real>
+    <Real>0.1121844</Real>
     <Real>0.090035476</Real>
     <Real>0.069503993</Real>
     <Real>0.054288179</Real>
     <Real>-0.0047988398</Real>
     <Real>-0.024740862</Real>
     <Real>-0.042112309</Real>
-    <Real>-0.057106286</Real>
+    <Real>-0.05710629</Real>
     <Real>-0.079133794</Real>
     <Real>-0.08531253</Real>
     <Real>-0.10183473</Real>
     <Real>-8.4526189e-05</Real>
     <Real>-0.00019142308</Real>
   </Sequence>
-  <Real Name="Integral">0.54968381075777017</Real>
+  <Real Name="Integral">0.54968385173596346</Real>
 </ReferenceData>
index f02426b8fc9347f214ed1f723c67339887c19876..3784c42df892643acd35d3d4e60fa30f2753e71e 100644 (file)
@@ -38,7 +38,7 @@
     <Real>-0.47069913</Real>
     <Real>-0.44109708</Real>
     <Real>-0.44801748</Real>
-    <Real>-0.44286934</Real>
+    <Real>-0.44286937</Real>
     <Real>-0.40633747</Real>
     <Real>-0.38159758</Real>
     <Real>-0.38471025</Real>
@@ -46,7 +46,7 @@
     <Real>-0.2954666</Real>
     <Real>-0.22040513</Real>
     <Real>-0.20538236</Real>
-    <Real>-0.17562716</Real>
+    <Real>-0.17562717</Real>
     <Real>-0.12331922</Real>
     <Real>-0.10807745</Real>
     <Real>-0.050659552</Real>
     <Real>0.33220929</Real>
     <Real>0.33306259</Real>
     <Real>0.33927098</Real>
-    <Real>0.37198529</Real>
+    <Real>0.37198532</Real>
     <Real>0.417128</Real>
     <Real>0.4154191</Real>
     <Real>0.39847392</Real>
     <Real>-0.13059393</Real>
     <Real>-0.10386769</Real>
     <Real>-0.075353824</Real>
-    <Real>-0.065707266</Real>
+    <Real>-0.065707274</Real>
     <Real>-0.018131474</Real>
     <Real>-0.014584285</Real>
     <Real>0.0061852229</Real>
     <Real>-0.00067634159</Real>
     <Real>-0.0014037765</Real>
   </Sequence>
-  <Real Name="Integral">-0.13156737015469844</Real>
+  <Real Name="Integral">-0.13156739250644023</Real>
 </ReferenceData>
index e61b5e32d2decf5f1b49134fad203163af5508c3..7a673d6cb7e2ff5d455cf50e2753482ca776e3dd 100644 (file)
     <Real>1</Real>
     <Real>1.0026263</Real>
     <Real>1.002813</Real>
-    <Real>1.0028353</Real>
-    <Real>1.00298</Real>
+    <Real>1.0028352</Real>
+    <Real>1.0029799</Real>
     <Real>1.0031264</Real>
-    <Real>1.0033009</Real>
+    <Real>1.0033008</Real>
     <Real>1.0034248</Real>
     <Real>1.0034949</Real>
-    <Real>1.0036868</Real>
+    <Real>1.0036867</Real>
     <Real>1.0038811</Real>
-    <Real>1.0039461</Real>
+    <Real>1.0039459</Real>
     <Real>1.0039393</Real>
-    <Real>1.0039014</Real>
-    <Real>1.0041367</Real>
-    <Real>1.0040401</Real>
+    <Real>1.0039012</Real>
+    <Real>1.0041366</Real>
+    <Real>1.00404</Real>
     <Real>1.0039788</Real>
     <Real>1.0041522</Real>
     <Real>1.004038</Real>
-    <Real>1.00398</Real>
-    <Real>1.0038664</Real>
-    <Real>1.0038596</Real>
-    <Real>1.00374</Real>
-    <Real>1.0035481</Real>
-    <Real>1.0035183</Real>
+    <Real>1.0039799</Real>
+    <Real>1.0038663</Real>
+    <Real>1.0038595</Real>
+    <Real>1.0037398</Real>
+    <Real>1.003548</Real>
+    <Real>1.0035182</Real>
     <Real>1.003296</Real>
     <Real>1.0031067</Real>
-    <Real>1.0031048</Real>
-    <Real>1.0029247</Real>
+    <Real>1.0031047</Real>
+    <Real>1.0029246</Real>
     <Real>1.0029281</Real>
-    <Real>1.0027844</Real>
+    <Real>1.0027843</Real>
     <Real>1.0024828</Real>
     <Real>1.0026224</Real>
-    <Real>1.0028158</Real>
+    <Real>1.0028157</Real>
     <Real>1.0028605</Real>
     <Real>1.0029123</Real>
-    <Real>1.0031923</Real>
+    <Real>1.0031922</Real>
     <Real>1.0032749</Real>
-    <Real>1.0033575</Real>
-    <Real>1.0034987</Real>
-    <Real>1.0035222</Real>
-    <Real>1.0038122</Real>
+    <Real>1.0033574</Real>
+    <Real>1.0034986</Real>
+    <Real>1.003522</Real>
+    <Real>1.0038121</Real>
     <Real>1.0038934</Real>
     <Real>1.0038835</Real>
-    <Real>1.003985</Real>
+    <Real>1.0039849</Real>
     <Real>1.0040591</Real>
     <Real>1.0040226</Real>
     <Real>1.004043</Real>
-    <Real>1.0039675</Real>
-    <Real>1.0040811</Real>
+    <Real>1.0039674</Real>
+    <Real>1.004081</Real>
     <Real>1.0039179</Real>
-    <Real>1.003891</Real>
+    <Real>1.0038909</Real>
     <Real>1.0038245</Real>
     <Real>1.0036744</Real>
     <Real>1.0038064</Real>
     <Real>1.0035872</Real>
     <Real>1.003276</Real>
-    <Real>1.0033685</Real>
+    <Real>1.0033684</Real>
     <Real>1.0032185</Real>
     <Real>1.0030403</Real>
     <Real>1.0028248</Real>
     <Real>1.0028371</Real>
-    <Real>1.0028143</Real>
+    <Real>1.0028142</Real>
     <Real>1.00263</Real>
-    <Real>1.002896</Real>
+    <Real>1.0028958</Real>
     <Real>1.0029092</Real>
-    <Real>1.0029544</Real>
+    <Real>1.0029542</Real>
     <Real>1.0030841</Real>
     <Real>1.0033208</Real>
-    <Real>1.0033398</Real>
-    <Real>1.0034574</Real>
-    <Real>1.003602</Real>
-    <Real>1.0037988</Real>
+    <Real>1.0033396</Real>
+    <Real>1.0034573</Real>
+    <Real>1.0036019</Real>
+    <Real>1.0037987</Real>
     <Real>1.0038297</Real>
     <Real>1.0040625</Real>
     <Real>1.0039389</Real>
     <Real>1.0040179</Real>
     <Real>1.0039594</Real>
     <Real>1.0039961</Real>
-    <Real>1.0039948</Real>
+    <Real>1.0039947</Real>
     <Real>1.0040424</Real>
-    <Real>1.0039783</Real>
-    <Real>1.0039077</Real>
-    <Real>1.003881</Real>
-    <Real>1.003885</Real>
-    <Real>1.0038402</Real>
+    <Real>1.0039781</Real>
+    <Real>1.0039076</Real>
+    <Real>1.0038809</Real>
+    <Real>1.0038849</Real>
+    <Real>1.0038401</Real>
     <Real>1.0036588</Real>
     <Real>1.0035746</Real>
-    <Real>1.0034667</Real>
-    <Real>1.0033582</Real>
+    <Real>1.0034666</Real>
+    <Real>1.0033581</Real>
     <Real>1.0032606</Real>
-    <Real>1.0031298</Real>
-    <Real>1.0029531</Real>
-    <Real>1.0029762</Real>
+    <Real>1.0031297</Real>
+    <Real>1.0029529</Real>
+    <Real>1.0029761</Real>
     <Real>1.0028747</Real>
     <Real>1.0028256</Real>
-    <Real>1.0029508</Real>
+    <Real>1.0029507</Real>
     <Real>1.0031258</Real>
-    <Real>1.0032694</Real>
+    <Real>1.0032693</Real>
     <Real>1.0033274</Real>
     <Real>1.0034236</Real>
     <Real>1.0035467</Real>
     <Real>1.0037386</Real>
-    <Real>1.0037678</Real>
+    <Real>1.0037677</Real>
     <Real>1.0038179</Real>
     <Real>1.003939</Real>
     <Real>1.003979</Real>
     <Real>1.00396</Real>
     <Real>1.0039968</Real>
-    <Real>1.0040765</Real>
+    <Real>1.0040764</Real>
     <Real>1.0039867</Real>
     <Real>1.0040717</Real>
     <Real>1.0039583</Real>
     <Real>1.0038927</Real>
-    <Real>1.0039638</Real>
+    <Real>1.0039637</Real>
     <Real>1.0038794</Real>
     <Real>1.003749</Real>
     <Real>1.0036877</Real>
-    <Real>1.0035897</Real>
-    <Real>1.0034268</Real>
+    <Real>1.0035896</Real>
+    <Real>1.0034267</Real>
     <Real>1.0034192</Real>
     <Real>1.0032343</Real>
-    <Real>1.0033185</Real>
-    <Real>1.0029762</Real>
+    <Real>1.0033184</Real>
+    <Real>1.0029761</Real>
     <Real>1.0031357</Real>
     <Real>1.003207</Real>
-    <Real>1.0029137</Real>
+    <Real>1.0029136</Real>
     <Real>1.0030683</Real>
-    <Real>1.0031815</Real>
+    <Real>1.0031813</Real>
     <Real>1.0033453</Real>
-    <Real>1.0033225</Real>
+    <Real>1.0033224</Real>
     <Real>1.0034435</Real>
-    <Real>1.0035906</Real>
-    <Real>1.0036092</Real>
+    <Real>1.0035905</Real>
+    <Real>1.0036091</Real>
     <Real>1.0037911</Real>
-    <Real>1.0038091</Real>
-    <Real>1.0039287</Real>
+    <Real>1.003809</Real>
+    <Real>1.0039285</Real>
     <Real>1.0040594</Real>
     <Real>1.003963</Real>
     <Real>1.0039438</Real>
-    <Real>1.004236</Real>
+    <Real>1.0042359</Real>
     <Real>1.0041121</Real>
     <Real>1.0039667</Real>
-    <Real>1.0039054</Real>
-    <Real>1.0039448</Real>
+    <Real>1.0039053</Real>
+    <Real>1.0039446</Real>
     <Real>1.0038875</Real>
-    <Real>1.0039566</Real>
-    <Real>1.0037364</Real>
+    <Real>1.0039564</Real>
+    <Real>1.0037363</Real>
     <Real>1.0038453</Real>
-    <Real>1.0036628</Real>
+    <Real>1.0036627</Real>
     <Real>1.0036311</Real>
-    <Real>1.0035908</Real>
+    <Real>1.0035907</Real>
     <Real>1.0035497</Real>
-    <Real>1.0035697</Real>
-    <Real>1.0033984</Real>
+    <Real>1.0035696</Real>
+    <Real>1.0033983</Real>
     <Real>1.0034442</Real>
     <Real>1.0033016</Real>
-    <Real>1.0032938</Real>
-    <Real>1.0032138</Real>
+    <Real>1.0032936</Real>
+    <Real>1.0032136</Real>
     <Real>1.0033556</Real>
     <Real>1.0033462</Real>
     <Real>1.0034832</Real>
     <Real>1.0035497</Real>
     <Real>1.0036097</Real>
     <Real>1.003722</Real>
-    <Real>1.003818</Real>
+    <Real>1.0038179</Real>
     <Real>1.0037833</Real>
-    <Real>1.0038013</Real>
-    <Real>1.0039788</Real>
+    <Real>1.0038012</Real>
+    <Real>1.0039787</Real>
     <Real>1.0039507</Real>
     <Real>1.0040078</Real>
-    <Real>1.0040756</Real>
-    <Real>1.0040264</Real>
+    <Real>1.0040755</Real>
+    <Real>1.0040263</Real>
     <Real>1.0038471</Real>
     <Real>1.0039368</Real>
     <Real>1.0040127</Real>
-    <Real>1.0038276</Real>
-    <Real>1.0038612</Real>
-    <Real>1.0038606</Real>
+    <Real>1.0038275</Real>
+    <Real>1.0038611</Real>
+    <Real>1.0038605</Real>
     <Real>1.0038905</Real>
     <Real>1.0039259</Real>
-    <Real>1.0036864</Real>
+    <Real>1.0036863</Real>
     <Real>1.0036433</Real>
-    <Real>1.0036565</Real>
+    <Real>1.0036564</Real>
     <Real>1.0036999</Real>
     <Real>1.003649</Real>
     <Real>1.0035149</Real>
     <Real>1.003474</Real>
     <Real>1.0034895</Real>
     <Real>1.003518</Real>
-    <Real>1.0036062</Real>
-    <Real>1.0036708</Real>
+    <Real>1.0036061</Real>
+    <Real>1.0036707</Real>
     <Real>1.0038066</Real>
-    <Real>1.0037796</Real>
-    <Real>1.0038444</Real>
+    <Real>1.0037795</Real>
+    <Real>1.0038443</Real>
     <Real>1.0038437</Real>
     <Real>1.0038533</Real>
     <Real>1.0040073</Real>
     <Real>1.0039427</Real>
-    <Real>1.0040594</Real>
+    <Real>1.0040593</Real>
     <Real>1.0040133</Real>
     <Real>1.0039896</Real>
     <Real>1.0041509</Real>
-    <Real>1.0040509</Real>
-    <Real>1.0040835</Real>
+    <Real>1.0040507</Real>
+    <Real>1.0040834</Real>
     <Real>1.0039433</Real>
     <Real>1.0039626</Real>
     <Real>1.0039417</Real>
     <Real>1.0038795</Real>
     <Real>1.0038284</Real>
     <Real>1.0037864</Real>
-    <Real>1.0037988</Real>
-    <Real>1.0038092</Real>
-    <Real>1.0038675</Real>
-    <Real>1.0038058</Real>
+    <Real>1.0037987</Real>
+    <Real>1.0038091</Real>
+    <Real>1.0038674</Real>
+    <Real>1.0038056</Real>
     <Real>1.0036768</Real>
-    <Real>1.0036308</Real>
+    <Real>1.0036306</Real>
     <Real>1.0037299</Real>
-    <Real>1.003732</Real>
-    <Real>1.0038123</Real>
-    <Real>1.0038664</Real>
+    <Real>1.0037318</Real>
+    <Real>1.0038122</Real>
+    <Real>1.0038663</Real>
     <Real>1.0037434</Real>
     <Real>1.0037843</Real>
-    <Real>1.0037801</Real>
+    <Real>1.00378</Real>
     <Real>1.0039681</Real>
-    <Real>1.003965</Real>
+    <Real>1.0039649</Real>
     <Real>1.0039586</Real>
     <Real>1.0040132</Real>
     <Real>1.0040785</Real>
     <Real>1.004027</Real>
     <Real>1.0039933</Real>
-    <Real>1.0040841</Real>
+    <Real>1.004084</Real>
     <Real>1.0040706</Real>
-    <Real>1.0040671</Real>
-    <Real>1.0040392</Real>
-    <Real>1.003906</Real>
-    <Real>1.0039387</Real>
-    <Real>1.0039802</Real>
+    <Real>1.0040669</Real>
+    <Real>1.004039</Real>
+    <Real>1.0039059</Real>
+    <Real>1.0039386</Real>
+    <Real>1.00398</Real>
     <Real>1.0039933</Real>
     <Real>1.0039399</Real>
     <Real>1.0039351</Real>
-    <Real>1.0039452</Real>
+    <Real>1.0039451</Real>
     <Real>1.0038861</Real>
-    <Real>1.0039293</Real>
+    <Real>1.0039291</Real>
     <Real>1.0039737</Real>
-    <Real>1.0039887</Real>
+    <Real>1.0039886</Real>
     <Real>1.0038258</Real>
     <Real>-0.49893174</Real>
     <Real>-0.49886957</Real>
     <Real>-0.49923372</Real>
     <Real>-0.49851903</Real>
   </Sequence>
-  <Real Name="Integral">127.17098122835159</Real>
+  <Real Name="Integral">127.17096823453903</Real>
 </ReferenceData>
index d318d513c0fbc7b356e4170c025ca2fda79319a3..6a528649edb175df560c6cc25615836ce2c15fc5 100644 (file)
@@ -13,7 +13,7 @@
     <Real>0.65127754</Real>
     <Real>0.58396322</Real>
     <Real>0.50845456</Real>
-    <Real>0.43051061</Real>
+    <Real>0.43051064</Real>
     <Real>0.35105249</Real>
     <Real>0.26587203</Real>
     <Real>0.18143819</Real>
@@ -43,7 +43,7 @@
     <Real>-0.56959647</Real>
     <Real>-0.53186774</Real>
     <Real>-0.47233477</Real>
-    <Real>-0.42289308</Real>
+    <Real>-0.42289311</Real>
     <Real>-0.36013916</Real>
     <Real>-0.30238953</Real>
     <Real>-0.23851043</Real>
     <Real>0.033095215</Real>
     <Real>0.064681761</Real>
     <Real>0.10605592</Real>
-    <Real>0.13676096</Real>
+    <Real>0.13676098</Real>
     <Real>0.17619975</Real>
     <Real>0.20634755</Real>
     <Real>0.23424256</Real>
     <Real>0.28315401</Real>
     <Real>0.31159228</Real>
     <Real>0.32296148</Real>
-    <Real>0.3337082</Real>
+    <Real>0.33370823</Real>
     <Real>0.3472271</Real>
     <Real>0.35520938</Real>
     <Real>0.35884556</Real>
     <Real>-0.24391536</Real>
     <Real>-0.23143035</Real>
     <Real>-0.21355876</Real>
-    <Real>-0.19516303</Real>
+    <Real>-0.19516304</Real>
     <Real>-0.17305651</Real>
     <Real>-0.14851433</Real>
     <Real>-0.13391782</Real>
     <Real>-0.0082916291</Real>
     <Real>0.028239559</Real>
     <Real>0.044842608</Real>
-    <Real>0.066723041</Real>
+    <Real>0.066723049</Real>
     <Real>0.086818486</Real>
     <Real>0.11206019</Real>
     <Real>0.13034853</Real>
     <Real>0.16507152</Real>
     <Real>0.14102207</Real>
     <Real>0.13159586</Real>
-    <Real>0.11218439</Real>
+    <Real>0.1121844</Real>
     <Real>0.090035476</Real>
     <Real>0.069503993</Real>
     <Real>0.054288179</Real>
     <Real>-0.0047988398</Real>
     <Real>-0.024740862</Real>
     <Real>-0.042112309</Real>
-    <Real>-0.057106286</Real>
+    <Real>-0.05710629</Real>
     <Real>-0.079133794</Real>
     <Real>-0.08531253</Real>
     <Real>-0.10183473</Real>
     <Real>-8.4526189e-05</Real>
     <Real>-0.00019142308</Real>
   </Sequence>
-  <Real Name="Integral">0.54968381075777017</Real>
+  <Real Name="Integral">0.54968385173596346</Real>
 </ReferenceData>
index d318d513c0fbc7b356e4170c025ca2fda79319a3..6a528649edb175df560c6cc25615836ce2c15fc5 100644 (file)
@@ -13,7 +13,7 @@
     <Real>0.65127754</Real>
     <Real>0.58396322</Real>
     <Real>0.50845456</Real>
-    <Real>0.43051061</Real>
+    <Real>0.43051064</Real>
     <Real>0.35105249</Real>
     <Real>0.26587203</Real>
     <Real>0.18143819</Real>
@@ -43,7 +43,7 @@
     <Real>-0.56959647</Real>
     <Real>-0.53186774</Real>
     <Real>-0.47233477</Real>
-    <Real>-0.42289308</Real>
+    <Real>-0.42289311</Real>
     <Real>-0.36013916</Real>
     <Real>-0.30238953</Real>
     <Real>-0.23851043</Real>
     <Real>0.033095215</Real>
     <Real>0.064681761</Real>
     <Real>0.10605592</Real>
-    <Real>0.13676096</Real>
+    <Real>0.13676098</Real>
     <Real>0.17619975</Real>
     <Real>0.20634755</Real>
     <Real>0.23424256</Real>
     <Real>0.28315401</Real>
     <Real>0.31159228</Real>
     <Real>0.32296148</Real>
-    <Real>0.3337082</Real>
+    <Real>0.33370823</Real>
     <Real>0.3472271</Real>
     <Real>0.35520938</Real>
     <Real>0.35884556</Real>
     <Real>-0.24391536</Real>
     <Real>-0.23143035</Real>
     <Real>-0.21355876</Real>
-    <Real>-0.19516303</Real>
+    <Real>-0.19516304</Real>
     <Real>-0.17305651</Real>
     <Real>-0.14851433</Real>
     <Real>-0.13391782</Real>
     <Real>-0.0082916291</Real>
     <Real>0.028239559</Real>
     <Real>0.044842608</Real>
-    <Real>0.066723041</Real>
+    <Real>0.066723049</Real>
     <Real>0.086818486</Real>
     <Real>0.11206019</Real>
     <Real>0.13034853</Real>
     <Real>0.16507152</Real>
     <Real>0.14102207</Real>
     <Real>0.13159586</Real>
-    <Real>0.11218439</Real>
+    <Real>0.1121844</Real>
     <Real>0.090035476</Real>
     <Real>0.069503993</Real>
     <Real>0.054288179</Real>
     <Real>-0.0047988398</Real>
     <Real>-0.024740862</Real>
     <Real>-0.042112309</Real>
-    <Real>-0.057106286</Real>
+    <Real>-0.05710629</Real>
     <Real>-0.079133794</Real>
     <Real>-0.08531253</Real>
     <Real>-0.10183473</Real>
     <Real>-8.4526189e-05</Real>
     <Real>-0.00019142308</Real>
   </Sequence>
-  <Real Name="Integral">0.54968381075777017</Real>
+  <Real Name="Integral">0.54968385173596346</Real>
 </ReferenceData>
index f968c0c25e9829b1760347cf11bf52bc2fe35b71..b9f7053a5e4bc3392012ca295c238c97e1081c1f 100644 (file)
@@ -3,9 +3,9 @@
 <ReferenceData>
   <Sequence Name="result">
     <Int Name="Length">4</Int>
-    <Real>7.8450705641969325</Real>
-    <Real>2.6181457557146546</Real>
-    <Real>-124.26093946666471</Real>
-    <Real>10.991394787222672</Real>
+    <Real>93.478249768350366</Real>
+    <Real>106.54191922850268</Real>
+    <Real>180.89848007846916</Real>
+    <Real>4.0862253105513728</Real>
   </Sequence>
 </ReferenceData>
index 05f9939df883a2ea8e0c1060ae4561040e441a85..5247edc079ae49f1155cd3d4695f550409fd3c5b 100644 (file)
@@ -3,8 +3,8 @@
 <ReferenceData>
   <Sequence Name="result">
     <Int Name="Length">3</Int>
-    <Real>3.7998256591705597</Real>
-    <Real>0.82432886141340755</Real>
-    <Real>1.5224332184919882</Real>
+    <Real>0.50082180382778319</Real>
+    <Real>1</Real>
+    <Real>103.32999340041971</Real>
   </Sequence>
 </ReferenceData>
index b39c37344a330b63d0ac8833fd560fb3c86ce14c..fc4b9df324708c76ed7c1e21fb446dcc38967481 100644 (file)
@@ -3,6 +3,6 @@
 <ReferenceData>
   <Sequence Name="result">
     <Int Name="Length">1</Int>
-    <Real>28.790295709638542</Real>
+    <Real>28.633791718066412</Real>
   </Sequence>
 </ReferenceData>
index e30564ea477680500dd838b8bebcdf71bcc7cb72..23ffce35c346e87c37f489184789b319ee4b44a7 100644 (file)
@@ -3,7 +3,7 @@
 <ReferenceData>
   <Sequence Name="result">
     <Int Name="Length">2</Int>
-    <Real>38.159752015476776</Real>
-    <Real>0.7956683286568571</Real>
+    <Real>36.978317574617037</Real>
+    <Real>0.80802279377014719</Real>
   </Sequence>
 </ReferenceData>
index 9dd9a8bc4aa1577c6a211aed8d65a259f78b79e4..e56125557b18ce209954480546dde8cfdc921c81 100644 (file)
@@ -3,10 +3,10 @@
 <ReferenceData>
   <Sequence Name="result">
     <Int Name="Length">5</Int>
-    <Real>0.4874505859136089</Real>
-    <Real>5.593512789216291</Real>
-    <Real>0.5859548866294173</Real>
-    <Real>50.639858390563305</Real>
-    <Real>-0.002429583757534859</Real>
+    <Real>0.59327596683805051</Real>
+    <Real>16.243870118801162</Real>
+    <Real>0.34166095324008267</Real>
+    <Real>96.46496015267067</Real>
+    <Real>0.014656658285601946</Real>
   </Sequence>
 </ReferenceData>
index 20c587183be224b12423c462328c003af92c8fd6..fdf0e31a983bf6e3c1776964983b3445afcd53a2 100644 (file)
@@ -3,12 +3,12 @@
 <ReferenceData>
   <Sequence Name="result">
     <Int Name="Length">7</Int>
-    <Real>0.5512395081799536</Real>
-    <Real>6.5183422896301373</Real>
-    <Real>-0.67296121974350642</Real>
-    <Real>31.927951035981206</Real>
-    <Real>1.186708933085455</Real>
-    <Real>42.008654192804514</Real>
-    <Real>-0.0015455112108527936</Real>
+    <Real>0.22969109737961602</Real>
+    <Real>1.6938073214026785</Real>
+    <Real>0.58047615485173931</Real>
+    <Real>23.514547265682463</Real>
+    <Real>0.25468630875040837</Real>
+    <Real>124.69588927433887</Real>
+    <Real>0.0088943612374425204</Real>
   </Sequence>
 </ReferenceData>
index e9ecccc21670b1a394eece99e1440002d6c213b3..9998eae0b8ecf1a94683975d07aa8248c51f016d 100644 (file)
@@ -3,14 +3,14 @@
 <ReferenceData>
   <Sequence Name="result">
     <Int Name="Length">9</Int>
-    <Real>15.957817686967116</Real>
-    <Real>221006.78653735726</Real>
-    <Real>114.88630569000553</Real>
-    <Real>-33734.142061366547</Real>
-    <Real>7.6914607460936715</Real>
-    <Real>1876.2303193471271</Real>
-    <Real>0.75265207702909753</Real>
-    <Real>24.572552704802391</Real>
-    <Real>-138.40801944191745</Real>
+    <Real>0.22969086672835151</Real>
+    <Real>1.6938036292509138</Real>
+    <Real>0.44194868847867191</Real>
+    <Real>23.513035628000434</Real>
+    <Real>0.13852713430709759</Real>
+    <Real>23.519216989391605</Real>
+    <Real>0.25468685075723652</Real>
+    <Real>124.69561162954194</Real>
+    <Real>0.008894417740064841</Real>
   </Sequence>
 </ReferenceData>
similarity index 63%
rename from src/gromacs/correlationfunctions/tests/refdata/ExpfitTest_EffnEXP3.xml
rename to src/gromacs/correlationfunctions/tests/refdata/ExpfitTest_EffnEXPEXP.xml
index 74d4d3acb155a265fcc3cf71d3b04cd61bc06268..942d1ba9963646b78514d679a26a4b27cf745b15 100644 (file)
@@ -3,8 +3,8 @@
 <ReferenceData>
   <Sequence Name="result">
     <Int Name="Length">3</Int>
-    <Real>49.669368440495347</Real>
-    <Real>0.58492964998546348</Real>
-    <Real>6.4814246273214478</Real>
+    <Real>6.7235795110785457</Real>
+    <Real>0.42329531456542407</Real>
+    <Real>50.286846364014501</Real>
   </Sequence>
 </ReferenceData>
index fe3d48e213ce0f210f39965210cae068882ac876..64ba55b60c41ab24acdce3d1a87e6fda427822a7 100644 (file)
@@ -3,11 +3,11 @@
 <ReferenceData>
   <Sequence Name="result">
     <Int Name="Length">6</Int>
-    <Real>0.2214172263311579</Real>
-    <Real>10.066519430470473</Real>
-    <Real>3.7707829256907712</Real>
-    <Real>0.72109681793857272</Real>
-    <Real>0.49886880345093437</Real>
-    <Real>1.000154618776814</Real>
+    <Real>0.49146807677176813</Real>
+    <Real>10.122470863238238</Real>
+    <Real>7.3785890028734542</Real>
+    <Real>1.2022517448320804</Real>
+    <Real>0.41325325292628245</Real>
+    <Real>5.8277122335091622</Real>
   </Sequence>
 </ReferenceData>
index 35f0f013234e8cb36458dde3de909f0667bb61be..5fe01975e11aab35be5100c406b7d15594bbfda0 100644 (file)
@@ -3,7 +3,7 @@
 <ReferenceData>
   <Sequence Name="result">
     <Int Name="Length">2</Int>
-    <Real>1.3759034165632673</Real>
-    <Real>0.20054113811854915</Real>
+    <Real>0.61188112533079864</Real>
+    <Real>0.085941133945086262</Real>
   </Sequence>
 </ReferenceData>
diff --git a/src/gromacs/correlationfunctions/tests/testERF.xvg b/src/gromacs/correlationfunctions/tests/testERF.xvg
new file mode 100644 (file)
index 0000000..79b426f
--- /dev/null
@@ -0,0 +1,401 @@
+0 93.486577
+1 92.437952
+2 92.676899
+3 93.287708
+4 92.524602
+5 93.33982
+6 94.322249
+7 94.152165
+8 93.268429
+9 92.985186
+10 92.447793
+11 93.529461
+12 93.811387
+13 92.128049
+14 93.058745
+15 91.834633
+16 94.592703
+17 94.835931
+18 92.57085
+19 93.350492
+20 93.793811
+21 93.064425
+22 92.358802
+23 93.138607
+24 91.978397
+25 92.883269
+26 94.889234
+27 94.240014
+28 94.141442
+29 94.588848
+30 93.267882
+31 92.642117
+32 94.11224
+33 93.724048
+34 93.050412
+35 92.166011
+36 94.357401
+37 92.104766
+38 93.609402
+39 94.193545
+40 92.616803
+41 93.190927
+42 94.279049
+43 94.066138
+44 92.766857
+45 93.945376
+46 93.410486
+47 92.710437
+48 94.479958
+49 93.37127
+50 94.423499
+51 94.57174
+52 93.645116
+53 93.276059
+54 94.777955
+55 92.01432
+56 93.443601
+57 94.161402
+58 92.767022
+59 94.703138
+60 92.866104
+61 92.709905
+62 93.443922
+63 92.749122
+64 92.996164
+65 93.226291
+66 94.187659
+67 92.239095
+68 93.12234
+69 93.177441
+70 92.728596
+71 92.900251
+72 94.832081
+73 92.066326
+74 93.740011
+75 93.962937
+76 93.559431
+77 92.615057
+78 94.143638
+79 94.78544
+80 93.031341
+81 94.033655
+82 92.418896
+83 92.221132
+84 92.18168
+85 93.919633
+86 94.881543
+87 93.927047
+88 94.674836
+89 93.190343
+90 92.947857
+91 93.298692
+92 94.621239
+93 94.459106
+94 92.906101
+95 94.237764
+96 93.645132
+97 93.660485
+98 92.915948
+99 93.317682
+100 92.120727
+101 93.230415
+102 92.674665
+103 92.159524
+104 93.868182
+105 92.996882
+106 94.363097
+107 94.502451
+108 92.358538
+109 93.717387
+110 92.786443
+111 92.186164
+112 92.229524
+113 92.36136
+114 94.888301
+115 94.425912
+116 92.947455
+117 92.82134
+118 94.760495
+119 94.977061
+120 93.748171
+121 93.605504
+122 94.126006
+123 94.857354
+124 94.460468
+125 92.21732
+126 93.804279
+127 93.52855
+128 94.313085
+129 94.035432
+130 92.303449
+131 94.071923
+132 92.482691
+133 95.028053
+134 92.937195
+135 92.615591
+136 93.580808
+137 94.951146
+138 92.656969
+139 93.256817
+140 92.455751
+141 95.206838
+142 92.984802
+143 92.945197
+144 94.699222
+145 94.56755
+146 95.347739
+147 92.459357
+148 93.171382
+149 95.180269
+150 94.758702
+151 93.379194
+152 93.86194
+153 92.852474
+154 93.279239
+155 93.569225
+156 94.28658
+157 94.625002
+158 93.888688
+159 94.990531
+160 94.31779
+161 93.264266
+162 95.189436
+163 95.923123
+164 93.687356
+165 94.856297
+166 94.09723
+167 96.538322
+168 95.588745
+169 94.174152
+170 94.815074
+171 96.021967
+172 95.894722
+173 97.48244
+174 95.421422
+175 95.738872
+176 96.590132
+177 98.483242
+178 98.857992
+179 97.832445
+180 99.176752
+181 102.0786
+182 101.71236
+183 100.84099
+184 102.06052
+185 103.04261
+186 104.13106
+187 102.48869
+188 103.97843
+189 103.45589
+190 103.46268
+191 103.76516
+192 104.77479
+193 104.83857
+194 103.92016
+195 105.16809
+196 104.87
+197 104.73319
+198 104.75198
+199 106.9468
+200 104.60863
+201 104.743
+202 106.03671
+203 104.92755
+204 104.56418
+205 105.0332
+206 106.65869
+207 104.39706
+208 106.46331
+209 104.91818
+210 106.79197
+211 105.90849
+212 105.78589
+213 106.76522
+214 106.13517
+215 106.84385
+216 107.33566
+217 105.98094
+218 105.46912
+219 104.71926
+220 106.89562
+221 106.95923
+222 106.8085
+223 104.86654
+224 105.4405
+225 106.28891
+226 107.53511
+227 106.43512
+228 105.04485
+229 107.42051
+230 104.91529
+231 105.72297
+232 106.4432
+233 104.84922
+234 107.01712
+235 107.34746
+236 107.16143
+237 106.14437
+238 105.83518
+239 105.85725
+240 106.36342
+241 107.85743
+242 107.0486
+243 105.25835
+244 106.05892
+245 105.21233
+246 105.15961
+247 104.99114
+248 104.98744
+249 106.47118
+250 107.77846
+251 105.95349
+252 106.0645
+253 105.00274
+254 106.7123
+255 106.78758
+256 107.71422
+257 106.74081
+258 107.91838
+259 107.14719
+260 107.57178
+261 107.71677
+262 106.37161
+263 107.76647
+264 105.35725
+265 107.10101
+266 106.95543
+267 106.38286
+268 107.87643
+269 106.18711
+270 105.68704
+271 107.61337
+272 107.30174
+273 107.55044
+274 107.66251
+275 107.97707
+276 108.02862
+277 105.89034
+278 105.8245
+279 106.14353
+280 106.56664
+281 105.80571
+282 107.29199
+283 105.60915
+284 106.63587
+285 106.82268
+286 107.21355
+287 106.76602
+288 106.24447
+289 106.10919
+290 105.73869
+291 105.88343
+292 107.37134
+293 105.92277
+294 107.80709
+295 106.73378
+296 105.28703
+297 107.99916
+298 107.20555
+299 106.72416
+300 106.3867
+301 106.73274
+302 106.99679
+303 107.56717
+304 106.47182
+305 107.21287
+306 106.39991
+307 107.90715
+308 105.09339
+309 107.98186
+310 107.65834
+311 107.39825
+312 107.62341
+313 106.49094
+314 105.92954
+315 107.08428
+316 105.46424
+317 106.1531
+318 105.92754
+319 107.00333
+320 107.87421
+321 105.98247
+322 105.65578
+323 106.11922
+324 105.21628
+325 105.15511
+326 107.23247
+327 107.6705
+328 107.93251
+329 105.8164
+330 105.19615
+331 107.22422
+332 106.46666
+333 105.1668
+334 107.92811
+335 106.38702
+336 106.0796
+337 106.50508
+338 106.15072
+339 105.26819
+340 105.40705
+341 107.25244
+342 105.59738
+343 106.33014
+344 106.44472
+345 106.88026
+346 107.05543
+347 105.61685
+348 106.21632
+349 106.35907
+350 107.49758
+351 106.7012
+352 106.10456
+353 106.93137
+354 107.94109
+355 106.36516
+356 105.22822
+357 107.60685
+358 107.94253
+359 107.26072
+360 105.4247
+361 106.41867
+362 107.69953
+363 105.63072
+364 105.9897
+365 106.46632
+366 106.01961
+367 106.09736
+368 107.5018
+369 106.07223
+370 107.5276
+371 107.19568
+372 107.08564
+373 106.88366
+374 105.74583
+375 107.09943
+376 107.08013
+377 107.45954
+378 107.53612
+379 108.112
+380 107.86845
+381 107.9672
+382 105.9697
+383 107.29257
+384 107.10105
+385 105.21125
+386 107.27416
+387 107.42193
+388 106.61502
+389 106.68435
+390 106.92447
+391 106.36125
+392 106.20247
+393 106.93532
+394 106.22898
+395 106.99196
+396 106.53996
+397 107.53919
+398 105.43453
+399 107.28519
+400 105.87991
diff --git a/src/gromacs/correlationfunctions/tests/testERREST.xvg b/src/gromacs/correlationfunctions/tests/testERREST.xvg
new file mode 100644 (file)
index 0000000..4f28dfc
--- /dev/null
@@ -0,0 +1,501 @@
+1 0.3517423
+17 1.0597503
+33 0.9410293
+49 0.8716023
+65 0.8238423
+81 1.0098463
+97 0.5520603
+113 0.4278303
+129 0.9342923
+145 1.0342603
+161 0.8231863
+177 0.7635853
+193 0.9390683
+209 0.8922163
+225 1.1775333
+241 1.2116213
+257 0.6996663
+273 0.2287793
+289 1.3589063
+305 1.6198323
+321 0.8974273
+337 0.9043013
+353 0.4556703
+369 0.6929363
+385 1.2148863
+401 1.4234283
+417 1.0278523
+433 0.6124313
+449 0.7412923
+465 0.3195843
+481 0.8295103
+497 0.7101183
+513 1.0936703
+529 0.4371843
+545 0.5090993
+561 0.9473693
+577 0.9137463
+593 0.6570103
+609 1.0386173
+625 1.3944973
+641 0.4820373
+657 0.4620413
+673 1.3725933
+689 0.8170593
+705 0.8616223
+721 0.4220783
+737 1.1177493
+753 0.7920653
+769 0.6135533
+785 0.6946533
+801 1.4141893
+817 0.9795273
+833 0.5320023
+849 1.1125843
+865 1.2062423
+881 0.9650543
+897 1.6114013
+913 0.5465363
+929 1.5686003
+945 1.3882573
+961 1.0649153
+977 1.3672613
+993 1.1256913
+1009 0.8110243
+1025 1.0385253
+1041 1.4888273
+1057 1.4508483
+1073 0.9516873
+1089 0.9449663
+1105 0.9077883
+1121 0.5280203
+1137 0.8003353
+1153 0.3715183
+1169 1.1737183
+1185 0.3641943
+1201 0.9924893
+1217 1.4245123
+1233 0.7253083
+1249 1.0137533
+1265 0.8326003
+1281 0.8174633
+1297 0.6439253
+1313 0.9496813
+1329 0.4628573
+1345 1.3082933
+1361 0.3596463
+1377 0.8700153
+1393 1.0316053
+1409 1.2754943
+1425 0.8401303
+1441 1.3051733
+1457 1.7206623
+1473 0.9644593
+1489 0.7674533
+1505 0.9751783
+1521 0.5897953
+1537 0.9886143
+1553 1.5970503
+1569 1.3752943
+1585 1.1988803
+1601 1.0081603
+1617 1.5943493
+1633 0.7405973
+1649 0.6524783
+1665 0.7423293
+1681 1.1931963
+1697 1.2285283
+1713 0.7597933
+1729 0.9291963
+1745 1.5914353
+1761 0.4776883
+1777 1.3845643
+1793 1.4108173
+1809 0.8124203
+1825 1.4891713
+1841 0.8480123
+1857 0.7482803
+1873 1.5186353
+1889 0.8382693
+1905 0.3961233
+1921 0.8167013
+1937 1.3302663
+1953 0.5777863
+1969 1.4406173
+1985 0.4306763
+2001 0.6667753
+2017 -0.0174287
+2033 1.0792663
+2049 0.8624543
+2065 0.7621893
+2081 0.7339673
+2097 0.5926183
+2113 1.0041013
+2129 0.5759933
+2145 1.4805423
+2161 0.9656263
+2177 0.7245373
+2193 0.7458013
+2209 0.7898533
+2225 1.5943193
+2241 0.6717653
+2257 1.2236373
+2273 0.5686843
+2289 1.4059033
+2305 0.8901873
+2321 1.1125003
+2337 0.9947173
+2353 0.7398113
+2369 1.4866303
+2385 1.7170683
+2401 1.1582763
+2417 0.4476063
+2433 0.8380023
+2449 0.7195173
+2465 1.4064993
+2481 1.1095623
+2497 8.13e-05
+2513 0.8899893
+2529 0.9137923
+2545 1.0530973
+2561 1.2563603
+2577 0.3981443
+2593 0.8871053
+2609 0.4778103
+2625 1.1359983
+2641 0.5740863
+2657 1.1778153
+2673 1.3080033
+2689 1.0777173
+2705 1.7451983
+2721 1.9104733
+2737 1.4288603
+2753 2.2134143
+2769 0.9296233
+2785 0.9103213
+2801 0.8418393
+2817 1.2955373
+2833 1.2594723
+2849 0.8617293
+2865 0.2954833
+2881 0.9188513
+2897 1.8631033
+2913 1.9094973
+2929 0.7062733
+2945 1.8554883
+2961 0.9238253
+2977 0.3348663
+2993 0.9353073
+3009 1.2028623
+3025 1.9851123
+3041 1.1466263
+3057 1.5713393
+3073 1.4108013
+3089 0.8622563
+3105 0.8434723
+3121 1.3925823
+3137 1.4874463
+3153 1.2751583
+3169 1.1509373
+3185 1.5736133
+3201 1.5143093
+3217 0.7679413
+3233 1.0632833
+3249 0.9187743
+3265 1.5776033
+3281 1.1580243
+3297 0.8602263
+3313 0.8002063
+3329 0.9148603
+3345 1.3152133
+3361 0.4933133
+3377 0.8761343
+3393 0.6942183
+3409 1.2085083
+3425 1.5972033
+3441 1.2005583
+3457 1.2183353
+3473 0.7577103
+3489 0.6112263
+3505 1.2318773
+3521 1.1326723
+3537 1.1506243
+3553 0.5817003
+3569 0.9014713
+3585 0.8777513
+3601 1.4347963
+3617 0.9277923
+3633 1.1432003
+3649 0.7949343
+3665 1.2829793
+3681 0.2914853
+3697 0.9427083
+3713 1.3510713
+3729 0.8358273
+3745 0.8312423
+3761 1.0880323
+3777 1.7421923
+3793 1.1334733
+3809 0.2839173
+3825 0.8868153
+3841 0.5585983
+3857 0.5283023
+3873 0.2076003
+3889 0.8009313
+3905 0.9836093
+3921 0.8874943
+3937 0.5242053
+3953 0.6777083
+3969 0.2986573
+3985 0.9648863
+4001 0.3936813
+4017 1.5192383
+4033 1.1283383
+4049 0.5402493
+4065 0.8644763
+4081 0.9670683
+4097 1.2198303
+4113 0.8354763
+4129 0.8359803
+4145 1.0664183
+4161 0.4950833
+4177 0.6145223
+4193 0.8997543
+4209 0.2690933
+4225 0.9369703
+4241 1.3704423
+4257 0.5915883
+4273 0.7297033
+4289 0.2907223
+4305 1.0001723
+4321 1.1066633
+4337 1.5133253
+4353 1.3272213
+4369 1.2639593
+4385 0.6724293
+4401 0.6174593
+4417 1.4950913
+4433 0.9158143
+4449 1.9446683
+4465 1.1331683
+4481 0.5225033
+4497 0.8273663
+4513 0.3377963
+4529 0.6311003
+4545 1.4785433
+4561 0.8769733
+4577 0.7451523
+4593 1.0181933
+4609 1.1503113
+4625 1.5157673
+4641 1.2449163
+4657 1.5840353
+4673 1.1181763
+4689 0.8027923
+4705 0.2972533
+4721 0.6047333
+4737 1.3964663
+4753 0.8300983
+4769 1.5832113
+4785 1.7844893
+4801 1.4584933
+4817 1.2985273
+4833 1.1074343
+4849 1.6353573
+4865 1.5705303
+4881 1.7136353
+4897 1.3027233
+4913 1.0545013
+4929 1.0732243
+4945 1.9772463
+4961 1.4843033
+4977 1.4208723
+4993 1.8630953
+5009 0.8611723
+5025 0.7367903
+5041 0.5593233
+5057 0.9989823
+5073 0.5387463
+5089 0.6843843
+5105 0.7769823
+5121 1.1148653
+5137 1.7723363
+5153 0.6389133
+5169 0.6624193
+5185 0.5881323
+5201 0.5588963
+5217 -0.1075927
+5233 0.5866443
+5249 0.4331333
+5265 0.7912493
+5281 0.1760223
+5297 0.8659643
+5313 1.1929063
+5329 0.4952133
+5345 0.6245163
+5361 0.6433383
+5377 0.6050383
+5393 1.1802343
+5409 0.9662523
+5425 1.1449483
+5441 0.4728213
+5457 0.7832533
+5473 1.0352293
+5489 0.8087053
+5505 0.6213123
+5521 0.8185243
+5537 0.2622273
+5553 0.8098043
+5569 0.3489813
+5585 0.5309423
+5601 0.5585833
+5617 -0.0650127
+5633 0.8007403
+5649 1.1783113
+5665 0.8767213
+5681 0.7084473
+5697 0.7087373
+5713 1.2293673
+5729 1.9700823
+5745 1.1370283
+5761 0.8622563
+5777 1.5045673
+5793 1.5535933
+5809 1.6912733
+5825 1.4561283
+5841 1.1133853
+5857 1.0418363
+5873 1.4926883
+5889 0.7510653
+5905 1.4871873
+5921 0.6951643
+5937 0.8722043
+5953 1.0236633
+5969 0.4982503
+5985 1.0484053
+6001 1.4949693
+6017 0.7577103
+6033 1.4756743
+6049 0.9504673
+6065 0.6371503
+6081 0.9289373
+6097 1.6262783
+6113 1.5682493
+6129 1.7294363
+6145 0.8229643
+6161 1.4206823
+6177 1.2592053
+6193 0.8906453
+6209 0.9228333
+6225 0.7128493
+6241 1.0956393
+6257 1.3999223
+6273 1.2278183
+6289 1.3250013
+6305 0.7005813
+6321 0.8609823
+6337 0.9442873
+6353 0.7324343
+6369 1.2111333
+6385 0.9367413
+6401 0.5429203
+6417 0.7491193
+6433 0.6651583
+6449 1.0823103
+6465 1.3247193
+6481 0.8797353
+6497 1.0703243
+6513 0.9107563
+6529 1.8092243
+6545 0.7302523
+6561 1.6127293
+6577 1.2735493
+6593 1.0610703
+6609 0.7459463
+6625 1.0303013
+6641 1.5765423
+6657 1.0391893
+6673 1.1801883
+6689 0.3454793
+6705 0.5029193
+6721 0.7490663
+6737 1.1911363
+6753 1.1398823
+6769 0.8100933
+6785 1.4742703
+6801 1.1287503
+6817 1.4290363
+6833 1.2512253
+6849 1.1904803
+6865 1.1241423
+6881 0.9222003
+6897 0.5952273
+6913 0.8656583
+6929 1.1323363
+6945 1.1635483
+6961 1.3734173
+6977 1.2152753
+6993 0.7563443
+7009 0.6301693
+7025 0.3757603
+7041 0.9500623
+7057 0.9807333
+7073 0.6007513
+7089 1.1412473
+7105 0.8297853
+7121 0.8890813
+7137 0.8713803
+7153 1.0812503
+7169 1.3144803
+7185 1.3724333
+7201 1.7222793
+7217 0.8696183
+7233 1.2517673
+7249 1.0543183
+7265 1.0174603
+7281 1.1306963
+7297 0.4270143
+7313 0.9045993
+7329 1.5317583
+7345 1.1389813
+7361 0.6676073
+7377 0.9130753
+7393 0.5875443
+7409 0.9053693
+7425 0.5835163
+7441 1.1831793
+7457 1.4384203
+7473 0.4676183
+7489 0.7656293
+7505 0.4548773
+7521 1.0648013
+7537 1.0835923
+7553 1.3808793
+7569 1.2125673
+7585 1.2858243
+7601 0.7112093
+7617 0.6617253
+7633 0.8534213
+7649 1.2384923
+7665 1.1525693
+7681 1.8521543
+7697 1.2422913
+7713 1.4445463
+7729 1.0739483
+7745 0.8565343
+7761 0.6647313
+7777 1.2838183
+7793 1.6710863
+7809 1.7629593
+7825 1.7022833
+7841 1.7739233
+7857 1.3768663
+7873 1.7267503
+7889 1.3419463
+7905 1.4587673
+7921 0.8886153
+7937 0.6786163
+7953 0.9597973
+7969 1.7429853
+7985 1.1981473
+8001 1.7303743
diff --git a/src/gromacs/correlationfunctions/tests/testEXP.xvg b/src/gromacs/correlationfunctions/tests/testEXP.xvg
deleted file mode 100644 (file)
index a192c51..0000000
+++ /dev/null
@@ -1,501 +0,0 @@
-0 0
-1 0.933793
-2 1.64413
-3 2.26881
-4 2.69732
-5 3.18609
-6 3.5633
-7 3.77591
-8 4.083
-9 4.27165
-10 4.50143
-11 4.68664
-12 4.84612
-13 4.93256
-14 5.0487
-15 5.21257
-16 5.29916
-17 5.32257
-18 5.43037
-19 5.50601
-20 5.60239
-21 5.62398
-22 5.72622
-23 5.77308
-24 5.7562
-25 5.84888
-26 5.81699
-27 5.86178
-28 5.94235
-29 5.95981
-30 5.98369
-31 5.95674
-32 6.06792
-33 6.07991
-34 6.11024
-35 6.12377
-36 6.06567
-37 6.16848
-38 6.15328
-39 6.16295
-40 6.16469
-41 6.22697
-42 6.1776
-43 6.27148
-44 6.23865
-45 6.2744
-46 6.27211
-47 6.29498
-48 6.31175
-49 6.28439
-50 6.34758
-51 6.26659
-52 6.29551
-53 6.31016
-54 6.31924
-55 6.32594
-56 6.39353
-57 6.37555
-58 6.4125
-59 6.34882
-60 6.34253
-61 6.37401
-62 6.42251
-63 6.44891
-64 6.41029
-65 6.36925
-66 6.45488
-67 6.47461
-68 6.39323
-69 6.41703
-70 6.47664
-71 6.47864
-72 6.40653
-73 6.4444
-74 6.4901
-75 6.49016
-76 6.43924
-77 6.50607
-78 6.48499
-79 6.4465
-80 6.51673
-81 6.44586
-82 6.53225
-83 6.51432
-84 6.52803
-85 6.49069
-86 6.51123
-87 6.54134
-88 6.50065
-89 6.49403
-90 6.54445
-91 6.56578
-92 6.54692
-93 6.58151
-94 6.5848
-95 6.5796
-96 6.53327
-97 6.57402
-98 6.51995
-99 6.59609
-100 6.59545
-101 6.51956
-102 6.54083
-103 6.53558
-104 6.51182
-105 6.5347
-106 6.55378
-107 6.58284
-108 6.56471
-109 6.57831
-110 6.59092
-111 6.62654
-112 6.54307
-113 6.57412
-114 6.60729
-115 6.59664
-116 6.63216
-117 6.59422
-118 6.61469
-119 6.62636
-120 6.57808
-121 6.57356
-122 6.63797
-123 6.58006
-124 6.62347
-125 6.56521
-126 6.63422
-127 6.57666
-128 6.56846
-129 6.57003
-130 6.56552
-131 6.56682
-132 6.58905
-133 6.59197
-134 6.58329
-135 6.57486
-136 6.6287
-137 6.62418
-138 6.57194
-139 6.62585
-140 6.59216
-141 6.66186
-142 6.61182
-143 6.64493
-144 6.60235
-145 6.64946
-146 6.58789
-147 6.636
-148 6.60824
-149 6.59174
-150 6.67204
-151 6.63844
-152 6.64634
-153 6.61669
-154 6.60086
-155 6.68471
-156 6.6902
-157 6.65257
-158 6.61755
-159 6.67101
-160 6.6674
-161 6.63823
-162 6.63133
-163 6.6367
-164 6.66352
-165 6.696
-166 6.60881
-167 6.67253
-168 6.66735
-169 6.66583
-170 6.66259
-171 6.63691
-172 6.6766
-173 6.6913
-174 6.65969
-175 6.61821
-176 6.6796
-177 6.70715
-178 6.67694
-179 6.69653
-180 6.64676
-181 6.65935
-182 6.6781
-183 6.71181
-184 6.70878
-185 6.67739
-186 6.64651
-187 6.66021
-188 6.71047
-189 6.65987
-190 6.6511
-191 6.71258
-192 6.71689
-193 6.65441
-194 6.65054
-195 6.66806
-196 6.70738
-197 6.64787
-198 6.69967
-199 6.6331
-200 6.63513
-201 6.69851
-202 6.64237
-203 6.70702
-204 6.70229
-205 6.66568
-206 6.6818
-207 6.68629
-208 6.71863
-209 6.73129
-210 6.66952
-211 6.69274
-212 6.67642
-213 6.6782
-214 6.65372
-215 6.7269
-216 6.70297
-217 6.64193
-218 6.65786
-219 6.73524
-220 6.70002
-221 6.6906
-222 6.70867
-223 6.7153
-224 6.66604
-225 6.70376
-226 6.70701
-227 6.71955
-228 6.73206
-229 6.71019
-230 6.70016
-231 6.72956
-232 6.64624
-233 6.73931
-234 6.70839
-235 6.67605
-236 6.67944
-237 6.7271
-238 6.72234
-239 6.66538
-240 6.71936
-241 6.66755
-242 6.68937
-243 6.724
-244 6.68827
-245 6.69197
-246 6.66415
-247 6.69317
-248 6.69017
-249 6.70377
-250 6.70761
-251 6.74691
-252 6.7327
-253 6.66325
-254 6.67565
-255 6.68625
-256 6.71185
-257 6.65938
-258 6.66814
-259 6.69835
-260 6.71306
-261 6.68137
-262 6.68514
-263 6.69503
-264 6.70687
-265 6.70667
-266 6.71226
-267 6.74293
-268 6.6743
-269 6.70273
-270 6.68393
-271 6.71818
-272 6.72623
-273 6.73187
-274 6.73242
-275 6.70873
-276 6.70823
-277 6.69239
-278 6.75188
-279 6.71371
-280 6.7502
-281 6.69877
-282 6.6998
-283 6.66478
-284 6.70866
-285 6.73126
-286 6.73144
-287 6.70046
-288 6.70388
-289 6.6847
-290 6.75264
-291 6.73971
-292 6.70705
-293 6.7407
-294 6.67035
-295 6.72357
-296 6.73306
-297 6.73084
-298 6.68237
-299 6.76651
-300 6.72838
-301 6.76579
-302 6.744
-303 6.6963
-304 6.76216
-305 6.66966
-306 6.67184
-307 6.67226
-308 6.67163
-309 6.68679
-310 6.73726
-311 6.68492
-312 6.73491
-313 6.75372
-314 6.68562
-315 6.73127
-316 6.73742
-317 6.74772
-318 6.71254
-319 6.67357
-320 6.72034
-321 6.71205
-322 6.68542
-323 6.76568
-324 6.69664
-325 6.7009
-326 6.71605
-327 6.73142
-328 6.7524
-329 6.70307
-330 6.7459
-331 6.70831
-332 6.71814
-333 6.76659
-334 6.67721
-335 6.70581
-336 6.75936
-337 6.71626
-338 6.77537
-339 6.73916
-340 6.75086
-341 6.69825
-342 6.73784
-343 6.68206
-344 6.73098
-345 6.69878
-346 6.70428
-347 6.76935
-348 6.68665
-349 6.72539
-350 6.70694
-351 6.683
-352 6.76606
-353 6.74774
-354 6.69002
-355 6.77377
-356 6.71343
-357 6.71858
-358 6.77459
-359 6.72939
-360 6.74046
-361 6.71403
-362 6.70104
-363 6.7676
-364 6.70533
-365 6.68404
-366 6.73426
-367 6.74651
-368 6.73703
-369 6.7093
-370 6.68535
-371 6.78054
-372 6.68628
-373 6.74885
-374 6.75663
-375 6.78102
-376 6.78231
-377 6.69437
-378 6.69903
-379 6.70758
-380 6.74678
-381 6.7422
-382 6.72993
-383 6.68776
-384 6.74261
-385 6.75407
-386 6.76879
-387 6.70534
-388 6.6894
-389 6.71274
-390 6.73197
-391 6.75648
-392 6.74171
-393 6.73153
-394 6.68943
-395 6.75898
-396 6.72838
-397 6.74778
-398 6.72736
-399 6.77489
-400 6.77639
-401 6.70282
-402 6.71161
-403 6.76628
-404 6.77065
-405 6.77603
-406 6.68948
-407 6.76621
-408 6.72207
-409 6.72234
-410 6.75854
-411 6.77273
-412 6.76151
-413 6.74252
-414 6.73153
-415 6.69708
-416 6.74061
-417 6.75818
-418 6.72091
-419 6.74424
-420 6.78673
-421 6.74145
-422 6.69344
-423 6.72471
-424 6.72518
-425 6.76767
-426 6.71893
-427 6.78251
-428 6.78466
-429 6.78094
-430 6.77212
-431 6.74085
-432 6.74283
-433 6.73333
-434 6.78714
-435 6.77238
-436 6.73692
-437 6.73205
-438 6.70148
-439 6.77486
-440 6.76451
-441 6.79155
-442 6.73363
-443 6.69988
-444 6.77442
-445 6.78397
-446 6.7856
-447 6.73778
-448 6.70429
-449 6.7378
-450 6.74829
-451 6.69527
-452 6.75622
-453 6.7867
-454 6.76332
-455 6.72525
-456 6.72494
-457 6.78544
-458 6.7868
-459 6.73629
-460 6.75375
-461 6.71361
-462 6.73621
-463 6.74825
-464 6.70532
-465 6.78782
-466 6.73666
-467 6.79325
-468 6.69962
-469 6.71673
-470 6.72258
-471 6.72758
-472 6.70651
-473 6.70794
-474 6.77938
-475 6.71007
-476 6.7414
-477 6.77997
-478 6.71039
-479 6.77047
-480 6.71826
-481 6.73399
-482 6.69929
-483 6.7929
-484 6.77405
-485 6.79742
-486 6.76882
-487 6.74596
-488 6.71524
-489 6.7947
-490 6.75326
-491 6.72172
-492 6.71176
-493 6.71697
-494 6.74455
-495 6.78932
-496 6.70312
-497 6.72368
-498 6.70806
-499 6.70917
-500 6.79967
diff --git a/src/gromacs/correlationfunctions/tests/testINVEXP79.xvg b/src/gromacs/correlationfunctions/tests/testINVEXP79.xvg
new file mode 100644 (file)
index 0000000..f96379f
--- /dev/null
@@ -0,0 +1,501 @@
+0 1.09007
+1 0.877207
+2 0.932819
+3 0.810603
+4 0.791896
+5 0.733364
+6 0.616033
+7 0.604703
+8 0.755853
+9 0.636944
+10 0.715246
+11 0.611031
+12 0.595407
+13 0.63075
+14 0.581412
+15 0.480107
+16 0.51343
+17 0.456788
+18 0.44948
+19 0.435668
+20 0.403863
+21 0.489832
+22 0.495195
+23 0.422594
+24 0.480228
+25 0.482537
+26 0.444401
+27 0.384561
+28 0.34734
+29 0.383506
+30 0.301289
+31 0.382879
+32 0.292707
+33 0.349764
+34 0.302061
+35 0.407986
+36 0.434076
+37 0.335145
+38 0.260494
+39 0.355107
+40 0.25965
+41 0.296108
+42 0.251938
+43 0.255597
+44 0.277503
+45 0.396491
+46 0.28228
+47 0.27551
+48 0.270726
+49 0.292784
+50 0.128415
+51 0.132945
+52 0.23486
+53 0.241426
+54 0.156775
+55 0.2457
+56 0.174162
+57 0.349717
+58 0.186471
+59 0.300814
+60 0.15326
+61 0.231873
+62 0.163605
+63 0.197539
+64 0.260759
+65 0.231805
+66 0.233305
+67 0.135304
+68 0.281354
+69 0.234155
+70 0.176055
+71 0.198226
+72 0.213007
+73 0.225185
+74 0.274865
+75 0.247751
+76 0.105759
+77 0.185042
+78 0.0998593
+79 0.19495
+80 0.0787285
+81 0.31299
+82 0.116831
+83 0.0640667
+84 0.111865
+85 0.127155
+86 0.0863288
+87 0.0788565
+88 0.229011
+89 0.0803561
+90 0.0798449
+91 0.103291
+92 0.148852
+93 0.0735688
+94 0.159655
+95 0.108183
+96 0.0602938
+97 0.148602
+98 0.148881
+99 0.115299
+100 0.0788461
+101 0.181537
+102 0.178337
+103 0.130516
+104 0.0405722
+105 0.178499
+106 0.156721
+107 0.117595
+108 0.190161
+109 0.0353169
+110 0.0107063
+111 0.044126
+112 0.179688
+113 0.0826383
+114 0.161516
+115 0.211201
+116 -0.0253689
+117 0.198065
+118 0.0845166
+119 0.0983947
+120 0.0836944
+121 0.00686212
+122 0.138417
+123 -0.0243976
+124 0.0290124
+125 0.192813
+126 0.190617
+127 0.153298
+128 0.153291
+129 0.160775
+130 0.0652794
+131 0.122779
+132 0.240448
+133 0.072505
+134 0.140685
+135 0.0979626
+136 -0.033676
+137 0.0573126
+138 0.162429
+139 0.0502877
+140 0.176007
+141 0.059104
+142 0.119028
+143 0.0682911
+144 0.0443568
+145 0.0813819
+146 0.046495
+147 0.213421
+148 0.116277
+149 0.211761
+150 0.008448
+151 0.143644
+152 0.203298
+153 0.0675614
+154 0.0783106
+155 0.0764201
+156 0.133036
+157 0.044048
+158 0.0901729
+159 0.00259126
+160 0.088098
+161 0.0468678
+162 0.0648707
+163 0.242762
+164 0.0509743
+165 0.0502586
+166 -0.00215295
+167 0.0977259
+168 0.211509
+169 0.122585
+170 0.115359
+171 0.124501
+172 0.0934846
+173 0.0607657
+174 0.0455892
+175 0.0295404
+176 -0.0230954
+177 0.115156
+178 0.171233
+179 0.0706772
+180 0.0125189
+181 0.0264475
+182 -0.0298884
+183 0.119367
+184 -0.0348317
+185 0.0161417
+186 0.210381
+187 0.15479
+188 0.0625029
+189 0.112174
+190 0.0869022
+191 0.101378
+192 0.0456388
+193 0.0512337
+194 0.0453277
+195 0.141329
+196 0.0583165
+197 -0.100644
+198 -0.0195298
+199 0.0536575
+200 0.0711223
+201 0.0323407
+202 0.0755175
+203 0.151374
+204 0.117336
+205 -0.0224392
+206 0.128654
+207 -0.0316783
+208 -0.00303418
+209 0.15873
+210 -0.0463493
+211 0.027255
+212 0.125538
+213 0.165183
+214 -0.0190088
+215 -0.0792838
+216 0.0241941
+217 0.027236
+218 0.0460868
+219 0.116271
+220 0.00766963
+221 0.0391876
+222 0.011154
+223 0.117667
+224 -0.0332919
+225 0.0515272
+226 -0.0726914
+227 0.0734784
+228 0.00147696
+229 0.133906
+230 0.0234433
+231 0.0647977
+232 0.162547
+233 0.0904404
+234 0.14845
+235 0.00353783
+236 0.175999
+237 0.0489034
+238 0.0733482
+239 0.052908
+240 0.00921323
+241 0.165374
+242 -0.0401146
+243 -0.0183761
+244 0.0339211
+245 -0.0140982
+246 0.162167
+247 0.083416
+248 0.0430574
+249 -0.0532527
+250 0.147883
+251 0.0333986
+252 -0.00200228
+253 0.11477
+254 0.105691
+255 -0.0071386
+256 0.04273
+257 0.0495165
+258 0.0653199
+259 0.0540464
+260 -0.0184714
+261 -0.0314251
+262 -0.0630476
+263 -0.0235271
+264 0.0366917
+265 0.0977608
+266 0.0564583
+267 0.106372
+268 0.0429041
+269 -0.0523068
+270 0.00302942
+271 0.0707971
+272 0.134789
+273 -0.00167497
+274 0.0757873
+275 -0.0220373
+276 0.00421086
+277 0.0529898
+278 0.0759217
+279 0.0753902
+280 0.103891
+281 0.023528
+282 0.0209249
+283 0.117407
+284 -0.00610032
+285 -0.0319453
+286 0.0774823
+287 -0.0464274
+288 0.0475878
+289 -0.0570683
+290 -0.0604167
+291 -0.0104142
+292 0.0735168
+293 0.0105054
+294 0.138414
+295 -0.0477548
+296 -0.0100453
+297 0.0441746
+298 -0.0494035
+299 0.0100155
+300 -0.0115031
+301 -0.0476504
+302 -0.0486697
+303 0.000769082
+304 0.0833754
+305 0.0828655
+306 0.0790107
+307 -0.0217383
+308 -0.0369806
+309 0.0294119
+310 -0.0621266
+311 0.0289071
+312 -0.0395707
+313 0.0415419
+314 0.085237
+315 0.050411
+316 -0.0210736
+317 0.0998225
+318 0.109902
+319 -0.0361716
+320 -0.0101586
+321 -0.0223105
+322 0.00826686
+323 -0.0293934
+324 0.0987037
+325 0.0315682
+326 0.104734
+327 0.0861752
+328 0.0764943
+329 0.000824613
+330 -0.0170506
+331 0.00164694
+332 0.0325245
+333 0.0791064
+334 0.11446
+335 -0.0148082
+336 0.0455031
+337 0.0586395
+338 -0.108668
+339 0.0346456
+340 0.0293549
+341 0.0890408
+342 -0.0106896
+343 0.112917
+344 -0.0296479
+345 0.0522096
+346 0.208064
+347 -0.00224504
+348 0.0121225
+349 -0.105139
+350 -0.00490689
+351 0.0974383
+352 0.045095
+353 0.0802632
+354 -0.000141307
+355 0.00395148
+356 0.156947
+357 0.0607425
+358 0.0246873
+359 0.0152081
+360 0.0806166
+361 0.0525148
+362 0.0390263
+363 -0.082116
+364 -0.0435646
+365 0.0144118
+366 -0.056396
+367 0.0224241
+368 0.0249577
+369 0.032059
+370 0.0710599
+371 0.0617842
+372 0.0870343
+373 -0.0309283
+374 -0.0503928
+375 0.0654705
+376 -0.132297
+377 -0.013171
+378 0.15629
+379 -0.0195602
+380 0.0804519
+381 0.0743904
+382 -0.013602
+383 -0.0495775
+384 -0.0715722
+385 0.150116
+386 0.00559995
+387 0.0252303
+388 0.0791371
+389 -0.00344736
+390 0.051361
+391 -0.0283868
+392 0.00921561
+393 0.0701514
+394 0.110203
+395 -0.00277509
+396 0.155823
+397 0.00737347
+398 -0.00262632
+399 -0.020737
+400 0.0512275
+401 -0.011247
+402 -0.0145163
+403 0.00934317
+404 0.157135
+405 0.102475
+406 0.0686777
+407 0.00617163
+408 -0.024658
+409 0.0290312
+410 0.0888993
+411 0.0475782
+412 -0.0887449
+413 0.068523
+414 -0.029187
+415 0.0134721
+416 0.0268544
+417 0.11216
+418 -0.0280536
+419 -0.0487176
+420 -0.000343852
+421 -0.0204678
+422 0.0346145
+423 -0.0845521
+424 -0.0557614
+425 0.123208
+426 -0.0138119
+427 -0.0674846
+428 -0.0271054
+429 0.0822262
+430 0.0342709
+431 -0.0765876
+432 0.0319721
+433 -0.0739633
+434 0.0233444
+435 -0.00554542
+436 0.0904659
+437 -0.00953448
+438 -0.0605533
+439 -0.0713493
+440 0.017423
+441 0.067253
+442 0.009445
+443 0.00886866
+444 0.0647234
+445 0.0687361
+446 0.00146581
+447 0.0044238
+448 0.0517999
+449 -0.110766
+450 0.0330447
+451 -0.0273471
+452 0.00885882
+453 -0.0352997
+454 0.133558
+455 0.107036
+456 0.0951639
+457 0.0922061
+458 0.107501
+459 0.00342741
+460 0.0689463
+461 -0.109189
+462 0.0251697
+463 -0.104037
+464 0.00550332
+465 0.0253927
+466 0.0473155
+467 -0.0858022
+468 0.0200478
+469 0.0549883
+470 -0.00966798
+471 -0.046954
+472 0.0918711
+473 0.0272196
+474 0.0185346
+475 -0.0329217
+476 -0.0536179
+477 0.0803566
+478 -0.0499015
+479 -0.039256
+480 0.0515844
+481 -0.0254139
+482 0.0432167
+483 0.0460773
+484 -0.0744449
+485 0.134048
+486 -0.0109604
+487 -0.000548119
+488 -0.0285135
+489 0.081197
+490 -0.0220405
+491 0.0489457
+492 0.0368539
+493 0.0850633
+494 0.00580247
+495 0.00387908
+496 -0.046728
+497 0.144958
+498 0.08649
+499 -0.0219127
+500 -0.0263977
index 02742476b16918e2fb355bccb18601736dd01ccf..c4096954a20917b13641207acb32afd31eadfc9d 100644 (file)
@@ -60,6 +60,7 @@
 #include "gromacs/utility/fatalerror.h"
 #include "gromacs/utility/futil.h"
 #include "gromacs/utility/smalloc.h"
+#include "gromacs/utility/snprintf.h"
 
 /* must correspond to char *avbar_opt[] declared in main() */
 enum {
@@ -394,9 +395,21 @@ static void average(const char *avfile, int avbar_opt,
     }
 }
 
-static real anal_ee_inf(double *parm, real T)
+/*! \brief Compute final error estimate.
+ *
+ * See Eqn A17, Hess, JCP 116 (2002) 209-217 for details.
+ */
+static real optimal_error_estimate(double sigma, double fitparm[], real tTotal)
 {
-    return sqrt(parm[1]*2*parm[0]/T+parm[3]*2*parm[2]/T);
+    double ss = fitparm[1]*fitparm[0]+(1-fitparm[1])*fitparm[2];
+    if ((tTotal <= 0) || (ss <= 0))
+    {
+        fprintf(stderr, "Problem in error estimate: T = %g, ss = %g\n",
+                tTotal, ss);
+        return 0;
+    }
+
+    return sigma*sqrt(2*ss/tTotal);
 }
 
 static void estimate_error(const char *eefile, int nb_min, int resol, int n,
@@ -411,7 +424,7 @@ static void estimate_error(const char *eefile, int nb_min, int resol, int n,
     double   blav, var;
     char   **leg;
     real    *tbs, *ybs, rtmp, dens, *fitsig, twooe, tau1_est, tau_sig;
-    double   fitparm[4];
+    double   fitparm[3];
     real     ee, a, tau1, tau2;
 
     if (n < 4)
@@ -553,8 +566,8 @@ static void estimate_error(const char *eefile, int nb_min, int resol, int n,
                  */
                 fitparm[2] = sqrt(tau1_est*(n-1)*dt);
                 do_lmfit(nbs, ybs, fitsig, 0, tbs, 0, dt*n, oenv,
-                         bDebugMode(), effnERREST, fitparm, 0);
-                fitparm[3] = 1-fitparm[1];
+                         bDebugMode(), effnERREST, fitparm, 0,
+                         NULL);
             }
             if (bSingleExpFit || fitparm[0] < 0 || fitparm[2] < 0 || fitparm[1] < 0
                 || (fitparm[1] > 1 && !bAllowNegLTCorr) || fitparm[2] > (n-1)*dt)
@@ -573,7 +586,7 @@ static void estimate_error(const char *eefile, int nb_min, int resol, int n,
                         fprintf(stdout, "a fitted parameter is negative\n");
                     }
                     fprintf(stdout, "invalid fit:  e.e. %g  a %g  tau1 %g  tau2 %g\n",
-                            sig[s]*anal_ee_inf(fitparm, n*dt),
+                            optimal_error_estimate(sig[s], fitparm, n*dt),
                             fitparm[1], fitparm[0], fitparm[2]);
                     /* Do a fit with tau2 fixed at the total time.
                      * One could also choose any other large value for tau2.
@@ -581,10 +594,9 @@ static void estimate_error(const char *eefile, int nb_min, int resol, int n,
                     fitparm[0] = tau1_est;
                     fitparm[1] = 0.95;
                     fitparm[2] = (n-1)*dt;
-                    fprintf(stderr, "Will fix tau2 at the total time: %g\n", fitparm[2]);
+                    fprintf(stdout, "Will fix tau2 at the total time: %g\n", fitparm[2]);
                     do_lmfit(nbs, ybs, fitsig, 0, tbs, 0, dt*n, oenv, bDebugMode(),
-                             effnERREST, fitparm, 4);
-                    fitparm[3] = 1-fitparm[1];
+                             effnERREST, fitparm, 4, NULL);
                 }
                 if (bSingleExpFit || fitparm[0] < 0 || fitparm[1] < 0
                     || (fitparm[1] > 1 && !bAllowNegLTCorr))
@@ -593,7 +605,7 @@ static void estimate_error(const char *eefile, int nb_min, int resol, int n,
                     {
                         fprintf(stdout, "a fitted parameter is negative\n");
                         fprintf(stdout, "invalid fit:  e.e. %g  a %g  tau1 %g  tau2 %g\n",
-                                sig[s]*anal_ee_inf(fitparm, n*dt),
+                                optimal_error_estimate(sig[s], fitparm, n*dt),
                                 fitparm[1], fitparm[0], fitparm[2]);
                     }
                     /* Do a single exponential fit */
@@ -602,11 +614,10 @@ static void estimate_error(const char *eefile, int nb_min, int resol, int n,
                     fitparm[1] = 1.0;
                     fitparm[2] = 0.0;
                     do_lmfit(nbs, ybs, fitsig, 0, tbs, 0, dt*n, oenv, bDebugMode(),
-                             effnERREST, fitparm, 6);
-                    fitparm[3] = 1-fitparm[1];
+                             effnERREST, fitparm, 6, NULL);
                 }
             }
-            ee   = sig[s]*anal_ee_inf(fitparm, n*dt);
+            ee   = optimal_error_estimate(sig[s], fitparm, n*dt);
             a    = fitparm[1];
             tau1 = fitparm[0];
             tau2 = fitparm[2];
@@ -616,12 +627,14 @@ static void estimate_error(const char *eefile, int nb_min, int resol, int n,
         if (output_env_get_xvg_format(oenv) == exvgXMGR)
         {
             fprintf(fp, "@ legend string %d \"av %f\"\n", 2*s, av[s]);
-            fprintf(fp, "@ legend string %d \"ee %6g\"\n", 2*s+1, sig[s]*anal_ee_inf(fitparm, n*dt));
+            fprintf(fp, "@ legend string %d \"ee %6g\"\n", 2*s+1,
+                    optimal_error_estimate(sig[s], fitparm, n*dt));
         }
         else if (output_env_get_xvg_format(oenv) == exvgXMGRACE)
         {
             fprintf(fp, "@ s%d legend \"av %f\"\n", 2*s, av[s]);
-            fprintf(fp, "@ s%d legend \"ee %6g\"\n", 2*s+1, sig[s]*anal_ee_inf(fitparm, n*dt));
+            fprintf(fp, "@ s%d legend \"ee %6g\"\n", 2*s+1,
+                    optimal_error_estimate(sig[s], fitparm, n*dt));
         }
         for (i = 0; i < nbs; i++)
         {
@@ -672,11 +685,11 @@ static void estimate_error(const char *eefile, int nb_min, int resol, int n,
             ac_fit[1] = 0.95;
             ac_fit[2] = 10*acint;
             do_lmfit(n/nb_min, ac, fitsig, dt, 0, 0, fitlen*dt, oenv,
-                     bDebugMode(), effnEXP3, ac_fit, 0);
+                     bDebugMode(), effnEXPEXP, ac_fit, 0, NULL);
             ac_fit[3] = 1 - ac_fit[1];
 
             fprintf(stdout, "Set %3d:  ac erest %g  a %g  tau1 %g  tau2 %g\n",
-                    s+1, sig[s]*anal_ee_inf(ac_fit, n*dt),
+                    s+1, optimal_error_estimate(sig[s], ac_fit, n*dt),
                     ac_fit[1], ac_fit[0], ac_fit[2]);
 
             fprintf(fp, "%s\n", output_env_get_print_xvgr_codes(oenv) ? "&" : "");
@@ -789,7 +802,8 @@ static void filter(real flen, int n, int nset, real **val, real dt)
 
 static void do_fit(FILE *out, int n, gmx_bool bYdy,
                    int ny, real *x0, real **val,
-                   int npargs, t_pargs *ppa, const output_env_t oenv)
+                   int npargs, t_pargs *ppa, const output_env_t oenv,
+                   const char *fn_fitted)
 {
     real   *c1 = NULL, *sig = NULL;
     double *fitparm;
@@ -838,7 +852,7 @@ static void do_fit(FILE *out, int n, gmx_bool bYdy,
             fitparm[0] = 0.5;
             fitparm[1] = c1[0];
             break;
-        case effnEXP3:
+        case effnEXPEXP:
             fitparm[0] = 1.0;
             fitparm[1] = 0.5*c1[0];
             fitparm[2] = 10.0;
@@ -877,7 +891,8 @@ static void do_fit(FILE *out, int n, gmx_bool bYdy,
         fprintf(out, "a%-2d = %12.5e\n", i+1, fitparm[i]);
     }
     if (do_lmfit(ny, c1, sig, 0, x0, tbeginfit, tendfit,
-                 oenv, bDebugMode(), efitfn, fitparm, 0))
+                 oenv, bDebugMode(), efitfn, fitparm, 0,
+                 fn_fitted) > 0)
     {
         for (i = 0; (i < nparm); i++)
         {
@@ -1006,6 +1021,50 @@ static void do_geminate(const char *gemFile, int nData,
     xvgrclose(fp);
 }
 
+static void print_fitted_function(const char   *fitfile,
+                                  const char   *fn_fitted,
+                                  gmx_bool      bXYdy,
+                                  int           nset,
+                                  int           n,
+                                  real         *t,
+                                  real        **val,
+                                  int           npargs,
+                                  t_pargs      *ppa,
+                                  output_env_t  oenv)
+{
+    FILE *out_fit = gmx_ffopen(fitfile, "w");
+    if (bXYdy && nset >= 2)
+    {
+        do_fit(out_fit, 0, TRUE, n, t, val, npargs, ppa, oenv,
+               fn_fitted);
+    }
+    else
+    {
+        char *buf2 = NULL;
+        int   s, buflen = 0;
+        if (NULL != fn_fitted)
+        {
+            buflen = strlen(fn_fitted)+32;
+            snew(buf2, buflen);
+            strncpy(buf2, fn_fitted, buflen);
+            buf2[strlen(buf2)-4] = '\0';
+        }
+        for (s = 0; s < nset; s++)
+        {
+            char *buf = NULL;
+            if (NULL != fn_fitted)
+            {
+                snew(buf, buflen);
+                snprintf(buf, n, "%s_%d.xvg", buf2, s);
+            }
+            do_fit(out_fit, s, FALSE, n, t, val, npargs, ppa, oenv, buf);
+            sfree(buf);
+        }
+        sfree(buf2);
+    }
+    gmx_ffclose(out_fit);
+}
+
 int gmx_analyze(int argc, char *argv[])
 {
     static const char *desc[] = {
@@ -1101,7 +1160,13 @@ int gmx_analyze(int argc, char *argv[])
 
         "Option [TT]-luzar[tt] performs a Luzar & Chandler kinetics analysis",
         "on output from [gmx-hbond]. The input file can be taken directly",
-        "from [TT]gmx hbond -ac[tt], and then the same result should be produced."
+        "from [TT]gmx hbond -ac[tt], and then the same result should be produced.[PAR]",
+        "Option [TT]-fitfn[tt] performs curve fitting to a number of different",
+        "curves that make sense in the context of molecular dynamics, mainly",
+        "exponential curves. More information is in the manual. To check the output",
+        "of the fitting procedure the option [TT]-fitted[tt] will print both the",
+        "original data and the fitted function to a new data file. The fitting",
+        "parameters are stored as comment in the output file."
     };
     static real        tb         = -1, te = -1, frac = 0.5, filtlen = 0, binwidth = 0.1, aver_start = 0;
     static gmx_bool    bHaveT     = TRUE, bDer = FALSE, bSubAv = TRUE, bAverCorr = FALSE, bXYdy = FALSE;
@@ -1203,6 +1268,7 @@ int gmx_analyze(int argc, char *argv[])
         { efXVG, "-av",   "average",  ffOPTWR  },
         { efXVG, "-ee",   "errest",   ffOPTWR  },
         { efXVG, "-bal",  "ballisitc", ffOPTWR  },
+        { efXVG, "-fitted", "fitted", ffOPTWR },
 /*     { efXVG, "-gem",  "geminate", ffOPTWR  }, */
         { efLOG, "-g",    "fitlog",   ffOPTWR  }
     };
@@ -1283,19 +1349,12 @@ int gmx_analyze(int argc, char *argv[])
 
     if (fitfile != NULL)
     {
-        out_fit = gmx_ffopen(fitfile, "w");
-        if (bXYdy && nset >= 2)
-        {
-            do_fit(out_fit, 0, TRUE, n, t, val, npargs, ppa, oenv);
-        }
-        else
-        {
-            for (s = 0; s < nset; s++)
-            {
-                do_fit(out_fit, s, FALSE, n, t, val, npargs, ppa, oenv);
-            }
-        }
-        gmx_ffclose(out_fit);
+        print_fitted_function(fitfile,
+                              opt2fn_null("-fitted", NFILE, fnm),
+                              bXYdy, nset,
+                              n, t, val,
+                              npargs, ppa,
+                              oenv);
     }
 
     printf("                                      std. dev.    relative deviation of\n");
index bf4f6c68eae8d774fb74cf7813803fa13d7e72f1..979f36bc205d09cfcb5424fc46271138f48f71e9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2010,2011,2012,2013,2014, by the GROMACS development team, led by
+ * Copyright (c) 2010,2011,2012,2013,2014,2015, by the GROMACS development team, led by
  * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
  * and including many others, as listed in the AUTHORS file in the
  * top-level source directory and at http://www.gromacs.org.
@@ -492,9 +492,9 @@ static void interfaces_txy (real ****Densmap, int xslices, int yslices, int zsli
         /*Fit average density in z over whole trajectory to obtain tentative fit-parameters in fit1 and fit2*/
 
         /*Fit 1st half of box*/
-        do_lmfit(zslices, zDensavg, sigma1, binwidth, NULL, startpoint, splitpoint, oenv, FALSE, effnERF, beginfit1, 3);
+        do_lmfit(zslices, zDensavg, sigma1, binwidth, NULL, startpoint, splitpoint, oenv, FALSE, effnERF, beginfit1, 8, NULL);
         /*Fit 2nd half of box*/
-        do_lmfit(zslices, zDensavg, sigma2, binwidth, NULL, splitpoint, endpoint, oenv, FALSE, effnERF, beginfit2, 3);
+        do_lmfit(zslices, zDensavg, sigma2, binwidth, NULL, splitpoint, endpoint, oenv, FALSE, effnERF, beginfit2, 8, NULL);
 
         /*Initialise the const arrays for storing the average fit parameters*/
         avgfit1 = beginfit1;
@@ -518,10 +518,10 @@ static void interfaces_txy (real ****Densmap, int xslices, int yslices, int zsli
                         fit2[k] = avgfit2[k];
                     }
                     /*Now fit and store in structures in row-major order int[n][i][j]*/
-                    do_lmfit(zslices, Densmap[n][i][j], sigma1, binwidth, NULL, startpoint, splitpoint, oenv, FALSE, effnERF, fit1, 1);
+                    do_lmfit(zslices, Densmap[n][i][j], sigma1, binwidth, NULL, startpoint, splitpoint, oenv, FALSE, effnERF, fit1, 0, NULL);
                     int1[n][j+(yslices*i)]->Z = fit1[2];
                     int1[n][j+(yslices*i)]->t = fit1[3];
-                    do_lmfit(zslices, Densmap[n][i][j], sigma2, binwidth, NULL, splitpoint, endpoint, oenv, FALSE, effnERF, fit2, 2);
+                    do_lmfit(zslices, Densmap[n][i][j], sigma2, binwidth, NULL, splitpoint, endpoint, oenv, FALSE, effnERF, fit2, 0, NULL);
                     int2[n][j+(yslices*i)]->Z = fit2[2];
                     int2[n][j+(yslices*i)]->t = fit2[3];
                 }
index 7bc7febc797aed4bbabaf518a435479d1df00b5d..6e76ed186cb5edaf200fb12997a87f227dc0fc64 100644 (file)
@@ -397,7 +397,7 @@ int gmx_dielectric(int argc, char *argv[])
     integral = print_and_integrate(NULL, calc_nbegin(nx, y[0], tbegin),
                                    dt, y[1], NULL, 1);
     integral += do_lmfit(nx, y[1], y[2], dt, y[0], tbegin, tend,
-                         oenv, TRUE, eFitFn, fitparms, fix);
+                         oenv, TRUE, eFitFn, fitparms, fix, NULL);
     for (i = 0; i < nx; i++)
     {
         y[3][i] = fit_function(eFitFn, fitparms, y[0][i]);
index f9e8fb89c662140db8fa9f98c5b8a31d357c8676..0d364128b1084b226ff99256ac9a4c1eb7f82773 100644 (file)
@@ -2402,7 +2402,7 @@ static void smooth_tail(int n, real t[], real c[], real sigma_c[], real start,
     }
     fitparm[1] = 0.95;
     do_lmfit(n, c, sigma_c, 0, t, start, t[n-1], oenv, bDebugMode(),
-             effnEXP2, fitparm, 0);
+             effnEXP2, fitparm, 0, NULL);
 }
 
 void analyse_corr(int n, real t[], real ct[], real nt[], real kt[],
index d2a6b72d74d63c40746df6fcf16bc0080963d894..eef238878a838552fa2f93d21d61225212536ad0 100644 (file)
@@ -208,7 +208,7 @@ static void process_tcaf(int nframes, real dt, int nkc, real **tc, rvec *kfac,
         fitparms[0]  = 1;
         fitparms[1]  = 1;
         do_lmfit(ncorr, tcaf[k], sig, dt, 0, 0, ncorr*dt,
-                 oenv, bDebugMode(), effnVAC, fitparms, 0);
+                 oenv, bDebugMode(), effnVAC, fitparms, 0, NULL);
         eta = 1000*fitparms[1]*rho/
             (4*fitparms[0]*PICO*norm2(kfac[k])/(NANO*NANO));
         fprintf(stdout, "k %6.3f  tau %6.3f  eta %8.5f 10^-3 kg/(m s)\n",
@@ -233,7 +233,7 @@ static void process_tcaf(int nframes, real dt, int nkc, real **tc, rvec *kfac,
             fitparms[0]  = 1;
             fitparms[1]  = 1;
             do_lmfit(ncorr, tcafc[k], sig, dt, 0, 0, ncorr*dt,
-                     oenv, bDebugMode(), effnVAC, fitparms, 0);
+                     oenv, bDebugMode(), effnVAC, fitparms, 0, NULL);
             eta = 1000*fitparms[1]*rho/
                 (4*fitparms[0]*PICO*norm2(kfac[kset_c[k]])/(NANO*NANO));
             fprintf(stdout,