subroutine leastsq_lmder_func(func,dfunc,a,m,tol,info)
interface
function func(a,m)
real(8),dimension(:) :: a
integer :: m
real(8),dimension(m) :: func
end function func
!
function dfunc(a,m)
real(8),dimension(:) :: a
integer :: m
real(8),dimension(m,size(a)) :: dfunc
end function dfunc
end interface
real(8),dimension(:) :: a
integer :: m
real(8),optional :: tol
integer,optional :: info
real(8) :: tol_
integer :: info_
integer :: n
real(8),dimension(m) :: fvec
real(8),dimension(m,size(a)) :: fjac
tol_ = 1.d-15;if(present(tol))tol_=tol
n=size(a)
call lmder1(leastsq_lmder1_func2sub,m,n,a,fvec,fjac,m,tol_,info_)
if(present(info))info=info_
include "leastsq_error.h90"
contains
subroutine leastsq_lmder1_func2sub(m,n,a,fvec,fjac,ldfjac,iflag)
integer :: m
integer :: n
integer :: ldfjac
real(8) :: a(n)
real(8) :: fvec(m)
real(8) :: fjac(ldfjac,n)
integer :: iflag
if(iflag==1)then
fvec = func(a,m)
elseif(iflag==2)then
fjac = dfunc(a,m)
endif
if(iflag<0)stop "LEASTSQ_LMDER1_func2sub ERROR: iflag < 0 "
end subroutine leastsq_lmder1_func2sub
end subroutine leastsq_lmder_func