/[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.3 - (show annotations) (download)
Mon Dec 20 01:52:58 2004 UTC (19 years, 5 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint57d_post, checkpoint57g_post, checkpoint57b_post, checkpoint57c_pre, checkpoint57e_post, checkpoint57g_pre, checkpoint57f_pre, eckpoint57e_pre, checkpoint57f_post, checkpoint57c_post, checkpoint57h_pre, checkpoint57h_post
Changes since 1.2: +72 -8 lines
only write "meaningfull" levels when this entry is omitted in data.diagnostics

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_set_pointers.F,v 1.2 2004/12/15 00:18:39 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 - Thread number for this instance of the routine.
30 INTEGER myThid
31 CEOP
32
33 C !LOCAL VARIABLES:
34 C == Local variables ==
35 INTEGER ndiagcount
36 INTEGER m,mm,n
37 INTEGER mate, nActiveMax
38 INTEGER l, k, kLev
39 LOGICAL found
40 CHARACTER*(MAX_LEN_MBUF) msgBuf
41
42 C-- Calculate pointers for diagnostics set to non-zero frequency
43
44 _BEGIN_MASTER( myThid)
45
46 ndiagcount = 0
47 nActiveMax = 0
48 DO n=1,nlists
49 nActive(n) = nfields(n)
50 DO m=1,nfields(n)
51
52 found = .FALSE.
53 C Search all possible model diagnostics
54 DO mm=1,ndiagt
55 IF ( flds(m,n).EQ.cdiag(mm) ) THEN
56 CALL DIAGNOSTICS_SETDIAG (mate,ndiagcount,mm,myThid)
57 found = .TRUE.
58 jdiag(m,n) = mm
59 ENDIF
60 ENDDO
61 IF ( .NOT.found ) THEN
62 WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',
63 & flds(m,n),' is not a Diagnostic'
64 CALL PRINT_ERROR( msgBuf , myThid )
65 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
66 ENDIF
67 IF ( found .AND. mate.GE.1 ) THEN
68 nActive(n) = nActive(n) + 1
69 IF ( nActive(n).LE.numperlist ) THEN
70 jdiag(nActive(n),n) = mate
71 flds( nActive(n),n) = cdiag(mate)
72 ENDIF
73 ENDIF
74
75 ENDDO
76 nActiveMax = MAX(nActive(n),nActiveMax)
77 ENDDO
78
79 IF ( ndiagcount.LE.numdiags .AND.
80 & nActiveMax.LE.numperlist ) THEN
81 WRITE(msgBuf,'(A,I6,A)')
82 & ' space allocated for all diagnostics:',
83 & ndiagcount, ' levels'
84 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
85 & SQUEEZE_RIGHT , myThid)
86 ELSE
87 IF ( ndiagcount.GT.numdiags ) THEN
88 WRITE(msgBuf,'(2A)')
89 & 'DIAGNOSTICS_SET_POINTERS: Not enough space',
90 & ' for all active diagnostics (from data.diagnostics)'
91 CALL PRINT_ERROR( msgBuf , myThid )
92 WRITE(msgBuf,'(A,I6,A,I6)')
93 & 'DIAGNOSTICS_SET_POINTERS: numdiags=', numdiags,
94 & ' but needs at least', ndiagcount
95 CALL PRINT_ERROR( msgBuf , myThid )
96 ENDIF
97 IF ( nActiveMax.GT.numperlist ) THEN
98 WRITE(msgBuf,'(2A)')
99 & 'DIAGNOSTICS_SET_POINTERS: Not enough space',
100 & ' for all active diagnostics (from data.diagnostics)'
101 CALL PRINT_ERROR( msgBuf , myThid )
102 WRITE(msgBuf,'(A,I6,A,I6)')
103 & 'DIAGNOSTICS_SET_POINTERS: numperlist=', numperlist,
104 & ' but needs at least', nActiveMax
105 CALL PRINT_ERROR( msgBuf , myThid )
106 ENDIF
107 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
108 ENDIF
109
110 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
111 C-- Set list of levels to write (if not specified in data.diagnostics)
112
113 DO n=1,nlists
114 IF ( nlevels(n).EQ.-1 ) THEN
115 C- set Nb of levels to the minimum size of all diag of this list:
116 kLev = numLevels
117 DO m=1,nfields(n)
118 mm = jdiag(m,n)
119 kLev = MIN(kdiag(mm),kLev)
120 ENDDO
121 IF ( kLev.LE.0 ) THEN
122 WRITE(msgBuf,'(2A,I4,2A)')
123 & 'DIAGNOSTICS_SET_POINTERS: kLev < 1 in ',
124 & ' setting levs of list n=',n,', fnames: ', fnames(n)
125 CALL PRINT_ERROR( msgBuf , myThid )
126 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
127 ENDIF
128 nlevels(n) = kLev
129 DO k=1,kLev
130 levs(k,n) = k
131 ENDDO
132 WRITE(msgBuf,'(3A)') 'DIAGNOSTICS_SET_POINTERS: ',
133 & 'Set levels for Outp.Stream: ',fnames(n)
134 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
135 & SQUEEZE_RIGHT, myThid)
136 DO l=1,nlevels(n),20
137 m = MIN(nlevels(n),l+19)
138 WRITE(msgBuf,'(A,20F5.0)')' Levels: ',(levs(k,n),k=l,m)
139 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
140 & SQUEEZE_RIGHT, myThid)
141 ENDDO
142 ELSE
143 C- Check for levels out of range ( > kdiag)
144 kLev = 0
145 DO k=1,nlevels(n)
146 kLev = MAX(NINT(levs(k,n)),kLev)
147 ENDDO
148 DO m=1,nfields(n)
149 mm = jdiag(m,n)
150 IF ( kLev.GT.kdiag(mm) ) THEN
151 C- Note: diagnostics_out take care (in some way) of this case
152 C so that it does not cause "index out-off bounds" error.
153 C However, the output file looks strange.
154 C- For now, choose to stop, but could change it to just a warning
155 WRITE(msgBuf,'(A,I3,A,I3,2A)')
156 & 'DIAGNOSTICS_SET_POINTERS: Ask for level=',kLev,
157 & ' in list n=', n, ', filename: ', fnames(n)
158 CALL PRINT_ERROR( msgBuf , myThid )
159 WRITE(msgBuf,'(2A,I3,A,I3,2A)')
160 & 'DIAGNOSTICS_SET_POINTERS: ==> exceed Max.Nb of lev.',
161 & '(=',kdiag(mm),') for Diag. #', mm, ' : ',cdiag(mm)
162 CALL PRINT_ERROR( msgBuf , myThid )
163 WRITE(msgBuf,'(4A)') 'DIAGNOSTICS_SET_POINTERS: ',
164 & ' parsing code >>',gdiag(mm),'<<'
165 CALL PRINT_ERROR( msgBuf , myThid )
166 STOP 'ABNORMAL END: S/R DIAGNOSTICS_SET_POINTERS'
167 ENDIF
168 ENDDO
169 ENDIF
170 ENDDO
171
172 WRITE(msgBuf,'(A)') 'DIAGNOSTICS_SET_POINTERS: done'
173 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
174 & SQUEEZE_RIGHT , myThid)
175 WRITE(msgBuf,'(2A)')
176 & '------------------------------------------------------------'
177 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
178 & SQUEEZE_RIGHT , myThid)
179
180 _END_MASTER( myThid )
181
182 RETURN
183 END

  ViewVC Help
Powered by ViewVC 1.1.22