SUBROUTINE SMOOTH( X, Y, N, ICOL, ISYM, ISIZE, INUM, LINTYP ) LOGICAL START_NEW, DRAW_LINE, DRAW_MARK, INSIDE, INX0, INX LOGICAL VALID DIMENSION X(N), Y(N) COMMON /HSCALE/ XSLOPE, XCONST, YSLOPE, YCONST COMMON /WORLD/ XMIN, XMAX, YMIN, YMAX COMMON /CHKBON/ INSIDE, START_NEW, LINNYP, LIN1, DASH DATA DYX / .5 / C VALID = N .GE. 3 IF ( VALID ) H0 = X(2) - X(1) DO ( I = 3, N ) H1 = X(I) - X(I-1) VALID = VALID .AND. ( H0 * H1 .GT. 0 ) FIN FIN WHEN ( VALID ) DRAW_LINE = INUM .GE. 0 DRAW_MARK = ISIZE .GE. 1 .AND. ISIZE .LE. 5 DRAW_MARK = DRAW_MARK .AND. ISYM .GE. 0 .AND. ISYM .LE. 5 DRAW_MARK = DRAW_MARK .AND. INUM .NE. 0 IF ( DRAW_LINE ) START_NEW = .TRUE. CALL COLTYP(ICOL) OPEN( UNIT=1, TYPE='SCRATCH' ) DO ( I = 1, N ) WRITE(1,*) X(I), Y(I) REWIND 1 C H0 = X(2) - X(1) Y0 = 6 * ( Y(2) - Y(1) ) / H0 FAC = 0. DO ( I = 2, N-1 ) H1 = X(I+1) - X(I) X(I) = ( 2 * ( H1 + H0 ) - FAC ) / H1 Y1 = 6 * ( Y(I+1) - Y(I) ) / H1 Y(I) = ( Y1 - Y0 - Y(I-1) * FAC ) / H1 Y0 = Y1 H0 = H1 FAC = H0 / X(I) FIN Y(1) = 0. Y(N) = 0. DO ( I = N-1, 2, -1 ) Y(I) = ( Y(I) - Y(I+1) ) / X(I) C C0 = Y(1) READ(1,*) X(1), Y(1) CALL MOVETO( X(1), Y(1), 0, LINTYP ) INX0 = ( X(1) - XMIN ) * ( XMAX - X(1) ) .GE. 0. DO ( I = 2, N ) C1 = Y(I) READ(1,*) X(I), Y(I) INX = ( X(I) - XMIN ) * ( XMAX - X(I) ) .GE. 0. H = X(I) - X(I-1) B = Y(I) / H - C1 * H / 6. D = Y(I-1) / H - C0 * H / 6. SQR = SQRT( ( C0 * C0 + C1 * C1 + C0 * C1 ) * 3. ) ANUM = C1 + 2 * C0 ADEN = 3 * C0 + SQR DY = 0. DC = C1 - C0 IF( ANUM*ADEN .GT. 0. .AND. ANUM*ADEN .LT. ADEN*ADEN ) DX = ANUM / ADEN DY = ABS( DX * (( DC * DX + 3 * C0 ) * DX - ANUM ) ) FIN ADEN = 3 * C0 - SQR IF( ANUM*ADEN .GT. 0. .AND. ANUM*ADEN .LT. ADEN*ADEN ) DX = ANUM / ADEN DY1 = ABS( DX * (( DC * DX + 3 * C0 ) * DX - ANUM ) ) DY = AMAX1( DY, DY1 ) FIN DY = ABS( YSLOPE * H * H * DY / 6. ) IF ( DY .GE. DYX .AND. ( INX0 .OR. INX ) ) NN = DY / DYX + 1 DO ( J = 1, NN - 1 ) XI0 = ( H * J ) / NN XI = XI0 + X(I-1) XI1 = H - XI0 YI = XI0 * ( C1 * XI0 * XI0 / ( 6 * H ) + B ) YI = YI + XI1 * ( C0 * XI1 * XI1 / ( 6 * H ) + D ) CALL MOVETO( XI, YI, 1, LINTYP ) FIN FIN INX0 = INX C0 = C1 CALL MOVETO( X(I), Y(I), 1, LINTYP ) FIN CLOSE ( UNIT=1 ) FIN IF ( DRAW_MARK ) START_NEW = .TRUE. ITEMP = IABS(INUM) CALL COLTYP(ICOL) DO ( I = 1, N, ITEMP ) CALL MOVETO( X(I), Y(I), 0, LINTYP ) IF ( INSIDE ) CALL MARKER( ISYM, ISIZE ) FIN FIN FIN ELSE CALL DASHLN( X, Y, N, ICOL, ISYM, ISIZE, INUM, LINTYP ) FIN C RETURN END