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

source: branches/dev_r2586_dynamic_mem/NEMOGCM/NEMO/OPA_SRC/DYN/dynzad.F90 @ 2636

Last change on this file since 2636 was 2636, checked in by gm, 13 years ago

dynamic mem: #785 ; move ctl_stop & warn in lib_mpp to avoid a circular dependency + ctl_stop improvment

  • 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 :  6.0  !  91-01  (G. Madec) Original code
7   !!            7.0  !  91-11  (G. Madec)
8   !!            7.5  !  96-01  (G. Madec) statement function for e3
9   !!            8.5  !  02-07  (G. Madec) j-k-i case: Original code
10   !!            8.5  !  02-07  (G. Madec) Free form, F90
11   !!----------------------------------------------------------------------
12   
13   !!----------------------------------------------------------------------
14   !!   dyn_zad       : vertical advection momentum trend
15   !!----------------------------------------------------------------------
16   USE oce            ! ocean dynamics and tracers
17   USE dom_oce        ! ocean space and time domain
18   USE sbc_oce        ! surface boundary condition: ocean
19   USE trdmod_oce     ! ocean variables trends
20   USE trdmod         ! ocean dynamics trends
21   USE in_out_manager ! I/O manager
22   USE lib_mpp         ! MPP library
23   USE prtctl         ! Print control
24
25   IMPLICIT NONE
26   PRIVATE
27   
28   PUBLIC   dyn_zad   ! routine called by step.F90
29
30   !! * Substitutions
31#  include "domzgr_substitute.h90"
32#  include "vectopt_loop_substitute.h90"
33   !!----------------------------------------------------------------------
34   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
35   !! $Id$
36   !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt)
37   !!----------------------------------------------------------------------
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
55      !!              - Save the trends in (ztrdu,ztrdv) ('key_trddyn')
56     !!----------------------------------------------------------------------
57      USE oce, ONLY:   zwuw => ta   ! use ta as 3D workspace
58      USE oce, ONLY:   zwvw => sa   ! use sa as 3D workspace
59      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
60      USE wrk_nemo, ONLY: zww => wrk_2d_1
61      USE wrk_nemo, ONLY: ztrdu => wrk_3d_1, ztrdv => wrk_3d_2
62      !!
63      INTEGER, INTENT(in) ::   kt   ! ocean time-step inedx
64      !!
65      INTEGER  ::   ji, jj, jk      ! dummy loop indices
66      REAL(wp) ::   zua, zva        ! temporary scalars
67      !!----------------------------------------------------------------------
68     
69      IF( wrk_in_use(2, 1)     .OR.    &
70          wrk_in_use(3, 1,2) ) THEN
71         CALL ctl_stop('dyn_zad: requested workspace arrays unavailable')   ;   RETURN
72      END IF
73
74      IF( kt == nit000 ) THEN
75         IF(lwp)WRITE(numout,*)
76         IF(lwp)WRITE(numout,*) 'dyn_zad : arakawa advection scheme'
77      ENDIF
78
79      IF( l_trddyn )   THEN         ! Save ua and va trends
80         ztrdu(:,:,:) = ua(:,:,:) 
81         ztrdv(:,:,:) = va(:,:,:) 
82      ENDIF
83     
84      DO jk = 2, jpkm1              ! Vertical momentum advection at level w and u- and v- vertical
85         DO jj = 2, jpj                   ! vertical fluxes
86            DO ji = fs_2, jpi             ! vector opt.
87               zww(ji,jj) = 0.25 * e1t(ji,jj) * e2t(ji,jj) * wn(ji,jj,jk)
88            END DO
89         END DO
90         DO jj = 2, jpjm1                 ! vertical momentum advection at w-point
91            DO ji = fs_2, fs_jpim1        ! vector opt.
92               zwuw(ji,jj,jk) = ( zww(ji+1,jj  ) + zww(ji,jj) ) * ( un(ji,jj,jk-1)-un(ji,jj,jk) )
93               zwvw(ji,jj,jk) = ( zww(ji  ,jj+1) + zww(ji,jj) ) * ( vn(ji,jj,jk-1)-vn(ji,jj,jk) )
94            END DO 
95         END DO   
96      END DO
97      DO jj = 2, jpjm1              ! Surface and bottom values set to zero
98         DO ji = fs_2, fs_jpim1           ! vector opt.
99            zwuw(ji,jj, 1 ) = 0.e0
100            zwvw(ji,jj, 1 ) = 0.e0
101            zwuw(ji,jj,jpk) = 0.e0
102            zwvw(ji,jj,jpk) = 0.e0
103         END DO 
104      END DO
105
106      DO jk = 1, jpkm1              ! Vertical momentum advection at u- and v-points
107         DO jj = 2, jpjm1
108            DO ji = fs_2, fs_jpim1       ! vector opt.
109               !                         ! vertical momentum advective trends
110               zua = - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) )
111               zva = - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) )
112               !                         ! add the trends to the general momentum trends
113               ua(ji,jj,jk) = ua(ji,jj,jk) + zua
114               va(ji,jj,jk) = va(ji,jj,jk) + zva
115            END DO 
116         END DO 
117      END DO
118
119      IF( l_trddyn ) THEN           ! save the vertical advection trends for diagnostic
120         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
121         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
122         CALL trd_mod(ztrdu, ztrdv, jpdyn_trd_zad, 'DYN', kt)
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      IF( wrk_not_released(2, 1)       .OR.    &
129          wrk_not_released(3, 1,2) )   CALL ctl_stop('dyn_zad: failed to release workspace arrays')
130      !
131   END SUBROUTINE dyn_zad
132
133   !!======================================================================
134END MODULE dynzad
Note: See TracBrowser for help on using the repository browser.