source: ThirdParty/mpqc_open/src/lib/math/optimize/lbfgs.f@ 23612c

Action_Thermostats Add_AtomRandomPerturbation Add_RotateAroundBondAction Add_SelectAtomByNameAction Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_StructOpt_integration_tests AutomationFragmentation_failures Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_ChronosMutex Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion GeometryObjects Gui_displays_atomic_force_velocity IndependentFragmentGrids_IntegrationTest JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks RotateToPrincipalAxisSystem_UndoRedo StoppableMakroAction Subpackage_levmar Subpackage_vmg ThirdParty_MPQC_rebuilt_buildsystem TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps Ubuntu_1604_changes stable
Last change on this file since 23612c was 860145, checked in by Frederik Heber <heber@…>, 8 years ago

Merge commit '0b990dfaa8c6007a996d030163a25f7f5fc8a7e7' as 'ThirdParty/mpqc_open'

  • Property mode set to 100644
File size: 38.5 KB
Line 
1c Below are the contents of the original file that was used to generate
2c mcsearch.h and mcsearch.cc. Only the mcsrch and mcstep routines are
3c used. This file is not compiled or otherwise used.
4C ----------------------------------------------------------------------
5C This file contains the LBFGS algorithm and supporting routines
6C
7C ****************
8C LBFGS SUBROUTINE
9C ****************
10C
11 SUBROUTINE LBFGS(N,M,X,F,G,DIAGCO,DIAG,IPRINT,EPS,XTOL,W,IFLAG)
12C
13 INTEGER N,M,IPRINT(2),IFLAG
14 DOUBLE PRECISION X(N),G(N),DIAG(N),W(N*(2*M+1)+2*M)
15 DOUBLE PRECISION F,EPS,XTOL
16 INTEGER DIAGCO
17C
18C LIMITED MEMORY BFGS METHOD FOR LARGE SCALE OPTIMIZATION
19C JORGE NOCEDAL
20C *** July 1990 ***
21C
22C
23C This subroutine solves the unconstrained minimization problem
24C
25C min F(x), x= (x1,x2,...,xN),
26C
27C using the limited memory BFGS method. The routine is especially
28C effective on problems involving a large number of variables. In
29C a typical iteration of this method an approximation Hk to the
30C inverse of the Hessian is obtained by applying M BFGS updates to
31C a diagonal matrix Hk0, using information from the previous M steps.
32C The user specifies the number M, which determines the amount of
33C storage required by the routine. The user may also provide the
34C diagonal matrices Hk0 if not satisfied with the default choice.
35C The algorithm is described in "On the limited memory BFGS method
36C for large scale optimization", by D. Liu and J. Nocedal,
37C Mathematical Programming B 45 (1989) 503-528.
38C
39C The user is required to calculate the function value F and its
40C gradient G. In order to allow the user complete control over
41C these computations, reverse communication is used. The routine
42C must be called repeatedly under the control of the parameter
43C IFLAG.
44C
45C The steplength is determined at each iteration by means of the
46C line search routine MCVSRCH, which is a slight modification of
47C the routine CSRCH written by More' and Thuente.
48C
49C The calling statement is
50C
51C CALL LBFGS(N,M,X,F,G,DIAGCO,DIAG,IPRINT,EPS,XTOL,W,IFLAG)
52C
53C where
54C
55C N is an INTEGER variable that must be set by the user to the
56C number of variables. It is not altered by the routine.
57C Restriction: N>0.
58C
59C M is an INTEGER variable that must be set by the user to
60C the number of corrections used in the BFGS update. It
61C is not altered by the routine. Values of M less than 3 are
62C not recommended; large values of M will result in excessive
63C computing time. 3<= M <=7 is recommended. Restriction: M>0.
64C
65C X is a DOUBLE PRECISION array of length N. On initial entry
66C it must be set by the user to the values of the initial
67C estimate of the solution vector. On exit with IFLAG=0, it
68C contains the values of the variables at the best point
69C found (usually a solution).
70C
71C F is a DOUBLE PRECISION variable. Before initial entry and on
72C a re-entry with IFLAG=1, it must be set by the user to
73C contain the value of the function F at the point X.
74C
75C G is a DOUBLE PRECISION array of length N. Before initial
76C entry and on a re-entry with IFLAG=1, it must be set by
77C the user to contain the components of the gradient G at
78C the point X.
79C
80C DIAGCO is a LOGICAL variable that must be set to .TRUE. if the
81C user wishes to provide the diagonal matrix Hk0 at each
82C iteration. Otherwise it should be set to .FALSE., in which
83C case LBFGS will use a default value described below. If
84C DIAGCO is set to .TRUE. the routine will return at each
85C iteration of the algorithm with IFLAG=2, and the diagonal
86C matrix Hk0 must be provided in the array DIAG.
87C
88C
89C DIAG is a DOUBLE PRECISION array of length N. If DIAGCO=.TRUE.,
90C then on initial entry or on re-entry with IFLAG=2, DIAG
91C it must be set by the user to contain the values of the
92C diagonal matrix Hk0. Restriction: all elements of DIAG
93C must be positive.
94C
95C IPRINT is an INTEGER array of length two which must be set by the
96C user.
97C
98C IPRINT(1) specifies the frequency of the output:
99C IPRINT(1) < 0 : no output is generated,
100C IPRINT(1) = 0 : output only at first and last iteration,
101C IPRINT(1) > 0 : output every IPRINT(1) iterations.
102C
103C IPRINT(2) specifies the type of output generated:
104C IPRINT(2) = 0 : iteration count, number of function
105C evaluations, function value, norm of the
106C gradient, and steplength,
107C IPRINT(2) = 1 : same as IPRINT(2)=0, plus vector of
108C variables and gradient vector at the
109C initial point,
110C IPRINT(2) = 2 : same as IPRINT(2)=1, plus vector of
111C variables,
112C IPRINT(2) = 3 : same as IPRINT(2)=2, plus gradient vector.
113C
114C
115C EPS is a positive DOUBLE PRECISION variable that must be set by
116C the user, and determines the accuracy with which the solution
117C is to be found. The subroutine terminates when
118C
119C ||G|| < EPS max(1,||X||),
120C
121C where ||.|| denotes the Euclidean norm.
122C
123C XTOL is a positive DOUBLE PRECISION variable that must be set by
124C the user to an estimate of the machine precision (e.g.
125C 10**(-16) on a SUN station 3/60). The line search routine will
126C terminate if the relative width of the interval of uncertainty
127C is less than XTOL.
128C
129C W is a DOUBLE PRECISION array of length N(2M+1)+2M used as
130C workspace for LBFGS. This array must not be altered by the
131C user.
132C
133C IFLAG is an INTEGER variable that must be set to 0 on initial entry
134C to the subroutine. A return with IFLAG<0 indicates an error,
135C and IFLAG=0 indicates that the routine has terminated without
136C detecting errors. On a return with IFLAG=1, the user must
137C evaluate the function F and gradient G. On a return with
138C IFLAG=2, the user must provide the diagonal matrix Hk0.
139C
140C The following negative values of IFLAG, detecting an error,
141C are possible:
142C
143C IFLAG=-1 The line search routine MCSRCH failed. The
144C parameter INFO provides more detailed information
145C (see also the documentation of MCSRCH):
146C
147C INFO = 0 IMPROPER INPUT PARAMETERS.
148C
149C INFO = 2 RELATIVE WIDTH OF THE INTERVAL OF
150C UNCERTAINTY IS AT MOST XTOL.
151C
152C INFO = 3 MORE THAN 20 FUNCTION EVALUATIONS WERE
153C REQUIRED AT THE PRESENT ITERATION.
154C
155C INFO = 4 THE STEP IS TOO SMALL.
156C
157C INFO = 5 THE STEP IS TOO LARGE.
158C
159C INFO = 6 ROUNDING ERRORS PREVENT FURTHER PROGRESS.
160C THERE MAY NOT BE A STEP WHICH SATISFIES
161C THE SUFFICIENT DECREASE AND CURVATURE
162C CONDITIONS. TOLERANCES MAY BE TOO SMALL.
163C
164C
165C IFLAG=-2 The i-th diagonal element of the diagonal inverse
166C Hessian approximation, given in DIAG, is not
167C positive.
168C
169C IFLAG=-3 Improper input parameters for LBFGS (N or M are
170C not positive).
171C
172C
173C
174C ON THE DRIVER:
175C
176C The program that calls LBFGS must contain the declaration:
177C
178C EXTERNAL LB2
179C
180C LB2 is a BLOCK DATA that defines the default values of several
181C parameters described in the COMMON section.
182C
183C
184C
185C COMMON:
186C
187C The subroutine contains one common area, which the user may wish to
188C reference:
189C
190 COMMON /LB3/MP,LP,GTOL,STPMIN,STPMAX
191C
192C MP is an INTEGER variable with default value 6. It is used as the
193C unit number for the printing of the monitoring information
194C controlled by IPRINT.
195C
196C LP is an INTEGER variable with default value 6. It is used as the
197C unit number for the printing of error messages. This printing
198C may be suppressed by setting LP to a non-positive value.
199C
200C GTOL is a DOUBLE PRECISION variable with default value 0.9, which
201C controls the accuracy of the line search routine MCSRCH. If the
202C function and gradient evaluations are inexpensive with respect
203C to the cost of the iteration (which is sometimes the case when
204C solving very large problems) it may be advantageous to set GTOL
205C to a small value. A typical small value is 0.1. Restriction:
206C GTOL should be greater than 1.D-04.
207C
208C STPMIN and STPMAX are non-negative DOUBLE PRECISION variables which
209C specify lower and uper bounds for the step in the line search.
210C Their default values are 1.D-20 and 1.D+20, respectively. These
211C values need not be modified unless the exponents are too large
212C for the machine being used, or unless the problem is extremely
213C badly scaled (in which case the exponents should be increased).
214C
215C
216C MACHINE DEPENDENCIES
217C
218C The only variables that are machine-dependent are XTOL,
219C STPMIN and STPMAX.
220C
221C
222C GENERAL INFORMATION
223C
224C Other routines called directly: DAXPY, DDOT, LB1, MCSRCH
225C
226C Input/Output : No input; diagnostic messages on unit MP and
227C error messages on unit LP.
228C
229C
230C - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
231C
232 DOUBLE PRECISION GTOL,ONE,ZERO,GNORM,DDOT,STP1,FTOL,STPMIN,
233 . STPMAX,STP,YS,YY,SQ,YR,BETA,XNORM
234 INTEGER MP,LP,ITER,NFUN,POINT,ISPT,IYPT,MAXFEV,INFO,
235 . BOUND,NPT,CP,I,NFEV,INMC,IYCN,ISCN
236 LOGICAL FINISH
237C
238 SAVE
239 DATA ONE,ZERO/1.0D+0,0.0D+0/
240C
241C INITIALIZE
242C ----------
243C
244 IF(IFLAG.EQ.0) GO TO 10
245 GO TO (172,100) IFLAG
246 10 ITER= 0
247 IF(N.LE.0.OR.M.LE.0) GO TO 196
248 IF(GTOL.LE.1.D-04) THEN
249 IF(LP.GT.0) WRITE(LP,245)
250 GTOL=9.D-01
251 ENDIF
252 NFUN= 1
253 POINT= 0
254 FINISH= .FALSE.
255 IF(DIAGCO.NE.0) THEN
256 DO 30 I=1,N
257 30 IF (DIAG(I).LE.ZERO) GO TO 195
258 ELSE
259 DO 40 I=1,N
260 40 DIAG(I)= 1.0D0
261 ENDIF
262C
263C THE WORK VECTOR W IS DIVIDED AS FOLLOWS:
264C ---------------------------------------
265C THE FIRST N LOCATIONS ARE USED TO STORE THE GRADIENT AND
266C OTHER TEMPORARY INFORMATION.
267C LOCATIONS (N+1)...(N+M) STORE THE SCALARS RHO.
268C LOCATIONS (N+M+1)...(N+2M) STORE THE NUMBERS ALPHA USED
269C IN THE FORMULA THAT COMPUTES H*G.
270C LOCATIONS (N+2M+1)...(N+2M+NM) STORE THE LAST M SEARCH
271C STEPS.
272C LOCATIONS (N+2M+NM+1)...(N+2M+2NM) STORE THE LAST M
273C GRADIENT DIFFERENCES.
274C
275C THE SEARCH STEPS AND GRADIENT DIFFERENCES ARE STORED IN A
276C CIRCULAR ORDER CONTROLLED BY THE PARAMETER POINT.
277C
278 ISPT= N+2*M
279 IYPT= ISPT+N*M
280 DO 50 I=1,N
281 50 W(ISPT+I)= -G(I)*DIAG(I)
282 GNORM= DSQRT(DDOT(N,G,1,G,1))
283 STP1= ONE/GNORM
284C
285C PARAMETERS FOR LINE SEARCH ROUTINE
286C
287 FTOL= 1.0D-4
288 MAXFEV= 20
289C
290 IF(IPRINT(1).GE.0) CALL LB1(IPRINT,ITER,NFUN,
291 * GNORM,N,M,X,F,G,STP,FINISH)
292C
293C --------------------
294C MAIN ITERATION LOOP
295C --------------------
296C
297 80 ITER= ITER+1
298 INFO=0
299 BOUND=ITER-1
300 IF(ITER.EQ.1) GO TO 165
301 IF (ITER .GT. M)BOUND=M
302C
303 YS= DDOT(N,W(IYPT+NPT+1),1,W(ISPT+NPT+1),1)
304 IF(DIAGCO.EQ.0) THEN
305 YY= DDOT(N,W(IYPT+NPT+1),1,W(IYPT+NPT+1),1)
306 DO 90 I=1,N
307 90 DIAG(I)= YS/YY
308 ELSE
309 IFLAG=2
310 RETURN
311 ENDIF
312 100 CONTINUE
313 IF(DIAGCO.NE.0) THEN
314 DO 110 I=1,N
315 110 IF (DIAG(I).LE.ZERO) GO TO 195
316 ENDIF
317C
318C COMPUTE -H*G USING THE FORMULA GIVEN IN: Nocedal, J. 1980,
319C "Updating quasi-Newton matrices with limited storage",
320C Mathematics of Computation, Vol.24, No.151, pp. 773-782.
321C ---------------------------------------------------------
322C
323 CP= POINT
324 IF (POINT.EQ.0) CP=M
325 W(N+CP)= ONE/YS
326 DO 112 I=1,N
327 112 W(I)= -G(I)
328 CP= POINT
329 DO 125 I= 1,BOUND
330 CP=CP-1
331 IF (CP.EQ. -1)CP=M-1
332 SQ= DDOT(N,W(ISPT+CP*N+1),1,W,1)
333 INMC=N+M+CP+1
334 IYCN=IYPT+CP*N
335 W(INMC)= W(N+CP+1)*SQ
336 CALL DAXPY(N,-W(INMC),W(IYCN+1),1,W,1)
337 125 CONTINUE
338C
339 DO 130 I=1,N
340 130 W(I)=DIAG(I)*W(I)
341C
342 DO 145 I=1,BOUND
343 YR= DDOT(N,W(IYPT+CP*N+1),1,W,1)
344 BETA= W(N+CP+1)*YR
345 INMC=N+M+CP+1
346 BETA= W(INMC)-BETA
347 ISCN=ISPT+CP*N
348 CALL DAXPY(N,BETA,W(ISCN+1),1,W,1)
349 CP=CP+1
350 IF (CP.EQ.M)CP=0
351 145 CONTINUE
352C
353C STORE THE NEW SEARCH DIRECTION
354C ------------------------------
355C
356 DO 160 I=1,N
357 160 W(ISPT+POINT*N+I)= W(I)
358C
359C OBTAIN THE ONE-DIMENSIONAL MINIMIZER OF THE FUNCTION
360C BY USING THE LINE SEARCH ROUTINE MCSRCH
361C ----------------------------------------------------
362 165 NFEV=0
363 STP=ONE
364 IF (ITER.EQ.1) STP=STP1
365 DO 170 I=1,N
366 170 W(I)=G(I)
367 172 CONTINUE
368 CALL MCSRCH(N,X,F,G,W(ISPT+POINT*N+1),STP,FTOL,
369 * XTOL,MAXFEV,INFO,NFEV,DIAG)
370 IF (INFO .EQ. -1) THEN
371 IFLAG=1
372 RETURN
373 ENDIF
374 IF (INFO .NE. 1) GO TO 190
375 NFUN= NFUN + NFEV
376C
377C COMPUTE THE NEW STEP AND GRADIENT CHANGE
378C -----------------------------------------
379C
380 NPT=POINT*N
381 DO 175 I=1,N
382 W(ISPT+NPT+I)= STP*W(ISPT+NPT+I)
383 175 W(IYPT+NPT+I)= G(I)-W(I)
384 POINT=POINT+1
385 IF (POINT.EQ.M)POINT=0
386C
387C TERMINATION TEST
388C ----------------
389C
390 GNORM= DSQRT(DDOT(N,G,1,G,1))
391 XNORM= DSQRT(DDOT(N,X,1,X,1))
392 XNORM= DMAX1(1.0D0,XNORM)
393 IF (GNORM/XNORM .LE. EPS) FINISH=.TRUE.
394C
395 IF(IPRINT(1).GE.0) CALL LB1(IPRINT,ITER,NFUN,
396 * GNORM,N,M,X,F,G,STP,FINISH)
397 IF (FINISH) THEN
398 IFLAG=0
399 RETURN
400 ENDIF
401 GO TO 80
402C
403C ------------------------------------------------------------
404C END OF MAIN ITERATION LOOP. ERROR EXITS.
405C ------------------------------------------------------------
406C
407 190 IFLAG=-1
408 IF(LP.GT.0) WRITE(LP,200) INFO
409 RETURN
410 195 IFLAG=-2
411 IF(LP.GT.0) WRITE(LP,235) I
412 RETURN
413 196 IFLAG= -3
414 IF(LP.GT.0) WRITE(LP,240)
415C
416C FORMATS
417C -------
418C
419 200 FORMAT(/' IFLAG= -1 ',/' LINE SEARCH FAILED. SEE'
420 . ' DOCUMENTATION OF ROUTINE MCSRCH',/' ERROR RETURN'
421 . ' OF LINE SEARCH: INFO= ',I2,/
422 . ' POSSIBLE CAUSES: FUNCTION OR GRADIENT ARE INCORRECT',/,
423 . ' OR INCORRECT TOLERANCES')
424 235 FORMAT(/' IFLAG= -2',/' THE',I5,'-TH DIAGONAL ELEMENT OF THE',/,
425 . ' INVERSE HESSIAN APPROXIMATION IS NOT POSITIVE')
426 240 FORMAT(/' IFLAG= -3',/' IMPROPER INPUT PARAMETERS (N OR M',
427 . ' ARE NOT POSITIVE)')
428 245 FORMAT(/' GTOL IS LESS THAN OR EQUAL TO 1.D-04',
429 . / ' IT HAS BEEN RESET TO 9.D-01')
430 RETURN
431 END
432C
433C LAST LINE OF SUBROUTINE LBFGS
434C
435C
436 SUBROUTINE LB1(IPRINT,ITER,NFUN,
437 * GNORM,N,M,X,F,G,STP,FINISH)
438C
439C -------------------------------------------------------------
440C THIS ROUTINE PRINTS MONITORING INFORMATION. THE FREQUENCY AND
441C AMOUNT OF OUTPUT ARE CONTROLLED BY IPRINT.
442C -------------------------------------------------------------
443C
444 INTEGER IPRINT(2),ITER,NFUN,LP,MP,N,M
445 DOUBLE PRECISION X(N),G(N),F,GNORM,STP,GTOL,STPMIN,STPMAX
446 LOGICAL FINISH
447 COMMON /LB3/MP,LP,GTOL,STPMIN,STPMAX
448C
449 IF (ITER.EQ.0)THEN
450 WRITE(MP,10)
451 WRITE(MP,20) N,M
452 WRITE(MP,30)F,GNORM
453 IF (IPRINT(2).GE.1)THEN
454 WRITE(MP,40)
455 WRITE(MP,50) (X(I),I=1,N)
456 WRITE(MP,60)
457 WRITE(MP,50) (G(I),I=1,N)
458 ENDIF
459 WRITE(MP,10)
460 WRITE(MP,70)
461 ELSE
462 IF ((IPRINT(1).EQ.0).AND.(ITER.NE.1.AND..NOT.FINISH))RETURN
463 IF (IPRINT(1).NE.0)THEN
464 IF(MOD(ITER-1,IPRINT(1)).EQ.0.OR.FINISH)THEN
465 IF(IPRINT(2).GT.1.AND.ITER.GT.1) WRITE(MP,70)
466 WRITE(MP,80)ITER,NFUN,F,GNORM,STP
467 ELSE
468 RETURN
469 ENDIF
470 ELSE
471 IF( IPRINT(2).GT.1.AND.FINISH) WRITE(MP,70)
472 WRITE(MP,80)ITER,NFUN,F,GNORM,STP
473 ENDIF
474 IF (IPRINT(2).EQ.2.OR.IPRINT(2).EQ.3)THEN
475 IF (FINISH)THEN
476 WRITE(MP,90)
477 ELSE
478 WRITE(MP,40)
479 ENDIF
480 WRITE(MP,50)(X(I),I=1,N)
481 IF (IPRINT(2).EQ.3)THEN
482 WRITE(MP,60)
483 WRITE(MP,50)(G(I),I=1,N)
484 ENDIF
485 ENDIF
486 IF (FINISH) WRITE(MP,100)
487 ENDIF
488C
489 10 FORMAT('*************************************************')
490 20 FORMAT(' N=',I5,' NUMBER OF CORRECTIONS=',I2,
491 . /, ' INITIAL VALUES')
492 30 FORMAT(' F= ',1PD10.3,' GNORM= ',1PD10.3)
493 40 FORMAT(' VECTOR X= ')
494 50 FORMAT(6(2X,1PD10.3))
495 60 FORMAT(' GRADIENT VECTOR G= ')
496 70 FORMAT(/' I NFN',4X,'FUNC',8X,'GNORM',7X,'STEPLENGTH'/)
497 80 FORMAT(2(I4,1X),3X,3(1PD10.3,2X))
498 90 FORMAT(' FINAL POINT X= ')
499 100 FORMAT(/' THE MINIMIZATION TERMINATED WITHOUT DETECTING ERRORS.',
500 . /' IFLAG = 0')
501C
502 RETURN
503 END
504C ******
505C
506C
507C ----------------------------------------------------------
508C DATA
509C ----------------------------------------------------------
510C
511 BLOCK DATA LB2
512 INTEGER LP,MP
513 DOUBLE PRECISION GTOL,STPMIN,STPMAX
514 COMMON /LB3/MP,LP,GTOL,STPMIN,STPMAX
515 DATA MP,LP,GTOL,STPMIN,STPMAX/6,6,9.0D-01,1.0D-20,1.0D+20/
516 END
517C
518C
519C ----------------------------------------------------------
520C
521 subroutine daxpy(n,da,dx,incx,dy,incy)
522c
523c constant times a vector plus a vector.
524c uses unrolled loops for increments equal to one.
525c jack dongarra, linpack, 3/11/78.
526c
527 double precision dx(1),dy(1),da
528 integer i,incx,incy,ix,iy,m,mp1,n
529c
530 if(n.le.0)return
531 if (da .eq. 0.0d0) return
532 if(incx.eq.1.and.incy.eq.1)go to 20
533c
534c code for unequal increments or equal increments
535c not equal to 1
536c
537 ix = 1
538 iy = 1
539 if(incx.lt.0)ix = (-n+1)*incx + 1
540 if(incy.lt.0)iy = (-n+1)*incy + 1
541 do 10 i = 1,n
542 dy(iy) = dy(iy) + da*dx(ix)
543 ix = ix + incx
544 iy = iy + incy
545 10 continue
546 return
547c
548c code for both increments equal to 1
549c
550c
551c clean-up loop
552c
553 20 m = mod(n,4)
554 if( m .eq. 0 ) go to 40
555 do 30 i = 1,m
556 dy(i) = dy(i) + da*dx(i)
557 30 continue
558 if( n .lt. 4 ) return
559 40 mp1 = m + 1
560 do 50 i = mp1,n,4
561 dy(i) = dy(i) + da*dx(i)
562 dy(i + 1) = dy(i + 1) + da*dx(i + 1)
563 dy(i + 2) = dy(i + 2) + da*dx(i + 2)
564 dy(i + 3) = dy(i + 3) + da*dx(i + 3)
565 50 continue
566 return
567 end
568C
569C
570C ----------------------------------------------------------
571C
572 double precision function ddot(n,dx,incx,dy,incy)
573c
574c forms the dot product of two vectors.
575c uses unrolled loops for increments equal to one.
576c jack dongarra, linpack, 3/11/78.
577c
578 double precision dx(1),dy(1),dtemp
579 integer i,incx,incy,ix,iy,m,mp1,n
580c
581 ddot = 0.0d0
582 dtemp = 0.0d0
583 if(n.le.0)return
584 if(incx.eq.1.and.incy.eq.1)go to 20
585c
586c code for unequal increments or equal increments
587c not equal to 1
588c
589 ix = 1
590 iy = 1
591 if(incx.lt.0)ix = (-n+1)*incx + 1
592 if(incy.lt.0)iy = (-n+1)*incy + 1
593 do 10 i = 1,n
594 dtemp = dtemp + dx(ix)*dy(iy)
595 ix = ix + incx
596 iy = iy + incy
597 10 continue
598 ddot = dtemp
599 return
600c
601c code for both increments equal to 1
602c
603c
604c clean-up loop
605c
606 20 m = mod(n,5)
607 if( m .eq. 0 ) go to 40
608 do 30 i = 1,m
609 dtemp = dtemp + dx(i)*dy(i)
610 30 continue
611 if( n .lt. 5 ) go to 60
612 40 mp1 = m + 1
613 do 50 i = mp1,n,5
614 dtemp = dtemp + dx(i)*dy(i) + dx(i + 1)*dy(i + 1) +
615 * dx(i + 2)*dy(i + 2) + dx(i + 3)*dy(i + 3) + dx(i + 4)*dy(i + 4)
616 50 continue
617 60 ddot = dtemp
618 return
619 end
620C ------------------------------------------------------------------
621C
622C **************************
623C LINE SEARCH ROUTINE MCSRCH
624C **************************
625C
626 SUBROUTINE MCSRCH(N,X,F,G,S,STP,FTOL,XTOL,MAXFEV,INFO,NFEV,WA)
627 INTEGER N,MAXFEV,INFO,NFEV
628 DOUBLE PRECISION F,STP,FTOL,GTOL,XTOL,STPMIN,STPMAX
629 DOUBLE PRECISION X(N),G(N),S(N),WA(N)
630 COMMON /LB3/MP,LP,GTOL,STPMIN,STPMAX
631 SAVE
632C
633C SUBROUTINE MCSRCH
634C
635C A slight modification of the subroutine CSRCH of More' and Thuente.
636C The changes are to allow reverse communication, and do not affect
637C the performance of the routine.
638C
639C THE PURPOSE OF MCSRCH IS TO FIND A STEP WHICH SATISFIES
640C A SUFFICIENT DECREASE CONDITION AND A CURVATURE CONDITION.
641C
642C AT EACH STAGE THE SUBROUTINE UPDATES AN INTERVAL OF
643C UNCERTAINTY WITH ENDPOINTS STX AND STY. THE INTERVAL OF
644C UNCERTAINTY IS INITIALLY CHOSEN SO THAT IT CONTAINS A
645C MINIMIZER OF THE MODIFIED FUNCTION
646C
647C F(X+STP*S) - F(X) - FTOL*STP*(GRADF(X)'S).
648C
649C IF A STEP IS OBTAINED FOR WHICH THE MODIFIED FUNCTION
650C HAS A NONPOSITIVE FUNCTION VALUE AND NONNEGATIVE DERIVATIVE,
651C THEN THE INTERVAL OF UNCERTAINTY IS CHOSEN SO THAT IT
652C CONTAINS A MINIMIZER OF F(X+STP*S).
653C
654C THE ALGORITHM IS DESIGNED TO FIND A STEP WHICH SATISFIES
655C THE SUFFICIENT DECREASE CONDITION
656C
657C F(X+STP*S) .LE. F(X) + FTOL*STP*(GRADF(X)'S),
658C
659C AND THE CURVATURE CONDITION
660C
661C ABS(GRADF(X+STP*S)'S)) .LE. GTOL*ABS(GRADF(X)'S).
662C
663C IF FTOL IS LESS THAN GTOL AND IF, FOR EXAMPLE, THE FUNCTION
664C IS BOUNDED BELOW, THEN THERE IS ALWAYS A STEP WHICH SATISFIES
665C BOTH CONDITIONS. IF NO STEP CAN BE FOUND WHICH SATISFIES BOTH
666C CONDITIONS, THEN THE ALGORITHM USUALLY STOPS WHEN ROUNDING
667C ERRORS PREVENT FURTHER PROGRESS. IN THIS CASE STP ONLY
668C SATISFIES THE SUFFICIENT DECREASE CONDITION.
669C
670C THE SUBROUTINE STATEMENT IS
671C
672C SUBROUTINE MCSRCH(N,X,F,G,S,STP,FTOL,XTOL, MAXFEV,INFO,NFEV,WA)
673C WHERE
674C
675C N IS A POSITIVE INTEGER INPUT VARIABLE SET TO THE NUMBER
676C OF VARIABLES.
677C
678C X IS AN ARRAY OF LENGTH N. ON INPUT IT MUST CONTAIN THE
679C BASE POINT FOR THE LINE SEARCH. ON OUTPUT IT CONTAINS
680C X + STP*S.
681C
682C F IS A VARIABLE. ON INPUT IT MUST CONTAIN THE VALUE OF F
683C AT X. ON OUTPUT IT CONTAINS THE VALUE OF F AT X + STP*S.
684C
685C G IS AN ARRAY OF LENGTH N. ON INPUT IT MUST CONTAIN THE
686C GRADIENT OF F AT X. ON OUTPUT IT CONTAINS THE GRADIENT
687C OF F AT X + STP*S.
688C
689C S IS AN INPUT ARRAY OF LENGTH N WHICH SPECIFIES THE
690C SEARCH DIRECTION.
691C
692C STP IS A NONNEGATIVE VARIABLE. ON INPUT STP CONTAINS AN
693C INITIAL ESTIMATE OF A SATISFACTORY STEP. ON OUTPUT
694C STP CONTAINS THE FINAL ESTIMATE.
695C
696C FTOL AND GTOL ARE NONNEGATIVE INPUT VARIABLES. (In this reverse
697C communication implementation GTOL is defined in a COMMON
698C statement.) TERMINATION OCCURS WHEN THE SUFFICIENT DECREASE
699C CONDITION AND THE DIRECTIONAL DERIVATIVE CONDITION ARE
700C SATISFIED.
701C
702C XTOL IS A NONNEGATIVE INPUT VARIABLE. TERMINATION OCCURS
703C WHEN THE RELATIVE WIDTH OF THE INTERVAL OF UNCERTAINTY
704C IS AT MOST XTOL.
705C
706C STPMIN AND STPMAX ARE NONNEGATIVE INPUT VARIABLES WHICH
707C SPECIFY LOWER AND UPPER BOUNDS FOR THE STEP. (In this reverse
708C communication implementatin they are defined in a COMMON
709C statement).
710C
711C MAXFEV IS A POSITIVE INTEGER INPUT VARIABLE. TERMINATION
712C OCCURS WHEN THE NUMBER OF CALLS TO FCN IS AT LEAST
713C MAXFEV BY THE END OF AN ITERATION.
714C
715C INFO IS AN INTEGER OUTPUT VARIABLE SET AS FOLLOWS:
716C
717C INFO = 0 IMPROPER INPUT PARAMETERS.
718C
719C INFO =-1 A RETURN IS MADE TO COMPUTE THE FUNCTION AND GRADIENT.
720C
721C INFO = 1 THE SUFFICIENT DECREASE CONDITION AND THE
722C DIRECTIONAL DERIVATIVE CONDITION HOLD.
723C
724C INFO = 2 RELATIVE WIDTH OF THE INTERVAL OF UNCERTAINTY
725C IS AT MOST XTOL.
726C
727C INFO = 3 NUMBER OF CALLS TO FCN HAS REACHED MAXFEV.
728C
729C INFO = 4 THE STEP IS AT THE LOWER BOUND STPMIN.
730C
731C INFO = 5 THE STEP IS AT THE UPPER BOUND STPMAX.
732C
733C INFO = 6 ROUNDING ERRORS PREVENT FURTHER PROGRESS.
734C THERE MAY NOT BE A STEP WHICH SATISFIES THE
735C SUFFICIENT DECREASE AND CURVATURE CONDITIONS.
736C TOLERANCES MAY BE TOO SMALL.
737C
738C NFEV IS AN INTEGER OUTPUT VARIABLE SET TO THE NUMBER OF
739C CALLS TO FCN.
740C
741C WA IS A WORK ARRAY OF LENGTH N.
742C
743C SUBPROGRAMS CALLED
744C
745C MCSTEP
746C
747C FORTRAN-SUPPLIED...ABS,MAX,MIN
748C
749C ARGONNE NATIONAL LABORATORY. MINPACK PROJECT. JUNE 1983
750C JORGE J. MORE', DAVID J. THUENTE
751C
752C **********
753 INTEGER INFOC,J
754 LOGICAL BRACKT,STAGE1
755 DOUBLE PRECISION DG,DGM,DGINIT,DGTEST,DGX,DGXM,DGY,DGYM,
756 * FINIT,FTEST1,FM,FX,FXM,FY,FYM,P5,P66,STX,STY,
757 * STMIN,STMAX,WIDTH,WIDTH1,XTRAPF,ZERO
758 DATA P5,P66,XTRAPF,ZERO /0.5D0,0.66D0,4.0D0,0.0D0/
759 IF(INFO.EQ.-1) GO TO 45
760 INFOC = 1
761C
762C CHECK THE INPUT PARAMETERS FOR ERRORS.
763C
764 IF (N .LE. 0 .OR. STP .LE. ZERO .OR. FTOL .LT. ZERO .OR.
765 * GTOL .LT. ZERO .OR. XTOL .LT. ZERO .OR. STPMIN .LT. ZERO
766 * .OR. STPMAX .LT. STPMIN .OR. MAXFEV .LE. 0) RETURN
767C
768C COMPUTE THE INITIAL GRADIENT IN THE SEARCH DIRECTION
769C AND CHECK THAT S IS A DESCENT DIRECTION.
770C
771 DGINIT = ZERO
772 DO 10 J = 1, N
773 DGINIT = DGINIT + G(J)*S(J)
774 10 CONTINUE
775 IF (DGINIT .GE. ZERO) then
776 write(LP,15)
777 15 FORMAT(/' THE SEARCH DIRECTION IS NOT A DESCENT DIRECTION')
778 RETURN
779 ENDIF
780C
781C INITIALIZE LOCAL VARIABLES.
782C
783 BRACKT = .FALSE.
784 STAGE1 = .TRUE.
785 NFEV = 0
786 FINIT = F
787 DGTEST = FTOL*DGINIT
788 WIDTH = STPMAX - STPMIN
789 WIDTH1 = WIDTH/P5
790 DO 20 J = 1, N
791 WA(J) = X(J)
792 20 CONTINUE
793C
794C THE VARIABLES STX, FX, DGX CONTAIN THE VALUES OF THE STEP,
795C FUNCTION, AND DIRECTIONAL DERIVATIVE AT THE BEST STEP.
796C THE VARIABLES STY, FY, DGY CONTAIN THE VALUE OF THE STEP,
797C FUNCTION, AND DERIVATIVE AT THE OTHER ENDPOINT OF
798C THE INTERVAL OF UNCERTAINTY.
799C THE VARIABLES STP, F, DG CONTAIN THE VALUES OF THE STEP,
800C FUNCTION, AND DERIVATIVE AT THE CURRENT STEP.
801C
802 STX = ZERO
803 FX = FINIT
804 DGX = DGINIT
805 STY = ZERO
806 FY = FINIT
807 DGY = DGINIT
808C
809C START OF ITERATION.
810C
811 30 CONTINUE
812C
813C SET THE MINIMUM AND MAXIMUM STEPS TO CORRESPOND
814C TO THE PRESENT INTERVAL OF UNCERTAINTY.
815C
816 IF (BRACKT) THEN
817 STMIN = MIN(STX,STY)
818 STMAX = MAX(STX,STY)
819 ELSE
820 STMIN = STX
821 STMAX = STP + XTRAPF*(STP - STX)
822 END IF
823C
824C FORCE THE STEP TO BE WITHIN THE BOUNDS STPMAX AND STPMIN.
825C
826 STP = MAX(STP,STPMIN)
827 STP = MIN(STP,STPMAX)
828C
829C IF AN UNUSUAL TERMINATION IS TO OCCUR THEN LET
830C STP BE THE LOWEST POINT OBTAINED SO FAR.
831C
832 IF ((BRACKT .AND. (STP .LE. STMIN .OR. STP .GE. STMAX))
833 * .OR. NFEV .GE. MAXFEV-1 .OR. INFOC .EQ. 0
834 * .OR. (BRACKT .AND. STMAX-STMIN .LE. XTOL*STMAX)) STP = STX
835C
836C EVALUATE THE FUNCTION AND GRADIENT AT STP
837C AND COMPUTE THE DIRECTIONAL DERIVATIVE.
838C We return to main program to obtain F and G.
839C
840 DO 40 J = 1, N
841 X(J) = WA(J) + STP*S(J)
842 40 CONTINUE
843 INFO=-1
844 RETURN
845C
846 45 INFO=0
847 NFEV = NFEV + 1
848 DG = ZERO
849 DO 50 J = 1, N
850 DG = DG + G(J)*S(J)
851 50 CONTINUE
852 FTEST1 = FINIT + STP*DGTEST
853C
854C TEST FOR CONVERGENCE.
855C
856 IF ((BRACKT .AND. (STP .LE. STMIN .OR. STP .GE. STMAX))
857 * .OR. INFOC .EQ. 0) INFO = 6
858 IF (STP .EQ. STPMAX .AND.
859 * F .LE. FTEST1 .AND. DG .LE. DGTEST) INFO = 5
860 IF (STP .EQ. STPMIN .AND.
861 * (F .GT. FTEST1 .OR. DG .GE. DGTEST)) INFO = 4
862 IF (NFEV .GE. MAXFEV) INFO = 3
863 IF (BRACKT .AND. STMAX-STMIN .LE. XTOL*STMAX) INFO = 2
864 IF (F .LE. FTEST1 .AND. ABS(DG) .LE. GTOL*(-DGINIT)) INFO = 1
865C
866C CHECK FOR TERMINATION.
867C
868 IF (INFO .NE. 0) RETURN
869C
870C IN THE FIRST STAGE WE SEEK A STEP FOR WHICH THE MODIFIED
871C FUNCTION HAS A NONPOSITIVE VALUE AND NONNEGATIVE DERIVATIVE.
872C
873 IF (STAGE1 .AND. F .LE. FTEST1 .AND.
874 * DG .GE. MIN(FTOL,GTOL)*DGINIT) STAGE1 = .FALSE.
875C
876C A MODIFIED FUNCTION IS USED TO PREDICT THE STEP ONLY IF
877C WE HAVE NOT OBTAINED A STEP FOR WHICH THE MODIFIED
878C FUNCTION HAS A NONPOSITIVE FUNCTION VALUE AND NONNEGATIVE
879C DERIVATIVE, AND IF A LOWER FUNCTION VALUE HAS BEEN
880C OBTAINED BUT THE DECREASE IS NOT SUFFICIENT.
881C
882 IF (STAGE1 .AND. F .LE. FX .AND. F .GT. FTEST1) THEN
883C
884C DEFINE THE MODIFIED FUNCTION AND DERIVATIVE VALUES.
885C
886 FM = F - STP*DGTEST
887 FXM = FX - STX*DGTEST
888 FYM = FY - STY*DGTEST
889 DGM = DG - DGTEST
890 DGXM = DGX - DGTEST
891 DGYM = DGY - DGTEST
892C
893C CALL CSTEP TO UPDATE THE INTERVAL OF UNCERTAINTY
894C AND TO COMPUTE THE NEW STEP.
895C
896 CALL MCSTEP(STX,FXM,DGXM,STY,FYM,DGYM,STP,FM,DGM,
897 * BRACKT,STMIN,STMAX,INFOC)
898C
899C RESET THE FUNCTION AND GRADIENT VALUES FOR F.
900C
901 FX = FXM + STX*DGTEST
902 FY = FYM + STY*DGTEST
903 DGX = DGXM + DGTEST
904 DGY = DGYM + DGTEST
905 ELSE
906C
907C CALL MCSTEP TO UPDATE THE INTERVAL OF UNCERTAINTY
908C AND TO COMPUTE THE NEW STEP.
909C
910 CALL MCSTEP(STX,FX,DGX,STY,FY,DGY,STP,F,DG,
911 * BRACKT,STMIN,STMAX,INFOC)
912 END IF
913C
914C FORCE A SUFFICIENT DECREASE IN THE SIZE OF THE
915C INTERVAL OF UNCERTAINTY.
916C
917 IF (BRACKT) THEN
918 IF (ABS(STY-STX) .GE. P66*WIDTH1)
919 * STP = STX + P5*(STY - STX)
920 WIDTH1 = WIDTH
921 WIDTH = ABS(STY-STX)
922 END IF
923C
924C END OF ITERATION.
925C
926 GO TO 30
927C
928C LAST LINE OF SUBROUTINE MCSRCH.
929C
930 END
931 SUBROUTINE MCSTEP(STX,FX,DX,STY,FY,DY,STP,FP,DP,BRACKT,
932 * STPMIN,STPMAX,INFO)
933 INTEGER INFO
934 DOUBLE PRECISION STX,FX,DX,STY,FY,DY,STP,FP,DP,STPMIN,STPMAX
935 LOGICAL BRACKT,BOUND
936C
937C SUBROUTINE MCSTEP
938C
939C THE PURPOSE OF MCSTEP IS TO COMPUTE A SAFEGUARDED STEP FOR
940C A LINESEARCH AND TO UPDATE AN INTERVAL OF UNCERTAINTY FOR
941C A MINIMIZER OF THE FUNCTION.
942C
943C THE PARAMETER STX CONTAINS THE STEP WITH THE LEAST FUNCTION
944C VALUE. THE PARAMETER STP CONTAINS THE CURRENT STEP. IT IS
945C ASSUMED THAT THE DERIVATIVE AT STX IS NEGATIVE IN THE
946C DIRECTION OF THE STEP. IF BRACKT IS SET TRUE THEN A
947C MINIMIZER HAS BEEN BRACKETED IN AN INTERVAL OF UNCERTAINTY
948C WITH ENDPOINTS STX AND STY.
949C
950C THE SUBROUTINE STATEMENT IS
951C
952C SUBROUTINE MCSTEP(STX,FX,DX,STY,FY,DY,STP,FP,DP,BRACKT,
953C STPMIN,STPMAX,INFO)
954C
955C WHERE
956C
957C STX, FX, AND DX ARE VARIABLES WHICH SPECIFY THE STEP,
958C THE FUNCTION, AND THE DERIVATIVE AT THE BEST STEP OBTAINED
959C SO FAR. THE DERIVATIVE MUST BE NEGATIVE IN THE DIRECTION
960C OF THE STEP, THAT IS, DX AND STP-STX MUST HAVE OPPOSITE
961C SIGNS. ON OUTPUT THESE PARAMETERS ARE UPDATED APPROPRIATELY.
962C
963C STY, FY, AND DY ARE VARIABLES WHICH SPECIFY THE STEP,
964C THE FUNCTION, AND THE DERIVATIVE AT THE OTHER ENDPOINT OF
965C THE INTERVAL OF UNCERTAINTY. ON OUTPUT THESE PARAMETERS ARE
966C UPDATED APPROPRIATELY.
967C
968C STP, FP, AND DP ARE VARIABLES WHICH SPECIFY THE STEP,
969C THE FUNCTION, AND THE DERIVATIVE AT THE CURRENT STEP.
970C IF BRACKT IS SET TRUE THEN ON INPUT STP MUST BE
971C BETWEEN STX AND STY. ON OUTPUT STP IS SET TO THE NEW STEP.
972C
973C BRACKT IS A LOGICAL VARIABLE WHICH SPECIFIES IF A MINIMIZER
974C HAS BEEN BRACKETED. IF THE MINIMIZER HAS NOT BEEN BRACKETED
975C THEN ON INPUT BRACKT MUST BE SET FALSE. IF THE MINIMIZER
976C IS BRACKETED THEN ON OUTPUT BRACKT IS SET TRUE.
977C
978C STPMIN AND STPMAX ARE INPUT VARIABLES WHICH SPECIFY LOWER
979C AND UPPER BOUNDS FOR THE STEP.
980C
981C INFO IS AN INTEGER OUTPUT VARIABLE SET AS FOLLOWS:
982C IF INFO = 1,2,3,4,5, THEN THE STEP HAS BEEN COMPUTED
983C ACCORDING TO ONE OF THE FIVE CASES BELOW. OTHERWISE
984C INFO = 0, AND THIS INDICATES IMPROPER INPUT PARAMETERS.
985C
986C SUBPROGRAMS CALLED
987C
988C FORTRAN-SUPPLIED ... ABS,MAX,MIN,SQRT
989C
990C ARGONNE NATIONAL LABORATORY. MINPACK PROJECT. JUNE 1983
991C JORGE J. MORE', DAVID J. THUENTE
992C
993 DOUBLE PRECISION GAMMA,P,Q,R,S,SGND,STPC,STPF,STPQ,THETA
994 INFO = 0
995C
996C CHECK THE INPUT PARAMETERS FOR ERRORS.
997C
998 IF ((BRACKT .AND. (STP .LE. MIN(STX,STY) .OR.
999 * STP .GE. MAX(STX,STY))) .OR.
1000 * DX*(STP-STX) .GE. 0.0 .OR. STPMAX .LT. STPMIN) RETURN
1001C
1002C DETERMINE IF THE DERIVATIVES HAVE OPPOSITE SIGN.
1003C
1004 SGND = DP*(DX/ABS(DX))
1005C
1006C FIRST CASE. A HIGHER FUNCTION VALUE.
1007C THE MINIMUM IS BRACKETED. IF THE CUBIC STEP IS CLOSER
1008C TO STX THAN THE QUADRATIC STEP, THE CUBIC STEP IS TAKEN,
1009C ELSE THE AVERAGE OF THE CUBIC AND QUADRATIC STEPS IS TAKEN.
1010C
1011 IF (FP .GT. FX) THEN
1012 INFO = 1
1013 BOUND = .TRUE.
1014 THETA = 3*(FX - FP)/(STP - STX) + DX + DP
1015 S = MAX(ABS(THETA),ABS(DX),ABS(DP))
1016 GAMMA = S*SQRT((THETA/S)**2 - (DX/S)*(DP/S))
1017 IF (STP .LT. STX) GAMMA = -GAMMA
1018 P = (GAMMA - DX) + THETA
1019 Q = ((GAMMA - DX) + GAMMA) + DP
1020 R = P/Q
1021 STPC = STX + R*(STP - STX)
1022 STPQ = STX + ((DX/((FX-FP)/(STP-STX)+DX))/2)*(STP - STX)
1023 IF (ABS(STPC-STX) .LT. ABS(STPQ-STX)) THEN
1024 STPF = STPC
1025 ELSE
1026 STPF = STPC + (STPQ - STPC)/2
1027 END IF
1028 BRACKT = .TRUE.
1029C
1030C SECOND CASE. A LOWER FUNCTION VALUE AND DERIVATIVES OF
1031C OPPOSITE SIGN. THE MINIMUM IS BRACKETED. IF THE CUBIC
1032C STEP IS CLOSER TO STX THAN THE QUADRATIC (SECANT) STEP,
1033C THE CUBIC STEP IS TAKEN, ELSE THE QUADRATIC STEP IS TAKEN.
1034C
1035 ELSE IF (SGND .LT. 0.0) THEN
1036 INFO = 2
1037 BOUND = .FALSE.
1038 THETA = 3*(FX - FP)/(STP - STX) + DX + DP
1039 S = MAX(ABS(THETA),ABS(DX),ABS(DP))
1040 GAMMA = S*SQRT((THETA/S)**2 - (DX/S)*(DP/S))
1041 IF (STP .GT. STX) GAMMA = -GAMMA
1042 P = (GAMMA - DP) + THETA
1043 Q = ((GAMMA - DP) + GAMMA) + DX
1044 R = P/Q
1045 STPC = STP + R*(STX - STP)
1046 STPQ = STP + (DP/(DP-DX))*(STX - STP)
1047 IF (ABS(STPC-STP) .GT. ABS(STPQ-STP)) THEN
1048 STPF = STPC
1049 ELSE
1050 STPF = STPQ
1051 END IF
1052 BRACKT = .TRUE.
1053C
1054C THIRD CASE. A LOWER FUNCTION VALUE, DERIVATIVES OF THE
1055C SAME SIGN, AND THE MAGNITUDE OF THE DERIVATIVE DECREASES.
1056C THE CUBIC STEP IS ONLY USED IF THE CUBIC TENDS TO INFINITY
1057C IN THE DIRECTION OF THE STEP OR IF THE MINIMUM OF THE CUBIC
1058C IS BEYOND STP. OTHERWISE THE CUBIC STEP IS DEFINED TO BE
1059C EITHER STPMIN OR STPMAX. THE QUADRATIC (SECANT) STEP IS ALSO
1060C COMPUTED AND IF THE MINIMUM IS BRACKETED THEN THE THE STEP
1061C CLOSEST TO STX IS TAKEN, ELSE THE STEP FARTHEST AWAY IS TAKEN.
1062C
1063 ELSE IF (ABS(DP) .LT. ABS(DX)) THEN
1064 INFO = 3
1065 BOUND = .TRUE.
1066 THETA = 3*(FX - FP)/(STP - STX) + DX + DP
1067 S = MAX(ABS(THETA),ABS(DX),ABS(DP))
1068C
1069C THE CASE GAMMA = 0 ONLY ARISES IF THE CUBIC DOES NOT TEND
1070C TO INFINITY IN THE DIRECTION OF THE STEP.
1071C
1072 GAMMA = S*SQRT(MAX(0.0D0,(THETA/S)**2 - (DX/S)*(DP/S)))
1073 IF (STP .GT. STX) GAMMA = -GAMMA
1074 P = (GAMMA - DP) + THETA
1075 Q = (GAMMA + (DX - DP)) + GAMMA
1076 R = P/Q
1077 IF (R .LT. 0.0 .AND. GAMMA .NE. 0.0) THEN
1078 STPC = STP + R*(STX - STP)
1079 ELSE IF (STP .GT. STX) THEN
1080 STPC = STPMAX
1081 ELSE
1082 STPC = STPMIN
1083 END IF
1084 STPQ = STP + (DP/(DP-DX))*(STX - STP)
1085 IF (BRACKT) THEN
1086 IF (ABS(STP-STPC) .LT. ABS(STP-STPQ)) THEN
1087 STPF = STPC
1088 ELSE
1089 STPF = STPQ
1090 END IF
1091 ELSE
1092 IF (ABS(STP-STPC) .GT. ABS(STP-STPQ)) THEN
1093 STPF = STPC
1094 ELSE
1095 STPF = STPQ
1096 END IF
1097 END IF
1098C
1099C FOURTH CASE. A LOWER FUNCTION VALUE, DERIVATIVES OF THE
1100C SAME SIGN, AND THE MAGNITUDE OF THE DERIVATIVE DOES
1101C NOT DECREASE. IF THE MINIMUM IS NOT BRACKETED, THE STEP
1102C IS EITHER STPMIN OR STPMAX, ELSE THE CUBIC STEP IS TAKEN.
1103C
1104 ELSE
1105 INFO = 4
1106 BOUND = .FALSE.
1107 IF (BRACKT) THEN
1108 THETA = 3*(FP - FY)/(STY - STP) + DY + DP
1109 S = MAX(ABS(THETA),ABS(DY),ABS(DP))
1110 GAMMA = S*SQRT((THETA/S)**2 - (DY/S)*(DP/S))
1111 IF (STP .GT. STY) GAMMA = -GAMMA
1112 P = (GAMMA - DP) + THETA
1113 Q = ((GAMMA - DP) + GAMMA) + DY
1114 R = P/Q
1115 STPC = STP + R*(STY - STP)
1116 STPF = STPC
1117 ELSE IF (STP .GT. STX) THEN
1118 STPF = STPMAX
1119 ELSE
1120 STPF = STPMIN
1121 END IF
1122 END IF
1123C
1124C UPDATE THE INTERVAL OF UNCERTAINTY. THIS UPDATE DOES NOT
1125C DEPEND ON THE NEW STEP OR THE CASE ANALYSIS ABOVE.
1126C
1127 IF (FP .GT. FX) THEN
1128 STY = STP
1129 FY = FP
1130 DY = DP
1131 ELSE
1132 IF (SGND .LT. 0.0) THEN
1133 STY = STX
1134 FY = FX
1135 DY = DX
1136 END IF
1137 STX = STP
1138 FX = FP
1139 DX = DP
1140 END IF
1141C
1142C COMPUTE THE NEW STEP AND SAFEGUARD IT.
1143C
1144 STPF = MIN(STPMAX,STPF)
1145 STPF = MAX(STPMIN,STPF)
1146 STP = STPF
1147 IF (BRACKT .AND. BOUND) THEN
1148 IF (STY .GT. STX) THEN
1149 STP = MIN(STX+0.66*(STY-STX),STP)
1150 ELSE
1151 STP = MAX(STX+0.66*(STY-STX),STP)
1152 END IF
1153 END IF
1154 RETURN
1155C
1156C LAST LINE OF SUBROUTINE MCSTEP.
1157C
1158 END
1159
Note: See TracBrowser for help on using the repository browser.