subroutine curvefit_lmder_sub(model_func,model_dfunc,a,xdata,ydata,tol,info)
interface
subroutine model_func(x,a,f)
real(8),dimension(:) :: x
real(8),dimension(:) :: a
real(8),dimension(size(x)) :: f
end subroutine model_func
!
subroutine model_dfunc(x,a,df)
real(8),dimension(:) :: x
real(8),dimension(:) :: a
real(8),dimension(size(x),size(a)) :: df
end subroutine model_dfunc
end interface
real(8),dimension(:) :: a
real(8),dimension(:) :: xdata
real(8),dimension(size(xdata)) :: ydata
integer :: m
real(8),optional :: tol
integer,optional :: info
real(8) :: tol_
integer :: info_
integer :: n
real(8),dimension(size(xdata)) :: fvec
real(8),dimension(size(xdata),size(a)) :: fjac
tol_ = 1.d-15;if(present(tol))tol_=tol
n=size(a)
m=size(xdata)
call lmder1(curvefit_lmder1_sub2sub,m,n,a,fvec,fjac,m,tol_,info_)
if(present(info))info=info_
contains
subroutine curvefit_lmder1_sub2sub(m,n,a,fvec,fjac,ldfjac,iflag)
integer :: m
integer :: n
integer :: ldfjac
real(8) :: a(n)
real(8) :: fvec(m),fvec_(m)
real(8) :: fjac(ldfjac,n)
integer :: iflag
if(iflag==1)then
call model_func(xdata,a,fvec_)
fvec = fvec_ - ydata
elseif(iflag==2)then
call model_dfunc(xdata,a,fjac)
endif
if(iflag<0)stop "CURVEFIT_LMDER1_sub2sub ERROR: iflag < 0 "
end subroutine curvefit_lmder1_sub2sub
end subroutine curvefit_lmder_sub