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

Last change on this file since 3 was 3, checked in by opalod, 20 years ago

Initial revision

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