curvefit_lmdif_sub Subroutine

subroutine curvefit_lmdif_sub(model_func, a, xdata, ydata, tol, info)

Arguments

Type IntentOptional Attributes Name
subroutine model_func(x, a, f)
Arguments
Type IntentOptional Attributes Name
real(kind=8), dimension(:) :: x
real(kind=8), dimension(:) :: a
real(kind=8), dimension(size(x)) :: f
real(kind=8), dimension(:) :: a
real(kind=8), dimension(:) :: xdata
real(kind=8), dimension(size(xdata)) :: ydata
real(kind=8), optional :: tol
integer, optional :: info

Calls

proc~~curvefit_lmdif_sub~~CallsGraph proc~curvefit_lmdif_sub curvefit_lmdif_sub lmdif1 lmdif1 proc~curvefit_lmdif_sub->lmdif1

Source Code

  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