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

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

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


Revision 1.12 - (show annotations) (download)
Mon Nov 13 16:30:32 2000 UTC (23 years, 6 months ago) by heimbach
Branch: MAIN
CVS Tags: checkpoint32
Changes since 1.11: +81 -99 lines
Changed 2d intermediate fields to 3d to reduce TAMC storage.

1 C $Header: /u/gcmpack/models/MITgcmUV/model/src/impldiff.F,v 1.10 2000/06/12 13:38:50 heimbach Exp $
2
3 #include "CPP_OPTIONS.h"
4
5 C /==========================================================\
6 C | S/R IMPLDIFF |
7 C | o Solve implicit diffusion equation for vertical |
8 C | diffusivity. |
9 C \==========================================================/
10 SUBROUTINE IMPLDIFF( bi, bj, iMin, iMax, jMin, jMax,
11 I deltaTX,KappaRX,recip_hFac,
12 U gXNm1,
13 I myThid )
14 IMPLICIT NONE
15 C == Global data ==
16 #include "SIZE.h"
17 #include "DYNVARS.h"
18 #include "EEPARAMS.h"
19 #include "PARAMS.h"
20 #include "GRID.h"
21
22 #ifdef ALLOW_AUTODIFF_TAMC
23 #include "tamc_keys.h"
24 #endif
25
26 C == Routine Arguments ==
27 INTEGER bi,bj,iMin,iMax,jMin,jMax
28 _RL deltaTX
29 _RL KappaRX(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
30 _RS recip_hFac(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
31 _RL gXnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
32 _RL gYnm1(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr,nSx,nSy)
33 INTEGER myThid
34
35 C == Local variables ==
36 INTEGER i,j,k
37 _RL a(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
38 _RL b(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
39 _RL c(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
40 _RL bet(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
41 _RL gam(1-Olx:sNx+Olx,1-Oly:sNy+Oly,Nr)
42
43 #ifdef ALLOW_AUTODIFF_TAMC
44 INTEGER kkey
45 #endif
46
47 C-- Initialise
48
49 C-- Old aLower
50 DO j=1-Oly,sNy+Oly
51 DO i=1-Olx,sNx+Olx
52 a(i,j,1) = 0. _d 0
53 ENDDO
54 ENDDO
55 DO k=2,Nr
56 DO j=1-Oly,sNy+Oly
57 DO i=1-Olx,sNx+Olx
58 a(i,j,k) = -deltaTX*recip_hFac(i,j,k,bi,bj)*recip_drF(k)
59 & *KappaRX(i,j, k )*recip_drC( k )
60 ENDDO
61 ENDDO
62 ENDDO
63
64 C-- Old aUpper
65 DO k=1,Nr-1
66 DO j=1-Oly,sNy+Oly
67 DO i=1-Olx,sNx+Olx
68 c(i,j,k) = -deltaTX*recip_hFac(i,j,k,bi,bj)*recip_drF(k)
69 & *KappaRX(i,j,k+1)*recip_drC(k+1)
70 ENDDO
71 ENDDO
72 ENDDO
73 DO j=1-Oly,sNy+Oly
74 DO i=1-Olx,sNx+Olx
75 c(i,j,Nr) = 0. _d 0
76 ENDDO
77 ENDDO
78
79 C-- Old aCenter
80 DO k=1,Nr
81 DO j=1-Oly,sNy+Oly
82 DO i=1-Olx,sNx+Olx
83 b(i,j,k) = 1. _d 0 - c(i,j,k) - a(i,j,k)
84 ENDDO
85 ENDDO
86 ENDDO
87
88 C-- Old and new gam, bet are the same
89 DO k=1,Nr
90 DO j=1-Oly,sNy+Oly
91 DO i=1-Olx,sNx+Olx
92 bet(i,j,k) = 0. _d 0
93 gam(i,j,k) = 0. _d 0
94 ENDDO
95 ENDDO
96 ENDDO
97
98 C-- Only need do anything if Nr>1
99 IF (Nr.GT.1) THEN
100
101 k = 1
102 C-- Beginning of forward sweep (top level)
103 DO j=jMin,jMax
104 DO i=iMin,iMax
105 IF (b(i,j,1).NE.0.) bet(i,j,1) = 1. _d 0 / b(i,j,1)
106 ENDDO
107 ENDDO
108
109 ENDIF
110
111 C-- Middle of forward sweep
112 IF (Nr.GT.2) THEN
113
114 CADJ loop = sequential
115 DO k=2,Nr
116
117 #ifdef ALLOW_AUTODIFF_TAMC
118 kkey = (idkey-1)*(Nr-2) + k-1
119 #endif
120
121 DO j=jMin,jMax
122 DO i=iMin,iMax
123 gam(i,j,k) = c(i,j,k-1)*bet(i,j,k-1)
124 IF ( ( b(i,j,k) - a(i,j,k)*gam(i,j,k) ) .NE. 0.)
125 & bet(i,j,k) = 1. _d 0 / ( b(i,j,k) - a(i,j,k)*gam(i,j,k) )
126 ENDDO
127 ENDDO
128
129 ENDDO
130
131 ENDIF
132
133
134 DO j=jMin,jMax
135 DO i=iMin,iMax
136 gYNm1(i,j,1,bi,bj) = gXNm1(i,j,1,bi,bj)*bet(i,j,1)
137 ENDDO
138 ENDDO
139 DO k=2,Nr
140 DO j=jMin,jMax
141 DO i=iMin,iMax
142 gYnm1(i,j,k,bi,bj) = bet(i,j,k)*
143 & (gXnm1(i,j,k,bi,bj) - a(i,j,k)*gYnm1(i,j,k-1,bi,bj))
144 ENDDO
145 ENDDO
146 ENDDO
147
148
149 C-- Backward sweep
150 CADJ loop = sequential
151 DO k=Nr-1,1,-1
152 DO j=jMin,jMax
153 DO i=iMin,iMax
154 gYnm1(i,j,k,bi,bj)=gYnm1(i,j,k,bi,bj)
155 & -gam(i,j,k+1)*gYnm1(i,j,k+1,bi,bj)
156 ENDDO
157 ENDDO
158 ENDDO
159
160 DO k=1,Nr
161 DO j=jMin,jMax
162 DO i=iMin,iMax
163 gXnm1(i,j,k,bi,bj)=gYnm1(i,j,k,bi,bj)
164 ENDDO
165 ENDDO
166 ENDDO
167
168 RETURN
169 END

  ViewVC Help
Powered by ViewVC 1.1.22