NCEPLIBS-w3emc 2.12.0
Loading...
Searching...
No Matches
w3fp05.f
Go to the documentation of this file.
1C> @file
2C> @brief Printer contour subroutine.
3C> @author Ralph Jones @date 1989-10-13
4
5C> Prints a two-dimensional grid of any shape, with
6C> contouring, if desired. grid values are scaled according to
7C> to constants specified by the programer, rounded, and printed
8C> as 4,3, or 2 digit integers with sign, the sign marking the
9C> grid position of the printed number. if contouring is requested,
10C> bessel's interpolation formula is used to optain the contour lines.
11C> contours are indicated by alphabetic characters ranging from a to
12C> h or numeric characters from 0 to 9. contour origin and interval
13C> are specified by the programmer in terms of printed values.
14C>
15C> Program history log:
16C> - Ralph Jones 1989-10-13
17C> - Ralph Jones 1992-05-02 Add save
18C>
19C> @param[in] RDATA Real array of grid data to be printed.
20C> @param[in] KTBL Integer array with shape of array.
21C> @param[in] CNST Real array of four elements, used in
22C> scaling for printing and contouring.
23C> @param[in] TITLE Is a array of 132 characters or less of
24C> hollerith data, 1st char. must be blank.
25C> printed at bottom of the map.
26C> @param[in] KRECT 1 if grid is rectangular, 0 otherwise.
27C> @param[in] KCONTR 1 for contouring , 0 otherwise.
28C> @param[in] LINEV 0 is for 6 lines per vertical inch,
29C> non-zero 8 lines per vertical inch.
30C> @param[in] IWIDTH Number of characters in print line,
31C> 132 is standard printer.
32C>
33C> @note Normal subroutine return, unless number of rows is greater than 200,
34C> prints error message and exits.
35C>
36C> @author Ralph Jones @date 1989-10-13
37 SUBROUTINE w3fp05(RDATA,KTBL,CNST,TITLE,KRECT,KCONTR,LINEV,IWIDTH)
38C
39 REAL CNST(4)
40 REAL RDATA(1)
41 REAL RWA(28)
42 REAL RWB(28)
43 REAL RWC(28)
44 REAL RWD(28)
45 REAL VDJA(29)
46 REAL VDJB(28)
47 REAL VDJC(28)
48C
49 INTEGER KALFA(16)
50 INTEGER KALPH(20)
51 INTEGER KHTBL(10)
52 INTEGER KLINE(126)
53 INTEGER KLINES(132)
54 INTEGER KNUMB(20)
55 INTEGER KRLOC(200)
56 INTEGER KTBL(407)
57 INTEGER OUTPUT
58 INTEGER PAGNL
59 INTEGER PAGNR
60 INTEGER PAGN3
61 INTEGER PCCNT
62 INTEGER PCFST
63 INTEGER PGCNT
64 INTEGER PGCNTA
65 INTEGER PGFST
66 INTEGER PGFSTA
67 INTEGER PGMAX
68C
69 LOGICAL DONE
70 LOGICAL LCNTR
71 LOGICAL RECT
72C
73 CHARACTER*1 TITLE(*)
74C
75 equivalence(crmx,vdja(29))
76 equivalence(kline(1),klines(8))
77 equivalence(vdjc(1),rwa(1))
78C
79C ... THE VAULUE CRMX IS MACHINE DEPENDENT, IT SHOULD BE
80C ... SET TO A VALUE A LITTLE LESS THAN THE LARGEST POSITIVE
81C ... FLOATING POINT NUMBER FOR THE COMPUTER.
82C
83 SAVE
84C
85 DATA crmx /10.e70/
86 DATA kalfa/
87 a 1ha,1h ,1hb,1h ,1hc,1h ,1hd,1h ,1he,1h ,1hf,
88 b 1h ,1hg,1h ,1hh,1h /
89 DATA khastr/1h*/
90 DATA khblnk/1h /
91 DATA khdolr/1h$/
92 DATA khmns /1h-/
93 DATA khplus/1h+/
94 DATA khrstr/1h1/
95 DATA khtbl /1h0,1h1,1h2,1h3,1h4,1h5,1h6,1h7,1h8,1h9/
96C
97C ... LIMNRW IS LIMIT ON NUMBER OF ROWS ALLOWED
98C ... AND IS DIMENSION OF KRLOC ...
99C
100 DATA limnrw/200/
101 DATA knumb /1h0,1h ,1h1,1h ,1h2,1h ,1h3,1h ,1h4,1h ,
102 1 1h5,1h ,1h6,1h ,1h7,1h ,1h8,1h ,1h9,1h /
103 DATA output/6/
104 DATA r5 /.2/
105 DATA r50 /.02/
106C
107 8000 FORMAT (1h0,10x,44herror from w3fp05 ... number of rows in your,
108 1 9h array = ,i4,24h which exceeds limit of ,i4)
109 8100 FORMAT (1ht)
110 8200 FORMAT (1hs)
111 8300 FORMAT (1h /1h /1h )
112 8400 FORMAT (1h /1h )
113 8500 FORMAT (132a1)
114 8600 FORMAT (132a1)
115C
116C COMPUTE VALUES FOR PRINTER WIDTH
117C
118 IF (iwidth.GE.132.OR.iwidth.LE.0) pgmax = 25
119 IF (iwidth.GE.1.AND.iwidth.LE.22) pgmax = 3
120 IF (iwidth.GT.22.AND.iwidth.LT.132) pgmax = (iwidth-7)/5
121 pagn3 = pgmax + 3
122 lw = pgmax * 5 + 7
123 vdja(pagn3 + 1) = crmx
124 mxpg = pgmax * 5 + 7
125C
126 IF (linev .EQ. 0) GO TO 100
127C ...OTHERWISE LINEV IS NON-ZERO, SO 8 LINES/INCH IS DESIRED...
128 linate = 1
129 r4 = 0.250
130 r32 = 0.03125
131 con2 = 10.0
132 nbtwn = 3
133 GO TO 200
134C
135 100 CONTINUE
136 linate = 2
137 r4 = 0.33333333
138 r32 = 1.0/18.0
139 con2 = 6.0
140 nbtwn = 2
141C
142 200 CONTINUE
143 pgcnta = 0
144 pgfsta = 0
145 rect = .false.
146 done = .false.
147 kz = 0
148 kza = 1000
149 a = cnst(1)
150 kca = 2*(1-krect)
151C TO SET NO. OF DIGITS TO BE PRINTED
152C WHICH IS A FUNCTION OF THE TENS POSITION IN KCONTR
153 nodig = iabs(kcontr/10)
154 nodig = 3 - nodig
155C WHERE C(NODIG) + 1 IS NO. OF DIGITS TO BE PRINTED
156 IF (nodig.LT.1 .OR. nodig.GT.3) nodig = 3
157C ANY OUT-OF-RANGE WILL GET 4 DIGITS
158 lcntr = .false.
159 nconq = iabs(mod(kcontr,10))
160 IF (nconq .EQ. 0) GO TO 400
161 IF (nconq .LE. 2) GO TO 300
162C OTHERWISE RESET NCONQ
163 nconq = 0
164 GO TO 400
165 300 CONTINUE
166 lcntr = .true.
167C WITH NCONQ=1 FOR LETTERS,AND =2 FOR NUMBERS IN CONTOUR BANDS
168 400 CONTINUE
169 IF (nconq .EQ. 2) GO TO 600
170C OTHERWISE SET AS LETTERS
171C
172 kcow = 16
173 DO 500 j = 1,kcow
174 kalph(j) = kalfa(j)
175 500 CONTINUE
176 GO TO 800
177C
178 600 CONTINUE
179 kcow = 20
180 DO 700 j = 1,kcow
181 kalph(j) = knumb(j)
182 700 CONTINUE
183C
184800 CONTINUE
185 radj = 4 * kcow
186 kd=1
187C *** SET UP TABLE OF INDICES CORRESPONDING TO FIRST ITEM IN EACH ROW
188C *** THIS IS KRLOC
189C *** PICK OUT SIZE AND ROW NUMBER OF LARGEST ROW (KCMX AND KCLMX)
190C *** KZA LEFT-JUSTIFIES MAP IF ALL ROWS HAVE COMMON MINIMAL OFFSET
191 IF (ktbl(1 ).EQ.(-1)) GO TO 1100
192C *** ONE-DIMENSIONAL FORM
193 ktf=3
194 kza=0
195 imin = ktbl(2)
196 jmax = ktbl(3)+ktbl(1)-1
197 nrws = ktbl(1)
198 IF (nrws .GT. limnrw) GO TO 1200
199 kc = kca * (nrws-1) + 1
200C
201 DO 1000 j = 1,nrws
202 k = nrws-j+1
203 krloc(k) = kd
204 IF (ktbl(kc+4)+ktbl(kc+3).LE.kz ) GO TO 900
205 kclmx = k
206 imax = ktbl(kc+4)+ktbl(kc+3)
207 kz = imax
208 kcmx = krloc(k)+ktbl(kc+4)
209 900 CONTINUE
210 kd = kd+ktbl(kc+4)
211 kc = kc-kca
212 1000 CONTINUE
213 GO TO 1600
214C *** TWO-DIMENSIONAL FORM
215C *** THE TWO-DIMENSIONAL FORM IS COMPILER-DEPENDENT
216C *** IT DEPENDS ON THE TWO-DIMENSIONAL ARRAY BEING STORED COLUMN-WISE
217C *** THAT IS, WITH THE FIRST INDEX VARYING THE FASTEST
218 1100 CONTINUE
219 imin = ktbl(6)
220 jmin = ktbl(7)
221 nrws = ktbl(5)
222 IF (nrws .LE. limnrw) GO TO 1300
223C ... ELSE, NRWS EXCEEDS LIMIT ALLOWED ...
224 1200 CONTINUE
225 WRITE (output,8000) nrws,limnrw
226 GO TO 7400
227C
228 1300 CONTINUE
229 jmax = ktbl(7) +ktbl(5)-1
230 kc = 1
231 DO 1500 j = 1,nrws
232 krloc(j) = ktbl(2)*(ktbl(4)-j)+ktbl(kc+7)+1
233 IF (ktbl(kc+7)+ktbl(kc+8).LE.kz) GO TO 1400
234 imax = ktbl(kc+7)+ktbl(kc+8)
235 kz = imax
236 kcmx = krloc(j)+ktbl(kc+8)
237 kclmx = j
238 1400 CONTINUE
239 IF (ktbl(kc+7).LT.kza) kza = ktbl(kc+7)
240 kc = kc + kca
241 1500 CONTINUE
242 imax = imax-kza
243 ktf = 7
244 1600 CONTINUE
245 pagnl = 0
246 pagnr = pgmax
247 IF (.NOT.lcntr) GO TO 1700
248 adc = (cnst(1)-cnst(4))/cnst(3)+radj
249 bc = cnst(2)/cnst(3)
250C *** PRINT I-LABELS ACROSS TOP OF MAP
251 1700 CONTINUE
252C *** WHICH PREPARES CDC512 PRINTER FOR 8 LINES PER INCH
253 IF (linate.EQ.1) WRITE (output,8100)
254C ...WHICH PREPARES PRINTER FOR 6 LINES PER INCH
255 IF (linate.EQ.2) WRITE (output,8200)
256 klines(1) = khrstr
257 assign 1800 to kbr
258 GO TO 6900
259C
260 1800 CONTINUE
261 IF (.NOT.lcntr) GO TO 2000
262C *** INITIALIZE CONTOUR WORKING AREA
263 DO 1900 j=1,pagn3
264 rwc(j)=crmx
265 rwd(j)=crmx
266 1900 CONTINUE
267C *** SET UP CONTOUR DATA AND PAGE LIMITERS FOR FIRST TWO ROWS
268C
269 2000 CONTINUE
270 kra = 1
271 kc = ktf+1
272 assign 2100 to kbr
273 GO TO 5900
274C
275 2100 CONTINUE
276 kra = 2
277 kc = kc+kca
278 assign 2200 to kbr
279 GO TO 5900
280C
281 2200 CONTINUE
282 kr = 0
283C *** TEST IF THIS IS LAST PAGE
284 IF (imax.GT.pgmax-1) GO TO 2300
285 lmr = imax*5 + 2
286 done = .true.
287C *** DO LEFT J-LABELS
288 2300 CONTINUE
289 jcurr = jmax
290C
291 2400 CONTINUE
292 kr = kr + 1
293 kra = kr+2
294 kc = kc+kca
295 kta = mod(jcurr,10)
296 ktb = mod(jcurr,100)/10
297 ktc = mod(jcurr,1000)/100
298 IF (kr .EQ. 1 .OR. (.NOT. lcntr)) GO TO 2500
299 GO TO 2600
300 2500 CONTINUE
301 IF (linate.EQ.1) WRITE (output,8300)
302 IF (linate.EQ.2) WRITE (output,8400)
303 2600 CONTINUE
304 klines(2) = khplus
305 klines(1) = khblnk
306 IF (jcurr.LT.0) klines(2)=khmns
307 kta=iabs(kta)
308 ktb=iabs(ktb)
309 ktc = iabs(ktc)
310 IF (ktc .EQ. 0) GO TO 2700
311 klines(3) = khtbl(ktc+1)
312 klines(4) = khtbl(ktb+1)
313 klines(5) = khtbl(kta+1)
314 GO TO 2800
315C
316 2700 CONTINUE
317 klines(3) = khtbl(ktb+1)
318 klines(4) = khtbl(kta+1)
319 klines(5) = khblnk
320C
321 2800 CONTINUE
322 DO 2900 j = 6,mxpg
323 klines(j) = khblnk
324 2900 CONTINUE
325 IF (.NOT.done) GO TO 3000
326C *** DO RIGHT J-LABELS IF LAST PAGE OF MAP
327 kline(lmr) = klines(2)
328 kline(lmr+1) = klines(3)
329 kline(lmr+2) = klines(4)
330 kline(lmr+3) = klines(5)
331C *** FETCH AND CONVERT GRID VALUES TO A1 FORMAT FOR WHOLE LINE
332 3000 CONTINUE
333 krx = krloc(kr)
334 klx = 5*pgfst+1
335 IF (pgcnt.EQ.0) GO TO 4000
336 DO 3800 kk = 1,pgcnt
337 temp = rdata(krx)*cnst(2)+a
338 ktemp = abs(temp)+.5
339 kline(klx) = khplus
340 IF (temp.LT.0.0) kline(klx) = khmns
341 GO TO (3300,3200,3100),nodig
342 3100 CONTINUE
343 kta = mod(ktemp,10000)/1000
344C
345 3200 CONTINUE
346 ktb = mod(ktemp,1000)/100
347C
348 3300 CONTINUE
349 ktc = mod(ktemp,100)/10
350 ktd = mod(ktemp,10)
351 GO TO (3400,3500,3600),nodig
352 3400 CONTINUE
353 kline(klx+1) = khtbl(ktc+1)
354 kline(klx+2) = khtbl(ktd+1)
355 GO TO 3700
356 3500 CONTINUE
357 kline(klx+1) = khtbl(ktb+1)
358 kline(klx+2) = khtbl(ktc+1)
359 kline(klx+3) = khtbl(ktd+1)
360 GO TO 3700
361 3600 CONTINUE
362 kline(klx+1) = khtbl(kta+1)
363 kline(klx+2) = khtbl(ktb+1)
364 kline(klx+3) = khtbl(ktc+1)
365 kline(klx+4) = khtbl(ktd+1)
366 3700 CONTINUE
367 klx = klx + 5
368 krx = krx+1
369 3800 CONTINUE
370C *** FOLLOWING CHECKS FOR POLE POINT AND INSERTS PROPER CHARACTER.
371 IF (jcurr.NE.0) GO TO 4000
372 IF (imin.LT.(-25).OR.imin.GT.0) GO TO 4000
373 kx = -imin
374 IF (kx.LT.pgfst.AND.kx.GT.pgcnt+pgfst) GO TO 4000
375 kx = 5*kx
376 IF (kline(kx+1).EQ.khmns) GO TO 3900
377 kline(kx) = khdolr
378 GO TO 4000
379 3900 CONTINUE
380 kline(kx+1) = khastr
381C *** PRINT LINE OF MAP DATA
382 4000 CONTINUE
383 WRITE (output,8500) (klines(ii),ii=1,mxpg)
384 krloc(kr) = krx
385 jcurr = jcurr - 1
386C *** TEST BOTTOM OF MAP
387 IF (kr.EQ.nrws) GO TO 5700
388C *** SET UP CONTOUR DATA AND PAGE LIMITERS FOR NEXT ROW
389 assign 4100 to kbr
390 GO TO 5900
391C
392 4100 CONTINUE
393 IF (.NOT.lcntr) GO TO 2400
394C *** DO CONTOURING
395 DO 4200 jj=1,mxpg
396 klines(jj)=khblnk
397 4200 CONTINUE
398C *** VERTICAL INTERPOLATIONS
399 DO 4700 kk = 1,pagn3
400 IF (rwb(kk).LT.crmx.AND.rwc(kk).LT.crmx) GO TO 4300
401 vdjb(kk) = crmx
402 vdjc(kk) = crmx
403 GO TO 4600
404 4300 CONTINUE
405 IF (rwa(kk).LT.crmx.AND.rwd(kk).LT.crmx) GO TO 4400
406 vdjc(kk) = 0.
407 GO TO 4500
408 4400 CONTINUE
409 vdjc(kk) = r32*(rwa(kk)+rwd(kk)-rwb(kk)-rwc(kk))
410 4500 CONTINUE
411 vdjb(kk) = r4*(rwc(kk)-rwb(kk)-con2*vdjc(kk))
412 4600 CONTINUE
413 vdja(kk)=rwb(kk)
414 4700 CONTINUE
415C ...DO 2 OR 3 ROWS OF CONTOURING BETWEEN GRID ROWS...
416 DO 5600 ll = 1,nbtwn
417 DO 4800 kk = 1,pagn3
418 vdjb(kk) = vdjc(kk) + vdjb(kk)
419 vdja(kk) = vdjb(kk) + vdja(kk)
420 4800 CONTINUE
421C ...WHERE VDJA HAS THE INTERPOLATED VALUE FOR THIS INTER-ROW
422C *** HORIZONTAL INTERPOLATIONS
423 hdc = 0.0
424 IF (vdja(1).GE.crmx) GO TO 4900
425 hdc = r50*(vdja(4)+vdja(1)-vdja(2)-vdja(3))
426 4900 CONTINUE
427 kxb = 0
428 DO 5200 kk = 1,pgmax
429 IF (vdja(kk+1).GE.crmx) GO TO 5100
430 hda = vdja(kk+1)
431 IF (vdja(kk+2).GE.crmx) GO TO 5500
432 IF (vdja(kk+3).GE.crmx) hdc = 0.
433 hdb = r5*(vdja(kk+2)-vdja(kk+1)-15.*hdc)
434C *** COMPUTE AND STORE CONTOUR CHARACTERS, 5 PER POINT
435 khda=hda
436 kdb = iabs(mod(khda,kcow))
437 kline(kxb+1) = kalph(kdb+1)
438 DO 5000 jj=2,5
439 hdb = hdb+hdc
440 hda = hda+hdb
441 khda = hda
442 kdb = iabs(mod(khda,kcow))
443 kxa = kxb+jj
444 kline(kxa) = kalph(kdb+1)
445 5000 CONTINUE
446 hdc = r50*(vdja(kk+4)+vdja(kk+1)-vdja(kk+2)-vdja(kk+3))
447 IF (vdja(kk+4).GE.crmx) hdc = 0.
448 5100 CONTINUE
449 kxb = kxb+5
450 5200 CONTINUE
451 5300 CONTINUE
452 WRITE (output,8500) (klines(ii),ii=1,mxpg)
453 DO 5400 kk = 1,mxpg
454 klines(kk) = khblnk
455 5400 CONTINUE
456 GO TO 5600
457C
458 5500 CONTINUE
459 khda = hda
460 kdb = iabs(mod(khda,kcow))
461 kline(kxb+1) = kalph(kdb+1)
462 GO TO 5300
463 5600 CONTINUE
464 GO TO 2400
465C
466 5700 CONTINUE
467 IF (linate.EQ.1) WRITE (output,8300)
468 IF (linate.EQ.2) WRITE (output,8400)
469 klines(1) = khblnk
470C *** PRINT I-LABELS ACROSS BOTTOM OF PAGE
471 assign 5800 to kbr
472 GO TO 6900
473C
474 5800 CONTINUE
475 IF (linate.EQ.1) WRITE (output,8300)
476 IF (linate.EQ.2) WRITE (output,8400)
477C *** PRINT TITLE
478 WRITE (output,8600) (title(ii),ii=1,lw)
479C *** TEST END OF MAP
480 IF (krloc(kclmx).EQ.kcmx) RETURN
481C *** ADJUST PAGE LINE BOUNDARIES
482C
483 IF (imax.GT.pgmax)imax = imax-pgmax
484 imin = ka
485 pagnl = pagnl + pgmax
486 pagnr = pagnr + pgmax
487 GO TO 1700
488C *** ROUTINE TO PRE-STORE ROWS FOR CONTOURING AND COMPUTE LINE LIMITERS
489C
490 5900 CONTINUE
491 pgfst = pgfsta
492 pgcnt = pgcnta
493 IF (kra.GT.nrws) GO TO 6800
494 krfst = ktbl(kc)-kza
495 krcnt = ktbl(kc+1)
496 kfx = krloc(kra)
497 IF (rect) GO TO 6100
498 IF (krfst-pagnl.LE.(-1)) GO TO 6400
499 pcfst = krfst-pagnl+1
500 IF (pcfst.GE.pagn3) GO TO 6700
501 pgfsta = pcfst-1
502 pccnt = min(pagnr-krfst+2,krcnt)
503 IF (pgfsta.EQ.0) GO TO 6600
504 pgcnta = min(pagnr-krfst,krcnt)
505 IF (pgcnta.GT.0) GO TO 6000
506 pgcnta = 0
507 GO TO 6100
508 6000 CONTINUE
509 rect = krect.EQ.1.AND.pgcnta.LE.krcnt
510 6100 CONTINUE
511 IF (.NOT.lcntr) GO TO kbr,(1800,2100,2200,4100,5800)
512 DO 6200 kk = 1,pagn3
513 rwa(kk) = rwb(kk)
514 rwb(kk) = rwc(kk)
515 rwc(kk) = rwd(kk)
516 rwd(kk) = crmx
517 6200 CONTINUE
518C
519 IF (pccnt.EQ.0) GO TO kbr,(1800,2100,2200,4100,5800)
520 kpc = pcfst+1
521 kpd = pccnt
522 DO 6300 kk = 1,pccnt
523 rwd(kpc) = rdata(kfx)*bc+adc
524 kfx = kfx+1
525 kpc = kpc + 1
526 6300 CONTINUE
527 GO TO kbr,(1800,2100,2200,4100,5800)
528C
529 6400 CONTINUE
530 pcfst = 0
531 pgfsta = 0
532 kfx = kfx-1
533 pccnt = krfst+krcnt-pagnl+1
534 IF (pccnt.LT.pagn3) GO TO 6500
535 pccnt = pagn3
536 pgcnta = pgmax
537 GO TO 6100
538 6500 CONTINUE
539 IF (pccnt.GT.0) GO TO 6600
540 pgcnta = 0
541 pccnt = 0
542 GO TO 6100
543C
544 6600 CONTINUE
545 pgcnta = min(pgmax,krcnt+krfst-pagnl)
546 GO TO 6100
547C
548 6700 CONTINUE
549 pgcnta = 0
550 6800 CONTINUE
551 pccnt = 0
552 GO TO 6100
553C
554C *** ROUTINE TO PRINT I-LABELS
555C
556 6900 CONTINUE
557 DO 7000 kk = 2,mxpg
558 klines(kk) = khblnk
559 7000 CONTINUE
560C
561C
562 kk = 1
563 ka = imin
564 lbl = min(imax,pgmax)
565C
566 DO 7300 jj = 1,lbl
567 kline(kk) = khplus
568 IF (ka.LT.0) kline(kk) = khmns
569 kta = iabs(mod(ka,100))/10
570 ktb = iabs(mod(ka,10))
571 ktc = iabs(mod(ka,1000))/100
572 IF (ktc .EQ. 0) GO TO 7100
573 kline(kk+1) = khtbl(ktc+1)
574 kline(kk+2) = khtbl(kta+1)
575 kline(kk+3) = khtbl(ktb+1)
576 GO TO 7200
577C
578 7100 CONTINUE
579 kline(kk+1) = khtbl(kta+1)
580 kline(kk+2) = khtbl(ktb+1)
581C
582 7200 CONTINUE
583 kk = kk + 5
584 ka = ka+1
585 7300 CONTINUE
586C
587 WRITE (output,8500) (klines(ii),ii=1,mxpg)
588C
589 GO TO kbr,(1800,2100,2200,4100,5800)
590C
591 7400 RETURN
592C
593 END
subroutine w3fp05(rdata, ktbl, cnst, title, krect, kcontr, linev, iwidth)
Prints a two-dimensional grid of any shape, with contouring, if desired.
Definition w3fp05.f:38