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 3072 for branches/2011/dev_NOC_2011_MERGE – NEMO

Ignore:
Timestamp:
2011-11-09T18:07:32+01:00 (12 years ago)
Author:
acc
Message:

Branch dev_NOC_2011_MERGE. #874. Step 10. Merge in changes from dev_r2802_NOCL_bfrimp branch (plus some additions and conflicit resolutions)

Location:
branches/2011/dev_NOC_2011_MERGE
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • branches/2011/dev_NOC_2011_MERGE/DOC/TexFiles/Chapters/Chap_ZDF.tex

    r2541 r3072  
    11% ================================================================ 
    2 % Chapter Ñ Vertical Ocean Physics (ZDF) 
     2% Chapter Vertical Ocean Physics (ZDF) 
    33% ================================================================ 
    44\chapter{Vertical Ocean Physics (ZDF)} 
     
    539539the clipping factor is of crucial importance for the entrainment depth predicted in  
    540540stably stratified situations, and that its value has to be chosen in accordance  
    541 with the algebraic model for the turbulent ßuxes. The clipping is only activated  
     541with the algebraic model for the turbulent fluxes. The clipping is only activated  
    542542if \np{ln\_length\_lim}=true, and the $c_{lim}$ is set to the \np{rn\_clim\_galp} value. 
    543543 
     
    981981reduced as necessary to ensure stability; these changes are not reported. 
    982982 
     983Limits on the bottom friction coefficient are not imposed if the user has elected to 
     984handle the bottom friction implicitly (see \S\ref{ZDF_bfr_imp}). The number of potential 
     985breaches of the explicit stability criterion are still reported for information purposes. 
     986 
     987% ------------------------------------------------------------------------------------------------------------- 
     988%       Implicit Bottom Friction 
     989% ------------------------------------------------------------------------------------------------------------- 
     990\subsection{Implicit Bottom Friction (\np{ln\_bfrimp}$=$\textit{T})} 
     991\label{ZDF_bfr_imp} 
     992 
     993An optional implicit form of bottom friction has been implemented to improve 
     994model stability. We recommend this option for shelf sea and coastal ocean applications, especially  
     995for split-explicit time splitting. This option can be invoked by setting \np{ln\_bfrimp}  
     996to \textit{true} in the \textit{nambfr} namelist. This option requires \np{ln\_zdfexp} to be \textit{false}  
     997in the \textit{namzdf} namelist.  
     998 
     999This implementation is realised in \mdl{dynzdf\_imp} and \mdl{dynspg\_ts}. In \mdl{dynzdf\_imp}, the  
     1000bottom boundary condition is implemented implicitly. 
     1001 
     1002\begin{equation} \label{Eq_dynzdf_bfr} 
     1003\left.{\left( {\frac{A^{vm} }{e_3 }\ \frac{\partial \textbf{U}_h}{\partial k}} \right)} \right|_{mbk} 
     1004    = \binom{c_{b}^{u}u^{n+1}_{mbk}}{c_{b}^{v}v^{n+1}_{mbk}} 
     1005\end{equation} 
     1006 
     1007where $mbk$ is the layer number of the bottom wet layer. superscript $n+1$ means the velocity used in the 
     1008friction formula is to be calculated, so, it is implicit. 
     1009 
     1010If split-explicit time splitting is used, care must be taken to avoid the double counting of 
     1011the bottom friction in the 2-D barotropic momentum equations. As NEMO only updates the barotropic  
     1012pressure gradient and Coriolis' forcing terms in the 2-D barotropic calculation, we need to remove 
     1013the bottom friction induced by these two terms which has been included in the 3-D momentum trend  
     1014and update it with the latest value. On the other hand, the bottom friction contributed by the 
     1015other terms (e.g. the advection term, viscosity term) has been included in the 3-D momentum equations 
     1016and should not be added in the 2-D barotropic mode. 
     1017 
     1018The implementation of the implicit bottom friction in \mdl{dynspg\_ts} is done in two steps as the 
     1019following: 
     1020 
     1021\begin{equation} \label{Eq_dynspg_ts_bfr1} 
     1022\frac{\textbf{U}_{med}-\textbf{U}^{m-1}}{2\Delta t}=-g\nabla\eta-f\textbf{k}\times\textbf{U}^{m}+c_{b} 
     1023\left(\textbf{U}_{med}-\textbf{U}^{m-1}\right) 
     1024\end{equation} 
     1025\begin{equation} \label{Eq_dynspg_ts_bfr2} 
     1026\frac{\textbf{U}^{m+1}-\textbf{U}_{med}}{2\Delta t}=\textbf{T}+ 
     1027\left(g\nabla\eta^{'}+f\textbf{k}\times\textbf{U}^{'}\right)- 
     10282\Delta t_{bc}c_{b}\left(g\nabla\eta^{'}+f\textbf{k}\times\textbf{u}_{b}\right) 
     1029\end{equation} 
     1030 
     1031where $\textbf{T}$ is the vertical integrated 3-D momentum trend. We assume the leap-frog time-stepping 
     1032is used here. $\Delta t$ is the barotropic mode time step and $\Delta t_{bc}$ is the baroclinic mode time step. 
     1033 $c_{b}$ is the friction coefficient. $\eta$ is the sea surface level calculated in the barotropic loops 
     1034while $\eta^{'}$ is the sea surface level used in the 3-D baroclinic mode. $\textbf{u}_{b}$ is the bottom 
     1035layer horizontal velocity. 
     1036 
     1037 
     1038 
     1039 
    9831040% ------------------------------------------------------------------------------------------------------------- 
    9841041%       Bottom Friction with split-explicit time splitting 
    9851042% ------------------------------------------------------------------------------------------------------------- 
    986 \subsection{Bottom Friction with split-explicit time splitting} 
     1043\subsection{Bottom Friction with split-explicit time splitting (\np{ln\_bfrimp}$=$\textit{F})} 
    9871044\label{ZDF_bfr_ts} 
    9881045 
     
    9931050{\key{dynspg\_flt}). Extra attention is required, however, when using  
    9941051split-explicit time stepping (\key{dynspg\_ts}). In this case the free surface  
    995 equation is solved with a small time step \np{nn\_baro}*\np{rn\_rdt}, while the three  
    996 dimensional prognostic variables are solved with a longer time step that is a  
    997 multiple of \np{rn\_rdt}. The trend in the barotropic momentum due to bottom  
     1052equation is solved with a small time step \np{rn\_rdt}/\np{nn\_baro}, while the three  
     1053dimensional prognostic variables are solved with the longer time step  
     1054of \np{rn\_rdt} seconds. The trend in the barotropic momentum due to bottom  
    9981055friction appropriate to this method is that given by the selected parameterisation  
    9991056($i.e.$ linear or non-linear bottom friction) computed with the evolving velocities  
     
    10181075\end{enumerate} 
    10191076 
    1020 Note that the use of an implicit formulation 
     1077Note that the use of an implicit formulation within the barotropic loop 
    10211078for the bottom friction trend means that any limiting of the bottom friction coefficient  
    10221079in \mdl{dynbfr} does not adversely affect the solution when using split-explicit time  
    10231080splitting. This is because the major contribution to bottom friction is likely to come from  
    1024 the barotropic component which uses the unrestricted value of the coefficient. 
    1025  
    1026 The implicit formulation takes the form: 
     1081the barotropic component which uses the unrestricted value of the coefficient. However, if the 
     1082limiting is thought to be having a major effect (a more likely prospect in coastal and shelf seas 
     1083applications) then the fully implicit form of the bottom friction should be used (see \S\ref{ZDF_bfr_imp} )  
     1084which can be selected by setting \np{ln\_bfrimp} $=$ \textit{true}. 
     1085 
     1086Otherwise, the implicit formulation takes the form: 
    10271087\begin{equation} \label{Eq_zdfbfr_implicitts} 
    10281088 \bar{U}^{t+ \rdt} = \; \left [ \bar{U}^{t-\rdt}\; + 2 \rdt\;RHS \right ] / \left [ 1 - 2 \rdt \;c_b^{u} / H_e \right ]   
     
    10911151The essential goal of the parameterization is to represent the momentum  
    10921152exchange between the barotropic tides and the unrepresented internal waves  
    1093 induced by the tidal ßow over rough topography in a stratified ocean.  
     1153induced by the tidal flow over rough topography in a stratified ocean.  
    10941154In the current version of \NEMO, the map is built from the output of  
    10951155the barotropic global ocean tide model MOG2D-G \citep{Carrere_Lyard_GRL03}. 
  • branches/2011/dev_NOC_2011_MERGE/DOC/TexFiles/Namelist/nambfr

    r2540 r3072  
    99   ln_bfr2d    = .false.   !  horizontal variation of the bottom friction coef (read a 2D mask file ) 
    1010   rn_bfrien   =    50.    !  local multiplying factor of bfr (ln_bfr2d=T) 
     11   ln_bfrimp   = .false.   !  implicit bottom friction (requires ln_zdfexp = .false. if true) 
    1112/ 
  • branches/2011/dev_NOC_2011_MERGE/NEMOGCM/CONFIG/GYRE/EXP00/namelist

    r3009 r3072  
    417417   ln_bfr2d    = .false.   !  horizontal variation of the bottom friction coef (read a 2D mask file ) 
    418418   rn_bfrien   =    50.    !  local multiplying factor of bfr (ln_bfr2d = .true.) 
     419   ln_bfrimp   = .false.   !  implicit bottom friction (requires ln_zdfexp = .false. if true) 
    419420/ 
    420421!----------------------------------------------------------------------- 
  • branches/2011/dev_NOC_2011_MERGE/NEMOGCM/CONFIG/ORCA2_LIM/EXP00/1_namelist

    r2735 r3072  
    417417   ln_bfr2d    = .false.   !  horizontal variation of the bottom friction coef (read a 2D mask file ) 
    418418   rn_bfrien   =    50.    !  local multiplying factor of bfr (ln_bfr2d=T) 
     419   ln_bfrimp   = .false.   !  implicit bottom friction (requires ln_zdfexp = .false. if true) 
    419420/ 
    420421!----------------------------------------------------------------------- 
  • branches/2011/dev_NOC_2011_MERGE/NEMOGCM/CONFIG/ORCA2_LIM/EXP00/namelist

    r3044 r3072  
    417417   ln_bfr2d    = .false.   !  horizontal variation of the bottom friction coef (read a 2D mask file ) 
    418418   rn_bfrien   =    50.    !  local multiplying factor of bfr (ln_bfr2d=T) 
     419   ln_bfrimp   = .false.   !  implicit bottom friction (requires ln_zdfexp = .false. if true) 
    419420/ 
    420421!----------------------------------------------------------------------- 
  • branches/2011/dev_NOC_2011_MERGE/NEMOGCM/CONFIG/ORCA2_OFF_PISCES/EXP00/namelist

    r3009 r3072  
    417417   ln_bfr2d    =   .false. !  horizontal variation of the bottom friction coef (read a 2D mask file ) 
    418418   rn_bfrien   =    50.    !  local multiplying factor of bfr (ln_bfr2d = .true.) 
     419   ln_bfrimp   = .false.   !  implicit bottom friction (requires ln_zdfexp = .false. if true) 
    419420/ 
    420421!----------------------------------------------------------------------- 
  • branches/2011/dev_NOC_2011_MERGE/NEMOGCM/CONFIG/POMME/EXP00/namelist

    r2986 r3072  
    417417   ln_bfr2d    = .false.   !  horizontal variation of the bottom friction coef (read a 2D mask file ) 
    418418   rn_bfrien   =    50.    !  local multiplying factor of bfr (ln_bfr2d=T) 
     419   ln_bfrimp   = .false.   !  implicit bottom friction (requires ln_zdfexp = .false. if true) 
    419420/ 
    420421!----------------------------------------------------------------------- 
  • branches/2011/dev_NOC_2011_MERGE/NEMOGCM/NEMO/OPA_SRC/DYN/dynbfr.F90

    r2715 r3072  
    1313   USE dom_oce         ! ocean space and time domain variables  
    1414   USE zdf_oce         ! ocean vertical physics variables 
     15   USE zdfbfr          ! ocean bottom friction variables 
    1516   USE trdmod          ! ocean active dynamics and tracers trends  
    1617   USE trdmod_oce      ! ocean variables trends 
     
    5152      !!--------------------------------------------------------------------- 
    5253      ! 
    53       zm1_2dt = - 1._wp / ( 2._wp * rdt ) 
     54      IF( .not. ln_bfrimp) THEN     ! only for explicit bottom friction form 
     55                                    ! implicit bfr is implemented in dynzdf_imp 
     56                                    ! H. Liu,  Sept. 2011 
    5457 
    55       IF( l_trddyn )   THEN                      ! temporary save of ua and va trends 
    56          ztrduv(:,:,:,1) = ua(:,:,:) 
    57          ztrduv(:,:,:,2) = va(:,:,:) 
    58       ENDIF 
     58        zm1_2dt = - 1._wp / ( 2._wp * rdt ) 
     59 
     60        IF( l_trddyn )   THEN                      ! temporary save of ua and va trends 
     61           ztrduv(:,:,:,1) = ua(:,:,:) 
     62           ztrduv(:,:,:,2) = va(:,:,:) 
     63        ENDIF 
     64 
    5965 
    6066# if defined key_vectopt_loop 
    61       DO jj = 1, 1 
    62          DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling) 
     67        DO jj = 1, 1 
     68           DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling) 
    6369# else 
    64       DO jj = 2, jpjm1 
    65          DO ji = 2, jpim1 
     70        DO jj = 2, jpjm1 
     71           DO ji = 2, jpim1 
    6672# endif 
    67             ikbu = mbku(ji,jj)          ! deepest ocean u- & v-levels 
    68             ikbv = mbkv(ji,jj) 
    69             ! 
    70             ! Apply stability criteria on absolute value  : abs(bfr/e3) < 1/(2dt) => bfr/e3 > -1/(2dt) 
    71             ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + MAX(  bfrua(ji,jj) / fse3u(ji,jj,ikbu) , zm1_2dt  ) * ub(ji,jj,ikbu) 
    72             va(ji,jj,ikbv) = va(ji,jj,ikbv) + MAX(  bfrva(ji,jj) / fse3v(ji,jj,ikbv) , zm1_2dt  ) * vb(ji,jj,ikbv) 
    73          END DO 
    74       END DO 
     73              ikbu = mbku(ji,jj)          ! deepest ocean u- & v-levels 
     74              ikbv = mbkv(ji,jj) 
     75              ! 
     76              ! Apply stability criteria on absolute value  : abs(bfr/e3) < 1/(2dt) => bfr/e3 > -1/(2dt) 
     77              ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + MAX(  bfrua(ji,jj) / fse3u(ji,jj,ikbu) , zm1_2dt  ) * ub(ji,jj,ikbu) 
     78              va(ji,jj,ikbv) = va(ji,jj,ikbv) + MAX(  bfrva(ji,jj) / fse3v(ji,jj,ikbv) , zm1_2dt  ) * vb(ji,jj,ikbv) 
     79           END DO 
     80        END DO 
    7581 
    76       ! 
    77       IF( l_trddyn )   THEN                      ! save the vertical diffusive trends for further diagnostics 
    78          ztrduv(:,:,:,1) = ua(:,:,:) - ztrduv(:,:,:,1) 
    79          ztrduv(:,:,:,2) = va(:,:,:) - ztrduv(:,:,:,2) 
    80          CALL trd_mod( ztrduv(:,:,:,1), ztrduv(:,:,:,2), jpdyn_trd_bfr, 'DYN', kt ) 
    81       ENDIF 
    82       !                                          ! print mean trends (used for debugging) 
    83       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' bfr  - Ua: ', mask1=umask,               & 
    84          &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
    85       ! 
     82        ! 
     83        IF( l_trddyn )   THEN                      ! save the vertical diffusive trends for further diagnostics 
     84           ztrduv(:,:,:,1) = ua(:,:,:) - ztrduv(:,:,:,1) 
     85           ztrduv(:,:,:,2) = va(:,:,:) - ztrduv(:,:,:,2) 
     86           CALL trd_mod( ztrduv(:,:,:,1), ztrduv(:,:,:,2), jpdyn_trd_bfr, 'DYN', kt ) 
     87        ENDIF 
     88        !                                          ! print mean trends (used for debugging) 
     89        IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' bfr  - Ua: ', mask1=umask,               & 
     90           &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     91        ! 
     92      ENDIF     ! end explicit bottom friction 
    8693   END SUBROUTINE dyn_bfr 
    8794 
  • branches/2011/dev_NOC_2011_MERGE/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90

    r3008 r3072  
    119119      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices 
    120120      INTEGER  ::   icycle           ! local scalar 
    121       REAL(wp) ::   zraur, zcoef, z2dt_e, z1_2dt_b     ! local scalars 
    122       REAL(wp) ::   z1_8, zx1, zy1                   !   -      - 
    123       REAL(wp) ::   z1_4, zx2, zy2                   !   -      - 
    124       REAL(wp) ::   zu_spg, zu_cor, zu_sld, zu_asp   !   -      - 
    125       REAL(wp) ::   zv_spg, zv_cor, zv_sld, zv_asp   !   -      - 
     121      INTEGER  ::   ikbu, ikbv       ! local scalar 
     122      REAL(wp) ::   zraur, zcoef, z2dt_e, z1_2dt_b, z2dt_bf   ! local scalars 
     123      REAL(wp) ::   z1_8, zx1, zy1                            !   -      - 
     124      REAL(wp) ::   z1_4, zx2, zy2                            !   -      - 
     125      REAL(wp) ::   zu_spg, zu_cor, zu_sld, zu_asp            !   -      - 
     126      REAL(wp) ::   zv_spg, zv_cor, zv_sld, zv_asp            !   -      - 
     127      REAL(wp) ::   ua_btm, va_btm                            !   -      - 
    126128      !!---------------------------------------------------------------------- 
    127129 
     
    147149         hvr_e (:,:) = hvr  (:,:) 
    148150         IF( ln_dynvor_een ) THEN 
    149             ftne(1,:) = 0.e0   ;   ftnw(1,:) = 0.e0   ;   ftse(1,:) = 0.e0   ;   ftsw(1,:) = 0.e0 
     151            ftne(1,:) = 0._wp   ;   ftnw(1,:) = 0._wp   ;   ftse(1,:) = 0._wp   ;   ftsw(1,:) = 0._wp 
    150152            DO jj = 2, jpj 
    151153               DO ji = fs_2, jpi   ! vector opt. 
    152                   ftne(ji,jj) = ( ff(ji-1,jj  ) + ff(ji  ,jj  ) + ff(ji  ,jj-1) ) / 3. 
    153                   ftnw(ji,jj) = ( ff(ji-1,jj-1) + ff(ji-1,jj  ) + ff(ji  ,jj  ) ) / 3. 
    154                   ftse(ji,jj) = ( ff(ji  ,jj  ) + ff(ji  ,jj-1) + ff(ji-1,jj-1) ) / 3. 
    155                   ftsw(ji,jj) = ( ff(ji  ,jj-1) + ff(ji-1,jj-1) + ff(ji-1,jj  ) ) / 3. 
     154                  ftne(ji,jj) = ( ff(ji-1,jj  ) + ff(ji  ,jj  ) + ff(ji  ,jj-1) ) / 3._wp 
     155                  ftnw(ji,jj) = ( ff(ji-1,jj-1) + ff(ji-1,jj  ) + ff(ji  ,jj  ) ) / 3._wp 
     156                  ftse(ji,jj) = ( ff(ji  ,jj  ) + ff(ji  ,jj-1) + ff(ji-1,jj-1) ) / 3._wp 
     157                  ftsw(ji,jj) = ( ff(ji  ,jj-1) + ff(ji-1,jj-1) + ff(ji-1,jj  ) ) / 3._wp 
    156158               END DO 
    157159            END DO 
     
    160162      ENDIF 
    161163 
    162       !                                   !* Local constant initialization 
    163       z1_2dt_b = 1._wp / ( 2.0_wp * rdt )                               ! baroclinic time step 
    164       IF( neuler == 0 .AND. kt == nit000 )   z1_2dt_b = 1.0_wp / rdt    ! baroclinic time step (starting with euler timestep) 
    165       z1_8 = 0.5 * 0.25                                     ! coefficient for vorticity estimates 
    166       z1_4 = 0.5 * 0.5 
    167       zraur  = 1. / rau0                                    ! 1 / volumic mass 
    168       ! 
    169       zhdiv(:,:) = 0.e0                                     ! barotropic divergence 
    170       zu_sld = 0.e0   ;   zu_asp = 0.e0                     ! tides trends (lk_tide=F) 
    171       zv_sld = 0.e0   ;   zv_asp = 0.e0 
     164      !                                                     !* Local constant initialization 
     165      z1_2dt_b = 1._wp / ( 2.0_wp * rdt )                   ! reciprocal of baroclinic time step 
     166      IF( neuler == 0 .AND. kt == nit000 )   z1_2dt_b = 1.0_wp / rdt    ! reciprocal of baroclinic  
     167                                                                        ! time step (euler timestep) 
     168      z1_8     = 0.125_wp                                   ! coefficient for vorticity estimates 
     169      z1_4     = 0.25_wp         
     170      zraur    = 1._wp / rau0                               ! 1 / volumic mass 
     171      ! 
     172      zhdiv(:,:) = 0._wp                                    ! barotropic divergence 
     173      zu_sld = 0._wp   ;   zu_asp = 0._wp                   ! tides trends (lk_tide=F) 
     174      zv_sld = 0._wp   ;   zv_asp = 0._wp 
     175 
     176      IF( kt == nit000 .AND. neuler == 0) THEN              ! for implicit bottom friction 
     177        z2dt_bf = rdt 
     178      ELSE 
     179        z2dt_bf = 2.0_wp * rdt 
     180      ENDIF 
    172181 
    173182      ! ----------------------------------------------------------------------------- 
     
    177186      !                                   !* e3*d/dt(Ua), e3*Ub, e3*Vn (Vertically integrated) 
    178187      !                                   ! -------------------------- 
    179       zua(:,:) = 0.e0   ;   zun(:,:) = 0.e0   ;   ub_b(:,:) = 0.e0 
    180       zva(:,:) = 0.e0   ;   zvn(:,:) = 0.e0   ;   vb_b(:,:) = 0.e0 
     188      zua(:,:) = 0._wp   ;   zun(:,:) = 0._wp   ;   ub_b(:,:) = 0._wp 
     189      zva(:,:) = 0._wp   ;   zvn(:,:) = 0._wp   ;   vb_b(:,:) = 0._wp 
    181190      ! 
    182191      DO jk = 1, jpkm1 
     
    196205               ! 
    197206#if defined key_vvl 
    198 !              ub_b(ji,jj) = ub_b(ji,jj) + (fse3u_0(ji,jj,jk)*(1.+sshu_b(ji,jj)*muu(ji,jj,jk)))* ub(ji,jj,jk)  
    199 !              vb_b(ji,jj) = vb_b(ji,jj) + (fse3v_0(ji,jj,jk)*(1.+sshv_b(ji,jj)*muv(ji,jj,jk)))* vb(ji,jj,jk)    
    200207               ub_b(ji,jj) = ub_b(ji,jj) + fse3u_b(ji,jj,jk)* ub(ji,jj,jk)   *umask(ji,jj,jk)  
    201208               vb_b(ji,jj) = vb_b(ji,jj) + fse3v_b(ji,jj,jk)* vb(ji,jj,jk)   *vmask(ji,jj,jk) 
     
    273280      DO jj = 2, jpjm1                             ! Remove coriolis term (and possibly spg) from barotropic trend 
    274281         DO ji = fs_2, fs_jpim1 
    275             zua(ji,jj) = zua(ji,jj) - zcu(ji,jj) 
    276             zva(ji,jj) = zva(ji,jj) - zcv(ji,jj) 
    277          END DO 
     282             zua(ji,jj) = zua(ji,jj) - zcu(ji,jj) 
     283             zva(ji,jj) = zva(ji,jj) - zcv(ji,jj) 
     284          END DO 
    278285      END DO 
    279286 
     
    282289      !                                             ! from the barotropic transport trend 
    283290      zcoef = -1._wp * z1_2dt_b 
     291 
     292      IF(ln_bfrimp) THEN 
     293      !                                   ! Remove the bottom stress trend from 3-D sea surface level gradient 
     294      !                                   ! and Coriolis forcing in case of 3D semi-implicit bottom friction  
     295        DO jj = 2, jpjm1          
     296           DO ji = fs_2, fs_jpim1 
     297              ikbu = mbku(ji,jj) 
     298              ikbv = mbkv(ji,jj) 
     299              ua_btm = zcu(ji,jj) * z2dt_bf * hur(ji,jj) * umask (ji,jj,ikbu) 
     300              va_btm = zcv(ji,jj) * z2dt_bf * hvr(ji,jj) * vmask (ji,jj,ikbv) 
     301 
     302              zua(ji,jj) = zua(ji,jj) - bfrua(ji,jj) * ua_btm 
     303              zva(ji,jj) = zva(ji,jj) - bfrva(ji,jj) * va_btm 
     304           END DO 
     305        END DO 
     306 
     307      ELSE 
     308 
    284309# if defined key_vectopt_loop 
    285       DO jj = 1, 1 
    286          DO ji = 1, jpij-jpi   ! vector opt. (forced unrolling) 
     310        DO jj = 1, 1 
     311           DO ji = 1, jpij-jpi   ! vector opt. (forced unrolling) 
    287312# else 
    288       DO jj = 2, jpjm1 
    289          DO ji = 2, jpim1 
     313        DO jj = 2, jpjm1 
     314           DO ji = 2, jpim1 
    290315# endif 
    291316            ! Apply stability criteria for bottom friction 
    292317            !RBbug for vvl and external mode we may need to use varying fse3 
    293318            !!gm  Rq: the bottom e3 present the smallest variation, the use of e3u_0 is not a big approx. 
    294             zbfru(ji,jj) = MAX(  bfrua(ji,jj) , fse3u(ji,jj,mbku(ji,jj)) * zcoef  ) 
    295             zbfrv(ji,jj) = MAX(  bfrva(ji,jj) , fse3v(ji,jj,mbkv(ji,jj)) * zcoef  ) 
    296          END DO 
    297       END DO 
    298  
    299       IF( lk_vvl ) THEN 
    300          DO jj = 2, jpjm1 
    301             DO ji = fs_2, fs_jpim1   ! vector opt. 
    302                zua(ji,jj) = zua(ji,jj) - zbfru(ji,jj) * ub_b(ji,jj)   & 
    303                   &       / ( hu_0(ji,jj) + sshu_b(ji,jj) + 1.e0 - umask(ji,jj,1) ) 
    304                zva(ji,jj) = zva(ji,jj) - zbfrv(ji,jj) * vb_b(ji,jj)   & 
    305                   &       / ( hv_0(ji,jj) + sshv_b(ji,jj) + 1.e0 - vmask(ji,jj,1) ) 
    306             END DO 
    307          END DO 
    308       ELSE 
    309          DO jj = 2, jpjm1 
    310             DO ji = fs_2, fs_jpim1   ! vector opt. 
    311                zua(ji,jj) = zua(ji,jj) - zbfru(ji,jj) * ub_b(ji,jj) * hur(ji,jj) 
    312                zva(ji,jj) = zva(ji,jj) - zbfrv(ji,jj) * vb_b(ji,jj) * hvr(ji,jj) 
    313             END DO 
    314          END DO 
    315       ENDIF 
    316  
     319              zbfru(ji,jj) = MAX(  bfrua(ji,jj) , fse3u(ji,jj,mbku(ji,jj)) * zcoef  ) 
     320              zbfrv(ji,jj) = MAX(  bfrva(ji,jj) , fse3v(ji,jj,mbkv(ji,jj)) * zcoef  ) 
     321           END DO 
     322        END DO 
     323 
     324        IF( lk_vvl ) THEN 
     325           DO jj = 2, jpjm1 
     326              DO ji = fs_2, fs_jpim1   ! vector opt. 
     327                 zua(ji,jj) = zua(ji,jj) - zbfru(ji,jj) * ub_b(ji,jj)   & 
     328                    &       / ( hu_0(ji,jj) + sshu_b(ji,jj) + 1._wp - umask(ji,jj,1) ) 
     329                 zva(ji,jj) = zva(ji,jj) - zbfrv(ji,jj) * vb_b(ji,jj)   & 
     330                    &       / ( hv_0(ji,jj) + sshv_b(ji,jj) + 1._wp - vmask(ji,jj,1) ) 
     331              END DO 
     332           END DO 
     333        ELSE 
     334           DO jj = 2, jpjm1 
     335              DO ji = fs_2, fs_jpim1   ! vector opt. 
     336                 zua(ji,jj) = zua(ji,jj) - zbfru(ji,jj) * ub_b(ji,jj) * hur(ji,jj) 
     337                 zva(ji,jj) = zva(ji,jj) - zbfrv(ji,jj) * vb_b(ji,jj) * hvr(ji,jj) 
     338              END DO 
     339           END DO 
     340        ENDIF 
     341      END IF    ! end (ln_bfrimp) 
     342 
     343                     
    317344      !                                   !* d/dt(Ua), Ub, Vn (Vertical mean velocity) 
    318345      !                                   ! --------------------------  
     
    321348      ! 
    322349      IF( lk_vvl ) THEN 
    323          ub_b(:,:) = ub_b(:,:) * umask(:,:,1) / ( hu_0(:,:) + sshu_b(:,:) + 1.e0 - umask(:,:,1) ) 
    324          vb_b(:,:) = vb_b(:,:) * vmask(:,:,1) / ( hv_0(:,:) + sshv_b(:,:) + 1.e0 - vmask(:,:,1) ) 
     350         ub_b(:,:) = ub_b(:,:) * umask(:,:,1) / ( hu_0(:,:) + sshu_b(:,:) + 1._wp - umask(:,:,1) ) 
     351         vb_b(:,:) = vb_b(:,:) * vmask(:,:,1) / ( hv_0(:,:) + sshv_b(:,:) + 1._wp - vmask(:,:,1) ) 
    325352      ELSE 
    326353         ub_b(:,:) = ub_b(:,:) * hur(:,:) 
     
    358385      ! set ssh corrections to 0 
    359386      ! ssh corrections are applied to normal velocities (Flather's algorithm) and averaged over the barotropic loop 
    360       IF( lp_obc_east  )   sshfoe_b(:,:) = 0.e0 
    361       IF( lp_obc_west  )   sshfow_b(:,:) = 0.e0 
    362       IF( lp_obc_south )   sshfos_b(:,:) = 0.e0 
    363       IF( lp_obc_north )   sshfon_b(:,:) = 0.e0 
     387      IF( lp_obc_east  )   sshfoe_b(:,:) = 0._wp 
     388      IF( lp_obc_west  )   sshfow_b(:,:) = 0._wp 
     389      IF( lp_obc_south )   sshfos_b(:,:) = 0._wp 
     390      IF( lp_obc_north )   sshfon_b(:,:) = 0._wp 
    364391#endif 
    365392 
     
    377404         !                                                !* after ssh_e 
    378405         !                                                !  ----------- 
    379          DO jj = 2, jpjm1                                      ! Horizontal divergence of barotropic transports 
     406         DO jj = 2, jpjm1                                 ! Horizontal divergence of barotropic transports 
    380407            DO ji = fs_2, fs_jpim1   ! vector opt. 
    381408               zhdiv(ji,jj) = (   e2u(ji  ,jj) * zun_e(ji  ,jj) * hu_e(ji  ,jj)     & 
     
    389416         !                                                     ! OBC : zhdiv must be zero behind the open boundary 
    390417!!  mpp remark: The zeroing of hdiv can probably be extended to 1->jpi/jpj for the correct row/column 
    391          IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1  ) = 0.e0      ! east 
    392          IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1  ) = 0.e0      ! west 
    393          IF( lp_obc_north )   zhdiv(nin0  :nin1  ,njn0p1:njn1p1) = 0.e0      ! north 
    394          IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1  ) = 0.e0      ! south 
     418         IF( lp_obc_east  )   zhdiv(nie0p1:nie1p1,nje0  :nje1  ) = 0._wp      ! east 
     419         IF( lp_obc_west  )   zhdiv(niw0  :niw1  ,njw0  :njw1  ) = 0._wp      ! west 
     420         IF( lp_obc_north )   zhdiv(nin0  :nin1  ,njn0p1:njn1p1) = 0._wp      ! north 
     421         IF( lp_obc_south )   zhdiv(nis0  :nis1  ,njs0  :njs1  ) = 0._wp      ! south 
    395422#endif 
    396423#if defined key_bdy 
     
    406433         !                                                !* after barotropic velocities (vorticity scheme dependent) 
    407434         !                                                !  ---------------------------   
    408          zwx(:,:) = e2u(:,:) * zun_e(:,:) * hu_e(:,:)           ! now_e transport 
     435         zwx(:,:) = e2u(:,:) * zun_e(:,:) * hu_e(:,:)     ! now_e transport 
    409436         zwy(:,:) = e1v(:,:) * zvn_e(:,:) * hv_e(:,:) 
    410437         ! 
     
    430457                  zv_cor =-z1_4 * ( ff(ji-1,jj  ) * zx1 + ff(ji,jj) * zx2 ) * hvr_e(ji,jj) 
    431458                  ! after velocities with implicit bottom friction 
    432                   ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj) ) ) * umask(ji,jj,1)   & 
    433                      &         / ( 1.e0         - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) 
    434                   va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj) ) ) * vmask(ji,jj,1)   & 
    435                      &         / ( 1.e0         - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) 
     459 
     460                  IF( ln_bfrimp ) THEN      ! implicit bottom friction 
     461                     !   A new method to implement the implicit bottom friction.  
     462                     !   H. Liu 
     463                     !   Sept 2011 
     464                     ua_e(ji,jj) = umask(ji,jj,1) * ( zub_e(ji,jj) +                                            & 
     465                      &                               z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp )            & 
     466                      &                               / ( 1._wp      - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) ) 
     467                     ua_e(ji,jj) = ( ua_e(ji,jj) + z2dt_e *   zua(ji,jj)  ) * umask(ji,jj,1)    
     468                     ! 
     469                     va_e(ji,jj) = vmask(ji,jj,1) * ( zvb_e(ji,jj) +                                            & 
     470                      &                               z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp )            & 
     471                      &                               / ( 1._wp      - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) ) 
     472                     va_e(ji,jj) = ( va_e(ji,jj) + z2dt_e *   zva(ji,jj)  ) * vmask(ji,jj,1)    
     473                     ! 
     474                  ELSE 
     475                     ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj) ) ) * umask(ji,jj,1)   & 
     476                      &           / ( 1._wp         - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) 
     477                     va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj) ) ) * vmask(ji,jj,1)   & 
     478                      &           / ( 1._wp         - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) 
     479                  ENDIF 
    436480               END DO 
    437481            END DO 
     
    456500                  zv_cor  = zx1 * ( ff(ji-1,jj  ) + ff(ji,jj) ) * hvr_e(ji,jj) 
    457501                  ! after velocities with implicit bottom friction 
    458                   ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj) ) ) * umask(ji,jj,1)   & 
    459                      &         / ( 1.e0         - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) 
    460                   va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj) ) ) * vmask(ji,jj,1)   & 
    461                      &         / ( 1.e0         - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) 
     502                  IF( ln_bfrimp ) THEN 
     503                     !   A new method to implement the implicit bottom friction.  
     504                     !   H. Liu 
     505                     !   Sept 2011 
     506                     ua_e(ji,jj) = umask(ji,jj,1) * ( zub_e(ji,jj) +                                            & 
     507                      &                               z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp )            & 
     508                      &                               / ( 1._wp      - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) ) 
     509                     ua_e(ji,jj) = ( ua_e(ji,jj) + z2dt_e *   zua(ji,jj)  ) * umask(ji,jj,1)    
     510                     ! 
     511                     va_e(ji,jj) = vmask(ji,jj,1) * ( zvb_e(ji,jj) +                                            & 
     512                      &                               z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp )            & 
     513                      &                               / ( 1._wp      - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) ) 
     514                     va_e(ji,jj) = ( va_e(ji,jj) + z2dt_e *   zva(ji,jj)  ) * vmask(ji,jj,1)    
     515                     ! 
     516                  ELSE 
     517                     ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj) ) ) * umask(ji,jj,1)   & 
     518                     &            / ( 1._wp        - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) 
     519                     va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj) ) ) * vmask(ji,jj,1)   & 
     520                     &            / ( 1._wp        - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) 
     521                  ENDIF 
    462522               END DO 
    463523            END DO 
     
    482542                     &                           + ftnw(ji,jj  ) * zwx(ji-1,jj  ) + ftne(ji,jj  ) * zwx(ji  ,jj  ) ) * hvr_e(ji,jj) 
    483543                  ! after velocities with implicit bottom friction 
    484                   ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj) ) ) * umask(ji,jj,1)   & 
    485                      &         / ( 1.e0         - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) 
    486                   va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj) ) ) * vmask(ji,jj,1)   & 
    487                      &         / ( 1.e0         - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) 
     544                  IF( ln_bfrimp ) THEN 
     545                     !   A new method to implement the implicit bottom friction.  
     546                     !   H. Liu 
     547                     !   Sept 2011 
     548                     ua_e(ji,jj) = umask(ji,jj,1) * ( zub_e(ji,jj) +                                            & 
     549                      &                               z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp )            & 
     550                      &                               / ( 1._wp      - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) ) 
     551                     ua_e(ji,jj) = ( ua_e(ji,jj) + z2dt_e *   zua(ji,jj)  ) * umask(ji,jj,1)    
     552                     ! 
     553                     va_e(ji,jj) = vmask(ji,jj,1) * ( zvb_e(ji,jj) +                                            & 
     554                      &                               z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp )            & 
     555                      &                               / ( 1._wp      - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) ) 
     556                     va_e(ji,jj) = ( va_e(ji,jj) + z2dt_e *   zva(ji,jj)  ) * vmask(ji,jj,1)    
     557                     ! 
     558                  ELSE 
     559                     ua_e(ji,jj) = ( zub_e(ji,jj) + z2dt_e * ( zu_cor + zu_spg + zu_sld + zu_asp + zua(ji,jj) ) ) * umask(ji,jj,1)   & 
     560                     &            / ( 1._wp        - z2dt_e * bfrua(ji,jj) * hur_e(ji,jj) ) 
     561                     va_e(ji,jj) = ( zvb_e(ji,jj) + z2dt_e * ( zv_cor + zv_spg + zv_sld + zv_asp + zva(ji,jj) ) ) * vmask(ji,jj,1)   & 
     562                     &            / ( 1._wp        - z2dt_e * bfrva(ji,jj) * hvr_e(ji,jj) ) 
     563                  ENDIF 
    488564               END DO 
    489565            END DO 
     
    492568         !                                                !* domain lateral boundary 
    493569         !                                                !  ----------------------- 
    494          !                                                      ! Flather's boundary condition for the barotropic loop : 
    495          !                                                      !         - Update sea surface height on each open boundary 
    496          !                                                      !         - Correct the velocity 
     570         !                                                ! Flather's boundary condition for the barotropic loop : 
     571         !                                                !         - Update sea surface height on each open boundary 
     572         !                                                !         - Correct the velocity 
    497573 
    498574         IF( lk_obc               )   CALL obc_fla_ts ( ua_e, va_e, sshn_e, ssha_e ) 
     
    529605            DO jj = 1, jpjm1                                    ! Sea Surface Height at u- & v-points 
    530606               DO ji = 1, fs_jpim1   ! Vector opt. 
    531                   zsshun_e(ji,jj) = 0.5 * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )       & 
    532                      &                  * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshn_e(ji  ,jj)    & 
    533                      &                    + e1t(ji+1,jj) * e2t(ji+1,jj) * sshn_e(ji+1,jj) ) 
    534                   zsshvn_e(ji,jj) = 0.5 * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )       & 
    535                      &                  * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshn_e(ji,jj  )    & 
    536                      &                    + e1t(ji,jj+1) * e2t(ji,jj+1) * sshn_e(ji,jj+1) ) 
     607                  zsshun_e(ji,jj) = 0.5_wp * umask(ji,jj,1) / ( e1u(ji,jj) * e2u(ji,jj) )       & 
     608                     &                     * ( e1t(ji  ,jj) * e2t(ji  ,jj) * sshn_e(ji  ,jj)    & 
     609                     &                     +  e1t(ji+1,jj) * e2t(ji+1,jj) * sshn_e(ji+1,jj) ) 
     610                  zsshvn_e(ji,jj) = 0.5_wp * vmask(ji,jj,1) / ( e1v(ji,jj) * e2v(ji,jj) )       & 
     611                     &                     * ( e1t(ji,jj  ) * e2t(ji,jj  ) * sshn_e(ji,jj  )    & 
     612                     &                     +  e1t(ji,jj+1) * e2t(ji,jj+1) * sshn_e(ji,jj+1) ) 
    537613               END DO 
    538614            END DO 
     
    542618            hu_e (:,:) = hu_0(:,:) + zsshun_e(:,:)              ! Ocean depth at U- and V-points 
    543619            hv_e (:,:) = hv_0(:,:) + zsshvn_e(:,:) 
    544             hur_e(:,:) = umask(:,:,1) / ( hu_e(:,:) + 1.e0 - umask(:,:,1) ) 
    545             hvr_e(:,:) = vmask(:,:,1) / ( hv_e(:,:) + 1.e0 - vmask(:,:,1) ) 
     620            hur_e(:,:) = umask(:,:,1) / ( hu_e(:,:) + 1._wp - umask(:,:,1) ) 
     621            hvr_e(:,:) = vmask(:,:,1) / ( hv_e(:,:) + 1._wp - vmask(:,:,1) ) 
    546622            ! 
    547623         ENDIF 
     
    562638      ! 
    563639      !                                   !* Time average ==> after barotropic u, v, ssh 
    564       zcoef =  1.e0 / ( 2 * nn_baro  + 1 )  
     640      zcoef =  1._wp / ( 2 * nn_baro  + 1 )  
    565641      zu_sum(:,:) = zcoef * zu_sum  (:,:)  
    566642      zv_sum(:,:) = zcoef * zv_sum  (:,:)  
     
    603679            CALL iom_get( numror, jpdom_autoglo, 'vn_b'  , vn_b  (:,:) )   ! from barotropic loop 
    604680         ELSE 
    605             un_b (:,:) = 0.e0 
    606             vn_b (:,:) = 0.e0 
     681            un_b (:,:) = 0._wp 
     682            vn_b (:,:) = 0._wp 
    607683            ! vertical sum 
    608684            IF( lk_vopt_loop ) THEN          ! vector opt., forced unroll 
     
    625701         ! Vertically integrated velocity (before) 
    626702         IF (neuler/=0) THEN 
    627             ub_b (:,:) = 0.e0 
    628             vb_b (:,:) = 0.e0 
     703            ub_b (:,:) = 0._wp 
     704            vb_b (:,:) = 0._wp 
    629705 
    630706            ! vertical sum 
     
    644720 
    645721            IF( lk_vvl ) THEN 
    646                ub_b (:,:) = ub_b(:,:) * umask(:,:,1) / ( hu_0(:,:) + sshu_b(:,:) + 1.e0 - umask(:,:,1) ) 
    647                vb_b (:,:) = vb_b(:,:) * vmask(:,:,1) / ( hv_0(:,:) + sshv_b(:,:) + 1.e0 - vmask(:,:,1) ) 
     722               ub_b (:,:) = ub_b(:,:) * umask(:,:,1) / ( hu_0(:,:) + sshu_b(:,:) + 1._wp - umask(:,:,1) ) 
     723               vb_b (:,:) = vb_b(:,:) * vmask(:,:,1) / ( hv_0(:,:) + sshv_b(:,:) + 1._wp - vmask(:,:,1) ) 
    648724            ELSE 
    649725               ub_b(:,:) = ub_b(:,:) * hur(:,:) 
  • branches/2011/dev_NOC_2011_MERGE/NEMOGCM/NEMO/OPA_SRC/DYN/dynzdf_imp.F90

    r2715 r3072  
    2020   USE in_out_manager  ! I/O manager 
    2121   USE lib_mpp         ! MPP library 
     22   USE zdfbfr          ! bottom friction setup 
    2223 
    2324   IMPLICIT NONE 
     
    6162      REAL(wp), INTENT(in) ::  p2dt   ! vertical profile of tracer time-step 
    6263      !! 
    63       INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    64       REAL(wp) ::   z1_p2dt, zcoef, zzwi, zzws, zrhs   ! local scalars 
     64      INTEGER  ::   ji, jj, jk     ! dummy loop indices 
     65      INTEGER  ::   ikbum1, ikbvm1 ! local variable 
     66      REAL(wp) ::   z1_p2dt, z2dtf, zcoef, zzwi, zzws, zrhs ! local scalars 
     67 
     68      !! * Local variables for implicit bottom friction.    H. Liu 
     69      REAL(wp) ::   zbfru, zbfrv  
     70      REAL(wp) ::   zbfr_imp = 0._wp                        ! toggle (SAVE'd by assignment)  
     71      !!---------------------------------------------------------------------- 
    6572      !!---------------------------------------------------------------------- 
    6673 
     
    7380         IF(lwp) WRITE(numout,*) 'dyn_zdf_imp : vertical momentum diffusion implicit operator' 
    7481         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~ ' 
     82         IF(ln_bfrimp) zbfr_imp = 1._wp 
    7583      ENDIF 
    7684 
     
    8088 
    8189      ! 1. Vertical diffusion on u 
     90 
     91      ! Vertical diffusion on u&v 
    8292      ! --------------------------- 
    8393      ! Matrix and second member construction 
    84       ! bottom boundary condition: both zwi and zws must be masked as avmu can take 
    85       ! non zero value at the ocean bottom depending on the bottom friction 
    86       ! used but the bottom velocities have already been updated with the bottom 
    87       ! friction velocity in dyn_bfr using values from the previous timestep. There 
    88       ! is no need to include these in the implicit calculation. 
    89       ! 
    90       DO jk = 1, jpkm1        ! Matrix 
    91          DO jj = 2, jpjm1  
    92             DO ji = fs_2, fs_jpim1   ! vector opt. 
     94      !! bottom boundary condition: both zwi and zws must be masked as avmu can take 
     95      !! non zero value at the ocean bottom depending on the bottom friction 
     96      !! used but the bottom velocities have already been updated with the bottom 
     97      !! friction velocity in dyn_bfr using values from the previous timestep. There 
     98      !! is no need to include these in the implicit calculation. 
     99 
     100      ! The code has been modified here to implicitly implement bottom 
     101      ! friction: u(v)mask is not necessary here anymore.  
     102      ! H. Liu, April 2010. 
     103 
     104      ! 1. Vertical diffusion on u 
     105      DO jj = 2, jpjm1  
     106         DO ji = fs_2, fs_jpim1   ! vector opt. 
     107            ikbum1 = mbku(ji,jj) 
     108               zbfru = bfrua(ji,jj) 
     109 
     110            DO jk = 1, ikbum1 
    93111               zcoef = - p2dt / fse3u(ji,jj,jk) 
    94                zzwi          = zcoef * avmu (ji,jj,jk  ) / fse3uw(ji,jj,jk  ) 
    95                zwi(ji,jj,jk) = zzwi  * umask(ji,jj,jk) 
    96                zzws          = zcoef * avmu (ji,jj,jk+1) / fse3uw(ji,jj,jk+1) 
    97                zws(ji,jj,jk) = zzws  * umask(ji,jj,jk+1) 
    98                zwd(ji,jj,jk) = 1._wp - zwi(ji,jj,jk) - zzws 
    99             END DO 
    100          END DO 
    101       END DO 
    102       DO jj = 2, jpjm1        ! Surface boudary conditions 
    103          DO ji = fs_2, fs_jpim1   ! vector opt. 
     112               zwi(ji,jj,jk) = zcoef * avmu(ji,jj,jk  ) / fse3uw(ji,jj,jk  ) 
     113               zws(ji,jj,jk) = zcoef * avmu(ji,jj,jk+1) / fse3uw(ji,jj,jk+1) 
     114               zwd(ji,jj,jk) = 1._wp - zwi(ji,jj,jk) - zws(ji,jj,jk) 
     115            END DO 
     116 
     117      ! Surface boundary conditions 
    104118            zwi(ji,jj,1) = 0._wp 
    105119            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1) 
    106          END DO 
    107       END DO 
     120 
     121      ! Bottom boundary conditions  ! H. Liu, May, 2010 
     122!           !commented out to be consistent with v3.2, h.liu 
     123!           z2dtf = p2dt * zbfru / fse3u(ji,jj,ikbum1) * 2.0_wp * zbfr_imp 
     124            z2dtf = p2dt * zbfru / fse3u(ji,jj,ikbum1) * 1.0_wp * zbfr_imp 
     125            zws(ji,jj,ikbum1) = 0._wp 
     126            zwd(ji,jj,ikbum1) = 1._wp - zwi(ji,jj,ikbum1) - z2dtf  
    108127 
    109128      ! Matrix inversion starting from the first level 
     
    121140      !   The solution (the after velocity) is in ua 
    122141      !----------------------------------------------------------------------- 
    123       ! 
    124       DO jk = 2, jpkm1        !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  == 
    125          DO jj = 2, jpjm1    
    126             DO ji = fs_2, fs_jpim1   ! vector opt. 
     142 
     143      ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k) 
     144            DO jk = 2, ikbum1 
    127145               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1) 
    128146            END DO 
    129          END DO 
    130       END DO 
    131       ! 
    132       DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  == 
    133          DO ji = fs_2, fs_jpim1   ! vector opt. 
    134             ua(ji,jj,1) = ub(ji,jj,1) + p2dt * (  ua(ji,jj,1) + 0.5_wp * ( utau_b(ji,jj) + utau(ji,jj) )   & 
    135                &                                                       / ( fse3u(ji,jj,1) * rau0       )  ) 
    136          END DO 
    137       END DO 
    138       DO jk = 2, jpkm1 
    139          DO jj = 2, jpjm1    
    140             DO ji = fs_2, fs_jpim1   ! vector opt. 
     147 
     148      ! second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1 
     149            z2dtf = 0.5_wp * p2dt / ( fse3u(ji,jj,1) * rau0 ) 
     150            ua(ji,jj,1) = ub(ji,jj,1) + p2dt * ua(ji,jj,1) + z2dtf * (utau_b(ji,jj) + utau(ji,jj)) 
     151           DO jk = 2, ikbum1    
    141152               zrhs = ub(ji,jj,jk) + p2dt * ua(ji,jj,jk)   ! zrhs=right hand side 
    142153               ua(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * ua(ji,jj,jk-1) 
    143154            END DO 
    144          END DO 
    145       END DO 
    146       ! 
    147       DO jj = 2, jpjm1        !==  thrid recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk  == 
    148          DO ji = fs_2, fs_jpim1   ! vector opt. 
    149             ua(ji,jj,jpkm1) = ua(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) 
    150          END DO 
    151       END DO 
    152       DO jk = jpk-2, 1, -1 
    153          DO jj = 2, jpjm1    
    154             DO ji = fs_2, fs_jpim1   ! vector opt. 
    155                ua(ji,jj,jk) = ( ua(ji,jj,jk) - zws(ji,jj,jk) * ua(ji,jj,jk+1) ) / zwd(ji,jj,jk) 
     155 
     156 
     157      ! third recurrence : SOLk = ( Lk - Uk * Ek+1 ) / Dk 
     158            ua(ji,jj,ikbum1) = ua(ji,jj,ikbum1) / zwd(ji,jj,ikbum1) 
     159            DO jk = ikbum1-1, 1, -1 
     160               ua(ji,jj,jk) =( ua(ji,jj,jk) - zws(ji,jj,jk) * ua(ji,jj,jk+1) ) / zwd(ji,jj,jk) 
    156161            END DO 
    157162         END DO 
     
    170175      ! 2. Vertical diffusion on v 
    171176      ! --------------------------- 
    172       ! Matrix and second member construction 
    173       ! bottom boundary condition: both zwi and zws must be masked as avmv can take 
    174       ! non zero value at the ocean bottom depending on the bottom friction 
    175       ! used but the bottom velocities have already been updated with the bottom 
    176       ! friction velocity in dyn_bfr using values from the previous timestep. There 
    177       ! is no need to include these in the implicit calculation. 
    178       ! 
    179       DO jk = 1, jpkm1        ! Matrix 
     177 
     178      DO ji = fs_2, fs_jpim1   ! vector opt. 
    180179         DO jj = 2, jpjm1    
    181             DO ji = fs_2, fs_jpim1   ! vector opt. 
     180            ikbvm1 = mbkv(ji,jj) 
     181               zbfrv = bfrva(ji,jj) 
     182 
     183            DO jk = 1, ikbvm1 
    182184               zcoef = -p2dt / fse3v(ji,jj,jk) 
    183                zzwi          = zcoef * avmv (ji,jj,jk  ) / fse3vw(ji,jj,jk  ) 
    184                zwi(ji,jj,jk) =  zzwi * vmask(ji,jj,jk) 
    185                zzws          = zcoef * avmv (ji,jj,jk+1) / fse3vw(ji,jj,jk+1) 
    186                zws(ji,jj,jk) =  zzws * vmask(ji,jj,jk+1) 
    187                zwd(ji,jj,jk) = 1._wp - zwi(ji,jj,jk) - zzws 
    188             END DO 
    189          END DO 
    190       END DO 
    191       DO jj = 2, jpjm1        ! Surface boudary conditions 
    192          DO ji = fs_2, fs_jpim1   ! vector opt. 
     185               zwi(ji,jj,jk) = zcoef * avmv(ji,jj,jk  ) / fse3vw(ji,jj,jk  ) 
     186               zws(ji,jj,jk) = zcoef * avmv(ji,jj,jk+1) / fse3vw(ji,jj,jk+1) 
     187               zwd(ji,jj,jk) = 1._wp - zwi(ji,jj,jk) - zws(ji,jj,jk) 
     188            END DO 
     189 
     190      ! Surface boundary conditions 
    193191            zwi(ji,jj,1) = 0._wp 
    194192            zwd(ji,jj,1) = 1._wp - zws(ji,jj,1) 
    195          END DO 
    196       END DO 
     193 
     194      ! Bottom boundary conditions  ! H. Liu, May, 2010 
     195!           !commented out to be consistent with v3.2, h.liu 
     196!           z2dtf = p2dt * zbfrv / fse3v(ji,jj,ikbvm1) * 2.0_wp * zbfr_imp 
     197            z2dtf = p2dt * zbfrv / fse3v(ji,jj,ikbvm1) * 1.0_wp * zbfr_imp 
     198            zws(ji,jj,ikbvm1) = 0._wp 
     199            zwd(ji,jj,ikbvm1) = 1._wp - zwi(ji,jj,ikbvm1) - z2dtf  
    197200 
    198201      ! Matrix inversion 
     
    206209      !        (  0    0    0   zwik zwdk )( zwxk ) ( zwyk ) 
    207210      ! 
    208       !   m is decomposed in the product of an upper and lower triangular matrix 
     211      !   m is decomposed in the product of an upper and lower triangular 
     212      !   matrix 
    209213      !   The 3 diagonal terms are in 2d arrays: zwd, zws, zwi 
    210214      !   The solution (after velocity) is in 2d array va 
    211215      !----------------------------------------------------------------------- 
    212       ! 
    213       DO jk = 2, jpkm1        !==  First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k)  == 
    214          DO jj = 2, jpjm1    
    215             DO ji = fs_2, fs_jpim1   ! vector opt. 
     216 
     217      ! First recurrence : Dk = Dk - Lk * Uk-1 / Dk-1   (increasing k) 
     218            DO jk = 2, ikbvm1 
    216219               zwd(ji,jj,jk) = zwd(ji,jj,jk) - zwi(ji,jj,jk) * zws(ji,jj,jk-1) / zwd(ji,jj,jk-1) 
    217220            END DO 
    218          END DO 
    219       END DO 
    220       ! 
    221       DO jj = 2, jpjm1        !==  second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1  == 
    222          DO ji = fs_2, fs_jpim1   ! vector opt. 
    223             va(ji,jj,1) = vb(ji,jj,1) + p2dt * (  va(ji,jj,1) + 0.5_wp * ( vtau_b(ji,jj) + vtau(ji,jj) )   & 
    224                &                                                       / ( fse3v(ji,jj,1) * rau0       )  ) 
    225          END DO 
    226       END DO 
    227       DO jk = 2, jpkm1 
    228          DO jj = 2, jpjm1 
    229             DO ji = fs_2, fs_jpim1   ! vector opt. 
     221 
     222      ! second recurrence:    SOLk = RHSk - Lk / Dk-1  Lk-1 
     223            z2dtf = 0.5_wp * p2dt / ( fse3v(ji,jj,1)*rau0 ) 
     224            va(ji,jj,1) = vb(ji,jj,1) + p2dt * va(ji,jj,1) + z2dtf * (vtau_b(ji,jj) + vtau(ji,jj)) 
     225            DO jk = 2, ikbvm1 
    230226               zrhs = vb(ji,jj,jk) + p2dt * va(ji,jj,jk)   ! zrhs=right hand side 
    231227               va(ji,jj,jk) = zrhs - zwi(ji,jj,jk) / zwd(ji,jj,jk-1) * va(ji,jj,jk-1) 
    232228            END DO 
    233          END DO 
    234       END DO 
    235       ! 
    236       DO jj = 2, jpjm1        !==  thrid recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk  == 
    237          DO ji = fs_2, fs_jpim1   ! vector opt. 
    238             va(ji,jj,jpkm1) = va(ji,jj,jpkm1) / zwd(ji,jj,jpkm1) 
    239          END DO 
    240       END DO 
    241       DO jk = jpk-2, 1, -1 
    242          DO jj = 2, jpjm1    
    243             DO ji = fs_2, fs_jpim1   ! vector opt. 
    244                va(ji,jj,jk) = ( va(ji,jj,jk) - zws(ji,jj,jk) * va(ji,jj,jk+1) ) / zwd(ji,jj,jk) 
    245             END DO 
     229 
     230      ! third recurrence : SOLk = ( Lk - Uk * SOLk+1 ) / Dk 
     231            va(ji,jj,ikbvm1) = va(ji,jj,ikbvm1) / zwd(ji,jj,ikbvm1) 
     232 
     233            DO jk = ikbvm1-1, 1, -1 
     234               va(ji,jj,jk) =( va(ji,jj,jk) - zws(ji,jj,jk) * va(ji,jj,jk+1) ) / zwd(ji,jj,jk) 
     235            END DO 
     236 
    246237         END DO 
    247238      END DO 
     
    258249      IF( wrk_not_released(3, 3) )   CALL ctl_stop('dyn_zdf_imp: failed to release workspace array') 
    259250      ! 
     251 
    260252   END SUBROUTINE dyn_zdf_imp 
    261253 
  • branches/2011/dev_NOC_2011_MERGE/NEMOGCM/NEMO/OPA_SRC/ZDF/zdfbfr.F90

    r2715 r3072  
    3636   REAL(wp) ::   rn_bfrien = 30._wp      ! local factor to enhance coefficient bfri 
    3737   LOGICAL  ::   ln_bfr2d  = .false.     ! logical switch for 2D enhancement 
    38     
    39    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  bfrcoef2d   ! 2D bottom drag coefficient 
     38   LOGICAL , PUBLIC                            ::  ln_bfrimp = .false.  ! logical switch for implicit bottom friction 
     39   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  bfrcoef2d            ! 2D bottom drag coefficient 
    4040 
    4141   !! * Substitutions 
     
    142142      REAL(wp) ::  zfru, zfrv         !    -         - 
    143143      !! 
    144       NAMELIST/nambfr/ nn_bfr, rn_bfri1, rn_bfri2, rn_bfeb2, ln_bfr2d, rn_bfrien 
     144      NAMELIST/nambfr/ nn_bfr, rn_bfri1, rn_bfri2, rn_bfeb2, ln_bfr2d, rn_bfrien, ln_bfrimp 
    145145      !!---------------------------------------------------------------------- 
    146146 
     
    156156      !                              ! allocate zdfbfr arrays 
    157157      IF( zdf_bfr_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_bfr_init : unable to allocate arrays' ) 
     158 
     159      !                              ! Make sure ln_zdfexp=.false. when use implicit bfr 
     160      IF( ln_bfrimp .AND. ln_zdfexp ) THEN 
     161         IF(lwp) THEN 
     162            WRITE(numout,*) 
     163            WRITE(numout,*) 'Implicit bottom friction can only be used when ln_zdfexp=.false.' 
     164            WRITE(numout,*) '         but you set: ln_bfrimp=.true. and ln_zdfexp=.true.!!!!' 
     165            WRITE(ctmp1,*)  '         bad ln_bfrimp value = .true.'  
     166            CALL ctl_stop( ctmp1 ) 
     167         END IF 
     168      END IF 
    158169 
    159170      SELECT CASE (nn_bfr) 
     
    207218         ! 
    208219      END SELECT 
     220      IF(lwp) WRITE(numout,*) '      implicit bottom friction switch                ln_bfrimp  = ', ln_bfrimp 
    209221      ! 
    210222      ! Basic stability check on bottom friction coefficient 
Note: See TracChangeset for help on using the changeset viewer.