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.
dynzdf_exp.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/dynzdf_exp.F90 @ 4438

Last change on this file since 4438 was 3211, checked in by spickles2, 12 years ago

Stephen Pickles, 11 Dec 2011

Commit to bring the rest of the DCSE NEMO development branch
in line with the latest development version. This includes
array index re-ordering of all OPA_SRC/.

  • Property svn:keywords set to Id
File size: 6.6 KB
Line 
1MODULE dynzdf_exp
2   !!==============================================================================
3   !!                     ***  MODULE  dynzdf_exp  ***
4   !! Ocean dynamics:  vertical component(s) of the momentum mixing trend
5   !!==============================================================================
6   !! History :  OPA  !  1990-10  (B. Blanke)  Original code
7   !!            8.0  !  1997-05  (G. Madec)  vertical component of isopycnal
8   !!   NEMO     0.5  !  2002-08  (G. Madec)  F90: Free form and module
9   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  Forcing averaged over 2 time steps
10   !!----------------------------------------------------------------------
11
12   !!----------------------------------------------------------------------
13   !!   dyn_zdf_exp  : update the momentum trend with the vertical diffu-
14   !!                  sion using an explicit time-stepping scheme.
15   !!----------------------------------------------------------------------
16   USE oce             ! ocean dynamics and tracers
17   USE dom_oce         ! ocean space and time domain
18   USE phycst          ! physical constants
19   USE zdf_oce         ! ocean vertical physics
20   USE sbc_oce         ! surface boundary condition: ocean
21   USE lib_mpp         ! MPP library
22   USE in_out_manager  ! I/O manager
23   USE lib_mpp         ! MPP library
24
25   IMPLICIT NONE
26   PRIVATE
27
28   PUBLIC   dyn_zdf_exp   ! called by step.F90
29
30   !! * Control permutation of array indices
31#  include "oce_ftrans.h90"
32#  include "dom_oce_ftrans.h90"
33#  include "zdf_oce_ftrans.h90"
34#  include "sbc_oce_ftrans.h90"
35   
36   !! * Substitutions
37#  include "domzgr_substitute.h90"
38#  include "vectopt_loop_substitute.h90"
39   !!----------------------------------------------------------------------
40   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
41   !! $Id$
42   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
43   !!----------------------------------------------------------------------
44CONTAINS
45
46   SUBROUTINE dyn_zdf_exp( kt, p2dt )
47      !!----------------------------------------------------------------------
48      !!                  ***  ROUTINE dyn_zdf_exp  ***
49      !!                   
50      !! ** Purpose :   Compute the trend due to the vert. momentum diffusion
51      !!
52      !! ** Method  :   Explicit forward time stepping with a time splitting
53      !!      technique. The vertical diffusion of momentum is given by:
54      !!         diffu = dz( avmu dz(u) ) = 1/e3u dk+1( avmu/e3uw dk(ub) )
55      !!      Surface boundary conditions: wind stress input (averaged over kt-1/2 & kt+1/2)
56      !!      Bottom boundary conditions : bottom stress (cf zdfbfr.F90)
57      !!      Add this trend to the general trend ua :
58      !!         ua = ua + dz( avmu dz(u) )
59      !!
60      !! ** Action : - Update (ua,va) with the vertical diffusive trend
61      !!---------------------------------------------------------------------
62      USE wrk_nemo, ONLY:   wrk_in_use, wrk_not_released
63      USE oce     , ONLY:   zwx => ta       , zwy => sa         ! (ta,sa) used as 3D workspace
64      USE wrk_nemo, ONLY:   zwz => wrk_3d_1 , zww => wrk_3d_2   ! 3D workspace
65      !! DCSE_NEMO: need additional directives for renamed module variables
66!FTRANS zwx :I :I :z
67!FTRANS zwy :I :I :z
68!FTRANS zwz :I :I :z
69!FTRANS zww :I :I :z
70      !
71      INTEGER , INTENT(in) ::   kt     ! ocean time-step index
72      REAL(wp), INTENT(in) ::   p2dt   ! time-step
73      !
74      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices
75      REAL(wp) ::   zrau0r, zlavmr, zua, zva   ! local scalars
76      !!----------------------------------------------------------------------
77
78      IF( wrk_in_use(3, 1,2) ) THEN
79         CALL ctl_stop('dyn_zdf_exp: requested workspace arrays unavailable')   ;   RETURN
80      ENDIF
81
82      IF( kt == nit000 .AND. lwp ) THEN
83         WRITE(numout,*)
84         WRITE(numout,*) 'dyn_zdf_exp : vertical momentum diffusion - explicit operator'
85         WRITE(numout,*) '~~~~~~~~~~~ '
86      ENDIF
87
88      zrau0r = 1. / rau0               ! Local constant initialization
89      zlavmr = 1. / REAL( nn_zdfexp )
90
91
92      DO jj = 2, jpjm1                 ! Surface boundary condition
93         DO ji = 2, jpim1
94            zwy(ji,jj,1) = ( utau_b(ji,jj) + utau(ji,jj) ) * zrau0r
95            zww(ji,jj,1) = ( vtau_b(ji,jj) + vtau(ji,jj) ) * zrau0r
96         END DO 
97      END DO 
98#if defined key_z_first
99      DO jj = 2, jpjm1                 ! Initialization of x, z and contingently trends array
100         DO ji = 2, jpim1
101            DO jk = 1, jpk
102#else
103      DO jk = 1, jpk                   ! Initialization of x, z and contingently trends array
104         DO jj = 2, jpjm1 
105            DO ji = 2, jpim1
106#endif
107               zwx(ji,jj,jk) = ub(ji,jj,jk)
108               zwz(ji,jj,jk) = vb(ji,jj,jk)
109            END DO 
110         END DO 
111      END DO 
112      !
113      DO jl = 1, nn_zdfexp             ! Time splitting loop
114         !
115#if defined key_z_first
116         DO jj = 2, jpjm1 
117            DO ji = 2, jpim1
118               DO jk = 2, jpk                ! First vertical derivative
119#else
120         DO jk = 2, jpk                      ! First vertical derivative
121            DO jj = 2, jpjm1 
122               DO ji = 2, jpim1
123#endif
124                  zwy(ji,jj,jk) = avmu(ji,jj,jk) * ( zwx(ji,jj,jk-1) - zwx(ji,jj,jk) ) / fse3uw(ji,jj,jk) 
125                  zww(ji,jj,jk) = avmv(ji,jj,jk) * ( zwz(ji,jj,jk-1) - zwz(ji,jj,jk) ) / fse3vw(ji,jj,jk)
126               END DO 
127            END DO 
128         END DO 
129#if defined key_z_first
130         DO jj = 2, jpjm1 
131            DO ji = 2, jpim1
132               DO jk = 1, jpkm1              ! Second vertical derivative and trend estimation at kt+l*rdt/nn_zdfexp
133#else
134         DO jk = 1, jpkm1                    ! Second vertical derivative and trend estimation at kt+l*rdt/nn_zdfexp
135            DO jj = 2, jpjm1 
136               DO ji = 2, jpim1
137#endif
138                  zua = zlavmr * ( zwy(ji,jj,jk) - zwy(ji,jj,jk+1) ) / fse3u(ji,jj,jk)
139                  zva = zlavmr * ( zww(ji,jj,jk) - zww(ji,jj,jk+1) ) / fse3v(ji,jj,jk)
140                  ua(ji,jj,jk) = ua(ji,jj,jk) + zua
141                  va(ji,jj,jk) = va(ji,jj,jk) + zva
142                  !
143                  zwx(ji,jj,jk) = zwx(ji,jj,jk) + p2dt * zua * umask(ji,jj,jk)
144                  zwz(ji,jj,jk) = zwz(ji,jj,jk) + p2dt * zva * vmask(ji,jj,jk)
145               END DO 
146            END DO 
147         END DO 
148         !
149      END DO                           ! End of time splitting
150      !
151      IF( wrk_not_released(3, 1,2) )   CALL ctl_stop('dyn_zdf_exp: failed to release workspace arrays')
152      !
153   END SUBROUTINE dyn_zdf_exp
154
155   !!==============================================================================
156END MODULE dynzdf_exp
Note: See TracBrowser for help on using the repository browser.