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

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

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


Revision 1.8 - (show annotations) (download)
Wed Aug 24 02:24:12 2011 UTC (12 years, 8 months 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, checkpoint63b, checkpoint63c, checkpoint64, checkpoint65, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65d, checkpoint65e
Changes since 1.7: +9 -1 lines
add DEBUG calls

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_calc_phivel.F,v 1.7 2011/08/01 20:39:47 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: DIAGNOSTICS_CALC_PHIVEL
9
10 C !INTERFACE:
11 SUBROUTINE DIAGNOSTICS_CALC_PHIVEL(
12 I listId, md, ndId, ip, im, lm,
13 I NrMax,
14 U qtmp1, qtmp2,
15 I myTime, myIter, myThid )
16
17 C !DESCRIPTION:
18 C Compute Velocity Potential and Velocity Stream-Function
19
20 C !USES:
21 IMPLICIT NONE
22 #include "SIZE.h"
23 #include "EEPARAMS.h"
24 #include "PARAMS.h"
25 #include "GRID.h"
26 #include "DIAGNOSTICS_SIZE.h"
27 #include "DIAGNOSTICS.h"
28 #include "DIAGNOSTICS_CALC.h"
29
30 C !INPUT PARAMETERS:
31 C listId :: Diagnostics list number being written
32 C md :: field number in the list "listId".
33 C ndId :: diagnostics Id number (in available diagnostics list)
34 C ip :: diagnostics pointer to storage array
35 C im :: counter-mate pointer to storage array
36 C lm :: index in the averageCycle
37 C NrMax :: 3rd dimension of input/output arrays
38 C qtmp1 :: horizontal velocity input diag., u-component
39 C qtmp2 :: horizontal velocity input diag., v-component
40 C myTime :: current time of simulation (s)
41 C myIter :: current iteration number
42 C myThid :: my Thread Id number
43 INTEGER listId, md, ndId, ip, im, lm
44 INTEGER NrMax
45 _RL qtmp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,NrMax,nSx,nSy)
46 _RL qtmp2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,NrMax,nSx,nSy)
47 _RL myTime
48 INTEGER myIter, myThid
49
50 C !OUTPUT PARAMETERS:
51 C qtmp1 :: horizontal-velocity potential
52 C qtmp2 :: horizontal-velocity stream-function
53 CEOP
54
55 C !FUNCTIONS:
56 INTEGER ILNBLNK
57 EXTERNAL ILNBLNK
58
59 C !LOCAL VARIABLES:
60 C bi, bj :: tile indices
61 C i,j,k :: loop indices
62 C uTrans :: horizontal transport, u-component
63 C vTrans :: horizontal transport, u-component
64 C psiVel :: horizontal stream-function
65 C psiLoc :: horizontal stream-function at special location
66 INTEGER bi, bj
67 INTEGER i, j, k
68
69 INTEGER ks
70 INTEGER numIters, nIterMin
71 LOGICAL normaliseMatrice, diagNormaliseRHS
72 _RL residCriter, firstResidual, minResidual, lastResidual
73 _RL a2dMax, a2dNorm
74 _RL rhsMax, b2dNorm, x2dNorm
75 _RS aW2d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
76 _RS aS2d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
77 _RL b2d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
78 _RL x2d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
79 _RL uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
80 _RL vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
81 _RL psiVel(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
82 _RL psiLoc(2)
83 INTEGER iL
84 CHARACTER*(MAX_LEN_FNAM) dataFName
85 CHARACTER*(MAX_LEN_MBUF) msgBuf
86
87 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
88
89 #ifdef ALLOW_DEBUG
90 IF (debugMode) CALL DEBUG_ENTER('DIAGNOSTICS_CALC_PHIVEL',myThid)
91 #endif
92
93 DO ks = 1,nlevels(listId)
94 k = NINT(levs(ks,listId))
95 C-- Solve for velocity potential for each level:
96
97 a2dMax = 0. _d 0
98 rhsMax = 0. _d 0
99 DO bj = myByLo(myThid), myByHi(myThid)
100 DO bi = myBxLo(myThid), myBxHi(myThid)
101 C- Initialise fist guess & RHS
102 DO j = 1-Oly,sNy+Oly
103 DO i = 1-Olx,sNx+Olx
104 b2d(i,j,bi,bj) = 0.
105 x2d(i,j,bi,bj) = 0.
106 ENDDO
107 ENDDO
108 C- calculate cg2d matrix:
109 DO j = 1,sNy+1
110 DO i = 1,sNx+1
111 aW2d(i,j,bi,bj) = dyG(i,j,bi,bj)*recip_dxC(i,j,bi,bj)
112 & *drF(k)*hFacW(i,j,k,bi,bj)
113 & *maskInC(i-1,j,bi,bj)*maskInC(i,j,bi,bj)
114 aS2d(i,j,bi,bj) = dxG(i,j,bi,bj)*recip_dyC(i,j,bi,bj)
115 & *drF(k)*hFacS(i,j,k,bi,bj)
116 & *maskInC(i,j-1,bi,bj)*maskInC(i,j,bi,bj)
117 a2dMax = MAX(a2dMax,aW2d(i,j,bi,bj))
118 a2dMax = MAX(a2dMax,aS2d(i,j,bi,bj))
119 ENDDO
120 ENDDO
121
122 C- calculate horizontal transport
123 DO j = 1,sNy+1
124 DO i = 1,sNx+1
125 uTrans(i,j,bi,bj) = dyG(i,j,bi,bj)*drF(k)
126 & *qtmp1(i,j,ks,bi,bj)*maskInW(i,j,bi,bj)
127 vTrans(i,j,bi,bj) = dxG(i,j,bi,bj)*drF(k)
128 & *qtmp2(i,j,ks,bi,bj)*maskInS(i,j,bi,bj)
129 ENDDO
130 ENDDO
131 C- end bi,bj loops
132 ENDDO
133 ENDDO
134
135 #ifdef ALLOW_OBCS
136 IF ( useOBCS ) THEN
137 CALL OBCS_DIAG_BALANCE(
138 I k,
139 U uTrans, vTrans,
140 I myTime, myIter, myThid )
141 ENDIF
142 #endif /* ALLOW_OBCS */
143
144 C- calculate RHS = rAc*Div(uVel,vVel):
145 DO bj = myByLo(myThid), myByHi(myThid)
146 DO bi = myBxLo(myThid), myBxHi(myThid)
147 DO j = 1,sNy
148 DO i = 1,sNx
149 b2d(i,j,bi,bj) = (
150 & ( uTrans(i+1,j,bi,bj) - uTrans(i,j,bi,bj) )
151 & + ( vTrans(i,j+1,bi,bj) - vTrans(i,j,bi,bj) )
152 & )*maskInC(i,j,bi,bj)
153 rhsMax = MAX(ABS(b2d(I,J,bi,bj)),rhsMax)
154 ENDDO
155 ENDDO
156 ENDDO
157 ENDDO
158
159 C- Normalise Matrice & RHS :
160 diagNormaliseRHS = diagCG_resTarget.GT.0.
161 normaliseMatrice = .TRUE.
162 diagNormaliseRHS = .TRUE.
163 a2dNorm = 1. _d 0
164 b2dNorm = 1. _d 0
165 x2dNorm = 1. _d 0
166 IF ( normaliseMatrice ) THEN
167 _GLOBAL_MAX_RL( a2dMax, myThid )
168 IF ( a2dMax .GT. 0. _d 0 ) a2dNorm = 1. _d 0/a2dMax
169 b2dNorm = a2dNorm
170 ENDIF
171 IF ( diagNormaliseRHS ) THEN
172 _GLOBAL_MAX_RL( rhsMax, myThid )
173 IF ( rhsMax .GT. 0. _d 0 ) THEN
174 b2dNorm = 1. _d 0/rhsMax
175 x2dNorm = a2dNorm*rhsMax
176 ENDIF
177 residCriter = diagCG_resTarget
178 ELSE
179 residCriter = a2dNorm * ABS(diagCG_resTarget)
180 & * globalArea / deltaTmom
181 ENDIF
182 IF ( normaliseMatrice .OR. diagNormaliseRHS ) THEN
183 DO bj = myByLo(myThid), myByHi(myThid)
184 DO bi = myBxLo(myThid), myBxHi(myThid)
185 DO j = 1,sNy+1
186 DO i = 1,sNx+1
187 aW2d(i,j,bi,bj) = aW2d(i,j,bi,bj)*a2dNorm
188 aS2d(i,j,bi,bj) = aS2d(i,j,bi,bj)*a2dNorm
189 b2d(i,j,bi,bj) = b2d(i,j,bi,bj) *b2dNorm
190 c x2d(i,j,bi,bj) = x2d(i,j,bi,bj) /x2dNorm
191 ENDDO
192 ENDDO
193 ENDDO
194 ENDDO
195 ENDIF
196
197 IF ( debugLevel.GE.debLevA .AND. k.EQ.1 ) THEN
198 _BEGIN_MASTER( myThid )
199 WRITE(standardMessageUnit,'(A,I9,2(A,1P1E13.6),A,1P1E9.2)')
200 & ' diag_cg2d (it=', myIter,') a2dNorm,x2dNorm=', a2dNorm,
201 & ' ,', x2dNorm, ' ; Criter=', residCriter
202 _END_MASTER( myThid )
203 ENDIF
204
205 numIters = diagCG_maxIters
206 CALL DIAG_CG2D(
207 I aW2d, aS2d, b2d,
208 I residCriter,
209 O firstResidual, minResidual, lastResidual,
210 U x2d, numIters,
211 O nIterMin,
212 I diagCG_prtResFrq, myThid )
213
214 IF ( debugLevel.GE.debLevA ) THEN
215 _BEGIN_MASTER( myThid )
216 WRITE(standardMessageUnit,'(A,I4,A,2I6,A,1P3E14.7)')
217 & ' diag_cg2d : k=', k, ' , it=', nIterMin, numIters,
218 & ' ; ini,min,last_Res=',firstResidual,minResidual,lastResidual
219 _END_MASTER( myThid )
220 ENDIF
221
222 _EXCH_XY_RL( x2d, myThid )
223
224 C- Un-normalise the answer
225 IF (diagNormaliseRHS) THEN
226 DO bj = myByLo(myThid), myByHi(myThid)
227 DO bi = myBxLo(myThid), myBxHi(myThid)
228 DO j = 1-Oly,sNy+Oly
229 DO i = 1-Olx,sNx+Olx
230 x2d(i,j,bi,bj) = x2d(i,j,bi,bj)*x2dNorm
231 ENDDO
232 ENDDO
233 ENDDO
234 ENDDO
235 ENDIF
236
237 C- Compte divergence-free transport:
238 DO bj = myByLo(myThid), myByHi(myThid)
239 DO bi = myBxLo(myThid), myBxHi(myThid)
240 DO j = 1,sNy+1
241 DO i = 1,sNx+1
242 uTrans(i,j,bi,bj) = uTrans(i,j,bi,bj)
243 & - ( x2d(i,j,bi,bj) - x2d(i-1,j,bi,bj) )
244 & *recip_dxC(i,j,bi,bj)*dyG(i,j,bi,bj)
245 & *drF(k)*hFacW(i,j,k,bi,bj)
246 & *maskInC(i-1,j,bi,bj)*maskInC(i,j,bi,bj)
247 vTrans(i,j,bi,bj) = vTrans(i,j,bi,bj)
248 & - ( x2d(i,j,bi,bj) - x2d(i,j-1,bi,bj) )
249 & *recip_dyC(i,j,bi,bj)*dxG(i,j,bi,bj)
250 & *drF(k)*hFacS(i,j,k,bi,bj)
251 & *maskInC(i,j-1,bi,bj)*maskInC(i,j,bi,bj)
252 ENDDO
253 ENDDO
254 ENDDO
255 ENDDO
256 CALL DIAG_CALC_PSIVEL(
257 I k, iPsi0, jPsi0, uTrans, vTrans,
258 O psiVel, psiLoc,
259 I prtFirstCall, myTime, myIter, myThid )
260
261 _BEGIN_MASTER( myThid)
262 IF ( useCubedSphereExchange .AND.
263 & diag_mdsio .AND. myProcId.EQ.0 ) THEN
264 C- Missing-corner value are not written in MDS output file
265 C Write separately these 2 values (should be part of DIAGNOSTICS_OUT)
266 IF ( diagLoc_ioUnit.EQ.0 ) THEN
267 CALL MDSFINDUNIT( diagLoc_ioUnit, myThid )
268 WRITE(dataFName,'(2A,I10.10,A)')
269 & 'diags_CScorners', '.', nIter0, '.txt'
270 OPEN( diagLoc_ioUnit, FILE=dataFName, STATUS='unknown' )
271 iL = ILNBLNK(dataFName)
272 WRITE(msgBuf,'(2A,I6,2A)') 'DIAGNOSTICS_CALC_PHIVEL: ',
273 & 'open unit=',diagLoc_ioUnit, ', file: ',dataFName(1:iL)
274 CALL PRINT_MESSAGE( msgBuf, standardMessageUnit,
275 & SQUEEZE_RIGHT, myThid )
276 ENDIF
277 IF ( diagLoc_ioUnit.GT.0 ) THEN
278 WRITE(diagLoc_ioUnit,'(1P2E18.10,A,2I4,I8,A,2I4,I6,2A)')
279 & psiLoc, ' #', k, lm, myIter,
280 & ' :',listId, md, ndId, ' ', cdiag(ndId)
281 C- check accuracy (f1.SW-corner = f6.NW-corner = f5-NE-corner)
282 c WRITE(0,'(1P2E18.10,A,2I4,I8)')
283 c & psiVel(1,1+sNy,nSx,nSy)- psiVel(1,1,1,1),
284 c & psiVel(1+sNx,1+sNy,nSx-1,nSy)-psiVel(1,1,1,1),
285 c & ' #', k, lm, myIter
286 ENDIF
287 ENDIF
288 IF ( prtFirstCall ) prtFirstCall = .FALSE.
289 _END_MASTER( myThid)
290
291 C- Put the results back in qtmp[1,2]
292 DO bj = myByLo(myThid), myByHi(myThid)
293 DO bi = myBxLo(myThid), myBxHi(myThid)
294 DO j = 1,sNy+1
295 DO i = 1,sNx+1
296 qtmp1(i,j,ks,bi,bj) = x2d(i,j,bi,bj)
297 qtmp2(i,j,ks,bi,bj) = psiVel(i,j,bi,bj)
298 ENDDO
299 ENDDO
300 ENDDO
301 ENDDO
302
303 ENDDO
304
305 #ifdef ALLOW_DEBUG
306 IF (debugMode) CALL DEBUG_LEAVE('DIAGNOSTICS_CALC_PHIVEL',myThid)
307 #endif
308
309 RETURN
310 END

  ViewVC Help
Powered by ViewVC 1.1.22