/[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.1 - (hide 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 jmc 1.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