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

source: trunk/NEMO/OPA_SRC/DYN/dynkeg.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: 5.4 KB
Line 
1MODULE dynkeg
2   !!======================================================================
3   !!                       ***  MODULE  dynkeg  ***
4   !! Ocean dynamics:  kinetic energy gradient trend
5   !!======================================================================
6   
7   !!----------------------------------------------------------------------
8   !!   dyn_keg      : update the momentum trend with the horizontal tke
9   !!----------------------------------------------------------------------
10   !! * Modules used
11   USE oce             ! ocean dynamics and tracers
12   USE dom_oce         ! ocean space and time domain
13   USE in_out_manager  ! I/O manager
14   USE trdmod          ! ocean dynamics trends
15   USE trdmod_oce      ! ocean variables trends
16
17   IMPLICIT NONE
18   PRIVATE
19
20   !! * Accessibility
21   PUBLIC dyn_keg                ! routine called by step.F90
22   
23   !! * Substitutions
24#  include "vectopt_loop_substitute.h90"
25   !!---------------------------------------------------------------------------------
26   !!   OPA 9.0 , LODYC-IPSL  (2003)
27   !!---------------------------------------------------------------------------------
28
29CONTAINS
30
31   SUBROUTINE dyn_keg( kt )
32      !!----------------------------------------------------------------------
33      !!                  ***  ROUTINE dyn_keg  ***
34      !!
35      !! ** Purpose :   Compute the now momentum trend due to the horizontal
36      !!      gradient of the horizontal kinetic energy and add it to the
37      !!      general momentum trend.
38      !!
39      !! ** Method  :   Compute the now horizontal kinetic energy:
40      !!         zhke = 1/2 [ mi-1( un^2 ) + mj-1( vn^2 ) ]
41      !!      Take its horizontal gradient and add it to the general momentum
42      !!      trend (ua,va).
43      !!         ua = ua - 1/e1u di[ zhke ]
44      !!         va = va - 1/e2v dj[ zhke ]
45      !!
46      !! ** Action : - Update the (ua, va) with the hor. ke gradient trend
47      !!             - Save the trends in (utrd,vtrd) ('key_trddyn')
48      !!
49      !! History :
50      !!   1.0  !  87-09  (P. Andrich, m.-a. Foujols)  Original code
51      !!   7.0  !  97-05  (G. Madec)  Split dynber into dynkeg and dynhpg
52      !!   9.0  !  02-07  (G. Madec)  F90: Free form and module
53      !!    "   !  04-08  (C. Talandier) New trends organization
54      !!----------------------------------------------------------------------
55      !! * Modules used     
56      USE oce, ONLY :    ztdua => ta,   & ! use ta as 3D workspace   
57                         ztdva => sa      ! use sa as 3D workspace   
58
59      !! * Arguments
60      INTEGER, INTENT( in ) ::   kt     ! ocean time-step index
61
62      !! * Local declarations
63      INTEGER  ::   ji, jj, jk          ! dummy loop indices
64      REAL(wp) ::   zua, zva, zu, zv    ! temporary scalars
65      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   &
66         zhke                           ! temporary workspace
67      !!----------------------------------------------------------------------
68
69      IF( kt == nit000 ) THEN
70         IF(lwp) WRITE(numout,*)
71         IF(lwp) WRITE(numout,*) 'dyn_keg : kinetic energy gradient trend'
72         IF(lwp) WRITE(numout,*) '~~~~~~~'
73      ENDIF
74
75      ! Save ua and va trends
76      IF( l_trddyn )   THEN
77         ztdua(:,:,:) = ua(:,:,:) 
78         ztdva(:,:,:) = va(:,:,:) 
79      ENDIF
80     
81      !                                                ! ===============
82      DO jk = 1, jpkm1                                 ! Horizontal slab
83         !                                             ! ===============
84         ! Horizontal kinetic energy at T-point
85         DO jj = 2, jpj
86            DO ji = fs_2, jpi   ! vector opt.
87               zv = 0.25 * (  vn(ji  ,jj-1,jk) * vn(ji  ,jj-1,jk)   &
88                            + vn(ji  ,jj  ,jk) * vn(ji  ,jj  ,jk)  )
89               zu = 0.25 * (  un(ji-1,jj  ,jk) * un(ji-1,jj  ,jk)   &
90                            + un(ji  ,jj  ,jk) * un(ji  ,jj  ,jk)  )
91               zhke(ji,jj,jk) = zv + zu
92            END DO 
93         END DO 
94         
95         ! Horizontal gradient of Horizontal kinetic energy
96         DO jj = 2, jpjm1
97            DO ji = fs_2, fs_jpim1   ! vector opt.
98               ! gradient of kinetic energy
99               zua = -( zhke(ji+1,jj  ,jk) - zhke(ji,jj,jk) ) / e1u(ji,jj)
100               zva = -( zhke(ji  ,jj+1,jk) - zhke(ji,jj,jk) ) / e2v(ji,jj)
101               ! add to the general momentum trends
102               ua(ji,jj,jk) = ua(ji,jj,jk) + zua
103               va(ji,jj,jk) = va(ji,jj,jk) + zva
104            END DO
105         END DO
106         !                                             ! ===============
107      END DO                                           !   End of slab
108      !                                                ! ===============
109
110      ! save the Kinetic Energy trends for diagnostic
111      ! momentum trends
112      IF( l_trddyn )   THEN
113         ztdua(:,:,:) = ua(:,:,:) - ztdua(:,:,:)
114         ztdva(:,:,:) = va(:,:,:) - ztdva(:,:,:)
115
116         CALL trd_mod(ztdua, ztdva, jpdtdkeg, 'DYN', kt)
117      ENDIF
118
119      IF(l_ctl) THEN         ! print sum trends (used for debugging)
120         zua = SUM( ua(2:nictl,2:njctl,1:jpkm1) * umask(2:nictl,2:njctl,1:jpkm1) )
121         zva = SUM( va(2:nictl,2:njctl,1:jpkm1) * vmask(2:nictl,2:njctl,1:jpkm1) )
122         WRITE(numout,*) ' keg  - Ua: ', zua-u_ctl, ' Va: ', zva-v_ctl
123         u_ctl = zua   ;   v_ctl = zva
124      ENDIF
125
126   END SUBROUTINE dyn_keg
127
128   !!======================================================================
129END MODULE dynkeg
Note: See TracBrowser for help on using the repository browser.