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

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

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


Revision 1.16 - (show annotations) (download)
Fri Jul 1 18:52:18 2011 UTC (12 years, 10 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63g, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint64, checkpoint65, checkpoint63, checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e
Changes since 1.15: +76 -3 lines
In case an output file contains 2 post-processed diags which are computed
together (mate of 2nd PP-diag one is 1rst PP-diag), move these 2 diags
next to each other (to only computate them once): 1rst one then 2nd one.

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_set_pointers.F,v 1.15 2011/06/21 18:00:15 jmc Exp $
2 C $Name: $
3
4 #include "DIAG_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: DIAGNOSTICS_SET_POINTERS
8 C !INTERFACE:
9 SUBROUTINE DIAGNOSTICS_SET_POINTERS( myThid )
10
11 C !DESCRIPTION: \bv
12 C *==================================================================
13 C | S/R DIAGNOSTICS_SET_POINTERS
14 C | o set pointers for active diagnostics
15 C *==================================================================
16 C \ev
17
18 C !USES:
19 IMPLICIT NONE
20
21 C == Global variables ===
22 #include "EEPARAMS.h"
23 #include "SIZE.h"
24 #include "DIAGNOSTICS_SIZE.h"
25 #include "DIAGNOSTICS.h"
26
27 C !INPUT/OUTPUT PARAMETERS:
28 C == Routine arguments ==
29 C myThid :: my Thread Id. number
30 INTEGER myThid
31 CEOP
32
33 C !LOCAL VARIABLES:
34 C == Local variables ==
35 INTEGER ndiagcount, ndCount
36 INTEGER md,ld,nd
37 INTEGER mate, nActiveMax
38 INTEGER i, j, k, k1, k2, kLev
39 LOGICAL found
40 CHARACTER*(MAX_LEN_MBUF) msgBuf
41 CHARACTER*12 suffix
42
43 _BEGIN_MASTER( myThid)
44
45 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
46
47 C-- In case an output file contains 2 post-processed diags which are computed
48 C together (mate of 2nd PP-diag one is 1rst PP-diag), move these 2 diags
49 C next to each other (to only computate them once): 1rst one then 2nd one.
50 DO ld=1,nlists
51 found = .FALSE.
52 DO md=1,nfields(ld)
53 C Search all possible model diagnostics
54 nd = 0
55 DO i=1,ndiagt
56 IF ( nd.EQ.0 .AND. flds(md,ld).EQ.cdiag(i) ) nd = i
57 ENDDO
58 j = 0
59 IF ( nd.GE.1 ) THEN
60 IF ( gdiag(nd)(5:5).EQ.'P' ) THEN
61 mate = hdiag(nd)
62 IF ( gdiag(mate)(5:5).EQ.'P' ) THEN
63 C Mate of Post-Processed diag "nd" is also Post-Processed
64 DO i=1,nfields(ld)
65 IF ( j.EQ.0 .AND. flds(i,ld).EQ.cdiag(mate) ) j = i
66 ENDDO
67 ENDIF
68 ENDIF
69 ENDIF
70 C And is found in the same output stream "ld" (at rank "j")
71 IF ( j.GE.1 .AND. j.NE.md-1 ) THEN
72 IF ( .NOT.found ) THEN
73 WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',
74 & 'Re-Order Diags in Outp.Stream: ',fnames(ld)
75 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
76 & SQUEEZE_RIGHT, myThid )
77 ENDIF
78 found = .TRUE.
79 IF ( j.LT.md-1 ) THEN
80 WRITE(msgBuf,'(2A,2(A,I4),2A)')
81 & ' move ',flds(j,ld),' from ',j,' down to',md-1,
82 & ' just before ',flds(md,ld)
83 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
84 & SQUEEZE_RIGHT, myThid )
85 DO i=j,md-2
86 flds(i,ld) = flds(i+1,ld)
87 ENDDO
88 flds(md-1,ld) = cdiag(mate)
89 ELSEIF ( j.GT.md ) THEN
90 WRITE(msgBuf,'(2A,2(A,I4),2A)')
91 & ' move ',flds(j,ld),' from ',j,' up to ',md,
92 & ' just before ',flds(md,ld)
93 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
94 & SQUEEZE_RIGHT, myThid )
95 DO i=j,md+1,-1
96 flds(i,ld) = flds(i-1,ld)
97 ENDDO
98 flds(md,ld) = cdiag(mate)
99 ENDIF
100 ENDIF
101 ENDDO
102 IF ( found ) THEN
103 WRITE(msgBuf,'(2A,I4,A)') 'DIAGNOSTICS_SET_POINTERS: ',
104 & 'Updated list in Outp.Stream #', ld, ' :'
105 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
106 & SQUEEZE_RIGHT, myThid )
107 DO md = 1,nfields(ld),10
108 j = MIN(nfields(ld),md+9)
109 WRITE(msgBuf,'(21A)') ' Fields: ',(' ',flds(i,ld),i=md,j)
110 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
111 & SQUEEZE_RIGHT, myThid )
112 ENDDO
113 ENDIF
114 ENDDO
115
116 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
117
118 C-- Initialize pointer arrays to zero:
119 DO ld=1,numLists
120 DO md=1,numperList
121 idiag(md,ld) = 0
122 jdiag(md,ld) = 0
123 mdiag(md,ld) = 0
124 ENDDO
125 ENDDO
126
127 C-- Calculate pointers for diagnostics in active output-stream
128 C (i.e., with defined filename)
129
130 ndiagcount = 0
131 nActiveMax = 0
132 DO ld=1,nlists
133 nActive(ld) = nfields(ld)
134 DO md=1,nfields(ld)
135
136 found = .FALSE.
137 C Search all possible model diagnostics
138 DO nd=1,ndiagt
139 IF ( flds(md,ld).EQ.cdiag(nd) ) THEN
140 CALL DIAGNOSTICS_SETDIAG(mate,ndiagcount,md,ld,nd,myThid)
141 found = .TRUE.
142 jdiag(md,ld) = nd
143 ENDIF
144 ENDDO
145 IF ( .NOT.found ) THEN
146 CALL DIAGNOSTICS_LIST_CHECK(
147 O ndCount,
148 I ld, md, nlists, nfields, flds, myThid )
149 IF ( ndCount.EQ.0 ) THEN
150 WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',
151 & flds(md,ld),' is not a Diagnostic'
152 CALL PRINT_ERROR( msgBuf , myThid )
153 ENDIF
154 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
155 ENDIF
156
157 ENDDO
158 nActiveMax = MAX(nActive(ld),nActiveMax)
159 ENDDO
160
161 IF ( ndiagcount.LE.numDiags .AND.
162 & nActiveMax.LE.numperList ) THEN
163 WRITE(msgBuf,'(A,I8,A)')
164 & ' space allocated for all diagnostics:',
165 & ndiagcount, ' levels'
166 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
167 & SQUEEZE_RIGHT, myThid )
168 ELSE
169 IF ( ndiagcount.GT.numDiags ) THEN
170 WRITE(msgBuf,'(2A)')
171 & 'DIAGNOSTICS_SET_POINTERS: Not enough space',
172 & ' for all active diagnostics (from data.diagnostics)'
173 CALL PRINT_ERROR( msgBuf , myThid )
174 WRITE(msgBuf,'(A,I8,A,I8)')
175 & 'DIAGNOSTICS_SET_POINTERS: numDiags=', numDiags,
176 & ' but needs at least', ndiagcount
177 CALL PRINT_ERROR( msgBuf , myThid )
178 ENDIF
179 IF ( nActiveMax.GT.numperList ) THEN
180 WRITE(msgBuf,'(2A)')
181 & 'DIAGNOSTICS_SET_POINTERS: Not enough space',
182 & ' for all active diagnostics (from data.diagnostics)'
183 CALL PRINT_ERROR( msgBuf , myThid )
184 WRITE(msgBuf,'(A,I6,A,I6)')
185 & 'DIAGNOSTICS_SET_POINTERS: numperList=', numperList,
186 & ' but needs at least', nActiveMax
187 CALL PRINT_ERROR( msgBuf , myThid )
188 ENDIF
189 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
190 ENDIF
191
192 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
193 C-- Set pointer for mate (e.g.vector component mate) if not already done
194 C and if it exists. Note: for now, only used to print message.
195 DO ld=1,nlists
196 DO md=1,nActive(ld)
197 IF (mdiag(md,ld).EQ.0 ) THEN
198
199 nd = jdiag(md,ld)
200 mate = hdiag(nd)
201 IF ( mate.GT.0 ) THEN
202 DO j=1,nlists
203 DO i=1,nActive(j)
204 IF ( mdiag(md,ld).EQ.0 .AND. jdiag(i,j).EQ.mate ) THEN
205 IF ( freq(j).EQ.freq(ld) .AND. phase(j).EQ.phase(ld)
206 & .AND. averageFreq(j) .EQ.averageFreq(ld)
207 & .AND. averagePhase(j).EQ.averagePhase(ld)
208 & .AND. averageCycle(j).EQ.averageCycle(ld) )
209 & mdiag(md,ld) = ABS(idiag(i,j))
210 ENDIF
211 ENDDO
212 ENDDO
213 ENDIF
214 IF ( mdiag(md,ld).NE.0 ) THEN
215 WRITE(msgBuf,'(A,I6,5A,I6)') ' set mate pointer for diag #',
216 & nd, ' ', cdiag(nd), ' , Parms: ', gdiag(nd)(1:10),
217 & ' , mate:', hdiag(nd)
218 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
219 & SQUEEZE_RIGHT, myThid )
220 ENDIF
221
222 ENDIF
223 ENDDO
224 ENDDO
225
226 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
227 C-- Set list of levels to write (if not specified in data.diagnostics)
228
229 DO ld=1,nlists
230 IF ( nlevels(ld).EQ.-1 ) THEN
231 C- set Nb of levels to the minimum size of all diag of this list:
232 kLev = numLevels*10
233 DO md=1,nfields(ld)
234 nd = jdiag(md,ld)
235 kLev = MIN(kdiag(nd),kLev)
236 ENDDO
237 IF ( kLev.LE.0 ) THEN
238 WRITE(msgBuf,'(2A,I4,2A)')
239 & 'DIAGNOSTICS_SET_POINTERS: kLev < 1 in',
240 & ' setting levs of list l=',ld,', fnames=', fnames(ld)
241 CALL PRINT_ERROR( msgBuf , myThid )
242 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
243 ELSEIF ( kLev.GT.numLevels ) THEN
244 WRITE(msgBuf,'(A,2(I6,A))')
245 & 'DIAGNOSTICS_SET_POINTERS: kLev=', kLev,
246 & ' >', numLevels, ' =numLevels'
247 CALL PRINT_ERROR( msgBuf , myThid )
248 WRITE(msgBuf,'(2A,I4,2A)') 'DIAGNOSTICS_SET_POINTERS: in',
249 & ' setting levs of list l=',ld,', fnames=', fnames(ld)
250 CALL PRINT_ERROR( msgBuf , myThid )
251 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
252 ENDIF
253 nlevels(ld) = kLev
254 DO k=1,kLev
255 levs(k,ld) = k
256 ENDDO
257 WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',
258 & 'Set levels for Outp.Stream: ',fnames(ld)
259 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
260 & SQUEEZE_RIGHT, myThid)
261 suffix = ' Levels: '
262 IF ( fflags(ld)(2:2).EQ.'I' ) suffix = ' Sum Levels:'
263 DO k1=1,nlevels(ld),20
264 k2 = MIN(nlevels(ld),k1+19)
265 WRITE(msgBuf,'(A,20F5.0)') suffix, (levs(k,ld),k=k1,k2)
266 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
267 & SQUEEZE_RIGHT, myThid)
268 ENDDO
269 ELSEIF ( fflags(ld)(2:2).NE.'P' ) THEN
270 C- if no Vert.Interpolation, check for levels out of range ( > kdiag):
271 kLev = 0
272 DO k=1,nlevels(ld)
273 kLev = MAX(NINT(levs(k,ld)),kLev)
274 ENDDO
275 DO md=1,nfields(ld)
276 nd = jdiag(md,ld)
277 IF ( kLev.GT.kdiag(nd) ) THEN
278 C- Note: diagnostics_out take care (in some way) of this case
279 C so that it does not cause "index out-off bounds" error.
280 C However, the output file looks strange.
281 C- For now, choose to stop, but could change it to just a warning
282 WRITE(msgBuf,'(A,I4,A,I6,2A)')
283 & 'DIAGNOSTICS_SET_POINTERS: Ask for level=',kLev,
284 & ' in list l=', ld, ', filename: ', fnames(ld)
285 CALL PRINT_ERROR( msgBuf , myThid )
286 WRITE(msgBuf,'(2A,I4,A,I6,2A)')
287 & 'DIAGNOSTICS_SET_POINTERS: ==> exceed Max.Nb of lev.',
288 & '(=',kdiag(nd),') for Diag. #', nd, ' : ',cdiag(nd)
289 CALL PRINT_ERROR( msgBuf , myThid )
290 WRITE(msgBuf,'(4A)') 'DIAGNOSTICS_SET_POINTERS: ',
291 & ' parsing code >>',gdiag(nd),'<<'
292 CALL PRINT_ERROR( msgBuf , myThid )
293 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
294 ENDIF
295 ENDDO
296 ENDIF
297 ENDDO
298
299 WRITE(msgBuf,'(A)') 'DIAGNOSTICS_SET_POINTERS: done'
300 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
301 & SQUEEZE_RIGHT , myThid)
302 WRITE(msgBuf,'(2A)')
303 & '------------------------------------------------------------'
304 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
305 & SQUEEZE_RIGHT , myThid)
306
307 _END_MASTER( myThid )
308
309 RETURN
310 END

  ViewVC Help
Powered by ViewVC 1.1.22