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 NEMO/trunk/src/OCE/DYN – NEMO

source: NEMO/trunk/src/OCE/DYN/dynkeg.F90

Last change on this file was 14834, checked in by hadcv, 3 years ago

#2600: Merge in dev_r14273_HPC-02_Daley_Tiling

  • Property svn:keywords set to Id
File size: 8.1 KB
RevLine 
[3]1MODULE dynkeg
2   !!======================================================================
3   !!                       ***  MODULE  dynkeg  ***
4   !! Ocean dynamics:  kinetic energy gradient trend
5   !!======================================================================
[5321]6   !! History :  1.0  !  1987-09  (P. Andrich, M.-A. Foujols)  Original code
7   !!            7.0  !  1997-05  (G. Madec)  Split dynber into dynkeg and dynhpg
8   !!  NEMO      1.0  !  2002-07  (G. Madec)  F90: Free form and module
[5328]9   !!            3.6  !  2015-05  (N. Ducousso, G. Madec)  add Hollingsworth scheme as an option
[503]10   !!----------------------------------------------------------------------
[5328]11   
[3]12   !!----------------------------------------------------------------------
13   !!   dyn_keg      : update the momentum trend with the horizontal tke
14   !!----------------------------------------------------------------------
15   USE oce             ! ocean dynamics and tracers
16   USE dom_oce         ! ocean space and time domain
[4990]17   USE trd_oce         ! trends: ocean variables
18   USE trddyn          ! trend manager: dynamics
19   !
[2715]20   USE in_out_manager  ! I/O manager
[5321]21   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
[2715]22   USE lib_mpp         ! MPP library
[258]23   USE prtctl          ! Print control
[3294]24   USE timing          ! Timing
[7646]25   USE bdy_oce         ! ocean open boundary conditions
[3]26
27   IMPLICIT NONE
28   PRIVATE
29
[503]30   PUBLIC   dyn_keg    ! routine called by step module
[5328]31   
[5321]32   INTEGER, PARAMETER, PUBLIC  ::   nkeg_C2  = 0   !: 2nd order centered scheme (standard scheme)
33   INTEGER, PARAMETER, PUBLIC  ::   nkeg_HW  = 1   !: Hollingsworth et al., QJRMS, 1983
34   !
35   REAL(wp) ::   r1_48 = 1._wp / 48._wp   !: =1/(4*2*6)
[5328]36   
[3]37   !! * Substitutions
[12377]38#  include "do_loop_substitute.h90"
[503]39   !!----------------------------------------------------------------------
[9598]40   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
[5328]41   !! $Id$
[10068]42   !! Software governed by the CeCILL license (see ./LICENSE)
[503]43   !!----------------------------------------------------------------------
[3]44CONTAINS
45
[12377]46   SUBROUTINE dyn_keg( kt, kscheme, Kmm, puu, pvv, Krhs )
[3]47      !!----------------------------------------------------------------------
48      !!                  ***  ROUTINE dyn_keg  ***
49      !!
50      !! ** Purpose :   Compute the now momentum trend due to the horizontal
[5328]51      !!      gradient of the horizontal kinetic energy and add it to the
[3]52      !!      general momentum trend.
53      !!
[5328]54      !! ** Method  : * kscheme = nkeg_C2 : 2nd order centered scheme that
55      !!      conserve kinetic energy. Compute the now horizontal kinetic energy
[3]56      !!         zhke = 1/2 [ mi-1( un^2 ) + mj-1( vn^2 ) ]
[5321]57      !!              * kscheme = nkeg_HW : Hollingsworth correction following
58      !!      Arakawa (2001). The now horizontal kinetic energy is given by:
[12377]59      !!         zhke = 1/6 [ mi-1(  2 * un^2 + ((u(j+1)+u(j-1))/2)^2  )
60      !!                    + mj-1(  2 * vn^2 + ((v(i+1)+v(i-1))/2)^2  ) ]
[5328]61      !!     
[3]62      !!      Take its horizontal gradient and add it to the general momentum
[12377]63      !!      trend.
64      !!         u(rhs) = u(rhs) - 1/e1u di[ zhke ]
65      !!         v(rhs) = v(rhs) - 1/e2v dj[ zhke ]
[3]66      !!
[12377]67      !! ** Action : - Update the (puu(:,:,:,Krhs), pvv(:,:,:,Krhs)) with the hor. ke gradient trend
[4990]68      !!             - send this trends to trd_dyn (l_trddyn=T) for post-processing
[5321]69      !!
70      !! ** References : Arakawa, A., International Geophysics 2001.
71      !!                 Hollingsworth et al., Quart. J. Roy. Meteor. Soc., 1983.
[503]72      !!----------------------------------------------------------------------
[12377]73      INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step index
74      INTEGER                             , INTENT( in )  ::  kscheme          ! =0/1   type of KEG scheme
75      INTEGER                             , INTENT( in )  ::  Kmm, Krhs        ! ocean time level indices
76      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation
[4990]77      !
[11536]78      INTEGER  ::   ji, jj, jk             ! dummy loop indices
[10996]79      REAL(wp) ::   zu, zv                   ! local scalars
[14834]80      REAL(wp), DIMENSION(A2D(nn_hls),jpk)    ::   zhke
[9019]81      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   ztrdu, ztrdv 
[3]82      !!----------------------------------------------------------------------
[3294]83      !
[9019]84      IF( ln_timing )   CALL timing_start('dyn_keg')
[3294]85      !
[14834]86      IF( .NOT. l_istiled .OR. ntile == 1 )  THEN                       ! Do only on the first tile
87         IF( kt == nit000 ) THEN
88            IF(lwp) WRITE(numout,*)
89            IF(lwp) WRITE(numout,*) 'dyn_keg : kinetic energy gradient trend, scheme number=', kscheme
90            IF(lwp) WRITE(numout,*) '~~~~~~~'
91         ENDIF
[3]92      ENDIF
[216]93
[9019]94      IF( l_trddyn ) THEN           ! Save the input trends
95         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) )
[12377]96         ztrdu(:,:,:) = puu(:,:,:,Krhs) 
97         ztrdv(:,:,:) = pvv(:,:,:,Krhs) 
[216]98      ENDIF
[5328]99     
[7753]100      zhke(:,:,jpk) = 0._wp
[7646]101
[5328]102      SELECT CASE ( kscheme )             !== Horizontal kinetic energy at T-point  ==!
103      !
104      CASE ( nkeg_C2 )                          !--  Standard scheme  --!
[13295]105         DO_3D( 0, 1, 0, 1, 1, jpkm1 )
[12377]106            zu =    puu(ji-1,jj  ,jk,Kmm) * puu(ji-1,jj  ,jk,Kmm)   &
107               &  + puu(ji  ,jj  ,jk,Kmm) * puu(ji  ,jj  ,jk,Kmm)
108            zv =    pvv(ji  ,jj-1,jk,Kmm) * pvv(ji  ,jj-1,jk,Kmm)   &
109               &  + pvv(ji  ,jj  ,jk,Kmm) * pvv(ji  ,jj  ,jk,Kmm)
110            zhke(ji,jj,jk) = 0.25_wp * ( zv + zu )
111         END_3D
[5328]112      CASE ( nkeg_HW )                          !--  Hollingsworth scheme  --!
[14834]113         DO_3D( 0, nn_hls-1, 0, nn_hls-1, 1, jpkm1 )
[14820]114            ! round brackets added to fix the order of floating point operations
115            ! needed to ensure halo 1 - halo 2 compatibility
[12377]116            zu = 8._wp * ( puu(ji-1,jj  ,jk,Kmm) * puu(ji-1,jj  ,jk,Kmm)    &
117               &         + puu(ji  ,jj  ,jk,Kmm) * puu(ji  ,jj  ,jk,Kmm) )  &
[14820]118               &   +     ( ( puu(ji-1,jj-1,jk,Kmm) + puu(ji-1,jj+1,jk,Kmm) ) * ( puu(ji-1,jj-1,jk,Kmm) + puu(ji-1,jj+1,jk,Kmm) )   &
119               &   +       ( puu(ji  ,jj-1,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) ) * ( puu(ji  ,jj-1,jk,Kmm) + puu(ji  ,jj+1,jk,Kmm) )   &
120               &         )                                                               ! bracket for halo 1 - halo 2 compatibility
[12377]121               !
122            zv = 8._wp * ( pvv(ji  ,jj-1,jk,Kmm) * pvv(ji  ,jj-1,jk,Kmm)    &
123               &         + pvv(ji  ,jj  ,jk,Kmm) * pvv(ji  ,jj  ,jk,Kmm) )  &
[14820]124               &  +      ( ( pvv(ji-1,jj-1,jk,Kmm) + pvv(ji+1,jj-1,jk,Kmm) ) * ( pvv(ji-1,jj-1,jk,Kmm) + pvv(ji+1,jj-1,jk,Kmm) )  &
[14834]125               &  +        ( pvv(ji-1,jj  ,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) ) * ( pvv(ji-1,jj  ,jk,Kmm) + pvv(ji+1,jj  ,jk,Kmm) )  &
[14820]126               &         )                                                               ! bracket for halo 1 - halo 2 compatibility
[12377]127            zhke(ji,jj,jk) = r1_48 * ( zv + zu )
128         END_3D
[14834]129         IF (nn_hls==1) CALL lbc_lnk( 'dynkeg', zhke, 'T', 1.0_wp )
[5321]130         !
[10996]131      END SELECT 
[5328]132      !
[13497]133      DO_3D( 0, 0, 0, 0, 1, jpkm1 )       !==  grad( KE ) added to the general momentum trends  ==!
[12377]134         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zhke(ji+1,jj  ,jk) - zhke(ji,jj,jk) ) / e1u(ji,jj)
135         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zhke(ji  ,jj+1,jk) - zhke(ji,jj,jk) ) / e2v(ji,jj)
136      END_3D
[5321]137      !
138      IF( l_trddyn ) THEN                 ! save the Kinetic Energy trends for diagnostic
[12377]139         ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:)
140         ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:)
141         CALL trd_dyn( ztrdu, ztrdv, jpdyn_keg, kt, Kmm )
[9019]142         DEALLOCATE( ztrdu , ztrdv )
[216]143      ENDIF
[503]144      !
[12377]145      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' keg  - Ua: ', mask1=umask,   &
146         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
[503]147      !
[9019]148      IF( ln_timing )   CALL timing_stop('dyn_keg')
[2715]149      !
[3]150   END SUBROUTINE dyn_keg
151
152   !!======================================================================
153END MODULE dynkeg
Note: See TracBrowser for help on using the repository browser.