C An example of the use of SDRIV2 C C Notice that NROOT is set to 1 C PARAMETER (N=2, H=10.0, NROOT=1, MINT=2, * LW=N*N+10*N+2*NROOT+204, LIW=23) REAL Y(N+1), W(LW), MASS INTEGER IW(LIW) EXTERNAL FSUB,GFUN DATA MASS /0.125/ C EPS = 1.E-5 C Set initial point T = 0. TOUT = T C Set for pure relative error EWT = 0.0 C Set initial conditions Y(1) = H Y(2) = 0.0 C Set parameter value Y(3) = MASS MS = 1 WRITE (*,*) 'SDRIV2 RESULTS' WRITE (*,*) ' T, Y(1), Y(2), MS ' C 10 CALL SDRIV2 * (N,T,Y,FSUB,TOUT,MS,NROOT,EPS,EWT,MINT,W,LW,IW,LIW,GFUN) TOUT = TOUT+0.1 IF (MS .EQ. 5) THEN WRITE (*,'(3F11.5,I4,A,F11.5)') * T,Y(1),Y(2),MS, ' <-- Y=0 AT T= ', T GOTO 100 ELSE WRITE (*,'(3F11.5,I4)') T,Y(1),Y(2),MS C Stop if any output code but 1 or 2. IF (MS .GT. 2) GOTO 100 END IF GOTO 10 100 WRITE (*,*) WRITE (*,*) 'REFERENCE RESULTS (LAST LINE) FROM IBM PC/AT' WRITE (*,*) *' 2.62500 0.00000 -4.00000 5 <-- Y=0 AT T= 2.62500' STOP END C SUBROUTINE FSUB (N,T,Y,YDOT) C Routine for evaluating right hand sides of equations. REAL T, Y(*), YDOT(*), MASS, G DATA G/32.0/ C Retrieve parameter MASS = Y(3) C YDOT(1) = Y(2) YDOT(2) = -(G+1.0/MASS*Y(2)) RETURN END C REAL FUNCTION GFUN(N,T,Y,IROOT) C Routine for root finding. C Integration will stop when GFUN changes sign. REAL Y(*) GFUN = Y(1) RETURN END