/[MITgcm]/MITgcm/pkg/diagnostics/diagnostics_out.F
ViewVC logotype

Contents of /MITgcm/pkg/diagnostics/diagnostics_out.F

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


Revision 1.6 - (show annotations) (download)
Mon Feb 7 03:07:49 2005 UTC (19 years, 3 months ago) by jmc
Branch: MAIN
Changes since 1.5: +27 -38 lines
fix a bug (writing sub-set of levels); keep double precision when
 divide by counter; use only one S/R GETDIAG for both cases (with
 and without counter diagnostics)

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_out.F,v 1.5 2004/12/29 02:13:38 edhill Exp $
2 C $Name: $
3
4 #include "DIAG_OPTIONS.h"
5
6 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7 CBOP 0
8 C !ROUTINE: DIAGNOSTICS_OUT
9
10 C !INTERFACE:
11 SUBROUTINE DIAGNOSTICS_OUT(
12 I listnum,
13 I myIter,
14 I myThid )
15
16 C !DESCRIPTION:
17 C Write output for diagnostics fields.
18
19 C !USES:
20 IMPLICIT NONE
21 #include "SIZE.h"
22 #include "EEPARAMS.h"
23 #include "PARAMS.h"
24 #include "DIAGNOSTICS_SIZE.h"
25 #include "DIAGNOSTICS.h"
26
27 #ifdef ALLOW_FIZHI
28 #include "fizhi_SIZE.h"
29 #else
30 INTEGER Nrphys
31 PARAMETER (Nrphys=0)
32 #endif
33
34
35 C !INPUT PARAMETERS:
36 C listnum :: Diagnostics list number being written
37 C myIter :: current iteration number
38 C myThid :: my Thread Id number
39 INTEGER listnum, myIter, myThid
40 CEOP
41
42 C !LOCAL VARIABLES:
43 INTEGER i, j, k, m, n, bi, bj
44 CHARACTER*8 parms1
45 CHARACTER*3 mate_index
46 INTEGER mate, mVec
47 _RL qtmp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+Nrphys,nSx,nSy)
48 _RL undef, getcon
49 EXTERNAL getcon
50 INTEGER ILNBLNK
51 EXTERNAL ILNBLNK
52 INTEGER ilen
53
54 INTEGER ioUnit
55 CHARACTER*(MAX_LEN_FNAM) pref
56 CHARACTER*(MAX_LEN_MBUF) suff
57 CHARACTER*(MAX_LEN_MBUF) msgBuf
58 CHARACTER*(80) fn
59 LOGICAL glf
60 #ifdef ALLOW_MNC
61 INTEGER ii
62 CHARACTER*(MAX_LEN_FNAM) diag_mnc_bn
63
64 INTEGER CW_DIMS, NLEN
65 PARAMETER ( CW_DIMS = 10 )
66 PARAMETER ( NLEN = 80 )
67 INTEGER dim(CW_DIMS), ib(CW_DIMS), ie(CW_DIMS)
68 CHARACTER*(NLEN) dn(CW_DIMS)
69 CHARACTER*(NLEN) dn_blnk
70 #endif /* ALLOW_MNC */
71
72 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
73
74 ioUnit= standardMessageUnit
75 undef = getcon('UNDEF')
76 glf = globalFiles
77 WRITE(suff,'(I10.10)') myIter
78 pref = fnames(listnum)
79 ilen=ILNBLNK( pref )
80 WRITE( fn, '(A,A,A)' ) pref(1:ilen),'.',suff(1:10)
81
82 #ifdef ALLOW_MNC
83 IF (useMNC .AND. diag_mnc) THEN
84 DO i = 1,MAX_LEN_FNAM
85 diag_mnc_bn(i:i) = ' '
86 ENDDO
87 DO i = 1,NLEN
88 dn_blnk(i:i) = ' '
89 ENDDO
90 c WRITE( diag_mnc_bn, '(A,A)' ) 'diag.', pref(1:ilen)
91 WRITE( diag_mnc_bn, '(A)' ) pref(1:ilen)
92
93 C Update the record dimension by writing the iteration number
94 CALL MNC_CW_SET_UDIM(diag_mnc_bn, -1, myThid)
95 CALL MNC_CW_I_W_S('I',diag_mnc_bn,0,0,'T',myIter,myThid)
96 CALL MNC_CW_SET_UDIM(diag_mnc_bn, 0, myThid)
97
98 dn(1)(1:NLEN) = dn_blnk(1:NLEN)
99 WRITE(dn(1),'(a,i6.6)') 'Zd', nlevels(listnum)
100 dim(1) = nlevels(listnum)
101 ib(1) = 1
102 ie(1) = nlevels(listnum)
103
104 CALL MNC_CW_ADD_GNAME('diag_levels', 1,
105 & dim, dn, ib, ie, myThid)
106 CALL MNC_CW_ADD_VNAME(dn(1), 'diag_levels',
107 & 0,0, myThid)
108 CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
109 & 'Idicies of vertical levels within the data source arrays',
110 & myThid)
111
112 CALL MNC_CW_RL_W('I',diag_mnc_bn,0,0,
113 & dn(1), levs(1,listnum), myThid)
114
115 CALL MNC_CW_DEL_VNAME(dn(1), myThid)
116 CALL MNC_CW_DEL_GNAME('diag_levels', myThid)
117 ENDIF
118 #endif /* ALLOW_MNC */
119
120 DO n = 1,nfields(listnum)
121 m = jdiag(n,listnum)
122 parms1 = gdiag(m)(1:8)
123 IF ( idiag(m).NE.0 .AND. parms1(5:5).NE.'D' ) THEN
124 C-- Start processing 1 Fld :
125
126 IF ( ndiag(m).EQ.0 ) THEN
127 C- Empty diagnostics case :
128
129 _BEGIN_MASTER( myThid )
130 WRITE(msgBuf,'(A,I10)')
131 & '- WARNING - from DIAGNOSTICS_OUT at iter=', myIter
132 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
133 & SQUEEZE_RIGHT, myThid)
134 WRITE(msgBuf,'(A,I4,3A,I3,2A)')
135 & '- WARNING - diag.#',m, ' : ',flds(n,listnum),
136 & ' (#',n,' ) in outp.Stream: ',fnames(listnum)
137 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
138 & SQUEEZE_RIGHT, myThid)
139 WRITE(msgBuf,'(A,I2,A)')
140 & '- WARNING - has not been filled (ndiag=',ndiag(m),' )'
141 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
142 & SQUEEZE_RIGHT, myThid)
143 WRITE(msgBuf,'(A)')
144 & 'WARNING DIAGNOSTICS_OUT => write ZEROS instead'
145 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
146 & SQUEEZE_RIGHT, myThid)
147 _END_MASTER( myThid )
148 DO bj = myByLo(myThid), myByHi(myThid)
149 DO bi = myBxLo(myThid), myBxHi(myThid)
150 DO k = 1,nlevels(listnum)
151 DO j = 1-OLy,sNy+OLy
152 DO i = 1-OLx,sNx+OLx
153 qtmp1(i,j,k,bi,bj) = 0. _d 0
154 ENDDO
155 ENDDO
156 ENDDO
157 ENDDO
158 ENDDO
159
160 ELSE
161 C- diagnostics is not empty :
162
163 IF ( myThid.EQ.1 )
164 & WRITE(ioUnit,2000) m,cdiag(m),ndiag(m),gdiag(m)
165
166 IF ( parms1(5:5).EQ.'C' ) THEN
167 C Check for Mate of a Counter Diagnostic
168 C --------------------------------------
169 mate_index = parms1(6:8)
170 READ (mate_index,'(I3)') mate
171 IF ( myThid.EQ.1 )
172 & WRITE(ioUnit,2003) cdiag(m),mate,cdiag(mate)
173 ELSE
174 mate = 0
175
176 C Check for Mate of a Vector Diagnostic
177 C -------------------------------------
178 IF ( parms1(1:1).EQ.'U' .OR. parms1(1:1).EQ.'V' ) THEN
179 mate_index = parms1(6:8)
180 READ (mate_index,'(I3)') mVec
181 IF ( idiag(mVec).NE.0 ) THEN
182 IF ( myThid.EQ.1 )
183 & WRITE(ioUnit,2001) cdiag(m),mVec,cdiag(mVec)
184 ELSE
185 IF ( myThid.EQ.1 )
186 & WRITE(ioUnit,2002) cdiag(m),mVec,cdiag(mVec)
187 ENDIF
188 ENDIF
189 ENDIF
190
191 DO bj = myByLo(myThid), myByHi(myThid)
192 DO bi = myBxLo(myThid), myBxHi(myThid)
193 DO k = 1,nlevels(listnum)
194 CALL GETDIAG(
195 I levs(k,listnum),undef,
196 O qtmp1(1-OLx,1-OLy,k,bi,bj),
197 I m,mate,bi,bj,myThid)
198 ENDDO
199 ENDDO
200 ENDDO
201
202 C- end of empty diag / not empty block
203 ENDIF
204
205 #ifdef ALLOW_MDSIO
206 C Prepare for mdsio optionality
207 IF (diag_mdsio) THEN
208 CALL mdswritefield_new(fn,writeBinaryPrec,glf,'RL',
209 & Nr+Nrphys,nlevels(listnum),qtmp1,n,myIter,myThid)
210 ENDIF
211 #endif /* ALLOW_MDSIO */
212
213 #ifdef ALLOW_MNC
214 IF (useMNC .AND. diag_mnc) THEN
215
216 _BEGIN_MASTER( myThid )
217
218 DO ii = 1,CW_DIMS
219 dn(ii)(1:NLEN) = dn_blnk(1:NLEN)
220 ENDDO
221
222 C XY dimensions
223 dim(1) = sNx + 2*OLx
224 dim(2) = sNy + 2*OLy
225 ib(1) = OLx + 1
226 ib(2) = OLy + 1
227 IF (gdiag(n)(2:2) .EQ. 'M') THEN
228 dn(1)(1:2) = 'X'
229 ie(1) = OLx + sNx
230 dn(2)(1:2) = 'Y'
231 ie(2) = OLy + sNy
232 ELSEIF (gdiag(n)(2:2) .EQ. 'U') THEN
233 dn(1)(1:3) = 'Xp1'
234 ie(1) = OLx + sNx + 1
235 dn(2)(1:2) = 'Y'
236 ie(2) = OLy + sNy
237 ELSEIF (gdiag(n)(2:2) .EQ. 'V') THEN
238 dn(1)(1:2) = 'X'
239 ie(1) = OLx + sNx
240 dn(2)(1:3) = 'Yp1'
241 ie(2) = OLy + sNy + 1
242 ELSEIF (gdiag(n)(2:2) .EQ. 'Z') THEN
243 dn(1)(1:3) = 'Xp1'
244 ie(1) = OLx + sNx + 1
245 dn(2)(1:3) = 'Yp1'
246 ie(2) = OLy + sNy + 1
247 ENDIF
248
249 C Z is special since it varies
250 WRITE(dn(3),'(a,i6.6)') 'Zd', nlevels(listnum)
251 dim(3) = Nr+Nrphys
252 ib(3) = 1
253 ie(3) = nlevels(listnum)
254
255 C Time dimension
256 dn(4)(1:1) = 'T'
257 dim(4) = -1
258 ib(4) = 1
259 ie(4) = 1
260
261 CALL MNC_CW_ADD_GNAME('diag_cw_temp', 4,
262 & dim, dn, ib, ie, myThid)
263 CALL MNC_CW_ADD_VNAME(cdiag(m), 'diag_cw_temp',
264 & 4,5, myThid)
265 CALL MNC_CW_ADD_VATTR_TEXT(cdiag(m),'description',
266 & tdiag(m),myThid)
267 CALL MNC_CW_ADD_VATTR_TEXT(cdiag(m),'units',
268 & udiag(m),myThid)
269
270 CALL MNC_CW_RL_W('D',diag_mnc_bn,0,0,
271 & cdiag(m), qtmp1, myThid)
272
273 CALL MNC_CW_DEL_VNAME(cdiag(m), myThid)
274 CALL MNC_CW_DEL_GNAME('diag_cw_temp', myThid)
275
276 _END_MASTER( myThid )
277
278 ENDIF
279 #endif /* ALLOW_MNC */
280
281 C-- end of Processing Fld # n
282 ENDIF
283 ENDDO
284
285 2000 format(1x,'Computing Diagnostic # ',i3,2x,a8,5x,'Counter: ',
286 & i4,6x,'Parms: ',a16)
287 2001 format(1x,' Vector Mate for ',a8,5x,
288 & 'Diagnostic # ',i3,2x,a8,' exists ')
289 2002 format(1x,' Vector Mate for ',a8,5x,
290 & 'Diagnostic # ',i3,2x,a8,' not enabled')
291 2003 format(1x,' use Counter Mate for ',a8,5x,
292 & 'Diagnostic # ',i3,2x,a8)
293
294 RETURN
295 END
296
297 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

  ViewVC Help
Powered by ViewVC 1.1.22