SUBROUTINE XTPNUP(X,Y) 21,2
C position pen at point (x,y) defined in maths space
      COMMON /XPEN11/ XPEN,YPEN,FLEN,BLEN,NPD,XMPEN,YMPEN
      CALL PPENUP( X,Y)
      XPEN= X
      YPEN= Y
      RETURN
      END

      SUBROUTINE XTPNDN (X,Y) 22,2
C Join point (x,y) defined in maths space with current line thickness
      COMMON /XPEN11/ XPEN,YPEN,FLEN,BLEN,NPD,XMPEN,YMPEN
      COMMON /XLPN13/ HF1,HB1,HF2,HB2,LFULL,lfull0,LTHICK,DTHICK
      XP1=XPEN
      YP1=YPEN
      XP2=X
      YP2=Y
c     IF( LTHICK.EQ.1) THEN
        CALL PPENDN( XP2, YP2)
c     ELSE
c       DX=XP2-XP1
c       DY=YP2-YP1
c       IF( ABS(DX).LT.1.0E-6) THEN
c         DPX=DTHICK
c         DPY=0.0
c       ELSE
c         AK=DY/DX
c         A=SQRT(1.0+AK*AK)
c         DPX=DTHICK*AK/A
c         DPY=DTHICK/A
c       ENDIF
c       CALL PPENDN( XP2,YP2)
c       CALL PPENUP( XP2+DPX, YP2-DPY)
c       CALL PPENDN( XP1+DPX, YP1-DPY)
c       CALL PPENUP( XP1-DPX, YP1+DPY)
c       CALL PPENDN( XP2-DPX, YP2+DPY)
c       CALL PPENUP( XP2,YP2)
c     ENDIF
      XPEN=XP2
      YPEN=YP2
      RETURN
      END


      SUBROUTINE XBROKN(IF1,IB1,IF2,IB2) 23,10
C Set line atribute as broken line segments.
C IF1 IF2 set length of  line segments plotted in unit of 0.001
C that of the total vertical ND-space range.
C IB1 IB2 set length of blanks between line segments in unit of 0.001
C that of the total vertical ND-space range.
      COMMON /XLPN13/ HF1,HB1,HF2,HB2,LFULL,lfull0,LTHICK,DTHICK
      H=0.001
      HF1=H*IF1
      HB1=H*IB1
      HF2=H*IF2
      HB2=H*IB2
      lfull=0   ! Is the current line setting 'full'?
      lfull0=0  ! To use own dash line plotting algorithm? Used in XPENDN.
                ! Set it to lfull if want to use own dash line plotting algorithm
                !   and remove call to gsln
c     call gsln(2)
      RETURN

      ENTRY XBROKN0
      RETURN

      ENTRY XDASH
C Set line atribute as dash line.
      H=0.001
      HF1=H*10
      HB1=H*5
      HF2=H*10
      HB2=H*5
      LFULL=0
      LFULL0=0
c     call gsln(2)
      RETURN

      ENTRY XDOT
C Set line atribute as dash line.
      H=0.001
      HF1=0.0
      HB1=H*6
      HF2=0.0
      HB2=H*6
      LFULL=0
      LFULL0=0
c     call gsln(3)
      RETURN

      ENTRY XQBRKN(KF1,KB1,KF2,KB2)
      H=0.001
      KF1=HF1/H
      KB1=HB1/H
      KF2=HF2/H
      KB2=HB2/H
      RETURN

      ENTRY XFULL

C Set line atribute as solid (full) line.
      LFULL =1
      LFULL0=1
c     call gsln(1)
      RETURN

      ENTRY XQFULL(KFULL)
      KFULL=LFULL
      RETURN
      END


      SUBROUTINE XTHICK(ITHICK) 45,2
      COMMON /XLPN13/ HF1,HB1,HF2,HB2,LFULL,lfull0,LTHICK, DTHICK
      integer alnmag,blnmag

C Set thickness of lines. ITHICK=1 or 2.
c     LTHICK=min(ITHICK,2)
      LTHICK=ITHICK
      call plotif(0.0, 0.0, 2)
      call gslwsc(1.0+0.5*(ithick-1))
      RETURN

      entry xlnmag(alnmag)
c
c     Magnify the line thickness by a factor of nlnmag.
c
      return

      entry xqlnmag(blnmag)

      return

      entry xqthik(kthick)
