C SUBROUTINE TPERSP ====*====3====*====4====*====5====*====6====*====7
C
C        THREE DIMENSIONAL PLOT PROGRAM SET
C
C                   1989/12/09 BY A.YANASE
C                   2001/03/09 BY A.YANASE
C                       THIS FILE CONTAINS THE FUNCTIONS
C                       ONLY FOR TPFXYZ & TPSECT
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPERSP(XFU,XFG,ALP,BET,GAM,ELD,ELL)
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS1/X0,Y0,Z0,XN,YN,ZN,XW,YW,ZW,IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/XFCTR,YFCTR,ZFCTR,XP0,CA,SA,ET,EL,SG,ZM,ZC
     &  ,XEYE,YEYE,ZEYE
      COMMON/TPERS6/DFST,DMIN,DMAX,DFAC,DVID
      COMMON/TPERS6D/DDFST,DDMIN,DDMAX,DDFAC,DDVID
      COMMON/TPERS9/XOM(3),WM(3,2)
C      INTEGER TPNCUT
C      EXTERNAL FUNC,TPDUMY,TPLTRA
C      EXTERNAL TPNCUT
      DIMENSION XFU(3,2),XFG(3)
      WRITE(6,*) ' ----- WELCOME TO TPERSP V3.0 2001/07/07 -----'
      IF(ALP.GE.180.0.OR.ALP.LE.-180.) GO TO 999
      IF(BET.GE.90.0.OR.BET.LE.-90.0) GO TO 999
      IF(GAM.GE.90.0.OR.GAM.LE.-90.0) GO TO 999
      IF(ELD.LT.0.0) GO TO 999
      IF(ELL.LT.0.0) GO TO 999
      DO 10 I=1,3
      IF(XFU(I,1).GE.XFU(I,2)) GO TO 999
      IF(XFG(I).LE.0.0) GO TO 999
   10 CONTINUE
C
      IUOD=1
      IHL=0
      IPR=0
      IMOD=1
      CALL TPHILP(-1.0)
      CALL TPHILD(0.0,0,0,0,0)
C         ****
      ALPHA=ALP
      BETA=BET
      GAMM=GAM
      X0=XFU(1,1)
      Y0=XFU(2,1)
      Z0=XFU(3,1)
      XN=XFU(1,2)
      YN=XFU(2,2)
      ZN=XFU(3,2)
      XW=XFG(1)
      YW=XFG(2)
      ZW=XFG(3)
      DO 1 I=1,3
      XOM(I)=XFU(I,1)
      DO 2 J=1,2
    2 WM(I,J)=0.0
    1 CONTINUE
      WM(1,1)=1.0
      WM(2,2)=1.0
      XFCTR=XW/(XN-X0)
      YFCTR=YW/(YN-Y0)
      ZFCTR=ZW/(ZN-Z0)
C         ****
      RAD=3.141593/180.0
C          ****
      CA=COS(RAD*ALPHA)
      SA=SIN(RAD*ALPHA)
      XWC=XW*CA
      XWS=XW*SA
      YWC=YW*CA
      YWS=YW*SA
C     ****
      IF(ALPHA.LT.-90.0) GO TO 301
      IF(ALPHA.LT.  0.0) GO TO 302
      IF(ALPHA.LT. 90.0) GO TO 303
      GO TO 304
  301 TAU=-(XWS+YWC)
      GO TO 305
  302 TAU=-XWS
      GO TO 305
  303 TAU=0.0
      GO TO 305
  304 TAU=-YWC
  305 CONTINUE
      EL=ELL
      TAU=TAU+ELD
C     ****
      ET=EL+TAU
      SG=ET*SIN(RAD*BETA)/COS(RAD*BETA)
C         ****
      V1=SG/ET
      V2=(SG-YWS)/(ET+YWC)
      V3=(SG+XWC)/(ET+XWS)
      V4=(SG+XWC-YWS)/(ET+XWS+YWC)
      XP0=MIN(V1,V2,V3,V4)*EL
C         ****
      VMIN=EL+ELD
      TG=SIN(RAD*GAMM)/COS(RAD*GAMM)
      ZC=VMIN*TG
      ZM=TG
      IF(GAMM.GT.0.0) ZM=VMIN/
     &  (VMIN+ABS(XWS)+ABS(YWC))*TG
C         ****
      XEYE=-(ET*SA+SG*CA)
      YEYE=-(ET*CA-SG*SA)
      ZEYE=-VMIN*TG
      DFST=0.2
      DMIN=0.1
      DMAX=10.0
      DFAC=2.0
      DVID=0.25
      DDFST=0.1
      DDMIN=0.1
      DDMAX=10.0
      DDFAC=2.0
      DDVID=0.25
      WRITE(6,600) X0,Y0,Z0,XN,YN,ZN,XW,YW,ZW
      WRITE(6,603) XFCTR,YFCTR,ZFCTR
      WRITE(6,601) ALPHA,BETA,GAMM,ELD,ELL
      WRITE(6,602) XEYE,YEYE,ZEYE
  600 FORMAT(' YOUR FIGURE IS FROM (',3E14.5,')'
     &      /'                 TO  (',3E14.5,')'
     &      /' SIZE OF FIGURE      (',3E14.5,')')
  603 FORMAT(' SETTING FACTOR      (',3E14.5,')')
  601 FORMAT(' ALPH=',E14.5,' BETA=',E14.5,' GAMM=',E14.5,
     &      /' ELD= ',E14.5,' ELL= ',E14.5)
  602 FORMAT(' EYE POINT IS        (',3E14.5,')')
      CALL TPPLOT(X0,Y0,Z0,3)
C this call is 1994/10/14
      RETURN
  999 CONTINUE
      WRITE(6,690)
  690 FORMAT(' *** INVALID VALUE OF ARGUMENT IN TPERSP ***')
      RETURN
      END
C SUBROUTINE TPSCHG ====*====3====*====4====*====5====*====6====*====7
C
C        MODE OR UNIT CHANGE FOR TPERSP
C
C                   1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPSCHG(IA)
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS1/XM(3,3),IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/FCTR(3),W(11)
      COMMON/TPERS6/DFST,DMIN,DMAX,DFAC,DVID
      COMMON/TPERS9/XOM(3),WM(3,2)
      DIMENSION AX(3)
      IF(IABS(IA).EQ.1) IUOD=IA
      RETURN
      ENTRY TPCIHL(IA)
      IF(IA.GE.-2.AND.IA.LE.5) IHL=IA
      RETURN
      ENTRY TPTRAC(IA)
      IF(IA.LE.2.AND.IA.GE.0) IPR=IA
      RETURN
      ENTRY TPUNIT(IA)
      IF(IA.EQ.IMOD) GO TO 11
      IF(IABS(IA).NE.1) GO TO 11
      IF(IA.EQ.1) GO TO 2
      DO 3 J=1,2
      DO 4 I=1,3
    4 AX(I)=WM(I,J)*FCTR(I)
      WA=SQRT(AX(1)*AX(1)+AX(2)*AX(2)+AX(3)*AX(3))
      IF(WA.LT.1.0D-30) GO TO 1
      DO 5 I=1,3
    5 WM(I,J)=AX(I)/WA
    3 CONTINUE
      DO 6 I=1,3
    6 XOM(I)=(XOM(I)-XM(I,1))*FCTR(I)
      GO TO 1
    2 DO 7 J=1,2
      DO 8 I=1,3
    8 AX(I)=WM(I,J)/FCTR(I)
      WA=SQRT(AX(1)*AX(1)+AX(2)*AX(2)+AX(3)*AX(3))
      IF(WA.LT.1.0D-30) GO TO 1
      DO 9 I=1,3
    9 WM(I,J)=AX(I)/WA
    7 CONTINUE
      DO 10 I=1,3
   10 XOM(I)=XOM(I)/FCTR(I)+XM(I,1)
    1 IMOD=IA
   11 RETURN
      ENTRY TPHLDS(DF,DI,DA,DC,DD)
      IF(DF.GT.1.0D-10) DFST=DF
      IF(DI.GT.1.0D-10) DMIN=DI
      IF(DA.GT.1.0D-10) DMAX=DA
      IF(DC.GT.1.0D-10) DFAC=DC
      IF(DD.GT.1.0D-10) DVID=DD
      RETURN
      ENTRY TPHLDG(DF,DI,DA,DC,DD)
      DF=DFST
      DI=DMIN
      DA=DMAX
      DC=DFAC
      DD=DVID
      RETURN
      END
C SUBROUTINE TPCSEC ====*====3====*====4====*====5====*====6====*====7
C
C        EXTRA ENTRANCE FOR TPERSP
C        WHEN CROS SECTION IS PLOT IN 2 DIMENSIONAL FIGURE
C
C                   1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPCSEC(XFU,XFG)
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS1/X0,Y0,Z0,XN,YN,ZN,XW,YW,ZW,IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/XFCTR,YFCTR,ZFCTR,XP0,CA,SA,ET,EL,SG,ZM,ZC
     &  ,XEYE,YEYE,ZEYE
      DIMENSION XFU(3,2),XFG(3)
       WRITE(6,*) ' ----- WELCOME TO TPERSP V3.0 2001/07/07 -----'
      DO 10 I=1,3
      IF(XFU(I,1).GE.XFU(I,2)) GO TO 999
      IF(XFG(I).LE.0.0) GO TO 999
   10 CONTINUE
      IUOD=1
      IHL=-2
      IPR=0
      IMOD=1
      X0=XFU(1,1)
      Y0=XFU(2,1)
      Z0=XFU(3,1)
      XN=XFU(1,2)
      YN=XFU(2,2)
      ZN=XFU(3,2)
      XW=XFG(1)
      YW=XFG(2)
      ZW=XFG(3)
      XFCTR=XW/(XN-X0)
      YFCTR=YW/(YN-Y0)
      ZFCTR=ZW/(ZN-Z0)
      WRITE(6,600) X0,Y0,Z0,XN,YN,ZN,XW,YW,ZW
      WRITE(6,603) XFCTR,YFCTR,ZFCTR
  600 FORMAT(' YOUR FIGURE IS FROM (',3E14.5,')'
     &      /'                 TO  (',3E14.5,')'
     &      /' SIZE OF FIGURE      (',3E14.5,')')
  603 FORMAT(' SETTING FACTOR      (',3E14.5,')')
      RETURN
  999 CONTINUE
      WRITE(6,690)
  690 FORMAT(' *** INVALID VALUE OF ARGUMENT IN TPCSEC ***')
      RETURN
      END
C SUBROUTINE TPLINE ====*====3====*====4====*====5====*====6====*====7
C
C        THREE DIMENSIONAL LINE
C
C                   1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPLINE(X1,Y1,Z1,X2,Y2,Z2,NC)
      IMPLICIT REAL*8(A-H,O-Z)
      IF(NC.LT.1) RETURN
      DX=(X2-X1)/FLOAT(NC)
      DY=(Y2-Y1)/FLOAT(NC)
      DZ=(Z2-Z1)/FLOAT(NC)
      CALL TPPLOT(X1,Y1,Z1,3)
      CALL TPPLOT(X1,Y1,Z1,2)
      DO 1 I=1,NC
      XX=X1+DX*FLOAT(I)
      YY=Y1+DY*FLOAT(I)
      ZZ=Z1+DZ*FLOAT(I)
      CALL TPPLOT(XX,YY,ZZ,2)
    1 CONTINUE
      RETURN
      END
