/[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.18 - (show annotations) (download)
Mon Feb 7 03:07:49 2005 UTC (19 years, 3 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint57d_post
Changes since 1.17: +59 -117 lines
fix a bug (writing sub-set of levels); keep double precision when
 divide by counter; use only one S/R GETDIAG for both cases (with
 and without counter diagnostics)

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_utils.F,v 1.17 2005/01/28 01:06:12 jmc 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 ipoint, mate, 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 ipoint ..... DIAGNOSTIC NUMBER FROM MENU
30 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 _RL levreal
35 _RL undef
36 INTEGER ipoint, mate
37 INTEGER bi,bj, myThid
38
39 C !OUTPUT PARAMETERS:
40 C qtmp ..... AVERAGED DIAGNOSTIC QUANTITY
41 _RL qtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
42 CEOP
43
44 C !LOCAL VARIABLES:
45 _RL factor
46 INTEGER i, j, ipnt,ipCt
47 INTEGER lev, levCt, klev
48
49 IF (ipoint.GE.1) THEN
50 lev = NINT(levreal)
51 klev = kdiag(ipoint)
52 IF (lev.LE.klev) THEN
53
54 IF ( mate.EQ.0 ) THEN
55 C- No counter diagnostics => average = Sum / ndiag :
56
57 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
90 ENDIF
91 ENDIF
92 ENDIF
93
94 RETURN
95 END
96
97 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
98
99 subroutine clrindx (listnum, myThid)
100 C***********************************************************************
101 C
102 C PURPOSE
103 C DRIVER TO CLEAR DIAGNOSTICS SPECIFIED IN DIAGNOSTIC INDEX LIST
104 C
105 C ARGUMENT DESCRIPTION
106 C listnum .... diagnostics list number
107 C
108 C***********************************************************************
109
110 implicit none
111 #include "EEPARAMS.h"
112 #include "SIZE.h"
113 #include "DIAGNOSTICS_SIZE.h"
114 #include "DIAGNOSTICS.h"
115
116 integer myThid, listnum
117
118 integer m, n
119 character*8 parms1
120 character*3 mate_index
121 integer mate
122
123 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 call clrdiag (m, myThid)
127
128 c Check for Counter Diagnostic
129 c ----------------------------
130 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 endif
136 endif
137 enddo
138 enddo
139
140 RETURN
141 END
142
143
144 subroutine clrdiag (index, myThid)
145 C***********************************************************************
146 C PURPOSE
147 C ZERO OUT MODEL DIAGNOSTIC ARRAY ELEMENTS
148 C***********************************************************************
149
150 implicit none
151 #include "EEPARAMS.h"
152 #include "SIZE.h"
153 #include "DIAGNOSTICS_SIZE.h"
154 #include "DIAGNOSTICS.h"
155
156 integer myThid, index
157
158 integer bi,bj
159 integer i,j,k
160
161 C **********************************************************************
162 C **** SET DIAGNOSTIC AND COUNTER TO ZERO ****
163 C **********************************************************************
164
165 do bj=myByLo(myThid), myByHi(myThid)
166 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 enddo
174 enddo
175 enddo
176
177 ndiag(index) = 0
178
179 RETURN
180 END
181
182 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
183
184 CBOP 0
185 C !ROUTINE: DIAGNOSTICS_IS_ON
186
187 C !INTERFACE:
188 LOGICAL FUNCTION DIAGNOSTICS_IS_ON( diagName, myThid )
189
190 C !DESCRIPTION:
191 C *==========================================================*
192 C | FUNCTION DIAGNOSTIC_IS_ON
193 C | o Return TRUE if diagnostics "diagName" is Active
194 C *==========================================================*
195
196 C !USES:
197 IMPLICIT NONE
198 #include "EEPARAMS.h"
199 #include "SIZE.h"
200 #include "DIAGNOSTICS_SIZE.h"
201 #include "DIAGNOSTICS.h"
202
203 C !INPUT PARAMETERS:
204 C diagName :: diagnostic identificator name (8 characters long)
205 C myThid :: my thread Id number
206 CHARACTER*8 diagName
207 INTEGER myThid
208 CEOP
209
210 C !LOCAL VARIABLES:
211 INTEGER j,n,m
212
213 DIAGNOSTICS_IS_ON = .FALSE.
214 DO n=1,nlists
215 DO m=1,nActive(n)
216 IF ( diagName.EQ.flds(m,n) ) THEN
217 j = jdiag(m,n)
218 IF ( idiag(j).NE.0 .AND. ndiag(j).GE.0 )
219 & DIAGNOSTICS_IS_ON = .TRUE.
220 ENDIF
221 ENDDO
222 ENDDO
223
224 RETURN
225 END
226
227 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
228
229 CBOP 0
230 C !ROUTINE: DIAGS_MK_UNITS
231
232 C !INTERFACE:
233 CHARACTER*16 FUNCTION DIAGS_MK_UNITS(
234 I diagUnitsInPieces, myThid )
235
236 C !DESCRIPTION:
237 C *==========================================================*
238 C | FUNCTION DIAGS_MK_UNITS
239 C | o Return the diagnostic units string (16c) removing
240 C | blanks from the input string
241 C *==========================================================*
242
243 C !USES:
244 IMPLICIT NONE
245 #include "EEPARAMS.h"
246
247 C !INPUT PARAMETERS:
248 C diagUnitsInPieces :: string for diagnostic units: in several
249 C pieces, with blanks in between
250 C myThid :: my thread Id number
251 CHARACTER*(*) diagUnitsInPieces
252 INTEGER myThid
253 CEOP
254
255 C !LOCAL VARIABLES:
256 CHARACTER*(MAX_LEN_MBUF) msgBuf
257 INTEGER i,j,n
258
259 DIAGS_MK_UNITS = ' '
260 n = LEN(diagUnitsInPieces)
261
262 j = 0
263 DO i=1,n
264 IF (diagUnitsInPieces(i:i) .NE. ' ' ) THEN
265 j = j+1
266 IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
267 ENDIF
268 ENDDO
269
270 IF ( j.GT.16 ) THEN
271 WRITE(msgBuf,'(2A,I4,A)') '**WARNING** ',
272 & 'DIAGS_MK_UNITS: too long (',j,' >16) input string'
273 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
274 & SQUEEZE_RIGHT , myThid)
275 WRITE(msgBuf,'(3A)') '**WARNING** ',
276 & 'DIAGS_MK_UNITS: input=', diagUnitsInPieces
277 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
278 & SQUEEZE_RIGHT , myThid)
279 ENDIF
280
281 RETURN
282 END

  ViewVC Help
Powered by ViewVC 1.1.22