/[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.23 - (hide 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 jmc 1.23 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_utils.F,v 1.22 2005/07/11 16:20:10 molod 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 jmc 1.21 I ndId, mate, ip, im, 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.21 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 jmc 1.15 _RL levreal
37 molod 1.3 _RL undef
38 jmc 1.21 INTEGER ndId, mate, ip, im
39 jmc 1.18 INTEGER bi,bj, myThid
40 jmc 1.15
41 jmc 1.18 C !OUTPUT PARAMETERS:
42 edhill 1.12 C qtmp ..... AVERAGED DIAGNOSTIC QUANTITY
43 jmc 1.18 _RL qtmp(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
44     CEOP
45 molod 1.11
46 jmc 1.18 C !LOCAL VARIABLES:
47 molod 1.3 _RL factor
48 jmc 1.18 INTEGER i, j, ipnt,ipCt
49     INTEGER lev, levCt, klev
50 molod 1.11
51 jmc 1.21 IF (ndId.GE.1) THEN
52 jmc 1.15 lev = NINT(levreal)
53 jmc 1.21 klev = kdiag(ndId)
54 jmc 1.18 IF (lev.LE.klev) THEN
55 jmc 1.15
56 jmc 1.18 IF ( mate.EQ.0 ) THEN
57     C- No counter diagnostics => average = Sum / ndiag :
58 jmc 1.15
59 jmc 1.21 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 jmc 1.18
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 jmc 1.21 ipnt = ip + lev - 1
77 jmc 1.18 levCt= MIN(lev,kdiag(mate))
78 jmc 1.21 ipCt = im + levCt - 1
79 jmc 1.18 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 CBOP 0
100 jmc 1.19 C !ROUTINE: DIAGNOSTICS_COUNT
101     C !INTERFACE:
102 jmc 1.21 SUBROUTINE DIAGNOSTICS_COUNT (chardiag,
103     I biArg, bjArg, myThid)
104 jmc 1.19
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 jmc 1.21 INTEGER m, n
135     INTEGER bi, bj
136     INTEGER ipt
137 jmc 1.19 c CHARACTER*(MAX_LEN_MBUF) msgBuf
138    
139 jmc 1.21 C-- Run through list of active diagnostics to find which counter
140     C to increment (needs to be a valid & active diagnostic-counter)
141 jmc 1.19 DO n=1,nlists
142     DO m=1,nActive(n)
143 jmc 1.21 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 jmc 1.19 ENDIF
161     ENDDO
162     ENDDO
163    
164 jmc 1.21 RETURN
165 jmc 1.19 END
166    
167     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
168    
169     CBOP 0
170 jmc 1.17 C !ROUTINE: DIAGS_MK_UNITS
171    
172     C !INTERFACE:
173 jmc 1.21 CHARACTER*16 FUNCTION DIAGS_MK_UNITS(
174 jmc 1.17 I diagUnitsInPieces, myThid )
175    
176     C !DESCRIPTION:
177     C *==========================================================*
178     C | FUNCTION DIAGS_MK_UNITS
179 jmc 1.21 C | o Return the diagnostic units string (16c) removing
180 jmc 1.17 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 jmc 1.21 C diagUnitsInPieces :: string for diagnostic units: in several
189 jmc 1.17 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 jmc 1.21 DIAGS_MK_UNITS = ' '
200 jmc 1.17 n = LEN(diagUnitsInPieces)
201 jmc 1.21
202 jmc 1.17 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 jmc 1.23
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 molod 1.22 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
258 jmc 1.23
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 molod 1.22 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