Index: branches/UKMO/r8395_cpl_tauwav/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90
===================================================================
--- branches/UKMO/r8395_cpl_tauwav/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90	(revision 12286)
+++ branches/UKMO/r8395_cpl_tauwav/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90	(revision 12287)
@@ -65,4 +65,5 @@
    LOGICAL , PUBLIC ::   ln_sdw         !: true if 3d stokes drift from wave model
    LOGICAL , PUBLIC ::   ln_tauoc       !: true if normalized stress from wave is used
+   LOGICAL , PUBLIC ::   ln_tauw        !: true if ocean stress components from wave is used
    LOGICAL , PUBLIC ::   ln_stcor       !: true if Stokes-Coriolis term is used
    !
Index: branches/UKMO/r8395_cpl_tauwav/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90
===================================================================
--- branches/UKMO/r8395_cpl_tauwav/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90	(revision 12286)
+++ branches/UKMO/r8395_cpl_tauwav/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90	(revision 12287)
@@ -117,6 +117,8 @@
    INTEGER, PARAMETER ::   jpr_isf    = 52
    INTEGER, PARAMETER ::   jpr_icb    = 53
-
-   INTEGER, PARAMETER ::   jprcv      = 53   ! total number of fields received  
+   INTEGER, PARAMETER ::   jpr_tauwx  = 54   ! x component of the ocean stress from waves 
+   INTEGER, PARAMETER ::   jpr_tauwy  = 55   ! y component of the ocean stress from waves
+
+   INTEGER, PARAMETER ::   jprcv      = 55   ! total number of fields received  
 
    INTEGER, PARAMETER ::   jps_fice   =  1   ! ice fraction sent to the atmosphere
@@ -170,5 +172,6 @@
    TYPE(FLD_C) ::   sn_snd_ifrac, sn_snd_crtw, sn_snd_wlev 
    ! Received from waves 
-   TYPE(FLD_C) ::   sn_rcv_hsig,sn_rcv_phioc,sn_rcv_sdrfx,sn_rcv_sdrfy,sn_rcv_wper,sn_rcv_wnum,sn_rcv_wstrf,sn_rcv_wdrag
+   TYPE(FLD_C) ::   sn_rcv_hsig,sn_rcv_phioc,sn_rcv_sdrfx,sn_rcv_sdrfy,sn_rcv_wper,sn_rcv_wnum,sn_rcv_wstrf,sn_rcv_tauw, &
+                    sn_rcv_wdrag
    !                                   ! Other namelist parameters
    INTEGER     ::   nn_cplmodel           ! Maximum number of models to/from which NEMO is potentialy sending/receiving data
@@ -245,5 +248,5 @@
          &                  sn_rcv_wdrag, sn_rcv_qns  , sn_rcv_emp   , sn_rcv_rnf   , sn_rcv_cal   ,   &
          &                  sn_rcv_iceflx,sn_rcv_co2  , nn_cplmodel  , ln_usecplmask, sn_rcv_mslp  ,   &
-         &                  sn_rcv_icb , sn_rcv_isf
+         &                  sn_rcv_icb , sn_rcv_isf   , sn_rcv_tauw
 
       !!---------------------------------------------------------------------
@@ -296,4 +299,5 @@
          WRITE(numout,*)'      Mean wave number                = ', TRIM(sn_rcv_wnum%cldes  ), ' (', TRIM(sn_rcv_wnum%clcat  ), ')' 
          WRITE(numout,*)'      Stress frac adsorbed by waves   = ', TRIM(sn_rcv_wstrf%cldes ), ' (', TRIM(sn_rcv_wstrf%clcat ), ')' 
+         WRITE(numout,*)'      Stress components by waves      = ', TRIM(sn_rcv_tauw%cldes  ), ' (', TRIM(sn_rcv_tauw%clcat  ), ')'
          WRITE(numout,*)'      Neutral surf drag coefficient   = ', TRIM(sn_rcv_wdrag%cldes ), ' (', TRIM(sn_rcv_wdrag%clcat ), ')' 
          WRITE(numout,*)'  sent fields (multiple ice categories)'
