/[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.46 - (show annotations) (download)
Fri Jan 8 19:19:44 2010 UTC (14 years, 4 months ago) by jmc
Branch: MAIN
Changes since 1.45: +9 -2 lines
fix previous modif for some unlikely case (negative time)

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_out.F,v 1.45 2010/01/07 23:48:01 jmc 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 listId,
13 I myIter,
14 I myTime,
15 I myThid )
16
17 C !DESCRIPTION:
18 C Write output for diagnostics fields.
19
20 C !USES:
21 IMPLICIT NONE
22 #include "SIZE.h"
23 #include "EEPARAMS.h"
24 #include "PARAMS.h"
25 #include "GRID.h"
26 #include "DIAGNOSTICS_SIZE.h"
27 #include "DIAGNOSTICS.h"
28
29 INTEGER NrMax
30 PARAMETER( NrMax = numLevels )
31
32 C !INPUT PARAMETERS:
33 C listId :: Diagnostics list number being written
34 C myIter :: current iteration number
35 C myTime :: current time of simulation (s)
36 C myThid :: my Thread Id number
37 _RL myTime
38 INTEGER listId, myIter, myThid
39 CEOP
40
41 C !FUNCTIONS:
42 INTEGER ILNBLNK
43 EXTERNAL ILNBLNK
44 #ifdef ALLOW_FIZHI
45 _RL getcon
46 EXTERNAL getcon
47 #endif
48
49 C !LOCAL VARIABLES:
50 C i,j,k :: loop indices
51 C lm :: loop index (averageCycle)
52 C md :: field number in the list "listId".
53 C ndId :: diagnostics Id number (in available diagnostics list)
54 C mate :: counter mate Id number (in available diagnostics list)
55 C ip :: diagnostics pointer to storage array
56 C im :: counter-mate pointer to storage array
57 C
58 C-- COMMON /LOCAL_DIAGNOSTICS_OUT/ local common block (for multi-threaded)
59 C qtmp1 :: thread-shared temporary array (needs to be in common block):
60 C to write a diagnostic field to file, copy it first from (big)
61 C diagnostic storage qdiag into it.
62 COMMON /LOCAL_DIAGNOSTICS_OUT/ qtmp1
63 _RL qtmp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,NrMax,nSx,nSy)
64
65 INTEGER i, j, k, lm
66 INTEGER bi, bj
67 INTEGER md, ndId, ip, im
68 INTEGER mate, mVec
69 CHARACTER*10 gcode
70 _RL undef
71 _RL tmpLev
72 INTEGER ilen
73
74 INTEGER ioUnit
75 CHARACTER*(MAX_LEN_FNAM) fn
76 CHARACTER*(MAX_LEN_MBUF) suff
77 CHARACTER*(MAX_LEN_MBUF) msgBuf
78 INTEGER prec, nRec, nTimRec
79 _RL timeRec(2)
80 #ifdef ALLOW_MDSIO
81 LOGICAL glf
82 #endif
83 #ifdef ALLOW_MNC
84 INTEGER ll, llMx, jj, jjMx
85 INTEGER ii, klev
86 CHARACTER*(MAX_LEN_FNAM) diag_mnc_bn
87 INTEGER CW_DIMS, NLEN
88 PARAMETER ( CW_DIMS = 10 )
89 PARAMETER ( NLEN = 80 )
90 INTEGER dim(CW_DIMS), ib(CW_DIMS), ie(CW_DIMS)
91 CHARACTER*(NLEN) dn(CW_DIMS)
92 CHARACTER*(NLEN) d_cw_name
93 CHARACTER*(NLEN) dn_blnk
94 #ifdef DIAG_MNC_COORD_NEEDSWORK
95 CHARACTER*(5) ctmp
96 _RS ztmp(NrMax)
97 #endif
98 LOGICAL useMissingValue, useMisValForThisDiag
99 REAL*8 misvalLoc
100 REAL*8 misval_r8(2)
101 REAL*4 misval_r4(2)
102 INTEGER misvalIntLoc, misval_int(2)
103 #endif /* ALLOW_MNC */
104
105 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
106
107 C--- set file properties
108 ioUnit= standardMessageUnit
109 undef = UNSET_RL
110 #ifdef ALLOW_FIZHI
111 c IF ( useFIZHI ) undef = getcon('UNDEF')
112 undef = getcon('UNDEF')
113 #endif
114 WRITE(suff,'(I10.10)') myIter
115 ilen = ILNBLNK(fnames(listId))
116 WRITE( fn, '(A,A,A)' ) fnames(listId)(1:ilen),'.',suff(1:10)
117
118 C-- Set time information:
119 IF ( freq(listId).LT.0. ) THEN
120 C- Snap-shot: store a unique time (which is consistent with State-Var timing)
121 nTimRec = 1
122 timeRec(1) = myTime
123 ELSE
124 C- Time-average: store the 2 edges of the time-averaging interval.
125 C this time is consitent with intermediate Var (i.e., non-state, e.g, flux,
126 C tendencies) timing. For State-Var, this is shifted by + halt time-step.
127 nTimRec = 2
128
129 C- end of time-averaging interval:
130 timeRec(2) = myTime
131
132 C- begining of time-averaging interval:
133 c timeRec(1) = myTime - freq(listId)
134 C a) find the time of the previous multiple of output freq:
135 timeRec(1) = myTime-deltaTClock*0.5 _d 0
136 timeRec(1) = (timeRec(1)-phase(listId))/freq(listId)
137 i = INT( timeRec(1) )
138 IF ( timeRec(1).LT.0. ) THEN
139 tmpLev = FLOAT(i)
140 IF ( timeRec(1).NE.tmpLev ) i = i - 1
141 ENDIF
142 timeRec(1) = phase(listId) + freq(listId)*FLOAT(i)
143 c if ( listId.eq.2 ) write(0,*) 'f',i,timeRec(1)/deltaTClock
144 timeRec(1) = MAX( timeRec(1), startTime )
145
146 C b) round off to nearest multiple of time-step:
147 timeRec(1) = (timeRec(1)-baseTime)/deltaTClock
148 i = NINT( timeRec(1) )
149 C if just half way, NINT will return the next time-step: correct this
150 tmpLev = FLOAT(i) - 0.5 _d 0
151 IF ( timeRec(1).EQ.tmpLev ) i = i - 1
152 timeRec(1) = baseTime + deltaTClock*FLOAT(i)
153 c if ( listId.eq.2 ) write(0,*) i,timeRec(1)/deltaTClock
154 ENDIF
155 C-- Convert time to iteration number (debug)
156 c DO i=1,nTimRec
157 c timeRec(i) = timeRec(i)/deltaTClock
158 c ENDDO
159
160 #ifdef ALLOW_MNC
161 C-- this is a trick to reverse the order of the loops on md (= field)
162 C and lm (= averagePeriod): binary output: lm loop inside md loop ;
163 C mnc ouput: md loop inside lm loop.
164 IF (useMNC .AND. diag_mnc) THEN
165 jjMx = averageCycle(listId)
166 llMx = 1
167 ELSE
168 jjMx = 1
169 llMx = averageCycle(listId)
170 ENDIF
171 DO jj=1,jjMx
172
173 IF (useMNC .AND. diag_mnc) THEN
174 C Handle missing value attribute (land points)
175 useMissingValue = .FALSE.
176 #ifdef DIAGNOSTICS_MISSING_VALUE
177 useMissingValue = .TRUE.
178 #endif /* DIAGNOSTICS_MISSING_VALUE */
179 IF ( misvalFlt(listId) .NE. UNSET_RL ) THEN
180 misvalLoc = misvalFlt(listId)
181 ELSE
182 misvalLoc = undef
183 ENDIF
184 C Defaults to UNSET_I
185 misvalIntLoc = misvalInt(listId)
186 DO ii=1,2
187 C misval_r4(ii) = UNSET_FLOAT4
188 C misval_r8(ii) = UNSET_FLOAT8
189 misval_r4(ii) = misvalLoc
190 misval_r8(ii) = misvalLoc
191 misval_int(ii) = UNSET_I
192 ENDDO
193 DO i = 1,MAX_LEN_FNAM
194 diag_mnc_bn(i:i) = ' '
195 ENDDO
196 DO i = 1,NLEN
197 dn_blnk(i:i) = ' '
198 ENDDO
199 WRITE( diag_mnc_bn, '(A)' ) fnames(listId)(1:ilen)
200
201 C Update the record dimension by writing the iteration number
202 klev = myIter + jj - jjMx
203 tmpLev = myTime + deltaTClock*(jj -jjMx)
204 CALL MNC_CW_SET_UDIM(diag_mnc_bn, -1, myThid)
205 CALL MNC_CW_RL_W_S('D',diag_mnc_bn,0,0,'T',tmpLev,myThid)
206 CALL MNC_CW_SET_UDIM(diag_mnc_bn, 0, myThid)
207 CALL MNC_CW_I_W_S('I',diag_mnc_bn,0,0,'iter',klev,myThid)
208
209 C NOTE: at some point it would be a good idea to add a time_bounds
210 C variable that has dimension (2,T) and clearly denotes the
211 C beginning and ending times for each diagnostics period
212
213 dn(1)(1:NLEN) = dn_blnk(1:NLEN)
214 WRITE(dn(1),'(a,i6.6)') 'Zmd', nlevels(listId)
215 dim(1) = nlevels(listId)
216 ib(1) = 1
217 ie(1) = nlevels(listId)
218
219 CALL MNC_CW_ADD_GNAME('diag_levels', 1,
220 & dim, dn, ib, ie, myThid)
221 CALL MNC_CW_ADD_VNAME('diag_levels', 'diag_levels',
222 & 0,0, myThid)
223 CALL MNC_CW_ADD_VATTR_TEXT('diag_levels','description',
224 & 'Idicies of vertical levels within the source arrays',
225 & myThid)
226 C suppress the missing value attribute (iflag = 0)
227 IF (useMissingValue)
228 & CALL MNC_CW_VATTR_MISSING('diag_levels', 0,
229 I misval_r8, misval_r4, misval_int,
230 I myThid )
231
232 CALL MNC_CW_RL_W('D',diag_mnc_bn,0,0,
233 & 'diag_levels', levs(1,listId), myThid)
234
235 CALL MNC_CW_DEL_VNAME('diag_levels', myThid)
236 CALL MNC_CW_DEL_GNAME('diag_levels', myThid)
237
238 #ifdef DIAG_MNC_COORD_NEEDSWORK
239 C This part has been placed in an #ifdef because, as its currently
240 C written, it will only work with variables defined on a dynamics
241 C grid. As we start using diagnostics for physics grids, ice
242 C levels, land levels, etc. the different vertical coordinate
243 C dimensions will have to be taken into account.
244
245 C 20051021 JMC & EH3 : We need to extend this so that a few
246 C variables each defined on different grids do not have the same
247 C vertical dimension names so we should be using a pattern such
248 C as: Z[uml]td000000 where the 't' is the type as specified by
249 C gdiag(10)
250
251 C Now define: Zmdxxxxxx, Zudxxxxxx, Zldxxxxxx
252 ctmp(1:5) = 'mul '
253 DO i = 1,3
254 dn(1)(1:NLEN) = dn_blnk(1:NLEN)
255 WRITE(dn(1),'(3a,i6.6)') 'Z',ctmp(i:i),'d',nlevels(listId)
256 CALL MNC_CW_ADD_GNAME(dn(1), 1, dim, dn, ib, ie, myThid)
257 CALL MNC_CW_ADD_VNAME(dn(1), dn(1), 0,0, myThid)
258
259 C The following three ztmp() loops should eventually be modified
260 C to reflect the fractional nature of levs(j,l) -- they should
261 C do something like:
262 C ztmp(j) = rC(INT(FLOOR(levs(j,l))))
263 C + ( rC(INT(FLOOR(levs(j,l))))
264 C + rC(INT(CEIL(levs(j,l)))) )
265 C / ( levs(j,l) - FLOOR(levs(j,l)) )
266 C for averaged levels.
267 IF (i .EQ. 1) THEN
268 DO j = 1,nlevels(listId)
269 ztmp(j) = rC(NINT(levs(j,listId)))
270 ENDDO
271 CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
272 & 'Dimensional coordinate value at the mid point',
273 & myThid)
274 ELSEIF (i .EQ. 2) THEN
275 DO j = 1,nlevels(listId)
276 ztmp(j) = rF(NINT(levs(j,listId)) + 1)
277 ENDDO
278 CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
279 & 'Dimensional coordinate value at the upper point',
280 & myThid)
281 ELSEIF (i .EQ. 3) THEN
282 DO j = 1,nlevels(listId)
283 ztmp(j) = rF(NINT(levs(j,listId)))
284 ENDDO
285 CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
286 & 'Dimensional coordinate value at the lower point',
287 & myThid)
288 ENDIF
289 C suppress the missing value attribute (iflag = 0)
290 IF (useMissingValue)
291 & CALL MNC_CW_VATTR_MISSING(dn(1), 0,
292 I misval_r8, misval_r4, misval_int,
293 I myThid )
294 CALL MNC_CW_RS_W('D',diag_mnc_bn,0,0, dn(1), ztmp, myThid)
295 CALL MNC_CW_DEL_VNAME(dn(1), myThid)
296 CALL MNC_CW_DEL_GNAME(dn(1), myThid)
297 ENDDO
298 #endif /* DIAG_MNC_COORD_NEEDSWORK */
299
300 ENDIF
301 #endif /* ALLOW_MNC */
302
303 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
304
305 DO md = 1,nfields(listId)
306 ndId = jdiag(md,listId)
307 gcode = gdiag(ndId)(1:10)
308 mate = 0
309 mVec = 0
310 IF ( gcode(5:5).EQ.'C' ) THEN
311 C- Check for Mate of a Counter Diagnostic
312 mate = hdiag(ndId)
313 ELSEIF ( gcode(1:1).EQ.'U' .OR. gcode(1:1).EQ.'V' ) THEN
314 C- Check for Mate of a Vector Diagnostic
315 mVec = hdiag(ndId)
316 ENDIF
317 IF ( idiag(md,listId).NE.0 .AND. gcode(5:5).NE.'D' ) THEN
318 C-- Start processing 1 Fld :
319 #ifdef ALLOW_MNC
320 DO ll=1,llMx
321 lm = jj+ll-1
322 #else
323 DO lm=1,averageCycle(listId)
324 #endif
325
326 ip = ABS(idiag(md,listId)) + kdiag(ndId)*(lm-1)
327 im = mdiag(md,listId)
328 IF (mate.GT.0) im = im + kdiag(mate)*(lm-1)
329 IF (mVec.GT.0) im = im + kdiag(mVec)*(lm-1)
330
331 IF ( ndiag(ip,1,1).EQ.0 ) THEN
332 C- Empty diagnostics case :
333
334 _BEGIN_MASTER( myThid )
335 WRITE(msgBuf,'(A,I10)')
336 & '- WARNING - from DIAGNOSTICS_OUT at iter=', myIter
337 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
338 & SQUEEZE_RIGHT, myThid)
339 WRITE(msgBuf,'(A,I6,3A,I4,2A)')
340 & '- WARNING - diag.#',ndId, ' : ',flds(md,listId),
341 & ' (#',md,' ) in outp.Stream: ',fnames(listId)
342 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
343 & SQUEEZE_RIGHT, myThid)
344 IF ( averageCycle(listId).GT.1 ) THEN
345 WRITE(msgBuf,'(A,2(I3,A))')
346 & '- WARNING - has not been filled (ndiag(lm=',lm,')=',
347 & ndiag(ip,1,1), ' )'
348 ELSE
349 WRITE(msgBuf,'(A,2(I3,A))')
350 & '- WARNING - has not been filled (ndiag=',
351 & ndiag(ip,1,1), ' )'
352 ENDIF
353 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
354 & SQUEEZE_RIGHT, myThid)
355 WRITE(msgBuf,'(A)')
356 & 'WARNING DIAGNOSTICS_OUT => write ZEROS instead'
357 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
358 & SQUEEZE_RIGHT, myThid)
359 _END_MASTER( myThid )
360 DO bj = myByLo(myThid), myByHi(myThid)
361 DO bi = myBxLo(myThid), myBxHi(myThid)
362 DO k = 1,nlevels(listId)
363 DO j = 1-OLy,sNy+OLy
364 DO i = 1-OLx,sNx+OLx
365 qtmp1(i,j,k,bi,bj) = 0. _d 0
366 ENDDO
367 ENDDO
368 ENDDO
369 ENDDO
370 ENDDO
371
372 ELSE
373 C- diagnostics is not empty :
374
375 IF ( debugLevel.GE.debLevA .AND. myThid.EQ.1 ) THEN
376 WRITE(ioUnit,'(A,I6,3A,I8,2A)')
377 & ' Computing Diagnostic # ', ndId, ' ', cdiag(ndId),
378 & ' Counter:',ndiag(ip,1,1),' Parms: ',gdiag(ndId)
379 IF ( mate.GT.0 ) THEN
380 WRITE(ioUnit,'(3A,I6,2A)')
381 & ' use Counter Mate for ', cdiag(ndId),
382 & ' Diagnostic # ',mate, ' ', cdiag(mate)
383 ELSEIF ( mVec.GT.0 ) THEN
384 IF ( im.GT.0 .AND. ndiag(MAX(1,im),1,1).GT.0 ) THEN
385 WRITE(ioUnit,'(3A,I6,3A)')
386 & ' Vector Mate for ', cdiag(ndId),
387 & ' Diagnostic # ',mVec, ' ', cdiag(mVec),
388 & ' exists '
389 ELSE
390 WRITE(ioUnit,'(3A,I6,3A)')
391 & ' Vector Mate for ', cdiag(ndId),
392 & ' Diagnostic # ',mVec, ' ', cdiag(mVec),
393 & ' not enabled'
394 ENDIF
395 ENDIF
396 ENDIF
397
398 IF ( fflags(listId)(2:2).EQ.'P' ) THEN
399 C- get all the levels (for vertical interpolation)
400 DO bj = myByLo(myThid), myByHi(myThid)
401 DO bi = myBxLo(myThid), myBxHi(myThid)
402 DO k = 1,kdiag(ndId)
403 tmpLev = k
404 CALL GETDIAG(
405 I tmpLev,undef,
406 O qtmp1(1-OLx,1-OLy,k,bi,bj),
407 I ndId,mate,ip,im,bi,bj,myThid)
408 ENDDO
409 ENDDO
410 ENDDO
411 ELSE
412 C- get only selected levels:
413 DO bj = myByLo(myThid), myByHi(myThid)
414 DO bi = myBxLo(myThid), myBxHi(myThid)
415 DO k = 1,nlevels(listId)
416 CALL GETDIAG(
417 I levs(k,listId),undef,
418 O qtmp1(1-OLx,1-OLy,k,bi,bj),
419 I ndId,mate,ip,im,bi,bj,myThid)
420 ENDDO
421 ENDDO
422 ENDDO
423 ENDIF
424
425 C- end of empty diag / not empty block
426 ENDIF
427
428 C-----------------------------------------------------------------------
429 C Check to see if we need to interpolate before output
430 C-----------------------------------------------------------------------
431 IF ( fflags(listId)(2:2).EQ.'P' ) THEN
432 C- Do vertical interpolation:
433 IF ( fluidIsAir ) THEN
434 C jmc: for now, this can only work in an atmospheric set-up (fluidIsAir);
435 CALL DIAGNOSTICS_INTERP_VERT(
436 I listId, md, ndId, ip, im, lm,
437 U qtmp1,
438 I undef, myTime, myIter, myThid )
439 ELSE
440 WRITE(msgBuf,'(2A)') 'DIAGNOSTICS_OUT: ',
441 & 'INTERP_VERT not allowed in this config'
442 CALL PRINT_ERROR( msgBuf , myThid )
443 STOP 'ABNORMAL END: S/R DIAGNOSTICS_OUT'
444 ENDIF
445 ENDIF
446
447 C-- Ready to write field "md", element "lm" in averageCycle(listId)
448
449 C- write to binary file, using MDSIO pkg:
450 IF ( diag_mdsio ) THEN
451 nRec = lm + (md-1)*averageCycle(listId)
452 C default precision for output files
453 prec = writeBinaryPrec
454 C fFlag(1)=R(or D): force it to be 32-bit(or 64) precision
455 IF ( fflags(listId)(1:1).EQ.'R' ) prec = precFloat32
456 IF ( fflags(listId)(1:1).EQ.'D' ) prec = precFloat64
457 C a hack not to write meta files now: pass -nRec < 0 to MDS_WRITE S/R
458 CALL WRITE_REC_LEV_RL(
459 I fn, prec,
460 I NrMax, 1, nlevels(listId),
461 I qtmp1, -nRec, myIter, myThid )
462 ENDIF
463
464 #ifdef ALLOW_MNC
465 IF (useMNC .AND. diag_mnc) THEN
466
467 _BEGIN_MASTER( myThid )
468
469 DO ii = 1,CW_DIMS
470 d_cw_name(1:NLEN) = dn_blnk(1:NLEN)
471 dn(ii)(1:NLEN) = dn_blnk(1:NLEN)
472 ENDDO
473
474 C Note that the "d_cw_name" variable is a hack that hides a
475 C subtlety within MNC. Basically, each MNC-wrapped file is
476 C caching its own concept of what each "grid name" (that is, a
477 C dimension group name) means. So one cannot re-use the same
478 C "grid" name for different collections of dimensions within a
479 C given file. By appending the "ndId" values to each name, we
480 C guarantee uniqueness within each MNC-produced file.
481 WRITE(d_cw_name,'(a,i6.6)') 'd_cw_',ndId
482
483 C XY dimensions
484 dim(1) = sNx + 2*OLx
485 dim(2) = sNy + 2*OLy
486 ib(1) = OLx + 1
487 ib(2) = OLy + 1
488 IF (gdiag(ndId)(2:2) .EQ. 'M') THEN
489 dn(1)(1:2) = 'X'
490 ie(1) = OLx + sNx
491 dn(2)(1:2) = 'Y'
492 ie(2) = OLy + sNy
493 ELSEIF (gdiag(ndId)(2:2) .EQ. 'U') THEN
494 dn(1)(1:3) = 'Xp1'
495 ie(1) = OLx + sNx + 1
496 dn(2)(1:2) = 'Y'
497 ie(2) = OLy + sNy
498 ELSEIF (gdiag(ndId)(2:2) .EQ. 'V') THEN
499 dn(1)(1:2) = 'X'
500 ie(1) = OLx + sNx
501 dn(2)(1:3) = 'Yp1'
502 ie(2) = OLy + sNy + 1
503 ELSEIF (gdiag(ndId)(2:2) .EQ. 'Z') THEN
504 dn(1)(1:3) = 'Xp1'
505 ie(1) = OLx + sNx + 1
506 dn(2)(1:3) = 'Yp1'
507 ie(2) = OLy + sNy + 1
508 ENDIF
509
510 C Z is special since it varies
511 WRITE(dn(3),'(a,i6.6)') 'Zd', nlevels(listId)
512 IF ( (gdiag(ndId)(10:10) .EQ. 'R')
513 & .AND. (gdiag(ndId)(9:9) .EQ. 'M') ) THEN
514 WRITE(dn(3),'(a,i6.6)') 'Zmd', nlevels(listId)
515 ENDIF
516 IF ( (gdiag(ndId)(10:10) .EQ. 'R')
517 & .AND. (gdiag(ndId)(9:9) .EQ. 'L') ) THEN
518 WRITE(dn(3),'(a,i6.6)') 'Zld', nlevels(listId)
519 ENDIF
520 IF ( (gdiag(ndId)(10:10) .EQ. 'R')
521 & .AND. (gdiag(ndId)(9:9) .EQ. 'U') ) THEN
522 WRITE(dn(3),'(a,i6.6)') 'Zud', nlevels(listId)
523 ENDIF
524 dim(3) = NrMax
525 ib(3) = 1
526 ie(3) = nlevels(listId)
527
528 C Time dimension
529 dn(4)(1:1) = 'T'
530 dim(4) = -1
531 ib(4) = 1
532 ie(4) = 1
533
534 CALL MNC_CW_ADD_GNAME(d_cw_name, 4,
535 & dim, dn, ib, ie, myThid)
536 CALL MNC_CW_ADD_VNAME(cdiag(ndId), d_cw_name,
537 & 4,5, myThid)
538 CALL MNC_CW_ADD_VATTR_TEXT(cdiag(ndId),'description',
539 & tdiag(ndId),myThid)
540 CALL MNC_CW_ADD_VATTR_TEXT(cdiag(ndId),'units',
541 & udiag(ndId),myThid)
542
543 C Missing values only for scalar diagnostics at mass points (so far)
544 useMisValForThisDiag = useMissingValue
545 & .AND.gdiag(ndId)(1:2).EQ.'SM'
546 IF ( useMisValForThisDiag ) THEN
547 C assign missing values and set flag for adding the netCDF atttibute
548 CALL MNC_CW_VATTR_MISSING(cdiag(ndId), 2,
549 I misval_r8, misval_r4, misval_int,
550 I myThid )
551 C and now use the missing values for masking out the land points
552 DO bj = myByLo(myThid), myByHi(myThid)
553 DO bi = myBxLo(myThid), myBxHi(myThid)
554 DO k = 1,nlevels(listId)
555 klev = NINT(levs(k,listId))
556 DO j = 1-OLy,sNy+OLy
557 DO i = 1-OLx,sNx+OLx
558 IF ( maskC(i,j,klev,bi,bj) .EQ. 0. )
559 & qtmp1(i,j,k,bi,bj) = misvalLoc
560 ENDDO
561 ENDDO
562 ENDDO
563 ENDDO
564 ENDDO
565 ELSE
566 C suppress the missing value attribute (iflag = 0)
567 C Note: We have to call the following subroutine for each mnc that has
568 C been created "on the fly" by mnc_cw_add_vname and will be deleted
569 C by mnc_cw_del_vname, because all of these variables use the same
570 C identifier so that mnc_cw_vfmv(indv) needs to be overwritten for
571 C each of these variables
572 CALL MNC_CW_VATTR_MISSING(cdiag(ndId), 0,
573 I misval_r8, misval_r4, misval_int,
574 I myThid )
575 ENDIF
576
577 IF ( ((writeBinaryPrec .EQ. precFloat32)
578 & .AND. (fflags(listId)(1:1) .NE. 'D'))
579 & .OR. (fflags(listId)(1:1) .EQ. 'R') ) THEN
580 CALL MNC_CW_RL_W('R',diag_mnc_bn,0,0,
581 & cdiag(ndId), qtmp1, myThid)
582 ELSEIF ( (writeBinaryPrec .EQ. precFloat64)
583 & .OR. (fflags(listId)(1:1) .EQ. 'D') ) THEN
584 CALL MNC_CW_RL_W('D',diag_mnc_bn,0,0,
585 & cdiag(ndId), qtmp1, myThid)
586 ENDIF
587
588 CALL MNC_CW_DEL_VNAME(cdiag(ndId), myThid)
589 CALL MNC_CW_DEL_GNAME(d_cw_name, myThid)
590
591 _END_MASTER( myThid )
592
593 ENDIF
594 #endif /* ALLOW_MNC */
595
596 C-- end loop on lm (or ll if ALLOW_MNC) counter
597 ENDDO
598 C-- end of Processing Fld # md
599 ENDIF
600 ENDDO
601
602 #ifdef ALLOW_MNC
603 C-- end loop on jj counter
604 ENDDO
605 #endif
606
607 #ifdef ALLOW_MDSIO
608 IF (diag_mdsio) THEN
609 C- Note: temporary: since it's a pain to add more arguments to
610 C all MDSIO S/R, uses instead this specific S/R to write only
611 C meta files but with more informations in it.
612 glf = globalFiles
613 nRec = nfields(listId)*averageCycle(listId)
614 CALL MDS_WR_METAFILES(fn, prec, glf, .FALSE.,
615 & 0, 0, nlevels(listId), ' ',
616 & nfields(listId), flds(1,listId), nTimRec, timeRec,
617 & nRec, myIter, myThid)
618 ENDIF
619 #endif /* ALLOW_MDSIO */
620
621 RETURN
622 END
623
624 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

  ViewVC Help
Powered by ViewVC 1.1.22