source: NEMO/branches/UKMO/NEMO4_beta_mirror/src/OCE/DYN/dynzad.F90 @ 9950

Last change on this file since 9950 was 9950, checked in by davestorkey, 3 years ago

UKMO/NEMO4_beta_mirror branch: remove SVN keywords

File size: 5.7 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
30#  include "vectopt_loop_substitute.h90"
31   !!----------------------------------------------------------------------
[9598]32   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
[888]33   !! $Id$
[9598]34   !! Software governed by the CeCILL licence     (./LICENSE)
[3]35   !!----------------------------------------------------------------------
36CONTAINS
37
38   SUBROUTINE dyn_zad ( kt )
39      !!----------------------------------------------------------------------
40      !!                  ***  ROUTINE dynzad  ***
41      !!
42      !! ** Purpose :   Compute the now vertical momentum advection trend and
43      !!      add it to the general trend of momentum equation.
44      !!
45      !! ** Method  :   The now vertical advection of momentum is given by:
[5836]46      !!         w dz(u) = ua + 1/(e1e2u*e3u) mk+1[ mi(e1e2t*wn) dk(un) ]
47      !!         w dz(v) = va + 1/(e1e2v*e3v) mk+1[ mj(e1e2t*wn) dk(vn) ]
[3]48      !!      Add this trend to the general trend (ua,va):
49      !!         (ua,va) = (ua,va) + w dz(u,v)
50      !!
51      !! ** Action  : - Update (ua,va) with the vert. momentum adv. trends
[4990]52      !!              - Send the trends to trddyn for diagnostics (l_trddyn=T)
[3294]53      !!----------------------------------------------------------------------
[503]54      INTEGER, INTENT(in) ::   kt   ! ocean time-step inedx
[2715]55      !
[9019]56      INTEGER  ::   ji, jj, jk   ! dummy loop indices
57      REAL(wp) ::   zua, zva     ! local scalars
58      REAL(wp), DIMENSION(jpi,jpj)     ::   zww
59      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwuw, zwvw
60      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv
[3]61      !!----------------------------------------------------------------------
[3294]62      !
[9019]63      IF( ln_timing )   CALL timing_start('dyn_zad')
[3294]64      !
[3]65      IF( kt == nit000 ) THEN
[9019]66         IF(lwp) WRITE(numout,*)
67         IF(lwp) WRITE(numout,*) 'dyn_zad : 2nd order vertical advection scheme'
[3]68      ENDIF
[216]69
[503]70      IF( l_trddyn )   THEN         ! Save ua and va trends
[9019]71         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 
[7753]72         ztrdu(:,:,:) = ua(:,:,:) 
73         ztrdv(:,:,:) = va(:,:,:) 
[216]74      ENDIF
[3]75     
[503]76      DO jk = 2, jpkm1              ! Vertical momentum advection at level w and u- and v- vertical
77         DO jj = 2, jpj                   ! vertical fluxes
78            DO ji = fs_2, jpi             ! vector opt.
[5836]79               zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk)
[3]80            END DO
81         END DO
[503]82         DO jj = 2, jpjm1                 ! vertical momentum advection at w-point
83            DO ji = fs_2, fs_jpim1        ! vector opt.
[6140]84               zwuw(ji,jj,jk) = ( zww(ji+1,jj  ) + zww(ji,jj) ) * ( un(ji,jj,jk-1) - un(ji,jj,jk) )
85               zwvw(ji,jj,jk) = ( zww(ji  ,jj+1) + zww(ji,jj) ) * ( vn(ji,jj,jk-1) - vn(ji,jj,jk) )
[3]86            END DO 
87         END DO   
88      END DO
[5120]89      !
90      ! Surface and bottom advective fluxes set to zero
[9019]91      IF( ln_isfcav ) THEN
[5120]92         DO jj = 2, jpjm1
93            DO ji = fs_2, fs_jpim1           ! vector opt.
94               zwuw(ji,jj, 1:miku(ji,jj) ) = 0._wp
95               zwvw(ji,jj, 1:mikv(ji,jj) ) = 0._wp
96               zwuw(ji,jj,jpk) = 0._wp
97               zwvw(ji,jj,jpk) = 0._wp
98            END DO
99         END DO
100      ELSE
101         DO jj = 2, jpjm1       
102            DO ji = fs_2, fs_jpim1           ! vector opt.
103               zwuw(ji,jj, 1 ) = 0._wp
104               zwvw(ji,jj, 1 ) = 0._wp
105               zwuw(ji,jj,jpk) = 0._wp
106               zwvw(ji,jj,jpk) = 0._wp
107            END DO 
108         END DO
109      END IF
[3]110
[503]111      DO jk = 1, jpkm1              ! Vertical momentum advection at u- and v-points
[3]112         DO jj = 2, jpjm1
[503]113            DO ji = fs_2, fs_jpim1       ! vector opt.
[9019]114               ua(ji,jj,jk) = ua(ji,jj,jk) - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk)
115               va(ji,jj,jk) = va(ji,jj,jk) - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk)
[3]116            END DO 
117         END DO 
118      END DO
119
[503]120      IF( l_trddyn ) THEN           ! save the vertical advection trends for diagnostic
[7753]121         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
122         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
[4990]123         CALL trd_dyn( ztrdu, ztrdv, jpdyn_zad, kt )
[9019]124         DEALLOCATE( ztrdu, ztrdv ) 
[216]125      ENDIF
[503]126      !                             ! Control print
127      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' zad  - Ua: ', mask1=umask,   &
128         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
129      !
[9019]130      IF( ln_timing )   CALL timing_stop('dyn_zad')
[2715]131      !
[3]132   END SUBROUTINE dyn_zad
133
[503]134   !!======================================================================
[3]135END MODULE dynzad
Note: See TracBrowser for help on using the repository browser.