/[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.20 - (hide annotations) (download)
Thu May 19 01:18:31 2005 UTC (18 years, 11 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint57i_post, checkpoint57h_done
Changes since 1.19: +1 -46 lines
put function "diagnostics_is_on" out of diagnostics_utils.F
 (for future modifications not to affect the other file)

1 jmc 1.20 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_utils.F,v 1.19 2005/02/17 00:00:47 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.17 C !ROUTINE: DIAGS_MK_UNITS
273    
274     C !INTERFACE:
275     CHARACTER*16 FUNCTION DIAGS_MK_UNITS(
276     I diagUnitsInPieces, myThid )
277    
278     C !DESCRIPTION:
279     C *==========================================================*
280     C | FUNCTION DIAGS_MK_UNITS
281     C | o Return the diagnostic units string (16c) removing
282     C | blanks from the input string
283     C *==========================================================*
284    
285     C !USES:
286     IMPLICIT NONE
287     #include "EEPARAMS.h"
288    
289     C !INPUT PARAMETERS:
290     C diagUnitsInPieces :: string for diagnostic units: in several
291     C pieces, with blanks in between
292     C myThid :: my thread Id number
293     CHARACTER*(*) diagUnitsInPieces
294     INTEGER myThid
295     CEOP
296    
297     C !LOCAL VARIABLES:
298     CHARACTER*(MAX_LEN_MBUF) msgBuf
299     INTEGER i,j,n
300    
301     DIAGS_MK_UNITS = ' '
302     n = LEN(diagUnitsInPieces)
303    
304     j = 0
305     DO i=1,n
306     IF (diagUnitsInPieces(i:i) .NE. ' ' ) THEN
307     j = j+1
308     IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
309     ENDIF
310     ENDDO
311    
312     IF ( j.GT.16 ) THEN
313     WRITE(msgBuf,'(2A,I4,A)') '**WARNING** ',
314     & 'DIAGS_MK_UNITS: too long (',j,' >16) input string'
315     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
316     & SQUEEZE_RIGHT , myThid)
317     WRITE(msgBuf,'(3A)') '**WARNING** ',
318     & 'DIAGS_MK_UNITS: input=', diagUnitsInPieces
319     CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
320     & SQUEEZE_RIGHT , myThid)
321     ENDIF
322    
323     RETURN
324     END

  ViewVC Help
Powered by ViewVC 1.1.22