/[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.6 - (show annotations) (download)
Mon Jun 5 18:05:48 2006 UTC (17 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint58l_post, checkpoint58r_post, checkpoint58n_post, checkpoint58h_post, checkpoint58q_post, checkpoint58j_post, checkpoint58i_post, checkpoint58g_post, checkpoint58o_post, checkpoint58k_post, checkpoint58p_post, checkpoint58m_post
Changes since 1.5: +3 -2 lines
update comments.

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

  ViewVC Help
Powered by ViewVC 1.1.22