36 INTEGER,
PARAMETER :: msfd=20
44 DOUBLE PRECISION,
DIMENSION(4,msfd) :: sfd
45 DOUBLE PRECISION :: stmx=0.9
46 DOUBLE PRECISION :: gtol
68 SUBROUTINE ptline(n,x,f,g,s,step, info) ! - 2 arguments
72 INTEGER,
INTENT(IN) :: n
73 DOUBLE PRECISION,
INTENT(IN OUT) :: x(n)
74 DOUBLE PRECISION,
INTENT(IN OUT) :: f
75 DOUBLE PRECISION,
INTENT(IN OUT) :: g(n)
76 DOUBLE PRECISION,
INTENT(IN OUT) :: s(n)
77 DOUBLE PRECISION,
INTENT(OUT) :: step
78 INTEGER,
INTENT(OUT) :: info
84 DOUBLE PRECISION :: alpha
85 DOUBLE PRECISION :: dginit
86 DOUBLE PRECISION :: dg
87 DOUBLE PRECISION :: fsaved
88 DOUBLE PRECISION :: tot
89 DOUBLE PRECISION :: fp1
90 DOUBLE PRECISION :: fp2
103 IF(dginit >= 0.0d0) go to 100
122 IF(dg < sfd(3,im))
THEN
128 IF(dg >= sfd(3,idgl)) idgl=nsfd
131 IF(idgr == 0) idgr=nsfd
132 IF(dg <= sfd(3,idgr)) idgr=nsfd
144 sfd(4,nsfd)=(sfd(1,i1)*fp2-sfd(1,i2)*fp1)/(fp2-fp1)
147 IF(nsfd >= minf.AND.abs(dg) <= abs(dginit)*gtol)
THEN
153 IF(sfd(3,idgr)+sfd(3,idgl) < 0.0d0) idgm=idgr
157 IF(nsfd >= maxf) go to 102
158 alpha=min(sfd(4,nsfd),stmx)-tot
159 IF(abs(alpha) < 1.0d-3.AND.sfd(4,nsfd) > stmx) go to 103
160 IF(abs(alpha) < 1.0d-3) go to 104
182 IF(abs(sfd(3,i)) < abs(sfd(3,im))) im=i
184 alpha=sfd(1,im)-sfd(1,nsfd)
185 IF(im == nsfd) return
211 SUBROUTINE ptldef(gtole,stmax,minfe,maxfe)
215 INTEGER,
INTENT(IN) :: minfe
216 INTEGER,
INTENT(IN) :: maxfe
217 REAL,
INTENT(IN) :: gtole
218 REAL,
INTENT(IN) :: stmax
220 gtol=max(1.0e-4,min(gtole,0.9e0))
221 IF(gtole == 0.0) gtol=0.9d0
223 IF(stmx == 0.0d0) stmx=10.0d0
224 minf=max(1,min(minfe,msfd-2))
225 maxf=max(2,min(maxfe,msfd-1))
226 IF(maxfe == 0) maxf=5
241 INTEGER,
INTENT(OUT) :: nf
242 INTEGER,
INTENT(OUT) :: m
243 REAL,
DIMENSION(3),
INTENT(OUT) :: slopes
244 REAL,
DIMENSION(3),
INTENT(OUT) :: steps
258 IF(abs(sfd(3,i)) < abs(sfd(3,m))) m=i
260 slopes(1)=
REAL(sfd(3,1))
261 slopes(2)=
REAL(sfd(3,nsfd))
262 slopes(3)=
REAL(sfd(3,m))
263 steps(1) =
REAL(sfd(1,1))
264 steps(2) =
REAL(sfd(1,nsfd))
265 steps(3) =
REAL(sfd(1,m))
281 INTEGER,
INTENT(IN) :: lunp
283 CHARACTER (LEN=2) :: tlr
289 WRITE(lun,*)
'PTLINE: line-search method based on slopes', &
290 ' with sufficient slope-decrease'
291 WRITE(lun,*)
'PTLDEF: slope ratio limit=',gtol
292 WRITE(lun,*)
'PTLDEF: maximum step =',stmx
293 WRITE(lun,*)
'PTLDEF:',minf,
' <= nr of calls <=',maxf
297 IF(abs(sfd(3,i)) < abs(sfd(3,im))) im=i
302 IF(i == idgl) tlr(1:1)=
'L'
303 IF(i == idgr) tlr(2:2)=
'R'
305 WRITE(lun,102) i-1, sfd(1,i),tlr,(sfd(j,i),j=2,4)
307 ratio=
REAL(abs(sfd(3,i)/sfd(3,1)))
308 WRITE(lun,103) i-1, sfd(1,i),tlr,(sfd(j,i),j=2,4),ratio
312 IF(lsinfo == 0)
WRITE(lun,*) &
313 'PTLINE: INFO=0 input error (e.g. gradient not negative)'
314 IF(lsinfo == 1)
WRITE(lun,*)
'PTLINE: INFO=1 convergence reached'
315 IF(lsinfo == 2)
WRITE(lun,*)
'PTLINE: INFO=2 too many function calls'
316 IF(lsinfo == 3)
WRITE(lun,*)
'PTLINE: INFO=3 maximum step reached'
317 IF(lsinfo == 4)
WRITE(lun,*)
'PTLINE: INFO=4 step too small (< 0.001)'
320 101 format(
' i x F(x) F''(X)', &
322 102 format(i3,f12.6,1x,a2,g15.6,g14.6,f12.6,
' ratio')
323 103 format(i3,f12.6,1x,a2,g15.6,g14.6,f12.6,f10.3)