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/UKMO/dev_r5518_GO6_package/NEMOGCM/NEMO/OPA_SRC/DYN – NEMO

source: branches/UKMO/dev_r5518_GO6_package/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_exp.F90 @ 11643

Last change on this file since 11643 was 11101, checked in by frrh, 5 years ago

Merge changes from Met Office GMED ticket 450 to reduce unnecessary
text output from NEMO.
This output, which is typically not switchable, is rarely of interest
in normal (non-debugging) runs and simply redunantley consumes extra
file space.
Further, the presence of this text output has been shown to
significantly degrade performance of models which are run during
Met Office HPC RAID (disk) checks.
The new code introduces switches which are configurable via the
changes made in the associated Met Office MOCI ticket 399.

File size: 5.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
[3294]24   USE wrk_nemo        ! Memory Allocation
25   USE timing          ! Timing
[3]26
[3294]27
[3]28   IMPLICIT NONE
29   PRIVATE
30
[2528]31   PUBLIC   dyn_zdf_exp   ! called by step.F90
[2715]32   
[3]33   !! * Substitutions
34#  include "domzgr_substitute.h90"
35#  include "vectopt_loop_substitute.h90"
36   !!----------------------------------------------------------------------
[2528]37   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
[888]38   !! $Id$
[2715]39   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[3]40   !!----------------------------------------------------------------------
41CONTAINS
42
[503]43   SUBROUTINE dyn_zdf_exp( kt, p2dt )
[3]44      !!----------------------------------------------------------------------
45      !!                  ***  ROUTINE dyn_zdf_exp  ***
46      !!                   
47      !! ** Purpose :   Compute the trend due to the vert. momentum diffusion
48      !!
49      !! ** Method  :   Explicit forward time stepping with a time splitting
50      !!      technique. The vertical diffusion of momentum is given by:
51      !!         diffu = dz( avmu dz(u) ) = 1/e3u dk+1( avmu/e3uw dk(ub) )
[2528]52      !!      Surface boundary conditions: wind stress input (averaged over kt-1/2 & kt+1/2)
[3]53      !!      Bottom boundary conditions : bottom stress (cf zdfbfr.F90)
54      !!      Add this trend to the general trend ua :
55      !!         ua = ua + dz( avmu dz(u) )
56      !!
57      !! ** Action : - Update (ua,va) with the vertical diffusive trend
58      !!---------------------------------------------------------------------
[2528]59      INTEGER , INTENT(in) ::   kt     ! ocean time-step index
60      REAL(wp), INTENT(in) ::   p2dt   ! time-step
[2715]61      !
62      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices
[3625]63      REAL(wp) ::   zlavmr, zua, zva   ! local scalars
[3294]64      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zwx, zwy, zwz, zww
[3]65      !!----------------------------------------------------------------------
[3294]66      !
67      IF( nn_timing == 1 )  CALL timing_start('dyn_zdf_exp')
68      !
69      CALL wrk_alloc( jpi,jpj,jpk, zwx, zwy, zwz, zww ) 
70      !
[2715]71      IF( kt == nit000 .AND. lwp ) THEN
72         WRITE(numout,*)
73         WRITE(numout,*) 'dyn_zdf_exp : vertical momentum diffusion - explicit operator'
74         WRITE(numout,*) '~~~~~~~~~~~ '
[11101]75         IF(lflush) CALL flush(numout)
[2715]76      ENDIF
77
[2528]78      zlavmr = 1. / REAL( nn_zdfexp )
[216]79
[2715]80
81      DO jj = 2, jpjm1                 ! Surface boundary condition
82         DO ji = 2, jpim1
[3625]83            zwy(ji,jj,1) = ( utau_b(ji,jj) + utau(ji,jj) ) * r1_rau0
84            zww(ji,jj,1) = ( vtau_b(ji,jj) + vtau(ji,jj) ) * r1_rau0
[3]85         END DO 
[2715]86      END DO 
87      DO jk = 1, jpk                   ! Initialization of x, z and contingently trends array
88         DO jj = 2, jpjm1 
[3]89            DO ji = 2, jpim1
[2715]90               zwx(ji,jj,jk) = ub(ji,jj,jk)
91               zwz(ji,jj,jk) = vb(ji,jj,jk)
[3]92            END DO 
93         END DO 
[2715]94      END DO 
95      !
96      DO jl = 1, nn_zdfexp             ! Time splitting loop
[2528]97         !
[2715]98         DO jk = 2, jpk                      ! First vertical derivative
99            DO jj = 2, jpjm1 
[3]100               DO ji = 2, jpim1
[2715]101                  zwy(ji,jj,jk) = avmu(ji,jj,jk) * ( zwx(ji,jj,jk-1) - zwx(ji,jj,jk) ) / fse3uw(ji,jj,jk) 
102                  zww(ji,jj,jk) = avmv(ji,jj,jk) * ( zwz(ji,jj,jk-1) - zwz(ji,jj,jk) ) / fse3vw(ji,jj,jk)
[3]103               END DO 
104            END DO 
[2715]105         END DO 
106         DO jk = 1, jpkm1                    ! Second vertical derivative and trend estimation at kt+l*rdt/nn_zdfexp
107            DO jj = 2, jpjm1 
[3]108               DO ji = 2, jpim1
[2715]109                  zua = zlavmr * ( zwy(ji,jj,jk) - zwy(ji,jj,jk+1) ) / fse3u(ji,jj,jk)
110                  zva = zlavmr * ( zww(ji,jj,jk) - zww(ji,jj,jk+1) ) / fse3v(ji,jj,jk)
[3]111                  ua(ji,jj,jk) = ua(ji,jj,jk) + zua
112                  va(ji,jj,jk) = va(ji,jj,jk) + zva
[2528]113                  !
[2715]114                  zwx(ji,jj,jk) = zwx(ji,jj,jk) + p2dt * zua * umask(ji,jj,jk)
115                  zwz(ji,jj,jk) = zwz(ji,jj,jk) + p2dt * zva * vmask(ji,jj,jk)
[3]116               END DO 
117            END DO 
118         END DO 
[2715]119         !
120      END DO                           ! End of time splitting
121      !
[3294]122      CALL wrk_dealloc( jpi,jpj,jpk, zwx, zwy, zwz, zww ) 
[2715]123      !
[3294]124      IF( nn_timing == 1 )  CALL timing_stop('dyn_zdf_exp')
125      !
[3]126   END SUBROUTINE dyn_zdf_exp
127
128   !!==============================================================================
129END MODULE dynzdf_exp
Note: See TracBrowser for help on using the repository browser.