```!   D02UZF Example Program Text
!   Mark 26 Release. NAG Copyright 2016.

Module d02uzfe_mod

!     D02UZF 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                           :: exact
!     .. Parameters ..
Real (Kind=nag_wp), Parameter, Public :: one = 1.0_nag_wp
Real (Kind=nag_wp), Parameter, Public :: two = 2.0_nag_wp
Real (Kind=nag_wp), Parameter, Public :: zero = 0.0_nag_wp
Integer, Parameter, Public       :: nin = 5, nout = 6
Logical, Parameter, Public       :: reqerr = .False.
!     .. Local Scalars ..
Real (Kind=nag_wp), Public, Save :: a, b
Contains
Function exact(x)

!       .. Function Return Value ..
Real (Kind=nag_wp)             :: exact
!       .. Scalar Arguments ..
Real (Kind=nag_wp), Intent (In) :: x
!       .. Intrinsic Procedures ..
Intrinsic                      :: exp
!       .. Executable Statements ..
exact = x + exp(-x)
Return
End Function exact
End Module d02uzfe_mod
Program d02uzfe

!     D02UZF Example Main Program

!     .. Use Statements ..
Use nag_library, Only: d02uaf, d02ucf, d02uzf, nag_wp, x01aaf, x02ajf
Use d02uzfe_mod, Only: a, b, exact, nin, nout, one, reqerr, two, zero
!     .. Implicit None Statement ..
Implicit None
!     .. Local Scalars ..
Real (Kind=nag_wp)               :: deven, dmap, fseries, pi, t, teneps, &
uerr, xeven, xmap
Integer                          :: i, ifail, k, m, n
!     .. Local Arrays ..
Real (Kind=nag_wp), Allocatable  :: c(:), f(:), x(:)
!     .. Intrinsic Procedures ..
Intrinsic                        :: abs, int, max, min, real
!     .. Executable Statements ..
Write (nout,*) ' D02UZF Example Program Results '
Write (nout,*)

Allocate (f(n+1),c(n+1),x(n+1))

!     Set up problem boundary conditions and definition
pi = x01aaf(pi)
a = -0.24_nag_wp*pi
b = pi/two

!     Set up Chebyshev grid
ifail = 0
Call d02ucf(n,a,b,x,ifail)

!     Evaluate function on grid and get interpolating Chebyshev coefficients.
Do i = 1, n + 1
f(i) = exact(x(i))
End Do
ifail = 0
Call d02uaf(n,f,c,ifail)

!     Evaluate Chebyshev series manually by evaluating each Chebyshev
!     polynomial in turn at new equispaced (m+1) grid points.
!     Chebyshev series on [-1,1] map of [a,b].
xmap = -one
dmap = two/real(m-1,kind=nag_wp)
xeven = a
deven = (b-a)/real(m-1,kind=nag_wp)

Write (nout,99999)
uerr = zero
Do i = 1, m
fseries = zero
Do k = 0, n
ifail = 0
Call d02uzf(k,xmap,t,ifail)
fseries = fseries + c(k+1)*t
End Do
uerr = max(uerr,abs(fseries-exact(xeven)))
Write (nout,99998) xmap, xeven, fseries
xmap = min(one,xmap+dmap)
xeven = xeven + deven
End Do

If (reqerr) Then
teneps = 10.0_nag_wp*x02ajf()
Write (nout,'(//)')
Write (nout,99997) 10*(int(uerr/teneps)+1)
End If

99999 Format (1X,T6,'x_even',T17,'x_map',T28,'Sum')
99998 Format (1X,3F10.4)
99997 Format (1X,'Error in coefficient sum is < ',I8,' * machine precision.')

End Program d02uzfe
```