C SUBROUTINE TPPOSI ====*====3====*====4====*====5====*====6====*====7
C
C        SCREEN POINT XP, ZP CORRESPOND TO THREE DIMENSIONAL POINT
C                     XA,YA,ZA
C
C                   1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPPOSI(XA,YA,ZA,XP,ZP)
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS1/X0,Y0,Z0,XN,YN,ZN,XW,YW,ZW,IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/XFCTR,YFCTR,ZFCTR,XP0,CA,SA,ET,EL,SG,ZM,ZC
     &   ,XEYE,YEYE,ZEYE
      IF(IMOD.EQ.1) GO TO 1
      X=XA
      Y=YA
      Z=ZA
      GO TO 4
    1 X=(XA-X0)*XFCTR
      Y=(YA-Y0)*YFCTR
      Z=(ZA-Z0)*ZFCTR
    4 CONTINUE
      V=1.0/(X*SA+Y*CA+ET)
      XP=(X*CA-Y*SA+SG)*V*EL-XP0
      ZP=((Z+ZC)*V-ZM)*EL
      RETURN
      END
C SUBROUTINE TPXFXG ====*====3====*====4====*====5====*====6====*====7
C
C        TRANSFORMATION FROM FUNCTION UNIT TO REAL UNIT
C
C                   1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPXFXG(XF,XG)
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS1/XM(3,3),IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/XFCTR,YFCTR,ZFCTR,XP0,CA,SA,ET,EL,SG,ZM,ZC
     &  ,XEYE,YEYE,ZEYE
      REAL*8 XF(3),XG(3)
      XG(1)=(XF(1)-XM(1,1))*XFCTR
      XG(2)=(XF(2)-XM(2,1))*YFCTR
      XG(3)=(XF(3)-XM(3,1))*ZFCTR
      RETURN
      END
C SUBROUTINE TPXGXF ====*====3====*====4====*====5====*====6====*====7
C
C        TRANSFORMATION REAL UNIT TO FUNCTION UNIT
C
C                   1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPXGXF(XG,XF)
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS1/XM(3,3),IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/XFCTR,YFCTR,ZFCTR,XP0,CA,SA,ET,EL,SG,ZM,ZC
     &  ,XEYE,YEYE,ZEYE
      REAL*8 XF(3),XG(3)
      XF(1)=XG(1)/XFCTR+XM(1,1)
      XF(2)=XG(2)/YFCTR+XM(2,1)
      XF(3)=XG(3)/ZFCTR+XM(3,1)
      RETURN
      END
C SUBROUTINE TPPLOT ====*====3====*====4====*====5====*====6====*====7
C
C    TRANSFORMATION FROM 3 DIMENSION TO CORDINATES ON THE SCREEN
C    PEN UP AND DOWN IS CONTROLED BY TPHILN(ENTRY OF TPHILP)
C    LINE FORM       IS CONTROLED BY TPHILM(ENTRY OF TPHILD)
C
C                   1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPPLOT(XA,YA,ZA,JP)
C     **** JP=3...START ****
C     **** JP=0 OR 2...CONTINUED ****
      IMPLICIT REAL*8(A-H,O-Z)
      SAVE KPL,KPLD,IPC,XP,ZP
      COMMON/TPERS1/X0,Y0,Z0,XN,YN,ZN,XW,YW,ZW,IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/XFCTR,YFCTR,ZFCTR,XP0,CA,SA,ET,EL,SG,ZM,ZC
     &   ,XEYE,YEYE,ZEYE
      COMMON/TPERS8/X3,X4,Y3,Y4,Z3,Z4
     &             ,XPS1,ZPS1,XP1,ZP1
     &             ,X5,X6,Y5,Y6,Z5,Z6
     &             ,XPDS1,ZPDS1,XPDE1,ZPDE1
      DIMENSION Q(3)
      IF(IMOD.EQ.1) GO TO 1
      X=XA
      Y=YA
      Z=ZA
      XX=(X/XFCTR)+X0
      YY=(Y/YFCTR)+Y0
      ZZ=(Z/ZFCTR)+Z0
      GO TO 4
    1 XX=XA
      YY=YA
      ZZ=ZA
      X=(XX-X0)*XFCTR
      Y=(YY-Y0)*YFCTR
      Z=(ZZ-Z0)*ZFCTR
    4 CONTINUE
      IM=IMOD
      IMOD=-1
      IP=IPC
      XPS1=XP
      ZPS1=ZP
      KPLS=KPL
      KPLDS=KPLD
      V=1.0/(X*SA+Y*CA+ET)
      XP=(X*CA-Y*SA+SG)*V*EL-XP0
      ZP=((Z+ZC)*V-ZM)*EL
      XQ=X
      YQ=Y
      ZQ=Z
      Q(1)=XQ
      Q(2)=YQ
      Q(3)=ZQ
      IF(JP.NE.3) GO TO 2
C     **** JP=3 ****
      CALL TPHILN(Q,KPL)
      CALL TPHILM(Q,KPLD,IS1,IS2,IS3)
      IF(KPL.EQ.-1) IPC=3
      IF(KPL.EQ.1)  IPC=2
      IF(KPLD.EQ.-1) CALL SETDAS(IS1,IS2,IS3)
      IF(KPLD.EQ.1)  CALL SETDAS(0,0,0)
      IF(IPR.EQ.2) WRITE(6,600) XX,YY,ZZ,X,Y,Z,XP,ZP,JP,IPC,KPL,KPLD
  600 FORMAT(' TRACE IN TPPLOT',3E11.3,5F10.4,4I4)
      CALL PLOTPS(XP,ZP,2)
      GO TO 800
C     **** JP=0 OR 2 ****
    2 CONTINUE
      CALL TPHILN(Q,KPL)
      CALL TPHILM(Q,KPLD,IS1,IS2,IS3)
      IF(KPL.EQ.KPLS.AND.KPLD.EQ.KPLDS) GO TO 3
      X3=X4
      X4=X
      Y3=Y4
      Y4=Y
      Z3=Z4
      Z4=Z
      XP1=XP
      ZP1=ZP
      CALL TPVANS(IP,KPLS,KPL,KPLDS,KPLD)
      IPC=IP
      GO TO 800
C     ****
    3 CONTINUE
      IPV=IP
      IF(IPR.EQ.2) WRITE(6,600) XX,YY,ZZ,X,Y,Z,XP,ZP,JP,IP,KPL,KPLD
      CALL PLOTPS(XP,ZP,IPV-1)
  800 CONTINUE
      X4=X
      Y4=Y
      Z4=Z
      IMOD=IM
      RETURN
      END
C SUBROUTINE TPVANS ====*====3====*====4====*====5====*====6====*====7
C
C    FIND THE VANISHING POINT
C    PEN UP AND DOWN IS CONTROLED BY TPHILN
C    LINE FORM       IS CONTROLED BY TPHILM
C
C                   1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPVANS(KP,KPLS,KPLE,KPLDS,KPLDE)
C     ** TO FIND VANISH POINT **
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS1/W(9),IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/XFCTR,YFCTR,ZFCTR,XP0,CA,SA,ET,EL,SG,ZM,ZC
     &   ,XEYE,YEYE,ZEYE
      COMMON/TPERS8/X3,X4,Y3,Y4,Z3,Z4,
     &              XPS1,ZPS1,XP1,ZP1
     &             ,X5,X6,Y5,Y6,Z5,Z6
     &             ,XPDS1,ZPDS1,XPDE1,ZPDE1
      DIMENSION Q(3)
      DATA PX,PZ,PX1,PZ1/0.05,0.05,0.055,0.055/
      IF(KPLE.EQ.KPLS) THEN
         X5=X3
         Y5=Y3
         Z5=Z3
         X6=X4
         Y6=Y4
         Z6=Z4
         XPDS1=XPS1
         ZPDS1=ZPS1
         XPDE1=XP1
         ZPDE1=ZP1
         CALL TPVAND(KP,KPLS,KPLDE)
         RETURN
      END IF
      DX=-0.5*(X4-X3)
      DY=-0.5*(Y4-Y3)
      DZ=-0.5*(Z4-Z3)
      XP=XP1
      ZP=ZP1
      KPL=KPLE
      KPL1=KPLE
      XQ=X4
      YQ=Y4
      ZQ=Z4
      DO 130 L=1,8
         XQ=XQ+DX
         YQ=YQ+DY
         ZQ=ZQ+DZ
         V=1.0/(XQ*SA+YQ*CA+ET)
         XPS=XP
         ZPS=ZP
         XP=(XQ*CA-YQ*SA+SG)*V*EL-XP0
         ZP=((ZQ+ZC)*V-ZM)*EL
         KPLS=KPL
         Q(1)=XQ
         Q(2)=YQ
         Q(3)=ZQ
         CALL TPHILN(Q,KPL)
         IF(ABS(XP-XPS).GT.PX) GO TO 131
         IF(ABS(ZP-ZPS).GT.PZ) GO TO 131
         GO TO 132
  131    CONTINUE
         DX=0.5*DX
         DY=0.5*DY
         DZ=0.5*DZ
         IF(KPL.EQ.KPLS) GO TO 130
         DX=-DX
         DY=-DY
         DZ=-DZ
  130 CONTINUE
  132 CONTINUE
      IF(ABS(XP-XP1).GT.PX1)
     &   GO TO 133
      IF(ABS(ZP-ZP1).GT.PZ1)
     &   GO TO 133
      XP=XP1
      ZP=ZP1
      XQ=X4
      YQ=Y4
      ZQ=Z4
      GO TO 134
  133 CONTINUE
      IF(ABS(XP-XPS1).GT.PX1)
     &   GO TO 134
      IF(ABS(ZP-ZPS1).GT.PZ1)
     &   GO TO 134
      XP=XPS1
      ZP=ZPS1
      XQ=X3
      YQ=Y3
      ZQ=Z3
  134 CONTINUE
      Q(1)=XQ
      Q(2)=YQ
      Q(3)=ZQ
      CALL TPHILM(Q,KPLD,IS1,IS2,IS3)
      IF(KPLD.NE.KPLDS) THEN
         X5=X3
         Y5=Y3
         Z5=Z3
         X6=XQ
         Y6=YQ
         Z6=ZQ
         XPDS1=XPS1
         ZPDS1=ZPS1
         XPDE1=XP
         ZPDE1=ZP
         CALL TPVAND(KP,KPLS,KPLD)
      ELSE
         KPV=KP
         IF(IPR.EQ.2) WRITE(6,600) XQ,YQ,ZQ,XP,ZP,KP,KPL,KPLD
  600    FORMAT(' TRACE IN TPVANS',33X,5F10.4,4X,3I4)
         CALL PLOTPS(XP,ZP,KPV-1)
      END IF
      KP=5-KP
      IF(KPLD.NE.KPLDE) THEN
         X5=XQ
         Y5=YQ
         Z5=ZQ
         X6=X4
         Y6=Y4
         Z6=Z4
         XPDS1=XP
         ZPDS1=ZP
         XPDE1=XP1
         ZPDE1=ZP1
         CALL TPVAND(KP,KPLE,KPLDE)
      ELSE
         KPL=KPL1
         XP=XP1
         ZP=ZP1
         KPV=KP
         IF(IPR.EQ.2) WRITE(6,600) X4,Y4,Z4,XP,ZP,KP,KPL,KPLDE
         CALL PLOTPS(XP,ZP,KPV-1)
      END IF
C     ****
      RETURN
      END
