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

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

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


Revision 1.19 - (hide annotations) (download)
Thu Feb 17 00:00:47 2005 UTC (19 years, 2 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint57g_post, checkpoint57e_post, checkpoint57g_pre, checkpoint57f_pre, eckpoint57e_pre, checkpoint57f_post, checkpoint57h_pre, checkpoint57h_post
Changes since 1.18: +88 -1 lines
add small S/R: DIAGNOSTICS_COUNT to increment the diagnostics counter only

1 jmc 1.19 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_utils.F,v 1.18 2005/02/07 03:07:49 jmc Exp $
2 edhill 1.8 C $Name: $
3    
4 edhill 1.9 #include "DIAG_OPTIONS.h"
5    
6 edhill 1.12 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
7     CBOP 0
8     C !ROUTINE: GETDIAG
9    
10     C !INTERFACE:
11 jmc 1.18 SUBROUTINE GETDIAG(
12     I levreal, undef,
13     O qtmp,
14     I ipoint, mate, bi, bj, myThid )
15 edhill 1.12
16     C !DESCRIPTION:
17 edhill 1.13 C Retrieve averaged model diagnostic
18 jmc 1.15
19 edhill 1.12 C !USES:
20 jmc 1.18 IMPLICIT NONE
21 molod 1.3 #include "EEPARAMS.h"
22 molod 1.1 #include "SIZE.h"
23 jmc 1.15 #include "DIAGNOSTICS_SIZE.h"
24     #include "DIAGNOSTICS.h"
25 molod 1.3
26 jmc 1.18 C !INPUT PARAMETERS:
27 jmc 1.15 C levreal .... Diagnostic LEVEL
28 jmc 1.18 C undef ..... UNDEFINED VALUE
29 jmc 1.15 C ipoint ..... DIAGNOSTIC NUMBER FROM MENU
30 jmc 1.18 C mate ..... counter DIAGNOSTIC NUMBER if any ; 0 otherwise
31     C bi ..... X-direction tile number
32     C bj ..... Y-direction tile number
33     C myThid ..... my thread Id number
34 jmc 1.15 _RL levreal
35 molod 1.3 _RL undef
36 jmc 1.18 INTEGER ipoint, mate
37     INTEGER bi,bj, myThid
38 jmc 1.15
39 jmc 1.18 C !OUTPUT PARAMETERS:
40 edhill 1.12 C qtmp ..... AVERAGED DIAGNOSTIC QUANTITY
41 jmc 1.18 _RL qtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
42     CEOP
43 molod 1.11
44 jmc 1.18 C !LOCAL VARIABLES:
45 molod 1.3 _RL factor
46 jmc 1.18 INTEGER i, j, ipnt,ipCt
47     INTEGER lev, levCt, klev
48 molod 1.11
49 jmc 1.18 IF (ipoint.GE.1) THEN
50 jmc 1.15 lev = NINT(levreal)
51     klev = kdiag(ipoint)
52 jmc 1.18 IF (lev.LE.klev) THEN
53 jmc 1.15
54 jmc 1.18 IF ( mate.EQ.0 ) THEN
55     C- No counter diagnostics => average = Sum / ndiag :
56 jmc 1.15
57 jmc 1.18 ipnt = idiag(ipoint) + lev - 1
58     c factor = 1.0
59     c if (ndiag(ipoint).ne.0) factor = 1.0/ndiag(ipoint)
60     factor = FLOAT(ndiag(ipoint))
61     IF (ndiag(ipoint).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 = idiag(ipoint) + lev - 1
77     levCt= MIN(lev,kdiag(mate))
78     ipCt = idiag(mate) + 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 molod 1.1
90 jmc 1.18 ENDIF
91     ENDIF
92     ENDIF
93 molod 1.3
94 jmc 1.15 RETURN
95     END
96 edhill 1.12
97     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
98    
99 jmc 1.15 subroutine clrindx (listnum, myThid)
100 molod 1.1 C***********************************************************************
101     C
102     C PURPOSE
103     C DRIVER TO CLEAR DIAGNOSTICS SPECIFIED IN DIAGNOSTIC INDEX LIST
104     C
105     C ARGUMENT DESCRIPTION
106 molod 1.2 C listnum .... diagnostics list number
107 molod 1.1 C
108     C***********************************************************************
109    
110     implicit none
111 molod 1.2 #include "EEPARAMS.h"
112 molod 1.1 #include "SIZE.h"
113 jmc 1.15 #include "DIAGNOSTICS_SIZE.h"
114     #include "DIAGNOSTICS.h"
115 molod 1.1
116 molod 1.2 integer myThid, listnum
117    
118     integer m, n
119 molod 1.1 character*8 parms1
120     character*3 mate_index
121 molod 1.2 integer mate
122 molod 1.1
123 molod 1.11 do n=1,nfields(listnum)
124     do m=1,ndiagt
125     if( flds(n,listnum).eq.cdiag(m) .and. idiag(m).ne.0 ) then
126 jmc 1.15 call clrdiag (m, myThid)
127 molod 1.11
128     c Check for Counter Diagnostic
129     c ----------------------------
130 jmc 1.15 parms1 = gdiag(m)(1:8)
131     if ( parms1(5:5).eq.'C' ) then
132     mate_index = parms1(6:8)
133     read (mate_index,'(I3)') mate
134     call clrdiag (mate, myThid)
135 molod 1.11 endif
136     endif
137     enddo
138 molod 1.2 enddo
139 jmc 1.15
140     RETURN
141     END
142 molod 1.1
143    
144 jmc 1.15 subroutine clrdiag (index, myThid)
145     C***********************************************************************
146     C PURPOSE
147 molod 1.2 C ZERO OUT MODEL DIAGNOSTIC ARRAY ELEMENTS
148 jmc 1.15 C***********************************************************************
149    
150 molod 1.1 implicit none
151 molod 1.2 #include "EEPARAMS.h"
152 molod 1.1 #include "SIZE.h"
153 jmc 1.15 #include "DIAGNOSTICS_SIZE.h"
154     #include "DIAGNOSTICS.h"
155 molod 1.1
156 molod 1.2 integer myThid, index
157    
158     integer bi,bj
159 molod 1.1 integer i,j,k
160    
161 jmc 1.15 C **********************************************************************
162     C **** SET DIAGNOSTIC AND COUNTER TO ZERO ****
163     C **********************************************************************
164    
165 molod 1.2 do bj=myByLo(myThid), myByHi(myThid)
166 jmc 1.15 do bi=myBxLo(myThid), myBxHi(myThid)
167     do k = 1,kdiag(index)
168     do j = 1-OLy,sNy+OLy
169     do i = 1-OLx,sNx+OLx
170     qdiag(i,j,idiag(index)+k-1,bi,bj) = 0.0
171     enddo
172     enddo
173 molod 1.1 enddo
174 molod 1.11 enddo
175 molod 1.2 enddo
176 molod 1.11
177 molod 1.2 ndiag(index) = 0
178    
179 jmc 1.15 RETURN
180     END
181 molod 1.2
182 jmc 1.15 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
183 molod 1.2
184 jmc 1.15 CBOP 0
185 jmc 1.19 C !ROUTINE: DIAGNOSTICS_COUNT
186     C !INTERFACE:
187     SUBROUTINE DIAGNOSTICS_COUNT (chardiag,
188     I biArg, bjArg, myThid)
189    
190     C !DESCRIPTION:
191     C***********************************************************************
192     C routine to increment the diagnostic counter only
193     C***********************************************************************
194     C !USES:
195     IMPLICIT NONE
196    
197     C == Global variables ===
198     #include "EEPARAMS.h"
199     #include "SIZE.h"
200     #include "DIAGNOSTICS_SIZE.h"
201     #include "DIAGNOSTICS.h"
202    
203     C !INPUT PARAMETERS:
204     C***********************************************************************
205     C Arguments Description
206     C ----------------------
207     C chardiag :: Character expression for diag to increment the counter
208     C biArg :: X-direction tile number, or 0 if called outside bi,bj loops
209     C bjArg :: Y-direction tile number, or 0 if called outside bi,bj loops
210     C myThid :: my thread Id number
211     C***********************************************************************
212     CHARACTER*8 chardiag
213     INTEGER biArg, bjArg
214     INTEGER myThid
215     CEOP
216    
217     C !LOCAL VARIABLES:
218     C ===============
219     INTEGER m, n
220     INTEGER ndiagnum, ipointer
221     c INTEGER bi, bj
222     c CHARACTER*(MAX_LEN_MBUF) msgBuf
223    
224     C Run through list of active diagnostics to make sure
225     C we are trying to increment a valid diagnostic-counter
226    
227     ndiagnum = 0
228     ipointer = 0
229     DO n=1,nlists
230     DO m=1,nActive(n)
231     IF ( chardiag.EQ.flds(m,n) ) THEN
232     ndiagnum = jdiag(m,n)
233     IF (ndiag(ndiagnum).GE.0) ipointer = idiag(ndiagnum)
234     ENDIF
235     ENDDO
236     ENDDO
237    
238     C If-sequence to see if we are a valid and an active diagnostic
239    
240     IF ( ndiagnum.NE.0 .AND. ipointer.NE.0 ) THEN
241    
242     C Increment the counter for the diagnostic (if we are at bi=bj=myThid=1)
243     _BEGIN_MASTER(myThid)
244     IF ( (biArg.EQ.1 .AND. bjArg.EQ.1) .OR.
245     & (biArg.EQ.0 .AND. bjArg.EQ.0) )
246     & ndiag(ndiagnum) = ndiag(ndiagnum) + 1
247     _END_MASTER(myThid)
248    
249     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
250    
251     C-- note: counter could become a tiled array, and then it would be:
252     c IF ( biArg.EQ.0 .AND. bjArg.EQ.0 ) THEN
253     c DO bj=myByLo(myThid), myByHi(myThid)
254     c DO bi=myBxLo(myThid), myBxHi(myThid)
255     c ndiag(ndiagnum,bi,bj) = ndiag(ndiagnum,bi,bj) + 1
256     c ENDDO
257     c ENDDO
258     c ELSE
259     c bi = MIN(biArg,nSx)
260     c bj = MIN(bjArg,nSy)
261     c ndiag(ndiagnum,bi,bj) = ndiag(ndiagnum,bi,bj) + 1
262     c ENDIF
263    
264     ENDIF
265    
266     RETURN
267     END
268    
269     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
270    
271     CBOP 0
272 jmc 1.15 C !ROUTINE: DIAGNOSTICS_IS_ON
273 molod 1.2
274 jmc 1.15 C !INTERFACE:
275     LOGICAL FUNCTION DIAGNOSTICS_IS_ON( diagName, myThid )
276 molod 1.2
277 jmc 1.15 C !DESCRIPTION:
278     C *==========================================================*
279     C | FUNCTION DIAGNOSTIC_IS_ON
280     C | o Return TRUE if diagnostics "diagName" is Active
281     C *==========================================================*
282 molod 1.2
283 jmc 1.15 C !USES:
284     IMPLICIT NONE
285     #include "EEPARAMS.h"
286     #include "SIZE.h"
287     #include "DIAGNOSTICS_SIZE.h"
288     #include "DIAGNOSTICS.h"
289 molod 1.2
290 jmc 1.15 C !INPUT PARAMETERS:
291     C diagName :: diagnostic identificator name (8 characters long)
292     C myThid :: my thread Id number
293     CHARACTER*8 diagName
294     INTEGER myThid
295     CEOP
296 molod 1.2
297 jmc 1.15 C !LOCAL VARIABLES:
298     INTEGER j,n,m
299 molod 1.2
300 jmc 1.15 DIAGNOSTICS_IS_ON = .FALSE.
301     DO n=1,nlists
302     DO m=1,nActive(n)
303     IF ( diagName.EQ.flds(m,n) ) THEN
304     j = jdiag(m,n)
305 jmc 1.16 IF ( idiag(j).NE.0 .AND. ndiag(j).GE.0 )
306     & DIAGNOSTICS_IS_ON = .TRUE.
307 jmc 1.15 ENDIF
308     ENDDO
309     ENDDO
310 molod 1.2
311     RETURN
312     END
313 jmc 1.17
314     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
315    
316     CBOP 0
317     C !ROUTINE: DIAGS_MK_UNITS
318    
319     C !INTERFACE:
320     CHARACTER*16 FUNCTION DIAGS_MK_UNITS(
321     I diagUnitsInPieces, myThid )
322    
323     C !DESCRIPTION:
324     C *==========================================================*
325     C | FUNCTION DIAGS_MK_UNITS
326     C | o Return the diagnostic units string (16c) removing
327     C | blanks from the input string
328     C *==========================================================*
329    
330     C !USES:
331     IMPLICIT NONE
332     #include "EEPARAMS.h"
333    
334     C !INPUT PARAMETERS:
335     C diagUnitsInPieces :: string for diagnostic units: in several
336     C pieces, with blanks in between
337     C myThid :: my thread Id number
338     CHARACTER*(*) diagUnitsInPieces
339     INTEGER myThid
340     CEOP
341    
342     C !LOCAL VARIABLES:
343     CHARACTER*(MAX_LEN_MBUF) msgBuf
344     INTEGER i,j,n
345    
346     DIAGS_MK_UNITS = ' '
347     n = LEN(diagUnitsInPieces)
348    
349     j = 0
350     DO i=1,n
351     IF (diagUnitsInPieces(i:i) .NE. ' ' ) THEN
352     j = j+1
353     IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
354     ENDIF
355     ENDDO
356    
357     IF ( j.GT.16 ) THEN
358     WRITE(msgBuf,'(2A,I4,A)') '**WARNING** ',
359     & 'DIAGS_MK_UNITS: too long (',j,' >16) input string'
360     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
361     & SQUEEZE_RIGHT , myThid)
362     WRITE(msgBuf,'(3A)') '**WARNING** ',
363     & 'DIAGS_MK_UNITS: input=', diagUnitsInPieces
364     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
365     & SQUEEZE_RIGHT , myThid)
366     ENDIF
367    
368     RETURN
369     END

  ViewVC Help
Powered by ViewVC 1.1.22