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

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

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


Revision 1.2 - (hide 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 jmc 1.2 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_mnc_out.F,v 1.1 2011/06/11 23:29:44 jmc Exp $
2 jmc 1.1 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 jmc 1.2 O diag_mnc_bn, useMissingValue,
20     I misValLoc, myTime, myIter, myThid )
21 jmc 1.1
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