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

Contents of /MITgcm/pkg/diagnostics/diagnostics_utils.F

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


Revision 1.23 - (show annotations) (download)
Sun Jun 25 23:03:55 2006 UTC (17 years, 10 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint58l_post, mitgcm_mapl_00, checkpoint58r_post, checkpoint58n_post, checkpoint58q_post, checkpoint58o_post, checkpoint58k_post, checkpoint58s_post, checkpoint58p_post, checkpoint58m_post
Changes since 1.22: +72 -1 lines
add a small function to make a diagnostics title from several pieces

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_utils.F,v 1.22 2005/07/11 16:20:10 molod Exp $
2 C $Name: $
3
4 #include "DIAG_OPTIONS.h"
5
6 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7 CBOP 0
8 C !ROUTINE: GETDIAG
9
10 C !INTERFACE:
11 SUBROUTINE GETDIAG(
12 I levreal, undef,
13 O qtmp,
14 I ndId, mate, ip, im, bi, bj, myThid )
15
16 C !DESCRIPTION:
17 C Retrieve averaged model diagnostic
18
19 C !USES:
20 IMPLICIT NONE
21 #include "EEPARAMS.h"
22 #include "SIZE.h"
23 #include "DIAGNOSTICS_SIZE.h"
24 #include "DIAGNOSTICS.h"
25
26 C !INPUT PARAMETERS:
27 C levreal :: Diagnostic LEVEL
28 C undef :: UNDEFINED VALUE
29 C ndId :: DIAGNOSTIC NUMBER FROM MENU
30 C mate :: counter DIAGNOSTIC NUMBER if any ; 0 otherwise
31 C ip :: pointer to storage array location for diag.
32 C im :: pointer to storage array location for mate
33 C bi :: X-direction tile number
34 C bj :: Y-direction tile number
35 C myThid :: my thread Id number
36 _RL levreal
37 _RL undef
38 INTEGER ndId, mate, ip, im
39 INTEGER bi,bj, myThid
40
41 C !OUTPUT PARAMETERS:
42 C qtmp ..... AVERAGED DIAGNOSTIC QUANTITY
43 _RL qtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
44 CEOP
45
46 C !LOCAL VARIABLES:
47 _RL factor
48 INTEGER i, j, ipnt,ipCt
49 INTEGER lev, levCt, klev
50
51 IF (ndId.GE.1) THEN
52 lev = NINT(levreal)
53 klev = kdiag(ndId)
54 IF (lev.LE.klev) THEN
55
56 IF ( mate.EQ.0 ) THEN
57 C- No counter diagnostics => average = Sum / ndiag :
58
59 ipnt = ip + lev - 1
60 factor = FLOAT(ndiag(ip,bi,bj))
61 IF (ndiag(ip,bi,bj).NE.0) factor = 1. _d 0 / factor
62
63 DO j = 1,sNy+1
64 DO i = 1,sNx+1
65 IF ( qdiag(i,j,ipnt,bi,bj) .LE. undef ) THEN
66 qtmp(i,j) = qdiag(i,j,ipnt,bi,bj)*factor
67 ELSE
68 qtmp(i,j) = undef
69 ENDIF
70 ENDDO
71 ENDDO
72
73 ELSE
74 C- With counter diagnostics => average = Sum / counter:
75
76 ipnt = ip + lev - 1
77 levCt= MIN(lev,kdiag(mate))
78 ipCt = im + levCt - 1
79 DO j = 1,sNy+1
80 DO i = 1,sNx+1
81 IF ( qdiag(i,j,ipCt,bi,bj) .NE. 0. ) THEN
82 qtmp(i,j) = qdiag(i,j,ipnt,bi,bj)
83 & / qdiag(i,j,ipCt,bi,bj)
84 ELSE
85 qtmp(i,j) = undef
86 ENDIF
87 ENDDO
88 ENDDO
89
90 ENDIF
91 ENDIF
92 ENDIF
93
94 RETURN
95 END
96
97 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
98
99 CBOP 0
100 C !ROUTINE: DIAGNOSTICS_COUNT
101 C !INTERFACE:
102 SUBROUTINE DIAGNOSTICS_COUNT (chardiag,
103 I biArg, bjArg, myThid)
104
105 C !DESCRIPTION:
106 C***********************************************************************
107 C routine to increment the diagnostic counter only
108 C***********************************************************************
109 C !USES:
110 IMPLICIT NONE
111
112 C == Global variables ===
113 #include "EEPARAMS.h"
114 #include "SIZE.h"
115 #include "DIAGNOSTICS_SIZE.h"
116 #include "DIAGNOSTICS.h"
117
118 C !INPUT PARAMETERS:
119 C***********************************************************************
120 C Arguments Description
121 C ----------------------
122 C chardiag :: Character expression for diag to increment the counter
123 C biArg :: X-direction tile number, or 0 if called outside bi,bj loops
124 C bjArg :: Y-direction tile number, or 0 if called outside bi,bj loops
125 C myThid :: my thread Id number
126 C***********************************************************************
127 CHARACTER*8 chardiag
128 INTEGER biArg, bjArg
129 INTEGER myThid
130 CEOP
131
132 C !LOCAL VARIABLES:
133 C ===============
134 INTEGER m, n
135 INTEGER bi, bj
136 INTEGER ipt
137 c CHARACTER*(MAX_LEN_MBUF) msgBuf
138
139 C-- Run through list of active diagnostics to find which counter
140 C to increment (needs to be a valid & active diagnostic-counter)
141 DO n=1,nlists
142 DO m=1,nActive(n)
143 IF ( chardiag.EQ.flds(m,n) .AND. idiag(m,n).GT.0 ) THEN
144 ipt = idiag(m,n)
145 IF (ndiag(ipt,1,1).GE.0) THEN
146 C- Increment the counter for the diagnostic
147 IF ( biArg.EQ.0 .AND. bjArg.EQ.0 ) THEN
148 DO bj=myByLo(myThid), myByHi(myThid)
149 DO bi=myBxLo(myThid), myBxHi(myThid)
150 ndiag(ipt,bi,bj) = ndiag(ipt,bi,bj) + 1
151 ENDDO
152 ENDDO
153 ELSE
154 bi = MIN(biArg,nSx)
155 bj = MIN(bjArg,nSy)
156 ndiag(ipt,bi,bj) = ndiag(ipt,bi,bj) + 1
157 ENDIF
158 C- Increment is done
159 ENDIF
160 ENDIF
161 ENDDO
162 ENDDO
163
164 RETURN
165 END
166
167 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
168
169 CBOP 0
170 C !ROUTINE: DIAGS_MK_UNITS
171
172 C !INTERFACE:
173 CHARACTER*16 FUNCTION DIAGS_MK_UNITS(
174 I diagUnitsInPieces, myThid )
175
176 C !DESCRIPTION:
177 C *==========================================================*
178 C | FUNCTION DIAGS_MK_UNITS
179 C | o Return the diagnostic units string (16c) removing
180 C | blanks from the input string
181 C *==========================================================*
182
183 C !USES:
184 IMPLICIT NONE
185 #include "EEPARAMS.h"
186
187 C !INPUT PARAMETERS:
188 C diagUnitsInPieces :: string for diagnostic units: in several
189 C pieces, with blanks in between
190 C myThid :: my thread Id number
191 CHARACTER*(*) diagUnitsInPieces
192 INTEGER myThid
193 CEOP
194
195 C !LOCAL VARIABLES:
196 CHARACTER*(MAX_LEN_MBUF) msgBuf
197 INTEGER i,j,n
198
199 DIAGS_MK_UNITS = ' '
200 n = LEN(diagUnitsInPieces)
201
202 j = 0
203 DO i=1,n
204 IF (diagUnitsInPieces(i:i) .NE. ' ' ) THEN
205 j = j+1
206 IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
207 ENDIF
208 ENDDO
209
210 IF ( j.GT.16 ) THEN
211 WRITE(msgBuf,'(2A,I4,A)') '**WARNING** ',
212 & 'DIAGS_MK_UNITS: too long (',j,' >16) input string'
213 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
214 & SQUEEZE_RIGHT , myThid)
215 WRITE(msgBuf,'(3A)') '**WARNING** ',
216 & 'DIAGS_MK_UNITS: input=', diagUnitsInPieces
217 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
218 & SQUEEZE_RIGHT , myThid)
219 ENDIF
220
221 RETURN
222 END
223
224 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
225
226 CBOP 0
227 C !ROUTINE: DIAGS_MK_TITLE
228
229 C !INTERFACE:
230 CHARACTER*80 FUNCTION DIAGS_MK_TITLE(
231 I diagTitleInPieces, myThid )
232
233 C !DESCRIPTION:
234 C *==========================================================*
235 C | FUNCTION DIAGS_MK_TITLE
236 C | o Return the diagnostic title string (80c) removing
237 C | consecutive blanks from the input string
238 C *==========================================================*
239
240 C !USES:
241 IMPLICIT NONE
242 #include "EEPARAMS.h"
243
244 C !INPUT PARAMETERS:
245 C diagTitleInPieces :: string for diagnostic units: in several
246 C pieces, with blanks in between
247 C myThid :: my Thread Id number
248 CHARACTER*(*) diagTitleInPieces
249 INTEGER myThid
250 CEOP
251
252 C !LOCAL VARIABLES:
253 CHARACTER*(MAX_LEN_MBUF) msgBuf
254 LOGICAL flag
255 INTEGER i,j,n
256
257 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
258
259 DIAGS_MK_TITLE = ' '
260 & //' '
261 n = LEN(diagTitleInPieces)
262
263 j = 0
264 flag = .FALSE.
265 DO i=1,n
266 IF (diagTitleInPieces(i:i) .NE. ' ' ) THEN
267 IF ( flag ) THEN
268 j = j+1
269 IF (j.LE.80) DIAGS_MK_TITLE(j:j) = ' '
270 ENDIF
271 j = j+1
272 IF ( j.LE.80 ) DIAGS_MK_TITLE(j:j) = diagTitleInPieces(i:i)
273 flag = .FALSE.
274 ELSE
275 flag = j.GE.1
276 ENDIF
277 ENDDO
278
279 IF ( j.GT.80 ) THEN
280 WRITE(msgBuf,'(2A,I4,A)') '**WARNING** ',
281 & 'DIAGS_MK_TITLE: too long (',j,' >80) input string'
282 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
283 & SQUEEZE_RIGHT , myThid)
284 WRITE(msgBuf,'(3A)') '**WARNING** ',
285 & 'DIAGS_MK_TITLE: input=', diagTitleInPieces
286 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
287 & SQUEEZE_RIGHT , myThid)
288 ENDIF
289
290 RETURN
291 END
292
293 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
294
295 CBOP 0
296 C !ROUTINE: diagnostics_get_pointers
297 C !INTERFACE:
298 subroutine diagnostics_get_pointers(diagName,ipoint,jpoint,myThid)
299
300 C !DESCRIPTION:
301 C *==========================================================*
302 C | subroutine diagnostics_get_pointers
303 C | o Returns the idiag and jdiag pointers for a
304 C | specified diagnostic - returns 0 if not active
305 C *==========================================================*
306
307 C !USES:
308 IMPLICIT NONE
309 #include "EEPARAMS.h"
310 #include "SIZE.h"
311 #include "DIAGNOSTICS_SIZE.h"
312 #include "DIAGNOSTICS.h"
313
314 C !INPUT PARAMETERS:
315 C diagName :: diagnostic identificator name (8 characters long)
316 C myThid :: my thread Id number
317 C !OUTPUT PARAMETERS:
318 C ipoint :: pointer value into qdiag array
319 C jpoint :: pointer value into diagnostics list
320
321 CHARACTER*8 diagName
322 INTEGER ipoint, jpoint, myThid
323 CEOP
324
325 C !LOCAL VARIABLES:
326 INTEGER n,m
327
328 ipoint = 0
329 jpoint = 0
330
331 C- search for this diag. in the active 2D/3D diagnostics list
332 DO n=1,nlists
333 DO m=1,nActive(n)
334 IF ( diagName.EQ.flds(m,n) .AND. idiag(m,n).NE.0 ) THEN
335 ipoint = abs(idiag(m,n))
336 jpoint = jdiag(m,n)
337 ENDIF
338 ENDDO
339 ENDDO
340
341 RETURN
342 END

  ViewVC Help
Powered by ViewVC 1.1.22