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

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

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


Revision 1.1 - (hide 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 edhill 1.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