/* Last edited on 2011-05-15 01:27:11 by stolfi */ /* fdjac2.f -- translated by f2c (version of 17 January 1992 0:17:58). You must link the resulting object file with the libraries: -lf77 -li77 -lm -lc (in that order) */ #include #include /* Table of constant values */ static int c__1 = 1; int fdjac2_ ( fcn_t *fcn, int *m, int *n, double *x, double *fvec, double *fjac, int *ldfjac, int *iflag, double *epsfcn, double *wa ) { /* Initialized data */ static double zero = 0.; /* System generated locals */ int fjac_dim1, fjac_offset, i__1, i__2; /* Builtin functions */ double sqrt(); /* Local variables */ static double temp, h; static int i, j; static double epsmch; extern double dpmpar_(); static double eps; /* ********** */ /* subroutine fdjac2 */ /* this subroutine computes a forward-difference approximation */ /* to the m by n jacobian matrix associated with a specified */ /* problem of m functions in n variables. */ /* the subroutine statement is */ /* subroutine fdjac2(fcn,m,n,x,fvec,fjac,ldfjac,iflag,epsfcn,wa) */ /* where */ /* fcn is the name of the user-supplied subroutine which */ /* calculates the functions. fcn must be declared */ /* in an external statement in the user calling */ /* program, and should be written as follows. */ /* subroutine fcn(m,n,x,fvec,iflag) */ /* int m,n,iflag */ /* double precision x(n),fvec(m) */ /* ---------- */ /* calculate the functions at x and */ /* return this vector in fvec. */ /* ---------- */ /* return */ /* end */ /* the value of iflag should not be changed by fcn unless */ /* the user wants to terminate execution of fdjac2. */ /* in this case set iflag to a negative int. */ /* m is a positive int input variable set to the number */ /* of functions. */ /* n is a positive int input variable set to the number */ /* of variables. n must not exceed m. */ /* x is an input array of length n. */ /* fvec is an input array of length m which must contain the */ /* functions evaluated at x. */ /* fjac is an output m by n array which contains the */ /* approximation to the jacobian matrix evaluated at x. */ /* ldfjac is a positive int input variable not less than m */ /* which specifies the leading dimension of the array fjac. */ /* iflag is an int variable which can be used to terminate */ /* the execution of fdjac2. see description of fcn. */ /* epsfcn is an input variable used in determining a suitable */ /* step length for the forward-difference approximation. this */ /* approximation assumes that the relative errors in the */ /* functions are of the order of epsfcn. if epsfcn is less */ /* than the machine precision, it is assumed that the relative */ /* errors in the functions are of the order of the machine */ /* precision. */ /* wa is a work array of length m. */ /* subprograms called */ /* user-supplied ...... fcn */ /* minpack-supplied ... dpmpar */ /* fortran-supplied ... dabs,dmax1,dsqrt */ /* argonne national laboratory. minpack project. march 1980. */ /* burton s. garbow, kenneth e. hillstrom, jorge j. more */ /* ********** */ /* Parameter adjustments */ --wa; fjac_dim1 = *ldfjac; fjac_offset = fjac_dim1 + 1; fjac -= fjac_offset; --fvec; --x; /* Function Body */ /* epsmch is the machine precision. */ epsmch = dpmpar_(&c__1); eps = sqrt((max(*epsfcn,epsmch))); i__1 = *n; for (j = 1; j <= i__1; ++j) { temp = x[j]; h = eps * abs(temp); if (h == zero) { h = eps; } x[j] = temp + h; (*fcn)(m, n, &x[1], &wa[1], iflag); if (*iflag < 0) { goto L30; } x[j] = temp; i__2 = *m; for (i = 1; i <= i__2; ++i) { fjac[i + j * fjac_dim1] = (wa[i] - fvec[i]) / h; /* L10: */ } /* L20: */ } L30: return 0; /* last card of subroutine fdjac2. */ } /* fdjac2_ */