C Enquiry routine for line thickness.
      kthick=lthick
      return
      END


      SUBROUTINE XCHARL(XO,YO,STRING) 45,4
      CHARACTER*(*) STRING
      call xqthik(lthick)
      call plotif(0.0, 0.0, 2)
      call gslwsc(1.0)
      call gqln(ierr,lstyle)
      call gsln(1)
      CALL XLETER(XO,YO,STRING, -1)
      call plotif(0.0, 0.0, 2)
      call gslwsc(1.0+0.5*(lthick-1))
      if (ierr.eq.0) call gsln(lstyle)
      RETURN
      END


      SUBROUTINE XCHARR(XO,YO,STRING) 31,4
      CHARACTER*(*) STRING
      call xqthik(lthick)
      call plotif(0.0, 0.0, 2)
      call gslwsc(1.0)
      call gqln(ierr,lstyle)
      call gsln(1)
      CALL XLETER(XO,YO,STRING,  1)
      call plotif(0.0, 0.0, 2)
      call gslwsc(1.0+0.5*(lthick-1))
      if (ierr.eq.0) call gsln(lstyle)
      RETURN
      END


      SUBROUTINE XCHARC(XO,YO,STRING) 119,4
      CHARACTER*(*) STRING
      call xqthik(lthick)
      call plotif(0.0, 0.0, 2)
      call gslwsc(1.0)
      call gqln(ierr,lstyle)
      call gsln(1)
      CALL XLETER(XO,YO,STRING,  0)
      call plotif(0.0, 0.0, 2)
      call gslwsc(1.0+0.5*(lthick-1))
      if (ierr.eq.0) call gsln(lstyle)
      RETURN
      END


      SUBROUTINE XCHMAG(H) 40
      COMMON /XCHA20/ HCTR,SCTR,CRATIO, KFONT,NUNDLN
      COMMON /XFTR06/ XFACTR,YFACTR
      HCTR=ABS(H)
      SCTR=HCTR/YFACTR
      RETURN

      ENTRY XQCHMG(HH )
      HH=HCTR
      RETURN

      ENTRY XCHSIZ( HC )
      SCTR= abs(HC)
      HCTR= SCTR*YFACTR
      RETURN

      ENTRY XQCHSZ( CS1 )
      CS1= HCTR/YFACTR
      RETURN
      END


      SUBROUTINE XCFONT( IFONT ) 11,5
      COMMON /XCHA20/ HCTR,SCTR,CRATIO, KFONT,NUNDLN
      COMMON /XCHR31/ CHDATA
      COMMON /XCHR32/ ICDATA
      CHARACTER CHDATA(127)*300
      common /xoutch/ nch
      INTEGER ICDATA (0:150 , 32:127)
      KF=KFONT
      KFONT=IFONT
      IF ((KFONT .LT. 1) .OR. (KFONT .GT. 4)) THEN
         WRITE(NCH,'(1x,a,i2,a,/1x,a)')'Font number ',ifont,
     :   ' not available with the NCAR graphics version of ZXPLOT. ',
     :   'Default font number 2 will be used.'
         kfont = 2
      ENDIF
      IF( KF.EQ. KFONT) RETURN
      GOTO ( 501, 502, 503, 504 ) KFONT
 501  CALL XCSETB(CHDATA)
      GOTO 505
 502  CALL XCSETC(CHDATA)
      GOTO 505
 503  CALL XCSETA(CHDATA)
      GOTO 505
 504  CALL XCSETD(CHDATA)
 505  CONTINUE
      RETURN

      ENTRY XQCFNT ( NFONT )
      NFONT=KFONT
      RETURN
      END


      SUBROUTINE XARROW(U,V,X0,Y0, XLENG,UUNIT) 3,16
C Plot vector (U,V) at (X0,Y0). Unit X-component UUNIT is plotted with
C length XLENG in mapped maths coordinate. Length of vector in
C Y-direction is scaled according to the mapping.
c     PARAMETER(PI=3.14159,ANGLE1=(15./180+1)*PI,ANGLE2=(-15./180+1)*PI)
c     PARAMETER(SINA1=-.25882,COSA1=-.96593,SINA2=-SINA1,COSA2=COSA1)

      parameter(pi=3.14159,angle1=(20./180+1)*pi,angle2=(-20./180+1)*pi)
      PARAMETER(SINA1=-.342,COSA1=-.93969,SINA2=-SINA1,COSA2=COSA1)

      COMMON /XART36/ KARTYP,KVMODE,VSC
C
      IF( ABS(U)+ABS(V).EQ.0.0) RETURN
      ALPHA= XLENG/UUNIT *0.5
      XC0=0.0
      YC0=0.0
      XPLENG =XPNTSD( XC0,YC0,XC0+XLENG,YC0 )
      DX=U*ALPHA
      DY=V*ALPHA
C TO PLOT ARROW IN ABSOLUTE SPACE (FOR CONFORMALITY)
      PX0=X0
      PY0=Y0
      PX1=X0+DX
      PY1=Y0+DY
      CALL XTRANS(PX0,PY0)
      CALL XTRANS(PX1,PY1)
      DPX=PX1-PX0
      DPY=PY1-PY0

      DPXY=SQRT( DPX*DPX+DPY*DPY)
      IF(DPXY.GT.1.0E-30) THEN
        SINTA=DPY/DPXY
        COSTA=DPX/DPXY
        ARROW=0.40* MIN(XPLENG,2*DPXY)
        IF( KARTYP.EQ.2 ) ARROW=0.40* DPXY*2
        DX1=ARROW*(COSTA*COSA1-SINTA*SINA1)
        DY1=ARROW*(SINTA*COSA1+COSTA*SINA1)
        DX2=ARROW*(COSTA*COSA2-SINTA*SINA2)
        DY2=ARROW*(SINTA*COSA2+COSTA*SINA2)
        CALL XPENUP(X0-DX, Y0-DY)
        CALL XPENDN(X0+DX, Y0+DY)
        CALL XTPNUP(PX1    , PY1    )
        CALL XTPNDN(PX1+DX1, PY1+DY1)
        CALL XTPNUP(PX1    , PY1    )
        CALL XTPNDN(PX1+DX2, PY1+DY2)
      ENDIF
      RETURN

      ENTRY XARTYP(KTYPE)
      KARTYP=KTYPE
      RETURN
      END


      SUBROUTINE XVECTK_old(X0,Y0, XLENG, UUNIT, KEY ),36
