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

Annotation of /MITgcm/model/src/impldiff.F

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


Revision 1.26 - (hide annotations) (download)
Tue Dec 5 05:25:08 2006 UTC (17 years, 6 months ago) by jmc
Branch: MAIN
CVS Tags: checkpoint59, checkpoint58y_post, checkpoint58t_post, checkpoint60, checkpoint61, checkpoint58w_post, mitgcm_mapl_00, checkpoint59q, checkpoint59p, checkpoint59r, checkpoint59e, checkpoint59d, checkpoint59g, checkpoint59f, checkpoint59a, checkpoint59c, checkpoint59b, checkpoint59m, checkpoint59l, checkpoint59o, checkpoint59n, checkpoint59i, checkpoint59h, checkpoint59k, checkpoint58v_post, checkpoint61f, checkpoint58x_post, checkpoint61n, checkpoint59j, checkpoint61q, checkpoint61e, checkpoint58u_post, checkpoint58s_post, checkpoint61g, checkpoint61d, checkpoint61b, checkpoint61c, checkpoint61a, checkpoint61o, checkpoint61l, checkpoint61m, checkpoint61j, checkpoint61k, checkpoint61h, checkpoint61i, checkpoint61r, checkpoint61p
Changes since 1.25: +8 -4 lines
start to implement deep-atmosphere and/or anelastic formulation

