/[MITgcm]/MITgcm/pkg/mom_common/mom_v_implicit_r.F
ViewVC logotype

Annotation of /MITgcm/pkg/mom_common/mom_v_implicit_r.F

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


Revision 1.9 - (hide annotations) (download)
Wed Nov 30 19:41:30 2016 UTC (7 years, 6 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, HEAD
Changes since 1.8: +2 -5 lines
fix declaration of argument kappaRU & kappaRV

1 jmc 1.9 C $Header: /u/gcmpack/MITgcm/pkg/mom_common/mom_v_implicit_r.F,v 1.8 2016/11/28 23:09:12 jmc Exp $
2 jmc 1.1 C $Name: $
3    
4     #include "MOM_COMMON_OPTIONS.h"
5    
6     CBOP
7     C !ROUTINE: MOM_V_IMPLICIT_R
8     C !INTERFACE:
9     SUBROUTINE MOM_V_IMPLICIT_R(
10     I kappaRV,
11     I bi, bj, myTime, myIter, myThid )
12     C !DESCRIPTION: \bv
13     C *==========================================================*
14     C | S/R MOM_V_IMPLICIT_R
15     C | o Solve implicitly vertical advection & diffusion
16     C | of momentum, meridional component
17     C *==========================================================*
18     C *==========================================================*
19     C \ev
20    
21     C !USES:
22     IMPLICIT NONE
23     C == Global data ==
24     #include "SIZE.h"
25     #include "EEPARAMS.h"
26     #include "PARAMS.h"
27     #include "GRID.h"
28     #include "DYNVARS.h"
29    
30     C !INPUT/OUTPUT PARAMETERS:
31     C == Routine Arguments ==
32 jmc 1.9 _RL kappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
33 jmc 1.1 INTEGER bi, bj
34     _RL myTime
35     INTEGER myIter, myThid
36    
37     C !LOCAL VARIABLES:
38     C == Local variables ==
39 jmc 1.6 C iMin,iMax,jMin,jMax :: computational domain
40     C i,j,k :: loop indices
41     C a5d :: 2nd lower diagonal of the pentadiagonal matrix
42     C b5d :: 1rst lower diagonal of the pentadiagonal matrix
43     C c5d :: main diagonal of the pentadiagonal matrix
44     C d5d :: 1rst upper diagonal of the pentadiagonal matrix
45     C e5d :: 2nd upper diagonal of the pentadiagonal matrix
46     C rTrans :: vertical volume transport at interface k
47     C diagonalNumber :: number of non-zero diagonals in the matrix
48     C errCode :: > 0 if singular matrix
49 jmc 1.1 INTEGER iMin,iMax,jMin,jMax
50 jmc 1.6 PARAMETER( iMin = 1, iMax = sNx )
51     PARAMETER( jMin = 1, jMax = sNy+1 )
52 jmc 1.1 INTEGER i,j,k
53     INTEGER diagonalNumber, errCode
54 jmc 1.5 c _RL a5d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
55     _RL b5d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
56     _RL c5d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
57     _RL d5d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
58     c _RL e5d(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
59     _RL rTrans(1-OLx:sNx+OLx,1-OLy:sNy+OLy)
60 jmc 1.2 _RL rCenter, rUpwind, upwindFac
61 jmc 1.3 #ifdef ALLOW_DIAGNOSTICS
62     CHARACTER*8 diagName
63     LOGICAL DIAGNOSTICS_IS_ON
64     EXTERNAL DIAGNOSTICS_IS_ON
65 jmc 1.5 _RL vf (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
66 jmc 1.3 #endif
67 jmc 1.1 CEOP
68    
69     C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
70     C Solve for V-component :
71     C----------------------------
72    
73     C-- Initialise
74     DO k=1,Nr
75 jmc 1.5 DO j=1-OLy,sNy+OLy
76     DO i=1-OLx,sNx+OLx
77 jmc 1.1 c a5d(i,j,k) = 0. _d 0
78     b5d(i,j,k) = 0. _d 0
79     c5d(i,j,k) = 1. _d 0
80     d5d(i,j,k) = 0. _d 0
81     c e5d(i,j,k) = 0. _d 0
82     ENDDO
83     ENDDO
84     ENDDO
85     diagonalNumber = 1
86    
87     IF ( implicitViscosity .AND. Nr.GT.1 ) THEN
88    
89     C-- set the tri-diagonal matrix to solve the implicit viscosity
90     diagonalNumber = 3
91     C- 1rst lower diagonal :
92     DO k=2,Nr
93     DO j=jMin,jMax
94     DO i=iMin,iMax
95 jmc 1.6 IF (maskS(i,j,k-1,bi,bj).EQ.oneRS)
96 jmc 1.5 & b5d(i,j,k) = -deltaTMom
97 heimbach 1.4 & *_recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
98 jmc 1.6 & *recip_deepFac2C(k)*recip_rhoFacC(k)
99 jmc 1.1 & *kappaRV(i,j, k )*recip_drC( k )
100 jmc 1.6 & *deepFac2F( k )*rhoFacF( k )
101 jmc 1.1 ENDDO
102     ENDDO
103     ENDDO
104     C- 1rst upper diagonal :
105     DO k=1,Nr-1
106     DO j=jMin,jMax
107     DO i=iMin,iMax
108 jmc 1.6 IF (maskS(i,j,k+1,bi,bj).EQ.oneRS)
109 jmc 1.5 & d5d(i,j,k) = -deltaTMom
110 jmc 1.6 & *_recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
111     & *recip_deepFac2C(k)*recip_rhoFacC(k)
112     & *kappaRV(i,j,k+1)*recip_drC(k+1)
113     & *deepFac2F(k+1)*rhoFacF(k+1)
114 jmc 1.1 ENDDO
115     ENDDO
116     ENDDO
117     C- Main diagonal :
118     DO k=1,Nr
119     DO j=jMin,jMax
120     DO i=iMin,iMax
121 jmc 1.6 c5d(i,j,k) = 1. _d 0 - ( b5d(i,j,k) + d5d(i,j,k) )
122 jmc 1.1 ENDDO
123     ENDDO
124     ENDDO
125    
126     C-- end if implicitDiffusion
127     ENDIF
128    
129 jmc 1.8 IF ( selectImplicitDrag.GE.1 ) THEN
130     IF ( no_slip_bottom .OR. selectBotDragQuadr.GE.0
131     & .OR. bottomDragLinear.NE.0. ) THEN
132     CALL MOM_V_BOTDRAG_IMPL(
133     I uVel(1-OLx,1-OLy,1,bi,bj),
134     I vVel(1-OLx,1-OLy,1,bi,bj),
135     I kappaRV,
136     U c5d,
137     I bi, bj, myIter, myThid )
138     ENDIF
139     ENDIF
140    
141 jmc 1.1 IF ( momImplVertAdv .AND. Nr.GT.1 ) THEN
142    
143     diagonalNumber = 3
144     DO k=2,Nr
145    
146     DO j=jMin,jMax
147     DO i=iMin,iMax
148     rTrans(i,j) = 0.5 _d 0 * (
149     & wVel(i, j ,k,bi,bj)*rA(i, j ,bi,bj)
150     & *maskC(i, j ,k-1,bi,bj)
151     & + wVel(i,j-1,k,bi,bj)*rA(i,j-1,bi,bj)
152     & *maskC(i,j-1,k-1,bi,bj)
153 jmc 1.6 & )*deepFac2F(k)*rhoFacF(k)
154 jmc 1.1 ENDDO
155     ENDDO
156    
157     IF ( vectorInvariantMomentum ) THEN
158 jmc 1.2 C- space Centered/Upwind advection scheme, Advective form:
159     IF ( upwindShear ) THEN
160     upwindFac = 1. _d 0
161     ELSE
162     upwindFac = 0. _d 0
163     ENDIF
164 jmc 1.1 DO j=jMin,jMax
165     DO i=iMin,iMax
166 jmc 1.5 rCenter = 0.5 _d 0 *deltaTMom*rTrans(i,j)
167 jmc 1.2 & *recip_rAs(i,j,bi,bj)*rkSign
168     rUpwind = ABS(rCenter)*upwindFac
169 jmc 1.1 b5d(i,j,k) = b5d(i,j,k)
170 jmc 1.2 & - (rCenter+rUpwind)
171 heimbach 1.4 & *_recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
172 jmc 1.6 & *recip_deepFac2C(k)*recip_rhoFacC(k)
173 jmc 1.1 c5d(i,j,k) = c5d(i,j,k)
174 jmc 1.2 & + (rCenter+rUpwind)
175 heimbach 1.4 & *_recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
176 jmc 1.6 & *recip_deepFac2C(k)*recip_rhoFacC(k)
177 jmc 1.1 c5d(i,j,k-1) = c5d(i,j,k-1)
178 jmc 1.2 & - (rCenter-rUpwind)
179 heimbach 1.4 & *_recip_hFacS(i,j,k-1,bi,bj)*recip_drF(k-1)
180 jmc 1.6 & *recip_deepFac2C(k-1)*recip_rhoFacC(k-1)
181 jmc 1.1 d5d(i,j,k-1) = d5d(i,j,k-1)
182 jmc 1.2 & + (rCenter-rUpwind)
183 heimbach 1.4 & *_recip_hFacS(i,j,k-1,bi,bj)*recip_drF(k-1)
184 jmc 1.6 & *recip_deepFac2C(k-1)*recip_rhoFacC(k-1)
185 jmc 1.1 ENDDO
186     ENDDO
187     ELSE
188     C- space Centered advection scheme, Flux form:
189     DO j=jMin,jMax
190     DO i=iMin,iMax
191 jmc 1.5 rCenter = 0.5 _d 0 *deltaTMom*rTrans(i,j)
192 jmc 1.2 & *recip_rAs(i,j,bi,bj)*rkSign
193 jmc 1.1 b5d(i,j,k) = b5d(i,j,k)
194 heimbach 1.4 & - rCenter*_recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
195 jmc 1.6 & *recip_deepFac2C(k)*recip_rhoFacC(k)
196 jmc 1.1 c5d(i,j,k) = c5d(i,j,k)
197 heimbach 1.4 & - rCenter*_recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
198 jmc 1.6 & *recip_deepFac2C(k)*recip_rhoFacC(k)
199 jmc 1.1 c5d(i,j,k-1) = c5d(i,j,k-1)
200 heimbach 1.4 & + rCenter*_recip_hFacS(i,j,k-1,bi,bj)*recip_drF(k-1)
201 jmc 1.6 & *recip_deepFac2C(k-1)*recip_rhoFacC(k-1)
202 jmc 1.1 d5d(i,j,k-1) = d5d(i,j,k-1)
203 heimbach 1.4 & + rCenter*_recip_hFacS(i,j,k-1,bi,bj)*recip_drF(k-1)
204 jmc 1.6 & *recip_deepFac2C(k-1)*recip_rhoFacC(k-1)
205 jmc 1.1 ENDDO
206     ENDDO
207     STOP 'MOM_IMPLICIT_R: Flux Form not yet finished.'
208     ENDIF
209    
210     C-- end k loop
211     ENDDO
212    
213     C-- end if momImplVertAdv
214     ENDIF
215    
216 jmc 1.8 IF ( diagonalNumber .EQ. 1 ) THEN
217     errCode = 0
218     DO k=1,Nr
219     DO j=jMin,jMax
220     DO i=iMin,iMax
221     IF ( c5d(i,j,k).NE.zeroRL ) THEN
222     c5d(i,j,k) = 1. _d 0 / c5d(i,j,k)
223     ELSE
224     c5d(i,j,k) = 0. _d 0
225     errCode = 1
226     ENDIF
227     ENDDO
228     ENDDO
229     DO j=jMin,jMax
230     DO i=iMin,iMax
231     gV(i,j,k,bi,bj) = gV(i,j,k,bi,bj)*c5d(i,j,k)
232     ENDDO
233     ENDDO
234     ENDDO
235     IF (errCode.GE.1) THEN
236     STOP 'MOM_IMPLICIT_R: error when solving 1-Diag problem.'
237     ENDIF
238     ELSEIF ( diagonalNumber .EQ. 3 ) THEN
239 jmc 1.1 C-- Solve tri-diagonal system :
240 jmc 1.7 errCode = -1
241 jmc 1.1 CALL SOLVE_TRIDIAGONAL( iMin,iMax, jMin,jMax,
242     I b5d, c5d, d5d,
243 jmc 1.5 U gV(1-OLx,1-OLy,1,bi,bj),
244 jmc 1.1 O errCode,
245     I bi, bj, myThid )
246     IF (errCode.GE.1) THEN
247     STOP 'MOM_IMPLICIT_R: error when solving 3-Diag problem.'
248     ENDIF
249 jmc 1.8 ELSE
250 jmc 1.1 STOP 'MOM_IMPLICIT_R: no solver available.'
251     ENDIF
252    
253 jmc 1.8 #ifdef ALLOW_SOLVE4_PS_AND_DRAG
254     IF ( selectImplicitDrag.EQ.2 ) THEN
255     DO k=1,Nr
256     DO j=jMin,jMax
257     DO i=iMin,iMax
258     dV_psFacY(i,j,k,bi,bj) = maskS(i,j,k,bi,bj)
259     & *recip_deepFacC(k)*recip_rhoFacC(k)
260     ENDDO
261     ENDDO
262     ENDDO
263     IF ( diagonalNumber .EQ. 1 ) THEN
264     DO k=1,Nr
265     DO j=jMin,jMax
266     DO i=iMin,iMax
267     dV_psFacY(i,j,k,bi,bj) = dV_psFacY(i,j,k,bi,bj)*c5d(i,j,k)
268     ENDDO
269     ENDDO
270     ENDDO
271     ELSEIF ( diagonalNumber .EQ. 3 ) THEN
272     CALL SOLVE_TRIDIAGONAL( iMin,iMax, jMin,jMax,
273     I b5d, c5d, d5d,
274     U dV_psFacY(1-OLx,1-OLy,1,bi,bj),
275     O errCode,
276     I bi, bj, myThid )
277     ENDIF
278     ENDIF
279     #endif /* ALLOW_SOLVE4_PS_AND_DRAG */
280    
281 jmc 1.3 #ifdef ALLOW_DIAGNOSTICS
282     C-- Diagnostics of vertical viscous flux:
283     IF ( useDiagnostics .AND. implicitViscosity ) THEN
284     diagName = 'VISrI_Vm'
285     IF ( DIAGNOSTICS_IS_ON(diagName,myThid) ) THEN
286     DO k= 1,Nr
287     IF ( k.EQ.1 ) THEN
288     C- Note: Needs to call DIAGNOSTICS_FILL at level k=1 even if array == 0
289     C otherwise counter is not incremented !!
290     DO j=1-OLy,sNy+OLy
291     DO i=1-OLx,sNx+OLx
292     vf(i,j) = 0. _d 0
293     ENDDO
294     ENDDO
295     ELSE
296     DO j=jMin,jMax
297     DO i=iMin,iMax
298 jmc 1.6 vf(i,j) = -rAs(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
299     & * kappaRV(i,j,k)*recip_drC(k)*rkSign
300     & * (gV(i,j,k,bi,bj) - gV(i,j,k-1,bi,bj))
301 jmc 1.3 & *_maskS(i,j,k,bi,bj)
302     & *_maskS(i,j,k-1,bi,bj)
303     ENDDO
304     ENDDO
305     ENDIF
306     CALL DIAGNOSTICS_FILL(vf,diagName, k,1, 2,bi,bj, myThid)
307     ENDDO
308     ENDIF
309     ENDIF
310     #endif /* ALLOW_DIAGNOSTICS */
311    
312 jmc 1.1 RETURN
313     END

  ViewVC Help
Powered by ViewVC 1.1.22