C SUBROUTINE TPVAND ====*====3====*====4====*====5====*====6====*====7
C
C    FIND THE CHANGE POINT OF LINE FORM
C    LINE FORM       IS CONTROLED BY TPHILM
C
C                   1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPVAND(KP,KPLH,KPLDE)
C     ** TO FIND CHANGE POINT **
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS1/W(9),IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/XFCTR,YFCTR,ZFCTR,XP0,CA,SA,ET,EL,SG,ZM,ZC
     &   ,XEYE,YEYE,ZEYE
      COMMON/TPERS8/X3,X4,Y3,Y4,Z3,Z4,
     &              XPS1,ZPS1,XP1,ZP1
     &             ,X5,X6,Y5,Y6,Z5,Z6
     &             ,XPDS1,ZPDS1,XPDE1,ZPDE1
      DIMENSION Q(3)
      DATA PX,PZ,PX1,PZ1/0.05,0.05,0.055,0.055/
      DX=-0.5*(X6-X5)
      DY=-0.5*(Y6-Y5)
      DZ=-0.5*(Z6-Z5)
      XP=XPDE1
      ZP=ZPDE1
      KPL1=KPLDE
      KPL=KPLDE
      XQ=X6
      YQ=Y6
      ZQ=Z6
      DO 130 L=1,8
      XQ=XQ+DX
      YQ=YQ+DY
      ZQ=ZQ+DZ
      V=1.0/(XQ*SA+YQ*CA+ET)
      XPS=XP
      ZPS=ZP
      XP=(XQ*CA-YQ*SA+SG)*V*EL-XP0
      ZP=((ZQ+ZC)*V-ZM)*EL
      KPLS=KPL
      Q(1)=XQ
      Q(2)=YQ
      Q(3)=ZQ
      CALL TPHILM(Q,KPL,IS1,IS2,IS3)
      IF(ABS(XP-XPS).GT.PX) GO TO 131
      IF(ABS(ZP-ZPS).GT.PZ) GO TO 131
      GO TO 132
  131 CONTINUE
      DX=0.5*DX
      DY=0.5*DY
      DZ=0.5*DZ
      IF(KPL.EQ.KPLS) GO TO 130
      DX=-DX
      DY=-DY
      DZ=-DZ
  130 CONTINUE
  132 CONTINUE
      IF(ABS(XP-XPDE1).GT.PX1)
     &   GO TO 133
      IF(ABS(ZP-ZPDE1).GT.PZ1)
     &   GO TO 133
      XP=XPDE1
      ZP=ZPDE1
      XQ=X6
      YQ=Y6
      ZQ=Z6
      GO TO 134
  133 CONTINUE
      IF(ABS(XP-XPDS1).GT.PX1)
     &   GO TO 134
      IF(ABS(ZP-ZPDS1).GT.PZ1)
     &   GO TO 134
      XP=XPDS1
      ZP=ZPDS1
      XQ=X5
      YQ=Y5
      ZQ=Z5
  134 CONTINUE
      KPV=KP
      IF(IPR.EQ.2) WRITE(6,600) XQ,YQ,ZQ,XP,ZP,KP,KPLH,KPL
  600 FORMAT(' TRACE IN TPVAND',33X,5F10.4,4X,3I4)
      CALL PLOTPS(XP,ZP,KPV-1)
      IF(KPLDE.EQ.-1) CALL SETDAS(IS1,IS2,IS3)
C      WRITE(6,*) ' SS1 SS2 NLFF ',SS1,SS2,NLFF
      IF(KPLDE.EQ.1) CALL SETDAS(0,0,0)
      XP=XPDE1
      ZP=ZPDE1
      KPLD=KPLDE
      KPV=KP
      IF(IPR.EQ.2) WRITE(6,600) X4,Y4,Z4,XP,ZP,KP,KPLH,KPLD
      CALL PLOTPS(XP,ZP,2)
      CALL PLOTPS(XP,ZP,KPV-1)
C     ****
      RETURN
      END
C SUBROUTINE TPHILP ====*====3====*====4====*====5====*====6====*====7
C
C       FIRST HIDDEN LINE ROUTINE
C       IHL=0  --------  NORMAL CASE
C          IF(THERE IS ANY POINT(XA) ON THE WAY FROM Q TO EYE POINT
C          FUNC(XA)-HHV)*IUOD.LT.0.0) 
C          OR POINT Q IS OUTSIDE
C          OR POINT Q IS CUT OUT BY TPHILL THEN  KPL=-1
C                                           ELSE  KPL=1
C       IHL=2
C          IF POINT Q IS OUTSIDE 
C          OR POINT Q IS CUT OUT BY TPHILL THEN  KPL=-1
C                                ELSE  KPL=1
C       IHL=3
C          ALMOST THE SAME AS IHL=0
C          BUT EVEN IF(POINT Q IS CUT OUT BY TPHILL)
C          KPL IS NOT AUTOMATICALLY -1        
C       IHL=4, KPL IS ALWAYS 1,UNLESS Q IS OUTtSIDE
C       IHL=5  KPL IS ALWAYS 1   
C       INITIAL SET IN TPERSP
C          IIOD=1
C          IHL =0
C          CALL TPHILP(-1.0)
C                   1989/12/09 BY A.YANASE
C           2001/03/09/ BY A.YANASE     
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPHILP(HHV)
      IMPLICIT REAL*8(A-H,O-Z)
      EXTERNAL FUNC,LFUNC
      COMMON/TPERS1/X0,Y0,Z0,XN,YN,ZN,XW,YW,ZW,IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/XFCTR,YFCTR,ZFCTR,W(8),XEYE,YEYE,ZEYE
      COMMON/TPERS6/DFST,DMIN,DMAX,DFAC,DVID
      DIMENSION Q(3),XA(3),P(3),QQ(3)
      HV=HHV
      RETURN
C
      ENTRY TPHILN(Q,KPL)
      KPL=1
      IF(IHL.EQ.5) GO TO 2
      IF(IMOD.EQ.-1) GO TO 11
      XX=Q(1)
      YY=Q(2)
      ZZ=Q(3)
      XQ=(XX-X0)*XFCTR
      YQ=(YY-Y0)*YFCTR
      ZQ=(ZZ-Z0)*ZFCTR
      GO TO 12
   11 XQ=Q(1)
      YQ=Q(2)
      ZQ=Q(3)
      XX=(XQ/XFCTR)+X0
      YY=(YQ/YFCTR)+Y0
      ZZ=(ZQ/ZFCTR)+Z0
   12 CONTINUE
      IF(XQ.LT.-1.0D-3) GO TO 4
      IF(XQ.GT.XW+1.0D-3) GO TO 4
      IF(YQ.LT.-1.0D-3) GO TO 4
      IF(YQ.GT.YW+1.0D-3) GO TO 4
      IF(ZQ.LT.-1.0D-3) GO TO 4
      IF(ZQ.GT.ZW+1.0D-3) GO TO 4
      IF(IHL.EQ.4) GO TO 2
      XA(1)=XX
      XA(2)=YY
      XA(3)=ZZ
      LL=LFUNC(XA)
C     WRITE(6,600) LL,XX,YY,ZZ,XQ,YQ,ZQ
C 600 FORMAT(I4,6E13.5)
      IF(LL.EQ.1.AND.IHL.NE.3) GO TO 4
      IF(IHL.EQ.2) GO TO 2
    7 CONTINUE
      PX=XEYE-XQ
      PY=YEYE-YQ
      PZ=ZEYE-ZQ
      WA=SQRT(PX*PX+PY*PY+PZ*PZ)
      PX=PX/WA
      PY=PY/WA
      PZ=PZ/WA
      IF(IHL.EQ.1) GO TO 123
      DD=DFST
      DST=DMIN
      DW=1.0D30
      DO 1 I=1,20000
      XD=XQ+PX*DD
      IF(XD.LT.0.0) GO TO 2
      IF(XD.GT.XW) GO TO 2
      YD=YQ+PY*DD
      IF(YD.LT.0.0) GO TO 2
      IF(YD.GT.YW) GO TO 2
      ZD=ZQ+PZ*DD
      IF(ZD.LT.0.0) GO TO 2
      IF(ZD.GT.ZW) GO TO 2
      XA(1)=(XD/XFCTR)+X0
      XA(2)=(YD/YFCTR)+Y0
      XA(3)=(ZD/ZFCTR)+Z0
      IF(LFUNC(XA).EQ.1) GO TO 6
      EE=FUNC(XA)
C      *******************************
C     WRITE(6,601) EE,HV,XX,YY,ZZ,XD,YD,ZD,DD
C 601 FORMAT(9E12.4)
C       *****************************
      IF(EE.GT.HV) GO TO 3
      IF(IUOD.EQ.-1) GO TO 5
      GO TO 4
    3 IF(IUOD.EQ.1) GO TO 5
      GO TO 4
    5 DV=ABS(EE-HV)
C          *******************************************************
      IF(DV.LT.DW.AND.DST*DVID.GE.DMIN) DST=DST*DVID
C     IF(DV.GT.DW.AND.DST*DFAC.LE.DMAX) DST=DST*DFAC
      IF(DV.GE.DW.AND.DST*DFAC.LE.DMAX) DST=DST*DFAC
C       **********************************************************
      DW=DV
    6 DD=DD+DST
    1 CONTINUE
    4 KPL=-1
    2 CONTINUE
      RETURN
  123 CONTINUE
      P(1)=PX
      P(2)=PY
      P(3)=PZ
      QQ(1)=XX
      QQ(2)=YY
      QQ(3)=ZZ
      EE=TPMASB(QQ,P)
      IF(EE.LE.0.0) KPL=-1
      RETURN
      END
C SUBROUTINE TPHILD ====*====3====*====4====*====5====*====6====*====7
C
C       SECOND HIDDEN LINE ROUTINE
C          IF(THERE IS ANY POINT(XA) ON THE WAY FROM Q TO EYE POINT
C          FUNC(XA)-HHV)*IUOD.LT.0.0) 
C          OR POINT Q IS OUTSIDE
C          OR POINT Q IS CUT OUT BY TPHILL THEN  KPL=-1
C                                          ELSE  KPL=1
C          HOWEVER IF(IFLAG.EQ.0) KPL IS ALWAYS -1
C          INITIAL SET IN TPERSP
C          IUOD=1
C          CALL TPHILD(0.0,0,0,0,0)
C          PART OF KPL=-1 IS PLOTTED BY THE LINE GIVEN BY
C            IS1,IS2,IS3
C            IS1=0     FULL LINE
C            IS3=0     DASHED LINE
C            IS3.GT.0  DASH AND DOT LINE
C        ----------    ----    -----------
C           IS1    IS2 IS3 IS2  IS1
C            1989/12/09 BY A.YANASE
C            2001/03/09 BY A.YANASE
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPHILD(HHV,IFLAG,IS1,IS2,IS3)
      IMPLICIT REAL*8(A-H,O-Z)
      SAVE ISS1,ISS2,ISS3,HV,IIFL
      COMMON/TPERS1/X0,Y0,Z0,XN,YN,ZN,XW,YW,ZW,IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/XFCTR,YFCTR,ZFCTR,W(8),XEYE,YEYE,ZEYE
      COMMON/TPERS6D/DFST,DMIN,DMAX,DFAC,DVID
      DIMENSION Q(3),XA(3)
      HV=HHV
      IIFL=IFLAG
      ISS1=IS1
      ISS2=IS2
      ISS3=IS3
      RETURN
C
C
      ENTRY TPHILM(Q,KPL,IS1,IS2,IS3)
      IS1=ISS1
      IS2=ISS2
      IS3=ISS3
      IF(IIFL.EQ.0) THEN
          KPL=-1
          RETURN
      END IF
      KPL=1
      IF(IMOD.EQ.-1) GO TO 11
      XX=Q(1)
      YY=Q(2)
      ZZ=Q(3)
      XQ=(XX-X0)*XFCTR
      YQ=(YY-Y0)*YFCTR
      ZQ=(ZZ-Z0)*ZFCTR
      GO TO 12
   11 XQ=Q(1)
      YQ=Q(2)
      ZQ=Q(3)
      XX=(XQ/XFCTR)+X0
      YY=(YQ/YFCTR)+Y0
      ZZ=(ZQ/ZFCTR)+Z0
   12 CONTINUE
      XA(1)=XX
      XA(2)=YY
      XA(3)=ZZ
      PX=XEYE-XQ
      PY=YEYE-YQ
      PZ=ZEYE-ZQ
      WA=SQRT(PX*PX+PY*PY+PZ*PZ)
      PX=PX/WA
      PY=PY/WA
      PZ=PZ/WA
      DD=DFST
      DST=DMIN
      DW=1.0E30
      DO 1 I=1,20000
      XD=XQ+PX*DD
      IF(XD.LT.0.0) GO TO 2
      IF(XD.GT.XW) GO TO 2
      YD=YQ+PY*DD
      IF(YD.LT.0.0) GO TO 2
      IF(YD.GT.YW) GO TO 2
      ZD=ZQ+PZ*DD
      IF(ZD.LT.0.0) GO TO 2
      IF(ZD.GT.ZW) GO TO 2
      XA(1)=(XD/XFCTR)+X0
      XA(2)=(YD/YFCTR)+Y0
      XA(3)=(ZD/ZFCTR)+Z0
      IF(LFUNC(XA).EQ.1) GO TO 6
      EE=FUNCD(XA)
