source: branches/2013/dev_r3858_CNRS3_Ediag/NEMOGCM/NEMO/OPA_SRC/DYN/dynzad.F90 @ 3876

Last change on this file since 3876 was 3876, checked in by gm, 8 years ago

dev_r3858_CNRS3_Ediag: #927 phasing with 2011/dev_r3309_LOCEAN12_Ediag branche + mxl diag update

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