subroutine fmin_cgminimize_sub(p,fcn,iter,fret,ftol,itmax,iverbose,mode,new_version,hh_par)
real(8),dimension(:),intent(inout) :: p
interface
subroutine fcn(n,x_,f_)
integer :: n
real(8),dimension(n) :: x_
real(8) :: f_
end subroutine fcn
end interface
integer :: iter
real(8) :: fret
real(8),optional :: ftol
real(8) :: ftol_
integer, optional :: itmax,mode
integer :: itmax_,mode_,iprint_
integer :: n
real(8) :: f
real(8),allocatable,dimension(:) :: x,g,h,w,xprmt
real(8) :: dfn,deps,hh
integer :: iexit,itn
logical,optional :: new_version
logical :: new_version_
logical,optional :: iverbose
logical :: iverbose_
real(8),optional :: hh_par
!
iverbose_=.false.;if(present(iverbose))iverbose_=iverbose
new_version_=.false.;if(present(new_version))new_version_=new_version
iprint_=0;if(iverbose_)iprint_=1
!
ftol_=1.d-5
if(present(ftol))then
ftol_=ftol
if(iverbose_)write(*,"(A,ES9.2)")"CG-mininize: ftol updated to:",ftol
endif
itmax_=1000
if(present(itmax))then
itmax_=itmax
if(iverbose_)write(*,"(A,I5)")"CG-minimize: itmax updated to:",itmax
endif
mode_ =1
if(present(mode))then
mode_=mode_
if(iverbose_)write(*,"(A,I5)")"CG-minimize: mode updated to:",mode
endif
n=size(p)
allocate(x(n),g(n),h(n*n),w(100*n),xprmt(n))
dfn=-0.5d0
hh = 1d-5 ; if(present(hh_par))hh = hh_par
iexit=0
!set initial point
x=p
xprmt=abs(p)+1.d-15
select case(new_version_)
case (.true.)
if(iverbose_)write(*,"(A,I5)")"CG-minimize: using New version:"
call minimize_sascha_(fcn,n,x,f,g,h,w,&
dfn,xprmt,hh,ftol_,mode_,itmax_,iprint_,iexit,itn)
case (.false.)
if(iverbose_)write(*,"(A,I5)")"CG-minimize: using Old version:"
call minimize_krauth_(fcn,n,x,f,g,h,w,&
dfn,xprmt,hh,ftol_,mode_,itmax_,iprint_,iexit,itn)
end select
!set output variables
iter=itn
fret=f
p=x
deallocate(x,g,h,w,xprmt)
end subroutine fmin_cgminimize_sub