/[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.5 - (show annotations) (download)
Tue Apr 28 18:10:47 2009 UTC (15 years ago) by jmc
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint64z, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63g, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint64, checkpoint65, checkpoint62, checkpoint63, checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, checkpoint62c, checkpoint62b, checkpoint62a, checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62l, checkpoint62s, checkpoint62r, checkpoint62q, checkpoint62p, checkpoint62w, checkpoint62v, checkpoint62u, checkpoint62t, checkpoint62z, checkpoint62y, checkpoint62x, checkpoint61n, checkpoint61o, checkpoint61m, checkpoint61v, checkpoint61w, checkpoint61t, checkpoint61u, checkpoint61r, checkpoint61s, checkpoint61p, checkpoint61q, checkpoint61z, checkpoint61x, checkpoint61y, HEAD
Changes since 1.4: +5 -5 lines
change macros (EXCH & GLOBAL_SUM/MAX) sufix _R4/_R8 to _RS/_RL
 when applied to _RS/_RL variable

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagstats_global.F,v 1.4 2008/02/14 15:41:43 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 _RL tmpMin, tmpMax, tmpVol
52
53 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
54
55 C-- Initialize to zero :
56 DO k=0,nLev
57 DO i=0,nStats
58 qtmp1(i,k) = 0.
59 qtmp2(i,k) = 0.
60 ENDDO
61 ENDDO
62
63 klev = kdiag(ndId)
64 IF ( mate.GT.0 ) kMlev = kdiag(mate)
65
66 IF (klev.LE.nLev) THEN
67 C--- Compute global statistics :
68
69 C-- Retrieve tile statistics first
70 DO bj=myByLo(myThid),myByHi(myThid)
71 DO bi=myBxLo(myThid),myBxHi(myThid)
72
73 DO k=1,klev
74 kd = iSp + k - 1
75 IF ( qSdiag(0,jReg,kd,bi,bj).GT.0. ) THEN
76 IF ( qtmp1(0,k).LE.0. ) THEN
77 DO i=0,nStats
78 qtmp1(i,k) = qSdiag(i,jReg,kd,bi,bj)
79 ENDDO
80 ELSE
81 DO i=0,iv
82 qtmp1(i,k) = qtmp1(i,k) + qSdiag(i,jReg,kd,bi,bj)
83 ENDDO
84 qtmp1(im,k) = MIN( qtmp1(im,k),qSdiag(im,jReg,kd,bi,bj) )
85 qtmp1(ix,k) = MAX( qtmp1(ix,k),qSdiag(ix,jReg,kd,bi,bj) )
86 ENDIF
87 ENDIF
88 ENDDO
89 IF ( mate.GT.0 ) THEN
90 DO k=1,kMlev
91 kd = iSm + k - 1
92 IF ( qSdiag(0,jReg,kd,bi,bj).GT.0. ) THEN
93 IF ( qtmp2(0,k).LE.0. ) THEN
94 DO i=0,1
95 qtmp2(i,k) = qSdiag(i,jReg,kd,bi,bj)
96 ENDDO
97 ELSE
98 DO i=0,1
99 qtmp2(i,k) = qtmp2(i,k) + qSdiag(i,jReg,kd,bi,bj)
100 ENDDO
101 ENDIF
102 ENDIF
103 ENDDO
104 ENDIF
105
106 C- end tile index loops
107 ENDDO
108 ENDDO
109
110 C-- Global min,max & sum (at each level) over all thread & processors :
111 DO k=1,klev
112 tmpVol = qtmp1(0,k)
113 DO i=0,iv
114 _GLOBAL_SUM_RL(qtmp1(i,k),myThid)
115 ENDDO
116 IF ( qtmp1(0,k).GT.0. .AND. tmpVol.LE.0. ) THEN
117 C- In case 1 processor has only empty tiles:
118 tmpMax = qtmp1(1,k)/qtmp1(0,k)
119 tmpmin = -tmpMax
120 ELSE
121 tmpMin = -qtmp1(im,k)
122 tmpMax = qtmp1(ix,k)
123 ENDIF
124 _GLOBAL_MAX_RL(tmpMin,myThid)
125 _GLOBAL_MAX_RL(tmpMax,myThid)
126 qtmp1(im,k) = -tmpMin
127 qtmp1(ix,k) = tmpMax
128 ENDDO
129 IF ( mate.GT.0 ) THEN
130 DO k=1,kMlev
131 DO i=0,1
132 _GLOBAL_SUM_RL(qtmp2(i,k),myThid)
133 ENDDO
134 ENDDO
135 ENDIF
136
137 C-- Vertical integral, min & max :
138 DO k=1,klev
139 IF ( qtmp1(0,k).GT.0. ) THEN
140 IF ( qtmp1(0,0).LE.0. ) THEN
141 DO i=0,nStats
142 qtmp1(i,0) = qtmp1(i,k)
143 ENDDO
144 ELSE
145 DO i=0,iv
146 qtmp1(i,0) = qtmp1(i,0) + qtmp1(i,k)
147 ENDDO
148 qtmp1(im,0) = MIN(qtmp1(im,0),qtmp1(im,k))
149 qtmp1(ix,0) = MAX(qtmp1(ix,0),qtmp1(ix,k))
150 ENDIF
151 ENDIF
152 ENDDO
153 IF ( mate.GT.0 ) THEN
154 DO k=1,kMlev
155 IF ( qtmp2(0,k).GT.0. ) THEN
156 IF ( qtmp2(0,0).LE.0. ) THEN
157 DO i=0,1
158 qtmp2(i,0) = qtmp2(i,k)
159 ENDDO
160 ELSE
161 DO i=0,1
162 qtmp2(i,0) = qtmp2(i,0) + qtmp2(i,k)
163 ENDDO
164 ENDIF
165 ENDIF
166 ENDDO
167 ENDIF
168
169 C-- Average, Standard.Dev.:
170 C- no counter diagnostics => average = Sum / vol :
171 IF ( mate.EQ.0 ) THEN
172 DO k=0,klev
173 IF ( qtmp1(0,k).LE.0. ) THEN
174 DO i=1,nStats
175 qtmp1(i,k) = undef
176 ENDDO
177 ELSE
178 DO i=1,iv
179 qtmp1(i,k) = qtmp1(i,k) / qtmp1(0,k)
180 ENDDO
181 C Variance :
182 qtmp1(iv,k) = qtmp1(iv,k) - qtmp1(1,k)*qtmp1(1,k)
183 C Standard deviation :
184 IF (qtmp1(iv,k).GT.0.) qtmp1(iv,k) = SQRT(qtmp1(iv,k))
185 ENDIF
186 ENDDO
187 C return global (& vertically integrated) volume in qtmp2(0,0):
188 qtmp2(0,0) = qtmp1(0,0)
189 ELSE
190 C With counter diagnostics => average = Sum / Sum(counter) :
191 DO k=0,klev
192 kCnt = min(k,kMlev)
193 IF ( qtmp2(0,kCnt).LE.0. ) THEN
194 DO i=1,nStats
195 qtmp1(i,k) = undef
196 ENDDO
197 ELSEIF ( qtmp2(1,kCnt).LE.0. ) THEN
198 DO i=1,iv
199 qtmp1(i,k) = undef
200 ENDDO
201 ELSE
202 DO i=1,iv
203 qtmp1(i,k) = qtmp1(i,k) / qtmp2(1,kCnt)
204 ENDDO
205 C jmc: looks like there is a Pb with how Variance is computed
206 C Variance :
207 qtmp1(iv,k) = qtmp1(iv,k) - qtmp1(1,k)*qtmp1(1,k)
208 C Standard deviation :
209 IF (qtmp1(iv,k).GT.0.) qtmp1(iv,k) = SQRT(qtmp1(iv,k))
210 ENDIF
211 ENDDO
212 ENDIF
213
214 ENDIF
215
216 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
217
218 RETURN
219 END

  ViewVC Help
Powered by ViewVC 1.1.22