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

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

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


Revision 1.1 - (show annotations) (download)
Wed Jul 6 02:13:52 2005 UTC (18 years, 10 months ago) by edhill
Branch: MAIN
 o add mnc output capability to diagnostics/diagstat and update
   our cvsignore files for the ACSII output generated

1 C $Header: $
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: DIAGSTATS_MNC_OUT
9
10 C !INTERFACE:
11 SUBROUTINE DIAGSTATS_MNC_OUT(
12 I statGlob, nLev, ndId,
13 I mId, listId, myIter, myTime, myThid )
14
15 C !DESCRIPTION:
16 C Write Global statistics to a netCDF file
17
18 C !USES:
19 IMPLICIT NONE
20 #include "SIZE.h"
21 #include "EEPARAMS.h"
22 #include "EESUPPORT.h"
23 #include "PARAMS.h"
24 #include "GRID.h"
25 #include "DIAGNOSTICS_SIZE.h"
26 #include "DIAGNOSTICS.h"
27
28 #ifdef ALLOW_FIZHI
29 #include "fizhi_SIZE.h"
30 #else
31 INTEGER Nrphys
32 PARAMETER (Nrphys=0)
33 #endif
34
35 C !INPUT PARAMETERS:
36 C statGlob :: AVERAGED DIAGNOSTIC QUANTITY
37 C nLev :: 2nd Dimension (max Nb of levels) of statGlob array
38 C ndId :: diagnostic Id number (in diagnostics long list)
39 C mId :: field rank in list "listId"
40 C listId :: current output Stream list
41 C myIter :: current Iteration Number
42 C myTime :: current time of simulation (s)
43 C myThid :: my thread Id number
44 INTEGER nLev
45 _RL statGlob(0:nStats,0:nLev,0:nRegions)
46 INTEGER ndId, mId, listId
47 INTEGER myIter, myTime, myThid
48 CEOP
49
50 C !LOCAL VARIABLES:
51 INTEGER im, ix, iv, ist
52 PARAMETER ( iv = nStats - 2 , im = nStats - 1 , ix = nStats )
53 INTEGER i, j, k
54 CHARACTER*(MAX_LEN_MBUF) tnam
55 CHARACTER*(3) stat_typ(5)
56 INTEGER ILNBLNK
57 EXTERNAL ILNBLNK
58 #ifdef ALLOW_MNC
59 INTEGER ii, ilen
60 CHARACTER*(MAX_LEN_FNAM) diag_mnc_bn
61 CHARACTER*(5) ctmp
62 INTEGER CW_DIMS, NLEN
63 PARAMETER ( CW_DIMS = 10 )
64 PARAMETER ( NLEN = 80 )
65 INTEGER dim(CW_DIMS), ib(CW_DIMS), ie(CW_DIMS)
66 CHARACTER*(NLEN) dn(CW_DIMS)
67 CHARACTER*(NLEN) d_cw_gname
68 CHARACTER*(NLEN) d_cw_gname0
69 CHARACTER*(NLEN) dn_blnk
70 _RS ztmp(Nr+Nrphys)
71 _RL stmp(Nr+Nrphys+1,nRegions+1)
72 #endif /* ALLOW_MNC */
73
74 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
75
76 #ifdef ALLOW_MNC
77
78 _BEGIN_MASTER( myThid)
79
80 stat_typ(1) = 'vol'
81 stat_typ(2) = 'ave'
82 stat_typ(3) = 'std'
83 stat_typ(4) = 'min'
84 stat_typ(5) = 'max'
85
86 #ifdef ALLOW_USE_MPI
87 IF ( diagSt_MNC .AND. mpiMyId.EQ.0 ) THEN
88 #else
89 IF ( diagSt_MNC ) THEN
90 #endif
91
92 DO i = 1,MAX_LEN_FNAM
93 diag_mnc_bn(i:i) = ' '
94 ENDDO
95 DO i = 1,NLEN
96 dn_blnk(i:i) = ' '
97 ENDDO
98 ilen = ILNBLNK(diagSt_Fname(listId))
99 WRITE(diag_mnc_bn, '(a)') diagSt_Fname(listId)(1:ilen)
100
101 IF (mId .EQ. 1) THEN
102 C Update the record dimension by writing the iteration number
103 CALL MNC_CW_SET_UDIM(diag_mnc_bn, -1, myThid)
104 CALL MNC_CW_RL_W_S('D',diag_mnc_bn,0,0,'T',myTime,myThid)
105 CALL MNC_CW_SET_UDIM(diag_mnc_bn, 0, myThid)
106 ENDIF
107
108 #ifdef DIAGST_MNC_NEEDSWORK
109 C This is turned off for the time being but it should eventually
110 C be re-worked and turned on so that coordinate dimensions are
111 C supplied along with the data. Unfortunately, the current
112 C diagnostics system has **NO** way of telling us whether a
113 C quantity is defined on a typical vertical grid (eg. the dynamics
114 C grid), a gridalt--style grid, or a single-level field that has
115 C no specified vertical location.
116
117 dn(1)(1:NLEN) = dn_blnk(1:NLEN)
118 WRITE(dn(1),'(a,i6.6)') 'Zmd', kdiag(ndId)
119 dim(1) = kdiag(ndId)
120 ib(1) = 1
121 ie(1) = kdiag(ndId)
122
123 CALL MNC_CW_ADD_GNAME('diag_levels', 1,
124 & dim, dn, ib, ie, myThid)
125 CALL MNC_CW_ADD_VNAME('diag_levels', 'diag_levels',
126 & 0,0, myThid)
127 CALL MNC_CW_ADD_VATTR_TEXT('diag_levels','description',
128 & 'Idicies of vertical levels within the source arrays',
129 & myThid)
130
131 CALL MNC_CW_RL_W('D',diag_mnc_bn,0,0,
132 & 'diag_levels', levs(1,listId), myThid)
133
134 CALL MNC_CW_DEL_VNAME('diag_levels', myThid)
135 CALL MNC_CW_DEL_GNAME('diag_levels', myThid)
136
137 C Now define: Zmdxxxxxx, Zudxxxxxx, Zldxxxxxx
138 ctmp(1:5) = 'mul '
139 DO i = 1,3
140 dn(1)(1:NLEN) = dn_blnk(1:NLEN)
141 WRITE(dn(1),'(3a,i6.6)') 'Z',ctmp(i:i),'d',nlevels(listId)
142 CALL MNC_CW_ADD_GNAME(dn(1), 1, dim, dn, ib, ie, myThid)
143 CALL MNC_CW_ADD_VNAME(dn(1), dn(1), 0,0, myThid)
144
145 C The following three ztmp() loops should eventually be modified
146 C to reflect the fractional nature of levs(j,l) -- they should
147 C do something like:
148 C ztmp(j) = rC(INT(FLOOR(levs(j,l))))
149 C + ( rC(INT(FLOOR(levs(j,l))))
150 C + rC(INT(CEIL(levs(j,l)))) )
151 C / ( levs(j,l) - FLOOR(levs(j,l)) )
152 C for averaged levels.
153 IF (i .EQ. 1) THEN
154 DO j = 1,nlevels(listId)
155 ztmp(j) = rC(NINT(levs(j,listId)))
156 ENDDO
157 CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
158 & 'Dimensional coordinate value at the mid point',
159 & myThid)
160 ELSEIF (i .EQ. 2) THEN
161 DO j = 1,nlevels(listId)
162 ztmp(j) = rF(NINT(levs(j,listId)) + 1)
163 ENDDO
164 CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
165 & 'Dimensional coordinate value at the upper point',
166 & myThid)
167 ELSEIF (i .EQ. 3) THEN
168 DO j = 1,nlevels(listId)
169 ztmp(j) = rF(NINT(levs(j,listId)))
170 ENDDO
171 CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
172 & 'Dimensional coordinate value at the lower point',
173 & myThid)
174 ENDIF
175 CALL MNC_CW_RS_W('D',diag_mnc_bn,0,0, dn(1), ztmp, myThid)
176 CALL MNC_CW_DEL_VNAME(dn(1), myThid)
177 CALL MNC_CW_DEL_GNAME(dn(1), myThid)
178 ENDDO
179 #endif /* DIAGST_MNC_NEEDSWORK */
180
181 DO ii = 1,CW_DIMS
182 d_cw_gname(1:NLEN) = dn_blnk(1:NLEN)
183 dn(ii)(1:NLEN) = dn_blnk(1:NLEN)
184 ENDDO
185
186 C Z is special since it varies
187 WRITE(dn(1),'(a,i6.6)') 'Zd', nlevels(listId)
188 IF ( (gdiag(ndId)(10:10) .EQ. 'R')
189 & .AND. (gdiag(ndId)(9:9) .EQ. 'M') ) THEN
190 WRITE(dn(1),'(a,i6.6)') 'Zmd', nlevels(listId)
191 ENDIF
192 IF ( (gdiag(ndId)(10:10) .EQ. 'R')
193 & .AND. (gdiag(ndId)(9:9) .EQ. 'L') ) THEN
194 WRITE(dn(1),'(a,i6.6)') 'Zld', nlevels(listId)
195 ENDIF
196 IF ( (gdiag(ndId)(10:10) .EQ. 'R')
197 & .AND. (gdiag(ndId)(9:9) .EQ. 'U') ) THEN
198 WRITE(dn(1),'(a,i6.6)') 'Zud', nlevels(listId)
199 ENDIF
200 dim(1) = Nr+Nrphys+1
201 ib(1) = 1
202 ie(1) = kdiag(ndId)
203
204 C "region" dimension
205 dim(2) = nRegions + 1
206 ib(2) = 1
207 dn(2)(1:6) = 'region'
208 ie(2) = nRegions + 1
209
210 C Time dimension
211 dn(3)(1:1) = 'T'
212 dim(3) = -1
213 ib(3) = 1
214 ie(3) = 1
215
216 C Note that the "d_cw_gname" variable is a hack that hides a
217 C subtlety within MNC. Basically, each MNC-wrapped file is
218 C caching its own concept of what each "grid name" (that is, a
219 C dimension group name) means. So one cannot re-use the same
220 C "grid" name for different collections of dimensions within a
221 C given file. By appending the "ndId" values to each name, we
222 C guarantee uniqueness within each MNC-produced file.
223
224 WRITE(d_cw_gname,'(a7,i6.6)') 'dst_cw_', ndId
225 CALL MNC_CW_ADD_GNAME(d_cw_gname, 3,
226 & dim, dn, ib, ie, myThid)
227
228 WRITE(dn(1),'(a3)') 'Zd0'
229 ie(1) = 1
230 WRITE(d_cw_gname0,'(a9,i6.6)') 'dst_cw_0_', ndId
231 CALL MNC_CW_ADD_GNAME(d_cw_gname0, 3,
232 & dim, dn, ib, ie, myThid)
233
234 DO ist = 0,nStats
235
236 DO i = 1,MAX_LEN_FNAM
237 tnam(i:i) = ' '
238 ENDDO
239 ilen = ILNBLNK(cdiag(ndId))
240 WRITE(tnam,'(a,a4,a3)')
241 & cdiag(ndId)(1:ilen),'_lv_',stat_typ(ist+1)
242
243 CALL MNC_CW_ADD_VNAME(tnam, d_cw_gname,
244 & 0,0, myThid)
245 CALL MNC_CW_ADD_VATTR_TEXT(tnam,'description',
246 & tdiag(ndId),myThid)
247 CALL MNC_CW_ADD_VATTR_TEXT(tnam,'units',
248 & udiag(ndId),myThid)
249
250 C Copy the data into a temporary with the necessary shape
251 DO j = 0,nRegions
252 DO k = 1,kdiag(ndId)
253 stmp(k,j+1) = statGlob(ist,k,j)
254 ENDDO
255 ENDDO
256
257 IF ((fflags(listId)(1:1) .EQ. ' ')
258 & .OR. (fflags(listId)(1:1) .EQ. 'R')) THEN
259
260 CALL MNC_CW_RL_W('R',diag_mnc_bn,0,0,
261 & tnam, stmp, myThid)
262
263 ELSEIF (fflags(listId)(1:1) .EQ. 'D') THEN
264
265 CALL MNC_CW_RL_W('D',diag_mnc_bn,0,0,
266 & tnam, stmp, myThid)
267
268 ENDIF
269
270 CALL MNC_CW_DEL_VNAME(tnam, myThid)
271
272 IF ( kdiag(ndId) .GT. 1 ) THEN
273
274 ilen = ILNBLNK(cdiag(ndId))
275 WRITE(tnam,'(a,a4,a3)')
276 & cdiag(ndId)(1:ilen),'_vi_',stat_typ(ist+1)
277
278 CALL MNC_CW_ADD_VNAME(tnam, d_cw_gname0,
279 & 0,0, myThid)
280 CALL MNC_CW_ADD_VATTR_TEXT(tnam,'description',
281 & tdiag(ndId),myThid)
282 CALL MNC_CW_ADD_VATTR_TEXT(tnam,'units',
283 & udiag(ndId),myThid)
284
285 C Copy the data into a temporary with the necessary shape
286 DO j = 0,nRegions
287 stmp(1,j+1) = statGlob(ist,0,j)
288 ENDDO
289
290 IF ((fflags(listId)(1:1) .EQ. ' ')
291 & .OR. (fflags(listId)(1:1) .EQ. 'R')) THEN
292
293 CALL MNC_CW_RL_W('R',diag_mnc_bn,0,0,
294 & tnam, stmp, myThid)
295
296 ELSEIF (fflags(listId)(1:1) .EQ. 'D') THEN
297
298 CALL MNC_CW_RL_W('D',diag_mnc_bn,0,0,
299 & tnam, stmp, myThid)
300
301 ENDIF
302
303 CALL MNC_CW_DEL_VNAME(tnam, myThid)
304
305 ENDIF
306
307 ENDDO
308
309 CALL MNC_CW_DEL_GNAME(d_cw_gname, myThid)
310 CALL MNC_CW_DEL_GNAME(d_cw_gname0, myThid)
311
312 ENDIF
313
314 _END_MASTER( myThid )
315
316 #endif /* ALLOW_MNC */
317
318 RETURN
319 END
320 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

  ViewVC Help
Powered by ViewVC 1.1.22