/[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.2 - (show annotations) (download)
Tue Jun 21 18:00:48 2011 UTC (12 years, 11 months ago) by jmc
Branch: MAIN
Changes since 1.1: +14 -56 lines
Update Velocity-potential computation using post-processed diag framework.

1 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_calc_phivel.F,v 1.1 2011/06/14 00:18:37 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 U 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 qtmp1 :: horizontal velocity input diag., u-component
40 C qtmp2 :: horizontal velocity input diag., v-component
41 C myTime :: current time of simulation (s)
42 C myIter :: current iteration number
43 C myThid :: my Thread Id number
44 INTEGER listId, md, ndId, ip, im, lm
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
57 C !LOCAL VARIABLES:
58 C i,j,k :: loop indices
59 INTEGER i, j, k
60 INTEGER bi, bj
61 CHARACTER*(MAX_LEN_MBUF) msgBuf
62
63 INTEGER ks
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 DO ks = 1,kdiag(ndId)
79 k = NINT(levs(ks,listId))
80 C-- Solve for velocity potential for each level:
81
82 a2dMax = 0. _d 0
83 rhsMax = 0. _d 0
84 DO bj = myByLo(myThid), myByHi(myThid)
85 DO bi = myBxLo(myThid), myBxHi(myThid)
86 C- Initialise fist guess & RHS
87 DO j = 1-Oly,sNy+Oly
88 DO i = 1-Olx,sNx+Olx
89 b2d(i,j,bi,bj) = 0.
90 x2d(i,j,bi,bj) = 0.
91 ENDDO
92 ENDDO
93 C- calculate cg2d matrix:
94 DO j = 1,sNy+1
95 DO i = 1,sNx+1
96 aW2d(i,j,bi,bj) = dyG(i,j,bi,bj)*recip_dxC(i,j,bi,bj)
97 & *drF(k)*hFacW(i,j,k,bi,bj)
98 & *maskInW(i,j,bi,bj)
99 aS2d(i,j,bi,bj) = dxG(i,j,bi,bj)*recip_dyC(i,j,bi,bj)
100 & *drF(k)*hFacS(i,j,k,bi,bj)
101 & *maskInS(i,j,bi,bj)
102 a2dMax = MAX(a2dMax,aW2d(i,j,bi,bj))
103 a2dMax = MAX(a2dMax,aS2d(i,j,bi,bj))
104 ENDDO
105 ENDDO
106
107 C- calculate RHS = Div(uVel,vVel):
108 DO j = 1,sNy+1
109 DO i = 1,sNx+1
110 uTrans(i,j) = dyG(i,j,bi,bj)*drF(k)
111 & *qtmp1(i,j,ks,bi,bj)*maskInW(i,j,bi,bj)
112 vTrans(i,j) = dxG(i,j,bi,bj)*drF(k)
113 & *qtmp2(i,j,ks,bi,bj)*maskInS(i,j,bi,bj)
114 ENDDO
115 ENDDO
116 DO j = 1,sNy
117 DO i = 1,sNx
118 b2d(i,j,bi,bj) = ( ( uTrans(i+1,j) - uTrans(i,j) )
119 & + ( vTrans(i,j+1) - vTrans(i,j) )
120 & )*maskInC(i,j,bi,bj)
121 rhsMax = MAX(ABS(b2d(I,J,bi,bj)),rhsMax)
122 ENDDO
123 ENDDO
124
125 C- end bi,bj loops
126 ENDDO
127 ENDDO
128
129 C- Normalise Matrice & RHS :
130 diagNormaliseRHS = cg2dTargetResWunit.LE.0.
131 normaliseMatrice = .TRUE.
132 diagNormaliseRHS = .TRUE.
133 a2dNorm = 1. _d 0
134 rhsNorm = 1. _d 0
135 IF ( normaliseMatrice ) THEN
136 _GLOBAL_MAX_RL( a2dMax, myThid )
137 IF ( a2dMax .GE. 0. _d 0 ) a2dNorm = 1. _d 0/a2dMax
138 ENDIF
139 IF ( diagNormaliseRHS ) THEN
140 _GLOBAL_MAX_RL( rhsMax, myThid )
141 IF ( rhsMax .GE. 0. _d 0 ) rhsNorm = 1. _d 0/(a2dNorm*rhsMax)
142 residCriter = cg2dTargetResidual
143 ELSE
144 residCriter = a2dNorm * cg2dTargetResWunit
145 & * globalArea / deltaTmom
146 ENDIF
147 IF ( normaliseMatrice .OR. diagNormaliseRHS ) THEN
148 DO bj = myByLo(myThid), myByHi(myThid)
149 DO bi = myBxLo(myThid), myBxHi(myThid)
150 DO j = 1,sNy+1
151 DO i = 1,sNx+1
152 aW2d(i,j,bi,bj) = aW2d(i,j,bi,bj)*a2dNorm
153 aS2d(i,j,bi,bj) = aS2d(i,j,bi,bj)*a2dNorm
154 b2d(i,j,bi,bj) = b2d(i,j,bi,bj) *a2dNorm*rhsNorm
155 c x2d(i,j,bi,bj) = x2d(i,j,bi,bj) *rhsNorm
156 ENDDO
157 ENDDO
158 ENDDO
159 ENDDO
160 ENDIF
161
162 IF ( debugLevel.GE.debLevA .AND. k.EQ.1 ) THEN
163 _BEGIN_MASTER( myThid )
164 WRITE(standardMessageUnit,'(A,I9,2(A,1P1E13.6),A,1P1E9.2)')
165 & ' diag_cg2d (it=', myIter,') a2dNorm,rhsNorm=', a2dNorm,
166 & ' ,', rhsNorm, ' ; Criter=', residCriter
167 _END_MASTER( myThid )
168 ENDIF
169
170 numIters = cg2dMaxIters
171 CALL DIAG_CG2D(
172 I aW2d, aS2d, b2d,
173 I residCriter,
174 O firstResidual, lastResidual,
175 U x2d, numIters,
176 I myThid )
177
178 IF ( debugLevel.GE.debLevA ) THEN
179 _BEGIN_MASTER( myThid )
180 WRITE(standardMessageUnit,'(A,I4,A,I6,A,1P2E17.9)')
181 & ' diag_cg2d : k=', k, ' , iters=', numIters,
182 & ' ; ini,last_Res=', firstResidual, lastResidual
183 _END_MASTER( myThid )
184 ENDIF
185
186 c _EXCH_XY_RL( x2d, myThid )
187
188 C- Un-normalise the answer
189 IF (diagNormaliseRHS) THEN
190 DO bj = myByLo(myThid), myByHi(myThid)
191 DO bi = myBxLo(myThid), myBxHi(myThid)
192 DO j = 1,sNy
193 DO i = 1,sNx
194 c x2d(i,j,bi,bj) = x2d(i,j,bi,bj) /rhsNorm
195 qtmp1(i,j,ks,bi,bj) = x2d(i,j,bi,bj)/rhsNorm
196 ENDDO
197 ENDDO
198 ENDDO
199 ENDDO
200 ENDIF
201
202 ENDDO
203
204 RETURN
205 END

  ViewVC Help
Powered by ViewVC 1.1.22