/[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.5 - (show annotations) (download)
Sun Jun 26 16:51:49 2005 UTC (18 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint57t_post, checkpoint57o_post, checkpoint58e_post, checkpoint57m_post, checkpoint57s_post, checkpoint57k_post, checkpoint57y_post, checkpoint57y_pre, checkpoint57v_post, checkpoint57r_post, checkpoint58, checkpoint58f_post, checkpoint57x_post, checkpoint57n_post, checkpoint58d_post, checkpoint58c_post, checkpoint57w_post, checkpoint57p_post, checkpint57u_post, checkpoint58a_post, checkpoint57q_post, checkpoint57z_post, checkpoint57j_post, checkpoint58b_post, checkpoint57l_post
Changes since 1.4: +79 -41 lines
change pointers so that 1 diag. can be used several times (with # freq.)

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

  ViewVC Help
Powered by ViewVC 1.1.22