/[MITgcm]/MITgcm/pkg/diagnostics/diagstats_global.F
ViewVC logotype

Contents of /MITgcm/pkg/diagnostics/diagstats_global.F

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.2 - (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.1: +13 -11 lines
change pointers so that 1 diag. can be used several times (with # freq.)

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagstats_global.F,v 1.1 2005/05/20 07:28:52 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: DIAGSTATS_GLOBAL
9
10 C !INTERFACE:
11 SUBROUTINE DIAGSTATS_GLOBAL(
12 O qtmp1, qtmp2,
13 I undef, nLev, jReg,
14 I ndId, mate, iSp, iSm, 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 undef :: Undefined value
28 C nLev :: 2nd Dimension (max Nb of levels) of qtmp1,2 arrays
29 C jReg :: region Index to be process.
30 C ndId :: diagnostic Id number (in available diagnostics list)
31 C mate :: counter mate Id number if any ; 0 otherwise
32 C iSp :: diagnostics pointer to storage array
33 C iSm :: counter-mate pointer to storage array
34 C myThid :: my thread Id number
35 _RL undef
36 INTEGER nLev, jReg, ndId, mate, iSp, iSm
37 INTEGER myThid
38
39 C !OUTPUT PARAMETERS:
40 C qtmp1 ..... AVERAGED DIAGNOSTIC QUANTITY
41 C qtmp2 ..... working array (used for counter mate statistics)
42 _RL qtmp1(0:nStats,0:nLev)
43 _RL qtmp2(0:nStats,0:nLev)
44 CEOP
45
46 C !LOCAL VARIABLES:
47 INTEGER im, ix, iv
48 PARAMETER ( iv = nStats - 2 , im = nStats - 1 , ix = nStats )
49 INTEGER bi, bj
50 INTEGER i, k, kd, kCnt, klev, kMlev
51
52 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
53
54 C-- Initialize to zero :
55 DO k=0,nLev
56 DO i=0,nStats
57 qtmp1(i,k) = 0.
58 qtmp2(i,k) = 0.
59 ENDDO
60 ENDDO
61
62 klev = kdiag(ndId)
63 IF ( mate.GT.0 ) kMlev = kdiag(mate)
64
65 IF (klev.LE.nLev) THEN
66 C--- Compute global statistics :
67
68 C-- Retrieve tile statistics first
69 DO bj=myByLo(myThid),myByHi(myThid)
70 DO bi=myBxLo(myThid),myBxHi(myThid)
71
72 DO k=1,klev
73 kd = iSp + k - 1
74 IF ( qSdiag(0,jReg,kd,bi,bj).GT.0. ) THEN
75 IF ( qtmp1(0,k).LE.0. ) THEN
76 DO i=0,nStats
77 qtmp1(i,k) = qSdiag(i,jReg,kd,bi,bj)
78 ENDDO
79 ELSE
80 DO i=0,iv
81 qtmp1(i,k) = qtmp1(i,k) + qSdiag(i,jReg,kd,bi,bj)
82 ENDDO
83 qtmp1(im,k) = MIN( qtmp1(im,k),qSdiag(im,jReg,kd,bi,bj) )
84 qtmp1(ix,k) = MAX( qtmp1(ix,k),qSdiag(ix,jReg,kd,bi,bj) )
85 ENDIF
86 ENDIF
87 ENDDO
88 IF ( mate.GT.0 ) THEN
89 DO k=1,kMlev
90 kd = iSm + k - 1
91 IF ( qSdiag(0,jReg,kd,bi,bj).GT.0. ) THEN
92 IF ( qtmp1(0,k).LE.0. ) THEN
93 DO i=0,nStats
94 qtmp2(i,k) = qSdiag(i,jReg,kd,bi,bj)
95 ENDDO
96 ELSE
97 DO i=0,iv
98 qtmp2(i,k) = qtmp2(i,k) + qSdiag(i,jReg,kd,bi,bj)
99 ENDDO
100 qtmp2(im,k) = MIN( qtmp2(im,k),qSdiag(im,jReg,kd,bi,bj) )
101 qtmp2(ix,k) = MAX( qtmp2(ix,k),qSdiag(ix,jReg,kd,bi,bj) )
102 ENDIF
103 ENDIF
104 ENDDO
105 ENDIF
106
107 C- end tile index loops
108 ENDDO
109 ENDDO
110
111 C-- Global min,max & sum (at each level) over all thread & processors :
112 DO k=1,klev
113 DO i=0,iv
114 _GLOBAL_SUM_R8(qtmp1(i,k),myThid)
115 ENDDO
116 qtmp1(im,k) = -qtmp1(im,k)
117 _GLOBAL_MAX_R8(qtmp1(im,k),myThid)
118 qtmp1(im,k) = -qtmp1(im,k)
119 _GLOBAL_MAX_R8(qtmp1(ix,k),myThid)
120 ENDDO
121 IF ( mate.GT.0 ) THEN
122 DO k=1,kMlev
123 DO i=0,iv
124 _GLOBAL_SUM_R8(qtmp2(i,k),myThid)
125 ENDDO
126 qtmp2(im,k) = -qtmp2(im,k)
127 _GLOBAL_MAX_R8(qtmp2(im,k),myThid)
128 qtmp2(im,k) = -qtmp2(im,k)
129 _GLOBAL_MAX_R8(qtmp2(ix,k),myThid)
130 ENDDO
131 ENDIF
132
133 C-- Vertical integral, min & max :
134 DO k=1,klev
135 IF ( qtmp1(0,0).LE.0. ) THEN
136 DO i=0,nStats
137 qtmp1(i,0) = qtmp1(i,k)
138 ENDDO
139 ELSE
140 DO i=0,iv
141 qtmp1(i,0) = qtmp1(i,0) + qtmp1(i,k)
142 ENDDO
143 qtmp1(im,0) = MIN(qtmp1(im,0),qtmp1(im,k))
144 qtmp1(ix,0) = MAX(qtmp1(ix,0),qtmp1(ix,k))
145 ENDIF
146 ENDDO
147 IF ( mate.GT.0 ) THEN
148 DO k=1,kMlev
149 IF ( qtmp2(0,0).LE.0. ) THEN
150 DO i=0,nStats
151 qtmp2(i,0) = qtmp2(i,k)
152 ENDDO
153 ELSE
154 DO i=0,iv
155 qtmp2(i,0) = qtmp2(i,0) + qtmp2(i,k)
156 ENDDO
157 qtmp2(im,0) = MIN(qtmp2(im,0),qtmp2(im,k))
158 qtmp2(ix,0) = MAX(qtmp2(ix,0),qtmp2(ix,k))
159 ENDIF
160 ENDDO
161 ENDIF
162
163 C-- Average, Standard.Dev.:
164 C- no counter diagnostics => average = Sum / vol :
165 IF ( mate.EQ.0 ) THEN
166 DO k=0,klev
167 IF ( qtmp1(0,k).LE.0. ) THEN
168 DO i=1,nStats
169 qtmp1(i,k) = undef
170 ENDDO
171 ELSE
172 DO i=1,iv
173 qtmp1(i,k) = qtmp1(i,k) / qtmp1(0,k)
174 ENDDO
175 C Variance :
176 qtmp1(iv,k) = qtmp1(iv,k) - qtmp1(1,k)*qtmp1(1,k)
177 C Standard deviation :
178 IF (qtmp1(iv,k).GT.0.) qtmp1(iv,k) = SQRT(qtmp1(iv,k))
179 ENDIF
180 ENDDO
181 ELSE
182 C With counter diagnostics => average = Sum / Sum(counter) :
183 DO k=0,klev
184 kCnt = min(k,kMlev)
185 IF ( qtmp2(0,kCnt).LE.0. ) THEN
186 DO i=1,nStats
187 qtmp1(i,k) = undef
188 ENDDO
189 ELSEIF ( qtmp2(1,kCnt).LE.0. ) THEN
190 DO i=1,iv
191 qtmp1(i,k) = undef
192 ENDDO
193 ELSE
194 DO i=1,iv
195 qtmp1(i,k) = qtmp1(i,k) / qtmp2(1,kCnt)
196 ENDDO
197 C jmc: looks like there is a Pb with how Variance is computed
198 C Variance :
199 qtmp1(iv,k) = qtmp1(iv,k) - qtmp1(1,k)*qtmp1(1,k)
200 C Standard deviation :
201 IF (qtmp1(iv,k).GT.0.) qtmp1(iv,k) = SQRT(qtmp1(iv,k))
202 ENDIF
203 ENDDO
204 ENDIF
205
206 ENDIF
207
208 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
209
210 RETURN
211 END

  ViewVC Help
Powered by ViewVC 1.1.22