ROMS
Loading...
Searching...
No Matches
rp_t3dmix2_mod Module Reference

Functions/Subroutines

subroutine, public rp_t3dmix2 (ng, tile)
 
subroutine rp_t3dmix2_geo_tile (ng, tile, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, nrhs, nstp, nnew, umask, vmask, umask_wet, vmask_wet, om_v, on_u, pm, pn, hz, tl_hz, z_r, tl_z_r, diff3d_r, diff2, tclm, t, tl_t)
 
subroutine rp_t3dmix2_iso_tile (ng, tile, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, nrhs, nstp, nnew, umask, vmask, umask_wet, vmask_wet, om_v, on_u, pm, pn, hz, tl_hz, z_r, tl_z_r, diff3d_r, diff2, pden, tl_pden, tclm, t, tl_t)
 
subroutine rp_t3dmix2_s_tile (ng, tile, lbi, ubi, lbj, ubj, imins, imaxs, jmins, jmaxs, nrhs, nstp, nnew, umask, vmask, umask_wet, vmask_wet, hz, tl_hz, pmon_u, pnom_v, pm, pn, diff3d_r, diff2, tclm, t, tl_t)
 

Function/Subroutine Documentation

◆ rp_t3dmix2()

subroutine public rp_t3dmix2_mod::rp_t3dmix2 ( integer, intent(in) ng,
integer, intent(in) tile )

Definition at line 25 of file rp_t3dmix2_geo.h.

26!***********************************************************************
27!
28 USE mod_param
29#ifdef TS_MIX_CLIMA
30 USE mod_clima
31#endif
32#ifdef DIAGNOSTICS_TS
33!! USE mod_diags
34#endif
35 USE mod_grid
36 USE mod_mixing
37 USE mod_ocean
38 USE mod_stepping
39!
40! Imported variable declarations.
41!
42 integer, intent(in) :: ng, tile
43!
44! Local variable declarations.
45!
46 character (len=*), parameter :: MyFile = &
47 & __FILE__
48!
49#include "tile.h"
50!
51#ifdef PROFILE
52 CALL wclock_on (ng, irpm, 25, __line__, myfile)
53#endif
54 CALL rp_t3dmix2_geo_tile (ng, tile, &
55 & lbi, ubi, lbj, ubj, &
56 & imins, imaxs, jmins, jmaxs, &
57 & nrhs(ng), nstp(ng), nnew(ng), &
58#ifdef MASKING
59 & grid(ng) % umask, &
60 & grid(ng) % vmask, &
61#endif
62#ifdef WET_DRY_NOT_YET
63 & grid(ng) % umask_wet, &
64 & grid(ng) % vmask_wet, &
65#endif
66 & grid(ng) % om_v, &
67 & grid(ng) % on_u, &
68 & grid(ng) % pm, &
69 & grid(ng) % pn, &
70 & grid(ng) % Hz, &
71 & grid(ng) % tl_Hz, &
72 & grid(ng) % z_r, &
73 & grid(ng) % tl_z_r, &
74#ifdef DIFF_3DCOEF
75 & mixing(ng) % diff3d_r, &
76#else
77 & mixing(ng) % diff2, &
78#endif
79#ifdef TS_MIX_CLIMA
80 & clima(ng) % tclm, &
81#endif
82#ifdef DIAGNOSTICS_TS
83!! & DIAGS(ng) % DiaTwrk, &
84#endif
85 & ocean(ng) % t, &
86 & ocean(ng) % tl_t)
87#ifdef PROFILE
88 CALL wclock_off (ng, irpm, 25, __line__, myfile)
89#endif
90!
91 RETURN
type(t_clima), dimension(:), allocatable clima
Definition mod_clima.F:153
type(t_grid), dimension(:), allocatable grid
Definition mod_grid.F:365
type(t_mixing), dimension(:), allocatable mixing
Definition mod_mixing.F:399
type(t_ocean), dimension(:), allocatable ocean
Definition mod_ocean.F:351
integer, parameter irpm
Definition mod_param.F:664
integer, dimension(:), allocatable nrhs
integer, dimension(:), allocatable nnew
integer, dimension(:), allocatable nstp
recursive subroutine wclock_off(ng, model, region, line, routine)
Definition timers.F:148
recursive subroutine wclock_on(ng, model, region, line, routine)
Definition timers.F:3

References mod_clima::clima, mod_grid::grid, mod_param::irpm, mod_mixing::mixing, mod_stepping::nnew, mod_stepping::nrhs, mod_stepping::nstp, mod_ocean::ocean, rp_t3dmix2_geo_tile(), wclock_off(), and wclock_on().

Referenced by rp_rhs3d_mod::rp_rhs3d().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ rp_t3dmix2_geo_tile()

subroutine rp_t3dmix2_mod::rp_t3dmix2_geo_tile ( integer, intent(in) ng,
integer, intent(in) tile,
integer, intent(in) lbi,
integer, intent(in) ubi,
integer, intent(in) lbj,
integer, intent(in) ubj,
integer, intent(in) imins,
integer, intent(in) imaxs,
integer, intent(in) jmins,
integer, intent(in) jmaxs,
integer, intent(in) nrhs,
integer, intent(in) nstp,
integer, intent(in) nnew,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) umask,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) vmask,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) umask_wet,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) vmask_wet,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) om_v,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) on_u,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) pm,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) pn,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) hz,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) tl_hz,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) z_r,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) tl_z_r,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) diff3d_r,
real(r8), dimension(lbi:ubi,lbj:ubj,nt(ng)), intent(in) diff2,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng),nt(ng)), intent(in) tclm,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng),3,nt(ng)), intent(in) t,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng),3,nt(ng)), intent(inout) tl_t )
private

Definition at line 95 of file rp_t3dmix2_geo.h.

