aboutsummaryrefslogtreecommitdiff
path: root/orrs/src/plutil.f
blob: c365f8fd1f087d503cefca78e8fb5429afc1cb13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
      SUBROUTINE XYPLOT(N,X,Y,XOFF,XSF,YOFF,YSF,ILIN,SH,ISYM)
      DIMENSION X(N), Y(N)
C
      IF(ISYM.LE.0) CALL XYLINE(N,X,Y,XOFF,XSF,YOFF,YSF,ILIN)
      IF(ISYM.NE.0) CALL XYSYMB(N,X,Y,XOFF,XSF,YOFF,YSF,SH,IABS(ISYM))
C
      RETURN
      END


      SUBROUTINE PLSUBS(XC,YC,CHX,STRING,ANGLE,NC,PLFONT)
C----------------------------------------------------------------
C     Plots character string as a subscript with font routine PLFONT.
C
C      XC,YC  = user coordinates of character to be subscripted
C      CHX    = character width (user coordinates)
C      STRING = subscript character string to plot with NC characters
C      ANGLE  = angle of character (radians, positive is righthanded rotation)
C      NC     = number of subscript characters to plot
C               if NC<0 the length of the string is determined automatically 
C----------------------------------------------------------------
      CHARACTER*(*) STRING
      EXTERNAL PLFONT
      DATA  PI /3.1415926535897932384/
C
C---- subscript character reduction factor, and x,y-shift/chx
      DATA CHFAC, CHDX, CHDY / 0.7, 0.9, -0.4 /
C
      SINA = SIN(ANGLE*PI/180.0)
      COSA = COS(ANGLE*PI/180.0)
C
      X = XC + CHX*(CHDX*COSA - CHDY*SINA)
      Y = YC + CHX*(CHDX*SINA + CHDY*COSA)
      CALL PLFONT(X,Y,CHX*CHFAC,STRING,ANGLE,NC)
C
      RETURN
      END



      SUBROUTINE PLSUPS(XC,YC,CHX,STRING,ANGLE,NC,PLFONT)
C----------------------------------------------------------------
C     Plots character string as a superscript with font routine PLFONT.
C
C      XC,YC  = user coordinates of character to be superscripted
C      CHX    = character width (user coordinates)
C      STRING = superscript character string to plot with NC characters
C      ANGLE  = angle of character (radians, positive is righthanded rotation)
C      NC     = number of superscript characters to plot
C               if NC<0 the length of the string is determined automatically 
C----------------------------------------------------------------
      CHARACTER*(*) STRING
      EXTERNAL PLFONT
      DATA  PI /3.1415926535897932384/
C
C---- superscript character reduction factor, and x,y-shift/chx
      DATA CHFAC, CHDX, CHDY / 0.7, 0.95, 0.7 /
C
      SINA = SIN(ANGLE*PI/180.0)
      COSA = COS(ANGLE*PI/180.0)
C
      X = XC + CHX*(CHDX*COSA - CHDY*SINA)
      Y = YC + CHX*(CHDX*SINA + CHDY*COSA)
      CALL PLFONT(X,Y,CHX*CHFAC,STRING,ANGLE,NC)
C
      RETURN
      END



      SUBROUTINE SCALIT(N,Y,YOFF,YSF,ANN,NANN)
      DIMENSION Y(N)
C.............................................................
C
C     Determines scaling factor for the offset Y array so that
C     YSF*(Ymax-YOFF) will be O(1.0), but less than 1.0.
C
C     ANN = 1.0/YSF is therefore a "nice" plot axis max annotation.
C
C     Y(1:N)   array whose scaling factor is to be determined
C     YOFF     offset of Y array  (Y-YOFF is actually scaled)
C     YSF      Y scaling factor
C     ANN      recommended max Y annotation value  = 1.0/ANN
C     NANN     recommended number of Y annotations
C.............................................................
C
      AG2 = ALOG10(2.0)
      AG5 = ALOG10(5.0)
C
      YMAX = ABS(Y(1) - YOFF)
      DO 10 I=2, N
        YMAX = AMAX1( YMAX , ABS(Y(I)-YOFF) )
   10 CONTINUE
C
      IF(YMAX.EQ.0.0) THEN
       WRITE(*,*) 'SCALIT: Zero array passed in'
       YSF = 1.0E8
       RETURN
      ENDIF
C
      YLOG = ALOG10(YMAX) - 0.001
C
C---- find log of nearest power of 10 above YMAX
      YLOG1 = AINT(YLOG+100.0) - 99.0
 
C---- find log of nearest 2x(power of 10) above YMAX
      YLOG2 = YLOG1 + AG2
      IF(YLOG2-1.0.GT.YLOG) YLOG2 = YLOG2 - 1.0
C
C---- find log of nearest 5x(power of 10) above YMAX
      YLOG5 = YLOG1 + AG5
      IF(YLOG5-1.0.GT.YLOG) YLOG5 = YLOG5 - 1.0
C
C---- find log of smallest upper bound
      GMIN = MIN( YLOG1 , YLOG2 , YLOG5 )
C
      NANN = 5
      IF (GMIN.EQ.YLOG2) NANN = 4
C
C---- set scaling factor and max annotation
      YSF = 10.0**(-GMIN)
      ANN = 1.0/YSF
C
      RETURN
      END ! SCALIT
 


      SUBROUTINE ARROW(X,Y,DX,DY)
C........................................
C
C     Plots arrow from X,Y to X+DX,Y+DY
C........................................
C
C---- fraction of arrow covered by arrowhead, aspect ratio of arrowhead
      DATA FRH, ARH / 0.25, 0.24 /
C
C---- plot arrow
      CALL PLOT(X,Y,3)
      CALL PLOT(X+DX,Y+DY,2)
C
C---- plot arrowhead
      X1 = X + (1.0-FRH)*DX + 0.5*ARH*DY
      Y1 = Y + (1.0-FRH)*DY - 0.5*ARH*DX
      X2 = X + (1.0-FRH)*DX - 0.5*ARH*DY
      Y2 = Y + (1.0-FRH)*DY + 0.5*ARH*DX
      CALL PLOT(X1,Y1,2)
      CALL PLOT(X2,Y2,2)
      CALL PLOT(X+DX,Y+DY,2)
C
      RETURN
      END ! ARROW