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.
zdfqiao.F90 in branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF – NEMO

source: branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfqiao.F90 @ 7953

Last change on this file since 7953 was 7953, checked in by gm, 7 years ago

#1880 (HPC-09): add zdfphy (the ZDF manager) + remove all key_...

File size: 5.5 KB
Line 
1MODULE zdfqiao
2   !!======================================================================
3   !!                       ***  MODULE  zdfqiao  ***
4   !! Qiao module      : vertical mixing enhancement due to surface waves
5   !!======================================================================
6   !! History :  3.6  !  2014-10  (E. Clementi)  Original code
7   !!----------------------------------------------------------------------
8   !!   zdf_qiao        : compute Qiao parameters
9   !!----------------------------------------------------------------------
10
11   USE in_out_manager  ! I/O manager
12   USE lib_mpp         ! distribued memory computing library
13   USE sbc_oce         ! Surface boundary condition: ocean fields
14   USE zdf_oce
15   USE sbcwave         ! wave module
16   USE dom_oce
17   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
18   
19   IMPLICIT NONE
20   PRIVATE
21
22   PUBLIC zdf_qiao    ! routine called in step
23
24   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) :: qbv, qbvu, qbvv
25
26   !! * Substitutions
27#  include "vectopt_loop_substitute.h90"
28   !!----------------------------------------------------------------------
29   !! NEMO/OPA 4.0 , NEMO Consortium (2011)
30   !! $Id: $
31   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
32   !!----------------------------------------------------------------------
33
34CONTAINS
35
36   SUBROUTINE zdf_qiao( kt )
37      !!---------------------------------------------------------------------
38      !!                     ***  ROUTINE zdf_qiao ***
39      !!
40      !! ** Purpose :Compute the Qiao term (qbv) to be added to
41      !!             vertical viscosity and diffusivity coeffs. 
42      !!
43      !! ** Method  :qbv = alpha * A * Us(0) * exp (3 * k * z)
44      !!             
45      !! ** action  :Compute the Qiao wave dependent term
46      !!             only if ln_wave=.true.
47      !!               
48      !!---------------------------------------------------------------------
49      INTEGER, INTENT( in  ) ::  kt   ! ocean time step
50      !
51      INTEGER :: jj, ji, jk   ! dummy loop indices
52      !!---------------------------------------------------------------------
53      !
54      IF( kt == nit000 ) THEN                   ! First call kt=nit000 !
55         IF( .NOT. ( ln_wave .AND. ln_sdw ) )   &
56            &   CALL ctl_stop ( 'Ask for wave Qiao enhanced turbulence but ln_wave   &
57            &                    and ln_sdw have to be activated')
58         IF( zdf_qiao_alloc() /= 0 )   &
59            &   CALL ctl_stop( 'STOP', 'zdf_qiao : unable to allocate arrays' )
60      ENDIF
61
62      !
63      ! Compute the Qiao term Bv (qbv) to be added to
64      ! vertical viscosity and diffusivity
65      ! qbv = alpha * A * Us(0) * exp (3 * k * z)
66      ! alpha here is set to 1
67      !---------------------------------------------------------------------------------
68      !
69!!gm Comment: I don't understand the use of min of 4 gdepw_n to define a quantity at w-point
70!!gm                       ==>> this is an error....
71      DO jk = 1, jpk
72         DO jj = 1, jpjm1
73            DO ji = 1, fs_jpim1
74               qbv(ji,jj,jk) = 1.0 * 0.353553 * hsw(ji,jj) * tsd2d(ji,jj) *             &
75            &                  EXP(3.0 * wnum(ji,jj) *                                  &                     
76            &                  (-MIN( gdepw_n(ji  ,jj  ,jk), gdepw_n(ji+1,jj  ,jk),     &
77            &                         gdepw_n(ji  ,jj+1,jk), gdepw_n(ji+1,jj+1,jk))))   &
78            &                          * wmask(ji,jj,jk)
79            END DO
80         END DO
81      END DO
82      !
83      CALL lbc_lnk( qbv, 'W', 1. )   ! Lateral boundary conditions
84         
85      !
86      ! Interpolate Qiao parameter qbv into the grid_U and grid_V
87      !----------------------------------------------------------
88      !
89      DO jk = 1, jpk
90         DO jj = 1, jpjm1
91            DO ji = 1, fs_jpim1
92               qbvu(ji,jj,jk) = 0.5 * wumask(ji,jj,jk)  *              & 
93            &                  ( qbv(ji,jj,jk) + qbv(ji+1,jj  ,jk) )
94               qbvv(ji,jj,jk) = 0.5 * wvmask(ji,jj,jk)  *              &
95            &                  ( qbv(ji,jj,jk) + qbv(ji  ,jj+1,jk) )
96            END DO
97         END DO
98      END DO
99      !
100      CALL lbc_lnk( qbvu, 'U', 1. ) ; CALL lbc_lnk( qbvv, 'V', 1. )   ! Lateral boundary conditions
101
102      ! Enhance vertical mixing coeff.         
103      !-------------------------------
104      !
105!!gm  with double diffusion activated, avs is not updated...
106!!gm                    =====>>> BUG
107      DO jk = 1, jpkm1
108         DO jj = 1, jpj
109            DO ji = 1, jpi
110               avmu(ji,jj,jk) = ( avmu(ji,jj,jk) + qbvu(ji,jj,jk) ) * umask(ji,jj,jk)
111               avmv(ji,jj,jk) = ( avmv(ji,jj,jk) + qbvv(ji,jj,jk) ) * vmask(ji,jj,jk)
112               avt (ji,jj,jk) = ( avt (ji,jj,jk) + qbv (ji,jj,jk) ) * tmask(ji,jj,jk)
113            END DO
114         END DO
115      END DO
116      !
117   END SUBROUTINE zdf_qiao
118
119
120   INTEGER FUNCTION zdf_qiao_alloc()
121      !!----------------------------------------------------------------------
122      !!                ***  FUNCTION zdf_qiao_alloc  ***
123      !!----------------------------------------------------------------------
124      ALLOCATE( qbv(jpi,jpj,jpk), qbvu(jpi,jpj,jpk), qbvv(jpi,jpj,jpk),   &
125         &      STAT = zdf_qiao_alloc )
126      !
127      IF( lk_mpp             )  CALL mpp_sum ( zdf_qiao_alloc )
128      IF( zdf_qiao_alloc > 0 )  CALL ctl_warn('zdf_qiao_alloc: allocation of arrays failed.')
129      !
130   END FUNCTION zdf_qiao_alloc
131     
132   !!======================================================================
133END MODULE zdfqiao
Note: See TracBrowser for help on using the repository browser.