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

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

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


Revision 1.17 - (hide annotations) (download)
Tue Jul 12 20:25:45 2005 UTC (18 years, 10 months ago) by molod
Branch: MAIN
Changes since 1.16: +158 -4 lines
Check in for code to activate pressure interpolation on the fly

1 molod 1.17 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_out.F,v 1.16 2005/07/07 15:32:35 edhill Exp $
2 jmc 1.1 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 jmc 1.15 I listId,
13 jmc 1.1 I myIter,
14 edhill 1.14 I myTime,
15 jmc 1.1 I myThid )
16    
17     C !DESCRIPTION:
18     C Write output for diagnostics fields.
19 jmc 1.15
20 jmc 1.1 C !USES:
21 jmc 1.3 IMPLICIT NONE
22 jmc 1.1 #include "SIZE.h"
23     #include "EEPARAMS.h"
24     #include "PARAMS.h"
25 edhill 1.7 #include "GRID.h"
26 jmc 1.3 #include "DIAGNOSTICS_SIZE.h"
27     #include "DIAGNOSTICS.h"
28 jmc 1.1
29     #ifdef ALLOW_FIZHI
30     #include "fizhi_SIZE.h"
31     #else
32 jmc 1.3 INTEGER Nrphys
33     PARAMETER (Nrphys=0)
34 jmc 1.1 #endif
35    
36    
37     C !INPUT PARAMETERS:
38 jmc 1.15 C listId :: Diagnostics list number being written
39 jmc 1.3 C myIter :: current iteration number
40 jmc 1.15 C myTime :: current time of simulation (s)
41 jmc 1.3 C myThid :: my Thread Id number
42 edhill 1.14 _RL myTime
43 jmc 1.15 INTEGER listId, myIter, myThid
44 jmc 1.1 CEOP
45    
46 jmc 1.3 C !LOCAL VARIABLES:
47 jmc 1.15 C i,j,k :: loop indices
48     C md :: field number in the list "listId".
49     C ndId :: diagnostics Id number (in available diagnostics list)
50     C mate :: counter mate Id number (in available diagnostics list)
51     C ip :: diagnostics pointer to storage array
52     C im :: counter-mate pointer to storage array
53     INTEGER i, j, k
54     INTEGER bi, bj
55     INTEGER md, ndId, ip, im
56     INTEGER mate, mVec
57 jmc 1.3 CHARACTER*8 parms1
58     CHARACTER*3 mate_index
59 jmc 1.1 _RL qtmp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+Nrphys,nSx,nSy)
60 molod 1.17 _RL qtmpsrf(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
61     _RL qtmp2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+Nrphys,nSx,nSy)
62 jmc 1.1 _RL undef, getcon
63 jmc 1.3 EXTERNAL getcon
64     INTEGER ILNBLNK
65     EXTERNAL ILNBLNK
66     INTEGER ilen
67 molod 1.17 integer nlevsout,nplevs
68     parameter(nplevs = 16)
69     _RL plevs1(nplevs)
70     data plevs1/ 1000.0 _d 2, 925.0 _d 2, 850.0 _d 2, 700.0 _d 2,
71     . 600.0 _d 2, 500.0 _d 2, 400.0 _d 2, 300.0 _d 2,
72     . 250.0 _d 2, 200.0 _d 2, 150.0 _d 2, 100.0 _d 2,
73     . 70.0 _d 2, 50.0 _d 2, 30.0 _d 2, 20.0 _d 2/
74     _RL plevs2(nplevs)
75     data plevs2/ 1000.0 _d 2, 950.0 _d 2, 900.0 _d 2, 850.0 _d 2,
76     . 800.0 _d 2, 750.0 _d 2, 700.0 _d 2, 600.0 _d 2,
77     . 500.0 _d 2, 400.0 _d 2, 300.0 _d 2, 250.0 _d 2,
78     . 200.0 _d 2, 150.0 _d 2, 100.0 _d 2, 50.0 _d 2/
79     _RL qprs(sNx,sNy,nplevs)
80     _RL qinp(sNx,sNy,Nr+Nrphys)
81     _RL pkz(sNx,sNy,Nr+Nrphys)
82     _RL pksrf(sNx,sNy)
83     _RL p
84     INTEGER jpoint1,ipoint1
85     INTEGER jpoint2,ipoint2
86     _RL kappa
87     logical foundp
88     data foundp /.false./
89 jmc 1.1
90 jmc 1.6 INTEGER ioUnit
91 jmc 1.11 CHARACTER*(MAX_LEN_FNAM) fn
92 jmc 1.1 CHARACTER*(MAX_LEN_MBUF) suff
93 jmc 1.3 CHARACTER*(MAX_LEN_MBUF) msgBuf
94     LOGICAL glf
95 jmc 1.1 #ifdef ALLOW_MNC
96 jmc 1.3 INTEGER ii
97 jmc 1.1 CHARACTER*(MAX_LEN_FNAM) diag_mnc_bn
98 edhill 1.7 CHARACTER*(5) ctmp
99 jmc 1.3 INTEGER CW_DIMS, NLEN
100     PARAMETER ( CW_DIMS = 10 )
101     PARAMETER ( NLEN = 80 )
102     INTEGER dim(CW_DIMS), ib(CW_DIMS), ie(CW_DIMS)
103     CHARACTER*(NLEN) dn(CW_DIMS)
104 edhill 1.7 CHARACTER*(NLEN) d_cw_name
105 jmc 1.3 CHARACTER*(NLEN) dn_blnk
106 edhill 1.7 _RS ztmp(Nr+Nrphys)
107 jmc 1.1 #endif /* ALLOW_MNC */
108    
109 jmc 1.3 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
110    
111 jmc 1.6 ioUnit= standardMessageUnit
112 jmc 1.1 undef = getcon('UNDEF')
113 molod 1.17 kappa = getcon('KAPPA')
114 jmc 1.1 glf = globalFiles
115     WRITE(suff,'(I10.10)') myIter
116 jmc 1.15 ilen = ILNBLNK(fnames(listId))
117     WRITE( fn, '(A,A,A)' ) fnames(listId)(1:ilen),'.',suff(1:10)
118 jmc 1.1
119 molod 1.17 C Initialize the qtmp1 array to all undefs -- need this for unfilled levels
120     DO bj = myByLo(myThid), myByHi(myThid)
121     DO bi = myBxLo(myThid), myBxHi(myThid)
122     DO k = 1,nlevels(listId)
123     DO j = 1-OLy,sNy+OLy
124     DO i = 1-OLx,sNx+OLx
125     qtmp1(i,j,k,bi,bj) = undef
126     ENDDO
127     ENDDO
128     ENDDO
129     ENDDO
130     ENDDO
131    
132 jmc 1.1 #ifdef ALLOW_MNC
133     IF (useMNC .AND. diag_mnc) THEN
134     DO i = 1,MAX_LEN_FNAM
135     diag_mnc_bn(i:i) = ' '
136     ENDDO
137     DO i = 1,NLEN
138     dn_blnk(i:i) = ' '
139     ENDDO
140 jmc 1.15 WRITE( diag_mnc_bn, '(A)' ) fnames(listId)(1:ilen)
141 jmc 1.1
142     C Update the record dimension by writing the iteration number
143     CALL MNC_CW_SET_UDIM(diag_mnc_bn, -1, myThid)
144 edhill 1.14 CALL MNC_CW_RL_W_S('D',diag_mnc_bn,0,0,'T',myTime,myThid)
145 jmc 1.1 CALL MNC_CW_SET_UDIM(diag_mnc_bn, 0, myThid)
146    
147     dn(1)(1:NLEN) = dn_blnk(1:NLEN)
148 jmc 1.15 WRITE(dn(1),'(a,i6.6)') 'Zmd', nlevels(listId)
149     dim(1) = nlevels(listId)
150 jmc 1.1 ib(1) = 1
151 jmc 1.15 ie(1) = nlevels(listId)
152 jmc 1.1
153     CALL MNC_CW_ADD_GNAME('diag_levels', 1,
154     & dim, dn, ib, ie, myThid)
155 edhill 1.7 CALL MNC_CW_ADD_VNAME('diag_levels', 'diag_levels',
156 jmc 1.1 & 0,0, myThid)
157 edhill 1.7 CALL MNC_CW_ADD_VATTR_TEXT('diag_levels','description',
158     & 'Idicies of vertical levels within the source arrays',
159 jmc 1.1 & myThid)
160    
161 edhill 1.9 CALL MNC_CW_RL_W('D',diag_mnc_bn,0,0,
162 jmc 1.15 & 'diag_levels', levs(1,listId), myThid)
163 jmc 1.1
164 edhill 1.7 CALL MNC_CW_DEL_VNAME('diag_levels', myThid)
165 jmc 1.1 CALL MNC_CW_DEL_GNAME('diag_levels', myThid)
166 edhill 1.7
167 edhill 1.16 #ifdef DIAG_MNC_COORD_NEEDSWORK
168     C This part has been placed in an #ifdef because, as its currently
169     C written, it will only work with variables defined on a dynamics
170     C grid. As we start using diagnostics for physics grids, ice
171     C levels, land levels, etc. the different vertical coordinate
172     C dimensions will have to be taken into account.
173    
174 edhill 1.7 C Now define: Zmdxxxxxx, Zudxxxxxx, Zldxxxxxx
175     ctmp(1:5) = 'mul '
176     DO i = 1,3
177     dn(1)(1:NLEN) = dn_blnk(1:NLEN)
178 jmc 1.15 WRITE(dn(1),'(3a,i6.6)') 'Z',ctmp(i:i),'d',nlevels(listId)
179 edhill 1.7 CALL MNC_CW_ADD_GNAME(dn(1), 1, dim, dn, ib, ie, myThid)
180     CALL MNC_CW_ADD_VNAME(dn(1), dn(1), 0,0, myThid)
181 edhill 1.10
182     C The following three ztmp() loops should eventually be modified
183     C to reflect the fractional nature of levs(j,l) -- they should
184     C do something like:
185     C ztmp(j) = rC(INT(FLOOR(levs(j,l))))
186     C + ( rC(INT(FLOOR(levs(j,l))))
187     C + rC(INT(CEIL(levs(j,l)))) )
188     C / ( levs(j,l) - FLOOR(levs(j,l)) )
189     C for averaged levels.
190     IF (i .EQ. 1) THEN
191 jmc 1.15 DO j = 1,nlevels(listId)
192     ztmp(j) = rC(NINT(levs(j,listId)))
193 edhill 1.10 ENDDO
194     CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
195     & 'Dimensional coordinate value at the mid point',
196     & myThid)
197     ELSEIF (i .EQ. 2) THEN
198 jmc 1.15 DO j = 1,nlevels(listId)
199     ztmp(j) = rF(NINT(levs(j,listId)) + 1)
200 edhill 1.10 ENDDO
201     CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
202     & 'Dimensional coordinate value at the upper point',
203     & myThid)
204     ELSEIF (i .EQ. 3) THEN
205 jmc 1.15 DO j = 1,nlevels(listId)
206     ztmp(j) = rF(NINT(levs(j,listId)))
207 edhill 1.10 ENDDO
208     CALL MNC_CW_ADD_VATTR_TEXT(dn(1),'description',
209     & 'Dimensional coordinate value at the lower point',
210     & myThid)
211     ENDIF
212 edhill 1.7 CALL MNC_CW_RS_W('D',diag_mnc_bn,0,0, dn(1), ztmp, myThid)
213     CALL MNC_CW_DEL_VNAME(dn(1), myThid)
214     CALL MNC_CW_DEL_GNAME(dn(1), myThid)
215     ENDDO
216 edhill 1.16 #endif /* DIAG_MNC_COORD_NEEDSWORK */
217 edhill 1.7
218 jmc 1.1 ENDIF
219     #endif /* ALLOW_MNC */
220    
221 jmc 1.15 DO md = 1,nfields(listId)
222     ndId = jdiag(md,listId)
223     parms1 = gdiag(ndId)(1:8)
224     IF ( idiag(md,listId).NE.0 .AND. parms1(5:5).NE.'D' ) THEN
225 jmc 1.3 C-- Start processing 1 Fld :
226    
227 jmc 1.15 ip = ABS(idiag(md,listId))
228     im = mdiag(md,listId)
229     IF ( ndiag(ip,1,1).EQ.0 ) THEN
230 jmc 1.3 C- Empty diagnostics case :
231    
232     _BEGIN_MASTER( myThid )
233     WRITE(msgBuf,'(A,I10)')
234     & '- WARNING - from DIAGNOSTICS_OUT at iter=', myIter
235 jmc 1.15 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
236 jmc 1.3 & SQUEEZE_RIGHT, myThid)
237     WRITE(msgBuf,'(A,I4,3A,I3,2A)')
238 jmc 1.15 & '- WARNING - diag.#',ndId, ' : ',flds(md,listId),
239     & ' (#',md,' ) in outp.Stream: ',fnames(listId)
240     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
241 jmc 1.3 & SQUEEZE_RIGHT, myThid)
242     WRITE(msgBuf,'(A,I2,A)')
243 jmc 1.15 & '- WARNING - has not been filled (ndiag=',
244     & ndiag(ip,1,1), ' )'
245     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
246 jmc 1.3 & SQUEEZE_RIGHT, myThid)
247     WRITE(msgBuf,'(A)')
248     & 'WARNING DIAGNOSTICS_OUT => write ZEROS instead'
249 jmc 1.15 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
250 jmc 1.3 & SQUEEZE_RIGHT, myThid)
251     _END_MASTER( myThid )
252     DO bj = myByLo(myThid), myByHi(myThid)
253     DO bi = myBxLo(myThid), myBxHi(myThid)
254 jmc 1.15 DO k = 1,nlevels(listId)
255 jmc 1.3 DO j = 1-OLy,sNy+OLy
256     DO i = 1-OLx,sNx+OLx
257     qtmp1(i,j,k,bi,bj) = 0. _d 0
258     ENDDO
259     ENDDO
260     ENDDO
261     ENDDO
262     ENDDO
263    
264     ELSE
265     C- diagnostics is not empty :
266    
267 jmc 1.15 IF ( myThid.EQ.1 ) WRITE(ioUnit,'(A,I3,3A,I8,2A)')
268     & ' Computing Diagnostic # ', ndId, ' ', cdiag(ndId),
269     & ' Counter:',ndiag(ip,1,1),' Parms: ',gdiag(ndId)
270 jmc 1.3
271 jmc 1.6 IF ( parms1(5:5).EQ.'C' ) THEN
272     C Check for Mate of a Counter Diagnostic
273     C --------------------------------------
274     mate_index = parms1(6:8)
275     READ (mate_index,'(I3)') mate
276 jmc 1.15 IF ( myThid.EQ.1 ) WRITE(ioUnit,'(3A,I3,2A)')
277     & ' use Counter Mate for ', cdiag(ndId),
278     & ' Diagnostic # ',mate, ' ', cdiag(mate)
279    
280 jmc 1.6 ELSE
281     mate = 0
282 jmc 1.3
283     C Check for Mate of a Vector Diagnostic
284     C -------------------------------------
285     IF ( parms1(1:1).EQ.'U' .OR. parms1(1:1).EQ.'V' ) THEN
286     mate_index = parms1(6:8)
287 jmc 1.6 READ (mate_index,'(I3)') mVec
288 jmc 1.15 IF ( im.GT.0 .AND. ndiag(MAX(1,im),1,1).GT.0 ) THEN
289     IF ( myThid.EQ.1 ) WRITE(ioUnit,'(3A,I3,3A)')
290     & ' Vector Mate for ', cdiag(ndId),
291     & ' Diagnostic # ',mVec, ' ', cdiag(mVec),
292     & ' exists '
293 jmc 1.3 ELSE
294 jmc 1.15 IF ( myThid.EQ.1 ) WRITE(ioUnit,'(3A,I3,3A)')
295     & ' Vector Mate for ', cdiag(ndId),
296     & ' Diagnostic # ',mVec, ' ', cdiag(mVec),
297     & ' not enabled'
298 jmc 1.3 ENDIF
299     ENDIF
300 jmc 1.6 ENDIF
301 jmc 1.3
302 jmc 1.6 DO bj = myByLo(myThid), myByHi(myThid)
303     DO bi = myBxLo(myThid), myBxHi(myThid)
304 jmc 1.15 DO k = 1,nlevels(listId)
305 jmc 1.6 CALL GETDIAG(
306 jmc 1.15 I levs(k,listId),undef,
307 jmc 1.6 O qtmp1(1-OLx,1-OLy,k,bi,bj),
308 jmc 1.15 I ndId,mate,ip,im,bi,bj,myThid)
309 jmc 1.3 ENDDO
310 jmc 1.6 ENDDO
311     ENDDO
312 jmc 1.1
313 jmc 1.3 C- end of empty diag / not empty block
314     ENDIF
315 jmc 1.1
316 molod 1.17 nlevsout = nlevels(listId)
317    
318     C-----------------------------------------------------------------------
319     C Check to see if we need to interpolate before output
320     C-----------------------------------------------------------------------
321     C (we are still inside field exist if sequence and field do loop)
322     C
323    
324     if(fflags(listId)(2:2).eq.'P') then
325    
326     c If nonlinear free surf is active, need averaged pressures
327     #ifdef NONLIN_FRSURF
328     if(select_rStar.GT.0)then
329     call diagnostics_get_pointers('RSURF ',ipoint1,jpoint1,
330     . myThid)
331     call diagnostics_get_pointers('PRESSURE',ipoint2,jpoint2,
332     . myThid)
333     C if fizhi is being used, may need to get physics grid pressures
334     #ifdef ALLOW_FIZHI
335     if(gdiag(ndId)(10:10) .EQ. 'L')then
336     call diagnostics_get_pointers('FIZPRES ',ipoint2,jpoint2,
337     . myThid)
338     endif
339     #endif
340     if( jpoint1.ne.0 .and. jpoint2.ne.0) foundp = .true.
341    
342     if(.not. foundp) then
343     WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_OUT: ',
344     . ' Have asked for pressure interpolation but have not ',
345     . ' Activated surface and 3D pressure diagnostic, ',
346     . ' RSURF and PRESSURE'
347     CALL PRINT_ERROR( msgBuf , myThid )
348     STOP 'ABNORMAL END: S/R DIAGNOSTICS_OUT'
349     endif
350    
351     DO bj = myByLo(myThid), myByHi(myThid)
352     DO bi = myBxLo(myThid), myBxHi(myThid)
353     call getdiag(1,undef,qtmpsrf(1-OLx,1-OLy,bi,bj),
354     . jpoint1,0,ipoint1,0,bi,bj,myThid)
355     ENDDO
356     ENDDO
357     DO bj = myByLo(myThid), myByHi(myThid)
358     DO bi = myBxLo(myThid), myBxHi(myThid)
359     DO k = 1,nlevels(listId)
360     call getdiag(levs(k,listId),undef,
361     . qtmp2(1-OLx,1-OLy,k,bi,bj),jpoint2,0,ipoint2,0,
362     . bi,bj,myThid)
363     ENDDO
364     ENDDO
365     ENDDO
366     endif
367     #else
368     C If nonlinear free surf is off, get pressures from rC and rF arrays
369     DO bj = myByLo(myThid), myByHi(myThid)
370     DO bi = myBxLo(myThid), myBxHi(myThid)
371     DO j = 1-OLy,sNy+OLy
372     DO i = 1-OLx,sNx+OLx
373     qtmpsrf(i,j,bi,bj) = rF(1)
374     ENDDO
375     ENDDO
376     DO j = 1-OLy,sNy+OLy
377     DO i = 1-OLx,sNx+OLx
378     DO k = 1,nlevels(listId)
379     qtmp2(i,j,k,bi,bj) = rC(k)
380     ENDDO
381     ENDDO
382     ENDDO
383     ENDDO
384     ENDDO
385     #endif
386     C Load p to the kappa into a temporary array
387     nlevsout = nplevs
388     DO bj = myByLo(myThid), myByHi(myThid)
389     DO bi = myBxLo(myThid), myBxHi(myThid)
390     DO j = 1,sNy
391     DO i = 1,sNx
392     pksrf(i,j) = qtmpsrf(i,j,bi,bj) ** kappa
393     DO k = 1,nlevels(listId)
394     if(gdiag(ndId)(10:10).eq.'R') then
395     if(hFacC(i,j,nlevels(listId)-k+1,bi,bj).ne.0.) then
396     qinp(i,j,k) = qtmp1(i,j,nlevels(listId)-k+1,bi,bj)
397     else
398     qinp(i,j,k) = undef
399     endif
400     pkz(i,j,k) = qtmp2(i,j,nlevels(listId)-k+1,bi,bj)**kappa
401     elseif(gdiag(ndId)(10:10).eq.'L') then
402     qinp(i,j,k) = qtmp1(i,j,k,bi,bj)
403     pkz(i,j,k) = qtmp2(i,j,k,bi,bj)**kappa
404     endif
405     ENDDO
406     ENDDO
407     ENDDO
408    
409     DO k = 1,nplevs
410     if(fflags(listId)(3:3).eq.'1') then
411     p = plevs1(k)
412     elseif(fflags(listId)(3:3).eq.'2')then
413     p = plevs2(k)
414     endif
415     call prestopres(qprs(1,1,k),qinp,pkz,pksrf,0.,p,sNx,sNy,
416     . nlevels(listId) )
417     ENDDO
418    
419     DO j = 1,sNy
420     DO i = 1,sNx
421     DO k = 1,nlevsout
422     qtmp1(i,j,k,bi,bj) = qprs(i,j,k)
423     if(qtmp1(i,j,k,bi,bj).eq.undef) qtmp1(i,j,k,bi,bj) = 0.
424     ENDDO
425     ENDDO
426     ENDDO
427     ENDDO
428     ENDDO
429    
430     endif
431    
432 jmc 1.1 #ifdef ALLOW_MDSIO
433 jmc 1.3 C Prepare for mdsio optionality
434     IF (diag_mdsio) THEN
435 jmc 1.15 IF (fflags(listId)(1:1) .EQ. ' ') THEN
436 edhill 1.13 C This is the old default behavior
437 jmc 1.15 CALL MDSWRITEFIELD_NEW(fn,writeBinaryPrec,glf,'RL',
438 molod 1.17 & Nr+Nrphys,nlevsout,qtmp1,md,myIter,myThid)
439 jmc 1.15 ELSEIF (fflags(listId)(1:1) .EQ. 'R') THEN
440 edhill 1.13 C Force it to be 32-bit precision
441 jmc 1.15 CALL MDSWRITEFIELD_NEW(fn,precFloat32,glf,'RL',
442 molod 1.17 & Nr+Nrphys,nlevsout,qtmp1,md,myIter,myThid)
443 jmc 1.15 ELSEIF (fflags(listId)(1:1) .EQ. 'D') THEN
444 edhill 1.13 C Force it to be 64-bit precision
445 jmc 1.15 CALL MDSWRITEFIELD_NEW(fn,precFloat64,glf,'RL',
446 molod 1.17 & Nr+Nrphys,nlevsout,qtmp1,md,myIter,myThid)
447 edhill 1.13 ENDIF
448 jmc 1.3 ENDIF
449 jmc 1.1 #endif /* ALLOW_MDSIO */
450    
451     #ifdef ALLOW_MNC
452 jmc 1.3 IF (useMNC .AND. diag_mnc) THEN
453 jmc 1.1
454 jmc 1.3 _BEGIN_MASTER( myThid )
455 jmc 1.1
456 jmc 1.3 DO ii = 1,CW_DIMS
457 edhill 1.7 d_cw_name(1:NLEN) = dn_blnk(1:NLEN)
458 jmc 1.3 dn(ii)(1:NLEN) = dn_blnk(1:NLEN)
459     ENDDO
460    
461 edhill 1.7 C Note that the "d_cw_name" variable is a hack that hides a
462     C subtlety within MNC. Basically, each MNC-wrapped file is
463     C caching its own concept of what each "grid name" (that is, a
464     C dimension group name) means. So one cannot re-use the same
465     C "grid" name for different collections of dimensions within a
466 jmc 1.15 C given file. By appending the "ndId" values to each name, we
467 edhill 1.7 C guarantee uniqueness within each MNC-produced file.
468 jmc 1.15 WRITE(d_cw_name,'(a,i6.6)') 'd_cw_',ndId
469 edhill 1.7
470 edhill 1.5 C XY dimensions
471     dim(1) = sNx + 2*OLx
472     dim(2) = sNy + 2*OLy
473     ib(1) = OLx + 1
474     ib(2) = OLy + 1
475 jmc 1.15 IF (gdiag(ndId)(2:2) .EQ. 'M') THEN
476 edhill 1.5 dn(1)(1:2) = 'X'
477     ie(1) = OLx + sNx
478     dn(2)(1:2) = 'Y'
479     ie(2) = OLy + sNy
480 jmc 1.15 ELSEIF (gdiag(ndId)(2:2) .EQ. 'U') THEN
481 edhill 1.5 dn(1)(1:3) = 'Xp1'
482     ie(1) = OLx + sNx + 1
483     dn(2)(1:2) = 'Y'
484     ie(2) = OLy + sNy
485 jmc 1.15 ELSEIF (gdiag(ndId)(2:2) .EQ. 'V') THEN
486 edhill 1.5 dn(1)(1:2) = 'X'
487     ie(1) = OLx + sNx
488     dn(2)(1:3) = 'Yp1'
489     ie(2) = OLy + sNy + 1
490 jmc 1.15 ELSEIF (gdiag(ndId)(2:2) .EQ. 'Z') THEN
491 edhill 1.5 dn(1)(1:3) = 'Xp1'
492     ie(1) = OLx + sNx + 1
493     dn(2)(1:3) = 'Yp1'
494     ie(2) = OLy + sNy + 1
495     ENDIF
496    
497 jmc 1.3 C Z is special since it varies
498 jmc 1.15 WRITE(dn(3),'(a,i6.6)') 'Zd', nlevels(listId)
499     IF ( (gdiag(ndId)(10:10) .EQ. 'R')
500     & .AND. (gdiag(ndId)(9:9) .EQ. 'M') ) THEN
501     WRITE(dn(3),'(a,i6.6)') 'Zmd', nlevels(listId)
502 edhill 1.7 ENDIF
503 jmc 1.15 IF ( (gdiag(ndId)(10:10) .EQ. 'R')
504     & .AND. (gdiag(ndId)(9:9) .EQ. 'L') ) THEN
505     WRITE(dn(3),'(a,i6.6)') 'Zld', nlevels(listId)
506 edhill 1.7 ENDIF
507 jmc 1.15 IF ( (gdiag(ndId)(10:10) .EQ. 'R')
508     & .AND. (gdiag(ndId)(9:9) .EQ. 'U') ) THEN
509     WRITE(dn(3),'(a,i6.6)') 'Zud', nlevels(listId)
510 edhill 1.7 ENDIF
511 jmc 1.3 dim(3) = Nr+Nrphys
512     ib(3) = 1
513 jmc 1.15 ie(3) = nlevels(listId)
514 jmc 1.1
515 edhill 1.5 C Time dimension
516     dn(4)(1:1) = 'T'
517     dim(4) = -1
518     ib(4) = 1
519     ie(4) = 1
520    
521 edhill 1.7 CALL MNC_CW_ADD_GNAME(d_cw_name, 4,
522 jmc 1.1 & dim, dn, ib, ie, myThid)
523 jmc 1.15 CALL MNC_CW_ADD_VNAME(cdiag(ndId), d_cw_name,
524 jmc 1.1 & 4,5, myThid)
525 jmc 1.15 CALL MNC_CW_ADD_VATTR_TEXT(cdiag(ndId),'description',
526     & tdiag(ndId),myThid)
527     CALL MNC_CW_ADD_VATTR_TEXT(cdiag(ndId),'units',
528     & udiag(ndId),myThid)
529 jmc 1.1
530 jmc 1.15 IF ((fflags(listId)(1:1) .EQ. ' ')
531     & .OR. (fflags(listId)(1:1) .EQ. 'R')) THEN
532 edhill 1.13 CALL MNC_CW_RL_W('R',diag_mnc_bn,0,0,
533 jmc 1.15 & cdiag(ndId), qtmp1, myThid)
534     ELSEIF (fflags(listId)(1:1) .EQ. 'D') THEN
535 edhill 1.13 CALL MNC_CW_RL_W('D',diag_mnc_bn,0,0,
536 jmc 1.15 & cdiag(ndId), qtmp1, myThid)
537 edhill 1.13 ENDIF
538    
539 jmc 1.15 CALL MNC_CW_DEL_VNAME(cdiag(ndId), myThid)
540 edhill 1.7 CALL MNC_CW_DEL_GNAME(d_cw_name, myThid)
541 jmc 1.1
542 jmc 1.3 _END_MASTER( myThid )
543 jmc 1.1
544 jmc 1.3 ENDIF
545 jmc 1.1 #endif /* ALLOW_MNC */
546    
547 jmc 1.15 C-- end of Processing Fld # md
548 jmc 1.3 ENDIF
549     ENDDO
550 jmc 1.1
551 jmc 1.15 RETURN
552 jmc 1.3 END
553 jmc 1.15
554 jmc 1.1 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|

  ViewVC Help
Powered by ViewVC 1.1.22