@@ -588,4 +592,11 @@
          cpl_wstrf = .TRUE.
       ENDIF
+      srcv(jpr_tauwx)%clname = 'O_Tauwx'      ! ocean stress from wave in the x direction 
+      srcv(jpr_tauwy)%clname = 'O_Tauwy'      ! ocean stress from wave in the y direction 
+      IF( TRIM(sn_rcv_tauw%cldes ) == 'coupled' )  THEN  
+         srcv(jpr_tauwx)%laction = .TRUE.  
+         srcv(jpr_tauwy)%laction = .TRUE.  
+         cpl_tauw = .TRUE.  
+      ENDIF
       srcv(jpr_wdrag)%clname = 'O_WDrag'     ! neutral surface drag coefficient
       IF( TRIM(sn_rcv_wdrag%cldes ) == 'coupled' )  THEN
@@ -593,4 +604,9 @@
          cpl_wdrag = .TRUE.
       ENDIF
+      ! 
+      IF( srcv(jpr_tauoc)%laction .AND. srcv(jpr_tauwx)%laction .AND. srcv(jpr_tauwy)%laction ) & 
+            CALL ctl_stop( 'More than one method for modifying the ocean stress has been selected ', & 
+                                     '(sn_rcv_tauoc=coupled and sn_rcv_tauw=coupled)' ) 
+      !
       ! 
       !                                                      ! ------------------------------- !
@@ -1181,4 +1197,12 @@
       !                                                      ! ========================= ! 
       IF( srcv(jpr_wstrf)%laction .AND. ln_tauoc ) tauoc_wave(:,:) = frcv(jpr_wstrf)%z3(:,:,1)
+
+      !                                                      ! ========================= ! 
+      !                                                      ! Stress component by waves !
+      !                                                      ! ========================= ! 
+      IF( srcv(jpr_tauwx)%laction .AND. srcv(jpr_tauwy)%laction .AND. ln_tauw ) THEN
+         tauw_x(:,:) = frcv(jpr_tauwx)%z3(:,:,1)
+         tauw_y(:,:) = frcv(jpr_tauwy)%z3(:,:,1)
+      ENDIF
 
       !                                                      ! ========================= ! 
Index: branches/UKMO/r8395_cpl_tauwav/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90
===================================================================
--- branches/UKMO/r8395_cpl_tauwav/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90	(revision 12286)
+++ branches/UKMO/r8395_cpl_tauwav/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90	(revision 12287)
@@ -407,17 +407,7 @@
          IF( ll_opa    )       CALL sbc_cpl_rcv   ( kt, nn_fsbc, nn_ice )   ! OPA-SAS coupling: OPA receiving fields from SAS
       END SELECT
-      IF ( ln_wave .AND. ln_tauoc) THEN                                 ! Wave stress subctracted
-            utau(:,:) = utau(:,:)*tauoc_wave(:,:)
-            vtau(:,:) = vtau(:,:)*tauoc_wave(:,:)
-            taum(:,:) = taum(:,:)*tauoc_wave(:,:)
-      !
-            SELECT CASE( nsbc )
-            CASE(  0,1,2,3,5,-1 )  ;
-                IF(lwp .AND. kt == nit000 ) WRITE(numout,*) 'WARNING: You are subtracting the wave stress to the ocean. &
-                        & If not requested select ln_tauoc=.false'
-            END SELECT
-      !
-      END IF
       IF( ln_mixcpl )          CALL sbc_cpl_rcv   ( kt, nn_fsbc, nn_ice )   ! forced-coupled mixed formulation after forcing
+
+      IF ( ln_wave .AND. (ln_tauoc .OR. ln_tauw) ) CALL sbc_stress( )       ! Wave stress update
 
       !
