aboutsummaryrefslogtreecommitdiffhomepage
path: root/unsupported/Eigen/src/NonLinear/fdjac2.h
blob: 730bc1dfc2f8298b1f3a08d8c598ef29465abaf2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

template <typename Scalar>
int ei_fdjac2(minpack_func_mn fcn, int m, int n, Scalar *x, 
	const Scalar *fvec, Scalar *fjac, int ldfjac,
	Scalar epsfcn, Scalar *wa)
{
    /* System generated locals */
    int fjac_dim1, fjac_offset;

    /* Local variables */
    Scalar h__;
    int i, j;
    Scalar eps, temp;
    int iflag;

    /* Parameter adjustments */
    --wa;
    --fvec;
    --x;
    fjac_dim1 = ldfjac;
    fjac_offset = 1 + fjac_dim1 * 1;
    fjac -= fjac_offset;

    /* Function Body */
    const Scalar epsmch = epsilon<Scalar>();

    eps = ei_sqrt((std::max(epsfcn,epsmch)));
    for (j = 1; j <= n; ++j) {
	temp = x[j];
	h__ = eps * ei_abs(temp);
	if (h__ == 0.) {
	    h__ = eps;
	}
	x[j] = temp + h__;
	iflag = (*fcn)(m, n, &x[1], &wa[1], 1);
	if (iflag < 0) {
	    /* goto L30; */
            return iflag;
	}
	x[j] = temp;
	for (i = 1; i <= m; ++i) {
	    fjac[i + j * fjac_dim1] = (wa[i] - fvec[i]) / h__;
/* L10: */
	}
/* L20: */
    }
/* L30: */
    return iflag;

/*     last card of subroutine fdjac2. */

} /* fdjac2_ */