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.
dynzad.F90 in NEMO/trunk/src/OCE/DYN – NEMO

source: NEMO/trunk/src/OCE/DYN/dynzad.F90 @ 13286

Last change on this file since 13286 was 13237, checked in by smasson, 4 years ago

trunk: Mid-year merge, merge back KERNEL-06_techene_e3

  • Property svn:keywords set to Id
File size: 5.5 KB
RevLine 
[3]1MODULE dynzad
2   !!======================================================================
3   !!                       ***  MODULE  dynzad  ***
4   !! Ocean dynamics : vertical advection trend
5   !!======================================================================
[2715]6   !! History :  OPA  ! 1991-01  (G. Madec) Original code
7   !!   NEMO     0.5  ! 2002-07  (G. Madec) Free form, F90
[503]8   !!----------------------------------------------------------------------
[3]9   
10   !!----------------------------------------------------------------------
[503]11   !!   dyn_zad       : vertical advection momentum trend
[3]12   !!----------------------------------------------------------------------
[503]13   USE oce            ! ocean dynamics and tracers
14   USE dom_oce        ! ocean space and time domain
[888]15   USE sbc_oce        ! surface boundary condition: ocean
[4990]16   USE trd_oce        ! trends: ocean variables
17   USE trddyn         ! trend manager: dynamics
18   !
[719]19   USE in_out_manager ! I/O manager
[4990]20   USE lib_mpp        ! MPP library
[503]21   USE prtctl         ! Print control
[4990]22   USE timing         ! Timing
[3]23
24   IMPLICIT NONE
25   PRIVATE
26   
[4990]27   PUBLIC   dyn_zad       ! routine called by dynadv.F90
[3]28
29   !! * Substitutions
[12377]30#  include "do_loop_substitute.h90"
[13237]31#  include "domzgr_substitute.h90"
[3]32   !!----------------------------------------------------------------------
[9598]33   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
[888]34   !! $Id$
[10068]35   !! Software governed by the CeCILL license (see ./LICENSE)
[3]36   !!----------------------------------------------------------------------
37CONTAINS
38
[12377]39   SUBROUTINE dyn_zad ( kt, Kmm, puu, pvv, Krhs )
[3]40      !!----------------------------------------------------------------------
41      !!                  ***  ROUTINE dynzad  ***
42      !!
43      !! ** Purpose :   Compute the now vertical momentum advection trend and
44      !!      add it to the general trend of momentum equation.
45      !!
46      !! ** Method  :   The now vertical advection of momentum is given by:
[12377]47      !!         w dz(u) = u(rhs) + 1/(e1e2u*e3u) mk+1[ mi(e1e2t*ww) dk(u) ]
48      !!         w dz(v) = v(rhs) + 1/(e1e2v*e3v) mk+1[ mj(e1e2t*ww) dk(v) ]
49      !!      Add this trend to the general trend (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)):
50      !!         (u(rhs),v(rhs)) = (u(rhs),v(rhs)) + w dz(u,v)
[3]51      !!
[12377]52      !! ** Action  : - Update (puu(:,:,:,Krhs),pvv(:,:,:,Krhs)) with the vert. momentum adv. trends
[4990]53      !!              - Send the trends to trddyn for diagnostics (l_trddyn=T)
[3294]54      !!----------------------------------------------------------------------
[12377]55      INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step inedx
56      INTEGER                             , INTENT( in )  ::  Kmm, Krhs        ! ocean time level indices
57      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation
[2715]58      !
[9019]59      INTEGER  ::   ji, jj, jk   ! dummy loop indices
60      REAL(wp) ::   zua, zva     ! local scalars
61      REAL(wp), DIMENSION(jpi,jpj)     ::   zww
62      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwuw, zwvw
63      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv
[3]64      !!----------------------------------------------------------------------
[3294]65      !
[9019]66      IF( ln_timing )   CALL timing_start('dyn_zad')
[3294]67      !
[3]68      IF( kt == nit000 ) THEN
[9019]69         IF(lwp) WRITE(numout,*)
70         IF(lwp) WRITE(numout,*) 'dyn_zad : 2nd order vertical advection scheme'
[3]71      ENDIF
[216]72
[12377]73      IF( l_trddyn )   THEN         ! Save puu(:,:,:,Krhs) and pvv(:,:,:,Krhs) trends
[9019]74         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 
[12377]75         ztrdu(:,:,:) = puu(:,:,:,Krhs) 
76         ztrdv(:,:,:) = pvv(:,:,:,Krhs) 
[216]77      ENDIF
[3]78     
[503]79      DO jk = 2, jpkm1              ! Vertical momentum advection at level w and u- and v- vertical
[12377]80         DO_2D_01_01
81            zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk)
82         END_2D
83         DO_2D_00_00
84            zwuw(ji,jj,jk) = ( zww(ji+1,jj  ) + zww(ji,jj) ) * ( puu(ji,jj,jk-1,Kmm) - puu(ji,jj,jk,Kmm) )
85            zwvw(ji,jj,jk) = ( zww(ji  ,jj+1) + zww(ji,jj) ) * ( pvv(ji,jj,jk-1,Kmm) - pvv(ji,jj,jk,Kmm) )
86         END_2D
[3]87      END DO
[5120]88      !
89      ! Surface and bottom advective fluxes set to zero
[12377]90      DO_2D_00_00
91         zwuw(ji,jj, 1 ) = 0._wp
92         zwvw(ji,jj, 1 ) = 0._wp
93         zwuw(ji,jj,jpk) = 0._wp
94         zwvw(ji,jj,jpk) = 0._wp
95      END_2D
[9965]96      !
[12377]97      DO_3D_00_00( 1, jpkm1 )
[13237]98         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj)   &
99            &                                      / e3u(ji,jj,jk,Kmm)
100         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj)   &
101            &                                      / e3v(ji,jj,jk,Kmm)
[12377]102      END_3D
[3]103
[503]104      IF( l_trddyn ) THEN           ! save the vertical advection trends for diagnostic
[12377]105         ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:)
106         ztrdv(:,:,:) = pvv(:,:,:,Krhs) - ztrdv(:,:,:)
107         CALL trd_dyn( ztrdu, ztrdv, jpdyn_zad, kt, Kmm )
[9019]108         DEALLOCATE( ztrdu, ztrdv ) 
[216]109      ENDIF
[503]110      !                             ! Control print
[12377]111      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab3d_1=puu(:,:,:,Krhs), clinfo1=' zad  - Ua: ', mask1=umask,   &
112         &                                  tab3d_2=pvv(:,:,:,Krhs), clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
[503]113      !
[9019]114      IF( ln_timing )   CALL timing_stop('dyn_zad')
[2715]115      !
[3]116   END SUBROUTINE dyn_zad
117
[503]118   !!======================================================================
[3]119END MODULE dynzad
Note: See TracBrowser for help on using the repository browser.