SUBROUTINE dlinmin(p,xi,fret,ftol,itmax)
real(8), intent(out) :: fret
real(8), dimension(:), target, intent(inout) :: p,xi
real(8),optional :: ftol
integer,optional :: itmax
real(8) :: tol
integer :: itmax_
real(8) :: ax,bx,fa,fb,fx,xmin,xx
tol=1.d-6;if(present(ftol))tol=ftol
itmax_=100;if(present(itmax))itmax_=itmax
ncom=size(p) ; if(ncom /= size(xi))stop "Error in DLinMin"
pcom=>p
xicom=>xi
ax=0.d0
xx=1.d0
call mnbrak(ax,xx,bx,fa,fx,fb,f1dim)
fret=dbrent_(ax,xx,bx,f1dim,df1dim,tol,xmin,itmax_)
xi=xmin*xi
p=p+xi
return
end subroutine dlinmin