C      *******************************
C     WRITE(6,601) EE,HV,XX,YY,ZZ,XD,YD,ZD,DD
C 601 FORMAT(9E12.4)
C       *****************************
      IF(EE.GT.HV) GO TO 3
      IF(IUOD.EQ.-1) GO TO 5
      GO TO 4
    3 IF(IUOD.EQ.1) GO TO 5
      GO TO 4
    5 DV=ABS(EE-HV)
C          *******************************************************
      IF(DV.LT.DW.AND.DST*DVID.GE.DMIN) DST=DST*DVID
C     IF(DV.GT.DW.AND.DST*DFAC.LE.DMAX) DST=DST*DFAC
      IF(DV.GE.DW.AND.DST*DFAC.LE.DMAX) DST=DST*DFAC
C       **********************************************************
      DW=DV
    6 DD=DD+DST
    1 CONTINUE
    4 KPL=-1
    2 CONTINUE
      RETURN
      END
C SUBROUTINE TPSECT ====*====3====*====4====*====5====*====6====*====7
C
C    THREE DIMENSIONAL(IHL.GE.0) OR 
C    TWO   DIMENSIONAL(IHL.LT.0)     PLOT OF
C    CROSS SECTION OF AA=FUNC(X,Y,Z) BY THE PLAN
C    THROUGH XCC WITH DIRCTION COSINE GIVEN BY DRR
C
C            1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPSECT(FUNC,AA,DRR,XCC,IAL,ICR,NNX,NNY,KKX,KKY)
      IMPLICIT REAL*8(A-H,O-Z)
      EXTERNAL FUNC
      REAL*8 KB,KBM
      COMMON/TPERS1/XM(3,3),IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/FCTR(3),W2(11)
      COMMON/TPERS3/ALT(2402,2402),HX,HY,NX,NY,HV
      COMMON/TPERS4/XOR(3),WW(3,3),XFC,YFC
      DIMENSION DR(3),XCD(3),XC(3),DRR(3),XCC(3)
      DIMENSION XYZJ(3),XYZI(3)
      DIMENSION DW(3),XMAX(2),XMIN(2),XCR(3,12)
      DIMENSION KB(3),KBM(3,4),XD(3),WX(3)
      IF(NNX.GT.2402) GO TO 999
      IF(NNX.LE.0) GO TO 999
      IF(NNY.GT.2402) GO TO 999
      IF(NNY.LE.0) GO TO 999
      CALL PTIME(TB)
      NX=NNX
      NY=NNY
      HV=AA
      IM=IMOD
      IMOD=-1
      DO 11 I=1,3
      DR(I)=DRR(I)
   11 XC(I)=XCC(I)
      IF(IM.EQ.1) THEN
         DO 12 I=1,3
         DR(I)=DR(I)*FCTR(I)
   12    XC(I)=(XC(I)-XM(I,1))*FCTR(I)
      END IF
      IF(IAL.EQ.1) GO TO 810
      WA=DR(1)*DR(1)+DR(2)*DR(2)+DR(3)*DR(3)
      WA=SQRT(WA)
      DL=DR(1)/WA
      DM=DR(2)/WA
      DN=DR(3)/WA
      DW(1)=DL
      DW(2)=DM
      DW(3)=DN
      WA=SQRT(DL*DL+DM*DM)
      IF(WA.LT.1.0D-10) THEN
         DO 18 I=1,3
         DO 19 J=1,3
   19    WW(I,J)=0.0
   18    WW(I,I)=1.0
      ELSE
         WW(1,1)=DM/WA
         WW(1,2)=(DN*DL)/WA
         WW(1,3)=DL
         WW(2,1)=-DL/WA
         WW(2,2)=(DN*DM)/WA
         WW(2,3)=DM
         WW(3,1)=0.0
         WW(3,2)=-WA
         WW(3,3)=DN
      END IF
C      WRITE(6,602) XM,WW,XC,DW
C  602 FORMAT(9E14.6)
      WA=DW(1)*XC(1)+DW(2)*XC(2)+DW(3)*XC(3)
C    EQUATION OF PLANE IS GIVEN BY
C    WA=DW(1)*X+DW(2)*Y+DW(3)*Z
      NCR=0
      XMAX(1)=-1.0E20
      XMIN(1)=1.0E20
      XMAX(2)=-1.0E20
      XMIN(2)=1.0E20
      DO 20 I=1,2
      DO 21 J=I+1,3
      K=J-I
      IF(J.EQ.2) K=3
C    I=1, J=2, K=3
C    I=1, J=3, K=2
C    I=2, J=3, K=1
C      IF(IPR.GE.1) WRITE(6,600) I,J,K
      IF(ABS(DW(K)).LT.1.0D-10) GO TO 21
      DO 22 I1=1,2
      IF(I1.EQ.1) THEN
         XYZI(I)=0.0
         XYZI(J)=0.0
         XYZI(K)=0.0
      ELSE
         XYZI(I)=XM(I,3)
         XYZI(J)=XM(J,3)
         XYZI(K)=XM(K,3)
      END IF
      DO 23 J1=1,2
      IF(J1.EQ.1) THEN
         XYZJ(I)=0.0
         XYZJ(J)=0.0
         XYZJ(K)=0.0
      ELSE
         XYZJ(I)=XM(I,3)
         XYZJ(J)=XM(J,3)
         XYZJ(K)=XM(K,3)
      END IF
      XH=(WA-DW(I)*XYZI(I)-DW(J)*XYZJ(J))/DW(K)
      IF(XH.LT.-1.0D-4) GO TO 23
      IF(XH.GT.XM(K,3)+1.0D-4) GO TO 23
      WX(I)=XYZI(I)
      WX(J)=XYZJ(J)
      WX(K)=XH
      NCR=NCR+1
C      WRITE(6,600) I,J,K,WX
C  600 FORMAT(3I10,3E20.7)
      DO 24 II=1,3
      WB=0.0
      DO 25 JJ=1,3
   25 WB=WB+WX(JJ)*WW(JJ,II)
      XCR(II,NCR)=WB
      IF(WB.GT.XMAX(II).AND.II.NE.3) XMAX(II)=WB
      IF(WB.LT.XMIN(II).AND.II.NE.3) XMIN(II)=WB
   24 CONTINUE
   23 CONTINUE
   22 CONTINUE
   21 CONTINUE
   20 CONTINUE
      IF(XMAX(1).LE.XMIN(1)) GO TO 999
      IF(XMAX(2).LE.XMIN(2)) GO TO 999
C     WRITE(6,600) NCR
C     WRITE(6,602) XCR
C     WRITE(6,601) XMAX,XMIN
C 601 FORMAT(4E20.7)
      XCD(1)=(XMAX(1)+XMIN(1))*0.5
      XCD(2)=(XMAX(2)+XMIN(2))*0.5
      XCD(3)=XCR(3,1)
C     WRITE(6,602) XCD
      CALL PTIME(TA)
      TE=(TA-TB)*60.0*60.0
      IF(IPR.GE.1) WRITE(6,6001) TE,XC,DW
 6001 FORMAT(' TIME FOR SETTING TPSECT',F7.4
     &      /10X,' XC',3F9.5,' DR',3F9.5)
      TB=TA
      HX=(XMAX(1)-XMIN(1))/FLOAT(NX-1)
      HY=(XMAX(2)-XMIN(2))/FLOAT(NY-1)
      NXH=(NX-1)/2+1
      NYH=(NY-1)/2+1
      HMAX=-1.0E20
      HMIN=1.0E20
      XD(3)=XCD(3)
      DO 13 I=1,NX
      XD(1)=XCD(1)+FLOAT(I-NXH)*HX
      DO 14 J=1,NY
      XD(2)=XCD(2)+FLOAT(J-NYH)*HY
      DO 15 I1=1,3
      WA=0.0
      DO 16 I2=1,3
   16 WA=WA+WW(I1,I2)*XD(I2)
      KB(I1)=WA/FCTR(I1)+XM(I1,1)
   15 CONTINUE
      WB=FUNC(KB)
      ALT(I,J)=WB
      IF(WB.GT.HMAX) HMAX=WB
      IF(WB.LT.HMIN) HMIN=WB
      IF(J.EQ.1) THEN
         IF(I.EQ.1) THEN
            DO 33 I1=1,3
            XOR(I1)=(KB(I1)-XM(I1,1))*FCTR(I1)
   33       KBM(I1,1)=KB(I1)
         ELSE IF(I.EQ.NX) THEN
            DO 32 I1=1,3
   32       KBM(I1,2)=KB(I1)
         END IF
      ELSE IF(J.EQ.NY) THEN
         IF(I.EQ.1) THEN
            DO 31 I1=1,3
   31       KBM(I1,3)=KB(I1)
         ELSE IF(I.EQ.NX) THEN
            DO 30 I1=1,3
   30       KBM(I1,4)=KB(I1)
         END IF
      END IF
   14 CONTINUE
   13 CONTINUE
      IF(IPR.GE.1) THEN
         WRITE(6,6020)
 6020 FORMAT(' CORNER COORDINATES IN FUNCTION UNIT OF SETTING PLANE')
         DO 29 J1=1,4
         WRITE(6,6021) (KBM(I1,J1),I1=1,3)
 6021    FORMAT(1H ,3F10.5)
   29 CONTINUE
      END IF
      CALL PTIME(TA)
      TE=(TA-TB)*60.0*60.0
      IF(IPR.GE.1) WRITE(6,6002) TE,HMAX,HV,HMIN
 6002 FORMAT(' TIME FOR VALUES TPSECT ',F7.4
     &       ,3E11.4)
      TB=TA
      IF(HMAX.LT.HV) GO TO 820
      IF(HMIN.GT.HV) GO TO 820
      IF(IHL.GE.0.AND.ICR.NE.1) GO TO 810
      WB=0.0
      WA=0.0
      DO 34 I1=1,3
      WC=(KBM(I1,1)-KBM(I1,2))**2
      WA=WA+WC
      WB=WB+WC*(FCTR(I1)**2)
   34 CONTINUE
      XFC=SQRT(WB/WA)
      WWX=SQRT(WB)
      WB=0.0
      WA=0.0
      DO 35 I1=1,3
      WC=(KBM(I1,1)-KBM(I1,3))**2
      WA=WA+WC
      WB=WB+WC*(FCTR(I1)**2)
   35 CONTINUE
      YFC=SQRT(WB/WA)
      WWY=SQRT(WB)
      IF(IHL.GE.0) GO TO 810
      CALL PLOTPS(0.0,0.0,2)
      CALL PLOTPS(WWX,0.0,1)
      CALL PLOTPS(WWX,WWY,1)
      CALL PLOTPS(0.0,WWY,1)
      CALL PLOTPS(0.0,0.0,1)
  810 CONTINUE
      CALL TPCONT
      CALL PTIME(TA)
      TE=(TA-TB)*60.0*60.0
      IF(IPR.GE.1) WRITE(6,6003) TE
 6003 FORMAT(' CPTIME FOR TPCONT IN TPSECT',F7.4)
      TB=TA
      IF(ICR.NE.1) GO TO 820
      NCX=KKX
      NCY=KKY
      CALL TPCROS(NCX,NCY)
      CALL PTIME(TA)
      TE=(TA-TB)*60.0*60.0
      IF(IPR.GE.1) WRITE(6,6004) TE
 6004 FORMAT(' CPTIME FOR TPCROS IN TPSECT',F7.4)
      TB=TA
  820 IMOD=IM
      RETURN
  999 CONTINUE
      WRITE(6,690)
  690 FORMAT(' *** INVALID VALUE OF ARGUMENT IN TPSECT ***')
      IMOD=IM
      RETURN
      END
