Changeset 8055
- Timestamp:
- 2017-05-20T13:49:38+02:00 (8 years ago)
- Location:
- branches/2017/wrk_OMP_test_for_Silvia/NEMOGCM
- Files:
-
- 1 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/wrk_OMP_test_for_Silvia/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfddm.F90
r7990 r8055 31 31 32 32 !! * Substitutions 33 # include " vectopt_loop_substitute.h90"33 # include "domain_substitute.h90" 34 34 !!---------------------------------------------------------------------- 35 35 !! NEMO/OPA 3.7 , NEMO Consortium (2014) … … 39 39 CONTAINS 40 40 41 SUBROUTINE zdf_ddm( kt)41 SUBROUTINE zdf_ddm( ARG_2D, kt, p_avm, p_avt, p_avs ) 42 42 !!---------------------------------------------------------------------- 43 43 !! *** ROUTINE zdf_ddm *** … … 69 69 !! References : Merryfield et al., JPO, 29, 1124-1142, 1999. 70 70 !!---------------------------------------------------------------------- 71 INTEGER, INTENT(in) :: kt ! ocean time-step indexocean time step 71 INTEGER, INTENT(in ) :: ARG_2D ! inner domain start-end i-indices 72 INTEGER, INTENT(in ) :: kt ! ocean time-step indexocean time step 73 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: p_avm ! Kz on momentum (w-points) 74 REAL(wp), DIMENSION(:,:,:), INTENT(inout) :: p_avt ! Kz on temperature (w-points) 75 REAL(wp), DIMENSION(:,:,:), INTENT( out) :: p_avs ! Kz on salinity (w-points) 72 76 ! 73 77 INTEGER :: ji, jj , jk ! dummy loop indices … … 77 81 REAL(wp) :: zavft, zavfs ! - - 78 82 REAL(wp) :: zavdt, zavds ! - - 79 REAL(wp), DIMENSION( jpi,jpj) :: zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd383 REAL(wp), DIMENSION(WRK_2D) :: zrau, zmsks, zmskf, zmskd1, zmskd2, zmskd3 80 84 !!---------------------------------------------------------------------- 81 85 ! … … 91 95 !!gm and many acces in memory 92 96 93 DO jj = 1, jpj ! R=zrau = (alpha / beta) (dk[t] / dk[s])94 DO ji = 1, jpi97 DO jj = k_Jstr, k_Jend !== R=zrau = (alpha / beta) (dk[t] / dk[s]) ==! 98 DO ji = k_Jstr, k_Iend 95 99 zrw = ( gdepw_n(ji,jj,jk ) - gdept_n(ji,jj,jk) ) & 96 100 !!gm please, use e3w_n below … … 109 113 END DO 110 114 111 DO jj = 1, jpj ! indicators:112 DO ji = 1, jpi115 DO jj = k_Jstr, k_Jend !== indicators ==! 116 DO ji = k_Jstr, k_Iend 113 117 ! stability indicator: msks=1 if rn2>0; 0 elsewhere 114 118 IF( rn2(ji,jj,jk) + 1.e-12 <= 0. ) THEN ; zmsks(ji,jj) = 0._wp … … 135 139 END DO 136 140 ! mask zmsk in order to have avt and avs masked 137 zmsks( :,:) = zmsks(:,:) * wmask(:,:,jk)141 zmsks(WRK_2D) = zmsks(WRK_2D) * wmask(WRK_2D,jk) 138 142 139 143 … … 141 145 ! ------------------ 142 146 ! Constant eddy coefficient: reset to the background value 143 DO jj = 1, jpj144 DO ji = 1, jpi147 DO jj = k_Jstr, k_Jend 148 DO ji = k_Jstr, k_Iend 145 149 zinr = 1._wp / zrau(ji,jj) 146 150 ! salt fingering … … 154 158 & + 0.15 * zrau(ji,jj) * zmskd2(ji,jj) ) 155 159 ! add to the eddy viscosity coef. previously computed 156 avs(ji,jj,jk) =avt(ji,jj,jk) + zavfs + zavds157 avt(ji,jj,jk) =avt(ji,jj,jk) + zavft + zavdt158 avm(ji,jj,jk) =avm(ji,jj,jk) + MAX( zavft + zavdt, zavfs + zavds )160 p_avs(ji,jj,jk) = p_avt(ji,jj,jk) + zavfs + zavds 161 p_avt(ji,jj,jk) = p_avt(ji,jj,jk) + zavft + zavdt 162 p_avm(ji,jj,jk) = p_avm(ji,jj,jk) + MAX( zavft + zavdt, zavfs + zavds ) 159 163 END DO 160 164 END DO -
branches/2017/wrk_OMP_test_for_Silvia/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfevd.F90
r7990 r8055 31 31 PUBLIC zdf_evd ! called by step.F90 32 32 33 !! * Substitutions 34 # include "domain_substitute.h90" 33 35 !!---------------------------------------------------------------------- 34 36 !! NEMO/OPA 4.0 , NEMO Consortium (2011) … … 38 40 CONTAINS 39 41 40 SUBROUTINE zdf_evd( kt )42 SUBROUTINE zdf_evd( ARG_2D, kt, p_avm, p_avt ) 41 43 !!---------------------------------------------------------------------- 42 44 !! *** ROUTINE zdf_evd *** … … 55 57 !! ** Action : avt, avm enhanced where static instability occurs 56 58 !!---------------------------------------------------------------------- 57 INTEGER, INTENT(in) :: kt ! ocean time-step indexocean time step 59 INTEGER , INTENT(in ) :: ARG_2D ! inner domain start-end i-indices 60 INTEGER , INTENT(in ) :: kt ! ocean time-step indexocean time step 61 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avm, p_avt ! momentum and tracer Kz (w-points) 58 62 ! 59 63 INTEGER :: ji, jj, jk ! dummy loop indices 60 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zavt_evd, zavm_evd 64 !!OMP issue to be solved with outputs... 65 ! REAL(wp), DIMENSION(jpi,jpj,jpk) :: zavt_evd, zavm_evd 66 !!OMP end 61 67 !!---------------------------------------------------------------------- 62 68 ! 63 69 IF( nn_timing == 1 ) CALL timing_start('zdf_evd') 64 70 ! 71 !!OMP this is to be suppressed 65 72 IF( kt == nit000 ) THEN 66 73 IF(lwp) WRITE(numout,*) … … 69 76 IF(lwp) WRITE(numout,*) 70 77 ENDIF 78 !!OMP end 71 79 ! 72 80 ! 73 zavt_evd(:,:,:) = avt(:,:,:) ! set avt prior to evd application 81 !!OMP issue with outputs 82 ! zavt_evd(:,:,:) = p_avt(:,:,:) ! set avt prior to evd application 83 !!OMP end 74 84 ! 75 85 SELECT CASE ( nn_evdm ) … … 77 87 CASE ( 1 ) !== enhance tracer & momentum Kz ==! (if rn2<-1.e-12) 78 88 ! 79 zavm_evd(:,:,:) = avm(:,:,:) ! set avm prior to evd application 89 !!OMP issue with outputs 90 ! zavm_evd(:,:,:) = p_avm(:,:,:) ! set avm prior to evd application 91 !!OMP end 80 92 ! 81 !! change last digits results 82 ! WHERE( MAX( rn2( 2:jpi,2:jpj,2:jpkm1), rn2b(2:jpi,2:jpj,2:jpkm1) ) <= -1.e-12 ) THEN83 ! avt(2:jpi,2:jpj,2:jpkm1) = rn_evd * wmask(2:jpi,2:jpj,2:jpkm1)84 ! avm(2:jpi,2:jpj,2:jpkm1) = rn_evd * wmask(2:jpi,2:jpj,2:jpkm1)93 !! change last digits results ???? 94 ! WHERE( MAX( rn2(WRK_2D,2:jpkm1), rn2b(WRK_2D,2:jpkm1) ) <= -1.e-12 ) THEN 95 ! p_avt(WRK_2D,2:jpkm1) = rn_evd * wmask(WRK_2D,2:jpkm1) 96 ! p_avm(WRK_2D,2:jpkm1) = rn_evd * wmask(WRK_2D,2:jpkm1) 85 97 ! END WHERE 86 98 ! 87 99 DO jk = 1, jpkm1 88 DO jj = 2, jpjm189 DO ji = 2, jpim1100 DO jj = k_Jstr, k_Jend 101 DO ji = k_Jstr, k_Iend 90 102 IF( MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) THEN 91 avt(ji,jj,jk) = rn_evd * wmask(ji,jj,jk)92 avm(ji,jj,jk) = rn_evd * wmask(ji,jj,jk)103 p_avt(ji,jj,jk) = rn_evd * wmask(ji,jj,jk) 104 p_avm(ji,jj,jk) = rn_evd * wmask(ji,jj,jk) 93 105 ENDIF 94 106 END DO … … 96 108 END DO 97 109 ! 98 zavm_evd(:,:,:) = avm(:,:,:) - zavm_evd(:,:,:) ! change in avm due to evd 99 CALL iom_put( "avm_evd", zavm_evd ) ! output this change 110 !!OMP issue with outputs 111 ! zavm_evd(:,:,:) = p_avm(:,:,:) - zavm_evd(:,:,:) ! change in avm due to evd 112 ! CALL iom_put( "avm_evd", zavm_evd ) ! output this change 113 !!gm end 100 114 ! 101 115 CASE DEFAULT !== enhance tracer Kz ==! (if rn2<-1.e-12) 102 116 !! change last digits results 103 ! WHERE( MAX( rn2( 2:jpi,2:jpj,2:jpkm1), rn2b(2:jpi,2:jpj,2:jpkm1) ) <= -1.e-12 )104 ! avt( 2:jpi,2:jpj,2:jpkm1) = rn_evd * wmask(2:jpi,2:jpj,2:jpkm1)117 ! WHERE( MAX( rn2(WRK_2D,2:jpkm1), rn2b(2:jpi,2:jpj,2:jpkm1) ) <= -1.e-12 ) 118 ! avt(WRK_2D,2:jpkm1) = rn_evd * wmask(WRK_2D,2:jpkm1) 105 119 ! END WHERE 106 120 … … 109 123 DO ji = 2, jpim1 110 124 IF( MIN( rn2(ji,jj,jk), rn2b(ji,jj,jk) ) <= -1.e-12 ) & 111 avt(ji,jj,jk) = rn_evd * wmask(ji,jj,jk)125 p_avt(ji,jj,jk) = rn_evd * wmask(ji,jj,jk) 112 126 END DO 113 127 END DO … … 116 130 END SELECT 117 131 ! 118 zavt_evd(:,:,:) = avt(:,:,:) - zavt_evd(:,:,:) ! change in avt due to evd 119 CALL iom_put( "avt_evd", zavt_evd ) ! output this change 120 IF( l_trdtra ) CALL trd_tra( kt, 'TRA', jp_tem, jptra_evd, zavt_evd ) 132 !!OMP issue with outputs 133 ! zavt_evd(:,:,:) = avt(:,:,:) - zavt_evd(:,:,:) ! change in avt due to evd 134 ! CALL iom_put( "avt_evd", zavt_evd ) ! output this change 135 ! IF( l_trdtra ) CALL trd_tra( kt, 'TRA', jp_tem, jptra_evd, zavt_evd ) 136 !!OMP end 121 137 ! 122 138 IF( nn_timing == 1 ) CALL timing_stop('zdf_evd') -
branches/2017/wrk_OMP_test_for_Silvia/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90
r7991 r8055 19 19 USE domvvl ! ocean space and time domain : variable volume layer 20 20 USE zdf_oce ! ocean vertical physics 21 USE zdfsh2 ! vertical physics: shear production term of TKE22 21 USE zdfbfr ! bottom friction (only for rn_bfrz0) 23 22 USE sbc_oce ! surface boundary condition: ocean … … 103 102 104 103 !! * Substitutions 105 # include " vectopt_loop_substitute.h90"104 # include "domain_substitute.h90" 106 105 !!---------------------------------------------------------------------- 107 106 !! NEMO/OPA 3.3 , NEMO Consortium (2010) … … 123 122 124 123 125 SUBROUTINE zdf_gls( kt )124 SUBROUTINE zdf_gls( ARG_2D, kt, psh2, p_avm, p_avt ) 126 125 !!---------------------------------------------------------------------- 127 126 !! *** ROUTINE zdf_gls *** … … 130 129 !! coefficients using the GLS turbulent closure scheme. 131 130 !!---------------------------------------------------------------------- 132 INTEGER, INTENT(in) :: kt ! ocean time step 131 INTEGER , INTENT(in ) :: ARG_2D ! inner domain start-end i-indices 132 INTEGER , INTENT(in ) :: kt ! ocean time step 133 REAL(wp), DIMENSION(WRK_3D), INTENT(in ) :: psh2 ! shear production term 134 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avm, p_avt ! momentum and tracer Kz (w-points) 135 ! 133 136 INTEGER :: ji, jj, jk, ibot, ibotm1, dir ! dummy loop arguments 134 137 REAL(wp) :: zesh2, zsigpsi, zcoef, zex1, zex2 ! local scalars … … 137 140 REAL(wp) :: prod, buoy, diss, zdiss, sm ! - - 138 141 REAL(wp) :: gh, gm, shr, dif, zsqen, zav ! - - 139 REAL(wp), POINTER, DIMENSION(:,: ) :: zdep 140 REAL(wp), POINTER, DIMENSION(:,: ) :: zkar 141 REAL(wp), POINTER, DIMENSION(:,: ) :: zflxs ! Turbulence fluxed induced by internal waves 142 REAL(wp), POINTER, DIMENSION(:,: ) :: zhsro ! Surface roughness (surface waves) 143 REAL(wp), POINTER, DIMENSION(:,:,:) :: eb ! tke at time before 144 REAL(wp), POINTER, DIMENSION(:,:,:) :: hmxl_b ! mixing length at time before 145 REAL(wp), POINTER, DIMENSION(:,:,:) :: shear ! vertical shear 146 REAL(wp), POINTER, DIMENSION(:,:,:) :: eps ! dissipation rate 147 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwall_psi ! Wall function use in the wb case (ln_sigpsi) 148 REAL(wp), POINTER, DIMENSION(:,:,:) :: psi ! psi at time now 149 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_elem_a ! element of the first matrix diagonal 150 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_elem_b ! element of the second matrix diagonal 151 REAL(wp), POINTER, DIMENSION(:,:,:) :: z_elem_c ! element of the third matrix diagonal 152 REAL(wp), POINTER, DIMENSION(:,:,:) :: zstt, zstm ! stability function on tracer and momentum 142 REAL(wp), DIMENSION(WRK_2D) :: zdep 143 REAL(wp), DIMENSION(WRK_2D) :: zkar 144 REAL(wp), DIMENSION(WRK_2D) :: zflxs ! Turbulence fluxed induced by internal waves 145 REAL(wp), DIMENSION(WRK_2D) :: zhsro ! Surface roughness (surface waves) 146 REAL(wp), DIMENSION(WRK_3D) :: eb ! tke at time before 147 REAL(wp), DIMENSION(WRK_3D) :: hmxl_b ! mixing length at time before 148 REAL(wp), DIMENSION(WRK_3D) :: eps ! dissipation rate 149 REAL(wp), DIMENSION(WRK_3D) :: zwall_psi ! Wall function use in the wb case (ln_sigpsi) 150 REAL(wp), DIMENSION(WRK_3D) :: psi ! psi at time now 151 REAL(wp), DIMENSION(WRK_3D) :: z_elem_a ! element of the first matrix diagonal 152 REAL(wp), DIMENSION(WRK_3D) :: z_elem_b ! element of the second matrix diagonal 153 REAL(wp), DIMENSION(WRK_3D) :: z_elem_c ! element of the third matrix diagonal 154 REAL(wp), DIMENSION(WRK_3D) :: zstt, zstm ! stability function on tracer and momentum 153 155 !!-------------------------------------------------------------------- 154 156 ! 155 157 IF( nn_timing == 1 ) CALL timing_start('zdf_gls') 156 158 ! 157 CALL wrk_alloc( jpi,jpj, zdep, zkar, zflxs, zhsro )158 CALL wrk_alloc( jpi,jpj,jpk, eb, hmxl_b, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi )159 CALL wrk_alloc( jpi,jpj,jpk, zstt, zstm )160 161 159 ! Preliminary computing 162 160 163 161 ustars2 = 0._wp ; ustarb2 = 0._wp ; psi = 0._wp ; zwall_psi = 0._wp 164 162 165 ! restore before values computed GLS alone166 avt(:,:,:) = avt_k(:,:,:)167 avm(:,:,:) = avm_k(:,:,:)168 163 169 164 ! Compute surface and bottom friction at T-points 170 DO jj = 2, jpjm1171 DO ji = fs_2, fs_jpim1 ! vector opt.165 DO jj = k_Jstr, k_Jend 166 DO ji = k_Istr, k_Iend 172 167 ! 173 168 ! surface friction … … 186 181 SELECT CASE ( nn_z0_met ) !== Set surface roughness length ==! 187 182 CASE ( 0 ) ! Constant roughness 188 zhsro( :,:) = rn_hsro183 zhsro(WRK_2D) = rn_hsro 189 184 CASE ( 1 ) ! Standard Charnock formula 190 zhsro( :,:) = MAX(rsbc_zs1 * ustars2(:,:), rn_hsro)185 zhsro(WRK_2D) = MAX(rsbc_zs1 * ustars2(WRK_2D), rn_hsro) 191 186 CASE ( 2 ) ! Roughness formulae according to Rascle et al., Ocean Modelling (2008) 192 187 !!gm zcof = 2._wp * 0.6_wp / 28._wp 193 !!gm zdep( :,:) = 30._wp * TANH( zcof/ SQRT( MAX(ustars2(:,:),rsmall) ) ) ! Wave age (eq. 10)194 zdep( :,:) = 30.*TANH(2.*0.3/(28.*SQRT(MAX(ustars2(:,:),rsmall)))) ! Wave age (eq. 10)195 zhsro( :,:) = MAX(rsbc_zs2 * ustars2(:,:) * zdep(:,:)**1.5, rn_hsro) ! zhsro = rn_frac_hs * Hsw (eq. 11)188 !!gm zdep(WRK_2D) = 30._wp * TANH( zcof/ SQRT( MAX(ustars2(WRK_2D),rsmall) ) ) ! Wave age (eq. 10) 189 zdep(WRK_2D) = 30.*TANH(2.*0.3/(28.*SQRT(MAX(ustars2(WRK_2D),rsmall)))) ! Wave age (eq. 10) 190 zhsro(WRK_2D) = MAX(rsbc_zs2 * ustars2(WRK_2D) * zdep(WRK_2D)**1.5, rn_hsro) ! zhsro = rn_frac_hs * Hsw (eq. 11) 196 191 CASE ( 3 ) ! Roughness given by the wave model (coupled or read in file) 197 192 !!gm BUG missing a multiplicative coefficient.... 198 zhsro( :,:) = hsw(:,:)193 zhsro(WRK_2D) = hsw(WRK_2D) 199 194 END SELECT 200 201 ! !== Compute shear and dissipation rate ==! 202 CALL zdf_sh2( shear ) 203 204 195 ! 205 196 DO jk = 2, jpkm1 !== Compute dissipation rate ==! 206 DO jj = 1, jpjm1207 DO ji = 1, jpim1197 DO jj = k_Jstr, k_Jend 198 DO ji = k_Istr, k_Iend 208 199 eps(ji,jj,jk) = rc03 * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / hmxl_n(ji,jj,jk) 209 200 END DO … … 212 203 213 204 ! Save tke at before time step 214 eb ( :,:,:) = en (:,:,:)215 hmxl_b( :,:,:) = hmxl_n(:,:,:)205 eb (WRK_2D,:) = en (WRK_2D,:) 206 hmxl_b(WRK_2D,:) = hmxl_n(WRK_2D,:) 216 207 217 208 IF( nn_clos == 0 ) THEN ! Mellor-Yamada 218 209 DO jk = 2, jpkm1 219 DO jj = 2, jpjm1220 DO ji = fs_2, fs_jpim1 ! vector opt.210 DO jj = k_Jstr, k_Jend 211 DO ji = k_Istr, k_Iend 221 212 zup = hmxl_n(ji,jj,jk) * gdepw_n(ji,jj,mbkt(ji,jj)+1) 222 213 zdown = vkarmn * gdepw_n(ji,jj,jk) * ( -gdepw_n(ji,jj,jk) + gdepw_n(ji,jj,mbkt(ji,jj)+1) ) … … 242 233 243 234 DO jk = 2, jpkm1 244 DO jj = 2, jpjm1245 DO ji = 2, jpim1246 ! 247 buoy = - avt(ji,jj,jk) * rn2(ji,jj,jk) ! stratif. destruction235 DO jj = k_Jstr, k_Jend 236 DO ji = k_Istr, k_Iend 237 ! 238 buoy = - p_avt(ji,jj,jk) * rn2(ji,jj,jk) ! stratif. destruction 248 239 ! 249 240 diss = eps(ji,jj,jk) ! dissipation 250 241 ! 251 dir = 0.5_wp + SIGN( 0.5_wp, shear(ji,jj,jk) + buoy ) ! dir =1(=0) if shear(ji,jj,jk)+buoy >0(<0)252 ! 253 zesh2 = dir*( shear(ji,jj,jk)+buoy)+(1._wp-dir)*shear(ji,jj,jk) ! production term242 dir = 0.5_wp + SIGN( 0.5_wp, psh2(ji,jj,jk) + buoy ) ! dir =1(=0) if shear(ji,jj,jk)+buoy >0(<0) 243 ! 244 zesh2 = dir*(psh2(ji,jj,jk)+buoy)+(1._wp-dir)*psh2(ji,jj,jk) ! production term 254 245 zdiss = dir*(diss/en(ji,jj,jk)) +(1._wp-dir)*(diss-buoy)/en(ji,jj,jk) ! dissipation term 255 246 ! … … 269 260 zcof = rfact_tke * tmask(ji,jj,jk) 270 261 ! ! lower diagonal 271 z_elem_a(ji,jj,jk) = zcof * ( avm(ji,jj,jk ) +avm(ji,jj,jk-1) ) / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk) )262 z_elem_a(ji,jj,jk) = zcof * ( p_avm(ji,jj,jk ) + p_avm(ji,jj,jk-1) ) / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk) ) 272 263 ! ! upper diagonal 273 z_elem_c(ji,jj,jk) = zcof * ( avm(ji,jj,jk+1) +avm(ji,jj,jk ) ) / ( e3t_n(ji,jj,jk ) * e3w_n(ji,jj,jk) )264 z_elem_c(ji,jj,jk) = zcof * ( p_avm(ji,jj,jk+1) + p_avm(ji,jj,jk ) ) / ( e3t_n(ji,jj,jk ) * e3w_n(ji,jj,jk) ) 274 265 ! ! diagonal 275 266 z_elem_b(ji,jj,jk) = 1._wp - z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk) + rdt * zdiss * wmask(ji,jj,jk) … … 280 271 END DO 281 272 ! 282 z_elem_b( :,:,jpk) = 1._wp273 z_elem_b(WRK_2D,jpk) = 1._wp 283 274 ! 284 275 ! Set surface condition on zwall_psi (1 at the bottom) 285 zwall_psi( :,:, 1 ) = zwall_psi(:,:,2)286 zwall_psi( :,:,jpk) = 1._wp276 zwall_psi(WRK_2D, 1 ) = zwall_psi(WRK_2D,2) 277 zwall_psi(WRK_2D,jpk) = 1._wp 287 278 ! 288 279 ! Surface boundary condition on tke … … 293 284 CASE ( 0 ) ! Dirichlet case 294 285 ! First level 295 en( :,:,1) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1)**(2._wp/3._wp)296 en( :,:,1) = MAX(en(:,:,1), rn_emin)297 z_elem_a( :,:,1) = en(:,:,1)298 z_elem_c( :,:,1) = 0._wp299 z_elem_b( :,:,1) = 1._wp286 en(WRK_2D,1) = rc02r * ustars2(WRK_2D) * (1._wp + rsbc_tke1)**(2._wp/3._wp) 287 en(WRK_2D,1) = MAX(en(WRK_2D,1), rn_emin) 288 z_elem_a(WRK_2D,1) = en(WRK_2D,1) 289 z_elem_c(WRK_2D,1) = 0._wp 290 z_elem_b(WRK_2D,1) = 1._wp 300 291 ! 301 292 ! One level below 302 en( :,:,2) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1 * ((zhsro(:,:)+gdepw_n(:,:,2)) &303 & / zhsro( :,:) )**(1.5_wp*ra_sf))**(2._wp/3._wp)304 en( :,:,2) = MAX(en(:,:,2), rn_emin )305 z_elem_a( :,:,2) = 0._wp306 z_elem_c( :,:,2) = 0._wp307 z_elem_b( :,:,2) = 1._wp293 en(WRK_2D,2) = rc02r * ustars2(WRK_2D) * (1._wp + rsbc_tke1 * ((zhsro(WRK_2D)+gdepw_n(WRK_2D,2)) & 294 & / zhsro(WRK_2D) )**(1.5_wp*ra_sf))**(2._wp/3._wp) 295 en(WRK_2D,2) = MAX(en(WRK_2D,2), rn_emin ) 296 z_elem_a(WRK_2D,2) = 0._wp 297 z_elem_c(WRK_2D,2) = 0._wp 298 z_elem_b(WRK_2D,2) = 1._wp 308 299 ! 309 300 ! … … 311 302 ! 312 303 ! Dirichlet conditions at k=1 313 en( :,:,1) = rc02r * ustars2(:,:) * (1._wp + rsbc_tke1)**(2._wp/3._wp)314 en( :,:,1) = MAX(en(:,:,1), rn_emin)315 z_elem_a( :,:,1) = en(:,:,1)316 z_elem_c( :,:,1) = 0._wp317 z_elem_b( :,:,1) = 1._wp304 en(WRK_2D,1) = rc02r * ustars2(WRK_2D) * (1._wp + rsbc_tke1)**(2._wp/3._wp) 305 en(WRK_2D,1) = MAX(en(WRK_2D,1), rn_emin) 306 z_elem_a(WRK_2D,1) = en(WRK_2D,1) 307 z_elem_c(WRK_2D,1) = 0._wp 308 z_elem_b(WRK_2D,1) = 1._wp 318 309 ! 319 310 ! at k=2, set de/dz=Fw 320 311 !cbr 321 z_elem_b( :,:,2) = z_elem_b(:,:,2) + z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b322 z_elem_a( :,:,2) = 0._wp323 zkar( :,:) = (rl_sf + (vkarmn-rl_sf)*(1.-exp(-rtrans*gdept_n(:,:,1)/zhsro(:,:)) ))324 zflxs( :,:) = rsbc_tke2 * ustars2(:,:)**1.5_wp * zkar(:,:) &325 & * ((zhsro( :,:)+gdept_n(:,:,1)) / zhsro(:,:) )**(1.5_wp*ra_sf)326 327 en( :,:,2) = en(:,:,2) + zflxs(:,:)/e3w_n(:,:,2)312 z_elem_b(WRK_2D,2) = z_elem_b(WRK_2D,2) + z_elem_a(WRK_2D,2) ! Remove z_elem_a from z_elem_b 313 z_elem_a(WRK_2D,2) = 0._wp 314 zkar(WRK_2D) = (rl_sf + (vkarmn-rl_sf)*(1.-exp(-rtrans*gdept_n(WRK_2D,1)/zhsro(WRK_2D)) )) 315 zflxs(WRK_2D) = rsbc_tke2 * ustars2(WRK_2D)**1.5_wp * zkar(WRK_2D) & 316 & * ((zhsro(WRK_2D)+gdept_n(WRK_2D,1)) / zhsro(WRK_2D) )**(1.5_wp*ra_sf) 317 318 en(WRK_2D,2) = en(WRK_2D,2) + zflxs(WRK_2D)/e3w_n(WRK_2D,2) 328 319 ! 329 320 ! … … 338 329 ! ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = rn_lmin 339 330 ! ! Balance between the production and the dissipation terms 340 DO jj = 2, jpjm1341 DO ji = fs_2, fs_jpim1 ! vector opt.331 DO jj = k_Jstr, k_Jend 332 DO ji = k_Istr, k_Iend 342 333 ibot = mbkt(ji,jj) + 1 ! k bottom level of w-point 343 334 ibotm1 = mbkt(ji,jj) ! k-1 bottom level of w-point but >=1 … … 359 350 CASE ( 1 ) ! Neumman boundary condition 360 351 ! 361 DO jj = 2, jpjm1362 DO ji = fs_2, fs_jpim1 ! vector opt.352 DO jj = k_Jstr, k_Jend 353 DO ji = k_Istr, k_Iend 363 354 ibot = mbkt(ji,jj) + 1 ! k bottom level of w-point 364 355 ibotm1 = mbkt(ji,jj) ! k-1 bottom level of w-point but >=1 … … 382 373 ! 383 374 DO jk = 2, jpkm1 ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1 384 DO jj = 2, jpjm1385 DO ji = fs_2, fs_jpim1 ! vector opt.375 DO jj = k_Jstr, k_Jend 376 DO ji = k_Istr, k_Iend 386 377 z_elem_b(ji,jj,jk) = z_elem_b(ji,jj,jk) - z_elem_a(ji,jj,jk) * z_elem_c(ji,jj,jk-1) / z_elem_b(ji,jj,jk-1) 387 378 END DO … … 389 380 END DO 390 381 DO jk = 2, jpk ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1 391 DO jj = 2, jpjm1392 DO ji = fs_2, fs_jpim1 ! vector opt.382 DO jj = k_Jstr, k_Jend 383 DO ji = k_Istr, k_Iend 393 384 z_elem_a(ji,jj,jk) = en(ji,jj,jk) - z_elem_a(ji,jj,jk) / z_elem_b(ji,jj,jk-1) * z_elem_a(ji,jj,jk-1) 394 385 END DO … … 396 387 END DO 397 388 DO jk = jpk-1, 2, -1 ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk 398 DO jj = 2, jpjm1399 DO ji = fs_2, fs_jpim1 ! vector opt.389 DO jj = k_Jstr, k_Jend 390 DO ji = k_Istr, k_Iend 400 391 en(ji,jj,jk) = ( z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk) * en(ji,jj,jk+1) ) / z_elem_b(ji,jj,jk) 401 392 END DO … … 403 394 END DO 404 395 ! ! set the minimum value of tke 405 en( :,:,:) = MAX( en(:,:,:), rn_emin )396 en(WRK_3D) = MAX( en(WRK_3D), rn_emin ) 406 397 407 398 !!----------------------------------------!! … … 415 406 CASE( 0 ) ! k-kl (Mellor-Yamada) 416 407 DO jk = 2, jpkm1 417 DO jj = 2, jpjm1418 DO ji = fs_2, fs_jpim1 ! vector opt.408 DO jj = k_Jstr, k_Jend 409 DO ji = k_Istr, k_Iend 419 410 psi(ji,jj,jk) = eb(ji,jj,jk) * hmxl_b(ji,jj,jk) 420 411 END DO … … 424 415 CASE( 1 ) ! k-eps 425 416 DO jk = 2, jpkm1 426 DO jj = 2, jpjm1427 DO ji = fs_2, fs_jpim1 ! vector opt.417 DO jj = k_Jstr, k_Jend 418 DO ji = k_Istr, k_Iend 428 419 psi(ji,jj,jk) = eps(ji,jj,jk) 429 420 END DO … … 433 424 CASE( 2 ) ! k-w 434 425 DO jk = 2, jpkm1 435 DO jj = 2, jpjm1436 DO ji = fs_2, fs_jpim1 ! vector opt.426 DO jj = k_Jstr, k_Jend 427 DO ji = k_Istr, k_Iend 437 428 psi(ji,jj,jk) = SQRT( eb(ji,jj,jk) ) / ( rc0 * hmxl_b(ji,jj,jk) ) 438 429 END DO … … 442 433 CASE( 3 ) ! generic 443 434 DO jk = 2, jpkm1 444 DO jj = 2, jpjm1445 DO ji = fs_2, fs_jpim1 ! vector opt.435 DO jj = k_Jstr, k_Jend 436 DO ji = k_Istr, k_Iend 446 437 psi(ji,jj,jk) = rc02 * eb(ji,jj,jk) * hmxl_b(ji,jj,jk)**rnn 447 438 END DO … … 459 450 460 451 DO jk = 2, jpkm1 461 DO jj = 2, jpjm1462 DO ji = fs_2, fs_jpim1 ! vector opt.452 DO jj = k_Jstr, k_Jend 453 DO ji = k_Istr, k_Iend 463 454 ! 464 455 ! psi / k … … 471 462 ! 472 463 ! shear prod. - stratif. destruction 473 prod = rpsi1 * zratio * shear(ji,jj,jk)464 prod = rpsi1 * zratio * psh2(ji,jj,jk) 474 465 ! 475 466 ! stratif. destruction 476 buoy = rpsi3 * zratio * (- avt(ji,jj,jk) * rn2(ji,jj,jk) )467 buoy = rpsi3 * zratio * (- p_avt(ji,jj,jk) * rn2(ji,jj,jk) ) 477 468 ! 478 469 ! shear prod. - stratif. destruction … … 487 478 zcof = rfact_psi * zwall_psi(ji,jj,jk) * tmask(ji,jj,jk) 488 479 ! ! lower diagonal 489 z_elem_a(ji,jj,jk) = zcof * ( avm(ji,jj,jk ) +avm(ji,jj,jk-1) ) / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk) )480 z_elem_a(ji,jj,jk) = zcof * ( p_avm(ji,jj,jk ) + p_avm(ji,jj,jk-1) ) / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk) ) 490 481 ! ! upper diagonal 491 z_elem_c(ji,jj,jk) = zcof * ( avm(ji,jj,jk+1) +avm(ji,jj,jk ) ) / ( e3t_n(ji,jj,jk ) * e3w_n(ji,jj,jk) )482 z_elem_c(ji,jj,jk) = zcof * ( p_avm(ji,jj,jk+1) + p_avm(ji,jj,jk ) ) / ( e3t_n(ji,jj,jk ) * e3w_n(ji,jj,jk) ) 492 483 ! ! diagonal 493 484 z_elem_b(ji,jj,jk) = 1._wp - z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk) + rdt * zdiss * wmask(ji,jj,jk) … … 498 489 END DO 499 490 ! 500 z_elem_b( :,:,jpk) = 1._wp491 z_elem_b(WRK_2D,jpk) = 1._wp 501 492 502 493 ! Surface boundary condition on psi … … 508 499 ! 509 500 ! Surface value 510 zdep( :,:) = zhsro(:,:) * rl_sf ! Cosmetic511 psi ( :,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1)512 z_elem_a( :,:,1) = psi(:,:,1)513 z_elem_c( :,:,1) = 0._wp514 z_elem_b( :,:,1) = 1._wp501 zdep(WRK_2D) = zhsro(WRK_2D) * rl_sf ! Cosmetic 502 psi (WRK_2D,1) = rc0**rpp * en(WRK_2D,1)**rmm * zdep(WRK_2D)**rnn * tmask(WRK_2D,1) 503 z_elem_a(WRK_2D,1) = psi(WRK_2D,1) 504 z_elem_c(WRK_2D,1) = 0._wp 505 z_elem_b(WRK_2D,1) = 1._wp 515 506 ! 516 507 ! One level below 517 zkar( :,:) = (rl_sf + (vkarmn-rl_sf)*(1._wp-exp(-rtrans*gdepw_n(:,:,2)/zhsro(:,:) )))518 zdep( :,:) = (zhsro(:,:) + gdepw_n(:,:,2)) * zkar(:,:)519 psi ( :,:,2) = rc0**rpp * en(:,:,2)**rmm * zdep(:,:)**rnn * tmask(:,:,1)520 z_elem_a( :,:,2) = 0._wp521 z_elem_c( :,:,2) = 0._wp522 z_elem_b( :,:,2) = 1._wp508 zkar(WRK_2D) = (rl_sf + (vkarmn-rl_sf)*(1._wp-exp(-rtrans*gdepw_n(WRK_2D,2)/zhsro(WRK_2D) ))) 509 zdep(WRK_2D) = (zhsro(WRK_2D) + gdepw_n(WRK_2D,2)) * zkar(WRK_2D) 510 psi (WRK_2D,2) = rc0**rpp * en(WRK_2D,2)**rmm * zdep(WRK_2D)**rnn * tmask(WRK_2D,1) 511 z_elem_a(WRK_2D,2) = 0._wp 512 z_elem_c(WRK_2D,2) = 0._wp 513 z_elem_b(WRK_2D,2) = 1._wp 523 514 ! 524 515 ! … … 526 517 ! 527 518 ! Surface value: Dirichlet 528 zdep( :,:) = zhsro(:,:) * rl_sf529 psi ( :,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1)530 z_elem_a( :,:,1) = psi(:,:,1)531 z_elem_c( :,:,1) = 0._wp532 z_elem_b( :,:,1) = 1._wp519 zdep(WRK_2D) = zhsro(WRK_2D) * rl_sf 520 psi (WRK_2D,1) = rc0**rpp * en(WRK_2D,1)**rmm * zdep(WRK_2D)**rnn * tmask(WRK_2D,1) 521 z_elem_a(WRK_2D,1) = psi(WRK_2D,1) 522 z_elem_c(WRK_2D,1) = 0._wp 523 z_elem_b(WRK_2D,1) = 1._wp 533 524 ! 534 525 ! Neumann condition at k=2 535 z_elem_b( :,:,2) = z_elem_b(:,:,2) + z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b536 z_elem_a( :,:,2) = 0._wp526 z_elem_b(WRK_2D,2) = z_elem_b(WRK_2D,2) + z_elem_a(WRK_2D,2) ! Remove z_elem_a from z_elem_b 527 z_elem_a(WRK_2D,2) = 0._wp 537 528 ! 538 529 ! Set psi vertical flux at the surface: 539 zkar( :,:) = rl_sf + (vkarmn-rl_sf)*(1._wp-exp(-rtrans*gdept_n(:,:,1)/zhsro(:,:) )) ! Lengh scale slope540 zdep( :,:) = ((zhsro(:,:) + gdept_n(:,:,1)) / zhsro(:,:))**(rmm*ra_sf)541 zflxs( :,:) = (rnn + rsbc_tke1 * (rnn + rmm*ra_sf) * zdep(:,:))*(1._wp + rsbc_tke1*zdep(:,:))**(2._wp*rmm/3._wp-1_wp)542 zdep( :,:) = rsbc_psi1 * (zwall_psi(:,:,1)*avm(:,:,1)+zwall_psi(:,:,2)*avm(:,:,2)) * &543 & ustars2( :,:)**rmm * zkar(:,:)**rnn * (zhsro(:,:) + gdept_n(:,:,1))**(rnn-1.)544 zflxs( :,:) = zdep(:,:) * zflxs(:,:)545 psi( :,:,2) = psi(:,:,2) + zflxs(:,:) / e3w_n(:,:,2)530 zkar(WRK_2D) = rl_sf + (vkarmn-rl_sf)*(1._wp-exp(-rtrans*gdept_n(WRK_2D,1)/zhsro(WRK_2D) )) ! Lengh scale slope 531 zdep(WRK_2D) = ((zhsro(WRK_2D) + gdept_n(WRK_2D,1)) / zhsro(WRK_2D))**(rmm*ra_sf) 532 zflxs(WRK_2D) = (rnn + rsbc_tke1 * (rnn + rmm*ra_sf) * zdep(WRK_2D))*(1._wp + rsbc_tke1*zdep(WRK_2D))**(2._wp*rmm/3._wp-1_wp) 533 zdep(WRK_2D) = rsbc_psi1 * (zwall_psi(WRK_2D,1)*p_avm(WRK_2D,1)+zwall_psi(WRK_2D,2)*p_avm(WRK_2D,2)) * & 534 & ustars2(WRK_2D)**rmm * zkar(WRK_2D)**rnn * (zhsro(WRK_2D) + gdept_n(WRK_2D,1))**(rnn-1.) 535 zflxs(WRK_2D) = zdep(WRK_2D) * zflxs(WRK_2D) 536 psi(WRK_2D,2) = psi(WRK_2D,2) + zflxs(WRK_2D) / e3w_n(WRK_2D,2) 546 537 ! 547 538 ! … … 557 548 ! ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = vkarmn * rn_bfrz0 558 549 ! ! Balance between the production and the dissipation terms 559 DO jj = 2, jpjm1560 DO ji = fs_2, fs_jpim1 ! vector opt.550 DO jj = k_Jstr, k_Jend 551 DO ji = k_Istr, k_Iend 561 552 ibot = mbkt(ji,jj) + 1 ! k bottom level of w-point 562 553 ibotm1 = mbkt(ji,jj) ! k-1 bottom level of w-point but >=1 … … 578 569 CASE ( 1 ) ! Neumman boundary condition 579 570 ! 580 DO jj = 2, jpjm1581 DO ji = fs_2, fs_jpim1 ! vector opt.571 DO jj = k_Jstr, k_Jend 572 DO ji = k_Istr, k_Iend 582 573 ibot = mbkt(ji,jj) + 1 ! k bottom level of w-point 583 574 ibotm1 = mbkt(ji,jj) ! k-1 bottom level of w-point but >=1 … … 597 588 ! Set psi vertical flux at the bottom: 598 589 zdep(ji,jj) = rn_bfrz0 + 0.5_wp*e3t_n(ji,jj,ibotm1) 599 zflxb = rsbc_psi2 * ( avm(ji,jj,ibot) +avm(ji,jj,ibotm1) ) &590 zflxb = rsbc_psi2 * ( p_avm(ji,jj,ibot) + p_avm(ji,jj,ibotm1) ) & 600 591 & * (0.5_wp*(en(ji,jj,ibot)+en(ji,jj,ibotm1)))**rmm * zdep(ji,jj)**(rnn-1._wp) 601 592 psi(ji,jj,ibotm1) = psi(ji,jj,ibotm1) + zflxb / e3w_n(ji,jj,ibotm1) … … 609 600 ! 610 601 DO jk = 2, jpkm1 ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1 611 DO jj = 2, jpjm1612 DO ji = fs_2, fs_jpim1 ! vector opt.602 DO jj = k_Jstr, k_Jend 603 DO ji = k_Istr, k_Iend 613 604 z_elem_b(ji,jj,jk) = z_elem_b(ji,jj,jk) - z_elem_a(ji,jj,jk) * z_elem_c(ji,jj,jk-1) / z_elem_b(ji,jj,jk-1) 614 605 END DO … … 616 607 END DO 617 608 DO jk = 2, jpk ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1 618 DO jj = 2, jpjm1619 DO ji = fs_2, fs_jpim1 ! vector opt.609 DO jj = k_Jstr, k_Jend 610 DO ji = k_Istr, k_Iend 620 611 z_elem_a(ji,jj,jk) = psi(ji,jj,jk) - z_elem_a(ji,jj,jk) / z_elem_b(ji,jj,jk-1) * z_elem_a(ji,jj,jk-1) 621 612 END DO … … 623 614 END DO 624 615 DO jk = jpk-1, 2, -1 ! Third recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk 625 DO jj = 2, jpjm1626 DO ji = fs_2, fs_jpim1 ! vector opt.616 DO jj = k_Jstr, k_Jend 617 DO ji = k_Istr, k_Iend 627 618 psi(ji,jj,jk) = ( z_elem_a(ji,jj,jk) - z_elem_c(ji,jj,jk) * psi(ji,jj,jk+1) ) / z_elem_b(ji,jj,jk) 628 619 END DO … … 637 628 CASE( 0 ) ! k-kl (Mellor-Yamada) 638 629 DO jk = 1, jpkm1 639 DO jj = 2, jpjm1640 DO ji = fs_2, fs_jpim1 ! vector opt.630 DO jj = k_Jstr, k_Jend 631 DO ji = k_Istr, k_Iend 641 632 eps(ji,jj,jk) = rc03 * en(ji,jj,jk) * en(ji,jj,jk) * SQRT( en(ji,jj,jk) ) / MAX( psi(ji,jj,jk), rn_epsmin) 642 633 END DO … … 646 637 CASE( 1 ) ! k-eps 647 638 DO jk = 1, jpkm1 648 DO jj = 2, jpjm1649 DO ji = fs_2, fs_jpim1 ! vector opt.639 DO jj = k_Jstr, k_Jend 640 DO ji = k_Istr, k_Iend 650 641 eps(ji,jj,jk) = psi(ji,jj,jk) 651 642 END DO … … 655 646 CASE( 2 ) ! k-w 656 647 DO jk = 1, jpkm1 657 DO jj = 2, jpjm1658 DO ji = fs_2, fs_jpim1 ! vector opt.648 DO jj = k_Jstr, k_Jend 649 DO ji = k_Istr, k_Iend 659 650 eps(ji,jj,jk) = rc04 * en(ji,jj,jk) * psi(ji,jj,jk) 660 651 END DO … … 667 658 zex2 = -1._wp / rnn 668 659 DO jk = 1, jpkm1 669 DO jj = 2, jpjm1670 DO ji = fs_2, fs_jpim1 ! vector opt.660 DO jj = k_Jstr, k_Jend 661 DO ji = k_Istr, k_Iend 671 662 eps(ji,jj,jk) = zcoef * en(ji,jj,jk)**zex1 * psi(ji,jj,jk)**zex2 672 663 END DO … … 679 670 ! -------------------------------------------------- 680 671 DO jk = 1, jpkm1 ! Note that this set boundary conditions on hmxl_n at the same time 681 DO jj = 2, jpjm1682 DO ji = fs_2, fs_jpim1 ! vector opt.672 DO jj = k_Jstr, k_Jend 673 DO ji = k_Istr, k_Iend 683 674 ! limitation 684 675 eps (ji,jj,jk) = MAX( eps(ji,jj,jk), rn_epsmin ) … … 699 690 CASE ( 0 , 1 ) ! Galperin or Kantha-Clayson stability functions 700 691 DO jk = 2, jpkm1 701 DO jj = 2, jpjm1702 DO ji = fs_2, fs_jpim1 ! vector opt.692 DO jj = k_Jstr, k_Jend 693 DO ji = k_Istr, k_Iend 703 694 ! zcof = l²/q² 704 695 zcof = hmxl_b(ji,jj,jk) * hmxl_b(ji,jj,jk) / ( 2._wp*eb(ji,jj,jk) ) … … 720 711 CASE ( 2, 3 ) ! Canuto stability functions 721 712 DO jk = 2, jpkm1 722 DO jj = 2, jpjm1723 DO ji = fs_2, fs_jpim1 ! vector opt.713 DO jj = k_Jstr, k_Jend 714 DO ji = k_Istr, k_Iend 724 715 ! zcof = l²/q² 725 716 zcof = hmxl_b(ji,jj,jk)*hmxl_b(ji,jj,jk) / ( 2._wp * eb(ji,jj,jk) ) … … 730 721 gh = gh * rf6 731 722 ! Gm = M²l²/q² Shear number 732 shr = shear(ji,jj,jk) / MAX(avm(ji,jj,jk), rsmall )723 shr = psh2(ji,jj,jk) / MAX( p_avm(ji,jj,jk), rsmall ) 733 724 gm = MAX( shr * zcof , 1.e-10 ) 734 725 gm = gm * rf6 … … 751 742 ! Lines below are useless if GOTM style Dirichlet conditions are used 752 743 753 zstm( :,:,1) = zstm(:,:,2)744 zstm(WRK_2D,1) = zstm(WRK_2D,2) 754 745 755 746 !!gm should be done for ISF (top boundary cond.) 756 DO jj = 2, jpjm1757 DO ji = fs_2, fs_jpim1 ! vector opt.747 DO jj = k_Jstr, k_Jend 748 DO ji = k_Istr, k_Iend 758 749 zstm(ji,jj,mbkt(ji,jj)+1) = zstm(ji,jj,mbkt(ji,jj)) 759 750 END DO … … 763 754 ! The computation below could be restrained to jk=2 to jpkm1 if GOTM style Dirichlet conditions are used 764 755 DO jk = 1, jpk 765 DO jj = 2, jpjm1766 DO ji = fs_2, fs_jpim1 ! vector opt.756 DO jj = k_Jstr, k_Jend 757 DO ji = k_Istr, k_Iend 767 758 zsqen = SQRT( 2._wp * en(ji,jj,jk) ) * hmxl_n(ji,jj,jk) 768 759 zav = zsqen * zstt(ji,jj,jk) 769 avt(ji,jj,jk) = MAX( zav, avtb(jk) ) * wmask(ji,jj,jk) ! apply mask for zdfmxl routine760 p_avt(ji,jj,jk) = MAX( zav, avtb(jk) ) * wmask(ji,jj,jk) ! apply mask for zdfmxl routine 770 761 zav = zsqen * zstm(ji,jj,jk) 771 avm(ji,jj,jk) = MAX( zav, avmb(jk) ) ! Note that avm is not masked at the surface and the bottom762 p_avm(ji,jj,jk) = MAX( zav, avmb(jk) ) ! Note that avm is not masked at the surface and the bottom 772 763 END DO 773 764 END DO 774 765 END DO 775 avt(:,:,1) = 0._wp 776 !!gm I'm sure this is needed to compute the shear term at next time-step 777 CALL lbc_lnk( avm, 'W', 1. ) ; CALL lbc_lnk( avt, 'W', 1. ) 766 p_avt(WRK_2D,1) = 0._wp 778 767 ! 779 768 IF(ln_ctl) THEN … … 781 770 CALL prt_ctl( tab3d_1=avm, clinfo1=' gls - m: ', ovlap=1, kdim=jpk ) 782 771 ENDIF 783 !784 avt_k(:,:,:) = avt(:,:,:) !== store avt, avm values computed by GLS only ==!785 avm_k(:,:,:) = avm(:,:,:)786 !787 IF( lrst_oce ) CALL gls_rst( kt, 'WRITE' ) ! write the GLS info in the restart file788 !789 CALL wrk_dealloc( jpi,jpj, zdep, zkar, zflxs, zhsro )790 CALL wrk_dealloc( jpi,jpj,jpk, eb, hmxl_b, shear, eps, zwall_psi, z_elem_a, z_elem_b, z_elem_c, psi )791 CALL wrk_dealloc( jpi,jpj,jpk, zstt, zstm )792 772 ! 793 773 IF( nn_timing == 1 ) CALL timing_stop('zdf_gls') … … 837 817 IF(lwp) THEN !* Control print 838 818 WRITE(numout,*) 839 WRITE(numout,*) 'zdf_gls_init : glsturbulent closure scheme'819 WRITE(numout,*) 'zdf_gls_init : GLS turbulent closure scheme' 840 820 WRITE(numout,*) '~~~~~~~~~~~~' 841 821 WRITE(numout,*) ' Namelist namzdf_gls : set gls mixing parameters' … … 855 835 WRITE(numout,*) ' Surface roughness (m) rn_hsro = ', rn_hsro 856 836 WRITE(numout,*) ' Bottom roughness (m) (nambfr namelist) rn_bfrz0 = ', rn_bfrz0 837 WRITE(numout,*) 857 838 ENDIF 858 839 … … 861 842 862 843 ! !* Check of some namelist values 863 IF( nn_bc_surf < 0 .OR. nn_bc_surf > 1 )CALL ctl_stop( 'zdf_gls_init: bad flag: nn_bc_surf is 0 or 1' )864 IF( nn_bc_surf < 0 .OR. nn_bc_surf > 1 )CALL ctl_stop( 'zdf_gls_init: bad flag: nn_bc_surf is 0 or 1' )865 IF( nn_z0_met < 0 .OR. nn_z0_met > 3 )CALL ctl_stop( 'zdf_gls_init: bad flag: nn_z0_met is 0, 1, 2 or 3' )866 IF( nn_z0_met == 3 .AND. .NOT.ln_wave )CALL ctl_stop( 'zdf_gls_init: nn_z0_met=3 requires ln_wave=T' )867 IF( nn_stab_func < 0 .OR. nn_stab_func > 3 )CALL ctl_stop( 'zdf_gls_init: bad flag: nn_stab_func is 0, 1, 2 and 3' )868 IF( nn_clos < 0 .OR. nn_clos > 3 )CALL ctl_stop( 'zdf_gls_init: bad flag: nn_clos is 0, 1, 2 or 3' )844 IF( nn_bc_surf < 0 .OR. nn_bc_surf > 1 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_bc_surf is 0 or 1' ) 845 IF( nn_bc_surf < 0 .OR. nn_bc_surf > 1 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_bc_surf is 0 or 1' ) 846 IF( nn_z0_met < 0 .OR. nn_z0_met > 3 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_z0_met is 0, 1, 2 or 3' ) 847 IF( nn_z0_met == 3 .AND. .NOT.ln_wave ) CALL ctl_stop( 'zdf_gls_init: nn_z0_met=3 requires ln_wave=T' ) 848 IF( nn_stab_func < 0 .OR. nn_stab_func > 3 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_stab_func is 0, 1, 2 and 3' ) 849 IF( nn_clos < 0 .OR. nn_clos > 3 ) CALL ctl_stop( 'zdf_gls_init: bad flag: nn_clos is 0, 1, 2 or 3' ) 869 850 870 851 SELECT CASE ( nn_clos ) !* set the parameters for the chosen closure … … 872 853 CASE( 0 ) ! k-kl (Mellor-Yamada) 873 854 ! 874 IF(lwp) WRITE(numout,*) 'The choosen closure is k-kl closed to the classical Mellor-Yamada' 855 IF(lwp) WRITE(numout,*) ' ==>> k-kl closure chosen (i.e. closed to the classical Mellor-Yamada)' 856 IF(lwp) WRITE(numout,*) 875 857 rpp = 0._wp 876 858 rmm = 1._wp … … 890 872 CASE( 1 ) ! k-eps 891 873 ! 892 IF(lwp) WRITE(numout,*) 'The choosen closure is k-eps' 874 IF(lwp) WRITE(numout,*) ' ==>> k-eps closure chosen' 875 IF(lwp) WRITE(numout,*) 893 876 rpp = 3._wp 894 877 rmm = 1.5_wp … … 908 891 CASE( 2 ) ! k-omega 909 892 ! 910 IF(lwp) WRITE(numout,*) 'The choosen closure is k-omega' 893 IF(lwp) WRITE(numout,*) ' ==>> k-omega closure chosen' 894 IF(lwp) WRITE(numout,*) 911 895 rpp = -1._wp 912 896 rmm = 0.5_wp … … 926 910 CASE( 3 ) ! generic 927 911 ! 928 IF(lwp) WRITE(numout,*) 'The choosen closure is generic' 912 IF(lwp) WRITE(numout,*) ' ==>> generic closure chosen' 913 IF(lwp) WRITE(numout,*) 929 914 rpp = 2._wp 930 915 rmm = 1._wp … … 949 934 CASE ( 0 ) ! Galperin stability functions 950 935 ! 951 IF(lwp) WRITE(numout,*) ' Stability functions from Galperin'936 IF(lwp) WRITE(numout,*) ' ==>> Stability functions from Galperin' 952 937 rc2 = 0._wp 953 938 rc3 = 0._wp … … 961 946 CASE ( 1 ) ! Kantha-Clayson stability functions 962 947 ! 963 IF(lwp) WRITE(numout,*) ' Stability functions from Kantha-Clayson'948 IF(lwp) WRITE(numout,*) ' ==>> Stability functions from Kantha-Clayson' 964 949 rc2 = 0.7_wp 965 950 rc3 = 0.2_wp … … 973 958 CASE ( 2 ) ! Canuto A stability functions 974 959 ! 975 IF(lwp) WRITE(numout,*) ' Stability functions from Canuto A'960 IF(lwp) WRITE(numout,*) ' ==>> Stability functions from Canuto A' 976 961 rs0 = 1.5_wp * rl1 * rl5*rl5 977 962 rs1 = -rl4*(rl6+rl7) + 2._wp*rl4*rl5*(rl1-(1._wp/3._wp)*rl2-rl3) + 1.5_wp*rl1*rl5*rl8 … … 997 982 CASE ( 3 ) ! Canuto B stability functions 998 983 ! 999 IF(lwp) WRITE(numout,*) ' Stability functions from Canuto B'984 IF(lwp) WRITE(numout,*) ' ==>> Stability functions from Canuto B' 1000 985 rs0 = 1.5_wp * rm1 * rm5*rm5 1001 986 rs1 = -rm4 * (rm6+rm7) + 2._wp * rm4*rm5*(rm1-(1._wp/3._wp)*rm2-rm3) + 1.5_wp * rm1*rm5*rm8 … … 1052 1037 IF(lwp) THEN !* Control print 1053 1038 WRITE(numout,*) 1054 WRITE(numout,*) 'Limit values' 1055 WRITE(numout,*) '~~~~~~~~~~~~' 1056 WRITE(numout,*) 'Parameter m = ',rmm 1057 WRITE(numout,*) 'Parameter n = ',rnn 1058 WRITE(numout,*) 'Parameter p = ',rpp 1059 WRITE(numout,*) 'rpsi1 = ',rpsi1 1060 WRITE(numout,*) 'rpsi2 = ',rpsi2 1061 WRITE(numout,*) 'rpsi3m = ',rpsi3m 1062 WRITE(numout,*) 'rpsi3p = ',rpsi3p 1063 WRITE(numout,*) 'rsc_tke = ',rsc_tke 1064 WRITE(numout,*) 'rsc_psi = ',rsc_psi 1065 WRITE(numout,*) 'rsc_psi0 = ',rsc_psi0 1066 WRITE(numout,*) 'rc0 = ',rc0 1039 WRITE(numout,*) ' Limit values :' 1040 WRITE(numout,*) ' Parameter m = ',rmm 1041 WRITE(numout,*) ' Parameter n = ',rnn 1042 WRITE(numout,*) ' Parameter p = ',rpp 1043 WRITE(numout,*) ' rpsi1 = ',rpsi1 1044 WRITE(numout,*) ' rpsi2 = ',rpsi2 1045 WRITE(numout,*) ' rpsi3m = ',rpsi3m 1046 WRITE(numout,*) ' rpsi3p = ',rpsi3p 1047 WRITE(numout,*) ' rsc_tke = ',rsc_tke 1048 WRITE(numout,*) ' rsc_psi = ',rsc_psi 1049 WRITE(numout,*) ' rsc_psi0 = ',rsc_psi0 1050 WRITE(numout,*) ' rc0 = ',rc0 1067 1051 WRITE(numout,*) 1068 WRITE(numout,*) 'Shear free turbulence parameters:' 1069 WRITE(numout,*) 'rcm_sf = ',rcm_sf 1070 WRITE(numout,*) 'ra_sf = ',ra_sf 1071 WRITE(numout,*) 'rl_sf = ',rl_sf 1072 WRITE(numout,*) 1052 WRITE(numout,*) ' Shear free turbulence parameters:' 1053 WRITE(numout,*) ' rcm_sf = ',rcm_sf 1054 WRITE(numout,*) ' ra_sf = ',ra_sf 1055 WRITE(numout,*) ' rl_sf = ',rl_sf 1073 1056 ENDIF 1074 1057 … … 1090 1073 ! 1091 1074 ! !* Wall proximity function 1092 zwall 1075 zwall(:,:,:) = 1._wp * tmask(:,:,:) 1093 1076 1094 1077 ! !* read or initialize all required files … … 1133 1116 CALL iom_get( numror, jpdom_autoglo, 'hmxl_n', hmxl_n ) 1134 1117 ELSE 1135 IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without gls scheme, en and hmxl_n computed by iterative loop' 1118 IF(lwp) WRITE(numout,*) 1119 IF(lwp) WRITE(numout,*) ' ==>> previous run without GLS scheme, set en and hmxl_n to background values' 1136 1120 en (:,:,:) = rn_emin 1137 1121 hmxl_n(:,:,:) = 0.05_wp 1138 avt_k (:,:,:) = avt(:,:,:) 1139 avm_k (:,:,:) = avm(:,:,:) 1140 DO jit = nit000 + 1, nit000 + 10 ; CALL zdf_gls( jit ) ; END DO 1122 ! avt_k, avm_k already set to the background value in zdf_phy_init 1141 1123 ENDIF 1142 1124 ELSE !* Start from rest 1143 IF(lwp) WRITE(numout,*) ' ===>>>> : Initialisation of en and hmxl_n by background values' 1125 IF(lwp) WRITE(numout,*) 1126 IF(lwp) WRITE(numout,*) ' ==>> start from rest, set en and hmxl_n by background values' 1144 1127 en (:,:,:) = rn_emin 1145 1128 hmxl_n(:,:,:) = 0.05_wp 1146 DO jk = 1, jpk 1147 avt_k(:,:,jk) = avtb(jk) * wmask(:,:,jk) 1148 avm_k(:,:,jk) = avmb(jk) * wmask(:,:,jk) 1149 END DO 1129 ! avt_k, avm_k already set to the background value in zdf_phy_init 1150 1130 ENDIF 1151 1131 ! -
branches/2017/wrk_OMP_test_for_Silvia/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfiwm.F90
r7990 r8055 35 35 PUBLIC zdf_iwm ! called in step module 36 36 PUBLIC zdf_iwm_init ! called in nemogcm module 37 PUBLIC zdf_iwm_alloc ! called in nemogcm module38 37 39 38 ! !!* Namelist namzdf_iwm : internal wave-driven mixing * … … 56 55 57 56 !! * Substitutions 58 # include " vectopt_loop_substitute.h90"57 # include "domain_substitute.h90" 59 58 !!---------------------------------------------------------------------- 60 59 !! NEMO/OPA 4.0 , NEMO Consortium (2016) … … 78 77 79 78 80 SUBROUTINE zdf_iwm( kt)79 SUBROUTINE zdf_iwm( ARG_2D, kt, p_avm, p_avt, p_avs ) 81 80 !!---------------------------------------------------------------------- 82 81 !! *** ROUTINE zdf_iwm *** … … 127 126 !! References : de Lavergne et al. 2015, JPO; 2016, in prep. 128 127 !!---------------------------------------------------------------------- 129 INTEGER, INTENT(in) :: kt ! ocean time-step 128 INTEGER , INTENT(in ) :: ARG_2D ! inner domain start-end i-indices 129 INTEGER , INTENT(in ) :: kt ! ocean time step 130 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avm ! momentum Kz (w-points) 131 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avt, p_avs ! tracer Kz (w-points) 130 132 ! 131 133 INTEGER :: ji, jj, jk ! dummy loop indices 132 REAL(wp) :: z tpc! scalar workspace133 REAL(wp), DIMENSION( :,:) , POINTER:: zfact ! Used for vertical structure134 REAL(wp), DIMENSION( :,:) , POINTER:: zhdep ! Ocean depth135 REAL(wp), DIMENSION( :,:,:), POINTER:: zwkb ! WKB-stretched height above bottom136 REAL(wp), DIMENSION( :,:,:), POINTER:: zweight ! Weight for high mode vertical distribution137 REAL(wp), DIMENSION( :,:,:), POINTER:: znu_t ! Molecular kinematic viscosity (T grid)138 REAL(wp), DIMENSION( :,:,:), POINTER:: znu_w ! Molecular kinematic viscosity (W grid)139 REAL(wp), DIMENSION( :,:,:), POINTER:: zReb ! Turbulence intensity parameter134 REAL(wp) :: zztemp ! scalar workspace 135 REAL(wp), DIMENSION(WRK_2D) :: zfact ! Used for vertical structure 136 REAL(wp), DIMENSION(WRK_2D) :: zhdep ! Ocean depth 137 REAL(wp), DIMENSION(WRK_3D) :: zwkb ! WKB-stretched height above bottom 138 REAL(wp), DIMENSION(WRK_3D) :: zweight ! Weight for high mode vertical distribution 139 REAL(wp), DIMENSION(WRK_3D) :: znu_t ! Molecular kinematic viscosity (T grid) 140 REAL(wp), DIMENSION(WRK_3D) :: znu_w ! Molecular kinematic viscosity (W grid) 141 REAL(wp), DIMENSION(WRK_3D) :: zReb ! Turbulence intensity parameter 140 142 !!---------------------------------------------------------------------- 141 143 ! 142 144 IF( nn_timing == 1 ) CALL timing_start('zdf_iwm') 143 145 ! 144 CALL wrk_alloc( jpi,jpj, zfact, zhdep )145 CALL wrk_alloc( jpi,jpj,jpk, zwkb, zweight, znu_t, znu_w, zReb )146 147 146 ! ! ----------------------------- ! 148 147 ! ! Internal wave-driven mixing ! (compute zav_wave) … … 151 150 ! !* Critical slope mixing: distribute energy over the time-varying ocean depth, 152 151 ! using an exponential decay from the seafloor. 153 DO jj = 1, jpj ! part independent of the level154 DO ji = 1, jpi152 DO jj = k_Jstr, k_Jend 153 DO ji = k_Istr, k_Iend ! part independent of the level 155 154 zhdep(ji,jj) = gdepw_0(ji,jj,mbkt(ji,jj)+1) ! depth of the ocean 156 155 zfact(ji,jj) = rau0 * ( 1._wp - EXP( -zhdep(ji,jj) / hcri_iwm(ji,jj) ) ) … … 158 157 END DO 159 158 END DO 160 161 159 DO jk = 2, jpkm1 ! complete with the level-dependent part 162 emix_iwm(:,:,jk) = zfact(:,:) * ( EXP( ( gde3w_n(:,:,jk ) - zhdep(:,:) ) / hcri_iwm(:,:) ) & 163 & - EXP( ( gde3w_n(:,:,jk-1) - zhdep(:,:) ) / hcri_iwm(:,:) ) ) * wmask(:,:,jk) & 160 DO jj = k_Jstr, k_Jend 161 DO ji = k_Istr, k_Iend 162 emix_iwm(ji,jj,jk) = zfact(ji,jj) * wmask(ji,jj,jk) & 163 & * ( EXP( ( gde3w_n(ji,jj,jk ) - zhdep(ji,jj) ) / hcri_iwm(ji,jj) ) & 164 & - EXP( ( gde3w_n(ji,jj,jk-1) - zhdep(ji,jj) ) / hcri_iwm(ji,jj) ) ) & 165 & / ( gde3w_n(ji,jj,jk) - gde3w_n(ji,jj,jk-1) ) 166 164 167 !!gm delta(gde3w_n) = e3t_n !! Please verify the grid-point position w versus t-point 165 & / ( gde3w_n(:,:,jk) - gde3w_n(:,:,jk-1) ) 168 !!gm it seems to me that only 1/hcri_iwm is used ==> compute it one for all 169 170 END DO 171 END DO 166 172 END DO 167 173 168 174 ! !* Pycnocline-intensified mixing: distribute energy over the time-varying 169 175 ! !* ocean depth as proportional to sqrt(rn2)^nn_zpyc 170 ! 176 ! ! (NB: N2 is masked, so no use of wmask here) 171 177 SELECT CASE ( nn_zpyc ) 172 178 ! 173 179 CASE ( 1 ) ! Dissipation scales as N (recommended) 174 180 ! 175 zfact(:,:) = 0._wp 176 DO jk = 2, jpkm1 ! part independent of the level 177 zfact(:,:) = zfact(:,:) + e3w_n(:,:,jk) * SQRT( MAX( 0._wp, rn2(:,:,jk) ) ) * wmask(:,:,jk) 178 END DO 179 ! 180 DO jj = 1, jpj 181 DO ji = 1, jpi 182 IF( zfact(ji,jj) /= 0 ) zfact(ji,jj) = epyc_iwm(ji,jj) / ( rau0 * zfact(ji,jj) ) 183 END DO 184 END DO 181 zfact(WRK_2D) = 0._wp ! part independent of the level 182 DO jk = 2, jpkm1 183 zfact(WRK_2D) = zfact(WRK_2D) + e3w_n(WRK_2D,jk) * SQRT( MAX( 0._wp, rn2(WRK_2D,jk) ) ) 184 END DO 185 ! 186 WHERE( zfact(WRK_2D) /= 0 ) zfact(WRK_2D) = epyc_iwm(WRK_2D) / ( rau0 * zfact(WRK_2D) ) 187 ! DO jj = k_Jstr, k_Jend 188 ! DO ji = k_Istr, k_Iend 189 ! IF( zfact(ji,jj) /= 0 ) zfact(ji,jj) = epyc_iwm(ji,jj) / ( rau0 * zfact(ji,jj) ) 190 ! END DO 191 ! END DO 192 ! ! complete with the level-dependent part 193 DO jk = 2, jpkm1 194 emix_iwm(WRK_2D,jk) = emix_iwm(WRK_2D,jk) + zfact(WRK_2D) * SQRT( MAX( 0._wp, rn2(WRK_2D,jk) ) ) 195 END DO 196 ! 197 CASE ( 2 ) ! Dissipation scales as N^2 198 ! 199 zfact(WRK_2D) = 0._wp 200 DO jk = 2, jpkm1 ! part independent of the level 201 zfact(WRK_2D) = zfact(WRK_2D) + e3w_n(WRK_2D,jk) * MAX( 0._wp, rn2(WRK_2D,jk) ) 202 END DO 203 ! 204 WHERE( zfact(WRK_2D) /= 0 ) zfact(WRK_2D) = epyc_iwm(WRK_2D) / ( rau0 * zfact(WRK_2D) ) 205 ! DO jj = k_Jstr, k_Jend 206 ! DO ji = k_Istr, k_Iend 207 ! IF( zfact(ji,jj) /= 0 ) zfact(ji,jj) = epyc_iwm(ji,jj) / ( rau0 * zfact(ji,jj) ) 208 ! END DO 209 ! END DO 185 210 ! 186 211 DO jk = 2, jpkm1 ! complete with the level-dependent part 187 emix_iwm(:,:,jk) = emix_iwm(:,:,jk) + zfact(:,:) * SQRT( MAX( 0._wp, rn2(:,:,jk) ) ) * wmask(:,:,jk) 188 END DO 189 ! 190 CASE ( 2 ) ! Dissipation scales as N^2 191 ! 192 zfact(:,:) = 0._wp 193 DO jk = 2, jpkm1 ! part independent of the level 194 zfact(:,:) = zfact(:,:) + e3w_n(:,:,jk) * MAX( 0._wp, rn2(:,:,jk) ) * wmask(:,:,jk) 195 END DO 196 ! 197 DO jj= 1, jpj 198 DO ji = 1, jpi 199 IF( zfact(ji,jj) /= 0 ) zfact(ji,jj) = epyc_iwm(ji,jj) / ( rau0 * zfact(ji,jj) ) 200 END DO 201 END DO 202 ! 203 DO jk = 2, jpkm1 ! complete with the level-dependent part 204 emix_iwm(:,:,jk) = emix_iwm(:,:,jk) + zfact(:,:) * MAX( 0._wp, rn2(:,:,jk) ) * wmask(:,:,jk) 212 emix_iwm(WRK_2D,jk) = emix_iwm(WRK_2D,jk) + zfact(WRK_2D) * MAX( 0._wp, rn2(WRK_2D,jk) ) 205 213 END DO 206 214 ! … … 210 218 ! !* ocean depth as proportional to rn2 * exp(-z_wkb/rn_hbot) 211 219 ! 212 zwkb (:,:,:) = 0._wp213 zfact( :,:) = 0._wp220 zwkb (WRK_3D) = 0._wp 221 zfact(WRK_2D) = 0._wp 214 222 DO jk = 2, jpkm1 215 zfact(:,:) = zfact(:,:) + e3w_n(:,:,jk) * SQRT( MAX( 0._wp, rn2(:,:,jk) ) ) * wmask(:,:,jk) 216 zwkb(:,:,jk) = zfact(:,:) 223 !!gm this is potentially dangerous 224 ! zfact(WRK_2D) = zfact(WRK_2D) + e3w_n(WRK_2D,jk) * SQRT( MAX( 0._wp, rn2(WRK_2D,jk) ) ) 225 ! zwkb (WRK_2D,jk) = zfact(WRK_2D) 226 DO jj = k_Jstr, k_Jend 227 DO ji = k_Istr, k_Iend 228 zztemp = zfact(ji,jj) + e3w_n(ji,jj,jk) * SQRT( MAX( 0._wp, rn2(ji,jj,jk) ) ) 229 zfact(ji,jj) = zztemp 230 zwkb (ji,jj,jk) = zztemp 231 END DO 232 END DO 217 233 END DO 218 234 ! 219 235 DO jk = 2, jpkm1 220 DO jj = 1, jpj221 DO ji = 1, jpi236 DO jj = k_Jstr, k_Jend 237 DO ji = k_Istr, k_Iend 222 238 IF( zfact(ji,jj) /= 0 ) zwkb(ji,jj,jk) = zhdep(ji,jj) * ( zfact(ji,jj) - zwkb(ji,jj,jk) ) & 223 & * tmask(ji,jj,jk) / zfact(ji,jj)239 & * wmask(ji,jj,jk) / zfact(ji,jj) 224 240 END DO 225 241 END DO 226 242 END DO 227 zwkb( :,:,1) = zhdep(:,:) * tmask(:,:,1)228 ! 229 zweight( :,:,:) = 0._wp243 zwkb(WRK_2D,1) = zhdep(WRK_2D) * wmask(WRK_2D,1) 244 ! 245 zweight(WRK_3D) = 0._wp 230 246 DO jk = 2, jpkm1 231 zweight(:,:,jk) = MAX( 0._wp, rn2(:,:,jk) ) * hbot_iwm(:,:) * wmask(:,:,jk) & 232 & * ( EXP( -zwkb(:,:,jk) / hbot_iwm(:,:) ) - EXP( -zwkb(:,:,jk-1) / hbot_iwm(:,:) ) ) 233 END DO 234 ! 235 zfact(:,:) = 0._wp 247 zweight(WRK_2D,jk) = MAX( 0._wp, rn2(WRK_2D,jk) ) * hbot_iwm(:,:) & 248 & * ( EXP( -zwkb(WRK_2D,jk ) / hbot_iwm(WRK_2D) ) & 249 & - EXP( -zwkb(WRK_2D,jk-1) / hbot_iwm(WRK_2D) ) ) 250 END DO 251 ! 252 zfact(WRK_2D) = 0._wp 236 253 DO jk = 2, jpkm1 ! part independent of the level 237 zfact(:,:) = zfact(:,:) + zweight(:,:,jk) 238 END DO 239 ! 240 DO jj = 1, jpj 241 DO ji = 1, jpi 242 IF( zfact(ji,jj) /= 0 ) zfact(ji,jj) = ebot_iwm(ji,jj) / ( rau0 * zfact(ji,jj) ) 243 END DO 244 END DO 254 zfact(WRK_2D) = zfact(WRK_2D) + zweight(WRK_2D,jk) 255 END DO 256 ! 257 WHERE( zfact(WRK_2D) /= 0 ) zfact(WRK_2D) = ebot_iwm(WRK_2D) / ( rau0 * zfact(WRK_2D) ) 258 ! DO jj = k_Jstr, k_Jend 259 ! DO ji = k_Istr, k_Iend 260 ! IF( zfact(ji,jj) /= 0 ) zfact(ji,jj) = ebot_iwm(ji,jj) / ( rau0 * zfact(ji,jj) ) 261 ! END DO 262 ! END DO 245 263 ! 246 264 DO jk = 2, jpkm1 ! complete with the level-dependent part 247 emix_iwm(:,:,jk) = emix_iwm(:,:,jk) + zweight(:,:,jk) * zfact(:,:) * wmask(:,:,jk) & 248 & / ( gde3w_n(:,:,jk) - gde3w_n(:,:,jk-1) ) 249 END DO 250 ! 265 emix_iwm(WRK_2D,jk) = emix_iwm(WRK_2D,jk) + zweight(WRK_2D,jk) * zfact(WRK_2D) * wmask(WRK_2D,jk) & 266 & / ( gde3w_n(WRK_2D,jk) - gde3w_n(WRK_2D,jk-1) ) 267 !!gm use of e3t_n just above? 268 END DO 269 ! 270 !!gm this is to be replaced by just a constant value znu=1.e-6 m2/s 251 271 ! Calculate molecular kinematic viscosity 252 znu_t(:,:,:) = 1.e-4_wp * ( 17.91_wp - 0.53810_wp * tsn(:,:,:,jp_tem) + 0.00694_wp * tsn(:,:,:,jp_tem) * tsn(:,:,:,jp_tem) & 253 & + 0.02305_wp * tsn(:,:,:,jp_sal) ) * tmask(:,:,:) * r1_rau0 272 znu_t(WRK_3D) = 1.e-4_wp * ( 17.91_wp - 0.53810_wp * tsn(WRK_3D,jp_tem) & 273 & + 0.00694_wp * tsn(WRK_3D,jp_tem) * tsn(WRK_3D,jp_tem) & 274 & + 0.02305_wp * tsn(WRK_3D,jp_sal) ) * tmask(WRK_3D) * r1_rau0 254 275 DO jk = 2, jpkm1 255 znu_w(:,:,jk) = 0.5_wp * ( znu_t(:,:,jk-1) + znu_t(:,:,jk) ) * wmask(:,:,jk) 256 END DO 276 znu_w(WRK_2D,jk) = 0.5_wp * ( znu_t(WRK_2D,jk-1) + znu_t(WRK_2D,jk) ) * wmask(WRK_2D,jk) 277 END DO 278 !!gm end 257 279 ! 258 280 ! Calculate turbulence intensity parameter Reb 259 281 DO jk = 2, jpkm1 260 zReb( :,:,jk) = emix_iwm(:,:,jk) / MAX( 1.e-20_wp, znu_w(:,:,jk) * rn2(:,:,jk) )282 zReb(WRK_2D,jk) = emix_iwm(WRK_2D,jk) / MAX( 1.e-20_wp, znu_w(WRK_2D,jk) * rn2(WRK_2D,jk) ) 261 283 END DO 262 284 ! 263 285 ! Define internal wave-induced diffusivity 264 286 DO jk = 2, jpkm1 265 zav_wave( :,:,jk) = znu_w(:,:,jk) * zReb(:,:,jk) * r1_6 ! This corresponds to a constant mixing efficiency of 1/6287 zav_wave(WRK_2D,jk) = znu_w(WRK_2D,jk) * zReb(WRK_2D,jk) * r1_6 ! This corresponds to a constant mixing efficiency of 1/6 266 288 END DO 267 289 ! 268 290 IF( ln_mevar ) THEN ! Variable mixing efficiency case : modify zav_wave in the 269 291 DO jk = 2, jpkm1 ! energetic (Reb > 480) and buoyancy-controlled (Reb <10.224 ) regimes 270 DO jj = 1, jpj271 DO ji = 1, jpi292 DO jj = k_Jstr, k_Jend 293 DO ji = k_Istr, k_Iend 272 294 IF( zReb(ji,jj,jk) > 480.00_wp ) THEN 273 295 zav_wave(ji,jj,jk) = 3.6515_wp * znu_w(ji,jj,jk) * SQRT( zReb(ji,jj,jk) ) … … 281 303 ! 282 304 DO jk = 2, jpkm1 ! Bound diffusivity by molecular value and 100 cm2/s 283 zav_wave( :,:,jk) = MIN( MAX( 1.4e-7_wp, zav_wave(:,:,jk) ), 1.e-2_wp ) * wmask(:,:,jk)305 zav_wave(WRK_2D,jk) = MIN( MAX( 1.4e-7_wp, zav_wave(WRK_2D,jk) ), 1.e-2_wp ) * wmask(WRK_2D,jk) 284 306 END DO 285 307 ! 286 308 IF( kt == nit000 ) THEN !* Control print at first time-step: diagnose the energy consumed by zav_wave 287 z tpc= 0._wp309 zztemp = 0._wp 288 310 !!gm used of glosum 3D.... 289 311 DO jk = 2, jpkm1 290 DO jj = 1, jpj291 DO ji = 1, jpi292 z tpc = ztpc+ e3w_n(ji,jj,jk) * e1e2t(ji,jj) &312 DO jj = k_Jstr, k_Jend 313 DO ji = k_Istr, k_Iend 314 zztemp = zztemp + e3w_n(ji,jj,jk) * e1e2t(ji,jj) & 293 315 & * MAX( 0._wp, rn2(ji,jj,jk) ) * zav_wave(ji,jj,jk) * wmask(ji,jj,jk) * tmask_i(ji,jj) 294 316 END DO 295 317 END DO 296 318 END DO 297 IF( lk_mpp ) CALL mpp_sum( z tpc)298 z tpc = rau0 * ztpc! Global integral of rauo * Kz * N^2 = power contributing to mixing319 IF( lk_mpp ) CALL mpp_sum( zztemp ) 320 zztemp = rau0 * zztemp ! Global integral of rauo * Kz * N^2 = power contributing to mixing 299 321 ! 300 322 IF(lwp) THEN … … 303 325 WRITE(numout,*) '~~~~~~~ ' 304 326 WRITE(numout,*) 305 WRITE(numout,*) ' Total power consumption by av_wave : ztpc = ', ztpc* 1.e-12_wp, 'TW'327 WRITE(numout,*) ' Total power consumption by av_wave = ', zztemp * 1.e-12_wp, 'TW' 306 328 ENDIF 307 329 ENDIF … … 313 335 IF( ln_tsdiff ) THEN !* Option for differential mixing of salinity and temperature 314 336 DO jk = 2, jpkm1 ! Calculate S/T diffusivity ratio as a function of Reb 315 DO jj = 1, jpj316 DO ji = 1, jpi337 DO jj = k_Jstr, k_Jend 338 DO ji = k_Istr, k_Iend 317 339 zav_ratio(ji,jj,jk) = ( 0.505_wp + 0.495_wp * & 318 340 & TANH( 0.92_wp * ( LOG10( MAX( 1.e-20_wp, zReb(ji,jj,jk) * 5._wp * r1_6 ) ) - 0.60_wp ) ) & … … 323 345 CALL iom_put( "av_ratio", zav_ratio ) 324 346 DO jk = 2, jpkm1 !* update momentum & tracer diffusivity with wave-driven mixing 325 avs(:,:,jk) = avs(:,:,jk) + zav_wave(:,:,jk) * zav_ratio(:,:,jk)326 avt(:,:,jk) = avt(:,:,jk) + zav_wave(:,:,jk)327 avm(:,:,jk) = avm(:,:,jk) + zav_wave(:,:,jk)347 p_avs(WRK_2D,jk) = p_avs(WRK_2D,jk) + zav_wave(WRK_2D,jk) * zav_ratio(WRK_2D,jk) 348 p_avt(WRK_2D,jk) = p_avt(WRK_2D,jk) + zav_wave(WRK_2D,jk) 349 p_avm(WRK_2D,jk) = p_avm(WRK_2D,jk) + zav_wave(WRK_2D,jk) 328 350 END DO 329 351 ! 330 352 ELSE !* update momentum & tracer diffusivity with wave-driven mixing 331 353 DO jk = 2, jpkm1 332 avs(:,:,jk) = avs(:,:,jk) + zav_wave(:,:,jk)333 avt(:,:,jk) = avt(:,:,jk) + zav_wave(:,:,jk)334 avm(:,:,jk) = avm(:,:,jk) + zav_wave(:,:,jk)354 p_avs(WRK_2D,jk) = p_avs(WRK_2D,jk) + zav_wave(WRK_2D,jk) 355 p_avt(WRK_2D,jk) = p_avt(WRK_2D,jk) + zav_wave(WRK_2D,jk) 356 p_avm(WRK_2D,jk) = p_avm(WRK_2D,jk) + zav_wave(WRK_2D,jk) 335 357 END DO 336 358 ENDIF … … 341 363 ! vertical integral of rau0 * Kz * N^2 (pcmap_iwm), energy density (emix_iwm) 342 364 IF( iom_use("bflx_iwm") .OR. iom_use("pcmap_iwm") ) THEN 343 bflx_iwm(:,:,:) = MAX( 0._wp, rn2(:,:,:) ) * zav_wave(:,:,:)344 pcmap_iwm(:,:) = 0._wp345 365 DO jk = 2, jpkm1 346 pcmap_iwm(:,:) = pcmap_iwm(:,:) + e3w_n(:,:,jk) * bflx_iwm(:,:,jk) * wmask(:,:,jk) 347 END DO 348 pcmap_iwm(:,:) = rau0 * pcmap_iwm(:,:) 349 CALL iom_put( "bflx_iwm", bflx_iwm ) 366 bflx_iwm(WRK_2D,jk) = MAX( 0._wp, rn2(WRK_2D,jk) ) * zav_wave(WRK_2D,jk) 367 END DO 368 pcmap_iwm(WRK_2D) = 0._wp 369 DO jk = 2, jpkm1 370 pcmap_iwm(WRK_2D) = pcmap_iwm(WRK_2D) + e3w_n(WRK_2D,jk) * bflx_iwm(WRK_2D,jk) 371 END DO 372 pcmap_iwm(WRK_2D) = rau0 * pcmap_iwm(WRK_2D) 373 CALL iom_put( "bflx_iwm" , bflx_iwm ) 350 374 CALL iom_put( "pcmap_iwm", pcmap_iwm ) 351 375 ENDIF … … 353 377 CALL iom_put( "emix_iwm", emix_iwm ) 354 378 355 CALL wrk_dealloc( jpi,jpj, zfact, zhdep )356 CALL wrk_dealloc( jpi,jpj,jpk, zwkb, zweight, znu_t, znu_w, zReb )357 358 379 IF(ln_ctl) CALL prt_ctl(tab3d_1=zav_wave , clinfo1=' iwm - av_wave: ', tab3d_2=avt, clinfo2=' avt: ', ovlap=1, kdim=jpk) 359 380 ! -
branches/2017/wrk_OMP_test_for_Silvia/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfphy.F90
r7990 r8055 11 11 !! zdf_phy : upadate at each time-step the vertical mixing coeff. 12 12 !!---------------------------------------------------------------------- 13 USE par_oce ! ocean parameters13 USE oce ! ocean dynamics and tracers variables 14 14 USE zdf_oce ! vertical physics: shared variables 15 15 USE zdfbfr ! vertical physics: bottom friction 16 USE zdfric ! vertical physics: Richardson vertical mixing 16 USE zdfsh2 ! vertical physics: shear production term of TKE 17 USE zdfric ! vertical physics: RIChardson dependent vertical mixing 17 18 USE zdftke ! vertical physics: TKE vertical mixing 18 19 USE zdfgls ! vertical physics: GLS vertical mixing … … 44 45 INTEGER, PARAMETER :: np_TKE = 3 ! Turbulente Kinetic Eenergy closure scheme for Kz 45 46 INTEGER, PARAMETER :: np_GLS = 4 ! Generic Length Scale closure scheme for Kz 46 47 48 LOGICAL :: l_zdfsh2 ! shear production term flag (=F for CST, =T otherwise (i.e. TKE, GLS, RIC)) 49 50 !! * Substitutions 51 # include "domain_substitute.h90" 47 52 !!---------------------------------------------------------------------- 48 53 !! NEMO/OPA 4.0 , NEMO Consortium (2017) … … 61 66 !! set horizontal shape and vertical profile of background mixing coef. 62 67 !!---------------------------------------------------------------------- 68 INTEGER :: jk ! dummy loop indices 63 69 INTEGER :: ioptio, ios ! local integers 64 70 !! … … 90 96 WRITE(numout,*) ' vertical closure scheme' 91 97 WRITE(numout,*) ' constant vertical mixing coefficient ln_zdfcst = ', ln_zdfcst 92 WRITE(numout,*) ' constant vertical mixing coefficientln_zdfric = ', ln_zdfric93 WRITE(numout,*) ' constant vertical mixing coefficientln_zdftke = ', ln_zdftke94 WRITE(numout,*) ' constant vertical mixing coefficientln_zdfgls = ', ln_zdfgls98 WRITE(numout,*) ' Richardson number dependent closure ln_zdfric = ', ln_zdfric 99 WRITE(numout,*) ' Turbulent Kinetic Energy closure (TKE) ln_zdftke = ', ln_zdftke 100 WRITE(numout,*) ' Generic Length Scale closure (GLS) ln_zdfgls = ', ln_zdfgls 95 101 WRITE(numout,*) ' convection: ' 96 102 WRITE(numout,*) ' enhanced vertical diffusion ln_zdfevd = ', ln_zdfevd … … 137 143 ENDIF 138 144 ! 139 ! ! set 1st/last level Av to zero one for all 140 avt(:,:,1) = 0._wp ; avs(:,:,1) = 0._wp ; avm(:,:,1) = 0._wp 145 DO jk = 1, jpk ! set turbulent closure Kz to the background value (avt_k, avm_k) 146 avt_k(:,:,jk) = avtb_2d(:,:) * avtb(jk) * wmask (:,:,jk) 147 avm_k(:,:,jk) = avmb(jk) * wmask (:,:,jk) 148 END DO 149 !!gm to be tested only the 1st & last levels 150 ! avt (:,:, 1 ) = 0._wp ; avs(:,:, 1 ) = 0._wp ; avm (:,:, 1 ) = 0._wp 151 ! avt (:,:,jpk) = 0._wp ; avs(:,:,jpk) = 0._wp ; avm (:,:,jpk) = 0._wp 152 !!gm 153 avt (:,:,:) = 0._wp ; avs(:,:,:) = 0._wp ; avm (:,:,:) = 0._wp 141 154 142 155 ! !== Convection ==! … … 170 183 IF( ln_zdfric .OR. ln_zdfgls ) CALL ctl_stop( 'zdf_phy_init: zdfric and zdfgls never tested with ice shelves cavities ' ) 171 184 ENDIF 185 ! ! shear production term flag 186 IF( ln_zdfcst ) THEN ; l_zdfsh2 = .FALSE. 187 ELSE ; l_zdfsh2 = .TRUE. 188 ENDIF 172 189 173 190 ! !== gravity wave-driven mixing ==! … … 200 217 ! 201 218 INTEGER :: ji, jj, jk ! dummy loop indice 219 !!OMP REAL(wp), DIMENSION(WRK_3D) :: zsh2 ! shear production 220 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: zsh2 ! shear production 202 221 !! --------------------------------------------------------------------- 222 ! 223 !!OMP ===>>>> Open-MP to be defined elsewhere 224 ! 225 INTEGER :: ARG_2D 226 ! 227 #if defined key_vectopt_loop 228 k_Istr = 1 ; k_Iend = jpi 229 #else 230 k_Istr = 2 ; k_Iend = jpim1 231 #endif 232 k_Jstr = 2 ; k_Jend = jpjm1 233 ! 234 !!OMP <<<<=== end 235 236 ALLOCATE( zsh2(WRK_3D) ) 237 238 203 239 ! 204 240 CALL zdf_bfr( kt ) !* bottom friction (if quadratic) 205 ! 241 ! 242 243 ! !== Kz from chosen turbulent closure ==! (avm_k, avt_k) 244 245 IF( l_zdfsh2 ) & !* shear production at w-points (energy conserving form) 246 CALL zdf_sh2( ARG_2D, ub, vb, un, vn, avm_k, & ! <<== in fields 247 & zsh2 ) ! ==>> out field : shear production 248 249 ! 206 250 SELECT CASE ( nzdf_phy ) !* Vertical eddy viscosity and diffusivity coefficients at w-points 207 CASE( np_RIC ) ; CALL zdf_ric( kt) ! Richardson number dependent Kz208 CASE( np_TKE ) ; CALL zdf_tke( kt) ! TKE closure scheme for Kz209 CASE( np_GLS ) ; CALL zdf_gls( kt) ! GLS closure scheme for Kz251 CASE( np_RIC ) ; CALL zdf_ric( ARG_2D, kt, gdept_n, zsh2, avm_k, avt_k ) ! Richardson number dependent Kz 252 CASE( np_TKE ) ; CALL zdf_tke( ARG_2D, kt , zsh2, avm_k, avt_k ) ! TKE closure scheme for Kz 253 CASE( np_GLS ) ; CALL zdf_gls( ARG_2D, kt , zsh2, avm_k, avt_k ) ! GLS closure scheme for Kz 210 254 CASE( np_CST ) ! Constant Kz (reset avt, avm to the background value) 211 avt(2:jpim1,2:jpjm1,1:jpkm1) = rn_avt0 * wmask(2:jpim1,2:jpjm1,1:jpkm1) 212 avm(2:jpim1,2:jpjm1,1:jpkm1) = rn_avm0 * wmask(2:jpim1,2:jpjm1,1:jpkm1) 255 ! avt_k and avm_k set one for all at initialisation phase 256 !!gm avt_k(WRK_3D) = rn_avt0 * wmask(WRK_3D) 257 !!gm avm_k(WRK_3D) = rn_avm0 * wmask(WRK_3D) 213 258 END SELECT 259 ! 260 ! !== ocean Kz ==! (avt, avs, avm) 261 ! 262 ! !* start from turbulent closure values 263 avt(WRK_2D,2:jpkm1) = avt_k(WRK_2D,2:jpkm1) 264 avm(WRK_2D,2:jpkm1) = avm_k(WRK_2D,2:jpkm1) 214 265 ! 215 266 IF( ln_rnf_mouth ) THEN !* increase diffusivity at rivers mouths 216 267 DO jk = 2, nkrnf 217 avt( :,:,jk) = avt(:,:,jk) + 2._wp * rn_avt_rnf * rnfmsk(:,:) * wmask(:,:,jk)268 avt(WRK_2D,jk) = avt(WRK_2D,jk) + 2._wp * rn_avt_rnf * rnfmsk(WRK_2D) * wmask(WRK_2D,jk) 218 269 END DO 219 270 ENDIF 220 271 ! 221 IF( ln_zdfevd ) CALL zdf_evd( kt ) !* convection: enhanced vertical eddy diffusivity272 IF( ln_zdfevd ) CALL zdf_evd( ARG_2D, kt, avm, avt ) !* convection: enhanced vertical eddy diffusivity 222 273 ! 223 274 ! !* double diffusive mixing 224 275 IF( ln_zdfddm ) THEN ! update avt and compute avs 225 CALL zdf_ddm( kt)276 CALL zdf_ddm( ARG_2D, kt, avm, avt, avs ) 226 277 ELSE ! same mixing on all tracers 227 avs( 2:jpim1,2:jpjm1,1:jpkm1) = avt(2:jpim1,2:jpjm1,1:jpkm1)278 avs(WRK_3D) = avt(WRK_3D) 228 279 ENDIF 229 280 ! 230 281 ! !* wave-induced mixing 231 IF( ln_zdfswm ) CALL zdf_swm( kt )! surface wave (Qiao et al. 2004)232 IF( ln_zdfiwm ) CALL zdf_iwm( kt )! internal wave (de Lavergne et al 2017)282 IF( ln_zdfswm ) CALL zdf_swm( ARG_2D, kt, avm, avt, avs ) ! surface wave (Qiao et al. 2004) 283 IF( ln_zdfiwm ) CALL zdf_iwm( ARG_2D, kt, avm, avt, avs ) ! internal wave (de Lavergne et al 2017) 233 284 234 285 235 286 ! !* Lateral boundary conditions (sign unchanged) 236 CALL lbc_lnk( avm, 'W', 1. ) 237 CALL lbc_lnk( avt, 'W', 1. ) 238 CALL lbc_lnk( avs, 'W', 1. ) 239 ! 240 !!gm ===>>> TO BE REMOVED 241 DO jk = 1, jpkm1 !* vertical eddy viscosity at wu- and wv-points 242 DO jj = 2, jpjm1 243 DO ji = 2, jpim1 244 avmu(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji+1,jj ,jk) ) * wumask(ji,jj,jk) 245 avmv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji ,jj+1,jk) ) * wvmask(ji,jj,jk) 246 END DO 247 END DO 248 END DO 249 CALL lbc_lnk( avmu, 'U', 1. ) ; CALL lbc_lnk( avmv, 'V', 1. ) ! Lateral boundary conditions 250 !!gm end 251 287 CALL lbc_lnk( avm_k, 'W', 1. ) 288 CALL lbc_lnk( avt_k, 'W', 1. ) 289 CALL lbc_lnk( avm , 'W', 1. ) 290 CALL lbc_lnk( avt , 'W', 1. ) !!gm a priori only avm_k and avm are required 291 CALL lbc_lnk( avs , 'W', 1. ) !!gm To be tested 292 ! 252 293 253 294 CALL zdf_mxl( kt ) !* mixed layer depth, and level 254 295 255 !!gm !==>> to be moved in zdftke & zdfgls 256 ! write TKE or GLS information in the restart file 257 IF( lrst_oce .AND. ln_zdftke ) CALL tke_rst( kt, 'WRITE' ) 258 IF( lrst_oce .AND. ln_zdfgls ) CALL gls_rst( kt, 'WRITE' ) 259 ! 296 297 IF( lrst_oce ) THEN !* write TKE, GLS or RIC fields in the restart file 298 IF( ln_zdftke ) CALL tke_rst( kt, 'WRITE' ) 299 IF( ln_zdfgls ) CALL gls_rst( kt, 'WRITE' ) 300 IF( ln_zdfric ) CALL ric_rst( kt, 'WRITE' ) 301 ENDIF 302 ! 303 DEALLOCATE( zsh2 ) 304 ! 260 305 END SUBROUTINE zdf_phy 261 306 -
branches/2017/wrk_OMP_test_for_Silvia/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfric.F90
r7991 r8055 16 16 17 17 !!---------------------------------------------------------------------- 18 !! zdf_ric_init : initialization, namelist read, & parameters control 18 19 !! zdf_ric : update momentum and tracer Kz from the Richardson number 19 !! zdf_ric_init : initialization, namelist read, & parameters control20 !! ric_rst : read/write RIC restart in ocean restart file 20 21 !!---------------------------------------------------------------------- 21 22 USE oce ! ocean dynamics and tracers variables 22 23 USE dom_oce ! ocean space and time domain variables 23 24 USE zdf_oce ! vertical physics: variables 24 USE zdfsh2 ! vertical physics: shear production term of TKE25 25 USE phycst ! physical constants 26 26 USE sbc_oce, ONLY : taum … … 28 28 ! 29 29 USE in_out_manager ! I/O manager 30 USE lbclnk ! ocean lateral boundary condition (or mpp link) 31 USE lib_mpp ! MPP library 30 USE iom ! I/O manager library 32 31 USE timing ! Timing 33 32 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) … … 37 36 PRIVATE 38 37 39 PUBLIC zdf_ric ! called by step.F90 40 PUBLIC zdf_ric_init ! called by opa.F90 38 PUBLIC zdf_ric ! called by zdfphy.F90 39 PUBLIC ric_rst ! called by zdfphy.F90 40 PUBLIC zdf_ric_init ! called by nemogcm.F90 41 41 42 42 ! !!* Namelist namzdf_ric : Richardson number dependent Kz * … … 52 52 53 53 !! * Substitutions 54 # include " vectopt_loop_substitute.h90"54 # include "domain_substitute.h90" 55 55 !!---------------------------------------------------------------------- 56 56 !! NEMO/OPA 4.0 , NEMO Consortium (2011) … … 59 59 !!---------------------------------------------------------------------- 60 60 CONTAINS 61 62 SUBROUTINE zdf_ric( kt )63 !!----------------------------------------------------------------------64 !! *** ROUTINE zdfric ***65 !!66 !! ** Purpose : Compute the before eddy viscosity and diffusivity as67 !! a function of the local richardson number.68 !!69 !! ** Method : Local richardson number dependent formulation of the70 !! vertical eddy viscosity and diffusivity coefficients.71 !! The eddy coefficients are given by:72 !! avm = avm0 + avmb73 !! avt = avm0 / (1 + rn_alp*ri)74 !! with ri = N^2 / dz(u)**275 !! = e3w**2 * rn2/[ mi( dk(ub) )+mj( dk(vb) ) ]76 !! avm0= rn_avmri / (1 + rn_alp*ri)**nn_ric77 !! Where ri is the before local Richardson number,78 !! rn_avmri is the maximum value reaches by avm and avt79 !! avmb and avtb are the background (or minimum) values80 !! and rn_alp, nn_ric are adjustable parameters.81 !! Typical values used are : avm0=1.e-2 m2/s, avmb=1.e-6 m2/s82 !! avtb=1.e-7 m2/s, rn_alp=5. and nn_ric=2.83 !! a numerical threshold is impose on the vertical shear (1.e-20)84 !! As second step compute Ekman depth from wind stress forcing85 !! and apply namelist provided vertical coeff within this depth.86 !! The Ekman depth is:87 !! Ustar = SQRT(Taum/rho0)88 !! ekd= rn_ekmfc * Ustar / f089 !! Large et al. (1994, eq.29) suggest rn_ekmfc=0.7; however, the derivation90 !! of the above equation indicates the value is somewhat arbitrary; therefore91 !! we allow the freedom to increase or decrease this value, if the92 !! Ekman depth estimate appears too shallow or too deep, respectively.93 !! Ekd is then limited by rn_mldmin and rn_mldmax provided in the94 !! namelist95 !! N.B. the mask are required for implicit scheme, and surface96 !! and bottom value already set in zdfphy.F9097 !!98 !! ** Action : avm, avt mixing coeff (inner domain values only)99 !!100 !! References : Pacanowski & Philander 1981, JPO, 1441-1451.101 !! PFJ Lermusiaux 2001.102 !!----------------------------------------------------------------------103 INTEGER, INTENT(in) :: kt ! ocean time-step104 !!105 INTEGER :: ji, jj, jk ! dummy loop indices106 LOGICAL :: ll_av_weight = .TRUE. ! local logical107 REAL(wp) :: zcfRi, zav, zustar ! local scalars108 REAL(wp), DIMENSION(jpi,jpj) :: zh_ekm ! 2D workspace109 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zsh2 ! 3D -110 !!----------------------------------------------------------------------111 !112 IF( nn_timing == 1 ) CALL timing_start('zdf_ric')113 !114 ! !== avm and avt = F(Richardson number) ==!115 !116 ! !* Shear production at uw- and vw-points (energy conserving form)117 CALL zdf_sh2( zsh2 )118 !119 DO jk = 2, jpkm1 !* Vertical eddy viscosity and diffusivity coefficients120 DO jj = 1, jpjm1121 DO ji = 1, jpim1122 ! ! coefficient = F(richardson number) (avm-weighted Ri)123 zcfRi = 1._wp / ( 1._wp + rn_alp * MAX( 0._wp , avm(ji,jj,jk) * rn2(ji,jj,jk) / ( zsh2(ji,jj,jk) + 1.e-20 ) ) )124 zav = rn_avmri * zcfRi**nn_ric125 !126 ! ! avm and avt coefficients127 avm(ji,jj,jk) = MAX( zav , avmb(jk) ) * wmask(ji,jj,jk)128 avt(ji,jj,jk) = MAX( zav * zcfRi , avtb(jk) ) * wmask(ji,jj,jk)129 END DO130 END DO131 END DO132 !133 !!gm BUG <<<<==== This param can't work at low latitude134 !!gm it provides there much to thick mixed layer ( summer 150m in GYRE configuration !!! )135 !136 IF( ln_mldw ) THEN !== set a minimum value in the Ekman layer ==!137 !138 DO jj = 2, jpjm1 !* Ekman depth139 DO ji = 2, jpim1140 zustar = SQRT( taum(ji,jj) * r1_rau0 )141 zh_ekm(ji,jj) = rn_ekmfc * zustar / ( ABS( ff_t(ji,jj) ) + rsmall ) ! Ekman depth142 zh_ekm(ji,jj) = MAX( rn_mldmin , MIN( zh_ekm(ji,jj) , rn_mldmax ) ) ! set allowed rang143 END DO144 END DO145 DO jk = 2, jpkm1 !* minimum mixing coeff. within the Ekman layer146 DO jj = 2, jpjm1147 DO ji = 2, jpim1148 IF( gdept_n(ji,jj,jk) < zh_ekm(ji,jj) ) THEN149 avm(ji,jj,jk) = MAX( avm(ji,jj,jk), rn_wvmix ) * wmask(ji,jj,jk)150 avt(ji,jj,jk) = MAX( avt(ji,jj,jk), rn_wtmix ) * wmask(ji,jj,jk)151 ENDIF152 END DO153 END DO154 END DO155 ENDIF156 !157 IF( nn_timing == 1 ) CALL timing_stop('zdf_ric')158 !159 END SUBROUTINE zdf_ric160 161 61 162 62 SUBROUTINE zdf_ric_init … … 205 105 ENDIF 206 106 ! 207 DO jk = 1, jpk ! Initialization of vertical eddy coef. to the background value 208 avt(:,:,jk) = avtb(jk) * tmask(:,:,jk) 209 avm(:,:,jk) = avmb(jk) * umask(:,:,jk) 107 CALL ric_rst( nit000, 'READ' ) !* read or initialize all required files 108 ! 109 END SUBROUTINE zdf_ric_init 110 111 112 SUBROUTINE zdf_ric( ARG_2D, kt, pdept, p_sh2, p_avm, p_avt ) 113 !!---------------------------------------------------------------------- 114 !! *** ROUTINE zdfric *** 115 !! 116 !! ** Purpose : Compute the before eddy viscosity and diffusivity as 117 !! a function of the local richardson number. 118 !! 119 !! ** Method : Local richardson number dependent formulation of the 120 !! vertical eddy viscosity and diffusivity coefficients. 121 !! The eddy coefficients are given by: 122 !! avm = avm0 + avmb 123 !! avt = avm0 / (1 + rn_alp*ri) 124 !! with Ri = N^2 / dz(u)**2 125 !! = e3w**2 * rn2/[ mi( dk(ub) )+mj( dk(vb) ) ] 126 !! avm0= rn_avmri / (1 + rn_alp*Ri)**nn_ric 127 !! where ri is the before local Richardson number, 128 !! rn_avmri is the maximum value reaches by avm and avt 129 !! and rn_alp, nn_ric are adjustable parameters. 130 !! Typical values : rn_alp=5. and nn_ric=2. 131 !! 132 !! As second step compute Ekman depth from wind stress forcing 133 !! and apply namelist provided vertical coeff within this depth. 134 !! The Ekman depth is: 135 !! Ustar = SQRT(Taum/rho0) 136 !! ekd= rn_ekmfc * Ustar / f0 137 !! Large et al. (1994, eq.29) suggest rn_ekmfc=0.7; however, the derivation 138 !! of the above equation indicates the value is somewhat arbitrary; therefore 139 !! we allow the freedom to increase or decrease this value, if the 140 !! Ekman depth estimate appears too shallow or too deep, respectively. 141 !! Ekd is then limited by rn_mldmin and rn_mldmax provided in the 142 !! namelist 143 !! N.B. the mask are required for implicit scheme, and surface 144 !! and bottom value already set in zdfphy.F90 145 !! 146 !! ** Action : avm, avt mixing coeff (inner domain values only) 147 !! 148 !! References : Pacanowski & Philander 1981, JPO, 1441-1451. 149 !! PFJ Lermusiaux 2001. 150 !!---------------------------------------------------------------------- 151 INTEGER , INTENT(in ) :: ARG_2D ! inner domain start-end i-indices 152 INTEGER , INTENT(in ) :: kt ! ocean time-step 153 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: pdept ! depth of t-point [m] 154 REAL(wp), DIMENSION(WRK_3D), INTENT(in ) :: p_sh2 ! shear production term 155 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avm, p_avt ! momentum and tracer Kz (w-points) 156 !! 157 INTEGER :: ji, jj, jk ! dummy loop indices 158 REAL(wp) :: zcfRi, zav, zustar, zed ! local scalars 159 REAL(wp), DIMENSION(WRK_2D) :: zh_ekm ! 2D workspace 160 !!---------------------------------------------------------------------- 161 ! 162 IF( nn_timing == 1 ) CALL timing_start('zdf_ric') 163 ! 164 ! !== avm and avt = F(Richardson number) ==! 165 DO jk = 2, jpkm1 166 DO jj = k_Jstr, k_Jend 167 DO ji = k_Jstr, k_Iend ! coefficient = F(richardson number) (avm-weighted Ri) 168 zcfRi = 1._wp / ( 1._wp + rn_alp * MAX( 0._wp , avm(ji,jj,jk) * rn2(ji,jj,jk) / ( p_sh2(ji,jj,jk) + 1.e-20 ) ) ) 169 zav = rn_avmri * zcfRi**nn_ric 170 ! ! avm and avt coefficients 171 p_avm(ji,jj,jk) = MAX( zav , avmb(jk) ) * wmask(ji,jj,jk) 172 p_avt(ji,jj,jk) = MAX( zav * zcfRi , avtb(jk) ) * wmask(ji,jj,jk) 173 END DO 174 END DO 210 175 END DO 211 176 ! 212 END SUBROUTINE zdf_ric_init 177 !!gm BUG <<<<==== This param can't work at low latitude 178 !!gm it provides there much to thick mixed layer ( summer 150m in GYRE configuration !!! ) 179 ! 180 IF( ln_mldw ) THEN !== set a minimum value in the Ekman layer ==! 181 ! 182 DO jj = k_Jstr, k_Jend !* Ekman depth 183 DO ji = k_Jstr, k_Iend 184 zustar = SQRT( taum(ji,jj) * r1_rau0 ) 185 zed = rn_ekmfc * zustar / ( ABS( ff_t(ji,jj) ) + rsmall ) ! Ekman depth 186 zh_ekm(ji,jj) = MAX( rn_mldmin , MIN( zed , rn_mldmax ) ) ! set allowed range 187 END DO 188 END DO 189 DO jk = 2, jpkm1 !* minimum mixing coeff. within the Ekman layer 190 DO jj = k_Jstr, k_Jend 191 DO ji = k_Jstr, k_Iend 192 IF( pdept(ji,jj,jk) < zh_ekm(ji,jj) ) THEN 193 p_avm(ji,jj,jk) = MAX( p_avm(ji,jj,jk), rn_wvmix ) * wmask(ji,jj,jk) 194 p_avt(ji,jj,jk) = MAX( p_avt(ji,jj,jk), rn_wtmix ) * wmask(ji,jj,jk) 195 ENDIF 196 END DO 197 END DO 198 END DO 199 ENDIF 200 ! 201 IF( nn_timing == 1 ) CALL timing_stop('zdf_ric') 202 ! 203 END SUBROUTINE zdf_ric 204 205 206 SUBROUTINE ric_rst( kt, cdrw ) 207 !!--------------------------------------------------------------------- 208 !! *** ROUTINE ric_rst *** 209 !! 210 !! ** Purpose : Read or write TKE file (en) in restart file 211 !! 212 !! ** Method : use of IOM library 213 !! if the restart does not contain TKE, en is either 214 !! set to rn_emin or recomputed 215 !!---------------------------------------------------------------------- 216 INTEGER , INTENT(in) :: kt ! ocean time-step 217 CHARACTER(len=*), INTENT(in) :: cdrw ! "READ"/"WRITE" flag 218 ! 219 INTEGER :: jit, jk ! dummy loop indices 220 INTEGER :: id1, id2 ! local integers 221 !!---------------------------------------------------------------------- 222 ! 223 IF( TRIM(cdrw) == 'READ' ) THEN ! Read/initialise 224 ! ! --------------- 225 ! !* Read the restart file 226 IF( ln_rstart ) THEN 227 id1 = iom_varid( numror, 'avt_k', ldstop = .FALSE. ) 228 id2 = iom_varid( numror, 'avm_k', ldstop = .FALSE. ) 229 ! 230 IF( MIN( id1, id2 ) > 0 ) THEN ! restart exists => read it 231 CALL iom_get( numror, jpdom_autoglo, 'avt_k', avt_k ) 232 CALL iom_get( numror, jpdom_autoglo, 'avm_k', avm_k ) 233 ENDIF 234 ENDIF 235 ! !* otherwise Kz already set to the background value in zdf_phy_init 236 ! 237 ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN ! Create restart file 238 ! ! ------------------- 239 IF(lwp) WRITE(numout,*) '---- ric-rst ----' 240 CALL iom_rstput( kt, nitrst, numrow, 'avt_k', avt_k ) 241 CALL iom_rstput( kt, nitrst, numrow, 'avm_k', avm_k ) 242 ! 243 ENDIF 244 ! 245 END SUBROUTINE ric_rst 213 246 214 247 !!====================================================================== -
branches/2017/wrk_OMP_test_for_Silvia/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfsh2.F90
r7997 r8055 5 5 !!===================================================================== 6 6 !! History : - ! 2014-10 (A. Barthelemy, G. Madec) original code 7 !! NEMO 4.0 ! 2017-04 (G. Madec) remove u-,v-pts avm 7 !! NEMO 4.0 ! 2017-04 (G. Madec) remove u-,v-pts avm + ready for coarse-grained Open-MP 8 8 !!---------------------------------------------------------------------- 9 9 … … 11 11 !! zdf_sh2 : compute mixing the shear production term of TKE 12 12 !!---------------------------------------------------------------------- 13 USE oce ! ocean: shared variables14 13 USE dom_oce ! domain: ocean 15 USE zdf_oce ! vertical physics: variables16 14 ! 17 15 USE in_out_manager ! I/O manager … … 23 21 24 22 PUBLIC zdf_sh2 ! called by zdftke, zdfglf, and zdfric 25 23 24 !! * Substitutions 25 # include "domain_substitute.h90" 26 26 !!---------------------------------------------------------------------- 27 27 !! NEMO/OPA 4.0 , NEMO Consortium (2017) … … 31 31 CONTAINS 32 32 33 SUBROUTINE zdf_sh2( psh2 )33 SUBROUTINE zdf_sh2( ARG_2D, pub, pvb, pun, pvn, p_avm, p_sh2 ) 34 34 !!---------------------------------------------------------------------- 35 35 !! *** ROUTINE zdf_sh2 *** … … 46 46 !! NB: wet-point only horizontal averaging of shear 47 47 !! 48 !! ** Action : - p sh2 shear prod. term at w-point (interior oceandomain only)49 !! 48 !! ** Action : - p_sh2 shear prod. term at w-point (inner domain only) 49 !! ***** 50 50 !! References : Bruchard, OM 2002 51 51 !! --------------------------------------------------------------------- 52 REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT( out) :: psh2 ! shear production of TKE (w-points) 52 INTEGER , INTENT(in ) :: ARG_2D ! inner domain start-end i-indices 53 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: pub, pvb, pun, pvn ! before, now horizontal velocities 54 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: p_avm ! vertical eddy viscosity (w-points) 55 REAL(wp), DIMENSION(WRK_3D), INTENT( out) :: p_sh2 ! shear production of TKE (w-points) 53 56 ! 54 INTEGER :: ji, jj, jk ! dummy loop arguments55 REAL(wp), DIMENSION( jpi,jpj) :: zsh2u, zsh2v ! 2D workspace57 INTEGER :: ji, jj, jk ! dummy loop indices 58 REAL(wp), DIMENSION(WRK_2De(-1,)) :: zsh2u, zsh2v ! 2D workspace 56 59 !!-------------------------------------------------------------------- 60 ! 57 61 IF( nn_timing == 1 ) CALL timing_start('zdf_sh2') 58 62 ! 59 63 DO jk = 2, jpkm1 60 DO jj = 1, jpjm1!* 2 x shear production at uw- and vw-points (energy conserving form)61 DO ji = 1, jpim162 zsh2u(ji,jj) = ( avm(ji+1,jj,jk) +avm(ji,jj,jk) ) &63 & * ( un(ji,jj,jk-1) -un(ji,jj,jk) ) &64 & * ( ub(ji,jj,jk-1) - ub(ji,jj,jk) ) / ( e3uw_n(ji,jj,jk) * e3uw_b(ji,jj,jk) ) * wumask(ji,jj,jk)65 zsh2v(ji,jj) = ( avm(ji,jj+1,jk) +avm(ji,jj,jk) ) &66 & * ( vn(ji,jj,jk-1) -vn(ji,jj,jk) ) &67 & * ( vb(ji,jj,jk-1) -vb(ji,jj,jk) ) / ( e3vw_n(ji,jj,jk) * e3vw_b(ji,jj,jk) ) * wvmask(ji,jj,jk)64 DO jj = k_Jstr-1, k_Jend !* 2 x shear production at uw- and vw-points (energy conserving form) 65 DO ji = k_Istr-1, k_Iend 66 zsh2u(ji,jj) = ( p_avm(ji+1,jj,jk) + p_avm(ji,jj,jk) ) & 67 & * ( pun(ji,jj,jk-1) - pun(ji,jj,jk) ) & 68 & * ( pub(ji,jj,jk-1) - pub(ji,jj,jk) ) / ( e3uw_n(ji,jj,jk) * e3uw_b(ji,jj,jk) ) * wumask(ji,jj,jk) 69 zsh2v(ji,jj) = ( p_avm(ji,jj+1,jk) + p_avm(ji,jj,jk) ) & 70 & * ( pvn(ji,jj,jk-1) - pvn(ji,jj,jk) ) & 71 & * ( pvb(ji,jj,jk-1) - pvb(ji,jj,jk) ) / ( e3vw_n(ji,jj,jk) * e3vw_b(ji,jj,jk) ) * wvmask(ji,jj,jk) 68 72 END DO 69 73 END DO 70 DO jj = 2, jpjm1!* shear production at w-point71 DO ji = 2, jpim1! coast mask: =2 at the coast ; =1 otherwise (NB: wmask useless as zsh2 are masked)72 p sh2(ji,jj,jk) = 0.25 * ( ( zsh2u(ji-1,jj) + zsh2u(ji,jj) ) * ( 2. - umask(ji-1,jj,jk) * umask(ji,jj,jk) ) &73 & + ( zsh2v(ji,jj-1) + zsh2v(ji,jj) ) * ( 2. - vmask(ji,jj-1,jk) * vmask(ji,jj,jk) ) )74 DO jj = k_Jstr, k_Jend !* shear production at w-point 75 DO ji = k_Jstr, k_Iend ! coast mask: =2 at the coast ; =1 otherwise (NB: wmask useless as zsh2 are masked) 76 p_sh2(ji,jj,jk) = 0.25 * ( ( zsh2u(ji-1,jj) + zsh2u(ji,jj) ) * ( 2. - umask(ji-1,jj,jk) * umask(ji,jj,jk) ) & 77 & + ( zsh2v(ji,jj-1) + zsh2v(ji,jj) ) * ( 2. - vmask(ji,jj-1,jk) * vmask(ji,jj,jk) ) ) 74 78 END DO 75 79 END DO -
branches/2017/wrk_OMP_test_for_Silvia/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfswm.F90
r7990 r8055 27 27 PUBLIC zdf_swm_init ! routine called in zdf_phy_init 28 28 29 !! * Substitutions 30 # include "domain_substitute.h90" 29 31 !!---------------------------------------------------------------------- 30 32 !! NEMO/OPA 4.0 , NEMO Consortium (2017) … … 34 36 CONTAINS 35 37 36 SUBROUTINE zdf_swm( kt)38 SUBROUTINE zdf_swm( ARG_2D, kt, p_avm, p_avt, p_avs ) 37 39 !!--------------------------------------------------------------------- 38 40 !! *** ROUTINE zdf_swm *** … … 51 53 !! reference : Qiao et al. GRL, 2004 52 54 !!--------------------------------------------------------------------- 53 INTEGER, INTENT(in) :: kt ! ocean time step 55 INTEGER , INTENT(in ) :: ARG_2D ! inner domain start-end i-indices 56 INTEGER , INTENT(in ) :: kt ! ocean time step 57 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avm ! momentum Kz (w-points) 58 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avt, p_avs ! tracer Kz (w-points) 54 59 ! 55 60 INTEGER :: ji, jj, jk ! dummy loop indices … … 59 64 zcoef = 1._wp * 0.353553_wp 60 65 DO jk = 2, jpkm1 61 DO jj = 2, jpjm162 DO ji = 2, jpim166 DO jj = k_Jstr, k_Jend 67 DO ji = k_Istr, k_Iend 63 68 zqb = zcoef * hsw(ji,jj) * tsd2d(ji,jj) * EXP( -3. * wnum(ji,jj) * gdepw_n(ji,jj,jk) ) * wmask(ji,jj,jk) 64 69 ! 65 avt(ji,jj,jk) =avt(ji,jj,jk) + zqb66 avs(ji,jj,jk) =avs(ji,jj,jk) + zqb67 avm(ji,jj,jk) =avm(ji,jj,jk) + zqb70 p_avt(ji,jj,jk) = p_avt(ji,jj,jk) + zqb 71 p_avs(ji,jj,jk) = p_avs(ji,jj,jk) + zqb 72 p_avm(ji,jj,jk) = p_avm(ji,jj,jk) + zqb 68 73 END DO 69 74 END DO -
branches/2017/wrk_OMP_test_for_Silvia/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftke.F90
r7991 r8055 43 43 USE sbc_oce ! surface boundary condition: ocean 44 44 USE zdf_oce ! vertical physics: ocean variables 45 USE zdfsh2 ! vertical physics: shear production term of TKE46 45 USE zdfmxl ! vertical physics: mixed layer 47 USE lbclnk ! ocean lateral boundary conditions (or mpp link)48 USE prtctl ! Print control49 USE in_out_manager ! I/O manager50 USE iom ! I/O manager library51 USE lib_mpp ! MPP library52 USE wrk_nemo ! work arrays53 USE timing ! Timing54 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)55 46 #if defined key_agrif 56 47 USE agrif_opa_interp 57 48 USE agrif_opa_update 58 49 #endif 50 ! 51 USE in_out_manager ! I/O manager 52 USE iom ! I/O manager library 53 USE lib_mpp ! MPP library 54 USE lbclnk ! ocean lateral boundary conditions (or mpp link) 55 USE prtctl ! Print control 56 USE wrk_nemo ! work arrays 57 USE timing ! Timing 58 USE lib_fortran ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 59 59 60 60 IMPLICIT NONE … … 87 87 REAL(wp) :: rhftau_scl = 1.0_wp ! scale factor applied to HF part of taum (nn_etau=3) 88 88 89 REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:) :: htau! depth of tke penetration (nn_htau)90 REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: dissl! now mixing lenght of dissipation91 REAL(wp) , ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: apdlr! now mixing lenght of dissipation89 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) :: htau ! depth of tke penetration (nn_htau) 90 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: dissl ! now mixing lenght of dissipation 91 REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: apdlr ! now mixing lenght of dissipation 92 92 93 93 !! * Substitutions 94 # include " vectopt_loop_substitute.h90"94 # include "domain_substitute.h90" 95 95 !!---------------------------------------------------------------------- 96 96 !! NEMO/OPA 3.7 , NEMO Consortium (2015) … … 112 112 113 113 114 SUBROUTINE zdf_tke( kt )114 SUBROUTINE zdf_tke( ARG_2D, kt, p_sh2, p_avm, p_avt ) 115 115 !!---------------------------------------------------------------------- 116 116 !! *** ROUTINE zdf_tke *** … … 157 157 !! Bruchard OM 2002 158 158 !!---------------------------------------------------------------------- 159 INTEGER, INTENT(in) :: kt ! ocean time step 159 INTEGER , INTENT(in ) :: ARG_2D ! inner domain start-end i-indices 160 INTEGER , INTENT(in ) :: kt ! ocean time step 161 REAL(wp), DIMENSION(WRK_3D), INTENT(in ) :: p_sh2 ! shear production term 162 REAL(wp), DIMENSION(:,:,:) , INTENT(inout) :: p_avm, p_avt ! momentum and tracer Kz (w-points) 160 163 !!---------------------------------------------------------------------- 161 164 ! … … 165 168 #endif 166 169 ! 167 avt(:,:,:) = avt_k(:,:,:) ! restore before Kz computed with TKE alone 168 avm(:,:,:) = avm_k(:,:,:) 169 ! 170 CALL tke_tke ! now tke (en) 171 ! 172 CALL tke_avn ! now avt, avm, dissl 173 ! 174 avt_k(:,:,:) = avt(:,:,:) ! store Kz computed with TKE alone 175 avm_k(:,:,:) = avm(:,:,:) 170 CALL tke_tke( ARG_2D, gdepw_n, e3t_n, e3w_n, p_sh2, p_avm, p_avt ) ! now tke (en) 171 ! 172 173 !!gm not sure we need this lbc .... ==>>> certainly NOT !!! 174 CALL lbc_lnk( en, 'W', 1. ) ! Lateral boundary conditions (sign unchanged) 175 ! 176 CALL tke_avn( ARG_2D, gdepw_n, e3t_n, e3w_n, p_avm, p_avt ) ! now avt, avm, dissl 176 177 ! 177 178 #if defined key_agrif … … 179 180 IF( .NOT.Agrif_Root() ) CALL Agrif_Update_Tke( kt ) ! children only 180 181 #endif 181 !182 IF( lrst_oce ) CALL tke_rst( kt, 'WRITE' )183 182 ! 184 183 END SUBROUTINE zdf_tke 185 184 186 185 187 SUBROUTINE tke_tke 186 SUBROUTINE tke_tke( ARG_2D, pdepw, p_e3t, p_e3w, p_sh2 & 187 & , p_avm, p_avt ) 188 188 !!---------------------------------------------------------------------- 189 189 !! *** ROUTINE tke_tke *** … … 200 200 !! ** Action : - en : now turbulent kinetic energy) 201 201 !! --------------------------------------------------------------------- 202 INTEGER :: ji, jj, jk ! dummy loop arguments 202 INTEGER , INTENT(in ) :: ARG_2D ! inner domain start-end i-indices 203 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: pdepw ! vertical eddy viscosity (w-points) 204 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: p_e3t, p_e3w ! vertical eddy viscosity (w-points) 205 REAL(wp), DIMENSION(WRK_3D), INTENT(in ) :: p_sh2 ! shear production term 206 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: p_avm, p_avt ! vertical eddy viscosity (w-points) 207 ! 208 INTEGER :: ji, jj, jk ! dummy loop arguments 203 209 !!bfr INTEGER :: ikbu, ikbv, ikbum1, ikbvm1 ! local integers 204 210 !!bfr INTEGER :: ikbt, ikbumm1, ikbvmm1 ! - - 205 211 !!bfr REAL(wp) :: zebot ! local scalars 206 REAL(wp) :: zrhoa = 1.22 ! Air density kg/m3 207 REAL(wp) :: zcdrag = 1.5e-3 ! drag coefficient 208 REAL(wp) :: zbbrau, zri ! local scalars 209 REAL(wp) :: zfact1, zfact2, zfact3 ! - - 210 REAL(wp) :: ztx2 , zty2 , zcof ! - - 211 REAL(wp) :: ztau , zdif ! - - 212 REAL(wp) :: zus , zwlc , zind ! - - 213 REAL(wp) :: zzd_up, zzd_lw ! - - 214 INTEGER , DIMENSION(jpi,jpj) :: imlc 215 REAL(wp), POINTER, DIMENSION(:,: ) :: zhlc 216 REAL(wp), POINTER, DIMENSION(:,:,:) :: zpelc, zdiag, zd_up, zd_lw 217 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zsh2 212 REAL(wp):: zrhoa = 1.22 ! Air density kg/m3 213 REAL(wp):: zcdrag = 1.5e-3 ! drag coefficient 214 REAL(wp):: zbbrau, zri ! local scalars 215 REAL(wp):: zfact1, zfact2, zfact3 ! - - 216 REAL(wp):: ztx2 , zty2 , zcof ! - - 217 REAL(wp):: ztau , zdif ! - - 218 REAL(wp):: zus , zwlc , zind ! - - 219 REAL(wp):: zzd_up, zzd_lw ! - - 220 INTEGER , DIMENSION(WRK_2D) :: imlc 221 REAL(wp), DIMENSION(WRK_2D) :: zhlc 222 REAL(wp), DIMENSION(WRK_3D) :: zpelc, zdiag, zd_up, zd_lw 218 223 !!-------------------------------------------------------------------- 219 224 ! 220 225 IF( nn_timing == 1 ) CALL timing_start('tke_tke') 221 !222 CALL wrk_alloc( jpi,jpj, zhlc )223 CALL wrk_alloc( jpi,jpj,jpk, zpelc, zdiag, zd_up, zd_lw )224 226 ! 225 227 zbbrau = rn_ebb / rau0 ! Local constant initialisation … … 233 235 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 234 236 IF ( ln_isfcav ) THEN 235 DO jj = 2, jpjm1! en(mikt(ji,jj)) = rn_emin236 DO ji = fs_2, fs_jpim1 ! vector opt.237 DO jj = k_Jstr, k_Jend ! en(mikt(ji,jj)) = rn_emin 238 DO ji = k_Istr, k_Iend 237 239 en(ji,jj,mikt(ji,jj)) = rn_emin * tmask(ji,jj,1) 238 240 END DO 239 241 END DO 240 242 END IF 241 DO jj = 2, jpjm1! en(1) = rn_ebb taum / rau0 (min value rn_emin0)242 DO ji = fs_2, fs_jpim1 ! vector opt.243 DO jj = k_Jstr, k_Jend ! en(1) = rn_ebb taum / rau0 (min value rn_emin0) 244 DO ji = k_Istr, k_Iend 243 245 en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1) 244 246 END DO … … 256 258 !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 257 259 ! en(bot) = (rn_ebb0/rau0)*0.5*sqrt(u_botfr^2+v_botfr^2) (min value rn_emin) 258 !! DO jj = 2, jpjm1259 !! DO ji = fs_2, fs_jpim1 ! vector opt.260 !! DO jj = k_Jstr, k_Jend 261 !! DO ji = k_Jstr, k_Iend 260 262 !! ztx2 = bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj)) + & 261 263 !! bfrua(ji ,jj) * ub(ji ,jj,mbku(ji ,jj) ) … … 269 271 ! 270 272 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 271 IF( ln_lc ) THEN ! Langmuir circulation source term added to tke 273 IF( ln_lc ) THEN ! Langmuir circulation source term added to tke ! (Axell JGR 2002) 272 274 ! !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 273 275 ! 274 276 ! !* total energy produce by LC : cumulative sum over jk 275 zpelc( :,:,1) = MAX( rn2b(:,:,1), 0._wp ) * gdepw_n(:,:,1) * e3w_n(:,:,1)277 zpelc(WRK_2D,1) = MAX( rn2b(WRK_2D,1), 0._wp ) * pdepw(WRK_2D,1) * p_e3w(WRK_2D,1) 276 278 DO jk = 2, jpk 277 zpelc(:,:,jk) = zpelc(:,:,jk-1) + MAX( rn2b(:,:,jk), 0._wp ) * gdepw_n(:,:,jk) * e3w_n(:,:,jk) 279 zpelc(WRK_2D,jk) = zpelc(WRK_2D,jk-1) & 280 & + MAX( rn2b(WRK_2D,jk), 0._wp ) & 281 & * pdepw(WRK_2D,jk) * p_e3w(WRK_2D,jk) 278 282 END DO 279 283 ! !* finite Langmuir Circulation depth 280 284 zcof = 0.5 * 0.016 * 0.016 / ( zrhoa * zcdrag ) 281 imlc( :,:) = mbkt(:,:) + 1 ! Initialization to the number of w ocean point (=2 over land)285 imlc(WRK_2D) = mbkt(WRK_2D) + 1 ! Initialization to the number of w ocean point (=2 over land) 282 286 DO jk = jpkm1, 2, -1 283 DO jj = 1, jpj! Last w-level at which zpelc>=0.5*us*us284 DO ji = 1, jpi! with us=0.016*wind(starting from jpk-1)287 DO jj = k_Jstr, k_Jend ! Last w-level at which zpelc>=0.5*us*us 288 DO ji = k_Istr, k_Iend ! with us=0.016*wind(starting from jpk-1) 285 289 zus = zcof * taum(ji,jj) 286 290 IF( zpelc(ji,jj,jk) > zus ) imlc(ji,jj) = jk … … 289 293 END DO 290 294 ! ! finite LC depth 291 DO jj = 1, jpj292 DO ji = 1, jpi293 zhlc(ji,jj) = gdepw_n(ji,jj,imlc(ji,jj))295 DO jj = k_Jstr, k_Jend 296 DO ji = k_Istr, k_Iend 297 zhlc(ji,jj) = pdepw(ji,jj,imlc(ji,jj)) 294 298 END DO 295 299 END DO 296 300 zcof = 0.016 / SQRT( zrhoa * zcdrag ) 297 301 DO jk = 2, jpkm1 !* TKE Langmuir circulation source term added to en 298 DO jj = 2, jpjm1299 DO ji = fs_2, fs_jpim1 ! vector opt.302 DO jj = k_Jstr, k_Jend 303 DO ji = k_Istr, k_Iend 300 304 zus = zcof * SQRT( taum(ji,jj) ) ! Stokes drift 301 305 ! ! vertical velocity due to LC 302 zind = 0.5 - SIGN( 0.5, gdepw_n(ji,jj,jk) - zhlc(ji,jj) )303 zwlc = zind * rn_lc * zus * SIN( rpi * gdepw_n(ji,jj,jk) / zhlc(ji,jj) )306 zind = 0.5 - SIGN( 0.5, pdepw(ji,jj,jk) - zhlc(ji,jj) ) 307 zwlc = zind * rn_lc * zus * SIN( rpi * pdepw(ji,jj,jk) / zhlc(ji,jj) ) 304 308 ! ! TKE Langmuir circulation source term 305 309 en(ji,jj,jk) = en(ji,jj,jk) + rdt * MAX(0.,1._wp - 2.*fr_i(ji,jj) ) * ( zwlc * zwlc * zwlc ) & … … 318 322 ! ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 319 323 ! 320 ! !* Shear production at uw- and vw-points (energy conserving form)321 CALL zdf_sh2( zsh2 )322 !323 324 IF( nn_pdl == 1 ) THEN !* Prandtl number = F( Ri ) 324 325 DO jk = 2, jpkm1 325 DO jj = 2, jpjm1326 DO ji = 2, jpim1326 DO jj = k_Jstr, k_Jend 327 DO ji = k_Istr, k_Iend 327 328 ! ! local Richardson number 328 zri = MAX( rn2b(ji,jj,jk), 0._wp ) * avm(ji,jj,jk) / ( zsh2(ji,jj,jk) + rn_bshear )329 zri = MAX( rn2b(ji,jj,jk), 0._wp ) * p_avm(ji,jj,jk) / ( p_sh2(ji,jj,jk) + rn_bshear ) 329 330 ! ! inverse of Prandtl number 330 331 apdlr(ji,jj,jk) = MAX( 0.1_wp, ri_cri / MAX( ri_cri , zri ) ) … … 335 336 ! 336 337 DO jk = 2, jpkm1 !* Matrix and right hand side in en 337 DO jj = 2, jpjm1338 DO ji = fs_2, fs_jpim1 ! vector opt.338 DO jj = k_Jstr, k_Jend 339 DO ji = k_Istr, k_Iend 339 340 zcof = zfact1 * tmask(ji,jj,jk) 340 341 ! ! A minimum of 2.e-5 m2/s is imposed on TKE vertical 341 342 ! ! eddy coefficient (ensure numerical stability) 342 zzd_up = zcof * MAX( avm(ji,jj,jk+1) +avm(ji,jj,jk ) , 2.e-5_wp ) & ! upper diagonal343 & / ( e3t_n(ji,jj,jk ) * e3w_n(ji,jj,jk ) )344 zzd_lw = zcof * MAX( avm(ji,jj,jk ) +avm(ji,jj,jk-1) , 2.e-5_wp ) & ! lower diagonal345 & / ( e3t_n(ji,jj,jk-1) * e3w_n(ji,jj,jk ) )343 zzd_up = zcof * MAX( p_avm(ji,jj,jk+1) + p_avm(ji,jj,jk ) , 2.e-5_wp ) & ! upper diagonal 344 & / ( p_e3t(ji,jj,jk ) * p_e3w(ji,jj,jk ) ) 345 zzd_lw = zcof * MAX( p_avm(ji,jj,jk ) + p_avm(ji,jj,jk-1) , 2.e-5_wp ) & ! lower diagonal 346 & / ( p_e3t(ji,jj,jk-1) * p_e3w(ji,jj,jk ) ) 346 347 ! 347 348 zd_up(ji,jj,jk) = zzd_up ! Matrix (zdiag, zd_up, zd_lw) … … 350 351 ! 351 352 ! ! right hand side in en 352 en(ji,jj,jk) = en(ji,jj,jk) + rdt * ( zsh2(ji,jj,jk)& ! shear353 & - avt(ji,jj,jk) * rn2(ji,jj,jk)& ! stratification353 en(ji,jj,jk) = en(ji,jj,jk) + rdt * ( p_sh2(ji,jj,jk) & ! shear 354 & - p_avt(ji,jj,jk) * rn2(ji,jj,jk) & ! stratification 354 355 & + zfact3 * dissl(ji,jj,jk) * en(ji,jj,jk) & ! dissipation 355 356 & ) * wmask(ji,jj,jk) … … 359 360 ! !* Matrix inversion from level 2 (tke prescribed at level 1) 360 361 DO jk = 3, jpkm1 ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1 361 DO jj = 2, jpjm1362 DO ji = fs_2, fs_jpim1 ! vector opt.362 DO jj = k_Jstr, k_Jend 363 DO ji = k_Istr, k_Iend 363 364 zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 364 365 END DO 365 366 END DO 366 367 END DO 367 DO jj = 2, jpjm1! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1368 DO ji = fs_2, fs_jpim1 ! vector opt.368 DO jj = k_Jstr, k_Jend ! Second recurrence : Lk = RHSk - Lk / Dk-1 * Lk-1 369 DO ji = k_Istr, k_Iend 369 370 zd_lw(ji,jj,2) = en(ji,jj,2) - zd_lw(ji,jj,2) * en(ji,jj,1) ! Surface boudary conditions on tke 370 371 END DO 371 372 END DO 372 373 DO jk = 3, jpkm1 373 DO jj = 2, jpjm1374 DO ji = fs_2, fs_jpim1 ! vector opt.374 DO jj = k_Jstr, k_Jend 375 DO ji = k_Istr, k_Iend 375 376 zd_lw(ji,jj,jk) = en(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) *zd_lw(ji,jj,jk-1) 376 377 END DO 377 378 END DO 378 379 END DO 379 DO jj = 2, jpjm1! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk380 DO ji = fs_2, fs_jpim1 ! vector opt.380 DO jj = k_Jstr, k_Jend ! thrid recurrence : Ek = ( Lk - Uk * Ek+1 ) / Dk 381 DO ji = k_Istr, k_Iend 381 382 en(ji,jj,jpkm1) = zd_lw(ji,jj,jpkm1) / zdiag(ji,jj,jpkm1) 382 383 END DO 383 384 END DO 384 385 DO jk = jpk-2, 2, -1 385 DO jj = 2, jpjm1386 DO ji = fs_2, fs_jpim1 ! vector opt.386 DO jj = k_Jstr, k_Jend 387 DO ji = k_Istr, k_Iend 387 388 en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 388 389 END DO … … 390 391 END DO 391 392 DO jk = 2, jpkm1 ! set the minimum value of tke 392 DO jj = 2, jpjm1393 DO ji = fs_2, fs_jpim1 ! vector opt.393 DO jj = k_Jstr, k_Jend 394 DO ji = k_Istr, k_Iend 394 395 en(ji,jj,jk) = MAX( en(ji,jj,jk), rn_emin ) * wmask(ji,jj,jk) 395 396 END DO … … 405 406 IF( nn_etau == 1 ) THEN !* penetration below the mixed layer (rn_efr fraction) 406 407 DO jk = 2, jpkm1 407 DO jj = 2, jpjm1408 DO ji = fs_2, fs_jpim1 ! vector opt.409 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( - gdepw_n(ji,jj,jk) / htau(ji,jj) ) &408 DO jj = k_Jstr, k_Jend 409 DO ji = k_Istr, k_Iend 410 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) ) & 410 411 & * MAX(0.,1._wp - 2.*fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 411 412 END DO … … 413 414 END DO 414 415 ELSEIF( nn_etau == 2 ) THEN !* act only at the base of the mixed layer (jk=nmln) (rn_efr fraction) 415 DO jj = 2, jpjm1416 DO ji = fs_2, fs_jpim1 ! vector opt.416 DO jj = k_Jstr, k_Jend 417 DO ji = k_Istr, k_Iend 417 418 jk = nmln(ji,jj) 418 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( - gdepw_n(ji,jj,jk) / htau(ji,jj) ) &419 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) ) & 419 420 & * MAX(0.,1._wp - 2.*fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 420 421 END DO … … 422 423 ELSEIF( nn_etau == 3 ) THEN !* penetration belox the mixed layer (HF variability) 423 424 DO jk = 2, jpkm1 424 DO jj = 2, jpjm1425 DO ji = fs_2, fs_jpim1 ! vector opt.425 DO jj = k_Jstr, k_Jend 426 DO ji = k_Istr, k_Iend 426 427 ztx2 = utau(ji-1,jj ) + utau(ji,jj) 427 428 zty2 = vtau(ji ,jj-1) + vtau(ji,jj) … … 429 430 zdif = taum(ji,jj) - ztau ! mean of modulus - modulus of the mean 430 431 zdif = rhftau_scl * MAX( 0._wp, zdif + rhftau_add ) ! apply some modifications... 431 en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( - gdepw_n(ji,jj,jk) / htau(ji,jj) ) &432 en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) ) & 432 433 & * MAX(0.,1._wp - 2.*fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 433 434 END DO … … 435 436 END DO 436 437 ENDIF 437 !!gm not sure we need this lbc ....438 CALL lbc_lnk( en, 'W', 1. ) ! Lateral boundary conditions (sign unchanged)439 !440 CALL wrk_dealloc( jpi,jpj, zhlc )441 CALL wrk_dealloc( jpi,jpj,jpk, zpelc, zdiag, zd_up, zd_lw )442 438 ! 443 439 IF( nn_timing == 1 ) CALL timing_stop('tke_tke') … … 446 442 447 443 448 SUBROUTINE tke_avn 444 SUBROUTINE tke_avn( ARG_2D, pdepw, p_e3t, p_e3w, p_avm, p_avt ) 449 445 !!---------------------------------------------------------------------- 450 446 !! *** ROUTINE tke_avn *** … … 480 476 !! ** Action : - avt, avm : now vertical eddy diffusivity and viscosity (w-point) 481 477 !!---------------------------------------------------------------------- 478 INTEGER , INTENT(in ) :: ARG_2D ! inner domain start-end i-indices 479 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: pdepw ! vertical eddy viscosity (w-points) 480 REAL(wp), DIMENSION(:,:,:), INTENT(in ) :: p_e3t, p_e3w ! vertical eddy viscosity (w-points) 481 REAL(wp), DIMENSION(:,:,:), INTENT( out) :: p_avm, p_avt ! vertical eddy viscosity (w-points) 482 ! 482 483 INTEGER :: ji, jj, jk ! dummy loop indices 483 484 REAL(wp) :: zrn2, zraug, zcoef, zav ! local scalars 484 485 REAL(wp) :: zdku, zdkv, zsqen ! - - 485 486 REAL(wp) :: zemxl, zemlm, zemlp ! - - 486 REAL(wp), POINTER, DIMENSION(:,:,:) :: zmpdl,zmxlm, zmxld487 REAL(wp), DIMENSION(WRK_3D) :: zmxlm, zmxld 487 488 !!-------------------------------------------------------------------- 488 489 ! 489 490 IF( nn_timing == 1 ) CALL timing_start('tke_avn') 490 491 491 CALL wrk_alloc( jpi,jpj,jpk, zmpdl, zmxlm, zmxld )492 493 492 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 494 493 ! ! Mixing length … … 498 497 ! 499 498 ! initialisation of interior minimum value (avoid a 2d loop with mikt) 500 zmxlm( :,:,:) = rmxl_min501 zmxld( :,:,:) = rmxl_min499 zmxlm(WRK_3D) = rmxl_min 500 zmxld(WRK_3D) = rmxl_min 502 501 ! 503 502 IF( ln_mxl0 ) THEN ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rau0*g) 504 DO jj = 2, jpjm1505 DO ji = fs_2, fs_jpim1506 zraug = vkarmn * 2.e5_wp / ( rau0 * grav )503 zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 504 DO jj = k_Jstr, k_Jend 505 DO ji = k_Istr, k_Iend 507 506 zmxlm(ji,jj,1) = MAX( rn_mxl0, zraug * taum(ji,jj) * tmask(ji,jj,1) ) 508 507 END DO 509 508 END DO 510 509 ELSE 511 zmxlm( :,:,1) = rn_mxl0510 zmxlm(WRK_2D,1) = rn_mxl0 512 511 ENDIF 513 512 ! 514 513 DO jk = 2, jpkm1 ! interior value : l=sqrt(2*e/n^2) 515 DO jj = 2, jpjm1516 DO ji = fs_2, fs_jpim1 ! vector opt.514 DO jj = k_Jstr, k_Jend 515 DO ji = k_Istr, k_Iend 517 516 zrn2 = MAX( rn2(ji,jj,jk), rsmall ) 518 517 zmxlm(ji,jj,jk) = MAX( rmxl_min, SQRT( 2._wp * en(ji,jj,jk) / zrn2 ) ) … … 523 522 ! !* Physical limits for the mixing length 524 523 ! 525 zmxld( :,:, 1 ) = zmxlm(:,:,1) ! surface set to the minimum value526 zmxld( :,:,jpk) = rmxl_min! last level set to the minimum value524 zmxld(WRK_2D, 1 ) = zmxlm(WRK_2D,1) ! surface set to the minimum value 525 zmxld(WRK_2D,jpk) = rmxl_min ! last level set to the minimum value 527 526 ! 528 527 SELECT CASE ( nn_mxl ) 529 528 ! 530 529 !!gm Not sure of that coding for ISF.... 531 ! where wmask = 0 set zmxlm == e3w_n530 ! where wmask = 0 set zmxlm == p_e3w 532 531 CASE ( 0 ) ! bounded by the distance to surface and bottom 533 532 DO jk = 2, jpkm1 534 DO jj = 2, jpjm1535 DO ji = fs_2, fs_jpim1 ! vector opt.536 zemxl = MIN( gdepw_n(ji,jj,jk) - gdepw_n(ji,jj,mikt(ji,jj)), zmxlm(ji,jj,jk), &537 & gdepw_n(ji,jj,mbkt(ji,jj)+1) - gdepw_n(ji,jj,jk) )533 DO jj = k_Jstr, k_Jend 534 DO ji = k_Istr, k_Iend 535 zemxl = MIN( pdepw(ji,jj,jk) - pdepw(ji,jj,mikt(ji,jj)), zmxlm(ji,jj,jk), & 536 & pdepw(ji,jj,mbkt(ji,jj)+1) - pdepw(ji,jj,jk) ) 538 537 ! wmask prevent zmxlm = 0 if jk = mikt(ji,jj) 539 zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk),e3w_n(ji,jj,jk)) * (1 - wmask(ji,jj,jk))540 zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk),e3w_n(ji,jj,jk)) * (1 - wmask(ji,jj,jk))538 zmxlm(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , p_e3w(ji,jj,jk) ) * (1 - wmask(ji,jj,jk)) 539 zmxld(ji,jj,jk) = zemxl * wmask(ji,jj,jk) + MIN( zmxlm(ji,jj,jk) , p_e3w(ji,jj,jk) ) * (1 - wmask(ji,jj,jk)) 541 540 END DO 542 541 END DO … … 545 544 CASE ( 1 ) ! bounded by the vertical scale factor 546 545 DO jk = 2, jpkm1 547 DO jj = 2, jpjm1548 DO ji = fs_2, fs_jpim1 ! vector opt.549 zemxl = MIN( e3w_n(ji,jj,jk), zmxlm(ji,jj,jk) )546 DO jj = k_Jstr, k_Jend 547 DO ji = k_Istr, k_Iend 548 zemxl = MIN( p_e3w(ji,jj,jk), zmxlm(ji,jj,jk) ) 550 549 zmxlm(ji,jj,jk) = zemxl 551 550 zmxld(ji,jj,jk) = zemxl … … 556 555 CASE ( 2 ) ! |dk[xml]| bounded by e3t : 557 556 DO jk = 2, jpkm1 ! from the surface to the bottom : 558 DO jj = 2, jpjm1559 DO ji = fs_2, fs_jpim1 ! vector opt.560 zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + e3t_n(ji,jj,jk-1), zmxlm(ji,jj,jk) )557 DO jj = k_Jstr, k_Jend 558 DO ji = k_Istr, k_Iend 559 zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk-1) + p_e3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 561 560 END DO 562 561 END DO 563 562 END DO 564 563 DO jk = jpkm1, 2, -1 ! from the bottom to the surface : 565 DO jj = 2, jpjm1566 DO ji = fs_2, fs_jpim1 ! vector opt.567 zemxl = MIN( zmxlm(ji,jj,jk+1) + e3t_n(ji,jj,jk+1), zmxlm(ji,jj,jk) )564 DO jj = k_Jstr, k_Jend 565 DO ji = k_Istr, k_Iend 566 zemxl = MIN( zmxlm(ji,jj,jk+1) + p_e3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 568 567 zmxlm(ji,jj,jk) = zemxl 569 568 zmxld(ji,jj,jk) = zemxl … … 574 573 CASE ( 3 ) ! lup and ldown, |dk[xml]| bounded by e3t : 575 574 DO jk = 2, jpkm1 ! from the surface to the bottom : lup 576 DO jj = 2, jpjm1577 DO ji = fs_2, fs_jpim1 ! vector opt.578 zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + e3t_n(ji,jj,jk-1), zmxlm(ji,jj,jk) )575 DO jj = k_Jstr, k_Jend 576 DO ji = k_Istr, k_Iend 577 zmxld(ji,jj,jk) = MIN( zmxld(ji,jj,jk-1) + p_e3t(ji,jj,jk-1), zmxlm(ji,jj,jk) ) 579 578 END DO 580 579 END DO 581 580 END DO 582 581 DO jk = jpkm1, 2, -1 ! from the bottom to the surface : ldown 583 DO jj = 2, jpjm1584 DO ji = fs_2, fs_jpim1 ! vector opt.585 zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + e3t_n(ji,jj,jk+1), zmxlm(ji,jj,jk) )582 DO jj = k_Jstr, k_Jend 583 DO ji = k_Istr, k_Iend 584 zmxlm(ji,jj,jk) = MIN( zmxlm(ji,jj,jk+1) + p_e3t(ji,jj,jk+1), zmxlm(ji,jj,jk) ) 586 585 END DO 587 586 END DO 588 587 END DO 589 588 DO jk = 2, jpkm1 590 DO jj = 2, jpjm1591 DO ji = fs_2, fs_jpim1 ! vector opt.589 DO jj = k_Jstr, k_Jend 590 DO ji = k_Istr, k_Iend 592 591 zemlm = MIN ( zmxld(ji,jj,jk), zmxlm(ji,jj,jk) ) 593 592 zemlp = SQRT( zmxld(ji,jj,jk) * zmxlm(ji,jj,jk) ) … … 605 604 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 606 605 DO jk = 1, jpkm1 !* vertical eddy viscosity & diffivity at w-points 607 DO jj = 2, jpjm1608 DO ji = fs_2, fs_jpim1 ! vector opt.606 DO jj = k_Jstr, k_Jend 607 DO ji = k_Istr, k_Iend 609 608 zsqen = SQRT( en(ji,jj,jk) ) 610 609 zav = rn_ediff * zmxlm(ji,jj,jk) * zsqen 611 avm(ji,jj,jk) = MAX( zav, avmb(jk) ) * wmask(ji,jj,jk)612 avt(ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk)610 p_avm(ji,jj,jk) = MAX( zav, avmb(jk) ) * wmask(ji,jj,jk) 611 p_avt(ji,jj,jk) = MAX( zav, avtb_2d(ji,jj) * avtb(jk) ) * wmask(ji,jj,jk) 613 612 dissl(ji,jj,jk) = zsqen / zmxld(ji,jj,jk) 614 613 END DO … … 619 618 IF( nn_pdl == 1 ) THEN !* Prandtl number case: update avt 620 619 DO jk = 2, jpkm1 621 DO jj = 2, jpjm1622 DO ji = fs_2, fs_jpim1 ! vector opt.623 avt(ji,jj,jk) = MAX( apdlr(ji,jj,jk) *avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk)620 DO jj = k_Jstr, k_Jend 621 DO ji = k_Istr, k_Iend 622 p_avt(ji,jj,jk) = MAX( apdlr(ji,jj,jk) * p_avt(ji,jj,jk), avtb_2d(ji,jj) * avtb(jk) ) * tmask(ji,jj,jk) 624 623 END DO 625 624 END DO 626 625 END DO 627 626 ENDIF 628 !!gm I'm sure this is needed to compute the shear term at next time-step629 CALL lbc_lnk( avm, 'W', 1. ) ! Lateral boundary conditions (sign unchanged)630 CALL lbc_lnk( avt, 'W', 1. ) ! Lateral boundary conditions on avt (sign unchanged)631 627 632 628 IF(ln_ctl) THEN … … 634 630 CALL prt_ctl( tab3d_1=avm, clinfo1=' tke - m: ', ovlap=1, kdim=jpk ) 635 631 ENDIF 636 !637 CALL wrk_dealloc( jpi,jpj,jpk, zmpdl, zmxlm, zmxld )638 632 ! 639 633 IF( nn_timing == 1 ) CALL timing_stop('tke_avn') … … 737 731 ! !* set vertical eddy coef. to the background value 738 732 DO jk = 1, jpk 739 avt (:,:,jk) = avtb(jk) * wmask(:,:,jk)740 avm (:,:,jk) = avmb(jk) * wmask(:,:,jk)733 avt(:,:,jk) = avtb(jk) * wmask(:,:,jk) 734 avm(:,:,jk) = avmb(jk) * wmask(:,:,jk) 741 735 END DO 742 736 dissl(:,:,:) = 1.e-12_wp … … 748 742 749 743 SUBROUTINE tke_rst( kt, cdrw ) 750 !!--------------------------------------------------------------------- 751 !! *** ROUTINE tke_rst *** 752 !! 753 !! ** Purpose : Read or write TKE file (en) in restart file 754 !! 755 !! ** Method : use of IOM library 756 !! if the restart does not contain TKE, en is either 757 !! set to rn_emin or recomputed 758 !!---------------------------------------------------------------------- 759 INTEGER , INTENT(in) :: kt ! ocean time-step 760 CHARACTER(len=*), INTENT(in) :: cdrw ! "READ"/"WRITE" flag 761 ! 762 INTEGER :: jit, jk ! dummy loop indices 763 INTEGER :: id1, id2, id3, id4 ! local integers 764 !!---------------------------------------------------------------------- 765 ! 766 IF( TRIM(cdrw) == 'READ' ) THEN ! Read/initialise 767 ! ! --------------- 768 IF( ln_rstart ) THEN !* Read the restart file 769 id1 = iom_varid( numror, 'en' , ldstop = .FALSE. ) 770 id2 = iom_varid( numror, 'avt_k', ldstop = .FALSE. ) 771 id3 = iom_varid( numror, 'avm_k', ldstop = .FALSE. ) 772 id4 = iom_varid( numror, 'dissl', ldstop = .FALSE. ) 773 ! 774 IF( id1 > 0 ) THEN ! 'en' exists 775 CALL iom_get( numror, jpdom_autoglo, 'en', en ) 776 IF( MIN( id2, id3, id4 ) > 0 ) THEN ! all required arrays exist 777 CALL iom_get( numror, jpdom_autoglo, 'avt_k', avt_k ) 778 CALL iom_get( numror, jpdom_autoglo, 'avm_k', avm_k ) 779 CALL iom_get( numror, jpdom_autoglo, 'dissl', dissl ) 780 ELSE ! one at least array is missing 781 CALL tke_avn ! compute avt, avm, and dissl (approximation) 782 ENDIF 783 ELSE ! No TKE array found: initialisation 784 IF(lwp) WRITE(numout,*) ' ===>>>> : previous run without tke scheme, en computed by iterative loop' 785 en (:,:,:) = rn_emin * wmask(:,:,:) 786 CALL tke_avn ! recompute avt, avm, and dissl (approximation) 787 avt_k(:,:,:) = avt(:,:,:) 788 avm_k(:,:,:) = avm(:,:,:) 789 ! 790 DO jit = nit000 + 1, nit000 + 10 ; CALL zdf_tke( jit ) ; END DO 791 avt_k(:,:,:) = avt(:,:,:) 792 avm_k(:,:,:) = avm(:,:,:) 793 ENDIF 794 ELSE !* Start from rest 795 en(:,:,:) = rn_emin * tmask(:,:,:) 796 DO jk = 1, jpk ! set the Kz to the background value 797 avt_k(:,:,jk) = avtb(jk) * wmask (:,:,jk) 798 avm_k(:,:,jk) = avmb(jk) * wmask (:,:,jk) 799 END DO 800 ENDIF 801 ! 802 ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN ! Create restart file 803 ! ! ------------------- 804 IF(lwp) WRITE(numout,*) '---- tke-rst ----' 805 CALL iom_rstput( kt, nitrst, numrow, 'en' , en ) 806 CALL iom_rstput( kt, nitrst, numrow, 'avt_k', avt_k ) 807 CALL iom_rstput( kt, nitrst, numrow, 'avm_k', avm_k ) 808 CALL iom_rstput( kt, nitrst, numrow, 'dissl', dissl ) 809 ! 810 ENDIF 811 ! 744 !!--------------------------------------------------------------------- 745 !! *** ROUTINE tke_rst *** 746 !! 747 !! ** Purpose : Read or write TKE file (en) in restart file 748 !! 749 !! ** Method : use of IOM library 750 !! if the restart does not contain TKE, en is either 751 !! set to rn_emin or recomputed 752 !!---------------------------------------------------------------------- 753 INTEGER , INTENT(in) :: kt ! ocean time-step 754 CHARACTER(len=*), INTENT(in) :: cdrw ! "READ"/"WRITE" flag 755 ! 756 INTEGER :: jit, jk ! dummy loop indices 757 INTEGER :: id1, id2, id3, id4 ! local integers 758 !!---------------------------------------------------------------------- 759 ! 760 IF( TRIM(cdrw) == 'READ' ) THEN ! Read/initialise 761 ! ! --------------- 762 IF( ln_rstart ) THEN !* Read the restart file 763 id1 = iom_varid( numror, 'en' , ldstop = .FALSE. ) 764 id2 = iom_varid( numror, 'avt_k', ldstop = .FALSE. ) 765 id3 = iom_varid( numror, 'avm_k', ldstop = .FALSE. ) 766 id4 = iom_varid( numror, 'dissl', ldstop = .FALSE. ) 767 ! 768 IF( MIN( id1, id2, id3, id4 ) > 0 ) THEN ! fields exist 769 CALL iom_get( numror, jpdom_autoglo, 'en', en ) 770 CALL iom_get( numror, jpdom_autoglo, 'avt_k', avt_k ) 771 CALL iom_get( numror, jpdom_autoglo, 'avm_k', avm_k ) 772 CALL iom_get( numror, jpdom_autoglo, 'dissl', dissl ) 773 ELSE ! start TKE from rest 774 IF(lwp) WRITE(numout,*) ' ==>> previous run without TKE scheme, set en to background values' 775 en(:,:,:) = rn_emin * wmask(:,:,:) 776 ! avt_k, avm_k already set to the background value in zdf_phy_init 777 ENDIF 778 ELSE !* Start from rest 779 IF(lwp) WRITE(numout,*) ' ==>> start from rest: set en to the background value' 780 en(:,:,:) = rn_emin * wmask(:,:,:) 781 ! avt_k, avm_k already set to the background value in zdf_phy_init 782 ENDIF 783 ! 784 ELSEIF( TRIM(cdrw) == 'WRITE' ) THEN ! Create restart file 785 ! ! ------------------- 786 IF(lwp) WRITE(numout,*) '---- tke-rst ----' 787 CALL iom_rstput( kt, nitrst, numrow, 'en' , en ) 788 CALL iom_rstput( kt, nitrst, numrow, 'avt_k', avt_k ) 789 CALL iom_rstput( kt, nitrst, numrow, 'avm_k', avm_k ) 790 CALL iom_rstput( kt, nitrst, numrow, 'dissl', dissl ) 791 ! 792 ENDIF 793 ! 812 794 END SUBROUTINE tke_rst 813 795 -
branches/2017/wrk_OMP_test_for_Silvia/NEMOGCM/NEMO/OPA_SRC/step.F90
r7954 r8055 36 36 !!---------------------------------------------------------------------- 37 37 USE step_oce ! time stepping definition modules 38 !!gm to be removed when removing avmu, avmv 39 USE zdf_oce ! ocean vertical physics variables 40 !!gm 38 41 ! 39 42 USE iom ! xIOs server … … 102 105 IF( ln_crs ) CALL iom_setkt( kstp - nit000 + 1, TRIM(cxios_context)//"_crs" ) ! tell IOM we are at time step kstp 103 106 107 CALL FLUSH( numout) 104 108 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 105 109 ! Update external forcing (tides, open boundaries, and surface boundary condition (including sea-ice) … … 109 113 IF( ln_bdy ) CALL bdy_dta ( kstp, time_offset=+1 ) ! update dynamic & tracer data at open boundaries 110 114 CALL sbc ( kstp ) ! Sea Boundary Condition (including sea-ice) 115 CALL FLUSH( numout) 111 116 112 117 !>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> … … 124 129 CALL bn2 ( tsb, rab_b, rn2b ) ! before Brunt-Vaisala frequency 125 130 CALL bn2 ( tsn, rab_n, rn2 ) ! now Brunt-Vaisala frequency 131 CALL FLUSH( numout) 126 132 127 133 ! VERTICAL PHYSICS 128 134 CALL zdf_phy( kstp ) ! vertical physics update (bfr, avt, avs, avm + MLD) 135 CALL FLUSH( numout) 136 137 !!gm ===>>> TO BE REMOVED (require changes in zdf_oce, dynzdf(_imp,_exp), dynldf_iso, diawri) 138 DO jk = 1, jpkm1 !* vertical eddy viscosity at wu- and wv-points 139 DO jj = 2, jpjm1 140 DO ji = 2, jpim1 141 avmu(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji+1,jj ,jk) ) * wumask(ji,jj,jk) 142 avmv(ji,jj,jk) = 0.5 * ( avm(ji,jj,jk) + avm(ji ,jj+1,jk) ) * wvmask(ji,jj,jk) 143 END DO 144 END DO 145 END DO 146 CALL lbc_lnk( avmu, 'U', 1. ) ; CALL lbc_lnk( avmv, 'V', 1. ) ! Lateral boundary conditions 147 !!gm end 129 148 130 149 ! LATERAL PHYSICS -
branches/2017/wrk_OMP_test_for_Silvia/NEMOGCM/SETTE/sette.sh
r7931 r8055 1098 1098 export TEST_NAME="SHORT" 1099 1099 cd ${CONFIG_DIR0} 1100 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_1_2 -r ORCA2_LIM3_PISCES -d "OPA_SRC LIM_SRC_3 NST_SRC" -j 8 add_key "key_agrif" del_key "key_ zdftmx key_top"1100 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_1_2 -r ORCA2_LIM3_PISCES -d "OPA_SRC LIM_SRC_3 NST_SRC" -j 8 add_key "key_agrif" del_key "key_top" 1101 1101 cd ${SETTE_DIR} 1102 1102 . ./param.cfg … … 1145 1145 export TEST_NAME="SHORT_NOZOOM" 1146 1146 cd ${CONFIG_DIR0} 1147 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_2_2 -r ORCA2_LIM3_PISCES -d "OPA_SRC LIM_SRC_3 NST_SRC" -j 8 add_key "key_agrif" del_key "key_ zdftmx key_top"1147 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_2_2 -r ORCA2_LIM3_PISCES -d "OPA_SRC LIM_SRC_3 NST_SRC" -j 8 add_key "key_agrif" del_key "key_top" 1148 1148 cd ${SETTE_DIR} 1149 1149 . ./param.cfg … … 1182 1182 export TEST_NAME="SHORT_NOAGRIF" 1183 1183 cd ${CONFIG_DIR0} 1184 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_2_2_NAG -r ORCA2_LIM3_PISCES -d "OPA_SRC LIM_SRC_3 NST_SRC" -j 8 del_key "key_ zdftmx key_top"1184 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_2_2_NAG -r ORCA2_LIM3_PISCES -d "OPA_SRC LIM_SRC_3 NST_SRC" -j 8 del_key "key_top" 1185 1185 cd ${SETTE_DIR} 1186 1186 . ./param.cfg … … 1220 1220 export TEST_NAME="LONG" 1221 1221 cd ${CONFIG_DIR0} 1222 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_LONG -r ORCA2_LIM3_PISCES -d "OPA_SRC LIM_SRC_3 NST_SRC" -j 8 add_key "key_agrif" del_key "key_ zdftmx key_top"1222 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_LONG -r ORCA2_LIM3_PISCES -d "OPA_SRC LIM_SRC_3 NST_SRC" -j 8 add_key "key_agrif" del_key "key_top" 1223 1223 cd ${SETTE_DIR} 1224 1224 . ./param.cfg … … 1319 1319 export TEST_NAME="REPRO_4_4" 1320 1320 cd ${CONFIG_DIR0} 1321 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_16 -r ORCA2_LIM3_PISCES -d "OPA_SRC LIM_SRC_3 NST_SRC" -j 8 add_key "key_agrif" del_key "key_ zdftmx key_top"1321 . ./makenemo -m ${CMP_NAM} -n ORCA2AGUL_16 -r ORCA2_LIM3_PISCES -d "OPA_SRC LIM_SRC_3 NST_SRC" -j 8 add_key "key_agrif" del_key "key_top" 1322 1322 cd ${SETTE_DIR} 1323 1323 . ./param.cfg
Note: See TracChangeset
for help on using the changeset viewer.