! E04UGF Example Program Text ! Mark 24 Release. NAG Copyright 2012. Module e04ugfe_mod ! E04UGF Example Program Module: ! Parameters and User-defined Routines ! .. Use Statements .. Use nag_library, Only: nag_wp ! .. Implicit None Statement .. Implicit None ! .. Parameters .. Integer, Parameter :: nin = 5, nout = 6 Contains Subroutine confun(mode,ncnln,njnln,nnzjac,x,f,fjac,nstate,iuser,ruser) ! Computes the nonlinear constraint functions and their Jacobian. ! .. Scalar Arguments .. Integer, Intent (Inout) :: mode Integer, Intent (In) :: ncnln, njnln, nnzjac, nstate ! .. Array Arguments .. Real (Kind=nag_wp), Intent (Out) :: f(ncnln) Real (Kind=nag_wp), Intent (Inout) :: fjac(nnzjac), ruser(*) Real (Kind=nag_wp), Intent (In) :: x(njnln) Integer, Intent (Inout) :: iuser(*) ! .. Intrinsic Procedures .. Intrinsic :: cos, sin ! .. Executable Statements .. If (mode==0 .Or. mode==2) Then f(1) = 1000.0E+0_nag_wp*sin(-x(1)-0.25E+0_nag_wp) + & 1000.0E+0_nag_wp*sin(-x(2)-0.25E+0_nag_wp) f(2) = 1000.0E+0_nag_wp*sin(x(1)-0.25E+0_nag_wp) + & 1000.0E+0_nag_wp*sin(x(1)-x(2)-0.25E+0_nag_wp) f(3) = 1000.0E+0_nag_wp*sin(x(2)-x(1)-0.25E+0_nag_wp) + & 1000.0E+0_nag_wp*sin(x(2)-0.25E+0_nag_wp) End If If (mode==1 .Or. mode==2) Then ! Nonlinear Jacobian elements for column 1. fjac(1) = -1000.0E+0_nag_wp*cos(-x(1)-0.25E+0_nag_wp) fjac(2) = 1000.0E+0_nag_wp*cos(x(1)-0.25E+0_nag_wp) + & 1000.0E+0_nag_wp*cos(x(1)-x(2)-0.25E+0_nag_wp) fjac(3) = -1000.0E+0_nag_wp*cos(x(2)-x(1)-0.25E+0_nag_wp) ! Nonlinear Jacobian elements for column 2. fjac(4) = -1000.0E+0_nag_wp*cos(-x(2)-0.25E+0_nag_wp) fjac(5) = -1000.0E+0_nag_wp*cos(x(1)-x(2)-0.25E+0_nag_wp) fjac(6) = 1000.0E+0_nag_wp*cos(x(2)-x(1)-0.25E+0_nag_wp) + & 1000.0E+0_nag_wp*cos(x(2)-0.25E+0_nag_wp) End If Return End Subroutine confun Subroutine objfun(mode,nonln,x,objf,objgrd,nstate,iuser,ruser) ! Computes the nonlinear part of the objective function and its ! gradient ! .. Scalar Arguments .. Real (Kind=nag_wp), Intent (Out) :: objf Integer, Intent (Inout) :: mode Integer, Intent (In) :: nonln, nstate ! .. Array Arguments .. Real (Kind=nag_wp), Intent (Inout) :: objgrd(nonln), ruser(*) Real (Kind=nag_wp), Intent (In) :: x(nonln) Integer, Intent (Inout) :: iuser(*) ! .. Executable Statements .. If (mode==0 .Or. mode==2) Then objf = 1.0E-6_nag_wp*x(3)**3 + 2.0E-6_nag_wp*x(4)**3/3.0E+0_nag_wp End If If (mode==1 .Or. mode==2) Then objgrd(1) = 0.0E+0_nag_wp objgrd(2) = 0.0E+0_nag_wp objgrd(3) = 3.0E-6_nag_wp*x(3)**2 objgrd(4) = 2.0E-6_nag_wp*x(4)**2 End If Return End Subroutine objfun End Module e04ugfe_mod Program e04ugfe ! E04UGF Example Main Program ! .. Use Statements .. Use nag_library, Only: e04ugf, nag_wp Use e04ugfe_mod, Only: confun, nin, nout, objfun ! .. Implicit None Statement .. Implicit None ! .. Local Scalars .. Real (Kind=nag_wp) :: obj, sinf Integer :: i, icol, ifail, iobj, jcol, & leniz, lenz, m, miniz, minz, n, & ncnln, ninf, njnln, nname, nnz, & nonln, ns Character (1) :: start ! .. Local Arrays .. Real (Kind=nag_wp), Allocatable :: a(:), bl(:), bu(:), clamda(:), & xs(:), z(:) Real (Kind=nag_wp) :: user(1) Integer, Allocatable :: ha(:), istate(:), iz(:), ka(:) Integer :: iuser(1) Character (8), Allocatable :: names(:) ! .. Intrinsic Procedures .. Intrinsic :: max ! .. Executable Statements .. Write (nout,*) 'E04UGF Example Program Results' Flush (nout) ! Skip heading in data file. Read (nin,*) Read (nin,*) n, m Read (nin,*) ncnln, nonln, njnln Read (nin,*) nnz, iobj, start, nname Allocate (ha(nnz),ka(n+1),istate(n+m),a(nnz),bl(n+m),bu(n+m),xs(n+m), & clamda(n+m),names(nname)) Read (nin,*) names(1:nname) ! Read the matrix A from data file. Set up KA. jcol = 1 ka(jcol) = 1 Do i = 1, nnz ! Element ( HA( I ), ICOL ) is stored in A( I ). Read (nin,*) a(i), ha(i), icol If (icoljcol+1) Then ! Index in A of the start of the ICOL-th column equals I, ! but columns JCOL+1,JCOL+2,...,ICOL-1 are empty. Set the ! corresponding elements of KA to I. ka((jcol+1):icol) = i jcol = icol End If End Do ka(n+1) = nnz + 1 ! Columns N,N-1,...,ICOL+1 are empty. Set the corresponding ! elements of KA accordingly. Do i = n, icol + 1, -1 ka(i) = ka(i+1) End Do Read (nin,*) bl(1:(n+m)) Read (nin,*) bu(1:(n+m)) If (start=='C') Then Read (nin,*) istate(1:n) Else If (start=='W') Then Read (nin,*) istate(1:(n+m)) End If Read (nin,*) xs(1:n) If (ncnln>0) Then Read (nin,*) clamda((n+1):(n+ncnln)) End If ! Solve the problem. ! First call is a workspace query leniz = max(500,n+m) lenz = 500 Allocate (iz(leniz),z(lenz)) ifail = 1 Call e04ugf(confun,objfun,n,m,ncnln,nonln,njnln,iobj,nnz,a,ha,ka,bl,bu, & start,nname,names,ns,xs,istate,clamda,miniz,minz,ninf,sinf,obj,iz, & leniz,z,lenz,iuser,user,ifail) If (ifail/=0 .And. ifail/=15 .And. ifail/=16) Then Write (nout,99998) 'Query call to E04UGF failed with IFAIL =', ifail Go To 100 End If Deallocate (iz,z) ! The length of the workspace required for the basis factors in this ! problem is longer than the minimum returned by the query lenz = 2*minz leniz = 2*miniz Allocate (iz(leniz),z(lenz)) ifail = -1 Call e04ugf(confun,objfun,n,m,ncnln,nonln,njnln,iobj,nnz,a,ha,ka,bl,bu, & start,nname,names,ns,xs,istate,clamda,miniz,minz,ninf,sinf,obj,iz, & leniz,z,lenz,iuser,user,ifail) 100 Continue 99999 Format (/1X,A,I5,A,I5,A,A) 99998 Format (1X,A,I5) End Program e04ugfe