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

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

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


Revision 1.15 - (hide annotations) (download)
Sun Jun 26 16:51:49 2005 UTC (18 years, 10 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint57k_post, checkpoint57j_post
Changes since 1.14: +105 -95 lines
change pointers so that 1 diag. can be used several times (with # freq.)

1 jmc 1.15 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_out.F,v 1.14 2005/05/25 04:03:09 edhill Exp $
2 jmc 1.1 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 jmc 1.15 I listId,
13 jmc 1.1 I myIter,
14 edhill 1.14 I myTime,
15 jmc 1.1 I myThid )
16    
17     C !DESCRIPTION:
18     C Write output for diagnostics fields.
19 jmc 1.15
20 jmc 1.1 C !USES:
21 jmc 1.3 IMPLICIT NONE
22 jmc 1.1 #include "SIZE.h"
23     #include "EEPARAMS.h"
24     #include "PARAMS.h"
25 edhill 1.7 #include "GRID.h"
26 jmc 1.3 #include "DIAGNOSTICS_SIZE.h"
27     #include "DIAGNOSTICS.h"
28 jmc 1.1
29     #ifdef ALLOW_FIZHI
30     #include "fizhi_SIZE.h"
31     #else
32 jmc 1.3 INTEGER Nrphys
33     PARAMETER (Nrphys=0)
34 jmc 1.1 #endif
35    
36    
37     C !INPUT PARAMETERS:
38 jmc 1.15 C listId :: Diagnostics list number being written
39 jmc 1.3 C myIter :: current iteration number
40 jmc 1.15 C myTime :: current time of simulation (s)
41 jmc 1.3 C myThid :: my Thread Id number
42 edhill 1.14 _RL myTime
43 jmc 1.15 INTEGER listId, myIter, myThid
44 jmc 1.1 CEOP
45    
46 jmc 1.3 C !LOCAL VARIABLES:
47 jmc 1.15 C i,j,k :: loop indices
48     C md :: field number in the list "listId".
49     C ndId :: diagnostics Id number (in available diagnostics list)
50     C mate :: counter mate Id number (in available diagnostics list)
51     C ip :: diagnostics pointer to storage array
52     C im :: counter-mate pointer to storage array
53     INTEGER i, j, k
54     INTEGER bi, bj
55     INTEGER md, ndId, ip, im
56     INTEGER mate, mVec
57 jmc 1.3 CHARACTER*8 parms1
58     CHARACTER*3 mate_index
59 jmc 1.1 _RL qtmp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+Nrphys,nSx,nSy)
60     _RL undef, getcon
61 jmc 1.3 EXTERNAL getcon
62     INTEGER ILNBLNK
63     EXTERNAL ILNBLNK
64     INTEGER ilen
65 jmc 1.1
66 jmc 1.6 INTEGER ioUnit
67 jmc 1.11 CHARACTER*(MAX_LEN_FNAM) fn
68 jmc 1.1 CHARACTER*(MAX_LEN_MBUF) suff
69 jmc 1.3 CHARACTER*(MAX_LEN_MBUF) msgBuf
70     LOGICAL glf
71 jmc 1.1 #ifdef ALLOW_MNC
72 jmc 1.3 INTEGER ii
73 jmc 1.1 CHARACTER*(MAX_LEN_FNAM) diag_mnc_bn
74 edhill 1.7 CHARACTER*(5) ctmp
75 jmc 1.3 INTEGER CW_DIMS, NLEN
76     PARAMETER ( CW_DIMS = 10 )
77     PARAMETER ( NLEN = 80 )
78     INTEGER dim(CW_DIMS), ib(CW_DIMS), ie(CW_DIMS)
79     CHARACTER*(NLEN) dn(CW_DIMS)
80 edhill 1.7 CHARACTER*(NLEN) d_cw_name
81 jmc 1.3 CHARACTER*(NLEN) dn_blnk
82 edhill 1.7 _RS ztmp(Nr+Nrphys)
83 jmc 1.1 #endif /* ALLOW_MNC */
84    
85 jmc 1.3 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
86    
87 jmc 1.6 ioUnit= standardMessageUnit
88 jmc 1.1 undef = getcon('UNDEF')
89     glf = globalFiles
90     WRITE(suff,'(I10.10)') myIter
91 jmc 1.15 ilen = ILNBLNK(fnames(listId))
92     WRITE( fn, '(A,A,A)' ) fnames(listId)(1:ilen),'.',suff(1:10)
93 jmc 1.1
94     #ifdef ALLOW_MNC
95     IF (useMNC .AND. diag_mnc) THEN
96     DO i = 1,MAX_LEN_FNAM
97     diag_mnc_bn(i:i) = ' '
98     ENDDO
99     DO i = 1,NLEN
100     dn_blnk(i:i) = ' '
101     ENDDO
102 jmc 1.15 WRITE( diag_mnc_bn, '(A)' ) fnames(listId)(1:ilen)
103 jmc 1.1
104     C Update the record dimension by writing the iteration number
105     CALL MNC_CW_SET_UDIM(diag_mnc_bn, -1, myThid)
106 edhill 1.14 CALL MNC_CW_RL_W_S('D',diag_mnc_bn,0,0,'T',myTime,myThid)
107 jmc 1.1 CALL MNC_CW_SET_UDIM(diag_mnc_bn, 0, myThid)
108    
109     dn(1)(1:NLEN) = dn_blnk(1:NLEN)
110 jmc 1.15 WRITE(dn(1),'(a,i6.6)') 'Zmd', nlevels(listId)
111     dim(1) = nlevels(listId)
112 jmc 1.1 ib(1) = 1
113 jmc 1.15 ie(1) = nlevels(listId)
114 jmc 1.1
115     CALL MNC_CW_ADD_GNAME('diag_levels', 1,
116     & dim, dn, ib, ie, myThid)
117 edhill 1.7 CALL MNC_CW_ADD_VNAME('diag_levels', 'diag_levels',
118 jmc 1.1 & 0,0, myThid)
119 edhill 1.7 CALL MNC_CW_ADD_VATTR_TEXT('diag_levels','description',
120     & 'Idicies of vertical levels within the source arrays',
121 jmc 1.1 & myThid)
122    
123 edhill 1.9 CALL MNC_CW_RL_W('D',diag_mnc_bn,0,0,
124 jmc 1.15 & 'diag_levels', levs(1,listId), myThid)
125 jmc 1.1
126 edhill 1.7 CALL MNC_CW_DEL_VNAME('diag_levels', myThid)
127 jmc 1.1 CALL MNC_CW_DEL_GNAME('diag_levels', myThid)
128 edhill 1.7
129     C Now define: Zmdxxxxxx, Zudxxxxxx, Zldxxxxxx
130     ctmp(1:5) = 'mul '
131     DO i = 1,3
132     dn(1)(1:NLEN) = dn_blnk(1:NLEN)
133 jmc 1.15 WRITE(dn(1),'(3a,i6.6)') 'Z',ctmp(i:i),'d',nlevels(listId)
134 edhill 1.7 CALL MNC_CW_ADD_GNAME(dn(1), 1, dim, dn, ib, ie, myThid)
135     CALL MNC_CW_ADD_VNAME(dn(1), dn(1), 0,0, myThid)
136 edhill 1.10
137     C The following three ztmp() loops should eventually be modified
138     C to reflect the fractional nature of levs(j,l) -- they should
139     C do something like:
140     C ztmp(j) = rC(INT(FLOOR(levs(j,l))))
141     C + ( rC(INT(FLOOR(levs(j,l))))
142     C + rC(INT(CEIL(levs(j,l)))) )
143     C / ( levs(j,l) - FLOOR(levs(j,l)) )
144     C for averaged levels.
145     IF (i .EQ. 1) THEN
146 jmc 1.15 DO j = 1,nlevels(listId)
147     ztmp(j) = rC(NINT(levs(j,listId)))
148 edhill 1.10 ENDDO
149     CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
150     & 'Dimensional coordinate value at the mid point',
151     & myThid)
152     ELSEIF (i .EQ. 2) THEN
153 jmc 1.15 DO j = 1,nlevels(listId)
154     ztmp(j) = rF(NINT(levs(j,listId)) + 1)
155 edhill 1.10 ENDDO
156     CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
157     & 'Dimensional coordinate value at the upper point',
158     & myThid)
159     ELSEIF (i .EQ. 3) THEN
160 jmc 1.15 DO j = 1,nlevels(listId)
161     ztmp(j) = rF(NINT(levs(j,listId)))
162 edhill 1.10 ENDDO
163     CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
164     & 'Dimensional coordinate value at the lower point',
165     & myThid)
166     ENDIF
167 edhill 1.7 CALL MNC_CW_RS_W('D',diag_mnc_bn,0,0, dn(1), ztmp, myThid)
168     CALL MNC_CW_DEL_VNAME(dn(1), myThid)
169     CALL MNC_CW_DEL_GNAME(dn(1), myThid)
170     ENDDO
171    
172 jmc 1.1 ENDIF
173     #endif /* ALLOW_MNC */
174    
175 jmc 1.15 DO md = 1,nfields(listId)
176     ndId = jdiag(md,listId)
177     parms1 = gdiag(ndId)(1:8)
178     IF ( idiag(md,listId).NE.0 .AND. parms1(5:5).NE.'D' ) THEN
179 jmc 1.3 C-- Start processing 1 Fld :
180    
181 jmc 1.15 ip = ABS(idiag(md,listId))
182     im = mdiag(md,listId)
183     IF ( ndiag(ip,1,1).EQ.0 ) THEN
184 jmc 1.3 C- Empty diagnostics case :
185    
186     _BEGIN_MASTER( myThid )
187     WRITE(msgBuf,'(A,I10)')
188     & '- WARNING - from DIAGNOSTICS_OUT at iter=', myIter
189 jmc 1.15 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
190 jmc 1.3 & SQUEEZE_RIGHT, myThid)
191     WRITE(msgBuf,'(A,I4,3A,I3,2A)')
192 jmc 1.15 & '- WARNING - diag.#',ndId, ' : ',flds(md,listId),
193     & ' (#',md,' ) in outp.Stream: ',fnames(listId)
194     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
195 jmc 1.3 & SQUEEZE_RIGHT, myThid)
196     WRITE(msgBuf,'(A,I2,A)')
197 jmc 1.15 & '- WARNING - has not been filled (ndiag=',
198     & ndiag(ip,1,1), ' )'
199     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
200 jmc 1.3 & SQUEEZE_RIGHT, myThid)
201     WRITE(msgBuf,'(A)')
202     & 'WARNING DIAGNOSTICS_OUT => write ZEROS instead'
203 jmc 1.15 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
204 jmc 1.3 & SQUEEZE_RIGHT, myThid)
205     _END_MASTER( myThid )
206     DO bj = myByLo(myThid), myByHi(myThid)
207     DO bi = myBxLo(myThid), myBxHi(myThid)
208 jmc 1.15 DO k = 1,nlevels(listId)
209 jmc 1.3 DO j = 1-OLy,sNy+OLy
210     DO i = 1-OLx,sNx+OLx
211     qtmp1(i,j,k,bi,bj) = 0. _d 0
212     ENDDO
213     ENDDO
214     ENDDO
215     ENDDO
216     ENDDO
217    
218     ELSE
219     C- diagnostics is not empty :
220    
221 jmc 1.15 IF ( myThid.EQ.1 ) WRITE(ioUnit,'(A,I3,3A,I8,2A)')
222     & ' Computing Diagnostic # ', ndId, ' ', cdiag(ndId),
223     & ' Counter:',ndiag(ip,1,1),' Parms: ',gdiag(ndId)
224 jmc 1.3
225 jmc 1.6 IF ( parms1(5:5).EQ.'C' ) THEN
226     C Check for Mate of a Counter Diagnostic
227     C --------------------------------------
228     mate_index = parms1(6:8)
229     READ (mate_index,'(I3)') mate
230 jmc 1.15 IF ( myThid.EQ.1 ) WRITE(ioUnit,'(3A,I3,2A)')
231     & ' use Counter Mate for ', cdiag(ndId),
232     & ' Diagnostic # ',mate, ' ', cdiag(mate)
233    
234 jmc 1.6 ELSE
235     mate = 0
236 jmc 1.3
237     C Check for Mate of a Vector Diagnostic
238     C -------------------------------------
239     IF ( parms1(1:1).EQ.'U' .OR. parms1(1:1).EQ.'V' ) THEN
240     mate_index = parms1(6:8)
241 jmc 1.6 READ (mate_index,'(I3)') mVec
242 jmc 1.15 IF ( im.GT.0 .AND. ndiag(MAX(1,im),1,1).GT.0 ) THEN
243     IF ( myThid.EQ.1 ) WRITE(ioUnit,'(3A,I3,3A)')
244     & ' Vector Mate for ', cdiag(ndId),
245     & ' Diagnostic # ',mVec, ' ', cdiag(mVec),
246     & ' exists '
247 jmc 1.3 ELSE
248 jmc 1.15 IF ( myThid.EQ.1 ) WRITE(ioUnit,'(3A,I3,3A)')
249     & ' Vector Mate for ', cdiag(ndId),
250     & ' Diagnostic # ',mVec, ' ', cdiag(mVec),
251     & ' not enabled'
252 jmc 1.3 ENDIF
253     ENDIF
254 jmc 1.6 ENDIF
255 jmc 1.3
256 jmc 1.6 DO bj = myByLo(myThid), myByHi(myThid)
257     DO bi = myBxLo(myThid), myBxHi(myThid)
258 jmc 1.15 DO k = 1,nlevels(listId)
259 jmc 1.6 CALL GETDIAG(
260 jmc 1.15 I levs(k,listId),undef,
261 jmc 1.6 O qtmp1(1-OLx,1-OLy,k,bi,bj),
262 jmc 1.15 I ndId,mate,ip,im,bi,bj,myThid)
263 jmc 1.3 ENDDO
264 jmc 1.6 ENDDO
265     ENDDO
266 jmc 1.1
267 jmc 1.3 C- end of empty diag / not empty block
268     ENDIF
269 jmc 1.1
270     #ifdef ALLOW_MDSIO
271 jmc 1.3 C Prepare for mdsio optionality
272     IF (diag_mdsio) THEN
273 jmc 1.15 IF (fflags(listId)(1:1) .EQ. ' ') THEN
274 edhill 1.13 C This is the old default behavior
275 jmc 1.15 CALL MDSWRITEFIELD_NEW(fn,writeBinaryPrec,glf,'RL',
276     & Nr+Nrphys,nlevels(listId),qtmp1,md,myIter,myThid)
277     ELSEIF (fflags(listId)(1:1) .EQ. 'R') THEN
278 edhill 1.13 C Force it to be 32-bit precision
279 jmc 1.15 CALL MDSWRITEFIELD_NEW(fn,precFloat32,glf,'RL',
280     & Nr+Nrphys,nlevels(listId),qtmp1,md,myIter,myThid)
281     ELSEIF (fflags(listId)(1:1) .EQ. 'D') THEN
282 edhill 1.13 C Force it to be 64-bit precision
283 jmc 1.15 CALL MDSWRITEFIELD_NEW(fn,precFloat64,glf,'RL',
284     & Nr+Nrphys,nlevels(listId),qtmp1,md,myIter,myThid)
285 edhill 1.13 ENDIF
286 jmc 1.3 ENDIF
287 jmc 1.1 #endif /* ALLOW_MDSIO */
288    
289     #ifdef ALLOW_MNC
290 jmc 1.3 IF (useMNC .AND. diag_mnc) THEN
291 jmc 1.1
292 jmc 1.3 _BEGIN_MASTER( myThid )
293 jmc 1.1
294 jmc 1.3 DO ii = 1,CW_DIMS
295 edhill 1.7 d_cw_name(1:NLEN) = dn_blnk(1:NLEN)
296 jmc 1.3 dn(ii)(1:NLEN) = dn_blnk(1:NLEN)
297     ENDDO
298    
299 edhill 1.7 C Note that the "d_cw_name" variable is a hack that hides a
300     C subtlety within MNC. Basically, each MNC-wrapped file is
301     C caching its own concept of what each "grid name" (that is, a
302     C dimension group name) means. So one cannot re-use the same
303     C "grid" name for different collections of dimensions within a
304 jmc 1.15 C given file. By appending the "ndId" values to each name, we
305 edhill 1.7 C guarantee uniqueness within each MNC-produced file.
306 jmc 1.15 WRITE(d_cw_name,'(a,i6.6)') 'd_cw_',ndId
307 edhill 1.7
308 edhill 1.5 C XY dimensions
309     dim(1) = sNx + 2*OLx
310     dim(2) = sNy + 2*OLy
311     ib(1) = OLx + 1
312     ib(2) = OLy + 1
313 jmc 1.15 IF (gdiag(ndId)(2:2) .EQ. 'M') THEN
314 edhill 1.5 dn(1)(1:2) = 'X'
315     ie(1) = OLx + sNx
316     dn(2)(1:2) = 'Y'
317     ie(2) = OLy + sNy
318 jmc 1.15 ELSEIF (gdiag(ndId)(2:2) .EQ. 'U') THEN
319 edhill 1.5 dn(1)(1:3) = 'Xp1'
320     ie(1) = OLx + sNx + 1
321     dn(2)(1:2) = 'Y'
322     ie(2) = OLy + sNy
323 jmc 1.15 ELSEIF (gdiag(ndId)(2:2) .EQ. 'V') THEN
324 edhill 1.5 dn(1)(1:2) = 'X'
325     ie(1) = OLx + sNx
326     dn(2)(1:3) = 'Yp1'
327     ie(2) = OLy + sNy + 1
328 jmc 1.15 ELSEIF (gdiag(ndId)(2:2) .EQ. 'Z') THEN
329 edhill 1.5 dn(1)(1:3) = 'Xp1'
330     ie(1) = OLx + sNx + 1
331     dn(2)(1:3) = 'Yp1'
332     ie(2) = OLy + sNy + 1
333     ENDIF
334    
335 jmc 1.3 C Z is special since it varies
336 jmc 1.15 WRITE(dn(3),'(a,i6.6)') 'Zd', nlevels(listId)
337     IF ( (gdiag(ndId)(10:10) .EQ. 'R')
338     & .AND. (gdiag(ndId)(9:9) .EQ. 'M') ) THEN
339     WRITE(dn(3),'(a,i6.6)') 'Zmd', nlevels(listId)
340 edhill 1.7 ENDIF
341 jmc 1.15 IF ( (gdiag(ndId)(10:10) .EQ. 'R')
342     & .AND. (gdiag(ndId)(9:9) .EQ. 'L') ) THEN
343     WRITE(dn(3),'(a,i6.6)') 'Zld', nlevels(listId)
344 edhill 1.7 ENDIF
345 jmc 1.15 IF ( (gdiag(ndId)(10:10) .EQ. 'R')
346     & .AND. (gdiag(ndId)(9:9) .EQ. 'U') ) THEN
347     WRITE(dn(3),'(a,i6.6)') 'Zud', nlevels(listId)
348 edhill 1.7 ENDIF
349 jmc 1.3 dim(3) = Nr+Nrphys
350     ib(3) = 1
351 jmc 1.15 ie(3) = nlevels(listId)
352 jmc 1.1
353 edhill 1.5 C Time dimension
354     dn(4)(1:1) = 'T'
355     dim(4) = -1
356     ib(4) = 1
357     ie(4) = 1
358    
359 edhill 1.7 CALL MNC_CW_ADD_GNAME(d_cw_name, 4,
360 jmc 1.1 & dim, dn, ib, ie, myThid)
361 jmc 1.15 CALL MNC_CW_ADD_VNAME(cdiag(ndId), d_cw_name,
362 jmc 1.1 & 4,5, myThid)
363 jmc 1.15 CALL MNC_CW_ADD_VATTR_TEXT(cdiag(ndId),'description',
364     & tdiag(ndId),myThid)
365     CALL MNC_CW_ADD_VATTR_TEXT(cdiag(ndId),'units',
366     & udiag(ndId),myThid)
367 jmc 1.1
368 jmc 1.15 IF ((fflags(listId)(1:1) .EQ. ' ')
369     & .OR. (fflags(listId)(1:1) .EQ. 'R')) THEN
370 edhill 1.13 CALL MNC_CW_RL_W('R',diag_mnc_bn,0,0,
371 jmc 1.15 & cdiag(ndId), qtmp1, myThid)
372     ELSEIF (fflags(listId)(1:1) .EQ. 'D') THEN
373 edhill 1.13 CALL MNC_CW_RL_W('D',diag_mnc_bn,0,0,
374 jmc 1.15 & cdiag(ndId), qtmp1, myThid)
375 edhill 1.13 ENDIF
376    
377 jmc 1.15 CALL MNC_CW_DEL_VNAME(cdiag(ndId), myThid)
378 edhill 1.7 CALL MNC_CW_DEL_GNAME(d_cw_name, myThid)
379 jmc 1.1
380 jmc 1.3 _END_MASTER( myThid )
381 jmc 1.1
382 jmc 1.3 ENDIF
383 jmc 1.1 #endif /* ALLOW_MNC */
384    
385 jmc 1.15 C-- end of Processing Fld # md
386 jmc 1.3 ENDIF
387     ENDDO
388 jmc 1.1
389 jmc 1.15 RETURN
390 jmc 1.3 END
391 jmc 1.15
392 jmc 1.1 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

  ViewVC Help
Powered by ViewVC 1.1.22