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 @ 1110

Last change on this file since 1110 was 719, checked in by ctlod, 17 years ago

get back to the nemo_v2_3 version for trunk

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.1 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   USE prtctl          ! Print control
20
21
22   IMPLICIT NONE
23   PRIVATE
24
25   !! * Routine accessibility
26   PUBLIC tra_ldf_lap  ! routine called by step.F90
27
28   !! * Substitutions
29#  include "domzgr_substitute.h90"
30#  include "ldftra_substitute.h90"
31#  include "vectopt_loop_substitute.h90"
32   !!----------------------------------------------------------------------
33   !!   OPA 9.0 , LOCEAN-IPSL (2005)
34   !! $Header$
35   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt
36   !!----------------------------------------------------------------------
37   
38CONTAINS
39
40   SUBROUTINE tra_ldf_lap( kt )
41      !!----------------------------------------------------------------------
42      !!                  ***  ROUTINE tra_ldf_lap  ***
43      !!                   
44      !! ** Purpose :   Compute the before horizontal tracer (t & s) diffusive
45      !!      trend and add it to the general trend of tracer equation.
46      !!
47      !! ** Method  :   Second order diffusive operator evaluated using before
48      !!      fields (forward time scheme). The horizontal diffusive trends of
49      !!      temperature (idem for salinity) is given by:
50      !!          difft = 1/(e1t*e2t*e3t) {  di-1[ aht e2u*e3u/e1u di(tb) ]
51      !!                                   + dj-1[ aht e1v*e3v/e2v dj(tb) ] }
52      !!     Note: key_zco defined, the e3t=e3u=e3v, the trend becomes: 
53      !!          difft = 1/(e1t*e2t) {  di-1[ aht e2u/e1u di(tb) ]
54      !!                               + dj-1[ aht e1v/e2v dj(tb) ] }
55      !!      Add this trend to the general tracer trend (ta,sa):
56      !!          (ta,sa) = (ta,sa) + ( difft , diffs )
57      !!
58      !! ** Action  : - Update (ta,sa) arrays with the before iso-level
59      !!                harmonic mixing trend.
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      !!        !  05-11  (G. Madec)  add zps case
69      !!----------------------------------------------------------------------
70      USE oce              , ztu => ua,  &  ! use ua as workspace
71         &                   zsu => va      ! use va as workspace
72
73      !! * Arguments
74      INTEGER, INTENT( in ) ::   kt       ! ocean time-step index
75     
76      !! * Local save
77      REAL(wp), DIMENSION(jpi,jpj), SAVE ::   &
78         ze1ur, ze2vr, zbtr2              ! scale factor coefficients
79     
80      !! * Local declarations
81      INTEGER ::   ji, jj, jk             ! dummy loop indices
82      INTEGER ::   iku, ikv               ! temporary integers
83      REAL(wp) ::   &
84         zabe1, zta,                   &  ! temporary scalars
85         zabe2, zsa, zbtr                 !    "         "
86      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   &
87         ztv, zsv                         ! 3D workspace
88      !!----------------------------------------------------------------------
89     
90      IF( kt == nit000 ) THEN
91         IF(lwp) WRITE(numout,*)
92         IF(lwp) WRITE(numout,*) 'tra_ldf_lap : iso-level laplacian diffusion'
93         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ '
94         ze1ur(:,:) = e2u(:,:) / e1u(:,:)
95         ze2vr(:,:) = e1v(:,:) / e2v(:,:)
96         zbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) )
97      ENDIF
98     
99      !                                                  ! =============
100      DO jk = 1, jpkm1                                   ! Vertical slab
101         !                                               ! =============
102         ! 1. First derivative (gradient)
103         ! -------------------
104         DO jj = 1, jpjm1
105            DO ji = 1, fs_jpim1   ! vector opt.
106#if defined key_zco
107               zabe1 = fsahtu(ji,jj,jk) * umask(ji,jj,jk) * ze1ur(ji,jj)
108               zabe2 = fsahtv(ji,jj,jk) * vmask(ji,jj,jk) * ze2vr(ji,jj)
109#else
110               zabe1 = fsahtu(ji,jj,jk) * umask(ji,jj,jk) * ze1ur(ji,jj) * fse3u(ji,jj,jk)
111               zabe2 = fsahtv(ji,jj,jk) * vmask(ji,jj,jk) * ze2vr(ji,jj) * fse3v(ji,jj,jk)
112#endif
113               ztu(ji,jj,jk) = zabe1 * ( tb(ji+1,jj  ,jk) - tb(ji,jj,jk) )
114               zsu(ji,jj,jk) = zabe1 * ( sb(ji+1,jj  ,jk) - sb(ji,jj,jk) )
115               ztv(ji,jj,jk) = zabe2 * ( tb(ji  ,jj+1,jk) - tb(ji,jj,jk) )
116               zsv(ji,jj,jk) = zabe2 * ( sb(ji  ,jj+1,jk) - sb(ji,jj,jk) )
117            END DO 
118         END DO 
119         IF( ln_zps ) THEN      ! set gradient at partial step level
120            DO jj = 1, jpjm1
121               DO ji = 1, fs_jpim1   ! vector opt.
122                  ! last level
123                  iku = MIN ( mbathy(ji,jj), mbathy(ji+1,jj  ) ) - 1
124                  ikv = MIN ( mbathy(ji,jj), mbathy(ji  ,jj+1) ) - 1
125                  IF( iku == jk ) THEN
126                     zabe1 = fsahtu(ji,jj,iku) * umask(ji,jj,iku) * ze1ur(ji,jj) * fse3u(ji,jj,iku)
127                     ztu(ji,jj,jk) = zabe1 * gtu(ji,jj)
128                     zsu(ji,jj,jk) = zabe1 * gsu(ji,jj)
129                  ENDIF
130                  IF( ikv == jk ) THEN
131                     zabe2 = fsahtv(ji,jj,ikv) * vmask(ji,jj,ikv) * ze2vr(ji,jj) * fse3v(ji,jj,ikv)
132                     ztv(ji,jj,jk) = zabe2 * gtv(ji,jj)
133                     zsv(ji,jj,jk) = zabe2 * gsv(ji,jj)
134                  ENDIF
135               END DO
136            END DO
137         ENDIF
138         
139         
140         ! 2. Second derivative (divergence)
141         ! --------------------
142         DO jj = 2, jpjm1
143            DO ji = fs_2, fs_jpim1   ! vector opt.
144#if defined key_zco
145               zbtr = zbtr2(ji,jj)
146#else
147               zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk)
148#endif
149               ! horizontal diffusive trends
150               zta = zbtr * (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk)   &
151                  &          + ztv(ji,jj,jk) - ztv(ji,jj-1,jk)  )
152               zsa = zbtr * (  zsu(ji,jj,jk) - zsu(ji-1,jj,jk)   &
153                  &          + zsv(ji,jj,jk) - zsv(ji,jj-1,jk)  )
154               ! add it to the general tracer trends
155               ta(ji,jj,jk) = ta(ji,jj,jk) + zta
156               sa(ji,jj,jk) = sa(ji,jj,jk) + zsa
157            END DO 
158         END DO 
159         !                                               ! =============
160      END DO                                             !  End of slab 
161      !                                                  ! =============
162
163      ! "zonal" mean lateral diffusive heat and salt transport
164      IF( ln_diaptr .AND. ( MOD( kt, nf_ptr ) == 0 ) ) THEN
165         IF( lk_zco ) THEN   ! z-coordinate - full step (1D arrays)
166            DO jk = 1, jpkm1
167               DO jj = 2, jpjm1
168                  DO ji = fs_2, fs_jpim1   ! vector opt.
169                    ztv(ji,jj,jk) = ztv(ji,jj,jk) * fse3v(ji,jj,jk)
170                    zsv(ji,jj,jk) = zsv(ji,jj,jk) * fse3v(ji,jj,jk)
171                  END DO
172               END DO
173            END DO
174         ENDIF
175         pht_ldf(:) = ptr_vj( ztv(:,:,:) )
176         pst_ldf(:) = ptr_vj( zsv(:,:,:) )
177      ENDIF
178
179   END SUBROUTINE tra_ldf_lap
180
181   !!==============================================================================
182END MODULE traldf_lap
Note: See TracBrowser for help on using the repository browser.