/[MITgcm]/MITgcm/eesupp/src/print.F
ViewVC logotype

Contents of /MITgcm/eesupp/src/print.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (show annotations) (download)
Thu Apr 23 20:37:31 1998 UTC (26 years, 1 month ago) by cnh
Branch: MAIN
Changes since 1.1: +2 -2 lines
Changed $Id to $Header

1 C $Header: print.F,v 1.1.1.1 1998/04/22 19:15:30 cnh Exp $
2
3 #include "CPP_EEOPTIONS.h"
4
5 C-- File printf.F: Routines for performing formatted textual I/O
6 C-- in the MITgcm UV implementation environment.
7 C-- Contents
8 C-- o print_error Does IO with **ERROR** highlighted header
9 C-- o print_mapr8 Formats ABCD... contour map of a Real*8 field
10 C-- Uses print_message for writing
11 C-- o print_message Does IO with unhighlighted header
12
13 CStartOfInterface
14 SUBROUTINE PRINT_ERROR( message , myThid )
15 C /============================================================\
16 C | SUBROUTINE PRINT_ERROR |
17 C | o Write out error message using "standard" format. |
18 C | Notes |
19 C | ===== |
20 C | o Some system's I/O is not "thread-safe". For this reason |
21 C | without the FMTFTN_IO_THREAD_SAFE directive set a |
22 C | critical region is defined around the write here. In some|
23 C | cases BEGIN_CRIT() is approximated by only doing writes |
24 C | for thread number 1 - writes for other threads are |
25 C | ignored! |
26 C | o In a non-parallel form these routines can still be used. |
27 C | to produce pretty printed output! |
28 C \============================================================/
29 C == Global data ==
30 #include "SIZE.h"
31 #include "EEPARAMS.h"
32 #include "EESUPPORT.h"
33 C == Routine arguments ==
34 CHARACTER*(*) message
35 INTEGER myThid
36 CEndOfInterface
37 INTEGER IFNBLNK
38 EXTERNAL IFNBLNK
39 INTEGER ILNBLNK
40 EXTERNAL ILNBLNK
41 C == Local variables ==
42 INTEGER iStart
43 INTEGER iEnd
44 CHARACTER*9 idString
45 C-- Find beginning and end of message
46 iStart = IFNBLNK( message )
47 iEnd = ILNBLNK( message )
48 C-- Test to see if in multi-process ( or multi-threaded ) mode.
49 C If so include process or thread identifier.
50 IF ( numberOfProcs .EQ. 0 .AND. nThreads .EQ. 1 ) THEN
51 C-- Write single process format
52 IF ( message .EQ. ' ' ) THEN
53 WRITE(errorMessageUnit,'(A,1X,A)') ERROR_HEADER, ' '
54 ELSE
55 WRITE(errorMessageUnit,'(A,1X,A)') ERROR_HEADER, message(iStart:iEnd)
56 ENDIF
57 ELSEIF ( pidIO .EQ. myProcId ) THEN
58 C-- Write multi-process format
59 #ifndef FMTFTN_IO_THREAD_SAFE
60 _BEGIN_CRIT(myThid)
61 #endif
62 WRITE(idString,'(I4.4,A,I4.4)') myProcId,'.',myThid
63 #ifndef FMTFTN_IO_THREAD_SAFE
64 _END_CRIT(myThid)
65 #endif
66 IF ( message .EQ. ' ' ) THEN
67 C PRINT_ERROR can be called by several threads simulataneously.
68 C The write statement may need to be marked as a critical section.
69 #ifndef FMTFTN_IO_THREAD_SAFE
70 _BEGIN_CRIT(myThid)
71 #endif
72 WRITE(errorMessageUnit,'(A,A,1X,A,A,A,A,A)')
73 & '(',PROCESS_HEADER,idString,')',ERROR_HEADER,' ',
74 & ' '
75 #ifndef FMTFTN_IO_THREAD_SAFE
76 _END_CRIT(myThid)
77 #endif
78 ELSE
79 #ifndef FMTFTN_IO_THREAD_SAFE
80 _BEGIN_CRIT(myThid)
81 #endif
82 WRITE(errorMessageUnit,'(A,A,1X,A,A,A,A,A)')
83 & '(',PROCESS_HEADER,idString,')',ERROR_HEADER,' ',
84 & message(iStart:iEnd)
85 #ifndef FMTFTN_IO_THREAD_SAFE
86 _END_CRIT(myThid)
87 #endif
88 ENDIF
89 ENDIF
90 C
91 RETURN
92 END
93
94 CStartOfInterface
95 SUBROUTINE PRINT_MAPR4 ( fld, fldTitle, plotMode,
96 I iLo, iHi, jLo, jHi, kLo, kHi, nBx, nBy,
97 I iMin, iMax, iStr,
98 I jMin, jMax, jStr,
99 I kMin, kMax, kStr,
100 I bxMin, bxMax, bxStr,
101 I byMin, byMax, byStr )
102 C /==========================================================\
103 C | SUBROUTINE PRINT_MAPR4 |
104 C | o Does textual mapping printing of a field. |
105 C |==========================================================|
106 C | This routine does the actual formatting of the data |
107 C | and printing to a file. It assumes an array using the |
108 C | MITgcm UV indexing scheme and base index variables. |
109 C | User code should call an interface routine like |
110 C | PLOT_FIELD_XYR4( ... ) rather than this code directly. |
111 C | Text plots can be oriented XY, YZ, XZ. An orientation |
112 C | is specficied through the "plotMode" argument. All the |
113 C | plots made by a single call to this routine will use the |
114 C | same contour interval. The plot range (iMin,...,byStr) |
115 C | can be three-dimensional. A separate plot is made for |
116 C | each point in the plot range normal to the orientation. |
117 C | e.g. if the orientation is XY (plotMode = PRINT_MAP_XY). |
118 C | kMin =1, kMax = 5 and kStr = 2 will produce three XY|
119 C | plots - one for K=1, one for K=3 and one for K=5. |
120 C | Each plot would have extents iMin:iMax step iStr |
121 C | and jMin:jMax step jStr. |
122 C \==========================================================/
123
124 C == Global variables ==
125 #include "SIZE.h"
126 #include "EEPARAMS.h"
127 #include "EESUPPORT.h"
128
129 C == Routine arguments ==
130 C fld - Real*4 array holding data to be plotted
131 C fldTitle - Name of field to be plotted
132 C plotMode - Text string indicating plot orientation
133 C ( see - EEPARAMS.h for valid values ).
134 C iLo, iHi, - Dimensions of array fld. fld is assumed to
135 C jLo, jHi be five-dimensional.
136 C kLo, kHi
137 C nBx, nBy
138 C iMin, iMax - Indexing for points to plot. Points from
139 C iStr iMin -> iMax in steps of iStr are plotted
140 C jMin. jMax and similarly for jMin, jMax, jStr and
141 C jStr kMin, kMax, kStr and bxMin, bxMax, bxStr
142 C kMin, kMax byMin, byMax, byStr.
143 C kStr
144 CHARACTER*(*) fldTitle
145 CHARACTER*(*) plotMode
146 INTEGER iLo, iHi
147 INTEGER jLo, jHi
148 INTEGER kLo, kHi
149 INTEGER nBx, nBy
150 Real*4 fld(iLo:iHi,jLo:jHi,kLo:kHi,nBx,nBy)
151 INTEGER iMin, iMax, iStr
152 INTEGER jMin, jMax, jStr
153 INTEGER kMin, kMax, kStr
154 INTEGER bxMin, bxMax, bxStr
155 INTEGER byMin, byMax, byStr
156 CEndOfInterface
157 C == Local variables ==
158 INTEGER IFNBLNK
159 EXTERNAL IFNBLNK
160 INTEGER ILNBLNK
161 EXTERNAL ILNBLNK
162
163 C == Local variables ==
164 C plotBuf - Buffer for building plot record
165 C chList - Character string used for plot
166 C fMin, fMax - Contour min, max and range
167 C fRange
168 C val - Value of element to be "plotted"
169 C small - Lowest range for which contours are plotted
170 C accXXX - Variables used in indexing accross page records.
171 C dwnXXX Variables used in indexing down the page.
172 C pltXXX Variables used in indexing multiple plots ( multiple
173 C plots use same contour range).
174 C Lab - Label
175 C Base - Base number for element indexing
176 C The process bottom, left coordinate in the
177 C global domain.
178 C Step - Block size
179 C Blo - Start block
180 C Bhi - End block
181 C Bstr - Block stride
182 C Min - Start index within block
183 C Max - End index within block
184 C Str - stride within block
185 INTEGER MAX_LEN_PLOTBUF
186 PARAMETER ( MAX_LEN_PLOTBUF = MAX_LEN_MBUF-4 )
187 CHARACTER*(MAX_LEN_PLOTBUF) plotBuf
188 CHARACTER*(MAX_LEN_MBUF) msgBuf
189 INTEGER lChList
190 PARAMETER ( lChList = 28 )
191 CHARACTER*(lChList) chList
192 REAL fMin
193 REAL fMax
194 REAL fRange
195 REAL val
196 REAL small
197 CHARACTER*2 accLab
198 CHARACTER*7 dwnLab
199 CHARACTER*3 pltLab
200 INTEGER accBase, dwnBase, pltBase
201 INTEGER accStep, dwnStep, pltStep
202 INTEGER accBlo, dwnBlo, pltBlo
203 INTEGER accBhi, dwnBhi, pltBhi
204 INTEGER accBstr, dwnBstr, pltBstr
205 INTEGER accMin, dwnMin, pltMin
206 INTEGER accMax, dwnMax, pltMax
207 INTEGER accStr, dwnStr, pltStr
208 INTEGER I, J, K, iStrngLo, iStrngHi, iBuf, iDx
209 INTEGER bi, bj, bk
210 LOGICAL validRange
211
212 chList = '-abcdefghijklmnopqrstuvwxyz+'
213 small = 1. _d -15
214 fMin = 1. _d 32
215 fMax = -1. _d 32
216 validRange = .FALSE.
217
218 C-- Calculate field range
219 DO bj=byMin, byMax, byStr
220 DO bi=bxMin, bxMax, bxStr
221 DO K=kMin, kMax, kStr
222 DO J=jMin, jMax, jStr
223 DO I=iMin, iMax, iStr
224 IF ( fld(I,J,K,bi,bj) .NE. 0. ) THEN
225 IF ( fld(I,J,K,bi,bj) .LT. fMin )
226 & fMin = fld(I,J,K,bi,bj)
227 IF ( fld(I,J,K,bi,bj) .GT. fMax )
228 & fMax = fld(I,J,K,bi,bj)
229 ENDIF
230 ENDDO
231 ENDDO
232 ENDDO
233 ENDDO
234 ENDDO
235 fRange = fMax-fMin
236 IF ( fRange .GT. small ) THEN
237 validRange = .TRUE.
238 ENDIF
239
240 C-- Write field title and statistics
241 msgBuf = '// ======================================================='
242 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
243 & SQUEEZE_RIGHT, 1)
244 iStrngLo = IFNBLNK(fldTitle)
245 iStrngHi = ILNBLNK(fldTitle)
246 IF ( iStrngLo .LE. iStrngHi ) THEN
247 WRITE(msgBuf,'(A)') fldTitle(iStrngLo:iStrngHi)
248 ELSE
249 msgBuf = '// UNKNOWN FIELD'
250 ENDIF
251 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
252 & SQUEEZE_RIGHT, 1)
253 WRITE(msgBuf,'(A,1PE30.15)')
254 & '// CMIN = ', fMin
255 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
256 & SQUEEZE_RIGHT, 1)
257 WRITE(msgBuf,'(A,1PE30.15)')
258 & '// CMAX = ', fMax
259 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
260 & SQUEEZE_RIGHT, 1)
261 WRITE(msgBuf,'(A,1PE30.15)')
262 & '// CINT = ', fRange/FLOAT(lChlist-1)
263 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
264 & SQUEEZE_RIGHT, 1)
265 WRITE(msgBuf,'(A,1024A1)')
266 & '// SYMBOLS (CMIN->CMAX): ',(chList(I:I),I=1,lChList)
267 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
268 & SQUEEZE_RIGHT, 1)
269 WRITE(msgBuf,'(A,1024A1)')
270 & '// 0.0: ','.'
271 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
272 & SQUEEZE_RIGHT, 1)
273 WRITE(msgBuf,'(A,3(A,I4),A)')
274 & '// RANGE I (Lo:Hi:Step):',
275 & '(',myXGlobalLo-1+(bxMin-1)*sNx+iMin,
276 & ':',myXGlobalLo-1+(bxMax-1)*sNx+iMax,
277 & ':',iStr,')'
278 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
279 & SQUEEZE_RIGHT, 1)
280 WRITE(msgBuf,'(A,3(A,I4),A)')
281 & '// RANGE J (Lo:Hi:Step):',
282 & '(',myYGlobalLo-1+(byMin-1)*sNy+jMin,
283 & ':',myYGlobalLo-1+(byMax-1)*sNy+jMax,
284 & ':',jStr,')'
285 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
286 & SQUEEZE_RIGHT, 1)
287 WRITE(msgBuf,'(A,3(A,I4),A)')
288 & '// RANGE K (Lo:Hi:Step):',
289 & '(',kMin,
290 & ':',kMax,
291 & ':',kStr,')'
292 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
293 & SQUEEZE_RIGHT, 1)
294 msgBuf = '// ======================================================='
295 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
296 & SQUEEZE_RIGHT, 1)
297
298 C-- Write field
299 C Figure out slice type and set plotting parameters appropriately
300 C acc = accross the page
301 C dwn = down the page
302 IF ( plotMode .EQ. PRINT_MAP_XY ) THEN
303 C X across, Y down slice
304 accLab = 'I='
305 accBase = myXGlobalLo
306 accStep = sNx
307 accBlo = bxMin
308 accBhi = bxMax
309 accBStr = bxStr
310 accMin = iMin
311 accMax = iMax
312 accStr = iStr
313 dwnLab = '|--J--|'
314 dwnBase = myYGlobalLo
315 dwnStep = sNy
316 dwnBlo = byMin
317 dwnBhi = byMax
318 dwnBStr = byStr
319 dwnMin = jMin
320 dwnMax = jMax
321 dwnStr = jStr
322 pltBlo = 1
323 pltBhi = 1
324 pltBstr = 1
325 pltMin = kMin
326 pltMax = kMax
327 pltStr = kStr
328 pltBase = 1
329 pltStep = 1
330 pltLab = 'K ='
331 ELSEIF ( plotMode .EQ. PRINT_MAP_YZ ) THEN
332 C Y across, Z down slice
333 accLab = 'J='
334 accBase = myYGlobalLo
335 accStep = sNy
336 accBlo = byMin
337 accBhi = byMax
338 accBStr = byStr
339 accMin = jMin
340 accMax = jMax
341 accStr = jStr
342 dwnLab = '|--K--|'
343 dwnBase = 1
344 dwnStep = 1
345 dwnBlo = 1
346 dwnBhi = 1
347 dwnBStr = 1
348 dwnMin = kMin
349 dwnMax = kMax
350 dwnStr = kStr
351 pltBlo = bxMin
352 pltBhi = bxMax
353 pltBstr = bxStr
354 pltMin = iMin
355 pltMax = iMax
356 pltStr = iStr
357 pltBase = myXGlobalLo
358 pltStep = sNx
359 pltLab = 'I ='
360 ELSEIF ( plotMode .EQ. PRINT_MAP_XZ ) THEN
361 C X across, Z down slice
362 accLab = 'I='
363 accBase = myXGlobalLo
364 accStep = sNx
365 accBlo = bxMin
366 accBhi = bxMax
367 accBStr = bxStr
368 accMin = iMin
369 accMax = iMax
370 accStr = iStr
371 dwnLab = '|--K--|'
372 dwnBase = 1
373 dwnStep = 1
374 dwnBlo = 1
375 dwnBhi = 1
376 dwnBStr = 1
377 dwnMin = kMin
378 dwnMax = kMax
379 dwnStr = kStr
380 pltBlo = byMin
381 pltBhi = byMax
382 pltBstr = byStr
383 pltMin = jMin
384 pltMax = jMax
385 pltStr = jStr
386 pltBase = myYGlobalLo
387 pltStep = sNy
388 pltLab = 'J ='
389 ENDIF
390 IF ( validRange ) THEN
391 C Header
392 C Data
393 DO bk=pltBlo, pltBhi, pltBstr
394 DO K=pltMin,pltMax,pltStr
395 WRITE(plotBuf,'(A,I,I,I,I)') pltLab,
396 & pltBase-1+(bk-1)*pltStep+K
397 CALL PRINT_MESSAGE(plotBuf, standardMessageUnit,
398 & SQUEEZE_RIGHT, 1)
399 plotBuf = ' '
400 iBuf = 6
401 DO bi=accBlo, accBhi, accBstr
402 DO I=accMin, accMax, accStr
403 iDx = accBase-1+(bi-1)*accStep+I
404 iBuf = iBuf + 1
405 IF ( 10*((iBuf-6)/10) .EQ. iBuf-6 ) THEN
406 IF ( iDx. LT. 10 ) THEN
407 WRITE(plotBuf(iBuf:),'(A,I1)') accLab,iDx
408 ELSEIF ( iDx. LT. 100 ) THEN
409 WRITE(plotBuf(iBuf:),'(A,I2)') accLab,iDx
410 ELSEIF ( iDx. LT. 1000 ) THEN
411 WRITE(plotBuf(iBuf:),'(A,I3)') accLab,iDx
412 ELSEIF ( iDx. LT. 10000 ) THEN
413 WRITE(plotBuf(iBuf:),'(A,I4)') accLab,iDx
414 ENDIF
415 ENDIF
416 ENDDO
417 ENDDO
418 WRITE(msgBuf,'(A,A)') '// ',plotBuf
419 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
420 & SQUEEZE_RIGHT, 1)
421 plotBuf = dwnLab
422 iBuf = 7
423 DO bi=accBlo, accBhi, accBstr
424 DO I=accMin, accMax, accStr
425 iDx = accBase-1+(bi-1)*accStep+I
426 iBuf = iBuf+1
427 IF ( 10*((iBuf-7)/10) .EQ. iBuf-7 ) THEN
428 WRITE(plotBuf(iBuf:),'(A)') '|'
429 ELSE
430 WRITE(plotBuf(iBuf:iBuf),'(I1)') MOD(iDx,10)
431 ENDIF
432 ENDDO
433 ENDDO
434 WRITE(msgBuf,'(A,A)') '// ',plotBuf
435 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
436 & SQUEEZE_RIGHT, 1)
437 DO bj=dwnBlo, dwnBhi, dwnBStr
438 DO J=dwnMin, dwnMax, dwnStr
439 WRITE(plotBuf,'(1X,I5,1X)')
440 & dwnBase-1+(bj-1)*dwnStep+J
441 iBuf = 7
442 DO bi=accBlo,accBhi,accBstr
443 DO I=accMin,accMax,accStr
444 iBuf = iBuf + 1
445 IF ( plotMode .EQ. PRINT_MAP_XY ) THEN
446 val = fld(I,J,K,bi,bj)
447 ELSEIF ( plotMode .EQ. PRINT_MAP_XZ ) THEN
448 val = fld(I,K,J,bi,bk)
449 ELSEIF ( plotMode .EQ. PRINT_MAP_YZ ) THEN
450 val = fld(K,I,J,bk,bi)
451 ENDIF
452 IDX = NINT(
453 & FLOAT( lChList-1 )*( val-fMin ) / (fRange)
454 & )+1
455 IF ( iBuf .LE. MAX_LEN_PLOTBUF )
456 & plotBuf(iBuf:iBuf) = chList(IDX:IDX)
457 IF ( val .EQ. 0. ) THEN
458 IF ( iBuf .LE. MAX_LEN_PLOTBUF )
459 & plotBuf(iBuf:iBuf) = '.'
460 ENDIF
461 ENDDO
462 ENDDO
463 WRITE(msgBuf,'(A,A)') '// ',plotBuf
464 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
465 & SQUEEZE_RIGHT, 1)
466 ENDDO
467 ENDDO
468 ENDDO
469 ENDDO
470 ENDIF
471 C-- Write delimiter
472 msgBuf = '// ======================================================='
473 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
474 & SQUEEZE_RIGHT, 1)
475 msgBuf = '// END OF FIELD ='
476 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
477 & SQUEEZE_RIGHT, 1)
478 msgBuf = '// ======================================================='
479 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
480 & SQUEEZE_RIGHT, 1)
481 msgBuf = ' '
482 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
483 & SQUEEZE_RIGHT, 1)
484
485 RETURN
486 END
487
488 CStartOfInterface
489 SUBROUTINE PRINT_MAPR8 ( fld, fldTitle, plotMode,
490 I iLo, iHi, jLo, jHi, kLo, kHi, nBx, nBy,
491 I iMin, iMax, iStr,
492 I jMin, jMax, jStr,
493 I kMin, kMax, kStr,
494 I bxMin, bxMax, bxStr,
495 I byMin, byMax, byStr )
496 C /==========================================================\
497 C | SUBROUTINE PRINT_MAPR8 |
498 C | o Does textual mapping printing of a field. |
499 C |==========================================================|
500 C | This routine does the actual formatting of the data |
501 C | and printing to a file. It assumes an array using the |
502 C | MITgcm UV indexing scheme and base index variables. |
503 C | User code should call an interface routine like |
504 C | PLOT_FIELD_XYR8( ... ) rather than this code directly. |
505 C | Text plots can be oriented XY, YZ, XZ. An orientation |
506 C | is specficied through the "plotMode" argument. All the |
507 C | plots made by a single call to this routine will use the |
508 C | same contour interval. The plot range (iMin,...,byStr) |
509 C | can be three-dimensional. A separate plot is made for |
510 C | each point in the plot range normal to the orientation. |
511 C | e.g. if the orientation is XY (plotMode = PRINT_MAP_XY). |
512 C | kMin =1, kMax = 5 and kStr = 2 will produce three XY|
513 C | plots - one for K=1, one for K=3 and one for K=5. |
514 C | Each plot would have extents iMin:iMax step iStr |
515 C | and jMin:jMax step jStr. |
516 C \==========================================================/
517
518 C == Global variables ==
519 #include "SIZE.h"
520 #include "EEPARAMS.h"
521 #include "EESUPPORT.h"
522
523 C == Routine arguments ==
524 C fld - Real*8 array holding data to be plotted
525 C fldTitle - Name of field to be plotted
526 C plotMode - Text string indicating plot orientation
527 C ( see - EEPARAMS.h for valid values ).
528 C iLo, iHi, - Dimensions of array fld. fld is assumed to
529 C jLo, jHi be five-dimensional.
530 C kLo, kHi
531 C nBx, nBy
532 C iMin, iMax - Indexing for points to plot. Points from
533 C iStr iMin -> iMax in steps of iStr are plotted
534 C jMin. jMax and similarly for jMin, jMax, jStr and
535 C jStr kMin, kMax, kStr and bxMin, bxMax, bxStr
536 C kMin, kMax byMin, byMax, byStr.
537 C kStr
538 CHARACTER*(*) fldTitle
539 CHARACTER*(*) plotMode
540 INTEGER iLo, iHi
541 INTEGER jLo, jHi
542 INTEGER kLo, kHi
543 INTEGER nBx, nBy
544 Real*8 fld(iLo:iHi,jLo:jHi,kLo:kHi,nBx,nBy)
545 INTEGER iMin, iMax, iStr
546 INTEGER jMin, jMax, jStr
547 INTEGER kMin, kMax, kStr
548 INTEGER bxMin, bxMax, bxStr
549 INTEGER byMin, byMax, byStr
550 CEndOfInterface
551 C == Local variables ==
552 INTEGER IFNBLNK
553 EXTERNAL IFNBLNK
554 INTEGER ILNBLNK
555 EXTERNAL ILNBLNK
556
557 C == Local variables ==
558 C plotBuf - Buffer for building plot record
559 C chList - Character string used for plot
560 C fMin, fMax - Contour min, max and range
561 C fRange
562 C val - Value of element to be "plotted"
563 C small - Lowest range for which contours are plotted
564 C accXXX - Variables used in indexing accross page records.
565 C dwnXXX Variables used in indexing down the page.
566 C pltXXX Variables used in indexing multiple plots ( multiple
567 C plots use same contour range).
568 C Lab - Label
569 C Base - Base number for element indexing
570 C The process bottom, left coordinate in the
571 C global domain.
572 C Step - Block size
573 C Blo - Start block
574 C Bhi - End block
575 C Bstr - Block stride
576 C Min - Start index within block
577 C Max - End index within block
578 C Str - stride within block
579 INTEGER MAX_LEN_PLOTBUF
580 PARAMETER ( MAX_LEN_PLOTBUF = MAX_LEN_MBUF-4 )
581 CHARACTER*(MAX_LEN_PLOTBUF) plotBuf
582 CHARACTER*(MAX_LEN_MBUF) msgBuf
583 INTEGER lChList
584 PARAMETER ( lChList = 28 )
585 CHARACTER*(lChList) chList
586 REAL fMin
587 REAL fMax
588 REAL fRange
589 REAL val
590 REAL small
591 CHARACTER*2 accLab
592 CHARACTER*7 dwnLab
593 CHARACTER*3 pltLab
594 INTEGER accBase, dwnBase, pltBase
595 INTEGER accStep, dwnStep, pltStep
596 INTEGER accBlo, dwnBlo, pltBlo
597 INTEGER accBhi, dwnBhi, pltBhi
598 INTEGER accBstr, dwnBstr, pltBstr
599 INTEGER accMin, dwnMin, pltMin
600 INTEGER accMax, dwnMax, pltMax
601 INTEGER accStr, dwnStr, pltStr
602 INTEGER I, J, K, iStrngLo, iStrngHi, iBuf, iDx
603 INTEGER bi, bj, bk
604 LOGICAL validRange
605
606 chList = '-abcdefghijklmnopqrstuvwxyz+'
607 small = 1. _d -15
608 fMin = 1. _d 32
609 fMax = -1. _d 32
610 validRange = .FALSE.
611
612 C-- Calculate field range
613 DO bj=byMin, byMax, byStr
614 DO bi=bxMin, bxMax, bxStr
615 DO K=kMin, kMax, kStr
616 DO J=jMin, jMax, jStr
617 DO I=iMin, iMax, iStr
618 C IF ( fld(I,J,K,bi,bj) .NE. 0. ) THEN
619 IF ( fld(I,J,K,bi,bj) .LT. fMin )
620 & fMin = fld(I,J,K,bi,bj)
621 IF ( fld(I,J,K,bi,bj) .GT. fMax )
622 & fMax = fld(I,J,K,bi,bj)
623 C ENDIF
624 ENDDO
625 ENDDO
626 ENDDO
627 ENDDO
628 ENDDO
629 fRange = fMax-fMin
630 IF ( fRange .GT. small ) THEN
631 validRange = .TRUE.
632 ENDIF
633
634 C-- Write field title and statistics
635 msgBuf = '// ======================================================='
636 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
637 & SQUEEZE_RIGHT, 1)
638 iStrngLo = IFNBLNK(fldTitle)
639 iStrngHi = ILNBLNK(fldTitle)
640 IF ( iStrngLo .LE. iStrngHi ) THEN
641 WRITE(msgBuf,'(A)') fldTitle(iStrngLo:iStrngHi)
642 ELSE
643 msgBuf = '// UNKNOWN FIELD'
644 ENDIF
645 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
646 & SQUEEZE_RIGHT, 1)
647 WRITE(msgBuf,'(A,1PE30.15)')
648 & '// CMIN = ', fMin
649 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
650 & SQUEEZE_RIGHT, 1)
651 WRITE(msgBuf,'(A,1PE30.15)')
652 & '// CMAX = ', fMax
653 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
654 & SQUEEZE_RIGHT, 1)
655 WRITE(msgBuf,'(A,1PE30.15)')
656 & '// CINT = ', fRange/FLOAT(lChlist-1)
657 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
658 & SQUEEZE_RIGHT, 1)
659 WRITE(msgBuf,'(A,1024A1)')
660 & '// SYMBOLS (CMIN->CMAX): ',(chList(I:I),I=1,lChList)
661 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
662 & SQUEEZE_RIGHT, 1)
663 WRITE(msgBuf,'(A,1024A1)')
664 & '// 0.0: ','.'
665 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
666 & SQUEEZE_RIGHT, 1)
667 WRITE(msgBuf,'(A,3(A,I4),A)')
668 & '// RANGE I (Lo:Hi:Step):',
669 & '(',myXGlobalLo-1+(bxMin-1)*sNx+iMin,
670 & ':',myXGlobalLo-1+(bxMax-1)*sNx+iMax,
671 & ':',iStr,')'
672 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
673 & SQUEEZE_RIGHT, 1)
674 WRITE(msgBuf,'(A,3(A,I4),A)')
675 & '// RANGE J (Lo:Hi:Step):',
676 & '(',myYGlobalLo-1+(byMin-1)*sNy+jMin,
677 & ':',myYGlobalLo-1+(byMax-1)*sNy+jMax,
678 & ':',jStr,')'
679 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
680 & SQUEEZE_RIGHT, 1)
681 WRITE(msgBuf,'(A,3(A,I4),A)')
682 & '// RANGE K (Lo:Hi:Step):',
683 & '(',kMin,
684 & ':',kMax,
685 & ':',kStr,')'
686 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
687 & SQUEEZE_RIGHT, 1)
688 msgBuf = '// ======================================================='
689 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
690 & SQUEEZE_RIGHT, 1)
691
692 C-- Write field
693 C Figure out slice type and set plotting parameters appropriately
694 C acc = accross the page
695 C dwn = down the page
696 IF ( plotMode .EQ. PRINT_MAP_XY ) THEN
697 C X across, Y down slice
698 accLab = 'I='
699 accBase = myXGlobalLo
700 accStep = sNx
701 accBlo = bxMin
702 accBhi = bxMax
703 accBStr = bxStr
704 accMin = iMin
705 accMax = iMax
706 accStr = iStr
707 dwnLab = '|--J--|'
708 dwnBase = myYGlobalLo
709 dwnStep = sNy
710 dwnBlo = byMin
711 dwnBhi = byMax
712 dwnBStr = byStr
713 dwnMin = jMin
714 dwnMax = jMax
715 dwnStr = jStr
716 pltBlo = 1
717 pltBhi = 1
718 pltBstr = 1
719 pltMin = kMin
720 pltMax = kMax
721 pltStr = kStr
722 pltBase = 1
723 pltStep = 1
724 pltLab = 'K ='
725 ELSEIF ( plotMode .EQ. PRINT_MAP_YZ ) THEN
726 C Y across, Z down slice
727 accLab = 'J='
728 accBase = myYGlobalLo
729 accStep = sNy
730 accBlo = byMin
731 accBhi = byMax
732 accBStr = byStr
733 accMin = jMin
734 accMax = jMax
735 accStr = jStr
736 dwnLab = '|--K--|'
737 dwnBase = 1
738 dwnStep = 1
739 dwnBlo = 1
740 dwnBhi = 1
741 dwnBStr = 1
742 dwnMin = kMin
743 dwnMax = kMax
744 dwnStr = kStr
745 pltBlo = bxMin
746 pltBhi = bxMax
747 pltBstr = bxStr
748 pltMin = iMin
749 pltMax = iMax
750 pltStr = iStr
751 pltBase = myXGlobalLo
752 pltStep = sNx
753 pltLab = 'I ='
754 ELSEIF ( plotMode .EQ. PRINT_MAP_XZ ) THEN
755 C X across, Z down slice
756 accLab = 'I='
757 accBase = myXGlobalLo
758 accStep = sNx
759 accBlo = bxMin
760 accBhi = bxMax
761 accBStr = bxStr
762 accMin = iMin
763 accMax = iMax
764 accStr = iStr
765 dwnLab = '|--K--|'
766 dwnBase = 1
767 dwnStep = 1
768 dwnBlo = 1
769 dwnBhi = 1
770 dwnBStr = 1
771 dwnMin = kMin
772 dwnMax = kMax
773 dwnStr = kStr
774 pltBlo = byMin
775 pltBhi = byMax
776 pltBstr = byStr
777 pltMin = jMin
778 pltMax = jMax
779 pltStr = jStr
780 pltBase = myYGlobalLo
781 pltStep = sNy
782 pltLab = 'J ='
783 ENDIF
784 IF ( validRange ) THEN
785 C Header
786 C Data
787 DO bk=pltBlo, pltBhi, pltBstr
788 DO K=pltMin,pltMax,pltStr
789 WRITE(plotBuf,'(A,I,I,I,I)') pltLab,
790 & pltBase-1+(bk-1)*pltStep+K
791 CALL PRINT_MESSAGE(plotBuf, standardMessageUnit,
792 & SQUEEZE_RIGHT, 1)
793 plotBuf = ' '
794 iBuf = 6
795 DO bi=accBlo, accBhi, accBstr
796 DO I=accMin, accMax, accStr
797 iDx = accBase-1+(bi-1)*accStep+I
798 iBuf = iBuf + 1
799 IF ( 10*((iBuf-6)/10) .EQ. iBuf-6 ) THEN
800 IF ( iDx. LT. 10 ) THEN
801 WRITE(plotBuf(iBuf:),'(A,I1)') accLab,iDx
802 ELSEIF ( iDx. LT. 100 ) THEN
803 WRITE(plotBuf(iBuf:),'(A,I2)') accLab,iDx
804 ELSEIF ( iDx. LT. 1000 ) THEN
805 WRITE(plotBuf(iBuf:),'(A,I3)') accLab,iDx
806 ELSEIF ( iDx. LT. 10000 ) THEN
807 WRITE(plotBuf(iBuf:),'(A,I4)') accLab,iDx
808 ENDIF
809 ENDIF
810 ENDDO
811 ENDDO
812 CALL PRINT_MESSAGE(plotBuf, standardMessageUnit,
813 & SQUEEZE_RIGHT, 1)
814 plotBuf = dwnLab
815 iBuf = 7
816 DO bi=accBlo, accBhi, accBstr
817 DO I=accMin, accMax, accStr
818 iDx = accBase-1+(bi-1)*accStep+I
819 iBuf = iBuf+1
820 IF ( 10*((iBuf-7)/10) .EQ. iBuf-7 ) THEN
821 WRITE(plotBuf(iBuf:),'(A)') '|'
822 ELSE
823 WRITE(plotBuf(iBuf:iBuf),'(I1)') MOD(iDx,10)
824 ENDIF
825 ENDDO
826 ENDDO
827 CALL PRINT_MESSAGE(plotBuf, standardMessageUnit,
828 & SQUEEZE_RIGHT, 1)
829 DO bj=dwnBlo, dwnBhi, dwnBStr
830 DO J=dwnMin, dwnMax, dwnStr
831 WRITE(plotBuf,'(1X,I5,1X)')
832 & dwnBase-1+(bj-1)*dwnStep+J
833 iBuf = 7
834 DO bi=accBlo,accBhi,accBstr
835 DO I=accMin,accMax,accStr
836 iBuf = iBuf + 1
837 IF ( plotMode .EQ. PRINT_MAP_XY ) THEN
838 val = fld(I,J,K,bi,bj)
839 ELSEIF ( plotMode .EQ. PRINT_MAP_XZ ) THEN
840 val = fld(I,K,J,bi,bk)
841 ELSEIF ( plotMode .EQ. PRINT_MAP_YZ ) THEN
842 val = fld(K,I,J,bk,bi)
843 ENDIF
844 IDX = NINT(
845 & FLOAT( lChList-1 )*( val-fMin ) / (fRange)
846 & )+1
847 IF ( iBuf .LE. MAX_LEN_PLOTBUF )
848 & plotBuf(iBuf:iBuf) = chList(IDX:IDX)
849 IF ( val .EQ. 0. ) THEN
850 IF ( iBuf .LE. MAX_LEN_PLOTBUF )
851 & plotBuf(iBuf:iBuf) = '.'
852 ENDIF
853 ENDDO
854 ENDDO
855 CALL PRINT_MESSAGE(plotBuf, standardMessageUnit,
856 & SQUEEZE_RIGHT, 1)
857 ENDDO
858 ENDDO
859 ENDDO
860 ENDDO
861 ENDIF
862 C-- Write delimiter
863 msgBuf = '// ======================================================='
864 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
865 & SQUEEZE_RIGHT, 1)
866 msgBuf = '// END OF FIELD ='
867 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
868 & SQUEEZE_RIGHT, 1)
869 msgBuf = '// ======================================================='
870 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
871 & SQUEEZE_RIGHT, 1)
872 msgBuf = ' '
873 CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
874 & SQUEEZE_RIGHT, 1)
875
876 RETURN
877 END
878
879 CStartOfInterface
880 SUBROUTINE PRINT_MESSAGE( message, unit, sq , myThid )
881 C /============================================================\
882 C | SUBROUTINE PRINT_MESSAGE |
883 C | o Write out informational message using "standard" format. |
884 C | Notes |
885 C | ===== |
886 C | o Some system's I/O is not "thread-safe". For this reason |
887 C | without the FMTFTN_IO_THREAD_SAFE directive set a |
888 C | critical region is defined around the write here. In some|
889 C | cases BEGIN_CRIT() is approximated by only doing writes |
890 C | for thread number 1 - writes for other threads are |
891 C | ignored! |
892 C | o In a non-parallel form these routines can still be used. |
893 C | to produce pretty printed output! |
894 C \============================================================/
895 C == Global data ==
896 #include "SIZE.h"
897 #include "EEPARAMS.h"
898 #include "EESUPPORT.h"
899 C == Routine arguments ==
900 C message - Message to write
901 C unit - Unit number to write to
902 C sq - Justification option
903 CHARACTER*(*) message
904 INTEGER unit
905 CHARACTER*(*) sq
906 INTEGER myThid
907 CEndOfInterface
908 INTEGER IFNBLNK
909 EXTERNAL IFNBLNK
910 INTEGER ILNBLNK
911 EXTERNAL ILNBLNK
912 C == Local variables ==
913 INTEGER iStart
914 INTEGER iEnd
915 CHARACTER*9 idString
916 C-- Find beginning and end of message
917 IF ( sq .EQ. SQUEEZE_BOTH .OR.
918 & sq .EQ. SQUEEZE_LEFT ) THEN
919 iStart = IFNBLNK( message )
920 ELSE
921 iStart = 1
922 ENDIF
923 IF ( sq .EQ. SQUEEZE_BOTH .OR.
924 & sq .EQ. SQUEEZE_RIGHT ) THEN
925 iEnd = ILNBLNK( message )
926 ELSE
927 iEnd = LEN(message)
928 ENDIF
929 C-- Test to see if in multi-process ( or multi-threaded ) mode.
930 C If so include process or thread identifier.
931 IF ( numberOfProcs .EQ. 0 .AND. nThreads .EQ. 1 ) THEN
932 C-- Write single process format
933 IF ( message .EQ. ' ' ) THEN
934 WRITE(unit,'(A)') ' '
935 ELSE
936 WRITE(unit,'(A)') message(iStart:iEnd)
937 ENDIF
938 ELSEIF ( pidIO .EQ. myProcId ) THEN
939 C-- Write multi-process format
940 #ifndef FMTFTN_IO_THREAD_SAFE
941 _BEGIN_CRIT(myThid)
942 #endif
943 WRITE(idString,'(I4.4,A,I4.4)') myProcId,'.',myThid
944 #ifndef FMTFTN_IO_THREAD_SAFE
945 _END_CRIT(myThid)
946 #endif
947 IF ( message .EQ. ' ' ) THEN
948 C PRINT can be called by several threads simultaneously.
949 C The write statement may need to ne marked as a critical section.
950 #ifndef FMTFTN_IO_THREAD_SAFE
951 _BEGIN_CRIT(myThid)
952 #endif
953 WRITE(unit,'(A,A,A,A,A,A)')
954 & '(',PROCESS_HEADER,' ',idString,')',' '
955 #ifndef FMTFTN_IO_THREAD_SAFE
956 _END_CRIT(myThid)
957 #endif
958 ELSE
959 #ifndef FMTFTN_IO_THREAD_SAFE
960 _BEGIN_CRIT(myThid)
961 #endif
962 WRITE(unit,'(A,A,A,A,A,A,A)')
963 & '(',PROCESS_HEADER,' ',idString(1:ILNBLNK(idString)),')',' ',
964 & message(iStart:iEnd)
965 #ifndef FMTFTN_IO_THREAD_SAFE
966 _END_CRIT(myThid)
967 #endif
968 ENDIF
969 ENDIF
970 C
971 RETURN
972 END
973
974 C $Id: print.F,v 1.1.1.1 1998/04/22 19:15:30 cnh Exp $

  ViewVC Help
Powered by ViewVC 1.1.22