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 branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/OPA_SRC/DYN – NEMO

source: branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/OPA_SRC/DYN/dynkeg.F90 @ 2620

Last change on this file since 2620 was 2590, checked in by trackstand2, 13 years ago

Merge branch 'dynamic_memory' into master-svn-dyn

  • Property svn:keywords set to Id
File size: 5.3 KB
Line 
1MODULE dynkeg
2   !!======================================================================
3   !!                       ***  MODULE  dynkeg  ***
4   !! Ocean dynamics:  kinetic energy gradient trend
5   !!======================================================================
6   !! History :  1.0  !  87-09  (P. Andrich, m.-a. Foujols)  Original code
7   !!            7.0  !  97-05  (G. Madec)  Split dynber into dynkeg and dynhpg
8   !!            9.0  !  02-07  (G. Madec)  F90: Free form and module
9   !!----------------------------------------------------------------------
10   
11   !!----------------------------------------------------------------------
12   !!   dyn_keg      : update the momentum trend with the horizontal tke
13   !!----------------------------------------------------------------------
14   USE oce             ! ocean dynamics and tracers
15   USE dom_oce         ! ocean space and time domain
16   USE in_out_manager  ! I/O manager
17   USE trdmod          ! ocean dynamics trends
18   USE trdmod_oce      ! ocean variables trends
19   USE prtctl          ! Print control
20
21   IMPLICIT NONE
22   PRIVATE
23
24   PUBLIC   dyn_keg    ! routine called by step module
25   
26   !! * Substitutions
27#  include "vectopt_loop_substitute.h90"
28   !!----------------------------------------------------------------------
29   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
30   !! $Id$
31   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
32   !!----------------------------------------------------------------------
33
34CONTAINS
35
36   SUBROUTINE dyn_keg( kt )
37      !!----------------------------------------------------------------------
38      !!                  ***  ROUTINE dyn_keg  ***
39      !!
40      !! ** Purpose :   Compute the now momentum trend due to the horizontal
41      !!      gradient of the horizontal kinetic energy and add it to the
42      !!      general momentum trend.
43      !!
44      !! ** Method  :   Compute the now horizontal kinetic energy
45      !!         zhke = 1/2 [ mi-1( un^2 ) + mj-1( vn^2 ) ]
46      !!      Take its horizontal gradient and add it to the general momentum
47      !!      trend (ua,va).
48      !!         ua = ua - 1/e1u di[ zhke ]
49      !!         va = va - 1/e2v dj[ zhke ]
50      !!
51      !! ** Action : - Update the (ua, va) with the hor. ke gradient trend
52      !!             - save this trends (l_trddyn=T) for post-processing
53      !!----------------------------------------------------------------------
54      USE oce, ONLY :   ztrdu => ta   ! use ta as 3D workspace   
55      USE oce, ONLY :   ztrdv => sa   ! use sa as 3D workspace   
56      USE wrk_nemo, ONLY: wrk_use, wrk_release
57      USE wrk_nemo, ONLY: zhke => wrk_3d_1
58      !!
59      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index
60      !!
61      INTEGER  ::   ji, jj, jk   ! dummy loop indices
62      REAL(wp) ::   zu, zv       ! temporary scalars
63      !!----------------------------------------------------------------------
64
65      IF(.NOT. wrk_use(3,1))THEN
66         CALL ctl_stop('dyn_key: requested workspace array is unavailable.')
67      END IF
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      IF( l_trddyn ) THEN           ! Save ua and va trends
76         ztrdu(:,:,:) = ua(:,:,:) 
77         ztrdv(:,:,:) = va(:,:,:) 
78      ENDIF
79     
80      !                                                ! ===============
81      DO jk = 1, jpkm1                                 ! Horizontal slab
82         !                                             ! ===============
83         DO jj = 2, jpj         ! Horizontal kinetic energy at T-point
84            DO ji = fs_2, jpi   ! vector opt.
85               zu = 0.25 * (  un(ji-1,jj  ,jk) * un(ji-1,jj  ,jk)   &
86                  &         + un(ji  ,jj  ,jk) * un(ji  ,jj  ,jk)  )
87               zv = 0.25 * (  vn(ji  ,jj-1,jk) * vn(ji  ,jj-1,jk)   &
88                  &         + vn(ji  ,jj  ,jk) * vn(ji  ,jj  ,jk)  )
89               zhke(ji,jj,jk) = zv + zu
90            END DO 
91         END DO 
92         DO jj = 2, jpjm1       ! add the gradient of kinetic energy to the general momentum trends
93            DO ji = fs_2, fs_jpim1   ! vector opt.
94               ua(ji,jj,jk) = ua(ji,jj,jk) - ( zhke(ji+1,jj  ,jk) - zhke(ji,jj,jk) ) / e1u(ji,jj)
95               va(ji,jj,jk) = va(ji,jj,jk) - ( zhke(ji  ,jj+1,jk) - zhke(ji,jj,jk) ) / e2v(ji,jj)
96            END DO
97         END DO
98         !                                             ! ===============
99      END DO                                           !   End of slab
100      !                                                ! ===============
101
102      IF( l_trddyn ) THEN      ! save the Kinetic Energy trends for diagnostic
103         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
104         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
105         CALL trd_mod( ztrdu, ztrdv, jpdyn_trd_keg, 'DYN', kt )
106      ENDIF
107      !
108      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' keg  - Ua: ', mask1=umask,   &
109         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
110      !
111      IF(.NOT. wrk_release(3,1))THEN
112         CALL ctl_stop('dyn_key: failed to release workspace array.')
113      END IF
114
115   END SUBROUTINE dyn_keg
116
117   !!======================================================================
118END MODULE dynkeg
Note: See TracBrowser for help on using the repository browser.