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 7878 for branches/UKMO/r6232_HZG_WAVE-coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90 – NEMO

Ignore:
Timestamp:
2017-04-05T17:12:32+02:00 (7 years ago)
Author:
jcastill
Message:

Add Phillips vertical Stokes drift parameterization as in the HZG wave branch

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/r6232_HZG_WAVE-coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90

    r7853 r7878  
    4242   LOGICAL, PUBLIC ::   cpl_sdrfty = .FALSE. 
    4343   LOGICAL, PUBLIC ::   cpl_wper   = .FALSE. 
     44   LOGICAL, PUBLIC ::   cpl_wfreq  = .FALSE. 
    4445   LOGICAL, PUBLIC ::   cpl_wnum   = .FALSE. 
    4546   LOGICAL, PUBLIC ::   cpl_tauoc  = .FALSE. 
     
    5152   INTEGER ::   jp_hsw   ! index of significant wave hight      (m)      at T-point 
    5253   INTEGER ::   jp_wmp   ! index of mean wave period            (s)      at T-point 
     54   INTEGER ::   jp_wfr   ! index of wave peak frequency         (s^-1)   at T-point 
    5355 
    5456   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::  sf_cd    ! structure of input fields (file informations, fields read) Drag Coefficient 
     
    5961   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   cdn_wave            !: 
    6062   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   hsw, wmp, wnum      !: 
     63   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   wfreq               !:  
    6164   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   rn_crban            !: Craig and Banner constant for surface breaking waves mixing 
    6265   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   tauoc_wave          !: 
     
    99102      CALL wrk_alloc( jpi,jpj,       zk_t, zk_u, zk_v, zu0_sd, zv0_sd )  
    100103      ! 
    101       zfac = 2.0_wp * rpi / 16.0_wp 
    102       DO jj = 1, jpj               ! exp. wave number at t-point    (Eq. (19) in Breivick et al. (2014) ) 
    103          DO ji = 1, jpi 
    104             ! Stokes drift velocity estimated from Hs and Tmean 
    105             ztransp = zfac * hsw(ji,jj)*hsw(ji,jj) / MAX( wmp(ji,jj), 0.0000001_wp ) 
    106             ! Stokes surface speed 
    107             tsd2d(ji,jj) = SQRT( ut0sd(ji,jj)*ut0sd(ji,jj) + vt0sd(ji,jj)*vt0sd(ji,jj)) 
    108             ! Wavenumber scale 
    109             zk_t(ji,jj) = ABS( tsd2d(ji,jj) ) / MAX( ABS( 5.97_wp*ztransp ), 0.0000001_wp ) 
    110          END DO 
    111       END DO 
    112       DO jj = 1, jpjm1              ! exp. wave number & Stokes drift velocity at u- & v-points 
    113          DO ji = 1, jpim1 
    114             zk_u(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji+1,jj) ) 
    115             zk_v(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji,jj+1) ) 
    116             ! 
    117             zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 
    118             zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 
    119          END DO 
    120       END DO 
    121       ! 
    122       !                       !==  horizontal Stokes Drift 3D velocity  ==! 
    123       DO jk = 1, jpkm1 
    124          DO jj = 2, jpjm1 
    125             DO ji = 2, jpim1 
    126                zdep_u = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji+1,jj,jk) ) 
    127                zdep_v = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji,jj+1,jk) ) 
    128                !                           
    129                zkh_u = zk_u(ji,jj) * zdep_u     ! k * depth 
    130                zkh_v = zk_v(ji,jj) * zdep_v 
    131                !                                ! Depth attenuation 
    132                zda_u = EXP( -2.0_wp*zkh_u ) / ( 1.0_wp + 8.0_wp*zkh_u ) 
    133                zda_v = EXP( -2.0_wp*zkh_v ) / ( 1.0_wp + 8.0_wp*zkh_v ) 
     104      ! select parameterization for the calculation of vertical Stokes drift 
     105      SELECT CASE ( nn_sdrift ) 
     106      ! 
     107      CASE ( jp_breivik ) 
     108         zfac = 2.0_wp * rpi / 16.0_wp 
     109         DO jj = 1, jpj               ! exp. wave number at t-point    (Eq. (19) in Breivick et al. (2014) ) 
     110            DO ji = 1, jpi 
     111               ! Stokes drift velocity estimated from Hs and Tmean 
     112               ztransp = zfac * hsw(ji,jj)*hsw(ji,jj) / MAX( wmp(ji,jj), 0.0000001_wp ) 
     113               ! Stokes surface speed 
     114               tsd2d(ji,jj) = SQRT( ut0sd(ji,jj)*ut0sd(ji,jj) + vt0sd(ji,jj)*vt0sd(ji,jj)) 
     115               ! Wavenumber scale 
     116               zk_t(ji,jj) = ABS( tsd2d(ji,jj) ) / MAX( ABS( 5.97_wp*ztransp ), 0.0000001_wp ) 
     117            END DO 
     118         END DO 
     119         DO jj = 1, jpjm1              ! exp. wave number & Stokes drift velocity at u- & v-points 
     120            DO ji = 1, jpim1 
     121               zk_u(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji+1,jj) ) 
     122               zk_v(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji,jj+1) ) 
    134123               ! 
    135                usd(ji,jj,jk) = zda_u * zk_u(ji,jj) * umask(ji,jj,jk) 
    136                vsd(ji,jj,jk) = zda_v * zk_v(ji,jj) * vmask(ji,jj,jk) 
    137             END DO 
    138          END DO 
    139       END DO 
     124               zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 
     125               zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 
     126            END DO 
     127         END DO 
     128         ! 
     129         !                       !==  horizontal Stokes Drift 3D velocity  ==! 
     130         DO jk = 1, jpkm1 
     131            DO jj = 2, jpjm1 
     132               DO ji = 2, jpim1 
     133                  zdep_u = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji+1,jj,jk) ) 
     134                  zdep_v = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji,jj+1,jk) ) 
     135                  !                           
     136                  zkh_u = zk_u(ji,jj) * zdep_u     ! k * depth 
     137                  zkh_v = zk_v(ji,jj) * zdep_v 
     138                  !                                ! Depth attenuation 
     139                  zda_u = EXP( -2.0_wp*zkh_u ) / ( 1.0_wp + 8.0_wp*zkh_u ) 
     140                  zda_v = EXP( -2.0_wp*zkh_v ) / ( 1.0_wp + 8.0_wp*zkh_v ) 
     141                  ! 
     142                  usd(ji,jj,jk) = zda_u * zu0_sd(ji,jj) * umask(ji,jj,jk) 
     143                  vsd(ji,jj,jk) = zda_v * zv0_sd(ji,jj) * vmask(ji,jj,jk) 
     144               END DO 
     145            END DO 
     146         END DO 
     147      CASE ( jp_phillips ) 
     148         DO jj = 1, jpjm1              ! Peak wavenumber & Stokes drift velocity at u- & v-points 
     149            DO ji = 1, jpim1 
     150               zk_u(ji,jj) = 0.5_wp * ( wfreq(ji,jj)*wfreq(ji,jj) + wfreq(ji+1,jj)*wfreq(ji+1,jj) ) / grav 
     151               zk_v(ji,jj) = 0.5_wp * ( wfreq(ji,jj)*wfreq(ji,jj) + wfreq(ji,jj+1)*wfreq(ji,jj+1) ) / grav 
     152               ! 
     153               zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 
     154               zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 
     155            END DO 
     156         END DO 
     157         ! 
     158         !                       !==  horizontal Stokes Drift 3D velocity  ==! 
     159         DO jk = 1, jpkm1 
     160            DO jj = 2, jpjm1 
     161               DO ji = 2, jpim1 
     162                  zdep_u = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji+1,jj,jk) ) 
     163                  zdep_v = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji,jj+1,jk) ) 
     164                  !                           
     165                  zkh_u = zk_u(ji,jj) * zdep_u     ! k * depth 
     166                  zkh_v = zk_v(ji,jj) * zdep_v 
     167                  !                                ! Depth attenuation: beta=1 for Phillips 
     168                  zda_u = EXP( -2.0_wp*zkh_u ) - 1.0*SQRT(2.0*rpi*zkh_u) * ERFC(SQRT(2.0*zkh_u)) 
     169                  zda_v = EXP( -2.0_wp*zkh_v ) - 1.0*SQRT(2.0*rpi*zkh_v) * ERFC(SQRT(2.0*zkh_v)) 
     170                  ! 
     171                  usd(ji,jj,jk) = zda_u * zu0_sd(ji,jj) * umask(ji,jj,jk) 
     172                  vsd(ji,jj,jk) = zda_v * zv0_sd(ji,jj) * vmask(ji,jj,jk) 
     173               END DO 
     174            END DO 
     175         END DO 
     176      END SELECT 
     177 
    140178      CALL lbc_lnk( usd(:,:,:), 'U', vsd(:,:,:), 'V', -1. ) 
    141179      ! 
     
    227265         CALL fld_read( kt, nn_fsbc, sf_phioc )          ! read wave to ocean energy from external forcing 
    228266         rn_crban(:,:) = 29.0 * sf_phioc(1)%fnow(:,:,1)     ! ! Alfa is phioc*sqrt(rau0/zrhoa)  : rau0=water density, zhroa= air density 
    229          WHERE( rn_crban <  10.0 ) rn_crban =  10.0 
    230          WHERE( rn_crban > 300.0 ) rn_crban = 300.0 
     267         WHERE( rn_crban < -1000.0 ) rn_crban = 0.0 
     268         WHERE( rn_crban >  1000.0 ) rn_crban = 0.0 
    231269      ENDIF 
    232270 
     
    245283               WHERE( wmp <   0.0 ) wmp = 0.0 
    246284            ENDIF 
     285            IF( jp_wfr > 0 ) THEN 
     286               wfreq(:,:) = sf_sd(jp_wfr)%fnow(:,:,1)   ! Peak wave frequency  
     287               WHERE( wfreq <    0.0 ) wfreq = 0.001  
     288               WHERE( wfreq >  100.0 ) wfreq = 0.001 
     289            ENDIF 
    247290            IF( jp_usd > 0 ) THEN 
    248291               ut0sd(:,:) = sf_sd(jp_usd)%fnow(:,:,1)   ! 2D zonal Stokes Drift at T point 
     
    265308         !                                         !==  Computation of the 3d Stokes Drift  ==!  
    266309         ! 
    267          IF( jpfld == 4 )   CALL sbc_stokes()            ! Calculate only if required fields are read 
    268          !                                               ! In coupled wave model-NEMO case the call is done after coupling 
     310         IF( (nn_sdrift==jp_breivik  .AND. jp_hsw>0 .AND. jp_wmp>0 .AND. jp_usd>0 .AND. jp_vsd>0) .OR. & 
     311             (nn_sdrift==jp_phillips .AND. jp_wfr>0 .AND. jp_usd>0 .AND. jp_vsd>0) ) & 
     312            CALL sbc_stokes()            ! Calculate only if required fields are read 
     313         !                               ! In coupled wave model-NEMO case the call is done after coupling 
    269314         ! 
    270315      ENDIF 
     
    292337      CHARACTER(len=100)     ::  cn_dir                          ! Root directory for location of drag coefficient files 
    293338      TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) ::   slf_i     ! array of namelist informations on the fields to read 
    294       TYPE(FLD_N)            ::  sn_cdg, sn_usd, sn_vsd,  sn_phioc, & 
    295                              &   sn_hsw, sn_wmp, sn_wnum, sn_tauoc      ! informations about the fields to be read 
    296       ! 
    297       NAMELIST/namsbc_wave/  sn_cdg, cn_dir, sn_usd, sn_vsd, sn_hsw, sn_wmp, sn_wnum, sn_tauoc, sn_phioc 
     339      TYPE(FLD_N)            ::  sn_cdg, sn_usd, sn_vsd, sn_phioc, & 
     340                             &   sn_hsw, sn_wmp, sn_wfr, sn_wnum , & 
     341                             &   sn_tauoc      ! informations about the fields to be read 
     342      ! 
     343      NAMELIST/namsbc_wave/  sn_cdg, cn_dir, sn_usd, sn_vsd, sn_hsw, sn_wmp, sn_wfr, sn_wnum, sn_tauoc, sn_phioc 
    298344      !!--------------------------------------------------------------------- 
    299345      ! 
     
    345391      IF( ln_sdw ) THEN   ! Find out how many fields have to be read from file if not coupled 
    346392         jpfld=0 
    347          jp_usd=0   ;   jp_vsd=0   ;   jp_hsw=0   ;   jp_wmp=0 
     393         jp_usd=0   ;   jp_vsd=0   ;   jp_hsw=0   ;   jp_wmp=0   ;   jp_wfr=0 
    348394         IF( .NOT. cpl_sdrftx ) THEN 
    349395            jpfld  = jpfld + 1 
     
    361407            jpfld  = jpfld + 1 
    362408            jp_wmp = jpfld 
     409         ENDIF 
     410         IF( .NOT. cpl_wfreq ) THEN 
     411            jpfld  = jpfld + 1 
     412            jp_wfr = jpfld 
    363413         ENDIF 
    364414 
     
    370420            IF( jp_hsw > 0 )   slf_i(jp_hsw) = sn_hsw 
    371421            IF( jp_wmp > 0 )   slf_i(jp_wmp) = sn_wmp 
     422            IF( jp_wfr > 0 )   slf_i(jp_wfr) = sn_wfr 
    372423            ALLOCATE( sf_sd(jpfld), STAT=ierror )   !* allocate and fill sf_sd with stokes drift 
    373424            IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_sd structure' ) 
     
    382433         ALLOCATE( usd  (jpi,jpj,jpk), vsd  (jpi,jpj,jpk), wsd(jpi,jpj,jpk) ) 
    383434         ALLOCATE( hsw  (jpi,jpj)    , wmp  (jpi,jpj)     ) 
     435         ALLOCATE( wfreq (jpi,jpj) ) 
    384436         ALLOCATE( ut0sd(jpi,jpj)    , vt0sd(jpi,jpj)     ) 
    385437         ALLOCATE( div_sd(jpi,jpj) ) 
Note: See TracChangeset for help on using the changeset viewer.