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 7422 for branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

Ignore:
Timestamp:
2016-12-01T18:17:41+01:00 (8 years ago)
Author:
gm
Message:

#1805 dev_INGV_UKMO_2016: improve Stokes drift (including dynspg_ts , Stokes-Coriolis force , and GLS surface roughness

Location:
branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/SBC
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90

    r7359 r7422  
    11301130      !                                                      !       Stokes drift u      ! 
    11311131      !                                                      ! ========================= !  
    1132          IF( srcv(jpr_sdrftx)%laction ) zusd2dt(:,:) = frcv(jpr_sdrftx)%z3(:,:,1) 
     1132         IF( srcv(jpr_sdrftx)%laction ) ut0sd(:,:) = frcv(jpr_sdrftx)%z3(:,:,1) 
    11331133      ! 
    11341134      !                                                      ! ========================= !  
    11351135      !                                                      !       Stokes drift v      ! 
    11361136      !                                                      ! ========================= !  
    1137          IF( srcv(jpr_sdrfty)%laction ) zvsd2dt(:,:) = frcv(jpr_sdrfty)%z3(:,:,1) 
     1137         IF( srcv(jpr_sdrfty)%laction ) vt0sd(:,:) = frcv(jpr_sdrfty)%z3(:,:,1) 
    11381138      ! 
    11391139      !                                                      ! ========================= !  
     
    11451145      !                                                      !  Significant wave height  ! 
    11461146      !                                                      ! ========================= !  
    1147          IF( srcv(jpr_hsig)%laction ) swh(:,:) = frcv(jpr_hsig)%z3(:,:,1) 
     1147         IF( srcv(jpr_hsig)%laction ) hsw(:,:) = frcv(jpr_hsig)%z3(:,:,1) 
    11481148      ! 
    11491149      !                                                      ! ========================= !  
     
    11561156                                                                    .OR. srcv(jpr_hsig)%laction ) THEN 
    11571157            CALL sbc_stokes() 
    1158             IF( ln_zdfqiao .AND. .NOT. srcv(jpr_wnum)%laction ) CALL sbc_qiao() 
    1159          ENDIF 
    1160          IF( ln_zdfqiao .AND. srcv(jpr_wnum)%laction ) CALL sbc_qiao() 
     1158         ENDIF 
    11611159      ENDIF 
    11621160      !                                                      ! ========================= !  
  • branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90

    r7376 r7422  
    313313      IF( nn_ice == 4 )   CALL cice_sbc_init( nsbc )      ! CICE initialisation 
    314314      ! 
     315      IF( ln_wave     )   CALL sbc_wave_init              ! surface wave initialisation 
     316      ! 
    315317   END SUBROUTINE sbc_init 
    316318 
  • branches/2016/dev_INGV_UKMO_2016/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90

    r7359 r7422  
    44   !! Wave module  
    55   !!====================================================================== 
    6    !! History :  3.3  !   2011-09  (M. Adani)  Original code: Drag Coefficient  
    7    !!         :  3.4  !   2012-10  (M. Adani)  Stokes Drift  
    8    !!            3.6  !   2014-09  (E. Clementi,P. Oddo) New Stokes Drift Computation 
    9    !!---------------------------------------------------------------------- 
    10  
    11    !!---------------------------------------------------------------------- 
     6   !! History :  3.3  !  2011-09  (M. Adani)  Original code: Drag Coefficient  
     7   !!         :  3.4  !  2012-10  (M. Adani)  Stokes Drift  
     8   !!            3.6  !  2014-09  (E. Clementi,P. Oddo) New Stokes Drift Computation 
     9   !!             -   !  2016-12  (G. Madec, E. Clementi) update Stoke drift computation 
     10   !!                                                    + add sbc_wave_ini routine 
     11   !!---------------------------------------------------------------------- 
     12 
     13   !!---------------------------------------------------------------------- 
     14   !!   sbc_stokes    : calculate 3D Stokes-drift velocities 
    1215   !!   sbc_wave      : wave data from wave model in netcdf files  
    13    !!---------------------------------------------------------------------- 
    14    USE oce            !  
    15    USE sbc_oce       ! Surface boundary condition: ocean fields 
    16    USE bdy_oce        ! 
    17    USE domvvl         ! 
     16   !!   sbc_wave_init : initialisation fo surface waves  
     17   !!---------------------------------------------------------------------- 
     18   USE phycst         ! physical constants  
     19   USE oce            ! ocean variables 
     20   USE sbc_oce        ! Surface boundary condition: ocean fields 
     21   USE zdf_oce,  ONLY : ln_zdfqiao 
     22   USE bdy_oce        ! open boundary condition variables 
     23   USE domvvl         ! domain: variable volume layers 
     24   ! 
    1825   USE iom            ! I/O manager library 
    1926   USE in_out_manager ! I/O manager 
    2027   USE lib_mpp        ! distribued memory computing library 
    21    USE fldread       ! read input fields 
     28   USE fldread        ! read input fields 
    2229   USE wrk_nemo       ! 
    23    USE phycst         ! physical constants  
    2430 
    2531   IMPLICIT NONE 
    2632   PRIVATE 
    2733 
    28    PUBLIC   sbc_stokes, sbc_qiao  ! routines called in sbccpl 
    29    PUBLIC   sbc_wave    ! routine called in sbcmod 
     34   PUBLIC   sbc_stokes      ! routine called in sbccpl 
     35   PUBLIC   sbc_wave        ! routine called in sbcmod 
     36   PUBLIC   sbc_wave_init   ! routine called in sbcmod 
    3037    
    3138   ! Variables checking if the wave parameters are coupled (if not, they are read from file) 
    32    LOGICAL, PUBLIC     ::   cpl_hsig=.FALSE. 
    33    LOGICAL, PUBLIC     ::   cpl_phioc=.FALSE. 
    34    LOGICAL, PUBLIC     ::   cpl_sdrftx=.FALSE. 
    35    LOGICAL, PUBLIC     ::   cpl_sdrfty=.FALSE. 
    36    LOGICAL, PUBLIC     ::   cpl_wper=.FALSE. 
    37    LOGICAL, PUBLIC     ::   cpl_wnum=.FALSE. 
    38    LOGICAL, PUBLIC     ::   cpl_wstrf=.FALSE. 
    39    LOGICAL, PUBLIC     ::   cpl_wdrag=.FALSE. 
    40  
    41    INTEGER ::   jpfld                ! number of files to read for stokes drift 
    42    INTEGER ::   jp_usd               ! index of stokes drift  (i-component) (m/s)    at T-point 
    43    INTEGER ::   jp_vsd               ! index of stokes drift  (j-component) (m/s)    at T-point 
    44    INTEGER ::   jp_swh               ! index of significant wave hight      (m)      at T-point 
    45    INTEGER ::   jp_wmp               ! index of mean wave period            (s)      at T-point 
    46  
    47    TYPE(FLD), ALLOCATABLE, DIMENSION(:)  :: sf_cd    ! structure of input fields (file informations, fields read) Drag Coefficient 
    48    TYPE(FLD), ALLOCATABLE, DIMENSION(:)  :: sf_sd    ! structure of input fields (file informations, fields read) Stokes Drift 
    49    TYPE(FLD), ALLOCATABLE, DIMENSION(:)  :: sf_wn    ! structure of input fields (file informations, fields read) wave number for Qiao 
    50    TYPE(FLD), ALLOCATABLE, DIMENSION(:)  :: sf_tauoc ! structure of input fields (file informations, fields read) normalized wave stress into the ocean 
    51    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)       :: cdn_wave  
    52    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)       :: swh,wmp, wnum 
    53    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)       :: tauoc_wave 
    54    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)       :: tsd2d 
    55    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)       :: zusd2dt, zvsd2dt 
    56    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)     :: usd3d, vsd3d, wsd3d  
    57    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)     :: usd3dt, vsd3dt 
     39   LOGICAL, PUBLIC ::   cpl_hsig   = .FALSE. 
     40   LOGICAL, PUBLIC ::   cpl_phioc  = .FALSE. 
     41   LOGICAL, PUBLIC ::   cpl_sdrftx = .FALSE. 
     42   LOGICAL, PUBLIC ::   cpl_sdrfty = .FALSE. 
     43   LOGICAL, PUBLIC ::   cpl_wper   = .FALSE. 
     44   LOGICAL, PUBLIC ::   cpl_wnum   = .FALSE. 
     45   LOGICAL, PUBLIC ::   cpl_wstrf  = .FALSE. 
     46   LOGICAL, PUBLIC ::   cpl_wdrag  = .FALSE. 
     47 
     48   INTEGER ::   jpfld    ! number of files to read for stokes drift 
     49   INTEGER ::   jp_usd   ! index of stokes drift  (i-component) (m/s)    at T-point 
     50   INTEGER ::   jp_vsd   ! index of stokes drift  (j-component) (m/s)    at T-point 
     51   INTEGER ::   jp_hsw   ! index of significant wave hight      (m)      at T-point 
     52   INTEGER ::   jp_wmp   ! index of mean wave period            (s)      at T-point 
     53 
     54   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_cd      ! structure of input fields (file informations, fields read) Drag Coefficient 
     55   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_sd      ! structure of input fields (file informations, fields read) Stokes Drift 
     56   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_wn      ! structure of input fields (file informations, fields read) wave number for Qiao 
     57   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_tauoc  ! structure of input fields (file informations, fields read) normalized wave stress into the ocean 
     58   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   cdn_wave            !: 
     59   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   hsw, wmp, wnum      !:  
     60   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   tauoc_wave          !:   
     61   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   tsd2d               !:  
     62   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   div_sd              !: barotropic stokes drift divergence 
     63   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   ut0sd, vt0sd        !: surface Stokes drift velocities at t-point 
     64   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::   usd  , vsd  , wsd   !: Stokes drift velocities at u-, v- & w-points, resp. 
    5865 
    5966   !! * Substitutions 
     
    7885      !! ** action   
    7986      !!--------------------------------------------------------------------- 
    80       INTEGER                ::   jj,ji,jk  
    81       REAL(wp)                       ::  ztransp, zfac, zsp0, zk, zus, zvs 
    82       REAL(wp), DIMENSION(:,:,:), POINTER :: ze3hdiv   ! 3D workspace 
    83       !!--------------------------------------------------------------------- 
    84       ! 
    85  
    86       CALL wrk_alloc( jpi,jpj,jpk, ze3hdiv ) 
    87       DO jk = 1, jpk 
    88          DO jj = 1, jpj 
    89             DO ji = 1, jpi 
    90                ! On T grid 
    91                ! Stokes transport speed estimated from Hs and Tmean 
    92                ztransp = 2.0_wp*rpi*swh(ji,jj)**2.0_wp/(16.0_wp*MAX(wmp(ji,jj),0.0000001_wp)) 
     87      INTEGER  ::   jj, ji, jk   ! dummy loop argument 
     88      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 
     91      REAL(wp), DIMENSION(:,:)  , POINTER ::   zk_t, zk_u, zk_v, zu0_sd, zv0_sd   ! 2D workspace 
     92      REAL(wp), DIMENSION(:,:,:), POINTER ::   ze3divh                            ! 3D workspace 
     93      !!--------------------------------------------------------------------- 
     94      ! 
     95      CALL wrk_alloc( jpi,jpj,jpk,   ze3divh ) 
     96      CALL wrk_alloc( jpi,jpj,       zk_t, zk_u, zk_v, zu0_sd, zv0_sd ) 
     97      ! 
     98      ! 
     99      zfac =  2.0_wp * rpi / 16.0_wp 
     100      DO jj = 1, jpj                ! exp. wave number at t-point    (Eq. (19) in Breivick et al. (2014) ) 
     101         DO ji = 1, jpi 
     102               ! Stokes drift velocity estimated from Hs and Tmean 
     103               ztransp = zfac * hsw(ji,jj)*hsw(ji,jj) / MAX( wmp(ji,jj) , 0.0000001_wp ) 
    93104               ! Stokes surface speed 
    94                zsp0 = SQRT( zusd2dt(ji,jj)**2 + zvsd2dt(ji,jj)**2) 
     105               zsp0 = SQRT( ut0sd(ji,jj)*ut0sd(ji,jj) + vt0sd(ji,jj)*vt0sd(ji,jj) ) 
     106               tsd2d(ji,jj) = zsp0 
    95107               ! Wavenumber scale 
    96                zk = ABS(zsp0)/MAX(ABS(5.97_wp*ztransp),0.0000001_wp) 
    97                ! Depth attenuation 
    98                zfac = EXP(-2.0_wp*zk*gdept_n(ji,jj,jk))/(1.0_wp+8.0_wp*zk*gdept_n(ji,jj,jk)) 
     108               zk_t(ji,jj) = ABS( zsp0 ) / MAX( ABS( 5.97_wp*ztransp ) , 0.0000001_wp ) 
     109         END DO 
     110      END DO       
     111      DO jj = 1, jpjm1              ! exp. wave number & Stokes drift velocity at u- & v-points 
     112         DO ji = 1, jpim1 
     113            zk_u(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji+1,jj) ) 
     114            zk_v(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji,jj+1) ) 
     115            ! 
     116            zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 
     117            zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 
     118         END DO 
     119      END DO 
     120      ! 
     121      !                       !==  horizontal Stokes Drift 3D velocity  ==! 
     122      DO jk = 1, jpkm1 
     123         DO jj = 2, jpjm1 
     124            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 ) 
    99133               ! 
    100                usd3dt(ji,jj,jk) = zfac * zusd2dt(ji,jj) * tmask(ji,jj,jk) 
    101                vsd3dt(ji,jj,jk) = zfac * zvsd2dt(ji,jj) * tmask(ji,jj,jk) 
     134               usd(ji,jj,jk) = zda_u * zk_u(ji,jj) * umask(ji,jj,jk) 
     135               vsd(ji,jj,jk) = zda_v * zk_v(ji,jj) * vmask(ji,jj,jk) 
    102136            END DO 
    103137         END DO 
    104       END DO  
    105       ! Into the U and V Grid 
    106       DO jk = 1, jpkm1 
    107          DO jj = 1, jpjm1 
    108             DO ji = 1, fs_jpim1 
    109                usd3d(ji,jj,jk) = 0.5 *  umask(ji,jj,jk) *   & 
    110                                &  ( usd3dt(ji,jj,jk) + usd3dt(ji+1,jj,jk) ) 
    111                vsd3d(ji,jj,jk) = 0.5 *  vmask(ji,jj,jk) *   & 
    112                                &  ( vsd3dt(ji,jj,jk) + vsd3dt(ji,jj+1,jk) ) 
    113             END DO 
    114          END DO 
    115       END DO 
    116       ! 
    117       CALL lbc_lnk( usd3d(:,:,:), 'U', -1. ) 
    118       CALL lbc_lnk( vsd3d(:,:,:), 'V', -1. ) 
    119       ! 
    120       DO jk = 1, jpkm1               ! Horizontal divergence 
     138      END DO    
     139      CALL lbc_lnk( usd(:,:,:), 'U', vsd(:,:,:), 'V', -1. ) 
     140      ! 
     141      !                       !==  vertical Stokes Drift 3D velocity  ==! 
     142      ! 
     143      DO jk = 1, jpkm1               ! Horizontal e3*divergence 
    121144         DO jj = 2, jpj 
    122145            DO ji = fs_2, jpi 
    123                ze3hdiv(ji,jj,jk) = (  e2u(ji  ,jj) * usd3d(ji  ,jj,jk)     & 
    124                   &                 - e2u(ji-1,jj) * usd3d(ji-1,jj,jk)     & 
    125                   &                 + e1v(ji,jj  ) * vsd3d(ji,jj  ,jk)     & 
    126                   &                 - e1v(ji,jj-1) * vsd3d(ji,jj-1,jk)   ) * r1_e1e2t(ji,jj) 
     146               ze3divh(ji,jj,jk) = (  e2u(ji  ,jj) * e3u_n(ji  ,jj,jk) * usd(ji  ,jj,jk)    & 
     147                  &                 - e2u(ji-1,jj) * e3u_n(ji-1,jj,jk) * usd(ji-1,jj,jk)    & 
     148                  &                 + e1v(ji,jj  ) * e3v_n(ji,jj  ,jk) * vsd(ji,jj  ,jk)    & 
     149                  &                 - e1v(ji,jj-1) * e3v_n(ji,jj-1,jk) * vsd(ji,jj-1,jk)  ) * r1_e1e2t(ji,jj) 
    127150            END DO 
    128151         END DO 
     
    130153      ! 
    131154      IF( .NOT. AGRIF_Root() ) THEN 
    132          IF( nbondi ==  1 .OR. nbondi == 2 )   ze3hdiv(nlci-1,   :  ,:) = 0._wp      ! east 
    133          IF( nbondi == -1 .OR. nbondi == 2 )   ze3hdiv(  2   ,   :  ,:) = 0._wp      ! west 
    134          IF( nbondj ==  1 .OR. nbondj == 2 )   ze3hdiv(  :   ,nlcj-1,:) = 0._wp      ! north 
    135          IF( nbondj == -1 .OR. nbondj == 2 )   ze3hdiv(  :   ,  2   ,:) = 0._wp      ! south 
    136       ENDIF 
    137       ! 
    138       CALL lbc_lnk( ze3hdiv, 'T', 1. ) 
    139       ! 
    140       DO jk = jpkm1, 1, -1                   ! integrate from the bottom the e3t * hor. divergence 
    141          wsd3d(:,:,jk) = wsd3d(:,:,jk+1) - e3t_n(:,:,jk) * ze3hdiv(:,:,jk) 
     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 
     160      ! 
     161      CALL lbc_lnk( ze3divh, 'T', 1. ) 
     162      ! 
     163      IF( ln_linssh ) THEN   ;   ik = 1   ! none zero velocity through the sea surface 
     164      ELSE                   ;   ik = 2   ! w=0 at the surface (set one for all in sbc_wave_init) 
     165      ENDIF 
     166      DO jk = jpkm1, ik, -1          ! integrate from the bottom the e3t * hor. divergence (NB: at k=jpk w is always zero) 
     167         wsd(:,:,jk) = wsd(:,:,jk+1) - ze3divh(:,:,jk) 
    142168      END DO 
    143169#if defined key_bdy 
    144170      IF( lk_bdy ) THEN 
    145171         DO jk = 1, jpkm1 
    146             wsd3d(:,:,jk) = wsd3d(:,:,jk) * bdytmask(:,:) 
     172            wsd(:,:,jk) = wsd(:,:,jk) * bdytmask(:,:) 
    147173         END DO 
    148174      ENDIF 
    149175#endif 
    150       CALL wrk_dealloc( jpi,jpj,jpk, ze3hdiv ) 
     176      !                       !==  Horizontal divergence of barotropic Stokes transport  ==! 
     177      div_sd(:,:) = 0._wp 
     178      DO jk = 1, jpkm1                                 !  
     179        div_sd(:,:) = div_sd(:,:) + ze3divh(:,:,jk) 
     180      END DO 
     181      ! 
     182      CALL wrk_dealloc( jpi,jpj,jpk,   ze3divh ) 
     183      CALL wrk_dealloc( jpi,jpj,       zk_t, zk_u, zk_v, zu0_sd, zv0_sd ) 
    151184      ! 
    152185   END SUBROUTINE sbc_stokes 
    153186 
    154    SUBROUTINE sbc_qiao 
    155       !!--------------------------------------------------------------------- 
    156       !!                     ***  ROUTINE sbc_qiao  *** 
    157       !! 
    158       !! ** Purpose :   Qiao formulation for wave enhanced turbulence 
    159       !!                2010 (DOI: 10.1007/s10236-010-0326)  
    160       !! 
    161       !! ** Method  : -  
    162       !! ** action   
    163       !!--------------------------------------------------------------------- 
    164       INTEGER :: jj, ji 
    165  
    166       ! Calculate the module of the stokes drift on T grid 
    167       !------------------------------------------------- 
    168       DO jj = 1, jpj 
    169          DO ji = 1, jpi 
    170             tsd2d(ji,jj) = SQRT( zusd2dt(ji,jj) * zusd2dt(ji,jj) + zvsd2dt(ji,jj) * zvsd2dt(ji,jj) ) 
    171          END DO 
    172       END DO 
    173       ! 
    174    END SUBROUTINE sbc_qiao 
    175187 
    176188   SUBROUTINE sbc_wave( kt ) 
     
    188200      !! ** action   
    189201      !!--------------------------------------------------------------------- 
    190       USE zdf_oce,  ONLY : ln_zdfqiao 
    191  
    192       INTEGER, INTENT( in  ) :: kt       ! ocean time step 
    193       ! 
    194       INTEGER                ::   ierror   ! return error code 
    195       INTEGER                ::   ifpr 
    196       INTEGER                ::   ios      ! Local integer output status for namelist read 
    197       ! 
     202      INTEGER, INTENT(in   ) ::   kt   ! ocean time step 
     203      !!--------------------------------------------------------------------- 
     204      ! 
     205      IF( ln_cdgw .AND. .NOT. cpl_wdrag ) THEN     !==  Neutral drag coefficient  ==! 
     206         CALL fld_read( kt, nn_fsbc, sf_cd )             ! read from external forcing 
     207         cdn_wave(:,:) = sf_cd(1)%fnow(:,:,1) 
     208      ENDIF 
     209 
     210      IF( ln_tauoc .AND. .NOT. cpl_wstrf ) THEN    !==  Wave induced stress  ==! 
     211         CALL fld_read( kt, nn_fsbc, sf_tauoc )          ! read wave norm stress from external forcing 
     212         tauoc_wave(:,:) = sf_tauoc(1)%fnow(:,:,1) 
     213      ENDIF 
     214 
     215      IF( ln_sdw )  THEN                           !==  Computation of the 3d Stokes Drift  ==!  
     216         ! 
     217         IF( jpfld > 0 ) THEN                            ! Read from file only if the field is not coupled 
     218            CALL fld_read( kt, nn_fsbc, sf_sd )          ! read wave parameters from external forcing 
     219            IF( jp_hsw > 0 )   hsw  (:,:) = sf_sd(jp_hsw)%fnow(:,:,1)   ! significant wave height 
     220            IF( jp_wmp > 0 )   wmp  (:,:) = sf_sd(jp_wmp)%fnow(:,:,1)   ! wave mean period 
     221            IF( jp_usd > 0 )   ut0sd(:,:) = sf_sd(jp_usd)%fnow(:,:,1)   ! 2D zonal Stokes Drift at T point 
     222            IF( jp_vsd > 0 )   vt0sd(:,:) = sf_sd(jp_vsd)%fnow(:,:,1)   ! 2D meridional Stokes Drift at T point 
     223         ENDIF 
     224         ! 
     225         ! Read also wave number if needed, so that it is available in coupling routines 
     226         IF( ln_zdfqiao .AND. .NOT.cpl_wnum ) THEN 
     227            CALL fld_read( kt, nn_fsbc, sf_wn )          ! read wave parameters from external forcing 
     228            wnum(:,:) = sf_wn(1)%fnow(:,:,1) 
     229         ENDIF 
     230            
     231         !                                         !==  Computation of the 3d Stokes Drift  ==!  
     232         ! 
     233         IF( jpfld == 4 )   CALL sbc_stokes()            ! Calculate only if required fields are read 
     234         !                                               ! In coupled wave model-NEMO case the call is done after coupling 
     235         ! 
     236      ENDIF 
     237      ! 
     238   END SUBROUTINE sbc_wave 
     239 
     240 
     241   SUBROUTINE sbc_wave_init 
     242      !!--------------------------------------------------------------------- 
     243      !!                     ***  ROUTINE sbc_wave_init  *** 
     244      !! 
     245      !! ** Purpose :   read wave parameters from wave model  in netcdf files. 
     246      !! 
     247      !! ** Method  : - Read namelist namsbc_wave 
     248      !!              - Read Cd_n10 fields in netcdf files  
     249      !!              - Read stokes drift 2d in netcdf files  
     250      !!              - Read wave number in netcdf files  
     251      !!              - Compute 3d stokes drift using Breivik et al.,2014 
     252      !!                formulation 
     253      !! ** action   
     254      !!--------------------------------------------------------------------- 
     255      INTEGER ::   ierror, ios   ! local integer 
     256      INTEGER ::   ifpr 
     257      !! 
    198258      CHARACTER(len=100)     ::  cn_dir                          ! Root directory for location of drag coefficient files 
    199259      TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) ::   slf_i     ! array of namelist informations on the fields to read 
    200260      TYPE(FLD_N)            ::  sn_cdg, sn_usd, sn_vsd,  & 
    201                              &   sn_swh, sn_wmp, sn_wnum, sn_tauoc      ! informations about the fields to be read 
    202       !! 
    203       NAMELIST/namsbc_wave/  sn_cdg, cn_dir, sn_usd, sn_vsd, sn_swh, sn_wmp, sn_wnum, sn_tauoc 
    204       !!--------------------------------------------------------------------- 
    205       ! 
    206       !                                         ! -------------------- ! 
    207       IF( kt == nit000 ) THEN                   ! First call kt=nit000 ! 
    208          !                                      ! -------------------- ! 
    209          REWIND( numnam_ref )              ! Namelist namsbc_wave in reference namelist : File for drag coeff. from wave model 
    210          READ  ( numnam_ref, namsbc_wave, IOSTAT = ios, ERR = 901) 
    211 901      IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_wave in reference namelist', lwp ) 
     261                             &   sn_hsw, sn_wmp, sn_wnum, sn_tauoc      ! informations about the fields to be read 
     262      ! 
     263      NAMELIST/namsbc_wave/  sn_cdg, cn_dir, sn_usd, sn_vsd, sn_hsw, sn_wmp, sn_wnum, sn_tauoc 
     264      !!--------------------------------------------------------------------- 
     265      ! 
     266      REWIND( numnam_ref )              ! Namelist namsbc_wave in reference namelist : File for drag coeff. from wave model 
     267      READ  ( numnam_ref, namsbc_wave, IOSTAT = ios, ERR = 901) 
     268901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_wave in reference namelist', lwp ) 
    212269          
    213          REWIND( numnam_cfg )              ! Namelist namsbc_wave in configuration namelist : File for drag coeff. from wave model 
    214          READ  ( numnam_cfg, namsbc_wave, IOSTAT = ios, ERR = 902 ) 
    215 902      IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_wave in configuration namelist', lwp ) 
    216          IF(lwm) WRITE ( numond, namsbc_wave ) 
    217          ! 
    218          IF( ln_cdgw ) THEN 
    219             IF( .NOT. cpl_wdrag ) THEN 
    220                ALLOCATE( sf_cd(1), STAT=ierror )           !* allocate and fill sf_wave with sn_cdg 
    221                IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave: unable to allocate sf_wave structure' ) 
    222                ! 
    223                                       ALLOCATE( sf_cd(1)%fnow(jpi,jpj,1)   ) 
    224                IF( sn_cdg%ln_tint )   ALLOCATE( sf_cd(1)%fdta(jpi,jpj,1,2) ) 
    225                CALL fld_fill( sf_cd, (/ sn_cdg /), cn_dir, 'sbc_wave', 'Wave module ', 'namsbc_wave' ) 
     270      REWIND( numnam_cfg )              ! Namelist namsbc_wave in configuration namelist : File for drag coeff. from wave model 
     271      READ  ( numnam_cfg, namsbc_wave, IOSTAT = ios, ERR = 902 ) 
     272902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_wave in configuration namelist', lwp ) 
     273      IF(lwm) WRITE ( numond, namsbc_wave ) 
     274      ! 
     275      IF( ln_cdgw ) THEN 
     276         IF( .NOT. cpl_wdrag ) THEN 
     277            ALLOCATE( sf_cd(1), STAT=ierror )           !* allocate and fill sf_wave with sn_cdg 
     278            IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave: unable to allocate sf_wave structure' ) 
     279            ! 
     280                                   ALLOCATE( sf_cd(1)%fnow(jpi,jpj,1)   ) 
     281            IF( sn_cdg%ln_tint )   ALLOCATE( sf_cd(1)%fdta(jpi,jpj,1,2) ) 
     282            CALL fld_fill( sf_cd, (/ sn_cdg /), cn_dir, 'sbc_wave', 'Wave module ', 'namsbc_wave' ) 
     283         ENDIF 
     284         ALLOCATE( cdn_wave(jpi,jpj) ) 
     285      ENDIF 
     286 
     287      IF( ln_tauoc ) THEN 
     288         IF( .NOT. cpl_wstrf ) THEN 
     289            ALLOCATE( sf_tauoc(1), STAT=ierror )           !* allocate and fill sf_wave with sn_tauoc 
     290            IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave: unable to allocate sf_wave structure' ) 
     291            ! 
     292                                    ALLOCATE( sf_tauoc(1)%fnow(jpi,jpj,1)   ) 
     293            IF( sn_tauoc%ln_tint )  ALLOCATE( sf_tauoc(1)%fdta(jpi,jpj,1,2) ) 
     294            CALL fld_fill( sf_tauoc, (/ sn_tauoc /), cn_dir, 'sbc_wave', 'Wave module', 'namsbc_wave' ) 
     295         ENDIF 
     296         ALLOCATE( tauoc_wave(jpi,jpj) ) 
     297      ENDIF 
     298 
     299      IF( ln_sdw ) THEN   ! Find out how many fields have to be read from file if not coupled 
     300         jpfld=0 
     301         jp_usd=0   ;   jp_vsd=0   ;   jp_hsw=0   ;   jp_wmp=0 
     302         IF( .NOT. cpl_sdrftx ) THEN 
     303            jpfld  = jpfld + 1 
     304            jp_usd = jpfld 
     305         ENDIF 
     306         IF( .NOT. cpl_sdrfty ) THEN 
     307            jpfld  = jpfld + 1 
     308            jp_vsd = jpfld 
     309         ENDIF 
     310         IF( .NOT. cpl_hsig ) THEN 
     311            jpfld  = jpfld + 1 
     312            jp_hsw = jpfld 
     313         ENDIF 
     314         IF( .NOT. cpl_wper ) THEN 
     315            jpfld  = jpfld + 1 
     316            jp_wmp = jpfld 
     317         ENDIF 
     318 
     319         ! Read from file only the non-coupled fields  
     320         IF( jpfld > 0 ) THEN 
     321            ALLOCATE( slf_i(jpfld) ) 
     322            IF( jp_usd > 0 )   slf_i(jp_usd) = sn_usd 
     323            IF( jp_vsd > 0 )   slf_i(jp_vsd) = sn_vsd 
     324            IF( jp_hsw > 0 )   slf_i(jp_hsw) = sn_hsw 
     325            IF( jp_wmp > 0 )   slf_i(jp_wmp) = sn_wmp 
     326            ALLOCATE( sf_sd(jpfld), STAT=ierror )   !* allocate and fill sf_sd with stokes drift 
     327            IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave: unable to allocate sf_wave structure' ) 
     328            ! 
     329            DO ifpr= 1, jpfld 
     330               ALLOCATE( sf_sd(ifpr)%fnow(jpi,jpj,1) ) 
     331               IF( slf_i(ifpr)%ln_tint )   ALLOCATE( sf_sd(ifpr)%fdta(jpi,jpj,1,2) ) 
     332            END DO 
     333            ! 
     334            CALL fld_fill( sf_sd, slf_i, cn_dir, 'sbc_wave', 'Wave module ', 'namsbc_wave' ) 
     335         ENDIF 
     336         ALLOCATE( usd  (jpi,jpj,jpk), vsd  (jpi,jpj,jpk), wsd(jpi,jpj,jpk) ) 
     337         ALLOCATE( usd  (jpi,jpj,jpk), vsd  (jpi,jpj,jpk) ) 
     338         ALLOCATE( hsw  (jpi,jpj)    , wmp  (jpi,jpj)     ) 
     339         ALLOCATE( ut0sd(jpi,jpj)    , vt0sd(jpi,jpj)     ) 
     340         ALLOCATE( div_sd(jpi,jpj) ) 
     341         usd(:,:,:) = 0._wp 
     342         vsd(:,:,:) = 0._wp 
     343         wsd(:,:,:) = 0._wp 
     344         IF( ln_zdfqiao ) THEN     !==  Vertical mixing enhancement using Qiao,2010  ==! 
     345            IF( .NOT. cpl_wnum ) THEN 
     346               ALLOCATE( sf_wn(1), STAT=ierror )           !* allocate and fill sf_wave with sn_wnum 
     347               IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave: unable toallocate sf_wave structure' ) 
     348                                      ALLOCATE( sf_wn(1)%fnow(jpi,jpj,1)   ) 
     349               IF( sn_wnum%ln_tint )  ALLOCATE( sf_wn(1)%fdta(jpi,jpj,1,2) ) 
     350               CALL fld_fill( sf_wn, (/ sn_wnum /), cn_dir, 'sbc_wave', 'Wave module', 'namsbc_wave' ) 
    226351            ENDIF 
    227             ALLOCATE( cdn_wave(jpi,jpj) ) 
    228          ENDIF 
    229  
    230          IF( ln_tauoc ) THEN 
    231             IF( .NOT. cpl_wstrf ) THEN 
    232                ALLOCATE( sf_tauoc(1), STAT=ierror )           !* allocate and fill sf_wave with sn_tauoc 
    233                IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave: unable to allocate sf_wave structure' ) 
    234                ! 
    235                                        ALLOCATE( sf_tauoc(1)%fnow(jpi,jpj,1)   ) 
    236                IF( sn_tauoc%ln_tint )  ALLOCATE( sf_tauoc(1)%fdta(jpi,jpj,1,2) ) 
    237                CALL fld_fill( sf_tauoc, (/ sn_tauoc /), cn_dir, 'sbc_wave', 'Wave module', 'namsbc_wave' ) 
    238             ENDIF 
    239             ALLOCATE( tauoc_wave(jpi,jpj) ) 
    240          ENDIF 
    241  
    242          IF( ln_sdw ) THEN 
    243             ! Find out how many fields have to be read from file if not coupled 
    244             jpfld=0 
    245             jp_usd=0; jp_vsd=0; jp_swh=0; jp_wmp=0 
    246             IF( .NOT. cpl_sdrftx ) THEN 
    247                jpfld=jpfld+1 
    248                jp_usd=jpfld 
    249             ENDIF 
    250             IF( .NOT. cpl_sdrfty ) THEN 
    251                jpfld=jpfld+1 
    252                jp_vsd=jpfld 
    253             ENDIF 
    254             IF( .NOT. cpl_hsig ) THEN 
    255                jpfld=jpfld+1 
    256                jp_swh=jpfld 
    257             ENDIF 
    258             IF( .NOT. cpl_wper ) THEN 
    259                jpfld=jpfld+1 
    260                jp_wmp=jpfld 
    261             ENDIF 
    262  
    263             ! Read from file only the non-coupled fields  
    264             IF( jpfld > 0 ) THEN 
    265                ALLOCATE( slf_i(jpfld) ) 
    266                IF( jp_usd > 0 ) slf_i(jp_usd) = sn_usd 
    267                IF( jp_vsd > 0 ) slf_i(jp_vsd) = sn_vsd 
    268                IF( jp_swh > 0 ) slf_i(jp_swh) = sn_swh 
    269                IF( jp_wmp > 0 ) slf_i(jp_wmp) = sn_wmp 
    270                ALLOCATE( sf_sd(jpfld), STAT=ierror )           !* allocate and fill sf_sd with stokes drift 
    271                IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave: unable to allocate sf_wave structure' ) 
    272                ! 
    273                DO ifpr= 1, jpfld 
    274                   ALLOCATE( sf_sd(ifpr)%fnow(jpi,jpj,1) ) 
    275                   IF( slf_i(ifpr)%ln_tint )   ALLOCATE( sf_sd(ifpr)%fdta(jpi,jpj,1,2) ) 
    276                END DO 
    277  
    278                CALL fld_fill( sf_sd, slf_i, cn_dir, 'sbc_wave', 'Wave module ', 'namsbc_wave' ) 
    279             ENDIF 
    280             ALLOCATE( usd3d(jpi,jpj,jpk),vsd3d(jpi,jpj,jpk),wsd3d(jpi,jpj,jpk) ) 
    281             ALLOCATE( usd3dt(jpi,jpj,jpk),vsd3dt(jpi,jpj,jpk) ) 
    282             ALLOCATE( swh(jpi,jpj), wmp(jpi,jpj) ) 
    283             ALLOCATE( zusd2dt(jpi,jpj), zvsd2dt(jpi,jpj) ) 
    284             usd3d(:,:,:) = 0._wp 
    285             vsd3d(:,:,:) = 0._wp 
    286             wsd3d(:,:,:) = 0._wp 
    287             IF( ln_zdfqiao ) THEN     !==  Vertical mixing enhancement using Qiao,2010  ==! 
    288                IF( .NOT. cpl_wnum ) THEN 
    289                   ALLOCATE( sf_wn(1), STAT=ierror )           !* allocate and fill sf_wave with sn_wnum 
    290                   IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave: unable toallocate sf_wave structure' ) 
    291                                          ALLOCATE( sf_wn(1)%fnow(jpi,jpj,1)   ) 
    292                   IF( sn_wnum%ln_tint )  ALLOCATE( sf_wn(1)%fdta(jpi,jpj,1,2) ) 
    293                   CALL fld_fill( sf_wn, (/ sn_wnum /), cn_dir, 'sbc_wave', 'Wave module', 'namsbc_wave' ) 
    294                ENDIF 
    295                ALLOCATE( wnum(jpi,jpj),tsd2d(jpi,jpj) ) 
    296             ENDIF 
    297          ENDIF 
    298       ENDIF 
    299       ! 
    300       IF( ln_cdgw .AND. .NOT. cpl_wdrag ) THEN              !==  Neutral drag coefficient  ==! 
    301          CALL fld_read( kt, nn_fsbc, sf_cd )      ! read from external forcing 
    302          cdn_wave(:,:) = sf_cd(1)%fnow(:,:,1) 
    303       ENDIF 
    304  
    305       IF( ln_tauoc .AND. .NOT. cpl_wstrf ) THEN             !==  Wave induced stress  ==! 
    306          CALL fld_read( kt, nn_fsbc, sf_tauoc )      !* read wave norm stress from external forcing 
    307          tauoc_wave(:,:) = sf_tauoc(1)%fnow(:,:,1) 
    308       ENDIF 
    309  
    310       IF( ln_sdw )  THEN                         !==  Computation of the 3d Stokes Drift  ==!  
    311          ! 
    312          ! Read from file only if the field is not coupled 
    313          IF( jpfld > 0 ) THEN 
    314             CALL fld_read( kt, nn_fsbc, sf_sd )      !* read wave parameters from external forcing 
    315             IF( jp_swh > 0 ) swh(:,:)     = sf_sd(jp_swh)%fnow(:,:,1)   ! significant wave height 
    316             IF( jp_wmp > 0 ) wmp(:,:)     = sf_sd(jp_wmp)%fnow(:,:,1)   ! wave mean period 
    317             IF( jp_usd > 0 ) zusd2dt(:,:) = sf_sd(jp_usd)%fnow(:,:,1)   ! 2D zonal Stokes Drift at T point 
    318             IF( jp_vsd > 0 ) zvsd2dt(:,:) = sf_sd(jp_vsd)%fnow(:,:,1)   ! 2D meridional Stokes Drift at T point 
    319          ENDIF 
    320          ! 
    321          ! Read also wave number if needed, so that it is available in coupling routines 
    322          IF( ln_zdfqiao .AND. .NOT. cpl_wnum ) THEN 
    323             CALL fld_read( kt, nn_fsbc, sf_wn )      !* read wave parameters from external forcing 
    324             wnum(:,:) = sf_wn(1)%fnow(:,:,1) 
    325          ENDIF 
    326             
    327          !==  Computation of the 3d Stokes Drift according to Breivik et al.,2014 
    328          !(DOI: 10.1175/JPO-D-14-0020.1)==!  
    329          ! 
    330          ! Calculate only if no necessary fields are coupled, if not calculate later after coupling 
    331          IF( jpfld == 4 ) THEN 
    332             CALL sbc_stokes() 
    333             IF( ln_zdfqiao .AND. .NOT. cpl_wnum ) THEN 
    334                CALL sbc_qiao() 
    335             ENDIF 
    336          ENDIF 
    337       ENDIF 
    338       ! 
    339    END SUBROUTINE sbc_wave 
    340        
     352            ALLOCATE( wnum(jpi,jpj),tsd2d(jpi,jpj) ) 
     353         ENDIF 
     354      ENDIF 
     355      ! 
     356   END SUBROUTINE sbc_wave_init 
     357 
    341358   !!====================================================================== 
    342359END MODULE sbcwave 
Note: See TracChangeset for help on using the changeset viewer.