```!   E04UGF Example Program Text
!   Mark 26.2 Release. NAG Copyright 2017.

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
!     .. Accessibility Statements ..
Private
Public                           :: confun, objfun
!     .. Parameters ..
Integer, Parameter, Public       :: 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

!       .. 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 e04ugfe_mod, Only: confun, nin, nout, objfun
Use nag_library, Only: e04ugf, nag_wp
!     .. 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,*) 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 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 ).

If (icol<jcol) Then

!         Elements not ordered by increasing column index.

Write (nout,99999) 'Element in column', icol,                        &
' found after element in column', jcol, '. Problem', ' abandoned.'
Go To 100
Else If (icol==jcol+1) Then

!         Index in A of the start of the ICOL-th column equals I.

ka(icol) = i
jcol = icol
Else If (icol>jcol+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

If (start=='C') Then
Else If (start=='W') Then
End If

If (ncnln>0) Then
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
```