/[MITgcm]/MITgcm_contrib/cg2d_bench/print.F
ViewVC logotype

Annotation of /MITgcm_contrib/cg2d_bench/print.F

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


Revision 1.1 - (hide annotations) (download)
Fri May 12 21:58:06 2006 UTC (19 years, 2 months ago) by ce107
Branch: MAIN
Initial version of CG2D benchmark code (serial and parallel) by Chris Hill

1 ce107 1.1 C-- File printf.F: Routines for performing formatted textual I/O
2     C-- in the MITgcm UV implementation environment.
3     C-- Contents
4     C-- o print_mapr8 Formats ABCD... contour map of a Real*8 field
5     C-- Uses print_message for writing
6    
7    
8     CStartOfInterface
9     SUBROUTINE PRINT_MAPR8 ( fld, fldTitle,
10     I iLo, iHi, jLo, jHi, kLo, kHi, nBx, nBy,
11     I iMin, iMax, iStr,
12     I jMin, jMax, jStr,
13     I kMin, kMax, kStr,
14     I bxMin, bxMax, bxStr,
15     I byMin, byMax, byStr )
16     C /==========================================================\
17     C | SUBROUTINE PRINT_MAPR8 |
18     C | o Does textual mapping printing of a field. |
19     C |==========================================================|
20     C | This routine does the actual formatting of the data. |
21     C | User code should call an interface routine like |
22     C | PRINT_MAP_XYR8 |
23     C \==========================================================/
24     IMPLICIT NONE
25    
26     C == Global variables ==
27     #include "SIZE.h"
28     #include "EEPARAMS.h"
29    
30     C == Routine arguments ==
31     CHARACTER*(*) fldTitle
32     INTEGER iLo, iHi
33     INTEGER jLo, jHi
34     INTEGER kLo, kHi
35     INTEGER nBx, nBy
36     REAL fld(iLo:iHi,jLo:jHi,kLo:kHi,nBx,nBy)
37     INTEGER iMin, iMax, iStr
38     INTEGER jMin, jMax, jStr
39     INTEGER kMin, kMax, kStr
40     INTEGER bxMin, bxMax, bxStr
41     INTEGER byMin, byMax, byStr
42     CEndOfInterface
43     C == Local variables ==
44     INTEGER IFNBLNK
45     EXTERNAL IFNBLNK
46     INTEGER ILNBLNK
47     EXTERNAL ILNBLNK
48    
49     C == Local variables ==
50     INTEGER MAX_LEN_PLOTBUF
51     PARAMETER ( MAX_LEN_PLOTBUF = 8192 )
52     CHARACTER*(MAX_LEN_PLOTBUF) plotBuf
53     CHARACTER*(MAX_LEN_MBUF) msgBuf
54     INTEGER lChList
55     PARAMETER ( lChList = 28 )
56     CHARACTER*(lChList) chList
57     REAL fMin
58     REAL fMax
59     REAL fRange
60     REAL small
61     INTEGER I, J, K, bi, bj, iStrngLo, iStrngHi, iBuf, iDx
62     LOGICAL validRange
63    
64     chList = '-abcdefghijklmnopqrstuvwxyz+'
65     small = 1. _d -15
66     fMin = 1. _d 32
67     fMax = -1. _d 32
68     validRange = .FALSE.
69    
70     C-- Calculate field range
71     DO bj=byMin, byMax, byStr
72     DO bi=bxMin, bxMax, bxStr
73     DO K=kMin, kMax, kStr
74     DO J=jMin, jMax, jStr
75     DO I=iMin, iMax, iStr
76     IF ( fld(I,J,K,bi,bj) .LT. fMin )
77     & fMin = fld(I,J,K,bi,bj)
78     IF ( fld(I,J,K,bi,bj) .GT. fMax )
79     & fMax = fld(I,J,K,bi,bj)
80     ENDDO
81     ENDDO
82     ENDDO
83     ENDDO
84     ENDDO
85     fRange = fMax-fMin
86     IF ( fRange .GT. small ) THEN
87     validRange = .TRUE.
88     ENDIF
89    
90     C-- Write field title and statistics
91     msgBuf = '================================================'
92     CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
93     & SQUEEZE_RIGHT, 1)
94     iStrngLo = IFNBLNK(fldTitle)
95     iStrngHi = ILNBLNK(fldTitle)
96     IF ( iStrngLo .LE. iStrngHi ) THEN
97     WRITE(msgBuf,'(A)') fldTitle(iStrngLo:iStrngHi)
98     ELSE
99     msgBuf = 'UNKNOWN FIELD'
100     ENDIF
101     CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
102     & SQUEEZE_RIGHT, 1)
103     WRITE(msgBuf,'(4X,3(A,E12.5))')
104     & ' CMIN = ',fMin,
105     & ', CMAX = ',fMax,
106     & ', CINT = ',fRange/FLOAT(lChlist)
107     CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
108     & SQUEEZE_RIGHT, 1)
109     WRITE(msgBuf,'(4X,A,1024A1)')
110     & ' SYMBOLS (CMIN->CMAX): ',(chList(I:I),I=1,lChList)
111     CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
112     & SQUEEZE_RIGHT, 1)
113     WRITE(msgBuf,'(4X,A,1024A1)')
114     & ' 0.0: ','*'
115     CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
116     & SQUEEZE_RIGHT, 1)
117     WRITE(msgBuf,'(4X,A,3(A,I4),A)')
118     & ' RANGE I (Lo:Hi:Step):',
119     & '(',myXGlobalLo-1+(bxMin-1)*sNx+iMin,
120     & ':',myXGlobalLo-1+(bxMax-1)*sNx+iMax,
121     & ':',iStr,')'
122     CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
123     & SQUEEZE_RIGHT, 1)
124     WRITE(msgBuf,'(4X,A,3(A,I4),A)')
125     & ' RANGE J (Lo:Hi:Step):',
126     & '(',myYGlobalLo-1+(byMin-1)*sNy+jMin,
127     & ':',myYGlobalLo-1+(byMax-1)*sNy+jMax,
128     & ':',jStr,')'
129     CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
130     & SQUEEZE_RIGHT, 1)
131     WRITE(msgBuf,'(4X,A,3(A,I4),A)')
132     & ' RANGE K (Lo:Hi:Step):',
133     & '(',kMin,
134     & ':',kMax,
135     & ':',kStr,')'
136     CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
137     & SQUEEZE_RIGHT, 1)
138     msgBuf = '================================================'
139     CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
140     & SQUEEZE_RIGHT, 1)
141    
142     C-- Write field
143     IF ( validRange ) THEN
144     C Header
145     plotBuf = ' '
146     iBuf = 6
147     DO bi=bxMin, bxMax, bxStr
148     DO I=iMin, iMax, iStr
149     iDx = myXGlobalLo-1+(bi-1)*sNx+I
150     iBuf = iBuf + 1
151     IF ( 10*((iBuf-6)/10) .EQ. iBuf-6 ) THEN
152     IF ( iDx. LT. 10 ) THEN
153     WRITE(plotBuf(iBuf:),'(A,I1)') 'I=',iDx
154     ELSEIF ( iDx. LT. 100 ) THEN
155     WRITE(plotBuf(iBuf:),'(A,I2)') 'I=',iDx
156     ELSEIF ( iDx. LT. 1000 ) THEN
157     WRITE(plotBuf(iBuf:),'(A,I3)') 'I=',iDx
158     ELSEIF ( iDx. LT. 10000 ) THEN
159     WRITE(plotBuf(iBuf:),'(A,I4)') 'I=',iDx
160     ENDIF
161     ENDIF
162     ENDDO
163     ENDDO
164     CALL PRINT_MESSAGE(plotBuf, standardMessageUnit,
165     & SQUEEZE_RIGHT, 1)
166     plotBuf = '|--J--|'
167     iBuf = 7
168     DO bi=bxMin, bxMax, bxStr
169     DO I=iMin, iMax, iStr
170     iDx = myXGlobalLo-1+(bi-1)*sNx+I
171     iBuf = iBuf+1
172     IF ( 10*((iBuf-7)/10) .EQ. iBuf-7 ) THEN
173     WRITE(plotBuf(iBuf:),'(A)') '|'
174     ELSE
175     WRITE(plotBuf(iBuf:iBuf),'(I1)') MOD(iDx,10)
176     ENDIF
177     ENDDO
178     ENDDO
179     CALL PRINT_MESSAGE(plotBuf, standardMessageUnit,
180     & SQUEEZE_RIGHT, 1)
181     C Data
182     DO K=kMin, kMax, kStr
183     DO bj=byMin, byMax, byStr
184     DO J=jMin, jMax, jStr
185     WRITE(plotBuf,'(1X,I5,1X)')
186     & myYGlobalLo-1+(bj-1)*sNy+J
187     iBuf = 7
188     DO bi=bxMin, bxMax, bxStr
189     DO I=iMin, iMax, iStr
190     iBuf = iBuf + 1
191     IDX = NINT(
192     & FLOAT( lChList-1 )*( fld(I,J,K,bi,bj)-fMin ) / (fRange)
193     & )+1
194     IF ( iBuf .LE. MAX_LEN_PLOTBUF )
195     & plotBuf(iBuf:iBuf) = chList(IDX:IDX)
196     IF ( fld(I,J,K,bi,bj) .EQ. 0. ) THEN
197     IF ( iBuf .LE. MAX_LEN_PLOTBUF )
198     & plotBuf(iBuf:iBuf) = '*'
199     ENDIF
200     ENDDO
201     ENDDO
202     CALL PRINT_MESSAGE(plotBuf, standardMessageUnit,
203     & SQUEEZE_RIGHT, 1)
204     ENDDO
205     ENDDO
206     ENDDO
207     ENDIF
208     C-- Write delimiter
209     msgBuf = '================================================'
210     CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
211     & SQUEEZE_RIGHT, 1)
212     msgBuf = '= END OF FIELD ='
213     CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
214     & SQUEEZE_RIGHT, 1)
215     msgBuf = '================================================'
216     CALL PRINT_MESSAGE(msgBuf, standardMessageUnit,
217     & SQUEEZE_RIGHT, 1)
218    
219     RETURN
220     END
221    
222    
223    
224     CStartOfInterface
225     SUBROUTINE PRINT_MESSAGE( message, unit, sq , myThid )
226     C /============================================================\
227     C | SUBROUTINE PRINT_MESSAGE |
228     C | o Write out informational message using "standard" format. |
229     C | Notes |
230     C | ===== |
231     C | o Some system's I/O is not "thread-safe". For this reason |
232     C | without the FMTFTN_IO_THREAD_SAFE directive set a |
233     C | critical region is defined around the write here. In some|
234     C | cases BEGIN_CRIT() is approximated by only doing writes |
235     C | for thread number 1 - writes for other threads are |
236     C | ignored! |
237     C | o In a non-parallel form these routines can still be used. |
238     C | to produce pretty printed output! |
239     C \============================================================/
240     IMPLICIT NONE
241     C == Global data ==
242     #include "SIZE.h"
243     #include "EEPARAMS.h"
244     C == Routine arguments ==
245     C message - Message to write
246     C unit - Unit number to write to
247     C sq - Justification option
248     CHARACTER*(*) message
249     INTEGER unit
250     CHARACTER*(*) sq
251     INTEGER myThid
252     CEndOfInterface
253     INTEGER IFNBLNK
254     EXTERNAL IFNBLNK
255     INTEGER ILNBLNK
256     EXTERNAL ILNBLNK
257     C == Local variables ==
258     INTEGER iStart
259     INTEGER iEnd
260     CHARACTER*9 idString
261     C-- Find beginning and end of message
262     IF ( sq .EQ. SQUEEZE_BOTH .OR.
263     & sq .EQ. SQUEEZE_LEFT ) THEN
264     iStart = IFNBLNK( message )
265     ELSE
266     iStart = 1
267     ENDIF
268     IF ( sq .EQ. SQUEEZE_BOTH .OR.
269     & sq .EQ. SQUEEZE_RIGHT ) THEN
270     iEnd = ILNBLNK( message )
271     ELSE
272     iEnd = LEN(message)
273     ENDIF
274     IF ( message .EQ. ' ' ) THEN
275     WRITE(unit,'(A)') ' '
276     ELSE
277     WRITE(unit,'(A)') message(iStart:iEnd)
278     ENDIF
279     C
280     RETURN
281     END
282    
283     C $Id: $

  ViewVC Help
Powered by ViewVC 1.1.22