subroutine leastsq_lmder_sub(func,dfunc,a,m,tol,info)
interface
subroutine func(a,m,f)
real(8),dimension(:) :: a
integer :: m
real(8),dimension(m) :: f
end subroutine func
!
subroutine dfunc(a,m,df)
real(8),dimension(:) :: a
integer :: m
real(8),dimension(m,size(a)) :: df
end subroutine 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_sub2sub,m,n,a,fvec,fjac,m,tol_,info_)
if(present(info))info=info_
include "leastsq_error.h90"
contains
subroutine leastsq_lmder1_sub2sub(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
call func(a,m,fvec)
elseif(iflag==2)then
call dfunc(a,m,fjac)
endif
if(iflag<0)stop "LEASTSQ_LMDER1_sub2sub ERROR: iflag < 0 "
end subroutine leastsq_lmder1_sub2sub
end subroutine leastsq_lmder_sub