C SUBROUTINE TPFXYZ ====*====3====*====4====*====5====*====6====*====7
C
C    THREE DIMENSIONAL PLOT OF AA=FUNC(X,Y,Z)
C
C            1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPFXYZ(FUNC,AA,NN,NK,ICRO)
      IMPLICIT REAL*8(A-H,O-Z)
      REAL*8 KB,KBA
      EXTERNAL FUNC
      COMMON/TPERS1/XM(3,3),IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/FCTR(3),W2(11)
      COMMON/TPERS3/ALT(2402,2402),HX,HY,NX,NY,EF
      COMMON/TPERS4/XOR(3),WW(9),XFC,YFC
      DIMENSION KB(3),KBA(3),NN(3),NK(3)
      DIMENSION W(9,3)
      DATA W/1.0,0.0,0.0, 0.0,1.0,0.0, 0.0,0.0,1.0,
     &       0.0,1.0,0.0, 0.0,0.0,1.0, 1.0,0.0,0.0,
     &       0.0,0.0,1.0, 1.0,0.0,0.0, 0.0,1.0,0.0/
      DO 51 I=1,3
      IF(NN(I).GT.2402) GO TO 999
      IF(NN(I).LE.0) GO TO 999
      IF(NK(I).LE.0) GO TO 999
   51 CONTINUE
      IM=IMOD
      IMOD=1
      CALL PTIME(TB)
      EF=AA
      ICROS=ICRO
      DO 14 IXX=1,3
      IYY=MOD(IXX,3)+1
      IZZ=MOD(IXX+1,3)+1
         HX=(XM(IXX,2)-XM(IXX,1))/FLOAT(NN(IXX)-1)
         HY=(XM(IYY,2)-XM(IYY,1))/FLOAT(NN(IYY)-1)
         HZ=(XM(IZZ,2)-XM(IZZ,1))/FLOAT(NN(IZZ)-1)
      DO 63 I=1,9
      WW(I)=W(I,IXX)
   63 CONTINUE
         XOR(IXX)=XM(IXX,1)
         XOR(IYY)=XM(IYY,1)
      NX=NN(IXX)
      NY=NN(IYY)
      NZ=NN(IZZ)
      NKZ=NK(IZZ)
      NCX=NK(IXX)
      NCY=NK(IYY)
      DO 11 KZ=1,NZ,NKZ
         KB(IZZ)=XM(IZZ,1)+HZ*FLOAT(KZ-1)
         XOR(IZZ)=KB(IZZ)
      EMAX=-1.0E38
      EMIN=1.0E38
      DO 21 KY=1,NY
          KB(IYY)=XM(IYY,1)+HY*FLOAT(KY-1)
      DO 22 KX=1,NX
          KB(IXX)=XM(IXX,1)+HX*FLOAT(KX-1)
      DO 12 I=1,3
   12 KBA(I)=KB(I)
      WA=FUNC(KBA)

      ALT(KX,KY)=WA
      IF(EMAX.LT.WA) EMAX=WA
      IF(EMIN.GT.WA) EMIN=WA
   22 CONTINUE
   21 CONTINUE
      CALL PTIME(TA)
      TE=(TA-TB)*60.0*60.0
      IF(IPR.GE.1) WRITE(6,6003) TE,IXX,IYY,IZZ,KB(IZZ)
     &      ,EMAX,EF,EMIN
 6003 FORMAT(' TIME FOR VALUES TPFXYZ',F7.4,3I2,4E11.4)
      TB=TA
      IF(EMAX.LT.EF) GO TO 11
      IF(EMIN.GT.EF) GO TO 11
      CALL TPCONT
      CALL PTIME(TA)
      TE=(TA-TB)*60.0*60.0
      IF(IPR.GE.1) WRITE(6,6001) TE
 6001 FORMAT(' TIME FOR TPCONT TPFXYZ',F7.3)
      TB=TA
      IF(ICROS.NE.1) GO TO 11
      IF(KZ.NE.1.AND.KZ.NE.NZ) GO TO 11
      CALL TPCROS(NCX,NCY)
      CALL PTIME(TA)
      TE=(TA-TB)*60.0*60.0
      IF(IPR.GE.1) WRITE(6,6002) TE
 6002 FORMAT(' TIME FOR TPCROS TPFXYZ',F7.4)
      TB=TA
   11 CONTINUE
   14 CONTINUE
      IMOD=IM
      RETURN
  999 CONTINUE
      WRITE(6,690)
  690 FORMAT(' *** INVALID VALUE OF ARGUMENT IN TPFXYZ ***')
      RETURN
      END
C SUBROUTINE TPCONT ====*====3====*====4====*====5====*====6====*====7
C
C     TPCONT
C
C        1989/12/14   A. YANASE
C        ORIGINALY BY S.MIYAHARA FOR AREA CALCULATION
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPCONT
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS3/ALT(2402,2402),HX,HY,NX,NY,HV
      COMMON/TPERS5/KSW(2402,2402),AX,AY,BX,BY,
     &      UA1,UA2,KV,IREP,IA,JA,IT,JT,KS
C     ****
      IG=1
      DO 50 I=1,NX
      DO 50 J=1,NY
   50 KSW(I,J)=0
C     ****
      KERR=0
      KV=1
C     ****
      DO 20 KX=1,NX
      V=ALT(KX,1)-HV
      IF(V) 2,3,1
    1 KG=1
      GO TO 4
    2 KG=2
      GO TO 4
    3 KG=3
    4 CONTINUE
      IF(KSW(KX,1).NE.KV) GO TO 5
      IF(ALT(KX,2)-HV.LE.0.0) KG=2
    5 CONTINUE
C     ****
      DO 30 KY=2,NY
      V=ALT(KX,KY)-HV
      IF(KSW(KX,KY).EQ.KV) GO TO 15
C     ****
      GO TO (6,8,21),KG
C     ** ALT(KX,1),GT.HV **
    6 IF(V) 7,7,30
    7 CONTINUE
      IREP=0
      DO 60 M=1,2
      IA=KX
      JA=KY-1
      GO TO (31,32),M
   31 IF(KX.EQ.NX) GO TO 60
      IT=1
      KS=-1
      GO TO 33
   32 IF(KX.EQ.1) GO TO 60
      IF(IREP.GE.2) GO TO 60
      IT=-1
      KS=1
      KSW(IA,JA)=0
   33 JT=0
      UA1=ALT(IA,JA)
      UA2=ALT(IA,JA+1)
      ALX=HX*FLOAT(IA-1)
      RT=(UA2-HV)/(UA1-UA2)
      ALY=HY*(FLOAT(JA)+RT)
      KERR=1
      CALL TP2TO3(ALX,ALY,3)
      CALL TP2TO3(ALX,ALY,2)
      AX=ALX
      AY=ALY
      CALL TPSEAR
      IF(KX.EQ.1.OR.KX.EQ.NX) GO TO 60
      IF(ABS(AX-BX).GT.HX*2.2) GO TO 60
      IF(ABS(AY-BY).GT.HY*2.2) GO TO 60
      CALL TP2TO3(AX,AY,2)
      IG=IG+1
      GO TO 61
   60 CONTINUE
   61 CONTINUE
      KG=2
      GO TO 30
C     ** ALT(KX,1).LT.HV **
    8 IF(V) 30,30,9
    9 CONTINUE
      IREP=0
      DO 70 M=1,2
      IA=KX
      JA=KY
      GO TO (34,35),M
   34 IF(KX.EQ.NX) GO TO 70
      IT=1
      KS=1
      GO TO 36
   35 IF(KX.EQ.1) GO TO 70
      IF(IREP.GE.2) GO TO 70
      IT=-1
      KS=-1
      KSW(IA,JA)=0
   36 JT=0
      UA1=ALT(IA,JA)
      UA2=ALT(IA,JA-1)
      ALX=HX*FLOAT(IA-1)
      RT=(UA1-HV)/(UA1-UA2)
      ALY=HY*(FLOAT(JA-1)-RT)
      KERR=1
      CALL TP2TO3(ALX,ALY,3)
      CALL TP2TO3(ALX,ALY,2)
      AX=ALX
      AY=ALY
      CALL TPSEAR
      IF(KX.EQ.1.OR.KX.EQ.NX) GO TO 70
      IF(ABS(AX-BX).GT.HX*2.2) GO TO 70
      IF(ABS(AY-BY).GT.HY*2.2) GO TO 70
      CALL TP2TO3(AX,AY,2)
      GO TO 71
   70 CONTINUE
   71 CONTINUE
      KG=1
      GO TO 30
C     ****
   15 GO TO (16,17,30),KG
   16 KG=2
      IF(KY.EQ.NY) GO TO 30
      IF(ALT(KX,KY+1)-HV.GT.0.0) KG=1
      GO TO 30
   17 KG=1
      IF(V.LT.0.0) KG=2
      GO TO 30
C     ****
   21 IF(V) 23,24,22
   22 KG=1
      GO TO 25
   23 KG=2
      GO TO 25
   24 KG=3
   25 CONTINUE
C     ****
   30 CONTINUE
C     ****
   20 CONTINUE
C     ****
      IF(KERR.EQ.0) WRITE(6,2001) HV
 2001 FORMAT(' (TPAREB) HEIT (',E9.2,
     & ') IS NOT FOUND.')
C     ****
      RETURN
      END
C SUBROUTINE TPSEAR ====*====3====*====4====*====5====*====6====*====7
C
C     TPSEAR
C
C        1989/12/14   A. YANASE
C        ORIGINALY BY S.MIYAHARA FOR AREA CALCULATION
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPSEAR
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS3/ALT(2402,2402),HX,HY,NX,NY,HV
      COMMON/TPERS5/KSW(2402,2402),AX,AY,BX,BY,
     &      UA1,UA2,KV,IREP,IA,JA,IT,JT,KS
C     ****
      ITV=0
      JTV=0
      LN=800
      IREP=0
C     ****
      DO 10 L=2,LN
      IF(KSW(IA,JA).EQ.KV) GO TO 806
      GO TO 819
  806 IF(IA+ITV.EQ.0.OR.JA+JTV.EQ.0) GO TO 99
      IF(IA-ITV.EQ.0.OR.JA-JTV.EQ.0) GO TO 99
      ALT1=ALT(IA-ITV,JA-JTV)
      ALT2=ALT(IA,JA)
      ALT3=ALT(IA+ITV,JA+JTV)
      ALT4=ALT(IA-ITV,JA+JTV)
      ALT5=ALT(IA+ITV,JA-JTV)
      IF((ALT1.LT.ALT2).AND.(ALT2.GT.ALT3)) GO TO 819
      IF((ALT1.GT.ALT2).AND.(ALT2.LT.ALT3)) GO TO 819
      IF((ALT4.LT.ALT2).AND.(ALT2.GT.ALT5)) GO TO 819
      IF((ALT4.GT.ALT2).AND.(ALT2.LT.ALT5)) GO TO 819
      GO TO 99
  819 CONTINUE
      IAV=IA+IT
      IF(IAV.LE.0) GO TO 98
      IF(IAV.GT.NX) GO TO 98
      JAV=JA+JT
      IF(JAV.LE.0) GO TO 98
      IF(JAV.GT.NY) GO TO 98
      VA1=ALT(IAV,JAV)
      UD1=VA1-HV
      VD1=VA1-HV
      IF(VD1) 1,1,2
