/[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.19 - (show annotations) (download)
Tue Jun 2 20:58:22 2015 UTC (8 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65n, checkpoint65o, checkpoint65m, HEAD
Changes since 1.18: +3 -2 lines
add few _BARRIER around anyupdate of "diag_pkgStatus"

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_set_levels.F,v 1.18 2013/08/14 00:57:33 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 _BARRIER
76 _BEGIN_MASTER( myThid )
77
78 C-- Diagnostics definition/setting ends (cannot add diags to list anymore)
79 c IF ( diag_pkgStatus.NE.2 ) STOP
80 diag_pkgStatus = 3
81
82 nlevs = MAX(Nr,Nrphys)
83 nGroundLev = land_nLev
84
85 C Diagnostic Levels
86 C -----------------
87 ncount = 0
88 DO n = 1,ndiagt
89 g10code = gdiag(n)(10:10)
90 IF ( g10code .EQ. '0' ) THEN
91 kdiag(n) = 0
92 ELSEIF ( g10code .EQ. '1' ) THEN
93 kdiag(n) = 1
94 ELSEIF ( g10code .EQ. 'R' ) THEN
95 kdiag(n) = Nr
96 ELSEIF ( g10code .EQ. 'L' ) THEN
97 kdiag(n) = nlevs
98 ELSEIF ( g10code .EQ. 'M' ) THEN
99 kdiag(n) = nlevs - 1
100 ELSEIF ( g10code .EQ. 'G' ) THEN
101 kdiag(n) = nGroundLev
102 ELSEIF ( g10code .EQ. 'g' ) THEN
103 kdiag(n) = 1
104 ELSEIF ( g10code .EQ. 'X' ) THEN
105 IF ( kdiag(n) .LE. 0 ) THEN
106 WRITE(msgBuf,'(2A,I4,3A)')
107 & '** WARNING ** DIAGNOSTICS_SET_LEVELS: ',
108 & 'level Nb =', kdiag(n), ' < 1 for diag."', cdiag(n),'"'
109 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
110 & SQUEEZE_RIGHT , myThid )
111 ENDIF
112 ELSE
113 C- enforce a strict matching:
114 WRITE(msgBuf,'(2A,4A)') 'DIAGNOSTICS_SET_LEVELS: ',
115 & 'invalid gdiag(10)="', g10code, '" code for diag."',
116 & cdiag(n),'"'
117 CALL PRINT_ERROR( msgBuf , myThid )
118 ncount = ncount + 1
119 ENDIF
120 ENDDO
121 IF ( ncount.GT.0 ) THEN
122 WRITE(msgBuf,'(2A,I6,3A)') 'DIAGNOSTICS_SET_LEVELS: ',
123 & 'found', ncount, ' invalid parser "gdiag(10)" => STOP'
124 CALL PRINT_ERROR( msgBuf , myThid )
125 STOP 'ABNORMAL END: S/R DIAGSTATS_SET_LEVELS'
126 ENDIF
127
128 C-- Check for inconsistent diagnostic parser field
129 ncount = 0
130 DO n = 1,ndiagt
131 gcode = gdiag(n)(1:10)
132 IF ( ( gcode(3:3).EQ.'r' .OR. gcode(3:3).EQ.'R' )
133 & .AND. gcode(10:10).NE.'R' ) THEN
134 WRITE(msgBuf,'(2A,4A)') 'DIAGNOSTICS_SET_LEVELS: ',
135 & 'inconsistent gdiag(3&10)="',gcode,'" for diag."',cdiag(n),'"'
136 CALL PRINT_ERROR( msgBuf , myThid )
137 ncount = ncount + 1
138 ENDIF
139 ENDDO
140 IF ( ncount.GT.0 ) THEN
141 WRITE(msgBuf,'(2A,I6,3A)') 'DIAGNOSTICS_SET_LEVELS: ',
142 & 'found', ncount, ' inconsistent parser "gdiag" => STOP'
143 CALL PRINT_ERROR( msgBuf , myThid )
144 STOP 'ABNORMAL END: S/R DIAGSTATS_SET_LEVELS'
145 ENDIF
146
147 C-- Check for unvalid diag.mate number
148 ncount = 0
149 DO n = 1,ndiagt
150 IF ( hdiag(n).LT.0 .OR. hdiag(n).GT.ndiagt ) THEN
151 WRITE(msgBuf,'(2A,I6,3A)') 'DIAGNOSTICS_SET_LEVELS: ',
152 & 'unvalid mate number=',hdiag(n),' for diag."',cdiag(n),'"'
153 CALL PRINT_ERROR( msgBuf , myThid )
154 ncount = ncount + 1
155 ENDIF
156 gcode = gdiag(n)(1:10)
157 IF ( ( gcode(5:5).EQ.'C' .OR. gcode(5:5).EQ.'P' )
158 & .AND. hdiag(n).EQ.0 ) THEN
159 WRITE(msgBuf,'(6A)') 'DIAGNOSTICS_SET_LEVELS: ',
160 & 'mate number required for diag."',cdiag(n),
161 & '" (gdiag(5)=',gcode(5:5),')'
162 CALL PRINT_ERROR( msgBuf , myThid )
163 ncount = ncount + 1
164 ENDIF
165 ENDDO
166 IF ( ncount.GT.0 ) THEN
167 WRITE(msgBuf,'(2A,I6,3A)') 'DIAGNOSTICS_SET_LEVELS: ',
168 & 'found', ncount, ' unvalid/missing mate number(s) => STOP'
169 CALL PRINT_ERROR( msgBuf , myThid )
170 STOP 'ABNORMAL END: S/R DIAGSTATS_SET_LEVELS'
171 ENDIF
172
173 C-- Print to standard output
174 stdUnit = standardMessageUnit
175 WRITE(msgBuf,'(2A)')
176 & '------------------------------------------------------------'
177 CALL PRINT_MESSAGE( msgBuf, stdUnit,SQUEEZE_RIGHT, myThid)
178 WRITE(msgBuf,'(A)') 'DIAGNOSTICS_SET_LEVELS: done'
179 CALL PRINT_MESSAGE( msgBuf, stdUnit,SQUEEZE_RIGHT, myThid)
180 WRITE(msgBuf,'(A,I6)')
181 & ' Total Nb of available Diagnostics: ndiagt=', ndiagt
182 CALL PRINT_MESSAGE( msgBuf, stdUnit,SQUEEZE_RIGHT, myThid)
183
184 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
185 C write a summary of the (long) list of all available diagnostics:
186 IF ( debugLevel.GE.debLevA .AND. myProcId.EQ.0 ) THEN
187
188 WRITE(msgBuf,'(2A)')
189 & ' write list of available Diagnostics to file: ',
190 & 'available_diagnostics.log'
191 CALL PRINT_MESSAGE( msgBuf, stdUnit,SQUEEZE_RIGHT, myThid)
192
193 WRITE(ccHead,'(2A)')
194 & ' Num |<-Name->|Levs| mate |<- code ->|',
195 & '<-- Units -->|<- Tile (max=80c)'
196 DO l=1,LEN(ccLine)
197 ccLine(l:l) = '-'
198 ENDDO
199
200 CALL MDSFINDUNIT( dUnit, myThid )
201 OPEN(dUnit, file='available_diagnostics.log',
202 & status='unknown', form='formatted')
203 WRITE(dUnit,'(A,I6)')
204 & ' Total Nb of available Diagnostics: ndiagt=', ndiagt
205 WRITE(dUnit,'(A)') ccLine
206 WRITE(dUnit,'(A)') ccHead
207 WRITE(dUnit,'(A)') ccLine
208 DO n=1,ndiagt
209 IF ( MOD(n,100).EQ.0 ) THEN
210 WRITE(dUnit,'(A)') ccLine
211 WRITE(dUnit,'(A)') ccHead
212 WRITE(dUnit,'(A)') ccLine
213 ENDIF
214 l = ILNBLNK(tdiag(n))
215 gcode = gdiag(n)(1:10)
216 IF ( hdiag(n).NE.0 .AND. l.GE.1 ) THEN
217 WRITE(dUnit,'(I6,3A,I3,A,I6,6A)') n, ' |', cdiag(n), '|',
218 & kdiag(n),' |', hdiag(n), ' |', gcode, '|',
219 & udiag(n), '|', tdiag(n)(1:l)
220 ELSEIF ( hdiag(n).NE.0 ) THEN
221 WRITE(dUnit,'(I6,3A,I3,A,I6,6A)') n, ' |', cdiag(n), '|',
222 & kdiag(n),' |', hdiag(n), ' |', gcode, '|',
223 & udiag(n), '|'
224 ELSEIF (l.GE.1) THEN
225 WRITE(dUnit,'(I6,3A,I3,6A)') n, ' |', cdiag(n), '|',
226 & kdiag(n),' | |', gcode, '|',
227 & udiag(n), '|', tdiag(n)(1:l)
228 ELSE
229 WRITE(dUnit,'(I6,3A,I3,6A)') n, ' |', cdiag(n), '|',
230 & kdiag(n),' | |', gcode, '|',
231 & udiag(n), '|'
232 ENDIF
233 ENDDO
234 WRITE(dUnit,'(A)') ccLine
235 WRITE(dUnit,'(A)') ccHead
236 WRITE(dUnit,'(A)') ccLine
237 CLOSE(dUnit)
238
239 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
240 ENDIF
241
242 C-- Check for multiple definition of the same diagnostic name
243 DO n = 2,ndiagt
244 IF ( cdiag(n).NE.blkName ) THEN
245 DO l = 1,n-1
246 IF ( cdiag(l).EQ.cdiag(n) ) THEN
247 WRITE(msgBuf,'(4A)') 'DIAGNOSTICS_SET_LEVELS: ',
248 & 'diag.Name: ',cdiag(n),' registered 2 times :'
249 CALL PRINT_ERROR( msgBuf , myThid )
250 WRITE(msgBuf,'(2A,I4,2A)') 'DIAGNOSTICS_SET_LEVELS: ',
251 & '1rst (l=', l, ' ), title= ',tdiag(l)
252 CALL PRINT_ERROR( msgBuf , myThid )
253 WRITE(msgBuf,'(2A,I4,2A)') 'DIAGNOSTICS_SET_LEVELS: ',
254 & ' 2nd (n=', n, ' ), title= ',tdiag(n)
255 CALL PRINT_ERROR( msgBuf , myThid )
256 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_LEVELS'
257 ENDIF
258 ENDDO
259 ENDIF
260 ENDDO
261
262 C-- Check that number of levels to write (in data.diagnostics) does not
263 C exceeds max size: nlevs=max(Nr,NrPhys)
264 C note: max size of array to write has been changed to "numLevels",
265 C so that this checking is no longer usefull since nlevels
266 C cannot be larger than "numLevels" anyway.
267
268 _END_MASTER( myThid )
269
270 C-- Everyone else must wait for the levels to be set
271 _BARRIER
272
273 RETURN
274 END

  ViewVC Help
Powered by ViewVC 1.1.22