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.
sbccpl.F90 in NEMO/branches/UKMO/NEMO_4.0_new_runoff_coupling/src/OCE/SBC – NEMO

source: NEMO/branches/UKMO/NEMO_4.0_new_runoff_coupling/src/OCE/SBC/sbccpl.F90 @ 11509

Last change on this file since 11509 was 11509, checked in by dancopsey, 5 years ago

Merge in all the 1D river runoff code as I comitted to the GO6 package branch (skipping anything to do with Antarctic and Greenland icesheet mass).

File size: 154.9 KB
RevLine 
[888]1MODULE sbccpl
2   !!======================================================================
3   !!                       ***  MODULE  sbccpl  ***
[1218]4   !! Surface Boundary Condition :  momentum, heat and freshwater fluxes in coupled mode
5   !!======================================================================
[2528]6   !! History :  2.0  ! 2007-06  (R. Redler, N. Keenlyside, W. Park) Original code split into flxmod & taumod
7   !!            3.0  ! 2008-02  (G. Madec, C Talandier)  surface module
8   !!            3.1  ! 2009_02  (G. Madec, S. Masson, E. Maisonave, A. Caubel) generic coupled interface
[3294]9   !!            3.4  ! 2011_11  (C. Harris) more flexibility + multi-category fields
[888]10   !!----------------------------------------------------------------------
[9019]11
[888]12   !!----------------------------------------------------------------------
[1218]13   !!   namsbc_cpl      : coupled formulation namlist
14   !!   sbc_cpl_init    : initialisation of the coupled exchanges
15   !!   sbc_cpl_rcv     : receive fields from the atmosphere over the ocean (ocean only)
16   !!                     receive stress from the atmosphere over the ocean (ocean-ice case)
17   !!   sbc_cpl_ice_tau : receive stress from the atmosphere over ice
18   !!   sbc_cpl_ice_flx : receive fluxes from the atmosphere over ice
19   !!   sbc_cpl_snd     : send     fields to the atmosphere
[888]20   !!----------------------------------------------------------------------
[7646]21   USE dom_oce         ! ocean space and time domain
22   USE sbc_oce         ! Surface boundary condition: ocean fields
23   USE trc_oce         ! share SMS/Ocean variables
24   USE sbc_ice         ! Surface boundary condition: ice fields
25   USE sbcapr          ! Stochastic param. : ???
26   USE sbcdcy          ! surface boundary condition: diurnal cycle
27   USE sbcwave         ! surface boundary condition: waves
28   USE phycst          ! physical constants
[9570]29#if defined key_si3
[6140]30   USE ice            ! ice variables
[1218]31#endif
[6140]32   USE cpl_oasis3     ! OASIS3 coupling
33   USE geo2ocean      !
[9019]34   USE oce     , ONLY : tsn, un, vn, sshn, ub, vb, sshb, fraqsr_1lev
35   USE ocealb         !
[6140]36   USE eosbn2         !
[9019]37   USE sbcrnf  , ONLY : l_rnfcpl
[11509]38   USE cpl_rnf_1d, ONLY: nn_cpl_river, cpl_rnf_1d_init, cpl_rnf_1d_to_2d   ! Variables used in 1D river outflow
[9019]39   USE sbcisf  , ONLY : l_isfcpl
[3294]40#if defined key_cice
41   USE ice_domain_size, only: ncat
42#endif
[9570]43#if defined key_si3
[9019]44   USE icethd_dh      ! for CALL ice_thd_snwblow
[5407]45#endif
[6140]46   !
47   USE in_out_manager ! I/O manager
48   USE iom            ! NetCDF library
49   USE lib_mpp        ! distribued memory computing library
50   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
[5407]51
[1218]52   IMPLICIT NONE
53   PRIVATE
[5407]54
[6140]55   PUBLIC   sbc_cpl_init      ! routine called by sbcmod.F90
[9019]56   PUBLIC   sbc_cpl_rcv       ! routine called by icestp.F90
[6140]57   PUBLIC   sbc_cpl_snd       ! routine called by step.F90
[9019]58   PUBLIC   sbc_cpl_ice_tau   ! routine called by icestp.F90
59   PUBLIC   sbc_cpl_ice_flx   ! routine called by icestp.F90
[6140]60   PUBLIC   sbc_cpl_alloc     ! routine called in sbcice_cice.F90
[2715]61
[6140]62   INTEGER, PARAMETER ::   jpr_otx1   =  1   ! 3 atmosphere-ocean stress components on grid 1
63   INTEGER, PARAMETER ::   jpr_oty1   =  2   !
64   INTEGER, PARAMETER ::   jpr_otz1   =  3   !
65   INTEGER, PARAMETER ::   jpr_otx2   =  4   ! 3 atmosphere-ocean stress components on grid 2
66   INTEGER, PARAMETER ::   jpr_oty2   =  5   !
67   INTEGER, PARAMETER ::   jpr_otz2   =  6   !
68   INTEGER, PARAMETER ::   jpr_itx1   =  7   ! 3 atmosphere-ice   stress components on grid 1
69   INTEGER, PARAMETER ::   jpr_ity1   =  8   !
70   INTEGER, PARAMETER ::   jpr_itz1   =  9   !
71   INTEGER, PARAMETER ::   jpr_itx2   = 10   ! 3 atmosphere-ice   stress components on grid 2
72   INTEGER, PARAMETER ::   jpr_ity2   = 11   !
73   INTEGER, PARAMETER ::   jpr_itz2   = 12   !
74   INTEGER, PARAMETER ::   jpr_qsroce = 13   ! Qsr above the ocean
75   INTEGER, PARAMETER ::   jpr_qsrice = 14   ! Qsr above the ice
[1226]76   INTEGER, PARAMETER ::   jpr_qsrmix = 15 
[6140]77   INTEGER, PARAMETER ::   jpr_qnsoce = 16   ! Qns above the ocean
78   INTEGER, PARAMETER ::   jpr_qnsice = 17   ! Qns above the ice
[1226]79   INTEGER, PARAMETER ::   jpr_qnsmix = 18
[6140]80   INTEGER, PARAMETER ::   jpr_rain   = 19   ! total liquid precipitation (rain)
81   INTEGER, PARAMETER ::   jpr_snow   = 20   ! solid precipitation over the ocean (snow)
82   INTEGER, PARAMETER ::   jpr_tevp   = 21   ! total evaporation
83   INTEGER, PARAMETER ::   jpr_ievp   = 22   ! solid evaporation (sublimation)
84   INTEGER, PARAMETER ::   jpr_sbpr   = 23   ! sublimation - liquid precipitation - solid precipitation
85   INTEGER, PARAMETER ::   jpr_semp   = 24   ! solid freshwater budget (sublimation - snow)
86   INTEGER, PARAMETER ::   jpr_oemp   = 25   ! ocean freshwater budget (evap - precip)
87   INTEGER, PARAMETER ::   jpr_w10m   = 26   ! 10m wind
88   INTEGER, PARAMETER ::   jpr_dqnsdt = 27   ! d(Q non solar)/d(temperature)
89   INTEGER, PARAMETER ::   jpr_rnf    = 28   ! runoffs
90   INTEGER, PARAMETER ::   jpr_cal    = 29   ! calving
91   INTEGER, PARAMETER ::   jpr_taum   = 30   ! wind stress module
[1696]92   INTEGER, PARAMETER ::   jpr_co2    = 31
[6140]93   INTEGER, PARAMETER ::   jpr_topm   = 32   ! topmeltn
94   INTEGER, PARAMETER ::   jpr_botm   = 33   ! botmeltn
95   INTEGER, PARAMETER ::   jpr_sflx   = 34   ! salt flux
96   INTEGER, PARAMETER ::   jpr_toce   = 35   ! ocean temperature
97   INTEGER, PARAMETER ::   jpr_soce   = 36   ! ocean salinity
98   INTEGER, PARAMETER ::   jpr_ocx1   = 37   ! ocean current on grid 1
99   INTEGER, PARAMETER ::   jpr_ocy1   = 38   !
100   INTEGER, PARAMETER ::   jpr_ssh    = 39   ! sea surface height
101   INTEGER, PARAMETER ::   jpr_fice   = 40   ! ice fraction         
102   INTEGER, PARAMETER ::   jpr_e3t1st = 41   ! first T level thickness
103   INTEGER, PARAMETER ::   jpr_fraqsr = 42   ! fraction of solar net radiation absorbed in the first ocean level
[7646]104   INTEGER, PARAMETER ::   jpr_mslp   = 43   ! mean sea level pressure
105   INTEGER, PARAMETER ::   jpr_hsig   = 44   ! Hsig
106   INTEGER, PARAMETER ::   jpr_phioc  = 45   ! Wave=>ocean energy flux
107   INTEGER, PARAMETER ::   jpr_sdrftx = 46   ! Stokes drift on grid 1
108   INTEGER, PARAMETER ::   jpr_sdrfty = 47   ! Stokes drift on grid 2
109   INTEGER, PARAMETER ::   jpr_wper   = 48   ! Mean wave period
110   INTEGER, PARAMETER ::   jpr_wnum   = 49   ! Mean wavenumber
[9034]111   INTEGER, PARAMETER ::   jpr_tauwoc = 50   ! Stress fraction adsorbed by waves
[7646]112   INTEGER, PARAMETER ::   jpr_wdrag  = 51   ! Neutral surface drag coefficient
[7788]113   INTEGER, PARAMETER ::   jpr_isf    = 52
114   INTEGER, PARAMETER ::   jpr_icb    = 53
[9023]115   INTEGER, PARAMETER ::   jpr_wfreq  = 54   ! Wave peak frequency
116   INTEGER, PARAMETER ::   jpr_tauwx  = 55   ! x component of the ocean stress from waves
117   INTEGER, PARAMETER ::   jpr_tauwy  = 56   ! y component of the ocean stress from waves
118   INTEGER, PARAMETER ::   jpr_ts_ice = 57   ! Sea ice surface temp
[11509]119   INTEGER, PARAMETER ::   jpr_rnf_1d = 58   ! 1D river runoff
[3294]120
[11509]121   INTEGER, PARAMETER ::   jprcv      = 58   ! total number of fields received 
[7788]122
[6140]123   INTEGER, PARAMETER ::   jps_fice   =  1   ! ice fraction sent to the atmosphere
124   INTEGER, PARAMETER ::   jps_toce   =  2   ! ocean temperature
125   INTEGER, PARAMETER ::   jps_tice   =  3   ! ice   temperature
126   INTEGER, PARAMETER ::   jps_tmix   =  4   ! mixed temperature (ocean+ice)
127   INTEGER, PARAMETER ::   jps_albice =  5   ! ice   albedo
128   INTEGER, PARAMETER ::   jps_albmix =  6   ! mixed albedo
129   INTEGER, PARAMETER ::   jps_hice   =  7   ! ice  thickness
130   INTEGER, PARAMETER ::   jps_hsnw   =  8   ! snow thickness
131   INTEGER, PARAMETER ::   jps_ocx1   =  9   ! ocean current on grid 1
132   INTEGER, PARAMETER ::   jps_ocy1   = 10   !
133   INTEGER, PARAMETER ::   jps_ocz1   = 11   !
134   INTEGER, PARAMETER ::   jps_ivx1   = 12   ! ice   current on grid 1
135   INTEGER, PARAMETER ::   jps_ivy1   = 13   !
136   INTEGER, PARAMETER ::   jps_ivz1   = 14   !
[1534]137   INTEGER, PARAMETER ::   jps_co2    = 15
[6140]138   INTEGER, PARAMETER ::   jps_soce   = 16   ! ocean salinity
139   INTEGER, PARAMETER ::   jps_ssh    = 17   ! sea surface height
140   INTEGER, PARAMETER ::   jps_qsroce = 18   ! Qsr above the ocean
141   INTEGER, PARAMETER ::   jps_qnsoce = 19   ! Qns above the ocean
142   INTEGER, PARAMETER ::   jps_oemp   = 20   ! ocean freshwater budget (evap - precip)
143   INTEGER, PARAMETER ::   jps_sflx   = 21   ! salt flux
144   INTEGER, PARAMETER ::   jps_otx1   = 22   ! 2 atmosphere-ocean stress components on grid 1
145   INTEGER, PARAMETER ::   jps_oty1   = 23   !
146   INTEGER, PARAMETER ::   jps_rnf    = 24   ! runoffs
147   INTEGER, PARAMETER ::   jps_taum   = 25   ! wind stress module
148   INTEGER, PARAMETER ::   jps_fice2  = 26   ! ice fraction sent to OPA (by SAS when doing SAS-OPA coupling)
149   INTEGER, PARAMETER ::   jps_e3t1st = 27   ! first level depth (vvl)
150   INTEGER, PARAMETER ::   jps_fraqsr = 28   ! fraction of solar net radiation absorbed in the first ocean level
[7646]151   INTEGER, PARAMETER ::   jps_ficet  = 29   ! total ice fraction 
152   INTEGER, PARAMETER ::   jps_ocxw   = 30   ! currents on grid 1 
153   INTEGER, PARAMETER ::   jps_ocyw   = 31   ! currents on grid 2
154   INTEGER, PARAMETER ::   jps_wlev   = 32   ! water level
[9019]155   INTEGER, PARAMETER ::   jps_fice1  = 33   ! first-order ice concentration (for semi-implicit coupling of atmos-ice fluxes)
156   INTEGER, PARAMETER ::   jps_a_p    = 34   ! meltpond area
157   INTEGER, PARAMETER ::   jps_ht_p   = 35   ! meltpond thickness
158   INTEGER, PARAMETER ::   jps_kice   = 36   ! sea ice effective conductivity
159   INTEGER, PARAMETER ::   jps_sstfrz = 37   ! sea surface freezing temperature
160   INTEGER, PARAMETER ::   jps_ttilyr = 38   ! sea ice top layer temp
[3294]161
[9019]162   INTEGER, PARAMETER ::   jpsnd      = 38   ! total number of fields sent
163
[6140]164   !                                  !!** namelist namsbc_cpl **
165   TYPE ::   FLD_C                     !   
166      CHARACTER(len = 32) ::   cldes      ! desciption of the coupling strategy
167      CHARACTER(len = 32) ::   clcat      ! multiple ice categories strategy
168      CHARACTER(len = 32) ::   clvref     ! reference of vector ('spherical' or 'cartesian')
169      CHARACTER(len = 32) ::   clvor      ! orientation of vector fields ('eastward-northward' or 'local grid')
170      CHARACTER(len = 32) ::   clvgrd     ! grids on which is located the vector fields
[3294]171   END TYPE FLD_C
[6140]172   !                                   ! Send to the atmosphere 
[9019]173   TYPE(FLD_C) ::   sn_snd_temp  , sn_snd_alb , sn_snd_thick, sn_snd_crt   , sn_snd_co2,  &
174      &             sn_snd_thick1, sn_snd_cond, sn_snd_mpnd , sn_snd_sstfrz, sn_snd_ttilyr
[6140]175   !                                   ! Received from the atmosphere
[9023]176   TYPE(FLD_C) ::   sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau, sn_rcv_tauw, sn_rcv_dqnsdt, sn_rcv_qsr,  &
[9019]177      &             sn_rcv_qns , sn_rcv_emp   , sn_rcv_rnf, sn_rcv_ts_ice
178   TYPE(FLD_C) ::   sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2, sn_rcv_mslp, sn_rcv_icb, sn_rcv_isf
[7646]179   ! Send to waves
180   TYPE(FLD_C) ::   sn_snd_ifrac, sn_snd_crtw, sn_snd_wlev 
181   ! Received from waves
[9033]182   TYPE(FLD_C) ::   sn_rcv_hsig, sn_rcv_phioc, sn_rcv_sdrfx, sn_rcv_sdrfy, sn_rcv_wper, sn_rcv_wnum, sn_rcv_tauwoc, &
[9023]183                    sn_rcv_wdrag, sn_rcv_wfreq
[6140]184   !                                   ! Other namelist parameters
185   INTEGER     ::   nn_cplmodel           ! Maximum number of models to/from which NEMO is potentialy sending/receiving data
186   LOGICAL     ::   ln_usecplmask         !  use a coupling mask file to merge data received from several models
[9019]187                                          !   -> file cplmask.nc with the float variable called cplmask (jpi,jpj,nn_cplmodel)
[3294]188   TYPE ::   DYNARR     
[9019]189      REAL(wp), POINTER, DIMENSION(:,:,:) ::   z3   
[3294]190   END TYPE DYNARR
[888]191
[9019]192   TYPE( DYNARR ), SAVE, DIMENSION(jprcv) ::   frcv                ! all fields recieved from the atmosphere
[3294]193
[9019]194   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   alb_oce_mix    ! ocean albedo sent to atmosphere (mix clear/overcast sky)
[888]195
[7646]196   REAL(wp) ::   rpref = 101000._wp   ! reference atmospheric pressure[N/m2]
197   REAL(wp) ::   r1_grau              ! = 1.e0 / (grav * rau0)
[888]198
[9019]199   INTEGER , ALLOCATABLE, SAVE, DIMENSION(:) ::   nrcvinfo           ! OASIS info argument
[7646]200
[1218]201   !! Substitution
202#  include "vectopt_loop_substitute.h90"
203   !!----------------------------------------------------------------------
[9598]204   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
[1226]205   !! $Id$
[10068]206   !! Software governed by the CeCILL license (see ./LICENSE)
[1218]207   !!----------------------------------------------------------------------
208CONTAINS
209 
[2715]210   INTEGER FUNCTION sbc_cpl_alloc()
211      !!----------------------------------------------------------------------
212      !!             ***  FUNCTION sbc_cpl_alloc  ***
213      !!----------------------------------------------------------------------
[7646]214      INTEGER :: ierr(4)
[2715]215      !!----------------------------------------------------------------------
216      ierr(:) = 0
217      !
[9019]218      ALLOCATE( alb_oce_mix(jpi,jpj), nrcvinfo(jprcv),  STAT=ierr(1) )
[4990]219     
[9570]220#if ! defined key_si3 && ! defined key_cice
[4990]221      ALLOCATE( a_i(jpi,jpj,1) , STAT=ierr(2) )  ! used in sbcice_if.F90 (done here as there is no sbc_ice_if_init)
222#endif
[5407]223      ALLOCATE( xcplmask(jpi,jpj,0:nn_cplmodel) , STAT=ierr(3) )
[2715]224      !
[7646]225      IF( .NOT. ln_apr_dyn ) ALLOCATE( ssh_ib(jpi,jpj), ssh_ibb(jpi,jpj), apr(jpi, jpj), STAT=ierr(4) ) 
226
[2715]227      sbc_cpl_alloc = MAXVAL( ierr )
[10425]228      CALL mpp_sum ( 'sbccpl', sbc_cpl_alloc )
[2715]229      IF( sbc_cpl_alloc > 0 )   CALL ctl_warn('sbc_cpl_alloc: allocation of arrays failed')
230      !
231   END FUNCTION sbc_cpl_alloc
232
233
[1218]234   SUBROUTINE sbc_cpl_init( k_ice )     
235      !!----------------------------------------------------------------------
236      !!             ***  ROUTINE sbc_cpl_init  ***
237      !!
[4990]238      !! ** Purpose :   Initialisation of send and received information from
[1218]239      !!                the atmospheric component
240      !!
241      !! ** Method  : * Read namsbc_cpl namelist
242      !!              * define the receive interface
243      !!              * define the send    interface
244      !!              * initialise the OASIS coupler
245      !!----------------------------------------------------------------------
[6140]246      INTEGER, INTENT(in) ::   k_ice   ! ice management in the sbc (=0/1/2/3)
247      !
248      INTEGER ::   jn          ! dummy loop index
249      INTEGER ::   ios, inum   ! Local integer
[9019]250      REAL(wp), DIMENSION(jpi,jpj) ::   zacs, zaos
[1218]251      !!
[9019]252      NAMELIST/namsbc_cpl/  sn_snd_temp  , sn_snd_alb   , sn_snd_thick, sn_snd_crt   , sn_snd_co2  ,   & 
[10618]253         &                  sn_snd_ttilyr, sn_snd_cond  , sn_snd_mpnd , sn_snd_sstfrz, sn_snd_thick1,  & 
254         &                  sn_snd_ifrac , sn_snd_crtw  , sn_snd_wlev , sn_rcv_hsig  , sn_rcv_phioc,   & 
[9019]255         &                  sn_rcv_w10m  , sn_rcv_taumod, sn_rcv_tau  , sn_rcv_dqnsdt, sn_rcv_qsr  ,   & 
[10618]256         &                  sn_rcv_sdrfx , sn_rcv_sdrfy , sn_rcv_wper , sn_rcv_wnum  , sn_rcv_tauwoc,  &
[9019]257         &                  sn_rcv_wdrag , sn_rcv_qns   , sn_rcv_emp  , sn_rcv_rnf   , sn_rcv_cal  ,   &
258         &                  sn_rcv_iceflx, sn_rcv_co2   , nn_cplmodel , ln_usecplmask, sn_rcv_mslp ,   &
[10618]259         &                  sn_rcv_icb   , sn_rcv_isf   , sn_rcv_wfreq , sn_rcv_tauw, nn_cats_cpl  ,   &
260         &                  sn_rcv_ts_ice
[7788]261
[1218]262      !!---------------------------------------------------------------------
[3294]263      !
[1218]264      ! ================================ !
265      !      Namelist informations       !
266      ! ================================ !
[6140]267      !
[4147]268      REWIND( numnam_ref )              ! Namelist namsbc_cpl in reference namelist : Variables for OASIS coupling
269      READ  ( numnam_ref, namsbc_cpl, IOSTAT = ios, ERR = 901)
[6140]270901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namsbc_cpl in reference namelist', lwp )
271      !
[4147]272      REWIND( numnam_cfg )              ! Namelist namsbc_cpl in configuration namelist : Variables for OASIS coupling
273      READ  ( numnam_cfg, namsbc_cpl, IOSTAT = ios, ERR = 902 )
[9168]274902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namsbc_cpl in configuration namelist', lwp )
[4624]275      IF(lwm) WRITE ( numond, namsbc_cpl )
[6140]276      !
[1218]277      IF(lwp) THEN                        ! control print
278         WRITE(numout,*)
279         WRITE(numout,*)'sbc_cpl_init : namsbc_cpl namelist '
280         WRITE(numout,*)'~~~~~~~~~~~~'
[5407]281      ENDIF
282      IF( lwp .AND. ln_cpl ) THEN                        ! control print
[3294]283         WRITE(numout,*)'  received fields (mutiple ice categogies)'
284         WRITE(numout,*)'      10m wind module                 = ', TRIM(sn_rcv_w10m%cldes  ), ' (', TRIM(sn_rcv_w10m%clcat  ), ')'
285         WRITE(numout,*)'      stress module                   = ', TRIM(sn_rcv_taumod%cldes), ' (', TRIM(sn_rcv_taumod%clcat), ')'
286         WRITE(numout,*)'      surface stress                  = ', TRIM(sn_rcv_tau%cldes   ), ' (', TRIM(sn_rcv_tau%clcat   ), ')'
287         WRITE(numout,*)'                     - referential    = ', sn_rcv_tau%clvref
288         WRITE(numout,*)'                     - orientation    = ', sn_rcv_tau%clvor
289         WRITE(numout,*)'                     - mesh           = ', sn_rcv_tau%clvgrd
290         WRITE(numout,*)'      non-solar heat flux sensitivity = ', TRIM(sn_rcv_dqnsdt%cldes), ' (', TRIM(sn_rcv_dqnsdt%clcat), ')'
291         WRITE(numout,*)'      solar heat flux                 = ', TRIM(sn_rcv_qsr%cldes   ), ' (', TRIM(sn_rcv_qsr%clcat   ), ')'
292         WRITE(numout,*)'      non-solar heat flux             = ', TRIM(sn_rcv_qns%cldes   ), ' (', TRIM(sn_rcv_qns%clcat   ), ')'
293         WRITE(numout,*)'      freshwater budget               = ', TRIM(sn_rcv_emp%cldes   ), ' (', TRIM(sn_rcv_emp%clcat   ), ')'
294         WRITE(numout,*)'      runoffs                         = ', TRIM(sn_rcv_rnf%cldes   ), ' (', TRIM(sn_rcv_rnf%clcat   ), ')'
295         WRITE(numout,*)'      calving                         = ', TRIM(sn_rcv_cal%cldes   ), ' (', TRIM(sn_rcv_cal%clcat   ), ')'
[7788]296         WRITE(numout,*)'      iceberg                         = ', TRIM(sn_rcv_icb%cldes   ), ' (', TRIM(sn_rcv_icb%clcat   ), ')'
297         WRITE(numout,*)'      ice shelf                       = ', TRIM(sn_rcv_isf%cldes   ), ' (', TRIM(sn_rcv_isf%clcat   ), ')'
[3294]298         WRITE(numout,*)'      sea ice heat fluxes             = ', TRIM(sn_rcv_iceflx%cldes), ' (', TRIM(sn_rcv_iceflx%clcat), ')'
299         WRITE(numout,*)'      atm co2                         = ', TRIM(sn_rcv_co2%cldes   ), ' (', TRIM(sn_rcv_co2%clcat   ), ')'
[7646]300         WRITE(numout,*)'      significant wave heigth         = ', TRIM(sn_rcv_hsig%cldes  ), ' (', TRIM(sn_rcv_hsig%clcat  ), ')' 
301         WRITE(numout,*)'      wave to oce energy flux         = ', TRIM(sn_rcv_phioc%cldes ), ' (', TRIM(sn_rcv_phioc%clcat ), ')' 
302         WRITE(numout,*)'      Surface Stokes drift grid u     = ', TRIM(sn_rcv_sdrfx%cldes ), ' (', TRIM(sn_rcv_sdrfx%clcat ), ')' 
303         WRITE(numout,*)'      Surface Stokes drift grid v     = ', TRIM(sn_rcv_sdrfy%cldes ), ' (', TRIM(sn_rcv_sdrfy%clcat ), ')' 
304         WRITE(numout,*)'      Mean wave period                = ', TRIM(sn_rcv_wper%cldes  ), ' (', TRIM(sn_rcv_wper%clcat  ), ')' 
305         WRITE(numout,*)'      Mean wave number                = ', TRIM(sn_rcv_wnum%cldes  ), ' (', TRIM(sn_rcv_wnum%clcat  ), ')' 
[9023]306         WRITE(numout,*)'      Wave peak frequency             = ', TRIM(sn_rcv_wfreq%cldes ), ' (', TRIM(sn_rcv_wfreq%clcat ), ')'
[9034]307         WRITE(numout,*)'      Stress frac adsorbed by waves   = ', TRIM(sn_rcv_tauwoc%cldes), ' (', TRIM(sn_rcv_tauwoc%clcat ), ')' 
[9023]308         WRITE(numout,*)'      Stress components by waves      = ', TRIM(sn_rcv_tauw%cldes  ), ' (', TRIM(sn_rcv_tauw%clcat  ), ')'
[7646]309         WRITE(numout,*)'      Neutral surf drag coefficient   = ', TRIM(sn_rcv_wdrag%cldes ), ' (', TRIM(sn_rcv_wdrag%clcat ), ')' 
[9019]310         WRITE(numout,*)'      Sea ice surface skin temperature= ', TRIM(sn_rcv_ts_ice%cldes), ' (', TRIM(sn_rcv_ts_ice%clcat), ')' 
[3294]311         WRITE(numout,*)'  sent fields (multiple ice categories)'
312         WRITE(numout,*)'      surface temperature             = ', TRIM(sn_snd_temp%cldes  ), ' (', TRIM(sn_snd_temp%clcat  ), ')'
[9019]313         WRITE(numout,*)'      top ice layer temperature       = ', TRIM(sn_snd_ttilyr%cldes), ' (', TRIM(sn_snd_ttilyr%clcat), ')'
[3294]314         WRITE(numout,*)'      albedo                          = ', TRIM(sn_snd_alb%cldes   ), ' (', TRIM(sn_snd_alb%clcat   ), ')'
315         WRITE(numout,*)'      ice/snow thickness              = ', TRIM(sn_snd_thick%cldes ), ' (', TRIM(sn_snd_thick%clcat ), ')'
[7646]316         WRITE(numout,*)'      total ice fraction              = ', TRIM(sn_snd_ifrac%cldes ), ' (', TRIM(sn_snd_ifrac%clcat ), ')' 
[3294]317         WRITE(numout,*)'      surface current                 = ', TRIM(sn_snd_crt%cldes   ), ' (', TRIM(sn_snd_crt%clcat   ), ')'
318         WRITE(numout,*)'                      - referential   = ', sn_snd_crt%clvref 
319         WRITE(numout,*)'                      - orientation   = ', sn_snd_crt%clvor
320         WRITE(numout,*)'                      - mesh          = ', sn_snd_crt%clvgrd
321         WRITE(numout,*)'      oce co2 flux                    = ', TRIM(sn_snd_co2%cldes   ), ' (', TRIM(sn_snd_co2%clcat   ), ')'
[9019]322         WRITE(numout,*)'      ice effective conductivity      = ', TRIM(sn_snd_cond%cldes  ), ' (', TRIM(sn_snd_cond%clcat  ), ')'
323         WRITE(numout,*)'      meltponds fraction and depth    = ', TRIM(sn_snd_mpnd%cldes  ), ' (', TRIM(sn_snd_mpnd%clcat  ), ')'
324         WRITE(numout,*)'      sea surface freezing temp       = ', TRIM(sn_snd_sstfrz%cldes), ' (', TRIM(sn_snd_sstfrz%clcat), ')'
[7646]325         WRITE(numout,*)'      water level                     = ', TRIM(sn_snd_wlev%cldes  ), ' (', TRIM(sn_snd_wlev%clcat  ), ')' 
326         WRITE(numout,*)'      mean sea level pressure         = ', TRIM(sn_rcv_mslp%cldes  ), ' (', TRIM(sn_rcv_mslp%clcat  ), ')' 
327         WRITE(numout,*)'      surface current to waves        = ', TRIM(sn_snd_crtw%cldes  ), ' (', TRIM(sn_snd_crtw%clcat  ), ')' 
328         WRITE(numout,*)'                      - referential   = ', sn_snd_crtw%clvref 
329         WRITE(numout,*)'                      - orientation   = ', sn_snd_crtw%clvor 
330         WRITE(numout,*)'                      - mesh          = ', sn_snd_crtw%clvgrd 
[4990]331         WRITE(numout,*)'  nn_cplmodel                         = ', nn_cplmodel
332         WRITE(numout,*)'  ln_usecplmask                       = ', ln_usecplmask
[9019]333         WRITE(numout,*)'  nn_cats_cpl                         = ', nn_cats_cpl
[1218]334      ENDIF
[888]335
[3294]336      !                                   ! allocate sbccpl arrays
[2715]337      IF( sbc_cpl_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_cpl_alloc : unable to allocate arrays' )
[1218]338     
339      ! ================================ !
340      !   Define the receive interface   !
341      ! ================================ !
[1698]342      nrcvinfo(:) = OASIS_idle   ! needed by nrcvinfo(jpr_otx1) if we do not receive ocean stress
[888]343
[1218]344      ! for each field: define the OASIS name                              (srcv(:)%clname)
345      !                 define receive or not from the namelist parameters (srcv(:)%laction)
346      !                 define the north fold type of lbc                  (srcv(:)%nsgn)
[888]347
[1218]348      ! default definitions of srcv
[11509]349      srcv(:)%laction = .FALSE
350      srcv(:)%clgrid = 'T'
351      srcv(:)%nsgn = 1
352      srcv(:)%nct = 1
353      srcv(:)%dimensions = 2
[888]354
[1218]355      !                                                      ! ------------------------- !
356      !                                                      ! ice and ocean wind stress !   
357      !                                                      ! ------------------------- !
358      !                                                           ! Name
359      srcv(jpr_otx1)%clname = 'O_OTaux1'      ! 1st ocean component on grid ONE (T or U)
360      srcv(jpr_oty1)%clname = 'O_OTauy1'      ! 2nd   -      -         -     -
361      srcv(jpr_otz1)%clname = 'O_OTauz1'      ! 3rd   -      -         -     -
362      srcv(jpr_otx2)%clname = 'O_OTaux2'      ! 1st ocean component on grid TWO (V)
363      srcv(jpr_oty2)%clname = 'O_OTauy2'      ! 2nd   -      -         -     -
364      srcv(jpr_otz2)%clname = 'O_OTauz2'      ! 3rd   -      -         -     -
365      !
366      srcv(jpr_itx1)%clname = 'O_ITaux1'      ! 1st  ice  component on grid ONE (T, F, I or U)
367      srcv(jpr_ity1)%clname = 'O_ITauy1'      ! 2nd   -      -         -     -
368      srcv(jpr_itz1)%clname = 'O_ITauz1'      ! 3rd   -      -         -     -
369      srcv(jpr_itx2)%clname = 'O_ITaux2'      ! 1st  ice  component on grid TWO (V)
370      srcv(jpr_ity2)%clname = 'O_ITauy2'      ! 2nd   -      -         -     -
371      srcv(jpr_itz2)%clname = 'O_ITauz2'      ! 3rd   -      -         -     -
372      !
[1833]373      ! Vectors: change of sign at north fold ONLY if on the local grid
[7646]374      IF( TRIM( sn_rcv_tau%cldes ) == 'oce only' .OR. TRIM(sn_rcv_tau%cldes ) == 'oce and ice') THEN ! avoid working with the atmospheric fields if they are not coupled
[3294]375      IF( TRIM( sn_rcv_tau%clvor ) == 'local grid' )   srcv(jpr_otx1:jpr_itz2)%nsgn = -1.
[1218]376     
377      !                                                           ! Set grid and action
[3294]378      SELECT CASE( TRIM( sn_rcv_tau%clvgrd ) )      !  'T', 'U,V', 'U,V,I', 'U,V,F', 'T,I', 'T,F', or 'T,U,V'
[1218]379      CASE( 'T' ) 
380         srcv(jpr_otx1:jpr_itz2)%clgrid  = 'T'        ! oce and ice components given at T-point
381         srcv(jpr_otx1:jpr_otz1)%laction = .TRUE.     ! receive oce components on grid 1
382         srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1
383      CASE( 'U,V' ) 
384         srcv(jpr_otx1:jpr_otz1)%clgrid  = 'U'        ! oce components given at U-point
385         srcv(jpr_otx2:jpr_otz2)%clgrid  = 'V'        !           and           V-point
386         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'U'        ! ice components given at U-point
387         srcv(jpr_itx2:jpr_itz2)%clgrid  = 'V'        !           and           V-point
388         srcv(jpr_otx1:jpr_itz2)%laction = .TRUE.     ! receive oce and ice components on both grid 1 & 2
389      CASE( 'U,V,T' )
390         srcv(jpr_otx1:jpr_otz1)%clgrid  = 'U'        ! oce components given at U-point
391         srcv(jpr_otx2:jpr_otz2)%clgrid  = 'V'        !           and           V-point
392         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'T'        ! ice components given at T-point
393         srcv(jpr_otx1:jpr_otz2)%laction = .TRUE.     ! receive oce components on grid 1 & 2
394         srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1 only
395      CASE( 'U,V,I' )
396         srcv(jpr_otx1:jpr_otz1)%clgrid  = 'U'        ! oce components given at U-point
397         srcv(jpr_otx2:jpr_otz2)%clgrid  = 'V'        !           and           V-point
398         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'I'        ! ice components given at I-point
399         srcv(jpr_otx1:jpr_otz2)%laction = .TRUE.     ! receive oce components on grid 1 & 2
400         srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1 only
401      CASE( 'U,V,F' )
402         srcv(jpr_otx1:jpr_otz1)%clgrid  = 'U'        ! oce components given at U-point
403         srcv(jpr_otx2:jpr_otz2)%clgrid  = 'V'        !           and           V-point
404         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'F'        ! ice components given at F-point
405         srcv(jpr_otx1:jpr_otz2)%laction = .TRUE.     ! receive oce components on grid 1 & 2
406         srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1 only
407      CASE( 'T,I' ) 
408         srcv(jpr_otx1:jpr_itz2)%clgrid  = 'T'        ! oce and ice components given at T-point
409         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'I'        ! ice components given at I-point
410         srcv(jpr_otx1:jpr_otz1)%laction = .TRUE.     ! receive oce components on grid 1
411         srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1
412      CASE( 'T,F' ) 
413         srcv(jpr_otx1:jpr_itz2)%clgrid  = 'T'        ! oce and ice components given at T-point
414         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'F'        ! ice components given at F-point
415         srcv(jpr_otx1:jpr_otz1)%laction = .TRUE.     ! receive oce components on grid 1
416         srcv(jpr_itx1:jpr_itz1)%laction = .TRUE.     ! receive ice components on grid 1
417      CASE( 'T,U,V' )
418         srcv(jpr_otx1:jpr_otz1)%clgrid  = 'T'        ! oce components given at T-point
419         srcv(jpr_itx1:jpr_itz1)%clgrid  = 'U'        ! ice components given at U-point
420         srcv(jpr_itx2:jpr_itz2)%clgrid  = 'V'        !           and           V-point
421         srcv(jpr_otx1:jpr_otz1)%laction = .TRUE.     ! receive oce components on grid 1 only
422         srcv(jpr_itx1:jpr_itz2)%laction = .TRUE.     ! receive ice components on grid 1 & 2
423      CASE default   
[3294]424         CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_rcv_tau%clvgrd' )
[1218]425      END SELECT
426      !
[3294]427      IF( TRIM( sn_rcv_tau%clvref ) == 'spherical' )   &           ! spherical: 3rd component not received
[1218]428         &     srcv( (/jpr_otz1, jpr_otz2, jpr_itz1, jpr_itz2/) )%laction = .FALSE. 
429      !
[3680]430      IF( TRIM( sn_rcv_tau%clvor  ) == 'local grid' ) THEN        ! already on local grid -> no need of the second grid
431            srcv(jpr_otx2:jpr_otz2)%laction = .FALSE. 
432            srcv(jpr_itx2:jpr_itz2)%laction = .FALSE. 
433            srcv(jpr_oty1)%clgrid = srcv(jpr_oty2)%clgrid   ! not needed but cleaner...
434            srcv(jpr_ity1)%clgrid = srcv(jpr_ity2)%clgrid   ! not needed but cleaner...
435      ENDIF
436      !
[3294]437      IF( TRIM( sn_rcv_tau%cldes ) /= 'oce and ice' ) THEN        ! 'oce and ice' case ocean stress on ocean mesh used
[4162]438         srcv(jpr_itx1:jpr_itz2)%laction = .FALSE.    ! ice components not received
[1218]439         srcv(jpr_itx1)%clgrid = 'U'                  ! ocean stress used after its transformation
440         srcv(jpr_ity1)%clgrid = 'V'                  ! i.e. it is always at U- & V-points for i- & j-comp. resp.
441      ENDIF
[7646]442      ENDIF
443
[1218]444      !                                                      ! ------------------------- !
445      !                                                      !    freshwater budget      !   E-P
446      !                                                      ! ------------------------- !
447      ! we suppose that atmosphere modele do not make the difference between precipiration (liquide or solid)
448      ! over ice of free ocean within the same atmospheric cell.cd
449      srcv(jpr_rain)%clname = 'OTotRain'      ! Rain = liquid precipitation
450      srcv(jpr_snow)%clname = 'OTotSnow'      ! Snow = solid precipitation
451      srcv(jpr_tevp)%clname = 'OTotEvap'      ! total evaporation (over oce + ice sublimation)
452      srcv(jpr_ievp)%clname = 'OIceEvap'      ! evaporation over ice = sublimation
[1232]453      srcv(jpr_sbpr)%clname = 'OSubMPre'      ! sublimation - liquid precipitation - solid precipitation
454      srcv(jpr_semp)%clname = 'OISubMSn'      ! ice solid water budget = sublimation - solid precipitation
455      srcv(jpr_oemp)%clname = 'OOEvaMPr'      ! ocean water budget = ocean Evap - ocean precip
[3294]456      SELECT CASE( TRIM( sn_rcv_emp%cldes ) )
[5407]457      CASE( 'none'          )       ! nothing to do
[9019]458      CASE( 'oce only'      )   ;   srcv(jpr_oemp)%laction = .TRUE. 
[4162]459      CASE( 'conservative'  )
460         srcv( (/jpr_rain, jpr_snow, jpr_ievp, jpr_tevp/) )%laction = .TRUE.
[4393]461         IF ( k_ice <= 1 )  srcv(jpr_ievp)%laction = .FALSE.
[1232]462      CASE( 'oce and ice'   )   ;   srcv( (/jpr_ievp, jpr_sbpr, jpr_semp, jpr_oemp/) )%laction = .TRUE.
[3294]463      CASE default              ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_rcv_emp%cldes' )
[1218]464      END SELECT
[6140]465      !
[1218]466      !                                                      ! ------------------------- !
467      !                                                      !     Runoffs & Calving     !   
468      !                                                      ! ------------------------- !
[11509]469      srcv(jpr_rnf_1d   )%clname = 'ORunff1D' 
470      IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled' .OR. TRIM( sn_rcv_rnf%cldes ) == 'coupled1d' ) THEN 
471         IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled' ) srcv(jpr_rnf)%laction = .TRUE. 
472         IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled1d' ) THEN
473            srcv(jpr_rnf_1d)%laction = .TRUE. 
474            srcv(jpr_rnf_1d)%dimensions = 1 ! 1D field passed through coupler
475         END IF
[5407]476         l_rnfcpl              = .TRUE.                      ! -> no need to read runoffs in sbcrnf
477         ln_rnf                = nn_components /= jp_iam_sas ! -> force to go through sbcrnf if not sas
478         IF(lwp) WRITE(numout,*)
479         IF(lwp) WRITE(numout,*) '   runoffs received from oasis -> force ln_rnf = ', ln_rnf
480      ENDIF
481      !
[7788]482      srcv(jpr_cal)%clname = 'OCalving'   ;  IF( TRIM( sn_rcv_cal%cldes) == 'coupled' )   srcv(jpr_cal)%laction = .TRUE.
483      srcv(jpr_isf)%clname = 'OIcshelf'   ;  IF( TRIM( sn_rcv_isf%cldes) == 'coupled' )   srcv(jpr_isf)%laction = .TRUE.
484      srcv(jpr_icb)%clname = 'OIceberg'   ;  IF( TRIM( sn_rcv_icb%cldes) == 'coupled' )   srcv(jpr_icb)%laction = .TRUE.
485
486      IF( srcv(jpr_isf)%laction .AND. ln_isf ) THEN
487         l_isfcpl             = .TRUE.                      ! -> no need to read isf in sbcisf
488         IF(lwp) WRITE(numout,*)
489         IF(lwp) WRITE(numout,*) '   iceshelf received from oasis '
490      ENDIF
[6140]491      !
[1218]492      !                                                      ! ------------------------- !
493      !                                                      !    non solar radiation    !   Qns
494      !                                                      ! ------------------------- !
495      srcv(jpr_qnsoce)%clname = 'O_QnsOce'
496      srcv(jpr_qnsice)%clname = 'O_QnsIce'
497      srcv(jpr_qnsmix)%clname = 'O_QnsMix'
[3294]498      SELECT CASE( TRIM( sn_rcv_qns%cldes ) )
[5407]499      CASE( 'none'          )       ! nothing to do
[1218]500      CASE( 'oce only'      )   ;   srcv(               jpr_qnsoce   )%laction = .TRUE.
501      CASE( 'conservative'  )   ;   srcv( (/jpr_qnsice, jpr_qnsmix/) )%laction = .TRUE.
502      CASE( 'oce and ice'   )   ;   srcv( (/jpr_qnsice, jpr_qnsoce/) )%laction = .TRUE.
503      CASE( 'mixed oce-ice' )   ;   srcv(               jpr_qnsmix   )%laction = .TRUE. 
[3294]504      CASE default              ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_rcv_qns%cldes' )
[1218]505      END SELECT
[9019]506      IF( TRIM( sn_rcv_qns%cldes ) == 'mixed oce-ice' .AND. nn_cats_cpl > 1 ) &
[3294]507         CALL ctl_stop( 'sbc_cpl_init: sn_rcv_qns%cldes not currently allowed to be mixed oce-ice for multi-category ice' )
[9019]508      !
[1218]509      !                                                      ! ------------------------- !
510      !                                                      !    solar radiation        !   Qsr
511      !                                                      ! ------------------------- !
512      srcv(jpr_qsroce)%clname = 'O_QsrOce'
513      srcv(jpr_qsrice)%clname = 'O_QsrIce'
514      srcv(jpr_qsrmix)%clname = 'O_QsrMix'
[3294]515      SELECT CASE( TRIM( sn_rcv_qsr%cldes ) )
[5407]516      CASE( 'none'          )       ! nothing to do
[1218]517      CASE( 'oce only'      )   ;   srcv(               jpr_qsroce   )%laction = .TRUE.
518      CASE( 'conservative'  )   ;   srcv( (/jpr_qsrice, jpr_qsrmix/) )%laction = .TRUE.
519      CASE( 'oce and ice'   )   ;   srcv( (/jpr_qsrice, jpr_qsroce/) )%laction = .TRUE.
520      CASE( 'mixed oce-ice' )   ;   srcv(               jpr_qsrmix   )%laction = .TRUE. 
[3294]521      CASE default              ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_rcv_qsr%cldes' )
[1218]522      END SELECT
[9019]523      IF( TRIM( sn_rcv_qsr%cldes ) == 'mixed oce-ice' .AND. nn_cats_cpl > 1 ) &
[3294]524         CALL ctl_stop( 'sbc_cpl_init: sn_rcv_qsr%cldes not currently allowed to be mixed oce-ice for multi-category ice' )
[9019]525      !
[1218]526      !                                                      ! ------------------------- !
527      !                                                      !   non solar sensitivity   !   d(Qns)/d(T)
528      !                                                      ! ------------------------- !
529      srcv(jpr_dqnsdt)%clname = 'O_dQnsdT'   
[3294]530      IF( TRIM( sn_rcv_dqnsdt%cldes ) == 'coupled' )   srcv(jpr_dqnsdt)%laction = .TRUE.
[1232]531      !
532      ! non solar sensitivity mandatory for mixed oce-ice solar radiation coupling technique
[9019]533      IF( TRIM( sn_rcv_dqnsdt%cldes ) == 'none' .AND. TRIM( sn_rcv_qns%cldes ) == 'mixed oce-ice' )  &
534         &   CALL ctl_stop( 'sbc_cpl_init: namsbc_cpl namelist mismatch between sn_rcv_qns%cldes and sn_rcv_dqnsdt%cldes' )
535      !
[1218]536      !                                                      ! ------------------------- !
537      !                                                      !      10m wind module      !   
538      !                                                      ! ------------------------- !
[3294]539      srcv(jpr_w10m)%clname = 'O_Wind10'   ;   IF( TRIM(sn_rcv_w10m%cldes  ) == 'coupled' )   srcv(jpr_w10m)%laction = .TRUE. 
[1696]540      !
541      !                                                      ! ------------------------- !
542      !                                                      !   wind stress module      !   
543      !                                                      ! ------------------------- !
[3294]544      srcv(jpr_taum)%clname = 'O_TauMod'   ;   IF( TRIM(sn_rcv_taumod%cldes) == 'coupled' )   srcv(jpr_taum)%laction = .TRUE.
[1705]545      lhftau = srcv(jpr_taum)%laction
[9019]546      !
[1534]547      !                                                      ! ------------------------- !
548      !                                                      !      Atmospheric CO2      !
549      !                                                      ! ------------------------- !
[7646]550      srcv(jpr_co2 )%clname = 'O_AtmCO2'   
551      IF( TRIM(sn_rcv_co2%cldes   ) == 'coupled' )  THEN
552         srcv(jpr_co2 )%laction = .TRUE.
553         l_co2cpl = .TRUE.
554         IF(lwp) WRITE(numout,*)
555         IF(lwp) WRITE(numout,*) '   Atmospheric pco2 received from oasis '
556         IF(lwp) WRITE(numout,*)
557      ENDIF
[9019]558      !
[7646]559      !                                                      ! ------------------------- !
560      !                                                      ! Mean Sea Level Pressure   !
561      !                                                      ! ------------------------- !
562      srcv(jpr_mslp)%clname = 'O_MSLP'     ;   IF( TRIM(sn_rcv_mslp%cldes  ) == 'coupled' )    srcv(jpr_mslp)%laction = .TRUE. 
[9019]563      !
[3294]564      !                                                      ! ------------------------- !
[9019]565      !                                                      !  ice topmelt and botmelt  !   
[3294]566      !                                                      ! ------------------------- !
567      srcv(jpr_topm )%clname = 'OTopMlt'
568      srcv(jpr_botm )%clname = 'OBotMlt'
569      IF( TRIM(sn_rcv_iceflx%cldes) == 'coupled' ) THEN
570         IF ( TRIM( sn_rcv_iceflx%clcat ) == 'yes' ) THEN
[9019]571            srcv(jpr_topm:jpr_botm)%nct = nn_cats_cpl
[3294]572         ELSE
573            CALL ctl_stop( 'sbc_cpl_init: sn_rcv_iceflx%clcat should always be set to yes currently' )
574         ENDIF
575         srcv(jpr_topm:jpr_botm)%laction = .TRUE.
576      ENDIF
[7646]577      !                                                      ! ------------------------- !
[9019]578      !                                                      !    ice skin temperature   !   
579      !                                                      ! ------------------------- !
580      srcv(jpr_ts_ice)%clname = 'OTsfIce'    ! needed by Met Office
581      IF ( TRIM( sn_rcv_ts_ice%cldes ) == 'ice' )   srcv(jpr_ts_ice)%laction = .TRUE.
582      IF ( TRIM( sn_rcv_ts_ice%clcat ) == 'yes' )   srcv(jpr_ts_ice)%nct     = nn_cats_cpl
583      IF ( TRIM( sn_rcv_emp%clcat    ) == 'yes' )   srcv(jpr_ievp)%nct       = nn_cats_cpl
584
585      !                                                      ! ------------------------- !
[7646]586      !                                                      !      Wave breaking        !   
587      !                                                      ! ------------------------- !
588      srcv(jpr_hsig)%clname  = 'O_Hsigwa'    ! significant wave height
589      IF( TRIM(sn_rcv_hsig%cldes  ) == 'coupled' )  THEN
590         srcv(jpr_hsig)%laction = .TRUE.
591         cpl_hsig = .TRUE.
592      ENDIF
593      srcv(jpr_phioc)%clname = 'O_PhiOce'    ! wave to ocean energy
594      IF( TRIM(sn_rcv_phioc%cldes ) == 'coupled' )  THEN
595         srcv(jpr_phioc)%laction = .TRUE.
596         cpl_phioc = .TRUE.
597      ENDIF
598      srcv(jpr_sdrftx)%clname = 'O_Sdrfx'    ! Stokes drift in the u direction
599      IF( TRIM(sn_rcv_sdrfx%cldes ) == 'coupled' )  THEN
600         srcv(jpr_sdrftx)%laction = .TRUE.
601         cpl_sdrftx = .TRUE.
602      ENDIF
603      srcv(jpr_sdrfty)%clname = 'O_Sdrfy'    ! Stokes drift in the v direction
604      IF( TRIM(sn_rcv_sdrfy%cldes ) == 'coupled' )  THEN
605         srcv(jpr_sdrfty)%laction = .TRUE.
606         cpl_sdrfty = .TRUE.
607      ENDIF
608      srcv(jpr_wper)%clname = 'O_WPer'       ! mean wave period
609      IF( TRIM(sn_rcv_wper%cldes  ) == 'coupled' )  THEN
610         srcv(jpr_wper)%laction = .TRUE.
611         cpl_wper = .TRUE.
612      ENDIF
[9023]613      srcv(jpr_wfreq)%clname = 'O_WFreq'     ! wave peak frequency
614      IF( TRIM(sn_rcv_wfreq%cldes ) == 'coupled' )  THEN
615         srcv(jpr_wfreq)%laction = .TRUE.
616         cpl_wfreq = .TRUE.
617      ENDIF
[7646]618      srcv(jpr_wnum)%clname = 'O_WNum'       ! mean wave number
619      IF( TRIM(sn_rcv_wnum%cldes ) == 'coupled' )  THEN
620         srcv(jpr_wnum)%laction = .TRUE.
621         cpl_wnum = .TRUE.
622      ENDIF
[9034]623      srcv(jpr_tauwoc)%clname = 'O_TauOce'   ! stress fraction adsorbed by the wave
[9033]624      IF( TRIM(sn_rcv_tauwoc%cldes ) == 'coupled' )  THEN
625         srcv(jpr_tauwoc)%laction = .TRUE.
626         cpl_tauwoc = .TRUE.
[7646]627      ENDIF
[9023]628      srcv(jpr_tauwx)%clname = 'O_Tauwx'      ! ocean stress from wave in the x direction
629      srcv(jpr_tauwy)%clname = 'O_Tauwy'      ! ocean stress from wave in the y direction
630      IF( TRIM(sn_rcv_tauw%cldes ) == 'coupled' )  THEN
631         srcv(jpr_tauwx)%laction = .TRUE.
632         srcv(jpr_tauwy)%laction = .TRUE.
633         cpl_tauw = .TRUE.
634      ENDIF
[7646]635      srcv(jpr_wdrag)%clname = 'O_WDrag'     ! neutral surface drag coefficient
636      IF( TRIM(sn_rcv_wdrag%cldes ) == 'coupled' )  THEN
637         srcv(jpr_wdrag)%laction = .TRUE.
638         cpl_wdrag = .TRUE.
639      ENDIF
[9033]640      IF( srcv(jpr_tauwoc)%laction .AND. srcv(jpr_tauwx)%laction .AND. srcv(jpr_tauwy)%laction ) &
[9023]641            CALL ctl_stop( 'More than one method for modifying the ocean stress has been selected ', &
[9033]642                                     '(sn_rcv_tauwoc=coupled and sn_rcv_tauw=coupled)' )
[9023]643      !
[5407]644      !                                                      ! ------------------------------- !
645      !                                                      !   OPA-SAS coupling - rcv by opa !   
646      !                                                      ! ------------------------------- !
647      srcv(jpr_sflx)%clname = 'O_SFLX'
648      srcv(jpr_fice)%clname = 'RIceFrc'
649      !
650      IF( nn_components == jp_iam_opa ) THEN    ! OPA coupled to SAS via OASIS: force received field by OPA (sent by SAS)
651         srcv(:)%laction = .FALSE.   ! force default definition in case of opa <-> sas coupling
652         srcv(:)%clgrid  = 'T'       ! force default definition in case of opa <-> sas coupling
653         srcv(:)%nsgn    = 1.        ! force default definition in case of opa <-> sas coupling
654         srcv( (/jpr_qsroce, jpr_qnsoce, jpr_oemp, jpr_sflx, jpr_fice, jpr_otx1, jpr_oty1, jpr_taum/) )%laction = .TRUE.
655         srcv(jpr_otx1)%clgrid = 'U'        ! oce components given at U-point
656         srcv(jpr_oty1)%clgrid = 'V'        !           and           V-point
657         ! Vectors: change of sign at north fold ONLY if on the local grid
658         srcv( (/jpr_otx1,jpr_oty1/) )%nsgn = -1.
659         sn_rcv_tau%clvgrd = 'U,V'
660         sn_rcv_tau%clvor = 'local grid'
661         sn_rcv_tau%clvref = 'spherical'
662         sn_rcv_emp%cldes = 'oce only'
663         !
664         IF(lwp) THEN                        ! control print
665            WRITE(numout,*)
666            WRITE(numout,*)'               Special conditions for SAS-OPA coupling  '
667            WRITE(numout,*)'               OPA component  '
668            WRITE(numout,*)
669            WRITE(numout,*)'  received fields from SAS component '
670            WRITE(numout,*)'                  ice cover '
671            WRITE(numout,*)'                  oce only EMP  '
672            WRITE(numout,*)'                  salt flux  '
673            WRITE(numout,*)'                  mixed oce-ice solar flux  '
674            WRITE(numout,*)'                  mixed oce-ice non solar flux  '
675            WRITE(numout,*)'                  wind stress U,V on local grid and sperical coordinates '
676            WRITE(numout,*)'                  wind stress module'
677            WRITE(numout,*)
678         ENDIF
679      ENDIF
680      !                                                      ! -------------------------------- !
681      !                                                      !   OPA-SAS coupling - rcv by sas  !   
682      !                                                      ! -------------------------------- !
683      srcv(jpr_toce  )%clname = 'I_SSTSST'
684      srcv(jpr_soce  )%clname = 'I_SSSal'
685      srcv(jpr_ocx1  )%clname = 'I_OCurx1'
686      srcv(jpr_ocy1  )%clname = 'I_OCury1'
687      srcv(jpr_ssh   )%clname = 'I_SSHght'
688      srcv(jpr_e3t1st)%clname = 'I_E3T1st'   
689      srcv(jpr_fraqsr)%clname = 'I_FraQsr'   
690      !
691      IF( nn_components == jp_iam_sas ) THEN
692         IF( .NOT. ln_cpl ) srcv(:)%laction = .FALSE.   ! force default definition in case of opa <-> sas coupling
693         IF( .NOT. ln_cpl ) srcv(:)%clgrid  = 'T'       ! force default definition in case of opa <-> sas coupling
694         IF( .NOT. ln_cpl ) srcv(:)%nsgn    = 1.        ! force default definition in case of opa <-> sas coupling
695         srcv( (/jpr_toce, jpr_soce, jpr_ssh, jpr_fraqsr, jpr_ocx1, jpr_ocy1/) )%laction = .TRUE.
[6140]696         srcv( jpr_e3t1st )%laction = .NOT.ln_linssh
[5407]697         srcv(jpr_ocx1)%clgrid = 'U'        ! oce components given at U-point
698         srcv(jpr_ocy1)%clgrid = 'V'        !           and           V-point
699         ! Vectors: change of sign at north fold ONLY if on the local grid
700         srcv(jpr_ocx1:jpr_ocy1)%nsgn = -1.
701         ! Change first letter to couple with atmosphere if already coupled OPA
702         ! this is nedeed as each variable name used in the namcouple must be unique:
703         ! for example O_Runoff received by OPA from SAS and therefore O_Runoff received by SAS from the Atmosphere
704         DO jn = 1, jprcv
705            IF ( srcv(jn)%clname(1:1) == "O" ) srcv(jn)%clname = "S"//srcv(jn)%clname(2:LEN(srcv(jn)%clname))
706         END DO
707         !
708         IF(lwp) THEN                        ! control print
709            WRITE(numout,*)
710            WRITE(numout,*)'               Special conditions for SAS-OPA coupling  '
711            WRITE(numout,*)'               SAS component  '
712            WRITE(numout,*)
713            IF( .NOT. ln_cpl ) THEN
714               WRITE(numout,*)'  received fields from OPA component '
715            ELSE
716               WRITE(numout,*)'  Additional received fields from OPA component : '
717            ENDIF
[7646]718            WRITE(numout,*)'               sea surface temperature (Celsius) '
[5407]719            WRITE(numout,*)'               sea surface salinity ' 
720            WRITE(numout,*)'               surface currents ' 
721            WRITE(numout,*)'               sea surface height ' 
722            WRITE(numout,*)'               thickness of first ocean T level '       
723            WRITE(numout,*)'               fraction of solar net radiation absorbed in the first ocean level'
724            WRITE(numout,*)
725         ENDIF
726      ENDIF
727     
728      ! =================================================== !
729      ! Allocate all parts of frcv used for received fields !
730      ! =================================================== !
[3294]731      DO jn = 1, jprcv
732         IF ( srcv(jn)%laction ) ALLOCATE( frcv(jn)%z3(jpi,jpj,srcv(jn)%nct) )
733      END DO
734      ! Allocate taum part of frcv which is used even when not received as coupling field
[4990]735      IF ( .NOT. srcv(jpr_taum)%laction ) ALLOCATE( frcv(jpr_taum)%z3(jpi,jpj,srcv(jpr_taum)%nct) )
[5407]736      ! Allocate w10m part of frcv which is used even when not received as coupling field
737      IF ( .NOT. srcv(jpr_w10m)%laction ) ALLOCATE( frcv(jpr_w10m)%z3(jpi,jpj,srcv(jpr_w10m)%nct) )
738      ! Allocate jpr_otx1 part of frcv which is used even when not received as coupling field
739      IF ( .NOT. srcv(jpr_otx1)%laction ) ALLOCATE( frcv(jpr_otx1)%z3(jpi,jpj,srcv(jpr_otx1)%nct) )
740      IF ( .NOT. srcv(jpr_oty1)%laction ) ALLOCATE( frcv(jpr_oty1)%z3(jpi,jpj,srcv(jpr_oty1)%nct) )
[4162]741      ! Allocate itx1 and ity1 as they are used in sbc_cpl_ice_tau even if srcv(jpr_itx1)%laction = .FALSE.
742      IF( k_ice /= 0 ) THEN
[4990]743         IF ( .NOT. srcv(jpr_itx1)%laction ) ALLOCATE( frcv(jpr_itx1)%z3(jpi,jpj,srcv(jpr_itx1)%nct) )
744         IF ( .NOT. srcv(jpr_ity1)%laction ) ALLOCATE( frcv(jpr_ity1)%z3(jpi,jpj,srcv(jpr_ity1)%nct) )
[4162]745      END IF
[3294]746
[1218]747      ! ================================ !
748      !     Define the send interface    !
749      ! ================================ !
[3294]750      ! for each field: define the OASIS name                           (ssnd(:)%clname)
751      !                 define send or not from the namelist parameters (ssnd(:)%laction)
752      !                 define the north fold type of lbc               (ssnd(:)%nsgn)
[1218]753     
754      ! default definitions of nsnd
[11509]755      ssnd(:)%laction = .FALSE.
756      ssnd(:)%clgrid = 'T'
757      ssnd(:)%nsgn = 1
758      ssnd(:)%nct = 1
759      ssnd(:)%dimensions = 2
[1218]760         
761      !                                                      ! ------------------------- !
762      !                                                      !    Surface temperature    !
763      !                                                      ! ------------------------- !
[9019]764      ssnd(jps_toce)%clname   = 'O_SSTSST'
765      ssnd(jps_tice)%clname   = 'O_TepIce'
766      ssnd(jps_ttilyr)%clname = 'O_TtiLyr'
767      ssnd(jps_tmix)%clname   = 'O_TepMix'
[3294]768      SELECT CASE( TRIM( sn_snd_temp%cldes ) )
[5410]769      CASE( 'none'                                 )       ! nothing to do
770      CASE( 'oce only'                             )   ;   ssnd( jps_toce )%laction = .TRUE.
[9019]771      CASE( 'oce and ice' , 'weighted oce and ice' , 'oce and weighted ice' )
[3294]772         ssnd( (/jps_toce, jps_tice/) )%laction = .TRUE.
[9019]773         IF ( TRIM( sn_snd_temp%clcat ) == 'yes' )  ssnd(jps_tice)%nct = nn_cats_cpl
[5410]774      CASE( 'mixed oce-ice'                        )   ;   ssnd( jps_tmix )%laction = .TRUE.
[3294]775      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_temp%cldes' )
[1218]776      END SELECT
[5407]777           
[1218]778      !                                                      ! ------------------------- !
779      !                                                      !          Albedo           !
780      !                                                      ! ------------------------- !
781      ssnd(jps_albice)%clname = 'O_AlbIce' 
782      ssnd(jps_albmix)%clname = 'O_AlbMix'
[3294]783      SELECT CASE( TRIM( sn_snd_alb%cldes ) )
[5410]784      CASE( 'none'                 )     ! nothing to do
785      CASE( 'ice' , 'weighted ice' )   ; ssnd(jps_albice)%laction = .TRUE.
786      CASE( 'mixed oce-ice'        )   ; ssnd(jps_albmix)%laction = .TRUE.
[3294]787      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_alb%cldes' )
[1218]788      END SELECT
[1232]789      !
790      ! Need to calculate oceanic albedo if
791      !     1. sending mixed oce-ice albedo or
792      !     2. receiving mixed oce-ice solar radiation
[3294]793      IF ( TRIM ( sn_snd_alb%cldes ) == 'mixed oce-ice' .OR. TRIM ( sn_rcv_qsr%cldes ) == 'mixed oce-ice' ) THEN
[9019]794         CALL oce_alb( zaos, zacs )
[1308]795         ! Due to lack of information on nebulosity : mean clear/overcast sky
[9019]796         alb_oce_mix(:,:) = ( zacs(:,:) + zaos(:,:) ) * 0.5
[1232]797      ENDIF
[1218]798      !                                                      ! ------------------------- !
799      !                                                      !  Ice fraction & Thickness !
800      !                                                      ! ------------------------- !
[9019]801      ssnd(jps_fice)%clname  = 'OIceFrc'
[7646]802      ssnd(jps_ficet)%clname = 'OIceFrcT' 
[9019]803      ssnd(jps_hice)%clname  = 'OIceTck'
804      ssnd(jps_a_p)%clname   = 'OPndFrc'
805      ssnd(jps_ht_p)%clname  = 'OPndTck'
806      ssnd(jps_hsnw)%clname  = 'OSnwTck'
807      ssnd(jps_fice1)%clname = 'OIceFrd'
[3294]808      IF( k_ice /= 0 ) THEN
[9019]809         ssnd(jps_fice)%laction  = .TRUE.                 ! if ice treated in the ocean (even in climato case)
810         ssnd(jps_fice1)%laction = .TRUE.                 ! First-order regridded ice concentration, to be used producing atmos-to-ice fluxes (Met Office requirement)
[3294]811! Currently no namelist entry to determine sending of multi-category ice fraction so use the thickness entry for now
[9019]812         IF ( TRIM( sn_snd_thick%clcat  ) == 'yes' ) ssnd(jps_fice)%nct  = nn_cats_cpl
813         IF ( TRIM( sn_snd_thick1%clcat ) == 'yes' ) ssnd(jps_fice1)%nct = nn_cats_cpl
[3294]814      ENDIF
[5407]815     
[7646]816      IF (TRIM( sn_snd_ifrac%cldes )  == 'coupled') ssnd(jps_ficet)%laction = .TRUE. 
817
[3294]818      SELECT CASE ( TRIM( sn_snd_thick%cldes ) )
[3680]819      CASE( 'none'         )       ! nothing to do
820      CASE( 'ice and snow' ) 
[3294]821         ssnd(jps_hice:jps_hsnw)%laction = .TRUE.
822         IF ( TRIM( sn_snd_thick%clcat ) == 'yes' ) THEN
[9019]823            ssnd(jps_hice:jps_hsnw)%nct = nn_cats_cpl
[3294]824         ENDIF
825      CASE ( 'weighted ice and snow' ) 
826         ssnd(jps_hice:jps_hsnw)%laction = .TRUE.
[9019]827         IF ( TRIM( sn_snd_thick%clcat ) == 'yes' ) ssnd(jps_hice:jps_hsnw)%nct = nn_cats_cpl
[3294]828      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_thick%cldes' )
829      END SELECT
830
[9019]831      !                                                      ! ------------------------- !
832      !                                                      !      Ice Meltponds        !
833      !                                                      ! ------------------------- !
834      ! Needed by Met Office
835      ssnd(jps_a_p)%clname  = 'OPndFrc'   
836      ssnd(jps_ht_p)%clname = 'OPndTck'   
837      SELECT CASE ( TRIM( sn_snd_mpnd%cldes ) ) 
838      CASE ( 'none' ) 
839         ssnd(jps_a_p)%laction  = .FALSE. 
840         ssnd(jps_ht_p)%laction = .FALSE. 
841      CASE ( 'ice only' ) 
842         ssnd(jps_a_p)%laction  = .TRUE. 
843         ssnd(jps_ht_p)%laction = .TRUE. 
844         IF ( TRIM( sn_snd_mpnd%clcat ) == 'yes' ) THEN
845            ssnd(jps_a_p)%nct  = nn_cats_cpl 
846            ssnd(jps_ht_p)%nct = nn_cats_cpl 
847         ELSE
848            IF ( nn_cats_cpl > 1 ) THEN
849               CALL ctl_stop( 'sbc_cpl_init: use weighted ice option for sn_snd_mpnd%cldes if not exchanging category fields' ) 
850            ENDIF
851         ENDIF
852      CASE ( 'weighted ice' ) 
853         ssnd(jps_a_p)%laction  = .TRUE. 
854         ssnd(jps_ht_p)%laction = .TRUE. 
855         IF ( TRIM( sn_snd_mpnd%clcat ) == 'yes' ) THEN
856            ssnd(jps_a_p)%nct  = nn_cats_cpl 
857            ssnd(jps_ht_p)%nct = nn_cats_cpl 
858         ENDIF
859      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_mpnd%cldes; '//sn_snd_mpnd%cldes ) 
860      END SELECT 
861 
[1218]862      !                                                      ! ------------------------- !
863      !                                                      !      Surface current      !
864      !                                                      ! ------------------------- !
865      !        ocean currents              !            ice velocities
866      ssnd(jps_ocx1)%clname = 'O_OCurx1'   ;   ssnd(jps_ivx1)%clname = 'O_IVelx1'
867      ssnd(jps_ocy1)%clname = 'O_OCury1'   ;   ssnd(jps_ivy1)%clname = 'O_IVely1'
868      ssnd(jps_ocz1)%clname = 'O_OCurz1'   ;   ssnd(jps_ivz1)%clname = 'O_IVelz1'
[7646]869      ssnd(jps_ocxw)%clname = 'O_OCurxw' 
870      ssnd(jps_ocyw)%clname = 'O_OCuryw' 
[1218]871      !
[2090]872      ssnd(jps_ocx1:jps_ivz1)%nsgn = -1.   ! vectors: change of the sign at the north fold
[1218]873
[3294]874      IF( sn_snd_crt%clvgrd == 'U,V' ) THEN
875         ssnd(jps_ocx1)%clgrid = 'U' ; ssnd(jps_ocy1)%clgrid = 'V'
876      ELSE IF( sn_snd_crt%clvgrd /= 'T' ) THEN 
877         CALL ctl_stop( 'sn_snd_crt%clvgrd must be equal to T' )
878         ssnd(jps_ocx1:jps_ivz1)%clgrid  = 'T'      ! all oce and ice components on the same unique grid
879      ENDIF
[1226]880      ssnd(jps_ocx1:jps_ivz1)%laction = .TRUE.   ! default: all are send
[3294]881      IF( TRIM( sn_snd_crt%clvref ) == 'spherical' )   ssnd( (/jps_ocz1, jps_ivz1/) )%laction = .FALSE. 
882      IF( TRIM( sn_snd_crt%clvor ) == 'eastward-northward' ) ssnd(jps_ocx1:jps_ivz1)%nsgn = 1.
883      SELECT CASE( TRIM( sn_snd_crt%cldes ) )
[1226]884      CASE( 'none'                 )   ;   ssnd(jps_ocx1:jps_ivz1)%laction = .FALSE.
885      CASE( 'oce only'             )   ;   ssnd(jps_ivx1:jps_ivz1)%laction = .FALSE.
[1218]886      CASE( 'weighted oce and ice' )   !   nothing to do
[1226]887      CASE( 'mixed oce-ice'        )   ;   ssnd(jps_ivx1:jps_ivz1)%laction = .FALSE.
[3294]888      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_crt%cldes' )
[1218]889      END SELECT
890
[7646]891      ssnd(jps_ocxw:jps_ocyw)%nsgn = -1.   ! vectors: change of the sign at the north fold
892       
893      IF( sn_snd_crtw%clvgrd == 'U,V' ) THEN
894         ssnd(jps_ocxw)%clgrid = 'U' ; ssnd(jps_ocyw)%clgrid = 'V' 
895      ELSE IF( sn_snd_crtw%clvgrd /= 'T' ) THEN
896         CALL ctl_stop( 'sn_snd_crtw%clvgrd must be equal to T' ) 
897      ENDIF
898      IF( TRIM( sn_snd_crtw%clvor ) == 'eastward-northward' ) ssnd(jps_ocxw:jps_ocyw)%nsgn = 1. 
899      SELECT CASE( TRIM( sn_snd_crtw%cldes ) ) 
900         CASE( 'none'                 )   ; ssnd(jps_ocxw:jps_ocyw)%laction = .FALSE. 
901         CASE( 'oce only'             )   ; ssnd(jps_ocxw:jps_ocyw)%laction = .TRUE. 
902         CASE( 'weighted oce and ice' )   !   nothing to do
903         CASE( 'mixed oce-ice'        )   ; ssnd(jps_ivx1:jps_ivz1)%laction = .FALSE. 
904         CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_crtw%cldes' ) 
905      END SELECT 
906
[1534]907      !                                                      ! ------------------------- !
908      !                                                      !          CO2 flux         !
909      !                                                      ! ------------------------- !
[3294]910      ssnd(jps_co2)%clname = 'O_CO2FLX' ;  IF( TRIM(sn_snd_co2%cldes) == 'coupled' )    ssnd(jps_co2 )%laction = .TRUE.
[9019]911      !
912      !                                                      ! ------------------------- !
913      !                                                      ! Sea surface freezing temp !
914      !                                                      ! ------------------------- !
915      ! needed by Met Office
916      ssnd(jps_sstfrz)%clname = 'O_SSTFrz' ; IF( TRIM(sn_snd_sstfrz%cldes) == 'coupled' )  ssnd(jps_sstfrz)%laction = .TRUE. 
917      !
918      !                                                      ! ------------------------- !
919      !                                                      !    Ice conductivity       !
920      !                                                      ! ------------------------- !
921      ! needed by Met Office
922      ! Note that ultimately we will move to passing an ocean effective conductivity as well so there
923      ! will be some changes to the parts of the code which currently relate only to ice conductivity
924      ssnd(jps_ttilyr )%clname = 'O_TtiLyr' 
925      SELECT CASE ( TRIM( sn_snd_ttilyr%cldes ) ) 
926      CASE ( 'none' ) 
927         ssnd(jps_ttilyr)%laction = .FALSE. 
928      CASE ( 'ice only' ) 
929         ssnd(jps_ttilyr)%laction = .TRUE. 
930         IF ( TRIM( sn_snd_ttilyr%clcat ) == 'yes' ) THEN
931            ssnd(jps_ttilyr)%nct = nn_cats_cpl 
932         ELSE
933            IF ( nn_cats_cpl > 1 ) THEN
934               CALL ctl_stop( 'sbc_cpl_init: use weighted ice option for sn_snd_ttilyr%cldes if not exchanging category fields' ) 
935            ENDIF
936         ENDIF
937      CASE ( 'weighted ice' ) 
938         ssnd(jps_ttilyr)%laction = .TRUE. 
939         IF ( TRIM( sn_snd_ttilyr%clcat ) == 'yes' ) ssnd(jps_ttilyr)%nct = nn_cats_cpl 
940      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_ttilyr%cldes;'//sn_snd_ttilyr%cldes ) 
941      END SELECT
[5407]942
[9019]943      ssnd(jps_kice )%clname = 'OIceKn' 
944      SELECT CASE ( TRIM( sn_snd_cond%cldes ) ) 
945      CASE ( 'none' ) 
946         ssnd(jps_kice)%laction = .FALSE. 
947      CASE ( 'ice only' ) 
948         ssnd(jps_kice)%laction = .TRUE. 
949         IF ( TRIM( sn_snd_cond%clcat ) == 'yes' ) THEN
950            ssnd(jps_kice)%nct = nn_cats_cpl 
951         ELSE
952            IF ( nn_cats_cpl > 1 ) THEN
953               CALL ctl_stop( 'sbc_cpl_init: use weighted ice option for sn_snd_cond%cldes if not exchanging category fields' ) 
954            ENDIF
955         ENDIF
956      CASE ( 'weighted ice' ) 
957         ssnd(jps_kice)%laction = .TRUE. 
958         IF ( TRIM( sn_snd_cond%clcat ) == 'yes' ) ssnd(jps_kice)%nct = nn_cats_cpl 
959      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_cond%cldes;'//sn_snd_cond%cldes ) 
960      END SELECT 
961      !
[7646]962      !                                                      ! ------------------------- !
963      !                                                      !     Sea surface height    !
964      !                                                      ! ------------------------- !
965      ssnd(jps_wlev)%clname = 'O_Wlevel' ;  IF( TRIM(sn_snd_wlev%cldes) == 'coupled' )   ssnd(jps_wlev)%laction = .TRUE. 
966
[5407]967      !                                                      ! ------------------------------- !
968      !                                                      !   OPA-SAS coupling - snd by opa !   
969      !                                                      ! ------------------------------- !
970      ssnd(jps_ssh   )%clname = 'O_SSHght' 
971      ssnd(jps_soce  )%clname = 'O_SSSal' 
972      ssnd(jps_e3t1st)%clname = 'O_E3T1st'   
973      ssnd(jps_fraqsr)%clname = 'O_FraQsr'
[1534]974      !
[5407]975      IF( nn_components == jp_iam_opa ) THEN
976         ssnd(:)%laction = .FALSE.   ! force default definition in case of opa <-> sas coupling
977         ssnd( (/jps_toce, jps_soce, jps_ssh, jps_fraqsr, jps_ocx1, jps_ocy1/) )%laction = .TRUE.
[6140]978         ssnd( jps_e3t1st )%laction = .NOT.ln_linssh
[5407]979         ! vector definition: not used but cleaner...
980         ssnd(jps_ocx1)%clgrid  = 'U'        ! oce components given at U-point
981         ssnd(jps_ocy1)%clgrid  = 'V'        !           and           V-point
982         sn_snd_crt%clvgrd = 'U,V'
983         sn_snd_crt%clvor = 'local grid'
984         sn_snd_crt%clvref = 'spherical'
985         !
986         IF(lwp) THEN                        ! control print
987            WRITE(numout,*)
988            WRITE(numout,*)'  sent fields to SAS component '
[7646]989            WRITE(numout,*)'               sea surface temperature (T before, Celsius) '
[5407]990            WRITE(numout,*)'               sea surface salinity ' 
991            WRITE(numout,*)'               surface currents U,V on local grid and spherical coordinates' 
992            WRITE(numout,*)'               sea surface height ' 
993            WRITE(numout,*)'               thickness of first ocean T level '       
994            WRITE(numout,*)'               fraction of solar net radiation absorbed in the first ocean level'
995            WRITE(numout,*)
996         ENDIF
997      ENDIF
998      !                                                      ! ------------------------------- !
999      !                                                      !   OPA-SAS coupling - snd by sas !   
1000      !                                                      ! ------------------------------- !
1001      ssnd(jps_sflx  )%clname = 'I_SFLX'     
1002      ssnd(jps_fice2 )%clname = 'IIceFrc'
1003      ssnd(jps_qsroce)%clname = 'I_QsrOce'   
1004      ssnd(jps_qnsoce)%clname = 'I_QnsOce'   
1005      ssnd(jps_oemp  )%clname = 'IOEvaMPr' 
1006      ssnd(jps_otx1  )%clname = 'I_OTaux1'   
1007      ssnd(jps_oty1  )%clname = 'I_OTauy1'   
1008      ssnd(jps_rnf   )%clname = 'I_Runoff'   
1009      ssnd(jps_taum  )%clname = 'I_TauMod'   
1010      !
1011      IF( nn_components == jp_iam_sas ) THEN
1012         IF( .NOT. ln_cpl ) ssnd(:)%laction = .FALSE.   ! force default definition in case of opa <-> sas coupling
1013         ssnd( (/jps_qsroce, jps_qnsoce, jps_oemp, jps_fice2, jps_sflx, jps_otx1, jps_oty1, jps_taum/) )%laction = .TRUE.
1014         !
1015         ! Change first letter to couple with atmosphere if already coupled with sea_ice
1016         ! this is nedeed as each variable name used in the namcouple must be unique:
1017         ! for example O_SSTSST sent by OPA to SAS and therefore S_SSTSST sent by SAS to the Atmosphere
1018         DO jn = 1, jpsnd
1019            IF ( ssnd(jn)%clname(1:1) == "O" ) ssnd(jn)%clname = "S"//ssnd(jn)%clname(2:LEN(ssnd(jn)%clname))
1020         END DO
1021         !
1022         IF(lwp) THEN                        ! control print
1023            WRITE(numout,*)
1024            IF( .NOT. ln_cpl ) THEN
1025               WRITE(numout,*)'  sent fields to OPA component '
1026            ELSE
1027               WRITE(numout,*)'  Additional sent fields to OPA component : '
1028            ENDIF
1029            WRITE(numout,*)'                  ice cover '
1030            WRITE(numout,*)'                  oce only EMP  '
1031            WRITE(numout,*)'                  salt flux  '
1032            WRITE(numout,*)'                  mixed oce-ice solar flux  '
1033            WRITE(numout,*)'                  mixed oce-ice non solar flux  '
1034            WRITE(numout,*)'                  wind stress U,V components'
1035            WRITE(numout,*)'                  wind stress module'
1036         ENDIF
1037      ENDIF
1038
[11509]1039      ! Initialise 1D river outflow scheme
1040      nn_cpl_river = 1 
1041      IF ( TRIM( sn_rcv_rnf%cldes ) == 'coupled1d' ) CALL cpl_rnf_1d_init   ! Coupled runoff using 1D array
1042
1043      ! =================================================== !
1044      ! Allocate all parts of frcv used for received fields !
1045      ! =================================================== !
1046      DO jn = 1, jprcv
1047
1048         IF ( srcv(jn)%laction ) THEN
1049            SELECT CASE( srcv(jn)%dimensions )
1050            !
1051            CASE( 0 )   ! Scalar field
1052               ALLOCATE( frcv(jn)%z3(1,1,1) )
1053               
1054            CASE( 1 )   ! 1D field
1055               ALLOCATE( frcv(jn)%z3(nn_cpl_river,1,1) )
1056               
1057            CASE DEFAULT  ! 2D (or pseudo 3D) field.
1058               ALLOCATE( frcv(jn)%z3(jpi,jpj,srcv(jn)%nct) )
1059               
1060            END SELECT
1061         END IF
1062
1063      END DO
1064      ! Allocate taum part of frcv which is used even when not received as coupling field
1065      IF ( .NOT. srcv(jpr_taum)%laction ) ALLOCATE( frcv(jpr_taum)%z3(jpi,jpj,srcv(jpr_taum)%nct) )
1066      ! Allocate w10m part of frcv which is used even when not received as coupling field
1067      IF ( .NOT. srcv(jpr_w10m)%laction ) ALLOCATE( frcv(jpr_w10m)%z3(jpi,jpj,srcv(jpr_w10m)%nct) )
1068      ! Allocate jpr_otx1 part of frcv which is used even when not received as coupling field
1069      IF ( .NOT. srcv(jpr_otx1)%laction ) ALLOCATE( frcv(jpr_otx1)%z3(jpi,jpj,srcv(jpr_otx1)%nct) )
1070      IF ( .NOT. srcv(jpr_oty1)%laction ) ALLOCATE( frcv(jpr_oty1)%z3(jpi,jpj,srcv(jpr_oty1)%nct) )
1071      ! Allocate itx1 and ity1 as they are used in sbc_cpl_ice_tau even if srcv(jpr_itx1)%laction = .FALSE.
1072      IF( k_ice /= 0 ) THEN
1073         IF ( .NOT. srcv(jpr_itx1)%laction ) ALLOCATE( frcv(jpr_itx1)%z3(jpi,jpj,srcv(jpr_itx1)%nct) )
1074         IF ( .NOT. srcv(jpr_ity1)%laction ) ALLOCATE( frcv(jpr_ity1)%z3(jpi,jpj,srcv(jpr_ity1)%nct) )
1075      END IF
1076
[5407]1077      !
[1218]1078      ! ================================ !
1079      !   initialisation of the coupler  !
1080      ! ================================ !
[1226]1081
[5407]1082      CALL cpl_define(jprcv, jpsnd, nn_cplmodel)
1083     
[4990]1084      IF (ln_usecplmask) THEN
1085         xcplmask(:,:,:) = 0.
1086         CALL iom_open( 'cplmask', inum )
1087         CALL iom_get( inum, jpdom_unknown, 'cplmask', xcplmask(1:nlci,1:nlcj,1:nn_cplmodel),   &
1088            &          kstart = (/ mig(1),mjg(1),1 /), kcount = (/ nlci,nlcj,nn_cplmodel /) )
1089         CALL iom_close( inum )
1090      ELSE
1091         xcplmask(:,:,:) = 1.
1092      ENDIF
[5407]1093      xcplmask(:,:,0) = 1. - SUM( xcplmask(:,:,1:nn_cplmodel), dim = 3 )
[1218]1094      !
[5486]1095      ncpl_qsr_freq = cpl_freq( 'O_QsrOce' ) + cpl_freq( 'O_QsrMix' ) + cpl_freq( 'I_QsrOce' ) + cpl_freq( 'I_QsrMix' )
[5407]1096      IF( ln_dm2dc .AND. ln_cpl .AND. ncpl_qsr_freq /= 86400 )   &
[2528]1097         &   CALL ctl_stop( 'sbc_cpl_init: diurnal cycle reconstruction (ln_dm2dc) needs daily couping for solar radiation' )
[7646]1098      IF( ln_dm2dc .AND. ln_cpl ) ncpl_qsr_freq = 86400 / ncpl_qsr_freq
[2715]1099      !
[1218]1100   END SUBROUTINE sbc_cpl_init
1101
1102
1103   SUBROUTINE sbc_cpl_rcv( kt, k_fsbc, k_ice )     
1104      !!----------------------------------------------------------------------
1105      !!             ***  ROUTINE sbc_cpl_rcv  ***
[888]1106      !!
[1218]1107      !! ** Purpose :   provide the stress over the ocean and, if no sea-ice,
1108      !!                provide the ocean heat and freshwater fluxes.
[888]1109      !!
[1218]1110      !! ** Method  : - Receive all the atmospheric fields (stored in frcv array). called at each time step.
1111      !!                OASIS controls if there is something do receive or not. nrcvinfo contains the info
1112      !!                to know if the field was really received or not
[888]1113      !!
[1218]1114      !!              --> If ocean stress was really received:
[888]1115      !!
[1218]1116      !!                  - transform the received ocean stress vector from the received
1117      !!                 referential and grid into an atmosphere-ocean stress in
1118      !!                 the (i,j) ocean referencial and at the ocean velocity point.
1119      !!                    The received stress are :
1120      !!                     - defined by 3 components (if cartesian coordinate)
1121      !!                            or by 2 components (if spherical)
1122      !!                     - oriented along geographical   coordinate (if eastward-northward)
1123      !!                            or  along the local grid coordinate (if local grid)
1124      !!                     - given at U- and V-point, resp.   if received on 2 grids
1125      !!                            or at T-point               if received on 1 grid
1126      !!                    Therefore and if necessary, they are successively
1127      !!                  processed in order to obtain them
1128      !!                     first  as  2 components on the sphere
1129      !!                     second as  2 components oriented along the local grid
1130      !!                     third  as  2 components on the U,V grid
[888]1131      !!
[1218]1132      !!              -->
[888]1133      !!
[1218]1134      !!              - In 'ocean only' case, non solar and solar ocean heat fluxes
1135      !!             and total ocean freshwater fluxes 
1136      !!
1137      !! ** Method  :   receive all fields from the atmosphere and transform
1138      !!              them into ocean surface boundary condition fields
1139      !!
1140      !! ** Action  :   update  utau, vtau   ocean stress at U,V grid
[4990]1141      !!                        taum         wind stress module at T-point
1142      !!                        wndm         wind speed  module at T-point over free ocean or leads in presence of sea-ice
[3625]1143      !!                        qns          non solar heat fluxes including emp heat content    (ocean only case)
1144      !!                                     and the latent heat flux of solid precip. melting
1145      !!                        qsr          solar ocean heat fluxes   (ocean only case)
1146      !!                        emp          upward mass flux [evap. - precip. (- runoffs) (- calving)] (ocean only case)
[888]1147      !!----------------------------------------------------------------------
[9019]1148      USE zdf_oce,  ONLY :   ln_zdfswm
1149      !
1150      INTEGER, INTENT(in) ::   kt          ! ocean model time step index
1151      INTEGER, INTENT(in) ::   k_fsbc      ! frequency of sbc (-> ice model) computation
1152      INTEGER, INTENT(in) ::   k_ice       ! ice management in the sbc (=0/1/2/3)
[888]1153      !!
[5407]1154      LOGICAL  ::   llnewtx, llnewtau      ! update wind stress components and module??
[1218]1155      INTEGER  ::   ji, jj, jn             ! dummy loop indices
[6140]1156      INTEGER  ::   isec                   ! number of seconds since nit000 (assuming rdt did not change since nit000)
[1218]1157      REAL(wp) ::   zcumulneg, zcumulpos   ! temporary scalars     
[1226]1158      REAL(wp) ::   zcoef                  ! temporary scalar
[1695]1159      REAL(wp) ::   zrhoa  = 1.22          ! Air density kg/m3
1160      REAL(wp) ::   zcdrag = 1.5e-3        ! drag coefficient
1161      REAL(wp) ::   zzx, zzy               ! temporary variables
[9019]1162      REAL(wp), DIMENSION(jpi,jpj) ::   ztx, zty, zmsk, zemp, zqns, zqsr
[1218]1163      !!----------------------------------------------------------------------
[3294]1164      !
[5407]1165      IF( ln_mixcpl )   zmsk(:,:) = 1. - xcplmask(:,:,0)
1166      !
1167      !                                                      ! ======================================================= !
1168      !                                                      ! Receive all the atmos. fields (including ice information)
1169      !                                                      ! ======================================================= !
[6140]1170      isec = ( kt - nit000 ) * NINT( rdt )                      ! date of exchanges
[5407]1171      DO jn = 1, jprcv                                          ! received fields sent by the atmosphere
[11509]1172         IF( srcv(jn)%laction ) THEN 
1173 
1174            IF ( srcv(jn)%dimensions <= 1 ) THEN
1175               CALL cpl_rcv_1d( jn, isec, frcv(jn)%z3, SIZE(frcv(jn)%z3), nrcvinfo(jn) ) 
1176            ELSE
1177               CALL cpl_rcv( jn, isec, frcv(jn)%z3, xcplmask(:,:,1:nn_cplmodel), nrcvinfo(jn) ) 
1178            END IF
1179 
1180         END IF
[1218]1181      END DO
[888]1182
[1218]1183      !                                                      ! ========================= !
[1696]1184      IF( srcv(jpr_otx1)%laction ) THEN                      !  ocean stress components  !
[1218]1185         !                                                   ! ========================= !
[3294]1186         ! define frcv(jpr_otx1)%z3(:,:,1) and frcv(jpr_oty1)%z3(:,:,1): stress at U/V point along model grid
[1218]1187         ! => need to be done only when we receive the field
[1698]1188         IF(  nrcvinfo(jpr_otx1) == OASIS_Rcv ) THEN
[1218]1189            !
[3294]1190            IF( TRIM( sn_rcv_tau%clvref ) == 'cartesian' ) THEN            ! 2 components on the sphere
[1218]1191               !                                                       ! (cartesian to spherical -> 3 to 2 components)
1192               !
[3294]1193               CALL geo2oce( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), frcv(jpr_otz1)%z3(:,:,1),   &
[1218]1194                  &          srcv(jpr_otx1)%clgrid, ztx, zty )
[3294]1195               frcv(jpr_otx1)%z3(:,:,1) = ztx(:,:)   ! overwrite 1st comp. on the 1st grid
1196               frcv(jpr_oty1)%z3(:,:,1) = zty(:,:)   ! overwrite 2nd comp. on the 1st grid
[1218]1197               !
1198               IF( srcv(jpr_otx2)%laction ) THEN
[3294]1199                  CALL geo2oce( frcv(jpr_otx2)%z3(:,:,1), frcv(jpr_oty2)%z3(:,:,1), frcv(jpr_otz2)%z3(:,:,1),   &
[1218]1200                     &          srcv(jpr_otx2)%clgrid, ztx, zty )
[3294]1201                  frcv(jpr_otx2)%z3(:,:,1) = ztx(:,:)   ! overwrite 1st comp. on the 2nd grid
1202                  frcv(jpr_oty2)%z3(:,:,1) = zty(:,:)   ! overwrite 2nd comp. on the 2nd grid
[1218]1203               ENDIF
1204               !
1205            ENDIF
1206            !
[3294]1207            IF( TRIM( sn_rcv_tau%clvor ) == 'eastward-northward' ) THEN   ! 2 components oriented along the local grid
[1218]1208               !                                                       ! (geographical to local grid -> rotate the components)
[3294]1209               CALL rot_rep( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), srcv(jpr_otx1)%clgrid, 'en->i', ztx )   
[1218]1210               IF( srcv(jpr_otx2)%laction ) THEN
[3294]1211                  CALL rot_rep( frcv(jpr_otx2)%z3(:,:,1), frcv(jpr_oty2)%z3(:,:,1), srcv(jpr_otx2)%clgrid, 'en->j', zty )   
[7646]1212               ELSE
[3294]1213                  CALL rot_rep( frcv(jpr_otx1)%z3(:,:,1), frcv(jpr_oty1)%z3(:,:,1), srcv(jpr_otx1)%clgrid, 'en->j', zty ) 
[1218]1214               ENDIF
[3632]1215               frcv(jpr_otx1)%z3(:,:,1) = ztx(:,:)      ! overwrite 1st component on the 1st grid
[3294]1216               frcv(jpr_oty1)%z3(:,:,1) = zty(:,:)      ! overwrite 2nd component on the 2nd grid
[1218]1217            ENDIF
1218            !                             
1219            IF( srcv(jpr_otx1)%clgrid == 'T' ) THEN
1220               DO jj = 2, jpjm1                                          ! T ==> (U,V)
1221                  DO ji = fs_2, fs_jpim1   ! vector opt.
[3294]1222                     frcv(jpr_otx1)%z3(ji,jj,1) = 0.5 * ( frcv(jpr_otx1)%z3(ji+1,jj  ,1) + frcv(jpr_otx1)%z3(ji,jj,1) )
1223                     frcv(jpr_oty1)%z3(ji,jj,1) = 0.5 * ( frcv(jpr_oty1)%z3(ji  ,jj+1,1) + frcv(jpr_oty1)%z3(ji,jj,1) )
[1218]1224                  END DO
1225               END DO
[10425]1226               CALL lbc_lnk_multi( 'sbccpl', frcv(jpr_otx1)%z3(:,:,1), 'U',  -1., frcv(jpr_oty1)%z3(:,:,1), 'V',  -1. )
[1218]1227            ENDIF
[1696]1228            llnewtx = .TRUE.
1229         ELSE
1230            llnewtx = .FALSE.
[1218]1231         ENDIF
1232         !                                                   ! ========================= !
1233      ELSE                                                   !   No dynamical coupling   !
1234         !                                                   ! ========================= !
[3294]1235         frcv(jpr_otx1)%z3(:,:,1) = 0.e0                               ! here simply set to zero
1236         frcv(jpr_oty1)%z3(:,:,1) = 0.e0                               ! an external read in a file can be added instead
[1696]1237         llnewtx = .TRUE.
[1218]1238         !
1239      ENDIF
[1696]1240      !                                                      ! ========================= !
1241      !                                                      !    wind stress module     !   (taum)
1242      !                                                      ! ========================= !
1243      IF( .NOT. srcv(jpr_taum)%laction ) THEN                    ! compute wind stress module from its components if not received
1244         ! => need to be done only when otx1 was changed
1245         IF( llnewtx ) THEN
1246            DO jj = 2, jpjm1
1247               DO ji = fs_2, fs_jpim1   ! vect. opt.
[3294]1248                  zzx = frcv(jpr_otx1)%z3(ji-1,jj  ,1) + frcv(jpr_otx1)%z3(ji,jj,1)
1249                  zzy = frcv(jpr_oty1)%z3(ji  ,jj-1,1) + frcv(jpr_oty1)%z3(ji,jj,1)
1250                  frcv(jpr_taum)%z3(ji,jj,1) = 0.5 * SQRT( zzx * zzx + zzy * zzy )
[1696]1251               END DO
[1695]1252            END DO
[10425]1253            CALL lbc_lnk( 'sbccpl', frcv(jpr_taum)%z3(:,:,1), 'T', 1. )
[1696]1254            llnewtau = .TRUE.
1255         ELSE
1256            llnewtau = .FALSE.
1257         ENDIF
1258      ELSE
[1706]1259         llnewtau = nrcvinfo(jpr_taum) == OASIS_Rcv
[1726]1260         ! Stress module can be negative when received (interpolation problem)
1261         IF( llnewtau ) THEN
[3625]1262            frcv(jpr_taum)%z3(:,:,1) = MAX( 0._wp, frcv(jpr_taum)%z3(:,:,1) )
[1726]1263         ENDIF
[1696]1264      ENDIF
[5407]1265      !
[1696]1266      !                                                      ! ========================= !
1267      !                                                      !      10 m wind speed      !   (wndm)
1268      !                                                      ! ========================= !
1269      IF( .NOT. srcv(jpr_w10m)%laction ) THEN                    ! compute wind spreed from wind stress module if not received 
1270         ! => need to be done only when taumod was changed
1271         IF( llnewtau ) THEN
[1695]1272            zcoef = 1. / ( zrhoa * zcdrag ) 
1273            DO jj = 1, jpj
1274               DO ji = 1, jpi 
[5407]1275                  frcv(jpr_w10m)%z3(ji,jj,1) = SQRT( frcv(jpr_taum)%z3(ji,jj,1) * zcoef )
[1695]1276               END DO
1277            END DO
1278         ENDIF
[1696]1279      ENDIF
1280
[3294]1281      ! u(v)tau and taum will be modified by ice model
[1696]1282      ! -> need to be reset before each call of the ice/fsbc     
1283      IF( MOD( kt-1, k_fsbc ) == 0 ) THEN
1284         !
[5407]1285         IF( ln_mixcpl ) THEN
1286            utau(:,:) = utau(:,:) * xcplmask(:,:,0) + frcv(jpr_otx1)%z3(:,:,1) * zmsk(:,:)
1287            vtau(:,:) = vtau(:,:) * xcplmask(:,:,0) + frcv(jpr_oty1)%z3(:,:,1) * zmsk(:,:)
1288            taum(:,:) = taum(:,:) * xcplmask(:,:,0) + frcv(jpr_taum)%z3(:,:,1) * zmsk(:,:)
1289            wndm(:,:) = wndm(:,:) * xcplmask(:,:,0) + frcv(jpr_w10m)%z3(:,:,1) * zmsk(:,:)
1290         ELSE
1291            utau(:,:) = frcv(jpr_otx1)%z3(:,:,1)
1292            vtau(:,:) = frcv(jpr_oty1)%z3(:,:,1)
1293            taum(:,:) = frcv(jpr_taum)%z3(:,:,1)
1294            wndm(:,:) = frcv(jpr_w10m)%z3(:,:,1)
1295         ENDIF
[1705]1296         CALL iom_put( "taum_oce", taum )   ! output wind stress module
[1695]1297         
[1218]1298      ENDIF
[3294]1299
[5407]1300      !                                                      ! ================== !
1301      !                                                      ! atmosph. CO2 (ppm) !
1302      !                                                      ! ================== !
[3294]1303      IF( srcv(jpr_co2)%laction )   atm_co2(:,:) = frcv(jpr_co2)%z3(:,:,1)
[9019]1304      !
1305      !                                                      ! ================== !
1306      !                                                      !   ice skin temp.   !
1307      !                                                      ! ================== !
[9570]1308#if defined key_si3
[9019]1309      ! needed by Met Office
1310      IF( srcv(jpr_ts_ice)%laction ) THEN
1311         WHERE    ( frcv(jpr_ts_ice)%z3(:,:,:) > 0.0  )   ;   tsfc_ice(:,:,:) = 0.0 
1312         ELSEWHERE( frcv(jpr_ts_ice)%z3(:,:,:) < -60. )   ;   tsfc_ice(:,:,:) = -60.
1313         ELSEWHERE                                        ;   tsfc_ice(:,:,:) = frcv(jpr_ts_ice)%z3(:,:,:)
1314         END WHERE
1315      ENDIF 
1316#endif
[7646]1317      !                                                      ! ========================= !
1318      !                                                      ! Mean Sea Level Pressure   !   (taum)
1319      !                                                      ! ========================= !
1320      IF( srcv(jpr_mslp)%laction ) THEN                    ! UKMO SHELF effect of atmospheric pressure on SSH
1321          IF( kt /= nit000 )   ssh_ibb(:,:) = ssh_ib(:,:)    !* Swap of ssh_ib fields
[3294]1322
[7646]1323          r1_grau = 1.e0 / (grav * rau0)               !* constant for optimization
1324          ssh_ib(:,:) = - ( frcv(jpr_mslp)%z3(:,:,1) - rpref ) * r1_grau    ! equivalent ssh (inverse barometer)
1325          apr   (:,:) =     frcv(jpr_mslp)%z3(:,:,1)                         !atmospheric pressure
1326   
1327          IF( kt == nit000 ) ssh_ibb(:,:) = ssh_ib(:,:)  ! correct this later (read from restart if possible)
1328      END IF 
1329      !
1330      IF( ln_sdw ) THEN  ! Stokes Drift correction activated
[9023]1331      !                                                      ! ========================= !
1332      !                                                      !       Stokes drift u      !
1333      !                                                      ! ========================= !
1334         IF( srcv(jpr_sdrftx)%laction ) ut0sd(:,:) = frcv(jpr_sdrftx)%z3(:,:,1)
1335      !
1336      !                                                      ! ========================= !
1337      !                                                      !       Stokes drift v      !
1338      !                                                      ! ========================= !
1339         IF( srcv(jpr_sdrfty)%laction ) vt0sd(:,:) = frcv(jpr_sdrfty)%z3(:,:,1)
1340      !
1341      !                                                      ! ========================= !
1342      !                                                      !      Wave mean period     !
1343      !                                                      ! ========================= !
1344         IF( srcv(jpr_wper)%laction ) wmp(:,:) = frcv(jpr_wper)%z3(:,:,1)
1345      !
1346      !                                                      ! ========================= !
1347      !                                                      !  Significant wave height  !
1348      !                                                      ! ========================= !
1349         IF( srcv(jpr_hsig)%laction ) hsw(:,:) = frcv(jpr_hsig)%z3(:,:,1)
1350      !
1351      !                                                      ! ========================= ! 
1352      !                                                      !    Wave peak frequency    !
1353      !                                                      ! ========================= ! 
1354         IF( srcv(jpr_wfreq)%laction ) wfreq(:,:) = frcv(jpr_wfreq)%z3(:,:,1)
1355      !
1356      !                                                      ! ========================= !
1357      !                                                      !    Vertical mixing Qiao   !
1358      !                                                      ! ========================= !
[9033]1359         IF( srcv(jpr_wnum)%laction .AND. ln_zdfswm ) wnum(:,:) = frcv(jpr_wnum)%z3(:,:,1)
[7646]1360
1361         ! Calculate the 3D Stokes drift both in coupled and not fully uncoupled mode
1362         IF( srcv(jpr_sdrftx)%laction .OR. srcv(jpr_sdrfty)%laction .OR. srcv(jpr_wper)%laction &
[9023]1363                                      .OR. srcv(jpr_hsig)%laction   .OR. srcv(jpr_wfreq)%laction) THEN
[7646]1364            CALL sbc_stokes()
1365         ENDIF
1366      ENDIF
1367      !                                                      ! ========================= !
1368      !                                                      ! Stress adsorbed by waves  !
1369      !                                                      ! ========================= !
[9034]1370      IF( srcv(jpr_tauwoc)%laction .AND. ln_tauwoc ) tauoc_wave(:,:) = frcv(jpr_tauwoc)%z3(:,:,1)
[7646]1371
[9023]1372      !                                                      ! ========================= ! 
1373      !                                                      ! Stress component by waves !
1374      !                                                      ! ========================= ! 
1375      IF( srcv(jpr_tauwx)%laction .AND. srcv(jpr_tauwy)%laction .AND. ln_tauw ) THEN
1376         tauw_x(:,:) = frcv(jpr_tauwx)%z3(:,:,1)
1377         tauw_y(:,:) = frcv(jpr_tauwy)%z3(:,:,1)
1378      ENDIF
1379
[7646]1380      !                                                      ! ========================= !
1381      !                                                      !   Wave drag coefficient   !
1382      !                                                      ! ========================= !
[9019]1383      IF( srcv(jpr_wdrag)%laction .AND. ln_cdgw )   cdn_wave(:,:) = frcv(jpr_wdrag)%z3(:,:,1)
[7646]1384
[5407]1385      !  Fields received by SAS when OASIS coupling
1386      !  (arrays no more filled at sbcssm stage)
1387      !                                                      ! ================== !
1388      !                                                      !        SSS         !
1389      !                                                      ! ================== !
1390      IF( srcv(jpr_soce)%laction ) THEN                      ! received by sas in case of opa <-> sas coupling
1391         sss_m(:,:) = frcv(jpr_soce)%z3(:,:,1)
1392         CALL iom_put( 'sss_m', sss_m )
1393      ENDIF
1394      !                                               
1395      !                                                      ! ================== !
1396      !                                                      !        SST         !
1397      !                                                      ! ================== !
1398      IF( srcv(jpr_toce)%laction ) THEN                      ! received by sas in case of opa <-> sas coupling
1399         sst_m(:,:) = frcv(jpr_toce)%z3(:,:,1)
[6489]1400         IF( srcv(jpr_soce)%laction .AND. l_useCT ) THEN    ! make sure that sst_m is the potential temperature
[5407]1401            sst_m(:,:) = eos_pt_from_ct( sst_m(:,:), sss_m(:,:) )
1402         ENDIF
1403      ENDIF
1404      !                                                      ! ================== !
1405      !                                                      !        SSH         !
1406      !                                                      ! ================== !
1407      IF( srcv(jpr_ssh )%laction ) THEN                      ! received by sas in case of opa <-> sas coupling
1408         ssh_m(:,:) = frcv(jpr_ssh )%z3(:,:,1)
1409         CALL iom_put( 'ssh_m', ssh_m )
1410      ENDIF
1411      !                                                      ! ================== !
1412      !                                                      !  surface currents  !
1413      !                                                      ! ================== !
1414      IF( srcv(jpr_ocx1)%laction ) THEN                      ! received by sas in case of opa <-> sas coupling
1415         ssu_m(:,:) = frcv(jpr_ocx1)%z3(:,:,1)
[9872]1416         ub (:,:,1) = ssu_m(:,:)                             ! will be used in icestp in the call of ice_forcing_tau
[6165]1417         un (:,:,1) = ssu_m(:,:)                             ! will be used in sbc_cpl_snd if atmosphere coupling
[5407]1418         CALL iom_put( 'ssu_m', ssu_m )
1419      ENDIF
1420      IF( srcv(jpr_ocy1)%laction ) THEN
1421         ssv_m(:,:) = frcv(jpr_ocy1)%z3(:,:,1)
[9872]1422         vb (:,:,1) = ssv_m(:,:)                             ! will be used in icestp in the call of ice_forcing_tau
[6165]1423         vn (:,:,1) = ssv_m(:,:)                             ! will be used in sbc_cpl_snd if atmosphere coupling
[5407]1424         CALL iom_put( 'ssv_m', ssv_m )
1425      ENDIF
1426      !                                                      ! ======================== !
1427      !                                                      !  first T level thickness !
1428      !                                                      ! ======================== !
1429      IF( srcv(jpr_e3t1st )%laction ) THEN                   ! received by sas in case of opa <-> sas coupling
1430         e3t_m(:,:) = frcv(jpr_e3t1st )%z3(:,:,1)
1431         CALL iom_put( 'e3t_m', e3t_m(:,:) )
1432      ENDIF
1433      !                                                      ! ================================ !
1434      !                                                      !  fraction of solar net radiation !
1435      !                                                      ! ================================ !
1436      IF( srcv(jpr_fraqsr)%laction ) THEN                    ! received by sas in case of opa <-> sas coupling
1437         frq_m(:,:) = frcv(jpr_fraqsr)%z3(:,:,1)
1438         CALL iom_put( 'frq_m', frq_m )
1439      ENDIF
1440     
[1218]1441      !                                                      ! ========================= !
[5407]1442      IF( k_ice <= 1 .AND. MOD( kt-1, k_fsbc ) == 0 ) THEN   !  heat & freshwater fluxes ! (Ocean only case)
[1218]1443         !                                                   ! ========================= !
1444         !
[3625]1445         !                                                       ! total freshwater fluxes over the ocean (emp)
[5407]1446         IF( srcv(jpr_oemp)%laction .OR. srcv(jpr_rain)%laction ) THEN
1447            SELECT CASE( TRIM( sn_rcv_emp%cldes ) )                                    ! evaporation - precipitation
1448            CASE( 'conservative' )
1449               zemp(:,:) = frcv(jpr_tevp)%z3(:,:,1) - ( frcv(jpr_rain)%z3(:,:,1) + frcv(jpr_snow)%z3(:,:,1) )
1450            CASE( 'oce only', 'oce and ice' )
1451               zemp(:,:) = frcv(jpr_oemp)%z3(:,:,1)
1452            CASE default
1453               CALL ctl_stop( 'sbc_cpl_rcv: wrong definition of sn_rcv_emp%cldes' )
1454            END SELECT
1455         ELSE
1456            zemp(:,:) = 0._wp
1457         ENDIF
[1218]1458         !
1459         !                                                        ! runoffs and calving (added in emp)
[5407]1460         IF( srcv(jpr_rnf)%laction )     rnf(:,:) = frcv(jpr_rnf)%z3(:,:,1)
[11509]1461         IF( srcv(jpr_rnf_1d)%laction )   CALL cpl_rnf_1d_to_2d(frcv(jpr_rnf_1d)%z3(:,:,:))
[5407]1462         IF( srcv(jpr_cal)%laction )     zemp(:,:) = zemp(:,:) - frcv(jpr_cal)%z3(:,:,1)
[7788]1463 
1464         IF( srcv(jpr_icb)%laction )  THEN
1465             fwficb(:,:) = frcv(jpr_icb)%z3(:,:,1)
1466             rnf(:,:)    = rnf(:,:) + fwficb(:,:)   ! iceberg added to runfofs
1467         ENDIF
1468         IF( srcv(jpr_isf)%laction )  fwfisf(:,:) = - frcv(jpr_isf)%z3(:,:,1)  ! fresh water flux from the isf (fwfisf <0 mean melting) 
1469       
[5407]1470         IF( ln_mixcpl ) THEN   ;   emp(:,:) = emp(:,:) * xcplmask(:,:,0) + zemp(:,:) * zmsk(:,:)
1471         ELSE                   ;   emp(:,:) =                              zemp(:,:)
1472         ENDIF
[1218]1473         !
[3625]1474         !                                                       ! non solar heat flux over the ocean (qns)
[5407]1475         IF(      srcv(jpr_qnsoce)%laction ) THEN   ;   zqns(:,:) = frcv(jpr_qnsoce)%z3(:,:,1)
1476         ELSE IF( srcv(jpr_qnsmix)%laction ) THEN   ;   zqns(:,:) = frcv(jpr_qnsmix)%z3(:,:,1)
1477         ELSE                                       ;   zqns(:,:) = 0._wp
1478         END IF
[4990]1479         ! update qns over the free ocean with:
[5407]1480         IF( nn_components /= jp_iam_opa ) THEN
1481            zqns(:,:) =  zqns(:,:) - zemp(:,:) * sst_m(:,:) * rcp         ! remove heat content due to mass flux (assumed to be at SST)
1482            IF( srcv(jpr_snow  )%laction ) THEN
[9935]1483               zqns(:,:) = zqns(:,:) - frcv(jpr_snow)%z3(:,:,1) * rLfus   ! energy for melting solid precipitation over the free ocean
[5407]1484            ENDIF
[3625]1485         ENDIF
[7788]1486         !
[9935]1487         IF( srcv(jpr_icb)%laction )  zqns(:,:) = zqns(:,:) - frcv(jpr_icb)%z3(:,:,1) * rLfus ! remove heat content associated to iceberg melting
[7788]1488         !
[5407]1489         IF( ln_mixcpl ) THEN   ;   qns(:,:) = qns(:,:) * xcplmask(:,:,0) + zqns(:,:) * zmsk(:,:)
1490         ELSE                   ;   qns(:,:) =                              zqns(:,:)
1491         ENDIF
[3625]1492
1493         !                                                       ! solar flux over the ocean          (qsr)
[5407]1494         IF     ( srcv(jpr_qsroce)%laction ) THEN   ;   zqsr(:,:) = frcv(jpr_qsroce)%z3(:,:,1)
1495         ELSE IF( srcv(jpr_qsrmix)%laction ) then   ;   zqsr(:,:) = frcv(jpr_qsrmix)%z3(:,:,1)
1496         ELSE                                       ;   zqsr(:,:) = 0._wp
1497         ENDIF
1498         IF( ln_dm2dc .AND. ln_cpl )   zqsr(:,:) = sbc_dcy( zqsr )   ! modify qsr to include the diurnal cycle
1499         IF( ln_mixcpl ) THEN   ;   qsr(:,:) = qsr(:,:) * xcplmask(:,:,0) + zqsr(:,:) * zmsk(:,:)
1500         ELSE                   ;   qsr(:,:) =                              zqsr(:,:)
1501         ENDIF
[3625]1502         !
[5407]1503         ! salt flux over the ocean (received by opa in case of opa <-> sas coupling)
1504         IF( srcv(jpr_sflx )%laction )   sfx(:,:) = frcv(jpr_sflx  )%z3(:,:,1)
1505         ! Ice cover  (received by opa in case of opa <-> sas coupling)
1506         IF( srcv(jpr_fice )%laction )   fr_i(:,:) = frcv(jpr_fice )%z3(:,:,1)
1507         !
[1218]1508      ENDIF
1509      !
1510   END SUBROUTINE sbc_cpl_rcv
1511   
1512
1513   SUBROUTINE sbc_cpl_ice_tau( p_taui, p_tauj )     
1514      !!----------------------------------------------------------------------
1515      !!             ***  ROUTINE sbc_cpl_ice_tau  ***
1516      !!
1517      !! ** Purpose :   provide the stress over sea-ice in coupled mode
1518      !!
1519      !! ** Method  :   transform the received stress from the atmosphere into
1520      !!             an atmosphere-ice stress in the (i,j) ocean referencial
[9767]1521      !!             and at the velocity point of the sea-ice model:
[1218]1522      !!                'C'-grid : i- (j-) components given at U- (V-) point
1523      !!
1524      !!                The received stress are :
1525      !!                 - defined by 3 components (if cartesian coordinate)
1526      !!                        or by 2 components (if spherical)
1527      !!                 - oriented along geographical   coordinate (if eastward-northward)
1528      !!                        or  along the local grid coordinate (if local grid)
1529      !!                 - given at U- and V-point, resp.   if received on 2 grids
1530      !!                        or at a same point (T or I) if received on 1 grid
1531      !!                Therefore and if necessary, they are successively
1532      !!             processed in order to obtain them
1533      !!                 first  as  2 components on the sphere
1534      !!                 second as  2 components oriented along the local grid
[9767]1535      !!                 third  as  2 components on the ice grid point
[1218]1536      !!
[4148]1537      !!                Except in 'oce and ice' case, only one vector stress field
[1218]1538      !!             is received. It has already been processed in sbc_cpl_rcv
1539      !!             so that it is now defined as (i,j) components given at U-
[9767]1540      !!             and V-points, respectively. 
[1218]1541      !!
[9767]1542      !! ** Action  :   return ptau_i, ptau_j, the stress over the ice
[1218]1543      !!----------------------------------------------------------------------
[2715]1544      REAL(wp), INTENT(out), DIMENSION(:,:) ::   p_taui   ! i- & j-components of atmos-ice stress [N/m2]
1545      REAL(wp), INTENT(out), DIMENSION(:,:) ::   p_tauj   ! at I-point (B-grid) or U & V-point (C-grid)
1546      !!
[6140]1547      INTEGER ::   ji, jj   ! dummy loop indices
1548      INTEGER ::   itx      ! index of taux over ice
[9019]1549      REAL(wp), DIMENSION(jpi,jpj) ::   ztx, zty 
[1218]1550      !!----------------------------------------------------------------------
[3294]1551      !
[4990]1552      IF( srcv(jpr_itx1)%laction ) THEN   ;   itx =  jpr_itx1   
[1218]1553      ELSE                                ;   itx =  jpr_otx1
1554      ENDIF
1555
1556      ! do something only if we just received the stress from atmosphere
[1698]1557      IF(  nrcvinfo(itx) == OASIS_Rcv ) THEN
[4990]1558         !                                                      ! ======================= !
1559         IF( srcv(jpr_itx1)%laction ) THEN                      !   ice stress received   !
1560            !                                                   ! ======================= !
[1218]1561           
[3294]1562            IF( TRIM( sn_rcv_tau%clvref ) == 'cartesian' ) THEN            ! 2 components on the sphere
[1218]1563               !                                                       ! (cartesian to spherical -> 3 to 2 components)
[3294]1564               CALL geo2oce(  frcv(jpr_itx1)%z3(:,:,1), frcv(jpr_ity1)%z3(:,:,1), frcv(jpr_itz1)%z3(:,:,1),   &
[1218]1565                  &          srcv(jpr_itx1)%clgrid, ztx, zty )
[3294]1566               frcv(jpr_itx1)%z3(:,:,1) = ztx(:,:)   ! overwrite 1st comp. on the 1st grid
1567               frcv(jpr_ity1)%z3(:,:,1) = zty(:,:)   ! overwrite 2nd comp. on the 1st grid
[1218]1568               !
1569               IF( srcv(jpr_itx2)%laction ) THEN
[3294]1570                  CALL geo2oce( frcv(jpr_itx2)%z3(:,:,1), frcv(jpr_ity2)%z3(:,:,1), frcv(jpr_itz2)%z3(:,:,1),   &
[1218]1571                     &          srcv(jpr_itx2)%clgrid, ztx, zty )
[3294]1572                  frcv(jpr_itx2)%z3(:,:,1) = ztx(:,:)   ! overwrite 1st comp. on the 2nd grid
1573                  frcv(jpr_ity2)%z3(:,:,1) = zty(:,:)   ! overwrite 2nd comp. on the 2nd grid
[1218]1574               ENDIF
1575               !
[888]1576            ENDIF
[1218]1577            !
[3294]1578            IF( TRIM( sn_rcv_tau%clvor ) == 'eastward-northward' ) THEN   ! 2 components oriented along the local grid
[1218]1579               !                                                       ! (geographical to local grid -> rotate the components)
[3294]1580               CALL rot_rep( frcv(jpr_itx1)%z3(:,:,1), frcv(jpr_ity1)%z3(:,:,1), srcv(jpr_itx1)%clgrid, 'en->i', ztx )   
[1218]1581               IF( srcv(jpr_itx2)%laction ) THEN
[3294]1582                  CALL rot_rep( frcv(jpr_itx2)%z3(:,:,1), frcv(jpr_ity2)%z3(:,:,1), srcv(jpr_itx2)%clgrid, 'en->j', zty )   
[1218]1583               ELSE
[3294]1584                  CALL rot_rep( frcv(jpr_itx1)%z3(:,:,1), frcv(jpr_ity1)%z3(:,:,1), srcv(jpr_itx1)%clgrid, 'en->j', zty ) 
[1218]1585               ENDIF
[3632]1586               frcv(jpr_itx1)%z3(:,:,1) = ztx(:,:)      ! overwrite 1st component on the 1st grid
[3294]1587               frcv(jpr_ity1)%z3(:,:,1) = zty(:,:)      ! overwrite 2nd component on the 1st grid
[1218]1588            ENDIF
1589            !                                                   ! ======================= !
1590         ELSE                                                   !     use ocean stress    !
1591            !                                                   ! ======================= !
[3294]1592            frcv(jpr_itx1)%z3(:,:,1) = frcv(jpr_otx1)%z3(:,:,1)
1593            frcv(jpr_ity1)%z3(:,:,1) = frcv(jpr_oty1)%z3(:,:,1)
[1218]1594            !
1595         ENDIF
1596         !                                                      ! ======================= !
1597         !                                                      !     put on ice grid     !
1598         !                                                      ! ======================= !
1599         !   
1600         !                                                  j+1   j     -----V---F
[9767]1601         ! ice stress on ice velocity point                              !       |
1602         ! (C-grid ==>(U,V))                                      j      |   T   U
[1218]1603         !                                                               |       |
1604         !                                                   j    j-1   -I-------|
1605         !                                               (for I)         |       |
1606         !                                                              i-1  i   i
1607         !                                                               i      i+1 (for I)
[9767]1608         SELECT CASE ( srcv(jpr_itx1)%clgrid )
1609         CASE( 'U' )
1610            p_taui(:,:) = frcv(jpr_itx1)%z3(:,:,1)                   ! (U,V) ==> (U,V)
1611            p_tauj(:,:) = frcv(jpr_ity1)%z3(:,:,1)
1612         CASE( 'F' )
1613            DO jj = 2, jpjm1                                   ! F ==> (U,V)
1614               DO ji = fs_2, fs_jpim1   ! vector opt.
1615                  p_taui(ji,jj) = 0.5 * ( frcv(jpr_itx1)%z3(ji,jj,1) + frcv(jpr_itx1)%z3(ji  ,jj-1,1) )
1616                  p_tauj(ji,jj) = 0.5 * ( frcv(jpr_ity1)%z3(ji,jj,1) + frcv(jpr_ity1)%z3(ji-1,jj  ,1) )
[1218]1617               END DO
[9767]1618            END DO
1619         CASE( 'T' )
1620            DO jj = 2, jpjm1                                   ! T ==> (U,V)
1621               DO ji = fs_2, fs_jpim1   ! vector opt.
1622                  p_taui(ji,jj) = 0.5 * ( frcv(jpr_itx1)%z3(ji+1,jj  ,1) + frcv(jpr_itx1)%z3(ji,jj,1) )
1623                  p_tauj(ji,jj) = 0.5 * ( frcv(jpr_ity1)%z3(ji  ,jj+1,1) + frcv(jpr_ity1)%z3(ji,jj,1) )
[1218]1624               END DO
[9767]1625            END DO
1626         CASE( 'I' )
1627            DO jj = 2, jpjm1                                   ! I ==> (U,V)
1628               DO ji = 2, jpim1   ! NO vector opt.
1629                  p_taui(ji,jj) = 0.5 * ( frcv(jpr_itx1)%z3(ji+1,jj+1,1) + frcv(jpr_itx1)%z3(ji+1,jj  ,1) )
1630                  p_tauj(ji,jj) = 0.5 * ( frcv(jpr_ity1)%z3(ji+1,jj+1,1) + frcv(jpr_ity1)%z3(ji  ,jj+1,1) )
[1218]1631               END DO
[9767]1632            END DO
[1218]1633         END SELECT
[9767]1634         IF( srcv(jpr_itx1)%clgrid /= 'U' ) THEN
[10425]1635            CALL lbc_lnk_multi( 'sbccpl', p_taui, 'U',  -1., p_tauj, 'V',  -1. )
[9767]1636         ENDIF
1637         
[1218]1638      ENDIF
[3294]1639      !
[1218]1640   END SUBROUTINE sbc_cpl_ice_tau
1641   
1642
[9019]1643   SUBROUTINE sbc_cpl_ice_flx( picefr, palbi, psst, pist, phs, phi )
[1218]1644      !!----------------------------------------------------------------------
[3294]1645      !!             ***  ROUTINE sbc_cpl_ice_flx  ***
[1218]1646      !!
[6722]1647      !! ** Purpose :   provide the heat and freshwater fluxes of the ocean-ice system
[1218]1648      !!
1649      !! ** Method  :   transform the fields received from the atmosphere into
1650      !!             surface heat and fresh water boundary condition for the
1651      !!             ice-ocean system. The following fields are provided:
[6722]1652      !!               * total non solar, solar and freshwater fluxes (qns_tot,
[1218]1653      !!             qsr_tot and emp_tot) (total means weighted ice-ocean flux)
1654      !!             NB: emp_tot include runoffs and calving.
[6722]1655      !!               * fluxes over ice (qns_ice, qsr_ice, emp_ice) where
[1218]1656      !!             emp_ice = sublimation - solid precipitation as liquid
1657      !!             precipitation are re-routed directly to the ocean and
[6722]1658      !!             calving directly enter the ocean (runoffs are read but included in trasbc.F90)
1659      !!               * solid precipitation (sprecip), used to add to qns_tot
[1218]1660      !!             the heat lost associated to melting solid precipitation
1661      !!             over the ocean fraction.
[6722]1662      !!               * heat content of rain, snow and evap can also be provided,
1663      !!             otherwise heat flux associated with these mass flux are
1664      !!             guessed (qemp_oce, qemp_ice)
[1218]1665      !!
[6722]1666      !!             - the fluxes have been separated from the stress as
1667      !!               (a) they are updated at each ice time step compare to
1668      !!               an update at each coupled time step for the stress, and
1669      !!               (b) the conservative computation of the fluxes over the
1670      !!               sea-ice area requires the knowledge of the ice fraction
1671      !!               after the ice advection and before the ice thermodynamics,
1672      !!               so that the stress is updated before the ice dynamics
1673      !!               while the fluxes are updated after it.
[1218]1674      !!
[6722]1675      !! ** Details
[9019]1676      !!             qns_tot = (1-a) * qns_oce + a * qns_ice               => provided
[6722]1677      !!                     + qemp_oce + qemp_ice                         => recalculated and added up to qns
1678      !!
[9019]1679      !!             qsr_tot = (1-a) * qsr_oce + a * qsr_ice               => provided
[6722]1680      !!
[7968]1681      !!             emp_tot = emp_oce + emp_ice                           => calving is provided and added to emp_tot (and emp_oce).
1682      !!                                                                      runoff (which includes rivers+icebergs) and iceshelf
1683      !!                                                                      are provided but not included in emp here. Only runoff will
1684      !!                                                                      be included in emp in other parts of NEMO code
[1218]1685      !! ** Action  :   update at each nf_ice time step:
[3294]1686      !!                   qns_tot, qsr_tot  non-solar and solar total heat fluxes
1687      !!                   qns_ice, qsr_ice  non-solar and solar heat fluxes over the ice
[6722]1688      !!                   emp_tot           total evaporation - precipitation(liquid and solid) (-calving)
1689      !!                   emp_ice           ice sublimation - solid precipitation over the ice
1690      !!                   dqns_ice          d(non-solar heat flux)/d(Temperature) over the ice
1691      !!                   sprecip           solid precipitation over the ocean 
[1218]1692      !!----------------------------------------------------------------------
[9019]1693      REAL(wp), INTENT(in), DIMENSION(:,:)             ::   picefr     ! ice fraction                [0 to 1]
1694      !                                                !!           ! optional arguments, used only in 'mixed oce-ice' case
1695      REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL ::   palbi      ! all skies ice albedo
1696      REAL(wp), INTENT(in), DIMENSION(:,:  ), OPTIONAL ::   psst       ! sea surface temperature     [Celsius]
1697      REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL ::   pist       ! ice surface temperature     [Kelvin]
1698      REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL ::   phs        ! snow depth                  [m]
1699      REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL ::   phi        ! ice thickness               [m]
[3294]1700      !
[9019]1701      INTEGER  ::   ji, jj, jl   ! dummy loop index
1702      REAL(wp) ::   ztri         ! local scalar
1703      REAL(wp), DIMENSION(jpi,jpj)     ::   zcptn, zcptrain, zcptsnw, ziceld, zmsk, zsnw
1704      REAL(wp), DIMENSION(jpi,jpj)     ::   zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip  , zevap_oce, zdevap_ice
1705      REAL(wp), DIMENSION(jpi,jpj)     ::   zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice
1706      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice, zevap_ice    !!gm , zfrqsr_tr_i
[1218]1707      !!----------------------------------------------------------------------
[3294]1708      !
[5407]1709      IF( ln_mixcpl )   zmsk(:,:) = 1. - xcplmask(:,:,0)
[9019]1710      ziceld(:,:) = 1._wp - picefr(:,:)
1711      zcptn (:,:) = rcp * sst_m(:,:)
[888]1712      !
[1218]1713      !                                                      ! ========================= !
[6722]1714      !                                                      !    freshwater budget      !   (emp_tot)
[1218]1715      !                                                      ! ========================= !
[888]1716      !
[6722]1717      !                                                           ! solid Precipitation                                (sprecip)
1718      !                                                           ! liquid + solid Precipitation                       (tprecip)
1719      !                                                           ! total Evaporation - total Precipitation            (emp_tot)
1720      !                                                           ! sublimation - solid precipitation (cell average)   (emp_ice)
[3294]1721      SELECT CASE( TRIM( sn_rcv_emp%cldes ) )
[6722]1722      CASE( 'conservative' )   ! received fields: jpr_rain, jpr_snow, jpr_ievp, jpr_tevp
1723         zsprecip(:,:) =   frcv(jpr_snow)%z3(:,:,1)                  ! May need to ensure positive here
1724         ztprecip(:,:) =   frcv(jpr_rain)%z3(:,:,1) + zsprecip(:,:)  ! May need to ensure positive here
1725         zemp_tot(:,:) =   frcv(jpr_tevp)%z3(:,:,1) - ztprecip(:,:)
[9019]1726         zemp_ice(:,:) = ( frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_snow)%z3(:,:,1) ) * picefr(:,:)
[7761]1727      CASE( 'oce and ice'   )   ! received fields: jpr_sbpr, jpr_semp, jpr_oemp, jpr_ievp
[9019]1728         zemp_tot(:,:) = ziceld(:,:) * frcv(jpr_oemp)%z3(:,:,1) + picefr(:,:) * frcv(jpr_sbpr)%z3(:,:,1)
1729         zemp_ice(:,:) = frcv(jpr_semp)%z3(:,:,1) * picefr(:,:)
[5407]1730         zsprecip(:,:) = frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_semp)%z3(:,:,1)
1731         ztprecip(:,:) = frcv(jpr_semp)%z3(:,:,1) - frcv(jpr_sbpr)%z3(:,:,1) + zsprecip(:,:)
[10404]1732      CASE( 'none'      )       ! Not available as for now: needs additional coding below when computing zevap_oce
1733      !                         ! since fields received are not defined with none option
1734         CALL ctl_stop( 'STOP', 'sbccpl/sbc_cpl_ice_flx: some fields are not defined. Change sn_rcv_emp value in namelist namsbc_cpl' )
[1218]1735      END SELECT
[6722]1736
[9570]1737#if defined key_si3
[9019]1738      ! zsnw = snow fraction over ice after wind blowing (=picefr if no blowing)
1739      zsnw(:,:) = 0._wp   ;   CALL ice_thd_snwblow( ziceld, zsnw )
[6416]1740     
[6722]1741      ! --- evaporation minus precipitation corrected (because of wind blowing on snow) --- !
[9019]1742      zemp_ice(:,:) = zemp_ice(:,:) + zsprecip(:,:) * ( picefr(:,:) - zsnw(:,:) )  ! emp_ice = A * sublimation - zsnw * sprecip
[6722]1743      zemp_oce(:,:) = zemp_tot(:,:) - zemp_ice(:,:)                                ! emp_oce = emp_tot - emp_ice
[6711]1744
[6722]1745      ! --- evaporation over ocean (used later for qemp) --- !
[9019]1746      zevap_oce(:,:) = frcv(jpr_tevp)%z3(:,:,1) - frcv(jpr_ievp)%z3(:,:,1) * picefr(:,:)
[6722]1747
[6711]1748      ! --- evaporation over ice (kg/m2/s) --- !
[9019]1749      DO jl=1,jpl
1750         IF (sn_rcv_emp%clcat == 'yes') THEN   ;   zevap_ice(:,:,jl) = frcv(jpr_ievp)%z3(:,:,jl)
1751         ELSE                                  ;   zevap_ice(:,:,jl) = frcv(jpr_ievp)%z3(:,:,1 )   ;   ENDIF
1752      ENDDO
1753
[6416]1754      ! since the sensitivity of evap to temperature (devap/dT) is not prescribed by the atmosphere, we set it to 0
[7968]1755      ! therefore, sublimation is not redistributed over the ice categories when no subgrid scale fluxes are provided by atm.
[6416]1756      zdevap_ice(:,:) = 0._wp
1757     
[7968]1758      ! --- Continental fluxes --- !
1759      IF( srcv(jpr_rnf)%laction ) THEN   ! runoffs (included in emp later on)
1760         rnf(:,:) = frcv(jpr_rnf)%z3(:,:,1)
1761      ENDIF
[11509]1762      IF( srcv(jpr_rnf_1d)%laction )   CALL cpl_rnf_1d_to_2d(frcv(jpr_rnf_1d)%z3(:,:,:))
[7968]1763      IF( srcv(jpr_cal)%laction ) THEN   ! calving (put in emp_tot and emp_oce)
[5407]1764         zemp_tot(:,:) = zemp_tot(:,:) - frcv(jpr_cal)%z3(:,:,1)
[6711]1765         zemp_oce(:,:) = zemp_oce(:,:) - frcv(jpr_cal)%z3(:,:,1)
[1756]1766      ENDIF
[7968]1767      IF( srcv(jpr_icb)%laction ) THEN   ! iceberg added to runoffs
[7788]1768         fwficb(:,:) = frcv(jpr_icb)%z3(:,:,1)
[7968]1769         rnf(:,:)    = rnf(:,:) + fwficb(:,:)
[7788]1770      ENDIF
[7968]1771      IF( srcv(jpr_isf)%laction ) THEN   ! iceshelf (fwfisf <0 mean melting)
1772        fwfisf(:,:) = - frcv(jpr_isf)%z3(:,:,1) 
[7788]1773      ENDIF
1774
[5407]1775      IF( ln_mixcpl ) THEN
1776         emp_tot(:,:) = emp_tot(:,:) * xcplmask(:,:,0) + zemp_tot(:,:) * zmsk(:,:)
1777         emp_ice(:,:) = emp_ice(:,:) * xcplmask(:,:,0) + zemp_ice(:,:) * zmsk(:,:)
[6416]1778         emp_oce(:,:) = emp_oce(:,:) * xcplmask(:,:,0) + zemp_oce(:,:) * zmsk(:,:)
[5407]1779         sprecip(:,:) = sprecip(:,:) * xcplmask(:,:,0) + zsprecip(:,:) * zmsk(:,:)
1780         tprecip(:,:) = tprecip(:,:) * xcplmask(:,:,0) + ztprecip(:,:) * zmsk(:,:)
[9019]1781         DO jl = 1, jpl
1782            evap_ice (:,:,jl) = evap_ice (:,:,jl) * xcplmask(:,:,0) + zevap_ice (:,:,jl) * zmsk(:,:)
1783            devap_ice(:,:,jl) = devap_ice(:,:,jl) * xcplmask(:,:,0) + zdevap_ice(:,:)    * zmsk(:,:)
1784         END DO
[5407]1785      ELSE
[9019]1786         emp_tot (:,:)   = zemp_tot (:,:)
1787         emp_ice (:,:)   = zemp_ice (:,:)
1788         emp_oce (:,:)   = zemp_oce (:,:)     
1789         sprecip (:,:)   = zsprecip (:,:)
1790         tprecip (:,:)   = ztprecip (:,:)
1791         evap_ice(:,:,:) = zevap_ice(:,:,:)
1792         DO jl = 1, jpl
[6416]1793            devap_ice(:,:,jl) = zdevap_ice(:,:)
[9019]1794         END DO
[6416]1795      ENDIF
[6722]1796
[6416]1797#else
[9019]1798      zsnw(:,:) = picefr(:,:)
[7968]1799      ! --- Continental fluxes --- !
1800      IF( srcv(jpr_rnf)%laction ) THEN   ! runoffs (included in emp later on)
1801         rnf(:,:) = frcv(jpr_rnf)%z3(:,:,1)
1802      ENDIF
[11509]1803      IF( srcv(jpr_rnf_1d)%laction )   CALL cpl_rnf_1d_to_2d(frcv(jpr_rnf_1d)%z3(:,:,:))
[7968]1804      IF( srcv(jpr_cal)%laction ) THEN   ! calving (put in emp_tot)
[6416]1805         zemp_tot(:,:) = zemp_tot(:,:) - frcv(jpr_cal)%z3(:,:,1)
1806      ENDIF
[7968]1807      IF( srcv(jpr_icb)%laction ) THEN   ! iceberg added to runoffs
[7788]1808         fwficb(:,:) = frcv(jpr_icb)%z3(:,:,1)
[7968]1809         rnf(:,:)    = rnf(:,:) + fwficb(:,:)
[7788]1810      ENDIF
[7968]1811      IF( srcv(jpr_isf)%laction ) THEN   ! iceshelf (fwfisf <0 mean melting)
1812        fwfisf(:,:) = - frcv(jpr_isf)%z3(:,:,1)
[7788]1813      ENDIF
[9019]1814      !
[6416]1815      IF( ln_mixcpl ) THEN
1816         emp_tot(:,:) = emp_tot(:,:) * xcplmask(:,:,0) + zemp_tot(:,:) * zmsk(:,:)
1817         emp_ice(:,:) = emp_ice(:,:) * xcplmask(:,:,0) + zemp_ice(:,:) * zmsk(:,:)
1818         sprecip(:,:) = sprecip(:,:) * xcplmask(:,:,0) + zsprecip(:,:) * zmsk(:,:)
1819         tprecip(:,:) = tprecip(:,:) * xcplmask(:,:,0) + ztprecip(:,:) * zmsk(:,:)
1820      ELSE
[5407]1821         emp_tot(:,:) =                                  zemp_tot(:,:)
1822         emp_ice(:,:) =                                  zemp_ice(:,:)
1823         sprecip(:,:) =                                  zsprecip(:,:)
1824         tprecip(:,:) =                                  ztprecip(:,:)
1825      ENDIF
[9019]1826      !
1827#endif
[5407]1828
[7968]1829      ! outputs
1830!!      IF( srcv(jpr_rnf)%laction )   CALL iom_put( 'runoffs' , rnf(:,:) * tmask(:,:,1)                                 )  ! runoff
1831!!      IF( srcv(jpr_isf)%laction )   CALL iom_put( 'iceshelf_cea', -fwfisf(:,:) * tmask(:,:,1)                         )  ! iceshelf
1832      IF( srcv(jpr_cal)%laction )   CALL iom_put( 'calving_cea' , frcv(jpr_cal)%z3(:,:,1) * tmask(:,:,1)                )  ! calving
1833      IF( srcv(jpr_icb)%laction )   CALL iom_put( 'iceberg_cea' , frcv(jpr_icb)%z3(:,:,1) * tmask(:,:,1)                )  ! icebergs
1834      IF( iom_use('snowpre') )      CALL iom_put( 'snowpre'     , sprecip(:,:)                                          )  ! Snow
1835      IF( iom_use('precip') )       CALL iom_put( 'precip'      , tprecip(:,:)                                          )  ! total  precipitation
1836      IF( iom_use('rain') )         CALL iom_put( 'rain'        , tprecip(:,:) - sprecip(:,:)                           )  ! liquid precipitation
1837      IF( iom_use('snow_ao_cea') )  CALL iom_put( 'snow_ao_cea' , sprecip(:,:) * ( 1._wp - zsnw(:,:) )                  )  ! Snow over ice-free ocean  (cell average)
1838      IF( iom_use('snow_ai_cea') )  CALL iom_put( 'snow_ai_cea' , sprecip(:,:) *           zsnw(:,:)                    )  ! Snow over sea-ice         (cell average)
[9019]1839      IF( iom_use('subl_ai_cea') )  CALL iom_put( 'subl_ai_cea' , frcv(jpr_ievp)%z3(:,:,1) * picefr(:,:) * tmask(:,:,1) )  ! Sublimation over sea-ice (cell average)
[7968]1840      IF( iom_use('evap_ao_cea') )  CALL iom_put( 'evap_ao_cea' , ( frcv(jpr_tevp)%z3(:,:,1)  &
[9019]1841         &                                                        - frcv(jpr_ievp)%z3(:,:,1) * picefr(:,:) ) * tmask(:,:,1) )  ! ice-free oce evap (cell average)
[7968]1842      ! note: runoff output is done in sbcrnf (which includes icebergs too) and iceshelf output is done in sbcisf
1843      !
[1218]1844      !                                                      ! ========================= !
[3294]1845      SELECT CASE( TRIM( sn_rcv_qns%cldes ) )                !   non solar heat fluxes   !   (qns)
[1218]1846      !                                                      ! ========================= !
[6722]1847      CASE( 'oce only' )         ! the required field is directly provided
1848         zqns_tot(:,:) = frcv(jpr_qnsoce)%z3(:,:,1)
1849      CASE( 'conservative' )     ! the required fields are directly provided
1850         zqns_tot(:,:) = frcv(jpr_qnsmix)%z3(:,:,1)
[3294]1851         IF ( TRIM(sn_rcv_qns%clcat) == 'yes' ) THEN
[5407]1852            zqns_ice(:,:,1:jpl) = frcv(jpr_qnsice)%z3(:,:,1:jpl)
[3294]1853         ELSE
[9019]1854            DO jl = 1, jpl
[6722]1855               zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) ! Set all category values equal
[9019]1856            END DO
[3294]1857         ENDIF
[6722]1858      CASE( 'oce and ice' )      ! the total flux is computed from ocean and ice fluxes
[9019]1859         zqns_tot(:,:) =  ziceld(:,:) * frcv(jpr_qnsoce)%z3(:,:,1)
[3294]1860         IF ( TRIM(sn_rcv_qns%clcat) == 'yes' ) THEN
1861            DO jl=1,jpl
[5407]1862               zqns_tot(:,:   ) = zqns_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qnsice)%z3(:,:,jl)   
1863               zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,jl)
[3294]1864            ENDDO
1865         ELSE
[9019]1866            qns_tot(:,:) = qns_tot(:,:) + picefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1)
1867            DO jl = 1, jpl
1868               zqns_tot(:,:   ) = zqns_tot(:,:) + picefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1)
[5407]1869               zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1)
[9019]1870            END DO
[3294]1871         ENDIF
[6722]1872      CASE( 'mixed oce-ice' )    ! the ice flux is cumputed from the total flux, the SST and ice informations
[3294]1873! ** NEED TO SORT OUT HOW THIS SHOULD WORK IN THE MULTI-CATEGORY CASE - CURRENTLY NOT ALLOWED WHEN INTERFACE INITIALISED **
[5407]1874         zqns_tot(:,:  ) = frcv(jpr_qnsmix)%z3(:,:,1)
1875         zqns_ice(:,:,1) = frcv(jpr_qnsmix)%z3(:,:,1)    &
[9019]1876            &            + frcv(jpr_dqnsdt)%z3(:,:,1) * ( pist(:,:,1) - ( (rt0 + psst(:,:  ) ) * ziceld(:,:)   &
1877            &                                           + pist(:,:,1) * picefr(:,:) ) )
[1218]1878      END SELECT
[1860]1879      !                                     
[7968]1880      ! --- calving (removed from qns_tot) --- !
[9935]1881      IF( srcv(jpr_cal)%laction )   zqns_tot(:,:) = zqns_tot(:,:) - frcv(jpr_cal)%z3(:,:,1) * rLfus  ! remove latent heat of calving
1882                                                                                                     ! we suppose it melts at 0deg, though it should be temp. of surrounding ocean
[7968]1883      ! --- iceberg (removed from qns_tot) --- !
[9935]1884      IF( srcv(jpr_icb)%laction )   zqns_tot(:,:) = zqns_tot(:,:) - frcv(jpr_icb)%z3(:,:,1) * rLfus  ! remove latent heat of iceberg melting
[1218]1885
[9570]1886#if defined key_si3     
[5407]1887      ! --- non solar flux over ocean --- !
[9019]1888      !         note: ziceld cannot be = 0 since we limit the ice concentration to amax
[5407]1889      zqns_oce = 0._wp
[9019]1890      WHERE( ziceld /= 0._wp )   zqns_oce(:,:) = ( zqns_tot(:,:) - SUM( a_i * zqns_ice, dim=3 ) ) / ziceld(:,:)
[5407]1891
[7813]1892      ! Heat content per unit mass of snow (J/kg)
[9935]1893      WHERE( SUM( a_i, dim=3 ) > 1.e-10 )   ;   zcptsnw(:,:) = rcpi * SUM( (tn_ice - rt0) * a_i, dim=3 ) / SUM( a_i, dim=3 )
[7813]1894      ELSEWHERE                             ;   zcptsnw(:,:) = zcptn(:,:)
1895      ENDWHERE
1896      ! Heat content per unit mass of rain (J/kg)
[9019]1897      zcptrain(:,:) = rcp * ( SUM( (tn_ice(:,:,:) - rt0) * a_i(:,:,:), dim=3 ) + sst_m(:,:) * ziceld(:,:) ) 
[7813]1898
[6722]1899      ! --- enthalpy of snow precip over ice in J/m3 (to be used in 1D-thermo) --- !
[9935]1900      zqprec_ice(:,:) = rhos * ( zcptsnw(:,:) - rLfus )
[5407]1901
[6416]1902      ! --- heat content of evap over ice in W/m2 (to be used in 1D-thermo) --- !
1903      DO jl = 1, jpl
[9935]1904         zqevap_ice(:,:,jl) = 0._wp ! should be -evap * ( ( Tice - rt0 ) * rcpi ) but atm. does not take it into account
[6416]1905      END DO
[5407]1906
[7813]1907      ! --- heat flux associated with emp (W/m2) --- !
1908      zqemp_oce(:,:) = -  zevap_oce(:,:)                                      *   zcptn   (:,:)   &        ! evap
1909         &             + ( ztprecip(:,:) - zsprecip(:,:) )                    *   zcptrain(:,:)   &        ! liquid precip
[9935]1910         &             +   zsprecip(:,:)                   * ( 1._wp - zsnw ) * ( zcptsnw (:,:) - rLfus )  ! solid precip over ocean + snow melting
1911      zqemp_ice(:,:) =     zsprecip(:,:)                   * zsnw             * ( zcptsnw (:,:) - rLfus )  ! solid precip over ice (qevap_ice=0 since atm. does not take it into account)
[9019]1912!!    zqemp_ice(:,:) = -   frcv(jpr_ievp)%z3(:,:,1)        * picefr(:,:)      *   zcptsnw (:,:)   &        ! ice evap
[9935]1913!!       &             +   zsprecip(:,:)                   * zsnw             * zqprec_ice(:,:) * r1_rhos  ! solid precip over ice
[7813]1914     
[6416]1915      ! --- total non solar flux (including evap/precip) --- !
1916      zqns_tot(:,:) = zqns_tot(:,:) + zqemp_ice(:,:) + zqemp_oce(:,:)
1917
[5407]1918      ! --- in case both coupled/forced are active, we must mix values --- !
1919      IF( ln_mixcpl ) THEN
1920         qns_tot(:,:) = qns_tot(:,:) * xcplmask(:,:,0) + zqns_tot(:,:)* zmsk(:,:)
1921         qns_oce(:,:) = qns_oce(:,:) * xcplmask(:,:,0) + zqns_oce(:,:)* zmsk(:,:)
1922         DO jl=1,jpl
[6416]1923            qns_ice  (:,:,jl) = qns_ice  (:,:,jl) * xcplmask(:,:,0) +  zqns_ice  (:,:,jl)* zmsk(:,:)
1924            qevap_ice(:,:,jl) = qevap_ice(:,:,jl) * xcplmask(:,:,0) +  zqevap_ice(:,:,jl)* zmsk(:,:)
[5407]1925         ENDDO
1926         qprec_ice(:,:) = qprec_ice(:,:) * xcplmask(:,:,0) + zqprec_ice(:,:)* zmsk(:,:)
1927         qemp_oce (:,:) =  qemp_oce(:,:) * xcplmask(:,:,0) +  zqemp_oce(:,:)* zmsk(:,:)
[6416]1928         qemp_ice (:,:) =  qemp_ice(:,:) * xcplmask(:,:,0) +  zqemp_ice(:,:)* zmsk(:,:)
[5407]1929      ELSE
1930         qns_tot  (:,:  ) = zqns_tot  (:,:  )
1931         qns_oce  (:,:  ) = zqns_oce  (:,:  )
1932         qns_ice  (:,:,:) = zqns_ice  (:,:,:)
[6416]1933         qevap_ice(:,:,:) = zqevap_ice(:,:,:)
1934         qprec_ice(:,:  ) = zqprec_ice(:,:  )
1935         qemp_oce (:,:  ) = zqemp_oce (:,:  )
1936         qemp_ice (:,:  ) = zqemp_ice (:,:  )
[5407]1937      ENDIF
[6722]1938
[5407]1939#else
[7968]1940      zcptsnw (:,:) = zcptn(:,:)
1941      zcptrain(:,:) = zcptn(:,:)
1942     
[6722]1943      ! clem: this formulation is certainly wrong... but better than it was...
[9935]1944      zqns_tot(:,:) = zqns_tot(:,:)                             &          ! zqns_tot update over free ocean with:
1945         &          - (  ziceld(:,:) * zsprecip(:,:) * rLfus )  &          ! remove the latent heat flux of solid precip. melting
1946         &          - (  zemp_tot(:,:)                          &          ! remove the heat content of mass flux (assumed to be at SST)
[6722]1947         &             - zemp_ice(:,:) ) * zcptn(:,:) 
[5407]1948
1949     IF( ln_mixcpl ) THEN
[9019]1950         qns_tot(:,:) = qns(:,:) * ziceld(:,:) + SUM( qns_ice(:,:,:) * a_i(:,:,:), dim=3 )   ! total flux from blk
[5407]1951         qns_tot(:,:) = qns_tot(:,:) * xcplmask(:,:,0) +  zqns_tot(:,:)* zmsk(:,:)
1952         DO jl=1,jpl
1953            qns_ice(:,:,jl) = qns_ice(:,:,jl) * xcplmask(:,:,0) +  zqns_ice(:,:,jl)* zmsk(:,:)
1954         ENDDO
1955      ELSE
1956         qns_tot(:,:  ) = zqns_tot(:,:  )
1957         qns_ice(:,:,:) = zqns_ice(:,:,:)
1958      ENDIF
[7968]1959
[5407]1960#endif
[7968]1961      ! outputs
[9935]1962      IF ( srcv(jpr_cal)%laction       ) CALL iom_put('hflx_cal_cea'    , - frcv(jpr_cal)%z3(:,:,1) * rLfus )                      ! latent heat from calving
1963      IF ( srcv(jpr_icb)%laction       ) CALL iom_put('hflx_icb_cea'    , - frcv(jpr_icb)%z3(:,:,1) * rLfus )                      ! latent heat from icebergs melting
[9119]1964      IF ( iom_use('hflx_rain_cea')    ) CALL iom_put('hflx_rain_cea'   , ( tprecip(:,:) - sprecip(:,:) ) * zcptrain(:,:) )        ! heat flux from rain (cell average)
1965      IF ( iom_use('hflx_evap_cea')    ) CALL iom_put('hflx_evap_cea'   , ( frcv(jpr_tevp)%z3(:,:,1) - frcv(jpr_ievp)%z3(:,:,1) &
1966           &                                                              * picefr(:,:) ) * zcptn(:,:) * tmask(:,:,1) )            ! heat flux from evap (cell average)
[9935]1967      IF ( iom_use('hflx_snow_cea')    ) CALL iom_put('hflx_snow_cea'   , sprecip(:,:) * ( zcptsnw(:,:) - rLfus )  )               ! heat flux from snow (cell average)
1968      IF ( iom_use('hflx_snow_ao_cea') ) CALL iom_put('hflx_snow_ao_cea', sprecip(:,:) * ( zcptsnw(:,:) - rLfus ) &
[9119]1969           &                                                              * ( 1._wp - zsnw(:,:) )                  )               ! heat flux from snow (over ocean)
[9935]1970      IF ( iom_use('hflx_snow_ai_cea') ) CALL iom_put('hflx_snow_ai_cea', sprecip(:,:) * ( zcptsnw(:,:) - rLfus ) & 
[9119]1971           &                                                              *           zsnw(:,:)                    )               ! heat flux from snow (over ice)
[7968]1972      ! note: hflx for runoff and iceshelf are done in sbcrnf and sbcisf resp.
1973      !
[1218]1974      !                                                      ! ========================= !
[3294]1975      SELECT CASE( TRIM( sn_rcv_qsr%cldes ) )                !      solar heat fluxes    !   (qsr)
[1218]1976      !                                                      ! ========================= !
[3294]1977      CASE( 'oce only' )
[5407]1978         zqsr_tot(:,:  ) = MAX( 0._wp , frcv(jpr_qsroce)%z3(:,:,1) )
[1218]1979      CASE( 'conservative' )
[5407]1980         zqsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1)
[3294]1981         IF ( TRIM(sn_rcv_qsr%clcat) == 'yes' ) THEN
[5407]1982            zqsr_ice(:,:,1:jpl) = frcv(jpr_qsrice)%z3(:,:,1:jpl)
[3294]1983         ELSE
1984            ! Set all category values equal for the moment
[9019]1985            DO jl = 1, jpl
[5407]1986               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1)
[9019]1987            END DO
[3294]1988         ENDIF
[5407]1989         zqsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1)
1990         zqsr_ice(:,:,1) = frcv(jpr_qsrice)%z3(:,:,1)
[1218]1991      CASE( 'oce and ice' )
[9019]1992         zqsr_tot(:,:  ) =  ziceld(:,:) * frcv(jpr_qsroce)%z3(:,:,1)
[3294]1993         IF ( TRIM(sn_rcv_qsr%clcat) == 'yes' ) THEN
[9019]1994            DO jl = 1, jpl
[5407]1995               zqsr_tot(:,:   ) = zqsr_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qsrice)%z3(:,:,jl)   
1996               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,jl)
[9019]1997            END DO
[3294]1998         ELSE
[9019]1999            qsr_tot(:,:   ) = qsr_tot(:,:) + picefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1)
2000            DO jl = 1, jpl
2001               zqsr_tot(:,:   ) = zqsr_tot(:,:) + picefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1)
[5407]2002               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1)
[9019]2003            END DO
[3294]2004         ENDIF
[1218]2005      CASE( 'mixed oce-ice' )
[5407]2006         zqsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1)
[3294]2007! ** NEED TO SORT OUT HOW THIS SHOULD WORK IN THE MULTI-CATEGORY CASE - CURRENTLY NOT ALLOWED WHEN INTERFACE INITIALISED **
[1232]2008!       Create solar heat flux over ice using incoming solar heat flux and albedos
2009!       ( see OASIS3 user guide, 5th edition, p39 )
[5407]2010         zqsr_ice(:,:,1) = frcv(jpr_qsrmix)%z3(:,:,1) * ( 1.- palbi(:,:,1) )   &
[9019]2011            &            / (  1.- ( alb_oce_mix(:,:  ) * ziceld(:,:)       &
2012            &                     + palbi      (:,:,1) * picefr(:,:) ) )
[10404]2013      CASE( 'none'      )       ! Not available as for now: needs additional coding 
2014      !                         ! since fields received, here zqsr_tot,  are not defined with none option
2015         CALL ctl_stop( 'STOP', 'sbccpl/sbc_cpl_ice_flx: some fields are not defined. Change sn_rcv_qsr value in namelist namsbc_cpl' )
[1218]2016      END SELECT
[5407]2017      IF( ln_dm2dc .AND. ln_cpl ) THEN   ! modify qsr to include the diurnal cycle
2018         zqsr_tot(:,:  ) = sbc_dcy( zqsr_tot(:,:  ) )
[9019]2019         DO jl = 1, jpl
[5407]2020            zqsr_ice(:,:,jl) = sbc_dcy( zqsr_ice(:,:,jl) )
[9019]2021         END DO
[2528]2022      ENDIF
[1218]2023
[9570]2024#if defined key_si3
[5486]2025      ! --- solar flux over ocean --- !
[9019]2026      !         note: ziceld cannot be = 0 since we limit the ice concentration to amax
[5486]2027      zqsr_oce = 0._wp
[9019]2028      WHERE( ziceld /= 0._wp )  zqsr_oce(:,:) = ( zqsr_tot(:,:) - SUM( a_i * zqsr_ice, dim=3 ) ) / ziceld(:,:)
[5486]2029
2030      IF( ln_mixcpl ) THEN   ;   qsr_oce(:,:) = qsr_oce(:,:) * xcplmask(:,:,0) +  zqsr_oce(:,:)* zmsk(:,:)
2031      ELSE                   ;   qsr_oce(:,:) = zqsr_oce(:,:)   ;   ENDIF
2032#endif
2033
[5407]2034      IF( ln_mixcpl ) THEN
[9019]2035         qsr_tot(:,:) = qsr(:,:) * ziceld(:,:) + SUM( qsr_ice(:,:,:) * a_i(:,:,:), dim=3 )   ! total flux from blk
[5407]2036         qsr_tot(:,:) = qsr_tot(:,:) * xcplmask(:,:,0) +  zqsr_tot(:,:)* zmsk(:,:)
[9019]2037         DO jl = 1, jpl
[5407]2038            qsr_ice(:,:,jl) = qsr_ice(:,:,jl) * xcplmask(:,:,0) +  zqsr_ice(:,:,jl)* zmsk(:,:)
[9019]2039         END DO
[5407]2040      ELSE
2041         qsr_tot(:,:  ) = zqsr_tot(:,:  )
2042         qsr_ice(:,:,:) = zqsr_ice(:,:,:)
2043      ENDIF
2044
[4990]2045      !                                                      ! ========================= !
2046      SELECT CASE( TRIM( sn_rcv_dqnsdt%cldes ) )             !          d(qns)/dt        !
2047      !                                                      ! ========================= !
[1226]2048      CASE ('coupled')
[3294]2049         IF ( TRIM(sn_rcv_dqnsdt%clcat) == 'yes' ) THEN
[5407]2050            zdqns_ice(:,:,1:jpl) = frcv(jpr_dqnsdt)%z3(:,:,1:jpl)
[3294]2051         ELSE
2052            ! Set all category values equal for the moment
2053            DO jl=1,jpl
[5407]2054               zdqns_ice(:,:,jl) = frcv(jpr_dqnsdt)%z3(:,:,1)
[3294]2055            ENDDO
2056         ENDIF
[1226]2057      END SELECT
[5407]2058     
2059      IF( ln_mixcpl ) THEN
2060         DO jl=1,jpl
2061            dqns_ice(:,:,jl) = dqns_ice(:,:,jl) * xcplmask(:,:,0) + zdqns_ice(:,:,jl) * zmsk(:,:)
2062         ENDDO
2063      ELSE
2064         dqns_ice(:,:,:) = zdqns_ice(:,:,:)
2065      ENDIF
[9019]2066
[9570]2067#if defined key_si3     
[4990]2068      !                                                      ! ========================= !
[9019]2069      SELECT CASE( TRIM( sn_rcv_iceflx%cldes ) )             !  ice topmelt and botmelt  !
[4990]2070      !                                                      ! ========================= !
[3294]2071      CASE ('coupled')
[9921]2072         qml_ice(:,:,:) = frcv(jpr_topm)%z3(:,:,:)
2073         qcn_ice(:,:,:) = frcv(jpr_botm)%z3(:,:,:)
[3294]2074      END SELECT
[2715]2075      !
[9019]2076      !                                                      ! ========================= !
2077      !                                                      !      Transmitted Qsr      !   [W/m2]
2078      !                                                      ! ========================= !
[10534]2079      IF( .NOT.ln_cndflx ) THEN                              !==  No conduction flux as surface forcing  ==!
[9019]2080         !
2081         !                    ! ===> used prescribed cloud fraction representative for polar oceans in summer (0.81)
2082         ztri = 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice    ! surface transmission parameter (Grenfell Maykut 77)
2083         !
[9910]2084         qtr_ice_top(:,:,:) = ztri * qsr_ice(:,:,:)
2085         WHERE( phs(:,:,:) >= 0.0_wp )   qtr_ice_top(:,:,:) = 0._wp            ! snow fully opaque
2086         WHERE( phi(:,:,:) <= 0.1_wp )   qtr_ice_top(:,:,:) = qsr_ice(:,:,:)   ! thin ice transmits all solar radiation
[9019]2087         !     
[10534]2088      ELSEIF( ln_cndflx .AND. .NOT.ln_cndemulate ) THEN      !==  conduction flux as surface forcing  ==!
[9019]2089         !
[9910]2090         !                    ! ===> here we must receive the qtr_ice_top array from the coupler
[9019]2091         !                           for now just assume zero (fully opaque ice)
[9910]2092         qtr_ice_top(:,:,:) = 0._wp
[9019]2093         !
[10534]2094      ENDIF
[9019]2095      !
2096#endif
[3294]2097      !
[1226]2098   END SUBROUTINE sbc_cpl_ice_flx
[1218]2099   
2100   
2101   SUBROUTINE sbc_cpl_snd( kt )
2102      !!----------------------------------------------------------------------
2103      !!             ***  ROUTINE sbc_cpl_snd  ***
2104      !!
2105      !! ** Purpose :   provide the ocean-ice informations to the atmosphere
2106      !!
[4990]2107      !! ** Method  :   send to the atmosphere through a call to cpl_snd
[1218]2108      !!              all the needed fields (as defined in sbc_cpl_init)
2109      !!----------------------------------------------------------------------
2110      INTEGER, INTENT(in) ::   kt
[2715]2111      !
[3294]2112      INTEGER ::   ji, jj, jl   ! dummy loop indices
[2715]2113      INTEGER ::   isec, info   ! local integer
[5407]2114      REAL(wp) ::   zumax, zvmax
[9019]2115      REAL(wp), DIMENSION(jpi,jpj)     ::   zfr_l, ztmp1, ztmp2, zotx1, zoty1, zotz1, zitx1, zity1, zitz1
2116      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   ztmp3, ztmp4   
[1218]2117      !!----------------------------------------------------------------------
[3294]2118      !
[6140]2119      isec = ( kt - nit000 ) * NINT( rdt )        ! date of exchanges
[888]2120
[1218]2121      zfr_l(:,:) = 1.- fr_i(:,:)
2122      !                                                      ! ------------------------- !
2123      !                                                      !    Surface temperature    !   in Kelvin
2124      !                                                      ! ------------------------- !
[3680]2125      IF( ssnd(jps_toce)%laction .OR. ssnd(jps_tice)%laction .OR. ssnd(jps_tmix)%laction ) THEN
[5407]2126         
2127         IF ( nn_components == jp_iam_opa ) THEN
[6489]2128            ztmp1(:,:) = tsn(:,:,1,jp_tem)   ! send temperature as it is (potential or conservative) -> use of l_useCT on the received part
[5407]2129         ELSE
2130            ! we must send the surface potential temperature
[6489]2131            IF( l_useCT )  THEN    ;   ztmp1(:,:) = eos_pt_from_ct( tsn(:,:,1,jp_tem), tsn(:,:,1,jp_sal) )
[9019]2132            ELSE                   ;   ztmp1(:,:) = tsn(:,:,1,jp_tem)
[5407]2133            ENDIF
2134            !
2135            SELECT CASE( sn_snd_temp%cldes)
2136            CASE( 'oce only'             )   ;   ztmp1(:,:) =   ztmp1(:,:) + rt0
[5410]2137            CASE( 'oce and ice'          )   ;   ztmp1(:,:) =   ztmp1(:,:) + rt0
2138               SELECT CASE( sn_snd_temp%clcat )
2139               CASE( 'yes' )   
2140                  ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl)
2141               CASE( 'no' )
2142                  WHERE( SUM( a_i, dim=3 ) /= 0. )
2143                     ztmp3(:,:,1) = SUM( tn_ice * a_i, dim=3 ) / SUM( a_i, dim=3 )
2144                  ELSEWHERE
[6121]2145                     ztmp3(:,:,1) = rt0
[5410]2146                  END WHERE
2147               CASE default   ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' )
2148               END SELECT
[5407]2149            CASE( 'weighted oce and ice' )   ;   ztmp1(:,:) = ( ztmp1(:,:) + rt0 ) * zfr_l(:,:)   
2150               SELECT CASE( sn_snd_temp%clcat )
2151               CASE( 'yes' )   
2152                  ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl)
2153               CASE( 'no' )
2154                  ztmp3(:,:,:) = 0.0
2155                  DO jl=1,jpl
2156                     ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl)
2157                  ENDDO
2158               CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' )
2159               END SELECT
[9019]2160            CASE( 'oce and weighted ice')    ;   ztmp1(:,:) =   tsn(:,:,1,jp_tem) + rt0 
2161               SELECT CASE( sn_snd_temp%clcat ) 
2162               CASE( 'yes' )   
2163                  ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 
2164               CASE( 'no' ) 
2165                  ztmp3(:,:,:) = 0.0 
2166                  DO jl=1,jpl 
2167                     ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl) 
2168                  ENDDO 
2169               CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' ) 
2170               END SELECT
[5407]2171            CASE( 'mixed oce-ice'        )   
2172               ztmp1(:,:) = ( ztmp1(:,:) + rt0 ) * zfr_l(:,:) 
[3680]2173               DO jl=1,jpl
[5407]2174                  ztmp1(:,:) = ztmp1(:,:) + tn_ice(:,:,jl) * a_i(:,:,jl)
[3680]2175               ENDDO
[5407]2176            CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%cldes' )
[3680]2177            END SELECT
[5407]2178         ENDIF
[4990]2179         IF( ssnd(jps_toce)%laction )   CALL cpl_snd( jps_toce, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info )
2180         IF( ssnd(jps_tice)%laction )   CALL cpl_snd( jps_tice, isec, ztmp3, info )
2181         IF( ssnd(jps_tmix)%laction )   CALL cpl_snd( jps_tmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info )
[3680]2182      ENDIF
[9019]2183      !
[1218]2184      !                                                      ! ------------------------- !
[9019]2185      !                                                      ! 1st layer ice/snow temp.  !
2186      !                                                      ! ------------------------- !
[9570]2187#if defined key_si3
[9019]2188      ! needed by  Met Office
2189      IF( ssnd(jps_ttilyr)%laction) THEN
2190         SELECT CASE( sn_snd_ttilyr%cldes)
2191         CASE ('weighted ice')
2192            ztmp3(:,:,1:jpl) = t1_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 
2193         CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_ttilyr%cldes' )
2194         END SELECT
2195         IF( ssnd(jps_ttilyr)%laction )   CALL cpl_snd( jps_ttilyr, isec, ztmp3, info )
2196      ENDIF
2197#endif
2198      !                                                      ! ------------------------- !
[1218]2199      !                                                      !           Albedo          !
2200      !                                                      ! ------------------------- !
2201      IF( ssnd(jps_albice)%laction ) THEN                         ! ice
[6121]2202          SELECT CASE( sn_snd_alb%cldes )
2203          CASE( 'ice' )
2204             SELECT CASE( sn_snd_alb%clcat )
2205             CASE( 'yes' )   
2206                ztmp3(:,:,1:jpl) = alb_ice(:,:,1:jpl)
2207             CASE( 'no' )
2208                WHERE( SUM( a_i, dim=3 ) /= 0. )
2209                   ztmp1(:,:) = SUM( alb_ice (:,:,1:jpl) * a_i(:,:,1:jpl), dim=3 ) / SUM( a_i(:,:,1:jpl), dim=3 )
2210                ELSEWHERE
[9019]2211                   ztmp1(:,:) = alb_oce_mix(:,:)
[6121]2212                END WHERE
2213             CASE default   ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_alb%clcat' )
2214             END SELECT
2215          CASE( 'weighted ice' )   ;
2216             SELECT CASE( sn_snd_alb%clcat )
2217             CASE( 'yes' )   
2218                ztmp3(:,:,1:jpl) =  alb_ice(:,:,1:jpl) * a_i(:,:,1:jpl)
2219             CASE( 'no' )
2220                WHERE( fr_i (:,:) > 0. )
2221                   ztmp1(:,:) = SUM (  alb_ice(:,:,1:jpl) * a_i(:,:,1:jpl), dim=3 )
2222                ELSEWHERE
2223                   ztmp1(:,:) = 0.
2224                END WHERE
2225             CASE default   ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_ice%clcat' )
2226             END SELECT
2227          CASE default      ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_alb%cldes' )
[5410]2228         END SELECT
[6121]2229
2230         SELECT CASE( sn_snd_alb%clcat )
2231            CASE( 'yes' )   
2232               CALL cpl_snd( jps_albice, isec, ztmp3, info )      !-> MV this has never been checked in coupled mode
2233            CASE( 'no'  )   
2234               CALL cpl_snd( jps_albice, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
2235         END SELECT
[888]2236      ENDIF
[6121]2237
[1218]2238      IF( ssnd(jps_albmix)%laction ) THEN                         ! mixed ice-ocean
[9019]2239         ztmp1(:,:) = alb_oce_mix(:,:) * zfr_l(:,:)
2240         DO jl = 1, jpl
[3294]2241            ztmp1(:,:) = ztmp1(:,:) + alb_ice(:,:,jl) * a_i(:,:,jl)
[9019]2242         END DO
[4990]2243         CALL cpl_snd( jps_albmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info )
[1218]2244      ENDIF
2245      !                                                      ! ------------------------- !
2246      !                                                      !  Ice fraction & Thickness !
2247      !                                                      ! ------------------------- !
[5407]2248      ! Send ice fraction field to atmosphere
[3680]2249      IF( ssnd(jps_fice)%laction ) THEN
2250         SELECT CASE( sn_snd_thick%clcat )
2251         CASE( 'yes' )   ;   ztmp3(:,:,1:jpl) =  a_i(:,:,1:jpl)
2252         CASE( 'no'  )   ;   ztmp3(:,:,1    ) = fr_i(:,:      )
2253         CASE default    ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' )
2254         END SELECT
[5407]2255         IF( ssnd(jps_fice)%laction )   CALL cpl_snd( jps_fice, isec, ztmp3, info )
[3680]2256      ENDIF
[9019]2257
2258      IF( ssnd(jps_fice1)%laction ) THEN
2259         SELECT CASE( sn_snd_thick1%clcat )
2260         CASE( 'yes' )   ;   ztmp3(:,:,1:jpl) =  a_i(:,:,1:jpl)
2261         CASE( 'no'  )   ;   ztmp3(:,:,1    ) = fr_i(:,:      )
2262         CASE default    ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick1%clcat' )
2263         END SELECT
2264         CALL cpl_snd( jps_fice1, isec, ztmp3, info )
2265      ENDIF
[5407]2266     
2267      ! Send ice fraction field to OPA (sent by SAS in SAS-OPA coupling)
2268      IF( ssnd(jps_fice2)%laction ) THEN
2269         ztmp3(:,:,1) = fr_i(:,:)
2270         IF( ssnd(jps_fice2)%laction )   CALL cpl_snd( jps_fice2, isec, ztmp3, info )
2271      ENDIF
[3294]2272
2273      ! Send ice and snow thickness field
[3680]2274      IF( ssnd(jps_hice)%laction .OR. ssnd(jps_hsnw)%laction ) THEN
2275         SELECT CASE( sn_snd_thick%cldes)
2276         CASE( 'none'                  )       ! nothing to do
2277         CASE( 'weighted ice and snow' )   
2278            SELECT CASE( sn_snd_thick%clcat )
2279            CASE( 'yes' )   
[9019]2280               ztmp3(:,:,1:jpl) =  h_i(:,:,1:jpl) * a_i(:,:,1:jpl)
2281               ztmp4(:,:,1:jpl) =  h_s(:,:,1:jpl) * a_i(:,:,1:jpl)
[3680]2282            CASE( 'no' )
2283               ztmp3(:,:,:) = 0.0   ;  ztmp4(:,:,:) = 0.0
2284               DO jl=1,jpl
[9019]2285                  ztmp3(:,:,1) = ztmp3(:,:,1) + h_i(:,:,jl) * a_i(:,:,jl)
2286                  ztmp4(:,:,1) = ztmp4(:,:,1) + h_s(:,:,jl) * a_i(:,:,jl)
[3680]2287               ENDDO
2288            CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' )
2289            END SELECT
2290         CASE( 'ice and snow'         )   
[5410]2291            SELECT CASE( sn_snd_thick%clcat )
2292            CASE( 'yes' )
[9019]2293               ztmp3(:,:,1:jpl) = h_i(:,:,1:jpl)
2294               ztmp4(:,:,1:jpl) = h_s(:,:,1:jpl)
[5410]2295            CASE( 'no' )
2296               WHERE( SUM( a_i, dim=3 ) /= 0. )
[9019]2297                  ztmp3(:,:,1) = SUM( h_i * a_i, dim=3 ) / SUM( a_i, dim=3 )
2298                  ztmp4(:,:,1) = SUM( h_s * a_i, dim=3 ) / SUM( a_i, dim=3 )
[5410]2299               ELSEWHERE
2300                 ztmp3(:,:,1) = 0.
2301                 ztmp4(:,:,1) = 0.
2302               END WHERE
2303            CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' )
2304            END SELECT
[3680]2305         CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%cldes' )
[3294]2306         END SELECT
[4990]2307         IF( ssnd(jps_hice)%laction )   CALL cpl_snd( jps_hice, isec, ztmp3, info )
2308         IF( ssnd(jps_hsnw)%laction )   CALL cpl_snd( jps_hsnw, isec, ztmp4, info )
[3680]2309      ENDIF
[9019]2310
[9570]2311#if defined key_si3
[1218]2312      !                                                      ! ------------------------- !
[9019]2313      !                                                      !      Ice melt ponds       !
2314      !                                                      ! ------------------------- !
2315      ! needed by Met Office
2316      IF( ssnd(jps_a_p)%laction .OR. ssnd(jps_ht_p)%laction ) THEN
2317         SELECT CASE( sn_snd_mpnd%cldes) 
2318         CASE( 'ice only' ) 
2319            SELECT CASE( sn_snd_mpnd%clcat ) 
2320            CASE( 'yes' ) 
2321               ztmp3(:,:,1:jpl) =  a_ip(:,:,1:jpl)
2322               ztmp4(:,:,1:jpl) =  v_ip(:,:,1:jpl) 
2323            CASE( 'no' ) 
2324               ztmp3(:,:,:) = 0.0 
2325               ztmp4(:,:,:) = 0.0 
2326               DO jl=1,jpl 
2327                 ztmp3(:,:,1) = ztmp3(:,:,1) + a_ip(:,:,jpl) 
2328                 ztmp4(:,:,1) = ztmp4(:,:,1) + v_ip(:,:,jpl) 
2329               ENDDO 
2330            CASE default   ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_mpnd%clcat' ) 
2331            END SELECT 
2332         CASE default      ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_mpnd%cldes' )     
2333         END SELECT 
2334         IF( ssnd(jps_a_p)%laction  )   CALL cpl_snd( jps_a_p , isec, ztmp3, info )     
2335         IF( ssnd(jps_ht_p)%laction )   CALL cpl_snd( jps_ht_p, isec, ztmp4, info )     
2336      ENDIF 
2337      !
2338      !                                                      ! ------------------------- !
2339      !                                                      !     Ice conductivity      !
2340      !                                                      ! ------------------------- !
2341      ! needed by Met Office
2342      IF( ssnd(jps_kice)%laction ) THEN
2343         SELECT CASE( sn_snd_cond%cldes) 
2344         CASE( 'weighted ice' )   
2345            SELECT CASE( sn_snd_cond%clcat ) 
2346            CASE( 'yes' )   
2347          ztmp3(:,:,1:jpl) =  cnd_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 
2348            CASE( 'no' ) 
2349               ztmp3(:,:,:) = 0.0 
2350               DO jl=1,jpl 
2351                 ztmp3(:,:,1) = ztmp3(:,:,1) + cnd_ice(:,:,jl) * a_i(:,:,jl) 
2352               ENDDO 
2353            CASE default   ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_cond%clcat' ) 
2354            END SELECT
2355         CASE( 'ice only' )   
2356           ztmp3(:,:,1:jpl) = cnd_ice(:,:,1:jpl) 
2357         CASE default      ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_cond%cldes' )     
2358         END SELECT
2359         IF( ssnd(jps_kice)%laction )   CALL cpl_snd( jps_kice, isec, ztmp3, info ) 
2360      ENDIF 
2361#endif
2362
2363      !                                                      ! ------------------------- !
[1534]2364      !                                                      !  CO2 flux from PISCES     !
2365      !                                                      ! ------------------------- !
[7646]2366      IF( ssnd(jps_co2)%laction .AND. l_co2cpl )   CALL cpl_snd( jps_co2, isec, RESHAPE ( oce_co2, (/jpi,jpj,1/) ) , info )
[1534]2367      !
[3294]2368      !                                                      ! ------------------------- !
[1218]2369      IF( ssnd(jps_ocx1)%laction ) THEN                      !      Surface current      !
2370         !                                                   ! ------------------------- !
[1467]2371         !   
2372         !                                                  j+1   j     -----V---F
[1694]2373         ! surface velocity always sent from T point                     !       |
[1467]2374         !                                                        j      |   T   U
2375         !                                                               |       |
2376         !                                                   j    j-1   -I-------|
2377         !                                               (for I)         |       |
2378         !                                                              i-1  i   i
2379         !                                                               i      i+1 (for I)
[5407]2380         IF( nn_components == jp_iam_opa ) THEN
2381            zotx1(:,:) = un(:,:,1) 
2382            zoty1(:,:) = vn(:,:,1) 
2383         ELSE       
2384            SELECT CASE( TRIM( sn_snd_crt%cldes ) )
2385            CASE( 'oce only'             )      ! C-grid ==> T
[1218]2386               DO jj = 2, jpjm1
2387                  DO ji = fs_2, fs_jpim1   ! vector opt.
[5407]2388                     zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj  ,1) )
2389                     zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji  ,jj-1,1) ) 
[1218]2390                  END DO
2391               END DO
[9767]2392            CASE( 'weighted oce and ice' )      ! Ocean and Ice on C-grid ==> T 
2393               DO jj = 2, jpjm1
2394                  DO ji = fs_2, fs_jpim1   ! vector opt.
2395                     zotx1(ji,jj) = 0.5 * ( un   (ji,jj,1) + un   (ji-1,jj  ,1) ) * zfr_l(ji,jj) 
2396                     zoty1(ji,jj) = 0.5 * ( vn   (ji,jj,1) + vn   (ji  ,jj-1,1) ) * zfr_l(ji,jj)
2397                     zitx1(ji,jj) = 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj)
2398                     zity1(ji,jj) = 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj)
[1218]2399                  END DO
[9767]2400               END DO
[10425]2401               CALL lbc_lnk_multi( 'sbccpl', zitx1, 'T', -1., zity1, 'T', -1. )
[9767]2402            CASE( 'mixed oce-ice'        )      ! Ocean and Ice on C-grid ==> T
2403               DO jj = 2, jpjm1
2404                  DO ji = fs_2, fs_jpim1   ! vector opt.
2405                     zotx1(ji,jj) = 0.5 * ( un   (ji,jj,1) + un   (ji-1,jj  ,1) ) * zfr_l(ji,jj)   &
2406                        &         + 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj)
2407                     zoty1(ji,jj) = 0.5 * ( vn   (ji,jj,1) + vn   (ji  ,jj-1,1) ) * zfr_l(ji,jj)   &
2408                        &         + 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj)
[1218]2409                  END DO
[9767]2410               END DO
[1467]2411            END SELECT
[10425]2412            CALL lbc_lnk_multi( 'sbccpl', zotx1, ssnd(jps_ocx1)%clgrid, -1.,  zoty1, ssnd(jps_ocy1)%clgrid, -1. )
[5407]2413            !
2414         ENDIF
[888]2415         !
[1218]2416         !
[3294]2417         IF( TRIM( sn_snd_crt%clvor ) == 'eastward-northward' ) THEN             ! Rotation of the components
[1218]2418            !                                                                     ! Ocean component
2419            CALL rot_rep( zotx1, zoty1, ssnd(jps_ocx1)%clgrid, 'ij->e', ztmp1 )       ! 1st component
2420            CALL rot_rep( zotx1, zoty1, ssnd(jps_ocx1)%clgrid, 'ij->n', ztmp2 )       ! 2nd component
2421            zotx1(:,:) = ztmp1(:,:)                                                   ! overwrite the components
2422            zoty1(:,:) = ztmp2(:,:)
2423            IF( ssnd(jps_ivx1)%laction ) THEN                                     ! Ice component
2424               CALL rot_rep( zitx1, zity1, ssnd(jps_ivx1)%clgrid, 'ij->e', ztmp1 )    ! 1st component
2425               CALL rot_rep( zitx1, zity1, ssnd(jps_ivx1)%clgrid, 'ij->n', ztmp2 )    ! 2nd component
2426               zitx1(:,:) = ztmp1(:,:)                                                ! overwrite the components
2427               zity1(:,:) = ztmp2(:,:)
2428            ENDIF
2429         ENDIF
2430         !
2431         ! spherical coordinates to cartesian -> 2 components to 3 components
[3294]2432         IF( TRIM( sn_snd_crt%clvref ) == 'cartesian' ) THEN
[1218]2433            ztmp1(:,:) = zotx1(:,:)                     ! ocean currents
2434            ztmp2(:,:) = zoty1(:,:)
[1226]2435            CALL oce2geo ( ztmp1, ztmp2, 'T', zotx1, zoty1, zotz1 )
[1218]2436            !
2437            IF( ssnd(jps_ivx1)%laction ) THEN           ! ice velocities
2438               ztmp1(:,:) = zitx1(:,:)
2439               ztmp1(:,:) = zity1(:,:)
[1226]2440               CALL oce2geo ( ztmp1, ztmp2, 'T', zitx1, zity1, zitz1 )
[1218]2441            ENDIF
2442         ENDIF
2443         !
[4990]2444         IF( ssnd(jps_ocx1)%laction )   CALL cpl_snd( jps_ocx1, isec, RESHAPE ( zotx1, (/jpi,jpj,1/) ), info )   ! ocean x current 1st grid
2445         IF( ssnd(jps_ocy1)%laction )   CALL cpl_snd( jps_ocy1, isec, RESHAPE ( zoty1, (/jpi,jpj,1/) ), info )   ! ocean y current 1st grid
2446         IF( ssnd(jps_ocz1)%laction )   CALL cpl_snd( jps_ocz1, isec, RESHAPE ( zotz1, (/jpi,jpj,1/) ), info )   ! ocean z current 1st grid
[1218]2447         !
[4990]2448         IF( ssnd(jps_ivx1)%laction )   CALL cpl_snd( jps_ivx1, isec, RESHAPE ( zitx1, (/jpi,jpj,1/) ), info )   ! ice   x current 1st grid
2449         IF( ssnd(jps_ivy1)%laction )   CALL cpl_snd( jps_ivy1, isec, RESHAPE ( zity1, (/jpi,jpj,1/) ), info )   ! ice   y current 1st grid
2450         IF( ssnd(jps_ivz1)%laction )   CALL cpl_snd( jps_ivz1, isec, RESHAPE ( zitz1, (/jpi,jpj,1/) ), info )   ! ice   z current 1st grid
[1534]2451         !
[888]2452      ENDIF
[2715]2453      !
[7646]2454      !                                                      ! ------------------------- !
2455      !                                                      !  Surface current to waves !
2456      !                                                      ! ------------------------- !
2457      IF( ssnd(jps_ocxw)%laction .OR. ssnd(jps_ocyw)%laction ) THEN 
2458          !     
2459          !                                                  j+1  j     -----V---F
2460          ! surface velocity always sent from T point                    !       |
2461          !                                                       j      |   T   U
2462          !                                                              |       |
2463          !                                                   j   j-1   -I-------|
2464          !                                               (for I)        |       |
2465          !                                                             i-1  i   i
2466          !                                                              i      i+1 (for I)
2467          SELECT CASE( TRIM( sn_snd_crtw%cldes ) ) 
2468          CASE( 'oce only'             )      ! C-grid ==> T
2469             DO jj = 2, jpjm1 
2470                DO ji = fs_2, fs_jpim1   ! vector opt.
2471                   zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj  ,1) ) 
2472                   zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji , jj-1,1) ) 
2473                END DO
2474             END DO
[9767]2475          CASE( 'weighted oce and ice' )      ! Ocean and Ice on C-grid ==> T   
2476             DO jj = 2, jpjm1 
2477                DO ji = fs_2, fs_jpim1   ! vector opt.
2478                   zotx1(ji,jj) = 0.5 * ( un   (ji,jj,1) + un   (ji-1,jj  ,1) ) * zfr_l(ji,jj)   
2479                   zoty1(ji,jj) = 0.5 * ( vn   (ji,jj,1) + vn   (ji  ,jj-1,1) ) * zfr_l(ji,jj) 
2480                   zitx1(ji,jj) = 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj) 
2481                   zity1(ji,jj) = 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj) 
2482                END DO
2483             END DO
[10425]2484             CALL lbc_lnk_multi( 'sbccpl', zitx1, 'T', -1.,  zity1, 'T', -1. ) 
[9767]2485          CASE( 'mixed oce-ice'        )      ! Ocean and Ice on C-grid ==> T 
2486             DO jj = 2, jpjm1 
2487                DO ji = fs_2, fs_jpim1   ! vector opt.
2488                   zotx1(ji,jj) = 0.5 * ( un   (ji,jj,1) + un   (ji-1,jj  ,1) ) * zfr_l(ji,jj)   & 
2489                      &         + 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj) 
2490                   zoty1(ji,jj) = 0.5 * ( vn   (ji,jj,1) + vn   (ji  ,jj-1,1) ) * zfr_l(ji,jj)   & 
2491                      &         + 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj) 
2492                END DO
2493             END DO
2494          END SELECT
[10425]2495         CALL lbc_lnk_multi( 'sbccpl', zotx1, ssnd(jps_ocxw)%clgrid, -1., zoty1, ssnd(jps_ocyw)%clgrid, -1. ) 
[7646]2496         !
2497         !
2498         IF( TRIM( sn_snd_crtw%clvor ) == 'eastward-northward' ) THEN             ! Rotation of the components
2499         !                                                                        ! Ocean component
2500            CALL rot_rep( zotx1, zoty1, ssnd(jps_ocxw)%clgrid, 'ij->e', ztmp1 )       ! 1st component 
2501            CALL rot_rep( zotx1, zoty1, ssnd(jps_ocxw)%clgrid, 'ij->n', ztmp2 )       ! 2nd component 
2502            zotx1(:,:) = ztmp1(:,:)                                                   ! overwrite the components 
2503            zoty1(:,:) = ztmp2(:,:) 
2504            IF( ssnd(jps_ivx1)%laction ) THEN                                     ! Ice component
2505               CALL rot_rep( zitx1, zity1, ssnd(jps_ivx1)%clgrid, 'ij->e', ztmp1 )    ! 1st component 
2506               CALL rot_rep( zitx1, zity1, ssnd(jps_ivx1)%clgrid, 'ij->n', ztmp2 )    ! 2nd component 
2507               zitx1(:,:) = ztmp1(:,:)                                                ! overwrite the components 
2508               zity1(:,:) = ztmp2(:,:) 
2509            ENDIF
2510         ENDIF 
2511         !
2512!         ! spherical coordinates to cartesian -> 2 components to 3 components
2513!         IF( TRIM( sn_snd_crtw%clvref ) == 'cartesian' ) THEN
2514!            ztmp1(:,:) = zotx1(:,:)                     ! ocean currents
2515!            ztmp2(:,:) = zoty1(:,:)
2516!            CALL oce2geo ( ztmp1, ztmp2, 'T', zotx1, zoty1, zotz1 )
2517!            !
2518!            IF( ssnd(jps_ivx1)%laction ) THEN           ! ice velocities
2519!               ztmp1(:,:) = zitx1(:,:)
2520!               ztmp1(:,:) = zity1(:,:)
2521!               CALL oce2geo ( ztmp1, ztmp2, 'T', zitx1, zity1, zitz1 )
2522!            ENDIF
2523!         ENDIF
2524         !
2525         IF( ssnd(jps_ocxw)%laction )   CALL cpl_snd( jps_ocxw, isec, RESHAPE ( zotx1, (/jpi,jpj,1/) ), info )   ! ocean x current 1st grid
2526         IF( ssnd(jps_ocyw)%laction )   CALL cpl_snd( jps_ocyw, isec, RESHAPE ( zoty1, (/jpi,jpj,1/) ), info )   ! ocean y current 1st grid
2527         
2528      ENDIF 
2529      !
2530      IF( ssnd(jps_ficet)%laction ) THEN
2531         CALL cpl_snd( jps_ficet, isec, RESHAPE ( fr_i, (/jpi,jpj,1/) ), info ) 
2532      END IF 
2533      !                                                      ! ------------------------- !
2534      !                                                      !   Water levels to waves   !
2535      !                                                      ! ------------------------- !
2536      IF( ssnd(jps_wlev)%laction ) THEN
2537         IF( ln_apr_dyn ) THEN 
2538            IF( kt /= nit000 ) THEN 
2539               ztmp1(:,:) = sshb(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) 
2540            ELSE 
2541               ztmp1(:,:) = sshb(:,:) 
2542            ENDIF 
2543         ELSE 
2544            ztmp1(:,:) = sshn(:,:) 
2545         ENDIF 
2546         CALL cpl_snd( jps_wlev  , isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
2547      END IF 
[5407]2548      !
2549      !  Fields sent by OPA to SAS when doing OPA<->SAS coupling
2550      !                                                        ! SSH
2551      IF( ssnd(jps_ssh )%laction )  THEN
2552         !                          ! removed inverse barometer ssh when Patm
2553         !                          forcing is used (for sea-ice dynamics)
2554         IF( ln_apr_dyn ) THEN   ;   ztmp1(:,:) = sshb(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) )
2555         ELSE                    ;   ztmp1(:,:) = sshn(:,:)
2556         ENDIF
2557         CALL cpl_snd( jps_ssh   , isec, RESHAPE ( ztmp1            , (/jpi,jpj,1/) ), info )
2558
2559      ENDIF
2560      !                                                        ! SSS
2561      IF( ssnd(jps_soce  )%laction )  THEN
2562         CALL cpl_snd( jps_soce  , isec, RESHAPE ( tsn(:,:,1,jp_sal), (/jpi,jpj,1/) ), info )
2563      ENDIF
2564      !                                                        ! first T level thickness
2565      IF( ssnd(jps_e3t1st )%laction )  THEN
[6140]2566         CALL cpl_snd( jps_e3t1st, isec, RESHAPE ( e3t_n(:,:,1)   , (/jpi,jpj,1/) ), info )
[5407]2567      ENDIF
2568      !                                                        ! Qsr fraction
2569      IF( ssnd(jps_fraqsr)%laction )  THEN
2570         CALL cpl_snd( jps_fraqsr, isec, RESHAPE ( fraqsr_1lev(:,:) , (/jpi,jpj,1/) ), info )
2571      ENDIF
2572      !
2573      !  Fields sent by SAS to OPA when OASIS coupling
2574      !                                                        ! Solar heat flux
2575      IF( ssnd(jps_qsroce)%laction )  CALL cpl_snd( jps_qsroce, isec, RESHAPE ( qsr , (/jpi,jpj,1/) ), info )
2576      IF( ssnd(jps_qnsoce)%laction )  CALL cpl_snd( jps_qnsoce, isec, RESHAPE ( qns , (/jpi,jpj,1/) ), info )
2577      IF( ssnd(jps_oemp  )%laction )  CALL cpl_snd( jps_oemp  , isec, RESHAPE ( emp , (/jpi,jpj,1/) ), info )
2578      IF( ssnd(jps_sflx  )%laction )  CALL cpl_snd( jps_sflx  , isec, RESHAPE ( sfx , (/jpi,jpj,1/) ), info )
2579      IF( ssnd(jps_otx1  )%laction )  CALL cpl_snd( jps_otx1  , isec, RESHAPE ( utau, (/jpi,jpj,1/) ), info )
2580      IF( ssnd(jps_oty1  )%laction )  CALL cpl_snd( jps_oty1  , isec, RESHAPE ( vtau, (/jpi,jpj,1/) ), info )
2581      IF( ssnd(jps_rnf   )%laction )  CALL cpl_snd( jps_rnf   , isec, RESHAPE ( rnf , (/jpi,jpj,1/) ), info )
2582      IF( ssnd(jps_taum  )%laction )  CALL cpl_snd( jps_taum  , isec, RESHAPE ( taum, (/jpi,jpj,1/) ), info )
2583
[9570]2584#if defined key_si3
[9019]2585      !                                                      ! ------------------------- !
2586      !                                                      ! Sea surface freezing temp !
2587      !                                                      ! ------------------------- !
2588      ! needed by Met Office
2589      CALL eos_fzp(tsn(:,:,1,jp_sal), sstfrz)
2590      ztmp1(:,:) = sstfrz(:,:) + rt0
2591      IF( ssnd(jps_sstfrz)%laction )  CALL cpl_snd( jps_sstfrz, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info)
2592#endif
[2715]2593      !
[1226]2594   END SUBROUTINE sbc_cpl_snd
[1218]2595   
[888]2596   !!======================================================================
2597END MODULE sbccpl
Note: See TracBrowser for help on using the repository browser.