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 9019 for branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90 – NEMO

Ignore:
Timestamp:
2017-12-13T15:58:53+01:00 (6 years ago)
Author:
timgraham
Message:

Merge of dev_CNRS_2017 into branch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90

    r7864 r9019  
    1919   USE oce            ! ocean variables 
    2020   USE sbc_oce        ! Surface boundary condition: ocean fields 
    21    USE zdf_oce,  ONLY : ln_zdfqiao 
     21   USE zdf_oce,  ONLY : ln_zdfswm 
    2222   USE bdy_oce        ! open boundary condition variables 
    2323   USE domvvl         ! domain: variable volume layers 
     
    8787      INTEGER  ::   jj, ji, jk   ! dummy loop argument 
    8888      INTEGER  ::   ik           ! local integer  
    89       REAL(wp) ::  ztransp, zfac, ztemp, zsp0 
    90       REAL(wp) ::  zdep_u, zdep_v, zkh_u, zkh_v, zda_u, zda_v 
     89      REAL(wp) ::  ztransp, zfac, zsp0 
     90      REAL(wp) ::  zdepth, zsqrt_depth,  zexp_depth, z_two_thirds, zsqrtpi !sqrt of pi 
     91      REAL(wp) ::  zbot_u, zbot_v, zkb_u, zkb_v, zke3_u, zke3_v, zda_u, zda_v 
     92      REAL(wp) ::  zstokes_psi_u_bot, zstokes_psi_v_bot 
    9193      REAL(wp), DIMENSION(:,:)  , POINTER ::   zk_t, zk_u, zk_v, zu0_sd, zv0_sd   ! 2D workspace 
     94      REAL(wp), DIMENSION(:,:)  , POINTER ::   zstokes_psi_u_top, zstokes_psi_v_top   ! 2D workspace 
    9295      REAL(wp), DIMENSION(:,:,:), POINTER ::   ze3divh                            ! 3D workspace 
    9396      !!--------------------------------------------------------------------- 
     
    9598      CALL wrk_alloc( jpi,jpj,jpk,   ze3divh ) 
    9699      CALL wrk_alloc( jpi,jpj,       zk_t, zk_u, zk_v, zu0_sd, zv0_sd ) 
    97       ! 
    98       ! 
     100      CALL wrk_alloc( jpi,jpj,       zstokes_psi_u_top, zstokes_psi_v_top) 
     101      ! 
     102      ! 
     103      zsqrtpi = SQRT(rpi) 
     104      z_two_thirds = 2.0_wp / 3.0_wp 
    99105      zfac =  2.0_wp * rpi / 16.0_wp 
    100106      DO jj = 1, jpj                ! exp. wave number at t-point    (Eq. (19) in Breivick et al. (2014) ) 
     
    106112               tsd2d(ji,jj) = zsp0 
    107113               ! Wavenumber scale 
    108                zk_t(ji,jj) = ABS( zsp0 ) / MAX( ABS( 5.97_wp*ztransp ) , 0.0000001_wp ) 
    109          END DO 
    110       END DO       
     114               zk_t(ji,jj) =  (1.0_wp-2.0_wp/3.0_wp)*zsp0/MAX(2.0_wp*ztransp,0.0000001_wp) 
     115         END DO 
     116      END DO 
     117      ! 
    111118      DO jj = 1, jpjm1              ! exp. wave number & Stokes drift velocity at u- & v-points 
    112119         DO ji = 1, jpim1 
     
    120127      ! 
    121128      !                       !==  horizontal Stokes Drift 3D velocity  ==! 
     129      DO jj = 1, jpjm1              ! exp. wave number & Stokes drift velocity at u- & v-points 
     130         DO ji = 1, jpim1 
     131            zstokes_psi_u_top(ji,jj) = 0._wp 
     132            zstokes_psi_v_top(ji,jj) = 0._wp 
     133         END DO 
     134      END DO 
     135 
    122136      DO jk = 1, jpkm1 
    123137         DO jj = 2, jpjm1 
    124138            DO ji = 2, jpim1 
    125                zdep_u = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji+1,jj,jk) ) 
    126                zdep_v = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji,jj+1,jk) ) 
    127                !                           
    128                zkh_u = zk_u(ji,jj) * zdep_u     ! k * depth 
    129                zkh_v = zk_v(ji,jj) * zdep_v 
    130                !                                ! Depth attenuation 
    131                zda_u = EXP( -2.0_wp*zkh_u ) / ( 1.0_wp + 8.0_wp*zkh_u ) 
    132                zda_v = EXP( -2.0_wp*zkh_v ) / ( 1.0_wp + 8.0_wp*zkh_v ) 
     139               zbot_u = 0.5_wp * ( gdepw_n(ji,jj,jk+1) + gdepw_n(ji+1,jj,jk+1) ) 
     140               zbot_v = 0.5_wp * ( gdepw_n(ji,jj,jk+1) + gdepw_n(ji,jj+1,jk+1) ) 
     141               zkb_u = 2.0_wp * zk_u(ji,jj) * zbot_u     ! 2k * bottom depth 
     142               zkb_v = 2.0_wp * zk_v(ji,jj) * zbot_v     ! 2k * bottom depth 
    133143               ! 
     144               zke3_u = MAX(1.e-8_wp, 2.0_wp * zk_u(ji,jj) * e3u_n(ji,jj,jk))     ! 2k * thickness 
     145               zke3_v = MAX(1.e-8_wp, 2.0_wp * zk_v(ji,jj) * e3v_n(ji,jj,jk))     ! 2k * thickness 
     146 
     147               ! Depth attenuation .... do u component first.. 
     148               zdepth=zkb_u 
     149               zsqrt_depth = SQRT(zdepth) 
     150               zexp_depth = EXP(-zdepth) 
     151               zstokes_psi_u_bot = 1.0_wp - zexp_depth  & 
     152                    & - z_two_thirds*(zsqrtpi*zsqrt_depth*zdepth*ERFC(zsqrt_depth) & 
     153                    &                  + 1.0_wp - (1.0_wp + zdepth)*zexp_depth) 
     154               zda_u = (zstokes_psi_u_bot - zstokes_psi_u_top(ji,jj))/zke3_u 
     155               zstokes_psi_u_top(ji,jj) = zstokes_psi_u_bot 
     156 
     157               !         ... and then v component 
     158               zdepth=zkb_v 
     159               zsqrt_depth = SQRT(zdepth) 
     160               zexp_depth = EXP(-zdepth) 
     161               zstokes_psi_v_bot = 1.0_wp - zexp_depth  & 
     162                    & - z_two_thirds*(zsqrtpi*zsqrt_depth*zdepth*ERFC(zsqrt_depth) & 
     163                    &                  + 1.0_wp - (1.0_wp + zdepth)*zexp_depth) 
     164               zda_v = (zstokes_psi_v_bot - zstokes_psi_v_top(ji,jj))/zke3_v 
     165               zstokes_psi_v_top(ji,jj) = zstokes_psi_v_bot 
     166              ! 
    134167               usd(ji,jj,jk) = zda_u * zu0_sd(ji,jj) * umask(ji,jj,jk) 
    135168               vsd(ji,jj,jk) = zda_v * zv0_sd(ji,jj) * vmask(ji,jj,jk) 
     
    137170         END DO 
    138171      END DO    
    139       CALL lbc_lnk( usd(:,:,:), 'U', vsd(:,:,:), 'V', -1. ) 
     172      CALL lbc_lnk( usd(:,:,:), 'U', -1. ) 
     173      CALL lbc_lnk( vsd(:,:,:), 'V', -1. ) 
     174 
     175 
    140176      ! 
    141177      !                       !==  vertical Stokes Drift 3D velocity  ==! 
     
    152188      END DO 
    153189      ! 
    154       IF( .NOT. AGRIF_Root() ) THEN 
    155          IF( nbondi ==  1 .OR. nbondi == 2 )   ze3divh(nlci-1,   :  ,:) = 0._wp      ! east 
    156          IF( nbondi == -1 .OR. nbondi == 2 )   ze3divh(  2   ,   :  ,:) = 0._wp      ! west 
    157          IF( nbondj ==  1 .OR. nbondj == 2 )   ze3divh(  :   ,nlcj-1,:) = 0._wp      ! north 
    158          IF( nbondj == -1 .OR. nbondj == 2 )   ze3divh(  :   ,  2   ,:) = 0._wp      ! south 
    159       ENDIF 
     190#if defined key_agrif 
     191      IF( .NOT. Agrif_Root() ) THEN 
     192         IF( nbondi == -1 .OR. nbondi == 2 )   ze3divh( 2:nbghostcells+1,:        ,:) = 0._wp      ! west 
     193         IF( nbondi ==  1 .OR. nbondi == 2 )   ze3divh( nlci-nbghostcells:nlci-1,:,:) = 0._wp      ! east 
     194         IF( nbondj == -1 .OR. nbondj == 2 )   ze3divh( :,2:nbghostcells+1        ,:) = 0._wp      ! south 
     195         IF( nbondj ==  1 .OR. nbondj == 2 )   ze3divh( :,nlcj-nbghostcells:nlcj-1,:) = 0._wp      ! north 
     196      ENDIF 
     197#endif 
    160198      ! 
    161199      CALL lbc_lnk( ze3divh, 'T', 1. ) 
     
    185223      CALL wrk_dealloc( jpi,jpj,jpk,   ze3divh ) 
    186224      CALL wrk_dealloc( jpi,jpj,       zk_t, zk_u, zk_v, zu0_sd, zv0_sd ) 
     225      CALL wrk_dealloc( jpi,jpj,       zstokes_psi_u_top, zstokes_psi_v_top) 
    187226      ! 
    188227   END SUBROUTINE sbc_stokes 
     
    227266         ! 
    228267         ! Read also wave number if needed, so that it is available in coupling routines 
    229          IF( ln_zdfqiao .AND. .NOT.cpl_wnum ) THEN 
     268         IF( ln_zdfswm .AND. .NOT.cpl_wnum ) THEN 
    230269            CALL fld_read( kt, nn_fsbc, sf_wn )          ! read wave parameters from external forcing 
    231270            wnum(:,:) = sf_wn(1)%fnow(:,:,1) 
     
    342381         ALLOCATE( div_sd(jpi,jpj) ) 
    343382         ALLOCATE( tsd2d (jpi,jpj) ) 
     383 
     384         ut0sd(:,:) = 0._wp 
     385         vt0sd(:,:) = 0._wp 
     386         hsw(:,:) = 0._wp 
     387         wmp(:,:) = 0._wp 
     388 
    344389         usd(:,:,:) = 0._wp 
    345390         vsd(:,:,:) = 0._wp 
    346391         wsd(:,:,:) = 0._wp 
    347          ! Wave number needed only if ln_zdfqiao=T 
     392         ! Wave number needed only if ln_zdfswm=T 
    348393         IF( .NOT. cpl_wnum ) THEN 
    349394            ALLOCATE( sf_wn(1), STAT=ierror )           !* allocate and fill sf_wave with sn_wnum 
Note: See TracChangeset for help on using the changeset viewer.