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

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

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


Revision 1.3 - (hide annotations) (download)
Thu Apr 23 20:56:54 1998 UTC (26 years, 1 month ago) by cnh
Branch: MAIN
Changes since 1.2: +1 -3 lines
Further changes to convert from $Id to $Header

1 cnh 1.3 C $Header: /u/gcmpack/models/MITgcmUV/eesupp/src/print.F,v 1.2 1998/04/23 20:37:31 cnh Exp $
2 cnh 1.1
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

  ViewVC Help
Powered by ViewVC 1.1.22