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

Contents 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.6 - (show annotations) (download)
Wed Oct 5 00:04:31 2016 UTC (7 years, 8 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint66a
Changes since 1.5: +35 -14 lines
- add deep atmosphere and anelastic scaling factor in implicit vertical
  main routines (mom_u,v_ implicit_r.F).

1 C $Header: /u/gcmpack/MITgcm/pkg/mom_common/mom_v_implicit_r.F,v 1.5 2014/08/14 16:44:40 jmc Exp $
2 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 _RL kappaRV(1-OLx:sNx+OLx,1-OLy:sNy+OLy,Nr)
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 )
51 PARAMETER( jMin = 1, jMax = sNy+1 )
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 V-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 (maskS(i,j,k-1,bi,bj).EQ.oneRS)
96 & b5d(i,j,k) = -deltaTMom
97 & *_recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
98 & *recip_deepFac2C(k)*recip_rhoFacC(k)
99 & *kappaRV(i,j, k )*recip_drC( k )
100 & *deepFac2F( k )*rhoFacF( k )
101
102 ENDDO
103 ENDDO
104 ENDDO
105 C- 1rst upper diagonal :
106 DO k=1,Nr-1
107 DO j=jMin,jMax
108 DO i=iMin,iMax
109 IF (maskS(i,j,k+1,bi,bj).EQ.oneRS)
110 & d5d(i,j,k) = -deltaTMom
111 & *_recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
112 & *recip_deepFac2C(k)*recip_rhoFacC(k)
113 & *kappaRV(i,j,k+1)*recip_drC(k+1)
114 & *deepFac2F(k+1)*rhoFacF(k+1)
115 ENDDO
116 ENDDO
117 ENDDO
118 C- Main diagonal :
119 DO k=1,Nr
120 DO j=jMin,jMax
121 DO i=iMin,iMax
122 c5d(i,j,k) = 1. _d 0 - ( b5d(i,j,k) + d5d(i,j,k) )
123 ENDDO
124 ENDDO
125 ENDDO
126
127 C-- end if implicitDiffusion
128 ENDIF
129
130 IF ( momImplVertAdv .AND. Nr.GT.1 ) THEN
131
132 diagonalNumber = 3
133 DO k=2,Nr
134
135 DO j=jMin,jMax
136 DO i=iMin,iMax
137 rTrans(i,j) = 0.5 _d 0 * (
138 & wVel(i, j ,k,bi,bj)*rA(i, j ,bi,bj)
139 & *maskC(i, j ,k-1,bi,bj)
140 & + wVel(i,j-1,k,bi,bj)*rA(i,j-1,bi,bj)
141 & *maskC(i,j-1,k-1,bi,bj)
142 & )*deepFac2F(k)*rhoFacF(k)
143 ENDDO
144 ENDDO
145
146 IF ( vectorInvariantMomentum ) THEN
147 C- space Centered/Upwind advection scheme, Advective form:
148 IF ( upwindShear ) THEN
149 upwindFac = 1. _d 0
150 ELSE
151 upwindFac = 0. _d 0
152 ENDIF
153 DO j=jMin,jMax
154 DO i=iMin,iMax
155 rCenter = 0.5 _d 0 *deltaTMom*rTrans(i,j)
156 & *recip_rAs(i,j,bi,bj)*rkSign
157 rUpwind = ABS(rCenter)*upwindFac
158 b5d(i,j,k) = b5d(i,j,k)
159 & - (rCenter+rUpwind)
160 & *_recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
161 & *recip_deepFac2C(k)*recip_rhoFacC(k)
162 c5d(i,j,k) = c5d(i,j,k)
163 & + (rCenter+rUpwind)
164 & *_recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
165 & *recip_deepFac2C(k)*recip_rhoFacC(k)
166 c5d(i,j,k-1) = c5d(i,j,k-1)
167 & - (rCenter-rUpwind)
168 & *_recip_hFacS(i,j,k-1,bi,bj)*recip_drF(k-1)
169 & *recip_deepFac2C(k-1)*recip_rhoFacC(k-1)
170 d5d(i,j,k-1) = d5d(i,j,k-1)
171 & + (rCenter-rUpwind)
172 & *_recip_hFacS(i,j,k-1,bi,bj)*recip_drF(k-1)
173 & *recip_deepFac2C(k-1)*recip_rhoFacC(k-1)
174 ENDDO
175 ENDDO
176 ELSE
177 C- space Centered advection scheme, Flux form:
178 DO j=jMin,jMax
179 DO i=iMin,iMax
180 rCenter = 0.5 _d 0 *deltaTMom*rTrans(i,j)
181 & *recip_rAs(i,j,bi,bj)*rkSign
182 b5d(i,j,k) = b5d(i,j,k)
183 & - rCenter*_recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
184 & *recip_deepFac2C(k)*recip_rhoFacC(k)
185 c5d(i,j,k) = c5d(i,j,k)
186 & - rCenter*_recip_hFacS(i,j,k,bi,bj)*recip_drF(k)
187 & *recip_deepFac2C(k)*recip_rhoFacC(k)
188 c5d(i,j,k-1) = c5d(i,j,k-1)
189 & + rCenter*_recip_hFacS(i,j,k-1,bi,bj)*recip_drF(k-1)
190 & *recip_deepFac2C(k-1)*recip_rhoFacC(k-1)
191 d5d(i,j,k-1) = d5d(i,j,k-1)
192 & + rCenter*_recip_hFacS(i,j,k-1,bi,bj)*recip_drF(k-1)
193 & *recip_deepFac2C(k-1)*recip_rhoFacC(k-1)
194 ENDDO
195 ENDDO
196 STOP 'MOM_IMPLICIT_R: Flux Form not yet finished.'
197 ENDIF
198
199 C-- end k loop
200 ENDDO
201
202 C-- end if momImplVertAdv
203 ENDIF
204
205 IF ( diagonalNumber .EQ. 3 ) THEN
206 C-- Solve tri-diagonal system :
207 CALL SOLVE_TRIDIAGONAL( iMin,iMax, jMin,jMax,
208 I b5d, c5d, d5d,
209 U gV(1-OLx,1-OLy,1,bi,bj),
210 O errCode,
211 I bi, bj, myThid )
212 IF (errCode.GE.1) THEN
213 STOP 'MOM_IMPLICIT_R: error when solving 3-Diag problem.'
214 ENDIF
215 ELSEIF ( diagonalNumber .NE. 1 ) THEN
216 STOP 'MOM_IMPLICIT_R: no solver available.'
217 ENDIF
218
219 #ifdef ALLOW_DIAGNOSTICS
220 C-- Diagnostics of vertical viscous flux:
221 IF ( useDiagnostics .AND. implicitViscosity ) THEN
222 diagName = 'VISrI_Vm'
223 IF ( DIAGNOSTICS_IS_ON(diagName,myThid) ) THEN
224 DO k= 1,Nr
225 IF ( k.EQ.1 ) THEN
226 C- Note: Needs to call DIAGNOSTICS_FILL at level k=1 even if array == 0
227 C otherwise counter is not incremented !!
228 DO j=1-OLy,sNy+OLy
229 DO i=1-OLx,sNx+OLx
230 vf(i,j) = 0. _d 0
231 ENDDO
232 ENDDO
233 ELSE
234 DO j=jMin,jMax
235 DO i=iMin,iMax
236 vf(i,j) = -rAs(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
237 & * kappaRV(i,j,k)*recip_drC(k)*rkSign
238 & * (gV(i,j,k,bi,bj) - gV(i,j,k-1,bi,bj))
239 & *_maskS(i,j,k,bi,bj)
240 & *_maskS(i,j,k-1,bi,bj)
241 ENDDO
242 ENDDO
243 ENDIF
244 CALL DIAGNOSTICS_FILL(vf,diagName, k,1, 2,bi,bj, myThid)
245 ENDDO
246 ENDIF
247 ENDIF
248 #endif /* ALLOW_DIAGNOSTICS */
249
250 RETURN
251 END

  ViewVC Help
Powered by ViewVC 1.1.22