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

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

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


Revision 1.8 - (hide 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 jmc 1.8 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_calc_phivel.F,v 1.7 2011/08/01 20:39:47 jmc Exp $
2 jmc 1.1 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 jmc 1.4 I NrMax,
14 jmc 1.2 U qtmp1, qtmp2,
15 jmc 1.1 I myTime, myIter, myThid )
16    
17     C !DESCRIPTION:
18 jmc 1.4 C Compute Velocity Potential and Velocity Stream-Function
19 jmc 1.1
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 jmc 1.5 #include "DIAGNOSTICS_CALC.h"
29 jmc 1.1
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 jmc 1.4 C NrMax :: 3rd dimension of input/output arrays
38 jmc 1.2 C qtmp1 :: horizontal velocity input diag., u-component
39     C qtmp2 :: horizontal velocity input diag., v-component
40 jmc 1.1 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 jmc 1.4 INTEGER NrMax
45 jmc 1.1 _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 jmc 1.2
50     C !OUTPUT PARAMETERS:
51     C qtmp1 :: horizontal-velocity potential
52     C qtmp2 :: horizontal-velocity stream-function
53 jmc 1.1 CEOP
54    
55     C !FUNCTIONS:
56 jmc 1.4 INTEGER ILNBLNK
57     EXTERNAL ILNBLNK
58 jmc 1.1
59     C !LOCAL VARIABLES:
60 jmc 1.4 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 jmc 1.1 INTEGER i, j, k
68    
69 jmc 1.2 INTEGER ks
70 jmc 1.6 INTEGER numIters, nIterMin
71 jmc 1.1 LOGICAL normaliseMatrice, diagNormaliseRHS
72 jmc 1.6 _RL residCriter, firstResidual, minResidual, lastResidual
73 jmc 1.1 _RL a2dMax, a2dNorm
74 jmc 1.7 _RL rhsMax, b2dNorm, x2dNorm
75 jmc 1.1 _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 jmc 1.4 _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 jmc 1.1
87     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
88    
89 jmc 1.8 #ifdef ALLOW_DEBUG
90     IF (debugMode) CALL DEBUG_ENTER('DIAGNOSTICS_CALC_PHIVEL',myThid)
91     #endif
92    
93 jmc 1.7 DO ks = 1,nlevels(listId)
94 jmc 1.2 k = NINT(levs(ks,listId))
95 jmc 1.1 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 jmc 1.6 & *maskInC(i-1,j,bi,bj)*maskInC(i,j,bi,bj)
114 jmc 1.1 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 jmc 1.6 & *maskInC(i,j-1,bi,bj)*maskInC(i,j,bi,bj)
117 jmc 1.1 a2dMax = MAX(a2dMax,aW2d(i,j,bi,bj))
118     a2dMax = MAX(a2dMax,aS2d(i,j,bi,bj))
119     ENDDO
120     ENDDO
121    
122 jmc 1.7 C- calculate horizontal transport
123 jmc 1.1 DO j = 1,sNy+1
124     DO i = 1,sNx+1
125 jmc 1.4 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 jmc 1.1 ENDDO
130     ENDDO
131 jmc 1.7 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 jmc 1.1 DO j = 1,sNy
148     DO i = 1,sNx
149 jmc 1.4 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 jmc 1.1 & )*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 jmc 1.6 diagNormaliseRHS = diagCG_resTarget.GT.0.
161 jmc 1.1 normaliseMatrice = .TRUE.
162     diagNormaliseRHS = .TRUE.
163     a2dNorm = 1. _d 0
164 jmc 1.7 b2dNorm = 1. _d 0
165     x2dNorm = 1. _d 0
166 jmc 1.1 IF ( normaliseMatrice ) THEN
167     _GLOBAL_MAX_RL( a2dMax, myThid )
168 jmc 1.5 IF ( a2dMax .GT. 0. _d 0 ) a2dNorm = 1. _d 0/a2dMax
169 jmc 1.7 b2dNorm = a2dNorm
170 jmc 1.1 ENDIF
171     IF ( diagNormaliseRHS ) THEN
172     _GLOBAL_MAX_RL( rhsMax, myThid )
173 jmc 1.7 IF ( rhsMax .GT. 0. _d 0 ) THEN
174     b2dNorm = 1. _d 0/rhsMax
175     x2dNorm = a2dNorm*rhsMax
176     ENDIF
177 jmc 1.6 residCriter = diagCG_resTarget
178 jmc 1.1 ELSE
179 jmc 1.6 residCriter = a2dNorm * ABS(diagCG_resTarget)
180 jmc 1.1 & * 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 jmc 1.7 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 jmc 1.1 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 jmc 1.7 & ' diag_cg2d (it=', myIter,') a2dNorm,x2dNorm=', a2dNorm,
201     & ' ,', x2dNorm, ' ; Criter=', residCriter
202 jmc 1.1 _END_MASTER( myThid )
203     ENDIF
204    
205 jmc 1.6 numIters = diagCG_maxIters
206 jmc 1.1 CALL DIAG_CG2D(
207     I aW2d, aS2d, b2d,
208     I residCriter,
209 jmc 1.6 O firstResidual, minResidual, lastResidual,
210 jmc 1.1 U x2d, numIters,
211 jmc 1.6 O nIterMin,
212     I diagCG_prtResFrq, myThid )
213 jmc 1.1
214     IF ( debugLevel.GE.debLevA ) THEN
215     _BEGIN_MASTER( myThid )
216 jmc 1.6 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 jmc 1.1 _END_MASTER( myThid )
220     ENDIF
221    
222 jmc 1.4 _EXCH_XY_RL( x2d, myThid )
223 jmc 1.1
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 jmc 1.4 DO j = 1-Oly,sNy+Oly
229     DO i = 1-Olx,sNx+Olx
230 jmc 1.7 x2d(i,j,bi,bj) = x2d(i,j,bi,bj)*x2dNorm
231 jmc 1.1 ENDDO
232     ENDDO
233     ENDDO
234     ENDDO
235     ENDIF
236    
237 jmc 1.4 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 jmc 1.6 & *maskInC(i-1,j,bi,bj)*maskInC(i,j,bi,bj)
247 jmc 1.4 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 jmc 1.6 & *maskInC(i,j-1,bi,bj)*maskInC(i,j,bi,bj)
252 jmc 1.4 ENDDO
253     ENDDO
254     ENDDO
255     ENDDO
256     CALL DIAG_CALC_PSIVEL(
257     I k, iPsi0, jPsi0, uTrans, vTrans,
258     O psiVel, psiLoc,
259 jmc 1.7 I prtFirstCall, myTime, myIter, myThid )
260 jmc 1.4
261 jmc 1.7 _BEGIN_MASTER( myThid)
262 jmc 1.4 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 jmc 1.7 IF ( prtFirstCall ) prtFirstCall = .FALSE.
289     _END_MASTER( myThid)
290 jmc 1.4
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 jmc 1.1 ENDDO
304    
305 jmc 1.8 #ifdef ALLOW_DEBUG
306     IF (debugMode) CALL DEBUG_LEAVE('DIAGNOSTICS_CALC_PHIVEL',myThid)
307     #endif
308    
309 jmc 1.1 RETURN
310     END

  ViewVC Help
Powered by ViewVC 1.1.22