MODULE f1dim_mod USE nrtype INTEGER(I4B) :: ncom REAL(dp), DIMENSION(:), POINTER :: pcom,xicom CONTAINS !BL ! Added extra argument to enable shared library building. ! See func_destroyer_mod doc. FUNCTION f1dim_extended(x, func_f1dim) IMPLICIT NONE REAL(dp), INTENT(IN) :: x REAL(dp) :: f1dim_extended INTERFACE FUNCTION func_f1dim(x) USE nrtype REAL(dp), DIMENSION(:), INTENT(IN) :: x REAL(dp) :: func_f1dim END FUNCTION func_f1dim END INTERFACE REAL(dp), DIMENSION(:), ALLOCATABLE :: xt allocate(xt(ncom)) xt(:)=pcom(:)+x*xicom(:) f1dim_extended=func_f1dim(xt) deallocate(xt) END FUNCTION f1dim_extended END MODULE f1dim_mod ! Added extra argument to enable shared library building. ! See func_destroyer_mod doc. SUBROUTINE linmin(p,xi,fret, func_f1dim) use func_destroyer_mod USE nrtype; USE nrutil, ONLY : assert_eq USE nr, ONLY : mnbrak,brent USE f1dim_mod IMPLICIT NONE REAL(dp), INTENT(OUT) :: fret INTERFACE FUNCTION func_f1dim(x) USE nrtype REAL(dp), DIMENSION(:), INTENT(IN) :: x REAL(dp) :: func_f1dim END FUNCTION func_f1dim END INTERFACE REAL(dp), DIMENSION(:), TARGET, INTENT(INOUT) :: p,xi REAL(dp), PARAMETER :: TOL=1.0e-4_dp REAL(dp) :: ax,bx,fa,fb,fx,xmin,xx ncom=assert_eq(size(p),size(xi),'linmin') pcom=>p xicom=>xi ax=0.0 xx=1.0 call mnbrak_extended(ax,xx,bx,fa,fx,fb,f1dim_extended, func_f1dim) fret=brent_extended(ax,xx,bx,f1dim_extended, func_f1dim,TOL,xmin) xi=xmin*xi p=p+xi END SUBROUTINE linmin