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.
traadv_eiv.F90 in trunk/NEMO/OPA_SRC/TRA – NEMO

source: trunk/NEMO/OPA_SRC/TRA/traadv_eiv.F90 @ 473

Last change on this file since 473 was 458, checked in by opalod, 18 years ago

nemo_v1_update_049:RB: reorganization of tracers part, remove traadv_cen2_atsk.h90 traldf_iso_zps.F90 trazdf_iso.F90 trazdf_iso_vopt.F90, change atsk routines to jki, add control modules traadv, traldf, trazdf

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.4 KB
Line 
1MODULE traadv_eiv
2   !!==============================================================================
3   !!                    ***  MODULE  traadv_eiv  ***
4   !! Ocean active tracers:  advection trend - eddy induced velocity
5   !!==============================================================================
6   !! History :
7   !!   9.0  !  05-11  (G. Madec)  Original code from traldf & zdf _iso
8   !!----------------------------------------------------------------------
9#if defined key_traldf_eiv   ||   defined key_esopa
10   !!----------------------------------------------------------------------
11   !!   'key_traldf_eiv'                  rotation of the lateral mixing tensor
12   !!----------------------------------------------------------------------
13   !!   tra_ldf_iso : update the tracer trend with the horizontal component
14   !!                 of iso neutral laplacian operator or horizontal
15   !!                 laplacian operator in s-coordinate
16   !!----------------------------------------------------------------------
17   !! * Modules used
18   USE oce             ! ocean dynamics and tracers variables
19   USE dom_oce         ! ocean space and time domain variables
20   USE ldftra_oce      ! ocean active tracers: lateral physics
21   USE ldfslp          ! iso-neutral slopes
22   USE in_out_manager  ! I/O manager
23
24   IMPLICIT NONE
25   PRIVATE
26
27   !! * Routine accessibility
28   PUBLIC tra_adv_eiv  ! routine called by step.F90
29
30
31   !! * Substitutions
32#  include "domzgr_substitute.h90"
33#  include "ldftra_substitute.h90"
34#  include "ldfeiv_substitute.h90"
35#  include "vectopt_loop_substitute.h90"
36   !!----------------------------------------------------------------------
37   !!  OPA 9.0 , LOCEAN-IPSL (2005)
38   !!----------------------------------------------------------------------
39
40CONTAINS
41
42   SUBROUTINE tra_adv_eiv( kt, pun, pvn, pwn )
43      !!----------------------------------------------------------------------
44      !!                  ***  ROUTINE tra_adv_eiv  ***
45      !!
46      !! ** Purpose :   Compute the before horizontal tracer (t & s) diffusive
47      !!      trend and add it to the general trend of tracer equation.
48      !!
49      !! ** Method  :   The eddy induced advection is computed from the slope
50      !!      of iso-neutral surfaces computed in routine ldf_slp as follows:
51      !!         zu_eiv =  1/(e2u e3u)   dk[ aeiu e2u mi(wslpi) ]
52      !!         zv_eiv =  1/(e1v e3v)   dk[ aeiv e1v mj(wslpj)
53      !!         zw_eiv = -1/(e1t e2t) { di[ aeiu e2u mi(wslpi) ]
54      !!                               + dj[ aeiv e1v mj(wslpj) ] }
55      !!      add the eiv component to the model velocity:
56      !!         p.n = p.n + z._eiv
57      !!
58      !! ** Action  : - add to p.n the eiv component
59      !!
60      !!----------------------------------------------------------------------
61      !! * Arguments
62      INTEGER , INTENT( in ) ::   kt       ! ocean time-step index
63      REAL(wp), INTENT( inout ), DIMENSION(jpi,jpj,jpk) ::   &
64         pun, pvn, pwn                     ! in : now ocean velocity fields
65         !                                 ! out: fields increased by the eiv components
66
67      !! * Local declarations
68      INTEGER  ::   ji, jj, jk             ! dummy loop indices
69      REAL(wp) ::                       &
70         zuwk, zuwk1, zuwi, zuwi1,      &  ! temporary scalar
71         zvwk, zvwk1, zvwj, zvwj1,      &  !
72         zu_eiv, zv_eiv, zw_eiv            !
73      !!----------------------------------------------------------------------
74
75      IF( kt == nit000 ) THEN
76         IF(lwp) WRITE(numout,*)
77         IF(lwp) WRITE(numout,*) 'tra_adv_eiv : eddy induced advection :'
78         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   add to velocity fields the eiv component'
79# if defined key_diaeiv
80         u_eiv(:,:,:) = 0.e0
81         v_eiv(:,:,:) = 0.e0
82         w_eiv(:,:,:) = 0.e0
83# endif
84      ENDIF
85
86      !                                             ! =================
87      DO jk = 1, jpkm1                              !  Horizontal slab
88         !                                          ! =================
89
90         DO jj = 1, jpjm1
91            DO ji = 1, fs_jpim1   ! vector opt.
92               zuwk = ( wslpi(ji,jj,jk  ) + wslpi(ji+1,jj,jk  ) ) * fsaeiu(ji,jj,jk  ) * umask(ji,jj,jk  )
93               zuwk1= ( wslpi(ji,jj,jk+1) + wslpi(ji+1,jj,jk+1) ) * fsaeiu(ji,jj,jk+1) * umask(ji,jj,jk+1)
94               zvwk = ( wslpj(ji,jj,jk  ) + wslpj(ji,jj+1,jk  ) ) * fsaeiv(ji,jj,jk  ) * vmask(ji,jj,jk  )
95               zvwk1= ( wslpj(ji,jj,jk+1) + wslpj(ji,jj+1,jk+1) ) * fsaeiv(ji,jj,jk+1) * vmask(ji,jj,jk+1)
96
97               zu_eiv =  0.5 * umask(ji,jj,jk) * ( zuwk - zuwk1 ) / fse3u(ji,jj,jk)
98               zv_eiv =  0.5 * vmask(ji,jj,jk) * ( zvwk - zvwk1 ) / fse3v(ji,jj,jk)
99   
100               pun(ji,jj,jk) = pun(ji,jj,jk) + zu_eiv
101               pvn(ji,jj,jk) = pvn(ji,jj,jk) + zv_eiv
102
103# if defined key_diaeiv
104               u_eiv(ji,jj,jk) = zu_eiv
105               v_eiv(ji,jj,jk) = zv_eiv
106# endif
107            END DO
108         END DO
109         IF( jk >=2 ) THEN                             ! jk=1 zw_eiv=0, not computed
110            DO jj = 2, jpjm1
111               DO ji = fs_2, fs_jpim1   ! vector opt.
112# if defined key_traldf_c2d || defined key_traldf_c3d
113                  zuwi  = ( wslpi(ji,jj,jk)+wslpi(ji-1,jj,jk) ) * fsaeiu(ji-1,jj,jk) * e2u(ji-1,jj) * umask(ji-1,jj,jk)
114                  zuwi1 = ( wslpi(ji,jj,jk)+wslpi(ji+1,jj,jk) ) * fsaeiu(ji  ,jj,jk) * e2u(ji  ,jj) * umask(ji  ,jj,jk)
115                  zvwj  = ( wslpj(ji,jj,jk)+wslpj(ji,jj-1,jk) ) * fsaeiv(ji,jj-1,jk) * e1v(ji,jj-1) * vmask(ji,jj-1,jk)
116                  zvwj1 = ( wslpj(ji,jj,jk)+wslpj(ji,jj+1,jk) ) * fsaeiv(ji,jj  ,jk) * e1v(ji  ,jj) * vmask(ji  ,jj,jk)
117 
118                  zw_eiv = - 0.5 * tmask(ji,jj,jk) * ( zuwi1 - zuwi + zvwj1 - zvwj ) / ( e1t(ji,jj)*e2t(ji,jj) )
119# else
120                  zuwki = ( wslpi(ji,jj,jk) + wslpi(ji-1,jj,jk) ) * e2u(ji-1,jj) * umask(ji-1,jj,jk)
121                  zuwk  = ( wslpi(ji,jj,jk) + wslpi(ji+1,jj,jk) ) * e2u(ji  ,jj) * umask(ji  ,jj,jk)
122                  zvwki = ( wslpj(ji,jj,jk) + wslpj(ji,jj-1,jk) ) * e1v(ji,jj-1) * vmask(ji,jj-1,jk)
123                  zvwk  = ( wslpj(ji,jj,jk) + wslpj(ji,jj+1,jk) ) * e1v(ji  ,jj) * vmask(ji  ,jj,jk)
124
125                  zw_eiv = - 0.5 * tmask(ji,jj,jk) * fsaeiw(ji,jj,jk) * ( zuwk - zuwki + zvwk - zvwki )
126                     &                                                / ( e1t(ji,jj)*e2t(ji,jj) )
127# endif
128                  pwn(ji,jj,jk) = pwn(ji,jj,jk) + zw_eiv
129
130# if defined key_diaeiv
131                  w_eiv(ji,jj,jk) = zw_eiv
132# endif
133               END DO
134            END DO
135         ENDIF
136         !                                          ! =================
137      END DO                                        !    End of slab 
138      !                                             ! =================
139
140   END SUBROUTINE tra_adv_eiv
141
142#else
143   !!----------------------------------------------------------------------
144   !!   Dummy module :             No rotation of the lateral mixing tensor
145   !!----------------------------------------------------------------------
146CONTAINS
147   SUBROUTINE tra_adv_eiv( kt, pun, pvn, pwn )              ! Empty routine
148      INTEGER ::   kt 
149      REAL, DIMENSION(:,:,:) ::   pun, pvn, pwn
150      WRITE(*,*) 'tra_adv_eiv: You should not have seen this print! error?',   &
151         &       kt, pun(1,1,1), pvn(1,1,1), pwn(1,1,1)
152   END SUBROUTINE tra_adv_eiv
153#endif
154
155   !!==============================================================================
156END MODULE traadv_eiv
Note: See TracBrowser for help on using the repository browser.