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 8992 for branches/2017/dev_METO_MERCATOR_2017/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90 – NEMO

Ignore:
Timestamp:
2017-12-12T16:38:41+01:00 (7 years ago)
Author:
timgraham
Message:

Merged Met Office branch in

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_METO_MERCATOR_2017/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90

    r7831 r8992  
    11MODULE dynspg_ts 
     2 
     3   !! Includes ROMS wd scheme with diagnostic outputs ; un and ua updates are commented out !  
     4 
    25   !!====================================================================== 
    36   !!                   ***  MODULE  dynspg_ts  *** 
     
    137140      INTEGER, INTENT(in)  ::   kt   ! ocean time-step index 
    138141      ! 
    139       LOGICAL  ::   ll_fw_start        ! if true, forward integration  
    140       LOGICAL  ::   ll_init             ! if true, special startup of 2d equations 
     142      LOGICAL  ::   ll_fw_start                 ! if true, forward integration  
     143      LOGICAL  ::   ll_init                     ! if true, special startup of 2d equations 
    141144      LOGICAL  ::   ll_tmp1, ll_tmp2            ! local logical variables used in W/D 
    142       INTEGER  ::   ji, jj, jk, jn        ! dummy loop indices 
    143       INTEGER  ::   ikbu, ikbv, noffset      ! local integers 
    144       INTEGER  ::   iktu, iktv               ! local integers 
     145      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices 
     146      INTEGER  ::   ikbu, ikbv, noffset         ! local integers 
     147      INTEGER  ::   iktu, iktv                  ! local integers 
    145148      REAL(wp) ::   zmdi 
    146       REAL(wp) ::   zraur, z1_2dt_b, z2dt_bf    ! local scalars 
     149      REAL(wp) ::   zraur, z1_2dt_b, z2dt_bf    ! local scalars 
    147150      REAL(wp) ::   zx1, zy1, zx2, zy2          !   -      - 
    148       REAL(wp) ::   z1_12, z1_8, z1_4, z1_2  !   -      - 
     151      REAL(wp) ::   z1_12, z1_8, z1_4, z1_2     !   -      - 
    149152      REAL(wp) ::   zu_spg, zv_spg              !   -      - 
    150       REAL(wp) ::   zhura, zhvra          !   -      - 
    151       REAL(wp) ::   za0, za1, za2, za3    !   -      - 
     153      REAL(wp) ::   zhura, zhvra                !   -      - 
     154      REAL(wp) ::   za0, za1, za2, za3          !   -      - 
     155      REAL(wp) ::   zwdramp                     ! local scalar - only used if ln_wd_dl = .True.  
     156 
     157      INTEGER  :: iwdg, jwdg, kwdg   ! short-hand values for the indices of the output point 
     158 
    152159      ! 
    153160      REAL(wp), POINTER, DIMENSION(:,:) :: zsshp2_e 
     
    158165      REAL(wp), POINTER, DIMENSION(:,:) :: zhf 
    159166      REAL(wp), POINTER, DIMENSION(:,:) :: zcpx, zcpy                 ! Wetting/Dying gravity filter coef. 
     167      REAL(wp), POINTER, DIMENSION(:,:) :: ztwdmask, zuwdmask, zvwdmask ! ROMS wetting and drying masks at t,u,v points 
     168      REAL(wp), POINTER, DIMENSION(:,:) :: zuwdav2, zvwdav2    ! averages over the sub-steps of zuwdmask and zvwdmask 
    160169      !!---------------------------------------------------------------------- 
    161170      ! 
     
    169178      CALL wrk_alloc( jpi,jpj,   zsshu_a, zsshv_a                  ) 
    170179      CALL wrk_alloc( jpi,jpj,   zhf ) 
    171       IF( ln_wd ) CALL wrk_alloc( jpi, jpj, zcpx, zcpy ) 
     180      IF( ln_wd_il ) CALL wrk_alloc( jpi, jpj, zcpx, zcpy ) 
     181      IF( ln_wd_dl ) CALL wrk_alloc( jpi, jpj, ztwdmask, zuwdmask, zvwdmask, zuwdav2, zvwdav2) 
     182 
     183 
    172184      ! 
    173185      zmdi=1.e+20                               !  missing data indicator for masking 
     
    178190      z1_2  = 0.5_wp      
    179191      zraur = 1._wp / rau0 
    180       !                                            ! reciprocal of baroclinic time step  
     192      zwdramp = r_rn_wdmin1               ! simplest ramp  
     193!     zwdramp = 1._wp / (rn_wdmin2 - rn_wdmin1) ! more general ramp 
     194      !                                         ! reciprocal of baroclinic time step  
    181195      IF( kt == nit000 .AND. neuler == 0 ) THEN   ;   z2dt_bf =          rdt 
    182196      ELSE                                        ;   z2dt_bf = 2.0_wp * rdt 
     
    184198      z1_2dt_b = 1.0_wp / z2dt_bf  
    185199      ! 
    186       ll_init     = ln_bt_av                       ! if no time averaging, then no specific restart  
     200      ll_init     = ln_bt_av                    ! if no time averaging, then no specific restart  
    187201      ll_fw_start = .FALSE. 
    188       !                                            ! time offset in steps for bdy data update 
     202      !                                         ! time offset in steps for bdy data update 
    189203      IF( .NOT.ln_bt_fw ) THEN   ;   noffset = - nn_baro 
    190204      ELSE                       ;   noffset =   0  
    191205      ENDIF 
    192206      ! 
    193       IF( kt == nit000 ) THEN                !* initialisation 
     207      IF( kt == nit000 ) THEN                   !* initialisation 
    194208         ! 
    195209         IF(lwp) WRITE(numout,*) 
     
    399413      !                                   ! ---------------------------------------------------- 
    400414      IF( .NOT.ln_linssh ) THEN                 ! Variable volume : remove surface pressure gradient 
    401         IF( ln_wd ) THEN                        ! Calculating and applying W/D gravity filters 
     415        IF( ln_wd_il ) THEN                        ! Calculating and applying W/D gravity filters 
    402416           DO jj = 2, jpjm1 
    403417              DO ji = 2, jpim1  
    404                 ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    405                      &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) .AND.            & 
    406                      &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji+1,jj) + ht_wd(ji+1,jj) ) & 
    407                      &                                                         > rn_wdmin1 + rn_wdmin2 
    408                 ll_tmp2 = ( ABS( sshn(ji+1,jj)             -   sshn(ji  ,jj))  > 1.E-12 ).AND.( & 
    409                      &    MAX(   sshn(ji,jj)               ,   sshn(ji+1,jj) ) >                & 
    410                      &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
     418                ll_tmp1 = MIN(  sshn(ji,jj)               ,  sshn(ji+1,jj) ) >                & 
     419                     &    MAX( -ht_0(ji,jj)               , -ht_0(ji+1,jj) ) .AND.            & 
     420                     &    MAX(  sshn(ji,jj) + ht_0(ji,jj) ,  sshn(ji+1,jj) + ht_0(ji+1,jj) ) & 
     421                     &                                                       > rn_wdmin1 + rn_wdmin2 
     422                ll_tmp2 = ( ABS( sshn(ji+1,jj)            -  sshn(ji  ,jj))  > 1.E-12 ).AND.( & 
     423                     &    MAX(   sshn(ji,jj)              ,  sshn(ji+1,jj) ) >                & 
     424                     &    MAX(  -ht_0(ji,jj)              , -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    411425    
    412426                IF(ll_tmp1) THEN 
     
    414428                ELSE IF(ll_tmp2) THEN 
    415429                  ! no worries about  sshn(ji+1,jj) -  sshn(ji  ,jj) = 0, it won't happen ! here 
    416                   zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_wd(ji+1,jj) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    417                               &    / (sshn(ji+1,jj) -  sshn(ji  ,jj)) ) 
     430                  zcpx(ji,jj) = ABS( (sshn(ji+1,jj) + ht_0(ji+1,jj) - sshn(ji,jj) - ht_0(ji,jj)) & 
     431                              &    / (sshn(ji+1,jj) - sshn(ji  ,jj)) ) 
     432                  zcpx(ji,jj) = max(min( zcpx(ji,jj) , 1.0_wp),0.0_wp) 
     433 
    418434                ELSE 
    419435                  zcpx(ji,jj) = 0._wp 
    420436                END IF 
    421437          
    422                 ll_tmp1 = MIN(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    423                      &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) .AND.            & 
    424                      &    MAX(   sshn(ji,jj) + ht_wd(ji,jj),   sshn(ji,jj+1) + ht_wd(ji,jj+1) ) & 
    425                      &                                                         > rn_wdmin1 + rn_wdmin2 
    426                 ll_tmp2 = ( ABS( sshn(ji,jj)               -   sshn(ji,jj+1))  > 1.E-12 ).AND.( & 
    427                      &    MAX(   sshn(ji,jj)               ,   sshn(ji,jj+1) ) >                & 
    428                      &    MAX( -ht_wd(ji,jj)               , -ht_wd(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
     438                ll_tmp1 = MIN(  sshn(ji,jj)               ,  sshn(ji,jj+1) ) >                & 
     439                     &    MAX( -ht_0(ji,jj)               , -ht_0(ji,jj+1) ) .AND.            & 
     440                     &    MAX(  sshn(ji,jj) + ht_0(ji,jj) ,  sshn(ji,jj+1) + ht_0(ji,jj+1) ) & 
     441                     &                                                       > rn_wdmin1 + rn_wdmin2 
     442                ll_tmp2 = ( ABS( sshn(ji,jj)              -  sshn(ji,jj+1))  > 1.E-12 ).AND.( & 
     443                     &    MAX(   sshn(ji,jj)              ,  sshn(ji,jj+1) ) >                & 
     444                     &    MAX(  -ht_0(ji,jj)              , -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    429445    
    430446                IF(ll_tmp1) THEN 
     
    432448                ELSE IF(ll_tmp2) THEN 
    433449                  ! no worries about  sshn(ji,jj+1) -  sshn(ji,jj  ) = 0, it won't happen ! here 
    434                   zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_wd(ji,jj+1) - sshn(ji,jj) - ht_wd(ji,jj)) & 
    435                               &    / (sshn(ji,jj+1) -  sshn(ji,jj  )) ) 
     450                  zcpy(ji,jj) = ABS( (sshn(ji,jj+1) + ht_0(ji,jj+1) - sshn(ji,jj) - ht_0(ji,jj)) & 
     451                              &    / (sshn(ji,jj+1) - sshn(ji,jj  )) ) 
     452                  zcpy(ji,jj) = max(min( zcpy(ji,jj) , 1.0_wp),0.0_wp) 
     453 
    436454                ELSE 
    437455                  zcpy(ji,jj) = 0._wp 
     
    443461              DO ji = 2, jpim1 
    444462                 zu_trd(ji,jj) = zu_trd(ji,jj) - grav * ( sshn(ji+1,jj  ) - sshn(ji  ,jj ) )   & 
    445                         &                        * r1_e1u(ji,jj) * zcpx(ji,jj) 
     463                        &                        * r1_e1u(ji,jj) * zcpx(ji,jj)  * wdrampu(ji,jj)  !jth 
    446464                 zv_trd(ji,jj) = zv_trd(ji,jj) - grav * ( sshn(ji  ,jj+1) - sshn(ji  ,jj ) )   & 
    447                         &                        * r1_e2v(ji,jj) * zcpy(ji,jj) 
     465                        &                        * r1_e2v(ji,jj) * zcpy(ji,jj)  * wdrampv(ji,jj)  !jth 
     466 
    448467              END DO 
    449468           END DO 
     
    468487      END DO  
    469488      ! 
    470       !                 ! Add bottom stress contribution from baroclinic velocities:       
     489      !                                         ! Add bottom stress contribution from baroclinic velocities:       
    471490      IF (ln_bt_fw) THEN 
    472491         DO jj = 2, jpjm1                           
     
    490509      ! 
    491510      ! Note that the "unclipped" bottom friction parameter is used even with explicit drag 
    492       IF( ln_wd ) THEN 
    493         zu_frc(:,:) = zu_frc(:,:) + MAX(r1_hu_n(:,:) * bfrua(:,:),-1._wp / rdtbt) * zwx(:,:) 
    494         zv_frc(:,:) = zv_frc(:,:) + MAX(r1_hv_n(:,:) * bfrva(:,:),-1._wp / rdtbt) * zwy(:,:) 
     511      IF( ln_wd_il ) THEN 
     512        zu_frc(:,:) = zu_frc(:,:) + MAX(r1_hu_n(:,:) * bfrua(:,:),-1._wp / rdtbt) * zwx(:,:) *  wdrampu(ji,jj) 
     513        zv_frc(:,:) = zv_frc(:,:) + MAX(r1_hv_n(:,:) * bfrva(:,:),-1._wp / rdtbt) * zwy(:,:) *  wdrampv(ji,jj) 
    495514      ELSE 
    496515        zu_frc(:,:) = zu_frc(:,:) + r1_hu_n(:,:) * bfrua(:,:) * zwx(:,:) 
     
    627646      vn_adv(:,:) = 0._wp 
    628647      !                                             ! ==================== ! 
     648 
     649      IF (ln_wd_dl) THEN 
     650         zuwdmask(:,:) = 0._wp  ! set to zero for definiteness (not sure this is necessary)  
     651         zvwdmask(:,:) = 0._wp  !  
     652         zuwdav2(:,:) =  0._wp  
     653         zvwdav2(:,:) =  0._wp    
     654      END IF  
     655 
     656 
    629657      DO jn = 1, icycle                             !  sub-time-step loop  ! 
    630658         !                                          ! ==================== ! 
     
    654682            ! Extrapolate Sea Level at step jit+0.5: 
    655683            zsshp2_e(:,:) = za1 * sshn_e(:,:)  + za2 * sshb_e(:,:) + za3 * sshbb_e(:,:) 
    656             ! 
     684             
     685            ! set wetting & drying mask at tracer points for this barotropic sub-step  
     686            IF ( ln_wd_dl ) THEN  
     687 
     688               IF ( ln_wd_dl_rmp ) THEN  
     689                  DO jj = 1, jpj                                  
     690                     DO ji = 1, jpi   ! vector opt.   
     691                        IF ( zsshp2_e(ji,jj) + ht_0(ji,jj) >  2._wp * rn_wdmin1 ) THEN  
     692!                        IF ( zsshp2_e(ji,jj) + ht_0(ji,jj) >  rn_wdmin2 ) THEN  
     693                           ztwdmask(ji,jj) = 1._wp 
     694                        ELSE IF ( zsshp2_e(ji,jj) + ht_0(ji,jj) >  rn_wdmin1 ) THEN 
     695                           ztwdmask(ji,jj) = (tanh(50._wp*( ( zsshp2_e(ji,jj) + ht_0(ji,jj) -  rn_wdmin1 )*r_rn_wdmin1)) )  
     696                        ELSE  
     697                           ztwdmask(ji,jj) = 0._wp 
     698                        END IF 
     699                     END DO 
     700                  END DO 
     701               ELSE 
     702                  DO jj = 1, jpj                                  
     703                     DO ji = 1, jpi   ! vector opt.   
     704                        IF ( zsshp2_e(ji,jj) + ht_0(ji,jj) >  rn_wdmin1 ) THEN  
     705                           ztwdmask(ji,jj) = 1._wp 
     706                        ELSE  
     707                           ztwdmask(ji,jj) = 0._wp 
     708                        END IF 
     709                     END DO 
     710                  END DO 
     711               END IF  
     712 
     713            END IF  
     714            
     715 
    657716            DO jj = 2, jpjm1                                    ! Sea Surface Height at u- & v-points 
    658717               DO ji = 2, fs_jpim1   ! Vector opt. 
     
    706765         ENDIF 
    707766#endif 
    708          IF( ln_wd ) CALL wad_lmt_bt(zwx, zwy, sshn_e, zssh_frc, rdtbt) 
    709          ! 
     767         IF( ln_wd_il ) CALL wad_lmt_bt(zwx, zwy, sshn_e, zssh_frc, rdtbt) 
     768 
     769         IF ( ln_wd_dl ) THEN  
     770 
     771 
     772! un_e and vn_e are set to zero at faces where the direction of the flow is from dry cells  
     773 
     774            DO jj = 1, jpjm1                                  
     775               DO ji = 1, jpim1    
     776                  IF ( zwx(ji,jj) > 0.0 ) THEN  
     777                     zuwdmask(ji, jj) = ztwdmask(ji  ,jj)  
     778                  ELSE  
     779                     zuwdmask(ji, jj) = ztwdmask(ji+1,jj)   
     780                  END IF  
     781                  zwx(ji, jj) = zuwdmask(ji,jj)*zwx(ji, jj) 
     782                  un_e(ji,jj) = zuwdmask(ji,jj)*un_e(ji,jj) 
     783 
     784                  IF ( zwy(ji,jj) > 0.0 ) THEN 
     785                     zvwdmask(ji, jj) = ztwdmask(ji, jj  ) 
     786                  ELSE  
     787                     zvwdmask(ji, jj) = ztwdmask(ji, jj+1)   
     788                  END IF  
     789                  zwy(ji, jj) = zvwdmask(ji,jj)*zwy(ji,jj)  
     790                  vn_e(ji,jj) = zvwdmask(ji,jj)*vn_e(ji,jj) 
     791               END DO 
     792            END DO 
     793 
     794 
     795         END IF     
     796          
    710797         ! Sum over sub-time-steps to compute advective velocities 
    711798         za2 = wgtbtp2(jn) 
    712799         un_adv(:,:) = un_adv(:,:) + za2 * zwx(:,:) * r1_e2u(:,:) 
    713800         vn_adv(:,:) = vn_adv(:,:) + za2 * zwy(:,:) * r1_e1v(:,:) 
    714          ! 
     801          
     802         ! sum over sub-time-steps to decide which baroclinic velocities to set to zero (zuwdav2 is only used when ln_wd_dl_bc = True)  
     803         IF ( ln_wd_dl_bc ) THEN 
     804            zuwdav2(:,:) = zuwdav2(:,:) + za2 * zuwdmask(:,:) 
     805            zvwdav2(:,:) = zvwdav2(:,:) + za2 * zvwdmask(:,:) 
     806         END IF  
     807 
    715808         ! Set next sea level: 
    716809         DO jj = 2, jpjm1                                  
     
    766859         zsshp2_e(:,:) = za0 *  ssha_e(:,:) + za1 *  sshn_e (:,:) & 
    767860          &            + za2 *  sshb_e(:,:) + za3 *  sshbb_e(:,:) 
    768          IF( ln_wd ) THEN                   ! Calculating and applying W/D gravity filters 
     861         IF( ln_wd_il ) THEN                   ! Calculating and applying W/D gravity filters 
    769862           DO jj = 2, jpjm1 
    770863              DO ji = 2, jpim1  
    771864                ll_tmp1 = MIN( zsshp2_e(ji,jj)               , zsshp2_e(ji+1,jj) ) >                & 
    772                      &    MAX(   -ht_wd(ji,jj)               ,   -ht_wd(ji+1,jj) ) .AND.            & 
    773                      &    MAX( zsshp2_e(ji,jj) + ht_wd(ji,jj), zsshp2_e(ji+1,jj) + ht_wd(ji+1,jj) ) & 
     865                     &    MAX(    -ht_0(ji,jj)               ,    -ht_0(ji+1,jj) ) .AND.            & 
     866                     &    MAX( zsshp2_e(ji,jj) + ht_0(ji,jj) , zsshp2_e(ji+1,jj) + ht_0(ji+1,jj) ) & 
    774867                     &                                                             > rn_wdmin1 + rn_wdmin2 
    775868                ll_tmp2 = (ABS(zsshp2_e(ji,jj)               - zsshp2_e(ji+1,jj))  > 1.E-12 ).AND.( & 
    776869                     &    MAX( zsshp2_e(ji,jj)               , zsshp2_e(ji+1,jj) ) >                & 
    777                      &    MAX(   -ht_wd(ji,jj)               ,   -ht_wd(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
     870                     &    MAX(    -ht_0(ji,jj)               ,    -ht_0(ji+1,jj) ) + rn_wdmin1 + rn_wdmin2 ) 
    778871    
    779872                IF(ll_tmp1) THEN 
     
    781874                ELSE IF(ll_tmp2) THEN 
    782875                  ! no worries about  zsshp2_e(ji+1,jj) - zsshp2_e(ji  ,jj) = 0, it won't happen ! here 
    783                   zcpx(ji,jj) = ABS( (zsshp2_e(ji+1,jj) +    ht_wd(ji+1,jj) - zsshp2_e(ji,jj) - ht_wd(ji,jj)) & 
     876                  zcpx(ji,jj) = ABS( (zsshp2_e(ji+1,jj) +     ht_0(ji+1,jj) - zsshp2_e(ji,jj) - ht_0(ji,jj)) & 
    784877                              &    / (zsshp2_e(ji+1,jj) - zsshp2_e(ji  ,jj)) ) 
    785878                ELSE 
     
    788881          
    789882                ll_tmp1 = MIN( zsshp2_e(ji,jj)               , zsshp2_e(ji,jj+1) ) >                & 
    790                      &    MAX(   -ht_wd(ji,jj)               ,   -ht_wd(ji,jj+1) ) .AND.            & 
    791                      &    MAX( zsshp2_e(ji,jj) + ht_wd(ji,jj), zsshp2_e(ji,jj+1) + ht_wd(ji,jj+1) ) & 
     883                     &    MAX(    -ht_0(ji,jj)               ,    -ht_0(ji,jj+1) ) .AND.            & 
     884                     &    MAX( zsshp2_e(ji,jj) + ht_0(ji,jj) , zsshp2_e(ji,jj+1) + ht_0(ji,jj+1) ) & 
    792885                     &                                                             > rn_wdmin1 + rn_wdmin2 
    793886                ll_tmp2 = (ABS(zsshp2_e(ji,jj)               - zsshp2_e(ji,jj+1))  > 1.E-12 ).AND.( & 
    794887                     &    MAX( zsshp2_e(ji,jj)               , zsshp2_e(ji,jj+1) ) >                & 
    795                      &    MAX(   -ht_wd(ji,jj)               ,   -ht_wd(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
     888                     &    MAX(    -ht_0(ji,jj)               ,    -ht_0(ji,jj+1) ) + rn_wdmin1 + rn_wdmin2 ) 
    796889    
    797890                IF(ll_tmp1) THEN 
     
    799892                ELSE IF(ll_tmp2) THEN 
    800893                  ! no worries about  zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj  ) = 0, it won't happen ! here 
    801                   zcpy(ji,jj) = ABS( (zsshp2_e(ji,jj+1) +    ht_wd(ji,jj+1) - zsshp2_e(ji,jj) - ht_wd(ji,jj)) & 
     894                  zcpy(ji,jj) = ABS( (zsshp2_e(ji,jj+1) +     ht_0(ji,jj+1) - zsshp2_e(ji,jj) - ht_0(ji,jj)) & 
    802895                              &    / (zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj  )) ) 
    803896                ELSE 
     
    809902         ! 
    810903         ! Compute associated depths at U and V points: 
    811          IF( .NOT.ln_linssh  .AND. .NOT.ln_dynadv_vec ) THEN   !* Vector form 
     904         IF( .NOT.ln_linssh  .AND. .NOT.ln_dynadv_vec ) THEN     !* Vector form 
    812905            !                                         
    813906            DO jj = 2, jpjm1                             
     
    886979         ! 
    887980         ! Add bottom stresses: 
    888          zu_trd(:,:) = zu_trd(:,:) + bfrua(:,:) * un_e(:,:) * hur_e(:,:) 
    889          zv_trd(:,:) = zv_trd(:,:) + bfrva(:,:) * vn_e(:,:) * hvr_e(:,:) 
     981!jth do implicitly instead 
     982         IF ( .NOT. ll_wd ) THEN ! Revert to explicit for bit comparison tests in non wad runs 
     983            zu_trd(:,:) = zu_trd(:,:) + bfrua(:,:) * un_e(:,:) * hur_e(:,:) 
     984            zv_trd(:,:) = zv_trd(:,:) + bfrva(:,:) * vn_e(:,:) * hvr_e(:,:) 
     985         ENDIF  
    890986         ! 
    891987         ! Add top stresses: 
     
    895991         ! Surface pressure trend: 
    896992 
    897          IF( ln_wd ) THEN 
     993         IF( ln_wd_il ) THEN 
    898994           DO jj = 2, jpjm1 
    899995              DO ji = 2, jpim1  
     
    9191015         ! 
    9201016         ! Set next velocities: 
    921          IF( ln_dynadv_vec .OR. ln_linssh ) THEN   !* Vector form 
     1017         IF( ln_dynadv_vec .OR. ln_linssh ) THEN      !* Vector form 
    9221018            DO jj = 2, jpjm1 
    9231019               DO ji = fs_2, fs_jpim1   ! vector opt. 
     
    9331029                            &                                 + zv_frc(ji,jj) ) & 
    9341030                            &   ) * ssvmask(ji,jj) 
     1031  
     1032!jth implicit bottom friction: 
     1033                  IF ( ll_wd ) THEN ! revert to explicit for bit comparison tests in non wad runs 
     1034                     ua_e(ji,jj) =  ua_e(ji,jj) /(1.0 -   rdtbt * bfrua(ji,jj) * hur_e(ji,jj)) 
     1035                     va_e(ji,jj) =  va_e(ji,jj) /(1.0 -   rdtbt * bfrva(ji,jj) * hvr_e(ji,jj)) 
     1036                  ENDIF 
     1037 
    9351038               END DO 
    9361039            END DO 
    9371040            ! 
    938          ELSE                                      !* Flux form 
     1041         ELSE                           !* Flux form 
    9391042            DO jj = 2, jpjm1 
    9401043               DO ji = fs_2, fs_jpim1   ! vector opt. 
    9411044 
    942                   IF( ln_wd ) THEN 
    943                     zhura = MAX(hu_0(ji,jj) + zsshu_a(ji,jj), rn_wdmin1) 
    944                     zhvra = MAX(hv_0(ji,jj) + zsshv_a(ji,jj), rn_wdmin1) 
    945                   ELSE 
    946                     zhura = hu_0(ji,jj) + zsshu_a(ji,jj) 
    947                     zhvra = hv_0(ji,jj) + zsshv_a(ji,jj) 
    948                   END IF 
     1045                  zhura = hu_0(ji,jj) + zsshu_a(ji,jj) 
     1046                  zhvra = hv_0(ji,jj) + zsshv_a(ji,jj) 
     1047 
    9491048                  zhura = ssumask(ji,jj)/(zhura + 1._wp - ssumask(ji,jj)) 
    9501049                  zhvra = ssvmask(ji,jj)/(zhvra + 1._wp - ssvmask(ji,jj)) 
     
    9641063            END DO 
    9651064         ENDIF 
    966          ! 
     1065 
     1066          
    9671067         IF( .NOT.ln_linssh ) THEN                     !* Update ocean depth (variable volume case only) 
    968             IF( ln_wd ) THEN 
    969               hu_e (:,:) = MAX(hu_0(:,:) + zsshu_a(:,:), rn_wdmin1) 
    970               hv_e (:,:) = MAX(hv_0(:,:) + zsshv_a(:,:), rn_wdmin1) 
    971             ELSE 
    972               hu_e (:,:) = hu_0(:,:) + zsshu_a(:,:) 
    973               hv_e (:,:) = hv_0(:,:) + zsshv_a(:,:) 
    974             END IF 
     1068            hu_e (:,:) = hu_0(:,:) + zsshu_a(:,:) 
     1069            hv_e (:,:) = hv_0(:,:) + zsshv_a(:,:) 
    9751070            hur_e(:,:) = ssumask(:,:) / ( hu_e(:,:) + 1._wp - ssumask(:,:) ) 
    9761071            hvr_e(:,:) = ssvmask(:,:) / ( hv_e(:,:) + 1._wp - ssvmask(:,:) ) 
     
    10051100            ua_b  (:,:) = ua_b  (:,:) + za1 * ua_e  (:,:)  
    10061101            va_b  (:,:) = va_b  (:,:) + za1 * va_e  (:,:)  
    1007          ELSE                                              ! Sum transports 
    1008             ua_b  (:,:) = ua_b  (:,:) + za1 * ua_e  (:,:) * hu_e (:,:) 
    1009             va_b  (:,:) = va_b  (:,:) + za1 * va_e  (:,:) * hv_e (:,:) 
    1010          ENDIF 
    1011          !                                   ! Sum sea level 
     1102         ELSE                                       ! Sum transports 
     1103            IF ( .NOT.ln_wd_dl ) THEN   
     1104               ua_b  (:,:) = ua_b  (:,:) + za1 * ua_e  (:,:) * hu_e (:,:) 
     1105               va_b  (:,:) = va_b  (:,:) + za1 * va_e  (:,:) * hv_e (:,:) 
     1106            ELSE  
     1107               ua_b  (:,:) = ua_b  (:,:) + za1 * ua_e  (:,:) * hu_e (:,:) * zuwdmask(:,:) 
     1108               va_b  (:,:) = va_b  (:,:) + za1 * va_e  (:,:) * hv_e (:,:) * zvwdmask(:,:) 
     1109            END IF  
     1110         ENDIF 
     1111         !                                          ! Sum sea level 
    10121112         ssha(:,:) = ssha(:,:) + za1 * ssha_e(:,:) 
     1113 
    10131114         !                                                 ! ==================== ! 
    10141115      END DO                                               !        end loop      ! 
     
    10331134         vb2_b(:,:) = zwy(:,:) 
    10341135      ENDIF 
     1136 
     1137 
    10351138      ! 
    10361139      ! Update barotropic trend: 
     
    10621165         va_b(:,:) =  va_b(:,:) / ( hv_0(:,:) + zsshv_a(:,:) + 1._wp - ssvmask(:,:) ) 
    10631166      ENDIF 
    1064       ! 
     1167 
     1168 
     1169      ! Correct velocities so that the barotropic velocity equals (un_adv, vn_adv) (in all cases)   
    10651170      DO jk = 1, jpkm1 
    1066          ! Correct velocities: 
    10671171         un(:,:,jk) = ( un(:,:,jk) + un_adv(:,:) - un_b(:,:) ) * umask(:,:,jk) 
    10681172         vn(:,:,jk) = ( vn(:,:,jk) + vn_adv(:,:) - vn_b(:,:) ) * vmask(:,:,jk) 
    1069          ! 
    10701173      END DO 
    1071       ! 
     1174 
     1175      IF ( ln_wd_dl .and. ln_wd_dl_bc) THEN  
     1176         DO jk = 1, jpkm1 
     1177            un(:,:,jk) = ( un_adv(:,:) + zuwdav2(:,:)*(un(:,:,jk) - un_adv(:,:)) ) * umask(:,:,jk)  
     1178            vn(:,:,jk) = ( vn_adv(:,:) + zvwdav2(:,:)*(vn(:,:,jk) - vn_adv(:,:)) ) * vmask(:,:,jk)   
     1179         END DO 
     1180      END IF  
     1181 
     1182       
    10721183      CALL iom_put(  "ubar", un_adv(:,:)      )    ! barotropic i-current 
    10731184      CALL iom_put(  "vbar", vn_adv(:,:)      )    ! barotropic i-current 
     
    10971208      CALL wrk_dealloc( jpi,jpj,   zsshu_a, zsshv_a                                   ) 
    10981209      CALL wrk_dealloc( jpi,jpj,   zhf ) 
    1099       IF( ln_wd ) CALL wrk_dealloc( jpi, jpj, zcpx, zcpy ) 
     1210      IF( ln_wd_il ) CALL wrk_dealloc( jpi, jpj, zcpx, zcpy ) 
     1211      IF( ln_wd_dl ) CALL wrk_dealloc( jpi, jpj, ztwdmask, zuwdmask, zvwdmask, zuwdav2, zvwdav2 ) 
    11001212      ! 
    11011213      IF ( ln_diatmb ) THEN 
     
    12711383      rdtbt = rdt / REAL( nn_baro , wp ) 
    12721384      zcmax = zcmax * rdtbt 
    1273                      ! Print results 
     1385      ! Print results 
    12741386      IF(lwp) WRITE(numout,*) 
    12751387      IF(lwp) WRITE(numout,*) 'dyn_spg_ts : split-explicit free surface' 
Note: See TracChangeset for help on using the changeset viewer.