120!***********************************************************************
121!
122 USE mod_param
123 USE mod_scalars
124!
125! Imported variable declarations.
126!
127 integer, intent(in) :: ng, tile
128 integer, intent(in) :: LBi, UBi, LBj, UBj
129 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
130 integer, intent(in) :: nrhs, nstp, nnew
131
132#ifdef ASSUMED_SHAPE
133# ifdef MASKING
134 real(r8), intent(in) :: umask(LBi:,LBj:)
135 real(r8), intent(in) :: vmask(LBi:,LBj:)
136# endif
137# ifdef WET_DRY_NOT_YET
138 real(r8), intent(in) :: umask_wet(LBi:,LBj:)
139 real(r8), intent(in) :: vmask_wet(LBi:,LBj:)
140# endif
141# ifdef DIFF_3DCOEF
142 real(r8), intent(in) :: diff3d_r(LBi:,LBj:,:)
143# else
144 real(r8), intent(in) :: diff2(LBi:,LBj:,:)
145# endif
146 real(r8), intent(in) :: om_v(LBi:,LBj:)
147 real(r8), intent(in) :: on_u(LBi:,LBj:)
148 real(r8), intent(in) :: pm(LBi:,LBj:)
149 real(r8), intent(in) :: pn(LBi:,LBj:)
150 real(r8), intent(in) :: Hz(LBi:,LBj:,:)
151 real(r8), intent(in) :: z_r(LBi:,LBj:,:)
152 real(r8), intent(in) :: t(LBi:,LBj:,:,:,:)
153# ifdef TS_MIX_CLIMA
154 real(r8), intent(in) :: tclm(LBi:,LBj:,:,:)
155# endif
156 real(r8), intent(in) :: tl_Hz(LBi:,LBj:,:)
157 real(r8), intent(in) :: tl_z_r(LBi:,LBj:,:)
158# ifdef DIAGNOSTICS_TS
159!! real(r8), intent(inout) :: DiaTwrk(LBi:,LBj:,:,:,:)
160# endif
161
162 real(r8), intent(inout) :: tl_t(LBi:,LBj:,:,:,:)
163#else
164# ifdef MASKING
165 real(r8), intent(in) :: umask(LBi:UBi,LBj:UBj)
166 real(r8), intent(in) :: vmask(LBi:UBi,LBj:UBj)
167# endif
168# ifdef WET_DRY
169 real(r8), intent(in) :: umask_wet(LBi:UBi,LBj:UBj)
170 real(r8), intent(in) :: vmask_wet(LBi:UBi,LBj:UBj)
171# endif
172# ifdef DIFF_3DCOEF
173 real(r8), intent(in) :: diff3d_r(LBi:UBi,LBj:UBj,N(ng))
174# else
175 real(r8), intent(in) :: diff2(LBi:UBi,LBj:UBj,NT(ng))
176# endif
177 real(r8), intent(in) :: om_v(LBi:UBi,LBj:UBj)
178 real(r8), intent(in) :: on_u(LBi:UBi,LBj:UBj)
179 real(r8), intent(in) :: pm(LBi:UBi,LBj:UBj)
180 real(r8), intent(in) :: pn(LBi:UBi,LBj:UBj)
181 real(r8), intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
182 real(r8), intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
183 real(r8), intent(in) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
184# ifdef TS_MIX_CLIMA
185 real(r8), intent(in) :: tclm(LBi:UBi,LBj:UBj,N(ng),NT(ng))
186# endif
187 real(r8), intent(in) :: tl_Hz(LBi:UBi,LBj:UBj,N(ng))
188 real(r8), intent(in) :: tl_z_r(LBi:UBi,LBj:UBj,N(ng))
189# ifdef DIAGNOSTICS_TS
190!! real(r8), intent(inout) :: DiaTwrk(LBi:UBi,LBj:UBj,N(ng),NT(ng), &
191!! & NDT)
192# endif
193 real(r8), intent(inout) :: tl_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
194#endif
195!
196! Local variable declarations.
197!
198 integer :: i, itrc, j, k, k1, k2
199
200 real(r8) :: cff, cff1, cff2, cff3, cff4
201 real(r8) :: tl_cff, tl_cff1, tl_cff2, tl_cff3, tl_cff4
202
203 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: tl_FE
204 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: tl_FX
205
206 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTdz
207 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTdx
208 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTde
209 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZdx
210 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dZde
211
212 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: tl_FS
213 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: tl_dTdz
214 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: tl_dTdx
215 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: tl_dTde
216 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: tl_dZdx
217 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: tl_dZde
218
219#include "set_bounds.h"
220!
221!-----------------------------------------------------------------------
222! Compute horizontal harmonic diffusion along geopotential surfaces.
223!-----------------------------------------------------------------------
224!
225! Compute horizontal and vertical gradients. Notice the recursive
226! blocking sequence. The vertical placement of the gradients is:
227!
228! dTdx,dTde(:,:,k1) k rho-points
229! dTdx,dTde(:,:,k2) k+1 rho-points
230! FS,dTdz(:,:,k1) k-1/2 W-points
231! FS,dTdz(:,:,k2) k+1/2 W-points
232!
233#ifdef TS_MIX_STABILITY
234! In order to increase stability, the biharmonic operator is applied
235! as: 3/4 t(:,:,:,nrhs,:) + 1/4 t(:,:,:,nstp,:).
236!
237#endif
238
239 t_loop : DO itrc=1,nt(ng)
240 k2=1
241 k_loop : DO k=0,n(ng)
242 k1=k2
243 k2=3-k1
244 IF (k.lt.n(ng)) THEN
245 DO j=jstr,jend
246 DO i=istr,iend+1
247 cff=0.5_r8*(pm(i,j)+pm(i-1,j))
248#ifdef MASKING
249 cff=cff*umask(i,j)
250#endif
251#ifdef WET_DRY_NOT_YET
252 cff=cff*umask_wet(i,j)
253#endif
254 dzdx(i,j,k2)=cff*(z_r(i ,j,k+1)- &
255 & z_r(i-1,j,k+1))
256 tl_dzdx(i,j,k2)=cff*(tl_z_r(i ,j,k+1)- &
257 & tl_z_r(i-1,j,k+1))
258#if defined TS_MIX_STABILITY
259 dtdx(i,j,k2)=cff*(0.75_r8*(t(i ,j,k+1,nrhs,itrc)- &
260 & t(i-1,j,k+1,nrhs,itrc))+ &
261 & 0.25_r8*(t(i ,j,k+1,nstp,itrc)- &
262 & t(i-1,j,k+1,nstp,itrc)))
263 tl_dtdx(i,j,k2)=cff* &
264 & (0.75_r8*(tl_t(i ,j,k+1,nrhs,itrc)- &
265 & tl_t(i-1,j,k+1,nrhs,itrc))+ &
266 & 0.25_r8*(tl_t(i ,j,k+1,nstp,itrc)- &
267 & tl_t(i-1,j,k+1,nstp,itrc)))
268#elif defined TS_MIX_CLIMA
269 IF (ltracerclm(itrc,ng)) THEN
270 dtdx(i,j,k2)=cff*((t(i ,j,k+1,nrhs,itrc)- &
271 & tclm(i ,j,k+1,itrc))- &
272 & (t(i-1,j,k+1,nrhs,itrc)- &
273 & tclm(i-1,j,k+1,itrc)))
274 ELSE
275 dtdx(i,j,k2)=cff*(t(i ,j,k+1,nrhs,itrc)- &
276 & t(i-1,j,k+1,nrhs,itrc))
277 END IF
278 tl_dtdx(i,j,k2)=cff*(tl_t(i ,j,k+1,nrhs,itrc)- &
279 & tl_t(i-1,j,k+1,nrhs,itrc))
280#else
281 dtdx(i,j,k2)=cff*(t(i ,j,k+1,nrhs,itrc)- &
282 & t(i-1,j,k+1,nrhs,itrc))
283 tl_dtdx(i,j,k2)=cff*(tl_t(i ,j,k+1,nrhs,itrc)- &
284 & tl_t(i-1,j,k+1,nrhs,itrc))
285#endif
286 END DO
287 END DO
288 DO j=jstr,jend+1
289 DO i=istr,iend
290 cff=0.5_r8*(pn(i,j)+pn(i,j-1))
291#ifdef MASKING
292 cff=cff*vmask(i,j)
293#endif
294#ifdef WET_DRY_NOT_YET
295 cff=cff*vmask_wet(i,j)
296#endif
297 dzde(i,j,k2)=cff*(z_r(i,j ,k+1)- &
298 & z_r(i,j-1,k+1))
299 tl_dzde(i,j,k2)=cff*(tl_z_r(i,j ,k+1)- &
300 & tl_z_r(i,j-1,k+1))
301#if defined TS_MIX_STABILITY
302 dtde(i,j,k2)=cff*(0.75_r8*(t(i,j ,k+1,nrhs,itrc)- &
303 & t(i,j-1,k+1,nrhs,itrc))+ &
304 & 0.25_r8*(t(i,j ,k+1,nstp,itrc)- &
305 & t(i,j-1,k+1,nstp,itrc)))
306 tl_dtde(i,j,k2)=cff* &
307 & (0.75_r8*(tl_t(i,j ,k+1,nrhs,itrc)- &
308 & tl_t(i,j-1,k+1,nrhs,itrc))+ &
309 & 0.25_r8*(tl_t(i,j ,k+1,nstp,itrc)- &
310 & tl_t(i,j-1,k+1,nstp,itrc)))
311#elif defined TS_MIX_CLIMA
312 IF (ltracerclm(itrc,ng)) THEN
313 dtde(i,j,k2)=cff*((t(i,j ,k+1,nrhs,itrc)- &
314 & tclm(i,j ,k+1,itrc))- &
315 & (t(i,j-1,k+1,nrhs,itrc)- &
316 & tclm(i,j-1,k+1,itrc)))
317 ELSE
318 dtde(i,j,k2)=cff*(t(i,j ,k+1,nrhs,itrc)- &
319 & t(i,j-1,k+1,nrhs,itrc))
320 END IF
321 tl_dtde(i,j,k2)=cff*(tl_t(i,j ,k+1,nrhs,itrc)- &
322 & tl_t(i,j-1,k+1,nrhs,itrc))
323#else
324 dtde(i,j,k2)=cff*(t(i,j ,k+1,nrhs,itrc)- &
325 & t(i,j-1,k+1,nrhs,itrc))
326 tl_dtde(i,j,k2)=cff*(tl_t(i,j ,k+1,nrhs,itrc)- &
327 & tl_t(i,j-1,k+1,nrhs,itrc))
328#endif
329 END DO
330 END DO
331 END IF
332 IF ((k.eq.0).or.(k.eq.n(ng))) THEN
333 DO j=jstr-1,jend+1
334 DO i=istr-1,iend+1
335 dtdz(i,j,k2)=0.0_r8
336 tl_dtdz(i,j,k2)=0.0_r8
337!^ FS(i,j,k2)=0.0_r8
338!^
339 tl_fs(i,j,k2)=0.0_r8
340 END DO
341 END DO
342 ELSE
343 DO j=jstr-1,jend+1
344 DO i=istr-1,iend+1
345 cff=1.0_r8/(z_r(i,j,k+1)-z_r(i,j,k))
346 tl_cff=-cff*cff*(tl_z_r(i,j,k+1)-tl_z_r(i,j,k))+ &
347#ifdef TL_IOMS
348 & 2.0_r8*cff
349#endif
350#if defined TS_MIX_STABILITY
351 dtdz(i,j,k2)=cff*(0.75_r8*(t(i,j,k+1,nrhs,itrc)- &
352 & t(i,j,k ,nrhs,itrc))+ &
353 & 0.25_r8*(t(i,j,k+1,nstp,itrc)- &
354 & t(i,j,k ,nstp,itrc)))
355 tl_dtdz(i,j,k2)=tl_cff*(0.75_r8*(t(i,j,k+1,nrhs,itrc)- &
356 & t(i,j,k ,nrhs,itrc))+ &
357 & 0.25_r8*(t(i,j,k+1,nstp,itrc)- &
358 & t(i,j,k ,nstp,itrc)))+&
359 & cff*(0.75_r8*(tl_t(i,j,k+1,nrhs,itrc)- &
360 & tl_t(i,j,k ,nrhs,itrc))+ &
361 & 0.25_r8*(tl_t(i,j,k+1,nstp,itrc)- &
362 & tl_t(i,j,k ,nstp,itrc)))-&
363# ifdef TL_IOMS
364 & dtdz(i,j,k2)
365# endif
366#elif defined TS_MIX_CLIMA
367 IF (ltracerclm(itrc,ng)) THEN
368 dtdz(i,j,k2)=cff*((t(i,j,k+1,nrhs,itrc)- &
369 & tclm(i,j,k+1,itrc))- &
370 & (t(i,j,k ,nrhs,itrc)- &
371 & tclm(i,j,k ,itrc)))
372 tl_dtdz(i,j,k2)=tl_cff*((t(i,j,k+1,nrhs,itrc)- &
373 & tclm(i,j,k+1,itrc))- &
374 & (t(i,j,k ,nrhs,itrc)- &
375 & tclm(i,j,k ,itrc)))+ &
376 & cff*(tl_t(i,j,k+1,nrhs,itrc)- &
377 & tl_t(i,j,k ,nrhs,itrc))- &
378# ifdef TL_IOMS
379 & dtdz(i,j,k2)
380# endif
381 ELSE
382 dtdz(i,j,k2)=cff*(t(i,j,k+1,nrhs,itrc)- &
383 & t(i,j,k ,nrhs,itrc))
384 tl_dtdz(i,j,k2)=tl_cff*(t(i,j,k+1,nrhs,itrc)- &
385 & t(i,j,k ,nrhs,itrc))+ &
386 & cff*(tl_t(i,j,k+1,nrhs,itrc)- &
387 & tl_t(i,j,k ,nrhs,itrc))- &
388# ifdef TL_IOMS
389 & dtdz(i,j,k2)
390# endif
391 END IF
392#else
393 dtdz(i,j,k2)=cff*(t(i,j,k+1,nrhs,itrc)- &
394 & t(i,j,k ,nrhs,itrc))
395 tl_dtdz(i,j,k2)=tl_cff*(t(i,j,k+1,nrhs,itrc)- &
396 & t(i,j,k ,nrhs,itrc))+ &
397 & cff*(tl_t(i,j,k+1,nrhs,itrc)- &
398 & tl_t(i,j,k ,nrhs,itrc))- &
399# ifdef TL_IOMS
400 & dtdz(i,j,k2)
401# endif
402#endif
403 END DO
404 END DO
405 END IF
406!
407! Compute components of the rotated tracer flux (T m3/s) along
408! geopotential surfaces.
409!
410 IF (k.gt.0) THEN
411 DO j=jstr,jend
412 DO i=istr,iend+1
413#ifdef DIFF_3DCOEF
414 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i-1,j,k))* &
415 & on_u(i,j)
416#else
417 cff=0.25_r8*(diff2(i,j,itrc)+diff2(i-1,j,itrc))* &
418 & on_u(i,j)
419#endif
420!^ FX(i,j)=cff* &
421!^ & (Hz(i,j,k)+Hz(i-1,j,k))* &
422!^ & (dTdx(i,j,k1)- &
423!^ & 0.5_r8*(MIN(dZdx(i,j,k1),0.0_r8)* &
424!^ & (dTdz(i-1,j,k1)+ &
425!^ & dTdz(i ,j,k2))+ &
426!^ & MAX(dZdx(i,j,k1),0.0_r8)* &
427!^ & (dTdz(i-1,j,k2)+ &
428!^ & dTdz(i ,j,k1))))
429!^
430 tl_fx(i,j)=cff* &
431 & (((tl_hz(i,j,k)+tl_hz(i-1,j,k))* &
432 & (dtdx(i,j,k1)- &
433 & 0.5_r8*(min(dzdx(i,j,k1),0.0_r8)* &
434 & (dtdz(i-1,j,k1)+ &
435 & dtdz(i ,j,k2))+ &
436 & max(dzdx(i,j,k1),0.0_r8)* &
437 & (dtdz(i-1,j,k2)+ &
438 & dtdz(i ,j,k1)))))+ &
439 & ((hz(i,j,k)+hz(i-1,j,k))* &
440 & (tl_dtdx(i,j,k1)- &
441 & 0.5_r8*(min(dzdx(i,j,k1),0.0_r8)* &
442 & (tl_dtdz(i-1,j,k1)+ &
443 & tl_dtdz(i ,j,k2))+ &
444 & max(dzdx(i,j,k1),0.0_r8)* &
445 & (tl_dtdz(i-1,j,k2)+ &
446 & tl_dtdz(i ,j,k1)))- &
447 & 0.5_r8*((0.5_r8+ &
448 & sign(0.5_r8,-dzdx(i,j,k1)))* &
449 & tl_dzdx(i,j,k1)* &
450 & (dtdz(i-1,j,k1)+dtdz(i,j,k2))+ &
451 & (0.5_r8+ &
452 & sign(0.5_r8, dzdx(i,j,k1)))* &
453 & tl_dzdx(i,j,k1)* &
454 & (dtdz(i-1,j,k2)+dtdz(i,j,k1))))))-&
455#ifdef TL_IOMS
456 & cff* &
457 & (hz(i,j,k)+hz(i-1,j,k))* &
458 & (dtdx(i,j,k1)- &
459 & (min(dzdx(i,j,k1),0.0_r8)* &
460 & (dtdz(i-1,j,k1)+ &
461 & dtdz(i ,j,k2))+ &
462 & max(dzdx(i,j,k1),0.0_r8)* &
463 & (dtdz(i-1,j,k2)+ &
464 & dtdz(i ,j,k1))))
465#endif
466 END DO
467 END DO
468 DO j=jstr,jend+1
469 DO i=istr,iend
470#ifdef DIFF_3DCOEF
471 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i,j-1,k))* &
472 & om_v(i,j)
473#else
474 cff=0.25_r8*(diff2(i,j,itrc)+diff2(i,j-1,itrc))* &
475 & om_v(i,j)
476#endif
477!^ FE(i,j)=cff* &
478!^ & (Hz(i,j,k)+Hz(i,j-1,k))* &
479!^ & (dTde(i,j,k1)- &
480!^ & 0.5_r8*(MIN(dZde(i,j,k1),0.0_r8)* &
481!^ & (dTdz(i,j-1,k1)+ &
482!^ & dTdz(i,j ,k2))+ &
483!^ & MAX(dZde(i,j,k1),0.0_r8)* &
484!^ & (dTdz(i,j-1,k2)+ &
485!^ & dTdz(i,j ,k1))))
486!^
487 tl_fe(i,j)=cff* &
488 & (((tl_hz(i,j,k)+tl_hz(i,j-1,k))* &
489 & (dtde(i,j,k1)- &
490 & 0.5_r8*(min(dzde(i,j,k1),0.0_r8)* &
491 & (dtdz(i,j-1,k1)+ &
492 & dtdz(i,j ,k2))+ &
493 & max(dzde(i,j,k1),0.0_r8)* &
494 & (dtdz(i,j-1,k2)+ &
495 & dtdz(i,j ,k1)))))+ &
496 & ((hz(i,j,k)+hz(i,j-1,k))* &
497 & (tl_dtde(i,j,k1)- &
498 & 0.5_r8*(min(dzde(i,j,k1),0.0_r8)* &
499 & (tl_dtdz(i,j-1,k1)+ &
500 & tl_dtdz(i,j ,k2))+ &
501 & max(dzde(i,j,k1),0.0_r8)* &
502 & (tl_dtdz(i,j-1,k2)+ &
503 & tl_dtdz(i,j ,k1)))- &
504 & 0.5_r8*((0.5_r8+ &
505 & sign(0.5_r8,-dzde(i,j,k1)))* &
506 & tl_dzde(i,j,k1)* &
507 & (dtdz(i,j-1,k1)+dtdz(i,j,k2))+ &
508 & (0.5_r8+ &
509 & sign(0.5_r8, dzde(i,j,k1)))* &
510 & tl_dzde(i,j,k1)* &
511 & (dtdz(i,j-1,k2)+dtdz(i,j,k1))))))-&
512#ifdef TL_IOMS
513 & cff* &
514 & (hz(i,j,k)+hz(i,j-1,k))* &
515 & (dtde(i,j,k1)- &
516 & (min(dzde(i,j,k1),0.0_r8)* &
517 & (dtdz(i,j-1,k1)+ &
518 & dtdz(i,j ,k2))+ &
519 & max(dzde(i,j,k1),0.0_r8)* &
520 & (dtdz(i,j-1,k2)+ &
521 & dtdz(i,j ,k1))))
522#endif
523 END DO
524 END DO
525 IF (k.lt.n(ng)) THEN
526 DO j=jstr,jend
527 DO i=istr,iend
528#ifdef DIFF_3DCOEF
529 cff=0.5_r8*diff3d_r(i,j,k)
530#else
531 cff=0.5_r8*diff2(i,j,itrc)
532#endif
533 cff1=min(dzdx(i ,j,k1),0.0_r8)
534 cff2=min(dzdx(i+1,j,k2),0.0_r8)
535 cff3=max(dzdx(i ,j,k2),0.0_r8)
536 cff4=max(dzdx(i+1,j,k1),0.0_r8)
537 tl_cff1=(0.5_r8+sign(0.5_r8,-dzdx(i ,j,k1)))* &
538 & tl_dzdx(i ,j,k1)
539 tl_cff2=(0.5_r8+sign(0.5_r8,-dzdx(i+1,j,k2)))* &
540 & tl_dzdx(i+1,j,k2)
541 tl_cff3=(0.5_r8+sign(0.5_r8, dzdx(i ,j,k2)))* &
542 & tl_dzdx(i ,j,k2)
543 tl_cff4=(0.5_r8+sign(0.5_r8, dzdx(i+1,j,k1)))* &
544 & tl_dzdx(i+1,j,k1)
545!^ FS(i,j,k2)=cff* &
546!^ & (cff1*(cff1*dTdz(i,j,k2)-dTdx(i ,j,k1))+ &
547!^ & cff2*(cff2*dTdz(i,j,k2)-dTdx(i+1,j,k2))+ &
548!^ & cff3*(cff3*dTdz(i,j,k2)-dTdx(i ,j,k2))+ &
549!^ & cff4*(cff4*dTdz(i,j,k2)-dTdx(i+1,j,k1)))
550!^
551 tl_fs(i,j,k2)=cff* &
552 & (tl_cff1*(cff1*dtdz(i,j,k2)- &
553 & dtdx(i ,j,k1))+ &
554 & tl_cff2*(cff2*dtdz(i,j,k2)- &
555 & dtdx(i+1,j,k2))+ &
556 & tl_cff3*(cff3*dtdz(i,j,k2)- &
557 & dtdx(i ,j,k2))+ &
558 & tl_cff4*(cff4*dtdz(i,j,k2)- &
559 & dtdx(i+1,j,k1))+ &
560 & cff1*(tl_cff1*dtdz(i,j,k2)+ &
561 & cff1*tl_dtdz(i,j,k2)- &
562 & tl_dtdx(i ,j,k1))+ &
563 & cff2*(tl_cff2*dtdz(i,j,k2)+ &
564 & cff2*tl_dtdz(i,j,k2)- &
565 & tl_dtdx(i+1,j,k2))+ &
566 & cff3*(tl_cff3*dtdz(i,j,k2)+ &
567 & cff3*tl_dtdz(i,j,k2)- &
568 & tl_dtdx(i ,j,k2))+ &
569 & cff4*(tl_cff4*dtdz(i,j,k2)+ &
570 & cff4*tl_dtdz(i,j,k2)- &
571 & tl_dtdx(i+1,j,k1)))- &
572#ifdef TL_IOMS
573 & cff* &
574 & (cff1*(2.0_r8*cff1*dtdz(i,j,k2)- &
575 & dtdx(i,j,k1))+ &
576 & cff2*(2.0_r8*cff2*dtdz(i ,j,k2)- &
577 & dtdx(i+1,j,k2))+ &
578 & cff3*(2.0_r8*cff3*dtdz(i,j,k2)- &
579 & dtdx(i,j,k2))+ &
580 & cff4*(2.0_r8*cff4*dtdz(i ,j,k2)- &
581 & dtdx(i+1,j,k1)))
582#endif
583!
584 cff1=min(dzde(i,j ,k1),0.0_r8)
585 cff2=min(dzde(i,j+1,k2),0.0_r8)
586 cff3=max(dzde(i,j ,k2),0.0_r8)
587 cff4=max(dzde(i,j+1,k1),0.0_r8)
588 tl_cff1=(0.5_r8+sign(0.5_r8,-dzde(i,j ,k1)))* &
589 & tl_dzde(i,j ,k1)
590 tl_cff2=(0.5_r8+sign(0.5_r8,-dzde(i,j+1,k2)))* &
591 & tl_dzde(i,j+1,k2)
592 tl_cff3=(0.5_r8+sign(0.5_r8, dzde(i,j ,k2)))* &
593 & tl_dzde(i,j ,k2)
594 tl_cff4=(0.5_r8+sign(0.5_r8, dzde(i,j+1,k1)))* &
595 & tl_dzde(i,j+1,k1)
596!^ FS(i,j,k2)=FS(i,j,k2)+ &
597!^ & cff* &
598!^ & (cff1*(cff1*dTdz(i,j,k2)-dTde(i,j ,k1))+ &
599!^ & cff2*(cff2*dTdz(i,j,k2)-dTde(i,j+1,k2))+ &
600!^ & cff3*(cff3*dTdz(i,j,k2)-dTde(i,j ,k2))+ &
601!^ & cff4*(cff4*dTdz(i,j,k2)-dTde(i,j+1,k1)))
602!^
603 tl_fs(i,j,k2)=tl_fs(i,j,k2)+ &
604 & cff* &
605 & (tl_cff1*(cff1*dtdz(i,j,k2)- &
606 & dtde(i,j ,k1))+ &
607 & tl_cff2*(cff2*dtdz(i,j,k2)- &
608 & dtde(i,j+1,k2))+ &
609 & tl_cff3*(cff3*dtdz(i,j,k2)- &
610 & dtde(i,j ,k2))+ &
611 & tl_cff4*(cff4*dtdz(i,j,k2)- &
612 & dtde(i,j+1,k1))+ &
613 & cff1*(tl_cff1*dtdz(i,j,k2)+ &
614 & cff1*tl_dtdz(i,j,k2)- &
615 & tl_dtde(i,j ,k1))+ &
616 & cff2*(tl_cff2*dtdz(i,j,k2)+ &
617 & cff2*tl_dtdz(i,j,k2)- &
618 & tl_dtde(i,j+1,k2))+ &
619 & cff3*(tl_cff3*dtdz(i,j,k2)+ &
620 & cff3*tl_dtdz(i,j,k2)- &
621 & tl_dtde(i,j ,k2))+ &
622 & cff4*(tl_cff4*dtdz(i,j,k2)+ &
623 & cff4*tl_dtdz(i,j,k2)- &
624 & tl_dtde(i,j+1,k1)))- &
625#ifdef TL_IOMS
626 & cff* &
627 & (cff1*(2.0_r8*cff1*dtdz(i,j,k2)- &
628 & dtde(i,j,k1))+ &
629 & cff2*(2.0_r8*cff2*dtdz(i,j ,k2)- &
630 & dtde(i,j+1,k2))+ &
631 & cff3*(2.0_r8*cff3*dtdz(i,j,k2)- &
632 & dtde(i,j,k2))+ &
633 & cff4*(2.0_r8*cff4*dtdz(i,j ,k2)- &
634 & dtde(i,j+1,k1)))
635#endif
636 END DO
637 END DO
638 END IF
639!
640! Time-step harmonic, geopotential diffusion term (m Tunits).
641!
642 DO j=jstr,jend
643 DO i=istr,iend
644!^ cff=dt(ng)*pm(i,j)*pn(i,j)* &
645!^ & (FX(i+1,j)-FX(i,j)+ &
646!^ & FE(i,j+1)-FE(i,j))+ &
647!^ & dt(ng)*(FS(i,j,k2)-FS(i,j,k1))
648!^
649 tl_cff=dt(ng)*pm(i,j)*pn(i,j)* &
650 & (tl_fx(i+1,j)-tl_fx(i,j)+ &
651 & tl_fe(i,j+1)-tl_fe(i,j))+ &
652 & dt(ng)*(tl_fs(i,j,k2)-tl_fs(i,j,k1))
653!^ t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)+cff
654!^
655 tl_t(i,j,k,nnew,itrc)=tl_t(i,j,k,nnew,itrc)+tl_cff
656#ifdef DIAGNOSTICS_TS
657!! DiaTwrk(i,j,k,itrc,iThdif)=cff
658#endif
659 END DO
660 END DO
661 END IF
662 END DO k_loop
663 END DO t_loop
664!
665 RETURN
integer, dimension(:), allocatable n
Definition mod_param.F:479
integer, dimension(:), allocatable nt
Definition mod_param.F:489
real(dp), dimension(:), allocatable dt
logical, dimension(:,:), allocatable ltracerclm

