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

source: trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynkeg.F90 @ 4990

Last change on this file since 4990 was 4990, checked in by timgraham, 9 years ago

Merged branches/2014/dev_MERGE_2014 back onto the trunk as follows:

In the working copy of branch ran:
svn merge svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/trunk@HEAD
1 conflict in LIM_SRC_3/limdiahsb.F90
Resolved by keeping the version from dev_MERGE_2014 branch
and commited at r4989

In working copy run:
svn switch svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/trunk
to switch working copy

Run:
svn merge --reintegrate svn+ssh://forge.ipsl.jussieu.fr/ipsl/forge/projets/nemo/svn/branches/2014/dev_MERGE_2014
to merge the branch into the trunk - no conflicts at this stage.

  • Property svn:keywords set to Id
File size: 7.3 KB
RevLine 
[3]1MODULE dynkeg
2   !!======================================================================
3   !!                       ***  MODULE  dynkeg  ***
4   !! Ocean dynamics:  kinetic energy gradient trend
5   !!======================================================================
[503]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   !!----------------------------------------------------------------------
[3]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
[4990]16   USE trd_oce         ! trends: ocean variables
17   USE trddyn          ! trend manager: dynamics
18   !
[2715]19   USE in_out_manager  ! I/O manager
20   USE lib_mpp         ! MPP library
[258]21   USE prtctl          ! Print control
[3294]22   USE wrk_nemo        ! Memory Allocation
23   USE timing          ! Timing
[3]24
25   IMPLICIT NONE
26   PRIVATE
27
[503]28   PUBLIC   dyn_keg    ! routine called by step module
[3]29   
30   !! * Substitutions
31#  include "vectopt_loop_substitute.h90"
[503]32   !!----------------------------------------------------------------------
[2528]33   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
[1152]34   !! $Id$
[2715]35   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[503]36   !!----------------------------------------------------------------------
[3]37CONTAINS
38
39   SUBROUTINE dyn_keg( kt )
40      !!----------------------------------------------------------------------
41      !!                  ***  ROUTINE dyn_keg  ***
42      !!
43      !! ** Purpose :   Compute the now momentum trend due to the horizontal
44      !!      gradient of the horizontal kinetic energy and add it to the
45      !!      general momentum trend.
46      !!
[503]47      !! ** Method  :   Compute the now horizontal kinetic energy
[3]48      !!         zhke = 1/2 [ mi-1( un^2 ) + mj-1( vn^2 ) ]
49      !!      Take its horizontal gradient and add it to the general momentum
50      !!      trend (ua,va).
51      !!         ua = ua - 1/e1u di[ zhke ]
52      !!         va = va - 1/e2v dj[ zhke ]
53      !!
54      !! ** Action : - Update the (ua, va) with the hor. ke gradient trend
[4990]55      !!             - send this trends to trd_dyn (l_trddyn=T) for post-processing
[503]56      !!----------------------------------------------------------------------
57      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index
[4990]58      !
[503]59      INTEGER  ::   ji, jj, jk   ! dummy loop indices
60      REAL(wp) ::   zu, zv       ! temporary scalars
[3294]61      REAL(wp), POINTER, DIMENSION(:,:,:) :: zhke
62      REAL(wp), POINTER, DIMENSION(:,:,:) :: ztrdu, ztrdv 
[3]63      !!----------------------------------------------------------------------
[3294]64      !
65      IF( nn_timing == 1 )  CALL timing_start('dyn_keg')
66      !
67      CALL wrk_alloc( jpi, jpj, jpk, zhke )
68      !
[3]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
[216]74
[503]75      IF( l_trddyn ) THEN           ! Save ua and va trends
[3294]76         CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv )
[503]77         ztrdu(:,:,:) = ua(:,:,:) 
78         ztrdv(:,:,:) = va(:,:,:) 
[216]79      ENDIF
[3]80     
81      !                                                ! ===============
82      DO jk = 1, jpkm1                                 ! Horizontal slab
83         !                                             ! ===============
[503]84         DO jj = 2, jpj         ! Horizontal kinetic energy at T-point
[3]85            DO ji = fs_2, jpi   ! vector opt.
[503]86               zu = 0.25 * (  un(ji-1,jj  ,jk) * un(ji-1,jj  ,jk)   &
87                  &         + un(ji  ,jj  ,jk) * un(ji  ,jj  ,jk)  )
[3]88               zv = 0.25 * (  vn(ji  ,jj-1,jk) * vn(ji  ,jj-1,jk)   &
[503]89                  &         + vn(ji  ,jj  ,jk) * vn(ji  ,jj  ,jk)  )
[3]90               zhke(ji,jj,jk) = zv + zu
[2715]91!!gm simplier coding  ==>>   ~ faster
92!    don't forget to suppress local zu zv scalars
93!               zhke(ji,jj,jk) = 0.25 * (   un(ji-1,jj  ,jk) * un(ji-1,jj  ,jk)   &
94!                  &                      + un(ji  ,jj  ,jk) * un(ji  ,jj  ,jk)   &
95!                  &                      + vn(ji  ,jj-1,jk) * vn(ji  ,jj-1,jk)   &
96!                  &                      + vn(ji  ,jj  ,jk) * vn(ji  ,jj  ,jk)   )
97!!gm end <<==
[3]98            END DO 
99         END DO 
[503]100         DO jj = 2, jpjm1       ! add the gradient of kinetic energy to the general momentum trends
[3]101            DO ji = fs_2, fs_jpim1   ! vector opt.
[503]102               ua(ji,jj,jk) = ua(ji,jj,jk) - ( zhke(ji+1,jj  ,jk) - zhke(ji,jj,jk) ) / e1u(ji,jj)
103               va(ji,jj,jk) = va(ji,jj,jk) - ( zhke(ji  ,jj+1,jk) - zhke(ji,jj,jk) ) / e2v(ji,jj)
[3]104            END DO
105         END DO
[2715]106!!gm idea to be tested  ==>>   is it faster on scalar computers ?
107!         DO jj = 2, jpjm1       ! add the gradient of kinetic energy to the general momentum trends
108!            DO ji = fs_2, fs_jpim1   ! vector opt.
109!               ua(ji,jj,jk) = ua(ji,jj,jk) - 0.25 * ( + un(ji+1,jj  ,jk) * un(ji+1,jj  ,jk)   &
110!                  &                                   + vn(ji+1,jj-1,jk) * vn(ji+1,jj-1,jk)   &
111!                  &                                   + vn(ji+1,jj  ,jk) * vn(ji+1,jj  ,jk)   &
112!                  !
113!                  &                                   - un(ji-1,jj  ,jk) * un(ji-1,jj  ,jk)   &
114!                  &                                   - vn(ji  ,jj-1,jk) * vn(ji  ,jj-1,jk)   &
115!                  &                                   - vn(ji  ,jj  ,jk) * vn(ji  ,jj  ,jk)   ) / e1u(ji,jj)
116!                  !
117!               va(ji,jj,jk) = va(ji,jj,jk) - 0.25 * (   un(ji-1,jj+1,jk) * un(ji-1,jj+1,jk)   &
118!                  &                                   + un(ji  ,jj+1,jk) * un(ji  ,jj+1,jk)   &
119!                  &                                   + vn(ji  ,jj+1,jk) * vn(ji  ,jj+1,jk)   &
120!                  !
121!                  &                                   - un(ji-1,jj  ,jk) * un(ji-1,jj  ,jk)   &
122!                  &                                   - un(ji  ,jj  ,jk) * un(ji  ,jj  ,jk)   &
123!                  &                                   - vn(ji  ,jj  ,jk) * vn(ji  ,jj  ,jk)   ) / e2v(ji,jj)
124!            END DO
125!         END DO
126!!gm en idea            <<==
[3]127         !                                             ! ===============
128      END DO                                           !   End of slab
129      !                                                ! ===============
130
[503]131      IF( l_trddyn ) THEN      ! save the Kinetic Energy trends for diagnostic
132         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
133         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
[4990]134         CALL trd_dyn( ztrdu, ztrdv, jpdyn_keg, kt )
[3294]135         CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv )
[216]136      ENDIF
[503]137      !
138      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' keg  - Ua: ', mask1=umask,   &
139         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
140      !
[3294]141      CALL wrk_dealloc( jpi, jpj, jpk, zhke )
[2715]142      !
[3294]143      IF( nn_timing == 1 )  CALL timing_stop('dyn_keg')
144      !
[3]145   END SUBROUTINE dyn_keg
146
147   !!======================================================================
148END MODULE dynkeg
Note: See TracBrowser for help on using the repository browser.