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

Contents of /MITgcm/pkg/mom_common/mom_u_implicit_r.F

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


Revision 1.9 - (show annotations) (download)
Wed Nov 30 19:41:30 2016 UTC (7 years, 4 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 C $Header: /u/gcmpack/MITgcm/pkg/mom_common/mom_u_implicit_r.F,v 1.8 2016/11/28 23:09:12 jmc Exp $
2 C $Name: $
3
4 #include "MOM_COMMON_OPTIONS.h"
5
6 CBOP
7 C !ROUTINE: MOM_U_IMPLICIT_R
8 C !INTERFACE:
9 SUBROUTINE MOM_U_IMPLICIT_R(
10 I kappaRU,
11 I bi, bj, myTime, myIter, myThid )
12 C !DESCRIPTION: \bv
13 C *==========================================================*
14 C | S/R MOM_U_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 _RL kappaRU(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr+1)
33 INTEGER bi, bj
34 _RL myTime
35 INTEGER myIter, myThid
36
37 C !LOCAL VARIABLES:
38 C == Local variables ==
39 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 INTEGER iMin,iMax,jMin,jMax
50 PARAMETER( iMin = 1, iMax = sNx+1 )
51 PARAMETER( jMin = 1, jMax = sNy )
52 INTEGER i,j,k
53 INTEGER diagonalNumber, errCode
54 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 _RL rCenter, rUpwind, upwindFac
61 #ifdef ALLOW_DIAGNOSTICS
62 CHARACTER*8 diagName
63 LOGICAL DIAGNOSTICS_IS_ON
64 EXTERNAL DIAGNOSTICS_IS_ON
65 _RL vf (1-OLx:sNx+OLx,1-OLy:sNy+OLy)
66 #endif
67 CEOP
68
69 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
70 C Solve for U-component :
71 C----------------------------
72
73 C-- Initialise
74 DO k=1,Nr
75 DO j=1-OLy,sNy+OLy
76 DO i=1-OLx,sNx+OLx
77 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 IF (maskW(i,j,k-1,bi,bj).EQ.oneRS)
96 & b5d(i,j,k) = -deltaTMom
97 & *_recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
98 & *recip_deepFac2C(k)*recip_rhoFacC(k)
99 & *kappaRU(i,j, k )*recip_drC( k )
100 & *deepFac2F( k )*rhoFacF( k )
101 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 IF (maskW(i,j,k+1,bi,bj).EQ.oneRS)
109 & d5d(i,j,k) = -deltaTMom
110 & *_recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
111 & *recip_deepFac2C(k)*recip_rhoFacC(k)
112 & *kappaRU(i,j,k+1)*recip_drC(k+1)
113 & *deepFac2F(k+1)*rhoFacF(k+1)
114 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 c5d(i,j,k) = 1. _d 0 - ( b5d(i,j,k) + d5d(i,j,k) )
122 ENDDO
123 ENDDO
124 ENDDO
125
126 C-- end if implicitDiffusion
127 ENDIF
128
129 IF ( selectImplicitDrag.GE.1 ) THEN
130 IF ( no_slip_bottom .OR. selectBotDragQuadr.GE.0
131 & .OR. bottomDragLinear.NE.0. ) THEN
132 CALL MOM_U_BOTDRAG_IMPL(
133 I uVel(1-OLx,1-OLy,1,bi,bj),
134 I vVel(1-OLx,1-OLy,1,bi,bj),
135 I kappaRU,
136 U c5d,
137 I bi, bj, myIter, myThid )
138 ENDIF
139 ENDIF
140
141 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-1,j,k,bi,bj)*rA(i-1,j,bi,bj)
152 & *maskC(i-1,j,k-1,bi,bj)
153 & )*deepFac2F(k)*rhoFacF(k)
154 ENDDO
155 ENDDO
156
157 IF ( vectorInvariantMomentum ) THEN
158 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 DO j=jMin,jMax
165 DO i=iMin,iMax
166 rCenter = 0.5 _d 0 *deltaTMom*rTrans(i,j)
167 & *recip_rAw(i,j,bi,bj)*rkSign
168 rUpwind = ABS(rCenter)*upwindFac
169 b5d(i,j,k) = b5d(i,j,k)
170 & - (rCenter+rUpwind)
171 & *_recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
172 & *recip_deepFac2C(k)*recip_rhoFacC(k)
173 c5d(i,j,k) = c5d(i,j,k)
174 & + (rCenter+rUpwind)
175 & *_recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
176 & *recip_deepFac2C(k)*recip_rhoFacC(k)
177 c5d(i,j,k-1) = c5d(i,j,k-1)
178 & - (rCenter-rUpwind)
179 & *_recip_hFacW(i,j,k-1,bi,bj)*recip_drF(k-1)
180 & *recip_deepFac2C(k-1)*recip_rhoFacC(k-1)
181 d5d(i,j,k-1) = d5d(i,j,k-1)
182 & + (rCenter-rUpwind)
183 & *_recip_hFacW(i,j,k-1,bi,bj)*recip_drF(k-1)
184 & *recip_deepFac2C(k-1)*recip_rhoFacC(k-1)
185 ENDDO
186 ENDDO
187 ELSE
188 C- space Centered advection scheme, Flux form:
189 DO j=jMin,jMax
190 DO i=iMin,iMax
191 rCenter = 0.5 _d 0 *deltaTMom*rTrans(i,j)
192 & *recip_rAw(i,j,bi,bj)*rkSign
193 b5d(i,j,k) = b5d(i,j,k)
194 & - rCenter*_recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
195 & *recip_deepFac2C(k)*recip_rhoFacC(k)
196 c5d(i,j,k) = c5d(i,j,k)
197 & - rCenter*_recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
198 & *recip_deepFac2C(k)*recip_rhoFacC(k)
199 c5d(i,j,k-1) = c5d(i,j,k-1)
200 & + rCenter*_recip_hFacW(i,j,k-1,bi,bj)*recip_drF(k-1)
201 & *recip_deepFac2C(k-1)*recip_rhoFacC(k-1)
202 d5d(i,j,k-1) = d5d(i,j,k-1)
203 & + rCenter*_recip_hFacW(i,j,k-1,bi,bj)*recip_drF(k-1)
204 & *recip_deepFac2C(k-1)*recip_rhoFacC(k-1)
205 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 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 gU(i,j,k,bi,bj) = gU(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 C-- Solve tri-diagonal system :
240 errCode = -1
241 CALL SOLVE_TRIDIAGONAL( iMin,iMax, jMin,jMax,
242 I b5d, c5d, d5d,
243 U gU(1-OLx,1-OLy,1,bi,bj),
244 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 ELSE
250 STOP 'MOM_IMPLICIT_R: no solver available.'
251 ENDIF
252
253 #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 dU_psFacX(i,j,k,bi,bj) = maskW(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 dU_psFacX(i,j,k,bi,bj) = dU_psFacX(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 dU_psFacX(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 #ifdef ALLOW_DIAGNOSTICS
282 C-- Diagnostics of vertical viscous flux:
283 IF ( useDiagnostics .AND. implicitViscosity ) THEN
284 diagName = 'VISrI_Um'
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 vf(i,j) = -rAw(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
299 & * kappaRU(i,j,k)*recip_drC(k)*rkSign
300 & * (gU(i,j,k,bi,bj) - gU(i,j,k-1,bi,bj))
301 & *_maskW(i,j,k,bi,bj)
302 & *_maskW(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 RETURN
313 END

  ViewVC Help
Powered by ViewVC 1.1.22