References mod_scalars::dt, and mod_scalars::ltracerclm.

Referenced by rp_t3dmix2().

Here is the caller graph for this function:

◆ rp_t3dmix2_iso_tile()

subroutine rp_t3dmix2_mod::rp_t3dmix2_iso_tile ( integer, intent(in) ng,
integer, intent(in) tile,
integer, intent(in) lbi,
integer, intent(in) ubi,
integer, intent(in) lbj,
integer, intent(in) ubj,
integer, intent(in) imins,
integer, intent(in) imaxs,
integer, intent(in) jmins,
integer, intent(in) jmaxs,
integer, intent(in) nrhs,
integer, intent(in) nstp,
integer, intent(in) nnew,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) umask,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) vmask,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) umask_wet,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) vmask_wet,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) om_v,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) on_u,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) pm,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) pn,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) hz,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) tl_hz,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) z_r,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) tl_z_r,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) diff3d_r,
real(r8), dimension(lbi:ubi,lbj:ubj,nt(ng)), intent(in) diff2,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) pden,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) tl_pden,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng),nt(ng)), intent(in) tclm,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng),3,nt(ng)), intent(in) t,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng),3,nt(ng)), intent(inout) tl_t )
private

Definition at line 97 of file rp_t3dmix2_iso.h.

