90
91
94
95
96
97 integer, intent(in) :: ng, tile
98 integer, intent(in) :: LBi, UBi, LBj, UBj
99 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
100 integer, intent(in) :: nrhs, nnew
101
102# ifdef ASSUMED_SHAPE
103# ifdef MASKING
104 real(r8), intent(in) :: pmask(LBi:,LBj:)
105# endif
106 real(r8), intent(in) :: Hz(LBi:,LBj:,:)
107 real(r8), intent(in) :: pm(LBi:,LBj:)
108 real(r8), intent(in) :: pmon_p(LBi:,LBj:)
109 real(r8), intent(in) :: pmon_r(LBi:,LBj:)
110 real(r8), intent(in) :: pn(LBi:,LBj:)
111 real(r8), intent(in) :: pnom_p(LBi:,LBj:)
112 real(r8), intent(in) :: pnom_r(LBi:,LBj:)
113
114 real(r8), intent(in) :: u(LBi:,LBj:,:,:)
115 real(r8), intent(in) :: v(LBi:,LBj:,:,:)
116
117 real(r8), intent(inout) :: ad_u(LBi:,LBj:,:,:)
118 real(r8), intent(inout) :: ad_v(LBi:,LBj:,:,:)
119# else
120# ifdef MASKING
121 real(r8), intent(in) :: pmask(LBi:UBi,LBj:UBj)
122# endif
123 real(r8), intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
124 real(r8), intent(in) :: pm(LBi:UBi,LBj:UBj)
125 real(r8), intent(in) :: pmon_p(LBi:UBi,LBj:UBj)
126 real(r8), intent(in) :: pmon_r(LBi:UBi,LBj:UBj)
127 real(r8), intent(in) :: pn(LBi:UBi,LBj:UBj)
128 real(r8), intent(in) :: pnom_p(LBi:UBi,LBj:UBj)
129 real(r8), intent(in) :: pnom_r(LBi:UBi,LBj:UBj)
130
131 real(r8), intent(in) :: u(LBi:UBi,LBj:UBj,N(ng),2)
132 real(r8), intent(in) :: v(LBi:UBi,LBj:UBj,N(ng),2)
133
134 real(r8), intent(inout) :: ad_u(LBi:UBi,LBj:UBj,N(ng),2)
135 real(r8), intent(inout) :: ad_v(LBi:UBi,LBj:UBj,N(ng),2)
136# endif
137
138
139
140 integer :: i, j, k
141
142 real(r8) :: cff, adfac
143
144 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ad_UFe
145 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ad_UFx
146 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ad_VFe
147 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: ad_VFx
148
149# include "set_bounds.h"
150
151
152
153
154
155
156
158
159 ad_ufx=0.0_r8
160 ad_vfx=0.0_r8
161 ad_ufe=0.0_r8
162 ad_vfe=0.0_r8
163
164 k_loop :
DO k=1,
n(ng)
165
166
167
168
170 DO j=jstr,jend
171 DO i=istru,iend
172
173
174
175
176
177
178 adfac=cff*(pm(i-1,j)+pm(i,j))* &
179 & (pn(i-1,j)+pn(i,j))*ad_u(i,j,k,nnew)
180 ad_ufx(i,j)=ad_ufx(i,j)+adfac
181 ad_ufx(i-1,j)=ad_ufx(i-1,j)-adfac
182 ad_ufe(i,j+1)=ad_ufe(i,j+1)+adfac
183 ad_ufe(i,j)=ad_ufe(i,j)-adfac
184 END DO
185 END DO
186 DO j=jstrv,jend
187 DO i=istr,iend
188
189
190
191
192
193
194 adfac=cff*(pm(i,j)+pm(i,j-1))* &
195 & (pn(i,j)+pn(i,j-1))*ad_v(i,j,k,nnew)
196 ad_vfx(i+1,j)=ad_vfx(i+1,j)+adfac
197 ad_vfx(i,j)=ad_vfx(i,j)-adfac
198 ad_vfe(i,j)=ad_vfe(i,j)+adfac
199 ad_vfe(i,j-1)=ad_vfe(i,j-1)-adfac
200 END DO
201 END DO
202
203
204
205
206 DO j=jstrv-1,jend
207 DO i=istr,iend
208
209
210
211
212
213 adfac=
tl_m3diff(ng)*pnom_r(i,j)*hz(i,j,k)*ad_vfe(i,j)
214 ad_v(i,j+1,k,nrhs)=ad_v(i,j+1,k,nrhs)+adfac
215 ad_v(i,j ,k,nrhs)=ad_v(i,j ,k,nrhs)-adfac
216 ad_vfe(i,j)=0.0_r8
217 END DO
218 END DO
219 DO j=jstrv,jend
220 DO i=istr,iend+1
221# ifdef MASKING
222
223
224 ad_vfx(i,j)=ad_vfx(i,j)*pmask(i,j)
225# endif
226
227
228
229
230
231
233 & 0.25_r8*(hz(i,j ,k)+hz(i-1,j ,k)+ &
234 & hz(i,j-1,k)+hz(i-1,j-1,k))*ad_vfx(i,j)
235 ad_v(i ,j,k,nrhs)=ad_v(i ,j,k,nrhs)+adfac
236 ad_v(i-1,j,k,nrhs)=ad_v(i-1,j,k,nrhs)-adfac
237 ad_vfx(i,j)=0.0_r8
238 END DO
239 END DO
240 DO j=jstr,jend+1
241 DO i=istru,iend
242# ifdef MASKING
243
244
245 ad_ufe(i,j)=ad_ufe(i,j)*pmask(i,j)
246# endif
247
248
249
250
251
252
254 & 0.25_r8*(hz(i,j ,k)+hz(i-1,j ,k)+ &
255 & hz(i,j-1,k)+hz(i-1,j-1,k))*ad_ufe(i,j)
256 ad_u(i,j ,k,nrhs)=ad_u(i,j ,k,nrhs)+adfac
257 ad_u(i,j-1,k,nrhs)=ad_u(i,j-1,k,nrhs)-adfac
258 ad_ufe(i,j)=0.0_r8
259 END DO
260 END DO
261 DO j=jstr,jend
262 DO i=istru-1,iend
263
264
265
266
267
268 adfac=
tl_m3diff(ng)*pmon_r(i,j)*hz(i,j,k)*ad_ufx(i,j)
269 ad_u(i+1,j,k,nrhs)=ad_u(i+1,j,k,nrhs)+adfac
270 ad_u(i ,j,k,nrhs)=ad_u(i ,j,k,nrhs)-adfac
271 ad_ufx(i,j)=0.0_r8
272 END DO
273 END DO
274 END DO k_loop
275 END IF
276
277 RETURN
integer, dimension(:), allocatable n
real(dp), dimension(:), allocatable dt
real(r8), dimension(:), allocatable tl_m3diff