/[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.6 - (hide 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 jmc 1.6 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_out.F,v 1.5 2004/12/29 02:13:38 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     I listnum,
13     I myIter,
14     I myThid )
15    
16     C !DESCRIPTION:
17     C Write output for diagnostics fields.
18    
19     C !USES:
20 jmc 1.3 IMPLICIT NONE
21 jmc 1.1 #include "SIZE.h"
22     #include "EEPARAMS.h"
23     #include "PARAMS.h"
24 jmc 1.3 #include "DIAGNOSTICS_SIZE.h"
25     #include "DIAGNOSTICS.h"
26 jmc 1.1
27     #ifdef ALLOW_FIZHI
28     #include "fizhi_SIZE.h"
29     #else
30 jmc 1.3 INTEGER Nrphys
31     PARAMETER (Nrphys=0)
32 jmc 1.1 #endif
33    
34    
35     C !INPUT PARAMETERS:
36 jmc 1.3 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 jmc 1.1 CEOP
41    
42 jmc 1.3 C !LOCAL VARIABLES:
43     INTEGER i, j, k, m, n, bi, bj
44     CHARACTER*8 parms1
45     CHARACTER*3 mate_index
46 jmc 1.6 INTEGER mate, mVec
47 jmc 1.1 _RL qtmp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+Nrphys,nSx,nSy)
48     _RL undef, getcon
49 jmc 1.3 EXTERNAL getcon
50     INTEGER ILNBLNK
51     EXTERNAL ILNBLNK
52     INTEGER ilen
53 jmc 1.1
54 jmc 1.6 INTEGER ioUnit
55 jmc 1.1 CHARACTER*(MAX_LEN_FNAM) pref
56     CHARACTER*(MAX_LEN_MBUF) suff
57 jmc 1.3 CHARACTER*(MAX_LEN_MBUF) msgBuf
58 jmc 1.1 CHARACTER*(80) fn
59 jmc 1.3 LOGICAL glf
60 jmc 1.1 #ifdef ALLOW_MNC
61 jmc 1.3 INTEGER ii
62 jmc 1.1 CHARACTER*(MAX_LEN_FNAM) diag_mnc_bn
63    
64 jmc 1.3 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 jmc 1.1 #endif /* ALLOW_MNC */
71    
72 jmc 1.3 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
73    
74 jmc 1.6 ioUnit= standardMessageUnit
75 jmc 1.1 undef = getcon('UNDEF')
76     glf = globalFiles
77     WRITE(suff,'(I10.10)') myIter
78     pref = fnames(listnum)
79 jmc 1.3 ilen=ILNBLNK( pref )
80 jmc 1.1 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 jmc 1.2 c WRITE( diag_mnc_bn, '(A,A)' ) 'diag.', pref(1:ilen)
91     WRITE( diag_mnc_bn, '(A)' ) pref(1:ilen)
92 jmc 1.1
93     C Update the record dimension by writing the iteration number
94     CALL MNC_CW_SET_UDIM(diag_mnc_bn, -1, myThid)
95 edhill 1.4 CALL MNC_CW_I_W_S('I',diag_mnc_bn,0,0,'T',myIter,myThid)
96 jmc 1.1 CALL MNC_CW_SET_UDIM(diag_mnc_bn, 0, myThid)
97    
98     dn(1)(1:NLEN) = dn_blnk(1:NLEN)
99 jmc 1.3 WRITE(dn(1),'(a,i6.6)') 'Zd', nlevels(listnum)
100 jmc 1.1 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 edhill 1.5 CALL MNC_CW_ADD_VNAME(dn(1), 'diag_levels',
107 jmc 1.1 & 0,0, myThid)
108 edhill 1.5 CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
109 jmc 1.1 & '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 edhill 1.5 & dn(1), levs(1,listnum), myThid)
114 jmc 1.1
115 edhill 1.5 CALL MNC_CW_DEL_VNAME(dn(1), myThid)
116 jmc 1.1 CALL MNC_CW_DEL_GNAME('diag_levels', myThid)
117     ENDIF
118     #endif /* ALLOW_MNC */
119    
120 jmc 1.3 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 jmc 1.6 & WRITE(ioUnit,2000) m,cdiag(m),ndiag(m),gdiag(m)
165 jmc 1.3
166 jmc 1.6 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 jmc 1.3
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 jmc 1.6 READ (mate_index,'(I3)') mVec
181     IF ( idiag(mVec).NE.0 ) THEN
182 jmc 1.3 IF ( myThid.EQ.1 )
183 jmc 1.6 & WRITE(ioUnit,2001) cdiag(m),mVec,cdiag(mVec)
184 jmc 1.3 ELSE
185     IF ( myThid.EQ.1 )
186 jmc 1.6 & WRITE(ioUnit,2002) cdiag(m),mVec,cdiag(mVec)
187 jmc 1.3 ENDIF
188     ENDIF
189 jmc 1.6 ENDIF
190 jmc 1.3
191 jmc 1.6 DO bj = myByLo(myThid), myByHi(myThid)
192     DO bi = myBxLo(myThid), myBxHi(myThid)
193 jmc 1.3 DO k = 1,nlevels(listnum)
194 jmc 1.6 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 jmc 1.3 ENDDO
199 jmc 1.6 ENDDO
200     ENDDO
201 jmc 1.1
202 jmc 1.3 C- end of empty diag / not empty block
203     ENDIF
204 jmc 1.1
205     #ifdef ALLOW_MDSIO
206 jmc 1.3 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 jmc 1.1 #endif /* ALLOW_MDSIO */
212    
213     #ifdef ALLOW_MNC
214 jmc 1.3 IF (useMNC .AND. diag_mnc) THEN
215 jmc 1.1
216 jmc 1.3 _BEGIN_MASTER( myThid )
217 jmc 1.1
218 jmc 1.3 DO ii = 1,CW_DIMS
219     dn(ii)(1:NLEN) = dn_blnk(1:NLEN)
220     ENDDO
221    
222 edhill 1.5 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 jmc 1.3 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 jmc 1.1
255 edhill 1.5 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 jmc 1.1 & dim, dn, ib, ie, myThid)
263 jmc 1.3 CALL MNC_CW_ADD_VNAME(cdiag(m), 'diag_cw_temp',
264 jmc 1.1 & 4,5, myThid)
265 jmc 1.3 CALL MNC_CW_ADD_VATTR_TEXT(cdiag(m),'description',
266 jmc 1.1 & tdiag(m),myThid)
267 jmc 1.3 CALL MNC_CW_ADD_VATTR_TEXT(cdiag(m),'units',
268 jmc 1.1 & udiag(m),myThid)
269    
270 jmc 1.3 CALL MNC_CW_RL_W('D',diag_mnc_bn,0,0,
271 jmc 1.1 & cdiag(m), qtmp1, myThid)
272    
273 jmc 1.3 CALL MNC_CW_DEL_VNAME(cdiag(m), myThid)
274     CALL MNC_CW_DEL_GNAME('diag_cw_temp', myThid)
275 jmc 1.1
276 jmc 1.3 _END_MASTER( myThid )
277 jmc 1.1
278 jmc 1.3 ENDIF
279 jmc 1.1 #endif /* ALLOW_MNC */
280    
281 jmc 1.3 C-- end of Processing Fld # n
282     ENDIF
283     ENDDO
284 jmc 1.1
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 jmc 1.3 RETURN
295     END
296 jmc 1.1
297     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

  ViewVC Help
Powered by ViewVC 1.1.22