- Timestamp:
- 2017-04-29T17:24:54+02:00 (7 years ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfswm.F90
r7967 r7990 1 MODULE zdf qiao1 MODULE zdfswm 2 2 !!====================================================================== 3 !! *** MODULE zdf qiao***4 !! Qiao module : vertical mixing enhancement due to surface waves3 !! *** MODULE zdfswm *** 4 !! vertical physics : surface wave-induced mixing 5 5 !!====================================================================== 6 6 !! History : 3.6 ! 2014-10 (E. Clementi) Original code 7 !!---------------------------------------------------------------------- 8 !! zdf_qiao : compute Qiao parameters 7 !! 4.0 ! 2017-04 (G. Madec) debug + simplifications 9 8 !!---------------------------------------------------------------------- 10 9 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) 10 !!---------------------------------------------------------------------- 11 !! zdf_swm : update Kz due to surface wave-induced mixing 12 !! zdf_swm_init : initilisation 13 !!---------------------------------------------------------------------- 14 USE dom_oce ! ocean domain variable 15 USE zdf_oce ! vertical physics: mixing coefficients 16 USE sbc_oce ! Surface boundary condition: ocean fields 17 USE sbcwave ! wave module 18 ! 19 USE in_out_manager ! I/O manager 20 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 21 USE lib_mpp ! distribued memory computing library 18 22 19 23 IMPLICIT NONE 20 24 PRIVATE 21 25 22 PUBLIC zdf_qiao ! routine called in step 26 PUBLIC zdf_swm ! routine called in zdp_phy 27 PUBLIC zdf_swm_init ! routine called in zdf_phy_init 23 28 24 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) :: qbv, qbvu, qbvv25 26 !! * Substitutions27 # include "vectopt_loop_substitute.h90"28 29 !!---------------------------------------------------------------------- 29 !! NEMO/OPA 4.0 , NEMO Consortium (201 1)30 !! $Id: 30 !! NEMO/OPA 4.0 , NEMO Consortium (2017) 31 !! $Id:$ 31 32 !! Software governed by the CeCILL licence (NEMOGCM/NEMO_CeCILL.txt) 32 33 !!---------------------------------------------------------------------- 33 34 34 CONTAINS 35 35 36 SUBROUTINE zdf_ qiao( kt )36 SUBROUTINE zdf_swm( kt ) 37 37 !!--------------------------------------------------------------------- 38 !! *** ROUTINE zdf_ qiao***38 !! *** ROUTINE zdf_swm *** 39 39 !! 40 !! ** Purpose :Compute the Qiaoterm (qbv) to be added to40 !! ** Purpose :Compute the swm term (qbv) to be added to 41 41 !! vertical viscosity and diffusivity coeffs. 42 42 !! 43 !! ** Method :qbv = alpha * A * Us(0) * exp (3 * k * z) 43 !! ** Method : Compute the swm term Bv (zqb) and added it to 44 !! vertical viscosity and diffusivity coefficients 45 !! zqb = alpha * A * Us(0) * exp (3 * k * z) 46 !! where alpha is set here to 1 44 47 !! 45 !! ** action : Compute the Qiao wave dependent term46 !! only if ln_wave=.true.48 !! ** action : avt, avs, avm updated by the surface wave-induced mixing 49 !! (inner domain only) 47 50 !! 51 !! reference : Qiao et al. GRL, 2004 48 52 !!--------------------------------------------------------------------- 49 INTEGER, INTENT( in ) ::kt ! ocean time step53 INTEGER, INTENT(in) :: kt ! ocean time step 50 54 ! 51 INTEGER :: jj, ji, jk ! dummy loop indices 55 INTEGER :: ji, jj, jk ! dummy loop indices 56 REAL(wp):: zcoef, zqb ! local scalar 52 57 !!--------------------------------------------------------------------- 53 58 ! 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) 59 zcoef = 1._wp * 0.353553_wp 60 DO jk = 2, jpkm1 61 DO jj = 2, jpjm1 62 DO ji = 2, jpim1 63 zqb = zcoef * hsw(ji,jj) * tsd2d(ji,jj) * EXP( -3. * wnum(ji,jj) * gdepw_n(ji,jj,jk) ) * wmask(ji,jj,jk) 64 ! 65 avt(ji,jj,jk) = avt(ji,jj,jk) + zqb 66 avs(ji,jj,jk) = avs(ji,jj,jk) + zqb 67 avm(ji,jj,jk) = avm(ji,jj,jk) + zqb 79 68 END DO 80 69 END DO 81 70 END DO 82 71 ! 83 CALL lbc_lnk( qbv, 'W', 1. ) ! Lateral boundary conditions 84 72 END SUBROUTINE zdf_swm 73 74 75 SUBROUTINE zdf_swm_init 76 !!--------------------------------------------------------------------- 77 !! *** ROUTINE zdf_swm_init *** 78 !! 79 !! ** Purpose : surface wave-induced mixing initialisation 80 !! 81 !! ** Method : check the availability of surface wave fields 82 !!--------------------------------------------------------------------- 85 83 ! 86 ! Interpolate Qiao parameter qbv into the grid_U and grid_V 87 !---------------------------------------------------------- 84 IF(lwp) THEN ! Control print 85 WRITE(numout,*) 86 WRITE(numout,*) 'zdf_swm_init : surface wave-driven mixing' 87 WRITE(numout,*) '~~~~~~~~~~~~' 88 ENDIF 89 IF( .NOT.ln_wave .OR. & 90 & .NOT.ln_sdw ) CALL ctl_stop ( 'zdf_swm_init: ln_zdfswm=T but ln_wave and ln_sdw /= T') 88 91 ! 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 92 END SUBROUTINE zdf_swm_init 101 93 102 ! Enhance vertical mixing coeff.103 !-------------------------------104 !105 !!gm with double diffusion activated, avs is not updated...106 !!gm =====>>> BUG107 DO jk = 1, jpkm1108 DO jj = 1, jpj109 DO ji = 1, jpi110 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 DO114 END DO115 END DO116 !117 END SUBROUTINE zdf_qiao118 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_alloc131 132 94 !!====================================================================== 133 END MODULE zdf qiao95 END MODULE zdfswm
Note: See TracChangeset
for help on using the changeset viewer.