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 @ 4400

Last change on this file since 4400 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
RevLine 
[3]1MODULE dynzdf_exp
2   !!==============================================================================
3   !!                     ***  MODULE  dynzdf_exp  ***
4   !! Ocean dynamics:  vertical component(s) of the momentum mixing trend
5   !!==============================================================================
[2528]6   !! History :  OPA  !  1990-10  (B. Blanke)  Original code
7   !!            8.0  !  1997-05  (G. Madec)  vertical component of isopycnal
[2715]8   !!   NEMO     0.5  !  2002-08  (G. Madec)  F90: Free form and module
[2528]9   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  Forcing averaged over 2 time steps
[503]10   !!----------------------------------------------------------------------
[3]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
[888]20   USE sbc_oce         ! surface boundary condition: ocean
[2715]21   USE lib_mpp         ! MPP library
[3]22   USE in_out_manager  ! I/O manager
[2715]23   USE lib_mpp         ! MPP library
[3]24
25   IMPLICIT NONE
26   PRIVATE
27
[2528]28   PUBLIC   dyn_zdf_exp   ! called by step.F90
[3211]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"
[2715]35   
[3]36   !! * Substitutions
37#  include "domzgr_substitute.h90"
38#  include "vectopt_loop_substitute.h90"
39   !!----------------------------------------------------------------------
[2528]40   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
[888]41   !! $Id$
[2715]42   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[3]43   !!----------------------------------------------------------------------
44CONTAINS
45
[503]46   SUBROUTINE dyn_zdf_exp( kt, p2dt )
[3]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) )
[2528]55      !!      Surface boundary conditions: wind stress input (averaged over kt-1/2 & kt+1/2)
[3]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      !!---------------------------------------------------------------------
[2715]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
[3211]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
[2715]70      !
[2528]71      INTEGER , INTENT(in) ::   kt     ! ocean time-step index
72      REAL(wp), INTENT(in) ::   p2dt   ! time-step
[2715]73      !
74      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices
75      REAL(wp) ::   zrau0r, zlavmr, zua, zva   ! local scalars
[3]76      !!----------------------------------------------------------------------
77
[2715]78      IF( wrk_in_use(3, 1,2) ) THEN
79         CALL ctl_stop('dyn_zdf_exp: requested workspace arrays unavailable')   ;   RETURN
[3]80      ENDIF
81
[2715]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
[2528]89      zlavmr = 1. / REAL( nn_zdfexp )
[216]90
[2715]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
[3]96         END DO 
[2715]97      END DO 
[3211]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
[2715]103      DO jk = 1, jpk                   ! Initialization of x, z and contingently trends array
104         DO jj = 2, jpjm1 
[3]105            DO ji = 2, jpim1
[3211]106#endif
[2715]107               zwx(ji,jj,jk) = ub(ji,jj,jk)
108               zwz(ji,jj,jk) = vb(ji,jj,jk)
[3]109            END DO 
110         END DO 
[2715]111      END DO 
112      !
113      DO jl = 1, nn_zdfexp             ! Time splitting loop
[2528]114         !
[3211]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
[2715]120         DO jk = 2, jpk                      ! First vertical derivative
121            DO jj = 2, jpjm1 
[3]122               DO ji = 2, jpim1
[3211]123#endif
[2715]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)
[3]126               END DO 
127            END DO 
[2715]128         END DO 
[3211]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
[2715]134         DO jk = 1, jpkm1                    ! Second vertical derivative and trend estimation at kt+l*rdt/nn_zdfexp
135            DO jj = 2, jpjm1 
[3]136               DO ji = 2, jpim1
[3211]137#endif
[2715]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)
[3]140                  ua(ji,jj,jk) = ua(ji,jj,jk) + zua
141                  va(ji,jj,jk) = va(ji,jj,jk) + zva
[2528]142                  !
[2715]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)
[3]145               END DO 
146            END DO 
147         END DO 
[2715]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      !
[3]153   END SUBROUTINE dyn_zdf_exp
154
155   !!==============================================================================
156END MODULE dynzdf_exp
Note: See TracBrowser for help on using the repository browser.