/[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.3 - (show annotations) (download)
Sun Sep 4 19:22:48 2005 UTC (18 years, 9 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint57t_post, checkpoint58e_post, checkpoint57s_post, checkpoint57y_post, checkpoint57y_pre, checkpoint57v_post, checkpoint57r_post, checkpoint58, checkpoint58f_post, checkpoint57x_post, checkpoint58d_post, checkpoint58c_post, checkpoint57w_post, checkpint57u_post, checkpoint58a_post, checkpoint58g_post, checkpoint57z_post, checkpoint58b_post
Changes since 1.2: +38 -1 lines
add diagnostics for (almost) each term in momentum eq.

1 C $Header: /u/gcmpack/MITgcm/pkg/mom_common/mom_u_implicit_r.F,v 1.2 2005/06/22 00:30:16 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)
33 INTEGER bi, bj
34 _RL myTime
35 INTEGER myIter, myThid
36
37 C !LOCAL VARIABLES:
38 C == Local variables ==
39 INTEGER iMin,iMax,jMin,jMax
40 INTEGER i,j,k
41 INTEGER diagonalNumber, errCode
42 c _RL a5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
43 _RL b5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
44 _RL c5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
45 _RL d5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
46 c _RL e5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
47 _RL rTrans(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
48 _RL rCenter, rUpwind, upwindFac
49 #ifdef ALLOW_DIAGNOSTICS
50 CHARACTER*8 diagName
51 LOGICAL DIAGNOSTICS_IS_ON
52 EXTERNAL DIAGNOSTICS_IS_ON
53 _RL vf (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
54 #endif
55 CEOP
56
57 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
58 C Solve for U-component :
59 C----------------------------
60
61 C-- Initialise
62 iMin = 1
63 jMin = 1
64 iMax = sNx+1
65 jMax = sNy
66 DO k=1,Nr
67 DO j=1-Oly,sNy+Oly
68 DO i=1-Olx,sNx+Olx
69 c a5d(i,j,k) = 0. _d 0
70 b5d(i,j,k) = 0. _d 0
71 c5d(i,j,k) = 1. _d 0
72 d5d(i,j,k) = 0. _d 0
73 c e5d(i,j,k) = 0. _d 0
74 ENDDO
75 ENDDO
76 ENDDO
77 diagonalNumber = 1
78
79 IF ( implicitViscosity .AND. Nr.GT.1 ) THEN
80
81 C-- set the tri-diagonal matrix to solve the implicit viscosity
82 diagonalNumber = 3
83 C- 1rst lower diagonal :
84 DO k=2,Nr
85 DO j=jMin,jMax
86 DO i=iMin,iMax
87 IF (maskW(i,j,k-1,bi,bj).EQ.1.)
88 & b5d(i,j,k) = -deltaTmom
89 & *recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
90 & *kappaRU(i,j, k )*recip_drC( k )
91 ENDDO
92 ENDDO
93 ENDDO
94 C- 1rst upper diagonal :
95 DO k=1,Nr-1
96 DO j=jMin,jMax
97 DO i=iMin,iMax
98 IF (maskW(i,j,k+1,bi,bj).EQ.1.)
99 & d5d(i,j,k) = -deltaTmom
100 & *recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
101 & *KappaRU(i,j,k+1)*recip_drC(k+1)
102 ENDDO
103 ENDDO
104 ENDDO
105 C- Main diagonal :
106 DO k=1,Nr
107 DO j=jMin,jMax
108 DO i=iMin,iMax
109 c5d(i,j,k) = 1. _d 0 - b5d(i,j,k) - d5d(i,j,k)
110 ENDDO
111 ENDDO
112 ENDDO
113
114 C-- end if implicitDiffusion
115 ENDIF
116
117 IF ( momImplVertAdv .AND. Nr.GT.1 ) THEN
118
119 diagonalNumber = 3
120 DO k=2,Nr
121
122 DO j=jMin,jMax
123 DO i=iMin,iMax
124 rTrans(i,j) = 0.5 _d 0 * (
125 & wVel( i ,j,k,bi,bj)*rA( i ,j,bi,bj)
126 & *maskC( i ,j,k-1,bi,bj)
127 & + wVel(i-1,j,k,bi,bj)*rA(i-1,j,bi,bj)
128 & *maskC(i-1,j,k-1,bi,bj)
129 & )
130 ENDDO
131 ENDDO
132
133 IF ( vectorInvariantMomentum ) THEN
134 C- space Centered/Upwind advection scheme, Advective form:
135 IF ( upwindShear ) THEN
136 upwindFac = 1. _d 0
137 ELSE
138 upwindFac = 0. _d 0
139 ENDIF
140 DO j=jMin,jMax
141 DO i=iMin,iMax
142 rCenter = 0.5 _d 0 *deltaTmom*rTrans(i,j)
143 & *recip_rAw(i,j,bi,bj)*rkSign
144 rUpwind = ABS(rCenter)*upwindFac
145 b5d(i,j,k) = b5d(i,j,k)
146 & - (rCenter+rUpwind)
147 & *recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
148 c5d(i,j,k) = c5d(i,j,k)
149 & + (rCenter+rUpwind)
150 & *recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
151 c5d(i,j,k-1) = c5d(i,j,k-1)
152 & - (rCenter-rUpwind)
153 & *recip_hFacW(i,j,k-1,bi,bj)*recip_drF(k-1)
154 d5d(i,j,k-1) = d5d(i,j,k-1)
155 & + (rCenter-rUpwind)
156 & *recip_hFacW(i,j,k-1,bi,bj)*recip_drF(k-1)
157 ENDDO
158 ENDDO
159 ELSE
160 C- space Centered advection scheme, Flux form:
161 DO j=jMin,jMax
162 DO i=iMin,iMax
163 rCenter = 0.5 _d 0 *deltaTmom*rTrans(i,j)
164 & *recip_rAw(i,j,bi,bj)*rkSign
165 b5d(i,j,k) = b5d(i,j,k)
166 & - rCenter*recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
167 c5d(i,j,k) = c5d(i,j,k)
168 & - rCenter*recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
169 c5d(i,j,k-1) = c5d(i,j,k-1)
170 & + rCenter*recip_hFacW(i,j,k-1,bi,bj)*recip_drF(k-1)
171 d5d(i,j,k-1) = d5d(i,j,k-1)
172 & + rCenter*recip_hFacW(i,j,k-1,bi,bj)*recip_drF(k-1)
173 ENDDO
174 ENDDO
175 STOP 'MOM_IMPLICIT_R: Flux Form not yet finished.'
176 ENDIF
177
178 C-- end k loop
179 ENDDO
180
181 C-- end if momImplVertAdv
182 ENDIF
183
184 IF ( diagonalNumber .EQ. 3 ) THEN
185 C-- Solve tri-diagonal system :
186 CALL SOLVE_TRIDIAGONAL( iMin,iMax, jMin,jMax,
187 I b5d, c5d, d5d,
188 U gU,
189 O errCode,
190 I bi, bj, myThid )
191 IF (errCode.GE.1) THEN
192 STOP 'MOM_IMPLICIT_R: error when solving 3-Diag problem.'
193 ENDIF
194 ELSEIF ( diagonalNumber .NE. 1 ) THEN
195 STOP 'MOM_IMPLICIT_R: no solver available.'
196 ENDIF
197
198 #ifdef ALLOW_DIAGNOSTICS
199 C-- Diagnostics of vertical viscous flux:
200 IF ( useDiagnostics .AND. implicitViscosity ) THEN
201 diagName = 'VISrI_Um'
202 IF ( DIAGNOSTICS_IS_ON(diagName,myThid) ) THEN
203 DO k= 1,Nr
204 IF ( k.EQ.1 ) THEN
205 C- Note: Needs to call DIAGNOSTICS_FILL at level k=1 even if array == 0
206 C otherwise counter is not incremented !!
207 DO j=1-OLy,sNy+OLy
208 DO i=1-OLx,sNx+OLx
209 vf(i,j) = 0. _d 0
210 ENDDO
211 ENDDO
212 ELSE
213 DO j=jMin,jMax
214 DO i=iMin,iMax
215 vf(i,j) =
216 & -KappaRU(i,j,k)*rAw(i,j,bi,bj)*recip_drC(k)
217 & * (gU(i,j,k,bi,bj) - gU(i,j,k-1,bi,bj))*rkSign
218 & *_maskW(i,j,k,bi,bj)
219 & *_maskW(i,j,k-1,bi,bj)
220 ENDDO
221 ENDDO
222 ENDIF
223 CALL DIAGNOSTICS_FILL(vf,diagName, k,1, 2,bi,bj, myThid)
224 ENDDO
225 ENDIF
226 ENDIF
227 #endif /* ALLOW_DIAGNOSTICS */
228
229 RETURN
230 END

  ViewVC Help
Powered by ViewVC 1.1.22