From cf05dbcca7dfde6873f63bf2594b500c979ed579 Mon Sep 17 00:00:00 2001 From: Sebastien MASSON <massons@irene150.c-irene.tgcc.ccc.cea.fr> Date: Thu, 1 Sep 2022 22:35:11 +0200 Subject: [PATCH] minor fix in zdftke and zdfiwm, #68 --- src/OCE/ZDF/zdfiwm.F90 | 66 ++++++++++++++++++++++++------------------ src/OCE/ZDF/zdftke.F90 | 6 ++-- 2 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/OCE/ZDF/zdfiwm.F90 b/src/OCE/ZDF/zdfiwm.F90 index e28833945..31c3387da 100644 --- a/src/OCE/ZDF/zdfiwm.F90 +++ b/src/OCE/ZDF/zdfiwm.F90 @@ -129,8 +129,8 @@ CONTAINS !!---------------------------------------------------------------------- INTEGER , INTENT(in ) :: kt ! ocean time step INTEGER , INTENT(in ) :: Kmm ! time level index - REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avm ! momentum Kz (w-points) - REAL(wp), DIMENSION(A2D(0),jpk) , INTENT(inout) :: p_avt, p_avs ! tracer Kz (w-points) + REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) :: p_avm ! momentum Kz (w-points) + REAL(wp), DIMENSION( A2D(0),jpk), INTENT(inout) :: p_avt, p_avs ! tracer Kz (w-points) ! INTEGER :: ji, jj, jk ! dummy loop indices REAL(wp), SAVE :: zztmp @@ -299,7 +299,7 @@ CONTAINS ENDIF ENDIF - IF(sn_cfctl%l_prtctl) CALL prt_ctl(tab3d_1=zav_wave , clinfo1=' iwm - av_wave: ', tab3d_2=avt, clinfo2=' avt: ') + IF(sn_cfctl%l_prtctl) CALL prt_ctl(tab3d_1=zav_wave , clinfo1=' iwm - av_wave: ', tab3d_2=p_avt, clinfo2=' avt: ') ! END SUBROUTINE zdf_iwm @@ -341,6 +341,7 @@ CONTAINS INTEGER, PARAMETER :: jp_mps = 4 INTEGER, PARAMETER :: jp_dsb = 5 INTEGER, PARAMETER :: jp_dsc = 6 + INTEGER :: ji, jj ! TYPE(FLD_N), DIMENSION(jpiwm) :: slf_iwm ! array of namelist informations TYPE(FLD_N) :: sn_mpb, sn_mpc, sn_mpn, sn_mps ! information about Mixing Power field to be read @@ -349,6 +350,7 @@ CONTAINS ! REAL(wp), DIMENSION(A2D(0),4) :: ztmp REAL(wp), DIMENSION(4) :: zdia + REAL(wp) :: zcte ! NAMELIST/namzdf_iwm/ ln_mevar, ln_tsdiff, & & cn_dir, sn_mpb, sn_mpc, sn_mpn, sn_mps, sn_dsb, sn_dsc @@ -373,10 +375,12 @@ CONTAINS ! This internal-wave-driven mixing parameterization elevates avt and avm in the interior, and ! ensures that avt remains larger than its molecular value (=1.4e-7). Therefore, avtb should ! be set here to a very small value, and avmb to its (uniform) molecular value (=1.4e-6). - avmb(:) = rnu ! molecular value - avtb(:) = 1.e-10_wp ! very small diffusive minimum (background avt is specified in zdf_iwm) - avtb_2d(:,:) = 1._wp ! uniform - IF(lwp) THEN ! Control print + avmb(:) = rnu ! molecular value + avtb(:) = 1.e-10_wp ! very small diffusive minimum (background avt is specified in zdf_iwm) + DO_2D( 0, 0, 0, 0 ) + avtb_2d(ji,jj) = 1._wp ! uniform + END_2D + IF(lwp) THEN ! Control print WRITE(numout,*) WRITE(numout,*) ' Force the background value applied to avm & avt in TKE to be everywhere ', & & 'the viscous molecular value & a very small diffusive value, resp.' @@ -398,32 +402,38 @@ CONTAINS CALL fld_fill( sf_iwm, slf_iwm , cn_dir, 'zdfiwm_init', 'iwm input file', 'namiwm' ) ! ! hard-coded default values - sf_iwm(jp_mpb)%fnow(:,:,1) = 1.e-10_wp - sf_iwm(jp_mpc)%fnow(:,:,1) = 1.e-10_wp - sf_iwm(jp_mpn)%fnow(:,:,1) = 1.e-5_wp - sf_iwm(jp_mps)%fnow(:,:,1) = 1.e-10_wp - sf_iwm(jp_dsb)%fnow(:,:,1) = 100._wp - sf_iwm(jp_dsc)%fnow(:,:,1) = 100._wp - + DO_2D( 0, 0, 0, 0 ) + sf_iwm(jp_mpb)%fnow(ji,jj,1) = 1.e-10_wp + sf_iwm(jp_mpc)%fnow(ji,jj,1) = 1.e-10_wp + sf_iwm(jp_mpn)%fnow(ji,jj,1) = 1.e-5_wp + sf_iwm(jp_mps)%fnow(ji,jj,1) = 1.e-10_wp + sf_iwm(jp_dsb)%fnow(ji,jj,1) = 100._wp + sf_iwm(jp_dsc)%fnow(ji,jj,1) = 100._wp + END_2D + ! ! read necessary fields CALL fld_read( nit000, 1, sf_iwm ) - - ebot_iwm(:,:) = sf_iwm(1)%fnow(:,:,1) * smask0(:,:) ! energy flux for dissipation above abyssal hills [W/m2] - ecri_iwm(:,:) = sf_iwm(2)%fnow(:,:,1) * smask0(:,:) ! energy flux for dissipation at topographic slopes [W/m2] - ensq_iwm(:,:) = sf_iwm(3)%fnow(:,:,1) * smask0(:,:) ! energy flux for dissipation scaling with N^2 [W/m2] - esho_iwm(:,:) = sf_iwm(4)%fnow(:,:,1) * smask0(:,:) ! energy flux for dissipation due to shoaling [W/m2] - hbot_iwm(:,:) = sf_iwm(5)%fnow(:,:,1) ! spatially variable decay scale for abyssal hill dissipation [m] - hcri_iwm(:,:) = sf_iwm(6)%fnow(:,:,1) ! spatially variable decay scale for topographic-slope [m] - - hcri_iwm(:,:) = 1._wp / hcri_iwm(:,:) ! only the inverse height is used, hence calculated here once for all + + DO_2D( 0, 0, 0, 0 ) + zcte = smask0(ji,jj) + ebot_iwm(ji,jj) = sf_iwm(1)%fnow(ji,jj,1) * zcte ! energy flux for dissipation above abyssal hills [W/m2] + ecri_iwm(ji,jj) = sf_iwm(2)%fnow(ji,jj,1) * zcte ! energy flux for dissipation at topographic slopes [W/m2] + ensq_iwm(ji,jj) = sf_iwm(3)%fnow(ji,jj,1) * zcte ! energy flux for dissipation scaling with N^2 [W/m2] + esho_iwm(ji,jj) = sf_iwm(4)%fnow(ji,jj,1) * zcte ! energy flux for dissipation due to shoaling [W/m2] + hbot_iwm(ji,jj) = sf_iwm(5)%fnow(ji,jj,1) ! spatially variable decay scale for abyssal hill dissipation [m] + hcri_iwm(ji,jj) = 1._wp / sf_iwm(6)%fnow(ji,jj,1) ! inverse decay scale for topographic slope dissipation [m-1] + END_2D ! diags - ztmp(:,:,1) = e1e2t(:,:) * ebot_iwm(:,:) - ztmp(:,:,2) = e1e2t(:,:) * ecri_iwm(:,:) - ztmp(:,:,3) = e1e2t(:,:) * ensq_iwm(:,:) - ztmp(:,:,4) = e1e2t(:,:) * esho_iwm(:,:) + DO_2D( 0, 0, 0, 0 ) + zcte = e1e2t(ji,jj) + ztmp(ji,jj,1) = zcte * ebot_iwm(ji,jj) + ztmp(ji,jj,2) = zcte * ecri_iwm(ji,jj) + ztmp(ji,jj,3) = zcte * ensq_iwm(ji,jj) + ztmp(ji,jj,4) = zcte * esho_iwm(ji,jj) + END_2D - zdia(1:4) = glob_sum_vec( 'zdfiwm', ztmp(:,:,1:4) ) + zdia(1:4) = glob_sum_vec( 'zdfiwm', ztmp ) IF(lwp) THEN WRITE(numout,*) ' Dissipation above abyssal hills: ', zdia(1) * 1.e-12_wp, 'TW' diff --git a/src/OCE/ZDF/zdftke.F90 b/src/OCE/ZDF/zdftke.F90 index e2285b2c8..60371fbcd 100644 --- a/src/OCE/ZDF/zdftke.F90 +++ b/src/OCE/ZDF/zdftke.F90 @@ -56,9 +56,7 @@ MODULE zdftke USE in_out_manager ! I/O manager USE iom ! I/O manager library USE lib_mpp ! MPP library - USE lbclnk ! ocean lateral boundary conditions (or mpp link) USE prtctl ! Print control - USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) USE sbcwave ! Surface boundary waves IMPLICIT NONE @@ -820,9 +818,9 @@ CONTAINS IF( nn_etau /= 0 ) THEN SELECT CASE( nn_htau ) ! Choice of the depth of penetration CASE( 0 ) ! constant depth penetration (here 10 meters) - htau(:,:) = 10._wp + htau(A2D(0)) = 10._wp CASE( 1 ) ! F(latitude) : 0.5m to 30m poleward of 40 degrees - htau(:,:) = MAX( 0.5_wp, MIN( 30._wp, 45._wp* ABS( SIN( rpi/180._wp * gphit(:,:) ) ) ) ) + htau(A2D(0)) = MAX( 0.5_wp, MIN( 30._wp, 45._wp* ABS( SIN( rpi/180._wp * gphit(A2D(0)) ) ) ) ) END SELECT ENDIF ! !* read or initialize all required files -- GitLab