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

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

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


Revision 1.18 - (show annotations) (download)
Wed Aug 14 00:57:33 2013 UTC (10 years, 8 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64o, checkpoint64n, checkpoint65, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65l, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e
Changes since 1.17: +4 -5 lines
track the status of pkg/diagnostics activation (updating pkgStatus)

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_set_levels.F,v 1.17 2011/06/15 13:14:34 jmc Exp $
2 C $Name: $
3
4 #include "DIAG_OPTIONS.h"
5
6 CBOP 0
7 C !ROUTINE: DIAGNOSTICS_SET_LEVELS
8
9 C !INTERFACE:
10 SUBROUTINE DIAGNOSTICS_SET_LEVELS( myThid )
11
12 C !DESCRIPTION:
13 C Initialize Diagnostic Levels, according to GDIAG
14 C for all available diagnostics
15 C Notes: needs to be called after all packages set they own available
16 C diagnostics
17
18 C \begin{center}
19 C \begin{tabular}[h]{|c|c|}\hline
20 C \textbf{Positions} & \textbf{Characters}
21 C & \textbf{Meanings} \\\hline
22 C parse(10) & 0 & levels = 0 \\
23 C & 1 & levels = 1 \\
24 C & R & levels = Nr \\
25 C & L & levels = MAX(Nr,NrPhys) \\
26 C & M & levels = MAX(Nr,NrPhys) - 1 \\
27 C & G & levels = Ground_level Number \\
28 C & I & levels = sea-Ice_level Number \\
29 C & X & free levels option (need to be set explicitly) \\
30 C \end{tabular}
31 C \end{center}
32
33 C !USES:
34 IMPLICIT NONE
35
36 #include "SIZE.h"
37 #define SIZE_IS_SET
38 #include "EEPARAMS.h"
39 #include "PARAMS.h"
40 #include "DIAGNOSTICS_SIZE.h"
41 #include "DIAGNOSTICS.h"
42
43 #ifdef ALLOW_FIZHI
44 #include "fizhi_SIZE.h"
45 #else
46 INTEGER Nrphys
47 PARAMETER (Nrphys=0)
48 #endif
49
50 #ifdef ALLOW_LAND
51 #include "LAND_SIZE.h"
52 #else
53 INTEGER land_nLev
54 PARAMETER ( land_nLev = 0 )
55 #endif
56
57 C !INPUT PARAMETERS:
58 C myThid :: my Thread Id number
59 INTEGER myThid
60 CEOP
61
62 C !LOCAL VARIABLES:
63 INTEGER l, n, ncount
64 INTEGER nlevs, nGroundLev
65 INTEGER dUnit, stdUnit
66 CHARACTER*(MAX_LEN_MBUF) msgBuf
67 CHARACTER*84 ccHead, ccLine
68 CHARACTER*10 gcode
69 CHARACTER*1 g10code
70 INTEGER ILNBLNK
71 EXTERNAL ILNBLNK
72
73 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
74
75 _BEGIN_MASTER( myThid )
76
77 C-- Diagnostics definition/setting ends (cannot add diags to list anymore)
78 c IF ( diag_pkgStatus.NE.2 ) STOP
79 diag_pkgStatus = 3
80
81 nlevs = MAX(Nr,Nrphys)
82 nGroundLev = land_nLev
83
84 C Diagnostic Levels
85 C -----------------
86 ncount = 0
87 DO n = 1,ndiagt
88 g10code = gdiag(n)(10:10)
89 IF ( g10code .EQ. '0' ) THEN
90 kdiag(n) = 0
91 ELSEIF ( g10code .EQ. '1' ) THEN
92 kdiag(n) = 1
93 ELSEIF ( g10code .EQ. 'R' ) THEN
94 kdiag(n) = Nr
95 ELSEIF ( g10code .EQ. 'L' ) THEN
96 kdiag(n) = nlevs
97 ELSEIF ( g10code .EQ. 'M' ) THEN
98 kdiag(n) = nlevs - 1
99 ELSEIF ( g10code .EQ. 'G' ) THEN
100 kdiag(n) = nGroundLev
101 ELSEIF ( g10code .EQ. 'g' ) THEN
102 kdiag(n) = 1
103 ELSEIF ( g10code .EQ. 'X' ) THEN
104 IF ( kdiag(n) .LE. 0 ) THEN
105 WRITE(msgBuf,'(2A,I4,3A)')
106 & '** WARNING ** DIAGNOSTICS_SET_LEVELS: ',
107 & 'level Nb =', kdiag(n), ' < 1 for diag."', cdiag(n),'"'
108 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
109 & SQUEEZE_RIGHT , myThid )
110 ENDIF
111 ELSE
112 C- enforce a strict matching:
113 WRITE(msgBuf,'(2A,4A)') 'DIAGNOSTICS_SET_LEVELS: ',
114 & 'invalid gdiag(10)="', g10code, '" code for diag."',
115 & cdiag(n),'"'
116 CALL PRINT_ERROR( msgBuf , myThid )
117 ncount = ncount + 1
118 ENDIF
119 ENDDO
120 IF ( ncount.GT.0 ) THEN
121 WRITE(msgBuf,'(2A,I6,3A)') 'DIAGNOSTICS_SET_LEVELS: ',
122 & 'found', ncount, ' invalid parser "gdiag(10)" => STOP'
123 CALL PRINT_ERROR( msgBuf , myThid )
124 STOP 'ABNORMAL END: S/R DIAGSTATS_SET_LEVELS'
125 ENDIF
126
127 C-- Check for inconsistent diagnostic parser field
128 ncount = 0
129 DO n = 1,ndiagt
130 gcode = gdiag(n)(1:10)
131 IF ( ( gcode(3:3).EQ.'r' .OR. gcode(3:3).EQ.'R' )
132 & .AND. gcode(10:10).NE.'R' ) THEN
133 WRITE(msgBuf,'(2A,4A)') 'DIAGNOSTICS_SET_LEVELS: ',
134 & 'inconsistent gdiag(3&10)="',gcode,'" for diag."',cdiag(n),'"'
135 CALL PRINT_ERROR( msgBuf , myThid )
136 ncount = ncount + 1
137 ENDIF
138 ENDDO
139 IF ( ncount.GT.0 ) THEN
140 WRITE(msgBuf,'(2A,I6,3A)') 'DIAGNOSTICS_SET_LEVELS: ',
141 & 'found', ncount, ' inconsistent parser "gdiag" => STOP'
142 CALL PRINT_ERROR( msgBuf , myThid )
143 STOP 'ABNORMAL END: S/R DIAGSTATS_SET_LEVELS'
144 ENDIF
145
146 C-- Check for unvalid diag.mate number
147 ncount = 0
148 DO n = 1,ndiagt
149 IF ( hdiag(n).LT.0 .OR. hdiag(n).GT.ndiagt ) THEN
150 WRITE(msgBuf,'(2A,I6,3A)') 'DIAGNOSTICS_SET_LEVELS: ',
151 & 'unvalid mate number=',hdiag(n),' for diag."',cdiag(n),'"'
152 CALL PRINT_ERROR( msgBuf , myThid )
153 ncount = ncount + 1
154 ENDIF
155 gcode = gdiag(n)(1:10)
156 IF ( ( gcode(5:5).EQ.'C' .OR. gcode(5:5).EQ.'P' )
157 & .AND. hdiag(n).EQ.0 ) THEN
158 WRITE(msgBuf,'(6A)') 'DIAGNOSTICS_SET_LEVELS: ',
159 & 'mate number required for diag."',cdiag(n),
160 & '" (gdiag(5)=',gcode(5:5),')'
161 CALL PRINT_ERROR( msgBuf , myThid )
162 ncount = ncount + 1
163 ENDIF
164 ENDDO
165 IF ( ncount.GT.0 ) THEN
166 WRITE(msgBuf,'(2A,I6,3A)') 'DIAGNOSTICS_SET_LEVELS: ',
167 & 'found', ncount, ' unvalid/missing mate number(s) => STOP'
168 CALL PRINT_ERROR( msgBuf , myThid )
169 STOP 'ABNORMAL END: S/R DIAGSTATS_SET_LEVELS'
170 ENDIF
171
172 C-- Print to standard output
173 stdUnit = standardMessageUnit
174 WRITE(msgBuf,'(2A)')
175 & '------------------------------------------------------------'
176 CALL PRINT_MESSAGE( msgBuf, stdUnit,SQUEEZE_RIGHT, myThid)
177 WRITE(msgBuf,'(A)') 'DIAGNOSTICS_SET_LEVELS: done'
178 CALL PRINT_MESSAGE( msgBuf, stdUnit,SQUEEZE_RIGHT, myThid)
179 WRITE(msgBuf,'(A,I6)')
180 & ' Total Nb of available Diagnostics: ndiagt=', ndiagt
181 CALL PRINT_MESSAGE( msgBuf, stdUnit,SQUEEZE_RIGHT, myThid)
182
183 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
184 C write a summary of the (long) list of all available diagnostics:
185 IF ( debugLevel.GE.debLevA .AND. myProcId.EQ.0 ) THEN
186
187 WRITE(msgBuf,'(2A)')
188 & ' write list of available Diagnostics to file: ',
189 & 'available_diagnostics.log'
190 CALL PRINT_MESSAGE( msgBuf, stdUnit,SQUEEZE_RIGHT, myThid)
191
192 WRITE(ccHead,'(2A)')
193 & ' Num |<-Name->|Levs| mate |<- code ->|',
194 & '<-- Units -->|<- Tile (max=80c)'
195 DO l=1,LEN(ccLine)
196 ccLine(l:l) = '-'
197 ENDDO
198
199 CALL MDSFINDUNIT( dUnit, mythid )
200 OPEN(dUnit, file='available_diagnostics.log',
201 & status='unknown', form='formatted')
202 WRITE(dUnit,'(A,I6)')
203 & ' Total Nb of available Diagnostics: ndiagt=', ndiagt
204 WRITE(dUnit,'(A)') ccLine
205 WRITE(dUnit,'(A)') ccHead
206 WRITE(dUnit,'(A)') ccLine
207 DO n=1,ndiagt
208 IF ( MOD(n,100).EQ.0 ) THEN
209 WRITE(dUnit,'(A)') ccLine
210 WRITE(dUnit,'(A)') ccHead
211 WRITE(dUnit,'(A)') ccLine
212 ENDIF
213 l = ILNBLNK(tdiag(n))
214 gcode = gdiag(n)(1:10)
215 IF ( hdiag(n).NE.0 .AND. l.GE.1 ) THEN
216 WRITE(dUnit,'(I6,3A,I3,A,I6,6A)') n, ' |', cdiag(n), '|',
217 & kdiag(n),' |', hdiag(n), ' |', gcode, '|',
218 & udiag(n), '|', tdiag(n)(1:l)
219 ELSEIF ( hdiag(n).NE.0 ) THEN
220 WRITE(dUnit,'(I6,3A,I3,A,I6,6A)') n, ' |', cdiag(n), '|',
221 & kdiag(n),' |', hdiag(n), ' |', gcode, '|',
222 & udiag(n), '|'
223 ELSEIF (l.GE.1) THEN
224 WRITE(dUnit,'(I6,3A,I3,6A)') n, ' |', cdiag(n), '|',
225 & kdiag(n),' | |', gcode, '|',
226 & udiag(n), '|', tdiag(n)(1:l)
227 ELSE
228 WRITE(dUnit,'(I6,3A,I3,6A)') n, ' |', cdiag(n), '|',
229 & kdiag(n),' | |', gcode, '|',
230 & udiag(n), '|'
231 ENDIF
232 ENDDO
233 WRITE(dUnit,'(A)') ccLine
234 WRITE(dUnit,'(A)') ccHead
235 WRITE(dUnit,'(A)') ccLine
236 CLOSE(dUnit)
237
238 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
239 ENDIF
240
241 C-- Check for multiple definition of the same diagnostic name
242 DO n = 2,ndiagt
243 IF ( cdiag(n).NE.blkName ) THEN
244 DO l = 1,n-1
245 IF ( cdiag(l).EQ.cdiag(n) ) THEN
246 WRITE(msgBuf,'(4A)') 'DIAGNOSTICS_SET_LEVELS: ',
247 & 'diag.Name: ',cdiag(n),' registered 2 times :'
248 CALL PRINT_ERROR( msgBuf , myThid )
249 WRITE(msgBuf,'(2A,I4,2A)') 'DIAGNOSTICS_SET_LEVELS: ',
250 & '1rst (l=', l, ' ), title= ',tdiag(l)
251 CALL PRINT_ERROR( msgBuf , myThid )
252 WRITE(msgBuf,'(2A,I4,2A)') 'DIAGNOSTICS_SET_LEVELS: ',
253 & ' 2nd (n=', n, ' ), title= ',tdiag(n)
254 CALL PRINT_ERROR( msgBuf , myThid )
255 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_LEVELS'
256 ENDIF
257 ENDDO
258 ENDIF
259 ENDDO
260
261 C-- Check that number of levels to write (in data.diagnostics) does not
262 C exceeds max size: nlevs=max(Nr,NrPhys)
263 C note: max size of array to write has been changed to "numLevels",
264 C so that this checking is no longer usefull since nlevels
265 C cannot be larger than "numLevels" anyway.
266
267 _END_MASTER( myThid )
268
269 C-- Everyone else must wait for the levels to be set
270 _BARRIER
271
272 RETURN
273 END

  ViewVC Help
Powered by ViewVC 1.1.22