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

source: trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynzad.F90 @ 4389

Last change on this file since 4389 was 3294, checked in by rblod, 12 years ago

Merge of 3.4beta into the trunk

  • Property svn:keywords set to Id
File size: 6.0 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   !!            7.0  ! 1991-11  (G. Madec)
8   !!            7.5  ! 1996-01  (G. Madec) statement function for e3
9   !!   NEMO     0.5  ! 2002-07  (G. Madec) Free form, F90
[503]10   !!----------------------------------------------------------------------
[3]11   
12   !!----------------------------------------------------------------------
[503]13   !!   dyn_zad       : vertical advection momentum trend
[3]14   !!----------------------------------------------------------------------
[503]15   USE oce            ! ocean dynamics and tracers
16   USE dom_oce        ! ocean space and time domain
[888]17   USE sbc_oce        ! surface boundary condition: ocean
18   USE trdmod_oce     ! ocean variables trends
19   USE trdmod         ! ocean dynamics trends
[719]20   USE in_out_manager ! I/O manager
[2715]21   USE lib_mpp         ! MPP library
[503]22   USE prtctl         ! Print control
[3294]23   USE wrk_nemo        ! Memory Allocation
24   USE timing          ! Timing
[3]25
26   IMPLICIT NONE
27   PRIVATE
28   
[503]29   PUBLIC   dyn_zad   ! routine called by step.F90
[3]30
31   !! * Substitutions
32#  include "domzgr_substitute.h90"
33#  include "vectopt_loop_substitute.h90"
34   !!----------------------------------------------------------------------
[2528]35   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
[888]36   !! $Id$
[2715]37   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[3]38   !!----------------------------------------------------------------------
39CONTAINS
40
41   SUBROUTINE dyn_zad ( kt )
42      !!----------------------------------------------------------------------
43      !!                  ***  ROUTINE dynzad  ***
44      !!
45      !! ** Purpose :   Compute the now vertical momentum advection trend and
46      !!      add it to the general trend of momentum equation.
47      !!
48      !! ** Method  :   The now vertical advection of momentum is given by:
49      !!         w dz(u) = ua + 1/(e1u*e2u*e3u) mk+1[ mi(e1t*e2t*wn) dk(un) ]
50      !!         w dz(v) = va + 1/(e1v*e2v*e3v) mk+1[ mj(e1t*e2t*wn) dk(vn) ]
51      !!      Add this trend to the general trend (ua,va):
52      !!         (ua,va) = (ua,va) + w dz(u,v)
53      !!
54      !! ** Action  : - Update (ua,va) with the vert. momentum adv. trends
[503]55      !!              - Save the trends in (ztrdu,ztrdv) ('key_trddyn')
[3294]56      !!----------------------------------------------------------------------
[503]57      INTEGER, INTENT(in) ::   kt   ! ocean time-step inedx
[2715]58      !
[503]59      INTEGER  ::   ji, jj, jk      ! dummy loop indices
60      REAL(wp) ::   zua, zva        ! temporary scalars
[3294]61      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zwuw , zwvw
62      REAL(wp), POINTER, DIMENSION(:,:  ) ::  zww
63      REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdu, ztrdv
[3]64      !!----------------------------------------------------------------------
[3294]65      !
66      IF( nn_timing == 1 )  CALL timing_start('dyn_zad')
67      !
68      CALL wrk_alloc( jpi,jpj, zww ) 
69      CALL wrk_alloc( jpi,jpj,jpk, zwuw , zwvw ) 
70      !
[3]71      IF( kt == nit000 ) THEN
72         IF(lwp)WRITE(numout,*)
73         IF(lwp)WRITE(numout,*) 'dyn_zad : arakawa advection scheme'
74      ENDIF
[216]75
[503]76      IF( l_trddyn )   THEN         ! Save ua and va trends
[3294]77         CALL wrk_alloc( jpi, jpj, jpk, ztrdu, ztrdv ) 
[503]78         ztrdu(:,:,:) = ua(:,:,:) 
79         ztrdv(:,:,:) = va(:,:,:) 
[216]80      ENDIF
[3]81     
[503]82      DO jk = 2, jpkm1              ! Vertical momentum advection at level w and u- and v- vertical
83         DO jj = 2, jpj                   ! vertical fluxes
84            DO ji = fs_2, jpi             ! vector opt.
[3]85               zww(ji,jj) = 0.25 * e1t(ji,jj) * e2t(ji,jj) * wn(ji,jj,jk)
86            END DO
87         END DO
[503]88         DO jj = 2, jpjm1                 ! vertical momentum advection at w-point
89            DO ji = fs_2, fs_jpim1        ! vector opt.
[3]90               zwuw(ji,jj,jk) = ( zww(ji+1,jj  ) + zww(ji,jj) ) * ( un(ji,jj,jk-1)-un(ji,jj,jk) )
91               zwvw(ji,jj,jk) = ( zww(ji  ,jj+1) + zww(ji,jj) ) * ( vn(ji,jj,jk-1)-vn(ji,jj,jk) )
92            END DO 
93         END DO   
94      END DO
[503]95      DO jj = 2, jpjm1              ! Surface and bottom values set to zero
96         DO ji = fs_2, fs_jpim1           ! vector opt.
[3]97            zwuw(ji,jj, 1 ) = 0.e0
98            zwvw(ji,jj, 1 ) = 0.e0
99            zwuw(ji,jj,jpk) = 0.e0
100            zwvw(ji,jj,jpk) = 0.e0
101         END DO 
102      END DO
103
[503]104      DO jk = 1, jpkm1              ! Vertical momentum advection at u- and v-points
[3]105         DO jj = 2, jpjm1
[503]106            DO ji = fs_2, fs_jpim1       ! vector opt.
107               !                         ! vertical momentum advective trends
[3]108               zua = - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) )
109               zva = - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) )
[503]110               !                         ! add the trends to the general momentum trends
[3]111               ua(ji,jj,jk) = ua(ji,jj,jk) + zua
112               va(ji,jj,jk) = va(ji,jj,jk) + zva
113            END DO 
114         END DO 
115      END DO
116
[503]117      IF( l_trddyn ) THEN           ! save the vertical advection trends for diagnostic
118         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
119         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
120         CALL trd_mod(ztrdu, ztrdv, jpdyn_trd_zad, 'DYN', kt)
[3294]121         CALL wrk_dealloc( jpi, jpj, jpk, ztrdu, ztrdv ) 
[216]122      ENDIF
[503]123      !                             ! Control print
124      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' zad  - Ua: ', mask1=umask,   &
125         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
126      !
[3294]127      CALL wrk_dealloc( jpi,jpj, zww ) 
128      CALL wrk_dealloc( jpi,jpj,jpk, zwuw , zwvw ) 
[2715]129      !
[3294]130      IF( nn_timing == 1 )  CALL timing_stop('dyn_zad')
131      !
[3]132   END SUBROUTINE dyn_zad
133
[503]134   !!======================================================================
[3]135END MODULE dynzad
Note: See TracBrowser for help on using the repository browser.