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.
trcldf_lap.F90 in trunk/NEMO/TOP_SRC/TRP – NEMO

source: trunk/NEMO/TOP_SRC/TRP/trcldf_lap.F90 @ 1264

Last change on this file since 1264 was 1264, checked in by cetlod, 15 years ago

clean TOP model routines to avoid warning when compiling, see ticket:303

  • Property svn:executable set to *
  • Property svn:keywords set to Id
File size: 8.3 KB
Line 
1MODULE trcldf_lap
2   !!======================================================================
3   !!                       ***  MODULE  trcldf_lap  ***
4   !! Ocean passive tracers:  horizontal component of the lateral tracer mixing trend
5   !!======================================================================
6   !! History :  1.0  !  87-06  (P. Andrich, D. L Hostis)  Original code
7   !!                 !  91-11  (G. Madec)
8   !!                 !  95-02  (M. Levy)    passive tracers
9   !!                 !  95-11  (G. Madec)  suppress volumetric scale factors
10   !!                 !  96-01  (G. Madec)  statement function for e3
11   !!            8.5  !  02-06  (G. Madec)  F90: Free form and module
12   !!            9.0  !  04-03  (C. Ethe)   passive tracer
13   !!                 !  07-02  (C. Deltel)  Diagnose ML trends for passive tracers
14   !!----------------------------------------------------------------------
15#if defined key_top
16   !!----------------------------------------------------------------------
17   !!   trc_ldf_lap  : update the tracer trend with the horizontal diffusion
18   !!                 using a iso-level harmonic (laplacien) operator.
19   !!----------------------------------------------------------------------
20   USE oce_trc             ! ocean dynamics and active tracers variables
21   USE trp_trc                 ! ocean passive tracers variables
22   USE prtctl_trc          ! Print control for debbuging
23   USE trdmld_trc
24   USE trdmld_trc_oce     
25
26   IMPLICIT NONE
27   PRIVATE
28
29   !! * Routine accessibility
30   PUBLIC trc_ldf_lap  ! routine called by step.F90
31
32   !! * Substitutions
33#  include "top_substitute.h90"
34   !!----------------------------------------------------------------------
35   !!   TOP 1.0 , LOCEAN-IPSL (2005)
36   !! $Header: /home/opalod/NEMOCVSROOT/NEMO/TOP_SRC/TRP/trcldf_lap.F90,v 1.10 2006/09/12 11:10:14 opalod Exp $
37   !! Software governed by the CeCILL licence (modipsl/doc/NEMO_CeCILL.txt)
38   !!----------------------------------------------------------------------
39   
40CONTAINS
41
42   SUBROUTINE trc_ldf_lap( kt )
43      !!----------------------------------------------------------------------
44      !!                  ***  ROUTINE trc_ldf_lap  ***
45      !!                   
46      !! ** Purpose :   Compute the before horizontal tracer diffusive
47      !!      trend and add it to the general trend of tracer equation.
48      !!
49      !! ** Method  :   Second order diffusive operator evaluated using before
50      !!      fields (forward time scheme). The horizontal diffusive trends of
51      !!      the passive tracer is given by:
52      !!       * s-coordinate, the vertical scale
53      !!      factors e3. are inside the derivatives:
54      !!          difft = 1/(e1t*e2t*e3t) {  di-1[ aht e2u*e3u/e1u di(trb) ]
55      !!                                   + dj-1[ aht e1v*e3v/e2v dj(trb) ] }
56      !!       * z-coordinate (default key), e3t=e3u=e3v, the trend becomes:
57      !!          difft = 1/(e1t*e2t) {  di-1[ aht e2u/e1u di(trb) ]
58      !!                               + dj-1[ aht e1v/e2v dj(trb) ] }
59      !!      Add this trend to the general tracer trend tra :
60      !!          tra = tra + difft
61      !!
62      !! ** Action  : - Update tra arrays with the before iso-level
63      !!                harmonic mixing trend.
64      !!              - Save the trends ('key_trdmld_trc')
65      !!----------------------------------------------------------------------
66      USE oce_trc          , ztu => ua,  &  ! use ua as workspace
67         &                   ztv => va      ! use va as workspace
68
69      INTEGER, INTENT( in ) ::   kt       ! ocean time-step index
70
71      !! * Local save
72      REAL(wp), DIMENSION(jpi,jpj), SAVE ::   &
73         ze1ur, ze2vr, zbtr2              ! scale factor coefficients
74     
75      INTEGER ::   ji, jj, jk, jn         ! dummy loop indices
76      REAL(wp) ::   &
77         zabe1, zabe2, zbtr               ! temporary scalars
78
79      REAL(wp) ::   &
80         ztrax, ztray               ! workspace
81      CHARACTER (len=22) :: charout
82      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrtrd
83      !!----------------------------------------------------------------------
84     
85      IF( kt == nittrc000 ) THEN
86         IF(lwp) WRITE(numout,*)
87         IF(lwp) WRITE(numout,*) 'trc_ldf_lap : iso-level laplacian diffusion'
88         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ '
89         ze1ur(:,:) = e2u(:,:) / e1u(:,:)
90         ze2vr(:,:) = e1v(:,:) / e2v(:,:)
91         zbtr2(:,:) = 1. / ( e1t(:,:) * e2t(:,:) )
92      ENDIF
93
94      IF( l_trdtrc ) THEN
95!         STOP 'trcldf_lap: this was never validated, please comment this line to proceed...'
96      ENDIF
97
98      IF( l_trdtrc ) ALLOCATE( ztrtrd(jpi,jpj,jpk) )
99
100      !                                                          ! ===========
101      DO jn = 1, jptra                                           ! tracer loop
102         !                                                       ! ===========
103         IF( l_trdtrc ) ztrtrd(:,:,:) = tra(:,:,:,jn)
104         
105         !                                                  ! =============
106         DO jk = 1, jpkm1                                   ! Vertical slab
107            !                                               ! =============
108            ! 1. First derivative (gradient)
109            ! ------------------------------
110            DO jj = 1, jpjm1
111               DO ji = 1, fs_jpim1   ! vector opt.
112                  IF ( ln_sco ) THEN
113                     zabe1 = fsahtru(ji,jj,jk) * umask(ji,jj,jk) * ze1ur(ji,jj) * fse3u(ji,jj,jk)
114                     zabe2 = fsahtrv(ji,jj,jk) * vmask(ji,jj,jk) * ze2vr(ji,jj) * fse3v(ji,jj,jk)
115                  ELSE
116                     zabe1 = fsahtru(ji,jj,jk) * umask(ji,jj,jk) * ze1ur(ji,jj)
117                     zabe2 = fsahtrv(ji,jj,jk) * vmask(ji,jj,jk) * ze2vr(ji,jj)
118                  ENDIF
119                  ztu(ji,jj,jk) = zabe1 * ( trb(ji+1,jj  ,jk,jn) - trb(ji,jj,jk,jn) )
120                  ztv(ji,jj,jk) = zabe2 * ( trb(ji  ,jj+1,jk,jn) - trb(ji,jj,jk,jn) )
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 ( ln_sco ) THEN
130                     zbtr = zbtr2(ji,jj) / fse3t(ji,jj,jk)
131                  ELSE
132                     zbtr = zbtr2(ji,jj)
133                  ENDIF
134                  ! horizontal diffusive trends
135                  ztrax = zbtr * ( ztu(ji,jj,jk) - ztu(ji-1,jj,jk) )
136                  ztray = zbtr * ( ztv(ji,jj,jk) - ztv(ji,jj-1,jk) )
137
138                  ! add it to the general tracer trends
139                  tra(ji,jj,jk,jn) = tra(ji,jj,jk,jn) + ztrax + ztray
140#if defined key_trc_diatrd
141                  ! save the horizontal diffusive trends
142                  IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),4) = ztrax
143                  IF (luttrd(jn)) trtrd(ji,jj,jk,ikeep(jn),5) = ztray
144#endif
145
146               END DO
147            END DO
148            !                                               ! =============
149         END DO                                             !  End of slab 
150         !                                                  ! =============
151         IF( l_trdtrc ) THEN
152            ztrtrd(:,:,:) = tra(:,:,:,jn) - ztrtrd(:,:,:)
153            IF (luttrd(jn)) CALL trd_mod_trc( ztrtrd, jn, jptrc_trd_ldf, kt )   ! trends diags
154         END IF
155         !                                                       ! ===========
156      END DO                                                     ! tracer loop
157      !                                                          ! ===========
158
159      IF( l_trdtrc ) DEALLOCATE( ztrtrd )
160
161      IF( ln_ctl ) THEN    ! print mean trends (used for debugging)
162         WRITE(charout, FMT="('ldf - lap')")
163         CALL prt_ctl_trc_info( charout )
164         CALL prt_ctl_trc( tab4d=tra, mask=tmask, clinfo=ctrcnm, clinfo2='trd' )
165      ENDIF
166
167   END SUBROUTINE trc_ldf_lap
168
169#else
170   !!----------------------------------------------------------------------
171   !!   Default option                                         Empty module
172   !!----------------------------------------------------------------------
173CONTAINS
174   SUBROUTINE trc_ldf_lap( kt ) 
175      INTEGER, INTENT(in) :: kt
176      WRITE(*,*) 'trc_ldf_lap: You should not have seen this print! error?', kt
177   END SUBROUTINE trc_ldf_lap
178#endif
179
180   !!==============================================================================
181END MODULE trcldf_lap
Note: See TracBrowser for help on using the repository browser.