123!***********************************************************************
124!
125 USE mod_param
126 USE mod_scalars
127!
128! Imported variable declarations.
129!
130 integer, intent(in) :: ng, tile
131 integer, intent(in) :: LBi, UBi, LBj, UBj
132 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
133 integer, intent(in) :: nrhs, nstp, nnew
134
135#ifdef ASSUMED_SHAPE
136# ifdef MASKING
137 real(r8), intent(in) :: umask(LBi:,LBj:)
138 real(r8), intent(in) :: vmask(LBi:,LBj:)
139# endif
140# ifdef WET_DRY_NOT_YET
141 real(r8), intent(in) :: umask_wet(LBi:,LBj:)
142 real(r8), intent(in) :: vmask_wet(LBi:,LBj:)
143# endif
144# ifdef DIFF_3DCOEF
145 real(r8), intent(in) :: diff3d_r(LBi:,LBj:,:)
146# else
147 real(r8), intent(in) :: diff2(LBi:,LBj:,:)
148# endif
149 real(r8), intent(in) :: om_v(LBi:,LBj:)
150 real(r8), intent(in) :: on_u(LBi:,LBj:)
151 real(r8), intent(in) :: pm(LBi:,LBj:)
152 real(r8), intent(in) :: pn(LBi:,LBj:)
153 real(r8), intent(in) :: Hz(LBi:,LBj:,:)
154 real(r8), intent(in) :: z_r(LBi:,LBj:,:)
155 real(r8), intent(in) :: rho(LBi:,LBj:,:)
156 real(r8), intent(in) :: t(LBi:,LBj:,:,:,:)
157# ifdef TS_MIX_CLIMA
158 real(r8), intent(in) :: tclm(LBi:,LBj:,:,:)
159# endif
160 real(r8), intent(in) :: tl_Hz(LBi:,LBj:,:)
161 real(r8), intent(in) :: tl_z_r(LBi:,LBj:,:)
162 real(r8), intent(in) :: tl_rho(LBi:,LBj:,:)
163# ifdef DIAGNOSTICS_TS
164!! real(r8), intent(inout) :: DiaTwrk(LBi:,LBj:,:,:,:)
165# endif
166
167 real(r8), intent(inout) :: tl_t(LBi:,LBj:,:,:,:)
168#else
169# ifdef MASKING
170 real(r8), intent(in) :: umask(LBi:UBi,LBj:UBj)
171 real(r8), intent(in) :: vmask(LBi:UBi,LBj:UBj)
172# endif
173# ifdef WET_DRY_NOT_YET
174 real(r8), intent(in) :: umask_wet(LBi:UBi,LBj:UBj)
175 real(r8), intent(in) :: vmask_wet(LBi:UBi,LBj:UBj)
176# endif
177# ifdef DIFF_3DCOEF
178 real(r8), intent(in) :: diff3d_r(LBi:UBi,LBj:UBj,N(ng))
179# else
180 real(r8), intent(in) :: diff2(LBi:UBi,LBj:UBj,NT(ng))
181# endif
182 real(r8), intent(in) :: om_v(LBi:UBi,LBj:UBj)
183 real(r8), intent(in) :: on_u(LBi:UBi,LBj:UBj)
184 real(r8), intent(in) :: pm(LBi:UBi,LBj:UBj)
185 real(r8), intent(in) :: pn(LBi:UBi,LBj:UBj)
186 real(r8), intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
187 real(r8), intent(in) :: z_r(LBi:UBi,LBj:UBj,N(ng))
188 real(r8), intent(in) :: pden(LBi:UBi,LBj:UBj,N(ng))
189 real(r8), intent(in) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
190# ifdef TS_MIX_CLIMA
191 real(r8), intent(in) :: tclm(LBi:UBi,LBj:UBj,N(ng),NT(ng))
192# endif
193 real(r8), intent(in) :: tl_Hz(LBi:UBi,LBj:UBj,N(ng))
194 real(r8), intent(in) :: tl_z_r(LBi:UBi,LBj:UBj,N(ng))
195 real(r8), intent(in) :: tl_pden(LBi:UBi,LBj:UBj,N(ng))
196# ifdef DIAGNOSTICS_TS
197!! real(r8), intent(inout) :: DiaTwrk(LBi:UBi,LBj:UBj,N(ng),NT(ng), &
198!! & NDT)
199# endif
200 real(r8), intent(inout) :: tl_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
201#endif
202!
203! Local variable declarations.
204!
205 integer :: i, itrc, j, k, k1, k2
206
207 real(r8), parameter :: eps = 0.5_r8
208 real(r8), parameter :: small = 1.0e-14_r8
209 real(r8), parameter :: slope_max = 0.0001_r8
210 real(r8), parameter :: strat_min = 0.1_r8
211
212 real(r8) :: cff, cff1, cff2, cff3, cff4
213 real(r8) :: tl_cff, tl_cff1, tl_cff2, tl_cff3, tl_cff4
214
215 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: tl_FE
216 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: tl_FX
217
218 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: FS
219 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dRde
220 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dRdx
221 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTde
222 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTdr
223 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: dTdx
224
225 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: tl_FS
226 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: tl_dRde
227 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: tl_dRdx
228 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: tl_dTde
229 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: tl_dTdr
230 real(r8), dimension(IminS:ImaxS,JminS:JmaxS,2) :: tl_dTdx
231
232#include "set_bounds.h"
233!
234!-----------------------------------------------------------------------
235! Compute horizontal harmonic diffusion along isopycnic surfaces.
236!-----------------------------------------------------------------------
237!
238! Compute horizontal and density gradients. Notice the recursive
239! blocking sequence. The vertical placement of the gradients is:
240!
241! dTdx,dTde(:,:,k1) k rho-points
242! dTdx,dTde(:,:,k2) k+1 rho-points
243! FS,dTdr(:,:,k1) k-1/2 W-points
244! FS,dTdr(:,:,k2) k+1/2 W-points
245!
246 t_loop : DO itrc=1,nt(ng)
247 k2=1
248 k_loop : DO k=0,n(ng)
249 k1=k2
250 k2=3-k1
251 IF (k.lt.n(ng)) THEN
252 DO j=jstr,jend
253 DO i=istr,iend+1
254 cff=0.5_r8*(pm(i,j)+pm(i-1,j))
255#ifdef MASKING
256 cff=cff*umask(i,j)
257#endif
258#ifdef WET_DRY_NOT_YET
259 cff=cff*umask_wet(i,j)
260#endif
261 drdx(i,j,k2)=cff*(pden(i ,j,k+1)- &
262 & pden(i-1,j,k+1))
263 tl_drdx(i,j,k2)=cff*(tl_pden(i ,j,k+1)- &
264 & tl_pden(i-1,j,k+1))
265#if defined TS_MIX_STABILITY
266 dtdx(i,j,k2)=cff*(0.75_r8*(t(i ,j,k+1,nrhs,itrc)- &
267 & t(i-1,j,k+1,nrhs,itrc))+ &
268 & 0.25_r8*(t(i ,j,k+1,nstp,itrc)- &
269 & t(i-1,j,k+1,nstp,itrc)))
270 tl_dtdx(i,j,k2)=cff* &
271 & (0.75_r8*(tl_t(i ,j,k+1,nrhs,itrc)- &
272 & tl_t(i-1,j,k+1,nrhs,itrc))+ &
273 & 0.25_r8*(tl_t(i ,j,k+1,nstp,itrc)- &
274 & tl_t(i-1,j,k+1,nstp,itrc)))
275#elif defined TS_MIX_CLIMA
276 IF (ltracerclm(itrc,ng)) THEN
277 dtdx(i,j,k2)=cff*((t(i ,j,k+1,nrhs,itrc)- &
278 & tclm(i ,j,k+1,itrc))- &
279 & (t(i-1,j,k+1,nrhs,itrc)- &
280 & tclm(i-1,j,k+1,itrc)))
281 ELSE
282 dtdx(i,j,k2)=cff*(t(i ,j,k+1,nrhs,itrc)- &
283 & t(i-1,j,k+1,nrhs,itrc))
284 END IF
285 tl_dtdx(i,j,k2)=cff*(tl_t(i ,j,k+1,nrhs,itrc)- &
286 & tl_t(i-1,j,k+1,nrhs,itrc))
287#else
288 dtdx(i,j,k2)=cff*(t(i ,j,k+1,nrhs,itrc)- &
289 & t(i-1,j,k+1,nrhs,itrc))
290 tl_dtdx(i,j,k2)=cff*(tl_t(i ,j,k+1,nrhs,itrc)- &
291 & tl_t(i-1,j,k+1,nrhs,itrc))
292#endif
293 END DO
294 END DO
295 DO j=jstr,jend+1
296 DO i=istr,iend
297 cff=0.5_r8*(pn(i,j)+pn(i,j-1))
298#ifdef MASKING
299 cff=cff*vmask(i,j)
300#endif
301#ifdef WET_DRY_NOT_YET
302 cff=cff*vmask_wet(i,j)
303#endif
304 drde(i,j,k2)=cff*(pden(i,j ,k+1)- &
305 & pden(i,j-1,k+1))
306 tl_drde(i,j,k2)=cff*(tl_pden(i,j ,k+1)- &
307 & tl_pden(i,j-1,k+1))
308#if defined TS_MIX_STABILITY
309 dtde(i,j,k2)=cff*(0.75_r8*(t(i,j ,k+1,nrhs,itrc)- &
310 & t(i,j-1,k+1,nrhs,itrc))+ &
311 & 0.25_r8*(t(i,j ,k+1,nstp,itrc)- &
312 & t(i,j-1,k+1,nstp,itrc)))
313 tl_dtde(i,j,k2)=cff* &
314 & (0.75_r8*(tl_t(i,j ,k+1,nrhs,itrc)- &
315 & tl_t(i,j-1,k+1,nrhs,itrc))+ &
316 & 0.25_r8*(tl_t(i,j ,k+1,nstp,itrc)- &
317 & tl_t(i,j-1,k+1,nstp,itrc)))
318#elif defined TS_MIX_CLIMA
319 IF (ltracerclm(itrc,ng)) THEN
320 dtde(i,j,k2)=cff*((t(i,j ,k+1,nrhs,itrc)- &
321 & tclm(i,j ,k+1,itrc))- &
322 & (t(i,j-1,k+1,nrhs,itrc)- &
323 & tclm(i,j-1,k+1,itrc)))
324 ELSE
325 dtde(i,j,k2)=cff*(t(i,j ,k+1,nrhs,itrc)- &
326 & t(i,j-1,k+1,nrhs,itrc))
327 END IF
328 tl_dtde(i,j,k2)=cff*(tl_t(i,j ,k+1,nrhs,itrc)- &
329 & tl_t(i,j-1,k+1,nrhs,itrc))
330#else
331 dtde(i,j,k2)=cff*(t(i,j ,k+1,nrhs,itrc)- &
332 & t(i,j-1,k+1,nrhs,itrc))
333 tl_dtde(i,j,k2)=cff*(tl_t(i,j ,k+1,nrhs,itrc)- &
334 & tl_t(i,j-1,k+1,nrhs,itrc))
335#endif
336 END DO
337 END DO
338 END IF
339 IF ((k.eq.0).or.(k.eq.n(ng))) THEN
340 DO j=jstr-1,jend+1
341 DO i=istr-1,iend+1
342 dtdr(i,j,k2)=0.0_r8
343 tl_dtdr(i,j,k2)=0.0_r8
344 fs(i,j,k2)=0.0_r8
345 tl_fs(i,j,k2)=0.0_r8
346 END DO
347 END DO
348 ELSE
349 DO j=jstr-1,jend+1
350 DO i=istr-1,iend+1
351#if defined TS_MIX_MAX_SLOPE
352 cff1=sqrt(drdx(i,j,k2)**2+drdx(i+1,j,k2)**2+ &
353 & drdx(i,j,k1)**2+drdx(i+1,j,k1)**2+ &
354 & drde(i,j,k2)**2+drde(i,j+1,k2)**2+ &
355 & drde(i,j,k1)**2+drde(i,j+1,k1)**2)
356 IF (cff1.ne.0.0_r8) THEN
357 tl_cff1=(drdx(i ,j,k2)*tl_drdx(i ,j,k2)+ &
358 & drdx(i+1,j,k2)*tl_drdx(i+1,j,k2)+ &
359 & drdx(i ,j,k1)*tl_drdx(i ,j,k1)+ &
360 & drdx(i+1,j,k1)*tl_drdx(i+1,j,k1)+ &
361 & drde(i,j ,k2)*tl_drde(i,j ,k2)+ &
362 & drde(i,j+1,k2)*tl_drde(i,j+1,k2)+ &
363 & drde(i,j ,k1)*tl_drde(i,j ,k1)+ &
364 & drde(i,j+1,k1)*tl_drde(i,j+1,k1))/cff1
365 ELSE
366 tl_cff1=0.0_r8
367 END IF
368 cff2=0.25_r8*slope_max* &
369 & (z_r(i,j,k+1)-z_r(i,j,k))*cff1
370 tl_cff2=0.25_r8*slope_max* &
371 & ((tl_z_r(i,j,k+1)-tl_z_r(i,j,k))*cff1+ &
372 & (z_r(i,j,k+1)-z_r(i,j,k))*tl_cff1)- &
373# ifdef TL_IOMS
374 & cff2
375# endif
376 cff3=max(pden(i,j,k)-pden(i,j,k+1),small)
377 tl_cff3=(0.5_r8+sign(0.5_r8,pden(i,j,k)-pden(i,j,k+1)- &
378 & small))* &
379 & (tl_pden(i,j,k)-tl_pden(i,j,k+1))+ &
380# ifdef TL_IOMS
381 & (0.5_r8-sign(0.5_r8, &
382 & pden(i,j,k)-pden(i,j,k+1)-small))* &
383 & small
384# endif
385 cff4=max(cff2,cff3)
386 tl_cff4=(0.5_r8+sign(0.5_r8,cff2-cff3))*tl_cff2+ &
387 & (0.5_r8-sign(0.5_r8,cff2-cff3))*tl_cff3
388 cff=-1.0_r8/cff4
389 tl_cff=cff*cff*tl_cff4+ &
390# ifdef TL_IOMS
391 & 2.0_r8*cff
392# endif
393#elif defined TS_MIX_MIN_STRAT
394 cff1=max(pden(i,j,k)-pden(i,j,k+1), &
395 & strat_min*(z_r(i,j,k+1)-z_r(i,j,k)))
396 tl_cff1=(0.5_r8+sign(0.5_r8, &
397 & pden(i,j,k)-pden(i,j,k+1)- &
398 & strat_min*(z_r(i,j,k+1)- &
399 & z_r(i,j,k ))))* &
400 & (tl_pden(i,j,k)-tl_pden(i,j,k+1))+ &
401 & (0.5_r8-sign(0.5_r8, &
402 & pden(i,j,k)-pden(i,j,k+1)- &
403 & strat_min*(z_r(i,j,k+1)- &
404 & z_r(i,j,k ))))* &
405 & (strat_min*(tl_z_r(i,j,k+1)-tl_z_r(i,j,k )))
406 cff=-1.0_r8/cff1
407 tl_cff=cff*cff*tl_cff1+ &
408# ifdef TL_IOMS
409 & 2.0_r8*cff
410# endif
411#else
412 cff1=max(pden(i,j,k)-pden(i,j,k+1),eps)
413 tl_cff1=(0.5_r8+sign(0.5_r8, &
414 & pden(i,j,k)-pden(i,j,k+1)-eps))* &
415 & (tl_pden(i,j,k)-tl_pden(i,j,k+1))+ &
416# ifdef TL_IOMS
417 & (0.5_r8- &
418 & sign(0.5_r8,pden(i,j,k)-pden(i,j,k+1)-eps))*eps
419# endif
420 cff=-1.0_r8/cff1
421 tl_cff=cff*cff*tl_cff1+ &
422# ifdef TL_IOMS
423 & 2.0_r8*cff
424# endif
425#endif
426#if defined TS_MIX_STABILITY
427 dtdr(i,j,k2)=cff*(0.75_r8*(t(i,j,k+1,nrhs,itrc)- &
428 & t(i,j,k ,nrhs,itrc))+ &
429 & 0.25_r8*(t(i,j,k+1,nstp,itrc)- &
430 & t(i,j,k ,nstp,itrc)))
431 tl_dtdr(i,j,k2)=tl_cff* &
432 & (0.75_r8*(t(i,j,k+1,nrhs,itrc)- &
433 & t(i,j,k ,nrhs,itrc))+ &
434 & 0.25_r8*(t(i,j,k+1,nstp,itrc)- &
435 & t(i,j,k ,nstp,itrc)))+ &
436 & cff* &
437 & (0.75_r8*(tl_t(i,j,k+1,nrhs,itrc)- &
438 & tl_t(i,j,k ,nrhs,itrc))+ &
439 & 0.25_r8*(tl_t(i,j,k+1,nstp,itrc)- &
440 & tl_t(i,j,k ,nstp,itrc)))- &
441# ifdef TL_IOMS
442 & dtdr(i,j,k2)
443# endif
444#elif defined TS_MIX_CLIMA
445 IF (ltracerclm(itrc,ng)) THEN
446 dtdr(i,j,k2)=cff*((t(i,j,k+1,nrhs,itrc)- &
447 & tclm(i,j,k+1,itrc))- &
448 & (t(i,j,k ,nrhs,itrc)- &
449 & tclm(i,j,k ,itrc)))
450 tl_dtdr(i,j,k2)=tl_cff*((t(i,j,k+1,nrhs,itrc)- &
451 & tclm(i,j,k+1,itrc))- &
452 & (t(i,j,k ,nrhs,itrc)- &
453 & tclm(i,j,k ,itrc)))+ &
454 & cff*(tl_t(i,j,k+1,nrhs,itrc)- &
455 & tl_t(i,j,k ,nrhs,itrc))- &
456# ifdef TL_IOMS
457 & dtdr(i,j,k2)
458# endif
459 ELSE
460 dtdr(i,j,k2)=cff*(t(i,j,k+1,nrhs,itrc)- &
461 & t(i,j,k ,nrhs,itrc))
462 tl_dtdr(i,j,k2)=tl_cff*(t(i,j,k+1,nrhs,itrc)- &
463 & t(i,j,k ,nrhs,itrc))+ &
464 & cff*(tl_t(i,j,k+1,nrhs,itrc)- &
465 & tl_t(i,j,k ,nrhs,itrc))- &
466# ifdef TL_IOMS
467 & dtdr(i,j,k2)
468# endif
469 END IF
470#else
471 dtdr(i,j,k2)=cff*(t(i,j,k+1,nrhs,itrc)- &
472 & t(i,j,k ,nrhs,itrc))
473 tl_dtdr(i,j,k2)=tl_cff*(t(i,j,k+1,nrhs,itrc)- &
474 & t(i,j,k ,nrhs,itrc))+ &
475 & cff*(tl_t(i,j,k+1,nrhs,itrc)- &
476 & tl_t(i,j,k ,nrhs,itrc))- &
477# ifdef TL_IOMS
478 & dtdr(i,j,k2)
479# endif
480#endif
481 fs(i,j,k2)=cff*(z_r(i,j,k+1)-z_r(i,j,k))
482 tl_fs(i,j,k2)=tl_cff*(z_r(i,j,k+1)-z_r(i,j,k))+ &
483 & cff*(tl_z_r(i,j,k+1)-tl_z_r(i,j,k))- &
484#ifdef TL_IOMS
485 & fs(i,j,k2)
486#endif
487 END DO
488 END DO
489 END IF
490!
491! Compute components of the rotated tracer flux (T m4/s) along
492! isopycnic surfaces.
493!
494 IF (k.gt.0) THEN
495 DO j=jstr,jend
496 DO i=istr,iend+1
497#ifdef DIFF_3DCOEF
498 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i-1,j,k))* &
499 & on_u(i,j)
500#else
501 cff=0.25_r8*(diff2(i,j,itrc)+diff2(i-1,j,itrc))* &
502 & on_u(i,j)
503#endif
504!^ FX(i,j)=cff* &
505!^ & (Hz(i,j,k)+Hz(i-1,j,k))* &
506!^ & (dTdx(i,j,k1)- &
507!^ & 0.5_r8*(MAX(dRdx(i,j,k1),0.0_r8)* &
508!^ & (dTdr(i-1,j,k1)+ &
509!^ & dTdr(i ,j,k2))+ &
510!^ & MIN(dRdx(i,j,k1),0.0_r8)* &
511!^ & (dTdr(i-1,j,k2)+ &
512!^ & dTdr(i,j,k1))))
513!^
514 tl_fx(i,j)=cff* &
515 & (((tl_hz(i,j,k)+tl_hz(i-1,j,k))* &
516 & (dtdx(i,j,k1)- &
517 & 0.5_r8*(max(drdx(i,j,k1),0.0_r8)* &
518 & (dtdr(i-1,j,k1)+ &
519 & dtdr(i ,j,k2))+ &
520 & min(drdx(i,j,k1),0.0_r8)* &
521 & (dtdr(i-1,j,k2)+ &
522 & dtdr(i ,j,k1)))))+ &
523 & ((hz(i,j,k)+hz(i-1,j,k))* &
524 & (tl_dtdx(i,j,k1)- &
525 & 0.5_r8*(max(drdx(i,j,k1),0.0_r8)* &
526 & (tl_dtdr(i-1,j,k1)+ &
527 & tl_dtdr(i ,j,k2))+ &
528 & min(drdx(i,j,k1),0.0_r8)* &
529 & (tl_dtdr(i-1,j,k2)+ &
530 & tl_dtdr(i ,j,k1)))- &
531 & 0.5_r8*((0.5_r8+ &
532 & sign(0.5_r8, drdx(i,j,k1)))* &
533 & tl_drdx(i,j,k1)* &
534 & (dtdr(i-1,j,k1)+dtdr(i,j,k2))+ &
535 & (0.5_r8+ &
536 & sign(0.5_r8,-drdx(i,j,k1)))* &
537 & tl_drdx(i,j,k1)* &
538 & (dtdr(i-1,j,k2)+dtdr(i,j,k1))))))-&
539#ifdef TL_IOMS
540 & cff* &
541 & (hz(i,j,k)+hz(i-1,j,k))* &
542 & (dtdx(i,j,k1)- &
543 & (max(drdx(i,j,k1),0.0_r8)* &
544 & (dtdr(i-1,j,k1)+ &
545 & dtdr(i ,j,k2))+ &
546 & min(drdx(i,j,k1),0.0_r8)* &
547 & (dtdr(i-1,j,k2)+ &
548 & dtdr(i,j,k1))))
549#endif
550 END DO
551 END DO
552 DO j=jstr,jend+1
553 DO i=istr,iend
554#ifdef DIFF_3DCOEF
555 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i,j-1,k))* &
556 & om_v(i,j)
557#else
558 cff=0.25_r8*(diff2(i,j,itrc)+diff2(i,j-1,itrc))* &
559 & om_v(i,j)
560#endif
561!^ FE(i,j)=cff* &
562!^ & (Hz(i,j,k)+Hz(i,j-1,k))* &
563!^ & (dTde(i,j,k1)- &
564!^ & 0.5_r8*(MAX(dRde(i,j,k1),0.0_r8)* &
565!^ & (dTdr(i,j-1,k1)+ &
566!^ & dTdr(i,j ,k2))+ &
567!^ & MIN(dRde(i,j,k1),0.0_r8)* &
568!^ & (dTdr(i,j-1,k2)+ &
569!^ & dTdr(i,j ,k1))))
570!^
571 tl_fe(i,j)=cff* &
572 & (((tl_hz(i,j,k)+tl_hz(i,j-1,k))* &
573 & (dtde(i,j,k1)- &
574 & 0.5_r8*(max(drde(i,j,k1),0.0_r8)* &
575 & (dtdr(i,j-1,k1)+ &
576 & dtdr(i,j ,k2))+ &
577 & min(drde(i,j,k1),0.0_r8)* &
578 & (dtdr(i,j-1,k2)+ &
579 & dtdr(i,j ,k1)))))+ &
580 & ((hz(i,j,k)+hz(i,j-1,k))* &
581 & (tl_dtde(i,j,k1)- &
582 & 0.5_r8*(max(drde(i,j,k1),0.0_r8)* &
583 & (tl_dtdr(i,j-1,k1)+ &
584 & tl_dtdr(i,j ,k2))+ &
585 & min(drde(i,j,k1),0.0_r8)* &
586 & (tl_dtdr(i,j-1,k2)+ &
587 & tl_dtdr(i,j ,k1)))- &
588 & 0.5_r8*((0.5_r8+ &
589 & sign(0.5_r8, drde(i,j,k1)))* &
590 & tl_drde(i,j,k1)* &
591 & (dtdr(i,j-1,k1)+dtdr(i,j,k2))+ &
592 & (0.5_r8+ &
593 & sign(0.5_r8,-drde(i,j,k1)))* &
594 & tl_drde(i,j,k1)* &
595 & (dtdr(i,j-1,k2)+dtdr(i,j,k1))))))-&
596#ifdef TL_IOMS
597 & cff* &
598 & (hz(i,j,k)+hz(i,j-1,k))* &
599 & (dtde(i,j,k1)- &
600 & (max(drde(i,j,k1),0.0_r8)* &
601 & (dtdr(i,j-1,k1)+ &
602 & dtdr(i,j ,k2))+ &
603 & min(drde(i,j,k1),0.0_r8)* &
604 & (dtdr(i,j-1,k2)+ &
605 & dtdr(i,j ,k1))))
606#endif
607 END DO
608 END DO
609 IF (k.lt.n(ng)) THEN
610 DO j=jstr,jend
611 DO i=istr,iend
612 cff1=max(drdx(i ,j,k1),0.0_r8)
613 cff2=max(drdx(i+1,j,k2),0.0_r8)
614 cff3=min(drdx(i ,j,k2),0.0_r8)
615 cff4=min(drdx(i+1,j,k1),0.0_r8)
616 tl_cff1=(0.5_r8+sign(0.5_r8, drdx(i ,j,k1)))* &
617 & tl_drdx(i ,j,k1)
618 tl_cff2=(0.5_r8+sign(0.5_r8, drdx(i+1,j,k2)))* &
619 & tl_drdx(i+1,j,k2)
620 tl_cff3=(0.5_r8+sign(0.5_r8,-drdx(i ,j,k2)))* &
621 & tl_drdx(i ,j,k2)
622 tl_cff4=(0.5_r8+sign(0.5_r8,-drdx(i+1,j,k1)))* &
623 & tl_drdx(i+1,j,k1)
624 cff=cff1*(cff1*dtdr(i,j,k2)-dtdx(i ,j,k1))+ &
625 & cff2*(cff2*dtdr(i,j,k2)-dtdx(i+1,j,k2))+ &
626 & cff3*(cff3*dtdr(i,j,k2)-dtdx(i ,j,k2))+ &
627 & cff4*(cff4*dtdr(i,j,k2)-dtdx(i+1,j,k1))
628 tl_cff=tl_cff1*(cff1*dtdr(i ,j,k2)- &
629 & dtdx(i ,j,k1))+ &
630 & tl_cff2*(cff2*dtdr(i,j,k2)- &
631 & dtdx(i+1,j,k2))+ &
632 & tl_cff3*(cff3*dtdr(i,j,k2)- &
633 & dtdx(i ,j,k2))+ &
634 & tl_cff4*(cff4*dtdr(i,j,k2)- &
635 & dtdx(i+1,j,k1))+ &
636 & cff1*(tl_cff1*dtdr(i,j,k2)+ &
637 & cff1*tl_dtdr(i,j,k2)- &
638 & tl_dtdx(i ,j,k1))+ &
639 & cff2*(tl_cff2*dtdr(i,j,k2)+ &
640 & cff2*tl_dtdr(i,j,k2)- &
641 & tl_dtdx(i+1,j,k2))+ &
642 & cff3*(tl_cff3*dtdr(i,j,k2)+ &
643 & cff3*tl_dtdr(i,j,k2)- &
644 & tl_dtdx(i ,j,k2))+ &
645 & cff4*(tl_cff4*dtdr(i,j,k2)+ &
646 & cff4*tl_dtdr(i,j,k2)- &
647 & tl_dtdx(i+1,j,k1))- &
648#ifdef TL_IOMS
649 & cff1*(2.0_r8*cff1*dtdr(i,j,k2)- &
650 & dtdx(i,j,k1))- &
651 & cff2*(2.0_r8*cff2*dtdr(i ,j,k2)- &
652 & dtdx(i+1,j,k2))- &
653 & cff3*(2.0_r8*cff3*dtdr(i,j,k2)- &
654 & dtdx(i,j,k2))- &
655 & cff4*(2.0_r8*cff4*dtdr(i ,j,k2)- &
656 & dtdx(i+1,j,k1))
657#endif
658 cff1=max(drde(i,j ,k1),0.0_r8)
659 cff2=max(drde(i,j+1,k2),0.0_r8)
660 cff3=min(drde(i,j ,k2),0.0_r8)
661 cff4=min(drde(i,j+1,k1),0.0_r8)
662 tl_cff1=(0.5_r8+sign(0.5_r8, drde(i,j ,k1)))* &
663 & tl_drde(i,j ,k1)
664 tl_cff2=(0.5_r8+sign(0.5_r8, drde(i,j+1,k2)))* &
665 & tl_drde(i,j+1,k2)
666 tl_cff3=(0.5_r8+sign(0.5_r8,-drde(i,j ,k2)))* &
667 & tl_drde(i,j ,k2)
668 tl_cff4=(0.5_r8+sign(0.5_r8,-drde(i,j+1,k1)))* &
669 & tl_drde(i,j+1,k1)
670 cff=cff+ &
671 & cff1*(cff1*dtdr(i,j,k2)-dtde(i,j ,k1))+ &
672 & cff2*(cff2*dtdr(i,j,k2)-dtde(i,j+1,k2))+ &
673 & cff3*(cff3*dtdr(i,j,k2)-dtde(i,j ,k2))+ &
674 & cff4*(cff4*dtdr(i,j,k2)-dtde(i,j+1,k1))
675 tl_cff=tl_cff+ &
676 & tl_cff1*(cff1*dtdr(i,j,k2)- &
677 & dtde(i,j ,k1))+ &
678 & tl_cff2*(cff2*dtdr(i,j,k2)- &
679 & dtde(i,j+1,k2))+ &
680 & tl_cff3*(cff3*dtdr(i,j,k2)- &
681 & dtde(i,j ,k2))+ &
682 & tl_cff4*(cff4*dtdr(i,j,k2)- &
683 & dtde(i,j+1,k1))+ &
684 & cff1*(tl_cff1*dtdr(i,j,k2)+ &
685 & cff1*tl_dtdr(i,j,k2)- &
686 & tl_dtde(i,j ,k1))+ &
687 & cff2*(tl_cff2*dtdr(i,j,k2)+ &
688 & cff2*tl_dtdr(i,j,k2)- &
689 & tl_dtde(i,j+1,k2))+ &
690 & cff3*(tl_cff3*dtdr(i,j,k2)+ &
691 & cff3*tl_dtdr(i,j,k2)- &
692 & tl_dtde(i,j ,k2))+ &
693 & cff4*(tl_cff4*dtdr(i,j,k2)+ &
694 & cff4*tl_dtdr(i,j,k2)- &
695 & tl_dtde(i,j+1,k1))- &
696#ifdef TL_IOMS
697 & cff1*(2.0_r8*cff1*dtdr(i,j,k2)- &
698 & dtde(i,j,k1))- &
699 & cff2*(2.0_r8*cff2*dtdr(i,j ,k2)- &
700 & dtde(i,j+1,k2))- &
701 & cff3*(2.0_r8*cff3*dtdr(i,j,k2)- &
702 & dtde(i,j,k2))- &
703 & cff4*(2.0_r8*cff4*dtdr(i,j ,k2)- &
704 & dtde(i,j+1,k1))
705#endif
706#ifdef DIFF_3DCOEF
707!^ FS(i,j,k2)=0.5_r8*cff*diff3d_r(i,j,k)*FS(i,j,k2)
708!^
709 tl_fs(i,j,k2)=0.5_r8*diff3d_r(i,j,k)* &
710 & (tl_cff*fs(i,j,k2)+ &
711 & cff*tl_fs(i,j,k2))- &
712# ifdef TL_IOMS
713 & 0.5_r8*diff3d_r(i,j,k)*cff*fs(i,j,k2)
714# endif
715#else
716!^ FS(i,j,k2)=0.5_r8*cff*diff2(i,j,itrc)*FS(i,j,k2)
717!^
718 tl_fs(i,j,k2)=0.5_r8*diff2(i,j,itrc)* &
719 & (tl_cff*fs(i,j,k2)+ &
720 & cff*tl_fs(i,j,k2))- &
721# ifdef TL_IOMS
722 & 0.5_r8*diff2(i,j,itrc)*cff*fs(i,j,k2)
723# endif
724#endif
725 END DO
726 END DO
727 END IF
728!
729! Time-step harmonic, isopycnic diffusion term (m Tunits).
730!
731 DO j=jstr,jend
732 DO i=istr,iend
733!^ cff=dt(ng)*pm(i,j)*pn(i,j)* &
734!^ & (FX(i+1,j)-FX(i,j)+ &
735!^ & FE(i,j+1)-FE(i,j))+ &
736!^ & dt(ng)*(FS(i,j,k2)-FS(i,j,k1))
737!^
738 tl_cff=dt(ng)*pm(i,j)*pn(i,j)* &
739 & (tl_fx(i+1,j)-tl_fx(i,j)+ &
740 & tl_fe(i,j+1)-tl_fe(i,j))+ &
741 & dt(ng)*(tl_fs(i,j,k2)-tl_fs(i,j,k1))
742!^ t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)+cff
743!^
744 tl_t(i,j,k,nnew,itrc)=tl_t(i,j,k,nnew,itrc)+tl_cff
745#ifdef DIAGNOSTICS_TS
746!! DiaTwrk(i,j,k,itrc,iThdif)=cff
747#endif
748 END DO
749 END DO
750 END IF
751 END DO k_loop
752 END DO t_loop
753!
754 RETURN