1 jmc 1.26 C $Header: /u/gcmpack/MITgcm/model/src/impldiff.F,v 1.25 2005/09/11 20:54:20 jmc Exp $
2 cnh 1.17 C $Name: $
3 adcroft 1.1
4 jmc 1.23 #include "PACKAGES_CONFIG.h"
5 cnh 1.7 #include "CPP_OPTIONS.h"
6 adcroft 1.1
7 cnh 1.17 CBOP
8     C !ROUTINE: IMPLDIFF
9     C !INTERFACE:
10 adcroft 1.1 SUBROUTINE IMPLDIFF( bi, bj, iMin, iMax, jMin, jMax,
11 jmc 1.23 I tracerId, KappaRX, recip_hFac,
12 adcroft 1.8 U gXNm1,
13 adcroft 1.1 I myThid )
14 cnh 1.17 C !DESCRIPTION: \bv
15     C *==========================================================*
16     C | S/R IMPLDIFF
17     C | o Solve implicit diffusion equation for vertical
18     C | diffusivity.
19     C *==========================================================*
20     C | o Recoded from 2d intermediate fields to 3d to reduce
21     C | TAMC storage
22     C | o Fixed missing masks for fields a(), c()
23     C *==========================================================*
24     C \ev
25    
26     C !USES:
27 cnh 1.5 IMPLICIT NONE
28     C == Global data ==
29 adcroft 1.1 #include "SIZE.h"
30     #include "DYNVARS.h"
31 cnh 1.2 #include "EEPARAMS.h"
32 adcroft 1.1 #include "PARAMS.h"
33     #include "GRID.h"
34 heimbach 1.9 #ifdef ALLOW_AUTODIFF_TAMC
35     #include "tamc_keys.h"
36     #endif
37    
38 cnh 1.17 C !INPUT/OUTPUT PARAMETERS:
39 adcroft 1.1 C == Routine Arguments ==
40 jmc 1.23 C tracerId :: tracer Identificator (if > 0) ;
41     C = 0 or < 0 when solving vertical viscosity implicitly for U or V
42 adcroft 1.1 INTEGER bi,bj,iMin,iMax,jMin,jMax
43 jmc 1.23 INTEGER tracerId
44 adcroft 1.8 _RL KappaRX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
45     _RS recip_hFac(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
46     _RL gXnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
47 adcroft 1.1 INTEGER myThid
48 cnh 1.5
49 cnh 1.17 C !LOCAL VARIABLES:
50 adcroft 1.1 C == Local variables ==
51     INTEGER i,j,k
52 jmc 1.23 _RL deltaTX(Nr)
53 cnh 1.17 _RL gYnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
54 heimbach 1.12 _RL a(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
55     _RL b(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
56     _RL c(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
57     _RL bet(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
58 cnh 1.6 _RL gam(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
59 jmc 1.23 #ifdef ALLOW_DIAGNOSTICS
60     CHARACTER*8 diagName
61     CHARACTER*4 diagSufx
62     #ifdef ALLOW_GENERIC_ADVDIFF
63     CHARACTER*4 GAD_DIAG_SUFX
64     EXTERNAL GAD_DIAG_SUFX
65     #endif
66     LOGICAL DIAGNOSTICS_IS_ON
67     EXTERNAL DIAGNOSTICS_IS_ON
68     _RL df (1-Olx:sNx+Olx,1-Oly:sNy+Oly)
69     #endif /* ALLOW_DIAGNOSTICS */
70 cnh 1.17 CEOP
71 jmc 1.19
72 heimbach 1.21 cph(
73     cph Not good for TAF: may create irreducible control flow graph
74     cph IF (Nr.LE.1) RETURN
75     cph)
76 adcroft 1.1
77 jmc 1.23 IF ( tracerId.GE.1 ) THEN
78     DO k=1,Nr
79     deltaTX(k) = dTtracerLev(k)
80     ENDDO
81     ELSE
82     DO k=1,Nr
83     deltaTX(k) = deltaTmom
84     ENDDO
85     ENDIF
86    
87 heimbach 1.12 C-- Initialise
88 heimbach 1.16 DO k=1,Nr
89     DO j=jMin,jMax
90     DO i=iMin,iMax
91     gYNm1(i,j,k,bi,bj) = 0. _d 0
92     ENDDO
93     ENDDO
94     ENDDO
95 heimbach 1.12
96     C-- Old aLower
97 heimbach 1.14 DO j=jMin,jMax
98     DO i=iMin,iMax
99 heimbach 1.12 a(i,j,1) = 0. _d 0
100     ENDDO
101     ENDDO
102     DO k=2,Nr
103 heimbach 1.14 DO j=jMin,jMax
104     DO i=iMin,iMax
105 jmc 1.23 a(i,j,k) = -deltaTX(k)*recip_hFac(i,j,k,bi,bj)*recip_drF(k)
106 jmc 1.26 & *recip_deepFac2C(k)*recip_rhoFacC(k)
107 heimbach 1.12 & *KappaRX(i,j, k )*recip_drC( k )
108 jmc 1.26 & *deepFac2F(k)*rhoFacF(k)
109 mlosch 1.18 IF (recip_hFac(i,j,k-1,bi,bj).EQ.0.) a(i,j,k)=0.
110 heimbach 1.12 ENDDO
111     ENDDO
112     ENDDO
113    
114     C-- Old aUpper
115     DO k=1,Nr-1
116 heimbach 1.14 DO j=jMin,jMax
117     DO i=iMin,iMax
118 jmc 1.23 c(i,j,k) = -deltaTX(k)*recip_hFac(i,j,k,bi,bj)*recip_drF(k)
119 jmc 1.26 & *recip_deepFac2C(k)*recip_rhoFacC(k)
120 heimbach 1.12 & *KappaRX(i,j,k+1)*recip_drC(k+1)
121 jmc 1.26 & *deepFac2F(k+1)*rhoFacF(k+1)
122 adcroft 1.13 IF (recip_hFac(i,j,k+1,bi,bj).EQ.0.) c(i,j,k)=0.
123 heimbach 1.12 ENDDO
124     ENDDO
125     ENDDO
126 heimbach 1.14 DO j=jMin,jMax
127     DO i=iMin,iMax
128 heimbach 1.12 c(i,j,Nr) = 0. _d 0
129     ENDDO
130     ENDDO
131    
132     C-- Old aCenter
133     DO k=1,Nr
134 heimbach 1.14 DO j=jMin,jMax
135     DO i=iMin,iMax
136 heimbach 1.12 b(i,j,k) = 1. _d 0 - c(i,j,k) - a(i,j,k)
137     ENDDO
138     ENDDO
139     ENDDO
140    
141     C-- Old and new gam, bet are the same
142     DO k=1,Nr
143 heimbach 1.14 DO j=jMin,jMax
144     DO i=iMin,iMax
145 jmc 1.22 bet(i,j,k) = 1. _d 0
146 heimbach 1.12 gam(i,j,k) = 0. _d 0
147     ENDDO
148     ENDDO
149     ENDDO
150    
151 heimbach 1.10 C-- Only need do anything if Nr>1
152     IF (Nr.GT.1) THEN
153    
154 heimbach 1.12 k = 1
155 cnh 1.5 C-- Beginning of forward sweep (top level)
156 adcroft 1.1 DO j=jMin,jMax
157     DO i=iMin,iMax
158 heimbach 1.12 IF (b(i,j,1).NE.0.) bet(i,j,1) = 1. _d 0 / b(i,j,1)
159 adcroft 1.1 ENDDO
160     ENDDO
161 heimbach 1.10
162 adcroft 1.1 ENDIF
163 heimbach 1.9
164 cnh 1.5 C-- Middle of forward sweep
165 jmc 1.20 IF (Nr.GE.2) THEN
166 heimbach 1.10
167 heimbach 1.12 CADJ loop = sequential
168     DO k=2,Nr
169 heimbach 1.9
170 adcroft 1.1 DO j=jMin,jMax
171     DO i=iMin,iMax
172 heimbach 1.12 gam(i,j,k) = c(i,j,k-1)*bet(i,j,k-1)
173     IF ( ( b(i,j,k) - a(i,j,k)*gam(i,j,k) ) .NE. 0.)
174     & bet(i,j,k) = 1. _d 0 / ( b(i,j,k) - a(i,j,k)*gam(i,j,k) )
175 adcroft 1.1 ENDDO
176     ENDDO
177 heimbach 1.9
178 adcroft 1.1 ENDDO
179 heimbach 1.10
180 adcroft 1.1 ENDIF
181 heimbach 1.10
182 heimbach 1.11
183 heimbach 1.12 DO j=jMin,jMax
184     DO i=iMin,iMax
185     gYNm1(i,j,1,bi,bj) = gXNm1(i,j,1,bi,bj)*bet(i,j,1)
186 heimbach 1.10 ENDDO
187 heimbach 1.12 ENDDO
188     DO k=2,Nr
189 heimbach 1.10 DO j=jMin,jMax
190     DO i=iMin,iMax
191 heimbach 1.12 gYnm1(i,j,k,bi,bj) = bet(i,j,k)*
192     & (gXnm1(i,j,k,bi,bj) - a(i,j,k)*gYnm1(i,j,k-1,bi,bj))
193 heimbach 1.9 ENDDO
194     ENDDO
195 heimbach 1.12 ENDDO
196 heimbach 1.9
197    
198 heimbach 1.12 C-- Backward sweep
199     CADJ loop = sequential
200     DO k=Nr-1,1,-1
201     DO j=jMin,jMax
202     DO i=iMin,iMax
203     gYnm1(i,j,k,bi,bj)=gYnm1(i,j,k,bi,bj)
204     & -gam(i,j,k+1)*gYnm1(i,j,k+1,bi,bj)
205     ENDDO
206 adcroft 1.1 ENDDO
207     ENDDO
208 heimbach 1.9
209 heimbach 1.12 DO k=1,Nr
210 adcroft 1.1 DO j=jMin,jMax
211     DO i=iMin,iMax
212 heimbach 1.12 gXnm1(i,j,k,bi,bj)=gYnm1(i,j,k,bi,bj)
213 adcroft 1.1 ENDDO
214     ENDDO
215     ENDDO
216    
217 jmc 1.23 #ifdef ALLOW_DIAGNOSTICS
218 jmc 1.25 IF ( useDiagnostics .AND.tracerId.NE.0 ) THEN
219     IF ( tracerId.GE. 1 ) THEN
220 jmc 1.23 C-- Set diagnostic suffix for the current tracer
221     #ifdef ALLOW_GENERIC_ADVDIFF
222 jmc 1.25 diagSufx = GAD_DIAG_SUFX( tracerId, myThid )
223 jmc 1.23 #else
224 jmc 1.25 diagSufx = 'aaaa'
225 jmc 1.23 #endif
226 jmc 1.25 diagName = 'DFrI'//diagSufx
227     ELSEIF ( tracerId.EQ. -1 ) THEN
228     diagName = 'VISrI_Um'
229     ELSEIF ( tracerId.EQ. -2 ) THEN
230     diagName = 'VISrI_Vm'
231     ELSE
232     STOP 'IMPLIDIFF: should never reach this point !'
233     ENDIF
234 jmc 1.23 IF ( DIAGNOSTICS_IS_ON(diagName,myThid) ) THEN
235     DO k= 1,Nr
236     IF ( k.EQ.1 ) THEN
237     C- Note: Needs to call DIAGNOSTICS_FILL at level k=1 even if array == 0
238     C otherwise counter is not incremented !!
239     DO j=1-OLy,sNy+OLy
240     DO i=1-OLx,sNx+OLx
241     df(i,j) = 0. _d 0
242     ENDDO
243     ENDDO
244 jmc 1.25 ELSEIF ( tracerId.GE.1 ) THEN
245 jmc 1.23 DO j=1,sNy
246     DO i=1,sNx
247     df(i,j) =
248 jmc 1.26 & -rA(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
249 jmc 1.25 & * KappaRX(i,j,k)*recip_drC(k)
250     & * (gXnm1(i,j,k,bi,bj) - gXnm1(i,j,k-1,bi,bj))*rkSign
251     ENDDO
252     ENDDO
253     ELSEIF ( tracerId.EQ.-1 ) THEN
254     DO j=1,sNy
255     DO i=1,sNx+1
256     df(i,j) =
257 jmc 1.26 & -rAw(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
258 jmc 1.25 & * KappaRX(i,j,k)*recip_drC(k)
259     & * (gXnm1(i,j,k,bi,bj) - gXnm1(i,j,k-1,bi,bj))*rkSign
260     & * _maskW(i,j,k,bi,bj)
261     & * _maskW(i,j,k-1,bi,bj)
262     ENDDO
263     ENDDO
264     ELSEIF ( tracerId.EQ.-2 ) THEN
265     DO j=1,sNy+1
266     DO i=1,sNx
267     df(i,j) =
268 jmc 1.26 & -rAs(i,j,bi,bj)*deepFac2F(k)*rhoFacF(k)
269 jmc 1.23 & * KappaRX(i,j,k)*recip_drC(k)
270 jmc 1.25 & * (gXnm1(i,j,k,bi,bj) - gXnm1(i,j,k-1,bi,bj))*rkSign
271     & * _maskS(i,j,k,bi,bj)
272     & * _maskS(i,j,k-1,bi,bj)
273 jmc 1.23 ENDDO
274     ENDDO
275     ENDIF
276 jmc 1.24 CALL DIAGNOSTICS_FILL(df,diagName, k,1, 2,bi,bj, myThid)
277 jmc 1.23 ENDDO
278     ENDIF
279     ENDIF
280     #endif /* ALLOW_DIAGNOSTICS */
281    
282 adcroft 1.1 RETURN
283     END

  ViewVC Help
Powered by ViewVC 1.1.22