C     ****
    1 IREP=IREP+1
      RT=(UA1-HV)/(UA1-VA1)
      ALX=HX*(FLOAT(IA-1)
     &   +RT*FLOAT(IT))
      ALY=HY*(FLOAT(JA-1)
     &   +RT*FLOAT(JT))
      CALL TP2TO3(ALX,ALY,2)
      ITV=IT
      IT=-KS*JT
      JT=KS*ITV
      UA2=VA1
      IF(IREP.GE.4) GO TO 98
      GO TO 10
C     ****
    2 IREP=0
      ITV=KS*JT
      JTV=-KS*IT
      IAV=IAV+ITV
      JAV=JAV+JTV
      VA2=ALT(IAV,JAV)
      IF(VA2-HV) 3,3,4
C     ****
    3 RT=(VA1-HV)/(VA1-VA2)
      ALX=HX*(FLOAT(IA+IT-1)
     &   +RT*FLOAT(ITV))
      ALY=HY*(FLOAT(JA+JT-1)
     &   +RT*FLOAT(JTV))
      CALL TP2TO3(ALX,ALY,2)
      KSW(IA,JA)=KV
      IA=IA+IT
      JA=JA+JT
      UA1=VA1
      UA2=VA2
      GO TO 10
C     ****
    4 UD2=UA2-HV
      ITV=KS*JT
      JTV=-KS*IT
      RT=(UA2-HV)/(UA2-VA2)
      ALX=HX*(FLOAT(IA+ITV-1)
     &   +RT*FLOAT(IT))
      ALY=HY*(FLOAT(JA+JTV-1)
     &   +RT*FLOAT(JT))
      CALL TP2TO3(ALX,ALY,2)
      KSW(IA,JA)=KV
      IA=IA+IT+ITV
      JA=JA+JT+JTV
      IT=ITV
      JT=JTV
      UA1=VA2
C     ****
   10 CONTINUE
C     ****
      GO TO 99
   98 KSW(IA,JA)=KV
   99 CONTINUE
      BX=ALX
      BY=ALY
      RETURN
      END
C SUBROUTINE TPCROS ====*====3====*====4====*====5====*====6====*====7
C
C    GRID PLOT ROUTINE IN CONT.
C
C            1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPCROS(NCX,NCY)
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS1/W1(9),IUOD,IHL,IPR,IMOD
      COMMON/TPERS3/ALT(2402,2402),HX,HY,NX,NY,HV
      COMMON/TPERS6/DFST,DMIN,DMAX,DFAC,DVID
      DDFST=DFST
      DFST=0.05
      XWR=HX*FLOAT(NX-1)
      YWR=HY*FLOAT(NY-1)
      EEF=HV
      IEOH=IUOD
      IF(NCX.LE.0) GO TO 30
      IYS=NY
      DO 10 KX=1,NX,NCX
      IF(IYS.EQ.NY) GO TO 12
      IYS=NY
      YA1=YWR
      GO TO 13
   12 IYS=1
      YA1=0.0
   13 XX=HX*FLOAT(KX-1)
      IP=3
      UA1=ALT(KX,IYS)
      IF(UA1.GT.EEF) GO TO 181
      IF(IEOH.EQ.-1) GO TO 18
      GO TO 182
  181 IF(IEOH.EQ.1) GO TO 18
  182 CONTINUE
      CALL TP2TO3(XX,YA1,IP)
      IP=2
      CALL TP2TO3(XX,YA1,IP)
   18 DO 14 IKY=2,NY
      KY=IKY
      IF(IYS.EQ.NY) KY=NY-IKY+1
      YA2=HY*FLOAT(KY-1)
      UA2=ALT(KX,KY)
      IF(IP.EQ.3) GO TO 15
      IF(UA2.LE.EEF) GO TO 161
      IF(IEOH.EQ.-1) GO TO 16
      GO TO 162
  161 IF(IEOH.EQ.1) GO TO 16
  162 CONTINUE
      YY=YA1+(YA2-YA1)*((EEF-UA1)/(UA2-UA1))
      CALL TP2TO3(XX,YY,IP)
      IP=3
      GO TO 17
   16 CALL TP2TO3(XX,YA2,IP)
      GO TO 17
   15 IF(UA2.GT.EEF) GO TO 171
      IF(IEOH.EQ.-1) GO TO 17
      GO TO 172
  171 IF(IEOH.EQ.1) GO TO 17
  172 CONTINUE
      YY=YA1+(YA2-YA1)*((EEF-UA1)/(UA2-UA1))
      CALL TP2TO3(XX,YY,IP)
      IP=2
      CALL TP2TO3(XX,YY,IP)
      CALL TP2TO3(XX,YA2,IP)
   17 UA1=UA2
      YA1=YA2
   14 CONTINUE
   10 CONTINUE
   30 IF(NCY.LE.0) GO TO 31
      IXS=1
      DO 20 KY=1,NY,NCY
      IF(IXS.EQ.NX) GO TO 22
      IXS=NX
      XA1=XWR
      GO TO 23
   22 IXS=1
      XA1=0.0
   23 YY=HY*FLOAT(KY-1)
      IP=3
      UA1=ALT(IXS,KY)
      IF(UA1.GT.EEF) GO TO 281
      IF(IEOH.EQ.-1) GO TO 28
      GO TO 282
  281 IF(IEOH.EQ.1) GO TO 28
  282 CONTINUE
      CALL TP2TO3(XA1,YY,IP)
      IP=2
      CALL TP2TO3(XA1,YY,IP)
   28 DO 24 IKX=2,NX
      KX=IKX
      IF(IXS.EQ.NX) KX=NX-IKX+1
      XA2=HX*FLOAT(KX-1)
      UA2=ALT(KX,KY)
      IF(IP.EQ.3) GO TO 25
      IF(UA2.LE.EEF) GO TO 261
      IF(IEOH.EQ.-1) GO TO 26
      GO TO 262
  261 IF(IEOH.EQ.1) GO TO 26
  262 CONTINUE
      XX=XA1+(XA2-XA1)*((EEF-UA1)/(UA2-UA1))
      CALL TP2TO3(XX,YY,IP)
      IP=3
      GO TO 27
   26 CALL TP2TO3(XA2,YY,IP)
      GO TO 27
   25 IF(UA2.GT.EEF) GO TO 271
      IF(IEOH.EQ.-1) GO TO 27
      GO TO 272
  271 IF(IEOH.EQ.1) GO TO 27
  272 CONTINUE
      XX=XA1+(XA2-XA1)*((EEF-UA1)/(UA2-UA1))
      CALL TP2TO3(XX,YY,IP)
      IP=2
      CALL TP2TO3(XX,YY,IP)
      CALL TP2TO3(XA2,YY,IP)
   27 UA1=UA2
      XA1=XA2
   24 CONTINUE
   20 CONTINUE
   31 DFST=DDFST
      RETURN
      END
C SUBROUTINE TP2TO3 ====*====3====*====4====*====5====*====6====*====7
C
C    WHEN IHL.GE.0 THEN
C       TRANSFORMATION FROM TWO DIMENSIONAL PLANE TO
C       THEREE DIMENSIONAL COORDINATES
C    WHEN IHL.LT.0 THEN
C       DIRECTLY CALL PLOTPS
C            1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TP2TO3(ALX,ALY,IP)
      IMPLICIT REAL*8(A-H,O-Z)
      REAL*8 KB
      COMMON/TPERS1/XM(3,3),IUOD,IHL,IPR,IMOD
      COMMON/TPERS4/XOR(3),WW(3,3),XFC,YFC
      DIMENSION XD(3),KB(3)
C     WRITE(6,*) ALX,ALY,XOR
      JP=1
      IF(IHL.EQ.-2) GO TO 811
      XD(1)=ALX
      XD(2)=ALY
      DO 71 I1=1,3
      WA=XOR(I1)
      DO 72 I2=1,2
   72 WA=WA+WW(I1,I2)*XD(I2)
      IF(IMOD.EQ.1) THEN
         IF(WA.GT.XM(I1,2)) JP=0
         IF(WA.LT.XM(I1,1)) JP=0
      ELSE IF(IMOD.EQ.-1) THEN
         IF(WA.GT.XM(I1,3)) JP=0
         IF(WA.LT.0.0)      JP=0
      END IF
   71 KB(I1)=WA
C     WRITE(6,*) KB
      IF(IHL.LT.0) GO TO 811
      CALL TPPLOT(KB(1),KB(2),KB(3),IP)
      RETURN
  811 IF(JP.EQ.0) RETURN
      IF(IMOD.EQ.1) CALL PLOTPS(ALX*XFC,ALY*YFC,IP-1)
      IF(IMOD.EQ.-1) CALL PLOTPS(ALX,ALY,IP-1)
      RETURN
      END
      SUBROUTINE PLOTPS(AX,AY,IP)
      IMPLICIT REAL*8(A-H,O-Z)
      REAL*4 XX,YY
      XX=AX
      YY=AY
      IF(IP.EQ.2) THEN
        CALL MOVETO(XX,YY)
      ELSE IF(IP.EQ.1) THEN
        CALL LINETO(XX,YY)
      ELSE
        WRITE(6,*) ' STOP IN PLOTPS IP=',IP
      END IF
      RETURN
      END
C SUBROUTINE TPLIN2 ====*====3====*====4====*====5====*====6====*====7
C
C                   1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPLIN2(X,Y,IP)
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS0/GENT(2)
      COMMON/TPERS9/XOM(3),WM(3,2)
      DIMENSION XD(2),XA(3)
      JP=IP+1
      XD(1)=GENT(1)+X
      XD(2)=GENT(2)+Y
      DO 771 I1=1,3
      WA=XOM(I1)
      DO 772 I2=1,2
  772 WA=WA+WM(I1,I2)*XD(I2)
  771 XA(I1)=WA
      CALL TPPLOT(XA(1),XA(2),XA(3),JP)
      RETURN
      END
      SUBROUTINE TPORIG(XO,YO)
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS0/GENT(2)
      GENT(1)=GENT(1)+XO
      GENT(2)=GENT(2)+YO
      RETURN
      END
CC SUBROUTINE TPCIRC ====*====3====*====4====*====5====*====6====*====7
C
C       CIRCLE
C
C                   1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPCIRC(XC,YC,RR)
      IMPLICIT REAL*8(A-H,O-Z)
C      write(6,*) ' tpcirc',xc,yc,rr
      CALL TPORIG(XC,YC)
      CALL TPLIN2(RR,0.0,2)
      DO 1 I=1,72
      TH=FLOAT(I*5)*0.01745329
      X=RR*COS(TH)
      Y=RR*SIN(TH)
      CALL TPLIN2(X,Y,1)
    1 CONTINUE
      CALL TPORIG(-XC,-YC)
      RETURN
      END
C SUBROUTINE TPLANE ====*====3====*====4====*====5====*====6====*====7
C
C       PLANE IS SET WITH X-AXIS IN DX DIRECTION
C                         Y-AXIS IN DY DIRECTION
C                     AND ORIGIN  AT C
C
C                   1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPLANE(DX,DY,C)
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS0/GENT(2)
      COMMON/TPERS9/XOM(3),WM(3,2)
      DIMENSION DX(3),DY(3),C(3),AX(3),AY(3)
      WX=SQRT(DX(1)*DX(1)+DX(2)*DX(2)+DX(3)*DX(3))
      IF(WX.GT.1.0D-7) GO TO 1
      WRITE(6,*) ' STOP IN TPLANE, NORM OF DX=',WX
      STOP
    1 AX(1)=DX(1)/WX
      AX(2)=DX(2)/WX
      AX(3)=DX(3)/WX
      WY=SQRT(DY(1)*DY(1)+DY(2)*DY(2)+DY(3)*DY(3))
      IF(WY.GT.10D-7) GO TO 2
      WRITE(6,*) ' STOP IN TPLANE, NORM OF DY=',WX
      STOP
    2 AY(1)=DY(1)/WY
      AY(2)=DY(2)/WY
      AY(3)=DY(3)/WY
      DO 4 I=1,3
      WM(I,1)=AX(I)
      WM(I,2)=AY(I)
      XOM(I)=C(I)
    4 CONTINUE
      DO 5 I=1,2
      GENT(I)=0.0
    5 CONTINUE
      RETURN
      END
