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

source: branches/2011/DEV_r2739_STFC_dCSE/NEMOGCM/NEMO/OPA_SRC/DYN/dynzad.F90 @ 4400

Last change on this file since 4400 was 3837, checked in by trackstand2, 11 years ago

Merge of finiss

  • Property svn:keywords set to Id
File size: 7.4 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 trdmod_oce     ! ocean variables trends
19   USE trdmod         ! ocean dynamics trends
20   USE in_out_manager ! I/O manager
21   USE lib_mpp         ! MPP library
22   USE prtctl         ! Print control
23
24   IMPLICIT NONE
25   PRIVATE
26   
27   PUBLIC   dyn_zad   ! routine called by step.F90
28
29   !! * Control permutation of array indices
30#  include "oce_ftrans.h90"
31#  include "dom_oce_ftrans.h90"
32#  include "sbc_oce_ftrans.h90"
33
34   !! * Substitutions
35#  include "domzgr_substitute.h90"
36#  include "vectopt_loop_substitute.h90"
37   !!----------------------------------------------------------------------
38   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
39   !! $Id$
40   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
41   !!----------------------------------------------------------------------
42CONTAINS
43
44   SUBROUTINE dyn_zad ( kt )
45      !!----------------------------------------------------------------------
46      !!                  ***  ROUTINE dynzad  ***
47      !!
48      !! ** Purpose :   Compute the now vertical momentum advection trend and
49      !!      add it to the general trend of momentum equation.
50      !!
51      !! ** Method  :   The now vertical advection of momentum is given by:
52      !!         w dz(u) = ua + 1/(e1u*e2u*e3u) mk+1[ mi(e1t*e2t*wn) dk(un) ]
53      !!         w dz(v) = va + 1/(e1v*e2v*e3v) mk+1[ mj(e1t*e2t*wn) dk(vn) ]
54      !!      Add this trend to the general trend (ua,va):
55      !!         (ua,va) = (ua,va) + w dz(u,v)
56      !!
57      !! ** Action  : - Update (ua,va) with the vert. momentum adv. trends
58      !!              - Save the trends in (ztrdu,ztrdv) ('key_trddyn')
59     !!----------------------------------------------------------------------
60      USE wrk_nemo, ONLY: wrk_in_use, wrk_not_released
61      USE wrk_nemo, ONLY:   zww   => wrk_2d_1                        ! 2D workspace
62      USE oce     , ONLY:   zwuw  => ta       , zwvw  => sa          ! (ta,sa) used as 3D workspace
63      USE wrk_nemo, ONLY:   ztrdu => wrk_3d_1 , ztrdv => wrk_3d_2    ! 3D workspace
64      !! DCSE_NEMO: need additional directives for renamed module variables
65!FTRANS zwuw  :I :I :z
66!FTRANS zwvw  :I :I :z
67!FTRANS ztrdu :I :I :z
68!FTRANS ztrdv :I :I :z
69      !
70      INTEGER, INTENT(in) ::   kt   ! ocean time-step inedx
71      !
72      INTEGER  ::   ji, jj, jk      ! dummy loop indices
73      REAL(wp) ::   zua, zva        ! temporary scalars
74      !!----------------------------------------------------------------------
75     
76      IF( wrk_in_use(2, 1) .OR. wrk_in_use(3, 1,2) ) THEN
77         CALL ctl_stop('dyn_zad: requested workspace arrays unavailable')   ;   RETURN
78      ENDIF
79
80      IF( kt == nit000 ) THEN
81         IF(lwp)WRITE(numout,*)
82         IF(lwp)WRITE(numout,*) 'dyn_zad : arakawa advection scheme'
83      ENDIF
84
85      IF( l_trddyn )   THEN         ! Save ua and va trends
86         ztrdu(:,:,:) = ua(:,:,:) 
87         ztrdv(:,:,:) = va(:,:,:) 
88      ENDIF
89
90#if defined key_z_first
91      !! DCSE_NEMO: Attention! Eliminate k-dependence from zww to re-order loops
92      DO jj = 2, jpj                   ! vertical fluxes
93         DO ji = 2, jpi
94            zww(ji,jj) = 0.25 * e1t(ji,jj) * e2t(ji,jj)
95         END DO
96      END DO
97      DO jj = 2, jpjm1                 ! vertical momentum advection at w-point
98         DO ji = 2, jpim1
99            zwuw(ji,jj, 1 ) = 0.e0     ! Surface values set to zero
100            zwvw(ji,jj, 1 ) = 0.e0
101            DO jk = 2, jpkm1
102               zwuw(ji,jj,jk) =   ( zww(ji+1,jj  )*wn(ji+1,jj  ,jk) + zww(ji,jj)*wn(ji,jj,jk) )   &
103                  &             * ( un(ji,jj,jk-1)-un(ji,jj,jk) ) 
104               zwvw(ji,jj,jk) =   ( zww(ji  ,jj+1)*wn(ji  ,jj+1,jk) + zww(ji,jj)*wn(ji,jj,jk) )   &
105                  &             * ( vn(ji,jj,jk-1)-vn(ji,jj,jk) )
106            END DO 
107            zwuw(ji,jj,jpk) = 0.e0     ! Bottom values set to zero
108            zwvw(ji,jj,jpk) = 0.e0
109         END DO   
110      END DO
111#else
112      DO jk = 2, jpkm1              ! Vertical momentum advection at level w and u- and v- vertical
113         DO jj = 2, jpj                   ! vertical fluxes
114            DO ji = fs_2, jpi             ! vector opt.
115               zww(ji,jj) = 0.25 * e1t(ji,jj) * e2t(ji,jj) * wn(ji,jj,jk)
116            END DO
117         END DO
118         DO jj = 2, jpjm1                 ! vertical momentum advection at w-point
119            DO ji = fs_2, fs_jpim1        ! vector opt.
120               zwuw(ji,jj,jk) = ( zww(ji+1,jj  ) + zww(ji,jj) ) * ( un(ji,jj,jk-1)-un(ji,jj,jk) )
121               zwvw(ji,jj,jk) = ( zww(ji  ,jj+1) + zww(ji,jj) ) * ( vn(ji,jj,jk-1)-vn(ji,jj,jk) )
122            END DO 
123         END DO   
124      END DO
125      DO jj = 2, jpjm1              ! Surface and bottom values set to zero
126         DO ji = fs_2, fs_jpim1           ! vector opt.
127            zwuw(ji,jj, 1 ) = 0.e0
128            zwvw(ji,jj, 1 ) = 0.e0
129            zwuw(ji,jj,jpk) = 0.e0
130            zwvw(ji,jj,jpk) = 0.e0
131         END DO 
132      END DO
133#endif
134
135#if defined key_z_first
136      DO jj = 2, jpjm1              ! Vertical momentum advection at u- and v-points
137         DO ji = 2, jpim1
138            DO jk = 1, jpkm1
139#else
140      DO jk = 1, jpkm1              ! Vertical momentum advection at u- and v-points
141         DO jj = 2, jpjm1
142            DO ji = fs_2, fs_jpim1       ! vector opt.
143#endif
144               !                         ! vertical momentum advective trends
145               zua = - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) / ( e1u(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,jk) )
146               zva = - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) / ( e1v(ji,jj) * e2v(ji,jj) * fse3v(ji,jj,jk) )
147               !                         ! add the trends to the general momentum trends
148               ua(ji,jj,jk) = ua(ji,jj,jk) + zua
149               va(ji,jj,jk) = va(ji,jj,jk) + zva
150            END DO 
151         END DO 
152      END DO
153
154      IF( l_trddyn ) THEN           ! save the vertical advection trends for diagnostic
155         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
156         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
157         CALL trd_mod(ztrdu, ztrdv, jpdyn_trd_zad, 'DYN', kt)
158      ENDIF
159
160      !                             ! Control print
161      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' zad  - Ua: ', mask1=umask,   &
162         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
163      !
164      IF( wrk_not_released(2, 1)   .OR.   &
165          wrk_not_released(3, 1,2) )   CALL ctl_stop('dyn_zad: failed to release workspace arrays')
166      !
167   END SUBROUTINE dyn_zad
168
169   !!======================================================================
170END MODULE dynzad
Note: See TracBrowser for help on using the repository browser.