5 * Revision 1.1.1.1 1996/04/01 15:02:50 mclareni
10 SUBROUTINE CONT(F,NUMBCS,CONTUR)
11 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
13 C TO PRODUCE A CONTOUR PLOT BY MEANS OF THE PRINTER C
15 C THIS DEPENDS ON WHETHER THE FUNCTION TO BE PLOTTED HAS REAL C
16 C ARGUMENTS OR INTEGER ARGUMENTS. C
17 C THE FUNCTION HAS REAL ARGUMENTS, SUPPOSE THE FUNCTION HAS C
20 C DIMENSION CONTUR(10) C
29 C CALL CONT(Z,NUMBCS,CONTUR) C
30 C IF YOU DO NOT KNOW WHAT SORT OF VALUES TO ASSIGN TO THE ARRAY C
31 C CONTUR, YOU CAN CALL THE SUBROUTINE FINDEM WHICH WILL HELP YOU. C
32 C CALL FINDEM(Z,NUMBCS,CONTUR) C
34 C F HAS INTEGER ARGUMENTS--- C
36 C DIMENSION CONTUR(10) C
46 C CALL CONT(FREARG,NUMBCS,CONTUR) C
47 C AGAIN, YOU MAY USE FINDEM TO ASSIGN VALUES TO THE ARRAY CONTUR. C
48 C CALL FINDEM(FREARG,NUMBCS,CONTUR) C
49 C NOTE THAT THE FIRST PARAMETER OF CONT AND FINDEM MUST HAVE C
51 C THE FUNCTION TO BE PLOTTED MUST HAVE THE NAME FINARG. C
53 C F - THE FUNCTION TO BE PLOTTED. F MUST BE A REAL FUNCTION C
54 C WITH TWO REAL PARAMETERS. IF THE FUNCTION YOU WANT TO C
55 C PLOT HAS INTEGER ARGUMENTS, THIS FUNCTION SHOULD BE C
56 C NAMED FINARG AND THE FIRST ACTUAL PARAMETER IN THE C
57 C CALL TO CONT SHOULD BE FREARG. C
58 C (FREARG IS A FUNCTION WHICH CALLS FINARG FOUR TIMES C
59 C AND PERFORMS A TWO-WAY LINEAR INTERPOLATION ON THESE C
61 C NUMBCS - THE NUMBER OF CONTOURS TO BE PLOTTED. NUMBS MUST BE C
62 C AT LEAST 1 AND AT MOST 10. C
63 C CONTUR - AN ARRAY CONTAINING THE FUNCTION VALUES ON THE VARIOUS C
64 C CONTOURS. THESE FUNCTION VALUES DO NOT HAVE TO BE C
65 C EQUIDISTANT AND NOT EVEN MONOTONOUS. C
66 C THE NUMBER 0 IS PRINTED WHERE F=CONTUR(1), C
67 C THE NUMBER 1 IS PRINTED WHERE F=CONTUR(2), C
70 C THE CHOSEN NAME FOR F MUST APPEAR IN AN EXTERNAL STATEMENT IN C
71 C THE PROGRAM CALLING CONT. C
72 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
74 DIMENSION CONTUR(10),SAVEC(10),SAVES(10)
76 COMMON /J509C1/XBL,YBL,XUR,YUR,NX(6),NY(6),LETT1,LETT2,LINE1,LINE2
78 INTEGER LETTRI,MINUS,STAR,BLANK,SYMBOL(10),LINEIM(132)
79 DATA LETTRI,MINUS,STAR,BLANK/1HI,1H-,1H*,1H /
80 #if !defined(CERNLIB_F90)
81 DATA SYMBOL(1),SYMBOL(2),SYMBOL(3),SYMBOL(4)/1H0,1H1,1H2,1H3/
82 DATA SYMBOL(5),SYMBOL(6),SYMBOL(7),SYMBOL(8)/1H4,1H5,1H6,1H7/
83 DATA SYMBOL(9),SYMBOL(10)/1H8,1H9/
84 DATA LSLASH,LDOT/1H/ , 1H. /
85 C=======================================================================
87 #if defined(CERNLIB_F90)
88 INTEGER, DIMENSION(10) :: SYMBOL = (/ transfer('0 ', 0), &
89 transfer('1 ', 0), transfer('2 ', 0), transfer('3 ', 0), &
90 transfer('4 ', 0), transfer('5 ', 0), transfer('6 ', 0), &
91 transfer('7 ', 0), transfer('8 ', 0), transfer('9 ', 0) /)
92 INTEGER :: LSLASH = transfer('/ ', 0), LDOT = transfer('. ',0)
93 !=======================================================================
95 IF (1.LE.NUMBCS.AND.NUMBCS.LE.10) GOTO 10
96 WRITE (6, 1010) NUMBCS
97 IF(1.LE.NUMBCS .AND. NUMBCS.LE.10)GO TO 10
102 C INITIALIZE COMMON BLOCK IF NOT ALREADY DONE
108 C SAVE CONTOUR VALUES AND ORDER THEM ASCENDING
109 CALL UCOPY(CONTUR,SAVEC,NUMBCS)
110 CALL UCOPY(SYMBOL,SAVES,NUMBCS)
111 CALL ORDRE2(CONTUR,SYMBOL,NUMBCS)
113 C THE ARRAY LINEIM IS A BUFFER FOR A LINE IMAGE. C
114 C PRINT LINE ALONG TOP OF FRAME
117 DO 30 LETT=LETT1,LETT2
118 30 LINEIM(LETT)=MINUS
120 WRITE(6,1060)YUR,(LINEIM(LETT),LETT=LETT0,LETT3)
121 MIDDLE=(LINE1+LINE2)/2
122 DLINE = LINE2-LINE1+1
123 DLETT = LETT2-LETT1+1
124 DXVAL = (XUR-XBL) / DLETT
125 DYVAL = (YUR-YBL) / DLINE
128 DO 40 LETT=LETT1,LETT3
129 FU(LETT) = F(XVAL,YVAL)
130 40 XVAL = XVAL + DXVAL
135 CCC LOOP OVER LINES STARTS HERE
137 DO 90 LINE=LINE1,LINE2
140 DO 50 LETT=LETT1,LETT3
142 50 FB(LETT) = F(XVAL,YVAL)
143 DO 70 LETT=LETT1,LETT2
148 C FUL IS THE FUNCTION VALUE AT THE POINT (LETT-1/2,LINE-1/2) C
149 C FUR IS THE FUNCTION VALUE AT THE POINT (LETT+1/2,LINE-1/2) C
150 C FBL IS THE FUNCTION VALUE AT THE POINT (LETT-1/2,LINE+1/2) C
151 C FBR IS THE FUNCTION VALUE AT THE POINT (LETT+1/2,LINE+1/2) C
153 C FIND OUT IF THERE IS A CONTOUR VALUE WHICH FALLS BETWEEN THE C
154 C BIGGEST AND THE SMALLEST OF THE FUNCTION VALUES AT THE FOUR C
155 C CORNERS OF THE PRESENT PRINT POSITION (LETT,LINE). C
156 C IF SO, PRINT THE CORRESPONDING SYMBOL. C
157 C IF NOT, PRINT A BLANK AT THE POINT (LETT,LINE). C
158 BIG =MAX(FUL,FUR,FBL,FBR)
159 SMALL=MIN(FUL,FUR,FBL,FBR)
162 IF (BIG .LT. CONTUR(NUMBC)) GO TO 70
163 IF (SMALL .GT. CONTUR(NUMBC)) GO TO 60
164 LINEIM(LETT) = SYMBOL(NUMBC)
165 IF (NUMBC .GT. MAXCON) MAXCON = NUMBC
166 IF (NUMBC .LT. MINCON) MINCON = NUMBC
169 IF (MOD(LINE,10) .EQ. LINE0) GO TO 73
170 C PRINT LINE (NORMAL LINE)
171 LINEIM(LETT0) = LETTRI
172 LINEIM(LETT3) = LETTRI
173 WRITE(6,1050) (LINEIM(LETT),LETT=LETT0,LETT3)
175 C PRINT LINE (EVEN TENTH LINE)
176 73 LINEIM(LETT0) = LDOT
178 WRITE(6,1040) YVAL,(LINEIM(LETT),LETT=LETT0,LETT3)
180 DO 80 LETT=LETT1,LETT3
183 C PRINT LINE ALONG BOTTOM OF FRAME
185 DO 100 LETT=LETT1,LETT2
186 100 LINEIM(LETT)=MINUS
188 WRITE(6,1060)YBL,(LINEIM(LETT),LETT=LETT0,LETT3)
189 C PRINT LABELS ON X-AXIS EVERY 10 COLIMNS
191 DO 119 LETT= 2, LETT2P
192 119 LINEIM(LETT) = BLANK
196 DO 129 ITEN= 1, ITENMX
197 XVALUS(ITEN) = XBL + X10COL*(ITEN-1)
198 LINEIM(LETT) = LSLASH
200 IF (XVALUS(ITEN) .GT. (XUR-5.*DXVAL)) GO TO 139
204 WRITE(6,1090) (LINEIM(LETT),LETT=2,LETT2P)
205 WRITE(6,1100) (XVALUS(II),II=1,ITEN)
206 C PRINT VARIABLE NAME FOR X-AXIS
207 WRITE(6,1110)NX,DXVAL
208 IF (MAXCON .LT. MINCON) GO TO 125
209 WRITE(6,1120) (SYMBOL(NN),CONTUR(NN),NN=MINCON,MAXCON)
214 C RESTORE INITIAL CONTOUR ORDERING
215 CALL UCOPY(SAVES,SYMBOL,NUMBCS)
216 CALL UCOPY(SAVEC,CONTUR,NUMBCS)
218 1010 FORMAT(' HOW MANY CONTOURS DID YOU WANT---',I10,'---(CONT)')
219 1030 FORMAT('1',120A1)
220 1040 FORMAT(1X,F8.3,1X,122A1)
221 1050 FORMAT(10X,122A1)
222 1060 FORMAT(1X,F8.3,'-',122A1)
223 1090 FORMAT(1X,131A1)
224 1100 FORMAT(4X,12(1X,F9.3))
225 1110 FORMAT(20X,6A1,20X,'ONE COLUMN =',E10.3,10X,
226 * 2('CONTOUR FCN VALUE '))
227 1120 FORMAT(80X,A1,F14.5,7X,A1,F14.5)
228 1130 FORMAT(80X,'NO CONTOURS FOUND'/)