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

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

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


Revision 1.18 - (hide annotations) (download)
Wed Aug 14 00:57:33 2013 UTC (10 years, 9 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 jmc 1.18 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_set_levels.F,v 1.17 2011/06/15 13:14:34 jmc Exp $
2 jmc 1.1 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 jmc 1.6 C & G & levels = Ground_level Number \\
28     C & I & levels = sea-Ice_level Number \\
29 jmc 1.16 C & X & free levels option (need to be set explicitly) \\
30 jmc 1.1 C \end{tabular}
31     C \end{center}
32    
33     C !USES:
34     IMPLICIT NONE
35    
36     #include "SIZE.h"
37 jmc 1.6 #define SIZE_IS_SET
38 jmc 1.1 #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 jmc 1.6 #ifdef ALLOW_LAND
51     #include "LAND_SIZE.h"
52     #else
53     INTEGER land_nLev
54     PARAMETER ( land_nLev = 0 )
55     #endif
56    
57 jmc 1.1 C !INPUT PARAMETERS:
58 jmc 1.2 C myThid :: my Thread Id number
59 jmc 1.1 INTEGER myThid
60     CEOP
61    
62 jmc 1.2 C !LOCAL VARIABLES:
63 jmc 1.13 INTEGER l, n, ncount
64     INTEGER nlevs, nGroundLev
65 jmc 1.2 INTEGER dUnit, stdUnit
66     CHARACTER*(MAX_LEN_MBUF) msgBuf
67 jmc 1.13 CHARACTER*84 ccHead, ccLine
68     CHARACTER*10 gcode
69 jmc 1.16 CHARACTER*1 g10code
70 jmc 1.2 INTEGER ILNBLNK
71     EXTERNAL ILNBLNK
72    
73 jmc 1.1 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
74    
75 jmc 1.9 _BEGIN_MASTER( myThid )
76    
77 jmc 1.16 C-- Diagnostics definition/setting ends (cannot add diags to list anymore)
78 jmc 1.18 c IF ( diag_pkgStatus.NE.2 ) STOP
79     diag_pkgStatus = 3
80 jmc 1.16
81 jmc 1.1 nlevs = MAX(Nr,Nrphys)
82 jmc 1.6 nGroundLev = land_nLev
83 jmc 1.1
84 jmc 1.13 C Diagnostic Levels
85     C -----------------
86 jmc 1.16 ncount = 0
87 jmc 1.1 DO n = 1,ndiagt
88 jmc 1.16 g10code = gdiag(n)(10:10)
89     IF ( g10code .EQ. '0' ) THEN
90 jmc 1.8 kdiag(n) = 0
91 jmc 1.16 ELSEIF ( g10code .EQ. '1' ) THEN
92 jmc 1.8 kdiag(n) = 1
93 jmc 1.16 ELSEIF ( g10code .EQ. 'R' ) THEN
94 jmc 1.8 kdiag(n) = Nr
95 jmc 1.16 ELSEIF ( g10code .EQ. 'L' ) THEN
96 jmc 1.8 kdiag(n) = nlevs
97 jmc 1.16 ELSEIF ( g10code .EQ. 'M' ) THEN
98 jmc 1.8 kdiag(n) = nlevs - 1
99 jmc 1.16 ELSEIF ( g10code .EQ. 'G' ) THEN
100 jmc 1.8 kdiag(n) = nGroundLev
101 jmc 1.16 ELSEIF ( g10code .EQ. 'g' ) THEN
102 jmc 1.8 kdiag(n) = 1
103 jmc 1.16 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 jmc 1.8 ENDIF
119 jmc 1.1 ENDDO
120 jmc 1.16 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 jmc 1.1
127 jmc 1.15 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 jmc 1.13 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 jmc 1.17 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 jmc 1.13 ENDDO
165     IF ( ncount.GT.0 ) THEN
166     WRITE(msgBuf,'(2A,I6,3A)') 'DIAGNOSTICS_SET_LEVELS: ',
167 jmc 1.17 & 'found', ncount, ' unvalid/missing mate number(s) => STOP'
168 jmc 1.13 CALL PRINT_ERROR( msgBuf , myThid )
169     STOP 'ABNORMAL END: S/R DIAGSTATS_SET_LEVELS'
170     ENDIF
171    
172 jmc 1.15 C-- Print to standard output
173 jmc 1.2 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 jmc 1.13 WRITE(msgBuf,'(A,I6)')
180 jmc 1.2 & ' 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 jmc 1.14 IF ( debugLevel.GE.debLevA .AND. myProcId.EQ.0 ) THEN
186 jmc 1.2
187     WRITE(msgBuf,'(2A)')
188     & ' write list of available Diagnostics to file: ',
189 jmc 1.7 & 'available_diagnostics.log'
190 jmc 1.2 CALL PRINT_MESSAGE( msgBuf, stdUnit,SQUEEZE_RIGHT, myThid)
191    
192     WRITE(ccHead,'(2A)')
193 jmc 1.13 & ' Num |<-Name->|Levs| mate |<- code ->|',
194     & '<-- Units -->|<- Tile (max=80c)'
195 jmc 1.2 DO l=1,LEN(ccLine)
196     ccLine(l:l) = '-'
197     ENDDO
198    
199     CALL MDSFINDUNIT( dUnit, mythid )
200 jmc 1.4 OPEN(dUnit, file='available_diagnostics.log',
201     & status='unknown', form='formatted')
202 jmc 1.13 WRITE(dUnit,'(A,I6)')
203 jmc 1.2 & ' 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 jmc 1.13 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 jmc 1.2 ELSE
228 jmc 1.13 WRITE(dUnit,'(I6,3A,I3,6A)') n, ' |', cdiag(n), '|',
229     & kdiag(n),' | |', gcode, '|',
230     & udiag(n), '|'
231 jmc 1.2 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 jmc 1.3
241     C-- Check for multiple definition of the same diagnostic name
242     DO n = 2,ndiagt
243 jmc 1.18 IF ( cdiag(n).NE.blkName ) THEN
244 jmc 1.3 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 jmc 1.5 C-- Check that number of levels to write (in data.diagnostics) does not
262     C exceeds max size: nlevs=max(Nr,NrPhys)
263 jmc 1.12 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 jmc 1.5
267 jmc 1.2 _END_MASTER( myThid )
268    
269 jmc 1.9 C-- Everyone else must wait for the levels to be set
270     _BARRIER
271    
272 jmc 1.1 RETURN
273     END

  ViewVC Help
Powered by ViewVC 1.1.22