C SUBROUTINE TPCLEA ====*====3====*====4====*====5====*====6====*====7
C
C      MAIN ROUTINE FOR PLOT OF SPHERES AND BARS
C
C            1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPCLEA
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS1/XM(3,3),IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/FCTR(3),W(8),EYE(3)
      COMMON/TPERS7/XC(3,300),RR(300),IIP(300),XB(10,300),RB(300),
     &IB(2,300),NS,NB
      EXTERNAL TPMASB
      DIMENSION XX(3),DX(3),DY(3),EY(3),XA(3),XAA(3)
      CALL TPHILP(0.0)
      CALL TPCIHL(1)
      NS=0
      NB=0
      RETURN
C
C   SET SPHERE
C
      ENTRY TPSETS(XX,R,IP)
      IF(IP.GT.9.OR.IP.LE.-1) RETURN
      NS=NS+1
      IF(IMOD.EQ.-1) GO TO 2
      DO 1 I=1,3
    1 XC(I,NS)=XX(I)
      RR(NS)=R
      IIP(NS)=IP
      RETURN
    2 DO 3 I=1,3
    3 XC(I,NS)=XX(I)/FCTR(I)+XM(I,1)
      RR(NS)=R/FCTR(1)
      IIP(NS)=IP
      RETURN
C
C     SET BAR
C
      ENTRY TPSETB(N1,N2,RL)
      IF(N1.GT.NS) RETURN
      IF(N2.GT.NS) RETURN
      NB=NB+1
      WA=0.0
      DO 11 I=1,3
      XB(I,NB)=XC(I,N1)-XC(I,N2)
   11 WA=WA+XB(I,NB)**2
      XB(4,NB)=WA
      IF(IMOD.EQ.1) RB(NB)=RL
      IF(IMOD.EQ.-1) RB(NB)=(RL/FCTR(1))
      DO 12 I=1,3
   12 EY(I)=(EYE(I)/FCTR(I))+XM(I,1)
      DX(1)=XB(2,NB)*(EY(3)-XC(3,N1))-XB(3,NB)*(EY(2)-XC(2,N1))
      DX(2)=XB(3,NB)*(EY(1)-XC(1,N1))-XB(1,NB)*(EY(3)-XC(3,N1))
      DX(3)=XB(1,NB)*(EY(2)-XC(2,N1))-XB(2,NB)*(EY(1)-XC(1,N1))
      DY(1)=XB(2,NB)*DX(3)-XB(3,NB)*DX(2)
      DY(2)=XB(3,NB)*DX(1)-XB(1,NB)*DX(3)
      DY(3)=XB(1,NB)*DX(2)-XB(2,NB)*DX(1)
      WC=0.0
      WD=0.0
      DO 13 I=1,3
      WC=WC+DX(I)*DX(I)
   13 WD=WD+DY(I)*DY(I)
      WC=SQRT(WC)
      IF(WC.LT.1.E-7) GO TO 16
      WD=SQRT(WD)
      DO 18 I=1,3
      DX(I)=DX(I)/WC
   18 DY(I)=DY(I)/WD
      WE=0.0
      DO 14 I=1,2
      DO 15 J=I+1,3
      WE=WE+((EY(J)-XC(J,N1))*XB(I,NB)- (EY(I)-XC(I,N1))*XB(J,NB))**2
   15 CONTINUE
   14 CONTINUE
      A=SQRT(WE/XB(4,NB))
      P=(RL*RL)/A
      RM=RL*SQRT(1.0-P/A)
      DO 17 I=1,3
      XB(4+I,NB)=P*DY(I)+RM*DX(I)
      XB(7+I,NB)=P*DY(I)-RM*DX(I)
   17 CONTINUE
      IB(1,NB)=N1
      IB(2,NB)=N2
      RETURN
   16 NB=NB-1
      RETURN
C
      ENTRY TPDRWS(N)
      IF(N.GT.NS) RETURN
      CALL PTIME(TB)
      IM=IMOD
      IMOD=1
      X=XC(1,N)
      Y=XC(2,N)
      Z=XC(3,N)
      RS=RR(N)
C      write(6,*) ' tpdrws',n,rs,iip(n)
      IF(IIP(N).EQ.0) CALL TPSPHE(X,Y,Z,RS,0,0)
      IF(IIP(N).EQ.1) CALL TPSPHR(X,Y,Z,RS,1)
      IF(IIP(N).EQ.2) CALL TPSPHE(X,Y,Z,RS,4,3)
      IF(IIP(N).EQ.3) CALL TPSPHR(X,Y,Z,RS,3)
      IF(IIP(N).EQ.4) CALL TPSPHE(X,Y,Z,RS,8,7)
      IF(IIP(N).EQ.5) CALL TPSPHR(X,Y,Z,RS,5)
      IF(IIP(N).EQ.6) CALL TPSPHE(X,Y,Z,RS,10,9)
      IF(IIP(N).EQ.7) CALL TPSPHR(X,Y,Z,RS,7)
      IF(IIP(N).EQ.8) CALL TPSPHE(X,Y,Z,RS,12,11)
      IF(IIP(N).EQ.9) CALL TPSPHR(X,Y,Z,RS,9)
      IMOD=IM
      CALL PTIME(TA)
      TE=(TA-TB)*60.0*60.0
      IF(IPR.GE.1.AND.MOD(IIP(N),2).EQ.0) WRITE(6,6003) TE,X,Y,Z,RS
 6003 FORMAT(' TIME FOR TPSPHE TPDRWS',F7.3,4E11.4)
      IF(IPR.GE.1.AND.MOD(IIP(N),2).EQ.1) WRITE(6,6007) TE,X,Y,Z,RS
 6007 FORMAT(' TIME FOR TPSPHR TPDRWS',F7.3,4E11.4)
      RETURN
C
      ENTRY TPDRWB(M)
      IF(M.GT.NB) RETURN
      CALL PTIME(TB)
      IM=IMOD
      IMOD=1
      N1=IB(1,M)
      N2=IB(2,M)
      RQ=RB(M)
      CALL TPINSS(N1,N2,RQ)
      DO 22 J=1,2
      DO 21 I=1,3
      II=I+(J-1)*3+4
      XA(I)=XC(I,N1)+XB(II,M)
      XAA(I)=XC(I,N2)+XB(II,M)
   21 CONTINUE
      CALL TPLINE(XA(1),XA(2),XA(3),XAA(1),XAA(2),XAA(3),30)
   22 CONTINUE
      IMOD=IM
      CALL PTIME(TA)
      TE=(TA-TB)*60.0*60.0
      IF(IPR.GE.1) WRITE(6,6001) TE,(XC(I,N1),I=1,3)
     &                             ,(XC(I,N2),I=1,3)
 6001 FORMAT(' TIME TPLINE TPDRWB',F7.4,3E11.4/26X,3E11.4)
      RETURN
C
      ENTRY TPLINS(N1,N2)
      IF(N1.GT.NS) RETURN
      IF(N2.GT.NS) RETURN
      X1=XC(1,N1)
      Y1=XC(2,N1)
      Z1=XC(3,N1)
      X2=XC(1,N2)
      Y2=XC(2,N2)
      Z2=XC(3,N2)
      CALL TPLINE(X1,Y1,Z1,X2,Y2,Z2,60)
      RETURN
      END
C SUBROUTINE TPSPHE ====*====3====*====4====*====5====*====6====*====7
C
C     PLOT ROUTINE OF SPHERE WITH PATER OF EARTH GLOVE
C
C            1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPSPHE(XC,YC,ZC,RS,NPHI,NTHITA)
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS1/XM(3,3),IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/FCTR(3),W(8),EYE(3)
      DIMENSION DX(3),DY(3),C(3),X(3),PP(3)
C      write(6,*) ' tpsphe',xc,yc,zc,rs,nphi,nthita
      IM=IMOD
      IF(IMOD.EQ.-1) GO TO 1
      IMOD=-1
      X(1)=(XC-XM(1,1))*FCTR(1)
      X(2)=(YC-XM(2,1))*FCTR(2)
      X(3)=(ZC-XM(3,1))*FCTR(3)
      RR=RS*FCTR(1)
      GO TO 2
    1 X(1)=XC
      X(2)=YC
      X(3)=ZC
      RR=RS
    2 NP=NPHI
      NT=NTHITA
      WW=0.0
      DO 3 I=1,3
      PP(I)=EYE(I)-X(I)
      WW=WW+PP(I)*PP(I)
    3 CONTINUE
      A=SQRT(WW)
      IF(A-RR.LT.0.01) GO TO 7
      PX=PP(1)/A
      PY=PP(2)/A
      PZ=PP(3)/A
      P=(RR*RR)/A
      R=RR*SQRT(1.0-P/A)
      WA=SQRT(PX*PX+PY*PY)
      DX(1)=PY/WA
      DX(2)=-PX/WA
      DX(3)=0.0
      DY(1)=(PZ*PX)/WA
      DY(2)=(PZ*PY)/WA
      DY(3)=-WA
      C(1)=X(1)+P*PX
      C(2)=X(2)+P*PY
      C(3)=X(3)+P*PZ
      CALL TPLANE(DX,DY,C)
      CALL TPCIRC(0.0,0.0,R)
      IF(NP.LE.0) GO TO 4
      DO 5 I=1,3
      C(I)=X(I)
    5 DX(I)=0.0
      DX(3)=1.0
      DY(3)=0.0
      W1=3.141592/FLOAT(NP)
      DO 6 I=1,NP
      PHAI=FLOAT(I-1)*W1
      DY(1)=COS(PHAI)
      DY(2)=SIN(PHAI)
      CALL TPLANE(DX,DY,C)
      CALL TPCIRC(0.0,0.0,RR)
    6 CONTINUE
    4 IF(NT.LE.0) GO TO 7
      DO 8 I=1,3
      DX(I)=0.0
      DY(I)=0.0
    8 C(I)=X(I)
      DX(1)=1.0
      DY(2)=1.0
      W2=3.141592/FLOAT(NT+1)
      DO 9 I=1,NT
      THI=FLOAT(I)*W2
      C(3)=X(3)+RR*COS(THI)
      CALL TPLANE(DX,DY,C)
      RA=RR*SIN(THI)
      CALL TPCIRC(0.0,0.0,RA)
    9 CONTINUE
    7 DO 10 I=1,3
      DX(I)=0.0
      DY(I)=0.0
   10 C(I)=0.0
      DX(1)=1.0
      DY(2)=1.0
      CALL TPLANE(DX,DY,C)
      IF(IM.EQ.-1) GO TO 11
      CALL TPUNIT(IM)
   11 RETURN
      END