References mod_scalars::dt, and mod_scalars::ltracerclm.

◆ rp_t3dmix2_s_tile()

subroutine rp_t3dmix2_mod::rp_t3dmix2_s_tile ( integer, intent(in) ng,
integer, intent(in) tile,
integer, intent(in) lbi,
integer, intent(in) ubi,
integer, intent(in) lbj,
integer, intent(in) ubj,
integer, intent(in) imins,
integer, intent(in) imaxs,
integer, intent(in) jmins,
integer, intent(in) jmaxs,
integer, intent(in) nrhs,
integer, intent(in) nstp,
integer, intent(in) nnew,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) umask,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) vmask,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) umask_wet,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) vmask_wet,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) hz,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) tl_hz,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) pmon_u,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) pnom_v,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) pm,
real(r8), dimension(lbi:ubi,lbj:ubj), intent(in) pn,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng)), intent(in) diff3d_r,
real(r8), dimension(lbi:ubi,lbj:ubj,nt(ng)), intent(in) diff2,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng),nt(ng)), intent(in) tclm,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng),3,nt(ng)), intent(in) t,
real(r8), dimension(lbi:ubi,lbj:ubj,n(ng),3,nt(ng)), intent(inout) tl_t )
private

Definition at line 93 of file rp_t3dmix2_s.h.

