subroutine fmin_cgminimize_func(p,fcn,iter,fret,ftol,itmax,iverbose,mode,new_version,hh_par)
real(8),dimension(:),intent(inout) :: p
procedure(cgfit_func) :: fcn
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
!
if(associated(func))nullify(func) ; func=>fcn
!
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_func