/[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.9 - (show annotations) (download)
Tue Jan 29 00:35:31 2008 UTC (16 years, 3 months ago) by jahn
Branch: MAIN
Changes since 1.8: +2 -2 lines
hack for problem with more than 999 diagnostics: don't assign mdiag for diagnostics > 999

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

  ViewVC Help
Powered by ViewVC 1.1.22