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

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

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


Revision 1.2 - (show annotations) (download)
Sun Jun 12 13:58:33 2011 UTC (12 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62z
Changes since 1.1: +3 -10 lines
fix previous modif

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_mnc_out.F,v 1.1 2011/06/11 23:29:44 jmc Exp $
2 C $Name: $
3
4 #include "DIAG_OPTIONS.h"
5 #undef DIAG_MNC_COORD_NEEDSWORK
6
7 C-- File diagnostics_mnc_out.F: Routines to write MNC diagnostics output
8 C-- Contents:
9 C-- o DIAGNOSTICS_MNC_SET
10 C-- o DIAGNOSTICS_MNC_OUT
11
12 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
13 CBOP 0
14 C !ROUTINE: DIAGNOSTICS_MNC_SET
15
16 C !INTERFACE:
17 SUBROUTINE DIAGNOSTICS_MNC_SET(
18 I nLevOutp, listId, lm,
19 O diag_mnc_bn, useMissingValue,
20 I misValLoc, myTime, myIter, myThid )
21
22 C !DESCRIPTION:
23 C Set MNC file for writing diagnostics fields.
24
25 C !USES:
26 IMPLICIT NONE
27 #include "SIZE.h"
28 #include "EEPARAMS.h"
29 #include "PARAMS.h"
30 #include "GRID.h"
31 #include "DIAGNOSTICS_SIZE.h"
32 #include "DIAGNOSTICS.h"
33
34
35 C !INPUT PARAMETERS:
36 C nLevOutp :: number of levels to write in output file
37 C listId :: Diagnostics list number being written
38 C lm :: loop index (averageCycle)
39 C myIter :: current iteration number
40 C myTime :: current time of simulation (s)
41 C myThid :: my Thread Id number
42 INTEGER nLevOutp
43 INTEGER listId, lm
44 CHARACTER*(MAX_LEN_FNAM) diag_mnc_bn
45 LOGICAL useMissingValue
46 REAL*8 misValLoc
47 _RL myTime
48 INTEGER myIter, myThid
49 CEOP
50
51 #ifdef ALLOW_MNC
52 C !FUNCTIONS:
53 INTEGER ILNBLNK
54 EXTERNAL ILNBLNK
55
56 C !LOCAL VARIABLES:
57 INTEGER NrMax
58 PARAMETER( NrMax = numLevels )
59
60 _RL tmpLev
61 INTEGER iLen
62
63 c CHARACTER*(MAX_LEN_MBUF) msgBuf
64 INTEGER ii, klev
65 INTEGER CW_DIMS, NLEN
66 PARAMETER ( CW_DIMS = 10 )
67 PARAMETER ( NLEN = 80 )
68 INTEGER dim(CW_DIMS), ib(CW_DIMS), ie(CW_DIMS)
69 CHARACTER*(NLEN) dn(CW_DIMS)
70 c CHARACTER*(NLEN) d_cw_name
71 c CHARACTER*(NLEN) dn_blnk
72 #ifdef DIAG_MNC_COORD_NEEDSWORK
73 INTEGER i, j
74 CHARACTER*(5) ctmp
75 _RS ztmp(NrMax)
76 #endif
77 INTEGER misvalIntLoc
78 REAL*8 misval_r8(2)
79 REAL*4 misval_r4(2)
80 INTEGER misval_int(2)
81
82 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
83 c IF (useMNC .AND. diag_mnc) THEN
84
85 C Handle missing value attribute (land points)
86 useMissingValue = .FALSE.
87 #ifdef DIAGNOSTICS_MISSING_VALUE
88 useMissingValue = .TRUE.
89 #endif /* DIAGNOSTICS_MISSING_VALUE */
90 C Defaults to UNSET_I
91 misvalIntLoc = misvalInt(listId)
92 DO ii=1,2
93 misval_r4(ii) = misValLoc
94 misval_r8(ii) = misValLoc
95 misval_int(ii) = UNSET_I
96 ENDDO
97 c DO i = 1,MAX_LEN_FNAM
98 c diag_mnc_bn(i:i) = ' '
99 c ENDDO
100 c DO i = 1,NLEN
101 c dn_blnk(i:i) = ' '
102 c ENDDO
103 iLen = ILNBLNK(fnames(listId))
104 WRITE( diag_mnc_bn, '(A)' ) fnames(listId)(1:iLen)
105
106 C Update the record dimension by writing the iteration number
107 klev = myIter + lm - averageCycle(listId)
108 tmpLev = myTime + deltaTClock*( lm - averageCycle(listId) )
109 CALL MNC_CW_SET_UDIM(diag_mnc_bn, -1, myThid)
110 CALL MNC_CW_RL_W_S('D',diag_mnc_bn,0,0,'T',tmpLev,myThid)
111 CALL MNC_CW_SET_UDIM(diag_mnc_bn, 0, myThid)
112 CALL MNC_CW_I_W_S('I',diag_mnc_bn,0,0,'iter',klev,myThid)
113
114 C NOTE: at some point it would be a good idea to add a time_bounds
115 C variable that has dimension (2,T) and clearly denotes the
116 C beginning and ending times for each diagnostics period
117
118 c dn(1)(1:NLEN) = dn_blnk(1:NLEN)
119 WRITE(dn(1),'(a,i6.6)') 'Zmd', nLevOutp
120 dim(1) = nLevOutp
121 ib(1) = 1
122 ie(1) = nLevOutp
123
124 CALL MNC_CW_ADD_GNAME('diag_levels', 1,
125 & dim, dn, ib, ie, myThid)
126 CALL MNC_CW_ADD_VNAME('diag_levels', 'diag_levels',
127 & 0,0, myThid)
128 CALL MNC_CW_ADD_VATTR_TEXT('diag_levels','description',
129 & 'Idicies of vertical levels within the source arrays',
130 & myThid)
131 C suppress the missing value attribute (iflag = 0)
132 IF (useMissingValue)
133 & CALL MNC_CW_VATTR_MISSING('diag_levels', 0,
134 I misval_r8, misval_r4, misval_int, myThid )
135
136 CALL MNC_CW_RL_W('D',diag_mnc_bn,0,0,
137 & 'diag_levels', levs(1,listId), myThid)
138
139 CALL MNC_CW_DEL_VNAME('diag_levels', myThid)
140 CALL MNC_CW_DEL_GNAME('diag_levels', myThid)
141
142 #ifdef DIAG_MNC_COORD_NEEDSWORK
143 C This part has been placed in an #ifdef because, as its currently
144 C written, it will only work with variables defined on a dynamics
145 C grid. As we start using diagnostics for physics grids, ice
146 C levels, land levels, etc. the different vertical coordinate
147 C dimensions will have to be taken into account.
148
149 C 20051021 JMC & EH3 : We need to extend this so that a few
150 C variables each defined on different grids do not have the same
151 C vertical dimension names so we should be using a pattern such
152 C as: Z[uml]td000000 where the 't' is the type as specified by
153 C gdiag(10)
154
155 C Now define: Zmdxxxxxx, Zudxxxxxx, Zldxxxxxx
156 ctmp(1:5) = 'mul '
157 DO i = 1,3
158 c dn(1)(1:NLEN) = dn_blnk(1:NLEN)
159 WRITE(dn(1),'(3a,i6.6)') 'Z',ctmp(i:i),'d',nlevels(listId)
160 CALL MNC_CW_ADD_GNAME(dn(1), 1, dim, dn, ib, ie, myThid)
161 CALL MNC_CW_ADD_VNAME(dn(1), dn(1), 0,0, myThid)
162
163 C The following three ztmp() loops should eventually be modified
164 C to reflect the fractional nature of levs(j,l) -- they should
165 C do something like:
166 C ztmp(j) = rC(INT(FLOOR(levs(j,l))))
167 C + ( rC(INT(FLOOR(levs(j,l))))
168 C + rC(INT(CEIL(levs(j,l)))) )
169 C / ( levs(j,l) - FLOOR(levs(j,l)) )
170 C for averaged levels.
171 IF (i .EQ. 1) THEN
172 DO j = 1,nlevels(listId)
173 ztmp(j) = rC(NINT(levs(j,listId)))
174 ENDDO
175 CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
176 & 'Dimensional coordinate value at the mid point',
177 & myThid)
178 ELSEIF (i .EQ. 2) THEN
179 DO j = 1,nlevels(listId)
180 ztmp(j) = rF(NINT(levs(j,listId)) + 1)
181 ENDDO
182 CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
183 & 'Dimensional coordinate value at the upper point',
184 & myThid)
185 ELSEIF (i .EQ. 3) THEN
186 DO j = 1,nlevels(listId)
187 ztmp(j) = rF(NINT(levs(j,listId)))
188 ENDDO
189 CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
190 & 'Dimensional coordinate value at the lower point',
191 & myThid)
192 ENDIF
193 C suppress the missing value attribute (iflag = 0)
194 IF (useMissingValue)
195 & CALL MNC_CW_VATTR_MISSING(dn(1), 0,
196 I misval_r8, misval_r4, misval_int, myThid )
197 CALL MNC_CW_RS_W('D',diag_mnc_bn,0,0, dn(1), ztmp, myThid)
198 CALL MNC_CW_DEL_VNAME(dn(1), myThid)
199 CALL MNC_CW_DEL_GNAME(dn(1), myThid)
200 ENDDO
201 #endif /* DIAG_MNC_COORD_NEEDSWORK */
202
203 c ENDIF
204 #endif /* ALLOW_MNC */
205
206 RETURN
207 END
208
209 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
210 CBOP 0
211 C !ROUTINE: DIAGNOSTICS_MNC_OUT
212
213 C !INTERFACE:
214 SUBROUTINE DIAGNOSTICS_MNC_OUT(
215 I NrMax, nLevOutp, listId, ndId,
216 I diag_mnc_bn,
217 I useMissingValue, misValLoc,
218 I qtmp,
219 I myTime, myIter, myThid )
220
221 C !DESCRIPTION:
222 C write diagnostics fields to MNC file.
223
224 C !USES:
225 IMPLICIT NONE
226 #include "SIZE.h"
227 #include "EEPARAMS.h"
228 #include "PARAMS.h"
229 #include "GRID.h"
230 #include "DIAGNOSTICS_SIZE.h"
231 #include "DIAGNOSTICS.h"
232
233 C !INPUT PARAMETERS:
234 C nLevOutp :: number of levels to write in output file
235 C listId :: Diagnostics list number being written
236 C ndId :: diagnostics Id number (in available diagnostics list)
237 C myTime :: current time of simulation (s)
238 C myIter :: current iteration number
239 C myThid :: my Thread Id number
240 INTEGER NrMax
241 INTEGER nLevOutp
242 INTEGER listId
243 INTEGER ndId
244 CHARACTER*(MAX_LEN_FNAM) diag_mnc_bn
245 LOGICAL useMissingValue
246 REAL*8 misValLoc
247 _RL qtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy,NrMax,nSx,nSy)
248 _RL myTime
249 INTEGER myIter, myThid
250 CEOP
251
252 C !FUNCTIONS:
253 c INTEGER ILNBLNK
254 c EXTERNAL ILNBLNK
255
256 C !LOCAL VARIABLES:
257 C i,j,k :: loop indices
258 C bi,bj :: tile indices
259 INTEGER i, j, k
260 INTEGER bi, bj
261
262 c CHARACTER*(MAX_LEN_MBUF) msgBuf
263 #ifdef ALLOW_MNC
264 c INTEGER ll, llMx, jj, jjMx
265 INTEGER ii, klev
266 INTEGER CW_DIMS, NLEN
267 PARAMETER ( CW_DIMS = 10 )
268 PARAMETER ( NLEN = 80 )
269 INTEGER dim(CW_DIMS), ib(CW_DIMS), ie(CW_DIMS)
270 CHARACTER*(NLEN) dn(CW_DIMS)
271 CHARACTER*(NLEN) d_cw_name
272 c CHARACTER*(NLEN) dn_blnk
273 LOGICAL useMisValForThisDiag
274 REAL*8 misval_r8(2)
275 REAL*4 misval_r4(2)
276 INTEGER misval_int(2)
277
278 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
279 c IF (useMNC .AND. diag_mnc) THEN
280
281 _BEGIN_MASTER( myThid )
282
283 DO ii = 1,CW_DIMS
284 c d_cw_name(1:NLEN) = dn_blnk(1:NLEN)
285 c dn(ii)(1:NLEN) = dn_blnk(1:NLEN)
286 dn(ii) = ' '
287 ENDDO
288 DO ii=1,2
289 misval_r4(ii) = misValLoc
290 misval_r8(ii) = misValLoc
291 misval_int(ii) = UNSET_I
292 ENDDO
293
294 C Note that the "d_cw_name" variable is a hack that hides a
295 C subtlety within MNC. Basically, each MNC-wrapped file is
296 C caching its own concept of what each "grid name" (that is, a
297 C dimension group name) means. So one cannot re-use the same
298 C "grid" name for different collections of dimensions within a
299 C given file. By appending the "ndId" values to each name, we
300 C guarantee uniqueness within each MNC-produced file.
301 WRITE(d_cw_name,'(a,i6.6)') 'd_cw_',ndId
302
303 C XY dimensions
304 dim(1) = sNx + 2*OLx
305 dim(2) = sNy + 2*OLy
306 ib(1) = OLx + 1
307 ib(2) = OLy + 1
308 IF (gdiag(ndId)(2:2) .EQ. 'M') THEN
309 dn(1)(1:2) = 'X'
310 ie(1) = OLx + sNx
311 dn(2)(1:2) = 'Y'
312 ie(2) = OLy + sNy
313 ELSEIF (gdiag(ndId)(2:2) .EQ. 'U') THEN
314 dn(1)(1:3) = 'Xp1'
315 ie(1) = OLx + sNx + 1
316 dn(2)(1:2) = 'Y'
317 ie(2) = OLy + sNy
318 ELSEIF (gdiag(ndId)(2:2) .EQ. 'V') THEN
319 dn(1)(1:2) = 'X'
320 ie(1) = OLx + sNx
321 dn(2)(1:3) = 'Yp1'
322 ie(2) = OLy + sNy + 1
323 ELSEIF (gdiag(ndId)(2:2) .EQ. 'Z') THEN
324 dn(1)(1:3) = 'Xp1'
325 ie(1) = OLx + sNx + 1
326 dn(2)(1:3) = 'Yp1'
327 ie(2) = OLy + sNy + 1
328 ENDIF
329
330 C Z is special since it varies
331 WRITE(dn(3),'(a,i6.6)') 'Zd', nLevOutp
332 IF ( (gdiag(ndId)(10:10) .EQ. 'R')
333 & .AND. (gdiag(ndId)(9:9) .EQ. 'M') ) THEN
334 WRITE(dn(3),'(a,i6.6)') 'Zmd', nLevOutp
335 ENDIF
336 IF ( (gdiag(ndId)(10:10) .EQ. 'R')
337 & .AND. (gdiag(ndId)(9:9) .EQ. 'L') ) THEN
338 WRITE(dn(3),'(a,i6.6)') 'Zld', nLevOutp
339 ENDIF
340 IF ( (gdiag(ndId)(10:10) .EQ. 'R')
341 & .AND. (gdiag(ndId)(9:9) .EQ. 'U') ) THEN
342 WRITE(dn(3),'(a,i6.6)') 'Zud', nLevOutp
343 ENDIF
344 dim(3) = NrMax
345 ib(3) = 1
346 ie(3) = nLevOutp
347
348 C Time dimension
349 dn(4)(1:1) = 'T'
350 dim(4) = -1
351 ib(4) = 1
352 ie(4) = 1
353
354 CALL MNC_CW_ADD_GNAME( d_cw_name, 4,
355 & dim, dn, ib, ie, myThid )
356 CALL MNC_CW_ADD_VNAME( cdiag(ndId), d_cw_name,
357 & 4, 5, myThid )
358 CALL MNC_CW_ADD_VATTR_TEXT( cdiag(ndId),'description',
359 & tdiag(ndId), myThid )
360 CALL MNC_CW_ADD_VATTR_TEXT( cdiag(ndId),'units',
361 & udiag(ndId), myThid )
362
363 C Missing values only for scalar diagnostics at mass points (so far)
364 useMisValForThisDiag = useMissingValue
365 & .AND.gdiag(ndId)(1:2).EQ.'SM'
366 IF ( useMisValForThisDiag ) THEN
367 C assign missing values and set flag for adding the netCDF atttibute
368 CALL MNC_CW_VATTR_MISSING(cdiag(ndId), 2,
369 I misval_r8, misval_r4, misval_int, myThid )
370 C and now use the missing values for masking out the land points
371 C note: better to use 2-D mask if kdiag <> Nr or vert.integral
372 DO bj = myByLo(myThid), myByHi(myThid)
373 DO bi = myBxLo(myThid), myBxHi(myThid)
374 DO k = 1,nLevOutp
375 klev = NINT(levs(k,listId))
376 IF ( fflags(listId)(2:2).EQ.'I' ) kLev = 1
377 DO j = 1-OLy,sNy+OLy
378 DO i = 1-OLx,sNx+OLx
379 IF ( maskC(i,j,klev,bi,bj) .EQ. 0. )
380 & qtmp(i,j,k,bi,bj) = misValLoc
381 ENDDO
382 ENDDO
383 ENDDO
384 ENDDO
385 ENDDO
386 ELSE
387 C suppress the missing value attribute (iflag = 0)
388 C Note: We have to call the following subroutine for each mnc that has
389 C been created "on the fly" by mnc_cw_add_vname and will be deleted
390 C by mnc_cw_del_vname, because all of these variables use the same
391 C identifier so that mnc_cw_vfmv(indv) needs to be overwritten for
392 C each of these variables
393 CALL MNC_CW_VATTR_MISSING( cdiag(ndId), 0,
394 I misval_r8, misval_r4, misval_int, myThid )
395 ENDIF
396
397 IF ( ((writeBinaryPrec .EQ. precFloat32).AND.
398 & (fflags(listId)(1:1) .NE. 'D'))
399 & .OR. (fflags(listId)(1:1) .EQ. 'R') ) THEN
400 CALL MNC_CW_RL_W( 'R',diag_mnc_bn,0,0,
401 & cdiag(ndId), qtmp, myThid)
402 ELSEIF ( (writeBinaryPrec .EQ. precFloat64)
403 & .OR. (fflags(listId)(1:1) .EQ. 'D') ) THEN
404 CALL MNC_CW_RL_W( 'D',diag_mnc_bn,0,0,
405 & cdiag(ndId), qtmp, myThid)
406 ENDIF
407
408 CALL MNC_CW_DEL_VNAME(cdiag(ndId), myThid)
409 CALL MNC_CW_DEL_GNAME(d_cw_name, myThid)
410
411 _END_MASTER( myThid )
412
413 c ENDIF
414 #endif /* ALLOW_MNC */
415
416 RETURN
417 END

  ViewVC Help
Powered by ViewVC 1.1.22