Files
piscal/dataassim/math/optimization/odrpack95/test.f
T
2022-09-12 16:40:28 +00:00

2743 lines
87 KiB
FortranFixed

*DTEST
PROGRAM DTEST
C***Begin Prologue DTEST
C***Refer to ODR
C***Routines Called DODRX
C***Date Written 861229 (YYMMDD)
C***Revision Date 920619 (YYMMDD)
C***Purpose EXERCISE FEATURES OF ODRPACK95 SOFTWARE
C***End Prologue DTEST
C...Used modules
USE REAL_PRECISION
C...Scalars in common
INTEGER
& NTEST
C...Local scalars
REAL (KIND=R8)
& TSTFAC
INTEGER
& LUNERR,LUNRPT,LUNSUM
LOGICAL
& PASSED
C...External subroutines
EXTERNAL
& DODRX
C...Common blocks
COMMON /TSTSET/ NTEST
C***Variable declarations (alphabetically)
C LUNERR: The logical unit number used for error messages.
C LUNRPT: The logical unit number used for computation reports.
C LUNSUM: The logical unit number used for a summary report listing
C only the test comparisons and not the odrpack generated
C reports.
C NTEST: The number of tests to be run.
C PASSED: The variable designating whether the results of all of the
C tests agree with those from the cray ymp using double
C precision (PASSED=TRUE), or whether some of the results
C disagreed (PASSED=FALSE).
C TSTFAC: The user-supplied factor for scaling the test tolerances
C used to check for agreement between computed results and
C results obtained using REAL (KIND=R8) version on cray
C YMP. Values of TSTFAC greater than one increase the
C test tolerances, making the tests easier to pass and
C allowing small discrepancies between the computed and
C expected results to be automatically discounted.
C***First executable statement TEST
C Set up necessary files
C NOTE: ODRPACK95 generates computation and error reports on
C logical unit 6 by default;
C logical unit 'LUNSUM' used to summarize results of comparisons
C from exercise routine DODRX.
LUNRPT = 18
LUNERR = 18
LUNSUM = 19
OPEN(UNIT=LUNRPT,FILE='REPORT')
OPEN(UNIT=LUNERR,FILE='REPORT')
OPEN(UNIT=LUNSUM,FILE='SUMMARY')
C Exercise REAL (KIND=R8) version of ODRPACK95
C (test reports generated on file 'RESULTS' and
C summarized in file 'SUMMARY')
NTEST = 23
TSTFAC = 1.0E0_R8
CALL DODRX(TSTFAC,PASSED,LUNSUM)
END
*DODRX
SUBROUTINE DODRX
& (TSTFAC,PASSED,LUNSUM)
C***Begin Prologue DODRX
C***Refer to ODR
C***Routines Called DDOT,DNRM2,ODR,DODRXD,
C DODRXF,DODRXW,DWGHT,DZERO
C***Date Written 860529 (YYMMDD)
C***Revision Date 920619 (YYMMDD)
C***Purpose Exercise features of ODRPACK95 software
C***End Prologue DODRX
C...Used modules
USE ODRPACK95
USE REAL_PRECISION
C...Parameters
INTEGER
& LDWD,LDWE,LD2WD,LD2WE,LIWORK,LWORK,MAXN,MAXM,MAXNP,MAXNQ,NTESTS
REAL (KIND=R8)
& BASE
PARAMETER
& (MAXN=50, MAXM=3, MAXNP=10, MAXNQ=2, NTESTS=23,
& LDWE=MAXN, LD2WE=MAXNQ, LDWD=MAXN, LD2WD=MAXM,
& LWORK = 18 + 11*MAXNP + MAXNP**2 + MAXM + MAXM**2 +
& 4*MAXN*MAXNQ + 6*MAXN*MAXM + 2*MAXN*MAXNQ*MAXNP +
& 2*MAXN*MAXNQ*MAXM + MAXNQ**2 +
& 5*MAXNQ + MAXNQ*(MAXNP+MAXM) + LDWE*LD2WE*MAXNQ,
& LIWORK = 20+MAXNP+MAXNQ*(MAXNP+MAXM),
& BASE = RADIX(1.0E0_R8))
C...Scalar arguments
REAL (KIND=R8)
& TSTFAC
INTEGER
& LUNSUM
LOGICAL
& PASSED
C...Scalars in common
INTEGER
& NTEST,SETNO
C...Local scalars
INTEGER
& I,INFO,IPRINT,ITEST,JOB,L,LDIFX,LDSCLD,LDSTPD,LDWD1,LDWE1,
& LDX,LDY,LD2WD1,LD2WE1,LIWMIN,LUN,LUNERR,LUNRPT,LWMIN,
& M,MAXIT,MSG,N,NDIGIT,NP,NQ
REAL (KIND=R8)
& BNRM,EPSMAC,EWRT,EWRT2,HUNDRD,ONE,P01,P2,PARTOL,SSTOL,
& TAUFAC,THREE,TSTTOL,TWO,WSS,WSSDEL,WSSEPS,ZERO
LOGICAL
& FAILED,FAILS,ISODR,SHORT
CHARACTER TITLE*80
C...Arrays in common
REAL (KIND=R8)
& LOWER(MAXNP),UPPER(MAXNP)
C...Local arrays
REAL (KIND=R8)
& BETA(MAXNP),DELTA(:,:),DPYMP(2,NTESTS),
& SCLB(MAXNP),SCLD(MAXN,MAXM),
& STPB(MAXNP),STPD(MAXN,MAXM),
& WE(MAXN,MAXNQ,MAXNQ),WD(MAXN,MAXM,MAXM),WORK(:),
& WRK(MAXN*MAXM+MAXN*MAXNQ),X(MAXN,MAXM),Y(MAXN,MAXNQ),
& TEMPRETL(MAXN,MAXM)
INTEGER
& IDPYMP(NTESTS),IFIXB(MAXNP),IFIXX(MAXN,MAXM),IWORK(:)
C...Pointers
POINTER
& DELTA,IWORK,WORK
C...External functions
REAL (KIND=R8)
& DDOT,DNRM2
EXTERNAL
& DDOT,DNRM2
C...External subroutines
EXTERNAL
& DODRXD,DODRXF,DODRXW,DZERO
C...Intrinsic functions
INTRINSIC
& ABS,MOD
C...Common blocks
COMMON /SETID/SETNO
COMMON /TSTSET/ NTEST
COMMON /BOUNDS/ LOWER,UPPER
C...Data statements
DATA
& ZERO,P01,P2,ONE,TWO,THREE,HUNDRD
& /0.0E0_R8,0.01E0_R8,0.2E0_R8,1.0E0_R8,2.0E0_R8,3.0E0_R8,
& 100.0E0_R8/
DATA
& (DPYMP(I,1),I=1,2)
& /2.762733195780256808978449342964E+04_R8,
& 7.532639569022918943695104672512E-04_R8/
DATA
& (DPYMP(I,2),I=1,2)
& /2.762732630143673024399942947263E+04_R8,
& 7.538467722687131506874279314940E-04_R8/
DATA
& (DPYMP(I,3),I=1,2)
& /1.069944100000000027940905194068E+09_R8,
& 1.212808593256056359629660672046E-05_R8/
DATA
& (DPYMP(I,4),I=1,2)
& /1.069944100000000026623461142867E+09_R8,
& 5.452084633790606017572015067556E-07_R8/
DATA
& (DPYMP(I,5),I=1,2)
& /1.426988156377258617521571734503E+00_R8,
& 1.084728687127432219753903919409E+00_R8/
DATA
& (DPYMP(I,6),I=1,2)
& /4.261321829513978871872508874025E+00_R8,
& 1.477967210398420733565424329280E-02_R8/
DATA
& (DPYMP(I,7),I=1,2)
& /4.261272307142888464011486769858E+00_R8,
& 1.477966125465374336804138554559E-02_R8/
DATA
& (DPYMP(I,8),I=1,2)
& /4.371487317909745009110272283622E+01_R8,
& 1.144419474408286067112233592550E-03_R8/
DATA
& (DPYMP(I,9),I=1,2)
& /3.099048849376848610380977303924E+00_R8,
& 8.824708863783850023783338218501E-02_R8/
DATA
& (DPYMP(I,10),I=1,2)
& /9.469917836739932584221023234527E+00_R8,
& 4.205389215588104651198536809880E-01_R8/
DATA
& (DPYMP(I,11),I=1,2)
& /3.950949253027682207109233363651E+01_R8,
& 6.651838750834910819636881506915E+01_R8/
DATA
& (DPYMP(I,12),I=1,2)
& /3.950949253027682207109233363651E+01_R8,
& 6.651838750834910819636881506915E+01_R8/
DATA
& (DPYMP(I,13),I=1,2)
& /1.414213562373095000000000000000E+00_R8,
& 5.250825926608277346013642256883E-26_R8/
DATA
& (DPYMP(I,14),I=1,2)
& /1.414213562373095000000000000000E+00_R8,
& 8.159081600696301507018019048968E-26_R8/
DATA
& (DPYMP(I,15),I=1,2)
& /1.486588477064952451556223422813E+00_R8,
& 1.841690442255357083922717720270E+03_R8/
DATA
& (DPYMP(I,16),I=1,2)
& /2.001224625073357401561224833131E+02_R8,
& 0.000000000000000000000000000000E+00_R8/
DATA
& (DPYMP(I,17),I=1,2)
& /2.000099997500125000000000000000E+02_R8,
& 0.000000000000000000000000000000E+00_R8/
DATA
& (DPYMP(I,18),I=1,2)
& /1.414213562373095000000000000000E+00_R8,
& 5.816277809383742531415846947805E-26_R8/
DATA
& (DPYMP(I,19),I=1,2)
& /2.000624902374255782433465356007E+02_R8,
& 4.568236947482152283374593507328E+30_R8/
DATA
& (DPYMP(I,20),I=1,2)
& /2.000624902374255782433465356007E+02_R8,
& 1.848525209410256939008831977844E+05_R8/
DATA
& (DPYMP(I,21),I=1,2)
& /2.000624902374255782433465356007E+02_R8,
& 1.848525209410256939008831977844E+05_R8/
DATA
& (DPYMP(I,22),I=1,2)
& /2.731300056749532689792659000000E+00_R8,
& 3.378975642596100806258619000000E+05_R8/
DATA
& (DPYMP(I,23),I=1,2)
& /2.675757304209387399396291584708E+00_R8,
& 5.174484505019630309341494012187E-02_R8/
DATA
& (IDPYMP(I),I=1,23)
& /1,1,3,1,1,4,1,1,2,1,1023,40100,2,2,3,90100,91000,2,90010,
& 90020,90010,21,1/
C...Interface blocks
INTERFACE
SUBROUTINE DWGHT
& (N,M,WT,LDWT,LD2WT,T,WTT)
USE REAL_PRECISION
INTEGER
& LDWT,LD2WT,M,N
REAL (KIND=R8)
& T(:,:),WT(:,:,:),WTT(:,:)
END SUBROUTINE
END INTERFACE
C...Routine names used as subprogram arguments
C DODRXF: The user-supplied routine for evaluating the model.
C...Variable definitions (alphabetically)
C BASE: The base of floating point numbers on the current machine
C BETA: The function parameters.
C BNRM: The norm of BETA.
C DELTA: The error in the X data.
C DPYMP: The floating point results from a cray YMP using
C REAL (KIND=R8).
C EPSMAC: The value of machine precision.
C EWRT: A temporary variable for the denominator of the relative error
C calculations (error with respect to).
C EWRT2: A temporary variable for the denominator of the relative error
C calculations (error with respect to).
C FAILED: The variable designating whether the results of all of the
C demonstration runs agreed with those from the cray YMP
C using REAL (KIND=R8) (FAILED=FALSE) or whether some of
C the tests disagreed (FAILED=TRUE).
C FAILS: The variable designating whether the results of an
C individual demonstration run agreed with those from the
C cray YMP using REAL (KIND=R8) (FAILS=FALSE) or
C disagree (FAILS=TRUE).
C HUNDRD: The value 100.0E0_R8.
C I: An index variable.
C IDPYMP: The integer results from a cray YMP using
C REAL (KIND=R8).
C IFIXB: The values designating whether the elements of BETA are
C fixed at their input values or not.
C IFIXX: The values designating whether the elements of DELTA are
C fixed at their input values or not.
C INFO: The variable designating why the computations stopped.
C IPRINT: The print control variable.
C ISODR: The variable designating whether the solution is by odr
C (ISODR=TRUE) or by ols (ISODR=FALSE).
C ITEST: The number of the current test being run.
C IWORK: The integer work space.
C J: An index variable.
C JOB: The variable controlling problem initialization and
C computational method.
C LDIFX: The leading dimension of array IFIXX.
C LDSCLD: The leading dimension of array SCLD.
C LDWD: The leading dimension of array WD.
C LDWD1: The leading dimension of array WD as passed to ODRPACK95.
C LDWE: The leading dimension of array WE.
C LDWE1: The leading dimension of array WE as passed to ODRPACK95.
C LDX: The leading dimension of array X.
C LDY: The leading dimension of array Y.
C LD2WD: The second dimension of array WD.
C LD2WD1: The second dimension of array WD as passed to ODRPACK95.
C LD2WE: The second dimension of array WE.
C LD2WE1: The second dimension of array WE as passed to ODRPACK95.
C LIWKMN: The minimum acceptable length of array IWORK.
C LIWMIN: The minimum length of vector IWORK for a given problem.
C LIWORK: The length of vector IWORK.
C LUN: The logical unit number currently being used.
C LUNERR: The logical unit number used for error messages.
C LUNRPT: The logical unit number used for computation reports.
C LUNSUM: The logical unit number used for a summary report.
C LWKMN: The minimum acceptable length of array WORK.
C LWMIN: The minimum length of vector WORK for a given problem.
C LWORK: The length of vector WORK.
C M: The number of columns of data in the explanatory variable.
C MAXIT: The maximum number of iterations allowed.
C MSG: The variable designating which message is to be printed as
C a result of the comparison with the cray YMP or x86 (Linux)
C results.
C N: The number of observations.
C NDIGIT: The number of accurate digits in the function results, as
C supplied by the user.
C NP: The number of function parameters.
C NTEST: The number of tests to be run.
C NTESTS: The number of different tests available.
C ONE: The value 1.0E0_R8.
C PASSED: The variable designating whether the results of all of the
C demonstration runs agreed with those from the cray YMP
C using REAL (KIND=R8) (PASSED=TRUE), or whether some of
C the results disagreed (PASSED=FALSE).
C P01: The value 0.01E0_R8.
C P2: The value 0.2E0_R8.
C PARTOL: The parameter convergence stopping criteria.
C SCLB: The scaling values for BETA.
C SCLD: The scaling values for DELTA.
C SETNO: The number of the data set being analyzed.
C SHORT: The variable designating whether ODRPACK95 is invoked by the
C short-call (SHORT=.TRUE.) or the long-call (SHORT=.FALSE.).
C SSTOL: The sum-of-squares convergence stopping tolerance.
C TAUFAC: The factor used to compute the initial trust region
C diameter.
C THREE: The value 3.0E0_R8.
C TITLE: The reference for the data set being analyzed.
C TSTFAC: The user-supplied factor for scaling the test tolerances
C used to check for agreement between computed results and
C results obtained using REAL (KIND=R8) version on cray
C YMP.
C TSTTOL: The test tolerance used in checking computed values for
C purposes of determining proper installation.
C TWO: The value 2.0E0_R8.
C WD: The DELTA weights.
C WE: The EPSILON weights.
C WORK: The REAL (KIND=R8) work space.
C WRK: The REAL (KIND=R8) work space for computing test results.
C WSS: The sum of the squared weighted errors.
C WSSDEL: The sum of the squared weighted errors in X.
C WSSEPS: The sum of the squared weighted errors in Y.
C X: The explanatory variable.
C Y: The response variable.
C ZERO: The value 0.0E0_R8.
C***First executable statement DODRX
C Allocate work arrays and DELTA
ALLOCATE(DELTA(MAXN,MAXM),IWORK(LIWORK),WORK(LWORK))
C Set logical units for error and computation reports
LUNERR = 18
LUNRPT = 18
C Initialize test tolerance
IF (TSTFAC.GT.ONE) THEN
TSTTOL = TSTFAC
ELSE
TSTTOL = ONE
END IF
C Initialize machine precision
EPSMAC = BASE**(1-DIGITS(BASE))
C Initialize leading dimension of X
LDX = MAXN
LDY = MAXN
C Initialize miscellaneous variables used in the exercise procedure
FAILED = .FALSE.
SHORT = .TRUE.
ISODR = .TRUE.
N = 0
C Begin exercising ODRPACK95
DO 400 ITEST=1,NTEST
C Set control values to invoke default values
WE(1,1,1) = -ONE
LDWE1 = LDWE
LD2WE1 = LD2WE
WD(1,1,1) = -ONE
LDWD1 = LDWD
LD2WD1 = LD2WD
IFIXB(1) = -1
IFIXX(1,1) = -1
LDIFX = MAXN
NDIGIT = -1
TAUFAC = -ONE
SSTOL = -ONE
PARTOL = -ONE
MAXIT = -1
IPRINT = 2112
C IPRINT = 6616
STPB(1) = -ONE
STPD(1,1) = -ONE
LDSTPD = 1
SCLB(1) = -ONE
SCLD(1,1) = -ONE
LDSCLD = 1
UPPER(:) = HUGE(ONE)
LOWER(:) = -HUGE(ONE)
IF (ITEST.EQ.1) THEN
C Test simple odr problem
C with analytic derivatives.
LUN = LUNRPT
WRITE (LUN,1000)
DO 10 I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1010)
LUN = LUNSUM
10 CONTINUE
SETNO = 5
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00020
SHORT = .TRUE.
ISODR = .TRUE.
ELSE IF (ITEST.EQ.2) THEN
C Test simple ols problem
C with forward difference derivatives.
LUN = LUNRPT
WRITE (LUN,1000)
DO 20 I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1020)
LUN = LUNSUM
20 CONTINUE
SETNO = 5
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00002
SHORT = .TRUE.
ISODR = .FALSE.
ELSE IF (ITEST.EQ.3) THEN
C Test parameter fixing capabilities for poorly scaled ols problem
C with analytic derivatives.
C (derivative checking turned off.)
LUN = LUNRPT
WRITE (LUN,1000)
DO 30 I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1030)
LUN = LUNSUM
30 CONTINUE
SETNO = 3
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
IFIXB(1) = 1
IFIXB(2) = 1
IFIXB(3) = 1
IFIXB(4) = 0
IFIXB(5) = 1
IFIXB(6) = 0
IFIXB(7) = 0
IFIXB(8) = 0
IFIXB(9) = 0
JOB = 00042
SHORT = .FALSE.
ISODR = .FALSE.
ELSE IF (ITEST.EQ.4) THEN
C Test weighting capabilities for odr problem with
C analytic derivatives.
C Also shows solution of poorly scaled odr problem.
C (derivative checking turned off.)
C N.B., this run continues from where test 3 left off.
LUN = LUNRPT
WRITE (LUN,1000)
DO 40 I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1040)
LUN = LUNSUM
40 CONTINUE
SETNO = 3
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
LDWD1 = LDWD
LDWE1 = LDWE
LD2WD1 = LD2WD
LD2WE1 = LD2WE
DO 45 I=1,N
WD(I,1,1) = (P01/ABS(X(I,1)))**2
WE(I,1,1) = ONE
45 CONTINUE
WE(28,1,1) = ZERO
IFIXB(1) = 1
IFIXB(2) = 1
IFIXB(3) = 1
IFIXB(4) = 0
IFIXB(5) = 1
IFIXB(6) = 1
IFIXB(7) = 1
IFIXB(8) = 0
IFIXB(9) = 0
JOB = 00030
IPRINT = 2232
SHORT = .FALSE.
ISODR = .TRUE.
ELSE IF (ITEST.EQ.5) THEN
C Test DELTA initialization capabilities and user-supplied scaling
C and use of istop to restrict parameter values
C for odr problem with analytic derivatives.
LUN = LUNRPT
WRITE (LUN,1000)
DO 50 I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1050)
LUN = LUNSUM
50 CONTINUE
SETNO = 1
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 01020
LDSCLD = 1
SCLD(1,1) = TWO
SCLB(1) = P2
SCLB(2) = ONE
LDWE1 = 1
LD2WE1 = 1
WE(1,1,1) = -ONE
LDWD1 = 1
LD2WD1 = 1
WD(1,1,1) = -ONE
DO 55 I=20,21
DELTA(I,1) = BETA(1)/Y(I,1) + BETA(2) - X(I,1)
55 CONTINUE
SHORT = .FALSE.
ISODR = .TRUE.
ELSE IF (ITEST.EQ.6) THEN
C Test stiff stopping conditions for unscaled odr problem
C with analytic derivatives.
LUN = LUNRPT
WRITE (LUN,1000)
DO 60 I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1060)
LUN = LUNSUM
60 CONTINUE
SETNO = 4
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00020
SSTOL = HUNDRD*EPSMAC
PARTOL = EPSMAC
MAXIT = 2
SHORT = .FALSE.
ISODR = .TRUE.
ELSE IF (ITEST.EQ.7) THEN
C Test restart for unscaled odr problem
C with analytic derivatives.
LUN = LUNRPT
WRITE (LUN,1000)
DO 70 I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1070)
LUN = LUNSUM
70 CONTINUE
SETNO = 4
JOB = 20220
SSTOL = HUNDRD*EPSMAC
PARTOL = EPSMAC
MAXIT = 50
SHORT = .FALSE.
ISODR = .TRUE.
ELSE IF (ITEST.EQ.8) THEN
C Test use of TAUFAC to restrict first step
C for odr problem with central difference derivatives.
LUN = LUNRPT
WRITE (LUN,1000)
DO 80 I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1080)
LUN = LUNSUM
80 CONTINUE
SETNO = 6
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00210
TAUFAC = P01
SHORT = .FALSE.
ISODR = .TRUE.
ELSE IF (ITEST.EQ.9) THEN
C Test implicit odr problem
C with forward finite difference derivatives
C and covariance matrix constructed with recomputed derivatives.
LUN = LUNRPT
WRITE (LUN,1000)
DO 90 I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1090)
LUN = LUNSUM
90 CONTINUE
SETNO = 7
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00001
PARTOL = EPSMAC**(ONE/THREE)
SHORT = .TRUE.
ISODR = .TRUE.
ELSE IF (ITEST.EQ.10) THEN
C Test multiresponse odr problem
C with central difference derivatives ,
C DELTA initialized to nonzero values,
C variable fixing, and weighting.
LUN = LUNRPT
WRITE (LUN,1000)
DO 100 I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1100)
LUN = LUNSUM
100 CONTINUE
SETNO = 8
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
LDWD1 = LDWD
LDWE1 = LDWE
LD2WD1 = LD2WD
LD2WE1 = LD2WE
DO 105 I=1,N
C Initialize DELTA, and specify first decade of frequencies as fixed
IF (X(I,1).LT.100.0E0_R8) THEN
DELTA(I,1) = 0.0E0_R8
IFIXX(I,1) = 0
ELSE IF (X(I,1).LE.150.0E0_R8) THEN
DELTA(I,1) = 0.0E0_R8
IFIXX(I,1) = 1
ELSE IF (X(I,1).LE.1000.0E0_R8) THEN
DELTA(I,1) = 25.0E0_R8
IFIXX(I,1) = 1
ELSE IF (X(I,1).LE.10000.0E0_R8) THEN
DELTA(I,1) = 560.0E0_R8
IFIXX(I,1) = 1
ELSE IF (X(I,1).LE.100000.0E0_R8) THEN
DELTA(I,1) = 9500.0E0_R8
IFIXX(I,1) = 1
ELSE
DELTA(I,1) = 144000.0E0_R8
IFIXX(I,1) = 1
END IF
C Set weights
IF (X(I,1).EQ.100.0E0_R8 .OR. X(I,1).EQ.150.0E0_R8) THEN
WE(I,1,1) = 0.0E0_R8
WE(I,1,2) = 0.0E0_R8
WE(I,2,1) = 0.0E0_R8
WE(I,2,2) = 0.0E0_R8
ELSE
WE(I,1,1) = 559.6E0_R8
WE(I,1,2) = -1634.0E0_R8
WE(I,2,1) = -1634.0E0_R8
WE(I,2,2) = 8397.0E0_R8
END IF
WD(I,1,1) = (1.0E-4_R8)/(X(I,1)**2)
105 CONTINUE
JOB = 00210
SHORT = .FALSE.
ISODR = .TRUE.
ELSE IF (ITEST.EQ.11) THEN
C Test detection of incorrect derivatives
LUN = LUNRPT
WRITE (LUN,1000)
DO 110 I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1110)
LUN = LUNSUM
110 CONTINUE
SETNO = 6
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00022
SHORT = .FALSE.
ISODR = .FALSE.
ELSE IF (ITEST.EQ.12) THEN
C Test detection of incorrect derivatives
LUN = LUNRPT
WRITE (LUN,1000)
DO 120 I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1120)
LUN = LUNSUM
120 CONTINUE
SETNO = 6
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00020
SHORT = .FALSE.
ISODR = .TRUE.
ELSE IF (ITEST.EQ.13) THEN
C Test bounded odr problem where
C parameters start on bound, move away, hit bound, move away, find minimum.
LUN = LUNRPT
WRITE (LUN,1000)
DO I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1010)
LUN = LUNSUM
END DO
SETNO = 9
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00000
SHORT = .FALSE.
ISODR = .TRUE.
MAXIT = 100
BETA(1:2) = (/ 200.0_R8, 5.0_R8 /)
LOWER(1:2) = (/ 0.1_R8, 0.0_R8 /)
UPPER(1:2) = (/ 200.0_R8, 5.0_R8 /)
ELSE IF (ITEST.EQ.14) THEN
C Test bounded odr problem where
C bounds are never hit.
LUN = LUNRPT
WRITE (LUN,1000)
DO I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1010)
LUN = LUNSUM
END DO
SETNO = 9
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00000
SHORT = .FALSE.
ISODR = .TRUE.
MAXIT = 100
LOWER(1:2) = (/ 0.0_R8, 0.0_R8 /)
UPPER(1:2) = (/ 400.0_R8, 6.0_R8 /)
ELSE IF (ITEST.EQ.15) THEN
C Test bounded odr problem where
C minimum is on boundary.
LUN = LUNRPT
WRITE (LUN,1000)
DO I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1010)
LUN = LUNSUM
END DO
SETNO = 9
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00000
SHORT = .FALSE.
ISODR = .TRUE.
MAXIT = 1000
BETA(1:2) = (/ 200.0_R8, 3.0_R8 /)
LOWER(1:2) = (/ 1.1_R8, 0.0_R8 /)
UPPER(1:2) = (/ 400.0_R8, 6.0_R8 /)
TSTTOL = 500.0_R8
ELSE IF (ITEST.EQ.16) THEN
C Test bounded odr problem where
C initial BETA is outside bounds.
LUN = LUNRPT
WRITE (LUN,1000)
DO I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1010)
LUN = LUNSUM
END DO
SETNO = 9
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00000
SHORT = .FALSE.
ISODR = .TRUE.
MAXIT = 1000
BETA(1:2) = (/ 200.0_R8, 7.0_R8 /)
LOWER(1:2) = (/ 1.1_R8, 0.0_R8 /)
UPPER(1:2) = (/ 200.0_R8, 5.0_R8 /)
ELSE IF (ITEST.EQ.17) THEN
C Test bounded odr problem where
C bounds are ill defined.
LUN = LUNRPT
WRITE (LUN,1000)
DO I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1010)
LUN = LUNSUM
END DO
SETNO = 9
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00000
SHORT = .FALSE.
ISODR = .TRUE.
MAXIT = 1000
BETA(1:2) = (/ 200.0_R8, 2.0_R8 /)
LOWER(1:2) = (/ 10.0_R8, 0.0_R8 /)
UPPER(1:2) = (/ 2.0_R8, 5.0_R8 /)
ELSE IF (ITEST.EQ.18) THEN
C Test bounded odr problem using centered differences where
C parameters start on bound, move away, hit bound, move away, find minimum.
LUN = LUNRPT
WRITE (LUN,1000)
DO I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1010)
LUN = LUNSUM
END DO
SETNO = 9
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00010
SHORT = .FALSE.
ISODR = .TRUE.
MAXIT = 100
BETA(1:2) = (/ 200.0_R8, 5.0_R8 /)
LOWER(1:2) = (/ 0.1_R8, 0.0_R8 /)
UPPER(1:2) = (/ 200.0_R8, 5.0_R8 /)
ELSE IF (ITEST.EQ.19) THEN
C Test bounded odr problem when bounds are too small.
C Parameters start on bound.
LUN = LUNRPT
WRITE (LUN,1000)
DO I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1010)
LUN = LUNSUM
END DO
SETNO = 9
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00010
SHORT = .FALSE.
ISODR = .TRUE.
MAXIT = 100
BETA(1:2) = (/ 200.0_R8, 5.0_R8 /)
UPPER(1) = 200.0_R8
LOWER(2) = 5.0_R8
LOWER(1) = UPPER(1) - 400*UPPER(1)*EPSMAC
& + UPPER(1)*EPSMAC
UPPER(2) = LOWER(2) + 400*LOWER(2)*EPSMAC
& - LOWER(2)*EPSMAC
ELSE IF (ITEST.EQ.20) THEN
C Test bounded odr problem when bounds are just big enough for ndigit
C calculation but too small for difference calculation.
C Parameters start on bound.
LUN = LUNRPT
WRITE (LUN,1000)
DO I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1010)
LUN = LUNSUM
END DO
SETNO = 9
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00000
SHORT = .FALSE.
ISODR = .TRUE.
MAXIT = 100
BETA(1:2) = (/ -200.0_R8, -5.0_R8 /)
UPPER(1) = -200.0_R8
LOWER(2) = -5.0_R8
LOWER(1) = UPPER(1) + 400*UPPER(1)*EPSMAC
UPPER(2) = LOWER(2) - 400*LOWER(2)*EPSMAC
ELSE IF (ITEST.EQ.21) THEN
C Test bounded odr problem when bounds are too small for derivative
C step sizes using forward differences. Parameters start on bound.
LUN = LUNRPT
WRITE (LUN,1000)
DO I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1010)
LUN = LUNSUM
END DO
SETNO = 9
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00000
SHORT = .FALSE.
ISODR = .TRUE.
MAXIT = 100
BETA(1:2) = (/ -200.0_R8, -5.0_R8 /)
UPPER(1) = -200.0_R8
LOWER(2) = -5.0_R8
LOWER(1) = UPPER(1) + UPPER(1)*EPSMAC
UPPER(2) = LOWER(2) - LOWER(2)*EPSMAC
ELSE IF (ITEST.EQ.22) THEN
C Test bounded odr problem when first parameter is fixed and second is bounded.
C However, set the bounds on the first parameter to exclude the correct value
C of the second parameter. This will exercise the packing and unpacking of
C parameters and ensure that bounds and fixed parameters can be mixed.
LUN = LUNRPT
WRITE (LUN,1000)
DO I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1010)
LUN = LUNSUM
END DO
SETNO = 10
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00010
SHORT = .FALSE.
ISODR = .TRUE.
MAXIT = 100
BETA(1:2) = (/ 2.5_R8, 1.5_R8 /)
LOWER(1:2) = (/ 2.5_R8, 1.1_R8 /)
UPPER(1:2) = (/ 10.0_R8, 5.0_R8 /)
IFIXB(1:2) = (/ 0, 1 /)
ELSE IF (ITEST.EQ.23) THEN
C Similar to test 22 but without bounds.
LUN = LUNRPT
WRITE (LUN,1000)
DO I=1,2
WRITE (LUN,1001) ITEST
WRITE (LUN,1010)
LUN = LUNSUM
END DO
SETNO = 10
CALL DODRXD(TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
CALL DZERO(LWORK,1,WORK,LWORK)
DELTA(:,:) = ZERO
JOB = 00010
SHORT = .FALSE.
ISODR = .TRUE.
MAXIT = 100
BETA(1:2) = (/ 2.5_R8, 1.5_R8 /)
LOWER(1:2) = -HUGE(1.0_R8)
UPPER(1:2) = HUGE(1.0_R8)
IFIXB(1:2) = (/ 0, 1 /)
END IF
CALL DODRXW
& (N,M,NP,NQ,LDWE1,LD2WE1,ISODR,LIWMIN,LWMIN)
C Compute solution
WRITE (LUNRPT,2200) TITLE
WRITE (LUNSUM,2200) TITLE
IF (SHORT) THEN
CALL ODR(FCN=DODRXF,
& N=N,M=M,NP=NP,NQ=NQ,
& BETA=BETA,
& Y=Y,X=X,
& DELTA=DELTA,
& WE=WE(1:LDWE1,1:LD2WE1,:),
& WD=WD(1:LDWD1,1:LD2WD1,:),
& JOB=JOB,
& IPRINT=IPRINT,LUNERR=LUNERR,LUNRPT=LUNRPT,
& WORK=WORK,IWORK=IWORK,
& INFO=INFO)
ELSE
CALL ODR(FCN=DODRXF,
& N=N,M=M,NP=NP,NQ=NQ,
& BETA=BETA,
& Y=Y,X=X,
& DELTA=DELTA,
& WE=WE(1:LDWE1,1:LD2WE1,:),
& WD=WD(1:LDWD1,1:LD2WD1,:),
& IFIXB=IFIXB,IFIXX=IFIXX(1:LDIFX,:),
& JOB=JOB,NDIGIT=NDIGIT,TAUFAC=TAUFAC,
& SSTOL=SSTOL,PARTOL=PARTOL,MAXIT=MAXIT,
& IPRINT=IPRINT,LUNERR=LUNERR,LUNRPT=LUNRPT,
& STPB=STPB,STPD=STPD(1:LDSTPD,:),
& SCLB=SCLB,SCLD=SCLD(1:LDSCLD,:),
& WORK=WORK,IWORK=IWORK,
& LOWER=LOWER(1:NP),UPPER=UPPER(1:NP),
& INFO=INFO)
END IF
C Compare results with those obtained on the cray ymp or the intel xeon running
C Linux using REAL (KIND=R8) version of ODRPACK95
BNRM = DNRM2(NP,BETA,1)
CALL DWGHT(N,M,WD,LDWD1,LD2WD1,RESHAPE(WORK(1:N*M),(/N,M/)),
& TEMPRETL(1:N,1:M))
WRK(1:N*M) = RESHAPE(TEMPRETL(1:N,1:M),(/N*M/))
WSSDEL = DDOT(N*M,WORK(1:N*M),1,WRK(1),1)
CALL DWGHT(N,NQ,WE,LDWE1,LD2WE1,
& RESHAPE(WORK(N*M+1:N*M+1+N*NQ-1),(/N,NQ/)),
& TEMPRETL(1:N,1:NQ))
WRK(N*M+1:N*M+1+N*NQ-1) = RESHAPE(TEMPRETL(1:N,1:NQ),(/N*NQ/))
WSSEPS = DDOT(N*NQ,WORK(N*M+1:N*M+1+N*NQ-1),1,
& WRK(N*M+1:N*M+1+N*NQ-1),1)
WSS = WSSEPS + WSSDEL
IF (SSTOL.LT.ZERO) THEN
SSTOL = SQRT(EPSMAC)
ELSE
SSTOL = MIN(SSTOL, ONE)
END IF
IF (PARTOL.LT.ZERO) THEN
PARTOL = EPSMAC**(TWO/THREE)
ELSE
PARTOL = MIN(PARTOL, ONE)
END IF
IF (INFO.GE.10000) THEN
IF (IDPYMP(ITEST).EQ.INFO) THEN
FAILS = .FALSE.
MSG = 1
ELSE
FAILS = .TRUE.
MSG = 3
END IF
ELSE IF (MOD(INFO,10).EQ.1) THEN
FAILS = ABS(WSS-DPYMP(2,ITEST)).GT.
& DPYMP(2,ITEST)*SSTOL*TSTTOL
MSG = 2
ELSE IF (MOD(INFO,10).EQ.2) THEN
FAILS = ABS(BNRM-DPYMP(1,ITEST)).GT.
& DPYMP(1,ITEST)*PARTOL*TSTTOL
MSG = 2
ELSE IF (MOD(INFO,10).EQ.3) THEN
FAILS = (ABS(WSS-DPYMP(2,ITEST)).GT.
& DPYMP(2,ITEST)*SSTOL*TSTTOL)
& .AND.
& (ABS(BNRM-DPYMP(1,ITEST)).GT.
& DPYMP(1,ITEST)*PARTOL*TSTTOL)
MSG = 2
ELSE IF ((MOD(INFO,10).EQ.4) .AND. (IDPYMP(ITEST).EQ.4)) THEN
FAILS = .FALSE.
MSG = 1
ELSE IF (INFO.EQ.IDPYMP(ITEST)) THEN
FAILS = .TRUE.
MSG = 4
ELSE
FAILS = .TRUE.
MSG = 3
END IF
FAILED = FAILED .OR. FAILS
LUN = LUNRPT
DO 300 L=1,2
WRITE (LUN,3100)
WRITE (LUN,3210)
& ' CRAY YMP OR X86 RESULT = ',
& DPYMP(1,ITEST),DPYMP(2,ITEST),IDPYMP(ITEST)
WRITE (LUN,3210) ' NEW TEST RESULT = ',
& BNRM,WSS,INFO
WRITE (LUN,3220) ' DIFFERENCE = ',
& ABS(DPYMP(1,ITEST)-BNRM),ABS(DPYMP(2,ITEST)-WSS)
EWRT = ABS(DPYMP(1,ITEST))
EWRT2 = ABS(DPYMP(2,ITEST))
IF (EWRT.EQ.ZERO) THEN
EWRT = ONE
END IF
IF (EWRT2.EQ.ZERO) THEN
EWRT2 = ONE
END IF
WRITE (LUN,3220) ' RELATIVE ERROR = ',
& ABS(DPYMP(1,ITEST)-BNRM)/EWRT,
& ABS(DPYMP(2,ITEST)-WSS)/EWRT2
IF (MSG.EQ.1) THEN
WRITE (LUN,3310)
ELSE IF (MSG.EQ.2) THEN
IF (FAILS) THEN
WRITE (LUN,3320)
ELSE
WRITE (LUN,3330)
END IF
ELSE IF (MSG.EQ.3) THEN
WRITE (LUN,3340)
ELSE IF (MSG.EQ.4) THEN
WRITE (LUN,3350)
END IF
LUN = LUNSUM
300 CONTINUE
400 CONTINUE
WRITE (LUNRPT,1000)
IF (FAILED) THEN
WRITE (LUNRPT,4100)
WRITE (LUNSUM,4100)
PASSED = .FALSE.
ELSE
WRITE (LUNRPT,4200)
WRITE (LUNSUM,4200)
PASSED = .TRUE.
END IF
C Format statements
1000 FORMAT('1')
1001 FORMAT(' Example ', I2/)
1010 FORMAT(' Test simple odr problem'/
& ' with analytic derivatives',
& ' using ODR.')
1020 FORMAT(' Test simple OLS problem'/
& ' with finite difference derivatives',
& ' using ODR.')
1030 FORMAT(' Test parameter fixing capabilities',
& ' for poorly scaled OLS problem'/
& ' with analytic derivatives',
& ' using ODR.')
1040 FORMAT(' Test weighting capabilities',
& ' for ODR problem'/
& ' with analytic derivatives',
& ' using ODR. '/
& ' also shows solution of poorly scaled',
& ' ODR problem.'/
& ' (derivative checking turned off.)')
1050 FORMAT(' Test DELTA initialization capabilities'/
& ' and use of ISTOP to restrict parameter values',
& ' for ODR problem'/
& ' with analytic derivatives',
& ' using ODR.')
1060 FORMAT(' Test stiff stopping conditions',
& ' for unscaled ODR problem'/
& ' with analytic derivatives',
& ' using ODR.')
1070 FORMAT(' Test restart',
& ' for unscaled ODR problem'/
& ' with analytic derivatives',
& ' using ODR.')
1080 FORMAT(' Test use of TAUFAC to restrict first step',
& ' for ODR problem'/
& ' with finite difference derivatives',
& ' using ODR.')
1090 FORMAT(' Test implicit model',
& ' for OLS problem'/
& ' using ODR.')
1100 FORMAT(' Test multiresponse model',
& ' for ODR problem'/
& ' with finite difference derivatives',
& ' using ODR.')
1110 FORMAT(' Test detection of questionable analytic derivatives',
& ' for OLS problem'/
& ' using ODR.')
1120 FORMAT(' Test detection of incorrect analytic derivatives',
& ' for ODR problem'/
& ' with analytic derivatives',
& ' using ODR.')
2200 FORMAT (' Data Set Reference: ', A80)
3100 FORMAT
& (/' Comparison of new results with',
& ' REAL (KIND=R8) Cray YMP or Intel X86 (Linux) '/
& ' Result:'//
& ' Norm of BETA',
& ' Sum of Squared WTD OBS Errors INFO')
3210 FORMAT
& (/A25/1P,2E37.30,I6)
3220 FORMAT
& (/A25,1P,D12.5,25X,D12.5,I6)
3310 FORMAT
& (/' *** Stopping conditions',
& ' show convergence not attained. ***'/
& ' no further comparisons made between results.'//)
3320 FORMAT
& (//' *** WARNING ***',
& ' results do not agree to within stopping tolerance. ***'//)
3330 FORMAT
& (//' *** Results agree to within stopping tolerance. ***'//)
3340 FORMAT
& (//' *** WARNING ***',
& ' stopping conditions do not agree. ***'//)
3350 FORMAT
& (//' *** WARNING ***',
& ' unexpected stopping condition.',
& ' please contact package authors. ***'//)
4100 FORMAT
& (///
& ' *** Summary:',
& ' one or more tests do not agree with expected results. ***')
4200 FORMAT
& (///
& ' *** Summary:',
& ' all tests agree with expected results. ***')
END
*DODRXD
SUBROUTINE DODRXD
& (TITLE,N,M,NP,NQ,LDX,X,LDY,Y,BETA)
C***Begin Prologue DODRXD
C***Refer to ODR
C***Routines Called (NONE)
C***Date Written 860529 (YYMMDD)
C***Revision Date 920619 (YYMMDD)
C***Purpose Set up data for ODRPACK95 exerciser
C***End Prologue DODRXD
C...Used modules
USE REAL_PRECISION
C...Parameters
INTEGER
& MAXN,MAXM,MAXNP,MAXNQ,MAXSET
PARAMETER
& (MAXN=50,MAXM=3,MAXNP=10,MAXNQ=3,MAXSET=16)
C...Scalar arguments
INTEGER
& LDX,LDY,M,N,NP,NQ
CHARACTER TITLE*80
C...Array arguments
REAL (KIND=R8)
& BETA(*),X(LDX,*),Y(LDY,*)
C...Scalars in common
INTEGER
& SETNO
C...Local scalars
INTEGER
& I,J,K,L
C...Local arrays
REAL (KIND=R8)
& BDATA(MAXNP,MAXSET),XDATA(MAXN,MAXM,MAXSET),
& YDATA(MAXN,MAXNQ,MAXSET)
INTEGER
& MDATA(MAXSET),NDATA(MAXSET),NPDATA(MAXSET),NQDATA(MAXSET)
CHARACTER TDATA(MAXSET)*80
C...Common blocks
COMMON /SETID/SETNO
C...Data statements
DATA
& TDATA(1)
& /' BOGGS, BYRD AND SCHNABEL, 1985, EXAMPLE 1'/
DATA
& NDATA(1), MDATA(1), NPDATA(1), NQDATA(1)
& /40, 1, 2, 1/
DATA
& (BDATA(K,1),K=1,2)
& /1.0E+0_R8, 1.0E+0_R8/
DATA
& YDATA( 1,1,1), XDATA( 1,1,1)
& /-0.119569795672791172E+1_R8, -0.213701920211315155E-1_R8/
DATA
& YDATA( 2,1,1), XDATA( 2,1,1)
& /-0.128023349509594288E+1_R8, 0.494813247025012969E-1_R8/
DATA
& YDATA( 3,1,1), XDATA( 3,1,1)
& /-0.125270693343174591E+1_R8, 0.127889194935560226E+0_R8/
DATA
& YDATA( 4,1,1), XDATA( 4,1,1)
& /-0.996698267935287383E+0_R8, 0.128615394085645676E+0_R8/
DATA
& YDATA( 5,1,1), XDATA( 5,1,1)
& /-0.104681033065801934E+1_R8, 0.232544285655021667E+0_R8/
DATA
& YDATA( 6,1,1), XDATA( 6,1,1)
& /-0.146724952092847308E+1_R8, 0.268151108026504516E+0_R8/
DATA
& YDATA( 7,1,1), XDATA( 7,1,1)
& /-0.123366891873487528E+1_R8, 0.309041029810905456E+0_R8/
DATA
& YDATA( 8,1,1), XDATA( 8,1,1)
& /-0.165665097907185554E+1_R8, 0.405991539210081099E+0_R8/
DATA
& YDATA( 9,1,1), XDATA( 9,1,1)
& /-0.168476460930907119E+1_R8, 0.376611424833536147E+0_R8/
DATA
& YDATA(10,1,1), XDATA(10,1,1)
& /-0.198571971169224491E+1_R8, 0.475875890851020811E+0_R8/
DATA
& YDATA(11,1,1), XDATA(11,1,1)
& /-0.195691696638051344E+1_R8, 0.499246935397386550E+0_R8/
DATA
& YDATA(12,1,1), XDATA(12,1,1)
& /-0.211871342665769836E+1_R8, 0.536615037024021147E+0_R8/
DATA
& YDATA(13,1,1), XDATA(13,1,1)
& /-0.268642932558671020E+1_R8, 0.581830765902996060E+0_R8/
DATA
& YDATA(14,1,1), XDATA(14,1,1)
& /-0.281123260058024347E+1_R8, 0.684512710422277446E+0_R8/
DATA
& YDATA(15,1,1), XDATA(15,1,1)
& /-0.328704486581785920E+1_R8, 0.660219819694757458E+0_R8/
DATA
& YDATA(16,1,1), XDATA(16,1,1)
& /-0.423062993461887032E+1_R8, 0.766990323960781092E+0_R8/
DATA
& YDATA(17,1,1), XDATA(17,1,1)
& /-0.512043906552226903E+1_R8, 0.808270426690578456E+0_R8/
DATA
& YDATA(18,1,1), XDATA(18,1,1)
& /-0.731032616379005535E+1_R8, 0.897410020083189004E+0_R8/
DATA
& YDATA(19,1,1), XDATA(19,1,1)
& /-0.109002759485608993E+2_R8, 0.959199774116277687E+0_R8/
DATA
& YDATA(20,1,1), XDATA(20,1,1)
& /-0.251810238510370206E+2_R8, 0.914675474762916558E+0_R8/
DATA
& YDATA(21,1,1), XDATA(21,1,1)
& /0.100123028650879944E+3_R8, 0.997759691476821892E+0_R8/
DATA
& YDATA(22,1,1), XDATA(22,1,1)
& /0.168225085871915048E+2_R8, 0.107136870384216308E+1_R8/
DATA
& YDATA(23,1,1), XDATA(23,1,1)
& /0.894830510866913009E+1_R8, 0.108033321037888526E+1_R8/
DATA
& YDATA(24,1,1), XDATA(24,1,1)
& /0.645853815227747004E+1_R8, 0.116064198672771453E+1_R8/
DATA
& YDATA(25,1,1), XDATA(25,1,1)
& /0.498218564760117328E+1_R8, 0.119080889359116553E+1_R8/
DATA
& YDATA(26,1,1), XDATA(26,1,1)
& /0.382971664718710476E+1_R8, 0.129418875187635420E+1_R8/
DATA
& YDATA(27,1,1), XDATA(27,1,1)
& /0.344116492497344184E+1_R8, 0.135594148099422453E+1_R8/
DATA
& YDATA(28,1,1), XDATA(28,1,1)
& /0.276840496973858949E+1_R8, 0.135302808716893195E+1_R8/
DATA
& YDATA(29,1,1), XDATA(29,1,1)
& /0.259521665196956666E+1_R8, 0.137994666010141371E+1_R8/
DATA
& YDATA(30,1,1), XDATA(30,1,1)
& /0.205996022794557661E+1_R8, 0.147630019545555113E+1_R8/
DATA
& YDATA(31,1,1), XDATA(31,1,1)
& /0.197939614345337836E+1_R8, 0.153450708076357840E+1_R8/
DATA
& YDATA(32,1,1), XDATA(32,1,1)
& /0.156739340562905589E+1_R8, 0.152805351451039313E+1_R8/
DATA
& YDATA(33,1,1), XDATA(33,1,1)
& /0.159032057073028366E+1_R8, 0.157147316247224806E+1_R8/
DATA
& YDATA(34,1,1), XDATA(34,1,1)
& /0.173102268158937949E+1_R8, 0.166649596005678175E+1_R8/
DATA
& YDATA(35,1,1), XDATA(35,1,1)
& /0.155512561664824758E+1_R8, 0.166505665838718412E+1_R8/
DATA
& YDATA(36,1,1), XDATA(36,1,1)
& /0.149635994944133260E+1_R8, 0.175214128553867338E+1_R8/
DATA
& YDATA(37,1,1), XDATA(37,1,1)
& /0.147487601463073568E+1_R8, 0.180567992463707922E+1_R8/
DATA
& YDATA(38,1,1), XDATA(38,1,1)
& /0.117244575233306998E+1_R8, 0.184624404296278952E+1_R8/
DATA
& YDATA(39,1,1), XDATA(39,1,1)
& /0.910931336069172580E+0_R8, 0.195568727388978002E+1_R8/
DATA
& YDATA(40,1,1), XDATA(40,1,1)
& /0.126172980914513272E+1_R8, 0.199326394036412237E+1_R8/
DATA
& TDATA(2)
& /' BOGGS, BYRD AND SCHNABEL, 1985, EXAMPLE 2'/
DATA
& NDATA(2), MDATA(2), NPDATA(2), NQDATA(2)
& /50, 2, 3, 1/
DATA
& (BDATA(K,2),K=1,3)
& /-1.0E+0_R8, 1.0E+0_R8, 1.0E+0_R8/
DATA
& YDATA( 1,1,2), XDATA( 1,1,2), XDATA( 1,2,2)
& /0.680832777217942900E+0_R8,
& 0.625474598833994800E-1_R8, 0.110179064209783100E+0_R8/
DATA
& YDATA( 2,1,2), XDATA( 2,1,2), XDATA( 2,2,2)
& /0.122183594595302200E+1_R8,
& 0.202500343620642400E+0_R8, -0.196140862891327600E-1_R8/
DATA
& YDATA( 3,1,2), XDATA( 3,1,2), XDATA( 3,2,2)
& /0.118958678734608200E+1_R8,
& 0.164943738599876500E+0_R8, 0.166514874750996600E+0_R8/
DATA
& YDATA( 4,1,2), XDATA( 4,1,2), XDATA( 4,2,2)
& /0.146982623764094600E+1_R8,
& 0.304874137610506100E+0_R8, 0.612908688041490500E-2_R8/
DATA
& YDATA( 5,1,2), XDATA( 5,1,2), XDATA( 5,2,2)
& /0.167775338189355300E+1_R8,
& 0.532727445580665100E+0_R8, 0.938248787552444600E-1_R8/
DATA
& YDATA( 6,1,2), XDATA( 6,1,2), XDATA( 6,2,2)
& /0.202485721906026200E+1_R8,
& 0.508823707598910200E+0_R8, 0.499605775020505400E-2_R8/
DATA
& YDATA( 7,1,2), XDATA( 7,1,2), XDATA( 7,2,2)
& /0.258912851935938800E+1_R8,
& 0.704227041878554000E+0_R8, 0.819354849092326200E-1_R8/
DATA
& YDATA( 8,1,2), XDATA( 8,1,2), XDATA( 8,2,2)
& /0.366894203254154800E+1_R8,
& 0.592077736111512000E+0_R8, 0.127113960672389100E-1_R8/
DATA
& YDATA( 9,1,2), XDATA( 9,1,2), XDATA( 9,2,2)
& /0.574609583351347300E+1_R8,
& 0.104940945646421600E+1_R8, 0.258095243658316100E-1_R8/
DATA
& YDATA(10,1,2), XDATA(10,1,2), XDATA(10,2,2)
& /0.127676424026489300E+2_R8,
& 0.979382517558619200E+0_R8, 0.124280755181027900E+0_R8/
DATA
& YDATA(11,1,2), XDATA(11,1,2), XDATA(11,2,2)
& /0.123473079693623100E+1_R8,
& 0.637870453165538700E-1_R8, 0.304856401137196400E+0_R8/
DATA
& YDATA(12,1,2), XDATA(12,1,2), XDATA(12,2,2)
& /0.142256120864082800E+1_R8,
& 0.176123312906025700E+0_R8, 0.262387028078896900E+0_R8/
DATA
& YDATA(13,1,2), XDATA(13,1,2), XDATA(13,2,2)
& /0.169889534013024700E+1_R8,
& 0.310965082300263000E+0_R8, 0.226430765474758800E+0_R8/
DATA
& YDATA(14,1,2), XDATA(14,1,2), XDATA(14,2,2)
& /0.173485577901204400E+1_R8,
& 0.311394269116782100E+0_R8, 0.271375840410281800E+0_R8/
DATA
& YDATA(15,1,2), XDATA(15,1,2), XDATA(15,2,2)
& /0.277761263972834600E+1_R8,
& 0.447076126190612500E+0_R8, 0.255000858902618300E+0_R8/
DATA
& YDATA(16,1,2), XDATA(16,1,2), XDATA(16,2,2)
& /0.339163324662617300E+1_R8,
& 0.384786230998211100E+0_R8, 0.154958003178364000E+0_R8/
DATA
& YDATA(17,1,2), XDATA(17,1,2), XDATA(17,2,2)
& /0.589615137312147500E+1_R8,
& 0.649093176450780500E+0_R8, 0.258301685463773200E+0_R8/
DATA
& YDATA(18,1,2), XDATA(18,1,2), XDATA(18,2,2)
& /0.124415625214576800E+2_R8,
& 0.685612005372525500E+0_R8, 0.107391260603228600E+0_R8/
DATA
& YDATA(19,1,2), XDATA(19,1,2), XDATA(19,2,2)
& /-0.498491739153861600E+2_R8,
& 0.968747139425088400E+0_R8, 0.151932526135740700E+0_R8/
DATA
& YDATA(20,1,2), XDATA(20,1,2), XDATA(20,2,2)
& /-0.832795509000618600E+1_R8,
& 0.869789367989532900E+0_R8, 0.625507500586400000E-1_R8/
DATA
& YDATA(21,1,2), XDATA(21,1,2), XDATA(21,2,2)
& /0.184934617774239900E+1_R8,
& -0.465309930332736600E-2_R8, 0.546795662595375200E+0_R8/
DATA
& YDATA(22,1,2), XDATA(22,1,2), XDATA(22,2,2)
& /0.175192979176839200E+1_R8,
& 0.604753397196646000E-2_R8, 0.230905749473922700E+0_R8/
DATA
& YDATA(23,1,2), XDATA(23,1,2), XDATA(23,2,2)
& /0.253949381238535800E+1_R8,
& 0.239418809621756000E+0_R8, 0.190752069681170700E+0_R8/
DATA
& YDATA(24,1,2), XDATA(24,1,2), XDATA(24,2,2)
& /0.373500774928501700E+1_R8,
& 0.456662468911699800E+0_R8, 0.328870615170984400E+0_R8/
DATA
& YDATA(25,1,2), XDATA(25,1,2), XDATA(25,2,2)
& /0.548408128950331000E+1_R8,
& 0.371115320522079500E+0_R8, 0.439978556640660500E+0_R8/
DATA
& YDATA(26,1,2), XDATA(26,1,2), XDATA(26,2,2)
& /0.125256880521774300E+2_R8,
& 0.586442107042503000E+0_R8, 0.490689043752286700E+0_R8/
DATA
& YDATA(27,1,2), XDATA(27,1,2), XDATA(27,2,2)
& /-0.493587797164916600E+2_R8,
& 0.579796274973298000E+0_R8, 0.521860998203383100E+0_R8/
DATA
& YDATA(28,1,2), XDATA(28,1,2), XDATA(28,2,2)
& /-0.801158974965412700E+1_R8,
& 0.805008094903899900E+0_R8, 0.292283538955391600E+0_R8/
DATA
& YDATA(29,1,2), XDATA(29,1,2), XDATA(29,2,2)
& /-0.437399487061934100E+1_R8,
& 0.637242340835710000E+0_R8, 0.402261740352486000E+0_R8/
DATA
& YDATA(30,1,2), XDATA(30,1,2), XDATA(30,2,2)
& /-0.297800103425979600E+1_R8,
& 0.982132817936118700E+0_R8, 0.392546836419047000E+0_R8/
DATA
& YDATA(31,1,2), XDATA(31,1,2), XDATA(31,2,2)
& /0.271811057454661300E+1_R8,
& -0.223515657121262700E-1_R8, 0.650479019708978800E+0_R8/
DATA
& YDATA(32,1,2), XDATA(32,1,2), XDATA(32,2,2)
& /0.377035865613392400E+1_R8,
& 0.136081427545033600E+0_R8, 0.753020101897661800E+0_R8/
DATA
& YDATA(33,1,2), XDATA(33,1,2), XDATA(33,2,2)
& /0.560111053917143100E+1_R8,
& 0.145367053019870600E+0_R8, 0.611153532003093100E+0_R8/
DATA
& YDATA(34,1,2), XDATA(34,1,2), XDATA(34,2,2)
& /0.128152376174926800E+2_R8,
& 0.308221919576435500E+0_R8, 0.455217283290423900E+0_R8/
DATA
& YDATA(35,1,2), XDATA(35,1,2), XDATA(35,2,2)
& /-0.498709177732467200E+2_R8,
& 0.432658769133528300E+0_R8, 0.678607663414113000E+0_R8/
DATA
& YDATA(36,1,2), XDATA(36,1,2), XDATA(36,2,2)
& /-0.815797696908314300E+1_R8,
& 0.477785501079980300E+0_R8, 0.536178207572157000E+0_R8/
DATA
& YDATA(37,1,2), XDATA(37,1,2), XDATA(37,2,2)
& /-0.440240491195158600E+1_R8,
& 0.727986827616619000E+0_R8, 0.668497920573493900E+0_R8/
DATA
& YDATA(38,1,2), XDATA(38,1,2), XDATA(38,2,2)
& /-0.276723957061767500E+1_R8,
& 0.745950385588265100E+0_R8, 0.786077589007263700E+0_R8/
DATA
& YDATA(39,1,2), XDATA(39,1,2), XDATA(39,2,2)
& /-0.223203667288734800E+1_R8,
& 0.732537503527113500E+0_R8, 0.582625164046828400E+0_R8/
DATA
& YDATA(40,1,2), XDATA(40,1,2), XDATA(40,2,2)
& /-0.169728270310622000E+1_R8,
& 0.967352361433846300E+0_R8, 0.460779396016832800E+0_R8/
DATA
& YDATA(41,1,2), XDATA(41,1,2), XDATA(41,2,2)
& /0.551015652153227000E+1_R8,
& 0.129761784310891100E-1_R8, 0.700009537931860000E+0_R8/
DATA
& YDATA(42,1,2), XDATA(42,1,2), XDATA(42,2,2)
& /0.128036180496215800E+2_R8,
& 0.170163243950629700E+0_R8, 0.853131830764348700E+0_R8/
DATA
& YDATA(43,1,2), XDATA(43,1,2), XDATA(43,2,2)
& /-0.498257683396339000E+2_R8,
& 0.162768461906274000E+0_R8, 0.865315129048175000E+0_R8/
DATA
& YDATA(44,1,2), XDATA(44,1,2), XDATA(44,2,2)
& /-0.877334550221761900E+1_R8,
& 0.222914807946165800E+0_R8, 0.797511758502094500E+0_R8/
DATA
& YDATA(45,1,2), XDATA(45,1,2), XDATA(45,2,2)
& /-0.453820192156867600E+1_R8,
& 0.402910095604624900E+0_R8, 0.761492958727023100E+0_R8/
DATA
& YDATA(46,1,2), XDATA(46,1,2), XDATA(46,2,2)
& /-0.297499315738677900E+1_R8,
& 0.233770812593443200E+0_R8, 0.896000095844223500E+0_R8/
DATA
& YDATA(47,1,2), XDATA(47,1,2), XDATA(47,2,2)
& /-0.212743255978538900E+1_R8,
& 0.646528693486914700E+0_R8, 0.968574333700755700E+0_R8/
DATA
& YDATA(48,1,2), XDATA(48,1,2), XDATA(48,2,2)
& /-0.209703205365401000E+1_R8,
& 0.802811658568969400E+0_R8, 0.904866450476711600E+0_R8/
DATA
& YDATA(49,1,2), XDATA(49,1,2), XDATA(49,2,2)
& /-0.155287292042086200E+1_R8,
& 0.837137859891222900E+0_R8, 0.835684424990021900E+0_R8/
DATA
& YDATA(50,1,2), XDATA(50,1,2), XDATA(50,2,2)
& /-0.161356673770480700E+1_R8,
& 0.103165980756526600E+1_R8, 0.793902191912346100E+0_R8/
DATA
& TDATA(3)
& /' BOGGS, BYRD AND SCHNABEL, 1985, EXAMPLE 3'/
DATA
& NDATA(3), MDATA(3), NPDATA(3), NQDATA(3)
& /44, 1, 9, 1/
DATA
& (BDATA(K,3),K=1,9)
& /0.281887509408440189E-5_R8,
& -0.231290549212363845E-2_R8, 0.583035555572801965E+1_R8,
& 0.000000000000000000E+0_R8, 0.406910776203121026E+8_R8,
& 0.138001105225000000E-2_R8, 0.596038513209999999E-1_R8,
& 0.670582099359999998E+1_R8, 0.106994410000000000E+10_R8/
DATA
& YDATA( 1,1,3), XDATA( 1,1,3)
& /0.988227696721327788E+0_R8, 0.25E-8_R8/
DATA
& YDATA( 2,1,3), XDATA( 2,1,3)
& /0.988268083998559958E+0_R8, 0.64E-8_R8/
DATA
& YDATA( 3,1,3), XDATA( 3,1,3)
& /0.988341022958438831E+0_R8, 1.0E-8_R8/
DATA
& YDATA( 4,1,3), XDATA( 4,1,3)
& /0.988380557606306446E+0_R8, 0.9E-7_R8/
DATA
& YDATA( 5,1,3), XDATA( 5,1,3)
& /0.988275062411751338E+0_R8, 1.0E-6_R8/
DATA
& YDATA( 6,1,3), XDATA( 6,1,3)
& /0.988326680176446987E+0_R8, 0.4E-5_R8/
DATA
& YDATA( 7,1,3), XDATA( 7,1,3)
& /0.988306058860433439E+0_R8, 0.9E-5_R8/
DATA
& YDATA( 8,1,3), XDATA( 8,1,3)
& /0.988292880079125555E+0_R8, 0.16E-4_R8/
DATA
& YDATA( 9,1,3), XDATA( 9,1,3)
& /0.988305279259496905E+0_R8, 0.36E-4_R8/
DATA
& YDATA(10,1,3), XDATA(10,1,3)
& /0.988278142019574202E+0_R8, 0.64E-4_R8/
DATA
& YDATA(11,1,3), XDATA(11,1,3)
& /0.988224953369819946E+0_R8, 1.0E-4_R8/
DATA
& YDATA(12,1,3), XDATA(12,1,3)
& /0.988111989169778223E+0_R8, 0.144E-3_R8/
DATA
& YDATA(13,1,3), XDATA(13,1,3)
& /0.988045627103840613E+0_R8, 0.225E-3_R8/
DATA
& YDATA(14,1,3), XDATA(14,1,3)
& /0.987913715667047655E+0_R8, 0.400E-3_R8/
DATA
& YDATA(15,1,3), XDATA(15,1,3)
& /0.987841994238525678E+0_R8, 0.625E-3_R8/
DATA
& YDATA(16,1,3), XDATA(16,1,3)
& /0.987638450432434270E+0_R8, 0.900E-3_R8/
DATA
& YDATA(17,1,3), XDATA(17,1,3)
& /0.987587364331771395E+0_R8, 0.1225E-2_R8/
DATA
& YDATA(18,1,3), XDATA(18,1,3)
& /0.987576264149633684E+0_R8, 0.1600E-2_R8/
DATA
& YDATA(19,1,3), XDATA(19,1,3)
& /0.987539209110983643E+0_R8, 0.2025E-2_R8/
DATA
& YDATA(20,1,3), XDATA(20,1,3)
& /0.987621143807705698E+0_R8, 0.25E-2_R8/
DATA
& YDATA(21,1,3), XDATA(21,1,3)
& /0.988023229785526217E+0_R8, 0.36E-2_R8/
DATA
& YDATA(22,1,3), XDATA(22,1,3)
& /0.988558376710994197E+0_R8, 0.49E-2_R8/
DATA
& YDATA(23,1,3), XDATA(23,1,3)
& /0.989304775352439885E+0_R8, 0.64E-2_R8/
DATA
& YDATA(24,1,3), XDATA(24,1,3)
& /0.990210452265710472E+0_R8, 0.81E-2_R8/
DATA
& YDATA(25,1,3), XDATA(25,1,3)
& /0.991095950592263900E+0_R8, 1.00E-2_R8/
DATA
& YDATA(26,1,3), XDATA(26,1,3)
& /0.991475677297119272E+0_R8, 0.11025E-1_R8/
DATA
& YDATA(27,1,3), XDATA(27,1,3)
& /0.991901306250746771E+0_R8, 0.12100E-1_R8/
DATA
& YDATA(28,1,3), XDATA(28,1,3)
& /0.992619222425303263E+0_R8, 0.14400E-1_R8/
DATA
& YDATA(29,1,3), XDATA(29,1,3)
& /0.993617037631973475E+0_R8, 0.16900E-1_R8/
DATA
& YDATA(30,1,3), XDATA(30,1,3)
& /0.994727321698030676E+0_R8, 0.19600E-1_R8/
DATA
& YDATA(31,1,3), XDATA(31,1,3)
& /0.996523114720326189E+0_R8, 0.25600E-1_R8/
DATA
& YDATA(32,1,3), XDATA(32,1,3)
& /0.998036909563764020E+0_R8, 0.32400E-1_R8/
DATA
& YDATA(33,1,3), XDATA(33,1,3)
& /0.999151968626971372E+0_R8, 0.40000E-1_R8/
DATA
& YDATA(34,1,3), XDATA(34,1,3)
& /0.100017083706131769E+1_R8, 0.50625E-1_R8/
DATA
& YDATA(35,1,3), XDATA(35,1,3)
& /0.100110046382923523E+1_R8, 0.75625E-1_R8/
DATA
& YDATA(36,1,3), XDATA(36,1,3)
& /0.100059103180404652E+1_R8, 0.12250E+0_R8/
DATA
& YDATA(37,1,3), XDATA(37,1,3)
& /0.999211829791257561E+0_R8, 0.16000E+0_R8/
DATA
& YDATA(38,1,3), XDATA(38,1,3)
& /0.994711451526761862E+0_R8, 0.25000E+0_R8/
DATA
& YDATA(39,1,3), XDATA(39,1,3)
& /0.989844132928847109E+0_R8, 0.33640E+0_R8/
DATA
& YDATA(40,1,3), XDATA(40,1,3)
& /0.987234104554490439E+0_R8, 0.38440E+0_R8/
DATA
& YDATA(41,1,3), XDATA(41,1,3)
& /0.980928240178404887E+0_R8, 0.49E+0_R8/
DATA
& YDATA(42,1,3), XDATA(42,1,3)
& /0.970888680366055576E+0_R8, 0.64E+0_R8/
DATA
& YDATA(43,1,3), XDATA(43,1,3)
& /0.960043769857327398E+0_R8, 0.81E+0_R8/
DATA
& YDATA(44,1,3), XDATA(44,1,3)
& /0.947277159259551068E+0_R8, 1.00E+0_R8/
DATA
& TDATA(4)
& /' HIMMELBLAU, 1970, EXAMPLE 6.2-4, PAGE 188'/
DATA
& NDATA(4), MDATA(4), NPDATA(4), NQDATA(4)
& /13, 2, 3, 1/
DATA
& (BDATA(K,4),K=1,3)
& /3.0E+0_R8, 3.0E+0_R8, -0.5E+0_R8/
DATA
& YDATA( 1,1,4), XDATA( 1,1,4), XDATA( 1,2,4)
& /2.93E+0_R8, 0.0E+0_R8, 0.0E+0_R8/
DATA
& YDATA( 2,1,4), XDATA( 2,1,4), XDATA( 2,2,4)
& /1.95E+0_R8, 0.0E+0_R8, 1.0E+0_R8/
DATA
& YDATA( 3,1,4), XDATA( 3,1,4), XDATA( 3,2,4)
& /0.81E+0_R8, 0.0E+0_R8, 2.0E+0_R8/
DATA
& YDATA( 4,1,4), XDATA( 4,1,4), XDATA( 4,2,4)
& /0.58E+0_R8, 0.0E+0_R8, 3.0E+0_R8/
DATA
& YDATA( 5,1,4), XDATA( 5,1,4), XDATA( 5,2,4)
& /5.90E+0_R8, 1.0E+0_R8, 0.0E+0_R8/
DATA
& YDATA( 6,1,4), XDATA( 6,1,4), XDATA( 6,2,4)
& /4.74E+0_R8, 1.0E+0_R8, 1.0E+0_R8/
DATA
& YDATA( 7,1,4), XDATA( 7,1,4), XDATA( 7,2,4)
& /4.18E+0_R8, 1.0E+0_R8, 2.0E+0_R8/
DATA
& YDATA( 8,1,4), XDATA( 8,1,4), XDATA( 8,2,4)
& /4.05E+0_R8, 1.0E+0_R8, 2.0E+0_R8/
DATA
& YDATA( 9,1,4), XDATA( 9,1,4), XDATA( 9,2,4)
& /9.03E+0_R8, 2.0E+0_R8, 0.0E+0_R8/
DATA
& YDATA(10,1,4), XDATA(10,1,4), XDATA(10,2,4)
& /7.85E+0_R8, 2.0E+0_R8, 1.0E+0_R8/
DATA
& YDATA(11,1,4), XDATA(11,1,4), XDATA(11,2,4)
& /7.22E+0_R8, 2.0E+0_R8, 2.0E+0_R8/
DATA
& YDATA(12,1,4), XDATA(12,1,4), XDATA(12,2,4)
& /8.50E+0_R8, 2.5E+0_R8, 2.0E+0_R8/
DATA
& YDATA(13,1,4), XDATA(13,1,4), XDATA(13,2,4)
& /9.81E+0_R8, 2.9E+0_R8, 1.8E+0_R8/
DATA
& TDATA(5)
& /' DRAPER AND SMITH, 1981, EXERCISE I, PAGE 521-522'/
DATA
& NDATA(5), MDATA(5), NPDATA(5), NQDATA(5)
& /8, 2, 2, 1/
DATA
& (BDATA(K,5),K=1,2)
& /0.01155E+0_R8, 5000.0E+0_R8/
DATA
& YDATA(1,1,5), XDATA(1,1,5), XDATA(1,2,5)
& /0.912E+0_R8, 109.0E+0_R8, 600.0E+0_R8/
DATA
& YDATA(2,1,5), XDATA(2,1,5), XDATA(2,2,5)
& /0.382E+0_R8, 65.0E+0_R8, 640.0E+0_R8/
DATA
& YDATA(3,1,5), XDATA(3,1,5), XDATA(3,2,5)
& /0.397E+0_R8, 1180.0E+0_R8, 600.0E+0_R8/
DATA
& YDATA(4,1,5), XDATA(4,1,5), XDATA(4,2,5)
& /0.376E+0_R8, 66.0E+0_R8, 640.0E+0_R8/
DATA
& YDATA(5,1,5), XDATA(5,1,5), XDATA(5,2,5)
& /0.342E+0_R8, 1270.0E+0_R8, 600.0E+0_R8/
DATA
& YDATA(6,1,5), XDATA(6,1,5), XDATA(6,2,5)
& /0.358E+0_R8, 69.0E+0_R8, 640.0E+0_R8/
DATA
& YDATA(7,1,5), XDATA(7,1,5), XDATA(7,2,5)
& /0.348E+0_R8, 1230.0E+0_R8, 600.0E+0_R8/
DATA
& YDATA(8,1,5), XDATA(8,1,5), XDATA(8,2,5)
& /0.376E+0_R8, 68.0E+0_R8, 640.0E+0_R8/
DATA
& TDATA(6)
& /' POWELL AND MACDONALD, 1972, TABLES 7 AND 8, PAGES 153-154'/
DATA
& NDATA(6), MDATA(6), NPDATA(6), NQDATA(6)
& /14, 1, 3, 1/
DATA
& (BDATA(K,6),K=1,3)
& /25.0E+0_R8, 30.0E+0_R8, 6.0E+0_R8/
DATA
& YDATA( 1,1,6), XDATA( 1,1,6)
& /26.38E+0_R8, 1.0E+0_R8/
DATA
& YDATA( 2,1,6), XDATA( 2,1,6)
& /25.79E+0_R8, 2.0E+0_R8/
DATA
& YDATA( 3,1,6), XDATA( 3,1,6)
& /25.29E+0_R8, 3.0E+0_R8/
DATA
& YDATA( 4,1,6), XDATA( 4,1,6)
& /24.86E+0_R8, 4.0E+0_R8/
DATA
& YDATA( 5,1,6), XDATA( 5,1,6)
& /24.46E+0_R8, 5.0E+0_R8/
DATA
& YDATA( 6,1,6), XDATA( 6,1,6)
& /24.10E+0_R8, 6.0E+0_R8/
DATA
& YDATA( 7,1,6), XDATA( 7,1,6)
& /23.78E+0_R8, 7.0E+0_R8/
DATA
& YDATA( 8,1,6), XDATA( 8,1,6)
& /23.50E+0_R8, 8.0E+0_R8/
DATA
& YDATA( 9,1,6), XDATA( 9,1,6)
& /23.24E+0_R8, 9.0E+0_R8/
DATA
& YDATA(10,1,6), XDATA(10,1,6)
& /23.00E+0_R8, 10.0E+0_R8/
DATA
& YDATA(11,1,6), XDATA(11,1,6)
& /22.78E+0_R8, 11.0E+0_R8/
DATA
& YDATA(12,1,6), XDATA(12,1,6)
& /22.58E+0_R8, 12.0E+0_R8/
DATA
& YDATA(13,1,6), XDATA(13,1,6)
& /22.39E+0_R8, 13.0E+0_R8/
DATA
& YDATA(14,1,6), XDATA(14,1,6)
& /22.22E+0_R8, 14.0E+0_R8/
DATA
& TDATA(7)
& /' FULLER, 1987, TABLE 3.2.10, PAGES 244-245'/
DATA
& NDATA(7), MDATA(7), NPDATA(7), NQDATA(7)
& /20, 2, 5, 1/
DATA
& (BDATA(K,7),K=1,5)
& /-1.0E+0_R8, -3.0E+0_R8, 0.09E+0_R8, 0.02E+0_R8, 0.08E+0_R8/
DATA
& YDATA( 1,1,7), XDATA( 1,1,7), XDATA( 1,2,7)
& /0.0E+0_R8, 0.50E+0_R8, -0.12E+0_R8/
DATA
& YDATA( 2,1,7), XDATA( 2,1,7), XDATA( 2,2,7)
& /0.0E+0_R8, 1.20E+0_R8, -0.60E+0_R8/
DATA
& YDATA( 3,1,7), XDATA( 3,1,7), XDATA( 3,2,7)
& /0.0E+0_R8, 1.60E+0_R8, -1.00E+0_R8/
DATA
& YDATA( 4,1,7), XDATA( 4,1,7), XDATA( 4,2,7)
& /0.0E+0_R8, 1.86E+0_R8, -1.40E+0_R8/
DATA
& YDATA( 5,1,7), XDATA( 5,1,7), XDATA( 5,2,7)
& /0.0E+0_R8, 2.12E+0_R8, -2.54E+0_R8/
DATA
& YDATA( 6,1,7), XDATA( 6,1,7), XDATA( 6,2,7)
& /0.0E+0_R8, 2.36E+0_R8, -3.36E+0_R8/
DATA
& YDATA( 7,1,7), XDATA( 7,1,7), XDATA( 7,2,7)
& /0.0E+0_R8, 2.44E+0_R8, -4.00E+0_R8/
DATA
& YDATA( 8,1,7), XDATA( 8,1,7), XDATA( 8,2,7)
& /0.0E+0_R8, 2.36E+0_R8, -4.75E+0_R8/
DATA
& YDATA( 9,1,7), XDATA( 9,1,7), XDATA( 9,2,7)
& /0.0E+0_R8, 2.06E+0_R8, -5.25E+0_R8/
DATA
& YDATA(10,1,7), XDATA(10,1,7), XDATA(10,2,7)
& /0.0E+0_R8, 1.74E+0_R8, -5.64E+0_R8/
DATA
& YDATA(11,1,7), XDATA(11,1,7), XDATA(11,2,7)
& /0.0E+0_R8, 1.34E+0_R8, -5.97E+0_R8/
DATA
& YDATA(12,1,7), XDATA(12,1,7), XDATA(12,2,7)
& /0.0E+0_R8, 0.90E+0_R8, -6.32E+0_R8/
DATA
& YDATA(13,1,7), XDATA(13,1,7), XDATA(13,2,7)
& /0.0E+0_R8, -0.28E+0_R8, -6.44E+0_R8/
DATA
& YDATA(14,1,7), XDATA(14,1,7), XDATA(14,2,7)
& /0.0E+0_R8, -0.78E+0_R8, -6.44E+0_R8/
DATA
& YDATA(15,1,7), XDATA(15,1,7), XDATA(15,2,7)
& /0.0E+0_R8, -1.36E+0_R8, -6.41E+0_R8/
DATA
& YDATA(16,1,7), XDATA(16,1,7), XDATA(16,2,7)
& /0.0E+0_R8, -1.90E+0_R8, -6.25E+0_R8/
DATA
& YDATA(17,1,7), XDATA(17,1,7), XDATA(17,2,7)
& /0.0E+0_R8, -2.50E+0_R8, -5.88E+0_R8/
DATA
& YDATA(18,1,7), XDATA(18,1,7), XDATA(18,2,7)
& /0.0E+0_R8, -2.88E+0_R8, -5.50E+0_R8/
DATA
& YDATA(19,1,7), XDATA(19,1,7), XDATA(19,2,7)
& /0.0E+0_R8, -3.18E+0_R8, -5.24E+0_R8/
DATA
& YDATA(20,1,7), XDATA(20,1,7), XDATA(20,2,7)
& /0.0E+0_R8, -3.44E+0_R8, -4.86E+0_R8/
DATA
& TDATA(8)
& /' BATES AND WATTS, 1988, TABLE A1.13, PAGES 280-281'/
DATA
& NDATA(8), MDATA(8), NPDATA(8), NQDATA(8)
& /23, 1, 5, 2/
DATA
& (BDATA(K,8),K=1,5)
& /4.0E+0_R8, 2.0E+0_R8, 7.0E+0_R8, 0.40E+0_R8, 0.50E+0_R8/
DATA
& YDATA( 1,1,8), YDATA( 1,2,8), XDATA( 1,1,8)
& /4.220E+0_R8, 0.136E+0_R8, 30.0E+0_R8/
DATA
& YDATA( 2,1,8), YDATA( 2,2,8), XDATA( 2,1,8)
& /4.167E+0_R8, 0.167E+0_R8, 50.0E+0_R8/
DATA
& YDATA( 3,1,8), YDATA( 3,2,8), XDATA( 3,1,8)
& /4.132E+0_R8, 0.188E+0_R8, 70.0E+0_R8/
DATA
& YDATA( 4,1,8), YDATA( 4,2,8), XDATA( 4,1,8)
& /4.038E+0_R8, 0.212E+0_R8, 100.0E+0_R8/
DATA
& YDATA( 5,1,8), YDATA( 5,2,8), XDATA( 5,1,8)
& /4.019E+0_R8, 0.236E+0_R8, 150.0E+0_R8/
DATA
& YDATA( 6,1,8), YDATA( 6,2,8), XDATA( 6,1,8)
& /3.956E+0_R8, 0.257E+0_R8, 200.0E+0_R8/
DATA
& YDATA( 7,1,8), YDATA( 7,2,8), XDATA( 7,1,8)
& /3.884E+0_R8, 0.276E+0_R8, 300.0E+0_R8/
DATA
& YDATA( 8,1,8), YDATA( 8,2,8), XDATA( 8,1,8)
& /3.784E+0_R8, 0.297E+0_R8, 500.0E+0_R8/
DATA
& YDATA( 9,1,8), YDATA( 9,2,8), XDATA( 9,1,8)
& /3.713E+0_R8, 0.309E+0_R8, 700.0E+0_R8/
DATA
& YDATA(10,1,8), YDATA(10,2,8), XDATA(10,1,8)
& /3.633E+0_R8, 0.311E+0_R8, 1000.0E+0_R8/
DATA
& YDATA(11,1,8), YDATA(11,2,8), XDATA(11,1,8)
& /3.540E+0_R8, 0.314E+0_R8, 1500.0E+0_R8/
DATA
& YDATA(12,1,8), YDATA(12,2,8), XDATA(12,1,8)
& /3.433E+0_R8, 0.311E+0_R8, 2000.0E+0_R8/
DATA
& YDATA(13,1,8), YDATA(13,2,8), XDATA(13,1,8)
& /3.358E+0_R8, 0.305E+0_R8, 3000.0E+0_R8/
DATA
& YDATA(14,1,8), YDATA(14,2,8), XDATA(14,1,8)
& /3.258E+0_R8, 0.289E+0_R8, 5000.0E+0_R8/
DATA
& YDATA(15,1,8), YDATA(15,2,8), XDATA(15,1,8)
& /3.193E+0_R8, 0.277E+0_R8, 7000.0E+0_R8/
DATA
& YDATA(16,1,8), YDATA(16,2,8), XDATA(16,1,8)
& /3.128E+0_R8, 0.255E+0_R8, 10000.0E+0_R8/
DATA
& YDATA(17,1,8), YDATA(17,2,8), XDATA(17,1,8)
& /3.059E+0_R8, 0.240E+0_R8, 15000.0E+0_R8/
DATA
& YDATA(18,1,8), YDATA(18,2,8), XDATA(18,1,8)
& /2.984E+0_R8, 0.218E+0_R8, 20000.0E+0_R8/
DATA
& YDATA(19,1,8), YDATA(19,2,8), XDATA(19,1,8)
& /2.934E+0_R8, 0.202E+0_R8, 30000.0E+0_R8/
DATA
& YDATA(20,1,8), YDATA(20,2,8), XDATA(20,1,8)
& /2.876E+0_R8, 0.182E+0_R8, 50000.0E+0_R8/
DATA
& YDATA(21,1,8), YDATA(21,2,8), XDATA(21,1,8)
& /2.838E+0_R8, 0.168E+0_R8, 70000.0E+0_R8/
DATA
& YDATA(22,1,8), YDATA(22,2,8), XDATA(22,1,8)
& /2.798E+0_R8, 0.153E+0_R8, 100000.0E+0_R8/
DATA
& YDATA(23,1,8), YDATA(23,2,8), XDATA(23,1,8)
& /2.759E+0_R8, 0.139E+0_R8, 150000.0E+0_R8/
DATA
& TDATA(9)
& /' ZWOLAK, WATSON, AND TYSON, 2004.'/
DATA
& NDATA(9), MDATA(9), NPDATA(9), NQDATA(9)
& /4, 1, 2, 1/
DATA
& (BDATA(K,9),K=1,2)
& /200.0_R8, 5.0_R8/
DATA
& YDATA( 1,1,9), XDATA( 1,1,9)
& /2.718281828459045_R8, 1.0_R8/
DATA
& YDATA( 2,1,9), XDATA( 2,1,9)
& /7.389056098930650_R8, 2.0_R8/
DATA
& YDATA( 3,1,9), XDATA( 3,1,9)
& /148.4131591025766_R8, 5.0_R8/
DATA
& YDATA( 4,1,9), XDATA( 4,1,9)
& /403.4287934927353_R8, 6.0_R8/
DATA
& TDATA(10)
& /' ZWOLAK, WATSON, AND TYSON, 2005.'/
DATA
& NDATA(10), MDATA(10), NPDATA(10), NQDATA(10)
& /4, 1, 2, 1/
DATA
& (BDATA(K,10),K=1,2)
& /200.0_R8, 5.0_R8/
DATA
& YDATA( 1,1,10), XDATA( 1,1,10)
& /2.718281828459045_R8, 1.0_R8/
DATA
& YDATA( 2,1,10), XDATA( 2,1,10)
& /7.389056098930650_R8, 2.0_R8/
DATA
& YDATA( 3,1,10), XDATA( 3,1,10)
& /148.4131591025766_R8, 5.0_R8/
DATA
& YDATA( 4,1,10), XDATA( 4,1,10)
& /403.4287934927353_R8, 6.0_R8/
C...Variable definitions (alphabetically)
C BDATA: The function parameter for each data set.
C BETA: The function parameters.
C I: An indexing variable.
C J: An indexing variable.
C L: An indexing variable.
C LDX: The leading dimension of array X.
C M: The number of columns of data in the explanatory variable.
C MDATA: The number of columns of data in the explanatory variable
C in each data set.
C N: The number of observations.
C NDATA: The number of observations per data set.
C NP: The number of function parameters.
C NPDATA: The number of function parameters in each data set.
C NQDATA: The number of responses per observation in each data set.
C SETNO: The number of the data set being analyzed.
C TDATA: The reference for the each of the data sets.
C TITLE: The reference for the data set being analyzed.
C X: The explanatory variables.
C XDATA: The explanatory variables for each data set.
C Y: The response variable.
C YDATA: The response variables for each data set.
C***First executable statement DODRXD
TITLE = TDATA(SETNO)
N = NDATA(SETNO)
M = MDATA(SETNO)
NP = NPDATA(SETNO)
NQ = NQDATA(SETNO)
DO 20 L=1,NQ
DO 10 I=1,N
Y(I,L) = YDATA(I,L,SETNO)
10 CONTINUE
20 CONTINUE
DO 40 J=1,M
DO 30 I=1,N
X(I,J) = XDATA(I,J,SETNO)
30 CONTINUE
40 CONTINUE
DO 50 K=1,NP
BETA(K) = BDATA(K,SETNO)
50 CONTINUE
RETURN
END
*DODRXF
SUBROUTINE DODRXF
& (N,M,NP,NQ,
& LDN,LDM,LDNP,
& BETA,XPLUSD,
& IFIXB,IFIXX,LDIFX,
& IDEVAL,F,FJACB,FJACD,
& ISTOP)
C***Begin Prologue DODRXF
C***Refer to ODR
C***Routines Called (NONE)
C***Date Written 860529 (YYMMDD)
C***Revision Date 920619 (YYMMDD)
C***Purpose Compute jacobian matricies for ODRPACK95 exerciser
C***End Prologue DODRXF
C...Used modules
USE REAL_PRECISION
C...Scalar arguments
INTEGER
& IDEVAL,ISTOP,LDIFX,LDM,LDN,LDNP,M,N,NP,NQ
C...Array arguments
REAL (KIND=R8)
& BETA(NP),F(LDN,NQ),FJACB(LDN,LDNP,NQ),FJACD(LDN,LDM,NQ),
& XPLUSD(LDN,M)
INTEGER
& IFIXB(NP),IFIXX(LDIFX,M)
C...Scalar parameters
INTEGER, PARAMETER :: MAXNP=10
C...Scalars in common
INTEGER
& SETNO
C...Arrays in common
REAL (KIND=R8)
& LOWER(MAXNP),UPPER(MAXNP)
C...Local scalars
REAL (KIND=R8)
& CTHETA,FAC1,FAC2,FAC3,FAC4,FREQ,
& OMEGA,ONE,PHI,PI,R,STHETA,THETA,ZERO
INTEGER
& I,J,K
C...Intrinsic functions
INTRINSIC
& ATAN2,COS,EXP,SIN,SQRT
C...Common blocks
COMMON /SETID/SETNO
COMMON /BOUNDS/ LOWER,UPPER
C...Data statements
DATA
& ZERO,ONE
& /0.0E0_R8,1.0E0_R8/
C...Variable definitions (alphabetically)
C BETA: Current values of parameters
C F: Predicted function values
C FAC1: A factors or terms used in computing the jacobians.
C FAC2: A factors or terms used in computing the jacobians.
C FAC3: A factors or terms used in computing the jacobians.
C FAC4: A factors or terms used in computing the jacobians.
C FJACB: Jacobian with respect to BETA
C FJACD: Jacobian with respect to errors DELTA
C IDEVAL: Indicator for selecting computation to be performed
C IFIXB: Indicators for "fixing" parameters (BETA)
C IFIXX: Indicators for "fixing" explanatory variable (X)
C LDIFX: Leading dimension of array IFIXX
C ISTOP: Stopping condition, where
C 0 means current BETA and X+DELTA were
C acceptable and values were computed successfully
C 1 means current BETA and X+DELTA are
C not acceptable; ODRPACK95 should select
C values closer to most recently used values
C -1 means current BETA and X+DELTA are
C not acceptable; ODRPACK95 should stop
C LDN: Leading dimension declarator equal or exceeding N
C LDM: Leading dimension declarator equal or exceeding M
C LDNP: Leading dimension declarator equal or exceeding NP
C M: The number of columns of data in the explanatory variable.
C N: The number of observations.
C NP: The number of function parameters.
C NQ: The number of responses per observation.
C ONE: The value 1.0E0_R8.
C SETNO: The number of the data set being analyzed.
C XPLUSD: Current value of explanatory variable, i.e., X + DELTA
C ZERO: The value 0.0E0_R8.
C***First executable statement DODRXF
C Do something with FJACD, FJACB, IFIXB and IFIXX to avoid warnings that they
C are not being used. This is simply not to worry users that the example
C program is failing.
IF (IFIXB(1) .GT. 0 .AND. IFIXX(1,1) .GT. 0
& .AND. FJACB(1,1,1) .GT. 0 .AND. FJACD(1,1,1) .GT. 0 ) THEN
C Do nothing.
END IF
C Check for BETA outside bounds. Return with error if BETA outside bounds.
IF (ANY(LOWER(1:NP).GT.BETA(1:NP))) THEN
ISTOP = -1
RETURN
END IF
IF (ANY(UPPER(1:NP).LT.BETA(1:NP))) THEN
ISTOP = -2
RETURN
END IF
IF (SETNO.EQ.1) THEN
C Setno. 1: Boggs, Byrd and Schnabel, 1985, example 1
IF (BETA(1).LE.1.01E0_R8) THEN
ISTOP = 0
IF (MOD(IDEVAL,10).NE.0) THEN
DO 100 I=1,N
F(I,1) = BETA(1)/(XPLUSD(I,1)-BETA(2))
100 CONTINUE
END IF
IF (MOD(IDEVAL/10,10).NE.0) THEN
DO 110 I=1,N
FJACB(I,1,1) = ONE/(XPLUSD(I,1)-BETA(2))
FJACB(I,2,1) = BETA(1)*(XPLUSD(I,1)-BETA(2))**(-2)
110 CONTINUE
END IF
IF (MOD(IDEVAL/100,10).NE.0) THEN
DO 120 I=1,N
FJACD(I,1,1) = -BETA(1)*(XPLUSD(I,1)-BETA(2))**(-2)
120 CONTINUE
END IF
ELSE
ISTOP = 1
END IF
ELSE IF (SETNO.EQ.2) THEN
C Setno. 2: Boggs, Byrd and Schnabel, 1985, example 2
ISTOP = 0
DO 200 I=1,N
FAC1 = (BETA(2)*XPLUSD(I,1)+BETA(3)*XPLUSD(I,2)-ONE)
IF (MOD(IDEVAL,10).NE.0) THEN
F(I,1) = BETA(1)/FAC1
END IF
IF (MOD(IDEVAL/10,10).NE.0) THEN
FJACB(I,1,1) = ONE/FAC1
FJACB(I,2,1) = -BETA(1)*(FAC1**(-2))*XPLUSD(I,1)
FJACB(I,3,1) = -BETA(1)*(FAC1**(-2))*XPLUSD(I,2)
END IF
IF (MOD(IDEVAL/100,10).NE.0) THEN
FJACD(I,1,1) = -BETA(1)*(FAC1**(-2))*BETA(2)
FJACD(I,2,1) = -BETA(1)*(FAC1**(-2))*BETA(3)
END IF
200 CONTINUE
ELSE IF (SETNO.EQ.3) THEN
C Setno. 3: Boggs, Byrd and Schnabel, 1985, example 3
ISTOP = 0
IF (MOD(IDEVAL,10).NE.0) THEN
DO 310 I=1,N
F(I,1) = ZERO
DO 300 J=1,4
F(I,1) = F(I,1) + BETA(J)/(XPLUSD(I,1)+BETA(J+5))
300 CONTINUE
F(I,1) = F(I,1) + BETA(5)
310 CONTINUE
END IF
IF (MOD(IDEVAL/10,10).NE.0) THEN
DO 330 I=1,N
FJACB(I,5,1) = ONE
DO 320 K=1,4
FJACB(I,K,1) = ONE/(XPLUSD(I,1)+BETA(K+5))
FJACB(I,K+5,1) = -BETA(K)*
& (XPLUSD(I,1)+BETA(K+5))**(-2)
320 CONTINUE
330 CONTINUE
END IF
IF (MOD(IDEVAL/100,10).NE.0) THEN
DO 350 I=1,N
FJACD(I,1,1) = ZERO
DO 340 K=4,1,-1
FJACD(I,1,1) = FJACD(I,1,1) -
& BETA(K)*(XPLUSD(I,1)+BETA(K+5))**(-2)
340 CONTINUE
350 CONTINUE
END IF
ELSE IF (SETNO.EQ.4) THEN
C Setno. 4: Himmelblau, 1970, example 6.2-4, page 188
ISTOP = 0
IF (MOD(IDEVAL,10).NE.0) THEN
DO 400 I = 1, N
F(I,1) = BETA(1)*XPLUSD(I,1) +
& BETA(2)*EXP(BETA(3)*XPLUSD(I,2))
400 CONTINUE
END IF
IF (MOD(IDEVAL/10,10).NE.0) THEN
DO 410 I=1,N
FJACB(I,1,1) = XPLUSD(I,1)
FJACB(I,2,1) = EXP(BETA(3)*XPLUSD(I,2))
FJACB(I,3,1) = BETA(2)*
& EXP(BETA(3)*XPLUSD(I,2))*XPLUSD(I,2)
410 CONTINUE
END IF
IF (MOD(IDEVAL/100,10).NE.0) THEN
DO 420 I=1,N
FJACD(I,1,1) = BETA(1)
FJACD(I,2,1) = BETA(2)*EXP(BETA(3)*XPLUSD(I,2))*BETA(3)
420 CONTINUE
END IF
ELSE IF (SETNO.EQ.5) THEN
C Setno. 5: Draper and Smith, 1981, exercise i, page 521-522
ISTOP = 0
IF (MOD(IDEVAL,10).NE.0) THEN
DO 500 I=1,N
F(I,1) = EXP(-BETA(1)*XPLUSD(I,1)*
& EXP(-BETA(2)*(ONE/XPLUSD(I,2) - ONE/620.0E0_R8)))
500 CONTINUE
END IF
IF (MOD(IDEVAL/10,10).NE.0) THEN
DO 510 I=1,N
FAC1 = ONE/XPLUSD(I,2) - ONE/620.0E0_R8
FAC2 = EXP(-BETA(2)*FAC1)
FAC3 = BETA(1)*XPLUSD(I,1)
FAC4 = EXP(-FAC3*FAC2)
FJACB(I,1,1) = -FAC4*XPLUSD(I,1)*FAC2
FJACB(I,2,1) = FAC4*FAC3*FAC2*FAC1
IF (MOD(IDEVAL/100,10).NE.0) THEN
FJACD(I,1,1) = -FAC4*BETA(1)*FAC2
FJACD(I,2,1) = -FAC4*FAC3*FAC2*
& BETA(2)/XPLUSD(I,2)**2
END IF
510 CONTINUE
END IF
ELSE IF (SETNO.EQ.6) THEN
C Setno. 6: Powell and Macdonald, 1972, tables 7 and 8, page 153-154
C N.B. this derivative is intentionally coded incorrectly
ISTOP = 0
IF (MOD(IDEVAL,10).NE.0) THEN
DO 600 I=1,N
F(I,1) = BETA(1)*
& (ONE+BETA(3)*XPLUSD(I,1)/BETA(2))**(-ONE/BETA(3))
600 CONTINUE
END IF
IF (MOD(IDEVAL/10,10).NE.0) THEN
DO 610 I=1,N
FJACB(I,1,1) = ZERO
FJACB(I,2,1) = ZERO
FJACB(I,3,1) = ZERO
IF (MOD(IDEVAL/100,10).NE.0) THEN
FJACD(I,1,1) = XPLUSD(I,1)
END IF
610 CONTINUE
END IF
ELSE IF (SETNO.EQ.7) THEN
C Setno. 7: Fuller, 1987, table 3.2.10, pages 244-245
C N.B. this derivative is intentionally coded incorrectly
ISTOP = 0
IF (MOD(IDEVAL,10).NE.0) THEN
DO 700 I=1,N
F(I,1) = BETA(3)*(XPLUSD(I,1)-BETA(1))**2 +
& 2*BETA(4)*(XPLUSD(I,1)-BETA(1))*
& (XPLUSD(I,2)-BETA(2)) +
& BETA(5)*(XPLUSD(I,2)-BETA(2))**2 - 1.0E0_R8
700 CONTINUE
END IF
IF (MOD(IDEVAL/10,10).NE.0) THEN
DO 710 I=1,N
FJACB(I,1,1) = ZERO
FJACB(I,2,1) = ZERO
FJACB(I,3,1) = ZERO
FJACB(I,4,1) = ZERO
FJACB(I,5,1) = ZERO
IF (MOD(IDEVAL/100,10).NE.0) THEN
FJACD(I,1,1) = ZERO
FJACD(I,2,1) = ZERO
END IF
710 CONTINUE
END IF
ELSE IF (SETNO.EQ.8) THEN
C Setno. 8: Bates and Watts, 1988, table A1.13, pages 280-281
C N.B. This derivative is intentionally coded incorrectly
DO 800 I=1,N
IF (XPLUSD(I,1).LT.0.0E0_R8) THEN
ISTOP = 1
RETURN
END IF
800 CONTINUE
ISTOP = 0
IF (MOD(IDEVAL,10).NE.0) THEN
PI = 3.141592653589793238462643383279E0_R8
THETA = PI*BETA(4)*0.5E0_R8
CTHETA = COS(THETA)
STHETA = SIN(THETA)
DO 810 I=1,N
FREQ = XPLUSD(I,1)
OMEGA = (2.0E0_R8*PI*FREQ*EXP(-BETA(3)))**BETA(4)
PHI = ATAN2((OMEGA*STHETA),(1+OMEGA*CTHETA))
R = (BETA(1)-BETA(2)) *
& SQRT((1+OMEGA*CTHETA)**2+(OMEGA*STHETA)**2)**
& (-BETA(5))
F(I,1) = BETA(2) + R*COS(BETA(5)*PHI)
F(I,2) = R*SIN(BETA(5)*PHI)
810 CONTINUE
END IF
IF (MOD(IDEVAL/10,10).NE.0) THEN
DO 820 I=1,N
FJACB(I,1,1) = ZERO
FJACB(I,2,1) = ZERO
FJACB(I,3,1) = ZERO
FJACB(I,4,1) = ZERO
FJACB(I,5,1) = ZERO
FJACB(I,1,2) = ZERO
FJACB(I,2,2) = ZERO
FJACB(I,3,2) = ZERO
FJACB(I,4,2) = ZERO
FJACB(I,5,2) = ZERO
IF (MOD(IDEVAL/100,10).NE.0) THEN
FJACD(I,1,1) = ZERO
FJACD(I,1,2) = ZERO
END IF
820 CONTINUE
END IF
ELSE IF (SETNO.EQ.9) THEN
C Setno. 9: Zwolak, Watson, and Tyson, 2004.
ISTOP = 0
IF (MOD(IDEVAL,10).NE.0) THEN
DO I=1,N
F(I,1) = BETA(1)*EXP(BETA(2)*XPLUSD(I,1))
END DO
END IF
IF (MOD(IDEVAL/10,10).NE.0) THEN
DO I=1,N
FJACB(I,1,1) = EXP(BETA(2)*XPLUSD(I,1))
FJACB(I,2,1) = BETA(1)*XPLUSD(I,1)*EXP(BETA(2)*
& XPLUSD(I,1))
END DO
END IF
IF (MOD(IDEVAL/100,10).NE.0) THEN
DO I=1,N
FJACD(I,1,1) = BETA(1)*BETA(2)*EXP(BETA(2)*XPLUSD(I,1))
END DO
END IF
ELSE IF (SETNO.EQ.10) THEN
C Setno. 10: Zwolak, Watson, and Tyson, 2005.
ISTOP = 0
IF (MOD(IDEVAL,10).NE.0) THEN
DO I=1,N
F(I,1) = BETA(1)/2.0_R8*EXP(BETA(2)*XPLUSD(I,1))
END DO
END IF
IF (MOD(IDEVAL/10,10).NE.0) THEN
DO I=1,N
FJACB(I,1,1) = EXP(BETA(2)*XPLUSD(I,1))/2.0_R8
FJACB(I,2,1) = BETA(1)/2.0_R8*XPLUSD(I,1)*EXP(BETA(2)*
& XPLUSD(I,1))
END DO
END IF
IF (MOD(IDEVAL/100,10).NE.0) THEN
DO I=1,N
FJACD(I,1,1) = BETA(1)/2.0_R8*BETA(2)*EXP(BETA(2)*
& XPLUSD(I,1))
END DO
END IF
END IF
RETURN
END
*DODRXW
SUBROUTINE DODRXW
& (MAXN,MAXM,MAXNP,MAXNQ,LDWE,LD2WE,ISODR,LIWMIN,LWMIN)
C***Begin Prologue DODRXW
C***Refer to ODR
C***Routines Called (NONE)
C***Date Written 890205 (YYMMDD)
C***Revision Date 920619 (YYMMDD)
C***Purpose Compute minimum lengths for work vectors
C***Routines Called NONE
C***End Prologue DODRXW
C...Used modules
USE REAL_PRECISION
C...Scalar arguments
INTEGER
& LDWE,LD2WE,LIWMIN,LWMIN,MAXN,MAXM,MAXNP,MAXNQ
LOGICAL
& ISODR
C...Variable definitions (alphabetically)
C ISODR: The variable designating whether the solution is by odr
C (ISODR=TRUE) or by ols (ISODR=FALSE).
C LDWE: The leading dimension of array WE.
C LD2WE: The second dimension of array WE.
C LIWMIN: The minimum length of vector IWORK for a given problem.
C LWMIN: The minimum length of vector WORK for a given problem.
C MAXM: The number of columns in the explanatory variable.
C MAXN: The number of observations.
C MAXNP: The number of function parameters.
C MAXNQ: The number of responses per observation.
C***First executable statement DODRXW
LIWMIN = 20+MAXNP+MAXNQ*(MAXNP+MAXM)
IF (ISODR) THEN
LWMIN = 18 + 11*MAXNP + MAXNP**2 + MAXM + MAXM**2 +
& 4*MAXN*MAXNQ + 6*MAXN*MAXM + 2*MAXN*MAXNQ*MAXNP +
& 2*MAXN*MAXNQ*MAXM + MAXNQ**2 +
& 5*MAXNQ + MAXNQ*(MAXNP+MAXM) + LDWE*LD2WE*MAXNQ
ELSE
LWMIN = 18 + 11*MAXNP + MAXNP**2 + MAXM + MAXM**2 +
& 4*MAXN*MAXNQ + 2*MAXN*MAXM + 2*MAXN*MAXNQ*MAXNP +
& 5*MAXNQ + MAXNQ*(MAXNP+MAXM) + LDWE*LD2WE*MAXNQ
END IF
RETURN
END