New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 8143 for branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90 – NEMO

Ignore:
Timestamp:
2017-06-06T15:55:44+02:00 (7 years ago)
Author:
gm
Message:

#1880 (HPC-09) - step-7: top/bottom drag computed at T-points, zdfbfr.F90 replaced by zdfdrg.F90 + changes in namelist

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_r7881_HPC09_ZDF/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfgls.F90

    r8093 r8143  
    88   !!            3.3  !  2010-10  (C. Bricaud)  Add in the reference 
    99   !!            4.0  !  2017-04  (G. Madec)  remove CPP keys & avm at t-point only  
     10   !!             -   !  2017-05  (G. Madec)  add top friction as boundary condition 
    1011   !!---------------------------------------------------------------------- 
    1112 
     
    1920   USE domvvl         ! ocean space and time domain : variable volume layer 
    2021   USE zdf_oce        ! ocean vertical physics 
    21 !!gm old 
    22    USE zdfbfr  , ONLY : rn_tfrz0, rn_bfrz0   ! top/bottom roughness 
    23 !!gm new 
    2422   USE zdfdrg  , ONLY : r_z0_top , r_z0_bot   ! top/bottom roughness 
    2523   USE zdfdrg  , ONLY : rCdU_top , rCdU_bot   ! top/bottom friction 
    26 !!gm 
    2724   USE sbc_oce        ! surface boundary condition: ocean 
    2825   USE phycst         ! physical constants 
     
    3229   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
    3330   USE lib_mpp        ! MPP manager 
    34    USE wrk_nemo       ! work arrays 
    3531   USE prtctl         ! Print control 
    3632   USE in_out_manager ! I/O manager 
     
    149145      REAL(wp) ::   prod, buoy, diss, zdiss, sm         !   -      - 
    150146      REAL(wp) ::   gh, gm, shr, dif, zsqen, zavt, zavm !   -      - 
     147      REAL(wp) ::   zmsku, zmskv                        !   -      - 
    151148      REAL(wp), DIMENSION(jpi,jpj)     ::   zdep 
    152149      REAL(wp), DIMENSION(jpi,jpj)     ::   zkar 
     
    158155      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwall_psi   ! Wall function use in the wb case (ln_sigpsi) 
    159156      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   psi         ! psi at time now 
    160       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   z_elem_a    ! element of the first  matrix diagonal 
    161       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   z_elem_b    ! element of the second matrix diagonal 
    162       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   z_elem_c    ! element of the third  matrix diagonal 
     157      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zd_lw, zd_up, zdiag   ! lower, upper  and diagonal of the matrix 
    163158      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zstt, zstm  ! stability function on tracer and momentum 
    164159      !!-------------------------------------------------------------------- 
     
    171166      ustar2_top (:,:) = 0._wp   ;   zwall_psi(:,:,:) = 0._wp 
    172167      ustar2_bot (:,:) = 0._wp 
    173        
    174  
    175168 
    176169      ! Compute surface, top and bottom friction at T-points 
     
    181174            ustar2_surf(ji,jj) = r1_rau0 * taum(ji,jj) * tmask(ji,jj,1) 
    182175            !    
    183 !!gm old 
    184             ! bottom friction (explicit before friction)         
    185             ! Note that we chose here not to bound the friction as in dynbfr)    
    186             ztx2 = (  bfrua(ji,jj)  * ub(ji,jj,mbku(ji,jj)) + bfrua(ji-1,jj) * ub(ji-1,jj,mbku(ji-1,jj))  )   &          
    187                & * ( 1._wp - 0.5_wp * umask(ji,jj,1) * umask(ji-1,jj,1)  )       
    188             zty2 = (  bfrva(ji,jj)  * vb(ji,jj,mbkv(ji,jj)) + bfrva(ji,jj-1) * vb(ji,jj-1,mbkv(ji,jj-1))  )   &          
    189                & * ( 1._wp - 0.5_wp * vmask(ji,jj,1) * vmask(ji,jj-1,1)  )       
    190             ustar2_bot(ji,jj) = SQRT( ztx2 * ztx2 + zty2 * zty2 ) * tmask(ji,jj,1)          
    191          END DO          
    192       END DO     
    193 !!gm new 
    194176!!gm Rq we may add here r_ke0(_top/_bot) ?  ==>> think about that... 
    195 !          ! bottom friction (explicit before friction) 
    196 !          zmsku = ( 2._wp - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
    197 !          zmskv = ( 2._wp - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) )     ! (CAUTION: CdU<0) 
    198 !          ustar2_bot(ji,jj) = - rCdU_bot(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mbkt(ji,jj))+ub(ji-1,jj,mbkt(ji,jj)) ) )**2 
    199 !             &                                         + ( zmskv*( vb(ji,jj,mbkt(ji,jj))+vb(ji,jj-1,mbkt(ji,jj)) ) )**2  ) 
    200 !       END DO 
    201 !    END DO 
    202 !    IF( ln_isfcav ) THEN       !top friction 
    203 !       DO jj = 2, jpjm1 
    204 !          DO ji = fs_2, fs_jpim1   ! vector opt. 
    205 !             zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 
    206 !             zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) )     ! (CAUTION: CdU<0) 
    207 !             ustar2_top(ji,jj) = - rCdU_top(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mikt(ji,jj))+ub(ji-1,jj,mikt(ji,jj)) ) )**2 
    208 !                &                                         + ( zmskv*( vb(ji,jj,mikt(ji,jj))+vb(ji,jj-1,mikt(ji,jj)) ) )**2  ) 
    209 !          END DO 
    210 !       END DO 
    211 !    ENDIF 
    212 !!gm 
     177          ! bottom friction (explicit before friction) 
     178          zmsku = ( 2._wp - umask(ji-1,jj,mbkt(ji,jj)) * umask(ji,jj,mbkt(ji,jj)) ) 
     179          zmskv = ( 2._wp - vmask(ji,jj-1,mbkt(ji,jj)) * vmask(ji,jj,mbkt(ji,jj)) )     ! (CAUTION: CdU<0) 
     180          ustar2_bot(ji,jj) = - rCdU_bot(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mbkt(ji,jj))+ub(ji-1,jj,mbkt(ji,jj)) ) )**2  & 
     181             &                                         + ( zmskv*( vb(ji,jj,mbkt(ji,jj))+vb(ji,jj-1,mbkt(ji,jj)) ) )**2  ) 
     182         END DO 
     183      END DO 
     184      IF( ln_isfcav ) THEN       !top friction 
     185         DO jj = 2, jpjm1 
     186            DO ji = fs_2, fs_jpim1   ! vector opt. 
     187               zmsku = ( 2. - umask(ji-1,jj,mikt(ji,jj)) * umask(ji,jj,mikt(ji,jj)) ) 
     188               zmskv = ( 2. - vmask(ji,jj-1,mikt(ji,jj)) * vmask(ji,jj,mikt(ji,jj)) )     ! (CAUTION: CdU<0) 
     189               ustar2_top(ji,jj) = - rCdU_top(ji,jj) * SQRT(  ( zmsku*( ub(ji,jj,mikt(ji,jj))+ub(ji-1,jj,mikt(ji,jj)) ) )**2  & 
     190                  &                                         + ( zmskv*( vb(ji,jj,mikt(ji,jj))+vb(ji,jj-1,mikt(ji,jj)) ) )**2  ) 
     191            END DO 
     192         END DO 
     193      ENDIF 
     194    
    213195      SELECT CASE ( nn_z0_met )      !==  Set surface roughness length  ==! 
    214196      CASE ( 0 )                          ! Constant roughness           
     
    261243      ! The surface boundary condition are set after 
    262244      ! The bottom boundary condition are also set after. In standard e(bottom)=0. 
    263       ! z_elem_b : diagonal z_elem_c : upper diagonal z_elem_a : lower diagonal 
     245      ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 
    264246      ! Warning : after this step, en : right hand side of the matrix 
    265247 
     
    296278               zcof = rfact_tke * tmask(ji,jj,jk) 
    297279               !                                               ! lower diagonal 
    298                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) ) 
     280               zd_lw(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) ) 
    299281               !                                               ! upper diagonal 
    300                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) ) 
     282               zd_up(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) ) 
    301283               !                                               ! diagonal 
    302                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)  
     284               zdiag(ji,jj,jk) = 1._wp - zd_lw(ji,jj,jk) - zd_up(ji,jj,jk)  + rdt * zdiss * wmask(ji,jj,jk)  
    303285               !                                               ! right hand side in en 
    304286               en(ji,jj,jk) = en(ji,jj,jk) + rdt * zesh2 * wmask(ji,jj,jk) 
     
    307289      END DO 
    308290      ! 
    309       z_elem_b(:,:,jpk) = 1._wp 
     291      zdiag(:,:,jpk) = 1._wp 
    310292      ! 
    311293      ! Set surface condition on zwall_psi (1 at the bottom) 
     
    318300      SELECT CASE ( nn_bc_surf ) 
    319301      ! 
    320       CASE ( 0 )             ! Dirichlet case 
     302      CASE ( 0 )             ! Dirichlet boundary condition (set e at k=1 & 2)  
    321303      ! First level 
    322       en(:,:,1) = rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1)**r2_3 
    323       en(:,:,1) = MAX(en(:,:,1), rn_emin)  
    324       z_elem_a(:,:,1) = en(:,:,1) 
    325       z_elem_c(:,:,1) = 0._wp 
    326       z_elem_b(:,:,1) = 1._wp 
     304      en   (:,:,1) = MAX(  rn_emin , rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1)**r2_3  ) 
     305      zd_lw(:,:,1) = en(:,:,1) 
     306      zd_up(:,:,1) = 0._wp 
     307      zdiag(:,:,1) = 1._wp 
    327308      !  
    328309      ! One level below 
    329       en(:,:,2) = rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1 * ((zhsro(:,:)+gdepw_n(:,:,2)) & 
    330          &               / zhsro(:,:) )**(1.5_wp*ra_sf))**(2._wp/3._wp) 
    331       en(:,:,2) = MAX(en(:,:,2), rn_emin ) 
    332       z_elem_a(:,:,2) = 0._wp  
    333       z_elem_c(:,:,2) = 0._wp 
    334       z_elem_b(:,:,2) = 1._wp 
    335       ! 
    336       ! 
    337       CASE ( 1 )             ! Neumann boundary condition on d(e)/dz 
     310      en   (:,:,2) =  MAX(  rc02r * ustar2_surf(:,:) * (  1._wp + rsbc_tke1 * ((zhsro(:,:)+gdepw_n(:,:,2))   & 
     311         &                 / zhsro(:,:) )**(1.5_wp*ra_sf)  )**(2._wp/3._wp)                      , rn_emin   ) 
     312      zd_lw(:,:,2) = 0._wp  
     313      zd_up(:,:,2) = 0._wp 
     314      zdiag(:,:,2) = 1._wp 
     315      ! 
     316      ! 
     317      CASE ( 1 )             ! Neumann boundary condition (set d(e)/dz) 
    338318      ! 
    339319      ! Dirichlet conditions at k=1 
    340       en(:,:,1)       = rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1)**r2_3 
    341       en(:,:,1)       = MAX(en(:,:,1), rn_emin)       
    342       z_elem_a(:,:,1) = en(:,:,1) 
    343       z_elem_c(:,:,1) = 0._wp 
    344       z_elem_b(:,:,1) = 1._wp 
     320      en   (:,:,1) = MAX(  rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1)**r2_3 , rn_emin  ) 
     321      zd_lw(:,:,1) = en(:,:,1) 
     322      zd_up(:,:,1) = 0._wp 
     323      zdiag(:,:,1) = 1._wp 
    345324      ! 
    346325      ! at k=2, set de/dz=Fw 
    347326      !cbr 
    348       z_elem_b(:,:,2) = z_elem_b(:,:,2) +  z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b 
    349       z_elem_a(:,:,2) = 0._wp 
    350       zkar(:,:)       = (rl_sf + (vkarmn-rl_sf)*(1.-exp(-rtrans*gdept_n(:,:,1)/zhsro(:,:)) )) 
    351       zflxs(:,:)      = rsbc_tke2 * ustar2_surf(:,:)**1.5_wp * zkar(:,:) & 
    352           &                       * ((zhsro(:,:)+gdept_n(:,:,1)) / zhsro(:,:) )**(1.5_wp*ra_sf) 
    353  
    354       en(:,:,2) = en(:,:,2) + zflxs(:,:)/e3w_n(:,:,2) 
     327      zdiag(:,:,2) = zdiag(:,:,2) +  zd_lw(:,:,2) ! Remove zd_lw from zdiag 
     328      zd_lw(:,:,2) = 0._wp 
     329      zkar (:,:)   = (rl_sf + (vkarmn-rl_sf)*(1.-exp(-rtrans*gdept_n(:,:,1)/zhsro(:,:)) )) 
     330      zflxs(:,:)   = rsbc_tke2 * ustar2_surf(:,:)**1.5_wp * zkar(:,:) & 
     331          &                    * (  ( zhsro(:,:)+gdept_n(:,:,1) ) / zhsro(:,:) )**(1.5_wp*ra_sf) 
     332!!gm why not   :                        * ( 1._wp + gdept_n(:,:,1) / zhsro(:,:) )**(1.5_wp*ra_sf) 
     333      en(:,:,2) = en(:,:,2) + zflxs(:,:) / e3w_n(:,:,2) 
    355334      ! 
    356335      ! 
     
    377356               ! Dirichlet condition applied at:  
    378357               !     Bottom level (ibot)      &      Just above it (ibotm1)    
    379                z_elem_a(ji,jj,ibot) = 0._wp   ;   z_elem_a(ji,jj,ibotm1) = 0._wp 
    380                z_elem_c(ji,jj,ibot) = 0._wp   ;   z_elem_c(ji,jj,ibotm1) = 0._wp 
    381                z_elem_b(ji,jj,ibot) = 1._wp   ;   z_elem_b(ji,jj,ibotm1) = 1._wp 
    382                en      (ji,jj,ibot) = z_en    ;   en      (ji,jj,ibotm1) = z_en 
    383             END DO 
    384          END DO 
    385 !!gm new 
    386 !         IF( ln_isfcav) THEN     ! top boundary   (ocean cavity) 
    387 !            DO jj = 2, jpjm1 
    388 !               DO ji = fs_2, fs_jpim1   ! vector opt. 
    389 !                  itop   = mikt(ji,jj)       ! k   top w-point 
    390 !                  itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one 
    391 !                  !                                                ! mask at the ocean surface points 
    392 !                  z_en = MAX( rc02r * ustar2_top(ji,jj), rn_emin ) * ( 1._wp - tmask(ji,jj,1) ) 
    393 !                  ! 
    394 !                  ! Dirichlet condition applied at:  
    395 !                  !     top level (itop)         &      Just below it (itopp1)   
    396 !                  z_elem_a(ji,jj,itop) = 0._wp   ;   z_elem_a(ji,jj,ipotm1) = 0._wp 
    397 !                  z_elem_c(ji,jj,itop) = 0._wp   ;   z_elem_c(ji,jj,itopp1) = 0._wp 
    398 !                  z_elem_b(ji,jj,itop) = 1._wp   ;   z_elem_b(ji,jj,itopp1) = 1._wp 
    399 !                  en      (ji,jj,itop) = zen     ;   en      (ji,jj,itopp1) = z_en 
    400 !               END DO 
    401 !            END DO 
    402 !         ENDIF 
    403 !!gm 
     358               zd_lw(ji,jj,ibot) = 0._wp   ;   zd_lw(ji,jj,ibotm1) = 0._wp 
     359               zd_up(ji,jj,ibot) = 0._wp   ;   zd_up(ji,jj,ibotm1) = 0._wp 
     360               zdiag(ji,jj,ibot) = 1._wp   ;   zdiag(ji,jj,ibotm1) = 1._wp 
     361               en   (ji,jj,ibot) = z_en    ;   en   (ji,jj,ibotm1) = z_en 
     362            END DO 
     363         END DO 
     364         ! 
     365         IF( ln_isfcav) THEN     ! top boundary   (ocean cavity) 
     366            DO jj = 2, jpjm1 
     367               DO ji = fs_2, fs_jpim1   ! vector opt. 
     368                  itop   = mikt(ji,jj)       ! k   top w-point 
     369                  itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one 
     370                  !                                                ! mask at the ocean surface points 
     371                  z_en = MAX( rc02r * ustar2_top(ji,jj), rn_emin ) * ( 1._wp - tmask(ji,jj,1) ) 
     372                  ! 
     373 !!gm TO BE VERIFIED !!! 
     374                  ! Dirichlet condition applied at:  
     375                  !     top level (itop)         &      Just below it (itopp1)    
     376                  zd_lw(ji,jj,itop) = 0._wp   ;   zd_lw(ji,jj,itopp1) = 0._wp 
     377                  zd_up(ji,jj,itop) = 0._wp   ;   zd_up(ji,jj,itopp1) = 0._wp 
     378                  zdiag(ji,jj,itop) = 1._wp   ;   zdiag(ji,jj,itopp1) = 1._wp 
     379                  en   (ji,jj,itop) = z_en    ;   en   (ji,jj,itopp1) = z_en 
     380               END DO 
     381            END DO 
     382         ENDIF 
    404383         ! 
    405384      CASE ( 1 )             ! Neumman boundary condition 
     
    415394               !     Bottom level (ibot)      &      Just above it (ibotm1)    
    416395               !         Dirichlet            !         Neumann 
    417                z_elem_a(ji,jj,ibot) = 0._wp   !   ! Remove z_elem_c from z_elem_b 
    418                z_elem_b(ji,jj,ibot) = 1._wp   ;   z_elem_b(ji,jj,ibotm1) = z_elem_b(ji,jj,ibotm1) + z_elem_c(ji,jj,ibotm1) 
    419                z_elem_c(ji,jj,ibot) = 0._wp   ;   z_elem_c(ji,jj,ibotm1) = 0._wp 
    420             END DO 
    421          END DO 
    422 !!gm new 
    423 !         IF( ln_isfcav) THEN     ! top boundary   (ocean cavity) 
    424 !            DO jj = 2, jpjm1 
    425 !               DO ji = fs_2, fs_jpim1   ! vector opt. 
    426 !                  itop   = mikt(ji,jj)       ! k   top w-point 
    427 !                  itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one 
    428 !                  !                                                ! mask at the ocean surface points 
    429 !                  z_en = MAX( rc02r * ustar2_top(ji,jj), rn_emin ) * ( 1._wp - tmask(ji,jj,1) ) 
    430 !                  ! 
    431 !                  ! Bottom level Dirichlet condition: 
    432 !                  !     Bottom level (ibot)      &      Just above it (ibotm1)    
    433 !                  !         Dirichlet            !         Neumann 
    434 !                  z_elem_a(ji,jj,itop) = 0._wp   !   ! Remove z_elem_c from z_elem_b 
    435 !                  z_elem_b(ji,jj,itop) = 1._wp   ;   z_elem_b(ji,jj,itopp1) = z_elem_b(ji,jj,itopp1) + z_elem_c(ji,jj,itopp1) 
    436 !                  z_elem_c(ji,jj,itop) = 0._wp   ;   z_elem_c(ji,jj,itopp1) = 0._wp 
    437 !               END DO 
    438 !            END DO 
    439 !         ENDIF 
    440 !!gm 
     396               zd_lw(ji,jj,ibot) = 0._wp   !   ! Remove zd_up from zdiag 
     397               zdiag(ji,jj,ibot) = 1._wp   ;   zdiag(ji,jj,ibotm1) = zdiag(ji,jj,ibotm1) + zd_up(ji,jj,ibotm1) 
     398               zd_up(ji,jj,ibot) = 0._wp   ;   zd_up(ji,jj,ibotm1) = 0._wp 
     399            END DO 
     400         END DO 
     401         IF( ln_isfcav) THEN     ! top boundary   (ocean cavity) 
     402            DO jj = 2, jpjm1 
     403               DO ji = fs_2, fs_jpim1   ! vector opt. 
     404                  itop   = mikt(ji,jj)       ! k   top w-point 
     405                  itopp1 = mikt(ji,jj) + 1   ! k+1 1st w-point below the top one 
     406                  !                                                ! mask at the ocean surface points 
     407                  z_en = MAX( rc02r * ustar2_top(ji,jj), rn_emin ) * ( 1._wp - tmask(ji,jj,1) ) 
     408                  ! 
     409                  ! Bottom level Dirichlet condition: 
     410                  !     Bottom level (ibot)      &      Just above it (ibotm1)    
     411                  !         Dirichlet            !         Neumann 
     412                  zd_lw(ji,jj,itop) = 0._wp   !   ! Remove zd_up from zdiag 
     413                  zdiag(ji,jj,itop) = 1._wp   ;   zdiag(ji,jj,itopp1) = zdiag(ji,jj,itopp1) + zd_up(ji,jj,itopp1) 
     414                  zd_up(ji,jj,itop) = 0._wp   ;   zd_up(ji,jj,itopp1) = 0._wp 
     415               END DO 
     416            END DO 
     417         ENDIF 
    441418         ! 
    442419      END SELECT 
     
    448425         DO jj = 2, jpjm1 
    449426            DO ji = fs_2, fs_jpim1    ! vector opt. 
    450                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) 
     427               zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 
    451428            END DO 
    452429         END DO 
     
    455432         DO jj = 2, jpjm1 
    456433            DO ji = fs_2, fs_jpim1    ! vector opt. 
    457                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) 
     434               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) 
    458435            END DO 
    459436         END DO 
     
    462439         DO jj = 2, jpjm1 
    463440            DO ji = fs_2, fs_jpim1    ! vector opt. 
    464                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) 
     441               en(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * en(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 
    465442            END DO 
    466443         END DO 
     
    519496      ! Resolution of a tridiagonal linear system by a "methode de chasse" 
    520497      ! computation from level 2 to jpkm1  (e(1) already computed and e(jpk)=0 ). 
    521       ! z_elem_b : diagonal z_elem_c : upper diagonal z_elem_a : lower diagonal 
     498      ! zdiag : diagonal zd_up : upper diagonal zd_lw : lower diagonal 
    522499      ! Warning : after this step, en : right hand side of the matrix 
    523500 
     
    543520               diss = rpsi2 * zratio * zwall(ji,jj,jk) * eps(ji,jj,jk) 
    544521               ! 
    545                zdir = 0.5_wp + SIGN( 0.5_wp, prod + buoy )   ! zdir =1(=0) if shear(ji,jj,jk)+buoy >0(<0) 
     522               zdir = 0.5_wp + SIGN( 0.5_wp, prod + buoy )     ! zdir =1(=0) if shear(ji,jj,jk)+buoy >0(<0) 
    546523               ! 
    547524               zesh2 = zdir * ( prod + buoy )          + (1._wp - zdir ) * prod                        ! production term 
     
    551528               zcof = rfact_psi * zwall_psi(ji,jj,jk) * tmask(ji,jj,jk) 
    552529               !                                               ! lower diagonal 
    553                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) ) 
     530               zd_lw(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) ) 
    554531               !                                               ! upper diagonal 
    555                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) ) 
     532               zd_up(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) ) 
    556533               !                                               ! diagonal 
    557                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) 
     534               zdiag(ji,jj,jk) = 1._wp - zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) + rdt * zdiss * wmask(ji,jj,jk) 
    558535               !                                               ! right hand side in psi 
    559536               psi(ji,jj,jk) = psi(ji,jj,jk) + rdt * zesh2 * wmask(ji,jj,jk) 
     
    562539      END DO 
    563540      ! 
    564       z_elem_b(:,:,jpk) = 1._wp 
     541      zdiag(:,:,jpk) = 1._wp 
    565542 
    566543      ! Surface boundary condition on psi 
     
    574551         zdep    (:,:)   = zhsro(:,:) * rl_sf ! Cosmetic 
    575552         psi     (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
    576          z_elem_a(:,:,1) = psi(:,:,1) 
    577          z_elem_c(:,:,1) = 0._wp 
    578          z_elem_b(:,:,1) = 1._wp 
     553         zd_lw(:,:,1) = psi(:,:,1) 
     554         zd_up(:,:,1) = 0._wp 
     555         zdiag(:,:,1) = 1._wp 
    579556         ! 
    580557         ! One level below 
     
    582559         zdep    (:,:)   = (zhsro(:,:) + gdepw_n(:,:,2)) * zkar(:,:) 
    583560         psi     (:,:,2) = rc0**rpp * en(:,:,2)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
    584          z_elem_a(:,:,2) = 0._wp 
    585          z_elem_c(:,:,2) = 0._wp 
    586          z_elem_b(:,:,2) = 1._wp 
     561         zd_lw(:,:,2) = 0._wp 
     562         zd_up(:,:,2) = 0._wp 
     563         zdiag(:,:,2) = 1._wp 
    587564         !  
    588565      CASE ( 1 )             ! Neumann boundary condition on d(psi)/dz 
     
    591568         zdep    (:,:)   = zhsro(:,:) * rl_sf 
    592569         psi     (:,:,1) = rc0**rpp * en(:,:,1)**rmm * zdep(:,:)**rnn * tmask(:,:,1) 
    593          z_elem_a(:,:,1) = psi(:,:,1) 
    594          z_elem_c(:,:,1) = 0._wp 
    595          z_elem_b(:,:,1) = 1._wp 
     570         zd_lw(:,:,1) = psi(:,:,1) 
     571         zd_up(:,:,1) = 0._wp 
     572         zdiag(:,:,1) = 1._wp 
    596573         ! 
    597574         ! Neumann condition at k=2 
    598          z_elem_b(:,:,2) = z_elem_b(:,:,2) +  z_elem_a(:,:,2) ! Remove z_elem_a from z_elem_b 
    599          z_elem_a(:,:,2) = 0._wp 
     575         zdiag(:,:,2) = zdiag(:,:,2) +  zd_lw(:,:,2) ! Remove zd_lw from zdiag 
     576         zd_lw(:,:,2) = 0._wp 
    600577         ! 
    601578         ! Set psi vertical flux at the surface: 
     
    613590      ! -------------------------------- 
    614591      ! 
    615       SELECT CASE ( nn_bc_bot ) 
     592!!gm should be done for ISF (top boundary cond.) 
     593!!gm so, totally new staff needed      ===>>> think about that ! 
     594! 
     595      SELECT CASE ( nn_bc_bot )     ! bottom boundary 
    616596      ! 
    617597      CASE ( 0 )             ! Dirichlet  
    618          !                      ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = vkarmn * rn_bfrz0 
     598         !                      ! en(ibot) = u*^2 / Co2 and hmxl_n(ibot) = vkarmn * r_z0_bot 
    619599         !                      ! Balance between the production and the dissipation terms 
    620600         DO jj = 2, jpjm1 
     
    622602               ibot   = mbkt(ji,jj) + 1      ! k   bottom level of w-point 
    623603               ibotm1 = mbkt(ji,jj)          ! k-1 bottom level of w-point but >=1 
    624                zdep(ji,jj) = vkarmn * rn_bfrz0 
     604               zdep(ji,jj) = vkarmn * r_z0_bot 
    625605               psi (ji,jj,ibot) = rc0**rpp * en(ji,jj,ibot)**rmm * zdep(ji,jj)**rnn 
    626                z_elem_a(ji,jj,ibot) = 0._wp 
    627                z_elem_c(ji,jj,ibot) = 0._wp 
    628                z_elem_b(ji,jj,ibot) = 1._wp 
     606               zd_lw(ji,jj,ibot) = 0._wp 
     607               zd_up(ji,jj,ibot) = 0._wp 
     608               zdiag(ji,jj,ibot) = 1._wp 
    629609               ! 
    630610               ! Just above last level, Dirichlet condition again (GOTM like) 
    631                zdep(ji,jj) = vkarmn * ( rn_bfrz0 + e3t_n(ji,jj,ibotm1) ) 
     611               zdep(ji,jj) = vkarmn * ( r_z0_bot + e3t_n(ji,jj,ibotm1) ) 
    632612               psi (ji,jj,ibotm1) = rc0**rpp * en(ji,jj,ibot  )**rmm * zdep(ji,jj)**rnn 
    633                z_elem_a(ji,jj,ibotm1) = 0._wp 
    634                z_elem_c(ji,jj,ibotm1) = 0._wp 
    635                z_elem_b(ji,jj,ibotm1) = 1._wp 
     613               zd_lw(ji,jj,ibotm1) = 0._wp 
     614               zd_up(ji,jj,ibotm1) = 0._wp 
     615               zdiag(ji,jj,ibotm1) = 1._wp 
    636616            END DO 
    637617         END DO 
     
    645625               ! 
    646626               ! Bottom level Dirichlet condition: 
    647                zdep(ji,jj) = vkarmn * rn_bfrz0 
     627               zdep(ji,jj) = vkarmn * r_z0_bot 
    648628               psi (ji,jj,ibot) = rc0**rpp * en(ji,jj,ibot)**rmm * zdep(ji,jj)**rnn 
    649629               ! 
    650                z_elem_a(ji,jj,ibot) = 0._wp 
    651                z_elem_c(ji,jj,ibot) = 0._wp 
    652                z_elem_b(ji,jj,ibot) = 1._wp 
     630               zd_lw(ji,jj,ibot) = 0._wp 
     631               zd_up(ji,jj,ibot) = 0._wp 
     632               zdiag(ji,jj,ibot) = 1._wp 
    653633               ! 
    654634               ! Just above last level: Neumann condition with flux injection 
    655                z_elem_b(ji,jj,ibotm1) = z_elem_b(ji,jj,ibotm1) + z_elem_c(ji,jj,ibotm1) ! Remove z_elem_c from z_elem_b 
    656                z_elem_c(ji,jj,ibotm1) = 0. 
     635               zdiag(ji,jj,ibotm1) = zdiag(ji,jj,ibotm1) + zd_up(ji,jj,ibotm1) ! Remove zd_up from zdiag 
     636               zd_up(ji,jj,ibotm1) = 0. 
    657637               ! 
    658638               ! Set psi vertical flux at the bottom: 
    659                zdep(ji,jj) = rn_bfrz0 + 0.5_wp*e3t_n(ji,jj,ibotm1) 
     639               zdep(ji,jj) = r_z0_bot + 0.5_wp*e3t_n(ji,jj,ibotm1) 
    660640               zflxb = rsbc_psi2 * ( p_avm(ji,jj,ibot) + p_avm(ji,jj,ibotm1) )   & 
    661641                  &  * (0.5_wp*(en(ji,jj,ibot)+en(ji,jj,ibotm1)))**rmm * zdep(ji,jj)**(rnn-1._wp) 
     
    672652         DO jj = 2, jpjm1 
    673653            DO ji = fs_2, fs_jpim1    ! vector opt. 
    674                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) 
     654               zdiag(ji,jj,jk) = zdiag(ji,jj,jk) - zd_lw(ji,jj,jk) * zd_up(ji,jj,jk-1) / zdiag(ji,jj,jk-1) 
    675655            END DO 
    676656         END DO 
     
    679659         DO jj = 2, jpjm1 
    680660            DO ji = fs_2, fs_jpim1    ! vector opt. 
    681                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) 
     661               zd_lw(ji,jj,jk) = psi(ji,jj,jk) - zd_lw(ji,jj,jk) / zdiag(ji,jj,jk-1) * zd_lw(ji,jj,jk-1) 
    682662            END DO 
    683663         END DO 
     
    686666         DO jj = 2, jpjm1 
    687667            DO ji = fs_2, fs_jpim1    ! vector opt. 
    688                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) 
     668               psi(ji,jj,jk) = ( zd_lw(ji,jj,jk) - zd_up(ji,jj,jk) * psi(ji,jj,jk+1) ) / zdiag(ji,jj,jk) 
    689669            END DO 
    690670         END DO 
     
    814794      zstm(:,:,1) = zstm(:,:,2) 
    815795 
    816 !!gm should be done for ISF (top boundary cond.) 
    817796      DO jj = 2, jpjm1 
    818797         DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    820799         END DO 
    821800      END DO 
     801!!gm should be done for ISF (top boundary cond.) 
     802!!gm so, totally new staff needed!!gm 
    822803 
    823804      ! Compute diffusivities/viscosities 
     
    904885         WRITE(numout,*) '      Type of closure                               nn_clos        = ', nn_clos 
    905886         WRITE(numout,*) '      Surface roughness (m)                         rn_hsro        = ', rn_hsro 
    906 !!gm old 
    907          WRITE(numout,*) '      top    roughness (m) (nambfr namelist)        rn_tfrz0       = ', rn_tfrz0 
    908          WRITE(numout,*) '      Bottom roughness (m) (nambfr namelist)        rn_bfrz0       = ', rn_bfrz0 
    909 !!gm new 
    910 !         WRITE(numout,*) '   Namelist namdrg_top/_bot used values:' 
    911 !         WRITE(numout,*) '      top    ocean cavity roughness (m)             rn_z0(_top)   = ', r_z0_top 
    912 !         WRITE(numout,*) '      Bottom seafloor     roughness (m)             rn_z0(_bot)   = ', r_z0_bot 
    913 !!gm 
     887         WRITE(numout,*) 
     888         WRITE(numout,*) '   Namelist namdrg_top/_bot:   used values:' 
     889         WRITE(numout,*) '      top    ocean cavity roughness (m)             rn_z0(_top)   = ', r_z0_top 
     890         WRITE(numout,*) '      Bottom seafloor     roughness (m)             rn_z0(_bot)   = ', r_z0_bot 
    914891         WRITE(numout,*) 
    915892      ENDIF 
Note: See TracChangeset for help on using the changeset viewer.