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

Last change on this file since 11101 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
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   USE wrk_nemo        ! Memory Allocation
25   USE timing          ! Timing
26
27
28   IMPLICIT NONE
29   PRIVATE
30
31   PUBLIC   dyn_zdf_exp   ! called by step.F90
32   
33   !! * Substitutions
34#  include "domzgr_substitute.h90"
35#  include "vectopt_loop_substitute.h90"
36   !!----------------------------------------------------------------------
37   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
38   !! $Id$
39   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
40   !!----------------------------------------------------------------------
41CONTAINS
42
43   SUBROUTINE dyn_zdf_exp( kt, p2dt )
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) )
52      !!      Surface boundary conditions: wind stress input (averaged over kt-1/2 & kt+1/2)
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      !!---------------------------------------------------------------------
59      INTEGER , INTENT(in) ::   kt     ! ocean time-step index
60      REAL(wp), INTENT(in) ::   p2dt   ! time-step
61      !
62      INTEGER  ::   ji, jj, jk, jl   ! dummy loop indices
63      REAL(wp) ::   zlavmr, zua, zva   ! local scalars
64      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zwx, zwy, zwz, zww
65      !!----------------------------------------------------------------------
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      !
71      IF( kt == nit000 .AND. lwp ) THEN
72         WRITE(numout,*)
73         WRITE(numout,*) 'dyn_zdf_exp : vertical momentum diffusion - explicit operator'
74         WRITE(numout,*) '~~~~~~~~~~~ '
75         IF(lflush) CALL flush(numout)
76      ENDIF
77
78      zlavmr = 1. / REAL( nn_zdfexp )
79
80
81      DO jj = 2, jpjm1                 ! Surface boundary condition
82         DO ji = 2, jpim1
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
85         END DO 
86      END DO 
87      DO jk = 1, jpk                   ! Initialization of x, z and contingently trends array
88         DO jj = 2, jpjm1 
89            DO ji = 2, jpim1
90               zwx(ji,jj,jk) = ub(ji,jj,jk)
91               zwz(ji,jj,jk) = vb(ji,jj,jk)
92            END DO 
93         END DO 
94      END DO 
95      !
96      DO jl = 1, nn_zdfexp             ! Time splitting loop
97         !
98         DO jk = 2, jpk                      ! First vertical derivative
99            DO jj = 2, jpjm1 
100               DO ji = 2, jpim1
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)
103               END DO 
104            END DO 
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 
108               DO ji = 2, jpim1
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)
111                  ua(ji,jj,jk) = ua(ji,jj,jk) + zua
112                  va(ji,jj,jk) = va(ji,jj,jk) + zva
113                  !
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)
116               END DO 
117            END DO 
118         END DO 
119         !
120      END DO                           ! End of time splitting
121      !
122      CALL wrk_dealloc( jpi,jpj,jpk, zwx, zwy, zwz, zww ) 
123      !
124      IF( nn_timing == 1 )  CALL timing_stop('dyn_zdf_exp')
125      !
126   END SUBROUTINE dyn_zdf_exp
127
128   !!==============================================================================
129END MODULE dynzdf_exp
Note: See TracBrowser for help on using the repository browser.