/[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.3 - (hide annotations) (download)
Fri Jun 24 22:15:48 2011 UTC (12 years, 11 months ago) by jmc
Branch: MAIN
Changes since 1.2: +2 -2 lines
avoid unused variables

1 jmc 1.3 C $Header: /u/gcmpack/MITgcm/pkg/diagnostics/diagnostics_calc_phivel.F,v 1.2 2011/06/21 18:00:48 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.2 U qtmp1, qtmp2,
14 jmc 1.1 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 jmc 1.2 C qtmp1 :: horizontal velocity input diag., u-component
40     C qtmp2 :: horizontal velocity input diag., v-component
41 jmc 1.1 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 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    
57     C !LOCAL VARIABLES:
58     C i,j,k :: loop indices
59     INTEGER i, j, k
60     INTEGER bi, bj
61 jmc 1.3 c CHARACTER*(MAX_LEN_MBUF) msgBuf
62 jmc 1.1
63 jmc 1.2 INTEGER ks
64 jmc 1.1 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 jmc 1.2 DO ks = 1,kdiag(ndId)
79     k = NINT(levs(ks,listId))
80 jmc 1.1 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 jmc 1.2 & *qtmp1(i,j,ks,bi,bj)*maskInW(i,j,bi,bj)
112 jmc 1.1 vTrans(i,j) = dxG(i,j,bi,bj)*drF(k)
113 jmc 1.2 & *qtmp2(i,j,ks,bi,bj)*maskInS(i,j,bi,bj)
114 jmc 1.1 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 jmc 1.2 qtmp1(i,j,ks,bi,bj) = x2d(i,j,bi,bj)/rhsNorm
196 jmc 1.1 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