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/DYN/dynspg_ts.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/DYN/dynspg_ts.F90

    r8093 r8143  
    1616   !!             3.7  ! 2015-11  (J. Chanut) free surface simplification 
    1717   !!              -   ! 2016-12  (G. Madec, E. Clementi) update for Stoke-Drift divergence 
     18   !!             4.0  ! 2017-05  (G. Madec)  drag coef. defined at t-point (zdfdrg.F90) 
    1819   !!--------------------------------------------------------------------- 
    1920 
     
    2728   USE dom_oce         ! ocean space and time domain 
    2829   USE sbc_oce         ! surface boundary condition: ocean 
    29    USE zdf_oce         ! Bottom friction coefts 
    30 !!gm new 
    31    USE zdfdrg         ! vertical physics: top/bottom drag coef. 
    32 !!gm 
     30   USE zdf_oce         ! vertical physics: variables 
     31   USE zdfdrg          ! vertical physics: top/bottom drag coef. 
    3332   USE sbcisf          ! ice shelf variable (fwfisf) 
    3433   USE sbcapr          ! surface boundary condition: atmospheric pressure 
     
    4342   USE updtide         ! tide potential 
    4443   USE sbcwave         ! surface wave 
     44   USE diatmb          ! Top,middle,bottom output 
     45#if defined key_agrif 
     46   USE agrif_opa_interp ! agrif 
     47#endif 
     48#if defined key_asminc    
     49   USE asminc          ! Assimilation increment 
     50#endif 
    4551   ! 
    4652   USE in_out_manager  ! I/O manager 
     
    5056   USE iom             ! IOM library 
    5157   USE restart         ! only for lrst_oce 
    52    USE wrk_nemo        ! Memory Allocation 
    5358   USE timing          ! Timing     
    54    USE diatmb          ! Top,middle,bottom output 
    55 #if defined key_agrif 
    56    USE agrif_opa_interp ! agrif 
    57 #endif 
    58 #if defined key_asminc    
    59    USE asminc          ! Assimilation increment 
    60 #endif 
    61  
    6259 
    6360   IMPLICIT NONE 
     
    6966   PUBLIC ts_rst            !    "      "     "    " 
    7067 
    71    INTEGER, SAVE :: icycle  ! Number of barotropic sub-steps for each internal step nn_baro <= 2.5 nn_baro 
    72    REAL(wp),SAVE :: rdtbt   ! Barotropic time step 
    73  
    74    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:) ::   wgtbtp1, wgtbtp2   !: 1st & 2nd weights used in time filtering of barotropic fields 
    75  
    76    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  zwz          !: ff_f/h at F points 
    77    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftnw, ftne   !: triad of coriolis parameter 
    78    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftsw, ftse   !: (only used with een vorticity scheme) 
    79  
    8068   !! Time filtered arrays at baroclinic time step: 
    81    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   un_adv , vn_adv     !: Advection vel. at "now" barocl. step 
     69   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   un_adv , vn_adv   !: Advection vel. at "now" barocl. step 
     70 
     71   INTEGER , SAVE ::   icycle   ! Number of barotropic sub-steps for each internal step nn_baro <= 2.5 nn_baro 
     72   REAL(wp), SAVE ::   rdtbt    ! Barotropic time step 
     73   ! 
     74   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:)   ::   wgtbtp1, wgtbtp2   ! 1st & 2nd weights used in time filtering of barotropic fields 
     75   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  zwz                 ! ff_f/h at F points 
     76   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftnw, ftne          ! triad of coriolis parameter 
     77   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::  ftsw, ftse          ! (only used with een vorticity scheme) 
     78 
     79   REAL(wp) ::   r1_12 = 1._wp / 12._wp   ! local ratios 
     80   REAL(wp) ::   r1_8  = 0.125_wp         ! 
     81   REAL(wp) ::   r1_4  = 0.25_wp          ! 
     82   REAL(wp) ::   r1_2  = 0.5_wp           ! 
    8283 
    8384   !! * Substitutions 
    8485#  include "vectopt_loop_substitute.h90" 
    8586   !!---------------------------------------------------------------------- 
    86    !! NEMO/OPA 3.5 , NEMO Consortium (2013) 
     87   !! NEMO/OPA 4.0 , NEMO Consortium (2017) 
    8788   !! $Id$ 
    8889   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
     
    140141      INTEGER, INTENT(in)  ::   kt   ! ocean time-step index 
    141142      ! 
    142       LOGICAL  ::   ll_fw_start        ! if true, forward integration  
    143       LOGICAL  ::   ll_init             ! if true, special startup of 2d equations 
    144       LOGICAL  ::   ll_tmp1, ll_tmp2            ! local logical variables used in W/D 
    145143      INTEGER  ::   ji, jj, jk, jn        ! dummy loop indices 
    146       INTEGER  ::   ikbu, ikbv, noffset      ! local integers 
    147       INTEGER  ::   iktu, iktv               ! local integers 
    148       REAL(wp) ::   zmdi 
    149       REAL(wp) ::   zraur, z1_2dt_b, z2dt_bf    ! local scalars 
    150       REAL(wp) ::   zx1, zy1, zx2, zy2          !   -      - 
    151       REAL(wp) ::   z1_12, z1_8, z1_4, z1_2     !   -      - 
    152       REAL(wp) ::   zu_spg, zv_spg              !   -      - 
    153       REAL(wp) ::   zhura, zhvra                !   -      - 
    154       REAL(wp) ::   za0, za1, za2, za3          !   -      - 
    155       REAL(wp) ::   zztmp                       !   -      - 
    156       REAL(wp), DIMENSION(jpi,jpj) :: zsshp2_e 
    157       REAL(wp), DIMENSION(jpi,jpj) :: zu_trd, zv_trd, zu_frc, zv_frc, zssh_frc 
    158       REAL(wp), DIMENSION(jpi,jpj) :: zwx, zwy, zhdiv 
    159       REAL(wp), DIMENSION(jpi,jpj) :: zhup2_e, zhvp2_e, zhust_e, zhvst_e 
    160       REAL(wp), DIMENSION(jpi,jpj) :: zsshu_a, zsshv_a 
    161       REAL(wp), DIMENSION(jpi,jpj) :: zhf 
     144      LOGICAL  ::   ll_fw_start           ! =T : forward integration  
     145      LOGICAL  ::   ll_init               ! =T : special startup of 2d equations 
     146      LOGICAL  ::   ll_tmp1, ll_tmp2      ! local logical variables used in W/D 
     147      INTEGER  ::   ikbu, iktu, noffset   ! local integers 
     148      INTEGER  ::   ikbv, iktv            !   -      - 
     149      REAL(wp) ::   z1_2dt_b, z2dt_bf        ! local scalars 
     150      REAL(wp) ::   zx1, zx2, zu_spg, zhura  !   -      - 
     151      REAL(wp) ::   zy1, zy2, zv_spg, zhvra  !   -      - 
     152      REAL(wp) ::   za0, za1, za2, za3       !   -      - 
     153      REAL(wp) ::   zmdi, zztmp              !   -      - 
     154      REAL(wp), DIMENSION(jpi,jpj) :: zsshp2_e, zhf 
     155      REAL(wp), DIMENSION(jpi,jpj) :: zwx, zu_trd, zu_frc, zssh_frc 
     156      REAL(wp), DIMENSION(jpi,jpj) :: zwy, zv_trd, zv_frc, zhdiv 
     157      REAL(wp), DIMENSION(jpi,jpj) :: zsshu_a, zhup2_e, zhust_e 
     158      REAL(wp), DIMENSION(jpi,jpj) :: zsshv_a, zhvp2_e, zhvst_e 
    162159      REAL(wp), DIMENSION(jpi,jpj) :: zCdU_u, zCdU_v   ! top/bottom stress at u- & v-points 
    163160      ! 
     
    170167      ! 
    171168      zmdi=1.e+20                               !  missing data indicator for masking 
    172       !                                         !* Local constant initialization 
    173       z1_12 = 1._wp / 12._wp  
    174       z1_8  = 0.125_wp                                    
    175       z1_4  = 0.25_wp 
    176       z1_2  = 0.5_wp      
    177       zraur = 1._wp / rau0 
     169      ! 
    178170      !                                            ! reciprocal of baroclinic time step  
    179171      IF( kt == nit000 .AND. neuler == 0 ) THEN   ;   z2dt_bf =          rdt 
     
    210202      ENDIF 
    211203      ! 
    212 !!gm old/new 
    213204      IF( ln_isfcav ) THEN    ! top+bottom friction (ocean cavities) 
    214          zCdU_u(:,:) = bfrua(:,:) + tfrua(:,:) 
    215          zCdU_v(:,:) = bfrva(:,:) + tfrva(:,:) 
     205         DO jj = 2, jpjm1 
     206            DO ji = fs_2, fs_jpim1   ! vector opt. 
     207               zCdU_u(ji,jj) = 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) + rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) 
     208               zCdU_v(ji,jj) = 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) + rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) 
     209            END DO 
     210         END DO 
    216211      ELSE                    ! bottom friction only 
    217          zCdU_u(:,:) = bfrua(:,:) 
    218          zCdU_v(:,:) = bfrva(:,:) 
    219       ENDIF 
    220 !!gm new 
    221 !      IF( ln_isfcav ) THEN    ! top+bottom friction (ocean cavities) 
    222 !         DO jj = 2, jpjm1 
    223 !            DO ji = fs_2, fs_jpim1   ! vector opt. 
    224 !               zCdU_u(ji,jj) = 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) + rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) 
    225 !               zCdU_v(ji,jj) = 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) + rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) 
    226 !            END DO 
    227 !         END DO 
    228 !      ELSE                    ! bottom friction only 
    229 !         DO jj = 2, jpjm1 
    230 !            DO ji = fs_2, fs_jpim1   ! vector opt. 
    231 !               zCdU_u(ji,jj) = 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) 
    232 !               zCdU_v(ji,jj) = 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) 
    233 !            END DO 
    234 !         END DO 
    235 !      ENDIF 
    236 !!gm       
     212         DO jj = 2, jpjm1 
     213            DO ji = fs_2, fs_jpim1   ! vector opt. 
     214               zCdU_u(ji,jj) = 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) 
     215               zCdU_v(ji,jj) = 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) 
     216            END DO 
     217         END DO 
     218      ENDIF 
    237219      ! 
    238220      ! Set arrays to remove/compute coriolis trend. 
     
    287269!!gm  
    288270!!             
    289               IF ( .not. ln_sco ) THEN 
     271              IF( .NOT.ln_sco ) THEN 
    290272   
    291273   !!gm  agree the JC comment  : this should be done in a much clear way 
     
    338320      IF (.NOT.ln_bt_fw .AND.( neuler==0 .AND. kt==nit000+1 ) ) THEN 
    339321         ll_fw_start=.FALSE. 
    340          CALL ts_wgt(ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2) 
     322         CALL ts_wgt( ln_bt_av, ll_fw_start, icycle, wgtbtp1, wgtbtp2 ) 
    341323      ENDIF 
    342324                           
     
    387369               zx2 = ( zwx(ji  ,jj) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    388370               ! energy conserving formulation for planetary vorticity term 
    389                zu_trd(ji,jj) = z1_4 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
    390                zv_trd(ji,jj) =-z1_4 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
     371               zu_trd(ji,jj) =   r1_4 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
     372               zv_trd(ji,jj) = - r1_4 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
    391373            END DO 
    392374         END DO 
     
    395377         DO jj = 2, jpjm1 
    396378            DO ji = fs_2, fs_jpim1   ! vector opt. 
    397                zy1 =   z1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) & 
     379               zy1 =   r1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) & 
    398380                 &            + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) * r1_e1u(ji,jj) 
    399                zx1 = - z1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) & 
     381               zx1 = - r1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) & 
    400382                 &            + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    401383               zu_trd(ji,jj)  = zy1 * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) 
     
    407389         DO jj = 2, jpjm1 
    408390            DO ji = fs_2, fs_jpim1   ! vector opt. 
    409                zu_trd(ji,jj) = + z1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) & 
     391               zu_trd(ji,jj) = + r1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) & 
    410392                &                                         + ftnw(ji+1,jj) * zwy(ji+1,jj  ) & 
    411393                &                                         + ftse(ji,jj  ) * zwy(ji  ,jj-1) & 
    412394                &                                         + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    413                zv_trd(ji,jj) = - z1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) & 
     395               zv_trd(ji,jj) = - r1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) & 
    414396                &                                         + ftse(ji,jj+1) * zwx(ji  ,jj+1) & 
    415397                &                                         + ftnw(ji,jj  ) * zwx(ji-1,jj  ) & 
     
    423405      !                                   ! ---------------------------------------------------- 
    424406      IF( .NOT.ln_linssh ) THEN                 ! Variable volume : remove surface pressure gradient 
    425         IF( ln_wd ) THEN                        ! Calculating and applying W/D gravity filters 
    426            DO jj = 2, jpjm1 
    427               DO ji = 2, jpim1  
    428                 ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    429                      &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) .AND.            & 
    430                      &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji+1,jj) + ht_wd(ji+1,jj) ) & 
     407         IF( ln_wd ) THEN                        ! Calculating and applying W/D gravity filters 
     408            DO jj = 2, jpjm1 
     409               DO ji = 2, jpim1  
     410                  ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
     411                     &      MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) .AND.            & 
     412                     &      MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji+1,jj) + ht_wd(ji+1,jj) ) & 
    431413                     &                                                         > rn_wdmin1 + rn_wdmin2 
    432                 ll_tmp2 = ( ABS( sshn(ji+1,jj)             -   sshn(ji  ,jj))  > 1.E-12 ).AND.( & 
    433                      &    MAX(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    434                      &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    435     
    436                 IF(ll_tmp1) THEN 
    437                   zcpx(ji,jj) = 1.0_wp 
    438                 ELSE IF(ll_tmp2) THEN 
    439                   ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    440                   zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    441                      &             / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
    442                 ELSE 
    443                   zcpx(ji,jj) = 0._wp 
    444                 END IF 
    445           
    446                 ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
     414                  ll_tmp2 = ( ABS( sshn(ji+1,jj)             -   sshn(ji  ,jj))  > 1.E-12 ).AND.( & 
     415                     &      MAX(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
     416                     &      MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
     417                     ! 
     418                  IF(ll_tmp1) THEN 
     419                     zcpx(ji,jj) = 1.0_wp 
     420                  ELSE IF(ll_tmp2) THEN   ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
     421                     zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
     422                        &             / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
     423                  ELSE 
     424                     zcpx(ji,jj) = 0._wp 
     425                  ENDIF 
     426                  ! 
     427                  ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    447428                     &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) .AND.            & 
    448429                     &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji,jj+1) + ht_wd(ji,jj+1) ) & 
    449430                     &                                                         > rn_wdmin1 + rn_wdmin2 
    450                 ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1))  > 1.E-12 ).AND.( & 
     431                  ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1))  > 1.E-12 ).AND.( & 
    451432                     &    MAX(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    452433                     &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    453     
    454                 IF(ll_tmp1) THEN 
    455                   zcpy(ji,jj) = 1.0_wp 
    456                 ELSE IF(ll_tmp2) THEN 
    457                   ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    458                   zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    459                               &    / (sshn(ji,jj+1) -  sshn(ji,jj  )) ) 
    460                 ELSE 
    461                   zcpy(ji,jj) = 0._wp 
    462                 END IF 
    463               END DO 
    464            END DO 
    465   
    466            DO jj = 2, jpjm1 
    467               DO ji = 2, jpim1 
    468                  zu_trd(ji,jj) = zu_trd(ji,jj) - grav * ( sshn(ji+1,jj  ) - sshn(ji  ,jj ) )   & 
    469                         &                        * r1_e1u(ji,jj) * zcpx(ji,jj) 
    470                  zv_trd(ji,jj) = zv_trd(ji,jj) - grav * ( sshn(ji  ,jj+1) - sshn(ji  ,jj ) )   & 
    471                         &                        * r1_e2v(ji,jj) * zcpy(ji,jj) 
    472               END DO 
    473            END DO 
    474  
     434                     ! 
     435                  IF(ll_tmp1) THEN 
     436                     zcpy(ji,jj) = 1.0_wp 
     437                  ELSE IF(ll_tmp2) THEN 
     438                     ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
     439                     zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
     440                        &             / (sshn(ji,jj+1) -  sshn(ji,jj  )) ) 
     441                  ELSE 
     442                     zcpy(ji,jj) = 0._wp 
     443                  ENDIF 
     444               END DO 
     445            END DO 
     446            ! 
     447            DO jj = 2, jpjm1 
     448               DO ji = 2, jpim1 
     449                  zu_trd(ji,jj) = zu_trd(ji,jj) - grav * ( sshn(ji+1,jj  ) - sshn(ji  ,jj ) )   & 
     450                     &                            * r1_e1u(ji,jj) * zcpx(ji,jj) 
     451                  zv_trd(ji,jj) = zv_trd(ji,jj) - grav * ( sshn(ji  ,jj+1) - sshn(ji  ,jj ) )   & 
     452                     &                            * r1_e2v(ji,jj) * zcpy(ji,jj) 
     453               END DO 
     454            END DO 
     455            ! 
    475456         ELSE 
    476  
    477            DO jj = 2, jpjm1 
    478               DO ji = fs_2, fs_jpim1   ! vector opt. 
    479                  zu_trd(ji,jj) = zu_trd(ji,jj) - grav * (  sshn(ji+1,jj  ) - sshn(ji  ,jj  )  ) * r1_e1u(ji,jj) 
    480                  zv_trd(ji,jj) = zv_trd(ji,jj) - grav * (  sshn(ji  ,jj+1) - sshn(ji  ,jj  )  ) * r1_e2v(ji,jj)  
    481               END DO 
    482            END DO 
    483         ENDIF 
    484  
    485       ENDIF 
    486  
     457            ! 
     458            DO jj = 2, jpjm1 
     459               DO ji = fs_2, fs_jpim1   ! vector opt. 
     460                  zu_trd(ji,jj) = zu_trd(ji,jj) - grav * (  sshn(ji+1,jj  ) - sshn(ji  ,jj  )  ) * r1_e1u(ji,jj) 
     461                  zv_trd(ji,jj) = zv_trd(ji,jj) - grav * (  sshn(ji  ,jj+1) - sshn(ji  ,jj  )  ) * r1_e2v(ji,jj)  
     462               END DO 
     463            END DO 
     464         ENDIF 
     465         ! 
     466      ENDIF 
     467      ! 
    487468      DO jj = 2, jpjm1                          ! Remove coriolis term (and possibly spg) from barotropic trend 
    488469         DO ji = fs_2, fs_jpim1 
     
    492473      END DO  
    493474      ! 
    494       !                 ! Add bottom stress contribution from baroclinic velocities:       
    495       IF (ln_bt_fw) THEN 
     475      !                 ! Add BOTTOM stress contribution from baroclinic velocities:       
     476      IF( ln_bt_fw ) THEN 
    496477         DO jj = 2, jpjm1                           
    497478            DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    518499         DO jj = 2, jpjm1                           
    519500            DO ji = fs_2, fs_jpim1   ! vector opt. 
    520 !!gm old 
    521                zu_frc(ji,jj) = zu_frc(ji,jj) + MAX( r1_hu_n(ji,jj) * bfrua(ji,jj) , zztmp ) * zwx(ji,jj) 
    522                zv_frc(ji,jj) = zv_frc(ji,jj) + MAX( r1_hv_n(ji,jj) * bfrva(ji,jj) , zztmp ) * zwy(ji,jj) 
    523 !!gm new 
    524 !               zu_frc(ji,jj) = zu_frc(ji,jj) + MAX( r1_hu_n(ji,jj) * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) , zztmp ) * zwx(ji,jj) 
    525 !               zv_frc(ji,jj) = zv_frc(ji,jj) + MAX( r1_hv_n(ji,jj) * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) , zztmp ) * zwy(ji,jj) 
    526 !!gm 
     501               zu_frc(ji,jj) = zu_frc(ji,jj) + MAX( r1_hu_n(ji,jj) * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) , zztmp ) * zwx(ji,jj) 
     502               zv_frc(ji,jj) = zv_frc(ji,jj) + MAX( r1_hv_n(ji,jj) * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) , zztmp ) * zwy(ji,jj) 
    527503            END DO 
    528504         END DO 
     
    530506         DO jj = 2, jpjm1                           
    531507            DO ji = fs_2, fs_jpim1   ! vector opt. 
    532 !!gm old 
    533                zu_frc(ji,jj) = zu_frc(ji,jj) + r1_hu_n(ji,jj) * bfrua(ji,jj) * zwx(ji,jj) 
    534                zv_frc(ji,jj) = zv_frc(ji,jj) + r1_hv_n(ji,jj) * bfrva(ji,jj) * zwy(ji,jj) 
    535 !!gm new 
    536 !               zu_frc(ji,jj) = zu_frc(ji,jj) + r1_hu_n(ji,jj) * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * zwx(ji,jj) 
    537 !               zv_frc(ji,jj) = zv_frc(ji,jj) + r1_hv_n(ji,jj) * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * zwy(ji,jj) 
    538 !!gm 
     508               zu_frc(ji,jj) = zu_frc(ji,jj) + r1_hu_n(ji,jj) * 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) * zwx(ji,jj) 
     509               zv_frc(ji,jj) = zv_frc(ji,jj) + r1_hv_n(ji,jj) * 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) * zwy(ji,jj) 
    539510            END DO 
    540511         END DO 
    541512      END IF 
    542513      ! 
    543       !                                         ! Add top stress contribution from baroclinic velocities:       
    544       IF( ln_bt_fw ) THEN 
     514      IF( ln_isfcav ) THEN       ! Add TOP stress contribution from baroclinic velocities:       
     515         IF( ln_bt_fw ) THEN 
     516            DO jj = 2, jpjm1 
     517               DO ji = fs_2, fs_jpim1   ! vector opt. 
     518                  iktu = miku(ji,jj) 
     519                  iktv = mikv(ji,jj) 
     520                  zwx(ji,jj) = un(ji,jj,iktu) - un_b(ji,jj) ! NOW top baroclinic velocities 
     521                  zwy(ji,jj) = vn(ji,jj,iktv) - vn_b(ji,jj) 
     522               END DO 
     523            END DO 
     524         ELSE 
     525            DO jj = 2, jpjm1 
     526               DO ji = fs_2, fs_jpim1   ! vector opt. 
     527                  iktu = miku(ji,jj) 
     528                  iktv = mikv(ji,jj) 
     529                  zwx(ji,jj) = ub(ji,jj,iktu) - ub_b(ji,jj) ! BEFORE top baroclinic velocities 
     530                  zwy(ji,jj) = vb(ji,jj,iktv) - vb_b(ji,jj) 
     531               END DO 
     532            END DO 
     533         ENDIF 
     534         ! 
     535         ! Note that the "unclipped" top friction parameter is used even with explicit drag 
     536         DO jj = 2, jpjm1               
     537            DO ji = fs_2, fs_jpim1   ! vector opt. 
     538               zu_frc(ji,jj) = zu_frc(ji,jj) + r1_hu_n(ji,jj) * 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) * zwx(ji,jj) 
     539               zv_frc(ji,jj) = zv_frc(ji,jj) + r1_hv_n(ji,jj) * 0.5*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) * zwy(ji,jj) 
     540            END DO 
     541         END DO 
     542      ENDIF 
     543      !        
     544      IF( ln_bt_fw ) THEN                        ! Add wind forcing 
    545545         DO jj = 2, jpjm1 
    546546            DO ji = fs_2, fs_jpim1   ! vector opt. 
    547                iktu = miku(ji,jj) 
    548                iktv = mikv(ji,jj) 
    549                zwx(ji,jj) = un(ji,jj,iktu) - un_b(ji,jj) ! NOW top baroclinic velocities 
    550                zwy(ji,jj) = vn(ji,jj,iktv) - vn_b(ji,jj) 
     547               zu_frc(ji,jj) =  zu_frc(ji,jj) + r1_rau0 * utau(ji,jj) * r1_hu_n(ji,jj) 
     548               zv_frc(ji,jj) =  zv_frc(ji,jj) + r1_rau0 * vtau(ji,jj) * r1_hv_n(ji,jj) 
    551549            END DO 
    552550         END DO 
    553551      ELSE 
     552         zztmp = r1_rau0 * r1_2 
    554553         DO jj = 2, jpjm1 
    555554            DO ji = fs_2, fs_jpim1   ! vector opt. 
    556                iktu = miku(ji,jj) 
    557                iktv = mikv(ji,jj) 
    558                zwx(ji,jj) = ub(ji,jj,iktu) - ub_b(ji,jj) ! BEFORE top baroclinic velocities 
    559                zwy(ji,jj) = vb(ji,jj,iktv) - vb_b(ji,jj) 
    560             END DO 
    561          END DO 
    562       ENDIF 
    563       ! 
    564       ! Note that the "unclipped" top friction parameter is used even with explicit drag 
    565       DO jj = 2, jpjm1               
    566          DO ji = fs_2, fs_jpim1   ! vector opt. 
    567             zu_frc(ji,jj) = zu_frc(ji,jj) + r1_hu_n(ji,jj) * tfrua(ji,jj) * zwx(ji,jj) 
    568             zv_frc(ji,jj) = zv_frc(ji,jj) + r1_hv_n(ji,jj) * tfrva(ji,jj) * zwy(ji,jj) 
    569          END DO 
    570       END DO 
    571       !        
    572       IF (ln_bt_fw) THEN                        ! Add wind forcing 
    573          DO jj = 2, jpjm1 
    574             DO ji = fs_2, fs_jpim1   ! vector opt. 
    575                zu_frc(ji,jj) =  zu_frc(ji,jj) + zraur * utau(ji,jj) * r1_hu_n(ji,jj) 
    576                zv_frc(ji,jj) =  zv_frc(ji,jj) + zraur * vtau(ji,jj) * r1_hv_n(ji,jj) 
    577             END DO 
    578          END DO 
    579       ELSE 
    580          DO jj = 2, jpjm1 
    581             DO ji = fs_2, fs_jpim1   ! vector opt. 
    582                zu_frc(ji,jj) =  zu_frc(ji,jj) + zraur * z1_2 * ( utau_b(ji,jj) + utau(ji,jj) ) * r1_hu_n(ji,jj) 
    583                zv_frc(ji,jj) =  zv_frc(ji,jj) + zraur * z1_2 * ( vtau_b(ji,jj) + vtau(ji,jj) ) * r1_hv_n(ji,jj) 
     555               zu_frc(ji,jj) =  zu_frc(ji,jj) + zztmp * ( utau_b(ji,jj) + utau(ji,jj) ) * r1_hu_n(ji,jj) 
     556               zv_frc(ji,jj) =  zv_frc(ji,jj) + zztmp * ( vtau_b(ji,jj) + vtau(ji,jj) ) * r1_hv_n(ji,jj) 
    584557            END DO 
    585558         END DO 
    586559      ENDIF   
    587560      ! 
    588       IF ( ln_apr_dyn ) THEN                    ! Add atm pressure forcing 
    589          IF (ln_bt_fw) THEN 
     561      IF( ln_apr_dyn ) THEN                     ! Add atm pressure forcing 
     562         IF( ln_bt_fw ) THEN 
    590563            DO jj = 2, jpjm1               
    591564               DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    597570            END DO 
    598571         ELSE 
     572            zztmp = grav * r1_2 
    599573            DO jj = 2, jpjm1               
    600574               DO ji = fs_2, fs_jpim1   ! vector opt. 
    601                   zu_spg =  grav * z1_2 * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj)    & 
    602                       &                    + ssh_ibb(ji+1,jj  ) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj) 
    603                   zv_spg =  grav * z1_2 * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj)    & 
    604                       &                    + ssh_ibb(ji  ,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj) 
     575                  zu_spg = zztmp * (  ssh_ib (ji+1,jj  ) - ssh_ib (ji,jj)    & 
     576                      &             + ssh_ibb(ji+1,jj  ) - ssh_ibb(ji,jj)  ) * r1_e1u(ji,jj) 
     577                  zv_spg = zztmp * (  ssh_ib (ji  ,jj+1) - ssh_ib (ji,jj)    & 
     578                      &             + ssh_ibb(ji  ,jj+1) - ssh_ibb(ji,jj)  ) * r1_e2v(ji,jj) 
    605579                  zu_frc(ji,jj) = zu_frc(ji,jj) + zu_spg 
    606580                  zv_frc(ji,jj) = zv_frc(ji,jj) + zv_spg 
     
    613587      !                                         ! Surface net water flux and rivers 
    614588      IF (ln_bt_fw) THEN 
    615          zssh_frc(:,:) = zraur * ( emp(:,:) - rnf(:,:) + fwfisf(:,:) ) 
     589         zssh_frc(:,:) = r1_rau0 * ( emp(:,:) - rnf(:,:) + fwfisf(:,:) ) 
    616590      ELSE 
    617          zssh_frc(:,:) = zraur * z1_2 * (  emp(:,:) + emp_b(:,:) - rnf(:,:) - rnf_b(:,:)   & 
    618                 &                        + fwfisf(:,:) + fwfisf_b(:,:)                     ) 
     591         zztmp = r1_rau0 * r1_2 
     592         zssh_frc(:,:) = zztmp * (  emp(:,:) + emp_b(:,:) - rnf(:,:) - rnf_b(:,:)   & 
     593                &                 + fwfisf(:,:) + fwfisf_b(:,:)                     ) 
    619594      ENDIF 
    620595      ! 
     
    712687            DO jj = 2, jpjm1                                    ! Sea Surface Height at u- & v-points 
    713688               DO ji = 2, fs_jpim1   ! Vector opt. 
    714                   zwx(ji,jj) = z1_2 * ssumask(ji,jj)  * r1_e1e2u(ji,jj)     & 
     689                  zwx(ji,jj) = r1_2 * ssumask(ji,jj)  * r1_e1e2u(ji,jj)     & 
    715690                     &              * ( e1e2t(ji  ,jj) * zsshp2_e(ji  ,jj)  & 
    716691                     &              +   e1e2t(ji+1,jj) * zsshp2_e(ji+1,jj) ) 
    717                   zwy(ji,jj) = z1_2 * ssvmask(ji,jj)  * r1_e1e2v(ji,jj)     & 
     692                  zwy(ji,jj) = r1_2 * ssvmask(ji,jj)  * r1_e1e2v(ji,jj)     & 
    718693                     &              * ( e1e2t(ji,jj  ) * zsshp2_e(ji,jj  )  & 
    719694                     &              +   e1e2t(ji,jj+1) * zsshp2_e(ji,jj+1) ) 
     
    789764            DO jj = 2, jpjm1 
    790765               DO ji = 2, jpim1      ! NO Vector Opt. 
    791                   zsshu_a(ji,jj) = z1_2 * ssumask(ji,jj) * r1_e1e2u(ji,jj)    & 
     766                  zsshu_a(ji,jj) = r1_2 * ssumask(ji,jj) * r1_e1e2u(ji,jj)    & 
    792767                     &              * ( e1e2t(ji  ,jj  )  * ssha_e(ji  ,jj  ) & 
    793768                     &              +   e1e2t(ji+1,jj  )  * ssha_e(ji+1,jj  ) ) 
    794                   zsshv_a(ji,jj) = z1_2 * ssvmask(ji,jj) * r1_e1e2v(ji,jj)    & 
     769                  zsshv_a(ji,jj) = r1_2 * ssvmask(ji,jj) * r1_e1e2v(ji,jj)    & 
    795770                     &              * ( e1e2t(ji  ,jj  )  * ssha_e(ji  ,jj  ) & 
    796771                     &              +   e1e2t(ji  ,jj+1)  * ssha_e(ji  ,jj+1) ) 
     
    868843            DO jj = 2, jpjm1                             
    869844               DO ji = 2, jpim1 
    870                   zx1 = z1_2 * ssumask(ji  ,jj) *  r1_e1e2u(ji  ,jj)    & 
     845                  zx1 = r1_2 * ssumask(ji  ,jj) *  r1_e1e2u(ji  ,jj)    & 
    871846                     &      * ( e1e2t(ji  ,jj  ) * zsshp2_e(ji  ,jj)    & 
    872847                     &      +   e1e2t(ji+1,jj  ) * zsshp2_e(ji+1,jj  ) ) 
    873                   zy1 = z1_2 * ssvmask(ji  ,jj) *  r1_e1e2v(ji  ,jj  )  & 
     848                  zy1 = r1_2 * ssvmask(ji  ,jj) *  r1_e1e2v(ji  ,jj  )  & 
    874849                     &       * ( e1e2t(ji ,jj  ) * zsshp2_e(ji  ,jj  )  & 
    875850                     &       +   e1e2t(ji ,jj+1) * zsshp2_e(ji  ,jj+1) ) 
     
    895870                  zx1 = ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) ) * r1_e2v(ji,jj) 
    896871                  zx2 = ( zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    897                   zu_trd(ji,jj) = z1_4 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
    898                   zv_trd(ji,jj) =-z1_4 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
     872                  zu_trd(ji,jj) = r1_4 * ( zwz(ji  ,jj-1) * zy1 + zwz(ji,jj) * zy2 ) 
     873                  zv_trd(ji,jj) =-r1_4 * ( zwz(ji-1,jj  ) * zx1 + zwz(ji,jj) * zx2 ) 
    899874               END DO 
    900875            END DO 
     
    903878            DO jj = 2, jpjm1 
    904879               DO ji = fs_2, fs_jpim1   ! vector opt. 
    905                   zy1 =   z1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) & 
     880                  zy1 =   r1_8 * ( zwy(ji  ,jj-1) + zwy(ji+1,jj-1) & 
    906881                   &             + zwy(ji  ,jj  ) + zwy(ji+1,jj  ) ) * r1_e1u(ji,jj) 
    907                   zx1 = - z1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) & 
     882                  zx1 = - r1_8 * ( zwx(ji-1,jj  ) + zwx(ji-1,jj+1) & 
    908883                   &             + zwx(ji  ,jj  ) + zwx(ji  ,jj+1) ) * r1_e2v(ji,jj) 
    909884                  zu_trd(ji,jj)  = zy1 * ( zwz(ji  ,jj-1) + zwz(ji,jj) ) 
     
    915890            DO jj = 2, jpjm1 
    916891               DO ji = fs_2, fs_jpim1   ! vector opt. 
    917                   zu_trd(ji,jj) = + z1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) & 
     892                  zu_trd(ji,jj) = + r1_12 * r1_e1u(ji,jj) * (  ftne(ji,jj  ) * zwy(ji  ,jj  ) & 
    918893                     &                                       + ftnw(ji+1,jj) * zwy(ji+1,jj  ) & 
    919894                     &                                       + ftse(ji,jj  ) * zwy(ji  ,jj-1) &  
    920895                     &                                       + ftsw(ji+1,jj) * zwy(ji+1,jj-1) ) 
    921                   zv_trd(ji,jj) = - z1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) &  
     896                  zv_trd(ji,jj) = - r1_12 * r1_e2v(ji,jj) * (  ftsw(ji,jj+1) * zwx(ji-1,jj+1) &  
    922897                     &                                       + ftse(ji,jj+1) * zwx(ji  ,jj+1) & 
    923898                     &                                       + ftnw(ji,jj  ) * zwx(ji-1,jj  ) &  
     
    10821057         vn_adv(:,:) = zwy(:,:) * r1_hv_n(:,:) 
    10831058      ELSE 
    1084          un_adv(:,:) = z1_2 * ( ub2_b(:,:) + zwx(:,:) ) * r1_hu_n(:,:) 
    1085          vn_adv(:,:) = z1_2 * ( vb2_b(:,:) + zwy(:,:) ) * r1_hv_n(:,:) 
     1059         un_adv(:,:) = r1_2 * ( ub2_b(:,:) + zwx(:,:) ) * r1_hu_n(:,:) 
     1060         vn_adv(:,:) = r1_2 * ( vb2_b(:,:) + zwy(:,:) ) * r1_hv_n(:,:) 
    10861061      END IF 
    10871062 
     
    11011076         DO jj = 1, jpjm1 
    11021077            DO ji = 1, jpim1      ! NO Vector Opt. 
    1103                zsshu_a(ji,jj) = z1_2 * umask(ji,jj,1)  * r1_e1e2u(ji,jj) & 
     1078               zsshu_a(ji,jj) = r1_2 * umask(ji,jj,1)  * r1_e1e2u(ji,jj) & 
    11041079                  &              * ( e1e2t(ji  ,jj) * ssha(ji  ,jj)    & 
    11051080                  &              +   e1e2t(ji+1,jj) * ssha(ji+1,jj) ) 
    1106                zsshv_a(ji,jj) = z1_2 * vmask(ji,jj,1)  * r1_e1e2v(ji,jj) & 
     1081               zsshv_a(ji,jj) = r1_2 * vmask(ji,jj,1)  * r1_e1e2v(ji,jj) & 
    11071082                  &              * ( e1e2t(ji,jj  ) * ssha(ji,jj  )    & 
    11081083                  &              +   e1e2t(ji,jj+1) * ssha(ji,jj+1) ) 
     
    12991274      INTEGER  ::   ji ,jj              ! dummy loop indices 
    13001275      REAL(wp) ::   zxr2, zyr2, zcmax   ! local scalar 
    1301       REAL(wp), POINTER, DIMENSION(:,:) ::   zcu 
     1276      REAL(wp), DIMENSION(jpi,jpj) ::   zcu 
    13021277      !!---------------------------------------------------------------------- 
    13031278      ! 
    13041279      ! Max courant number for ext. grav. waves 
    1305       ! 
    1306       CALL wrk_alloc( jpi,jpj,   zcu ) 
    13071280      ! 
    13081281      DO jj = 1, jpj 
     
    13711344      ENDIF 
    13721345      ! 
    1373       CALL wrk_dealloc( jpi,jpj,   zcu ) 
    1374       ! 
    13751346   END SUBROUTINE dyn_spg_ts_init 
    13761347 
Note: See TracChangeset for help on using the changeset viewer.