4 USE stel_kinds,
ONLY: dp
6 REAL(dp),
DIMENSION(:),
POINTER :: pcom,xicom
21 REAL(dp),
INTENT(IN) :: x
24 REAL(dp),
DIMENSION(:),
ALLOCATABLE :: xt
26 xt(:)=pcom(:)+x*xicom(:)
32 SUBROUTINE fletcher_reeves (p,ftol,iter,fret,n)
33 USE stel_kinds,
ONLY: dp
35 INTEGER,
INTENT(IN) :: n
36 INTEGER,
INTENT(OUT) :: iter
37 REAL(dp),
INTENT(IN) :: ftol
38 REAL(dp),
INTENT(OUT) :: fret
39 REAL(dp),
DIMENSION(n),
INTENT(INOUT) :: p
41 INTEGER,
PARAMETER :: itmax=50
42 REAL(dp),
PARAMETER :: eps=1.0e-10_dp
53 REAL(dp) :: dgg,fp,gam,gg
54 REAL(dp),
ALLOCATABLE,
DIMENSION(:) :: g, h, xi
57 ALLOCATE (g(
SIZE(p)), h(
SIZE(p)), xi(
SIZE(p)))
65 CALL linmin(p,xi,fret)
66 IF (2*abs(fret-fp) <= ftol*(abs(fret)+abs(fp)+eps))
RETURN
71 dgg=dot_product(xi+g,xi)
72 IF (gg == 0._dp)
RETURN
81 END SUBROUTINE fletcher_reeves
85 USE stel_kinds,
ONLY: dp
89 REAL(dp),
DIMENSION(:),
INTENT(IN) :: p
98 USE stel_kinds,
ONLY: dp
103 REAL(dp),
DIMENSION(:),
INTENT(IN) :: p
104 REAL(dp),
DIMENSION(SIZE(p)) :: dfunc
113 SUBROUTINE linmin(p,xi,fret)
115 REAL(dp),
INTENT(OUT) :: fret
116 REAL(dp),
DIMENSION(:),
TARGET,
INTENT(INOUT) :: p,xi
117 REAL(dp),
PARAMETER :: tol=1.0e-4_dp
124 REAL(dp) :: ax,bx,fa,fb,fx,xmin,xx
132 CALL mnbrak(ax,xx,bx,fa,fx,fb,f1dim)
133 fret=brent(ax,xx,bx,f1dim,tol,xmin)
136 END SUBROUTINE linmin
139 SUBROUTINE mnbrak(ax,bx,cx,fa,fb,fc,func)
140 USE stel_kinds,
ONLY: dp
142 REAL(dp),
INTENT(INOUT) :: ax,bx
143 REAL(dp),
INTENT(OUT) :: cx,fa,fb,fc
146 USE stel_kinds,
ONLY: dp
148 REAL(dp),
INTENT(IN) :: x
152 REAL(dp),
PARAMETER :: GOLD=1.618034_dp,glimit=100.0_dp,tiny=1.0e-20_dp, zero=0
159 REAL(dp) :: fu,q,r,u,ulim
175 u=bx-((bx-cx)*q-(bx-ax)*r)/(2*sign(max(abs(q-r),tiny),q-r))
176 ulim=bx+glimit*(cx-bx)
178 if ((bx-u)*(u-cx) > zero)
then
186 else if (fu > fb)
then
193 else if ((cx-u)*(u-ulim) > zero)
then
199 call shft(fb,fc,fu,func(u))
201 else if ((u-ulim)*(ulim-cx) >= zero)
then
208 call shft(ax,bx,cx,u)
209 call shft(fa,fb,fc,fu)
213 END SUBROUTINE mnbrak
216 FUNCTION brent(ax,bx,cx,func,tol,xmin)
217 USE stel_kinds,
ONLY: dp
219 REAL(dp),
INTENT(IN) :: ax,bx,cx,tol
220 REAL(dp),
INTENT(OUT) :: xmin
222 REAL(dp),
EXTERNAL :: func
224 INTEGER,
PARAMETER :: itmax=100
225 REAL(dp),
PARAMETER :: cgold=0.3819660_dp,zeps=1.0e-3_dp*epsilon(ax)
235 REAL(dp) :: a,b,d,e,etemp,fu,fv,fw,fx,p,q,r,tol1,tol2,u,v,w,x,xm
250 if (abs(x-xm) <= (tol2-0.5_dp*(b-a)))
then
255 if (abs(e) > tol1)
then
264 if (abs(p) >= abs(0.5_dp*q*etemp) .or. &
265 p <= q*(a-x) .or. p >= q*(b-x))
then
268 e=merge(a-x,b-x, x >= xm)
273 if (u-a < tol2 .or. b-u < tol2) d=sign(tol1,xm-x)
276 e=merge(a-x,b-x, x >= xm )
279 u=merge(x+d,x+sign(tol1,d), abs(d) >= tol1 )
290 call shft(fv,fw,fx,fu)
297 if (fu <= fw .or. w == x)
then
302 else if (fu <= fv .or. v == x .or. v == w)
then
313 USE stel_kinds,
ONLY: dp
314 REAL(dp),
INTENT(INOUT) :: a,b
323 SUBROUTINE shft(a,b,c,d)
324 USE stel_kinds,
ONLY: dp
325 REAL(dp),
INTENT(OUT) :: a
326 REAL(dp),
INTENT(INOUT) :: b,c
327 REAL(dp),
INTENT(IN) :: d