Changeset 6225 for branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_imp.F90
- Timestamp:
- 2016-01-08T10:35:19+01:00 (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2014/dev_r4704_NOC5_MPP_BDY_UPDATE/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_imp.F90
r4370 r6225 2 2 !!====================================================================== 3 3 !! *** MODULE dynzdf_imp *** 4 !! Ocean dynamics: vertical component(s) of the momentum mixing trend 4 !! Ocean dynamics: vertical component(s) of the momentum mixing trend, implicit scheme 5 5 !!====================================================================== 6 6 !! History : OPA ! 1990-10 (B. Blanke) Original code … … 12 12 13 13 !!---------------------------------------------------------------------- 14 !! dyn_zdf_imp : update the momentum trend with the vertical diffusion using a implicit time-stepping 15 !!---------------------------------------------------------------------- 16 USE oce ! ocean dynamics and tracers 17 USE dom_oce ! ocean space and time domain 18 USE domvvl ! variable volume 19 USE sbc_oce ! surface boundary condition: ocean 20 USE zdf_oce ! ocean vertical physics 21 USE phycst ! physical constants 22 USE in_out_manager ! I/O manager 23 USE lib_mpp ! MPP library 24 USE zdfbfr ! Bottom friction setup 25 USE wrk_nemo ! Memory Allocation 26 USE timing ! Timing 27 USE dynadv ! dynamics: vector invariant versus flux form 28 USE dynspg_oce, ONLY: lk_dynspg_ts 14 !! dyn_zdf_imp : compute the vertical diffusion using a implicit scheme 15 !! together with the Leap-Frog time integration. 16 !!---------------------------------------------------------------------- 17 USE oce ! ocean dynamics and tracers 18 USE phycst ! physical constants 19 USE dom_oce ! ocean space and time domain 20 USE domvvl ! variable volume 21 USE sbc_oce ! surface boundary condition: ocean 22 USE dynadv , ONLY: ln_dynadv_vec ! Momentum advection form 23 USE zdf_oce ! ocean vertical physics 24 USE zdfbfr ! Bottom friction setup 25 ! 26 USE in_out_manager ! I/O manager 27 USE lib_mpp ! MPP library 28 USE wrk_nemo ! Memory Allocation 29 USE timing ! Timing 29 30 30 31 IMPLICIT NONE … … 33 34 PUBLIC dyn_zdf_imp ! called by step.F90 34 35 35 REAL(wp) :: r_vvl ! variable volume indicator, =1 if lk_vvl=T, =0otherwise36 REAL(wp) :: r_vvl ! non-linear free surface indicator: =0 if ln_linssh=T, =1 otherwise 36 37 37 38 !! * Substitutions 38 # include "domzgr_substitute.h90"39 39 # include "vectopt_loop_substitute.h90" 40 40 !!---------------------------------------------------------------------- … … 50 50 !! 51 51 !! ** Purpose : Compute the trend due to the vert. momentum diffusion 52 !! and the surface forcing, and add it to the general trend of53 !! the momentum equations.52 !! together with the Leap-Frog time stepping using an 53 !! implicit scheme. 54 54 !! 55 !! ** Method : The vertical momentum mixing trend is given by : 56 !! dz( avmu dz(u) ) = 1/e3u dk+1( avmu/e3uw dk(ua) ) 57 !! backward time stepping 58 !! Surface boundary conditions: wind stress input (averaged over kt-1/2 & kt+1/2) 59 !! Bottom boundary conditions : bottom stress (cf zdfbfr.F) 60 !! Add this trend to the general trend ua : 61 !! ua = ua + dz( avmu dz(u) ) 55 !! ** Method : - Leap-Frog time stepping on all trends but the vertical mixing 56 !! ua = ub + 2*dt * ua vector form or linear free surf. 57 !! ua = ( e3u_b*ub + 2*dt * e3u_n*ua ) / e3u_a otherwise 58 !! - update the after velocity with the implicit vertical mixing. 59 !! This requires to solver the following system: 60 !! ua = ua + 1/e3u_a dk+1[ avmu / e3uw_a dk[ua] ] 61 !! with the following surface/top/bottom boundary condition: 62 !! surface: wind stress input (averaged over kt-1/2 & kt+1/2) 63 !! top & bottom : top stress (iceshelf-ocean) & bottom stress (cf zdfbfr.F) 62 64 !! 63 !! ** Action : - Update (ua,va) arrays with the after vertical diffusive mixing trend.65 !! ** Action : (ua,va) after velocity 64 66 !!--------------------------------------------------------------------- 65 67 INTEGER , INTENT(in) :: kt ! ocean time-step index 66 68 REAL(wp), INTENT(in) :: p2dt ! vertical profile of tracer time-step 67 !! 68 INTEGER :: ji, jj, jk ! dummy loop indices 69 INTEGER :: ikbu, ikbv ! local integers 70 REAL(wp) :: z1_p2dt, zcoef, zzwi, zzws, zrhs ! local scalars 71 REAL(wp) :: ze3ua, ze3va 72 !!---------------------------------------------------------------------- 73 69 ! 70 INTEGER :: ji, jj, jk ! dummy loop indices 71 INTEGER :: ikbu, ikbv ! local integers 72 REAL(wp) :: zzwi, ze3ua ! local scalars 73 REAL(wp) :: zzws, ze3va ! - - 74 74 REAL(wp), POINTER, DIMENSION(:,:,:) :: zwi, zwd, zws 75 75 !!---------------------------------------------------------------------- … … 84 84 IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ ' 85 85 ! 86 I F( lk_vvl ) THEN ; r_vvl = 1._wp ! Variable volume indicator87 ELSE ; r_vvl = 0._wp86 If( ln_linssh ) THEN ; r_vvl = 0._wp ! non-linear free surface indicator 87 ELSE ; r_vvl = 1._wp 88 88 ENDIF 89 89 ENDIF 90 91 ! 0. Local constant initialization 92 ! -------------------------------- 93 z1_p2dt = 1._wp / p2dt ! inverse of the timestep 94 95 ! 1. Apply semi-implicit bottom friction 96 ! -------------------------------------- 90 ! 91 ! !== Time step dynamics ==! 92 ! 93 IF( ln_dynadv_vec .OR. ln_linssh ) THEN ! applied on velocity 94 DO jk = 1, jpkm1 95 ua(:,:,jk) = ( ub(:,:,jk) + p2dt * ua(:,:,jk) ) * umask(:,:,jk) 96 va(:,:,jk) = ( vb(:,:,jk) + p2dt * va(:,:,jk) ) * vmask(:,:,jk) 97 END DO 98 ELSE ! applied on thickness weighted velocity 99 DO jk = 1, jpkm1 100 ua(:,:,jk) = ( e3u_b(:,:,jk) * ub(:,:,jk) & 101 & + p2dt * e3u_n(:,:,jk) * ua(:,:,jk) ) / e3u_a(:,:,jk) * umask(:,:,jk) 102 va(:,:,jk) = ( e3v_b(:,:,jk) * vb(:,:,jk) & 103 & + p2dt * e3v_n(:,:,jk) * va(:,:,jk) ) / e3v_a(:,:,jk) * vmask(:,:,jk) 104 END DO 105 ENDIF 106 ! 107 ! !== Apply semi-implicit bottom friction ==! 108 ! 97 109 ! Only needed for semi-implicit bottom friction setup. The explicit 98 110 ! bottom friction has been included in "u(v)a" which act as the R.H.S 99 111 ! column vector of the tri-diagonal matrix equation 100 112 ! 101 102 113 IF( ln_bfrimp ) THEN 103 # if defined key_vectopt_loop104 DO jj = 1, 1105 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling)106 # else107 114 DO jj = 2, jpjm1 108 115 DO ji = 2, jpim1 109 # endif110 116 ikbu = mbku(ji,jj) ! ocean bottom level at u- and v-points 111 117 ikbv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 112 avmu(ji,jj,ikbu+1) = -bfrua(ji,jj) * fse3uw(ji,jj,ikbu+1) 113 avmv(ji,jj,ikbv+1) = -bfrva(ji,jj) * fse3vw(ji,jj,ikbv+1) 114 END DO 115 END DO 116 ENDIF 117 118 #if defined key_dynspg_ts 119 IF( ln_dynadv_vec .OR. .NOT. lk_vvl ) THEN ! applied on velocity 120 DO jk = 1, jpkm1 121 ua(:,:,jk) = ( ub(:,:,jk) + p2dt * ua(:,:,jk) ) * umask(:,:,jk) 122 va(:,:,jk) = ( vb(:,:,jk) + p2dt * va(:,:,jk) ) * vmask(:,:,jk) 123 END DO 124 ELSE ! applied on thickness weighted velocity 125 DO jk = 1, jpkm1 126 ua(:,:,jk) = ( ub(:,:,jk) * fse3u_b(:,:,jk) & 127 & + p2dt * ua(:,:,jk) * fse3u_n(:,:,jk) ) & 128 & / fse3u_a(:,:,jk) * umask(:,:,jk) 129 va(:,:,jk) = ( vb(:,:,jk) * fse3v_b(:,:,jk) & 130 & + p2dt * va(:,:,jk) * fse3v_n(:,:,jk) ) & 131 & / fse3v_a(:,:,jk) * vmask(:,:,jk) 132 END DO 133 ENDIF 134 135 IF ( ln_bfrimp .AND.lk_dynspg_ts ) THEN 136 ! remove barotropic velocities: 137 DO jk = 1, jpkm1 138 ua(:,:,jk) = (ua(:,:,jk) - ua_b(:,:)) * umask(:,:,jk) 139 va(:,:,jk) = (va(:,:,jk) - va_b(:,:)) * vmask(:,:,jk) 140 ENDDO 141 ! Add bottom stress due to barotropic component only: 142 DO jj = 2, jpjm1 118 avmu(ji,jj,ikbu+1) = -bfrua(ji,jj) * e3uw_n(ji,jj,ikbu+1) 119 avmv(ji,jj,ikbv+1) = -bfrva(ji,jj) * e3vw_n(ji,jj,ikbv+1) 120 END DO 121 END DO 122 IF ( ln_isfcav ) THEN 123 DO jj = 2, jpjm1 124 DO ji = 2, jpim1 125 ikbu = miku(ji,jj) ! ocean top level at u- and v-points 126 ikbv = mikv(ji,jj) ! (first wet ocean u- and v-points) 127 IF( ikbu >= 2 ) avmu(ji,jj,ikbu) = -tfrua(ji,jj) * e3uw_n(ji,jj,ikbu) 128 IF( ikbv >= 2 ) avmv(ji,jj,ikbv) = -tfrva(ji,jj) * e3vw_n(ji,jj,ikbv) 129 END DO 130 END DO 131 END IF 132 ENDIF 133 ! 134 ! With split-explicit free surface, barotropic stress is treated explicitly 135 ! Update velocities at the bottom. 136 ! J. Chanut: The bottom stress is computed considering after barotropic velocities, which does 137 ! not lead to the effective stress seen over the whole barotropic loop. 138 ! G. Madec : in linear free surface, e3u_a = e3u_n = e3u_0, so systematic use of e3u_a 139 IF( ln_bfrimp .AND. ln_dynspg_ts ) THEN 140 DO jk = 1, jpkm1 ! remove barotropic velocities 141 ua(:,:,jk) = ( ua(:,:,jk) - ua_b(:,:) ) * umask(:,:,jk) 142 va(:,:,jk) = ( va(:,:,jk) - va_b(:,:) ) * vmask(:,:,jk) 143 END DO 144 DO jj = 2, jpjm1 ! Add bottom/top stress due to barotropic component only 143 145 DO ji = fs_2, fs_jpim1 ! vector opt. 144 146 ikbu = mbku(ji,jj) ! ocean bottom level at u- and v-points 145 147 ikbv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 146 ze3ua = ( 1._wp - r_vvl ) * fse3u_n(ji,jj,ikbu) + r_vvl * fse3u_a(ji,jj,ikbu)147 ze3va = ( 1._wp - r_vvl ) * fse3v_n(ji,jj,ikbv) + r_vvl * fse3v_a(ji,jj,ikbv)148 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,ikbu) + r_vvl * e3u_a(ji,jj,ikbu) 149 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikbv) + r_vvl * e3v_a(ji,jj,ikbv) 148 150 ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + p2dt * bfrua(ji,jj) * ua_b(ji,jj) / ze3ua 149 151 va(ji,jj,ikbv) = va(ji,jj,ikbv) + p2dt * bfrva(ji,jj) * va_b(ji,jj) / ze3va 150 152 END DO 151 153 END DO 152 ENDIF 153 #endif 154 155 ! 2. Vertical diffusion on u 156 ! --------------------------- 154 IF( ln_isfcav ) THEN ! Ocean cavities (ISF) 155 DO jj = 2, jpjm1 156 DO ji = fs_2, fs_jpim1 ! vector opt. 157 ikbu = miku(ji,jj) ! top ocean level at u- and v-points 158 ikbv = mikv(ji,jj) ! (first wet ocean u- and v-points) 159 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,ikbu) + r_vvl * e3u_a(ji,jj,ikbu) 160 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,ikbv) + r_vvl * e3v_a(ji,jj,ikbv) 161 ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + p2dt * tfrua(ji,jj) * ua_b(ji,jj) / ze3ua 162 va(ji,jj,ikbv) = va(ji,jj,ikbv) + p2dt * tfrva(ji,jj) * va_b(ji,jj) / ze3va 163 END DO 164 END DO 165 END IF 166 ENDIF 167 ! 168 ! !== Vertical diffusion on u ==! 169 ! 157 170 ! Matrix and second member construction 158 171 ! bottom boundary condition: both zwi and zws must be masked as avmu can take … … 162 175 DO jj = 2, jpjm1 163 176 DO ji = fs_2, fs_jpim1 ! vector opt. 164 ze3ua = ( 1._wp - r_vvl ) * fse3u_n(ji,jj,jk) + r_vvl * fse3u_a(ji,jj,jk) ! after scale factor at T-point 165 zcoef = - p2dt / ze3ua 166 zzwi = zcoef * avmu (ji,jj,jk ) / fse3uw(ji,jj,jk ) 167 zwi(ji,jj,jk) = zzwi * umask(ji,jj,jk) 168 zzws = zcoef * avmu (ji,jj,jk+1) / fse3uw(ji,jj,jk+1) 169 zws(ji,jj,jk) = zzws * umask(ji,jj,jk+1) 170 zwd(ji,jj,jk) = 1._wp - zwi(ji,jj,jk) - zzws 177 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,jk) + r_vvl * e3u_a(ji,jj,jk) ! after scale factor at T-point 178 zzwi = - p2dt * avmu(ji,jj,jk ) / ( ze3ua * e3uw_n(ji,jj,jk ) ) 179 zzws = - p2dt * avmu(ji,jj,jk+1) / ( ze3ua * e3uw_n(ji,jj,jk+1) ) 180 zwi(ji,jj,jk) = zzwi * wumask(ji,jj,jk ) 181 zws(ji,jj,jk) = zzws * wumask(ji,jj,jk+1) 182 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 171 183 END DO 172 184 END DO … … 202 214 END DO 203 215 ! 204 DO jj = 2, jpjm1 !== second recurrence: SOLk = RHSk - Lk / Dk-1 Lk-1 == 205 DO ji = fs_2, fs_jpim1 ! vector opt. 206 ze3ua = ( 1._wp - r_vvl ) * fse3u_n(ji,jj,1) + r_vvl * fse3u_a(ji,jj,1) 207 #if defined key_dynspg_ts 216 DO jj = 2, jpjm1 !== second recurrence: SOLk = RHSk - Lk / Dk-1 Lk-1 ==! 217 DO ji = fs_2, fs_jpim1 ! vector opt. 218 ze3ua = ( 1._wp - r_vvl ) * e3u_n(ji,jj,1) + r_vvl * e3u_a(ji,jj,1) 208 219 ua(ji,jj,1) = ua(ji,jj,1) + p2dt * 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) ) & 209 & / ( ze3ua * rau0 ) 210 #else 211 ua(ji,jj,1) = ub(ji,jj,1) + p2dt *(ua(ji,jj,1) + 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) ) & 212 & / ( fse3u(ji,jj,1) * rau0 ) ) 213 #endif 220 & / ( ze3ua * rau0 ) * umask(ji,jj,1) 214 221 END DO 215 222 END DO 216 223 DO jk = 2, jpkm1 217 DO jj = 2, jpjm1 218 DO ji = fs_2, fs_jpim1 ! vector opt. 219 #if defined key_dynspg_ts 220 zrhs = ua(ji,jj,jk) ! zrhs=right hand side 221 #else 222 zrhs = ub(ji,jj,jk) + p2dt * ua(ji,jj,jk) 223 #endif 224 ua(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua(ji,jj,jk-1) 225 END DO 226 END DO 227 END DO 228 ! 229 DO jj = 2, jpjm1 !== thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk == 224 DO jj = 2, jpjm1 225 DO ji = fs_2, fs_jpim1 226 ua(ji,jj,jk) = ua(ji,jj,jk) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua(ji,jj,jk-1) 227 END DO 228 END DO 229 END DO 230 ! 231 DO jj = 2, jpjm1 !== thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk ==! 230 232 DO ji = fs_2, fs_jpim1 ! vector opt. 231 233 ua(ji,jj,jpkm1) = ua(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) … … 233 235 END DO 234 236 DO jk = jpk-2, 1, -1 235 DO jj = 2, jpjm1 236 DO ji = fs_2, fs_jpim1 ! vector opt.237 DO jj = 2, jpjm1 238 DO ji = fs_2, fs_jpim1 237 239 ua(ji,jj,jk) = ( ua(ji,jj,jk) - zws(ji,jj,jk) * ua(ji,jj,jk+1) ) / zwd(ji,jj,jk) 238 240 END DO 239 241 END DO 240 242 END DO 241 242 #if ! defined key_dynspg_ts 243 ! Normalization to obtain the general momentum trend ua 244 DO jk = 1, jpkm1 245 DO jj = 2, jpjm1 246 DO ji = fs_2, fs_jpim1 ! vector opt. 247 ua(ji,jj,jk) = ( ua(ji,jj,jk) - ub(ji,jj,jk) ) * z1_p2dt 248 END DO 249 END DO 250 END DO 251 #endif 252 253 ! 3. Vertical diffusion on v 254 ! --------------------------- 243 ! 244 ! !== Vertical diffusion on v ==! 245 ! 255 246 ! Matrix and second member construction 256 247 ! bottom boundary condition: both zwi and zws must be masked as avmv can take … … 260 251 DO jj = 2, jpjm1 261 252 DO ji = fs_2, fs_jpim1 ! vector opt. 262 ze3va = ( 1._wp - r_vvl ) * fse3v_n(ji,jj,jk) + r_vvl * fse3v_a(ji,jj,jk) ! after scale factor at T-point 263 zcoef = - p2dt / ze3va 264 zzwi = zcoef * avmv (ji,jj,jk ) / fse3vw(ji,jj,jk ) 265 zwi(ji,jj,jk) = zzwi * vmask(ji,jj,jk) 266 zzws = zcoef * avmv (ji,jj,jk+1) / fse3vw(ji,jj,jk+1) 267 zws(ji,jj,jk) = zzws * vmask(ji,jj,jk+1) 268 zwd(ji,jj,jk) = 1._wp - zwi(ji,jj,jk) - zzws 253 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,jk) + r_vvl * e3v_a(ji,jj,jk) ! after scale factor at T-point 254 zzwi = - p2dt * avmv (ji,jj,jk ) / ( ze3va * e3vw_n(ji,jj,jk ) ) 255 zzws = - p2dt * avmv (ji,jj,jk+1) / ( ze3va * e3vw_n(ji,jj,jk+1) ) 256 zwi(ji,jj,jk) = zzwi * wvmask(ji,jj,jk ) 257 zws(ji,jj,jk) = zzws * wvmask(ji,jj,jk+1) 258 zwd(ji,jj,jk) = 1._wp - zzwi - zzws 269 259 END DO 270 260 END DO … … 300 290 END DO 301 291 ! 302 DO jj = 2, jpjm1 !== second recurrence: SOLk = RHSk - Lk / Dk-1 Lk-1 == 303 DO ji = fs_2, fs_jpim1 ! vector opt. 304 ze3va = ( 1._wp - r_vvl ) * fse3v_n(ji,jj,1) + r_vvl * fse3v_a(ji,jj,1) 305 #if defined key_dynspg_ts 292 DO jj = 2, jpjm1 !== second recurrence: SOLk = RHSk - Lk / Dk-1 Lk-1 ==! 293 DO ji = fs_2, fs_jpim1 ! vector opt. 294 ze3va = ( 1._wp - r_vvl ) * e3v_n(ji,jj,1) + r_vvl * e3v_a(ji,jj,1) 306 295 va(ji,jj,1) = va(ji,jj,1) + p2dt * 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) ) & 307 296 & / ( ze3va * rau0 ) 308 #else309 va(ji,jj,1) = vb(ji,jj,1) + p2dt *(va(ji,jj,1) + 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) ) &310 & / ( fse3v(ji,jj,1) * rau0 ) )311 #endif312 297 END DO 313 298 END DO … … 315 300 DO jj = 2, jpjm1 316 301 DO ji = fs_2, fs_jpim1 ! vector opt. 317 #if defined key_dynspg_ts 318 zrhs = va(ji,jj,jk) ! zrhs=right hand side 319 #else 320 zrhs = vb(ji,jj,jk) + p2dt * va(ji,jj,jk) 321 #endif 322 va(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va(ji,jj,jk-1) 323 END DO 324 END DO 325 END DO 326 ! 327 DO jj = 2, jpjm1 !== third recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk == 302 va(ji,jj,jk) = va(ji,jj,jk) - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va(ji,jj,jk-1) 303 END DO 304 END DO 305 END DO 306 ! 307 DO jj = 2, jpjm1 !== third recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk ==! 328 308 DO ji = fs_2, fs_jpim1 ! vector opt. 329 309 va(ji,jj,jpkm1) = va(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) … … 331 311 END DO 332 312 DO jk = jpk-2, 1, -1 333 DO jj = 2, jpjm1 334 DO ji = fs_2, fs_jpim1 ! vector opt.313 DO jj = 2, jpjm1 314 DO ji = fs_2, fs_jpim1 335 315 va(ji,jj,jk) = ( va(ji,jj,jk) - zws(ji,jj,jk) * va(ji,jj,jk+1) ) / zwd(ji,jj,jk) 336 316 END DO 337 317 END DO 338 318 END DO 339 340 ! Normalization to obtain the general momentum trend va 341 #if ! defined key_dynspg_ts 342 DO jk = 1, jpkm1 343 DO jj = 2, jpjm1 344 DO ji = fs_2, fs_jpim1 ! vector opt. 345 va(ji,jj,jk) = ( va(ji,jj,jk) - vb(ji,jj,jk) ) * z1_p2dt 346 END DO 347 END DO 348 END DO 349 #endif 350 319 351 320 ! J. Chanut: Lines below are useless ? 352 321 !! restore bottom layer avmu(v) 322 !!gm I almost sure it is !!!! 353 323 IF( ln_bfrimp ) THEN 354 # if defined key_vectopt_loop 355 DO jj = 1, 1 356 DO ji = jpi+2, jpij-jpi-1 ! vector opt. (forced unrolling) 357 # else 358 DO jj = 2, jpjm1 359 DO ji = 2, jpim1 360 # endif 361 ikbu = mbku(ji,jj) ! ocean bottom level at u- and v-points 362 ikbv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 363 avmu(ji,jj,ikbu+1) = 0.e0 364 avmv(ji,jj,ikbv+1) = 0.e0 365 END DO 366 END DO 367 ENDIF 368 ! 369 CALL wrk_dealloc( jpi,jpj,jpk, zwi, zwd, zws) 370 ! 371 IF( nn_timing == 1 ) CALL timing_stop('dyn_zdf_imp') 324 DO jj = 2, jpjm1 325 DO ji = 2, jpim1 326 ikbu = mbku(ji,jj) ! ocean bottom level at u- and v-points 327 ikbv = mbkv(ji,jj) ! (deepest ocean u- and v-points) 328 avmu(ji,jj,ikbu+1) = 0._wp 329 avmv(ji,jj,ikbv+1) = 0._wp 330 END DO 331 END DO 332 IF (ln_isfcav) THEN 333 DO jj = 2, jpjm1 334 DO ji = 2, jpim1 335 ikbu = miku(ji,jj) ! ocean top level at u- and v-points 336 ikbv = mikv(ji,jj) ! (first wet ocean u- and v-points) 337 IF( ikbu > 1 ) avmu(ji,jj,ikbu) = 0._wp 338 IF( ikbv > 1 ) avmv(ji,jj,ikbv) = 0._wp 339 END DO 340 END DO 341 ENDIF 342 ENDIF 343 ! 344 CALL wrk_dealloc( jpi,jpj,jpk, zwi, zwd, zws) 345 ! 346 IF( nn_timing == 1 ) CALL timing_stop('dyn_zdf_imp') 372 347 ! 373 348 END SUBROUTINE dyn_zdf_imp
Note: See TracChangeset
for help on using the changeset viewer.