* D02HBF Example Program Text * Mark 14 Revised. NAG Copyright 1989. * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) * .. External Subroutines .. EXTERNAL EX1, EX2 * .. Executable Statements .. WRITE (NOUT,*) 'D02HBF Example Program Results' CALL EX1 CALL EX2 END * SUBROUTINE EX1 * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) INTEGER N, N1, SDW, M1 PARAMETER (N=2,N1=2,SDW=3*N+14+11,M1=6) * .. Local Scalars .. DOUBLE PRECISION H, X, X1 INTEGER I, IFAIL, J, OUTCHN * .. Local Arrays .. DOUBLE PRECISION E(N), P(N1), PE(N1), SOLN(N,M1), W(N,SDW) * .. External Subroutines .. EXTERNAL AUX1, BCAUX1, D02HBF, RNAUX1, X04ABF * .. Intrinsic Functions .. INTRINSIC DBLE * .. Executable Statements .. WRITE (NOUT,*) OUTCHN = NOUT WRITE (NOUT,*) CALL X04ABF(1,OUTCHN) P(1) = 0.2D0 P(2) = 0.0D0 PE(1) = 1.0D-5 PE(2) = 1.0D-3 E(1) = 1.0D-4 E(2) = 1.0D-4 * * Set IFAIL to 111 to obtain monitoring information * IFAIL = 1 * CALL D02HBF(P,N1,PE,E,N,SOLN,M1,AUX1,BCAUX1,RNAUX1,W,SDW,IFAIL) * IF (IFAIL.GE.0) THEN WRITE (NOUT,*) 'Case 1' WRITE (NOUT,*) IF (IFAIL.NE.0) THEN WRITE (NOUT,99999) 'IFAIL = ', IFAIL IF (IFAIL.LE.5 .AND. IFAIL.NE.1) THEN WRITE (NOUT,*) WRITE (NOUT,99996) 'W(1,2) = ', W(1,2), ' W(.,1) = ', + (W(I,1),I=1,N) END IF ELSE WRITE (NOUT,*) 'Final parameters' WRITE (NOUT,99998) (P(I),I=1,N1) WRITE (NOUT,*) WRITE (NOUT,*) 'Final solution' WRITE (NOUT,*) 'X-value Components of solution' CALL RNAUX1(X,X1,P) H = (X1-X)/DBLE(M1-1) DO 20 I = 1, M1 WRITE (NOUT,99997) X + (I-1)*H, (SOLN(J,I),J=1,N) 20 CONTINUE END IF ELSE WRITE (NOUT,99995) IFAIL END IF RETURN * 99999 FORMAT (1X,A,I3) 99998 FORMAT (1X,1P,3E15.3) 99997 FORMAT (1X,F7.2,2F13.4) 99996 FORMAT (1X,A,F9.4,A,10E10.3) 99995 FORMAT (1X,/1X,' ** D02HBF returned with IFAIL = ',I5) END * SUBROUTINE AUX1(X,Y,F,PARAM) * .. Parameters .. INTEGER N PARAMETER (N=2) * .. Scalar Arguments .. DOUBLE PRECISION X * .. Array Arguments .. DOUBLE PRECISION F(N), PARAM(N), Y(N) * .. Executable Statements .. F(1) = Y(2) F(2) = (Y(1)**3-Y(2))/(2.0D0*X) RETURN END * SUBROUTINE RNAUX1(X,X1,PARAM) * .. Scalar Arguments .. DOUBLE PRECISION X, X1 * .. Array Arguments .. DOUBLE PRECISION PARAM(2) * .. Executable Statements .. X = 0.1D0 X1 = 16.0D0 RETURN END * SUBROUTINE BCAUX1(G,G1,PARAM) * .. Parameters .. INTEGER N PARAMETER (N=2) * .. Array Arguments .. DOUBLE PRECISION G(N), G1(N), PARAM(N) * .. Local Scalars .. DOUBLE PRECISION Z * .. Intrinsic Functions .. INTRINSIC SQRT * .. Executable Statements .. Z = 0.1D0 G(1) = 0.1D0 + PARAM(1)*SQRT(Z)*0.1D0 + 0.01D0*Z G(2) = PARAM(1)*0.05D0/SQRT(Z) + 0.01D0 G1(1) = 1.0D0/6.0D0 G1(2) = PARAM(2) RETURN END * SUBROUTINE EX2 * .. Parameters .. INTEGER NOUT PARAMETER (NOUT=6) INTEGER N, N1, SDW, M1 PARAMETER (N=3,N1=3,SDW=3*N+14+11,M1=6) * .. Local Scalars .. DOUBLE PRECISION H, X, X1 INTEGER I, IFAIL, J, OUTCHN * .. Local Arrays .. DOUBLE PRECISION E(N), P(N1), PE(N1), SOLN(N,M1), W(N,SDW) * .. External Subroutines .. EXTERNAL AUX2, BCAUX2, D02HBF, RNAUX2, X04ABF * .. Intrinsic Functions .. INTRINSIC DBLE * .. Executable Statements .. WRITE (NOUT,*) OUTCHN = NOUT WRITE (NOUT,*) CALL X04ABF(1,OUTCHN) P(1) = 32.0D0 P(2) = 6000.0D0 P(3) = 0.54D0 PE(1) = 1.0D-5 PE(2) = 1.0D-4 PE(3) = 1.0D-4 E(1) = 1.0D-2 E(2) = 1.0D-2 E(3) = 1.0D-2 * * Set IFAIL to 111 to obtain monitoring information * IFAIL = 1 * CALL D02HBF(P,N1,PE,E,N,SOLN,M1,AUX2,BCAUX2,RNAUX2,W,SDW,IFAIL) * IF (IFAIL.LT.0) GO TO 40 WRITE (NOUT,*) 'Case 2' WRITE (NOUT,*) IF (IFAIL.NE.0) THEN WRITE (NOUT,99999) 'IFAIL = ', IFAIL IF (IFAIL.LE.5 .AND. IFAIL.NE.1) THEN WRITE (NOUT,*) WRITE (NOUT,99996) 'W(1,2) = ', W(1,2), ' W(.,1) = ', + (W(I,1),I=1,N) END IF ELSE WRITE (NOUT,*) 'Final parameters' WRITE (NOUT,99998) (P(I),I=1,N1) WRITE (NOUT,*) WRITE (NOUT,*) 'Final solution' WRITE (NOUT,*) 'X-value Components of solution' CALL RNAUX2(X,X1,P) H = (X1-X)/DBLE(M1-1) DO 20 I = 1, M1 WRITE (NOUT,99997) X + (I-1)*H, (SOLN(J,I),J=1,N) 20 CONTINUE END IF 40 CONTINUE RETURN * 99999 FORMAT (1X,A,I3) 99998 FORMAT (1X,1P,3E15.3) 99997 FORMAT (1X,F7.0,2F13.1,F13.3) 99996 FORMAT (1X,A,F9.4,A,10E10.3) END * SUBROUTINE AUX2(X,Y,F,PARAM) * .. Parameters .. INTEGER N PARAMETER (N=3) * .. Scalar Arguments .. DOUBLE PRECISION X * .. Array Arguments .. DOUBLE PRECISION F(N), PARAM(N), Y(N) * .. Intrinsic Functions .. INTRINSIC COS, TAN * .. Executable Statements .. F(1) = TAN(Y(3)) F(2) = -PARAM(1)*TAN(Y(3))/Y(2) - 0.00002D0*Y(2)/COS(Y(3)) F(3) = -PARAM(1)/Y(2)**2 RETURN END * SUBROUTINE RNAUX2(X,X1,PARAM) * .. Parameters .. INTEGER N PARAMETER (N=3) * .. Scalar Arguments .. DOUBLE PRECISION X, X1 * .. Array Arguments .. DOUBLE PRECISION PARAM(N) * .. Executable Statements .. X = 0.0D0 X1 = PARAM(2) RETURN END * SUBROUTINE BCAUX2(G,G1,PARAM) * .. Parameters .. INTEGER N PARAMETER (N=3) * .. Array Arguments .. DOUBLE PRECISION G(N), G1(N), PARAM(N) * .. Executable Statements .. G(1) = 0.0D0 G(2) = 500.0D0 G(3) = 0.5D0 G1(1) = 0.0D0 G1(2) = 450.0D0 G1(3) = PARAM(3) RETURN END