Code:
an C***********************************************************************
C CUSTOMIZED, NO BOUNDS
C***********************************************************************
C MAIN PROGRAM TO MINIMIZE A FUNCTION (REPRESENTED BY THE ROUTINE SFUN)
C OF N VARIABLES X - CUSTOMIZED VERSION
C
DOUBLE PRECISION X(300), F, G(300), W(4000)
DOUBLE PRECISION ETA, ACCRCY, XTOL, STEPMX, DSQRT
EXTERNAL SFUN
DOUBLE PRECISION dummy
integer i
C
C SET UP FUNCTION AND VARIABLE INFORMATION
C N - NUMBER OF VARIABLES
C X - INITIAL ESTIMATE OF THE SOLUTION
C F - ROUGH ESTIMATE OF FUNCTION VALUE AT SOLUTION
C LW - DECLARED LENGTH OF THE ARRAY W
C
open(33,file="conf1_deform.dat",status='unknown')
do i=1,100
read(33,*) dummy,X(i),X(i+100)
enddo
close(33)
N = 200
! DO 10 I = 1,N
! X(I) = I / FLOAT(N+1)
!10 CONTINUE
F = 1.D0
LW = 4000
C
C SET UP CUSTOMIZING PARAMETERS
C ETA - SEVERITY OF THE LINESEARCH
C MAXFUN - MAXIMUM ALLOWABLE NUMBER OF FUNCTION EVALUATIONS
C XTOL - DESIRED ACCURACY FOR THE SOLUTION X*
C STEPMX - MAXIMUM ALLOWABLE STEP IN THE LINESEARCH
C ACCRCY - ACCURACY OF COMPUTED FUNCTION VALUES
C MSGLVL - DETERMINES QUANTITY OF PRINTED OUTPUT
C 0 = NONE, 1 = ONE LINE PER MAJOR ITERATION.
C MAXIT - MAXIMUM NUMBER OF INNER ITERATIONS PER STEP
C
MAXIT = N/2
MAXFUN = 150*N
ETA = .25D0
STEPMX = 1.D1
ACCRCY = 1.D-15
XTOL = DSQRT(ACCRCY)
MSGLVL = 1
C
C MINIMIZE THE FUNCTION
C
CALL LMQN (IERROR, N, X, F, G, W, LW, SFUN,
* MSGLVL, MAXIT, MAXFUN, ETA, STEPMX, ACCRCY, XTOL)
C
C PRINT THE RESULTS
C
IF (IERROR .NE. 0) WRITE(*,800) IERROR
IF (MSGLVL .GE. 1) WRITE(*,810)
IF (MSGLVL .GE. 1) WRITE(*,820) (I,X(I),I=1,N)
STOP
800 FORMAT(//,' ERROR CODE =', I3,/)
810 FORMAT(10X, 'CURRENT SOLUTION IS ',/14X, 'I', 11X, 'X(I)')
820 FORMAT(10X, I5, 2X, 1PD22.15)
END
C
C
SUBROUTINE SFUN (N, X, F, G)
DOUBLE PRECISION X(N), G(N), F, T
integer i,j
DOUBLE PRECISION Vp,v,cutoff,pot_cutoff,dx,dy,r2
DOUBLE PRECISION sigma_xy,Fx,Fy,r(100)
open(33,file="conf1_deform.dat",status='unknown')
do i=1,100
read(33,*) r(i)
enddo
close(33)
v=0.d0
F = 0.D0
do i=1,100
G(i) = 0.d0
G(i+100) = 0.d0
enddo
do i=1,100
do j=1,100
if (i.ne.j) then
sigma_xy=(r(i)+r(j))/2.d0
cutoff=2.d0**(7.d0/6.d0)*sigma_xy
pot_cutoff=4*((sigma_xy*sigma_xy/(cutoff*cutoff))**6.d0-
$ (sigma_xy*sigma_xy/(cutoff*cutoff))**3.d0)
dx=X(i)-X(j)
dy=X(i+100)-X(j+100)
if (dx.ge.10.3975/2.d0) dx=dx-10.3975
if (dx.le.-10.3975/2.d0) dx=dx+10.3975
if (dy.ge.10.3975/2.d0) dy=dy-10.3975
if (dy.le.-10.3975/2.d0) dy=dy+10.3975
r2=dx*dx+dy*dy
if (r2.le.cutoff*cutoff) then
Vp=4*((sigma_xy*sigma_xy/r2)**6-(sigma_xy*sigma_xy/r2)**3)-pot_cutoff
! print *, i, j, Vp
F=F+Vp/2.0
Fx=48.d0*sigma_xy**12.d0*dx/r2**7.d0-
$ 24.d0*sigma_xy**6.d0*dx/r2**4.d0
Fy=48.d0*sigma_xy**12.d0*dy/r2**7.d0-
$ 24.d0*sigma_xy**6.d0*dy/r2**4.d0
G(i) = G(i) - Fx
G(i+100) = G(i+100) - Fy
endif
endif
enddo
enddo
C
C ROUTINE TO EVALUATE FUNCTION (F) AND GRADIENT (G) OF THE OBJECTIVE
C FUNCTION AT THE POINT X
C
! F = 0.D0
! DO 10 I = 1,N
! T = 2*X(I) - I
! F = F + T*T
! G(I) = 2.D0 * T
!10 CONTINUE
! RETURN
END
The previous code I posted a c code is aimed at doing the same thing. This is just a test later I will call the subroutine LMQN from another c code that I am using. My difficulty is that I DON'T KNOW HOW TO CALL A SUBROUTINE FROM C (LMQN) THAT HAS AS ARGUMENT ANOTHER SUBROUTINE (SFUN).