117!***********************************************************************
118!
119 USE mod_param
120 USE mod_scalars
121!
122! Imported variable declarations.
123!
124 integer, intent(in) :: ng, tile
125 integer, intent(in) :: LBi, UBi, LBj, UBj
126 integer, intent(in) :: IminS, ImaxS, JminS, JmaxS
127 integer, intent(in) :: nrhs, nstp, nnew
128
129#ifdef ASSUMED_SHAPE
130# ifdef MASKING
131 real(r8), intent(in) :: umask(LBi:,LBj:)
132 real(r8), intent(in) :: vmask(LBi:,LBj:)
133# endif
134# ifdef WET_DRY_NOT_YET
135 real(r8), intent(in) :: umask_wet(LBi:,LBj:)
136 real(r8), intent(in) :: vmask_wet(LBi:,LBj:)
137# endif
138# ifdef DIFF_3DCOEF
139 real(r8), intent(in) :: diff3d_r(LBi:,LBj:,:)
140# else
141 real(r8), intent(in) :: diff2(LBi:,LBj:,:)
142# endif
143 real(r8), intent(in) :: Hz(LBi:,LBj:,:)
144 real(r8), intent(in) :: tl_Hz(LBi:,LBj:,:)
145 real(r8), intent(in) :: pmon_u(LBi:,LBj:)
146 real(r8), intent(in) :: pnom_v(LBi:,LBj:)
147 real(r8), intent(in) :: pm(LBi:,LBj:)
148 real(r8), intent(in) :: pn(LBi:,LBj:)
149# ifdef TS_MIX_CLIMA
150 real(r8), intent(in) :: tclm(LBi:,LBj:,:,:)
151# endif
152# ifdef DIAGNOSTICS_TS
153!! real(r8), intent(inout) :: DiaTwrk(LBi:,LBj:,:,:,:)
154# endif
155 real(r8), intent(in) :: t(LBi:,LBj:,:,:,:)
156
157 real(r8), intent(inout) :: tl_t(LBi:,LBj:,:,:,:)
158#else
159# ifdef MASKING
160 real(r8), intent(in) :: umask(LBi:UBi,LBj:UBj)
161 real(r8), intent(in) :: vmask(LBi:UBi,LBj:UBj)
162# endif
163# ifdef WET_DRY_NOT_YET
164 real(r8), intent(in) :: umask_wet(LBi:UBi,LBj:UBj)
165 real(r8), intent(in) :: vmask_wet(LBi:UBi,LBj:UBj)
166# endif
167# ifdef DIFF_3DCOEF
168 real(r8), intent(in) :: diff3d_r(LBi:UBi,LBj:UBj,N(ng))
169# else
170 real(r8), intent(in) :: diff2(LBi:UBi,LBj:UBj,NT(ng))
171# endif
172 real(r8), intent(in) :: Hz(LBi:UBi,LBj:UBj,N(ng))
173 real(r8), intent(in) :: tl_Hz(LBi:UBi,LBj:UBj,N(ng))
174 real(r8), intent(in) :: pmon_u(LBi:UBi,LBj:UBj)
175 real(r8), intent(in) :: pnom_v(LBi:UBi,LBj:UBj)
176 real(r8), intent(in) :: pm(LBi:UBi,LBj:UBj)
177 real(r8), intent(in) :: pn(LBi:UBi,LBj:UBj)
178# ifdef TS_MIX_CLIMA
179 real(r8), intent(in) :: tclm(LBi:UBi,LBj:UBj,N(ng),NT(ng))
180# endif
181# ifdef DIAGNOSTICS_TS
182!! real(r8), intent(inout) :: DiaTwrk(LBi:UBi,LBj:UBj,N(ng),NT(ng), &
183!! & NDT)
184# endif
185 real(r8), intent(in) :: t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
186
187 real(r8), intent(inout) :: tl_t(LBi:UBi,LBj:UBj,N(ng),3,NT(ng))
188#endif
189!
190! Local variable declarations.
191!
192 integer :: i, itrc, j, k
193
194 real(r8) :: cff, cff1, tl_cff, tl_cff1
195
196 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: tl_FE
197 real(r8), dimension(IminS:ImaxS,JminS:JmaxS) :: tl_FX
198
199#include "set_bounds.h"
200!
201!-----------------------------------------------------------------------
202! Compute tangent linear horizontal harmonic diffusion along constant
203! S-surfaces.
204!-----------------------------------------------------------------------
205!
206 DO itrc=1,nt(ng)
207 DO k=1,n(ng)
208!
209! Compute XI- and ETA-components of diffusive tracer flux (T m3/s).
210!
211 DO j=jstr,jend
212 DO i=istr,iend+1
213#ifdef DIFF_3DCOEF
214 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i-1,j,k))* &
215 & pmon_u(i,j)
216#else
217 cff=0.25_r8*(diff2(i,j,itrc)+diff2(i-1,j,itrc))* &
218 & pmon_u(i,j)
219#endif
220#if defined TS_MIX_STABILITY
221!^ FX(i,j)=cff* &
222!^ & (Hz(i,j,k)+Hz(i-1,j,k))* &
223!^ & (0.75_r8*(t(i ,j,k,nrhs,itrc)- &
224!^ & t(i-1,j,k,nrhs,itrc))+ &
225!^ & 0.25_r8*(t(i ,j,k,nstp,itrc)- &
226!^ & t(i-1,j,k,nstp,itrc)))
227!^
228 tl_fx(i,j)=cff* &
229 & ((tl_hz(i,j,k)+tl_hz(i-1,j,k))* &
230 & (0.75_r8*(t(i ,j,k,nrhs,itrc)- &
231 & t(i-1,j,k,nrhs,itrc))+ &
232 & 0.25_r8*(t(i ,j,k,nstp,itrc)- &
233 & t(i-1,j,k,nstp,itrc)))+ &
234 & (hz(i,j,k)+hz(i-1,j,k))* &
235 & (0.75_r8*(tl_t(i ,j,k,nrhs,itrc)- &
236 & tl_t(i-1,j,k,nrhs,itrc))+ &
237 & 0.25_r8*(tl_t(i ,j,k,nstp,itrc)- &
238 & tl_t(i-1,j,k,nstp,itrc))))- &
239# ifdef TL_IOMS
240 & cff* &
241 & (hz(i,j,k)+hz(i-1,j,k))* &
242 & (0.75_r8*(t(i ,j,k,nrhs,itrc)- &
243 & t(i-1,j,k,nrhs,itrc))+ &
244 & 0.25_r8*(t(i ,j,k,nstp,itrc)- &
245 & t(i-1,j,k,nstp,itrc)))
246# endif
247#elif defined TS_MIX_CLIMA
248 IF (ltracerclm(itrc,ng)) THEN
249!^ FX(i,j)=cff* &
250!^ & (Hz(i,j,k)+Hz(i-1,j,k))* &
251!^ & ((t(i ,j,k,nrhs,itrc)-tclm(i ,j,k,itrc))- &
252!^ & (t(i-1,j,k,nrhs,itrc)-tclm(i-1,j,k,itrc)))
253!^
254 tl_fx(i,j)=cff* &
255 & ((tl_hz(i,j,k)+tl_hz(i-1,j,k))* &
256 & ((t(i ,j,k,nrhs,itrc)- &
257 & tclm(i ,j,k,itrc))- &
258 & (t(i-1,j,k,nrhs,itrc)- &
259 & tclm(i-1,j,k,itrc)))+ &
260 & (hz(i,j,k)+hz(i-1,j,k))* &
261 & (tl_t(i ,j,k,nrhs,itrc)- &
262 & tl_t(i-1,j,k,nrhs,itrc)))- &
263# ifdef TL_IOMS
264 & cff* &
265 & (hz(i,j,k)+hz(i-1,j,k))* &
266 & ((t(i ,j,k,nrhs,itrc)-tclm(i ,j,k,itrc))- &
267 & (t(i-1,j,k,nrhs,itrc)-tclm(i-1,j,k,itrc)))
268# endif
269 ELSE
270!^ FX(i,j)=cff* &
271!^ & (Hz(i,j,k)+Hz(i-1,j,k))* &
272!^ & (t(i,j,k,nrhs,itrc)-t(i-1,j,k,nrhs,itrc))
273!^
274 tl_fx(i,j)=cff* &
275 & ((tl_hz(i,j,k)+tl_hz(i-1,j,k))* &
276 & (t(i ,j,k,nrhs,itrc)- &
277 & t(i-1,j,k,nrhs,itrc))+ &
278 & (hz(i,j,k)+hz(i-1,j,k))* &
279 & (tl_t(i ,j,k,nrhs,itrc)- &
280 & tl_t(i-1,j,k,nrhs,itrc)))- &
281# ifdef TL_IOMS
282 & cff* &
283 & (hz(i,j,k)+hz(i-1,j,k))* &
284 & (t(i,j,k,nrhs,itrc)-t(i-1,j,k,nrhs,itrc))
285# endif
286 END IF
287#else
288!^ FX(i,j)=cff* &
289!^ & (Hz(i,j,k)+Hz(i-1,j,k))* &
290!^ & (t(i,j,k,nrhs,itrc)-t(i-1,j,k,nrhs,itrc))
291!^
292 tl_fx(i,j)=cff* &
293 & ((tl_hz(i,j,k)+tl_hz(i-1,j,k))* &
294 & (t(i ,j,k,nrhs,itrc)- &
295 & t(i-1,j,k,nrhs,itrc))+ &
296 & (hz(i,j,k)+hz(i-1,j,k))* &
297 & (tl_t(i ,j,k,nrhs,itrc)- &
298 & tl_t(i-1,j,k,nrhs,itrc)))- &
299# ifdef TL_IOMS
300 & cff* &
301 & (hz(i,j,k)+hz(i-1,j,k))* &
302 & (t(i,j,k,nrhs,itrc)-t(i-1,j,k,nrhs,itrc))
303# endif
304#endif
305#ifdef MASKING
306!^ FX(i,j)=FX(i,j)*umask(i,j)
307!^
308 tl_fx(i,j)=tl_fx(i,j)*umask(i,j)
309#endif
310#ifdef WET_DRY_NOT_YET
311 fx(i,j)=fx(i,j)*umask_wet(i,j)
312#endif
313 END DO
314 END DO
315 DO j=jstr,jend+1
316 DO i=istr,iend
317#ifdef DIFF_3DCOEF
318 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i,j-1,k))* &
319 & pnom_v(i,j)
320#else
321 cff=0.25_r8*(diff2(i,j,itrc)+diff2(i,j-1,itrc))* &
322 & pnom_v(i,j)
323#endif
324#if defined TS_MIX_STABILITY
325!^ FE(i,j)=cff* &
326!^ & (Hz(i,j,k)+Hz(i,j-1,k))* &
327!^ & (0.75_r8*(t(i,j ,k,nrhs,itrc)- &
328!^ & t(i,j-1,k,nrhs,itrc))+ &
329!^ & 0.25_r8*(t(i,j ,k,nstp,itrc)- &
330!^ & t(i,j-1,k,nstp,itrc)))
331!^
332 tl_fe(i,j)=cff* &
333 & ((tl_hz(i,j,k)+tl_hz(i,j-1,k))* &
334 & (0.75_r8*(t(i,j ,k,nrhs,itrc)- &
335 & t(i,j-1,k,nrhs,itrc))+ &
336 & 0.25_r8*(t(i,j ,k,nstp,itrc)- &
337 & t(i,j-1,k,nstp,itrc)))+ &
338 & (hz(i,j,k)+hz(i,j-1,k))* &
339 & (0.75_r8*(tl_t(i,j ,k,nrhs,itrc)- &
340 & tl_t(i,j-1,k,nrhs,itrc))+ &
341 & 0.25_r8*(tl_t(i,j ,k,nstp,itrc)- &
342 & tl_t(i,j-1,k,nstp,itrc))))- &
343# ifdef TL_IOMS
344 & cff* &
345 & (hz(i,j,k)+hz(i,j-1,k))* &
346 & (0.75_r8*(t(i,j ,k,nrhs,itrc)- &
347 & t(i,j-1,k,nrhs,itrc))+ &
348 & 0.25_r8*(t(i,j ,k,nstp,itrc)- &
349 & t(i,j-1,k,nstp,itrc)))
350# endif
351#elif defined TS_MIX_CLIMA
352 IF (ltracerclm(itrc,ng)) THEN
353!^ FE(i,j)=cff* &
354!^ & (Hz(i,j,k)+Hz(i,j-1,k))* &
355!^ & ((t(i,j ,k,nrhs,itrc)-tclm(i,j ,k,itrc))- &
356!^ & (t(i,j-1,k,nrhs,itrc)-tclm(i,j-1,k,itrc)))
357!^
358 tl_fe(i,j)=cff* &
359 & ((tl_hz(i,j,k)+tl_hz(i,j-1,k))* &
360 & ((t(i,j ,k,nrhs,itrc)- &
361 & tclm(i,j ,k,itrc))- &
362 & (t(i,j-1,k,nrhs,itrc)- &
363 & tclm(i,j-1,k,itrc)))+ &
364 & (hz(i,j,k)+hz(i,j-1,k))* &
365 & (tl_t(i,j ,k,nrhs,itrc)- &
366 & tl_t(i,j-1,k,nrhs,itrc)))- &
367# ifdef TL_IOMS
368 & cff* &
369 & (hz(i,j,k)+hz(i,j-1,k))* &
370 & ((t(i,j ,k,nrhs,itrc)-tclm(i,j ,k,itrc))- &
371 & (t(i,j-1,k,nrhs,itrc)-tclm(i,j-1,k,itrc)))
372# endif
373 ELSE
374!^ FE(i,j)=cff* &
375!^ & (Hz(i,j,k)+Hz(i,j-1,k))* &
376!^ & (t(i,j,k,nrhs,itrc)-t(i,j-1,k,nrhs,itrc))
377!^
378 tl_fe(i,j)=cff* &
379 & ((tl_hz(i,j,k)+tl_hz(i,j-1,k))* &
380 & (t(i,j ,k,nrhs,itrc)- &
381 & t(i,j-1,k,nrhs,itrc))+ &
382 & (hz(i,j,k)+hz(i,j-1,k))* &
383 & (tl_t(i,j ,k,nrhs,itrc)- &
384 & tl_t(i,j-1,k,nrhs,itrc)))- &
385# ifdef TL_IOMS
386 & cff* &
387 & (hz(i,j,k)+hz(i,j-1,k))* &
388 & (t(i,j,k,nrhs,itrc)-t(i,j-1,k,nrhs,itrc))
389# endif
390 END IF
391#else
392!^ FE(i,j)=cff* &
393!^ & (Hz(i,j,k)+Hz(i,j-1,k))* &
394!^ & (t(i,j,k,nrhs,itrc)-t(i,j-1,k,nrhs,itrc))
395!^
396 tl_fe(i,j)=cff* &
397 & ((tl_hz(i,j,k)+tl_hz(i,j-1,k))* &
398 & (t(i,j ,k,nrhs,itrc)- &
399 & t(i,j-1,k,nrhs,itrc))+ &
400 & (hz(i,j,k)+hz(i,j-1,k))* &
401 & (tl_t(i,j ,k,nrhs,itrc)- &
402 & tl_t(i,j-1,k,nrhs,itrc)))- &
403# ifdef TL_IOMS
404 & cff* &
405 & (hz(i,j,k)+hz(i,j-1,k))* &
406 & (t(i,j,k,nrhs,itrc)-t(i,j-1,k,nrhs,itrc))
407# endif
408#endif
409#ifdef MASKING
410!^ FE(i,j)=FE(i,j)*vmask(i,j)
411!^
412 tl_fe(i,j)=tl_fe(i,j)*vmask(i,j)
413#endif
414#ifdef WET_DRY_NOT_YET
415 fe(i,j)=fe(i,j)*vmask_wet(i,j)
416#endif
417 END DO
418 END DO
419!
420! Time-step harmonic, S-surfaces diffusion term (m Tunits).
421!
422 DO j=jstr,jend
423 DO i=istr,iend
424!^ cff=dt(ng)*pm(i,j)*pn(i,j)* &
425!^ & (FX(i+1,j)-FX(i,j)+ &
426!^ & FE(i,j+1)-FE(i,j))
427!^
428 tl_cff=dt(ng)*pm(i,j)*pn(i,j)* &
429 & (tl_fx(i+1,j)-tl_fx(i,j)+ &
430 & tl_fe(i,j+1)-tl_fe(i,j))
431!^ t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)+cff
432!^
433 tl_t(i,j,k,nnew,itrc)=tl_t(i,j,k,nnew,itrc)+tl_cff
434#ifdef DIAGNOSTICS_TS
435!! DiaTwrk(i,j,k,itrc,iThdif)=cff
436#endif
437 END DO
438 END DO
439 END DO
440 END DO
441!
442 RETURN

References mod_scalars::dt, and mod_scalars::ltracerclm.