Index: branches/UKMO/r8395_cpl_tauwav/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90
===================================================================
--- branches/UKMO/r8395_cpl_tauwav/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90	(revision 12286)
+++ branches/UKMO/r8395_cpl_tauwav/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90	(revision 12287)
@@ -33,4 +33,5 @@
 
    PUBLIC   sbc_stokes      ! routine called in sbccpl
+   PUBLIC   sbc_stress      ! routine called in sbcmod
    PUBLIC   sbc_wave        ! routine called in sbcmod
    PUBLIC   sbc_wave_init   ! routine called in sbcmod
@@ -44,4 +45,5 @@
    LOGICAL, PUBLIC ::   cpl_wnum   = .FALSE.
    LOGICAL, PUBLIC ::   cpl_wstrf  = .FALSE.
+   LOGICAL, PUBLIC ::   cpl_tauw   = .FALSE.
    LOGICAL, PUBLIC ::   cpl_wdrag  = .FALSE.
 
@@ -56,7 +58,10 @@
    TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_wn      ! structure of input fields (file informations, fields read) wave number for Qiao
    TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_tauoc   ! structure of input fields (file informations, fields read) normalized wave stress into the ocean
+   TYPE(FLD), ALLOCATABLE, DIMENSION(:) ::   sf_tauw    ! structure of input fields (file informations, fields read) ocean stress components from wave model
    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   cdn_wave            !:
    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   hsw, wmp, wnum      !: 
    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   tauoc_wave          !:  
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   tauw_x              !:
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   tauw_y              !:
    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   tsd2d               !: 
    REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)   ::   div_sd              !: barotropic stokes drift divergence
@@ -188,4 +193,39 @@
    END SUBROUTINE sbc_stokes
 
+   SUBROUTINE sbc_stress( ) 
+      !!--------------------------------------------------------------------- 
+      !!                     ***  ROUTINE sbc_stress  *** 
+      !! 
+      !! ** Purpose :   Updates the ocean momentum modified by waves 
+      !! 
+      !! ** Method  : - Calculate u,v components of stress depending on stress 
+      !!                model  
+      !!              - Calculate the stress module 
+      !!              - The wind module is not modified by waves  
+      !! ** action   
+      !!--------------------------------------------------------------------- 
+      INTEGER  ::   jj, ji   ! dummy loop argument 
+      ! 
+      IF( ln_tauoc ) THEN 
+         utau(:,:) = utau(:,:)*tauoc_wave(:,:) 
+         vtau(:,:) = vtau(:,:)*tauoc_wave(:,:) 
+         taum(:,:) = taum(:,:)*tauoc_wave(:,:) 
+      ENDIF 
+      ! 
+      IF( ln_tauw ) THEN 
+         DO jj = 1, jpjm1 
+            DO ji = 1, jpim1 
+               ! Stress components at u- & v-points 
+               utau(ji,jj) = 0.5_wp * ( tauw_x(ji,jj) + tauw_x(ji+1,jj) ) 
+               vtau(ji,jj) = 0.5_wp * ( tauw_y(ji,jj) + tauw_y(ji,jj+1) ) 
+               ! 
+               ! Stress module at t points 
+               taum(ji,jj) = SQRT( tauw_x(ji,jj)*tauw_x(ji,jj) + tauw_y(ji,jj)*tauw_y(ji,jj) ) 
+            END DO 
+         END DO 
+         CALL lbc_lnk_multi( utau(:,:), 'U', -1. , vtau(:,:), 'V', -1. , taum(:,: ), 'T', -1. ) 
+      ENDIF 
+      ! 
+   END SUBROUTINE sbc_stress 
 
    SUBROUTINE sbc_wave( kt )
@@ -214,4 +254,10 @@
          CALL fld_read( kt, nn_fsbc, sf_tauoc )          ! read wave norm stress from external forcing
          tauoc_wave(:,:) = sf_tauoc(1)%fnow(:,:,1)
