/[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.1 - (show annotations) (download)
Tue Jun 14 00:18:37 2011 UTC (13 years ago) by jmc
Branch: MAIN
CVS Tags: checkpoint62z
first attempt to compute Velocity Potential (from UVELMASS & VVELMASS diags).

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_interp_vert.F,v 1.12 2011/06/12 19:16:09 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 O nFilled, qtmp1, qtmp2,
14 I myTime, myIter, myThid )
15
16 C !DESCRIPTION:
17 C Compute Velocity Potential
18
19 C !USES:
20 IMPLICIT NONE
21 #include "SIZE.h"
22 #include "EEPARAMS.h"
23 #include "PARAMS.h"
24 #include "GRID.h"
25 #include "DIAGNOSTICS_SIZE.h"
26 #include "DIAGNOSTICS.h"
27
28 INTEGER NrMax
29 PARAMETER( NrMax = numLevels )
30
31
32 C !INPUT PARAMETERS:
33 C listId :: Diagnostics list number being written
34 C md :: field number in the list "listId".
35 C ndId :: diagnostics Id number (in available diagnostics list)
36 C ip :: diagnostics pointer to storage array
37 C im :: counter-mate pointer to storage array
38 C lm :: index in the averageCycle
39 C nFilled :: effective counter number (from primary diag which this one is
40 C derived from); return 0 is missing filling.
41 C qtmp1 :: diagnostics field output array
42 C qtmp2 :: temp working array (same size as output array)
43 C myTime :: current time of simulation (s)
44 C myIter :: current iteration number
45 C myThid :: my Thread Id number
46 INTEGER listId, md, ndId, ip, im, lm
47 INTEGER nFilled
48 _RL qtmp1(1-OLx:sNx+OLx,1-OLy:sNy+OLy,NrMax,nSx,nSy)
49 _RL qtmp2(1-OLx:sNx+OLx,1-OLy:sNy+OLy,NrMax,nSx,nSy)
50 _RL myTime
51 INTEGER myIter, myThid
52 CEOP
53
54 C !FUNCTIONS:
55
56 C !LOCAL VARIABLES:
57 C i,j,k :: loop indices
58 INTEGER i, j, k
59 INTEGER bi, bj
60 CHARACTER*(MAX_LEN_MBUF) msgBuf
61
62 _RL undefRL
63 INTEGER ip1, ip2, jp1, jp2
64 INTEGER numIters
65 LOGICAL normaliseMatrice, diagNormaliseRHS
66 _RL residCriter, firstResidual, lastResidual
67 _RL a2dMax, a2dNorm
68 _RL rhsMax, rhsNorm
69 _RS aW2d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
70 _RS aS2d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
71 _RL b2d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
72 _RL x2d (1-OLx:sNx+OLx,1-OLy:sNy+OLy,nSx,nSy)
73 _RL uTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
74 _RL vTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
75
76 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
77
78 undefRL = UNSET_RL
79 CALL DIAGNOSTICS_GET_POINTERS( 'UVELMASS', listId,
80 & jp1, ip1, myThid )
81 CALL DIAGNOSTICS_GET_POINTERS( 'VVELMASS', listId,
82 & jp2, ip2, myThid )
83 IF ( ip1.EQ.0 .OR. ip2.EQ.0 ) THEN
84 WRITE(msgBuf,'(4A)') 'WARNING DIAGNOSTICS_CALC_PHIVEL:',
85 & ' trying to process "', flds(md,listId), '" :'
86 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
87 & SQUEEZE_RIGHT, myThid)
88 IF ( ip1.EQ.0 ) THEN
89 WRITE(msgBuf,'(4A)') 'WARNING DIAGNOSTICS_CALC_PHIVEL:',
90 & ' missing filled diag="UVELMASS"'
91 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
92 & SQUEEZE_RIGHT, myThid)
93 ENDIF
94 IF ( ip2.EQ.0 ) THEN
95 WRITE(msgBuf,'(4A)') 'WARNING DIAGNOSTICS_CALC_PHIVEL:',
96 & ' missing filled diag="VVELMASS"'
97 CALL PRINT_MESSAGE( msgBuf, errorMessageUnit,
98 & SQUEEZE_RIGHT, myThid)
99 ENDIF
100 nFilled = 0
101 ELSE
102 nFilled = MIN( ndiag(ip1,1,1), ndiag(ip2,1,1) )
103 ENDIF
104 IF ( nFilled.EQ.0 ) RETURN
105
106 C- averageCycle: move pointer
107 ip1 = ip1 + kdiag(jp1)*(lm-1)
108 ip2 = ip2 + kdiag(jp2)*(lm-1)
109
110 DO bj = myByLo(myThid), myByHi(myThid)
111 DO bi = myBxLo(myThid), myBxHi(myThid)
112 CALL DIAGNOSTICS_GET_DIAG( 0, undefRL,
113 O qtmp1(1-OLx,1-OLy,1,bi,bj),
114 I jp1, 0, ip1, 0, bi, bj, myThid )
115 CALL DIAGNOSTICS_GET_DIAG( 0, undefRL,
116 O qtmp2(1-OLx,1-OLy,1,bi,bj),
117 I jp2, 0, ip2, 0, bi, bj, myThid )
118 ENDDO
119 ENDDO
120
121 DO k = 1,kdiag(ndId)
122 C-- Solve for velocity potential for each level:
123
124 a2dMax = 0. _d 0
125 rhsMax = 0. _d 0
126 DO bj = myByLo(myThid), myByHi(myThid)
127 DO bi = myBxLo(myThid), myBxHi(myThid)
128 C- Initialise fist guess & RHS
129 DO j = 1-Oly,sNy+Oly
130 DO i = 1-Olx,sNx+Olx
131 b2d(i,j,bi,bj) = 0.
132 x2d(i,j,bi,bj) = 0.
133 ENDDO
134 ENDDO
135 C- calculate cg2d matrix:
136 DO j = 1,sNy+1
137 DO i = 1,sNx+1
138 aW2d(i,j,bi,bj) = dyG(i,j,bi,bj)*recip_dxC(i,j,bi,bj)
139 & *drF(k)*hFacW(i,j,k,bi,bj)
140 & *maskInW(i,j,bi,bj)
141 aS2d(i,j,bi,bj) = dxG(i,j,bi,bj)*recip_dyC(i,j,bi,bj)
142 & *drF(k)*hFacS(i,j,k,bi,bj)
143 & *maskInS(i,j,bi,bj)
144 a2dMax = MAX(a2dMax,aW2d(i,j,bi,bj))
145 a2dMax = MAX(a2dMax,aS2d(i,j,bi,bj))
146 ENDDO
147 ENDDO
148
149 C- calculate RHS = Div(uVel,vVel):
150 DO j = 1,sNy+1
151 DO i = 1,sNx+1
152 uTrans(i,j) = dyG(i,j,bi,bj)*drF(k)
153 & *qtmp1(i,j,k,bi,bj)*maskInW(i,j,bi,bj)
154 vTrans(i,j) = dxG(i,j,bi,bj)*drF(k)
155 & *qtmp2(i,j,k,bi,bj)*maskInS(i,j,bi,bj)
156 ENDDO
157 ENDDO
158 DO j = 1,sNy
159 DO i = 1,sNx
160 b2d(i,j,bi,bj) = ( ( uTrans(i+1,j) - uTrans(i,j) )
161 & + ( vTrans(i,j+1) - vTrans(i,j) )
162 & )*maskInC(i,j,bi,bj)
163 rhsMax = MAX(ABS(b2d(I,J,bi,bj)),rhsMax)
164 ENDDO
165 ENDDO
166
167 C- end bi,bj loops
168 ENDDO
169 ENDDO
170
171 C- Normalise Matrice & RHS :
172 diagNormaliseRHS = cg2dTargetResWunit.LE.0.
173 normaliseMatrice = .TRUE.
174 diagNormaliseRHS = .TRUE.
175 a2dNorm = 1. _d 0
176 rhsNorm = 1. _d 0
177 IF ( normaliseMatrice ) THEN
178 _GLOBAL_MAX_RL( a2dMax, myThid )
179 IF ( a2dMax .GE. 0. _d 0 ) a2dNorm = 1. _d 0/a2dMax
180 ENDIF
181 IF ( diagNormaliseRHS ) THEN
182 _GLOBAL_MAX_RL( rhsMax, myThid )
183 IF ( rhsMax .GE. 0. _d 0 ) rhsNorm = 1. _d 0/(a2dNorm*rhsMax)
184 residCriter = cg2dTargetResidual
185 ELSE
186 residCriter = a2dNorm * cg2dTargetResWunit
187 & * globalArea / deltaTmom
188 ENDIF
189 IF ( normaliseMatrice .OR. diagNormaliseRHS ) THEN
190 DO bj = myByLo(myThid), myByHi(myThid)
191 DO bi = myBxLo(myThid), myBxHi(myThid)
192 DO j = 1,sNy+1
193 DO i = 1,sNx+1
194 aW2d(i,j,bi,bj) = aW2d(i,j,bi,bj)*a2dNorm
195 aS2d(i,j,bi,bj) = aS2d(i,j,bi,bj)*a2dNorm
196 b2d(i,j,bi,bj) = b2d(i,j,bi,bj) *a2dNorm*rhsNorm
197 c x2d(i,j,bi,bj) = x2d(i,j,bi,bj) *rhsNorm
198 ENDDO
199 ENDDO
200 ENDDO
201 ENDDO
202 ENDIF
203
204 IF ( debugLevel.GE.debLevA .AND. k.EQ.1 ) THEN
205 _BEGIN_MASTER( myThid )
206 WRITE(standardMessageUnit,'(A,I9,2(A,1P1E13.6),A,1P1E9.2)')
207 & ' diag_cg2d (it=', myIter,') a2dNorm,rhsNorm=', a2dNorm,
208 & ' ,', rhsNorm, ' ; Criter=', residCriter
209 _END_MASTER( myThid )
210 ENDIF
211
212 numIters = cg2dMaxIters
213 CALL DIAG_CG2D(
214 I aW2d, aS2d, b2d,
215 I residCriter,
216 O firstResidual, lastResidual,
217 U x2d, numIters,
218 I myThid )
219
220 IF ( debugLevel.GE.debLevA ) THEN
221 _BEGIN_MASTER( myThid )
222 WRITE(standardMessageUnit,'(A,I4,A,I6,A,1P2E17.9)')
223 & ' diag_cg2d : k=', k, ' , iters=', numIters,
224 & ' ; ini,last_Res=', firstResidual, lastResidual
225 _END_MASTER( myThid )
226 ENDIF
227
228 c _EXCH_XY_RL( x2d, myThid )
229
230 C- Un-normalise the answer
231 IF (diagNormaliseRHS) THEN
232 DO bj = myByLo(myThid), myByHi(myThid)
233 DO bi = myBxLo(myThid), myBxHi(myThid)
234 DO j = 1,sNy
235 DO i = 1,sNx
236 c x2d(i,j,bi,bj) = x2d(i,j,bi,bj) /rhsNorm
237 qtmp1(i,j,k,bi,bj) = x2d(i,j,bi,bj)/rhsNorm
238 ENDDO
239 ENDDO
240 ENDDO
241 ENDDO
242 ENDIF
243
244 ENDDO
245
246 RETURN
247 END

  ViewVC Help
Powered by ViewVC 1.1.22