```    Program f04ycfe

!     F04YCF Example Program Text

!     Mark 25 Release. NAG Copyright 2014.

!     .. Implicit None Statement ..
Implicit None
!     .. Parameters ..
Integer, Parameter               :: nout = 6
!     .. Executable Statements ..
Write (nout,*) 'F04YCF Example Program Results'

Call ex1

Call ex2

Contains
Subroutine ex1

!       .. Use Statements ..
Use nag_library, Only: dasum, dgetrf, dgetrs, f04ycf, nag_wp
!       .. Parameters ..
Real (Kind=nag_wp), Parameter    :: zero = 0.0E+0_nag_wp
Integer, Parameter               :: nin = 5
!       .. Local Scalars ..
Real (Kind=nag_wp)               :: anorm, cond, estnrm
Integer                          :: i, icase, ifail, info, j, lda, n
!       .. Local Arrays ..
Real (Kind=nag_wp), Allocatable  :: a(:,:), p(:), work(:), x(:)
Integer, Allocatable             :: ipiv(:), iwork(:)
!       .. Intrinsic Procedures ..
Intrinsic                        :: max
!       .. Executable Statements ..
Write (nout,*)
Write (nout,*)
Write (nout,*) 'Example 1'
Write (nout,*)
!       Skip heading in data file
lda = n
Allocate (a(lda,n),p(n),work(n),x(n),iwork(n),ipiv(n))
!       First compute the norm of A.
!       DASUM (f06ekf) returns the sum of the absolute values of a column of A.
anorm = zero
Do j = 1, n
anorm = max(anorm,dasum(n,a(1,j),1))
End Do
Write (nout,99999) 'Computed norm of A =', anorm

!       Next estimate the norm of inverse(A). We do not form the
!       inverse explicitly.

!       ifail: behaviour on error exit
!              =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft
ifail = 0
!       LU Factorize A
!       The NAG name equivalent of dgetrf is f07adf
Call dgetrf(n,n,a,lda,ipiv,info)

icase = 0
loop:   Do
ifail = 0
Call f04ycf(icase,n,x,estnrm,work,iwork,ifail)

If (icase/=0) Then
If (icase==1) Then
!             Return the vector inv(A)*X
!             The NAG name equivalent of dgetrs is f07aef
Call dgetrs('N',n,1,a,lda,ipiv,x,n,info)
Else If (icase==2) Then
!             Return the vector inv(A)'*X
Call dgetrs('T',n,1,a,lda,ipiv,x,n,info)
End If
!         Continue until icase is returned as 0.
Else
Write (nout,99999) 'Estimated norm of inverse(A) =', estnrm
cond = anorm*estnrm
Write (nout,99998) 'Estimated condition number of A =', cond
Write (nout,*)
Exit loop
End If
End Do loop

99999   Format (1X,A,F8.4)
99998   Format (1X,A,F5.1)
End Subroutine ex1
Subroutine ex2

!       .. Use Statements ..
Use nag_library, Only: f01brf, f04axf, f04ycf, nag_wp
!       .. Parameters ..
Real (Kind=nag_wp), Parameter    :: tenth = 0.1E+0_nag_wp
Real (Kind=nag_wp), Parameter    :: zero = 0.0E+0_nag_wp
Integer, Parameter               :: nin = 5
!       .. Local Scalars ..
Real (Kind=nag_wp)               :: anorm, cond, estnrm, resid, sum, u
Integer                          :: i, icase, ifail, j, licn, lirn, n, &
nz
Logical                          :: grow, lblock
!       .. Local Arrays ..
Real (Kind=nag_wp), Allocatable  :: a(:), w(:), work1(:), x(:)
Integer, Allocatable             :: icn(:), ikeep(:), irn(:), iw(:),   &
iwork(:)
Integer                          :: idisp(10)
Logical                          :: abort(4)
!       .. Intrinsic Procedures ..
Intrinsic                        :: abs, max
!       .. Executable Statements ..
Write (nout,*)
Write (nout,*)
Write (nout,*) 'Example 2'
Write (nout,*)
!       Skip heading in data file
!       Input N, the order of matrix A, and NZ, the number of non-zero
!       elements of A.
licn = 4*nz
lirn = 2*nz
Allocate (a(licn),w(n),work1(n),x(n),icn(licn),ikeep(5*n),irn(lirn), &
iw(8*n),iwork(n))
!       Input the elements of A, along with row and column information.
!       First compute the norm of A.
anorm = zero
Do i = 1, n
sum = zero
Do j = 1, nz
If (icn(j)==i) sum = sum + abs(a(j))
End Do
anorm = max(anorm,sum)
End Do
Write (nout,99999) 'Computed norm of A =', anorm
!       Next estimate the norm of inverse(A). We do not form the
!       inverse explicitly.
!       Factorise A into L*U using F01BRF.
u = tenth
lblock = .True.
grow = .True.
abort(1) = .True.
abort(2) = .True.
abort(3) = .False.
abort(4) = .True.

!       ifail: behaviour on error exit
!              =0 for hard exit, =1 for quiet-soft, =-1 for noisy-soft
ifail = 0
Call f01brf(n,nz,a,licn,irn,lirn,icn,u,ikeep,iw,w,lblock,grow,abort, &
idisp,ifail)

icase = 0
loop:   Do
ifail = 0
Call f04ycf(icase,n,x,estnrm,work1,iwork,ifail)

If (icase/=0) Then
!           Return X := inv(A)*X or X = inv(A)'*X, depending on the
!           value of ICASE, by solving A*Y = X or A'*Y = X,
!           overwriting Y on X.
Call f04axf(n,a,licn,icn,ikeep,x,w,icase,idisp,resid)
!         Continue until icase is returned as 0.
Else
Write (nout,99999) 'Estimated norm of inverse(A) =', estnrm
cond = anorm*estnrm
Write (nout,99998) 'Estimated condition number of A =', cond
Exit loop
End If
End Do loop

99999   Format (1X,A,F8.4)
99998   Format (1X,A,F5.1)
End Subroutine ex2
End Program f04ycfe
```