/[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.14 - (show annotations) (download)
Wed Jun 15 13:22:43 2011 UTC (12 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62z
Changes since 1.13: +6 -2 lines
fix mate pointer setting (but no effect on output, just for msg printing)

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_set_pointers.F,v 1.13 2010/01/11 19:44:07 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, mm, kLev
39 LOGICAL found
40 CHARACTER*(MAX_LEN_MBUF) msgBuf
41 CHARACTER*12 suffix
42
43 _BEGIN_MASTER( myThid)
44
45 C-- Initialize pointer arrays to zero:
46 DO ld=1,numlists
47 DO md=1,numperlist
48 idiag(md,ld) = 0
49 jdiag(md,ld) = 0
50 mdiag(md,ld) = 0
51 ENDDO
52 ENDDO
53
54 C-- Calculate pointers for diagnostics in active output-stream
55 C (i.e., with defined filename)
56
57 ndiagcount = 0
58 nActiveMax = 0
59 DO ld=1,nlists
60 nActive(ld) = nfields(ld)
61 DO md=1,nfields(ld)
62
63 found = .FALSE.
64 C Search all possible model diagnostics
65 DO nd=1,ndiagt
66 IF ( flds(md,ld).EQ.cdiag(nd) ) THEN
67 CALL DIAGNOSTICS_SETDIAG(mate,ndiagcount,md,ld,nd,myThid)
68 found = .TRUE.
69 jdiag(md,ld) = nd
70 ENDIF
71 ENDDO
72 IF ( .NOT.found ) THEN
73 CALL DIAGNOSTICS_LIST_CHECK(
74 O ndCount,
75 I ld, md, nlists, nfields, flds, myThid )
76 IF ( ndCount.EQ.0 ) THEN
77 WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',
78 & flds(md,ld),' is not a Diagnostic'
79 CALL PRINT_ERROR( msgBuf , myThid )
80 ENDIF
81 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
82 ENDIF
83 IF ( found .AND. mate.GE.1 ) THEN
84 mm = nActive(ld) + 1
85 IF ( mm.LE.numperlist ) THEN
86 jdiag(mm,ld) = mate
87 idiag(mm,ld) = mdiag(md,ld)
88 flds (mm,ld) = cdiag(mate)
89 ENDIF
90 nActive(ld) = mm
91 ENDIF
92
93 ENDDO
94 nActiveMax = MAX(nActive(ld),nActiveMax)
95 ENDDO
96
97 IF ( ndiagcount.LE.numDiags .AND.
98 & nActiveMax.LE.numperlist ) THEN
99 WRITE(msgBuf,'(A,I8,A)')
100 & ' space allocated for all diagnostics:',
101 & ndiagcount, ' levels'
102 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
103 & SQUEEZE_RIGHT , myThid)
104 ELSE
105 IF ( ndiagcount.GT.numDiags ) THEN
106 WRITE(msgBuf,'(2A)')
107 & 'DIAGNOSTICS_SET_POINTERS: Not enough space',
108 & ' for all active diagnostics (from data.diagnostics)'
109 CALL PRINT_ERROR( msgBuf , myThid )
110 WRITE(msgBuf,'(A,I8,A,I8)')
111 & 'DIAGNOSTICS_SET_POINTERS: numDiags=', numDiags,
112 & ' but needs at least', ndiagcount
113 CALL PRINT_ERROR( msgBuf , myThid )
114 ENDIF
115 IF ( nActiveMax.GT.numperlist ) THEN
116 WRITE(msgBuf,'(2A)')
117 & 'DIAGNOSTICS_SET_POINTERS: Not enough space',
118 & ' for all active diagnostics (from data.diagnostics)'
119 CALL PRINT_ERROR( msgBuf , myThid )
120 WRITE(msgBuf,'(A,I6,A,I6)')
121 & 'DIAGNOSTICS_SET_POINTERS: numperlist=', numperlist,
122 & ' but needs at least', nActiveMax
123 CALL PRINT_ERROR( msgBuf , myThid )
124 ENDIF
125 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
126 ENDIF
127
128 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
129 C-- Set pointer for mate (e.g.vector component mate) if not already done
130 C and if it exists. Note: for now, only used to print message.
131 DO ld=1,nlists
132 DO md=1,nActive(ld)
133 IF (mdiag(md,ld).EQ.0 ) THEN
134
135 nd = jdiag(md,ld)
136 mate = hdiag(nd)
137 IF ( mate.GT.0 ) THEN
138 DO j=1,nlists
139 DO i=1,nActive(j)
140 IF ( mdiag(md,ld).EQ.0 .AND. jdiag(i,j).EQ.mate ) THEN
141 IF ( freq(j).EQ.freq(ld) .AND. phase(j).EQ.phase(ld)
142 & .AND. averageFreq(j) .EQ.averageFreq(ld)
143 & .AND. averagePhase(j).EQ.averagePhase(ld)
144 & .AND. averageCycle(j).EQ.averageCycle(ld) )
145 & mdiag(md,ld) = ABS(idiag(i,j))
146 ENDIF
147 ENDDO
148 ENDDO
149 ENDIF
150 IF ( mdiag(md,ld).NE.0 ) THEN
151 WRITE(msgBuf,'(A,I6,5A,I6)') ' set mate pointer for diag #',
152 & nd, ' ', cdiag(nd), ' , Parms: ', gdiag(nd)(1:10),
153 & ' , mate:', hdiag(nd)
154 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
155 & SQUEEZE_RIGHT , myThid)
156 ENDIF
157
158 ENDIF
159 ENDDO
160 ENDDO
161
162 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
163 C-- Set list of levels to write (if not specified in data.diagnostics)
164
165 DO ld=1,nlists
166 IF ( nlevels(ld).EQ.-1 ) THEN
167 C- set Nb of levels to the minimum size of all diag of this list:
168 kLev = numLevels*10
169 DO md=1,nfields(ld)
170 nd = jdiag(md,ld)
171 kLev = MIN(kdiag(nd),kLev)
172 ENDDO
173 IF ( kLev.LE.0 ) THEN
174 WRITE(msgBuf,'(2A,I4,2A)')
175 & 'DIAGNOSTICS_SET_POINTERS: kLev < 1 in',
176 & ' setting levs of list l=',ld,', fnames=', fnames(ld)
177 CALL PRINT_ERROR( msgBuf , myThid )
178 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
179 ELSEIF ( kLev.GT.numLevels ) THEN
180 WRITE(msgBuf,'(A,2(I6,A))')
181 & 'DIAGNOSTICS_SET_POINTERS: kLev=', kLev,
182 & ' >', numLevels, ' =numLevels'
183 CALL PRINT_ERROR( msgBuf , myThid )
184 WRITE(msgBuf,'(2A,I4,2A)') 'DIAGNOSTICS_SET_POINTERS: in',
185 & ' setting levs of list l=',ld,', fnames=', fnames(ld)
186 CALL PRINT_ERROR( msgBuf , myThid )
187 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
188 ENDIF
189 nlevels(ld) = kLev
190 DO k=1,kLev
191 levs(k,ld) = k
192 ENDDO
193 WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',
194 & 'Set levels for Outp.Stream: ',fnames(ld)
195 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
196 & SQUEEZE_RIGHT, myThid)
197 suffix = ' Levels: '
198 IF ( fflags(ld)(2:2).EQ.'I' ) suffix = ' Sum Levels:'
199 DO k1=1,nlevels(ld),20
200 k2 = MIN(nlevels(ld),k1+19)
201 WRITE(msgBuf,'(A,20F5.0)') suffix, (levs(k,ld),k=k1,k2)
202 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
203 & SQUEEZE_RIGHT, myThid)
204 ENDDO
205 ELSEIF ( fflags(ld)(2:2).NE.'P' ) THEN
206 C- if no Vert.Interpolation, check for levels out of range ( > kdiag):
207 kLev = 0
208 DO k=1,nlevels(ld)
209 kLev = MAX(NINT(levs(k,ld)),kLev)
210 ENDDO
211 DO md=1,nfields(ld)
212 nd = jdiag(md,ld)
213 IF ( kLev.GT.kdiag(nd) ) THEN
214 C- Note: diagnostics_out take care (in some way) of this case
215 C so that it does not cause "index out-off bounds" error.
216 C However, the output file looks strange.
217 C- For now, choose to stop, but could change it to just a warning
218 WRITE(msgBuf,'(A,I4,A,I6,2A)')
219 & 'DIAGNOSTICS_SET_POINTERS: Ask for level=',kLev,
220 & ' in list l=', ld, ', filename: ', fnames(ld)
221 CALL PRINT_ERROR( msgBuf , myThid )
222 WRITE(msgBuf,'(2A,I4,A,I6,2A)')
223 & 'DIAGNOSTICS_SET_POINTERS: ==> exceed Max.Nb of lev.',
224 & '(=',kdiag(nd),') for Diag. #', nd, ' : ',cdiag(nd)
225 CALL PRINT_ERROR( msgBuf , myThid )
226 WRITE(msgBuf,'(4A)') 'DIAGNOSTICS_SET_POINTERS: ',
227 & ' parsing code >>',gdiag(nd),'<<'
228 CALL PRINT_ERROR( msgBuf , myThid )
229 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
230 ENDIF
231 ENDDO
232 ENDIF
233 ENDDO
234
235 WRITE(msgBuf,'(A)') 'DIAGNOSTICS_SET_POINTERS: done'
236 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
237 & SQUEEZE_RIGHT , myThid)
238 WRITE(msgBuf,'(2A)')
239 & '------------------------------------------------------------'
240 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
241 & SQUEEZE_RIGHT , myThid)
242
243 _END_MASTER( myThid )
244
245 RETURN
246 END

  ViewVC Help
Powered by ViewVC 1.1.22