ROMS
Loading...
Searching...
No Matches
tl_t3dmix2_s.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 S-coordinate levels surfaces. !
12! !
13! BASIC STATE variables needed: t, Hz !
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, 24, __line__, myfile)
53#endif
54 CALL tl_t3dmix2_s_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) % Hz, &
67 & grid(ng) % tl_Hz, &
68 & grid(ng) % pmon_u, &
69 & grid(ng) % pnom_v, &
70 & grid(ng) % pm, &
71 & grid(ng) % pn, &
72#ifdef DIFF_3DCOEF
73 & mixing(ng) % diff3d_r, &
74#else
75 & mixing(ng) % diff2, &
76#endif
77#ifdef TS_MIX_CLIMA
78 & clima(ng) % tclm, &
79#endif
80#ifdef DIAGNOSTICS_TS
81!! & DIAGS(ng) % DiaTwrk, &
82#endif
83 & ocean(ng) % t, &
84 & ocean(ng) % tl_t)
85#ifdef PROFILE
86 CALL wclock_off (ng, itlm, 24, __line__, myfile)
87#endif
88!
89 RETURN
90 END SUBROUTINE tl_t3dmix2
91!
92!***********************************************************************
93 SUBROUTINE tl_t3dmix2_s_tile (ng, tile, &
94 & LBi, UBi, LBj, UBj, &
95 & IminS, ImaxS, JminS, JmaxS, &
96 & nrhs, nstp, nnew, &
97#ifdef MASKING
98 & umask, vmask, &
99#endif
100#ifdef WET_DRY_NOT_YET
101 & umask_wet, vmask_wet, &
102#endif
103 & Hz, tl_Hz, &
104 & pmon_u, pnom_v, pm, pn, &
105#ifdef DIFF_3DCOEF
106 & diff3d_r, &
107#else
108 & diff2, &
109#endif
110#ifdef TS_MIX_CLIMA
111 & tclm, &
112#endif
113#ifdef DIAGNOSTICS_TS
114!! & DiaTwrk, &
115#endif
116 & t, tl_t)
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#elif defined TS_MIX_CLIMA
240 IF (ltracerclm(itrc,ng)) THEN
241!^ FX(i,j)=cff* &
242!^ & (Hz(i,j,k)+Hz(i-1,j,k))* &
243!^ & ((t(i ,j,k,nrhs,itrc)-tclm(i ,j,k,itrc))- &
244!^ & (t(i-1,j,k,nrhs,itrc)-tclm(i-1,j,k,itrc)))
245!^
246 tl_fx(i,j)=cff* &
247 & ((tl_hz(i,j,k)+tl_hz(i-1,j,k))* &
248 & ((t(i ,j,k,nrhs,itrc)- &
249 & tclm(i ,j,k,itrc))- &
250 & (t(i-1,j,k,nrhs,itrc)- &
251 & tclm(i-1,j,k,itrc)))+ &
252 & (hz(i,j,k)+hz(i-1,j,k))* &
253 & (tl_t(i ,j,k,nrhs,itrc)- &
254 & tl_t(i-1,j,k,nrhs,itrc)))
255 ELSE
256!^ FX(i,j)=cff* &
257!^ & (Hz(i,j,k)+Hz(i-1,j,k))* &
258!^ & (t(i,j,k,nrhs,itrc)-t(i-1,j,k,nrhs,itrc))
259!^
260 tl_fx(i,j)=cff* &
261 & ((tl_hz(i,j,k)+tl_hz(i-1,j,k))* &
262 & (t(i ,j,k,nrhs,itrc)- &
263 & t(i-1,j,k,nrhs,itrc))+ &
264 & (hz(i,j,k)+hz(i-1,j,k))* &
265 & (tl_t(i ,j,k,nrhs,itrc)- &
266 & tl_t(i-1,j,k,nrhs,itrc)))
267 END IF
268#else
269!^ FX(i,j)=cff* &
270!^ & (Hz(i,j,k)+Hz(i-1,j,k))* &
271!^ & (t(i,j,k,nrhs,itrc)-t(i-1,j,k,nrhs,itrc))
272!^
273 tl_fx(i,j)=cff* &
274 & ((tl_hz(i,j,k)+tl_hz(i-1,j,k))* &
275 & (t(i ,j,k,nrhs,itrc)- &
276 & t(i-1,j,k,nrhs,itrc))+ &
277 & (hz(i,j,k)+hz(i-1,j,k))* &
278 & (tl_t(i ,j,k,nrhs,itrc)- &
279 & tl_t(i-1,j,k,nrhs,itrc)))
280#endif
281#ifdef MASKING
282!^ FX(i,j)=FX(i,j)*umask(i,j)
283!^
284 tl_fx(i,j)=tl_fx(i,j)*umask(i,j)
285#endif
286#ifdef WET_DRY_NOT_YET
287 fx(i,j)=fx(i,j)*umask_wet(i,j)
288#endif
289 END DO
290 END DO
291 DO j=jstr,jend+1
292 DO i=istr,iend
293#ifdef DIFF_3DCOEF
294 cff=0.25_r8*(diff3d_r(i,j,k)+diff3d_r(i,j-1,k))* &
295 & pnom_v(i,j)
296#else
297 cff=0.25_r8*(diff2(i,j,itrc)+diff2(i,j-1,itrc))* &
298 & pnom_v(i,j)
299#endif
300#if defined TS_MIX_STABILITY
301!^ FE(i,j)=cff* &
302!^ & (Hz(i,j,k)+Hz(i,j-1,k))* &
303!^ & (0.75_r8*(t(i,j ,k,nrhs,itrc)- &
304!^ & t(i,j-1,k,nrhs,itrc))+ &
305!^ & 0.25_r8*(t(i,j ,k,nstp,itrc)- &
306!^ & t(i,j-1,k,nstp,itrc)))
307!^
308 tl_fe(i,j)=cff* &
309 & ((tl_hz(i,j,k)+tl_hz(i,j-1,k))* &
310 & (0.75_r8*(t(i,j ,k,nrhs,itrc)- &
311 & t(i,j-1,k,nrhs,itrc))+ &
312 & 0.25_r8*(t(i,j ,k,nstp,itrc)- &
313 & t(i,j-1,k,nstp,itrc)))+ &
314 & (hz(i,j,k)+hz(i,j-1,k))* &
315 & (0.75_r8*(tl_t(i,j ,k,nrhs,itrc)- &
316 & tl_t(i,j-1,k,nrhs,itrc))+ &
317 & 0.25_r8*(tl_t(i,j ,k,nstp,itrc)- &
318 & tl_t(i,j-1,k,nstp,itrc))))
319#elif defined TS_MIX_CLIMA
320 IF (ltracerclm(itrc,ng)) THEN
321!^ FE(i,j)=cff* &
322!^ & (Hz(i,j,k)+Hz(i,j-1,k))* &
323!^ & ((t(i,j ,k,nrhs,itrc)-tclm(i,j ,k,itrc))- &
324!^ & (t(i,j-1,k,nrhs,itrc)-tclm(i,j-1,k,itrc)))
325!^
326 tl_fe(i,j)=cff* &
327 & ((tl_hz(i,j,k)+tl_hz(i,j-1,k))* &
328 & ((t(i,j ,k,nrhs,itrc)- &
329 & tclm(i,j ,k,itrc))- &
330 & (t(i,j-1,k,nrhs,itrc)- &
331 & tclm(i,j-1,k,itrc)))+ &
332 & (hz(i,j,k)+hz(i,j-1,k))* &
333 & (tl_t(i,j ,k,nrhs,itrc)- &
334 & tl_t(i,j-1,k,nrhs,itrc)))
335 ELSE
336!^ FE(i,j)=cff* &
337!^ & (Hz(i,j,k)+Hz(i,j-1,k))* &
338!^ & (t(i,j,k,nrhs,itrc)-t(i,j-1,k,nrhs,itrc))
339!^
340 tl_fe(i,j)=cff* &
341 & ((tl_hz(i,j,k)+tl_hz(i,j-1,k))* &
342 & (t(i,j ,k,nrhs,itrc)- &
343 & t(i,j-1,k,nrhs,itrc))+ &
344 & (hz(i,j,k)+hz(i,j-1,k))* &
345 & (tl_t(i,j ,k,nrhs,itrc)- &
346 & tl_t(i,j-1,k,nrhs,itrc)))
347 END IF
348#else
349!^ FE(i,j)=cff* &
350!^ & (Hz(i,j,k)+Hz(i,j-1,k))* &
351!^ & (t(i,j,k,nrhs,itrc)-t(i,j-1,k,nrhs,itrc))
352!^
353 tl_fe(i,j)=cff* &
354 & ((tl_hz(i,j,k)+tl_hz(i,j-1,k))* &
355 & (t(i,j ,k,nrhs,itrc)- &
356 & t(i,j-1,k,nrhs,itrc))+ &
357 & (hz(i,j,k)+hz(i,j-1,k))* &
358 & (tl_t(i,j ,k,nrhs,itrc)- &
359 & tl_t(i,j-1,k,nrhs,itrc)))
360#endif
361#ifdef MASKING
362!^ FE(i,j)=FE(i,j)*vmask(i,j)
363!^
364 tl_fe(i,j)=tl_fe(i,j)*vmask(i,j)
365#endif
366#ifdef WET_DRY_NOT_YET
367 fe(i,j)=fe(i,j)*vmask_wet(i,j)
368#endif
369 END DO
370 END DO
371!
372! Time-step harmonic, S-surfaces diffusion term (m Tunits).
373!
374 DO j=jstr,jend
375 DO i=istr,iend
376!^ cff=dt(ng)*pm(i,j)*pn(i,j)* &
377!^ & (FX(i+1,j)-FX(i,j)+ &
378!^ & FE(i,j+1)-FE(i,j))
379!^
380 tl_cff=dt(ng)*pm(i,j)*pn(i,j)* &
381 & (tl_fx(i+1,j)-tl_fx(i,j)+ &
382 & tl_fe(i,j+1)-tl_fe(i,j))
383!^ t(i,j,k,nnew,itrc)=t(i,j,k,nnew,itrc)+cff
384!^
385 tl_t(i,j,k,nnew,itrc)=tl_t(i,j,k,nnew,itrc)+tl_cff
386#ifdef DIAGNOSTICS_TS
387!! DiaTwrk(i,j,k,itrc,iThdif)=cff
388#endif
389 END DO
390 END DO
391 END DO
392 END DO
393!
394 RETURN
395 END SUBROUTINE tl_t3dmix2_s_tile
396
397 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 tl_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)
subroutine, public tl_t3dmix2(ng, tile)
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