+      ENDIF
+
+      IF( ln_tauw .AND. .NOT. cpl_tauw ) THEN      !==  Wave induced stress  ==! 
+         CALL fld_read( kt, nn_fsbc, sf_tauw )           ! read ocean stress components from external forcing (T grid) 
+         tauw_x(:,:) = sf_tauw(1)%fnow(:,:,1) 
+         tauw_y(:,:) = sf_tauw(2)%fnow(:,:,1) 
       ENDIF
 
@@ -260,9 +306,9 @@
       !!
       CHARACTER(len=100)     ::  cn_dir                          ! Root directory for location of drag coefficient files
-      TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) ::   slf_i     ! array of namelist informations on the fields to read
+      TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) ::   slf_i, slf_j   ! array of namelist informations on the fields to read
       TYPE(FLD_N)            ::  sn_cdg, sn_usd, sn_vsd,  &
                              &   sn_hsw, sn_wmp, sn_wnum, sn_tauoc      ! informations about the fields to be read
       !
-      NAMELIST/namsbc_wave/  sn_cdg, cn_dir, sn_usd, sn_vsd, sn_hsw, sn_wmp, sn_wnum, sn_tauoc
+      NAMELIST/namsbc_wave/  sn_cdg, cn_dir, sn_usd, sn_vsd, sn_hsw, sn_wmp, sn_wnum, sn_tauoc, sn_tauwx, sn_tauwy
       !!---------------------------------------------------------------------
       !
@@ -276,4 +322,13 @@
       IF(lwm) WRITE ( numond, namsbc_wave )
       !
+      IF( ln_tauoc .AND. ln_tauw ) &  
+         CALL ctl_stop( 'More than one method for modifying the ocean stress has been selected ', & 
+                                  '(ln_tauoc=.true. and ln_tauw=.true.)' ) 
+      IF( ln_tauoc ) & 
+          CALL ctl_warn( 'You are subtracting the wave stress to the ocean (ln_tauoc=.true.)' ) 
+      IF( ln_tauw ) & 
+          CALL ctl_warn( 'The wave modified ocean stress components are used (ln_tauw=.true.) ', & 
+                               'This will override any other specification of the ocean stress' )  
+
       IF( ln_cdgw ) THEN
          IF( .NOT. cpl_wdrag ) THEN
@@ -298,4 +353,22 @@
          ENDIF
          ALLOCATE( tauoc_wave(jpi,jpj) )
+      ENDIF
+
+      IF( ln_tauw ) THEN 
+         IF( .NOT. cpl_tauw ) THEN 
+            ALLOCATE( sf_tauw(2), STAT=ierror )           !* allocate and fill sf_wave with sn_tauwx/y 
+            IF( ierror > 0 )   CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_tauw structure' ) 
+            ! 
+            ALLOCATE( slf_j(2) ) 
+            slf_j(1) = sn_tauwx 
+            slf_j(2) = sn_tauwy 
+                                    ALLOCATE( sf_tauw(1)%fnow(jpi,jpj,1)   ) 
+                                    ALLOCATE( sf_tauw(2)%fnow(jpi,jpj,1)   ) 
+            IF( slf_j(1)%ln_tint )  ALLOCATE( sf_tauw(1)%fdta(jpi,jpj,1,2) ) 
+            IF( slf_j(2)%ln_tint )  ALLOCATE( sf_tauw(2)%fdta(jpi,jpj,1,2) ) 
+            CALL fld_fill( sf_tauw, (/ slf_j /), cn_dir, 'sbc_wave_init', 'read wave input', 'namsbc_wave' ) 
+         ENDIF 
+         ALLOCATE( tauw_x(jpi,jpj) ) 
+         ALLOCATE( tauw_y(jpi,jpj) ) 
       ENDIF
 
