*     D03ECF Example Program Text
*     Mark 19 Revised. NAG Copyright 1999.
*     .. Parameters ..
      INTEGER          N1, N2, N3, LDA, SDA, ITMAX
      PARAMETER        (N1=4,N2=5,N3=6,LDA=N1,SDA=N2,ITMAX=18)
      INTEGER          NOUT
      PARAMETER        (NOUT=6)
*     .. Local Scalars ..
      DOUBLE PRECISION APARAM, CONCHN, CONRES, ROOT2
      INTEGER          I, IFAIL, ITCOUN, ITUSED, IXN, IYN, IZN, J, K,
     +                 NDIR
*     .. Local Arrays ..
      DOUBLE PRECISION A(LDA,SDA,N3), B(LDA,SDA,N3), C(LDA,SDA,N3),
     +                 CHNGS(ITMAX), D(LDA,SDA,N3), E(LDA,SDA,N3),
     +                 F(LDA,SDA,N3), G(LDA,SDA,N3), Q(LDA,SDA,N3),
     +                 RESIDS(18), T(LDA,SDA,N3), WRKSP1(LDA,SDA,N3),
     +                 WRKSP2(LDA,SDA,N3), WRKSP3(LDA,SDA,N3),
     +                 WRKSP4(LDA,SDA,N3), X(N1), Y(N2), Z(N3)
*     .. External Subroutines ..
      EXTERNAL         D03ECF
*     .. Intrinsic Functions ..
      INTRINSIC        COS, EXP, SQRT
*     .. Data statements ..
      DATA             X(1), X(2), X(3), X(4)/0.0D0, 1.0D0, 3.0D0,
     +                 6.0D0/
      DATA             Y(1), Y(2), Y(3), Y(4), Y(5)/0.0D0, 1.0D0, 3.0D0,
     +                 6.0D0, 10.0D0/
      DATA             Z(1), Z(2), Z(3), Z(4), Z(5), Z(6)/0.0D0, 1.0D0,
     +                 3.0D0, 6.0D0, 10.0D0, 15.0D0/
*     .. Executable Statements ..
      WRITE (NOUT,*) 'D03ECF Example Program Results'
      WRITE (NOUT,*)
      ROOT2 = SQRT(2.0D0)
      APARAM = 1.0D0
      ITCOUN = 0
      NDIR = 1
      CONRES = 0.1D-5
      CONCHN = 0.1D-5
*     Set up difference equation coefficients, source terms and
*     initial approximation.
      DO 60 K = 1, N3
         DO 40 J = 1, N2
            DO 20 I = 1, N1
               IF ((I.NE.1) .AND. (I.NE.N1) .AND. (J.NE.1)
     +             .AND. (J.NE.N2) .AND. (K.NE.1) .AND. (K.NE.N3)) THEN
*                 Specification for internal nodes
                  A(I,J,K) = 2.0D0/((Z(K)-Z(K-1))*(Z(K+1)-Z(K-1)))
                  G(I,J,K) = 2.0D0/((Z(K+1)-Z(K))*(Z(K+1)-Z(K-1)))
                  B(I,J,K) = 2.0D0/((Y(J)-Y(J-1))*(Y(J+1)-Y(J-1)))
                  F(I,J,K) = 2.0D0/((Y(J+1)-Y(J))*(Y(J+1)-Y(J-1)))
                  C(I,J,K) = 2.0D0/((X(I)-X(I-1))*(X(I+1)-X(I-1)))
                  E(I,J,K) = 2.0D0/((X(I+1)-X(I))*(X(I+1)-X(I-1)))
                  D(I,J,K) = -A(I,J,K) - B(I,J,K) - C(I,J,K) - E(I,J,K)
     +                       - F(I,J,K) - G(I,J,K)
                  Q(I,J,K) = 0.0D0
                  T(I,J,K) = 0.0D0
               ELSE
*                 Specification for boundary nodes
                  A(I,J,K) = 0.0D0
                  B(I,J,K) = 0.0D0
                  C(I,J,K) = 0.0D0
                  E(I,J,K) = 0.0D0
                  F(I,J,K) = 0.0D0
                  G(I,J,K) = 0.0D0
                  D(I,J,K) = 0.0D0
                  Q(I,J,K) = EXP((X(I)+1.0D0)/Y(N2))*COS(ROOT2*Y(J)
     +                       /Y(N2))*EXP((-Z(K)-1.0D0)/Y(N2))
                  T(I,J,K) = 0.0D0
               END IF
   20       CONTINUE
   40    CONTINUE
   60 CONTINUE
      IFAIL = 1
*
      CALL D03ECF(N1,N2,N3,LDA,SDA,A,B,C,D,E,F,G,Q,T,APARAM,ITMAX,
     +            ITCOUN,ITUSED,NDIR,IXN,IYN,IZN,CONRES,CONCHN,RESIDS,
     +            CHNGS,WRKSP1,WRKSP2,WRKSP3,WRKSP4,IFAIL)
      IF (IFAIL.EQ.0) THEN
*
         WRITE (NOUT,*) 'Iteration      Maximum        Maximum'
         WRITE (NOUT,*) ' number        residual        change'
         IF (ITUSED.NE.0) THEN
            WRITE (NOUT,99999) (I,RESIDS(I),CHNGS(I),I=1,ITUSED)
         END IF
         WRITE (NOUT,*)
         WRITE (NOUT,*) 'Table of calculated function values'
         WRITE (NOUT,*)
         WRITE (NOUT,*)
     +  'K  J   (I      T   ) (I      T   ) (I      T   ) (I      T   )'
         WRITE (NOUT,99998) ((K,J,(I,T(I,J,K),I=1,N1),J=1,N2),K=1,N3)
      ELSE
         WRITE (NOUT,99997) IFAIL
      END IF
*
99999 FORMAT (2X,I3,9X,E11.4,4X,E11.4)
99998 FORMAT ((1X,I1,I3,1X,4(1X,I3,2X,F8.3)))
99997 FORMAT (1X,' ** D03ECF returned with IFAIL = ',I5)
      END
