ROMS
Loading...
Searching...
No Matches
tl_t3dmix2_iso.h
Go to the documentation of this file.
1 MODULE tl_t3dmix2_mod
2!
3!git $Id$
4!================================================== Hernan G. Arango ===
5! Copyright (c) 2002-2025 The ROMS Group Andrew M. Moore !
6! Licensed under a MIT/X style license !
7! See License_ROMS.md !
8!=======================================================================
9! !
10! This subroutine computes tangent linear horizontal harmonic mixing !
11! of tracers along isopycnic surfaces. !
12! !
13! BASIC STATE variables needed: diff2, Hz, rho, t, z_r !
14! !
15!=======================================================================
16!
17 implicit none
18!
19 PRIVATE
20 PUBLIC tl_t3dmix2
21!
22 CONTAINS
23!
24!***********************************************************************
25 SUBROUTINE tl_t3dmix2 (ng, tile)
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, itlm, 26, __line__, myfile)
53#endif
54 CALL tl_t3dmix2_iso_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 & ocean(ng) % pden, &
80 & ocean(ng) % tl_pden, &
81#ifdef TS_MIX_CLIMA
82 & clima(ng) % tclm, &
83#endif
84#ifdef DIAGNOSTICS_TS
85!! & DIAGS(ng) % DiaTwrk, &
86#endif
87 & ocean(ng) % t, &
88 & ocean(ng) % tl_t)
89#ifdef PROFILE
90 CALL wclock_off (ng, itlm, 26, __line__, myfile)
91#endif
92!
93 RETURN
94 END SUBROUTINE tl_t3dmix2
95!
96!***********************************************************************
97 SUBROUTINE tl_t3dmix2_iso_tile (ng, tile, &
98 & LBi, UBi, LBj, UBj, &
99 & IminS, ImaxS, JminS, JmaxS, &
100 & nrhs, nstp, nnew, &
101#ifdef MASKING
102 & umask, vmask, &
103#endif
104#ifdef WET_DRY_NOT_YET
105 & umask_wet, vmask_wet, &
106#endif
107 & om_v, on_u, pm, pn, &
108 & Hz, tl_Hz, &
109 & z_r, tl_z_r, &
110#ifdef DIFF_3DCOEF
111 & diff3d_r, &
112#else
113 & diff2, &
114#endif
115 & pden, tl_pden, &
116#ifdef TS_MIX_CLIMA
117 & tclm, &
118#endif
119#ifdef DIAGNOSTICS_TS
120!! & DiaTwrk, &
121#endif
122 & t, tl_t)
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) :: pden(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_pden(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 cff3=max(pden(i,j,k)-pden(i,j,k+1),small)
374 tl_cff3=(0.5_r8+sign(0.5_r8,pden(i,j,k)-pden(i,j,k+1)- &
375 & small))* &
376 & (tl_pden(i,j,k)-tl_pden(i,j,k+1))
377 cff4=max(cff2,cff3)
378 tl_cff4=(0.5_r8+sign(0.5_r8,cff2-cff3))*tl_cff2+ &
379 & (0.5_r8-sign(0.5_r8,cff2-cff3))*tl_cff3
380 cff=-1.0_r8/cff4
381 tl_cff=cff*cff*tl_cff4
382#elif defined TS_MIX_MIN_STRAT
383 cff1=max(pden(i,j,k)-pden(i,j,k+1), &
384 & strat_min*(z_r(i,j,k+1)-z_r(i,j,k)))
385 tl_cff1=(0.5_r8+sign(0.5_r8, &
386 & pden(i,j,k)-pden(i,j,k+1)- &
387 & strat_min*(z_r(i,j,k+1)- &
388 & z_r(i,j,k ))))* &
389 & (tl_pden(i,j,k)-tl_pden(i,j,k+1))+ &
390 & (0.5_r8-sign(0.5_r8, &
391 & pden(i,j,k)-pden(i,j,k+1)- &
392 & strat_min*(z_r(i,j,k+1)- &
393 & z_r(i,j,k ))))* &
394 & (strat_min*(tl_z_r(i,j,k+1)-tl_z_r(i,j,k )))
395 cff=-1.0_r8/cff1
396 tl_cff=cff*cff*tl_cff1
397#else
398 cff1=max(pden(i,j,k)-pden(i,j,k+1),eps)
399 tl_cff1=(0.5_r8+sign(0.5_r8, &
400 & pden(i,j,k)-pden(i,j,k+1)-eps))* &
401 & (tl_pden(i,j,k)-tl_pden(i,j,k+1))
402 cff=-1.0_r8/cff1
403 tl_cff=cff*cff*tl_cff1
404#endif
405#if defined TS_MIX_STABILITY
406 dtdr(i,j,k2)=cff*(0.75_r8*(t(i,j,k+1,nrhs,itrc)- &
407 & t(i,j,k ,nrhs,itrc))+ &
408 & 0.25_r8*(t(i,j,k+1,nstp,itrc)- &
409 & t(i,j,k ,nstp,itrc)))
410 tl_dtdr(i,j,k2)=tl_cff* &
411 & (0.75_r8*(t(i,j,k+1,nrhs,itrc)- &
412 & t(i,j,k ,nrhs,itrc))+ &
413 & 0.25_r8*(t(i,j,k+1,nstp,itrc)- &
414 & t(i,j,k ,nstp,itrc)))+ &
415 & cff* &
416 & (0.75_r8*(tl_t(i,j,k+1,nrhs,itrc)- &
417 & tl_t(i,j,k ,nrhs,itrc))+ &
418 & 0.25_r8*(tl_t(i,j,k+1,nstp,itrc)- &
419 & tl_t(i,j,k ,nstp,itrc)))
420#elif defined TS_MIX_CLIMA
421 IF (ltracerclm(itrc,ng)) THEN
422 dtdr(i,j,k2)=cff*((t(i,j,k+1,nrhs,itrc)- &
423 & tclm(i,j,k+1,itrc))- &
424 & (t(i,j,k ,nrhs,itrc)- &
425 & tclm(i,j,k ,itrc)))
426 tl_dtdr(i,j,k2)=tl_cff*((t(i,j,k+1,nrhs,itrc)- &
427 & tclm(i,j,k+1,itrc))- &
428 & (t(i,j,k ,nrhs,itrc)- &
429 & tclm(i,j,k ,itrc)))+ &
430 & cff*(tl_t(i,j,k+1,nrhs,itrc)- &
431 & tl_t(i,j,k ,nrhs,itrc))
432 ELSE
433 dtdr(i,j,k2)=cff*(t(i,j,k+1,nrhs,itrc)- &
434 & t(i,j,k ,nrhs,itrc))
435 tl_dtdr(i,j,k2)=tl_cff*(t(i,j,k+1,nrhs,itrc)- &
436 & t(i,j,k ,nrhs,itrc))+ &
437 & cff*(tl_t(i,j,k+1,nrhs,itrc)- &
438 & tl_t(i,j,k ,nrhs,itrc))
439 END IF
440#else
441 dtdr(i,j,k2)=cff*(t(i,j,k+1,nrhs,itrc)- &
442 & t(i,j,k ,nrhs,itrc))
443 tl_dtdr(i,j,k2)=tl_cff*(t(i,j,k+1,nrhs,itrc)- &
444 & t(i,j,k ,nrhs,itrc))+ &
445 & cff*(tl_t(i,j,k+1,nrhs,itrc)- &
446 & tl_t(i,j,k ,nrhs,itrc))
447#endif
448 fs(i,j,k2)=cff*(z_r(i,j,k+1)-z_r(i,j,k))
449 tl_fs(i,j,k2)=tl_cff*(z_r(i,j,k+1)-z_r(i,j,k))+ &
450 & cff*(tl_z_r(i,j,k+1)-tl_z_r(i,j,k))
451 END DO
452 END DO
453 END IF
454!
455! Compute components of the rotated tracer flux (T m4/s) along
456! isopycnic surfaces.
457!
458 IF (k.gt.0) THEN
459 DO j=jstr,jend
460 DO i=istr,iend+1
461#ifdef DIFF_3DCOEF
462 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i-1,j,k))* &
463 & on_u(i,j)
464#else
465 cff=0.25_r8*(diff2(i,j,itrc)+diff2(i-1,j,itrc))* &
466 & on_u(i,j)
467#endif
468!^ FX(i,j)=cff* &
469!^ & (Hz(i,j,k)+Hz(i-1,j,k))* &
470!^ & (dTdx(i,j,k1)- &
471!^ & 0.5_r8*(MAX(dRdx(i,j,k1),0.0_r8)* &
472!^ & (dTdr(i-1,j,k1)+ &
473!^ & dTdr(i ,j,k2))+ &
474!^ & MIN(dRdx(i,j,k1),0.0_r8)* &
475!^ & (dTdr(i-1,j,k2)+ &
476!^ & dTdr(i,j,k1))))
477!^
478 tl_fx(i,j)=cff* &
479 & (((tl_hz(i,j,k)+tl_hz(i-1,j,k))* &
480 & (dtdx(i,j,k1)- &
481 & 0.5_r8*(max(drdx(i,j,k1),0.0_r8)* &
482 & (dtdr(i-1,j,k1)+ &
483 & dtdr(i ,j,k2))+ &
484 & min(drdx(i,j,k1),0.0_r8)* &
485 & (dtdr(i-1,j,k2)+ &
486 & dtdr(i ,j,k1)))))+ &
487 & ((hz(i,j,k)+hz(i-1,j,k))* &
488 & (tl_dtdx(i,j,k1)- &
489 & 0.5_r8*(max(drdx(i,j,k1),0.0_r8)* &
490 & (tl_dtdr(i-1,j,k1)+ &
491 & tl_dtdr(i ,j,k2))+ &
492 & min(drdx(i,j,k1),0.0_r8)* &
493 & (tl_dtdr(i-1,j,k2)+ &
494 & tl_dtdr(i ,j,k1)))- &
495 & 0.5_r8*((0.5_r8+ &
496 & sign(0.5_r8, drdx(i,j,k1)))* &
497 & tl_drdx(i,j,k1)* &
498 & (dtdr(i-1,j,k1)+dtdr(i,j,k2))+ &
499 & (0.5_r8+ &
500 & sign(0.5_r8,-drdx(i,j,k1)))* &
501 & tl_drdx(i,j,k1)* &
502 & (dtdr(i-1,j,k2)+dtdr(i,j,k1))))))
503 END DO
504 END DO
505 DO j=jstr,jend+1
506 DO i=istr,iend
507#ifdef DIFF_3DCOEF
508 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i,j-1,k))* &
509 & om_v(i,j)
510#else
511 cff=0.25_r8*(diff2(i,j,itrc)+diff2(i,j-1,itrc))* &
512 & om_v(i,j)
513#endif
514!^ FE(i,j)=cff* &
515!^ & (Hz(i,j,k)+Hz(i,j-1,k))* &
516!^ & (dTde(i,j,k1)- &
517!^ & 0.5_r8*(MAX(dRde(i,j,k1),0.0_r8)* &
518!^ & (dTdr(i,j-1,k1)+ &
519!^ & dTdr(i,j ,k2))+ &
520!^ & MIN(dRde(i,j,k1),0.0_r8)* &
521!^ & (dTdr(i,j-1,k2)+ &
522!^ & dTdr(i,j ,k1))))
523!^
524 tl_fe(i,j)=cff* &
525 & (((tl_hz(i,j,k)+tl_hz(i,j-1,k))* &
526 & (dtde(i,j,k1)- &
527 & 0.5_r8*(max(drde(i,j,k1),0.0_r8)* &
528 & (dtdr(i,j-1,k1)+ &
529 & dtdr(i,j ,k2))+ &
530 & min(drde(i,j,k1),0.0_r8)* &
531 & (dtdr(i,j-1,k2)+ &
532 & dtdr(i,j ,k1)))))+ &
533 & ((hz(i,j,k)+hz(i,j-1,k))* &
534 & (tl_dtde(i,j,k1)- &
535 & 0.5_r8*(max(drde(i,j,k1),0.0_r8)* &
536 & (tl_dtdr(i,j-1,k1)+ &
537 & tl_dtdr(i,j ,k2))+ &
538 & min(drde(i,j,k1),0.0_r8)* &
539 & (tl_dtdr(i,j-1,k2)+ &
540 & tl_dtdr(i,j ,k1)))- &
541 & 0.5_r8*((0.5_r8+ &
542 & sign(0.5_r8, drde(i,j,k1)))* &
543 & tl_drde(i,j,k1)* &
544 & (dtdr(i,j-1,k1)+dtdr(i,j,k2))+ &
545 & (0.5_r8+ &
546 & sign(0.5_r8,-drde(i,j,k1)))* &
547 & tl_drde(i,j,k1)* &
548 & (dtdr(i,j-1,k2)+dtdr(i,j,k1))))))
549 END DO
550 END DO
551 IF (k.lt.n(ng)) THEN
552 DO j=jstr,jend
553 DO i=istr,iend
554 cff1=max(drdx(i ,j,k1),0.0_r8)
555 cff2=max(drdx(i+1,j,k2),0.0_r8)
556 cff3=min(drdx(i ,j,k2),0.0_r8)
557 cff4=min(drdx(i+1,j,k1),0.0_r8)
558 tl_cff1=(0.5_r8+sign(0.5_r8, drdx(i ,j,k1)))* &
559 & tl_drdx(i ,j,k1)
560 tl_cff2=(0.5_r8+sign(0.5_r8, drdx(i+1,j,k2)))* &
561 & tl_drdx(i+1,j,k2)
562 tl_cff3=(0.5_r8+sign(0.5_r8,-drdx(i ,j,k2)))* &
563 & tl_drdx(i ,j,k2)
564 tl_cff4=(0.5_r8+sign(0.5_r8,-drdx(i+1,j,k1)))* &
565 & tl_drdx(i+1,j,k1)
566 cff=cff1*(cff1*dtdr(i,j,k2)-dtdx(i ,j,k1))+ &
567 & cff2*(cff2*dtdr(i,j,k2)-dtdx(i+1,j,k2))+ &
568 & cff3*(cff3*dtdr(i,j,k2)-dtdx(i ,j,k2))+ &
569 & cff4*(cff4*dtdr(i,j,k2)-dtdx(i+1,j,k1))
570 tl_cff=tl_cff1*(cff1*dtdr(i ,j,k2)- &
571 & dtdx(i ,j,k1))+ &
572 & tl_cff2*(cff2*dtdr(i,j,k2)- &
573 & dtdx(i+1,j,k2))+ &
574 & tl_cff3*(cff3*dtdr(i,j,k2)- &
575 & dtdx(i ,j,k2))+ &
576 & tl_cff4*(cff4*dtdr(i,j,k2)- &
577 & dtdx(i+1,j,k1))+ &
578 & cff1*(tl_cff1*dtdr(i,j,k2)+ &
579 & cff1*tl_dtdr(i,j,k2)- &
580 & tl_dtdx(i ,j,k1))+ &
581 & cff2*(tl_cff2*dtdr(i,j,k2)+ &
582 & cff2*tl_dtdr(i,j,k2)- &
583 & tl_dtdx(i+1,j,k2))+ &
584 & cff3*(tl_cff3*dtdr(i,j,k2)+ &
585 & cff3*tl_dtdr(i,j,k2)- &
586 & tl_dtdx(i ,j,k2))+ &
587 & cff4*(tl_cff4*dtdr(i,j,k2)+ &
588 & cff4*tl_dtdr(i,j,k2)- &
589 & tl_dtdx(i+1,j,k1))
590 cff1=max(drde(i,j ,k1),0.0_r8)
591 cff2=max(drde(i,j+1,k2),0.0_r8)
592 cff3=min(drde(i,j ,k2),0.0_r8)
593 cff4=min(drde(i,j+1,k1),0.0_r8)
594 tl_cff1=(0.5_r8+sign(0.5_r8, drde(i,j ,k1)))* &
595 & tl_drde(i,j ,k1)
596 tl_cff2=(0.5_r8+sign(0.5_r8, drde(i,j+1,k2)))* &
597 & tl_drde(i,j+1,k2)
598 tl_cff3=(0.5_r8+sign(0.5_r8,-drde(i,j ,k2)))* &
599 & tl_drde(i,j ,k2)
600 tl_cff4=(0.5_r8+sign(0.5_r8,-drde(i,j+1,k1)))* &
601 & tl_drde(i,j+1,k1)
602 cff=cff+ &
603 & cff1*(cff1*dtdr(i,j,k2)-dtde(i,j ,k1))+ &
604 & cff2*(cff2*dtdr(i,j,k2)-dtde(i,j+1,k2))+ &
605 & cff3*(cff3*dtdr(i,j,k2)-dtde(i,j ,k2))+ &
606 & cff4*(cff4*dtdr(i,j,k2)-dtde(i,j+1,k1))
607 tl_cff=tl_cff+ &
608 & tl_cff1*(cff1*dtdr(i,j,k2)- &
609 & dtde(i,j ,k1))+ &
610 & tl_cff2*(cff2*dtdr(i,j,k2)- &
611 & dtde(i,j+1,k2))+ &
612 & tl_cff3*(cff3*dtdr(i,j,k2)- &
613 & dtde(i,j ,k2))+ &
614 & tl_cff4*(cff4*dtdr(i,j,k2)- &
615 & dtde(i,j+1,k1))+ &
616 & cff1*(tl_cff1*dtdr(i,j,k2)+ &
617 & cff1*tl_dtdr(i,j,k2)- &
618 & tl_dtde(i,j ,k1))+ &
619 & cff2*(tl_cff2*dtdr(i,j,k2)+ &
620 & cff2*tl_dtdr(i,j,k2)- &
621 & tl_dtde(i,j+1,k2))+ &
622 & cff3*(tl_cff3*dtdr(i,j,k2)+ &
623 & cff3*tl_dtdr(i,j,k2)- &
624 & tl_dtde(i,j ,k2))+ &
625 & cff4*(tl_cff4*dtdr(i,j,k2)+ &
626 & cff4*tl_dtdr(i,j,k2)- &
627 & tl_dtde(i,j+1,k1))
628#ifdef DIFF_3DCOEF
629!^ FS(i,j,k2)=0.5_r8*cff*diff3d_r(i,j,k)*FS(i,j,k2)
630!^
631 tl_fs(i,j,k2)=0.5_r8*diff3d_r(i,j,k)* &
632 & (tl_cff*fs(i,j,k2)+ &
633 & cff*tl_fs(i,j,k2))
634#else
635!^ FS(i,j,k2)=0.5_r8*cff*diff2(i,j,itrc)*FS(i,j,k2)
636!^
637 tl_fs(i,j,k2)=0.5_r8*diff2(i,j,itrc)* &
638 & (tl_cff*fs(i,j,k2)+ &
639 & cff*tl_fs(i,j,k2))
640#endif
641 END DO
642 END DO
643 END IF
644!
645! Time-step harmonic, isopycnic diffusion term (m Tunits).
646!
647 DO j=jstr,jend
648 DO i=istr,iend
649!^ cff=dt(ng)*pm(i,j)*pn(i,j)* &
650!^ & (FX(i+1,j)-FX(i,j)+ &
651!^ & FE(i,j+1)-FE(i,j))+ &
652!^ & dt(ng)*(FS(i,j,k2)-FS(i,j,k1))
653!^
654 tl_cff=dt(ng)*pm(i,j)*pn(i,j)* &
655 & (tl_fx(i+1,j)-tl_fx(i,j)+ &
656 & tl_fe(i,j+1)-tl_fe(i,j))+ &
657 & dt(ng)*(tl_fs(i,j,k2)-tl_fs(i,j,k1))
658!^ t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)+cff
659!^
660 tl_t(i,j,k,nnew,itrc)=tl_t(i,j,k,nnew,itrc)+tl_cff
661#ifdef DIAGNOSTICS_TS
662!! DiaTwrk(i,j,k,itrc,iThdif)=cff
663#endif
664 END DO
665 END DO
666 END IF
667 END DO k_loop
668 END DO t_loop
669!
670 RETURN
671 END SUBROUTINE tl_t3dmix2_iso_tile
672
673 END MODULE tl_t3dmix2_mod
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 itlm
Definition mod_param.F:663
real(dp), dimension(:), allocatable dt
logical, dimension(:,:), allocatable ltracerclm
integer, dimension(:), allocatable nrhs
integer, dimension(:), allocatable nnew
integer, dimension(:), allocatable nstp
subroutine, public tl_t3dmix2(ng, tile)
subroutine tl_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)
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