838f884bb6cb05c0cb152bd6e02104e10ca0b47c
[alexxy/gromacs.git] / src / external / lmfit / lmcurve.c
1 /*
2  * Library:   lmfit (Levenberg-Marquardt least squares fitting)
3  *
4  * File:      lmcurve.c
5  *
6  * Contents:  Levenberg-Marquardt curve-fitting
7  *
8  * Copyright: Joachim Wuttke, Forschungszentrum Juelich GmbH (2004-2013)
9  *
10  * License:   see ../COPYING (FreeBSD)
11  *
12  * Homepage:  apps.jcns.fz-juelich.de/lmfit
13  */
14
15 #include "lmmin.h"
16 #include "gromacs/utility/basedefinitions.h"
17
18 typedef struct {
19     const double *t;
20     const double *y;
21     double (*f)(double t, const double *par);
22 } lmcurve_data_struct;
23
24
25 void lmcurve_evaluate( const double *par, int m_dat, const void *data,
26                        double *fvec, gmx_unused int *info )
27 {
28     int i;
29     for (i = 0; i < m_dat; i++)
30     {
31         fvec[i] =
32             ((lmcurve_data_struct*)data)->y[i] -
33             ((lmcurve_data_struct*)data)->f(
34                     ((lmcurve_data_struct*)data)->t[i], par );
35     }
36 }
37
38
39 void lmcurve( int n_par, double *par, int m_dat,
40               const double *t, const double *y,
41               double (*f)( double t, const double *par ),
42               const lm_control_struct *control,
43               lm_status_struct *status )
44 {
45     lmcurve_data_struct data;
46     data.t = t;
47     data.y = y;
48     data.f = f;
49
50     lmmin( n_par, par, m_dat, (const void*) &data,
51            lmcurve_evaluate, control, status );
52 }