subroutine curvefit_lmdif_sub(model_func,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
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
!
tol_ = 1.d-15;if(present(tol))tol_=tol
!
n=size(a)
m=size(xdata)
!
call lmdif1(curvefit_lmdif_sub2sub,m,n,a,fvec,tol_,info_)
!
if(present(info))info=info_
contains
subroutine curvefit_lmdif_sub2sub(m,n,a,fvec,iflag)
integer :: m
integer :: n
real(8) :: a(n)
real(8) :: fvec(m),fvec_(m)
integer :: iflag
call model_func(xdata,a,fvec_)
fvec = fvec_ - ydata
if(iflag<0)stop "CURVEFIT_LMDIF_sub2sub ERROR: iflag < 0 "
end subroutine curvefit_lmdif_sub2sub
end subroutine curvefit_lmdif_sub