Imported Upstream version 3.0
[debian/gnuradio] / gnuradio-core / src / gen_interpolator_taps / praxis.f
1 C
2 C Copyright 2002 Free Software Foundation, Inc.
3 C
4 C This file is part of GNU Radio
5 C
6 C GNU Radio is free software; you can redistribute it and/or modify
7 C it under the terms of the GNU General Public License as published by
8 C the Free Software Foundation; either version 2, or (at your option)
9 C any later version.
10 C
11 C GNU Radio is distributed in the hope that it will be useful,
12 C but WITHOUT ANY WARRANTY; without even the implied warranty of
13 C MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 C GNU General Public License for more details.
15 C
16 C You should have received a copy of the GNU General Public License
17 C along with GNU Radio; see the file COPYING.  If not, write to
18 C the Free Software Foundation, Inc., 51 Franklin Street,
19 C Boston, MA 02110-1301, USA.
20 C
21       DOUBLE PRECISION FUNCTION PRAX2(F,INITV,NDIM,OUT)
22       DOUBLE PRECISION INITV(128),OUT(128), F
23       INTEGER NDIM
24       EXTERNAL F
25 C
26       DOUBLE PRECISION V,X,D,Q0,Q1,DMIN,EPSMCH,FX,H,QD0,QD1,QF1,
27      *   SMALL,T,XLDT,XM2,XM4,DSEED,SCBD
28 C
29       COMMON /CPRAX/ V(128,128),X(128),D(128),Q0(128),Q1(128),
30      *   DMIN,EPSMCH,FX,H,QD0,QD1,QF1,SMALL,T,XLDT,XM2,XM4,DSEED,SCBD,
31      *   N,NL,NF,LP,JPRINT,NMAX,ILLCIN,KTM,NFMAX,JRANCH
32
33 C
34       N=NDIM
35       do 10 I=1,N
36  10      X(I) = INITV(I)
37
38 C
39       call praset
40
41 C -1 produces no diagnostic output
42       jprint = -1
43       nfmax = 3000
44 C tighter tolerance
45       T=1.0D-6
46 C
47       call praxis(f)
48 C
49       do 30 I=1,N
50  30      OUT(I) = X(I)
51 C
52       prax2 = fx
53       return
54       end
55
56
57       SUBROUTINE PRASET
58 C
59 C  PRASET 1.0           JUNE 1995
60 C
61 C  SET INITIAL VALUES FOR SOME QUANTITIES USED IN SUBROUTINE PRAXIS.
62 C  THE USER CAN RESET THESE, IF DESIRED,
63 C  AFTER CALLING PRASET AND BEFORE CALLING PRAXIS.
64 C
65 C  J. P. CHANDLER, COMPUTER SCIENCE DEPARTMENT,
66 C     OKLAHOMA STATE UNIVERSITY
67 C
68 C  ON MANY MACHINES, SUBROUTINE PRAXIS WILL CAUSE UNDERFLOW AND/OR
69 C  DIVIDE CHECK WHEN COMPUTING EPSMCH**4 AND EPSMCH**(-4).
70 C  IN THAT CASE, SET EPSMCH=1.0D-9 (OR POSSIBLY EPSMCH=1.0D-8)
71 C  AFTER CALLING SUBROUTINE PRASET.
72 C
73       INTEGER N,NL,NF,LP,JPRINT,NMAX,ILLCIN,KTM,NFMAX,JRANCH
74       INTEGER J
75 C
76       DOUBLE PRECISION V,X,D,Q0,Q1,DMIN,EPSMCH,FX,H,QD0,QD1,QF1,
77      *   SMALL,T,XLDT,XM2,XM4,DSEED,SCBD
78       DOUBLE PRECISION A,B,XMID,XPLUS,RZERO,UNITR,RTWO
79 C
80       COMMON /CPRAX/ V(128,128),X(128),D(128),Q0(128),Q1(128),
81      *   DMIN,EPSMCH,FX,H,QD0,QD1,QF1,SMALL,T,XLDT,XM2,XM4,DSEED,SCBD,
82      *   N,NL,NF,LP,JPRINT,NMAX,ILLCIN,KTM,NFMAX,JRANCH
83 C
84       RZERO=0.0D0
85       UNITR=1.0D0
86       RTWO=2.0D0
87 C
88 C  NMAX IS THE DIMENSION OF THE ARRAYS V(*,*), X(*), D(*),
89 C  Q0(*), AND Q1(*).
90 C
91       NMAX=128
92 C
93 C  NFMAX IS THE MAXIMUM NUMBER OF FUNCTION EVALUATIONS PERMITTED.
94 C
95       NFMAX=100000
96 C
97 C  LP IS THE LOGICAL UNIT NUMBER FOR PRINTED OUTPUT.
98 C
99       LP=6
100 C
101 C  T IS A CONVERGENCE TOLERANCE USED IN SUBROUTINE PRAXIS.
102 C
103       T=1.0D-5
104 C
105 C  JPRINT CONTROLS PRINTED OUTPUT IN PRAXIS.
106 C
107       JPRINT=4
108 C
109 C  H IS AN ESTIMATE OF THE DISTANCE FROM THE INITIAL POINT
110 C  TO THE SOLUTION.
111 C
112       H=1.0D0
113 C
114 C  USE BISECTION TO COMPUTE THE VALUE OF EPSMCH, "MACHINE EPSILON".
115 C  EPSMCH IS THE SMALLEST FLOATING POINT (REAL OR DOUBLE PRECISION)
116 C  NUMBER WHICH, WHEN ADDED TO ONE, GIVES A RESULT GREATER THAN ONE.
117 C
118       A=RZERO
119       B=UNITR
120    10 XMID=A+(B-A)/RTWO
121       IF(XMID.LE.A .OR. XMID.GE.B) GO TO 20
122       XPLUS=UNITR+XMID
123       IF(XPLUS.GT.UNITR) THEN
124          B=XMID
125       ELSE
126          A=XMID
127       ENDIF
128       GO TO 10
129 C
130    20 EPSMCH=B
131 C
132       DO 30 J=1,NMAX
133          X(J)=RZERO
134    30 CONTINUE
135 C
136 C  JRANCH = 1 TO USE BRENT'S RANDOM,
137 C  JRANCH = 2 TO USE FUNCTION DRANDM.
138 C
139       JRANCH=1
140 C
141       CALL RANINI(4.0D0)
142 C
143 C  DSEED IS AN INITIAL SEED FOR DRANDM,
144 C  A SUBROUTINE THAT GENERATES PSEUDORANDOM NUMBERS
145 C  UNIFORMLY DISTRIBUTED ON (0,1).
146 C
147       DSEED=1234567.0D0
148 C
149 C  SCBD IS AN UPPER BOUND ON THE SCALE FACTORS IN PRAXIS.
150 C  IF THE AXES MAY BE BADLY SCALED (WHICH IS TO BE AVOIDED IF
151 C  POSSIBLE) THEN SET SCBD = 10, OTHERWISE 1.
152 C
153       SCBD=1.0D0
154 C
155 C  ILLCIN IS THE INITIAL VALUE OF ILLC,
156 C  THE FLAG THAT SIGNALS AN ILL-CONDITIONED PROBLEM.
157 C  IF THE PROBLEM IS KNOWN TO BE ILL-CONDITIONED SET ILLCIN=1,
158 C  OTHERWISE 0.
159 C
160       ILLCIN=0
161 C
162 C  KTM IS A CONVERGENCE SWITCH USED IN PRAXIS.
163 C  KTM+1 IS THE NUMBER OF ITERATIONS WITHOUT IMPROVEMENT
164 C  BEFORE THE ALGORITHM TERMINATES.
165 C  KTM=4 IS VERY CAUTIOUS.
166 C  USUALLY KTM=1 IS SATISFACTORY.
167 C
168       KTM=1
169 C
170       RETURN
171 C
172 C  END PRASET
173 C
174       END
175       SUBROUTINE PRAXIS(F)
176 C
177 C  PRAXIS 2.0        JUNE 1995
178 C
179 C  THE PRAXIS PACKAGE MINIMIZES THE FUNCTION F(X,N) OF N
180 C  VARIABLES X(1),...,X(N), USING THE PRINCIPAL AXIS METHOD.
181 C  F MUST BE A SMOOTH (CONTINUOUSLY DIFFERENTIABLE) FUNCTION.
182 C
183 C  "ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES",
184 C     RICHARD P. BRENT, PRENTICE-HALL 1973 (ISBN 0-13-022335-2),
185 C     PAGES 156-167
186 C
187 C  TRANSLATED FROM ALGOL W TO A.N.S.I. 1966 STANDARD BASIC FORTRAN
188 C     BY ROSALEE TAYLOR AND SUE PINSKI, COMPUTER SCIENCE DEPARTMENT,
189 C     OKLAHOMA STATE UNIVERSITY (DECEMBER 1973).
190 C
191 C  UPDATED TO A.N.S.I. STANDARD FORTRAN 77 BY J. P. CHANDLER
192 C     COMPUTER SCIENCE DEPARTMENT, OKLAHOMA STATE UNIVERSITY
193 C
194 C
195 C  SUBROUTINE PRAXIS CALLS SUBPROGRAMS
196 C     F, MINX, RANDOM (OR DRANDM), QUAD, MINFIT, SORT.
197 C
198 C  SUBROUTINE QUAD CALLS MINX.
199 C
200 C  SUBROUTINE MINX CALLS FLIN.
201 C
202 C  SUBROUTINE FLIN CALLS F.
203 C
204 C
205 C  INPUT QUANTITIES (SET IN THE CALLING PROGRAM)...
206 C
207 C     F        FUNCTION F(X,N) TO BE MINIMIZED
208 C
209 C     X(*)     INITIAL GUESS OF MINIMUM
210 C
211 C     N        DIMENSION OF X  (NOTE...  N MUST BE .GE. 2)
212 C
213 C     H        MAXIMUM STEP SIZE
214 C
215 C     T        TOLERANCE
216 C
217 C     EPSMCH   MACHINE PRECISION
218 C
219 C     JPRINT   PRINT SWITCH
220 C
221 C
222 C  OUTPUT QUANTITIES...
223 C
224 C     X(*)     ESTIMATED POINT OF MINIMUM
225 C
226 C     FX       VALUE OF F AT X
227 C
228 C     NL       NUMBER OF LINEAR SEARCHES
229 C
230 C     NF       NUMBER OF FUNCTION EVALUATIONS
231 C
232 C     V(*,*)   EIGENVECTORS OF A
233 C                 NEW DIRECTIONS
234 C
235 C     D(*)     EIGENVALUES OF A
236 C                 NEW D
237 C
238 C     Z(*)     SCALE FACTORS
239 C
240 C
241 C  ON ENTRY X(*) HOLDS A GUESS.  ON RETURN IT HOLDS THE ESTIMATED
242 C  POINT OF MINIMUM, WITH (HOPEFULLY)
243 C  ABS(ERROR) LESS THAN SQRT(EPSMCH)*ABS(X) + T, WHERE
244 C  EPSMCH IS THE MACHINE PRECISION, THE SMALLEST NUMBER SUCH THAT
245 C  (1 + EPSMCH) IS GREATER THAN 1.
246 C
247 C  T IS A TOLERANCE.
248 C
249 C  H IS THE MAXIMUM STEP SIZE, SET TO ABOUT THE MAXIMUM EXPECTED
250 C  DISTANCE FROM THE GUESS TO THE MINIMUM.  IF H IS SET TOO
251 C  SMALL OR TOO LARGE THEN THE INITIAL RATE OF CONVERGENCE WILL
252 C  BE SLOW.
253 C
254 C  THE USER SHOULD OBSERVE THE COMMENT ON HEURISTIC NUMBERS
255 C  AT THE BEGINNING OF THE SUBROUTINE.
256 C
257 C  JPRINT CONTROLS THE PRINTING OF INTERMEDIATE RESULTS.
258 C  IT USES SUBROUTINES FLIN, MINX, QUAD, SORT, AND MINFIT.
259 C  IF JPRINT = 1, F IS PRINTED AFTER EVERY N+1 OR N+2 LINEAR
260 C  MINIMIZATIONS, AND FINAL X IS PRINTED, BUT INTERMEDIATE
261 C  X ONLY IF N IS LESS THAN OR EQUAL TO 4.
262 C  IF JPRINT = 2, EIGENVALUES OF A AND SCALE FACTORS ARE ALSO PRINTED.
263 C  IF JPRINT = 3, F AND X ARE PRINTED AFTER EVERY FEW LINEAR
264 C  MINIMIZATIONS.
265 C  IF JPRINT = 4, EIGENVECTORS ARE ALSO PRINTED.
266 C  IF JPRINT = 5, ADDITIONAL DEBUGGING INFORMATION IS ALSO PRINTED.
267 C
268 C  RANDOM RETURNS A RANDOM NUMBER UNIFORMLY DISTRIBUTED IN (0, 1).
269 C
270 C  THIS SUBROUTINE IS MACHINE-INDEPENDENT, APART FROM THE
271 C  SPECIFICATION OF EPSMCH.  WE ASSUME THAT EPSMCH**(-4) DOES NOT
272 C  OVERFLOW (IF IT DOES THEN EPSMCH MUST BE INCREASED), AND THAT ON
273 C  FLOATING-POINT UNDERFLOW THE RESULT IS SET TO ZERO.
274 C
275       INTEGER N,NL,NF,LP,JPRINT,NMAX,ILLCIN,KTM,NFMAX,JRANCH
276       INTEGER ILLC,I,IK,IM,IMU,J,K,KL,KM1,KT,K2
277 C
278       DOUBLE PRECISION V,X,D,Q0,Q1,DMIN,EPSMCH,FX,H,QD0,QD1,QF1,
279      *   SMALL,T,XLDT,XM2,XM4,DSEED,SCBD
280       DOUBLE PRECISION F,   Y,Z,E,   DABS,DSQRT,ZABS,ZSQRT,DRANDM,
281      *   HUNDRD,HUNDTH,ONE,PT9,RHALF,TEN,TENTH,TWO,ZERO,
282      *   DF,DLDFAC,DN,F1,XF,XL,T2,RANVAL,ARG,
283      *   VLARGE,VSMALL,XLARGE,XLDS,FXVALU,F1VALU,S,SF,SL
284 C
285       EXTERNAL F
286 C
287       DIMENSION Y(128),Z(128),E(128)
288 C
289       COMMON /CPRAX/ V(128,128),X(128),D(128),Q0(128),Q1(128),
290      *   DMIN,EPSMCH,FX,H,QD0,QD1,QF1,SMALL,T,XLDT,XM2,XM4,DSEED,SCBD,
291      *   N,NL,NF,LP,JPRINT,NMAX,ILLCIN,KTM,NFMAX,JRANCH
292 C
293       ZABS(ARG)=DABS(ARG)
294       ZSQRT(ARG)=DSQRT(ARG)
295 C
296 C  INITIALIZATION...
297 C
298       RHALF=0.5D0
299       ONE=1.0D0
300       TENTH=0.1D0
301       HUNDTH=0.01D0
302       HUNDRD=100.0D0
303       ZERO=0.0D0
304       PT9=0.9D0
305       TEN=10.0D0
306       TWO=2.0D0
307 C
308 C  MACHINE DEPENDENT NUMBERS...
309 C
310 C  ON MANY COMPUTERS, VSMALL WILL UNDERFLOW,
311 C  AND COMPUTING XLARGE MAY CAUSE A DIVISION BY ZERO.
312 C  IN THAT CASE, EPSMCH SHOULD BE SET EQUAL TO 1.0D-9
313 C  (OR POSSIBLY 1.0D-8) BEFORE CALLING PRAXIS.
314 C
315       SMALL=EPSMCH*EPSMCH
316       VSMALL=SMALL*SMALL
317       XLARGE=ONE/SMALL
318       VLARGE=ONE/VSMALL
319       XM2=ZSQRT(EPSMCH)
320       XM4=ZSQRT(XM2)
321 C
322 C  HEURISTIC NUMBERS...
323 C
324 C  IF THE AXES MAY BE BADLY SCALED (WHICH IS TO BE AVOIDED IF
325 C  POSSIBLE) THEN SET SCBD = 10, OTHERWISE 1.
326 C
327 C  IF THE PROBLEM IS KNOWN TO BE ILL-CONDITIONED SET ILLC = 1,
328 C  OTHERWISE 0.
329 C
330 C  KTM+1 IS THE NUMBER OF ITERATIONS WITHOUT IMPROVEMENT
331 C  BEFORE THE ALGORITHM TERMINATES.
332 C  KTM=4 IS VERY CAUTIOUS.
333 C  USUALLY KTM=1 IS SATISFACTORY.
334 C
335 C  BRENT RECOMMENDED THE FOLLOWING VALUES FOR MOST PROBLEMS...
336 C
337 C                    SCBD=1.0
338 C                    ILLC=0
339 C                    KTM=1
340 C
341 C  SCBD, ILLCIN, AND KTM ARE NOW IN COMMON.
342 C  THEY ARE INITIALIZED IN SUBROUTINE PRASET,
343 C  AND CAN BE RESET BY THE USER AFTER CALLING PRASET.
344 C
345       ILLC=ILLCIN
346 C
347       IF(ILLC.EQ.1) THEN
348          DLDFAC=TENTH
349       ELSE
350          DLDFAC=HUNDTH
351       ENDIF
352 C
353       KT=0
354       NL=0
355       NF=1
356       FX=F(X,N)
357       QF1=FX
358       T=SMALL+ZABS(T)
359       T2=T
360       DMIN=SMALL
361       IF(H.LT.HUNDRD*T) H=HUNDRD*T
362       XLDT=H
363 C
364       DO 20 I=1,N
365          DO 10 J=1,N
366             V(I,J)=ZERO
367    10    CONTINUE
368          V(I,I)=ONE
369    20 CONTINUE
370 C
371       QD0=ZERO
372       D(1)=ZERO
373 C
374 C  Q0(*) AND Q1(*) ARE PREVIOUS X(*) POINTS,
375 C  INITIALIZED IN PRAXIS, USED IN FLIN,
376 C  AND CHANGED IN QUAD.
377 C
378       DO 30 I=1,N
379          Q1(I)=X(I)
380 C
381 C  Q0(*) WAS NOT INITIALIZED IN BRENT'S ALGOL PROCEDURE.
382 C
383          Q0(I)=X(I)
384    30 CONTINUE
385 C
386       IF(JPRINT.GT.0) THEN
387          WRITE(LP,40)NL,NF,FX
388    40    FORMAT(/' NL =',I10,5X,'NF =',I10/5X,'FX =',1PG15.7)
389 C
390          IF(N.LE.4 .OR. JPRINT.GT.2) THEN
391             WRITE(LP,50)(X(I),I=1,N)
392    50       FORMAT(/8X,'X'/(1X,1PG15.7,4G15.7))
393          ENDIF
394       ENDIF
395 C
396 C  MAIN LOOP...
397 C  LABEL L0...
398 C
399    60 SF=D(1)
400       S=ZERO
401       D(1)=ZERO
402 C
403 C  MINIMIZE ALONG THE FIRST DIRECTION.
404 C
405       IF(JPRINT.GE.5) WRITE(LP,70)D(1),S,FX
406    70 FORMAT(/' CALL NO. 1 TO MINX.'/
407      *   5X,'D(1) =',1PG15.7,5X,'S =',G15.7,5X,'FX =',G15.7)
408 C
409       FXVALU=FX
410       CALL MINX(1,2,D(1),S,FXVALU,0,F)
411 C
412       IF(S.LE.ZERO) THEN
413          DO 80 I=1,N
414             V(I,1)=-V(I,1)
415    80    CONTINUE
416       ENDIF
417 C
418       IF(SF.LE.PT9*D(1) .OR. PT9*SF.GE.D(1)) THEN
419 C
420          IF(N.GE.2) THEN
421             DO 90 I=2,N
422                D(I)=ZERO
423    90       CONTINUE
424          ENDIF
425 C
426       ENDIF
427 C
428       IF(N.LT.2) GO TO 320
429       DO 310 K=2,N
430 C
431          DO 100 I=1,N
432             Y(I)=X(I)
433   100    CONTINUE
434 C
435          SF=FX
436          IF(KT.GT.0) ILLC=1
437 C
438 C  LABEL L1...
439 C
440   110    KL=K
441          DF=ZERO
442 C
443          IF(ILLC.EQ.1) THEN
444 C
445 C  TAKE A RANDOM STEP TO GET OUT OF A RESOLUTION VALLEY.
446 C
447 C  PRAXIS ASSUMES THAT RANDOM (OR DRANDM) RETURNS
448 C  A PSEUDORANDOM NUMBER UNIFORMLY DISTRIBUTED IN (0,1),
449 C  AND THAT ANY INITIALIZATION OF THE RANDOM NUMBER GENERATOR
450 C  HAS ALREADY BEEN DONE.
451 C
452             DO 130 I=1,N
453 C
454                IF(JRANCH.EQ.1) THEN
455                   CALL RANDOM(RANVAL)
456                ELSE
457                   RANVAL=DRANDM(DSEED)
458                ENDIF
459 C
460                S=(TENTH*XLDT+T2*TEN**KT)*(RANVAL-RHALF)
461                Z(I)=S
462 C
463                DO 120 J=1,N
464                   X(J)=X(J)+S*V(J,I)
465   120          CONTINUE
466   130       CONTINUE
467 C
468             FX=F(X,N)
469             NF=NF+1
470 C
471             IF(JPRINT.GE.1) WRITE(LP,140)NF,SF,FX
472   140       FORMAT(/' *****  RANDOM STEP IN PRAXIS.   NF =',I11/
473      *         5X,'SF =',1PG15.7,5X,'FX =',G15.7)
474          ENDIF
475 C
476          IF(K.GT.N) GO TO 170
477          DO 160 K2=K,N
478             SL=FX
479             S=ZERO
480 C
481 C  MINIMIZE ALONG NON-CONJUGATE DIRECTIONS.
482 C
483             IF(JPRINT.GE.5) WRITE(LP,150)K2,D(K2),S,FX
484   150       FORMAT(/' CALL NO. 2 TO MINX.'/
485      *         5X,'K2 =',I4,5X,'D(K2) =',1PG15.7,5X,
486      *         'S =',G15.7/5X,'FX =',G15.7)
487 C
488             FXVALU=FX
489             CALL MINX(K2,2,D(K2),S,FXVALU,0,F)
490 C
491             IF(ILLC.EQ.1) THEN
492                S=D(K2)*(S+Z(K2))**2
493             ELSE
494                S=SL-FX
495             ENDIF
496 C
497             IF(DF.LT.S) THEN
498                DF=S
499                KL=K2
500             ENDIF
501   160    CONTINUE
502 C
503   170    IF(ILLC.EQ.0 .AND. DF.LT.ZABS(HUNDRD*EPSMCH*FX)) THEN
504 C
505 C  NO SUCCESS WITH ILLC=0, SO TRY ONCE WITH ILLC=1 .
506 C
507             ILLC=1
508 C
509 C  GO TO L1.
510 C
511             GO TO 110
512          ENDIF
513 C
514          IF(K.EQ.2 .AND. JPRINT.GT.1) THEN
515             WRITE(LP,180)(D(I),I=1,N)
516   180       FORMAT(/' NEW D'/(1X,1PG15.7,4G15.7))
517          ENDIF
518 C
519          KM1=K-1
520          IF(KM1.LT.1) GO TO 210
521          DO 200 K2=1,KM1
522 C
523 C  MINIMIZE ALONG CONJUGATE DIRECTIONS.
524 C
525             IF(JPRINT.GE.5) WRITE(LP,190)K2,D(K2),S,FX
526   190       FORMAT(/' CALL NO. 3 TO MINX.'/
527      *         5X,'K2 =',I4,5X,'D(K2) =',1PG15.7,5X,
528      *         'S =',G15.7/5X,'FX =',G15.7)
529 C
530             S=ZERO
531             FXVALU=FX
532             CALL MINX(K2,2,D(K2),S,FXVALU,0,F)
533   200    CONTINUE
534 C
535   210    F1=FX
536          FX=SF
537 C
538          XLDS=ZERO
539          DO 220 I=1,N
540             SL=X(I)
541             X(I)=Y(I)
542             SL=SL-Y(I)
543             Y(I)=SL
544             XLDS=XLDS+SL*SL
545   220    CONTINUE
546 C
547          XLDS=ZSQRT(XLDS)
548          IF(XLDS.GT.SMALL) THEN
549 C
550 C  THROW AWAY THE DIRECTION KL AND MINIMIZE ALONG
551 C  THE NEW CONJUGATE DIRECTION.
552 C
553             IK=KL-1
554             IF(K.GT.IK) GO TO 250
555             DO 240 IM=K,IK
556                I=IK-IM+K
557 C
558                DO 230 J=1,N
559                   V(J,I+1)=V(J,I)
560   230          CONTINUE
561 C
562                D(I+1)=D(I)
563   240       CONTINUE
564 C
565   250       D(K)=ZERO
566 C
567             DO 260 I=1,N
568                V(I,K)=Y(I)/XLDS
569   260       CONTINUE
570 C
571             IF(JPRINT.GE.5) WRITE(LP,270)K,D(K),XLDS,F1
572   270       FORMAT(/' CALL NO. 4 TO MINX.'/
573      *         5X,'K =',I4,5X,'D(K) =',1PG15.7,5X,
574      *         'XLDS =',G15.7/5X,'F1 =',G15.7)
575 C
576             F1VALU=F1
577             CALL MINX(K,4,D(K),XLDS,F1VALU,1,F)
578 C
579             IF(XLDS.LE.ZERO) THEN
580                XLDS=-XLDS
581 C
582                DO 280 I=1,N
583                   V(I,K)=-V(I,K)
584   280          CONTINUE
585             ENDIF
586          ENDIF
587 C
588          XLDT=DLDFAC*XLDT
589          IF(XLDT.LT.XLDS) XLDT=XLDS
590 C
591          IF(JPRINT.GT.0) THEN
592             WRITE(LP,40)NL,NF,FX
593             IF(N.LE.4 .OR. JPRINT.GT.2) THEN
594                WRITE(LP,50)(X(I),I=1,N)
595             ENDIF
596          ENDIF
597 C
598          T2=ZERO
599          DO 290 I=1,N
600             T2=T2+X(I)**2
601   290    CONTINUE
602          T2=XM2*ZSQRT(T2)+T
603 C
604 C  SEE IF THE STEP LENGTH EXCEEDS HALF THE TOLERANCE.
605 C
606          IF(XLDT.GT.RHALF*T2) THEN
607             KT=0
608          ELSE
609             KT=KT+1
610          ENDIF
611 C
612 C  IF(...) GO TO L2
613 C
614          IF(KT.GT.KTM) GO TO 550
615 C
616          IF(NF.GE.NFMAX) THEN
617             WRITE(LP,300)NFMAX
618   300       FORMAT(/' IN PRAXIS, NF REACHED THE LIMIT NFMAX =',I11/
619      *         5X,'THIS IS AN ABNORMAL TERMINATION.'/
620      *         5X,'THE FUNCTION HAS NOT BEEN MINIMIZED AND',
621      *         ' THE RESULTING X(*) VECTOR SHOULD NOT BE USED.')
622             GO TO 550
623          ENDIF
624 C
625   310 CONTINUE
626 C
627 C  TRY QUADRATIC EXTRAPOLATION IN CASE WE ARE STUCK IN A CURVED VALLEY.
628 C
629   320 CALL QUAD(F)
630 C
631       DN=ZERO
632       DO 330 I=1,N
633          D(I)=ONE/ZSQRT(D(I))
634          IF(DN.LT.D(I)) DN=D(I)
635   330 CONTINUE
636 C
637       IF(JPRINT.GT.3) THEN
638 C
639          WRITE(LP,340)
640   340    FORMAT(/' NEW DIRECTIONS')
641 C
642          DO 360 I=1,N
643             WRITE(LP,350)I,(V(I,J),J=1,N)
644   350       FORMAT(1X,I5,4X,1PG15.7,4G15.7/(10X,5G15.7))
645   360    CONTINUE
646       ENDIF
647 C
648       DO 380 J=1,N
649 C
650          S=D(J)/DN
651          DO 370 I=1,N
652             V(I,J)=S*V(I,J)
653   370    CONTINUE
654   380 CONTINUE
655 C
656       IF(SCBD.GT.ONE) THEN
657 C
658 C  SCALE THE AXES TO TRY TO REDUCE THE CONDITION NUMBER.
659 C
660          S=VLARGE
661          DO 400 I=1,N
662 C
663             SL=ZERO
664             DO 390 J=1,N
665                SL=SL+V(I,J)**2
666   390       CONTINUE
667 C
668             Z(I)=ZSQRT(SL)
669             IF(Z(I).LT.XM4) Z(I)=XM4
670             IF(S.GT.Z(I)) S=Z(I)
671   400    CONTINUE
672 C
673          DO 410 I=1,N
674             SL=S/Z(I)
675             Z(I)=ONE/SL
676 C
677             IF(Z(I).GT.SCBD) THEN
678                SL=ONE/SCBD
679                Z(I)=SCBD
680             ENDIF
681 C
682 C  IT APPEARS THAT THERE ARE TWO MISSING END; STATEMENTS
683 C  AT THIS POINT IN BRENT'S LISTING.
684 C
685   410    CONTINUE
686       ENDIF
687 C
688 C  TRANSPOSE V FOR MINFIT.
689 C
690       IF(N.LT.2) GO TO 440
691       DO 430 I=2,N
692 C
693          IMU=I-1
694          DO 420 J=1,IMU
695             S=V(I,J)
696             V(I,J)=V(J,I)
697             V(J,I)=S
698   420    CONTINUE
699   430 CONTINUE
700 C
701 C  FIND THE SINGULAR VALUE DECOMPOSITION OF V.
702 C  THIS GIVES THE EIGENVALUES AND PRINCIPAL AXES
703 C  OF THE APPROXIMATING QUADRATIC FORM
704 C  WITHOUT SQUARING THE CONDITION NUMBER.
705 C
706   440 CALL MINFIT(N,EPSMCH,VSMALL,V,D,E,NMAX,LP)
707 C
708       IF(SCBD.GT.ONE) THEN
709 C
710 C  UNSCALING...
711 C
712          DO 460 I=1,N
713 C
714             S=Z(I)
715             DO 450 J=1,N
716                V(I,J)=S*V(I,J)
717   450       CONTINUE
718   460    CONTINUE
719 C
720          DO 490 I=1,N
721 C
722             S=ZERO
723             DO 470 J=1,N
724                S=S+V(J,I)**2
725   470       CONTINUE
726             S=ZSQRT(S)
727 C
728             D(I)=S*D(I)
729 C
730             S=ONE/S
731             DO 480 J=1,N
732                V(J,I)=S*V(J,I)
733   480       CONTINUE
734   490    CONTINUE
735       ENDIF
736 C
737       DO 500 I=1,N
738 C
739          IF(DN*D(I).GT.XLARGE) THEN
740             D(I)=VSMALL
741          ELSE IF(DN*D(I).LT.SMALL) THEN
742             D(I)=VLARGE
743          ELSE
744             D(I)=ONE/(DN*D(I))**2
745          ENDIF
746   500 CONTINUE
747 C
748 C  SORT THE NEW EIGENVALUES AND EIGENVECTORS.
749 C
750       CALL SORT
751 C
752       DMIN=D(N)
753       IF(DMIN.LT.SMALL) DMIN=SMALL
754 C
755       IF(XM2*D(1).GT.DMIN) THEN
756          ILLC=1
757       ELSE
758          ILLC=0
759       ENDIF
760 C
761       IF(JPRINT.GT.1 .AND. SCBD.GT.ONE) THEN
762          WRITE(LP,510)(Z(I),I=1,N)
763   510    FORMAT(/' SCALE FACTORS'/(1X,1PG15.7,4G15.7))
764       ENDIF
765 C
766       IF(JPRINT.GT.1) THEN
767          WRITE(LP,520)(D(I),I=1,N)
768   520    FORMAT(/' EIGENVALUES OF A'/(1X,1PG15.7,4G15.7))
769       ENDIF
770 C
771       IF(JPRINT.GT.3) THEN
772 C
773          WRITE(LP,530)
774   530    FORMAT(/' EIGENVECTORS OF A')
775 C
776          DO 540 I=1,N
777             WRITE(LP,350)I,(V(I,J),J=1,N)
778   540    CONTINUE
779       ENDIF
780 C
781 C  GO BACK TO THE MAIN LOOP.
782 C  GO TO L0
783 C
784 C  HANDLE THE CASE N .EQ. 1 IN AN AD HOC WAY.
785 C  (BRENT DID NOT PROVIDE FOR THIS CASE.)
786 C
787       IF(N.GE.2) GO TO 60
788 C
789 C  LABEL L2...
790 C
791   550 IF(JPRINT.GT.0) THEN
792          WRITE(LP,560)(X(I),I=1,N)
793   560    FORMAT(//7X,'X'/(1X,1PG15.7,4G15.7))
794       ENDIF
795 C
796       FX=F(X,N)
797 C
798       IF(JPRINT.GE.0) WRITE(LP,570)FX,NL,NF
799   570 FORMAT(/' EXIT PRAXIS.   FX =',1PG25.17,5X,'NL =',I8,
800      *   5X,'NF =',I9)
801 C
802       RETURN
803 C
804 C  END PRAXIS
805 C
806       END
807       SUBROUTINE QUAD(F)
808 C
809 C  THIS SUBROUTINE LOOKS FOR THE MINIMUM ALONG
810 C  A CURVE DEFINED BY Q0, Q1, AND X.
811 C
812 C  "ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES",
813 C  RICHARD P. BRENT, PRENTICE-HALL 1973, PAGE 161
814 C
815 C  SUBROUTINE QUAD IS CALLED BY SUBROUTINE PRAXIS.
816 C
817       INTEGER N,NL,NF,LP,JPRINT,NMAX,ILLCIN,KTM,NFMAX,JRANCH
818       INTEGER I
819 C
820       DOUBLE PRECISION V,X,D,Q0,Q1,DMIN,EPSMCH,FX,H,QD0,QD1,QF1,
821      *   SMALL,T,XLDT,XM2,XM4,DSEED,SCBD
822       DOUBLE PRECISION F,   DSQRT,ZSQRT,ARG,
823      *   ONE,QA,QB,QC,S,TWO,XL,ZERO,QF1VAL
824 C
825       EXTERNAL F
826 C
827       COMMON /CPRAX/ V(128,128),X(128),D(128),Q0(128),Q1(128),
828      *   DMIN,EPSMCH,FX,H,QD0,QD1,QF1,SMALL,T,XLDT,XM2,XM4,DSEED,SCBD,
829      *   N,NL,NF,LP,JPRINT,NMAX,ILLCIN,KTM,NFMAX,JRANCH
830 C
831       ZSQRT(ARG)=DSQRT(ARG)
832 C
833       ZERO=0.0D0
834       ONE=1.0D0
835 C
836       S=FX
837       FX=QF1
838       QF1=S
839       QD1=ZERO
840 C
841       DO 10 I=1,N
842          S=X(I)
843          XL=Q1(I)
844          X(I)=XL
845          Q1(I)=S
846          QD1=QD1+(S-XL)**2
847    10 CONTINUE
848 C
849       QD1=ZSQRT(QD1)
850       XL=QD1
851       S=ZERO
852 C
853       IF(QD0.GT.ZERO .AND. QD1.GT.ZERO .AND. NL.GE.3*N*N) THEN
854 C
855          IF(JPRINT.GE.1) WRITE(LP,20)NF,QD0,QD1,FX,QF1
856    20    FORMAT(/' *****  CALL MINX FROM QUAD.   NF =',I11/
857      *      5X,'QD0 =',1PG15.7,5X,'QD1 =',G15.7/
858      *      5X,'FX  =',G15.7,5X,'QF1 =',G15.7)
859 C
860          QF1VAL=QF1
861          CALL MINX(0,2,S,XL,QF1VAL,1,F)
862          QA=XL*(XL-QD1)/(QD0*(QD0+QD1))
863          QB=(XL+QD0)*(QD1-XL)/(QD0*QD1)
864          QC=XL*(XL+QD0)/(QD1*(QD0+QD1))
865       ELSE
866          FX=QF1
867          QA=ZERO
868          QB=ZERO
869          QC=ONE
870       ENDIF
871 C
872       QD0=QD1
873 C
874       DO 30 I=1,N
875          S=Q0(I)
876          Q0(I)=X(I)
877          X(I)=QA*S+QB*X(I)+QC*Q1(I)
878    30 CONTINUE
879 C
880       RETURN
881 C
882 C  END QUAD
883 C
884       END
885       SUBROUTINE MINX(J,NITS,D2,X1,F1,IFK,F)
886 C
887 C  SUBROUTINE MINX MINIMIZES F FROM X IN THE DIRECTION V(*,J)
888 C  UNLESS J IS LESS THAN 1, WHEN A QUADRATIC SEARCH IS DONE IN
889 C  THE PLANE DEFINED BY Q0, Q1, AND X.
890 C
891 C  "ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES",
892 C  RICHARD P. BRENT, PRENTICE-HALL 1973, PAGES 159-160
893 C
894 C  SUBROUTINE MINX IS CALLED BY SUBROUTINES PRAXIS AND QUAD.
895 C
896 C  D2 AND X1 RETURN RESULTS.
897 C  J, NITS, F1 AND IFK ARE VALUE PARAMETERS THAT RETURN NOTHING.
898 C  DO NOT SEND A COMMON VARIABLE TO MINX FOR PARAMETER F1.
899 C
900 C
901 C  D2 IS AN APPROXIMATION TO HALF OF
902 C  THE SECOND DERIVATIVE OF F (OR ZERO).
903 C
904 C  X1 IS AN ESTIMATE OF DISTANCE TO MINIMUM,
905 C  RETURNED AS THE DISTANCE FOUND.
906 C
907 C  IF IFK = 1 THEN F1 IS FLIN(X1), OTHERWISE X1 AND F1 ARE
908 C  IGNORED ON ENTRY UNLESS FINAL FX IS GREATER THAN F1.
909 C
910 C  NITS CONTROLS THE NUMBER OF TIMES AN ATTEMPT IS MADE TO
911 C  HALVE THE INTERVAL.
912 C
913       EXTERNAL F
914 C
915       INTEGER N,NL,NF,LP,JPRINT,NMAX,ILLCIN,KTM,NFMAX,JRANCH
916       INTEGER IFK,J,NITS,     I,IDZ,K
917 C
918       DOUBLE PRECISION V,X,D,Q0,Q1,DMIN,EPSMCH,FX,H,QD0,QD1,QF1,
919      *   SMALL,T,XLDT,XM2,XM4,DSEED,SCBD
920       DOUBLE PRECISION D2,X1,
921      *   DABS,DSQRT,ZABS,ZSQRT,ARG,
922      *   HUNDTH,RHALF,TWO,ZERO,
923      *   DENOM,D1,FM,F0,F1,F2,S,SF1,SX1,T2,XM,X2
924 C
925       COMMON /CPRAX/ V(128,128),X(128),D(128),Q0(128),Q1(128),
926      *   DMIN,EPSMCH,FX,H,QD0,QD1,QF1,SMALL,T,XLDT,XM2,XM4,DSEED,SCBD,
927      *   N,NL,NF,LP,JPRINT,NMAX,ILLCIN,KTM,NFMAX,JRANCH
928 C
929       ZSQRT(ARG)=DSQRT(ARG)
930       ZABS(ARG)=DABS(ARG)
931 C
932       HUNDTH=0.01D0
933       ZERO=0.0D0
934       TWO=2.0D0
935       RHALF=0.5D0
936 C
937       SF1=F1
938       SX1=X1
939       K=0
940       XM=ZERO
941       FM=FX
942       F0=FX
943 C
944       IF(D2.LT.EPSMCH) THEN
945          IDZ=1
946       ELSE
947          IDZ=0
948       ENDIF
949 C
950 C  FIND THE STEP SIZE.
951 C
952       S=ZERO
953       DO 10 I=1,N
954          S=S+X(I)**2
955    10 CONTINUE
956       S=ZSQRT(S)
957 C
958       IF(IDZ.EQ.1) THEN
959          DENOM=DMIN
960       ELSE
961          DENOM=D2
962       ENDIF
963 C
964       T2=XM4*ZSQRT(ZABS(FX)/DENOM+S*XLDT)+XM2*XLDT
965       S=XM4*S+T
966       IF(IDZ.EQ.1 .AND. T2.GT.S) T2=S
967       IF(T2.LT.SMALL) T2=SMALL
968       IF(T2.GT.HUNDTH*H) T2=HUNDTH*H
969 C
970       IF(IFK.EQ.1 .AND. F1.LE.FM) THEN
971          XM=X1
972          FM=F1
973       ENDIF
974 C
975       IF(IFK.EQ.0 .OR. ZABS(X1).LT.T2) THEN
976 C
977          IF(X1.GE.ZERO) THEN
978             X1=T2
979          ELSE
980             X1=-T2
981          ENDIF
982 C
983          CALL FLIN(X1,J,F,F1)
984       ENDIF
985 C
986       IF(F1.LT.FM) THEN
987          XM=X1
988          FM=F1
989       ENDIF
990 C
991 C  LABEL L0...
992 C
993    20 IF(IDZ.EQ.1) THEN
994 C
995 C  EVALUATE FLIN AT ANOTHER POINT,
996 C  AND ESTIMATE THE SECOND DERIVATIVE.
997 C
998          IF(F0.LT.F1) THEN
999             X2=-X1
1000          ELSE
1001             X2=TWO*X1
1002          ENDIF
1003 C
1004          CALL FLIN(X2,J,F,F2)
1005 C
1006          IF(F2.LE.FM) THEN
1007             XM=X2
1008             FM=F2
1009          ENDIF
1010 C
1011          D2=(X2*(F1-F0)-X1*(F2-F0))/(X1*X2*(X1-X2))
1012 C
1013          IF(JPRINT.GE.5) WRITE(LP,30)X1,X2,F0,F1,F2,D2
1014    30    FORMAT(/' COMPUTE D2 IN SUBROUTINE MINX.'/
1015      *      5X,'X1 =',1PG15.7,5X,'X2 =',G15.7/
1016      *      5X,'F0 =',G15.7,5X,'F1 =',G15.7,5X,'F2 =',G15.7/
1017      *      5X,'D2 =',G15.7)
1018       ENDIF
1019 C
1020 C  ESTIMATE THE FIRST DERIVATIVE AT 0.
1021 C
1022       D1=(F1-F0)/X1-X1*D2
1023       IDZ=1
1024 C
1025 C  PREDICT THE MINIMUM.
1026 C
1027       IF(D2.LE.SMALL) THEN
1028 C
1029          IF(D1.LT.ZERO) THEN
1030             X2=H
1031          ELSE
1032             X2=-H
1033          ENDIF
1034 C
1035       ELSE
1036          X2=-RHALF*D1/D2
1037       ENDIF
1038 C
1039       IF(ZABS(X2).GT.H) THEN
1040 C
1041          IF(X2.GT.ZERO) THEN
1042             X2=H
1043          ELSE
1044             X2=-H
1045          ENDIF
1046       ENDIF
1047 C
1048 C  EVALUATE F AT THE PREDICTED MINIMUM.
1049 C  LABEL L1...
1050 C
1051    40 CALL FLIN(X2,J,F,F2)
1052 C
1053       IF(K.LT.NITS .AND. F2.GT.F0) THEN
1054 C
1055 C  NO SUCCESS, SO TRY AGAIN.
1056 C
1057          K=K+1
1058 C
1059 C  IF(...) GO TO L0
1060 C
1061          IF(F0.LT.F1 .AND. X1*X2.GT.ZERO) GO TO 20
1062          X2=X2/TWO
1063 C
1064 C  GO TO L1
1065 C
1066          GO TO 40
1067 C
1068       ENDIF
1069 C
1070 C  INCREMENT THE ONE-DIMENSIONAL SEARCH COUNTER.
1071 C
1072       NL=NL+1
1073 C
1074       IF(F2.GT.FM) THEN
1075          X2=XM
1076       ELSE
1077          FM=F2
1078       ENDIF
1079 C
1080 C  GET A NEW ESTIMATE OF THE SECOND DERIVATIVE.
1081 C
1082       IF(ZABS(X2*(X2-X1)).GT.SMALL) THEN
1083          D2=(X2*(F1-F0)-X1*(FM-F0))/(X1*X2*(X1-X2))
1084 C
1085          IF(JPRINT.GE.5) WRITE(LP,50)X1,X2,F0,FM,F1,D2
1086    50    FORMAT(/' RECOMPUTE D2 IN SUBROUTINE MINX.'/
1087      *      5X,'X1 =',1PG15.7,5X,'X2 =',G15.7/
1088      *      5X,'F0 =',G15.7,5X,'FM =',G15.7,5X,'F1 =',G15.7/
1089      *      5X,'D2 =',G15.7)
1090 C
1091       ELSE IF(K.GT.0) THEN
1092          D2=ZERO
1093 C
1094          IF(JPRINT.GE.5) WRITE(LP,60)
1095    60    FORMAT(/' SET D2=0 IN SUBROUTINE MINX.')
1096       ELSE
1097          D2=D2
1098       ENDIF
1099 C
1100       IF(D2.LE.SMALL) THEN
1101          D2=SMALL
1102 C
1103          IF(JPRINT.GE.5) WRITE(LP,70)D2
1104    70    FORMAT(/' SET D2=SMALL=',1PG15.7,' IN SUBROUTINE MINX.')
1105       ENDIF
1106 C
1107       IF(JPRINT.GE.5) WRITE(LP,80)X1,X2,FX,FM,SF1
1108    80 FORMAT(/' SUBROUTINE MINX.   X1 =',1PG15.7,5X,'X2 =',G15.7/
1109      *   5X,'FX =',G15.7,5X,'FM =',G15.7,5X,'SF1 =',G15.7)
1110 C
1111       X1=X2
1112       FX=FM
1113       IF(SF1.LT.FX) THEN
1114          FX=SF1
1115          X1=SX1
1116       ENDIF
1117 C
1118 C  UPDATE X FOR A LINEAR SEARCH BUT NOT FOR A PARABOLIC SEARCH.
1119 C
1120       IF(J.GT.0) THEN
1121 C
1122          DO 90 I=1,N
1123             X(I)=X(I)+X1*V(I,J)
1124    90    CONTINUE
1125       ENDIF
1126 C
1127       IF(JPRINT.GE.5) WRITE(LP,100)D2,X1,F1,FX
1128   100 FORMAT(/' LEAVE SUBROUTINE MINX.'/
1129      *   5X,'D2 =',1PG15.7,5X,'X1 =',G15.7,5X,'F1 =',G15.7/
1130      *   5X,'FX =',G15.7)
1131 C
1132       RETURN
1133 C
1134 C  END MINX
1135 C
1136       END
1137       SUBROUTINE FLIN(XL,J,F,FLN)
1138 C
1139 C  FLIN IS A FUNCTION OF ONE VARIABLE XL WHICH IS MINIMIZED BY
1140 C  SUBROUTINE MINX.
1141 C
1142 C  "ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES",
1143 C  RICHARD P. BRENT, PRENTICE-HALL 1973, PAGES 159-160
1144 C
1145 C  SUBROUTINE FLIN IS CALLED BY SUBROUTINE MINX.
1146 C
1147       INTEGER N,NL,NF,LP,JPRINT,NMAX,ILLCIN,KTM,NFMAX,JRANCH
1148       INTEGER J,   I
1149 C
1150       DOUBLE PRECISION V,X,D,Q0,Q1,DMIN,EPSMCH,FX,H,QD0,QD1,QF1,
1151      *   SMALL,T,XLDT,XM2,XM4,DSEED,SCBD
1152       DOUBLE PRECISION XL,F,FLN,   TT,   QA,QB,QC
1153 C
1154       DIMENSION TT(128)
1155 C
1156       COMMON /CPRAX/ V(128,128),X(128),D(128),Q0(128),Q1(128),
1157      *   DMIN,EPSMCH,FX,H,QD0,QD1,QF1,SMALL,T,XLDT,XM2,XM4,DSEED,SCBD,
1158      *   N,NL,NF,LP,JPRINT,NMAX,ILLCIN,KTM,NFMAX,JRANCH
1159 C
1160       IF(J.GT.0) THEN
1161 C
1162 C  LINEAR SEARCH...
1163 C
1164          DO 10 I=1,N
1165             TT(I)=X(I)+XL*V(I,J)
1166    10    CONTINUE
1167 C
1168       ELSE
1169 C
1170 C  SEARCH ALONG A PARABOLIC SPACE CURVE.
1171 C
1172          QA=XL*(XL-QD1)/(QD0*(QD0+QD1))
1173          QB=(XL+QD0)*(QD1-XL)/(QD0*QD1)
1174          QC=XL*(XL+QD0)/(QD1*(QD0+QD1))
1175 C
1176          DO 20 I=1,N
1177             TT(I)=QA*Q0(I)+QB*X(I)+QC*Q1(I)
1178    20    CONTINUE
1179       ENDIF
1180 C
1181 C  INCREMENT FUNCTION EVALUATION COUNTER.
1182 C
1183       NF=NF+1
1184       FLN=F(TT,N)
1185 C
1186       RETURN
1187 C
1188 C  END FLIN
1189 C
1190       END
1191       SUBROUTINE MINFIT(N,EPS,TOL,AB,Q,E,NMAX,LP)
1192 C
1193 C  AN IMPROVED VERSION OF MINFIT, RESTRICTED TO M=N, P=0.
1194 C  SEE GOLUB AND REINSCH (1970).
1195 C
1196 C  "ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES",
1197 C  RICHARD P. BRENT, PRENTICE-HALL 1973, PAGES 156-158
1198 C
1199 C  G. H. GOLUB AND C. REINSCH,
1200 C  "SINGULAR VALUE DECOMPOSITION AND LEAST SQUARES SOLUTIONS',
1201 C  NUMERISCHE MATHEMATIK 14 (1970) PAGES 403-420
1202 C
1203 C  THE SINGULAR VALUES OF THE ARRAY AB ARE RETURNED IN Q,
1204 C  AND AB IS OVERWRITTEN WITH THE ORTHOGONAL MATRIX V SUCH THAT
1205 C  U.DIAG(Q)=AB.V, WHERE U IS ANOTHER ORTHOGONAL MATRIX.
1206 C
1207 C  SUBROUTINE MINFIT IS CALLED BY SUBROUTINE PRAXIS.
1208 C
1209       INTEGER N,NMAX,LP,
1210      *   I,II,J,JTHIRT,K,KK,KT,L,LL2,LPI,L2
1211 C
1212       DOUBLE PRECISION EPS,TOL,AB,Q,E,
1213      *   DABS,DSQRT,ZABS,ZSQRT,ARG,
1214      *   C,DENOM,F,G,H,ONE,X,Y,Z,ZERO,S,TWO
1215 C
1216       DIMENSION AB(NMAX,N),Q(N),E(N)
1217 C
1218       ZABS(ARG)=DABS(ARG)
1219       ZSQRT(ARG)=DSQRT(ARG)
1220 C
1221       JTHIRT=30
1222 C
1223       ZERO=0.0D0
1224       ONE=1.0D0
1225       TWO=2.0D0
1226 C
1227 C  HOUSEHOLDER'S REDUCTION TO BIDIAGONAL FORM...
1228 C
1229       X=ZERO
1230       G=ZERO
1231 C
1232       DO 140 I=1,N
1233          E(I)=G
1234          S=ZERO
1235          L=I+1
1236 C
1237          DO 10 J=I,N
1238             S=S+AB(J,I)**2
1239    10    CONTINUE
1240 C
1241          IF(S.LT.TOL) THEN
1242             G=ZERO
1243          ELSE
1244             F=AB(I,I)
1245 C
1246             IF(F.LT.ZERO) THEN
1247                G=ZSQRT(S)
1248             ELSE
1249                G=-ZSQRT(S)
1250             ENDIF
1251 C
1252             H=F*G-S
1253             AB(I,I)=F-G
1254 C
1255             IF(L.GT.N) GO TO 60
1256             DO 50 J=L,N
1257 C
1258                F=ZERO
1259                IF(I.GT.N) GO TO 30
1260                DO 20 K=I,N
1261                   F=F+AB(K,I)*AB(K,J)
1262    20          CONTINUE
1263    30          F=F/H
1264 C
1265                IF(I.GT.N) GO TO 50
1266                DO 40 K=I,N
1267                   AB(K,J)=AB(K,J)+F*AB(K,I)
1268    40          CONTINUE
1269    50       CONTINUE
1270          ENDIF
1271 C
1272    60    Q(I)=G
1273          S=ZERO
1274 C
1275          IF(I.LE.N) THEN
1276 C
1277             IF(L.GT.N) GO TO 80
1278             DO 70 J=L,N
1279                S=S+AB(I,J)**2
1280    70       CONTINUE
1281          ENDIF
1282 C
1283    80    IF(S.LT.TOL) THEN
1284             G=ZERO
1285          ELSE
1286             F=AB(I,I+1)
1287 C
1288             IF(F.LT.ZERO) THEN
1289                G=ZSQRT(S)
1290             ELSE
1291                G=-ZSQRT(S)
1292             ENDIF
1293 C
1294             H=F*G-S
1295             AB(I,I+1)=F-G
1296             IF(L.GT.N) GO TO 130
1297             DO 90 J=L,N
1298                E(J)=AB(I,J)/H
1299    90       CONTINUE
1300 C
1301             DO 120 J=L,N
1302 C
1303                S=ZERO
1304                DO 100 K=L,N
1305                   S=S+AB(J,K)*AB(I,K)
1306   100          CONTINUE
1307 C
1308                DO 110 K=L,N
1309                   AB(J,K)=AB(J,K)+S*E(K)
1310   110          CONTINUE
1311   120       CONTINUE
1312          ENDIF
1313 C
1314   130    Y=ZABS(Q(I))+ZABS(E(I))
1315 C
1316          IF(Y.GT.X) X=Y
1317   140 CONTINUE
1318 C
1319 C  ACCUMULATION OF RIGHT-HAND TRANSFORMATIONS...
1320 C
1321       DO 210 II=1,N
1322          I=N-II+1
1323 C
1324          IF(G.NE.ZERO) THEN
1325             H=AB(I,I+1)*G
1326 C
1327             IF(L.GT.N) GO TO 200
1328             DO 150 J=L,N
1329                AB(J,I)=AB(I,J)/H
1330   150       CONTINUE
1331 C
1332             DO 180 J=L,N
1333 C
1334                S=ZERO
1335                DO 160 K=L,N
1336                   S=S+AB(I,K)*AB(K,J)
1337   160          CONTINUE
1338 C
1339                DO 170 K=L,N
1340                   AB(K,J)=AB(K,J)+S*AB(K,I)
1341   170          CONTINUE
1342   180       CONTINUE
1343          ENDIF
1344 C
1345          IF(L.GT.N) GO TO 200
1346          DO 190 J=L,N
1347             AB(J,I)=ZERO
1348             AB(I,J)=ZERO
1349   190    CONTINUE
1350 C
1351   200    AB(I,I)=ONE
1352          G=E(I)
1353          L=I
1354   210 CONTINUE
1355 C
1356 C  DIAGONALIZATION OF THE BIDIAGONAL FORM...
1357 C
1358       EPS=EPS*X
1359       DO 330 KK=1,N
1360          K=N-KK+1
1361          KT=0
1362 C
1363 C  LABEL TESTFSPLITTING...
1364 C
1365   220    KT=KT+1
1366 C
1367          IF(KT.GT.JTHIRT) THEN
1368             E(K)=ZERO
1369             WRITE(LP,230)
1370   230       FORMAT(' QR FAILED.')
1371          ENDIF
1372 C
1373          DO 240 LL2=1,K
1374             L2=K-LL2+1
1375             L=L2
1376 C
1377 C  IF(...) GO TO TESTFCONVERGENCE
1378 C
1379             IF(ZABS(E(L)).LE.EPS) GO TO 270
1380 C
1381 C  IF(...) GO TO CANCELLATION
1382 C
1383             IF(ZABS(Q(L-1)).LE.EPS) GO TO 250
1384   240    CONTINUE
1385 C
1386 C  CANCELLATION OF E(L) IF L IS GREATER THAN 1...
1387 C  LABEL CANCELLATION...
1388 C
1389   250    C=ZERO
1390          S=ONE
1391          IF(L.GT.K) GO TO 270
1392          DO 260 I=L,K
1393             F=S*E(I)
1394             E(I)=C*E(I)
1395 C
1396 C  IF(...) GO TO TESTFCONVERGENCE
1397 C
1398             IF(ZABS(F).LE.EPS) GO TO 270
1399             G=Q(I)
1400 C
1401             IF(ZABS(F).LT.ZABS(G)) THEN
1402                H=ZABS(G)*ZSQRT(ONE+(F/G)**2)
1403             ELSE IF(F.NE.ZERO) THEN
1404                H=ZABS(F)*ZSQRT(ONE+(G/F)**2)
1405             ELSE
1406                H=ZERO
1407             ENDIF
1408 C
1409             Q(I)=H
1410 C
1411             IF(H.EQ.ZERO) THEN
1412                H=ONE
1413                G=ONE
1414             ENDIF
1415 C
1416 C  THE ABOVE REPLACES Q(I) AND H BY SQUARE ROOT OF (G*G+F*F)
1417 C  WHICH MAY GIVE INCORRECT RESULTS IF THE SQUARES UNDERFLOW OR IF
1418 C  F = G = 0 .
1419 C
1420             C=G/H
1421             S=-F/H
1422   260    CONTINUE
1423 C
1424 C  LABEL TESTFCONVERGENCE...
1425 C
1426   270    Z=Q(K)
1427 C
1428 C  IF(...) GO TO CONVERGENCE
1429 C
1430          IF(L.EQ.K) GO TO 310
1431 C
1432 C  SHIFT FROM BOTTOM 2*2 MINOR.
1433 C
1434          X=Q(L)
1435          Y=Q(K-1)
1436          G=E(K-1)
1437          H=E(K)
1438          F=((Y-Z)*(Y+Z)+(G-H)*(G+H))/(TWO*H*Y)
1439          G=ZSQRT(F*F+ONE)
1440 C
1441          IF(F.LT.ZERO) THEN
1442             DENOM=F-G
1443          ELSE
1444             DENOM=F+G
1445          ENDIF
1446 C
1447          F=((X-Z)*(X+Z)+H*(Y/DENOM-H))/X
1448 C
1449 C  NEXT QR TRANSFORMATION...
1450 C
1451          S=ONE
1452          C=ONE
1453          LPI=L+1
1454          IF(LPI.GT.K) GO TO 300
1455          DO 290 I=LPI,K
1456             G=E(I)
1457             Y=Q(I)
1458             H=S*G
1459             G=G*C
1460 C
1461             IF(ZABS(F).LT.ZABS(H)) THEN
1462                Z=ZABS(H)*ZSQRT(ONE+(F/H)**2)
1463             ELSE IF(F.NE.ZERO) THEN
1464                Z=ZABS(F)*ZSQRT(ONE+(H/F)**2)
1465             ELSE
1466                Z=ZERO
1467             ENDIF
1468 C
1469             E(I-1)=Z
1470 C
1471             IF(Z.EQ.ZERO) THEN
1472                F=ONE
1473                Z=ONE
1474             ENDIF
1475 C
1476             C=F/Z
1477             S=H/Z
1478             F=X*C+G*S
1479             G=-X*S+G*C
1480             H=Y*S
1481             Y=Y*C
1482 C
1483             DO 280 J=1,N
1484                X=AB(J,I-1)
1485                Z=AB(J,I)
1486                AB(J,I-1)=X*C+Z*S
1487                AB(J,I)=-X*S+Z*C
1488   280       CONTINUE
1489 C
1490             IF(ZABS(F).LT.ZABS(H)) THEN
1491                Z=ZABS(H)*ZSQRT(ONE+(F/H)**2)
1492             ELSE IF(F.NE.ZERO) THEN
1493                Z=ZABS(F)*ZSQRT(ONE+(H/F)**2)
1494             ELSE
1495                Z=ZERO
1496             ENDIF
1497 C
1498             Q(I-1)=Z
1499 C
1500             IF(Z.EQ.ZERO) THEN
1501                F=ONE
1502                Z=ONE
1503             ENDIF
1504 C
1505             C=F/Z
1506             S=H/Z
1507             F=C*G+S*Y
1508             X=-S*G+C*Y
1509   290    CONTINUE
1510 C
1511   300    E(L)=ZERO
1512          E(K)=F
1513          Q(K)=X
1514 C
1515 C  GO TO TESTFSPLITTING
1516 C
1517          GO TO 220
1518 C
1519 C  LABEL CONVERGENCE...
1520 C
1521   310    IF(Z.LT.ZERO) THEN
1522 C
1523 C  Q(K) IS MADE NON-NEGATIVE.
1524 C
1525             Q(K)=-Z
1526             DO 320 J=1,N
1527                AB(J,K)=-AB(J,K)
1528   320       CONTINUE
1529          ENDIF
1530   330 CONTINUE
1531 C
1532       RETURN
1533 C
1534 C  END MINFIT
1535 C
1536       END
1537       SUBROUTINE SORT
1538 C
1539 C  THIS SUBROUTINE SORTS THE ELEMENTS OF D
1540 C  AND THE CORRESPONDING COLUMNS OF V INTO DESCENDING ORDER.
1541 C
1542 C  "ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES",
1543 C  RICHARD P. BRENT, PRENTICE-HALL 1973, PAGES 158-159
1544 C
1545       INTEGER N,NL,NF,LP,JPRINT,NMAX,ILLCIN,KTM,NFMAX,JRANCH
1546       INTEGER I,IPI,J,K,NMI
1547 C
1548       DOUBLE PRECISION V,X,D,Q0,Q1,DMIN,EPSMCH,FX,H,QD0,QD1,QF1,
1549      *   SMALL,T,XLDT,XM2,XM4,DSEED,SCBD
1550       DOUBLE PRECISION S
1551 C
1552       COMMON /CPRAX/ V(128,128),X(128),D(128),Q0(128),Q1(128),
1553      *   DMIN,EPSMCH,FX,H,QD0,QD1,QF1,SMALL,T,XLDT,XM2,XM4,DSEED,SCBD,
1554      *   N,NL,NF,LP,JPRINT,NMAX,ILLCIN,KTM,NFMAX,JRANCH
1555 C
1556       NMI=N-1
1557       IF(NMI.LT.1) GO TO 50
1558       DO 40 I=1,NMI
1559          K=I
1560          S=D(I)
1561          IPI=I+1
1562          IF(IPI.GT.N) GO TO 20
1563 C
1564          DO 10 J=IPI,N
1565 C
1566             IF(D(J).GT.S) THEN
1567                K=J
1568                S=D(J)
1569             ENDIF
1570    10    CONTINUE
1571 C
1572    20    IF(K.GT.I) THEN
1573             D(K)=D(I)
1574             D(I)=S
1575 C
1576             DO 30 J=1,N
1577                S=V(J,I)
1578                V(J,I)=V(J,K)
1579                V(J,K)=S
1580    30       CONTINUE
1581          ENDIF
1582    40 CONTINUE
1583 C
1584    50 RETURN
1585 C
1586 C  END SORT
1587 C
1588       END
1589       SUBROUTINE RANINI(RVALUE)
1590 C
1591 C  SUBROUTINE RANINI PERFORMS INITIALIZATION FOR SUBROUTINE RANDOM.
1592 C
1593 C  "ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES",
1594 C  RICHARD P. BRENT, PRENTICE-HALL 1973, PAGES 163-164
1595 C
1596       INTEGER JRAN2,I
1597 C
1598       DOUBLE PRECISION RVALUE,R,RAN3,DMOD,DABS,RAN1
1599 C
1600       COMMON /COMRAN/ RAN3(127),RAN1,JRAN2
1601 C
1602       R=DMOD(DABS(RVALUE),8190.0D0)+1
1603       JRAN2=127
1604 C
1605    10 IF(JRAN2.GT.0) THEN
1606          JRAN2=JRAN2-1
1607          RAN1=-2.0D0**55
1608 C
1609          DO 20 I=1,7
1610             R=DMOD(1756.0D0*R,8191.0D0)
1611             RAN1=(RAN1+(R-DMOD(R,32.0D0))/32.0D0)/256.0D0
1612    20    CONTINUE
1613 C
1614          RAN3(JRAN2+1)=RAN1
1615          GO TO 10
1616       ENDIF
1617 C
1618       RETURN
1619 C
1620 C  END RANINI
1621 C
1622       END
1623       SUBROUTINE RANDOM(RANVAL)
1624 C
1625 C  SUBROUTINE RANDOM RETURNS A DOUBLE PRECISION PSEUDORANDOM NUMBER
1626 C  UNIFORMLY DISTRIBUTED IN (0,1) (INCLUDING 0 BUT NOT 1).
1627 C
1628 C  "ALGORITHMS FOR MINIMIZATION WITHOUT DERIVATIVES",
1629 C  RICHARD P. BRENT, PRENTICE-HALL 1973, PAGES 163-164
1630 C
1631 C  BEFORE THE FIRST CALL TO RANDOM, THE USER MUST
1632 C  CALL RANINI(R) ONCE (ONLY) WITH R A DOUBLE PRECISION NUMBER
1633 C  EQUAL TO ANY INTEGER VALUE.
1634 C  BRENT (PAGE 166) USED THE EQUIVALENT OF
1635 C     CALL RANINI(4.0D0) .
1636 C
1637 C  THE ALGORITHM USED IN SUBROUTINE RANDOM RETURNS X(N)/2**56,
1638 C  WHERE   X(N) = X(N-1) + X(N-127)  (MOD 2**56) .
1639 C  SINCE (1 + X + X**127) IS PRIMITIVE (MOD 2),
1640 C  THE PERIOD IS AT LEAST (2**127 - 1), WHICH EXCEEDS 10**38.
1641 C
1642 C  SEE "SEMINUMERICAL ALGORITHMS", VOLUME 2 OF
1643 C  "THE ART OF COMPUTER PROGRAMMING" BY DONALD E. KNUTH,
1644 C  ADDISON-WESLEY 1969, PAGES 26, 34, AND 464.
1645 C
1646 C  X(N) IS STORED IN DOUBLE PRECISION AS  RAN3 = X(N)/2**56 - 1/2,
1647 C  AND ALL DOUBLE PRECISION ARITHMETIC IS EXACT.
1648 C
1649       INTEGER JRAN2
1650 C
1651       DOUBLE PRECISION RANVAL,RAN3,RAN1
1652 C
1653       COMMON /COMRAN/ RAN3(127),RAN1,JRAN2
1654 C
1655       IF(JRAN2.EQ.0) THEN
1656          JRAN2=126
1657       ELSE
1658          JRAN2=JRAN2-1
1659       ENDIF
1660 C
1661       RAN1=RAN1+RAN3(JRAN2+1)
1662       IF(RAN1.LT.0.0D0) THEN
1663          RAN1=RAN1+0.5D0
1664       ELSE
1665          RAN1=RAN1-0.5D0
1666       ENDIF
1667 C
1668       RAN3(JRAN2+1)=RAN1
1669       RANVAL=RAN1+0.5D0
1670 C
1671       RETURN
1672 C
1673 C  END RANDOM
1674 C
1675       END
1676       DOUBLE PRECISION FUNCTION DRANDM(DL)
1677 C
1678 C  SIMPLE PORTABLE PSEUDORANDOM NUMBER GENERATOR.
1679 C
1680 C  DRANDM RETURNS FUNCTION VALUES THAT ARE PSEUDORANDOM
1681 C  NUMBERS UNIFORMLY DISTRIBUTED ON THE INTERVAL (0,1).
1682 C
1683 C  'NUMERICAL MATHEMATICS AND COMPUTING' BY WARD CHENEY AND
1684 C  DAVID KINCAID, BROOKS/COLE PUBLISHING COMPANY
1685 C  (FIRST EDITION, 1980), PAGE 203
1686 C
1687 C  AT THE BEGINNING OF EXECUTION, OR WHENEVER A NEW SEQUENCE IS
1688 C  TO BE INITIATED, SET DL EQUAL TO AN INTEGER VALUE BETWEEN
1689 C  1.0D0 AND 2147483646.0D0, INCLUSIVE.  DO THIS ONLY ONCE.
1690 C  THEREAFTER, DO NOT SET OR ALTER DL IN ANY WAY.
1691 C  FUNCTION DRANDM WILL MODIFY DL FOR ITS OWN PURPOSES.
1692 C
1693 C  DRANDM USES A MULTIPLICATIVE CONGRUENTIAL METHOD.
1694 C  THE NUMBERS GENERATED BY DRANDM SUFFER FROM THE PARALLEL
1695 C  PLANES DEFECT DISCOVERED BY G. MARSAGLIA, AND SHOULD NOT BE
1696 C  USED WHEN HIGH-QUALITY RANDOMNESS IS REQUIRED.  IN THAT
1697 C  CASE, USE A "SHUFFLING" METHOD.
1698 C
1699       DOUBLE PRECISION DL,DMOD
1700 C
1701    10 DL=DMOD(16807.0D0*DL,2147483647.0D0)
1702       DRANDM=DL/2147483647.0D0
1703       IF(DRANDM.LE.0.0D0 .OR. DRANDM.GE.1.0D0) GO TO 10
1704       RETURN
1705       END