C SUBROUTINE TPSPHE ====*====3====*====4====*====5====*====6====*====7
C
C     PLOT ROUTINE OF SPHERE WITH PATERN OF CIRCLE ON PLANES
C     PERPENDICLAR TO THREE DIRECTION OF X,Y AND Z
C
C            1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPSPHR(XC,YC,ZC,RS,NZ)
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS1/XM(3,3),IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/FCTR(3),W(8),EYE(3)
      DIMENSION DX(3),DY(3),C(3),X(3),PP(3)
      IM=IMOD
      IF(IMOD.EQ.-1) GO TO 1
      IMOD=-1
      X(1)=(XC-XM(1,1))*FCTR(1)
      X(2)=(YC-XM(2,1))*FCTR(2)
      X(3)=(ZC-XM(3,1))*FCTR(3)
      RR=RS*FCTR(1)
      GO TO 2
    1 X(1)=XC
      X(2)=YC
      X(3)=ZC
      RR=RS
    2 N=NZ
      WW=0.0
      DO 3 I=1,3
      PP(I)=EYE(I)-X(I)
      WW=WW+PP(I)*PP(I)
    3 CONTINUE
      A=SQRT(WW)
      IF(A-RR.LT.0.01) GO TO 7
      PX=PP(1)/A
      PY=PP(2)/A
      PZ=PP(3)/A
      P=(RR*RR)/A
      R=RR*SQRT(1.0-P/A)
      WA=SQRT(PX*PX+PY*PY)
      DX(1)=PY/WA
      DX(2)=-PX/WA
      DX(3)=0.0
      DY(1)=(PZ*PX)/WA
      DY(2)=(PZ*PY)/WA
      DY(3)=-WA
      C(1)=X(1)+P*PX
      C(2)=X(2)+P*PY
      C(3)=X(3)+P*PZ
      CALL TPLANE(DX,DY,C)
      CALL TPCIRC(0.0,0.0,R)
      IF(N.LE.0) GO TO 7
      DO 21 II=1,2
      DO 22 JJ=II+1,3
      KK=JJ-II
      IF(JJ.EQ.2) KK=3
      DO 24 I=1,3
      C(I)=X(I)
      DX(I)=0.0
   24 DY(I)=0.0
      DX(II)=1.0
      DY(JJ)=1.0
      DZ=(2.0*RR)/FLOAT(N+1)
      DO 23 I=1,N
      RB=-RR+DZ*FLOAT(I)
      RA=SQRT(RR*RR-RB*RB)
      C(KK)=RB+X(KK)
      CALL TPLANE(DX,DY,C)
      CALL TPCIRC(0.0,0.0,RA)
   23 CONTINUE
   22 CONTINUE
   21 CONTINUE
    7 DO 10 I=1,3
      DX(I)=0.0
      DY(I)=0.0
   10 C(I)=0.0
      DX(1)=1.0
      DY(2)=1.0
      CALL TPLANE(DX,DY,C)
      IF(IM.EQ.-1) GO TO 11
      CALL TPUNIT(IM)
   11 RETURN
      END
C SUBROUTINE TPINSS ====*====3====*====4====*====5====*====6====*====7
C
C     PLOT ROUTINE OF CROSS SECTION SPHERE AND BAR
C
C            1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      SUBROUTINE TPINSS(N1,N2,R)
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS1/XM(3,3),IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/FCTR(3),W(11)
      COMMON/TPERS7/XC(3,300),RR(300),IIP(300),
     &               XB(10,300),RB(300),IB(2,300),NS,NB
      DIMENSION X1(3),X2(3),DELT(3),CENT1(3),CENT2(3), X(3),Y(3),DX(3)
      IM=IMOD
      IMOD=-1
      RF=R*FCTR(1)
      R1=RR(N1)*FCTR(1)
      R2=RR(N2)*FCTR(1)
      DO 10 I=1,3
      X1(I)=(XC(I,N1)-XM(I,1))*FCTR(I)
      X2(I)=(XC(I,N2)-XM(I,1))*FCTR(I)
      DELT(I)=X2(I)-X1(I)
   10 CONTINUE
      IF(R1.LE.RF) GO TO 11
      RC1=SQRT(R1*R1-RF*RF)
      GO TO 12
   11 RC1=0.0
   12 CONTINUE
      IF(R2.LE.RF) GO TO 13
      RC2=SQRT(R2*R2-RF*RF)
      GO TO 14
   13 RC2=0.0
   14 CONTINUE
      ANORM=SQRT(DELT(1)*DELT(1)+DELT(2)*DELT(2)+DELT(3)*DELT(3))
      DO 20 I=1,3
      DX(I)=DELT(I)/ANORM
      CENT1(I)=X1(I)+RC1*DX(I)
      CENT2(I)=X2(I)-RC2*DX(I)
   20 CONTINUE
      IF(ABS(1.0-ABS(DX(3))).GT.1.0E-4) GO TO 30
      X(1)=1.0
      X(2)=0.0
      X(3)=0.0
      Y(1)=0.0
      Y(2)=1.0
      Y(3)=0.0
      GO TO 31
   30 CONTINUE
      X(1)=DX(2)
      X(2)=-DX(1)
      X(3)=0.0
      Y(1)=-DX(1)*DX(3)
      Y(2)=-DX(2)*DX(3)
      Y(3)=DX(2)*DX(2)+DX(1)*DX(1)
   31 CONTINUE
      CALL TPLANE(X,Y,CENT1)
      CALL TPCIRC(0.0,0.0,RF)
      CALL TPLANE(X,Y,CENT2)
      CALL TPCIRC(0.0,0.0,RF)
      IMOD=IM
      RETURN
      END
C FUNCTION TPMASB  2====*====3====*====4====*====5====*====6====*====7
C
C      HIDDEN LINE FUCTION FOR SPHERES AND BARS PLOT
C
C            1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      FUNCTION TPMASB(Q,P)
      IMPLICIT REAL*8(A-H,O-Z)
      COMMON/TPERS1/X0,Y0,Z0,XN,YN,ZN,XW,YW,ZW,IUOD,IHL,IPR,IMOD
      COMMON/TPERS2/XFCTR,YFCTR,ZFCTR,XP0,CA,SA,ET,EL,SG,ZM,ZC
     &  ,XEYE,YEYE,ZEYE
      COMMON/TPERS7/XC(3,300),RR(300),IIP(300),XB(10,300), RB(300),
     &IB(2,300),NS,NB
      DIMENSION Q(3),P(3),X(3),X1(3),X2(3),DELT(3),EYE(3)
      EYE(1)=XEYE/XFCTR+X0
      EYE(2)=YEYE/YFCTR+Y0
      EYE(3)=ZEYE/ZFCTR+Z0
      IF(NS.EQ.0) GO TO 11
      DO 10 I=1,NS
      DO 3 J=1,3
    3 X(J)=XC(J,I)
      R=RR(I)
      DO 5 IJ=1,3
      IF(Q(IJ).LT.X(IJ)-R.AND.EYE(IJ).LT.X(IJ)-R) GO TO 10
      IF(Q(IJ).GT.X(IJ)+R.AND.EYE(IJ).GT.X(IJ)+R) GO TO 10
    5 CONTINUE
      R=R*0.999
      SL=TPSLEN(Q,P,X,R)
      IF(SL.LT.0.0) GO TO 100
   10 CONTINUE
   11 CONTINUE
      IF(NB.EQ.0) GO TO 21
      DO 20 I=1,NB
      IB1=IB(1,I)
      IB2=IB(2,I)
      DO 13 J=1,3
      X1(J)=XC(J,IB1)
   13 X2(J)=XC(J,IB2)
      DO 15 IJ=1,3
      XMIN=DMIN1(X1(IJ),X2(IJ))-RB(I)
      XMAX=DMAX1(X1(IJ),X2(IJ))+RB(I)
      IF(Q(IJ).LT.XMIN.AND.EYE(IJ).LT.XMIN) GO TO 20
      IF(Q(IJ).GT.XMAX.AND.EYE(IJ).GT.XMAX) GO TO 20
   15 CONTINUE
      R=RB(I)
      R=R*0.999
      DELT(1)=XB(1,I)
      DELT(2)=XB(2,I)
      DELT(3)=XB(3,I)
      BL=TPBLEN(Q,P,X1,X2,DELT,XB(4,I),R)
      IF(BL.LT.0.0) GO TO 100
   20 CONTINUE
   21 CONTINUE
      TPMASB=1.0
      RETURN
  100 TPMASB=-1.0
      RETURN
      END
C FUNCTION TPSLEN  2====*====3====*====4====*====5====*====6====*====7
C
C      HIDDEN LINE FUCTION FOR SPHERES 
C
C            1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      FUNCTION TPSLEN(Q,P,X,R)
      IMPLICIT REAL*8(A-H,O-Z)
      DIMENSION Q(3),P(3),X(3)
      DELT2=0.0
      DO 10 I=1,2
      DO 10 J=I+1,3
      DELT2=DELT2+((X(J)-Q(J))*P(I)-(X(I)-Q(I))*P(J))**2
   10 CONTINUE
      TPSLEN=SQRT(DELT2)-R
      IF(TPSLEN.LT.0.0) GO TO 1
      TPSLEN=1.0
      RETURN
    1 CONTINUE
      A=0.0
      DO 3 I=1,3
      A=A+(Q(I)-X(I))*(Q(I)-X(I))
    3 CONTINUE
      IF(A.LT.R*R) GO TO 99
      B=0.0
      DO 13 I=1,3
      B=B+(Q(I)-X(I))*P(I)
   13 CONTINUE
      IF(B.LT.0.0) GO TO 99
      TPSLEN=1.0
      RETURN
   99 TPSLEN=-1.0
      RETURN
      END
C FUNCTION TPBLEN  2====*====3====*====4====*====5====*====6====*====7
C
C      HIDDEN LINE FUCTION FOR BARS 
C
C            1989/12/09 BY A.YANASE
C
C---*----1----*----2----*----3----*----4----*----5----*----6----*----7
      FUNCTION TPBLEN(Q,P,X,Y,DELT,ANOR,R)
      IMPLICIT REAL*8(A-H,O-Z)
      DIMENSION Q(3),P(3),X(3),Y(3),DELT(3)
      Q1=Q(1)
      Q2=Q(2)
      Q3=Q(3)
      P1=P(1)
      P2=P(2)
      P3=P(3)
      X1=X(1)
      X2=X(2)
      X3=X(3)
      Y1=Y(1)
      Y2=Y(2)
      Y3=Y(3)
      D1=DELT(1)
      D2=DELT(2)
      D3=DELT(3)
      A1=D2*P3-P2*D3
      A2=D3*P1-P3*D1
      A3=D1*P2-P1*D2
      XQ1=X1-Q1
      XQ2=X2-Q2
      XQ3=X3-Q3
      A=ABS(XQ1*A1+XQ2*A2+XQ3*A3)
      B=SQRT(A1*A1+A2*A2+A3*A3)
      TP=A/B-R
      IF(TP.GE.0.0) GO TO 6
      AS=A1*(XQ3*P2-XQ2*P3)
     &  +A2*(XQ1*P3-XQ3*P1)
     &  +A3*(XQ2*P1-XQ1*P2)
      YQ1=Y1-Q1
      YQ2=Y2-Q2
      YQ3=Y3-Q3
      AE=A1*(YQ3*P2-YQ2*P3)
     &  +A2*(YQ1*P3-YQ3*P1)
     &  +A3*(YQ2*P1-YQ1*P2)
      IF(AS*AE.GE.0.0) GO TO 2
      BS=A1*(XQ2*D3-XQ3*D2)
     &  +A2*(XQ3*D1-XQ1*D3)
     &  +A3*(XQ1*D2-XQ2*D1)
      IF(BS.LT.0.0) GO TO 7
      TB=(XQ1*D2-XQ2*D1)**2
     &  +(XQ2*D3-XQ3*D2)**2
     &  +(XQ3*D1-XQ1*D3)**2
      TB=SQRT(TB/ANOR)-R
      IF(TB.LT.0.0) GO TO 7
      IF(TB.GE.0.0) GO TO 6
    2 PD=P1*D1+P2*D2+P3*D3
      IF(ABS(PD).LE.1.0E-5) GO TO 6
      IF(AE.GE.0.0) GO TO 1
      XQ1=YQ1
      XQ2=YQ2
      XQ3=YQ3
    1 XQD=D1*XQ1+D2*XQ2+D3*XQ3
      IF(XQD*PD.LT.1.0E-5) GO TO 6
      T=XQD/PD
      TL=SQRT((XQ1-P1*T)**2
     &       +(XQ2-P2*T)**2
     &       +(XQ3-P3*T)**2)
      IF(TL.GE.R) GO TO 6
    7 TPBLEN=-1.0
      RETURN
    6 TPBLEN=1.0
      RETURN
      END