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

Contents of /MITgcm_contrib/cg2d_bench/print.F

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


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

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