New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 9019 for branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90 – NEMO

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

Merge of dev_CNRS_2017 into branch

File:
1 edited

Legend:

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

    r8329 r9019  
    99   !!            3.4  ! 2011_11  (C. Harris) more flexibility + multi-category fields 
    1010   !!---------------------------------------------------------------------- 
     11 
    1112   !!---------------------------------------------------------------------- 
    1213   !!   namsbc_cpl      : coupled formulation namlist 
     
    2930   USE ice            ! ice variables 
    3031#endif 
    31 #if defined key_lim2 
    32    USE par_ice_2      ! ice parameters 
    33    USE ice_2          ! ice variables 
    34 #endif 
    3532   USE cpl_oasis3     ! OASIS3 coupling 
    3633   USE geo2ocean      !  
    37    USE oce   , ONLY : tsn, un, vn, sshn, ub, vb, sshb, fraqsr_1lev 
    38    USE albedo         !  
     34   USE oce     , ONLY : tsn, un, vn, sshn, ub, vb, sshb, fraqsr_1lev 
     35   USE ocealb         !  
    3936   USE eosbn2         !  
    40    USE sbcrnf, ONLY : l_rnfcpl 
    41    USE sbcisf   , ONLY : l_isfcpl 
     37   USE sbcrnf  , ONLY : l_rnfcpl 
     38   USE sbcisf  , ONLY : l_isfcpl 
    4239#if defined key_cice 
    4340   USE ice_domain_size, only: ncat 
    4441#endif 
    4542#if defined key_lim3 
    46    USE limthd_dh      ! for CALL lim_thd_snwblow 
     43   USE icethd_dh      ! for CALL ice_thd_snwblow 
    4744#endif 
    4845   ! 
     
    5047   USE iom            ! NetCDF library 
    5148   USE lib_mpp        ! distribued memory computing library 
    52    USE wrk_nemo       ! work arrays 
    5349   USE timing         ! Timing 
    5450   USE lbclnk         ! ocean lateral boundary conditions (or mpp link) 
     
    5854 
    5955   PUBLIC   sbc_cpl_init      ! routine called by sbcmod.F90 
    60    PUBLIC   sbc_cpl_rcv       ! routine called by sbc_ice_lim(_2).F90 
     56   PUBLIC   sbc_cpl_rcv       ! routine called by icestp.F90 
    6157   PUBLIC   sbc_cpl_snd       ! routine called by step.F90 
    62    PUBLIC   sbc_cpl_ice_tau   ! routine called by sbc_ice_lim(_2).F90 
    63    PUBLIC   sbc_cpl_ice_flx   ! routine called by sbc_ice_lim(_2).F90 
     58   PUBLIC   sbc_cpl_ice_tau   ! routine called by icestp.F90 
     59   PUBLIC   sbc_cpl_ice_flx   ! routine called by icestp.F90 
    6460   PUBLIC   sbc_cpl_alloc     ! routine called in sbcice_cice.F90 
    6561 
     
    117113   INTEGER, PARAMETER ::   jpr_isf    = 52 
    118114   INTEGER, PARAMETER ::   jpr_icb    = 53 
    119  
    120    INTEGER, PARAMETER ::   jprcv      = 53   ! total number of fields received   
     115   INTEGER, PARAMETER ::   jpr_ts_ice = 54   ! Sea ice surface temp 
     116 
     117   INTEGER, PARAMETER ::   jprcv      = 54   ! total number of fields received   
    121118 
    122119   INTEGER, PARAMETER ::   jps_fice   =  1   ! ice fraction sent to the atmosphere 
     
    152149   INTEGER, PARAMETER ::   jps_ocyw   = 31   ! currents on grid 2 
    153150   INTEGER, PARAMETER ::   jps_wlev   = 32   ! water level  
    154    INTEGER, PARAMETER ::   jpsnd      = 32   ! total number of fields sent  
     151   INTEGER, PARAMETER ::   jps_fice1  = 33   ! first-order ice concentration (for semi-implicit coupling of atmos-ice fluxes) 
     152   INTEGER, PARAMETER ::   jps_a_p    = 34   ! meltpond area 
     153   INTEGER, PARAMETER ::   jps_ht_p   = 35   ! meltpond thickness 
     154   INTEGER, PARAMETER ::   jps_kice   = 36   ! sea ice effective conductivity 
     155   INTEGER, PARAMETER ::   jps_sstfrz = 37   ! sea surface freezing temperature 
     156   INTEGER, PARAMETER ::   jps_ttilyr = 38   ! sea ice top layer temp 
     157 
     158   INTEGER, PARAMETER ::   jpsnd      = 38   ! total number of fields sent  
    155159 
    156160   !                                  !!** namelist namsbc_cpl ** 
     
    163167   END TYPE FLD_C 
    164168   !                                   ! Send to the atmosphere   
    165    TYPE(FLD_C) ::   sn_snd_temp, sn_snd_alb, sn_snd_thick, sn_snd_crt, sn_snd_co2                         
     169   TYPE(FLD_C) ::   sn_snd_temp  , sn_snd_alb , sn_snd_thick, sn_snd_crt   , sn_snd_co2,  & 
     170      &             sn_snd_thick1, sn_snd_cond, sn_snd_mpnd , sn_snd_sstfrz, sn_snd_ttilyr 
    166171   !                                   ! Received from the atmosphere 
    167    TYPE(FLD_C) ::   sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau, sn_rcv_dqnsdt, sn_rcv_qsr, sn_rcv_qns, sn_rcv_emp, sn_rcv_rnf 
    168    TYPE(FLD_C) ::   sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2, sn_rcv_mslp, sn_rcv_icb, sn_rcv_isf                               
     172   TYPE(FLD_C) ::   sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau, sn_rcv_dqnsdt, sn_rcv_qsr,  & 
     173      &             sn_rcv_qns , sn_rcv_emp   , sn_rcv_rnf, sn_rcv_ts_ice 
     174   TYPE(FLD_C) ::   sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2, sn_rcv_mslp, sn_rcv_icb, sn_rcv_isf 
    169175   ! Send to waves  
    170176   TYPE(FLD_C) ::   sn_snd_ifrac, sn_snd_crtw, sn_snd_wlev  
    171177   ! Received from waves  
    172    TYPE(FLD_C) ::   sn_rcv_hsig,sn_rcv_phioc,sn_rcv_sdrfx,sn_rcv_sdrfy,sn_rcv_wper,sn_rcv_wnum,sn_rcv_wstrf,sn_rcv_wdrag 
     178   TYPE(FLD_C) ::   sn_rcv_hsig, sn_rcv_phioc, sn_rcv_sdrfx, sn_rcv_sdrfy, sn_rcv_wper, sn_rcv_wnum, sn_rcv_wstrf, sn_rcv_wdrag 
    173179   !                                   ! Other namelist parameters 
    174180   INTEGER     ::   nn_cplmodel           ! Maximum number of models to/from which NEMO is potentialy sending/receiving data 
    175181   LOGICAL     ::   ln_usecplmask         !  use a coupling mask file to merge data received from several models 
    176                                          !   -> file cplmask.nc with the float variable called cplmask (jpi,jpj,nn_cplmodel) 
     182                                          !   -> file cplmask.nc with the float variable called cplmask (jpi,jpj,nn_cplmodel) 
    177183   TYPE ::   DYNARR      
    178       REAL(wp), POINTER, DIMENSION(:,:,:)    ::   z3    
     184      REAL(wp), POINTER, DIMENSION(:,:,:) ::   z3    
    179185   END TYPE DYNARR 
    180186 
    181    TYPE( DYNARR ), SAVE, DIMENSION(jprcv) ::   frcv                     ! all fields recieved from the atmosphere 
    182  
    183    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   albedo_oce_mix    ! ocean albedo sent to atmosphere (mix clear/overcast sky) 
     187   TYPE( DYNARR ), SAVE, DIMENSION(jprcv) ::   frcv                ! all fields recieved from the atmosphere 
     188 
     189   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   alb_oce_mix    ! ocean albedo sent to atmosphere (mix clear/overcast sky) 
    184190 
    185191   REAL(wp) ::   rpref = 101000._wp   ! reference atmospheric pressure[N/m2]  
    186192   REAL(wp) ::   r1_grau              ! = 1.e0 / (grav * rau0)  
    187193 
    188    INTEGER , ALLOCATABLE, SAVE, DIMENSION(    :) ::   nrcvinfo           ! OASIS info argument 
     194   INTEGER , ALLOCATABLE, SAVE, DIMENSION(:) ::   nrcvinfo           ! OASIS info argument 
    189195 
    190196   !! Substitution 
     
    205211      ierr(:) = 0 
    206212      ! 
    207       ALLOCATE( albedo_oce_mix(jpi,jpj), nrcvinfo(jprcv),  STAT=ierr(1) ) 
     213      ALLOCATE( alb_oce_mix(jpi,jpj), nrcvinfo(jprcv),  STAT=ierr(1) ) 
    208214       
    209 #if ! defined key_lim3 && ! defined key_lim2 && ! defined key_cice 
     215#if ! defined key_lim3 && ! defined key_cice 
    210216      ALLOCATE( a_i(jpi,jpj,1) , STAT=ierr(2) )  ! used in sbcice_if.F90 (done here as there is no sbc_ice_if_init) 
    211217#endif 
     
    237243      INTEGER ::   jn          ! dummy loop index 
    238244      INTEGER ::   ios, inum   ! Local integer 
    239       REAL(wp), POINTER, DIMENSION(:,:) ::   zacs, zaos 
     245      REAL(wp), DIMENSION(jpi,jpj) ::   zacs, zaos 
    240246      !! 
    241       NAMELIST/namsbc_cpl/  sn_snd_temp , sn_snd_alb  , sn_snd_thick , sn_snd_crt   , sn_snd_co2,      &  
    242          &                  sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau   , sn_rcv_dqnsdt, sn_rcv_qsr,      &  
    243          &                  sn_snd_ifrac, sn_snd_crtw , sn_snd_wlev  , sn_rcv_hsig  , sn_rcv_phioc ,   &  
    244          &                  sn_rcv_sdrfx, sn_rcv_sdrfy, sn_rcv_wper  , sn_rcv_wnum  , sn_rcv_wstrf ,   & 
    245          &                  sn_rcv_wdrag, sn_rcv_qns  , sn_rcv_emp   , sn_rcv_rnf   , sn_rcv_cal   ,   & 
    246          &                  sn_rcv_iceflx,sn_rcv_co2  , nn_cplmodel  , ln_usecplmask, sn_rcv_mslp ,   & 
    247          &                  sn_rcv_icb , sn_rcv_isf 
     247      NAMELIST/namsbc_cpl/  sn_snd_temp  , sn_snd_alb   , sn_snd_thick, sn_snd_crt   , sn_snd_co2  ,   &  
     248         &                  sn_rcv_w10m  , sn_rcv_taumod, sn_rcv_tau  , sn_rcv_dqnsdt, sn_rcv_qsr  ,   &  
     249         &                  sn_snd_ifrac , sn_snd_crtw  , sn_snd_wlev , sn_rcv_hsig  , sn_rcv_phioc,   &  
     250         &                  sn_rcv_sdrfx , sn_rcv_sdrfy , sn_rcv_wper , sn_rcv_wnum  , sn_rcv_wstrf,   & 
     251         &                  sn_rcv_wdrag , sn_rcv_qns   , sn_rcv_emp  , sn_rcv_rnf   , sn_rcv_cal  ,   & 
     252         &                  sn_rcv_iceflx, sn_rcv_co2   , nn_cplmodel , ln_usecplmask, sn_rcv_mslp ,   & 
     253         &                  sn_rcv_icb   , sn_rcv_isf   , nn_cats_cpl   
    248254 
    249255      !!--------------------------------------------------------------------- 
     
    251257      IF( nn_timing == 1 )   CALL timing_start('sbc_cpl_init') 
    252258      ! 
    253       CALL wrk_alloc( jpi,jpj,   zacs, zaos ) 
    254  
    255259      ! ================================ ! 
    256260      !      Namelist informations       ! 
     
    297301         WRITE(numout,*)'      Stress frac adsorbed by waves   = ', TRIM(sn_rcv_wstrf%cldes ), ' (', TRIM(sn_rcv_wstrf%clcat ), ')'  
    298302         WRITE(numout,*)'      Neutral surf drag coefficient   = ', TRIM(sn_rcv_wdrag%cldes ), ' (', TRIM(sn_rcv_wdrag%clcat ), ')'  
     303         WRITE(numout,*)'      Sea ice surface skin temperature= ', TRIM(sn_rcv_ts_ice%cldes), ' (', TRIM(sn_rcv_ts_ice%clcat), ')'  
    299304         WRITE(numout,*)'  sent fields (multiple ice categories)' 
    300305         WRITE(numout,*)'      surface temperature             = ', TRIM(sn_snd_temp%cldes  ), ' (', TRIM(sn_snd_temp%clcat  ), ')' 
     306         WRITE(numout,*)'      top ice layer temperature       = ', TRIM(sn_snd_ttilyr%cldes), ' (', TRIM(sn_snd_ttilyr%clcat), ')' 
    301307         WRITE(numout,*)'      albedo                          = ', TRIM(sn_snd_alb%cldes   ), ' (', TRIM(sn_snd_alb%clcat   ), ')' 
    302308         WRITE(numout,*)'      ice/snow thickness              = ', TRIM(sn_snd_thick%cldes ), ' (', TRIM(sn_snd_thick%clcat ), ')' 
     
    307313         WRITE(numout,*)'                      - mesh          = ', sn_snd_crt%clvgrd 
    308314         WRITE(numout,*)'      oce co2 flux                    = ', TRIM(sn_snd_co2%cldes   ), ' (', TRIM(sn_snd_co2%clcat   ), ')' 
     315         WRITE(numout,*)'      ice effective conductivity      = ', TRIM(sn_snd_cond%cldes  ), ' (', TRIM(sn_snd_cond%clcat  ), ')' 
     316         WRITE(numout,*)'      meltponds fraction and depth    = ', TRIM(sn_snd_mpnd%cldes  ), ' (', TRIM(sn_snd_mpnd%clcat  ), ')' 
     317         WRITE(numout,*)'      sea surface freezing temp       = ', TRIM(sn_snd_sstfrz%cldes), ' (', TRIM(sn_snd_sstfrz%clcat), ')' 
    309318         WRITE(numout,*)'      water level                     = ', TRIM(sn_snd_wlev%cldes  ), ' (', TRIM(sn_snd_wlev%clcat  ), ')'  
    310319         WRITE(numout,*)'      mean sea level pressure         = ', TRIM(sn_rcv_mslp%cldes  ), ' (', TRIM(sn_rcv_mslp%clcat  ), ')'  
     
    315324         WRITE(numout,*)'  nn_cplmodel                         = ', nn_cplmodel 
    316325         WRITE(numout,*)'  ln_usecplmask                       = ', ln_usecplmask 
     326         WRITE(numout,*)'  nn_cats_cpl                         = ', nn_cats_cpl 
    317327      ENDIF 
    318328 
     
    435445      SELECT CASE( TRIM( sn_rcv_emp%cldes ) ) 
    436446      CASE( 'none'          )       ! nothing to do 
    437       CASE( 'oce only'      )   ;   srcv(                                 jpr_oemp   )%laction = .TRUE.  
     447      CASE( 'oce only'      )   ;   srcv(jpr_oemp)%laction = .TRUE.  
    438448      CASE( 'conservative'  ) 
    439449         srcv( (/jpr_rain, jpr_snow, jpr_ievp, jpr_tevp/) )%laction = .TRUE. 
     
    479489      CASE default              ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_rcv_qns%cldes' ) 
    480490      END SELECT 
    481       IF( TRIM( sn_rcv_qns%cldes ) == 'mixed oce-ice' .AND. jpl > 1 ) & 
     491      IF( TRIM( sn_rcv_qns%cldes ) == 'mixed oce-ice' .AND. nn_cats_cpl > 1 ) & 
    482492         CALL ctl_stop( 'sbc_cpl_init: sn_rcv_qns%cldes not currently allowed to be mixed oce-ice for multi-category ice' ) 
     493      ! 
    483494      !                                                      ! ------------------------- ! 
    484495      !                                                      !    solar radiation        !   Qsr 
     
    495506      CASE default              ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_rcv_qsr%cldes' ) 
    496507      END SELECT 
    497       IF( TRIM( sn_rcv_qsr%cldes ) == 'mixed oce-ice' .AND. jpl > 1 ) & 
     508      IF( TRIM( sn_rcv_qsr%cldes ) == 'mixed oce-ice' .AND. nn_cats_cpl > 1 ) & 
    498509         CALL ctl_stop( 'sbc_cpl_init: sn_rcv_qsr%cldes not currently allowed to be mixed oce-ice for multi-category ice' ) 
     510      ! 
    499511      !                                                      ! ------------------------- ! 
    500512      !                                                      !   non solar sensitivity   !   d(Qns)/d(T) 
     
    503515      IF( TRIM( sn_rcv_dqnsdt%cldes ) == 'coupled' )   srcv(jpr_dqnsdt)%laction = .TRUE. 
    504516      ! 
    505       ! non solar sensitivity mandatory for LIM ice model 
    506       IF( TRIM( sn_rcv_dqnsdt%cldes ) == 'none' .AND. k_ice /= 0 .AND. k_ice /= 4 .AND. nn_components /= jp_iam_sas ) & 
    507          CALL ctl_stop( 'sbc_cpl_init: sn_rcv_dqnsdt%cldes must be coupled in namsbc_cpl namelist' ) 
    508517      ! non solar sensitivity mandatory for mixed oce-ice solar radiation coupling technique 
    509       IF( TRIM( sn_rcv_dqnsdt%cldes ) == 'none' .AND. TRIM( sn_rcv_qns%cldes ) == 'mixed oce-ice' ) & 
    510          CALL ctl_stop( 'sbc_cpl_init: namsbc_cpl namelist mismatch between sn_rcv_qns%cldes and sn_rcv_dqnsdt%cldes' ) 
     518      IF( TRIM( sn_rcv_dqnsdt%cldes ) == 'none' .AND. TRIM( sn_rcv_qns%cldes ) == 'mixed oce-ice' )  & 
     519         &   CALL ctl_stop( 'sbc_cpl_init: namsbc_cpl namelist mismatch between sn_rcv_qns%cldes and sn_rcv_dqnsdt%cldes' ) 
     520      ! 
    511521      !                                                      ! ------------------------- ! 
    512522      !                                                      !      10m wind module      !    
     
    519529      srcv(jpr_taum)%clname = 'O_TauMod'   ;   IF( TRIM(sn_rcv_taumod%cldes) == 'coupled' )   srcv(jpr_taum)%laction = .TRUE. 
    520530      lhftau = srcv(jpr_taum)%laction 
    521  
     531      ! 
    522532      !                                                      ! ------------------------- ! 
    523533      !                                                      !      Atmospheric CO2      ! 
     
    531541         IF(lwp) WRITE(numout,*) 
    532542      ENDIF 
    533  
     543      ! 
    534544      !                                                      ! ------------------------- !  
    535545      !                                                      ! Mean Sea Level Pressure   !  
    536546      !                                                      ! ------------------------- !  
    537547      srcv(jpr_mslp)%clname = 'O_MSLP'     ;   IF( TRIM(sn_rcv_mslp%cldes  ) == 'coupled' )    srcv(jpr_mslp)%laction = .TRUE.  
    538  
    539       !                                                      ! ------------------------- ! 
    540       !                                                      !   topmelt and botmelt     !    
     548      ! 
     549      !                                                      ! ------------------------- ! 
     550      !                                                      !  ice topmelt and botmelt  !    
    541551      !                                                      ! ------------------------- ! 
    542552      srcv(jpr_topm )%clname = 'OTopMlt' 
     
    544554      IF( TRIM(sn_rcv_iceflx%cldes) == 'coupled' ) THEN 
    545555         IF ( TRIM( sn_rcv_iceflx%clcat ) == 'yes' ) THEN 
    546             srcv(jpr_topm:jpr_botm)%nct = jpl 
     556            srcv(jpr_topm:jpr_botm)%nct = nn_cats_cpl 
    547557         ELSE 
    548558            CALL ctl_stop( 'sbc_cpl_init: sn_rcv_iceflx%clcat should always be set to yes currently' ) 
     
    550560         srcv(jpr_topm:jpr_botm)%laction = .TRUE. 
    551561      ENDIF 
     562      !                                                      ! ------------------------- ! 
     563      !                                                      !    ice skin temperature   !    
     564      !                                                      ! ------------------------- ! 
     565      srcv(jpr_ts_ice)%clname = 'OTsfIce'    ! needed by Met Office 
     566      IF ( TRIM( sn_rcv_ts_ice%cldes ) == 'ice' )   srcv(jpr_ts_ice)%laction = .TRUE. 
     567      IF ( TRIM( sn_rcv_ts_ice%clcat ) == 'yes' )   srcv(jpr_ts_ice)%nct     = nn_cats_cpl 
     568      IF ( TRIM( sn_rcv_emp%clcat    ) == 'yes' )   srcv(jpr_ievp)%nct       = nn_cats_cpl 
     569 
    552570      !                                                      ! ------------------------- ! 
    553571      !                                                      !      Wave breaking        !     
     
    593611         cpl_wdrag = .TRUE. 
    594612      ENDIF 
    595       !  
    596613      !                                                      ! ------------------------------- ! 
    597614      !                                                      !   OPA-SAS coupling - rcv by opa !    
     
    710727      !                                                      !    Surface temperature    ! 
    711728      !                                                      ! ------------------------- ! 
    712       ssnd(jps_toce)%clname = 'O_SSTSST' 
    713       ssnd(jps_tice)%clname = 'O_TepIce' 
    714       ssnd(jps_tmix)%clname = 'O_TepMix' 
     729      ssnd(jps_toce)%clname   = 'O_SSTSST' 
     730      ssnd(jps_tice)%clname   = 'O_TepIce' 
     731      ssnd(jps_ttilyr)%clname = 'O_TtiLyr' 
     732      ssnd(jps_tmix)%clname   = 'O_TepMix' 
    715733      SELECT CASE( TRIM( sn_snd_temp%cldes ) ) 
    716734      CASE( 'none'                                 )       ! nothing to do 
    717735      CASE( 'oce only'                             )   ;   ssnd( jps_toce )%laction = .TRUE. 
    718       CASE( 'oce and ice' , 'weighted oce and ice' ) 
     736      CASE( 'oce and ice' , 'weighted oce and ice' , 'oce and weighted ice' ) 
    719737         ssnd( (/jps_toce, jps_tice/) )%laction = .TRUE. 
    720          IF ( TRIM( sn_snd_temp%clcat ) == 'yes' )  ssnd(jps_tice)%nct = jpl 
     738         IF ( TRIM( sn_snd_temp%clcat ) == 'yes' )  ssnd(jps_tice)%nct = nn_cats_cpl 
    721739      CASE( 'mixed oce-ice'                        )   ;   ssnd( jps_tmix )%laction = .TRUE. 
    722740      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_temp%cldes' ) 
     
    739757      !     2. receiving mixed oce-ice solar radiation  
    740758      IF ( TRIM ( sn_snd_alb%cldes ) == 'mixed oce-ice' .OR. TRIM ( sn_rcv_qsr%cldes ) == 'mixed oce-ice' ) THEN 
    741          CALL albedo_oce( zaos, zacs ) 
     759         CALL oce_alb( zaos, zacs ) 
    742760         ! Due to lack of information on nebulosity : mean clear/overcast sky 
    743          albedo_oce_mix(:,:) = ( zacs(:,:) + zaos(:,:) ) * 0.5 
    744       ENDIF 
    745  
     761         alb_oce_mix(:,:) = ( zacs(:,:) + zaos(:,:) ) * 0.5 
     762      ENDIF 
    746763      !                                                      ! ------------------------- ! 
    747764      !                                                      !  Ice fraction & Thickness !  
    748765      !                                                      ! ------------------------- ! 
    749       ssnd(jps_fice)%clname = 'OIceFrc' 
     766      ssnd(jps_fice)%clname  = 'OIceFrc' 
    750767      ssnd(jps_ficet)%clname = 'OIceFrcT'  
    751       ssnd(jps_hice)%clname = 'OIceTck' 
    752       ssnd(jps_hsnw)%clname = 'OSnwTck' 
     768      ssnd(jps_hice)%clname  = 'OIceTck' 
     769      ssnd(jps_a_p)%clname   = 'OPndFrc' 
     770      ssnd(jps_ht_p)%clname  = 'OPndTck' 
     771      ssnd(jps_hsnw)%clname  = 'OSnwTck' 
     772      ssnd(jps_fice1)%clname = 'OIceFrd' 
    753773      IF( k_ice /= 0 ) THEN 
    754          ssnd(jps_fice)%laction = .TRUE.                  ! if ice treated in the ocean (even in climato case) 
     774         ssnd(jps_fice)%laction  = .TRUE.                 ! if ice treated in the ocean (even in climato case) 
     775         ssnd(jps_fice1)%laction = .TRUE.                 ! First-order regridded ice concentration, to be used producing atmos-to-ice fluxes (Met Office requirement) 
    755776! Currently no namelist entry to determine sending of multi-category ice fraction so use the thickness entry for now 
    756          IF ( TRIM( sn_snd_thick%clcat ) == 'yes' ) ssnd(jps_fice)%nct = jpl 
     777         IF ( TRIM( sn_snd_thick%clcat  ) == 'yes' ) ssnd(jps_fice)%nct  = nn_cats_cpl 
     778         IF ( TRIM( sn_snd_thick1%clcat ) == 'yes' ) ssnd(jps_fice1)%nct = nn_cats_cpl 
    757779      ENDIF 
    758780       
     
    764786         ssnd(jps_hice:jps_hsnw)%laction = .TRUE. 
    765787         IF ( TRIM( sn_snd_thick%clcat ) == 'yes' ) THEN 
    766             ssnd(jps_hice:jps_hsnw)%nct = jpl 
     788            ssnd(jps_hice:jps_hsnw)%nct = nn_cats_cpl 
    767789         ENDIF 
    768790      CASE ( 'weighted ice and snow' )  
    769791         ssnd(jps_hice:jps_hsnw)%laction = .TRUE. 
    770          IF ( TRIM( sn_snd_thick%clcat ) == 'yes' ) ssnd(jps_hice:jps_hsnw)%nct = jpl 
     792         IF ( TRIM( sn_snd_thick%clcat ) == 'yes' ) ssnd(jps_hice:jps_hsnw)%nct = nn_cats_cpl 
    771793      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_thick%cldes' ) 
    772794      END SELECT 
    773795 
     796      !                                                      ! ------------------------- !  
     797      !                                                      !      Ice Meltponds        !  
     798      !                                                      ! ------------------------- !  
     799      ! Needed by Met Office 
     800      ssnd(jps_a_p)%clname  = 'OPndFrc'     
     801      ssnd(jps_ht_p)%clname = 'OPndTck'     
     802      SELECT CASE ( TRIM( sn_snd_mpnd%cldes ) )  
     803      CASE ( 'none' )  
     804         ssnd(jps_a_p)%laction  = .FALSE.  
     805         ssnd(jps_ht_p)%laction = .FALSE.  
     806      CASE ( 'ice only' )   
     807         ssnd(jps_a_p)%laction  = .TRUE.  
     808         ssnd(jps_ht_p)%laction = .TRUE.  
     809         IF ( TRIM( sn_snd_mpnd%clcat ) == 'yes' ) THEN  
     810            ssnd(jps_a_p)%nct  = nn_cats_cpl  
     811            ssnd(jps_ht_p)%nct = nn_cats_cpl  
     812         ELSE  
     813            IF ( nn_cats_cpl > 1 ) THEN  
     814               CALL ctl_stop( 'sbc_cpl_init: use weighted ice option for sn_snd_mpnd%cldes if not exchanging category fields' )  
     815            ENDIF  
     816         ENDIF  
     817      CASE ( 'weighted ice' )   
     818         ssnd(jps_a_p)%laction  = .TRUE.  
     819         ssnd(jps_ht_p)%laction = .TRUE.  
     820         IF ( TRIM( sn_snd_mpnd%clcat ) == 'yes' ) THEN  
     821            ssnd(jps_a_p)%nct  = nn_cats_cpl   
     822            ssnd(jps_ht_p)%nct = nn_cats_cpl   
     823         ENDIF  
     824      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_mpnd%cldes; '//sn_snd_mpnd%cldes )  
     825      END SELECT  
     826  
    774827      !                                                      ! ------------------------- ! 
    775828      !                                                      !      Surface current      ! 
     
    821874      !                                                      ! ------------------------- ! 
    822875      ssnd(jps_co2)%clname = 'O_CO2FLX' ;  IF( TRIM(sn_snd_co2%cldes) == 'coupled' )    ssnd(jps_co2 )%laction = .TRUE. 
    823  
     876      !  
     877      !                                                      ! ------------------------- !  
     878      !                                                      ! Sea surface freezing temp !  
     879      !                                                      ! ------------------------- !  
     880      ! needed by Met Office 
     881      ssnd(jps_sstfrz)%clname = 'O_SSTFrz' ; IF( TRIM(sn_snd_sstfrz%cldes) == 'coupled' )  ssnd(jps_sstfrz)%laction = .TRUE.  
     882      !  
     883      !                                                      ! ------------------------- !  
     884      !                                                      !    Ice conductivity       !  
     885      !                                                      ! ------------------------- !  
     886      ! needed by Met Office 
     887      ! Note that ultimately we will move to passing an ocean effective conductivity as well so there  
     888      ! will be some changes to the parts of the code which currently relate only to ice conductivity  
     889      ssnd(jps_ttilyr )%clname = 'O_TtiLyr'  
     890      SELECT CASE ( TRIM( sn_snd_ttilyr%cldes ) )  
     891      CASE ( 'none' )  
     892         ssnd(jps_ttilyr)%laction = .FALSE.  
     893      CASE ( 'ice only' )  
     894         ssnd(jps_ttilyr)%laction = .TRUE.  
     895         IF ( TRIM( sn_snd_ttilyr%clcat ) == 'yes' ) THEN  
     896            ssnd(jps_ttilyr)%nct = nn_cats_cpl  
     897         ELSE  
     898            IF ( nn_cats_cpl > 1 ) THEN  
     899               CALL ctl_stop( 'sbc_cpl_init: use weighted ice option for sn_snd_ttilyr%cldes if not exchanging category fields' )  
     900            ENDIF  
     901         ENDIF  
     902      CASE ( 'weighted ice' )  
     903         ssnd(jps_ttilyr)%laction = .TRUE.  
     904         IF ( TRIM( sn_snd_ttilyr%clcat ) == 'yes' ) ssnd(jps_ttilyr)%nct = nn_cats_cpl  
     905      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_ttilyr%cldes;'//sn_snd_ttilyr%cldes )  
     906      END SELECT  
     907 
     908      ssnd(jps_kice )%clname = 'OIceKn'  
     909      SELECT CASE ( TRIM( sn_snd_cond%cldes ) )  
     910      CASE ( 'none' )  
     911         ssnd(jps_kice)%laction = .FALSE.  
     912      CASE ( 'ice only' )  
     913         ssnd(jps_kice)%laction = .TRUE.  
     914         IF ( TRIM( sn_snd_cond%clcat ) == 'yes' ) THEN  
     915            ssnd(jps_kice)%nct = nn_cats_cpl  
     916         ELSE  
     917            IF ( nn_cats_cpl > 1 ) THEN  
     918               CALL ctl_stop( 'sbc_cpl_init: use weighted ice option for sn_snd_cond%cldes if not exchanging category fields' )  
     919            ENDIF  
     920         ENDIF  
     921      CASE ( 'weighted ice' )  
     922         ssnd(jps_kice)%laction = .TRUE.  
     923         IF ( TRIM( sn_snd_cond%clcat ) == 'yes' ) ssnd(jps_kice)%nct = nn_cats_cpl  
     924      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_cond%cldes;'//sn_snd_cond%cldes )  
     925      END SELECT  
     926      !  
    824927      !                                                      ! ------------------------- !  
    825928      !                                                      !     Sea surface height    !  
     
    9221025      IF( ln_dm2dc .AND. ln_cpl ) ncpl_qsr_freq = 86400 / ncpl_qsr_freq 
    9231026 
    924       CALL wrk_dealloc( jpi,jpj,   zacs, zaos ) 
    9251027      ! 
    9261028      IF( nn_timing == 1 )   CALL timing_stop('sbc_cpl_init') 
     
    9741076      !!                        emp          upward mass flux [evap. - precip. (- runoffs) (- calving)] (ocean only case) 
    9751077      !!---------------------------------------------------------------------- 
    976       USE zdf_oce,  ONLY : ln_zdfqiao 
    977  
    978       IMPLICIT NONE 
    979  
    980       INTEGER, INTENT(in)           ::   kt          ! ocean model time step index 
    981       INTEGER, INTENT(in)           ::   k_fsbc      ! frequency of sbc (-> ice model) computation  
    982       INTEGER, INTENT(in)           ::   k_ice       ! ice management in the sbc (=0/1/2/3) 
     1078      USE zdf_oce,  ONLY :   ln_zdfswm 
     1079      ! 
     1080      INTEGER, INTENT(in) ::   kt          ! ocean model time step index 
     1081      INTEGER, INTENT(in) ::   k_fsbc      ! frequency of sbc (-> ice model) computation  
     1082      INTEGER, INTENT(in) ::   k_ice       ! ice management in the sbc (=0/1/2/3) 
    9831083      !! 
    9841084      LOGICAL  ::   llnewtx, llnewtau      ! update wind stress components and module?? 
     
    9901090      REAL(wp) ::   zcdrag = 1.5e-3        ! drag coefficient 
    9911091      REAL(wp) ::   zzx, zzy               ! temporary variables 
    992       REAL(wp), POINTER, DIMENSION(:,:) ::   ztx, zty, zmsk, zemp, zqns, zqsr 
     1092      REAL(wp), DIMENSION(jpi,jpj) ::   ztx, zty, zmsk, zemp, zqns, zqsr 
    9931093      !!---------------------------------------------------------------------- 
    9941094      ! 
    9951095      IF( nn_timing == 1 )   CALL timing_start('sbc_cpl_rcv') 
    996       ! 
    997       CALL wrk_alloc( jpi,jpj,   ztx, zty, zmsk, zemp, zqns, zqsr ) 
    9981096      ! 
    9991097      IF( ln_mixcpl )   zmsk(:,:) = 1. - xcplmask(:,:,0) 
     
    10671165      !                                                      !    wind stress module     !   (taum) 
    10681166      !                                                      ! ========================= ! 
    1069       ! 
    10701167      IF( .NOT. srcv(jpr_taum)%laction ) THEN                    ! compute wind stress module from its components if not received  
    10711168         ! => need to be done only when otx1 was changed 
     
    10941191      !                                                      !      10 m wind speed      !   (wndm) 
    10951192      !                                                      ! ========================= ! 
    1096       ! 
    10971193      IF( .NOT. srcv(jpr_w10m)%laction ) THEN                    ! compute wind spreed from wind stress module if not received   
    10981194         ! => need to be done only when taumod was changed 
     
    11301226      !                                                      ! ================== ! 
    11311227      IF( srcv(jpr_co2)%laction )   atm_co2(:,:) = frcv(jpr_co2)%z3(:,:,1) 
    1132       !  
     1228      ! 
     1229      !                                                      ! ================== ! 
     1230      !                                                      !   ice skin temp.   ! 
     1231      !                                                      ! ================== ! 
     1232#if defined key_lim3 
     1233      ! needed by Met Office 
     1234      IF( srcv(jpr_ts_ice)%laction ) THEN  
     1235         WHERE    ( frcv(jpr_ts_ice)%z3(:,:,:) > 0.0  )   ;   tsfc_ice(:,:,:) = 0.0  
     1236         ELSEWHERE( frcv(jpr_ts_ice)%z3(:,:,:) < -60. )   ;   tsfc_ice(:,:,:) = -60. 
     1237         ELSEWHERE                                        ;   tsfc_ice(:,:,:) = frcv(jpr_ts_ice)%z3(:,:,:) 
     1238         END WHERE 
     1239      ENDIF  
     1240#endif 
    11331241      !                                                      ! ========================= !  
    11341242      !                                                      ! Mean Sea Level Pressure   !   (taum)  
    11351243      !                                                      ! ========================= !  
    1136       !  
    11371244      IF( srcv(jpr_mslp)%laction ) THEN                    ! UKMO SHELF effect of atmospheric pressure on SSH  
    11381245          IF( kt /= nit000 )   ssh_ibb(:,:) = ssh_ib(:,:)    !* Swap of ssh_ib fields  
     
    11461253      ! 
    11471254      IF( ln_sdw ) THEN  ! Stokes Drift correction activated 
    1148       !                                                      ! ========================= !  
    1149       !                                                      !       Stokes drift u      ! 
    1150       !                                                      ! ========================= !  
    1151          IF( srcv(jpr_sdrftx)%laction ) ut0sd(:,:) = frcv(jpr_sdrftx)%z3(:,:,1) 
    1152       ! 
    1153       !                                                      ! ========================= !  
    1154       !                                                      !       Stokes drift v      ! 
    1155       !                                                      ! ========================= !  
    1156          IF( srcv(jpr_sdrfty)%laction ) vt0sd(:,:) = frcv(jpr_sdrfty)%z3(:,:,1) 
    1157       ! 
    1158       !                                                      ! ========================= !  
    1159       !                                                      !      Wave mean period     ! 
    1160       !                                                      ! ========================= !  
    1161          IF( srcv(jpr_wper)%laction ) wmp(:,:) = frcv(jpr_wper)%z3(:,:,1) 
    1162       ! 
    1163       !                                                      ! ========================= !  
    1164       !                                                      !  Significant wave height  ! 
    1165       !                                                      ! ========================= !  
    1166          IF( srcv(jpr_hsig)%laction ) hsw(:,:) = frcv(jpr_hsig)%z3(:,:,1) 
    1167       ! 
    1168       !                                                      ! ========================= !  
    1169       !                                                      !    Vertical mixing Qiao   ! 
    1170       !                                                      ! ========================= !  
    1171          IF( srcv(jpr_wnum)%laction .AND. ln_zdfqiao ) wnum(:,:) = frcv(jpr_wnum)%z3(:,:,1) 
     1255         !                                                   ! ========================= !  
     1256         !                                                   !       Stokes drift u      ! 
     1257         !                                                   ! ========================= !  
     1258         IF( srcv(jpr_sdrftx)%laction )   ut0sd(:,:) = frcv(jpr_sdrftx)%z3(:,:,1) 
     1259         ! 
     1260         !                                                   ! ========================= !  
     1261         !                                                   !       Stokes drift v      ! 
     1262         !                                                   ! ========================= !  
     1263         IF( srcv(jpr_sdrfty)%laction )   vt0sd(:,:) = frcv(jpr_sdrfty)%z3(:,:,1) 
     1264         ! 
     1265         !                                                   ! ========================= !  
     1266         !                                                   !      Wave mean period     ! 
     1267         !                                                   ! ========================= !  
     1268         IF( srcv(jpr_wper)%laction   )  wmp(:,:) = frcv(jpr_wper)%z3(:,:,1) 
     1269         ! 
     1270         !                                                   ! ========================= !  
     1271         !                                                   !  Significant wave height  ! 
     1272         !                                                   ! ========================= !  
     1273         IF( srcv(jpr_hsig)%laction   )  hsw(:,:) = frcv(jpr_hsig)%z3(:,:,1) 
     1274         ! 
     1275         !                                                   ! ========================= !  
     1276         !                                                   !    surface wave mixing    ! 
     1277         !                                                   ! ========================= !  
     1278         IF( srcv(jpr_wnum)%laction .AND. ln_zdfswm )  wnum(:,:) = frcv(jpr_wnum)%z3(:,:,1) 
    11721279 
    11731280         ! Calculate the 3D Stokes drift both in coupled and not fully uncoupled mode 
    11741281         IF( srcv(jpr_sdrftx)%laction .OR. srcv(jpr_sdrfty)%laction .OR. srcv(jpr_wper)%laction & 
    1175                                                                     .OR. srcv(jpr_hsig)%laction ) THEN 
     1282            &                                                       .OR. srcv(jpr_hsig)%laction ) THEN 
    11761283            CALL sbc_stokes() 
    11771284         ENDIF 
     
    11801287      !                                                      ! Stress adsorbed by waves  ! 
    11811288      !                                                      ! ========================= !  
    1182       IF( srcv(jpr_wstrf)%laction .AND. ln_tauoc ) tauoc_wave(:,:) = frcv(jpr_wstrf)%z3(:,:,1) 
     1289      IF( srcv(jpr_wstrf)%laction .AND. ln_tauoc )   tauoc_wave(:,:) = frcv(jpr_wstrf)%z3(:,:,1) 
    11831290 
    11841291      !                                                      ! ========================= !  
    11851292      !                                                      !   Wave drag coefficient   ! 
    11861293      !                                                      ! ========================= !  
    1187       IF( srcv(jpr_wdrag)%laction .AND. ln_cdgw ) cdn_wave(:,:) = frcv(jpr_wdrag)%z3(:,:,1) 
     1294      IF( srcv(jpr_wdrag)%laction .AND. ln_cdgw )   cdn_wave(:,:) = frcv(jpr_wdrag)%z3(:,:,1) 
    11881295 
    11891296      !  Fields received by SAS when OASIS coupling 
     
    12181325      IF( srcv(jpr_ocx1)%laction ) THEN                      ! received by sas in case of opa <-> sas coupling 
    12191326         ssu_m(:,:) = frcv(jpr_ocx1)%z3(:,:,1) 
    1220          ub (:,:,1) = ssu_m(:,:)                             ! will be used in sbcice_lim in the call of lim_sbc_tau 
     1327         ub (:,:,1) = ssu_m(:,:)                             ! will be used in icestp in the call of lim_sbc_tau 
    12211328         un (:,:,1) = ssu_m(:,:)                             ! will be used in sbc_cpl_snd if atmosphere coupling 
    12221329         CALL iom_put( 'ssu_m', ssu_m ) 
     
    12241331      IF( srcv(jpr_ocy1)%laction ) THEN 
    12251332         ssv_m(:,:) = frcv(jpr_ocy1)%z3(:,:,1) 
    1226          vb (:,:,1) = ssv_m(:,:)                             ! will be used in sbcice_lim in the call of lim_sbc_tau 
     1333         vb (:,:,1) = ssv_m(:,:)                             ! will be used in icestp in the call of lim_sbc_tau 
    12271334         vn (:,:,1) = ssv_m(:,:)                             ! will be used in sbc_cpl_snd if atmosphere coupling 
    12281335         CALL iom_put( 'ssv_m', ssv_m ) 
     
    13101417         ! 
    13111418      ENDIF 
    1312       ! 
    1313       CALL wrk_dealloc( jpi,jpj,   ztx, zty, zmsk, zemp, zqns, zqsr ) 
    13141419      ! 
    13151420      IF( nn_timing == 1 )   CALL timing_stop('sbc_cpl_rcv') 
     
    13561461      INTEGER ::   ji, jj   ! dummy loop indices 
    13571462      INTEGER ::   itx      ! index of taux over ice 
    1358       REAL(wp), POINTER, DIMENSION(:,:) ::   ztx, zty  
     1463      REAL(wp), DIMENSION(jpi,jpj) ::   ztx, zty  
    13591464      !!---------------------------------------------------------------------- 
    13601465      ! 
    13611466      IF( nn_timing == 1 )   CALL timing_start('sbc_cpl_ice_tau') 
    13621467      ! 
    1363       CALL wrk_alloc( jpi,jpj,   ztx, zty ) 
    1364  
    13651468      IF( srcv(jpr_itx1)%laction ) THEN   ;   itx =  jpr_itx1    
    13661469      ELSE                                ;   itx =  jpr_otx1 
     
    15211624      ENDIF 
    15221625      !    
    1523       CALL wrk_dealloc( jpi,jpj,   ztx, zty ) 
    1524       ! 
    15251626      IF( nn_timing == 1 )   CALL timing_stop('sbc_cpl_ice_tau') 
    15261627      ! 
     
    15281629    
    15291630 
    1530    SUBROUTINE sbc_cpl_ice_flx( p_frld, palbi, psst, pist ) 
     1631   SUBROUTINE sbc_cpl_ice_flx( picefr, palbi, psst, pist, phs, phi ) 
    15311632      !!---------------------------------------------------------------------- 
    15321633      !!             ***  ROUTINE sbc_cpl_ice_flx  *** 
     
    15611662      !! 
    15621663      !! ** Details 
    1563       !!             qns_tot = pfrld * qns_oce + ( 1 - pfrld ) * qns_ice   => provided 
     1664      !!             qns_tot = (1-a) * qns_oce + a * qns_ice               => provided 
    15641665      !!                     + qemp_oce + qemp_ice                         => recalculated and added up to qns 
    15651666      !! 
    1566       !!             qsr_tot = pfrld * qsr_oce + ( 1 - pfrld ) * qsr_ice   => provided 
     1667      !!             qsr_tot = (1-a) * qsr_oce + a * qsr_ice               => provided 
    15671668      !! 
    15681669      !!             emp_tot = emp_oce + emp_ice                           => calving is provided and added to emp_tot (and emp_oce). 
     
    15781679      !!                   sprecip           solid precipitation over the ocean   
    15791680      !!---------------------------------------------------------------------- 
    1580       REAL(wp), INTENT(in   ), DIMENSION(:,:)   ::   p_frld     ! lead fraction                [0 to 1] 
    1581       ! optional arguments, used only in 'mixed oce-ice' case 
    1582       REAL(wp), INTENT(in   ), DIMENSION(:,:,:), OPTIONAL ::   palbi      ! all skies ice albedo  
    1583       REAL(wp), INTENT(in   ), DIMENSION(:,:  ), OPTIONAL ::   psst       ! sea surface temperature     [Celsius] 
    1584       REAL(wp), INTENT(in   ), DIMENSION(:,:,:), OPTIONAL ::   pist       ! ice surface temperature     [Kelvin] 
    1585       ! 
    1586       INTEGER ::   jl         ! dummy loop index 
    1587       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zcptn, zcptrain, zcptsnw, zicefr, zmsk, zsnw 
    1588       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip, zevap_oce, zevap_ice, zdevap_ice 
    1589       REAL(wp), POINTER, DIMENSION(:,:  ) ::   zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice 
    1590       REAL(wp), POINTER, DIMENSION(:,:,:) ::   zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice 
     1681      REAL(wp), INTENT(in), DIMENSION(:,:)             ::   picefr     ! ice fraction                [0 to 1] 
     1682      !                                                !!           ! optional arguments, used only in 'mixed oce-ice' case 
     1683      REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL ::   palbi      ! all skies ice albedo  
     1684      REAL(wp), INTENT(in), DIMENSION(:,:  ), OPTIONAL ::   psst       ! sea surface temperature     [Celsius] 
     1685      REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL ::   pist       ! ice surface temperature     [Kelvin] 
     1686      REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL ::   phs        ! snow depth                  [m] 
     1687      REAL(wp), INTENT(in), DIMENSION(:,:,:), OPTIONAL ::   phi        ! ice thickness               [m] 
     1688      ! 
     1689      INTEGER  ::   ji, jj, jl   ! dummy loop index 
     1690      REAL(wp) ::   ztri         ! local scalar 
     1691      REAL(wp), DIMENSION(jpi,jpj)     ::   zcptn, zcptrain, zcptsnw, ziceld, zmsk, zsnw 
     1692      REAL(wp), DIMENSION(jpi,jpj)     ::   zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip  , zevap_oce, zdevap_ice 
     1693      REAL(wp), DIMENSION(jpi,jpj)     ::   zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice 
     1694      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice, zevap_ice    !!gm , zfrqsr_tr_i 
    15911695      !!---------------------------------------------------------------------- 
    15921696      ! 
    15931697      IF( nn_timing == 1 )  CALL timing_start('sbc_cpl_ice_flx') 
    15941698      ! 
    1595       CALL wrk_alloc( jpi,jpj,     zcptn, zcptrain, zcptsnw, zicefr, zmsk, zsnw ) 
    1596       CALL wrk_alloc( jpi,jpj,     zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip, zevap_oce, zevap_ice, zdevap_ice ) 
    1597       CALL wrk_alloc( jpi,jpj,     zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice ) 
    1598       CALL wrk_alloc( jpi,jpj,jpl, zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice ) 
    1599  
    16001699      IF( ln_mixcpl )   zmsk(:,:) = 1. - xcplmask(:,:,0) 
    1601       zicefr(:,:) = 1.- p_frld(:,:) 
    1602       zcptn(:,:) = rcp * sst_m(:,:) 
     1700      ziceld(:,:) = 1._wp - picefr(:,:) 
     1701      zcptn (:,:) = rcp * sst_m(:,:) 
    16031702      ! 
    16041703      !                                                      ! ========================= ! 
     
    16151714         ztprecip(:,:) =   frcv(jpr_rain)%z3(:,:,1) + zsprecip(:,:)  ! May need to ensure positive here 
    16161715         zemp_tot(:,:) =   frcv(jpr_tevp)%z3(:,:,1) - ztprecip(:,:) 
    1617          zemp_ice(:,:) = ( frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_snow)%z3(:,:,1) ) * zicefr(:,:) 
     1716         zemp_ice(:,:) = ( frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_snow)%z3(:,:,1) ) * picefr(:,:) 
    16181717      CASE( 'oce and ice'   )   ! received fields: jpr_sbpr, jpr_semp, jpr_oemp, jpr_ievp 
    1619          zemp_tot(:,:) = p_frld(:,:) * frcv(jpr_oemp)%z3(:,:,1) + zicefr(:,:) * frcv(jpr_sbpr)%z3(:,:,1) 
    1620          zemp_ice(:,:) = frcv(jpr_semp)%z3(:,:,1) * zicefr(:,:) 
     1718         zemp_tot(:,:) = ziceld(:,:) * frcv(jpr_oemp)%z3(:,:,1) + picefr(:,:) * frcv(jpr_sbpr)%z3(:,:,1) 
     1719         zemp_ice(:,:) = frcv(jpr_semp)%z3(:,:,1) * picefr(:,:) 
    16211720         zsprecip(:,:) = frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_semp)%z3(:,:,1) 
    16221721         ztprecip(:,:) = frcv(jpr_semp)%z3(:,:,1) - frcv(jpr_sbpr)%z3(:,:,1) + zsprecip(:,:) 
     
    16241723 
    16251724#if defined key_lim3 
    1626       ! zsnw = snow fraction over ice after wind blowing (=zicefr if no blowing) 
    1627       zsnw(:,:) = 0._wp  ;  CALL lim_thd_snwblow( p_frld, zsnw ) 
     1725      ! zsnw = snow fraction over ice after wind blowing (=picefr if no blowing) 
     1726      zsnw(:,:) = 0._wp   ;   CALL ice_thd_snwblow( ziceld, zsnw ) 
    16281727       
    16291728      ! --- evaporation minus precipitation corrected (because of wind blowing on snow) --- ! 
    1630       zemp_ice(:,:) = zemp_ice(:,:) + zsprecip(:,:) * ( zicefr(:,:) - zsnw(:,:) )  ! emp_ice = A * sublimation - zsnw * sprecip 
     1729      zemp_ice(:,:) = zemp_ice(:,:) + zsprecip(:,:) * ( picefr(:,:) - zsnw(:,:) )  ! emp_ice = A * sublimation - zsnw * sprecip 
    16311730      zemp_oce(:,:) = zemp_tot(:,:) - zemp_ice(:,:)                                ! emp_oce = emp_tot - emp_ice 
    16321731 
    16331732      ! --- evaporation over ocean (used later for qemp) --- ! 
    1634       zevap_oce(:,:) = frcv(jpr_tevp)%z3(:,:,1) - frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) 
     1733      zevap_oce(:,:) = frcv(jpr_tevp)%z3(:,:,1) - frcv(jpr_ievp)%z3(:,:,1) * picefr(:,:) 
    16351734 
    16361735      ! --- evaporation over ice (kg/m2/s) --- ! 
    1637       zevap_ice(:,:) = frcv(jpr_ievp)%z3(:,:,1) 
     1736      DO jl=1,jpl 
     1737         IF (sn_rcv_emp%clcat == 'yes') THEN   ;   zevap_ice(:,:,jl) = frcv(jpr_ievp)%z3(:,:,jl) 
     1738         ELSE                                  ;   zevap_ice(:,:,jl) = frcv(jpr_ievp)%z3(:,:,1 )   ;   ENDIF 
     1739      ENDDO 
     1740 
    16381741      ! since the sensitivity of evap to temperature (devap/dT) is not prescribed by the atmosphere, we set it to 0 
    16391742      ! therefore, sublimation is not redistributed over the ice categories when no subgrid scale fluxes are provided by atm. 
     
    16621765         sprecip(:,:) = sprecip(:,:) * xcplmask(:,:,0) + zsprecip(:,:) * zmsk(:,:) 
    16631766         tprecip(:,:) = tprecip(:,:) * xcplmask(:,:,0) + ztprecip(:,:) * zmsk(:,:) 
    1664          DO jl=1,jpl 
    1665             evap_ice (:,:,jl) = evap_ice (:,:,jl) * xcplmask(:,:,0) + zevap_ice (:,:) * zmsk(:,:) 
    1666             devap_ice(:,:,jl) = devap_ice(:,:,jl) * xcplmask(:,:,0) + zdevap_ice(:,:) * zmsk(:,:) 
    1667          ENDDO 
     1767         DO jl = 1, jpl 
     1768            evap_ice (:,:,jl) = evap_ice (:,:,jl) * xcplmask(:,:,0) + zevap_ice (:,:,jl) * zmsk(:,:) 
     1769            devap_ice(:,:,jl) = devap_ice(:,:,jl) * xcplmask(:,:,0) + zdevap_ice(:,:)    * zmsk(:,:) 
     1770         END DO 
    16681771      ELSE 
    1669          emp_tot(:,:) =         zemp_tot(:,:) 
    1670          emp_ice(:,:) =         zemp_ice(:,:) 
    1671          emp_oce(:,:) =         zemp_oce(:,:)      
    1672          sprecip(:,:) =         zsprecip(:,:) 
    1673          tprecip(:,:) =         ztprecip(:,:) 
    1674          DO jl=1,jpl 
    1675             evap_ice (:,:,jl) = zevap_ice (:,:) 
     1772         emp_tot (:,:)   = zemp_tot (:,:) 
     1773         emp_ice (:,:)   = zemp_ice (:,:) 
     1774         emp_oce (:,:)   = zemp_oce (:,:)      
     1775         sprecip (:,:)   = zsprecip (:,:) 
     1776         tprecip (:,:)   = ztprecip (:,:) 
     1777         evap_ice(:,:,:) = zevap_ice(:,:,:) 
     1778         DO jl = 1, jpl 
    16761779            devap_ice(:,:,jl) = zdevap_ice(:,:) 
    1677          ENDDO 
     1780         END DO 
    16781781      ENDIF 
    16791782 
    16801783#else 
    1681       zsnw(:,:) = zicefr(:,:) 
     1784      zsnw(:,:) = picefr(:,:) 
    16821785      ! --- Continental fluxes --- ! 
    16831786      IF( srcv(jpr_rnf)%laction ) THEN   ! runoffs (included in emp later on) 
     
    16941797        fwfisf(:,:) = - frcv(jpr_isf)%z3(:,:,1) 
    16951798      ENDIF 
    1696  
     1799      ! 
    16971800      IF( ln_mixcpl ) THEN 
    16981801         emp_tot(:,:) = emp_tot(:,:) * xcplmask(:,:,0) + zemp_tot(:,:) * zmsk(:,:) 
     
    17061809         tprecip(:,:) =                                  ztprecip(:,:) 
    17071810      ENDIF 
    1708  
     1811      ! 
    17091812#endif 
     1813 
    17101814      ! outputs 
    17111815!!      IF( srcv(jpr_rnf)%laction )   CALL iom_put( 'runoffs' , rnf(:,:) * tmask(:,:,1)                                 )  ! runoff 
     
    17181822      IF( iom_use('snow_ao_cea') )  CALL iom_put( 'snow_ao_cea' , sprecip(:,:) * ( 1._wp - zsnw(:,:) )                  )  ! Snow over ice-free ocean  (cell average) 
    17191823      IF( iom_use('snow_ai_cea') )  CALL iom_put( 'snow_ai_cea' , sprecip(:,:) *           zsnw(:,:)                    )  ! Snow over sea-ice         (cell average) 
    1720       IF( iom_use('subl_ai_cea') )  CALL iom_put( 'subl_ai_cea' , frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) * tmask(:,:,1) )  ! Sublimation over sea-ice (cell average) 
     1824      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) 
    17211825      IF( iom_use('evap_ao_cea') )  CALL iom_put( 'evap_ao_cea' , ( frcv(jpr_tevp)%z3(:,:,1)  & 
    1722          &                                                        - frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) ) * tmask(:,:,1) )  ! ice-free oce evap (cell average) 
     1826         &                                                        - frcv(jpr_ievp)%z3(:,:,1) * picefr(:,:) ) * tmask(:,:,1) )  ! ice-free oce evap (cell average) 
    17231827      ! note: runoff output is done in sbcrnf (which includes icebergs too) and iceshelf output is done in sbcisf 
    17241828      ! 
     
    17331837            zqns_ice(:,:,1:jpl) = frcv(jpr_qnsice)%z3(:,:,1:jpl) 
    17341838         ELSE 
    1735             DO jl=1,jpl 
     1839            DO jl = 1, jpl 
    17361840               zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) ! Set all category values equal 
    1737             ENDDO 
     1841            END DO 
    17381842         ENDIF 
    17391843      CASE( 'oce and ice' )      ! the total flux is computed from ocean and ice fluxes 
    1740          zqns_tot(:,:) =  p_frld(:,:) * frcv(jpr_qnsoce)%z3(:,:,1) 
     1844         zqns_tot(:,:) =  ziceld(:,:) * frcv(jpr_qnsoce)%z3(:,:,1) 
    17411845         IF ( TRIM(sn_rcv_qns%clcat) == 'yes' ) THEN 
    17421846            DO jl=1,jpl 
     
    17451849            ENDDO 
    17461850         ELSE 
    1747             qns_tot(:,:) = qns_tot(:,:) + zicefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 
    1748             DO jl=1,jpl 
    1749                zqns_tot(:,:   ) = zqns_tot(:,:) + zicefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 
     1851            qns_tot(:,:) = qns_tot(:,:) + picefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 
     1852            DO jl = 1, jpl 
     1853               zqns_tot(:,:   ) = zqns_tot(:,:) + picefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 
    17501854               zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) 
    1751             ENDDO 
     1855            END DO 
    17521856         ENDIF 
    17531857      CASE( 'mixed oce-ice' )    ! the ice flux is cumputed from the total flux, the SST and ice informations 
     
    17551859         zqns_tot(:,:  ) = frcv(jpr_qnsmix)%z3(:,:,1) 
    17561860         zqns_ice(:,:,1) = frcv(jpr_qnsmix)%z3(:,:,1)    & 
    1757             &            + frcv(jpr_dqnsdt)%z3(:,:,1) * ( pist(:,:,1) - ( (rt0 + psst(:,:  ) ) * p_frld(:,:)   & 
    1758             &                                           + pist(:,:,1) * zicefr(:,:) ) ) 
     1861            &            + frcv(jpr_dqnsdt)%z3(:,:,1) * ( pist(:,:,1) - ( (rt0 + psst(:,:  ) ) * ziceld(:,:)   & 
     1862            &                                           + pist(:,:,1) * picefr(:,:) ) ) 
    17591863      END SELECT 
    17601864      !                                      
     
    17671871#if defined key_lim3       
    17681872      ! --- non solar flux over ocean --- ! 
    1769       !         note: p_frld cannot be = 0 since we limit the ice concentration to amax 
     1873      !         note: ziceld cannot be = 0 since we limit the ice concentration to amax 
    17701874      zqns_oce = 0._wp 
    1771       WHERE( p_frld /= 0._wp )  zqns_oce(:,:) = ( zqns_tot(:,:) - SUM( a_i * zqns_ice, dim=3 ) ) / p_frld(:,:) 
     1875      WHERE( ziceld /= 0._wp )   zqns_oce(:,:) = ( zqns_tot(:,:) - SUM( a_i * zqns_ice, dim=3 ) ) / ziceld(:,:) 
    17721876 
    17731877      ! Heat content per unit mass of snow (J/kg) 
     
    17761880      ENDWHERE 
    17771881      ! Heat content per unit mass of rain (J/kg) 
    1778       zcptrain(:,:) = rcp * ( SUM( (tn_ice(:,:,:) - rt0) * a_i(:,:,:), dim=3 ) + sst_m(:,:) * p_frld(:,:) )  
     1882      zcptrain(:,:) = rcp * ( SUM( (tn_ice(:,:,:) - rt0) * a_i(:,:,:), dim=3 ) + sst_m(:,:) * ziceld(:,:) )  
    17791883 
    17801884      ! --- enthalpy of snow precip over ice in J/m3 (to be used in 1D-thermo) --- ! 
     
    17911895         &             +   zsprecip(:,:)                   * ( 1._wp - zsnw ) * ( zcptsnw (:,:) - lfus )   ! solid precip over ocean + snow melting 
    17921896      zqemp_ice(:,:) =     zsprecip(:,:)                   * zsnw             * ( zcptsnw (:,:) - lfus )   ! solid precip over ice (qevap_ice=0 since atm. does not take it into account) 
    1793 !!    zqemp_ice(:,:) = -   frcv(jpr_ievp)%z3(:,:,1)        * zicefr(:,:)      *   zcptsnw (:,:)   &        ! ice evap 
     1897!!    zqemp_ice(:,:) = -   frcv(jpr_ievp)%z3(:,:,1)        * picefr(:,:)      *   zcptsnw (:,:)   &        ! ice evap 
    17941898!!       &             +   zsprecip(:,:)                   * zsnw             * zqprec_ice(:,:) * r1_rhosn ! solid precip over ice 
    17951899       
     
    18241928      ! clem: this formulation is certainly wrong... but better than it was... 
    18251929      zqns_tot(:,:) = zqns_tot(:,:)                            &          ! zqns_tot update over free ocean with: 
    1826          &          - (  p_frld(:,:) * zsprecip(:,:) * lfus )  &          ! remove the latent heat flux of solid precip. melting 
     1930         &          - (  ziceld(:,:) * zsprecip(:,:) * lfus )  &          ! remove the latent heat flux of solid precip. melting 
    18271931         &          - (  zemp_tot(:,:)                         &          ! remove the heat content of mass flux (assumed to be at SST) 
    18281932         &             - zemp_ice(:,:) ) * zcptn(:,:)  
    18291933 
    18301934     IF( ln_mixcpl ) THEN 
    1831          qns_tot(:,:) = qns(:,:) * p_frld(:,:) + SUM( qns_ice(:,:,:) * a_i(:,:,:), dim=3 )   ! total flux from blk 
     1935         qns_tot(:,:) = qns(:,:) * ziceld(:,:) + SUM( qns_ice(:,:,:) * a_i(:,:,:), dim=3 )   ! total flux from blk 
    18321936         qns_tot(:,:) = qns_tot(:,:) * xcplmask(:,:,0) +  zqns_tot(:,:)* zmsk(:,:) 
    18331937         DO jl=1,jpl 
     
    18411945#endif 
    18421946      ! outputs 
    1843       IF( srcv(jpr_cal)%laction )    CALL iom_put('hflx_cal_cea' ,   & 
    1844                                              &   - frcv(jpr_cal)%z3(:,:,1) * lfus) ! latent heat from calving 
    1845       IF( srcv(jpr_icb)%laction )    CALL iom_put('hflx_icb_cea' , - frcv(jpr_icb)%z3(:,:,1) * lfus) ! latent heat from icebergs melting 
    1846       IF( iom_use('hflx_snow_cea') ) CALL iom_put('hflx_snow_cea',  sprecip(:,:) * ( zcptsnw(:,:) - Lfus )) ! heat flux from snow (cell average) 
    1847       IF( iom_use('hflx_rain_cea') ) CALL iom_put('hflx_rain_cea',( tprecip(:,:) - sprecip(:,:) ) * zcptrain(:,:)) ! heat flux from rain (cell average) 
    1848       IF( iom_use('hflx_evap_cea') ) CALL iom_put('hflx_evap_cea',(frcv(jpr_tevp)%z3(:,:,1)   & 
    1849                                              &    - frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) & ! heat flux from from evap (cell average) 
     1947      IF( srcv(jpr_cal)%laction )    CALL iom_put('hflx_cal_cea' , - frcv(jpr_cal)%z3(:,:,1) * lfus                                  ) ! latent heat from calving 
     1948      IF( srcv(jpr_icb)%laction )    CALL iom_put('hflx_icb_cea' , - frcv(jpr_icb)%z3(:,:,1) * lfus                                  ) ! latent heat from icebergs melting 
     1949      IF( iom_use('hflx_snow_cea') ) CALL iom_put('hflx_snow_cea',  sprecip(:,:) * ( zcptsnw(:,:) - Lfus )                           ) ! heat flux from snow (cell average) 
     1950      IF( iom_use('hflx_rain_cea') ) CALL iom_put('hflx_rain_cea',( tprecip(:,:) - sprecip(:,:) ) * zcptrain(:,:)                    ) ! heat flux from rain (cell average) 
     1951      IF( iom_use('hflx_evap_cea') ) CALL iom_put('hflx_evap_cea',(frcv(jpr_tevp)%z3(:,:,1) - frcv(jpr_ievp)%z3(:,:,1) * picefr(:,:) & ! heat flux from from evap (cell average) 
    18501952         &                                                        ) * zcptn(:,:) * tmask(:,:,1) ) 
    1851       IF( iom_use('hflx_snow_ao_cea') ) CALL iom_put('hflx_snow_ao_cea',sprecip(:,:)   & 
    1852                                              & * (zcptsnw(:,:) - Lfus) * (1._wp - zsnw(:,:))   ) ! heat flux from snow (over ocean) 
    1853       IF( iom_use('hflx_snow_ai_cea') ) CALL iom_put('hflx_snow_ai_cea',sprecip(:,:) * (zcptsnw(:,:) - Lfus)   & 
    1854                                              & *          zsnw(:,:)    ) ! heat flux from snow (over ice) 
     1953      IF( iom_use('hflx_snow_ao_cea') ) CALL iom_put('hflx_snow_ao_cea',sprecip(:,:) * (zcptsnw(:,:) - Lfus) * (1._wp - zsnw(:,:))   ) ! heat flux from snow (over ocean) 
     1954      IF( iom_use('hflx_snow_ai_cea') ) CALL iom_put('hflx_snow_ai_cea',sprecip(:,:) * (zcptsnw(:,:) - Lfus) *          zsnw(:,:)    ) ! heat flux from snow (over ice) 
    18551955      ! note: hflx for runoff and iceshelf are done in sbcrnf and sbcisf resp. 
    18561956      ! 
     
    18661966         ELSE 
    18671967            ! Set all category values equal for the moment 
    1868             DO jl=1,jpl 
     1968            DO jl = 1, jpl 
    18691969               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 
    1870             ENDDO 
     1970            END DO 
    18711971         ENDIF 
    18721972         zqsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
    18731973         zqsr_ice(:,:,1) = frcv(jpr_qsrice)%z3(:,:,1) 
    18741974      CASE( 'oce and ice' ) 
    1875          zqsr_tot(:,:  ) =  p_frld(:,:) * frcv(jpr_qsroce)%z3(:,:,1) 
     1975         zqsr_tot(:,:  ) =  ziceld(:,:) * frcv(jpr_qsroce)%z3(:,:,1) 
    18761976         IF ( TRIM(sn_rcv_qsr%clcat) == 'yes' ) THEN 
    1877             DO jl=1,jpl 
     1977            DO jl = 1, jpl 
    18781978               zqsr_tot(:,:   ) = zqsr_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qsrice)%z3(:,:,jl)    
    18791979               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,jl) 
    1880             ENDDO 
     1980            END DO 
    18811981         ELSE 
    1882             qsr_tot(:,:   ) = qsr_tot(:,:) + zicefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 
    1883             DO jl=1,jpl 
    1884                zqsr_tot(:,:   ) = zqsr_tot(:,:) + zicefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 
     1982            qsr_tot(:,:   ) = qsr_tot(:,:) + picefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 
     1983            DO jl = 1, jpl 
     1984               zqsr_tot(:,:   ) = zqsr_tot(:,:) + picefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 
    18851985               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 
    1886             ENDDO 
     1986            END DO 
    18871987         ENDIF 
    18881988      CASE( 'mixed oce-ice' ) 
     
    18921992!       ( see OASIS3 user guide, 5th edition, p39 ) 
    18931993         zqsr_ice(:,:,1) = frcv(jpr_qsrmix)%z3(:,:,1) * ( 1.- palbi(:,:,1) )   & 
    1894             &            / (  1.- ( albedo_oce_mix(:,:  ) * p_frld(:,:)       & 
    1895             &                     + palbi         (:,:,1) * zicefr(:,:) ) ) 
     1994            &            / (  1.- ( alb_oce_mix(:,:  ) * ziceld(:,:)       & 
     1995            &                     + palbi      (:,:,1) * picefr(:,:) ) ) 
    18961996      END SELECT 
    18971997      IF( ln_dm2dc .AND. ln_cpl ) THEN   ! modify qsr to include the diurnal cycle 
    18981998         zqsr_tot(:,:  ) = sbc_dcy( zqsr_tot(:,:  ) ) 
    1899          DO jl=1,jpl 
     1999         DO jl = 1, jpl 
    19002000            zqsr_ice(:,:,jl) = sbc_dcy( zqsr_ice(:,:,jl) ) 
    1901          ENDDO 
     2001         END DO 
    19022002      ENDIF 
    19032003 
    19042004#if defined key_lim3 
    19052005      ! --- solar flux over ocean --- ! 
    1906       !         note: p_frld cannot be = 0 since we limit the ice concentration to amax 
     2006      !         note: ziceld cannot be = 0 since we limit the ice concentration to amax 
    19072007      zqsr_oce = 0._wp 
    1908       WHERE( p_frld /= 0._wp )  zqsr_oce(:,:) = ( zqsr_tot(:,:) - SUM( a_i * zqsr_ice, dim=3 ) ) / p_frld(:,:) 
     2008      WHERE( ziceld /= 0._wp )  zqsr_oce(:,:) = ( zqsr_tot(:,:) - SUM( a_i * zqsr_ice, dim=3 ) ) / ziceld(:,:) 
    19092009 
    19102010      IF( ln_mixcpl ) THEN   ;   qsr_oce(:,:) = qsr_oce(:,:) * xcplmask(:,:,0) +  zqsr_oce(:,:)* zmsk(:,:) 
     
    19132013 
    19142014      IF( ln_mixcpl ) THEN 
    1915          qsr_tot(:,:) = qsr(:,:) * p_frld(:,:) + SUM( qsr_ice(:,:,:) * a_i(:,:,:), dim=3 )   ! total flux from blk 
     2015         qsr_tot(:,:) = qsr(:,:) * ziceld(:,:) + SUM( qsr_ice(:,:,:) * a_i(:,:,:), dim=3 )   ! total flux from blk 
    19162016         qsr_tot(:,:) = qsr_tot(:,:) * xcplmask(:,:,0) +  zqsr_tot(:,:)* zmsk(:,:) 
    1917          DO jl=1,jpl 
     2017         DO jl = 1, jpl 
    19182018            qsr_ice(:,:,jl) = qsr_ice(:,:,jl) * xcplmask(:,:,0) +  zqsr_ice(:,:,jl)* zmsk(:,:) 
    1919          ENDDO 
     2019         END DO 
    19202020      ELSE 
    19212021         qsr_tot(:,:  ) = zqsr_tot(:,:  ) 
     
    19442044         dqns_ice(:,:,:) = zdqns_ice(:,:,:) 
    19452045      ENDIF 
    1946        
     2046 
     2047#if defined key_lim3       
    19472048      !                                                      ! ========================= ! 
    1948       SELECT CASE( TRIM( sn_rcv_iceflx%cldes ) )             !    topmelt and botmelt    ! 
     2049      SELECT CASE( TRIM( sn_rcv_iceflx%cldes ) )             !  ice topmelt and botmelt  ! 
    19492050      !                                                      ! ========================= ! 
    19502051      CASE ('coupled') 
    1951          topmelt(:,:,:)=frcv(jpr_topm)%z3(:,:,:) 
    1952          botmelt(:,:,:)=frcv(jpr_botm)%z3(:,:,:) 
     2052         qml_ice(:,:,:) = frcv(jpr_topm)%z3(:,:,:) * a_i(:,:,:) 
     2053         qcn_ice(:,:,:) = frcv(jpr_botm)%z3(:,:,:) * a_i(:,:,:) 
    19532054      END SELECT 
    1954  
    1955       ! Surface transimission parameter io (Maykut Untersteiner , 1971 ; Ebert and Curry, 1993 ) 
    1956       ! Used for LIM2 and LIM3 
    1957       ! Coupled case: since cloud cover is not received from atmosphere  
    1958       !               ===> used prescribed cloud fraction representative for polar oceans in summer (0.81) 
    1959       fr1_i0(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 
    1960       fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 
    1961  
    1962       CALL wrk_dealloc( jpi,jpj,     zcptn, zcptrain, zcptsnw, zicefr, zmsk, zsnw ) 
    1963       CALL wrk_dealloc( jpi,jpj,     zemp_tot, zemp_ice, zemp_oce, ztprecip, zsprecip, zevap_oce, zevap_ice, zdevap_ice ) 
    1964       CALL wrk_dealloc( jpi,jpj,     zqns_tot, zqns_oce, zqsr_tot, zqsr_oce, zqprec_ice, zqemp_oce, zqemp_ice ) 
    1965       CALL wrk_dealloc( jpi,jpj,jpl, zqns_ice, zqsr_ice, zdqns_ice, zqevap_ice ) 
    1966       ! 
     2055      ! 
     2056      !                                                      ! ========================= ! 
     2057      !                                                      !      Transmitted Qsr      !   [W/m2] 
     2058      !                                                      ! ========================= ! 
     2059      SELECT CASE( nice_jules ) 
     2060      CASE( np_jules_OFF    )       !==  No Jules coupler  ==! 
     2061         ! 
     2062         !                    ! ===> used prescribed cloud fraction representative for polar oceans in summer (0.81) 
     2063         ztri = 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice    ! surface transmission parameter (Grenfell Maykut 77) 
     2064         ! 
     2065         qsr_ice_tr(:,:,:) = ztri * qsr_ice(:,:,:) 
     2066         WHERE( phs(:,:,:) >= 0.0_wp )   qsr_ice_tr(:,:,:) = 0._wp            ! snow fully opaque 
     2067         WHERE( phi(:,:,:) <= 0.1_wp )   qsr_ice_tr(:,:,:) = qsr_ice(:,:,:)   ! thin ice transmits all solar radiation 
     2068         !      
     2069      CASE( np_jules_ACTIVE )       !==  Jules coupler is active  ==! 
     2070         ! 
     2071         !                    ! ===> here we must receive the qsr_ice_tr array from the coupler 
     2072         !                           for now just assume zero (fully opaque ice) 
     2073         qsr_ice_tr(:,:,:) = 0._wp 
     2074         ! 
     2075      END SELECT 
     2076      ! 
     2077#endif 
    19672078      IF( nn_timing == 1 )   CALL timing_stop('sbc_cpl_ice_flx') 
    19682079      ! 
     
    19842095      INTEGER ::   isec, info   ! local integer 
    19852096      REAL(wp) ::   zumax, zvmax 
    1986       REAL(wp), POINTER, DIMENSION(:,:)   ::   zfr_l, ztmp1, ztmp2, zotx1, zoty1, zotz1, zitx1, zity1, zitz1 
    1987       REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztmp3, ztmp4    
     2097      REAL(wp), DIMENSION(jpi,jpj)     ::   zfr_l, ztmp1, ztmp2, zotx1, zoty1, zotz1, zitx1, zity1, zitz1 
     2098      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   ztmp3, ztmp4    
    19882099      !!---------------------------------------------------------------------- 
    19892100      ! 
    19902101      IF( nn_timing == 1 )   CALL timing_start('sbc_cpl_snd') 
    19912102      ! 
    1992       CALL wrk_alloc( jpi,jpj,       zfr_l, ztmp1, ztmp2, zotx1, zoty1, zotz1, zitx1, zity1, zitz1 ) 
    1993       CALL wrk_alloc( jpi,jpj,jpl,   ztmp3, ztmp4 ) 
    1994  
    19952103      isec = ( kt - nit000 ) * NINT( rdt )        ! date of exchanges 
    19962104 
     
    20062114            ! we must send the surface potential temperature  
    20072115            IF( l_useCT )  THEN    ;   ztmp1(:,:) = eos_pt_from_ct( tsn(:,:,1,jp_tem), tsn(:,:,1,jp_sal) ) 
    2008             ELSE                    ;   ztmp1(:,:) = tsn(:,:,1,jp_tem) 
     2116            ELSE                   ;   ztmp1(:,:) = tsn(:,:,1,jp_tem) 
    20092117            ENDIF 
    20102118            ! 
     
    20342142               CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' ) 
    20352143               END SELECT 
     2144            CASE( 'oce and weighted ice')    ;   ztmp1(:,:) =   tsn(:,:,1,jp_tem) + rt0   
     2145               SELECT CASE( sn_snd_temp%clcat )  
     2146               CASE( 'yes' )     
     2147                  ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl)  
     2148               CASE( 'no' )  
     2149                  ztmp3(:,:,:) = 0.0  
     2150                  DO jl=1,jpl  
     2151                     ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl)  
     2152                  ENDDO  
     2153               CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' )  
     2154               END SELECT  
    20362155            CASE( 'mixed oce-ice'        )    
    20372156               ztmp1(:,:) = ( ztmp1(:,:) + rt0 ) * zfr_l(:,:)  
     
    20462165         IF( ssnd(jps_tmix)%laction )   CALL cpl_snd( jps_tmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
    20472166      ENDIF 
     2167      ! 
     2168      !                                                      ! ------------------------- ! 
     2169      !                                                      ! 1st layer ice/snow temp.  ! 
     2170      !                                                      ! ------------------------- ! 
     2171#if defined key_lim3 
     2172      ! needed by  Met Office 
     2173      IF( ssnd(jps_ttilyr)%laction) THEN 
     2174         SELECT CASE( sn_snd_ttilyr%cldes) 
     2175         CASE ('weighted ice') 
     2176            ztmp3(:,:,1:jpl) = t1_ice(:,:,1:jpl) * a_i(:,:,1:jpl)  
     2177         CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_ttilyr%cldes' ) 
     2178         END SELECT 
     2179         IF( ssnd(jps_ttilyr)%laction )   CALL cpl_snd( jps_ttilyr, isec, ztmp3, info ) 
     2180      ENDIF 
     2181#endif 
    20482182      !                                                      ! ------------------------- ! 
    20492183      !                                                      !           Albedo          ! 
     
    20592193                   ztmp1(:,:) = SUM( alb_ice (:,:,1:jpl) * a_i(:,:,1:jpl), dim=3 ) / SUM( a_i(:,:,1:jpl), dim=3 ) 
    20602194                ELSEWHERE 
    2061                    ztmp1(:,:) = albedo_oce_mix(:,:) 
     2195                   ztmp1(:,:) = alb_oce_mix(:,:) 
    20622196                END WHERE 
    20632197             CASE default   ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_alb%clcat' ) 
     
    20872221 
    20882222      IF( ssnd(jps_albmix)%laction ) THEN                         ! mixed ice-ocean 
    2089          ztmp1(:,:) = albedo_oce_mix(:,:) * zfr_l(:,:) 
    2090          DO jl=1,jpl 
     2223         ztmp1(:,:) = alb_oce_mix(:,:) * zfr_l(:,:) 
     2224         DO jl = 1, jpl 
    20912225            ztmp1(:,:) = ztmp1(:,:) + alb_ice(:,:,jl) * a_i(:,:,jl) 
    2092          ENDDO 
     2226         END DO 
    20932227         CALL cpl_snd( jps_albmix, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
    20942228      ENDIF 
     
    21052239         IF( ssnd(jps_fice)%laction )   CALL cpl_snd( jps_fice, isec, ztmp3, info ) 
    21062240      ENDIF 
     2241 
     2242      IF( ssnd(jps_fice1)%laction ) THEN 
     2243         SELECT CASE( sn_snd_thick1%clcat ) 
     2244         CASE( 'yes' )   ;   ztmp3(:,:,1:jpl) =  a_i(:,:,1:jpl) 
     2245         CASE( 'no'  )   ;   ztmp3(:,:,1    ) = fr_i(:,:      ) 
     2246         CASE default    ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick1%clcat' ) 
     2247         END SELECT 
     2248         CALL cpl_snd( jps_fice1, isec, ztmp3, info ) 
     2249      ENDIF 
    21072250       
    21082251      ! Send ice fraction field to OPA (sent by SAS in SAS-OPA coupling) 
     
    21192262            SELECT CASE( sn_snd_thick%clcat ) 
    21202263            CASE( 'yes' )    
    2121                ztmp3(:,:,1:jpl) =  ht_i(:,:,1:jpl) * a_i(:,:,1:jpl) 
    2122                ztmp4(:,:,1:jpl) =  ht_s(:,:,1:jpl) * a_i(:,:,1:jpl) 
     2264               ztmp3(:,:,1:jpl) =  h_i(:,:,1:jpl) * a_i(:,:,1:jpl) 
     2265               ztmp4(:,:,1:jpl) =  h_s(:,:,1:jpl) * a_i(:,:,1:jpl) 
    21232266            CASE( 'no' ) 
    21242267               ztmp3(:,:,:) = 0.0   ;  ztmp4(:,:,:) = 0.0 
    21252268               DO jl=1,jpl 
    2126                   ztmp3(:,:,1) = ztmp3(:,:,1) + ht_i(:,:,jl) * a_i(:,:,jl) 
    2127                   ztmp4(:,:,1) = ztmp4(:,:,1) + ht_s(:,:,jl) * a_i(:,:,jl) 
     2269                  ztmp3(:,:,1) = ztmp3(:,:,1) + h_i(:,:,jl) * a_i(:,:,jl) 
     2270                  ztmp4(:,:,1) = ztmp4(:,:,1) + h_s(:,:,jl) * a_i(:,:,jl) 
    21282271               ENDDO 
    21292272            CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 
     
    21322275            SELECT CASE( sn_snd_thick%clcat ) 
    21332276            CASE( 'yes' ) 
    2134                ztmp3(:,:,1:jpl) = ht_i(:,:,1:jpl) 
    2135                ztmp4(:,:,1:jpl) = ht_s(:,:,1:jpl) 
     2277               ztmp3(:,:,1:jpl) = h_i(:,:,1:jpl) 
     2278               ztmp4(:,:,1:jpl) = h_s(:,:,1:jpl) 
    21362279            CASE( 'no' ) 
    21372280               WHERE( SUM( a_i, dim=3 ) /= 0. ) 
    2138                   ztmp3(:,:,1) = SUM( ht_i * a_i, dim=3 ) / SUM( a_i, dim=3 ) 
    2139                   ztmp4(:,:,1) = SUM( ht_s * a_i, dim=3 ) / SUM( a_i, dim=3 ) 
     2281                  ztmp3(:,:,1) = SUM( h_i * a_i, dim=3 ) / SUM( a_i, dim=3 ) 
     2282                  ztmp4(:,:,1) = SUM( h_s * a_i, dim=3 ) / SUM( a_i, dim=3 ) 
    21402283               ELSEWHERE 
    21412284                 ztmp3(:,:,1) = 0. 
     
    21492292         IF( ssnd(jps_hsnw)%laction )   CALL cpl_snd( jps_hsnw, isec, ztmp4, info ) 
    21502293      ENDIF 
     2294 
     2295#if defined key_lim3 
     2296      !                                                      ! ------------------------- ! 
     2297      !                                                      !      Ice melt ponds       !  
     2298      !                                                      ! ------------------------- ! 
     2299      ! needed by Met Office 
     2300      IF( ssnd(jps_a_p)%laction .OR. ssnd(jps_ht_p)%laction ) THEN  
     2301         SELECT CASE( sn_snd_mpnd%cldes)   
     2302         CASE( 'ice only' )   
     2303            SELECT CASE( sn_snd_mpnd%clcat )   
     2304            CASE( 'yes' )   
     2305               ztmp3(:,:,1:jpl) =  a_ip(:,:,1:jpl) 
     2306               ztmp4(:,:,1:jpl) =  v_ip(:,:,1:jpl)   
     2307            CASE( 'no' )   
     2308               ztmp3(:,:,:) = 0.0   
     2309               ztmp4(:,:,:) = 0.0   
     2310               DO jl=1,jpl   
     2311                 ztmp3(:,:,1) = ztmp3(:,:,1) + a_ip(:,:,jpl)   
     2312                 ztmp4(:,:,1) = ztmp4(:,:,1) + v_ip(:,:,jpl)  
     2313               ENDDO   
     2314            CASE default   ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_mpnd%clcat' )   
     2315            END SELECT   
     2316         CASE default      ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_mpnd%cldes' )      
     2317         END SELECT   
     2318         IF( ssnd(jps_a_p)%laction  )   CALL cpl_snd( jps_a_p , isec, ztmp3, info )      
     2319         IF( ssnd(jps_ht_p)%laction )   CALL cpl_snd( jps_ht_p, isec, ztmp4, info )      
     2320      ENDIF  
     2321      !  
     2322      !                                                      ! ------------------------- ! 
     2323      !                                                      !     Ice conductivity      !  
     2324      !                                                      ! ------------------------- ! 
     2325      ! needed by Met Office 
     2326      IF( ssnd(jps_kice)%laction ) THEN  
     2327         SELECT CASE( sn_snd_cond%cldes)  
     2328         CASE( 'weighted ice' )     
     2329            SELECT CASE( sn_snd_cond%clcat )  
     2330            CASE( 'yes' )     
     2331          ztmp3(:,:,1:jpl) =  cnd_ice(:,:,1:jpl) * a_i(:,:,1:jpl)  
     2332            CASE( 'no' )  
     2333               ztmp3(:,:,:) = 0.0  
     2334               DO jl=1,jpl  
     2335                 ztmp3(:,:,1) = ztmp3(:,:,1) + cnd_ice(:,:,jl) * a_i(:,:,jl)  
     2336               ENDDO  
     2337            CASE default   ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_cond%clcat' )  
     2338            END SELECT  
     2339         CASE( 'ice only' )     
     2340           ztmp3(:,:,1:jpl) = cnd_ice(:,:,1:jpl)  
     2341         CASE default      ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_cond%cldes' )      
     2342         END SELECT  
     2343         IF( ssnd(jps_kice)%laction )   CALL cpl_snd( jps_kice, isec, ztmp3, info )  
     2344      ENDIF  
     2345#endif 
     2346 
    21512347      !                                                      ! ------------------------- ! 
    21522348      !                                                      !  CO2 flux from PISCES     !  
     
    24702666      IF( ssnd(jps_taum  )%laction )  CALL cpl_snd( jps_taum  , isec, RESHAPE ( taum, (/jpi,jpj,1/) ), info ) 
    24712667 
    2472       CALL wrk_dealloc( jpi,jpj,       zfr_l, ztmp1, ztmp2, zotx1, zoty1, zotz1, zitx1, zity1, zitz1 ) 
    2473       CALL wrk_dealloc( jpi,jpj,jpl,   ztmp3, ztmp4 ) 
     2668#if defined key_lim3 
     2669      !                                                      ! ------------------------- ! 
     2670      !                                                      ! Sea surface freezing temp !  
     2671      !                                                      ! ------------------------- ! 
     2672      ! needed by Met Office 
     2673      CALL eos_fzp(tsn(:,:,1,jp_sal), sstfrz) 
     2674      ztmp1(:,:) = sstfrz(:,:) + rt0 
     2675      IF( ssnd(jps_sstfrz)%laction )  CALL cpl_snd( jps_sstfrz, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info) 
     2676#endif 
    24742677      ! 
    24752678      IF( nn_timing == 1 )   CALL timing_stop('sbc_cpl_snd') 
Note: See TracChangeset for help on using the changeset viewer.