New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
traldf_lap.F90 in trunk/NEMO/OPA_SRC/TRA – NEMO

source: trunk/NEMO/OPA_SRC/TRA/traldf_lap.F90 @ 216

Last change on this file since 216 was 216, checked in by opalod, 19 years ago

CT : UPDATE151 : New trends organization

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.0 KB
Line 
1MODULE traldf_lap
2   !!==============================================================================
3   !!                       ***  MODULE  traldf_lap  ***
4   !! Ocean active tracers:  horizontal component of the lateral tracer mixing trend
5   !!==============================================================================
6
7   !!----------------------------------------------------------------------
8   !!   tra_ldf_lap  : update the tracer trend with the horizontal diffusion
9   !!                 using a iso-level harmonic (laplacien) operator.
10   !!----------------------------------------------------------------------
11   !! * Modules used
12   USE oce             ! ocean dynamics and active tracers
13   USE dom_oce         ! ocean space and time domain
14   USE ldftra_oce      ! ocean active tracers: lateral physics
15   USE trdmod          ! ocean active tracers trends
16   USE trdmod_oce      ! ocean variables trends
17   USE in_out_manager  ! I/O manager
18   USE diaptr          ! poleward transport diagnostics
19
20
21   IMPLICIT NONE
22   PRIVATE
23
24   !! * Routine accessibility
25   PUBLIC tra_ldf_lap  ! routine called by step.F90
26
27   !! * Substitutions
28#  include "domzgr_substitute.h90"
29#  include "ldftra_substitute.h90"
30#  include "vectopt_loop_substitute.h90"
31   !!----------------------------------------------------------------------
32   !!   OPA 9.0 , LODYC-IPSL (2003)
33   !!----------------------------------------------------------------------
34   
35CONTAINS
36
37   SUBROUTINE tra_ldf_lap( kt )
38      !!----------------------------------------------------------------------
39      !!                  ***  ROUTINE tra_ldf_lap  ***
40      !!                   
41      !! ** Purpose :   Compute the before horizontal tracer (t & s) diffusive
42      !!      trend and add it to the general trend of tracer equation.
43      !!
44      !! ** Method  :   Second order diffusive operator evaluated using before
45      !!      fields (forward time scheme). The horizontal diffusive trends of
46      !!      temperature (idem for salinity) is given by:
47      !!       * s-coordinate ('key_s_coord' defined), the vertical scale
48      !!      factors e3. are inside the derivatives:
49      !!          difft = 1/(e1t*e2t*e3t) {  di-1[ aht e2u*e3u/e1u di(tb) ]
50      !!                                   + dj-1[ aht e1v*e3v/e2v dj(tb) ] }
51      !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes:
52      !!          difft = 1/(e1t*e2t) {  di-1[ aht e2u/e1u di(tb) ]
53      !!                               + dj-1[ aht e1v/e2v dj(tb) ] }
54      !!      Add this trend to the general tracer trend (ta,sa):
55      !!          (ta,sa) = (ta,sa) + ( difft , diffs )
56      !!
57      !! ** Action  : - Update (ta,sa) arrays with the before iso-level
58      !!                harmonic mixing trend.
59      !!              - Save the trends in (ztdta,ztdsa) ('key_trdtra')
60      !!
61      !! History :
62      !!   1.0  !  87-06  (P. Andrich, D. L Hostis)  Original code
63      !!        !  91-11  (G. Madec)
64      !!        !  95-11  (G. Madec)  suppress volumetric scale factors
65      !!        !  96-01  (G. Madec)  statement function for e3
66      !!   8.5  !  02-06  (G. Madec)  F90: Free form and module
67      !!   9.0  !  04-08  (C. Talandier) New trends organization
68      !!----------------------------------------------------------------------
69      USE oce              , ztu => ua,  &  ! use ua as workspace
70         &                   zsu => va      ! use va as workspace
71
72      !! * Arguments
73      INTEGER, INTENT( in ) ::   kt       ! ocean time-step index
74     
75      !! * Local save
76      REAL(wp), DIMENSION(jpi,jpj), SAVE ::   &
77         ze1ur, ze2vr, zbtr2              ! scale factor coefficients
78     
79      !! * Local declarations
80      INTEGER ::   ji, jj, jk             ! dummy loop indices
81      REAL(wp) ::   &
82         zabe1, zabe2, zbtr, zta, zsa     ! temporary scalars
83      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   &
84         ztv, zsv,                      &  ! temporary workspace arrays
85         ztdta, ztdsa                      !    "         "
86      !!----------------------------------------------------------------------
87     
88      IF( kt == nit000 ) THEN
89         IF(lwp) WRITE(numout,*)
90         IF(lwp) WRITE(numout,*) 'tra_ldf_lap : iso-level laplacian diffusion'
91         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ '
92         ze1ur(:,:) = e2u(:,:) / e1u(:,:)
93         ze2vr(:,:) = e1v(:,:) / e2v(:,:)
94         zbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) )
95      ENDIF
96     
97      ! Save ta and sa trends
98      IF( l_trdtra )   THEN
99         ztdta(:,:,:) = ta(:,:,:) 
100         ztdsa(:,:,:) = sa(:,:,:) 
101      ENDIF
102
103      !                                                  ! =============
104      DO jk = 1, jpkm1                                   ! Vertical slab
105         !                                               ! =============
106         ! 1. First derivative (gradient)
107         ! -------------------
108         DO jj = 1, jpjm1
109            DO ji = 1, fs_jpim1   ! vector opt.
110#if defined key_s_coord
111               zabe1 = fsahtu(ji,jj,jk) * umask(ji,jj,jk) * ze1ur(ji,jj) * fse3u(ji,jj,jk)
112               zabe2 = fsahtv(ji,jj,jk) * vmask(ji,jj,jk) * ze2vr(ji,jj) * fse3v(ji,jj,jk)
113#else
114               zabe1 = fsahtu(ji,jj,jk) * umask(ji,jj,jk) * ze1ur(ji,jj)
115               zabe2 = fsahtv(ji,jj,jk) * vmask(ji,jj,jk) * ze2vr(ji,jj)
116#endif
117               ztu(ji,jj,jk) = zabe1 * ( tb(ji+1,jj  ,jk) - tb(ji,jj,jk) )
118               zsu(ji,jj,jk) = zabe1 * ( sb(ji+1,jj  ,jk) - sb(ji,jj,jk) )
119               ztv(ji,jj,jk) = zabe2 * ( tb(ji  ,jj+1,jk) - tb(ji,jj,jk) )
120               zsv(ji,jj,jk) = zabe2 * ( sb(ji  ,jj+1,jk) - sb(ji,jj,jk) )
121            END DO 
122         END DO 
123         
124         
125         ! 2. Second derivative (divergence)
126         ! --------------------
127         DO jj = 2, jpjm1
128            DO ji = fs_2, fs_jpim1   ! vector opt.
129#if defined key_s_coord
130               zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk)
131#else
132               zbtr = zbtr2(ji,jj)
133#endif
134               ! horizontal diffusive trends
135               zta = zbtr * (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk)   &
136                  &          + ztv(ji,jj,jk) - ztv(ji,jj-1,jk)  )
137               zsa = zbtr * (  zsu(ji,jj,jk) - zsu(ji-1,jj,jk)   &
138                  &          + zsv(ji,jj,jk) - zsv(ji,jj-1,jk)  )
139               ! add it to the general tracer trends
140               ta(ji,jj,jk) = ta(ji,jj,jk) + zta
141               sa(ji,jj,jk) = sa(ji,jj,jk) + zsa
142            END DO 
143         END DO 
144         !                                               ! =============
145      END DO                                             !  End of slab 
146      !                                                  ! =============
147
148      ! save the trends for diagnostic
149      ! save the horizontal diffusive trends
150      IF( l_trdtra )   THEN
151         ztdta(:,:,:) = ta(:,:,:) - ztdta(:,:,:)
152         ztdsa(:,:,:) = sa(:,:,:) - ztdsa(:,:,:)
153
154         CALL trd_mod(ztdta, ztdsa, jpttdldf, 'TRA', kt)
155      ENDIF
156
157      IF(l_ctl) THEN         ! print mean trends (used for debugging)
158         zta = SUM( ta(2:nictl,2:njctl,1:jpkm1) * tmask(2:nictl,2:njctl,1:jpkm1) )
159         zsa = SUM( sa(2:nictl,2:njctl,1:jpkm1) * tmask(2:nictl,2:njctl,1:jpkm1) )
160         WRITE(numout,*) ' ldf  - Ta: ', zta-t_ctl, ' Sa: ', zsa-s_ctl
161         t_ctl = zta   ;   s_ctl = zsa
162      ENDIF
163
164      ! "zonal" mean lateral diffusive heat and salt transport
165      IF( ln_diaptr .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN
166# if defined key_s_coord || defined key_partial_steps
167         pht_ldf(:) = ptr_vj( ztv(:,:,:) )
168         pst_ldf(:) = ptr_vj( zsv(:,:,:) )
169# else
170         DO jk = 1, jpkm1
171            DO jj = 2, jpjm1
172               DO ji = fs_2, fs_jpim1   ! vector opt.
173                 ztv(ji,jj,jk) = ztv(ji,jj,jk) * fse3v(ji,jj,jk)
174                 zsv(ji,jj,jk) = zsv(ji,jj,jk) * fse3v(ji,jj,jk)
175               END DO
176            END DO
177         END DO
178         pht_ldf(:) = ptr_vj( ztv(:,:,:) )
179         pst_ldf(:) = ptr_vj( zsv(:,:,:) )
180# endif
181      ENDIF
182
183   END SUBROUTINE tra_ldf_lap
184
185   !!==============================================================================
186END MODULE traldf_lap
Note: See TracBrowser for help on using the repository browser.