C Plot unit vectors  starting at (X0,Y0)
C KEY=-1, 0, 1, 2, for none,in both X and Y-direction,X only, Y only
      PARAMETER(PI=3.14159,ANGLE1=(10./180+1)*PI,ANGLE2=(-10./180+1)*PI)
      PARAMETER(SINA1=-.17365,COSA1=-.98481,SINA2=-SINA1,COSA2=COSA1)
      CHARACTER CH*20
      CALL XQRANG(XRG,YRG)
      CALL XQMAP(XL,XR,YB,YT)
      XSCALE=XR-XL
      YSCALE=YT-YB
      YF=0.4+( MIN(XRG,YRG)-0.4)*0.5
      CTRSIZ=3.0*YF*0.01
      CALL XCHMAG(CTRSIZ)

      VUNIT=UUNIT
      DX=XLENG
      DY=XLENG
      PXO=X0
      PYO=Y0
      PX1=X0+DX
      PY1=Y0
      PX2=X0
      PY2=Y0+DY
      CALL XTRANS(PXO,PYO)
      CALL XTRANS(PX1,PY1)
      CALL XTRANS(PX2,PY2)
      DPH=SQRT( (PX1-PXO)**2+(PY1-PYO)**2  )
      DPV=SQRT( (PX2-PXO)**2+(PY2-PYO)**2  )
 5    IF( DPV.GT.1.5*DPH ) THEN
          DPV=DPV*0.5
          DY=DY*0.5
          VUNIT=VUNIT*0.5
          GOTO 5
      ENDIF
 6    IF( DPV.LT.0.75*DPH ) THEN
          DPV=DPV*2
          DY=DY*2
          VUNIT=VUNIT*2
          GOTO 6
      ENDIF
      PX2=X0
      PY2=Y0+DY
      CALL XTRANS(PX2,PY2)

      IF( KEY.EQ.0.OR.KEY.EQ.1) THEN
        ARROW=0.30*DPH
        COSTA=(PX1-PXO)/DPH
        SINTA=(PY1-PYO)/DPH
        DX1=ARROW*(COSTA*COSA1-SINTA*SINA1)
        DY1=ARROW*(SINTA*COSA1+COSTA*SINA1)
        DX2=ARROW*(COSTA*COSA2-SINTA*SINA2)
        DY2=ARROW*(SINTA*COSA2+COSTA*SINA2)
        CALL XTPNUP(PXO,PYO)
        CALL XTPNDN(PX1    , PY1)
C       CALL XTPNUP(PX1    , PY1    )
        CALL XTPNDN(PX1+DX1, PY1+DY1)
        CALL XTPNUP(PX1    , PY1    )
        CALL XTPNDN(PX1+DX2, PY1+DY2)
      WRITE(CH,'(F6.1,'' m/s'')') UUNIT
      LCH=10
      CALL XCHLJ (CH,LCH)
      CALL XCHARL(X0+DX   +0.01*XSCALE,Y0,CH(1:LCH) )
      ENDIF
      IF(KEY.EQ.0.OR.KEY.EQ.2)  THEN
        ARROW=0.20*DPH
        COSTA=(PX2-PXO)/DPV
        SINTA=(PY2-PYO)/DPV
        DX1=ARROW*(COSTA*COSA1-SINTA*SINA1)
        DY1=ARROW*(SINTA*COSA1+COSTA*SINA1)
        DX2=ARROW*(COSTA*COSA2-SINTA*SINA2)
        DY2=ARROW*(SINTA*COSA2+COSTA*SINA2)
        CALL XTPNUP(PXO,PYO)
        CALL XTPNDN(PX2    , PY2)
C       CALL XTPNUP(PX2    , PY2    )
        CALL XTPNDN(PX2+DX1, PY2+DY1)
        CALL XTPNUP(PX2    , PY2    )
        CALL XTPNDN(PX2+DX2, PY2+DY2)
        CALL XQOBAG( XANG, YANG )
        CALL XQCHOR( ASYM )
        CALL XCHORI(90.0+ YANG- XANG)
        WRITE(CH,'(F6.1,'' m/s'')') VUNIT
        LCH=10
        CALL XCHLJ (CH,LCH)
        CALL XCHARL(X0-.02*XSCALE ,Y0 ,CH(1:LCH) )
        CALL XCHORI( ASYM )
      ENDIF
      RETURN
      END