/[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.21 - (show annotations) (download)
Sun Jun 26 16:51:49 2005 UTC (18 years, 10 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint57k_post, checkpoint57j_post
Changes since 1.20: +49 -151 lines
change pointers so that 1 diag. can be used several times (with # freq.)

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

  ViewVC Help
Powered by ViewVC 1.1.22