/[MITgcm]/MITgcm/model/src/mom_u_implicit_r.F
ViewVC logotype

Contents of /MITgcm/model/src/mom_u_implicit_r.F

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


Revision 1.1 - (show annotations) (download)
Sat Jan 3 00:41:55 2004 UTC (20 years, 4 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint54f_post, checkpoint55j_post, checkpoint56b_post, checkpoint55h_post, checkpoint55g_post, checkpoint55c_post, checkpoint53b_pre, checkpoint52e_post, checkpoint55f_post, checkpoint54a_post, checkpoint52j_pre, checkpoint52l_post, checkpoint52k_post, checkpoint52i_pre, checkpoint53b_post, checkpoint52l_pre, checkpoint54, checkpoint56, checkpoint52n_post, checkpoint53, checkpoint53c_post, checkpoint54b_post, checkpoint54a_pre, checkpoint53f_post, checkpoint52f_pre, checkpoint53d_pre, hrcube_1, checkpoint55e_post, checkpoint54c_post, checkpoint54d_post, checkpoint52i_post, checkpoint53g_post, checkpoint52f_post, hrcube_3, checkpoint56c_post, checkpoint54e_post, checkpoint55b_post, checkpoint52j_post, checkpoint55i_post, checkpoint53d_post, hrcube4, checkpoint55d_pre, checkpoint52m_post, checkpoint52h_pre, checkpoint55, checkpoint53a_post, checkpoint55a_post, hrcube_2, hrcube5, checkpoint56a_post, checkpoint55d_post
new S/R to solve vertical direction implicitly.

1 C $Header: $
2 C $Name: $
3
4 #include "PACKAGES_CONFIG.h"
5 #include "CPP_OPTIONS.h"
6
7 CBOP
8 C !ROUTINE: MOM_U_IMPLICIT_R
9 C !INTERFACE:
10 SUBROUTINE MOM_U_IMPLICIT_R(
11 I kappaRU,
12 I bi, bj, myTime, myIter, myThid )
13 C !DESCRIPTION: \bv
14 C *==========================================================*
15 C | S/R MOM_U_IMPLICIT_R
16 C | o Solve implicitly vertical advection & diffusion
17 C | of momentum, meridional component
18 C *==========================================================*
19 C *==========================================================*
20 C \ev
21
22 C !USES:
23 IMPLICIT NONE
24 C == Global data ==
25 #include "SIZE.h"
26 #include "EEPARAMS.h"
27 #include "PARAMS.h"
28 #include "GRID.h"
29 #include "DYNVARS.h"
30
31 C !INPUT/OUTPUT PARAMETERS:
32 C == Routine Arguments ==
33 _RL kappaRU(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
34 INTEGER bi, bj
35 _RL myTime
36 INTEGER myIter, myThid
37
38 C !LOCAL VARIABLES:
39 C == Local variables ==
40 INTEGER iMin,iMax,jMin,jMax
41 INTEGER i,j,k
42 INTEGER diagonalNumber, errCode
43 c _RL a5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
44 _RL b5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
45 _RL c5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
46 _RL d5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
47 c _RL e5d(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
48 _RL rTrans(1-Olx:sNx+Olx,1-Oly:sNy+Oly)
49 _RL rFlx
50 CEOP
51
52 IF (Nr.LE.1) RETURN
53
54 C---+----1----+----2----+----3----+----4----+----5----+----6----+----7-|--+----|
55 C Solve for U-component :
56 C----------------------------
57
58 C-- Initialise
59 iMin = 1
60 jMin = 1
61 iMax = sNx+1
62 jMax = sNy
63 DO k=1,Nr
64 DO j=1-Oly,sNy+Oly
65 DO i=1-Olx,sNx+Olx
66 c a5d(i,j,k) = 0. _d 0
67 b5d(i,j,k) = 0. _d 0
68 c5d(i,j,k) = 1. _d 0
69 d5d(i,j,k) = 0. _d 0
70 c e5d(i,j,k) = 0. _d 0
71 ENDDO
72 ENDDO
73 ENDDO
74 diagonalNumber = 1
75
76 IF (implicitViscosity) THEN
77 C-- set the tri-diagonal matrix to solve the implicit viscosity
78 diagonalNumber = 3
79 C- 1rst lower diagonal :
80 DO k=2,Nr
81 DO j=jMin,jMax
82 DO i=iMin,iMax
83 IF (maskW(i,j,k-1,bi,bj).EQ.1.)
84 & b5d(i,j,k) = -deltaTmom
85 & *recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
86 & *kappaRU(i,j, k )*recip_drC( k )
87 ENDDO
88 ENDDO
89 ENDDO
90 C- 1rst upper diagonal :
91 DO k=1,Nr-1
92 DO j=jMin,jMax
93 DO i=iMin,iMax
94 IF (maskW(i,j,k+1,bi,bj).EQ.1.)
95 & d5d(i,j,k) = -deltaTtracer
96 & *recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
97 & *KappaRU(i,j,k+1)*recip_drC(k+1)
98 ENDDO
99 ENDDO
100 ENDDO
101 C- Main diagonal :
102 DO k=1,Nr
103 DO j=jMin,jMax
104 DO i=iMin,iMax
105 c5d(i,j,k) = 1. _d 0 - b5d(i,j,k) - d5d(i,j,k)
106 ENDDO
107 ENDDO
108 ENDDO
109
110 C-- end if implicitDiffusion
111 ENDIF
112
113 IF (momImplVertAdv) THEN
114
115 diagonalNumber = 3
116 DO k=2,Nr
117
118 DO j=jMin,jMax
119 DO i=iMin,iMax
120 rTrans(i,j) = 0.5 _d 0 * (
121 & wVel( i ,j,k,bi,bj)*rA( i ,j,bi,bj)
122 & *maskC( i ,j,k-1,bi,bj)
123 & + wVel(i-1,j,k,bi,bj)*rA(i-1,j,bi,bj)
124 & *maskC(i-1,j,k-1,bi,bj)
125 & )
126 ENDDO
127 ENDDO
128
129 IF ( vectorInvariantMomentum ) THEN
130 C- space Centered advection scheme, Advective form:
131 DO j=jMin,jMax
132 DO i=iMin,iMax
133 rFlx = 0.5 _d 0 *deltaTmom*rTrans(i,j)
134 & *recip_rAw(i,j,bi,bj)*rkFac
135 b5d(i,j,k) = b5d(i,j,k)
136 & + rFlx*recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
137 c5d(i,j,k) = c5d(i,j,k)
138 & - rFlx*recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
139 c5d(i,j,k-1) = c5d(i,j,k-1)
140 & + rFlx*recip_hFacW(i,j,k-1,bi,bj)*recip_drF(k-1)
141 d5d(i,j,k-1) = d5d(i,j,k-1)
142 & - rFlx*recip_hFacW(i,j,k-1,bi,bj)*recip_drF(k-1)
143 ENDDO
144 ENDDO
145 ELSE
146 C- space Centered advection scheme, Flux form:
147 DO j=jMin,jMax
148 DO i=iMin,iMax
149 rFlx = 0.5 _d 0 *deltaTmom*rTrans(i,j)
150 & *recip_rAw(i,j,bi,bj)*rkFac
151 b5d(i,j,k) = b5d(i,j,k)
152 & + rFlx*recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
153 c5d(i,j,k) = c5d(i,j,k)
154 & + rFlx*recip_hFacW(i,j,k,bi,bj)*recip_drF(k)
155 c5d(i,j,k-1) = c5d(i,j,k-1)
156 & - rFlx*recip_hFacW(i,j,k-1,bi,bj)*recip_drF(k-1)
157 d5d(i,j,k-1) = d5d(i,j,k-1)
158 & - rFlx*recip_hFacW(i,j,k-1,bi,bj)*recip_drF(k-1)
159 ENDDO
160 ENDDO
161 STOP 'MOM_IMPLICIT_R: Flux Form not yet finished'
162 ENDIF
163 C-- end k loop
164 ENDDO
165
166 C-- end if momImplVertAdv
167 ENDIF
168
169 IF ( diagonalNumber .EQ. 3 ) THEN
170 C-- Solve tri-diagonal system :
171 CALL SOLVE_TRIDIAGONAL( iMin,iMax, jMin,jMax,
172 I b5d, c5d, d5d,
173 U gU,
174 O errCode,
175 I bi, bj, myThid )
176 IF (errCode.GE.1) THEN
177 STOP 'MOM_IMPLICIT_R: error when solving 3-Diag problem'
178 ENDIF
179 ELSEIF ( diagonalNumber .NE. 1 ) THEN
180 STOP 'MOM_IMPLICIT_R: no solver available'
181 ENDIF
182
183 RETURN
184 END

  ViewVC Help
Powered by ViewVC 1.1.22