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 5066 for branches/UKMO/2014_Surge_Modelling/NEMOGCM/NEMO/OPA_SRC/DYN – NEMO

Ignore:
Timestamp:
2015-02-06T17:02:20+01:00 (9 years ago)
Author:
rfurner
Message:

added current state of wetting and drying code to test...note it does not work

Location:
branches/UKMO/2014_Surge_Modelling/NEMOGCM/NEMO/OPA_SRC/DYN
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/2014_Surge_Modelling/NEMOGCM/NEMO/OPA_SRC/DYN/dynhpg.F90

    r4794 r5066  
    1616   !!            3.4  !  2011-11  (H. Liu) hpg_prj: Original code for s-coordinates 
    1717   !!                 !           (A. Coward) suppression of hel, wdj and rot options 
     18   !!            3.6? !  2014-09  (H. Liu) add Wetting/Drying pressure filter 
    1819   !!---------------------------------------------------------------------- 
    1920 
     
    369370      !! 
    370371      INTEGER  ::   ji, jj, jk                 ! dummy loop indices 
    371       REAL(wp) ::   zcoef0, zuap, zvap, znad   ! temporary scalars 
     372      REAL(wp) ::   zcoef0, zuap, zvap, znad, ztmp   ! temporary scalars 
     373      LOGICAL  ::   ll_tmp1, ll_tmp2           ! local logical variables 
    372374      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zhpi, zhpj 
     375      REAL(wp), POINTER, DIMENSION(:,:)   ::  zcpx, zcpy    !W/D pressure filter 
    373376      !!---------------------------------------------------------------------- 
    374377      ! 
    375378      CALL wrk_alloc( jpi,jpj,jpk, zhpi, zhpj ) 
     379      IF(ln_wd) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 
    376380      ! 
    377381      IF( kt == nit000 ) THEN 
     
    386390      IF ( lk_vvl ) THEN   ;     znad = 1._wp          ! Variable volume 
    387391      ELSE                 ;     znad = 0._wp         ! Fixed volume 
     392      ENDIF 
     393 
     394      IF(ln_wd) THEN 
     395        DO jj = 2, jpjm1 
     396           DO ji = 2, jpim1 
     397             ll_tmp1 = MIN(sshn(ji,jj), sshn(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) 
     398             ll_tmp2 = MAX(sshn(ji,jj), sshn(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) +& 
     399                                                       & rn_wdmin1 + rn_wdmin2 
     400 
     401             IF(ll_tmp1) THEN 
     402               zcpx(ji,jj) = 1.0_wp 
     403             ELSE IF(ll_tmp2) THEN 
     404               ! no worries about sshn(ji+1,jj)-sshn(ji,jj) = 0, it won't happen ! here 
     405               zcpx(ji,jj) = ABS((sshn(ji+1,jj) + bathy(ji+1,jj) - sshn(ji,jj) - bathy(ji,jj)) /& 
     406                           &     (sshn(ji+1,jj) - sshn(ji,jj))) 
     407             ELSE 
     408               zcpx(ji,jj) = 0._wp 
     409             END IF 
     410      
     411             ll_tmp1 = MIN(sshn(ji,jj), sshn(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) 
     412             ll_tmp2 = MAX(sshn(ji,jj), sshn(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) +& 
     413                                                       & rn_wdmin1 + rn_wdmin2 
     414 
     415             IF(ll_tmp1) THEN 
     416               zcpy(ji,jj) = 1.0_wp 
     417             ELSE IF(ll_tmp2) THEN 
     418               ! no worries about sshn(ji,jj+1)-sshn(ji,jj) = 0, it won't happen ! here 
     419               zcpy(ji,jj) = ABS((sshn(ji,jj+1) + bathy(ji,jj+1) - sshn(ji,jj) - bathy(ji,jj)) /& 
     420                           &     (sshn(ji,jj+1) - sshn(ji,jj))) 
     421             ELSE 
     422               zcpy(ji,jj) = 0._wp 
     423             END IF 
     424           END DO 
     425        END DO 
     426        CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
    388427      ENDIF 
    389428 
     
    402441            zvap = -zcoef0 * ( 2._wp * znad )   & 
    403442               &           * ( fsde3w(ji,jj+1,1) - fsde3w(ji,jj,1) ) / e2v(ji,jj) 
     443 
     444            IF(ln_wd) THEN 
     445              zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
     446              zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj) 
     447              zuap = zuap * zcpx(ji,jj) 
     448              zvap = zvap * zcpy(ji,jj) 
     449            ENDIF 
     450 
    404451            ! add to the general momentum trend 
    405452            ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap 
     
    424471               zvap = -zcoef0 * ( 2._wp * znad )   & 
    425472                  &           * ( fsde3w(ji  ,jj+1,jk) - fsde3w(ji,jj,jk) ) / e2v(ji,jj) 
     473 
     474               IF(ln_wd) THEN 
     475                 zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
     476                 zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj) 
     477                 zuap = zuap * zcpx(ji,jj) 
     478                 zvap = zvap * zcpy(ji,jj) 
     479               ENDIF 
     480 
    426481               ! add to the general momentum trend 
    427482               ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) + zuap 
     
    445500            zvap = -zcoef0 * ( rhd   (ji,jj+1,1) + rhd   (ji,jj,1) + 2._wp * znad )   & 
    446501               &           * ( fsde3w(ji,jj+1,1) - fsde3w(ji,jj,1) ) / e2v(ji,jj) 
     502 
     503            IF(ln_wd) THEN 
     504              zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
     505              zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj) 
     506              zuap = zuap * zcpx(ji,jj) 
     507              zvap = zvap * zcpy(ji,jj) 
     508            ENDIF 
     509 
    447510            ! add to the general momentum trend 
    448511            ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) + zuap 
     
    467530               zvap = -zcoef0 * ( rhd   (ji  ,jj+1,jk) + rhd   (ji,jj,jk) + 2._wp * znad )   & 
    468531                  &           * ( fsde3w(ji  ,jj+1,jk) - fsde3w(ji,jj,jk) ) / e2v(ji,jj) 
     532 
     533               IF(ln_wd) THEN 
     534                 zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
     535                 zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj) 
     536                 zuap = zuap * zcpx(ji,jj) 
     537                 zvap = zvap * zcpy(ji,jj) 
     538               ENDIF 
     539 
    469540               ! add to the general momentum trend 
    470541               ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) + zuap 
     
    476547      ! 
    477548      CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zhpj ) 
     549      IF(ln_wd) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 
    478550      ! 
    479551   END SUBROUTINE hpg_sco 
     
    493565      REAL(wp) ::   z1_10, cffu, cffx   !    "         " 
    494566      REAL(wp) ::   z1_12, cffv, cffy   !    "         " 
     567      LOGICAL  ::   ll_tmp1, ll_tmp2    ! local logical variables 
    495568      REAL(wp), POINTER, DIMENSION(:,:,:) ::  zhpi, zhpj 
    496569      REAL(wp), POINTER, DIMENSION(:,:,:) ::  dzx, dzy, dzz, dzu, dzv, dzw 
    497570      REAL(wp), POINTER, DIMENSION(:,:,:) ::  drhox, drhoy, drhoz, drhou, drhov, drhow 
    498571      REAL(wp), POINTER, DIMENSION(:,:,:) ::  rho_i, rho_j, rho_k 
     572      REAL(wp), POINTER, DIMENSION(:,:)   ::  zcpx, zcpy    !W/D pressure filter 
    499573      !!---------------------------------------------------------------------- 
    500574      ! 
     
    502576      CALL wrk_alloc( jpi, jpj, jpk, drhox, drhoy, drhoz, drhou, drhov, drhow ) 
    503577      CALL wrk_alloc( jpi, jpj, jpk, rho_i, rho_j, rho_k,  zhpi,  zhpj        ) 
     578      IF(ln_wd) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 
    504579      ! 
    505580 
     
    508583         IF(lwp) WRITE(numout,*) 'dyn:hpg_djc : hydrostatic pressure gradient trend' 
    509584         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   s-coordinate case, density Jacobian with cubic polynomial scheme' 
     585      ENDIF 
     586 
     587      IF(ln_wd) THEN 
     588        DO jj = 2, jpjm1 
     589           DO ji = 2, jpim1 
     590             ll_tmp1 = MIN(sshn(ji,jj), sshn(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) 
     591             ll_tmp2 = MAX(sshn(ji,jj), sshn(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) +& 
     592                                                       & rn_wdmin1 + rn_wdmin2 
     593 
     594             IF(ll_tmp1) THEN 
     595               zcpx(ji,jj) = 1.0_wp 
     596             ELSE IF(ll_tmp2) THEN 
     597               ! no worries about sshn(ji+1,jj)-sshn(ji,jj) = 0, it won't happen ! here 
     598               zcpx(ji,jj) = ABS((sshn(ji+1,jj) + bathy(ji+1,jj) - sshn(ji,jj) - bathy(ji,jj)) /& 
     599                           &     (sshn(ji+1,jj) - sshn(ji,jj))) 
     600             ELSE 
     601               zcpx(ji,jj) = 0._wp 
     602             END IF 
     603      
     604             ll_tmp1 = MIN(sshn(ji,jj), sshn(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) 
     605             ll_tmp2 = MAX(sshn(ji,jj), sshn(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) +& 
     606                                                       & rn_wdmin1 + rn_wdmin2 
     607 
     608             IF(ll_tmp1) THEN 
     609               zcpy(ji,jj) = 1.0_wp 
     610             ELSE IF(ll_tmp2) THEN 
     611               ! no worries about sshn(ji,jj+1)-sshn(ji,jj) = 0, it won't happen ! here 
     612               zcpy(ji,jj) = ABS((sshn(ji,jj+1) + bathy(ji,jj+1) - sshn(ji,jj) - bathy(ji,jj)) /& 
     613                           &     (sshn(ji,jj+1) - sshn(ji,jj))) 
     614             ELSE 
     615               zcpy(ji,jj) = 0._wp 
     616             END IF 
     617           END DO 
     618        END DO 
     619        CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
    510620      ENDIF 
    511621 
     
    673783            zhpi(ji,jj,1) = ( rho_k(ji+1,jj  ,1) - rho_k(ji,jj,1) - rho_i(ji,jj,1) ) / e1u(ji,jj) 
    674784            zhpj(ji,jj,1) = ( rho_k(ji  ,jj+1,1) - rho_k(ji,jj,1) - rho_j(ji,jj,1) ) / e2v(ji,jj) 
     785            IF(ln_wd) THEN 
     786              zhpi(ji,jj,1) = zhpi(ji,jj,1) * zcpx(ji,jj) 
     787              zhpj(ji,jj,1) = zhpj(ji,jj,1) * zcpy(ji,jj) 
     788            ENDIF 
    675789            ! add to the general momentum trend 
    676790            ua(ji,jj,1) = ua(ji,jj,1) + zhpi(ji,jj,1) 
     
    692806                  &           + (  ( rho_k(ji,jj+1,jk) - rho_k(ji,jj,jk  ) )    & 
    693807                  &               -( rho_j(ji,jj  ,jk) - rho_j(ji,jj,jk-1) )  ) / e2v(ji,jj) 
     808               IF(ln_wd) THEN 
     809                 zhpi(ji,jj,jk) = zhpi(ji,jj,jk) * zcpx(ji,jj) 
     810                 zhpj(ji,jj,jk) = zhpj(ji,jj,jk) * zcpy(ji,jj) 
     811               ENDIF 
    694812               ! add to the general momentum trend 
    695813               ua(ji,jj,jk) = ua(ji,jj,jk) + zhpi(ji,jj,jk) 
     
    702820      CALL wrk_dealloc( jpi, jpj, jpk, drhox, drhoy, drhoz, drhou, drhov, drhow ) 
    703821      CALL wrk_dealloc( jpi, jpj, jpk, rho_i, rho_j, rho_k,  zhpi,  zhpj        ) 
     822      IF(ln_wd) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 
    704823      ! 
    705824   END SUBROUTINE hpg_djc 
     
    727846      !! The local variables for the correction term 
    728847      INTEGER  :: jk1, jis, jid, jjs, jjd 
     848      LOGICAL  :: ll_tmp1, ll_tmp2                  ! local logical variables 
    729849      REAL(wp) :: zuijk, zvijk, zpwes, zpwed, zpnss, zpnsd, zdeps 
    730850      REAL(wp) :: zrhdt1 
     
    732852      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zdept, zrhh 
    733853      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp 
     854      REAL(wp), POINTER, DIMENSION(:,:)   ::   zcpx, zcpy    !W/D pressure filter 
    734855      !!---------------------------------------------------------------------- 
    735856      ! 
    736857      CALL wrk_alloc( jpi,jpj,jpk, zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp ) 
    737858      CALL wrk_alloc( jpi,jpj,jpk, zdept, zrhh ) 
     859      IF(ln_wd) CALL wrk_alloc( jpi,jpj, zcpx, zcpy ) 
    738860      ! 
    739861      IF( kt == nit000 ) THEN 
     
    748870      znad = 0.0_wp 
    749871      IF( lk_vvl ) znad = 1._wp 
     872 
     873      IF(ln_wd) THEN 
     874        DO jj = 2, jpjm1 
     875           DO ji = 2, jpim1 
     876             ll_tmp1 = MIN(sshn(ji,jj), sshn(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) 
     877             ll_tmp2 = MAX(sshn(ji,jj), sshn(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) +& 
     878                                                       & rn_wdmin1 + rn_wdmin2 
     879 
     880             IF(ll_tmp1) THEN 
     881               zcpx(ji,jj) = 1.0_wp 
     882             ELSE IF(ll_tmp2) THEN 
     883               ! no worries about sshn(ji+1,jj)-sshn(ji,jj) = 0, it won't happen ! here 
     884               zcpx(ji,jj) = ABS((sshn(ji+1,jj) + bathy(ji+1,jj) - sshn(ji,jj) - bathy(ji,jj)) /& 
     885                           &     (sshn(ji+1,jj) - sshn(ji,jj))) 
     886             ELSE 
     887               zcpx(ji,jj) = 0._wp 
     888             END IF 
     889      
     890             ll_tmp1 = MIN(sshn(ji,jj), sshn(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) 
     891             ll_tmp2 = MAX(sshn(ji,jj), sshn(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) +& 
     892                                                       & rn_wdmin1 + rn_wdmin2 
     893 
     894             IF(ll_tmp1.OR.ll_tmp2) THEN 
     895               zcpy(ji,jj) = 1.0_wp 
     896             ELSE IF(ll_tmp2) THEN 
     897               ! no worries about sshn(ji,jj+1)-sshn(ji,jj) = 0, it won't happen ! here 
     898               zcpy(ji,jj) = ABS((sshn(ji,jj+1) + bathy(ji,jj+1) - sshn(ji,jj) - bathy(ji,jj)) /& 
     899                           &     (sshn(ji,jj+1) - sshn(ji,jj))) 
     900             ELSE 
     901               zcpy(ji,jj) = 0._wp 
     902             END IF 
     903           END DO 
     904        END DO 
     905        CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
     906      ENDIF 
    750907 
    751908      ! Clean 3-D work arrays 
     
    9071064               ENDIF 
    9081065 
    909                ua(ji,jj,jk) = ua(ji,jj,jk) + (zdpdx1 + zdpdx2) * & 
    910                &           umask(ji,jj,jk) * tmask(ji,jj,jk) * tmask(ji+1,jj,jk) 
     1066               IF(ln_wd) THEN 
     1067                  zdpdx1 = zdpdx1 * zcpx(ji,jj) 
     1068                  zdpdx2 = zdpdx2 * zcpx(ji,jj) 
     1069                ENDIF 
     1070                ua(ji,jj,jk) = ua(ji,jj,jk) + (zdpdx1 + zdpdx2) * umask(ji,jj,jk)  
    9111071            ENDIF 
    9121072 
     
    9641124               ENDIF 
    9651125 
    966                va(ji,jj,jk) = va(ji,jj,jk) + (zdpdy1 + zdpdy2)*& 
    967                &              vmask(ji,jj,jk)*tmask(ji,jj,jk)*tmask(ji,jj+1,jk) 
     1126               IF(ln_wd) THEN 
     1127                  zdpdy1 = zdpdy1 * zcpy(ji,jj) 
     1128                  zdpdy2 = zdpdy2 * zcpy(ji,jj) 
     1129               ENDIF 
     1130 
     1131               va(ji,jj,jk) = va(ji,jj,jk) + (zdpdy1 + zdpdy2) * vmask(ji,jj,jk) 
    9681132            ENDIF 
    9691133 
     
    9751139      CALL wrk_dealloc( jpi,jpj,jpk, zhpi, zu, zv, fsp, xsp, asp, bsp, csp, dsp ) 
    9761140      CALL wrk_dealloc( jpi,jpj,jpk, zdept, zrhh ) 
     1141      IF(ln_wd) CALL wrk_dealloc( jpi,jpj, zcpx, zcpy ) 
    9771142      ! 
    9781143   END SUBROUTINE hpg_prj 
  • branches/UKMO/2014_Surge_Modelling/NEMOGCM/NEMO/OPA_SRC/DYN/dynspg_ts.F90

    r4624 r5066  
    1111   !!             3.5  ! 2013-07  (J. Chanut) Switch to Forward-backward time stepping 
    1212   !!             3.6  ! 2013-11  (A. Coward) Update for z-tilde compatibility 
     13   !!             3.?  ! 2014-09  (H. Liu) Add Wetting/Drying components 
    1314   !!--------------------------------------------------------------------- 
    1415#if defined key_dynspg_ts   ||   defined key_esopa 
     
    4041   USE timing          ! Timing     
    4142   USE sbcapr          ! surface boundary condition: atmospheric pressure 
     43   USE wadlmt          ! wetting/drying flux limter 
    4244   USE dynadv, ONLY: ln_dynadv_vec 
    4345#if defined key_agrif 
     
    137139      INTEGER, INTENT(in)  ::   kt   ! ocean time-step index 
    138140      ! 
    139       LOGICAL  ::   ll_fw_start        ! if true, forward integration  
    140       LOGICAL  ::   ll_init             ! if true, special startup of 2d equations 
    141       INTEGER  ::   ji, jj, jk, jn        ! dummy loop indices 
    142       INTEGER  ::   ikbu, ikbv, noffset      ! local integers 
    143       REAL(wp) ::   zraur, z1_2dt_b, z2dt_bf    ! local scalars 
    144       REAL(wp) ::   zx1, zy1, zx2, zy2         !   -      - 
    145       REAL(wp) ::   z1_12, z1_8, z1_4, z1_2    !   -      - 
    146       REAL(wp) ::   zu_spg, zv_spg             !   -      - 
    147       REAL(wp) ::   zhura, zhvra               !   -      - 
    148       REAL(wp) ::   za0, za1, za2, za3           !   -      - 
     141      LOGICAL  ::   ll_fw_start                 ! if true, forward integration 
     142      LOGICAL  ::   ll_init                         ! if true, special startup of 2d equations 
     143      LOGICAL  ::   ll_tmp1, ll_tmp2            ! local logical variables used in W/D 
     144      INTEGER  ::   ji, jj, jk, jn              ! dummy loop indices 
     145      INTEGER  ::   ikbu, ikbv, noffset         ! local integers 
     146      REAL(wp) ::   zraur, z1_2dt_b, z2dt_bf    ! local scalars 
     147      REAL(wp) ::   zx1, zy1, zx2, zy2          !   -      - 
     148      REAL(wp) ::   z1_12, z1_8, z1_4, z1_2     !   -      - 
     149      REAL(wp) ::   zu_spg, zv_spg              !   -      - 
     150      REAL(wp) ::   zhura, zhvra                !   -      - 
     151      REAL(wp) ::   za0, za1, za2, za3          !   -      - 
     152 
     153      REAL(wp) ::   ztmp                       ! temporary vaialbe 
    149154      ! 
    150155      REAL(wp), POINTER, DIMENSION(:,:) :: zun_e, zvn_e, zsshp2_e 
     
    154159      REAL(wp), POINTER, DIMENSION(:,:) :: zsshu_a, zsshv_a 
    155160      REAL(wp), POINTER, DIMENSION(:,:) :: zhf 
     161      REAL(wp), POINTER, DIMENSION(:,:) :: zcpx, zcpy                 ! Wetting/Dying gravity filter coef. 
    156162      !!---------------------------------------------------------------------- 
    157163      ! 
     
    165171      CALL wrk_alloc( jpi, jpj, zsshu_a, zsshv_a                                   ) 
    166172      CALL wrk_alloc( jpi, jpj, zhf ) 
     173      IF(ln_wd) CALL wrk_alloc( jpi, jpj, zcpx, zcpy ) 
    167174      ! 
    168175      !                                         !* Local constant initialization 
     
    173180      zraur = 1._wp / rau0 
    174181      ! 
    175       IF( kt == nit000 .AND. neuler == 0 ) THEN    ! reciprocal of baroclinic time step  
     182      IF( kt == nit000 .AND. neuler == 0 ) THEN  ! reciprocal of baroclinic time step  
    176183        z2dt_bf = rdt 
    177184      ELSE 
     
    180187      z1_2dt_b = 1.0_wp / z2dt_bf  
    181188      ! 
    182       ll_init = ln_bt_av                           ! if no time averaging, then no specific restart  
     189      ll_init = ln_bt_av                       ! if no time averaging, then no specific restart  
    183190      ll_fw_start = .FALSE. 
    184191      ! 
    185                                                        ! time offset in steps for bdy data update 
     192                                                     ! time offset in steps for bdy data update 
    186193      IF (.NOT.ln_bt_fw) THEN ; noffset=-2*nn_baro ; ELSE ;  noffset = 0 ; ENDIF 
    187194      ! 
    188       IF( kt == nit000 ) THEN                !* initialisation 
     195      IF( kt == nit000 ) THEN             !* initialisation 
    189196         ! 
    190197         IF(lwp) WRITE(numout,*) 
     
    365372      !                                   ! ---------------------------------------------------- 
    366373      IF( lk_vvl ) THEN                         ! Variable volume : remove surface pressure gradient 
    367          DO jj = 2, jpjm1  
    368             DO ji = fs_2, fs_jpim1   ! vector opt. 
    369                zu_trd(ji,jj) = zu_trd(ji,jj) - grav * (  sshn(ji+1,jj  ) - sshn(ji  ,jj  )  ) / e1u(ji,jj) 
    370                zv_trd(ji,jj) = zv_trd(ji,jj) - grav * (  sshn(ji  ,jj+1) - sshn(ji  ,jj  )  ) / e2v(ji,jj) 
    371             END DO 
    372          END DO 
     374        IF(ln_wd) THEN                    ! Calculating and applying W/D gravity filters 
     375          DO jj = 2, jpjm1 
     376             DO ji = 2, jpim1 
     377                ll_tmp1 = MIN(sshn(ji,jj), sshn(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) 
     378                ll_tmp2 = MAX(sshn(ji,jj), sshn(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) + & 
     379                                                          & rn_wdmin1 + rn_wdmin2 
     380                IF(ll_tmp1) THEN 
     381                  zcpx(ji,jj) = 1.0_wp 
     382                ELSE IF(ll_tmp2) THEN 
     383                   ! no worries about sshn(ji+1,jj)-sshn(ji,jj) = 0, it won't happen ! here 
     384                  zcpx(ji,jj) = ABS((sshn(ji+1,jj) + bathy(ji+1,jj) - sshn(ji,jj) - bathy(ji,jj)) /& 
     385                              &     (sshn(ji+1,jj) - sshn(ji,jj))) 
     386                ELSE 
     387                   zcpx(ji,jj) = 0._wp 
     388                END IF 
     389 
     390                ll_tmp1 = MIN(sshn(ji,jj), sshn(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) 
     391                ll_tmp2 = MAX(sshn(ji,jj), sshn(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) + & 
     392                                                          & rn_wdmin1 + rn_wdmin2 
     393                IF(ll_tmp1) THEN 
     394                   zcpy(ji,jj) = 1.0_wp 
     395                ELSE IF(ll_tmp2) THEN 
     396                   ! no worries about sshn(ji,jj+1)-sshn(ji,jj) = 0, it won't happen ! here 
     397                  zcpy(ji,jj) = ABS((sshn(ji,jj+1) + bathy(ji,jj+1) - sshn(ji,jj) + bathy(ji,jj)) /& 
     398                              &     (sshn(ji,jj+1) - sshn(ji,jj))) 
     399                ELSE 
     400                  zcpy(ji,jj) = 0._wp 
     401                END IF 
     402             END DO 
     403           END DO 
     404           CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
     405        ENDIF 
     406 
     407        IF(ln_wd) THEN                    ! Calculating and applying W/D gravity filters 
     408           DO jj = 2, jpjm1 
     409              DO ji = 2, jpim1 
     410                 zu_trd(ji,jj) = zu_trd(ji,jj) - grav * ( sshn(ji+1,jj  ) - sshn(ji  ,jj ) ) / & 
     411                               &                 e1u(ji,jj) * zcpx(ji,jj) 
     412                 zv_trd(ji,jj) = zv_trd(ji,jj) - grav * ( sshn(ji  ,jj+1) - sshn(ji  ,jj ) ) / & 
     413                               &                 e2v(ji,jj) * zcpy(ji,jj) 
     414              END DO 
     415           END DO 
     416         ELSE 
     417           DO jj = 2, jpjm1 
     418              DO ji = fs_2, fs_jpim1   ! vector opt. 
     419                 zu_trd(ji,jj) = zu_trd(ji,jj) - grav * (  sshn(ji+1,jj  ) - sshn(ji  ,jj  )  ) / e1u(ji,jj) 
     420                 zv_trd(ji,jj) = zv_trd(ji,jj) - grav * (  sshn(ji  ,jj+1) - sshn(ji  ,jj  )  ) / e2v(ji,jj) 
     421              END DO 
     422           END DO 
     423        END IF 
    373424      ENDIF 
    374425 
     
    464515      !                                             ! ==================== !   
    465516      ! Initialize barotropic variables:       
     517 
     518      IF(ln_wd) THEN      !preserve the positivity of water depth 
     519                          !ssh[b,n,a] should have already been processed for this 
     520         sshbb_e(:,:) = MAX(sshbb_e(:,:), rn_wdmin1 - bathy(:,:)) 
     521         sshb_e(:,:)  = MAX(sshb_e(:,:) , rn_wdmin1 - bathy(:,:)) 
     522      ENDIF 
     523 
    466524      IF (ln_bt_fw) THEN                  ! FORWARD integration: start from NOW fields                     
    467525         sshn_e(:,:) = sshn (:,:)             
     
    537595            zhup2_e (:,:) = hu_0(:,:) + zwx(:,:)                ! Ocean depth at U- and V-points 
    538596            zhvp2_e (:,:) = hv_0(:,:) + zwy(:,:) 
     597            IF(ln_wd) THEN 
     598              zhup2_e(:,:) = MAX(zhup2_e (:,:), rn_wdmin1) 
     599              zhvp2_e(:,:) = MAX(zhvp2_e (:,:), rn_wdmin1) 
     600            END IF 
    539601         ELSE 
    540602            zhup2_e (:,:) = hu(:,:) 
     
    575637         ENDIF 
    576638#endif 
     639         IF(ln_wd) CALL wad_lmt_bt(zwx, zwy, sshn_e, zssh_frc, rdtbt) 
    577640         ! 
    578641         ! Sum over sub-time-steps to compute advective velocities 
     
    589652         END DO 
    590653         ssha_e(:,:) = (  sshn_e(:,:) - rdtbt * ( zssh_frc(:,:) + zhdiv(:,:) )  ) * tmask(:,:,1) 
     654         IF(ln_wd) ssha_e(:,:) = MAX(ssha_e(:,:), rn_wdmin1 - bathy(:,:))  
    591655         CALL lbc_lnk( ssha_e, 'T',  1._wp ) 
    592656 
     
    652716               END DO 
    653717            END DO 
     718 
     719            IF(ln_wd) THEN 
     720              zhust_e(:,:) = MAX(zhust_e (:,:), rn_wdmin1 ) 
     721              zhvst_e(:,:) = MAX(zhvst_e (:,:), rn_wdmin1 ) 
     722            END IF 
     723            !shall we call lbc_lnk for zhu(v)st_e() here? 
     724 
    654725         ENDIF 
    655726         ! 
     
    717788         zv_trd(:,:) = zv_trd(:,:) + bfrva(:,:) * zvn_e(:,:) * hvr_e(:,:) 
    718789         ! 
    719          ! Surface pressure trend: 
    720          DO jj = 2, jpjm1 
    721             DO ji = fs_2, fs_jpim1   ! vector opt. 
    722                ! Add surface pressure gradient 
    723                zu_spg = - grav * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) / e1u(ji,jj) 
    724                zv_spg = - grav * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) / e2v(ji,jj) 
    725                zwx(ji,jj) = zu_spg 
    726                zwy(ji,jj) = zv_spg 
    727             END DO 
    728          END DO 
     790         IF(ln_wd) THEN                    ! Calculating and applying W/D gravity filters 
     791           DO jj = 2, jpjm1 
     792              DO ji = 2, jpim1 
     793                 ll_tmp1 = MIN(zsshp2_e(ji,jj), zsshp2_e(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) 
     794                 ll_tmp2 = MAX(zsshp2_e(ji,jj), zsshp2_e(ji+1,jj)) > MAX(-bathy(ji,jj), -bathy(ji+1,jj)) + & 
     795                                                           & rn_wdmin1 + rn_wdmin2 
     796                 IF(ll_tmp1) THEN 
     797                   zcpx(ji,jj) = 1.0_wp 
     798                 ELSE IF(ll_tmp2) THEN 
     799                    ! no worries about zsshp2_e(ji+1,jj)-zsshp2_e(ji,jj) = 0, it won't happen ! here 
     800                   zcpx(ji,jj) = ABS((zsshp2_e(ji+1,jj) + bathy(ji+1,jj) - zsshp2_e(ji,jj) - bathy(ji,jj)) /& 
     801                               & (zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj))) 
     802                 ELSE 
     803                    zcpx(ji,jj) = 0._wp 
     804                 END IF 
     805 
     806                 ll_tmp1 = MIN(zsshp2_e(ji,jj), zsshp2_e(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) 
     807                 ll_tmp2 = MAX(zsshp2_e(ji,jj), zsshp2_e(ji,jj+1)) > MAX(-bathy(ji,jj), -bathy(ji,jj+1)) + & 
     808                                                           & rn_wdmin1 + rn_wdmin2 
     809                 IF(ll_tmp1) THEN 
     810                    zcpy(ji,jj) = 1.0_wp 
     811                 ELSE IF(ll_tmp2) THEN 
     812                    ! no worries about zsshp2_e(ji,jj+1)-zsshp2_e(ji,jj) = 0, it won't happen ! here 
     813                   zcpy(ji,jj) = ABS((zsshp2_e(ji,jj+1) + bathy(ji,jj+1) - zsshp2_e(ji,jj) - bathy(ji,jj)) /& 
     814                               & (zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj))) 
     815                 ELSE 
     816                   zcpy(ji,jj) = 0._wp 
     817                 END IF 
     818              END DO 
     819            END DO 
     820            CALL lbc_lnk( zcpx, 'U', 1._wp )    ;   CALL lbc_lnk( zcpy, 'V', 1._wp ) 
     821         ENDIF 
     822 
     823         IF(ln_wd) THEN 
     824           DO jj = 2, jpjm1 
     825              DO ji = 2, jpim1 
     826                 ! Add surface pressure gradient 
     827                 zu_spg = - grav * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) / e1u(ji,jj) 
     828                 zv_spg = - grav * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) / e2v(ji,jj) 
     829                 zwx(ji,jj) = zu_spg * zcpx(ji,jj) 
     830                 zwy(ji,jj) = zv_spg * zcpy(ji,jj) 
     831              END DO 
     832           END DO 
     833         ELSE 
     834           DO jj = 2, jpjm1 
     835              DO ji = fs_2, fs_jpim1   ! vector opt. 
     836                 ! Add surface pressure gradient 
     837                 zu_spg = - grav * ( zsshp2_e(ji+1,jj) - zsshp2_e(ji,jj) ) / e1u(ji,jj) 
     838                 zv_spg = - grav * ( zsshp2_e(ji,jj+1) - zsshp2_e(ji,jj) ) / e2v(ji,jj) 
     839                 zwx(ji,jj) = zu_spg 
     840                 zwy(ji,jj) = zv_spg 
     841              END DO 
     842           END DO 
     843         END IF 
    729844         ! 
    730845         ! Set next velocities: 
     
    750865               DO ji = fs_2, fs_jpim1   ! vector opt. 
    751866 
    752                   zhura = umask(ji,jj,1)/(hu_0(ji,jj) + zsshu_a(ji,jj) + 1._wp - umask(ji,jj,1)) 
    753                   zhvra = vmask(ji,jj,1)/(hv_0(ji,jj) + zsshv_a(ji,jj) + 1._wp - vmask(ji,jj,1)) 
    754  
    755                   ua_e(ji,jj) = (                hu_e(ji,jj)  *  zun_e(ji,jj)   &  
    756                             &     + rdtbt * ( zhust_e(ji,jj)  *    zwx(ji,jj)   &  
     867                  IF(ln_wd) THEN 
     868                    zhura = MAX(hu_0(ji,jj) + zsshu_a(ji,jj), rn_wdmin1) 
     869                    zhvra = MAX(hv_0(ji,jj) + zsshv_a(ji,jj), rn_wdmin1) 
     870                  ELSE 
     871                    zhura = hu_0(ji,jj) + zsshu_a(ji,jj) 
     872                    zhvra = hv_0(ji,jj) + zsshv_a(ji,jj) 
     873                  END IF 
     874 
     875                  zhura = umask(ji,jj,1)/(zhura + 1._wp - umask(ji,jj,1)) 
     876                  zhvra = vmask(ji,jj,1)/(zhvra + 1._wp - vmask(ji,jj,1)) 
     877 
     878                  ua_e(ji,jj) = (                hu_e(ji,jj)  *  zun_e(ji,jj)   & 
     879                            &     + rdtbt * ( zhust_e(ji,jj)  *    zwx(ji,jj)   & 
    757880                            &               + zhup2_e(ji,jj)  * zu_trd(ji,jj)   & 
    758881                            &               +      hu(ji,jj)  * zu_frc(ji,jj) ) & 
     
    770893         IF( lk_vvl ) THEN                             !* Update ocean depth (variable volume case only) 
    771894            !                                          !  ----------------------------------------------         
    772             hu_e (:,:) = hu_0(:,:) + zsshu_a(:,:) 
    773             hv_e (:,:) = hv_0(:,:) + zsshv_a(:,:) 
     895            IF(ln_wd) THEN 
     896              hu_e (:,:) = MAX(hu_0(:,:) + zsshu_a(:,:), rn_wdmin1) 
     897              hv_e (:,:) = MAX(hv_0(:,:) + zsshv_a(:,:), rn_wdmin1) 
     898            ELSE 
     899              hu_e (:,:) = hu_0(:,:) + zsshu_a(:,:) 
     900              hv_e (:,:) = hv_0(:,:) + zsshv_a(:,:) 
     901            END IF 
     902 
    774903            hur_e(:,:) = umask(:,:,1) / ( hu_e(:,:) + 1._wp - umask(:,:,1) ) 
    775904            hvr_e(:,:) = vmask(:,:,1) / ( hv_e(:,:) + 1._wp - vmask(:,:,1) ) 
     
    9031032      CALL wrk_dealloc( jpi, jpj, zsshu_a, zsshv_a                                   ) 
    9041033      CALL wrk_dealloc( jpi, jpj, zhf ) 
     1034      IF(ln_wd) CALL wrk_alloc( jpi, jpj, zcpx, zcpy ) 
    9051035      ! 
    9061036      IF( nn_timing == 1 )  CALL timing_stop('dyn_spg_ts') 
  • branches/UKMO/2014_Surge_Modelling/NEMOGCM/NEMO/OPA_SRC/DYN/sshwzv.F90

    r4486 r5066  
    99   !!             -   !  2010-09  (D.Storkey and E.O'Dea) bug fixes for BDY module 
    1010   !!            3.3  !  2011-10  (M. Leclair) split former ssh_wzv routine and remove all vvl related work 
     11   !!            3.?  !  2014-09  (H. Liu) add wetting and drying   
    1112   !!---------------------------------------------------------------------- 
    1213 
     
    4243   USE wrk_nemo        ! Memory Allocation 
    4344   USE timing          ! Timing 
     45   USE wadlmt          ! Wetting/Drying flux limting 
    4446 
    4547   IMPLICIT NONE 
     
    9496      ENDIF 
    9597      ! 
    96       CALL div_cur( kt )                              ! Horizontal divergence & Relative vorticity 
    97       ! 
    9898      z2dt = 2._wp * rdt                              ! set time step size (Euler/Leapfrog) 
    9999      IF( neuler == 0 .AND. kt == nit000 )   z2dt = rdt 
    100  
     100      ! 
     101      z1_rau0 = 0.5_wp * r1_rau0 
     102      ! 
     103      IF(ln_wd) CALL wad_lmt(sshb, z1_rau0 * (emp_b(:,:) + emp(:,:)), z2dt) 
     104 
     105      CALL div_cur( kt )                              ! Horizontal divergence & Relative vorticity 
     106      ! 
    101107      !                                           !------------------------------! 
    102108      !                                           !   After Sea Surface Height   ! 
     
    110116      ! compute the vertical velocity which can be used to compute the non-linear terms of the momentum equations. 
    111117      !  
    112       z1_rau0 = 0.5_wp * r1_rau0 
    113118      ssha(:,:) = (  sshb(:,:) - z2dt * ( z1_rau0 * ( emp_b(:,:) + emp(:,:) ) + zhdiv(:,:) )  ) * tmask(:,:,1) 
    114119 
Note: See TracChangeset for help on using the changeset viewer.