/[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.17 - (show annotations) (download)
Fri Jan 28 01:06:12 2005 UTC (19 years, 3 months ago) by jmc
Branch: MAIN
Changes since 1.16: +58 -1 lines
set the correct units (atmos or ocean, z or p coordinate).

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_utils.F,v 1.16 2004/12/20 01:53:54 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 (levreal,ipoint,undef,qtmp,myThid)
12
13 C !DESCRIPTION:
14 C Retrieve averaged model diagnostic
15
16 C !USES:
17 implicit none
18 #include "EEPARAMS.h"
19 #include "SIZE.h"
20 #include "DIAGNOSTICS_SIZE.h"
21 #include "DIAGNOSTICS.h"
22 CEOP
23
24 #ifdef ALLOW_FIZHI
25 #include "fizhi_SIZE.h"
26 #else
27 integer Nrphys
28 parameter (Nrphys=0)
29 #endif
30
31 C INPUT:
32 C levreal .... Diagnostic LEVEL
33 C ipoint ..... DIAGNOSTIC NUMBER FROM MENU
34 C undef ..... UNDEFINED VALUE
35 C bi ..... X-direction process(or) number
36 C bj ..... Y-direction process(or) number
37 _RL levreal
38 integer myThid,ipoint
39 _RL undef
40
41 C OUTPUT:
42 C qtmp ..... AVERAGED DIAGNOSTIC QUANTITY
43 _RL qtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+Nrphys,nSx,nSy)
44
45 _RL factor
46 integer i,j,ipnt,klev
47 integer bi,bj
48 integer lev
49
50 if (ipoint.ge.1) then
51 lev = NINT(levreal)
52
53 klev = kdiag(ipoint)
54 if (klev.ge.lev) then
55 ipnt = idiag(ipoint) + lev - 1
56 factor = 1.0
57 if (ndiag(ipoint).ne.0) factor = 1.0/ndiag(ipoint)
58
59 do bj=myByLo(myThid), myByHi(myThid)
60 do bi=myBxLo(myThid), myBxHi(myThid)
61
62 do j = 1,sNy
63 do i = 1,sNx
64 if ( qdiag(i,j,ipnt,bi,bj) .le. undef ) then
65 qtmp(i,j,lev,bi,bj) = qdiag(i,j,ipnt,bi,bj)*factor
66 else
67 qtmp(i,j,lev,bi,bj) = undef
68 endif
69 enddo
70 enddo
71
72 enddo
73 enddo
74
75 endif
76 endif
77
78 RETURN
79 END
80
81 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
82 CBOP 0
83 C !ROUTINE: GETDIAG2
84
85 C !INTERFACE:
86 SUBROUTINE GETDIAG2 (levreal,ipoint,undef,qtmp,myThid)
87
88 C !DESCRIPTION:
89 C***********************************************************************
90 C PURPOSE
91 C Retrieve averaged model diagnostic
92 C INPUT:
93 C levreal .... Diagnostic LEVEL
94 C ipoint ..... DIAGNOSTIC NUMBER FROM MENU
95 C undef ..... UNDEFINED VALUE
96 C
97 C OUTPUT:
98 C qtmp ..... AVERAGED DIAGNOSTIC QUANTITY
99 C
100 C***********************************************************************
101
102 C !USES:
103 implicit none
104 #include "EEPARAMS.h"
105 #include "SIZE.h"
106 #include "DIAGNOSTICS_SIZE.h"
107 #include "DIAGNOSTICS.h"
108 CEOP
109
110 #ifdef ALLOW_FIZHI
111 #include "fizhi_SIZE.h"
112 #else
113 integer Nrphys
114 parameter (Nrphys=0)
115 #endif
116
117 _RL levreal
118 integer myThid,ipoint
119 _RL undef
120 _RL qtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+Nrphys,nSx,nSy)
121
122 integer i,j,ipnt,klev
123 integer bi,bj
124 integer lev
125
126 if (ipoint.ge.1) then
127 lev = NINT(levreal)
128
129 klev = kdiag(ipoint)
130 if (klev.ge.lev) then
131 ipnt = idiag(ipoint) + lev - 1
132
133 do bj=myByLo(myThid), myByHi(myThid)
134 do bi=myBxLo(myThid), myBxHi(myThid)
135
136 do j = 1,sNy
137 do i = 1,sNx
138 if ( qdiag(i,j,ipnt,bi,bj) .le. undef ) then
139 qtmp(i,j,lev,bi,bj) = qdiag(i,j,ipnt,bi,bj)
140 else
141 qtmp(i,j,lev,bi,bj) = undef
142 endif
143 enddo
144 enddo
145
146 enddo
147 enddo
148
149 endif
150 endif
151
152 RETURN
153 END
154
155 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
156
157 subroutine clrindx (listnum, myThid)
158 C***********************************************************************
159 C
160 C PURPOSE
161 C DRIVER TO CLEAR DIAGNOSTICS SPECIFIED IN DIAGNOSTIC INDEX LIST
162 C
163 C ARGUMENT DESCRIPTION
164 C listnum .... diagnostics list number
165 C
166 C***********************************************************************
167
168 implicit none
169 #include "EEPARAMS.h"
170 #include "SIZE.h"
171 #include "DIAGNOSTICS_SIZE.h"
172 #include "DIAGNOSTICS.h"
173
174 integer myThid, listnum
175
176 integer m, n
177 character*8 parms1
178 character*3 mate_index
179 integer mate
180
181 do n=1,nfields(listnum)
182 do m=1,ndiagt
183 if( flds(n,listnum).eq.cdiag(m) .and. idiag(m).ne.0 ) then
184 call clrdiag (m, myThid)
185
186 c Check for Counter Diagnostic
187 c ----------------------------
188 parms1 = gdiag(m)(1:8)
189 if ( parms1(5:5).eq.'C' ) then
190 mate_index = parms1(6:8)
191 read (mate_index,'(I3)') mate
192 call clrdiag (mate, myThid)
193 endif
194 endif
195 enddo
196 enddo
197
198 RETURN
199 END
200
201
202 subroutine clrdiag (index, myThid)
203 C***********************************************************************
204 C PURPOSE
205 C ZERO OUT MODEL DIAGNOSTIC ARRAY ELEMENTS
206 C***********************************************************************
207
208 implicit none
209 #include "EEPARAMS.h"
210 #include "SIZE.h"
211 #include "DIAGNOSTICS_SIZE.h"
212 #include "DIAGNOSTICS.h"
213
214 integer myThid, index
215
216 integer bi,bj
217 integer i,j,k
218
219 C **********************************************************************
220 C **** SET DIAGNOSTIC AND COUNTER TO ZERO ****
221 C **********************************************************************
222
223 do bj=myByLo(myThid), myByHi(myThid)
224 do bi=myBxLo(myThid), myBxHi(myThid)
225 do k = 1,kdiag(index)
226 do j = 1-OLy,sNy+OLy
227 do i = 1-OLx,sNx+OLx
228 qdiag(i,j,idiag(index)+k-1,bi,bj) = 0.0
229 enddo
230 enddo
231 enddo
232 enddo
233 enddo
234
235 ndiag(index) = 0
236
237 RETURN
238 END
239
240 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
241
242 CBOP 0
243 C !ROUTINE: DIAGNOSTICS_IS_ON
244
245 C !INTERFACE:
246 LOGICAL FUNCTION DIAGNOSTICS_IS_ON( diagName, myThid )
247
248 C !DESCRIPTION:
249 C *==========================================================*
250 C | FUNCTION DIAGNOSTIC_IS_ON
251 C | o Return TRUE if diagnostics "diagName" is Active
252 C *==========================================================*
253
254 C !USES:
255 IMPLICIT NONE
256 #include "EEPARAMS.h"
257 #include "SIZE.h"
258 #include "DIAGNOSTICS_SIZE.h"
259 #include "DIAGNOSTICS.h"
260
261 C !INPUT PARAMETERS:
262 C diagName :: diagnostic identificator name (8 characters long)
263 C myThid :: my thread Id number
264 CHARACTER*8 diagName
265 INTEGER myThid
266 CEOP
267
268 C !LOCAL VARIABLES:
269 INTEGER j,n,m
270
271 DIAGNOSTICS_IS_ON = .FALSE.
272 DO n=1,nlists
273 DO m=1,nActive(n)
274 IF ( diagName.EQ.flds(m,n) ) THEN
275 j = jdiag(m,n)
276 IF ( idiag(j).NE.0 .AND. ndiag(j).GE.0 )
277 & DIAGNOSTICS_IS_ON = .TRUE.
278 ENDIF
279 ENDDO
280 ENDDO
281
282 RETURN
283 END
284
285 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
286
287 CBOP 0
288 C !ROUTINE: DIAGS_MK_UNITS
289
290 C !INTERFACE:
291 CHARACTER*16 FUNCTION DIAGS_MK_UNITS(
292 I diagUnitsInPieces, myThid )
293
294 C !DESCRIPTION:
295 C *==========================================================*
296 C | FUNCTION DIAGS_MK_UNITS
297 C | o Return the diagnostic units string (16c) removing
298 C | blanks from the input string
299 C *==========================================================*
300
301 C !USES:
302 IMPLICIT NONE
303 #include "EEPARAMS.h"
304
305 C !INPUT PARAMETERS:
306 C diagUnitsInPieces :: string for diagnostic units: in several
307 C pieces, with blanks in between
308 C myThid :: my thread Id number
309 CHARACTER*(*) diagUnitsInPieces
310 INTEGER myThid
311 CEOP
312
313 C !LOCAL VARIABLES:
314 CHARACTER*(MAX_LEN_MBUF) msgBuf
315 INTEGER i,j,n
316
317 DIAGS_MK_UNITS = ' '
318 n = LEN(diagUnitsInPieces)
319
320 j = 0
321 DO i=1,n
322 IF (diagUnitsInPieces(i:i) .NE. ' ' ) THEN
323 j = j+1
324 IF ( j.LE.16 ) DIAGS_MK_UNITS(j:j) = diagUnitsInPieces(i:i)
325 ENDIF
326 ENDDO
327
328 IF ( j.GT.16 ) THEN
329 WRITE(msgBuf,'(2A,I4,A)') '**WARNING** ',
330 & 'DIAGS_MK_UNITS: too long (',j,' >16) input string'
331 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
332 & SQUEEZE_RIGHT , myThid)
333 WRITE(msgBuf,'(3A)') '**WARNING** ',
334 & 'DIAGS_MK_UNITS: input=', diagUnitsInPieces
335 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
336 & SQUEEZE_RIGHT , myThid)
337 ENDIF
338
339 RETURN
340 END

  ViewVC Help
Powered by ViewVC 1.1.22