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 5443 for branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC – NEMO

Ignore:
Timestamp:
2015-06-19T17:18:00+02:00 (9 years ago)
Author:
davestorkey
Message:

Update 2015/dev_r5021_UKMO1_CICE_coupling branch to revision 5442 of the trunk.

Location:
branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC
Files:
24 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/cpl_oasis3.F90

    r5234 r5443  
    1515   !!---------------------------------------------------------------------- 
    1616   !!---------------------------------------------------------------------- 
    17    !!   'key_oasis3'                    coupled Ocean/Atmosphere via OASIS3 
     17   !!   'key_oasis3'                    coupled Ocean/Atmosphere via OASIS3-MCT 
     18   !!   'key_oa3mct_v3'                 to be added for OASIS3-MCT version 3 
    1819   !!---------------------------------------------------------------------- 
    1920   !!   cpl_init     : initialization of coupled mode communication 
     
    6162#endif 
    6263 
    63    INTEGER, PUBLIC, PARAMETER ::   nmaxfld=40        ! Maximum number of coupling fields 
     64   INTEGER                    ::   nrcv         ! total number of fields received  
     65   INTEGER                    ::   nsnd         ! total number of fields sent  
     66   INTEGER                    ::   ncplmodel    ! Maximum number of models to/from which NEMO is potentialy sending/receiving data 
     67   INTEGER, PUBLIC, PARAMETER ::   nmaxfld=50   ! Maximum number of coupling fields 
    6468   INTEGER, PUBLIC, PARAMETER ::   nmaxcat=5    ! Maximum number of coupling fields 
    6569   INTEGER, PUBLIC, PARAMETER ::   nmaxcpl=5    ! Maximum number of coupling fields 
     
    8690CONTAINS 
    8791 
    88    SUBROUTINE cpl_init( kl_comm ) 
     92   SUBROUTINE cpl_init( cd_modname, kl_comm ) 
    8993      !!------------------------------------------------------------------- 
    9094      !!             ***  ROUTINE cpl_init  *** 
     
    9599      !! ** Method  :   OASIS3 MPI communication  
    96100      !!-------------------------------------------------------------------- 
    97       INTEGER, INTENT(out) ::   kl_comm   ! local communicator of the model 
     101      CHARACTER(len = *), INTENT(in) ::   cd_modname   ! model name as set in namcouple file 
     102      INTEGER          , INTENT(out) ::   kl_comm      ! local communicator of the model 
    98103      !!-------------------------------------------------------------------- 
    99104 
     
    104109      ! 1st Initialize the OASIS system for the application 
    105110      !------------------------------------------------------------------ 
    106       CALL oasis_init_comp ( ncomp_id, 'oceanx', nerror ) 
     111      CALL oasis_init_comp ( ncomp_id, TRIM(cd_modname), nerror ) 
    107112      IF ( nerror /= OASIS_Ok ) & 
    108113         CALL oasis_abort (ncomp_id, 'cpl_init', 'Failure in oasis_init_comp') 
     
    144149      IF(lwp) WRITE(numout,*) 
    145150 
     151      ncplmodel = kcplmodel 
    146152      IF( kcplmodel > nmaxcpl ) THEN 
    147          CALL oasis_abort ( ncomp_id, 'cpl_define', 'kcplmodel is larger than nmaxcpl, increase nmaxcpl')   ;   RETURN 
     153         CALL oasis_abort ( ncomp_id, 'cpl_define', 'ncplmodel is larger than nmaxcpl, increase nmaxcpl')   ;   RETURN 
    148154      ENDIF 
     155 
     156      nrcv = krcv 
     157      IF( nrcv > nmaxfld ) THEN 
     158         CALL oasis_abort ( ncomp_id, 'cpl_define', 'nrcv is larger than nmaxfld, increase nmaxfld')   ;   RETURN 
     159      ENDIF 
     160 
     161      nsnd = ksnd 
     162      IF( nsnd > nmaxfld ) THEN 
     163         CALL oasis_abort ( ncomp_id, 'cpl_define', 'nsnd is larger than nmaxfld, increase nmaxfld')   ;   RETURN 
     164      ENDIF 
     165 
    149166      ! 
    150167      ! ... Define the shape for the area that excludes the halo 
     
    400417 
    401418 
    402    INTEGER FUNCTION cpl_freq( kid 
     419   INTEGER FUNCTION cpl_freq( cdfieldname 
    403420      !!--------------------------------------------------------------------- 
    404421      !!              ***  ROUTINE cpl_freq  *** 
     
    406423      !! ** Purpose : - send back the coupling frequency for a particular field 
    407424      !!---------------------------------------------------------------------- 
    408       INTEGER,INTENT(in) ::   kid   ! variable index 
    409       !! 
     425      CHARACTER(len = *), INTENT(in) ::   cdfieldname    ! field name as set in namcouple file 
     426      !! 
     427      INTEGER               :: id 
    410428      INTEGER               :: info 
    411429      INTEGER, DIMENSION(1) :: itmp 
     430      INTEGER               :: ji,jm     ! local loop index 
     431      INTEGER               :: mop 
    412432      !!---------------------------------------------------------------------- 
    413       CALL oasis_get_freqs(kid, 1, itmp, info) 
    414       cpl_freq = itmp(1) 
     433      cpl_freq = 0   ! defaut definition 
     434      id = -1        ! defaut definition 
     435      ! 
     436      DO ji = 1, nsnd 
     437         IF (ssnd(ji)%laction ) THEN 
     438            DO jm = 1, ncplmodel 
     439               IF( ssnd(ji)%nid(1,jm) /= -1 ) THEN 
     440                  IF( TRIM(cdfieldname) == TRIM(ssnd(ji)%clname) ) THEN 
     441                     id = ssnd(ji)%nid(1,jm) 
     442                     mop = OASIS_Out 
     443                  ENDIF 
     444               ENDIF 
     445            ENDDO 
     446         ENDIF 
     447      ENDDO 
     448      DO ji = 1, nrcv 
     449         IF (srcv(ji)%laction ) THEN 
     450            DO jm = 1, ncplmodel 
     451               IF( srcv(ji)%nid(1,jm) /= -1 ) THEN 
     452                  IF( TRIM(cdfieldname) == TRIM(srcv(ji)%clname) ) THEN 
     453                     id = srcv(ji)%nid(1,jm) 
     454                     mop = OASIS_In 
     455                  ENDIF 
     456               ENDIF 
     457            ENDDO 
     458         ENDIF 
     459      ENDDO 
     460      ! 
     461      IF( id /= -1 ) THEN 
     462#if defined key_oa3mct_v3 
     463         CALL oasis_get_freqs(id, mop, 1, itmp, info) 
     464#else 
     465         CALL oasis_get_freqs(id,      1, itmp, info) 
     466#endif 
     467         cpl_freq = itmp(1) 
     468      ENDIF 
    415469      ! 
    416470   END FUNCTION cpl_freq 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/cyclone.F90

    • Property svn:keywords set to Id
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/fldread.F90

    r5234 r5443  
    6969   END TYPE FLD 
    7070 
    71    TYPE, PUBLIC ::   MAP_POINTER      !: Array of integer pointers to 1D arrays 
    72       INTEGER, POINTER   ::  ptr(:) 
     71   TYPE, PUBLIC ::   MAP_POINTER      !: Map from input data file to local domain 
     72      INTEGER, POINTER, DIMENSION(:)  ::  ptr           ! Array of integer pointers to 1D arrays 
     73      LOGICAL                         ::  ll_unstruc    ! Unstructured (T) or structured (F) boundary data file 
    7374   END TYPE MAP_POINTER 
    7475 
     
    153154      IF( PRESENT(kit) )   ll_firstcall = ll_firstcall .and. kit == 1 
    154155 
    155       it_offset = 0 
     156      IF ( nn_components == jp_iam_sas ) THEN   ;   it_offset = nn_fsbc 
     157      ELSE                                      ;   it_offset = 0 
     158      ENDIF 
    156159      IF( PRESENT(kt_offset) )   it_offset = kt_offset 
    157160 
     
    451454      ENDIF 
    452455      ! 
    453       it_offset = 0 
     456      IF ( nn_components == jp_iam_sas ) THEN   ;   it_offset = nn_fsbc 
     457      ELSE                                      ;   it_offset = 0 
     458      ENDIF 
    454459      IF( PRESENT(kt_offset) )   it_offset = kt_offset 
    455460      IF( PRESENT(kit) ) THEN   ;   it_offset = ( kit + it_offset ) * NINT( rdt/REAL(nn_baro,wp) ) 
     
    601606      ! 
    602607      IF( ASSOCIATED(map%ptr) ) THEN 
    603          IF( sdjf%ln_tint ) THEN   ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1), map%ptr ) 
    604          ELSE                      ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,:  ), sdjf%nrec_a(1), map%ptr ) 
     608         IF( sdjf%ln_tint ) THEN   ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fdta(:,:,:,2), sdjf%nrec_a(1), map ) 
     609         ELSE                      ;   CALL fld_map( sdjf%num, sdjf%clvar, sdjf%fnow(:,:,:  ), sdjf%nrec_a(1), map ) 
    605610         ENDIF 
    606611      ELSE IF( LEN(TRIM(sdjf%wgtname)) > 0 ) THEN 
     
    672677      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   dta   ! output field on model grid (2 dimensional) 
    673678      INTEGER                   , INTENT(in ) ::   nrec    ! record number to read (ie time slice) 
    674       INTEGER,  DIMENSION(:)    , INTENT(in ) ::   map     ! global-to-local mapping indices 
     679      TYPE(MAP_POINTER)         , INTENT(in ) ::   map     ! global-to-local mapping indices 
    675680      !! 
    676681      INTEGER                                 ::   ipi      ! length of boundary data on local process 
     
    693698#if defined key_bdy 
    694699      ipj = iom_file(num)%dimsz(2,idvar) 
    695       IF (ipj == 1) THEN ! we assume that this is a structured open boundary file 
     700      IF ( map%ll_unstruc) THEN ! unstructured open boundary data file 
    696701         dta_read => dta_global 
    697       ELSE 
     702      ELSE                      ! structured open boundary data file 
    698703         dta_read => dta_global2 
    699704      ENDIF 
     
    708713      END SELECT 
    709714      ! 
    710       IF (ipj==1) THEN 
     715      IF ( map%ll_unstruc ) THEN ! unstructured open boundary data file 
    711716         DO ib = 1, ipi 
    712717            DO ik = 1, ipk 
    713                dta(ib,1,ik) =  dta_read(map(ib),1,ik) 
     718               dta(ib,1,ik) =  dta_read(map%ptr(ib),1,ik) 
    714719            END DO 
    715720         END DO 
    716       ELSE ! we assume that this is a structured open boundary file 
     721      ELSE                       ! structured open boundary data file 
    717722         DO ib = 1, ipi 
    718             jj=1+floor(REAL(map(ib)-1)/REAL(ilendta)) 
    719             ji=map(ib)-(jj-1)*ilendta 
     723            jj=1+floor(REAL(map%ptr(ib)-1)/REAL(ilendta)) 
     724            ji=map%ptr(ib)-(jj-1)*ilendta 
    720725            DO ik = 1, ipk 
    721726               dta(ib,1,ik) =  dta_read(ji,jj,ik) 
     
    10201025      INTEGER                           ::   ipk           ! temporary vertical dimension 
    10211026      CHARACTER (len=5)                 ::   aname 
    1022       INTEGER , DIMENSION(3)            ::   ddims 
     1027      INTEGER , DIMENSION(:), ALLOCATABLE ::   ddims 
    10231028      INTEGER , POINTER, DIMENSION(:,:) ::   data_src 
    10241029      REAL(wp), POINTER, DIMENSION(:,:) ::   data_tmp 
     
    10431048 
    10441049      !! get dimensions 
     1050      IF ( SIZE(sd%fnow, 3) > 1 ) THEN 
     1051         ALLOCATE( ddims(4) ) 
     1052      ELSE 
     1053         ALLOCATE( ddims(3) ) 
     1054      ENDIF 
    10451055      id = iom_varid( inum, sd%clvar, ddims ) 
    10461056 
     
    11391149         CALL ctl_stop( '    fld_weight : unable to read the file ' ) 
    11401150      ENDIF 
     1151 
     1152      DEALLOCATE (ddims ) 
    11411153 
    11421154      CALL wrk_dealloc( jpi,jpj, data_src )   ! integer 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_ice.F90

    r5234 r5443  
    1616   USE sbc_oce          ! surface boundary condition: ocean 
    1717# if defined key_lim3 
    18    USE par_ice          ! LIM-3 parameters 
     18   USE ice              ! LIM-3 parameters 
    1919# endif 
    2020# if defined key_lim2 
     
    5858   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qns_ice        !: non solar heat flux over ice                  [W/m2] 
    5959   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qsr_ice        !: solar heat flux over ice                      [W/m2] 
    60    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qsr_ice_mean   !: daily mean solar heat flux over ice           [W/m2] 
    6160   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   qla_ice        !: latent flux over ice                          [W/m2] 
    6261   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   dqla_ice       !: latent sensibility over ice                 [W/m2/K] 
     
    6968   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fr1_i0         !: Solar surface transmission parameter, thick ice  [-] 
    7069   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fr2_i0         !: Solar surface transmission parameter, thin ice   [-] 
    71    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   emp_ice        !: sublimation - precip over sea ice            [kg/m2] 
     70   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   emp_ice        !: sublimation - precip over sea ice          [kg/m2/s] 
    7271 
    7372   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   topmelt            !: category topmelt 
    7473   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   botmelt            !: category botmelt 
     74 
     75#if defined  key_lim3 
     76   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   evap_ice       !: sublimation                              [kg/m2/s] 
     77   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   devap_ice      !: sublimation sensitivity                [kg/m2/s/K] 
     78   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qns_oce        !: non solar heat flux over ocean              [W/m2] 
     79   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qsr_oce        !: non solar heat flux over ocean              [W/m2] 
     80   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qemp_oce       !: heat flux of precip and evap over ocean     [W/m2] 
     81   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qemp_ice       !: heat flux of precip and evap over ice       [W/m2] 
     82   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qprec_ice      !: heat flux of precip over ice                [J/m3] 
     83   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   emp_oce        !: evap - precip over ocean                 [kg/m2/s] 
     84#endif 
     85#if defined key_lim3 || defined key_lim2 
     86   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   wndm_ice       !: wind speed module at T-point                 [m/s] 
     87#endif 
    7588 
    7689#if defined key_cice 
     
    102115#endif 
    103116 
    104 #if defined key_lim3 || defined key_cice 
    105    ! not used with LIM2 
     117#if defined key_cice 
    106118   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   tatm_ice       !: air temperature [K] 
    107119#endif 
     
    127139      ALLOCATE( qns_ice (jpi,jpj,jpl) , qsr_ice (jpi,jpj,jpl) ,     & 
    128140         &      qla_ice (jpi,jpj,jpl) , dqla_ice(jpi,jpj,jpl) ,     & 
    129          &      dqns_ice(jpi,jpj,jpl) , tn_ice  (jpi,jpj,jpl) ,     & 
    130          &      alb_ice (jpi,jpj,jpl) ,                             & 
    131          &      utau_ice(jpi,jpj)     , vtau_ice(jpi,jpj)     ,     & 
     141         &      dqns_ice(jpi,jpj,jpl) , tn_ice  (jpi,jpj,jpl) , alb_ice (jpi,jpj,jpl) ,   & 
     142         &      utau_ice(jpi,jpj)     , vtau_ice(jpi,jpj)     , wndm_ice(jpi,jpj)     ,   & 
    132143         &      fr1_i0  (jpi,jpj)     , fr2_i0  (jpi,jpj)     ,     & 
    133 #if defined key_lim3 
    134          &      tatm_ice(jpi,jpj)     ,                             & 
    135 #endif 
    136144#if defined key_lim2 
    137145         &      a_i(jpi,jpj,jpl)      ,                             & 
     146#endif 
     147#if defined key_lim3 
     148         &      evap_ice(jpi,jpj,jpl) , devap_ice(jpi,jpj,jpl) , qprec_ice(jpi,jpj) ,  & 
     149         &      qemp_ice(jpi,jpj)     , qemp_oce(jpi,jpj)      ,                       & 
     150         &      qns_oce (jpi,jpj)     , qsr_oce (jpi,jpj)      , emp_oce (jpi,jpj)  ,  & 
    138151#endif 
    139152         &      emp_ice(jpi,jpj)      ,  STAT= ierr(1) ) 
     
    147160                a_i(jpi,jpj,ncat)     , topmelt(jpi,jpj,ncat) , botmelt(jpi,jpj,ncat) , & 
    148161                sstfrz(jpi,jpj)       , STAT= ierr(1) ) 
    149       IF( lk_cpl )   ALLOCATE( u_ice(jpi,jpj)        , fr1_i0(jpi,jpj)       , tn_ice (jpi,jpj,1)    , & 
     162      IF( ln_cpl )   ALLOCATE( u_ice(jpi,jpj)        , fr1_i0(jpi,jpj)       , tn_ice (jpi,jpj,1)    , & 
    150163         &                     v_ice(jpi,jpj)        , fr2_i0(jpi,jpj)       , alb_ice(jpi,jpj,1)    , & 
    151164         &                     emp_ice(jpi,jpj)      , qns_ice(jpi,jpj,1)    , dqns_ice(jpi,jpj,1)   , & 
     
    154167#endif 
    155168         ! 
    156 #if defined key_lim2 
    157       IF( ltrcdm2dc_ice )   ALLOCATE( qsr_ice_mean (jpi,jpj,jpl), STAT=ierr(3) ) 
    158 #endif 
    159          ! 
    160169#if defined key_cice || defined key_lim2 
    161       IF( lk_cpl ) ALLOCATE( ht_i(jpi,jpj,jpl) , ht_s(jpi,jpj,jpl) , STAT=ierr(5) ) 
     170      IF( ln_cpl )  ALLOCATE( ht_i(jpi,jpj,jpl) , ht_s(jpi,jpj,jpl) , STAT=ierr(5) ) 
    162171#endif 
    163172 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90

    r5234 r5443  
    3636   LOGICAL , PUBLIC ::   ln_blk_mfs     !: MFS  bulk formulation 
    3737#if defined key_oasis3 
    38    LOGICAL , PUBLIC ::   lk_cpl = .TRUE.  !: coupled formulation 
     38   LOGICAL , PUBLIC ::   lk_oasis = .TRUE.  !: OASIS used 
    3939#else 
    40    LOGICAL , PUBLIC ::   lk_cpl = .FALSE. !: coupled formulation 
    41 #endif 
     40   LOGICAL , PUBLIC ::   lk_oasis = .FALSE. !: OASIS unused 
     41#endif 
     42   LOGICAL , PUBLIC ::   ln_cpl         !: ocean-atmosphere coupled formulation 
     43   LOGICAL , PUBLIC ::   ln_mixcpl      !: ocean-atmosphere forced-coupled mixed formulation 
    4244   LOGICAL , PUBLIC ::   ln_dm2dc       !: Daily mean to Diurnal Cycle short wave (qsr) 
    4345   LOGICAL , PUBLIC ::   ln_rnf         !: runoffs / runoff mouths 
     
    5052   !                                             !: =1 levitating ice with mass and salt exchange but no presure effect 
    5153   !                                             !: =2 embedded sea-ice (full salt and mass exchanges and pressure) 
    52    INTEGER , PUBLIC :: nn_limflx        !: LIM3 Multi-category heat flux formulation 
     54   INTEGER , PUBLIC ::   nn_components  !: flag for sbc module (including sea-ice) coupling mode (see component definition below)  
     55   INTEGER , PUBLIC ::   nn_limflx      !: LIM3 Multi-category heat flux formulation 
    5356   !                                             !: =-1  Use of per-category fluxes 
    5457   !                                             !: = 0  Average per-category fluxes 
     
    6972   !!           switch definition (improve readability) 
    7073   !!---------------------------------------------------------------------- 
    71    INTEGER , PUBLIC, PARAMETER ::   jp_gyre    = 0        !: GYRE analytical formulation 
    72    INTEGER , PUBLIC, PARAMETER ::   jp_ana     = 1        !: analytical      formulation 
    73    INTEGER , PUBLIC, PARAMETER ::   jp_flx     = 2        !: flux            formulation 
    74    INTEGER , PUBLIC, PARAMETER ::   jp_clio    = 3        !: CLIO bulk       formulation 
    75    INTEGER , PUBLIC, PARAMETER ::   jp_core    = 4        !: CORE bulk       formulation 
    76    INTEGER , PUBLIC, PARAMETER ::   jp_cpl     = 5        !: Coupled         formulation 
    77    INTEGER , PUBLIC, PARAMETER ::   jp_mfs     = 6        !: MFS  bulk       formulation 
     74   INTEGER , PUBLIC, PARAMETER ::   jp_gyre    = 0        !: GYRE analytical               formulation 
     75   INTEGER , PUBLIC, PARAMETER ::   jp_ana     = 1        !: analytical                    formulation 
     76   INTEGER , PUBLIC, PARAMETER ::   jp_flx     = 2        !: flux                          formulation 
     77   INTEGER , PUBLIC, PARAMETER ::   jp_clio    = 3        !: CLIO bulk                     formulation 
     78   INTEGER , PUBLIC, PARAMETER ::   jp_core    = 4        !: CORE bulk                     formulation 
     79   INTEGER , PUBLIC, PARAMETER ::   jp_purecpl = 5        !: Pure ocean-atmosphere Coupled formulation 
     80   INTEGER , PUBLIC, PARAMETER ::   jp_mfs     = 6        !: MFS  bulk                     formulation 
     81   INTEGER , PUBLIC, PARAMETER ::   jp_none    = 7        !: for OPA when doing coupling via SAS module 
    7882   INTEGER , PUBLIC, PARAMETER ::   jp_esopa   = -1       !: esopa test, ALL formulations 
    7983    
    8084   !!---------------------------------------------------------------------- 
     85   !!           component definition 
     86   !!---------------------------------------------------------------------- 
     87   INTEGER , PUBLIC, PARAMETER ::   jp_iam_nemo = 0      !: Initial single executable configuration  
     88                                                         !  (no internal OASIS coupling) 
     89   INTEGER , PUBLIC, PARAMETER ::   jp_iam_opa  = 1      !: Multi executable configuration - OPA component 
     90                                                         !  (internal OASIS coupling) 
     91   INTEGER , PUBLIC, PARAMETER ::   jp_iam_sas  = 2      !: Multi executable configuration - SAS component 
     92                                                         !  (internal OASIS coupling) 
     93   !!---------------------------------------------------------------------- 
    8194   !!              Ocean Surface Boundary Condition fields 
    8295   !!---------------------------------------------------------------------- 
     96   INTEGER , PUBLIC ::  ncpl_qsr_freq            !: qsr coupling frequency per days from atmosphere 
     97   ! 
    8398   LOGICAL , PUBLIC ::   lhftau = .FALSE.        !: HF tau used in TKE: mean(stress module) - module(mean stress) 
    84    LOGICAL , PUBLIC ::   ltrcdm2dc               !: In case of Diurnal Cycle short wave, compute a Daily Mean short waves flux 
    8599   !!                                   !!   now    ! before   !! 
    86100   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   utau   , utau_b   !: sea surface i-stress (ocean referential)     [N/m2] 
     
    90104   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   wndm              !: wind speed module at T-point (=|U10m-Uoce|)  [m/s] 
    91105   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr               !: sea heat flux:     solar                     [W/m2] 
    92    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr_mean          !: daily mean sea heat flux: solar              [W/m2] 
    93106   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qns    , qns_b    !: sea heat flux: non solar                     [W/m2] 
    94107   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   qsr_tot           !: total     solar heat flux (over sea and ice) [W/m2] 
     
    98111   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   emp_tot           !: total E-P over ocean and ice                 [Kg/m2/s] 
    99112   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fmmflx            !: freshwater budget: freezing/melting          [Kg/m2/s] 
    100    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rnf    , rnf_b    !: river runoff   [Kg/m2/s]   
     113   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   rnf    , rnf_b    !: river runoff        [Kg/m2/s]   
     114   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   fwfisf , fwfisf_b !: ice shelf melting   [Kg/m2/s]   
    101115   !! 
    102116   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::  sbc_tsc, sbc_tsc_b  !: sbc content trend                      [K.m/s] jpi,jpj,jpts 
     
    110124   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   atm_co2           !: atmospheric pCO2                             [ppm] 
    111125#endif 
     126   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: xcplmask          !: coupling mask for ln_mixcpl (warning: allocated in sbccpl) 
    112127 
    113128   !!---------------------------------------------------------------------- 
     
    121136   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ssh_m     !: mean (nn_fsbc time-step) sea surface height                [m] 
    122137   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   e3t_m     !: mean (nn_fsbc time-step) sea surface layer thickness       [m] 
     138   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   frq_m     !: mean (nn_fsbc time-step) fraction of solar net radiation absorbed in the 1st T level [-] 
    123139 
    124140   !! * Substitutions 
     
    147163         &      sfx    (jpi,jpj) , sfx_b(jpi,jpj) , emp_tot(jpi,jpj), fmmflx(jpi,jpj), STAT=ierr(2) ) 
    148164         ! 
    149       ALLOCATE( rnf  (jpi,jpj) , sbc_tsc  (jpi,jpj,jpts) , qsr_hc  (jpi,jpj,jpk) ,     & 
    150          &      rnf_b(jpi,jpj) , sbc_tsc_b(jpi,jpj,jpts) , qsr_hc_b(jpi,jpj,jpk) , STAT=ierr(3) ) 
     165      ALLOCATE( fwfisf  (jpi,jpj), rnf  (jpi,jpj) , sbc_tsc  (jpi,jpj,jpts) , qsr_hc  (jpi,jpj,jpk) ,     & 
     166         &      fwfisf_b(jpi,jpj), rnf_b(jpi,jpj) , sbc_tsc_b(jpi,jpj,jpts) , qsr_hc_b(jpi,jpj,jpk) , STAT=ierr(3) ) 
    151167         ! 
    152168      ALLOCATE( tprecip(jpi,jpj) , sprecip(jpi,jpj) , fr_i(jpi,jpj) ,     & 
     
    154170         &      atm_co2(jpi,jpj) ,                                        & 
    155171#endif 
    156          &      ssu_m  (jpi,jpj) , sst_m(jpi,jpj) ,                       & 
    157          &      ssv_m  (jpi,jpj) , sss_m  (jpi,jpj), ssh_m(jpi,jpj) , STAT=ierr(4) ) 
     172         &      ssu_m  (jpi,jpj) , sst_m(jpi,jpj) , frq_m(jpi,jpj) ,      & 
     173         &      ssv_m  (jpi,jpj) , sss_m(jpi,jpj) , ssh_m(jpi,jpj) , STAT=ierr(4) ) 
    158174         ! 
    159175#if defined key_vvl 
    160176      ALLOCATE( e3t_m(jpi,jpj) , STAT=ierr(5) ) 
    161177#endif 
    162          ! 
    163       IF( ltrcdm2dc ) ALLOCATE( qsr_mean(jpi,jpj) , STAT=ierr(5) ) 
    164178         ! 
    165179      sbc_oce_alloc = MAXVAL( ierr ) 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcapr.F90

    • Property svn:keywords set to Id
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_clio.F90

    r5234 r5443  
    3434   USE albedo 
    3535   USE prtctl          ! Print control 
    36 #if defined key_lim3 
     36#if defined key_lim3  
    3737   USE ice 
    3838   USE sbc_ice         ! Surface boundary condition: ice fields 
     39   USE limthd_dh       ! for CALL lim_thd_snwblow 
    3940#elif defined key_lim2 
    4041   USE ice_2 
     42   USE sbc_ice         ! Surface boundary condition: ice fields 
     43   USE par_ice_2       ! Surface boundary condition: ice fields 
    4144#endif 
    4245 
     
    4548 
    4649   PUBLIC sbc_blk_clio        ! routine called by sbcmod.F90  
    47    PUBLIC blk_ice_clio        ! routine called by sbcice_lim.F90  
     50#if defined key_lim2 || defined key_lim3 
     51   PUBLIC blk_ice_clio_tau    ! routine called by sbcice_lim.F90  
     52   PUBLIC blk_ice_clio_flx    ! routine called by sbcice_lim.F90  
     53#endif 
    4854 
    4955   INTEGER , PARAMETER ::   jpfld   = 7           ! maximum number of files to read  
     
    6268   LOGICAL ::   lbulk_init = .TRUE.               ! flag, bulk initialization done or not) 
    6369 
    64 #if ! defined key_lim3                           
    65    ! in namicerun with LIM3 
    6670   REAL(wp) ::   cai = 1.40e-3 ! best estimate of atm drag in order to get correct FS export in ORCA2-LIM 
    6771   REAL(wp) ::   cao = 1.00e-3 ! chosen by default  ==> should depends on many things...  !!gmto be updated 
    68 #endif 
    6972 
    7073   REAL(wp) ::   rdtbs2      !:    
     
    381384         &     + sf(jp_prec)%fnow(:,:,1) * sf(jp_tair)%fnow(:,:,1) * zcprec   ! add    precip. heat content at Tair in Celcius 
    382385      qns(:,:) = qns(:,:) * tmask(:,:,1) 
     386#if defined key_lim3 
     387      qns_oce(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:) 
     388      qsr_oce(:,:) = qsr(:,:) 
     389#endif 
    383390      ! NB: if sea-ice model, the snow precip are computed and the associated heat is added to qns (see blk_ice_clio) 
    384391 
    385       CALL iom_put( "qlw_oce",   zqlw )   ! output downward longwave  heat over the ocean 
    386       CALL iom_put( "qsb_oce", - zqsb )   ! output downward sensible  heat over the ocean 
    387       CALL iom_put( "qla_oce", - zqla )   ! output downward latent    heat over the ocean 
    388       CALL iom_put( "qns_oce",   qns  )   ! output downward non solar heat over the ocean 
     392      IF ( nn_ice == 0 ) THEN 
     393         CALL iom_put( "qlw_oce" ,   zqlw )                 ! output downward longwave  heat over the ocean 
     394         CALL iom_put( "qsb_oce" , - zqsb )                 ! output downward sensible  heat over the ocean 
     395         CALL iom_put( "qla_oce" , - zqla )                 ! output downward latent    heat over the ocean 
     396         CALL iom_put( "qemp_oce",   qns-zqlw+zqsb+zqla )   ! output downward heat content of E-P over the ocean 
     397         CALL iom_put( "qns_oce" ,   qns  )                 ! output downward non solar heat over the ocean 
     398         CALL iom_put( "qsr_oce" ,   qsr  )                 ! output downward solar heat over the ocean 
     399         CALL iom_put( "qt_oce"  ,   qns+qsr )              ! output total downward heat over the ocean 
     400      ENDIF 
    389401 
    390402      IF(ln_ctl) THEN 
     
    402414   END SUBROUTINE blk_oce_clio 
    403415 
    404  
    405    SUBROUTINE blk_ice_clio(  pst   , palb_cs, palb_os, palb,  & 
    406       &                      p_taui, p_tauj, p_qns , p_qsr,   & 
    407       &                      p_qla , p_dqns, p_dqla,          & 
    408       &                      p_tpr , p_spr ,                  & 
    409       &                      p_fr1 , p_fr2 , cd_grid, pdim  ) 
     416# if defined key_lim2 || defined key_lim3 
     417   SUBROUTINE blk_ice_clio_tau 
    410418      !!--------------------------------------------------------------------------- 
    411       !!                     ***  ROUTINE blk_ice_clio  *** 
     419      !!                     ***  ROUTINE blk_ice_clio_tau  *** 
     420      !!                  
     421      !!  ** Purpose :   Computation momentum flux at the ice-atm interface   
     422      !!          
     423      !!  ** Method  :   Read utau from a forcing file. Rearrange if C-grid 
     424      !! 
     425      !!---------------------------------------------------------------------- 
     426      REAL(wp) ::   zcoef 
     427      INTEGER  ::   ji, jj   ! dummy loop indices 
     428      !!--------------------------------------------------------------------- 
     429      ! 
     430      IF( nn_timing == 1 )  CALL timing_start('blk_ice_clio_tau') 
     431 
     432      SELECT CASE( cp_ice_msh ) 
     433 
     434      CASE( 'C' )                          ! C-grid ice dynamics 
     435 
     436         zcoef  = cai / cao                         ! Change from air-sea stress to air-ice stress 
     437         utau_ice(:,:) = zcoef * utau(:,:) 
     438         vtau_ice(:,:) = zcoef * vtau(:,:) 
     439 
     440      CASE( 'I' )                          ! I-grid ice dynamics:  I-point (i.e. F-point lower-left corner) 
     441 
     442         zcoef  = 0.5_wp * cai / cao                ! Change from air-sea stress to air-ice stress 
     443         DO jj = 2, jpj         ! stress from ocean U- and V-points to ice U,V point 
     444            DO ji = 2, jpi   ! I-grid : no vector opt. 
     445               utau_ice(ji,jj) = zcoef * ( utau(ji-1,jj  ) + utau(ji-1,jj-1) ) 
     446               vtau_ice(ji,jj) = zcoef * ( vtau(ji  ,jj-1) + vtau(ji-1,jj-1) ) 
     447            END DO 
     448         END DO 
     449 
     450         CALL lbc_lnk( utau_ice(:,:), 'I', -1. )   ;   CALL lbc_lnk( vtau_ice(:,:), 'I', -1. )   ! I-point 
     451 
     452      END SELECT 
     453 
     454      IF(ln_ctl) THEN 
     455         CALL prt_ctl(tab2d_1=utau_ice , clinfo1=' blk_ice_clio: utau_ice : ', tab2d_2=vtau_ice , clinfo2=' vtau_ice : ') 
     456      ENDIF 
     457 
     458      IF( nn_timing == 1 )  CALL timing_stop('blk_ice_clio_tau') 
     459 
     460   END SUBROUTINE blk_ice_clio_tau 
     461#endif 
     462 
     463# if defined key_lim2 || defined key_lim3 
     464   SUBROUTINE blk_ice_clio_flx(  ptsu , palb_cs, palb_os, palb ) 
     465      !!--------------------------------------------------------------------------- 
     466      !!                     ***  ROUTINE blk_ice_clio_flx *** 
    412467      !!                  
    413468      !!  ** Purpose :   Computation of the heat fluxes at ocean and snow/ice 
     
    431486      !!                         to take into account solid precip latent heat flux 
    432487      !!---------------------------------------------------------------------- 
    433       REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   pst      ! ice surface temperature                   [Kelvin] 
     488      REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   ptsu      ! ice surface temperature                   [Kelvin] 
    434489      REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   palb_cs  ! ice albedo (clear    sky) (alb_ice_cs)         [-] 
    435490      REAL(wp), INTENT(in   ), DIMENSION(:,:,:)   ::   palb_os  ! ice albedo (overcast sky) (alb_ice_os)         [-] 
    436491      REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   palb     ! ice albedo (actual value)                      [-] 
    437       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_taui   ! surface ice stress at I-point (i-component) [N/m2] 
    438       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_tauj   ! surface ice stress at I-point (j-component) [N/m2] 
    439       REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_qns    ! non solar heat flux over ice (T-point)      [W/m2] 
    440       REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_qsr    !     solar heat flux over ice (T-point)      [W/m2] 
    441       REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_qla    ! latent    heat flux over ice (T-point)      [W/m2] 
    442       REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_dqns   ! non solar heat sensistivity  (T-point)      [W/m2] 
    443       REAL(wp), INTENT(  out), DIMENSION(:,:,:)   ::   p_dqla   ! latent    heat sensistivity  (T-point)      [W/m2] 
    444       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_tpr    ! total precipitation          (T-point)   [Kg/m2/s] 
    445       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_spr    ! solid precipitation          (T-point)   [Kg/m2/s] 
    446       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_fr1    ! 1sr fraction of qsr penetration in ice         [-] 
    447       REAL(wp), INTENT(  out), DIMENSION(jpi,jpj) ::   p_fr2    ! 2nd fraction of qsr penetration in ice         [-] 
    448       CHARACTER(len=1), INTENT(in   )             ::   cd_grid  ! type of sea-ice grid ("C" or "B" grid) 
    449       INTEGER, INTENT(in   )                      ::   pdim     ! number of ice categories 
    450492      !! 
    451493      INTEGER  ::   ji, jj, jl    ! dummy loop indices 
    452       INTEGER  ::   ijpl          ! number of ice categories (size of 3rd dim of input arrays) 
    453       !! 
    454       REAL(wp) ::   zcoef, zmt1, zmt2, zmt3, ztatm3     ! temporary scalars 
     494      !! 
     495      REAL(wp) ::   zmt1, zmt2, zmt3, ztatm3                    ! temporary scalars 
    455496      REAL(wp) ::   ztaevbk, zind1, zind2, zind3, ztamr         !    -         - 
    456497      REAL(wp) ::   zesi, zqsati, zdesidt                       !    -         - 
     
    458499      REAL(wp) ::   zcshi, zclei, zrhovaclei, zrhovacshi        !    -         - 
    459500      REAL(wp) ::   ztice3, zticemb, zticemb2, zdqlw, zdqsb     !    -         - 
     501      REAL(wp) ::   z1_lsub                                     !    -         - 
    460502      !! 
    461503      REAL(wp), DIMENSION(:,:)  , POINTER ::   ztatm   ! Tair in Kelvin 
     
    464506      REAL(wp), DIMENSION(:,:)  , POINTER ::   zrhoa   ! air density 
    465507      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_qlw, z_qsb 
     508      REAL(wp), DIMENSION(:,:)  , POINTER ::   zevap, zsnw 
    466509      !!--------------------------------------------------------------------- 
    467510      ! 
    468       IF( nn_timing == 1 )  CALL timing_start('blk_ice_clio') 
     511      IF( nn_timing == 1 )  CALL timing_start('blk_ice_clio_flx') 
    469512      ! 
    470513      CALL wrk_alloc( jpi,jpj, ztatm, zqatm, zevsqr, zrhoa ) 
    471       CALL wrk_alloc( jpi,jpj,pdim, z_qlw, z_qsb ) 
    472  
    473       ijpl  = pdim                           ! number of ice categories 
     514      CALL wrk_alloc( jpi,jpj, jpl, z_qlw, z_qsb ) 
     515 
    474516      zpatm = 101000.                        ! atmospheric pressure  (assumed constant  here) 
    475  
    476 #if defined key_lim3       
    477       tatm_ice(:,:) = sf(jp_tair)%fnow(:,:,1)   ! LIM3: make Tair available in sea-ice. WARNING allocated after call to ice_init 
    478 #endif 
    479       !                                                        ! surface ocean fluxes computed with CLIO bulk formulea 
    480       !------------------------------------! 
    481       !   momentum fluxes  (utau, vtau )   ! 
    482       !------------------------------------! 
    483  
    484       SELECT CASE( cd_grid ) 
    485       CASE( 'C' )                          ! C-grid ice dynamics 
    486          zcoef  = cai / cao                         ! Change from air-sea stress to air-ice stress 
    487          p_taui(:,:) = zcoef * utau(:,:) 
    488          p_tauj(:,:) = zcoef * vtau(:,:) 
    489       CASE( 'I' )                          ! I-grid ice dynamics:  I-point (i.e. F-point lower-left corner) 
    490          zcoef  = 0.5_wp * cai / cao                ! Change from air-sea stress to air-ice stress 
    491          DO jj = 2, jpj         ! stress from ocean U- and V-points to ice U,V point 
    492             DO ji = 2, jpi   ! I-grid : no vector opt. 
    493                p_taui(ji,jj) = zcoef * ( utau(ji-1,jj  ) + utau(ji-1,jj-1) ) 
    494                p_tauj(ji,jj) = zcoef * ( vtau(ji  ,jj-1) + vtau(ji-1,jj-1) ) 
    495             END DO 
    496          END DO 
    497          CALL lbc_lnk( p_taui(:,:), 'I', -1. )   ;   CALL lbc_lnk( p_tauj(:,:), 'I', -1. )   ! I-point 
    498       END SELECT 
    499  
    500  
     517      !-------------------------------------------------------------------------------- 
    501518      !  Determine cloud optical depths as a function of latitude (Chou et al., 1981). 
    502519      !  and the correction factor for taking into account  the effect of clouds  
    503       !------------------------------------------------------ 
     520      !-------------------------------------------------------------------------------- 
     521 
    504522!CDIR NOVERRCHK 
    505523!CDIR COLLAPSE 
     
    528546            zmt2  = ( 272.0 - ztatm(ji,jj) ) / 38.0   ;   zind2 = MAX( 0.e0, SIGN( 1.e0, zmt2 ) ) 
    529547            zmt3  = ( 281.0 - ztatm(ji,jj) ) / 18.0   ;   zind3 = MAX( 0.e0, SIGN( 1.e0, zmt3 ) ) 
    530             p_spr(ji,jj) = sf(jp_prec)%fnow(ji,jj,1) / rday   &      ! rday = converte mm/day to kg/m2/s 
     548            sprecip(ji,jj) = sf(jp_prec)%fnow(ji,jj,1) / rday   &      ! rday = converte mm/day to kg/m2/s 
    531549               &         * (          zind1      &                   ! solid  (snow) precipitation [kg/m2/s] 
    532550               &            + ( 1.0 - zind1 ) * (          zind2   * ( 0.5 + zmt2 )   & 
     
    538556            ! fraction of qsr_ice which is NOT absorbed in the thin surface layer 
    539557            ! and thus which penetrates inside the ice cover ( Maykut and Untersteiner, 1971 ; Elbert anbd Curry, 1993 ) 
    540             p_fr1(ji,jj) = 0.18  * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.35 * sf(jp_ccov)%fnow(ji,jj,1)  
    541             p_fr2(ji,jj) = 0.82  * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.65 * sf(jp_ccov)%fnow(ji,jj,1) 
    542          END DO 
    543       END DO 
    544       CALL iom_put( 'snowpre', p_spr )   ! Snow precipitation  
     558            fr1_i0(ji,jj) = 0.18  * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.35 * sf(jp_ccov)%fnow(ji,jj,1)  
     559            fr2_i0(ji,jj) = 0.82  * ( 1.e0 - sf(jp_ccov)%fnow(ji,jj,1) ) + 0.65 * sf(jp_ccov)%fnow(ji,jj,1) 
     560         END DO 
     561      END DO 
     562      CALL iom_put( 'snowpre', sprecip )   ! Snow precipitation  
    545563       
    546564      !-----------------------------------------------------------! 
    547565      !  snow/ice Shortwave radiation   (abedo already computed)  ! 
    548566      !-----------------------------------------------------------! 
    549       CALL blk_clio_qsr_ice( palb_cs, palb_os, p_qsr ) 
    550        
    551       DO jl = 1, ijpl 
     567      CALL blk_clio_qsr_ice( palb_cs, palb_os, qsr_ice ) 
     568       
     569      DO jl = 1, jpl 
    552570         palb(:,:,jl) = ( palb_cs(:,:,jl) * ( 1.e0 - sf(jp_ccov)%fnow(:,:,1) )   & 
    553571            &         +   palb_os(:,:,jl) * sf(jp_ccov)%fnow(:,:,1) ) 
     
    555573 
    556574      !                                     ! ========================== ! 
    557       DO jl = 1, ijpl                       !  Loop over ice categories  ! 
     575      DO jl = 1, jpl                       !  Loop over ice categories  ! 
    558576         !                                  ! ========================== ! 
    559577!CDIR NOVERRCHK 
     
    569587               ztaevbk = ztatm3 * ztatm(ji,jj) * zcldeff * ( 0.39 - 0.05 * zevsqr(ji,jj) )  
    570588               ! 
    571                z_qlw(ji,jj,jl) = - emic * stefan * ( ztaevbk + 4. * ztatm3 * ( pst(ji,jj,jl) - ztatm(ji,jj) ) )  
     589               z_qlw(ji,jj,jl) = - emic * stefan * ( ztaevbk + 4. * ztatm3 * ( ptsu(ji,jj,jl) - ztatm(ji,jj) ) )  
    572590 
    573591               !---------------------------------------- 
     
    576594 
    577595               ! vapour pressure at saturation of ice (tmask to avoid overflow in the exponential) 
    578                zesi =  611.0 * EXP( 21.8745587 * tmask(ji,jj,1) * ( pst(ji,jj,jl) - rtt )/ ( pst(ji,jj,jl) - 7.66 ) ) 
     596               zesi =  611.0 * EXP( 21.8745587 * tmask(ji,jj,1) * ( ptsu(ji,jj,jl) - rtt )/ ( ptsu(ji,jj,jl) - 7.66 ) ) 
    579597               ! humidity close to the ice surface (at saturation) 
    580598               zqsati   = ( 0.622 * zesi ) / ( zpatm - 0.378 * zesi ) 
    581599                
    582600               !  computation of intermediate values 
    583                zticemb  = pst(ji,jj,jl) - 7.66 
     601               zticemb  = ptsu(ji,jj,jl) - 7.66 
    584602               zticemb2 = zticemb * zticemb   
    585                ztice3   = pst(ji,jj,jl) * pst(ji,jj,jl) * pst(ji,jj,jl) 
     603               ztice3   = ptsu(ji,jj,jl) * ptsu(ji,jj,jl) * ptsu(ji,jj,jl) 
    586604               zdesidt  = zesi * ( 9.5 * LOG( 10.0 ) * ( rtt - 7.66 )  / zticemb2 ) 
    587605                
     
    596614             
    597615               !  sensible heat flux 
    598                z_qsb(ji,jj,jl) = zrhovacshi * ( pst(ji,jj,jl) - ztatm(ji,jj) ) 
     616               z_qsb(ji,jj,jl) = zrhovacshi * ( ptsu(ji,jj,jl) - ztatm(ji,jj) ) 
    599617             
    600618               !  latent heat flux  
    601                p_qla(ji,jj,jl) = MAX(  0.e0, zrhovaclei * ( zqsati - zqatm(ji,jj) )  ) 
     619               qla_ice(ji,jj,jl) = MAX(  0.e0, zrhovaclei * ( zqsati - zqatm(ji,jj) )  ) 
    602620               
    603621               !  sensitivity of non solar fluxes (dQ/dT) (long-wave, sensible and latent fluxes) 
     
    606624               zdqla = zrhovaclei * ( zdesidt * ( zqsati * zqsati / ( zesi * zesi ) ) * ( zpatm / 0.622 ) )    
    607625               ! 
    608                p_dqla(ji,jj,jl) = zdqla                           ! latent flux sensitivity 
    609                p_dqns(ji,jj,jl) = -( zdqlw + zdqsb + zdqla )      !  total non solar sensitivity 
     626               dqla_ice(ji,jj,jl) = zdqla                           ! latent flux sensitivity 
     627               dqns_ice(ji,jj,jl) = -( zdqlw + zdqsb + zdqla )      !  total non solar sensitivity 
    610628            END DO 
    611629            ! 
     
    619637      ! 
    620638!CDIR COLLAPSE 
    621       p_qns(:,:,:) = z_qlw (:,:,:) - z_qsb (:,:,:) - p_qla (:,:,:)      ! Downward Non Solar flux 
    622 !CDIR COLLAPSE 
    623       p_tpr(:,:)   = sf(jp_prec)%fnow(:,:,1) / rday                     ! total precipitation [kg/m2/s] 
     639      qns_ice(:,:,:) = z_qlw (:,:,:) - z_qsb (:,:,:) - qla_ice (:,:,:)      ! Downward Non Solar flux 
     640!CDIR COLLAPSE 
     641      tprecip(:,:)   = sf(jp_prec)%fnow(:,:,1) / rday                     ! total precipitation [kg/m2/s] 
    624642      ! 
    625643      ! ----------------------------------------------------------------------------- ! 
     
    628646!CDIR COLLAPSE 
    629647      qns(:,:) = qns(:,:)                                                           &   ! update the non-solar heat flux with: 
    630          &     - p_spr(:,:) * lfus                                                  &   ! remove melting solid precip 
    631          &     + p_spr(:,:) * MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow - rt0 ) * cpic &   ! add solid P at least below melting 
    632          &     - p_spr(:,:) * sf(jp_tair)%fnow(:,:,1)                        * rcp      ! remove solid precip. at Tair 
    633       ! 
     648         &     - sprecip(:,:) * lfus                                                  &   ! remove melting solid precip 
     649         &     + sprecip(:,:) * MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow - rt0 ) * cpic &   ! add solid P at least below melting 
     650         &     - sprecip(:,:) * sf(jp_tair)%fnow(:,:,1)                        * rcp      ! remove solid precip. at Tair 
     651 
     652#if defined key_lim3 
     653      ! ----------------------------------------------------------------------------- ! 
     654      !    Distribute evapo, precip & associated heat over ice and ocean 
     655      ! ---------------=====--------------------------------------------------------- ! 
     656      CALL wrk_alloc( jpi,jpj, zevap, zsnw )  
     657 
     658      ! --- evaporation --- ! 
     659      z1_lsub = 1._wp / Lsub 
     660      evap_ice (:,:,:) = qla_ice (:,:,:) * z1_lsub ! sublimation 
     661      devap_ice(:,:,:) = dqla_ice(:,:,:) * z1_lsub 
     662      zevap    (:,:)   = emp(:,:) + tprecip(:,:)   ! evaporation over ocean 
     663 
     664      ! --- evaporation minus precipitation --- ! 
     665      CALL lim_thd_snwblow( pfrld, zsnw )          ! snow redistribution by wind 
     666      emp_oce(:,:) = pfrld(:,:) * zevap(:,:) - ( tprecip(:,:) - sprecip(:,:) ) - sprecip(:,:) * ( 1._wp - zsnw ) 
     667      emp_ice(:,:) = SUM( a_i_b(:,:,:) * evap_ice(:,:,:), dim=3 ) - sprecip(:,:) * zsnw 
     668      emp_tot(:,:) = emp_oce(:,:) + emp_ice(:,:) 
     669 
     670      ! --- heat flux associated with emp --- ! 
     671      qemp_oce(:,:) = - pfrld(:,:) * zevap(:,:) * sst_m(:,:) * rcp                               & ! evap 
     672         &          + ( tprecip(:,:) - sprecip(:,:) ) * ( sf(jp_tair)%fnow(:,:,1) - rt0 ) * rcp  & ! liquid precip 
     673         &          +   sprecip(:,:) * ( 1._wp - zsnw ) *                                        & ! solid precip 
     674         &              ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 
     675      qemp_ice(:,:) =   sprecip(:,:) * zsnw *                                                    & ! solid precip (only) 
     676         &              ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 
     677 
     678      ! --- total solar and non solar fluxes --- ! 
     679      qns_tot(:,:) = pfrld(:,:) * qns_oce(:,:) + SUM( a_i_b(:,:,:) * qns_ice(:,:,:), dim=3 ) + qemp_ice(:,:) + qemp_oce(:,:) 
     680      qsr_tot(:,:) = pfrld(:,:) * qsr_oce(:,:) + SUM( a_i_b(:,:,:) * qsr_ice(:,:,:), dim=3 ) 
     681 
     682      ! --- heat content of precip over ice in J/m3 (to be used in 1D-thermo) --- ! 
     683      qprec_ice(:,:) = rhosn * ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 
     684 
     685      CALL wrk_dealloc( jpi,jpj, zevap, zsnw )  
     686#endif 
     687 
    634688!!gm : not necessary as all input data are lbc_lnk... 
    635       CALL lbc_lnk( p_fr1  (:,:) , 'T', 1. ) 
    636       CALL lbc_lnk( p_fr2  (:,:) , 'T', 1. ) 
    637       DO jl = 1, ijpl 
    638          CALL lbc_lnk( p_qns (:,:,jl) , 'T', 1. ) 
    639          CALL lbc_lnk( p_dqns(:,:,jl) , 'T', 1. ) 
    640          CALL lbc_lnk( p_qla (:,:,jl) , 'T', 1. ) 
    641          CALL lbc_lnk( p_dqla(:,:,jl) , 'T', 1. ) 
     689      CALL lbc_lnk( fr1_i0  (:,:) , 'T', 1. ) 
     690      CALL lbc_lnk( fr2_i0  (:,:) , 'T', 1. ) 
     691      DO jl = 1, jpl 
     692         CALL lbc_lnk( qns_ice (:,:,jl) , 'T', 1. ) 
     693         CALL lbc_lnk( dqns_ice(:,:,jl) , 'T', 1. ) 
     694         CALL lbc_lnk( qla_ice (:,:,jl) , 'T', 1. ) 
     695         CALL lbc_lnk( dqla_ice(:,:,jl) , 'T', 1. ) 
    642696      END DO 
    643697 
    644698!!gm : mask is not required on forcing 
    645       DO jl = 1, ijpl 
    646          p_qns (:,:,jl) = p_qns (:,:,jl) * tmask(:,:,1) 
    647          p_qla (:,:,jl) = p_qla (:,:,jl) * tmask(:,:,1) 
    648          p_dqns(:,:,jl) = p_dqns(:,:,jl) * tmask(:,:,1) 
    649          p_dqla(:,:,jl) = p_dqla(:,:,jl) * tmask(:,:,1) 
    650       END DO 
     699      DO jl = 1, jpl 
     700         qns_ice (:,:,jl) = qns_ice (:,:,jl) * tmask(:,:,1) 
     701         qla_ice (:,:,jl) = qla_ice (:,:,jl) * tmask(:,:,1) 
     702         dqns_ice(:,:,jl) = dqns_ice(:,:,jl) * tmask(:,:,1) 
     703         dqla_ice(:,:,jl) = dqla_ice(:,:,jl) * tmask(:,:,1) 
     704      END DO 
     705 
     706      CALL wrk_dealloc( jpi,jpj, ztatm, zqatm, zevsqr, zrhoa ) 
     707      CALL wrk_dealloc( jpi,jpj, jpl  , z_qlw, z_qsb ) 
    651708 
    652709      IF(ln_ctl) THEN 
    653          CALL prt_ctl(tab3d_1=z_qsb  , clinfo1=' blk_ice_clio: z_qsb  : ', tab3d_2=z_qlw  , clinfo2=' z_qlw  : ', kdim=ijpl) 
    654          CALL prt_ctl(tab3d_1=p_qla  , clinfo1=' blk_ice_clio: z_qla  : ', tab3d_2=p_qsr  , clinfo2=' p_qsr  : ', kdim=ijpl) 
    655          CALL prt_ctl(tab3d_1=p_dqns , clinfo1=' blk_ice_clio: p_dqns : ', tab3d_2=p_qns  , clinfo2=' p_qns  : ', kdim=ijpl) 
    656          CALL prt_ctl(tab3d_1=p_dqla , clinfo1=' blk_ice_clio: p_dqla : ', tab3d_2=pst    , clinfo2=' pst    : ', kdim=ijpl) 
    657          CALL prt_ctl(tab2d_1=p_tpr  , clinfo1=' blk_ice_clio: p_tpr  : ', tab2d_2=p_spr  , clinfo2=' p_spr  : ') 
    658          CALL prt_ctl(tab2d_1=p_taui , clinfo1=' blk_ice_clio: p_taui : ', tab2d_2=p_tauj , clinfo2=' p_tauj : ') 
     710         CALL prt_ctl(tab3d_1=z_qsb  , clinfo1=' blk_ice_clio: z_qsb  : ', tab3d_2=z_qlw  , clinfo2=' z_qlw  : ', kdim=jpl) 
     711         CALL prt_ctl(tab3d_1=qla_ice  , clinfo1=' blk_ice_clio: z_qla  : ', tab3d_2=qsr_ice  , clinfo2=' qsr_ice  : ', kdim=jpl) 
     712         CALL prt_ctl(tab3d_1=dqns_ice , clinfo1=' blk_ice_clio: dqns_ice : ', tab3d_2=qns_ice  , clinfo2=' qns_ice  : ', kdim=jpl) 
     713         CALL prt_ctl(tab3d_1=dqla_ice , clinfo1=' blk_ice_clio: dqla_ice : ', tab3d_2=ptsu    , clinfo2=' ptsu    : ', kdim=jpl) 
     714         CALL prt_ctl(tab2d_1=tprecip  , clinfo1=' blk_ice_clio: tprecip  : ', tab2d_2=sprecip  , clinfo2=' sprecip  : ') 
    659715      ENDIF 
    660716 
    661       CALL wrk_dealloc( jpi,jpj, ztatm, zqatm, zevsqr, zrhoa ) 
    662       CALL wrk_dealloc( jpi,jpj,pdim, z_qlw, z_qsb ) 
    663       ! 
    664       IF( nn_timing == 1 )  CALL timing_stop('blk_ice_clio') 
    665       ! 
    666    END SUBROUTINE blk_ice_clio 
    667  
     717      IF( nn_timing == 1 )  CALL timing_stop('blk_ice_clio_flx') 
     718      ! 
     719   END SUBROUTINE blk_ice_clio_flx 
     720 
     721#endif 
    668722 
    669723   SUBROUTINE blk_clio_qsr_oce( pqsr_oce ) 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_core.F90

    r5233 r5443  
    2222   !!   blk_oce_core    : computes momentum, heat and freshwater fluxes over ocean 
    2323   !!   blk_ice_core    : computes momentum, heat and freshwater fluxes over ice 
    24    !!   blk_bio_meanqsr : compute daily mean short wave radiation over the ocean 
    25    !!   blk_ice_meanqsr : compute daily mean short wave radiation over the ice 
    2624   !!   turb_core_2z    : Computes turbulent transfert coefficients 
    2725   !!   cd_neutral_10m  : Estimate of the neutral drag coefficient at 10m 
     
    4644   USE sbc_ice         ! Surface boundary condition: ice fields 
    4745   USE lib_fortran     ! to use key_nosignedzero 
     46#if defined key_lim3 
     47   USE ice, ONLY       : u_ice, v_ice, jpl, pfrld, a_i_b 
     48   USE limthd_dh       ! for CALL lim_thd_snwblow 
     49#elif defined key_lim2 
     50   USE ice_2, ONLY     : u_ice, v_ice 
     51   USE par_ice_2 
     52#endif 
    4853 
    4954   IMPLICIT NONE 
     
    5156 
    5257   PUBLIC   sbc_blk_core         ! routine called in sbcmod module 
    53    PUBLIC   blk_ice_core         ! routine called in sbc_ice_lim module 
    54    PUBLIC   blk_ice_meanqsr      ! routine called in sbc_ice_lim module 
     58#if defined key_lim2 || defined key_lim3 
     59   PUBLIC   blk_ice_core_tau     ! routine called in sbc_ice_lim module 
     60   PUBLIC   blk_ice_core_flx     ! routine called in sbc_ice_lim module 
     61#endif 
    5562   PUBLIC   turb_core_2z         ! routine calles in sbcblk_mfs module 
    5663 
     
    195202      !                                            ! compute the surface ocean fluxes using CORE bulk formulea 
    196203      IF( MOD( kt - 1, nn_fsbc ) == 0 )   CALL blk_oce_core( kt, sf, sst_m, ssu_m, ssv_m ) 
    197  
    198       ! If diurnal cycle is activated, compute a daily mean short waves flux for biogeochemistery 
    199       IF( ltrcdm2dc )   CALL blk_bio_meanqsr 
    200204 
    201205#if defined key_cice 
     
    302306      ELSE                  ;   qsr(:,:) = zztmp *          sf(jp_qsr)%fnow(:,:,1)   * tmask(:,:,1) 
    303307      ENDIF 
     308 
    304309      zqlw(:,:) = (  sf(jp_qlw)%fnow(:,:,1) - Stef * zst(:,:)*zst(:,:)*zst(:,:)*zst(:,:)  ) * tmask(:,:,1)   ! Long  Wave 
    305310      ! ----------------------------------------------------------------------------- ! 
     
    376381      emp (:,:) = (  zevap(:,:)                                          &   ! mass flux (evap. - precip.) 
    377382         &         - sf(jp_prec)%fnow(:,:,1) * rn_pfac  ) * tmask(:,:,1) 
    378       qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:)                                &   ! Downward Non Solar flux 
     383      ! 
     384      qns(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:)                                &   ! Downward Non Solar  
    379385         &     - sf(jp_snow)%fnow(:,:,1) * rn_pfac * lfus                         &   ! remove latent melting heat for solid precip 
    380386         &     - zevap(:,:) * pst(:,:) * rcp                                      &   ! remove evap heat content at SST 
     
    384390         &     * ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) 
    385391      ! 
    386       CALL iom_put( "qlw_oce",   zqlw )                 ! output downward longwave heat over the ocean 
    387       CALL iom_put( "qsb_oce", - zqsb )                 ! output downward sensible heat over the ocean 
    388       CALL iom_put( "qla_oce", - zqla )                 ! output downward latent   heat over the ocean 
    389       CALL iom_put( "qhc_oce",   qns-zqlw+zqsb+zqla )   ! output downward heat content of E-P over the ocean 
    390       CALL iom_put( "qns_oce",   qns  )                 ! output downward non solar heat over the ocean 
     392#if defined key_lim3 
     393      qns_oce(:,:) = zqlw(:,:) - zqsb(:,:) - zqla(:,:)                                ! non solar without emp (only needed by LIM3) 
     394      qsr_oce(:,:) = qsr(:,:) 
     395#endif 
     396      ! 
     397      IF ( nn_ice == 0 ) THEN 
     398         CALL iom_put( "qlw_oce" ,   zqlw )                 ! output downward longwave heat over the ocean 
     399         CALL iom_put( "qsb_oce" , - zqsb )                 ! output downward sensible heat over the ocean 
     400         CALL iom_put( "qla_oce" , - zqla )                 ! output downward latent   heat over the ocean 
     401         CALL iom_put( "qemp_oce",   qns-zqlw+zqsb+zqla )   ! output downward heat content of E-P over the ocean 
     402         CALL iom_put( "qns_oce" ,   qns  )                 ! output downward non solar heat over the ocean 
     403         CALL iom_put( "qsr_oce" ,   qsr  )                 ! output downward solar heat over the ocean 
     404         CALL iom_put( "qt_oce"  ,   qns+qsr )              ! output total downward heat over the ocean 
     405      ENDIF 
    391406      ! 
    392407      IF(ln_ctl) THEN 
     
    406421  
    407422    
    408    SUBROUTINE blk_ice_core(  pst   , pui   , pvi   , palb ,   & 
    409       &                      p_taui, p_tauj, p_qns , p_qsr,   & 
    410       &                      p_qla , p_dqns, p_dqla,          & 
    411       &                      p_tpr , p_spr ,                  & 
    412       &                      p_fr1 , p_fr2 , cd_grid, pdim  )  
    413       !!--------------------------------------------------------------------- 
    414       !!                     ***  ROUTINE blk_ice_core  *** 
     423#if defined key_lim2 || defined key_lim3 
     424   SUBROUTINE blk_ice_core_tau 
     425      !!--------------------------------------------------------------------- 
     426      !!                     ***  ROUTINE blk_ice_core_tau  *** 
    415427      !! 
    416428      !! ** Purpose :   provide the surface boundary condition over sea-ice 
    417429      !! 
    418       !! ** Method  :   compute momentum, heat and freshwater exchanged 
    419       !!                between atmosphere and sea-ice using CORE bulk 
    420       !!                formulea, ice variables and read atmmospheric fields. 
     430      !! ** Method  :   compute momentum using CORE bulk 
     431      !!                formulea, ice variables and read atmospheric fields. 
    421432      !!                NB: ice drag coefficient is assumed to be a constant 
    422       !!  
    423       !! caution : the net upward water flux has with mm/day unit 
    424       !!--------------------------------------------------------------------- 
    425       REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   pst      ! ice surface temperature (>0, =rt0 over land) [Kelvin] 
    426       REAL(wp), DIMENSION(:,:)  , INTENT(in   ) ::   pui      ! ice surface velocity (i- and i- components      [m/s] 
    427       REAL(wp), DIMENSION(:,:)  , INTENT(in   ) ::   pvi      !    at I-point (B-grid) or U & V-point (C-grid) 
    428       REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   palb     ! ice albedo (all skies)                            [%] 
    429       REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   p_taui   ! i- & j-components of surface ice stress        [N/m2] 
    430       REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   p_tauj   !   at I-point (B-grid) or U & V-point (C-grid) 
    431       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_qns    ! non solar heat flux over ice (T-point)         [W/m2] 
    432       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_qsr    !     solar heat flux over ice (T-point)         [W/m2] 
    433       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_qla    ! latent    heat flux over ice (T-point)         [W/m2] 
    434       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_dqns   ! non solar heat sensistivity  (T-point)         [W/m2] 
    435       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_dqla   ! latent    heat sensistivity  (T-point)         [W/m2] 
    436       REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   p_tpr    ! total precipitation          (T-point)      [Kg/m2/s] 
    437       REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   p_spr    ! solid precipitation          (T-point)      [Kg/m2/s] 
    438       REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   p_fr1    ! 1sr fraction of qsr penetration in ice (T-point)  [%] 
    439       REAL(wp), DIMENSION(:,:)  , INTENT(  out) ::   p_fr2    ! 2nd fraction of qsr penetration in ice (T-point)  [%] 
    440       CHARACTER(len=1)          , INTENT(in   ) ::   cd_grid  ! ice grid ( C or B-grid) 
    441       INTEGER                   , INTENT(in   ) ::   pdim     ! number of ice categories 
    442       !! 
    443       INTEGER  ::   ji, jj, jl    ! dummy loop indices 
    444       INTEGER  ::   ijpl          ! number of ice categories (size of 3rd dim of input arrays) 
    445       REAL(wp) ::   zst2, zst3 
    446       REAL(wp) ::   zcoef_wnorm, zcoef_wnorm2, zcoef_dqlw, zcoef_dqla, zcoef_dqsb 
    447       REAL(wp) ::   zztmp                                        ! temporary variable 
    448       REAL(wp) ::   zwnorm_f, zwndi_f , zwndj_f                  ! relative wind module and components at F-point 
    449       REAL(wp) ::             zwndi_t , zwndj_t                  ! relative wind components at T-point 
    450       !! 
    451       REAL(wp), DIMENSION(:,:)  , POINTER ::   z_wnds_t          ! wind speed ( = | U10m - U_ice | ) at T-point 
    452       REAL(wp), DIMENSION(:,:,:), POINTER ::   z_qlw             ! long wave heat flux over ice 
    453       REAL(wp), DIMENSION(:,:,:), POINTER ::   z_qsb             ! sensible  heat flux over ice 
    454       REAL(wp), DIMENSION(:,:,:), POINTER ::   z_dqlw            ! long wave heat sensitivity over ice 
    455       REAL(wp), DIMENSION(:,:,:), POINTER ::   z_dqsb            ! sensible  heat sensitivity over ice 
    456       !!--------------------------------------------------------------------- 
    457       ! 
    458       IF( nn_timing == 1 )  CALL timing_start('blk_ice_core') 
    459       ! 
    460       CALL wrk_alloc( jpi,jpj, z_wnds_t ) 
    461       CALL wrk_alloc( jpi,jpj,pdim, z_qlw, z_qsb, z_dqlw, z_dqsb )  
    462  
    463       ijpl  = pdim                            ! number of ice categories 
    464  
     433      !!--------------------------------------------------------------------- 
     434      INTEGER  ::   ji, jj    ! dummy loop indices 
     435      REAL(wp) ::   zcoef_wnorm, zcoef_wnorm2 
     436      REAL(wp) ::   zwnorm_f, zwndi_f , zwndj_f               ! relative wind module and components at F-point 
     437      REAL(wp) ::             zwndi_t , zwndj_t               ! relative wind components at T-point 
     438      !!--------------------------------------------------------------------- 
     439      ! 
     440      IF( nn_timing == 1 )  CALL timing_start('blk_ice_core_tau') 
     441      ! 
    465442      ! local scalars ( place there for vector optimisation purposes) 
    466443      zcoef_wnorm  = rhoa * Cice 
    467444      zcoef_wnorm2 = rhoa * Cice * 0.5 
    468       zcoef_dqlw   = 4.0 * 0.95 * Stef 
    469       zcoef_dqla   = -Ls * Cice * 11637800. * (-5897.8) 
    470       zcoef_dqsb   = rhoa * cpa * Cice 
    471445 
    472446!!gm brutal.... 
    473       z_wnds_t(:,:) = 0.e0 
    474       p_taui  (:,:) = 0.e0 
    475       p_tauj  (:,:) = 0.e0 
     447      utau_ice  (:,:) = 0._wp 
     448      vtau_ice  (:,:) = 0._wp 
     449      wndm_ice  (:,:) = 0._wp 
    476450!!gm end 
    477451 
    478 #if defined key_lim3 
    479       tatm_ice(:,:) = sf(jp_tair)%fnow(:,:,1)   ! LIM3: make Tair available in sea-ice. WARNING allocated after call to ice_init 
    480 #endif 
    481452      ! ----------------------------------------------------------------------------- ! 
    482453      !    Wind components and module relative to the moving ocean ( U10m - U_ice )   ! 
    483454      ! ----------------------------------------------------------------------------- ! 
    484       SELECT CASE( cd_grid ) 
     455      SELECT CASE( cp_ice_msh ) 
    485456      CASE( 'I' )                  ! B-grid ice dynamics :   I-point (i.e. F-point with sea-ice indexation) 
    486457         !                           and scalar wind at T-point ( = | U10m - U_ice | ) (masked) 
     
    489460               ! ... scalar wind at I-point (fld being at T-point) 
    490461               zwndi_f = 0.25 * (  sf(jp_wndi)%fnow(ji-1,jj  ,1) + sf(jp_wndi)%fnow(ji  ,jj  ,1)   & 
    491                   &              + sf(jp_wndi)%fnow(ji-1,jj-1,1) + sf(jp_wndi)%fnow(ji  ,jj-1,1)  ) - rn_vfac * pui(ji,jj) 
     462                  &              + sf(jp_wndi)%fnow(ji-1,jj-1,1) + sf(jp_wndi)%fnow(ji  ,jj-1,1)  ) - rn_vfac * u_ice(ji,jj) 
    492463               zwndj_f = 0.25 * (  sf(jp_wndj)%fnow(ji-1,jj  ,1) + sf(jp_wndj)%fnow(ji  ,jj  ,1)   & 
    493                   &              + sf(jp_wndj)%fnow(ji-1,jj-1,1) + sf(jp_wndj)%fnow(ji  ,jj-1,1)  ) - rn_vfac * pvi(ji,jj) 
     464                  &              + sf(jp_wndj)%fnow(ji-1,jj-1,1) + sf(jp_wndj)%fnow(ji  ,jj-1,1)  ) - rn_vfac * v_ice(ji,jj) 
    494465               zwnorm_f = zcoef_wnorm * SQRT( zwndi_f * zwndi_f + zwndj_f * zwndj_f ) 
    495466               ! ... ice stress at I-point 
    496                p_taui(ji,jj) = zwnorm_f * zwndi_f 
    497                p_tauj(ji,jj) = zwnorm_f * zwndj_f 
     467               utau_ice(ji,jj) = zwnorm_f * zwndi_f 
     468               vtau_ice(ji,jj) = zwnorm_f * zwndj_f 
    498469               ! ... scalar wind at T-point (fld being at T-point) 
    499                zwndi_t = sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.25 * (  pui(ji,jj+1) + pui(ji+1,jj+1)   & 
    500                   &                                                    + pui(ji,jj  ) + pui(ji+1,jj  )  ) 
    501                zwndj_t = sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.25 * (  pvi(ji,jj+1) + pvi(ji+1,jj+1)   & 
    502                   &                                                    + pvi(ji,jj  ) + pvi(ji+1,jj  )  ) 
    503                z_wnds_t(ji,jj)  = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1) 
     470               zwndi_t = sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.25 * (  u_ice(ji,jj+1) + u_ice(ji+1,jj+1)   & 
     471                  &                                                    + u_ice(ji,jj  ) + u_ice(ji+1,jj  )  ) 
     472               zwndj_t = sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.25 * (  v_ice(ji,jj+1) + v_ice(ji+1,jj+1)   & 
     473                  &                                                    + v_ice(ji,jj  ) + v_ice(ji+1,jj  )  ) 
     474               wndm_ice(ji,jj)  = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1) 
    504475            END DO 
    505476         END DO 
    506          CALL lbc_lnk( p_taui  , 'I', -1. ) 
    507          CALL lbc_lnk( p_tauj  , 'I', -1. ) 
    508          CALL lbc_lnk( z_wnds_t, 'T',  1. ) 
     477         CALL lbc_lnk( utau_ice, 'I', -1. ) 
     478         CALL lbc_lnk( vtau_ice, 'I', -1. ) 
     479         CALL lbc_lnk( wndm_ice, 'T',  1. ) 
    509480         ! 
    510481      CASE( 'C' )                  ! C-grid ice dynamics :   U & V-points (same as ocean) 
    511482         DO jj = 2, jpj 
    512483            DO ji = fs_2, jpi   ! vect. opt. 
    513                zwndi_t = (  sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( pui(ji-1,jj  ) + pui(ji,jj) )  ) 
    514                zwndj_t = (  sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( pvi(ji  ,jj-1) + pvi(ji,jj) )  ) 
    515                z_wnds_t(ji,jj) = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1) 
     484               zwndi_t = (  sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( u_ice(ji-1,jj  ) + u_ice(ji,jj) )  ) 
     485               zwndj_t = (  sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( v_ice(ji  ,jj-1) + v_ice(ji,jj) )  ) 
     486               wndm_ice(ji,jj) = SQRT( zwndi_t * zwndi_t + zwndj_t * zwndj_t ) * tmask(ji,jj,1) 
    516487            END DO 
    517488         END DO 
    518489         DO jj = 2, jpjm1 
    519490            DO ji = fs_2, fs_jpim1   ! vect. opt. 
    520                p_taui(ji,jj) = zcoef_wnorm2 * ( z_wnds_t(ji+1,jj  ) + z_wnds_t(ji,jj) )                          & 
    521                   &          * ( 0.5 * (sf(jp_wndi)%fnow(ji+1,jj,1) + sf(jp_wndi)%fnow(ji,jj,1) ) - rn_vfac * pui(ji,jj) ) 
    522                p_tauj(ji,jj) = zcoef_wnorm2 * ( z_wnds_t(ji,jj+1  ) + z_wnds_t(ji,jj) )                          & 
    523                   &          * ( 0.5 * (sf(jp_wndj)%fnow(ji,jj+1,1) + sf(jp_wndj)%fnow(ji,jj,1) ) - rn_vfac * pvi(ji,jj) ) 
     491               utau_ice(ji,jj) = zcoef_wnorm2 * ( wndm_ice(ji+1,jj  ) + wndm_ice(ji,jj) )                          & 
     492                  &          * ( 0.5 * (sf(jp_wndi)%fnow(ji+1,jj,1) + sf(jp_wndi)%fnow(ji,jj,1) ) - rn_vfac * u_ice(ji,jj) ) 
     493               vtau_ice(ji,jj) = zcoef_wnorm2 * ( wndm_ice(ji,jj+1  ) + wndm_ice(ji,jj) )                          & 
     494                  &          * ( 0.5 * (sf(jp_wndj)%fnow(ji,jj+1,1) + sf(jp_wndj)%fnow(ji,jj,1) ) - rn_vfac * v_ice(ji,jj) ) 
    524495            END DO 
    525496         END DO 
    526          CALL lbc_lnk( p_taui  , 'U', -1. ) 
    527          CALL lbc_lnk( p_tauj  , 'V', -1. ) 
    528          CALL lbc_lnk( z_wnds_t, 'T',  1. ) 
     497         CALL lbc_lnk( utau_ice, 'U', -1. ) 
     498         CALL lbc_lnk( vtau_ice, 'V', -1. ) 
     499         CALL lbc_lnk( wndm_ice, 'T',  1. ) 
    529500         ! 
    530501      END SELECT 
     502 
     503      IF(ln_ctl) THEN 
     504         CALL prt_ctl(tab2d_1=utau_ice  , clinfo1=' blk_ice_core: utau_ice : ', tab2d_2=vtau_ice  , clinfo2=' vtau_ice : ') 
     505         CALL prt_ctl(tab2d_1=wndm_ice  , clinfo1=' blk_ice_core: wndm_ice : ') 
     506      ENDIF 
     507 
     508      IF( nn_timing == 1 )  CALL timing_stop('blk_ice_core_tau') 
     509       
     510   END SUBROUTINE blk_ice_core_tau 
     511 
     512 
     513   SUBROUTINE blk_ice_core_flx( ptsu, palb ) 
     514      !!--------------------------------------------------------------------- 
     515      !!                     ***  ROUTINE blk_ice_core_flx  *** 
     516      !! 
     517      !! ** Purpose :   provide the surface boundary condition over sea-ice 
     518      !! 
     519      !! ** Method  :   compute heat and freshwater exchanged 
     520      !!                between atmosphere and sea-ice using CORE bulk 
     521      !!                formulea, ice variables and read atmmospheric fields. 
     522      !!  
     523      !! caution : the net upward water flux has with mm/day unit 
     524      !!--------------------------------------------------------------------- 
     525      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   ptsu          ! sea ice surface temperature 
     526      REAL(wp), DIMENSION(:,:,:), INTENT(in)  ::   palb          ! ice albedo (all skies) 
     527      !! 
     528      INTEGER  ::   ji, jj, jl    ! dummy loop indices 
     529      REAL(wp) ::   zst2, zst3 
     530      REAL(wp) ::   zcoef_dqlw, zcoef_dqla, zcoef_dqsb 
     531      REAL(wp) ::   zztmp, z1_lsub                               ! temporary variable 
     532      !! 
     533      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_qlw             ! long wave heat flux over ice 
     534      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_qsb             ! sensible  heat flux over ice 
     535      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_dqlw            ! long wave heat sensitivity over ice 
     536      REAL(wp), DIMENSION(:,:,:), POINTER ::   z_dqsb            ! sensible  heat sensitivity over ice 
     537      REAL(wp), DIMENSION(:,:)  , POINTER ::   zevap, zsnw       ! evaporation and snw distribution after wind blowing (LIM3) 
     538      !!--------------------------------------------------------------------- 
     539      ! 
     540      IF( nn_timing == 1 )  CALL timing_start('blk_ice_core_flx') 
     541      ! 
     542      CALL wrk_alloc( jpi,jpj,jpl, z_qlw, z_qsb, z_dqlw, z_dqsb )  
     543 
     544      ! local scalars ( place there for vector optimisation purposes) 
     545      zcoef_dqlw   = 4.0 * 0.95 * Stef 
     546      zcoef_dqla   = -Ls * Cice * 11637800. * (-5897.8) 
     547      zcoef_dqsb   = rhoa * cpa * Cice 
    531548 
    532549      zztmp = 1. / ( 1. - albo ) 
    533550      !                                     ! ========================== ! 
    534       DO jl = 1, ijpl                       !  Loop over ice categories  ! 
     551      DO jl = 1, jpl                        !  Loop over ice categories  ! 
    535552         !                                  ! ========================== ! 
    536553         DO jj = 1 , jpj 
     
    539556               !      I   Radiative FLUXES   ! 
    540557               ! ----------------------------! 
    541                zst2 = pst(ji,jj,jl) * pst(ji,jj,jl) 
    542                zst3 = pst(ji,jj,jl) * zst2 
     558               zst2 = ptsu(ji,jj,jl) * ptsu(ji,jj,jl) 
     559               zst3 = ptsu(ji,jj,jl) * zst2 
    543560               ! Short Wave (sw) 
    544                p_qsr(ji,jj,jl) = zztmp * ( 1. - palb(ji,jj,jl) ) * qsr(ji,jj) 
     561               qsr_ice(ji,jj,jl) = zztmp * ( 1. - palb(ji,jj,jl) ) * qsr(ji,jj) 
    545562               ! Long  Wave (lw) 
    546                z_qlw(ji,jj,jl) = 0.95 * ( sf(jp_qlw)%fnow(ji,jj,1) - Stef * pst(ji,jj,jl) * zst3 ) * tmask(ji,jj,1) 
     563               z_qlw(ji,jj,jl) = 0.95 * ( sf(jp_qlw)%fnow(ji,jj,1) - Stef * ptsu(ji,jj,jl) * zst3 ) * tmask(ji,jj,1) 
    547564               ! lw sensitivity 
    548565               z_dqlw(ji,jj,jl) = zcoef_dqlw * zst3                                                
     
    554571               ! ... turbulent heat fluxes 
    555572               ! Sensible Heat 
    556                z_qsb(ji,jj,jl) = rhoa * cpa * Cice * z_wnds_t(ji,jj) * ( pst(ji,jj,jl) - sf(jp_tair)%fnow(ji,jj,1) ) 
     573               z_qsb(ji,jj,jl) = rhoa * cpa * Cice * wndm_ice(ji,jj) * ( ptsu(ji,jj,jl) - sf(jp_tair)%fnow(ji,jj,1) ) 
    557574               ! Latent Heat 
    558                p_qla(ji,jj,jl) = rn_efac * MAX( 0.e0, rhoa * Ls  * Cice * z_wnds_t(ji,jj)   &                            
    559                   &                         * (  11637800. * EXP( -5897.8 / pst(ji,jj,jl) ) / rhoa - sf(jp_humi)%fnow(ji,jj,1)  ) ) 
    560                ! Latent heat sensitivity for ice (Dqla/Dt) 
    561                IF( p_qla(ji,jj,jl) > 0._wp ) THEN 
    562                   p_dqla(ji,jj,jl) = rn_efac * zcoef_dqla * z_wnds_t(ji,jj) / ( zst2 ) * EXP( -5897.8 / pst(ji,jj,jl) ) 
     575               qla_ice(ji,jj,jl) = rn_efac * MAX( 0.e0, rhoa * Ls  * Cice * wndm_ice(ji,jj)   &                            
     576                  &                         * (  11637800. * EXP( -5897.8 / ptsu(ji,jj,jl) ) / rhoa - sf(jp_humi)%fnow(ji,jj,1)  ) ) 
     577              ! Latent heat sensitivity for ice (Dqla/Dt) 
     578               IF( qla_ice(ji,jj,jl) > 0._wp ) THEN 
     579                  dqla_ice(ji,jj,jl) = rn_efac * zcoef_dqla * wndm_ice(ji,jj) / ( zst2 ) * EXP( -5897.8 / ptsu(ji,jj,jl) ) 
    563580               ELSE 
    564                   p_dqla(ji,jj,jl) = 0._wp 
     581                  dqla_ice(ji,jj,jl) = 0._wp 
    565582               ENDIF 
    566583 
    567584               ! Sensible heat sensitivity (Dqsb_ice/Dtn_ice) 
    568                z_dqsb(ji,jj,jl) = zcoef_dqsb * z_wnds_t(ji,jj) 
     585               z_dqsb(ji,jj,jl) = zcoef_dqsb * wndm_ice(ji,jj) 
    569586 
    570587               ! ----------------------------! 
     
    572589               ! ----------------------------! 
    573590               ! Downward Non Solar flux 
    574                p_qns (ji,jj,jl) =     z_qlw (ji,jj,jl) - z_qsb (ji,jj,jl) - p_qla (ji,jj,jl) 
     591               qns_ice (ji,jj,jl) =     z_qlw (ji,jj,jl) - z_qsb (ji,jj,jl) - qla_ice (ji,jj,jl) 
    575592               ! Total non solar heat flux sensitivity for ice 
    576                p_dqns(ji,jj,jl) = - ( z_dqlw(ji,jj,jl) + z_dqsb(ji,jj,jl) + p_dqla(ji,jj,jl) ) 
     593               dqns_ice(ji,jj,jl) = - ( z_dqlw(ji,jj,jl) + z_dqsb(ji,jj,jl) + dqla_ice(ji,jj,jl) ) 
    577594            END DO 
    578595            ! 
     
    581598      END DO 
    582599      ! 
     600      tprecip(:,:) = sf(jp_prec)%fnow(:,:,1) * rn_pfac      ! total precipitation [kg/m2/s] 
     601      sprecip(:,:) = sf(jp_snow)%fnow(:,:,1) * rn_pfac      ! solid precipitation [kg/m2/s] 
     602      CALL iom_put( 'snowpre', sprecip * 86400. )                  ! Snow precipitation 
     603      CALL iom_put( 'precip' , tprecip * 86400. )                  ! Total precipitation 
     604 
     605#if defined  key_lim3 
     606      CALL wrk_alloc( jpi,jpj, zevap, zsnw )  
     607 
     608      ! --- evaporation --- ! 
     609      z1_lsub = 1._wp / Lsub 
     610      evap_ice (:,:,:) = qla_ice (:,:,:) * z1_lsub ! sublimation 
     611      devap_ice(:,:,:) = dqla_ice(:,:,:) * z1_lsub 
     612      zevap    (:,:)   = emp(:,:) + tprecip(:,:)   ! evaporation over ocean 
     613 
     614      ! --- evaporation minus precipitation --- ! 
     615      CALL lim_thd_snwblow( pfrld, zsnw )  ! snow distribution over ice after wind blowing  
     616      emp_oce(:,:) = pfrld(:,:) * zevap(:,:) - ( tprecip(:,:) - sprecip(:,:) ) - sprecip(:,:) * (1._wp - zsnw ) 
     617      emp_ice(:,:) = SUM( a_i_b(:,:,:) * evap_ice(:,:,:), dim=3 ) - sprecip(:,:) * zsnw 
     618      emp_tot(:,:) = emp_oce(:,:) + emp_ice(:,:) 
     619 
     620      ! --- heat flux associated with emp --- ! 
     621      qemp_oce(:,:) = - pfrld(:,:) * zevap(:,:) * sst_m(:,:) * rcp                               & ! evap at sst 
     622         &          + ( tprecip(:,:) - sprecip(:,:) ) * ( sf(jp_tair)%fnow(:,:,1) - rt0 ) * rcp  & ! liquid precip at Tair 
     623         &          +   sprecip(:,:) * ( 1._wp - zsnw ) *                                        & ! solid precip at min(Tair,Tsnow) 
     624         &              ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 
     625      qemp_ice(:,:) =   sprecip(:,:) * zsnw *                                                    & ! solid precip (only) 
     626         &              ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 
     627 
     628      ! --- total solar and non solar fluxes --- ! 
     629      qns_tot(:,:) = pfrld(:,:) * qns_oce(:,:) + SUM( a_i_b(:,:,:) * qns_ice(:,:,:), dim=3 ) + qemp_ice(:,:) + qemp_oce(:,:) 
     630      qsr_tot(:,:) = pfrld(:,:) * qsr_oce(:,:) + SUM( a_i_b(:,:,:) * qsr_ice(:,:,:), dim=3 ) 
     631 
     632      ! --- heat content of precip over ice in J/m3 (to be used in 1D-thermo) --- ! 
     633      qprec_ice(:,:) = rhosn * ( ( MIN( sf(jp_tair)%fnow(:,:,1), rt0_snow ) - rt0 ) * cpic * tmask(:,:,1) - lfus ) 
     634 
     635      CALL wrk_dealloc( jpi,jpj, zevap, zsnw )  
     636#endif 
     637 
    583638      !-------------------------------------------------------------------- 
    584639      ! FRACTIONs of net shortwave radiation which is not absorbed in the 
     
    586641      ! ( Maykut and Untersteiner, 1971 ; Ebert and Curry, 1993 ) 
    587642      ! 
    588       p_fr1(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 
    589       p_fr2(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 
    590       ! 
    591       p_tpr(:,:) = sf(jp_prec)%fnow(:,:,1) * rn_pfac      ! total precipitation [kg/m2/s] 
    592       p_spr(:,:) = sf(jp_snow)%fnow(:,:,1) * rn_pfac      ! solid precipitation [kg/m2/s] 
    593       CALL iom_put( 'snowpre', p_spr * 86400. )                  ! Snow precipitation 
    594       CALL iom_put( 'precip' , p_tpr * 86400. )                  ! Total precipitation 
     643      fr1_i0(:,:) = ( 0.18 * ( 1.0 - cldf_ice ) + 0.35 * cldf_ice ) 
     644      fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 
     645      ! 
    595646      ! 
    596647      IF(ln_ctl) THEN 
    597          CALL prt_ctl(tab3d_1=p_qla   , clinfo1=' blk_ice_core: p_qla  : ', tab3d_2=z_qsb   , clinfo2=' z_qsb  : ', kdim=ijpl) 
    598          CALL prt_ctl(tab3d_1=z_qlw   , clinfo1=' blk_ice_core: z_qlw  : ', tab3d_2=p_dqla  , clinfo2=' p_dqla : ', kdim=ijpl) 
    599          CALL prt_ctl(tab3d_1=z_dqsb  , clinfo1=' blk_ice_core: z_dqsb : ', tab3d_2=z_dqlw  , clinfo2=' z_dqlw : ', kdim=ijpl) 
    600          CALL prt_ctl(tab3d_1=p_dqns  , clinfo1=' blk_ice_core: p_dqns : ', tab3d_2=p_qsr   , clinfo2=' p_qsr  : ', kdim=ijpl) 
    601          CALL prt_ctl(tab3d_1=pst     , clinfo1=' blk_ice_core: pst    : ', tab3d_2=p_qns   , clinfo2=' p_qns  : ', kdim=ijpl) 
    602          CALL prt_ctl(tab2d_1=p_tpr   , clinfo1=' blk_ice_core: p_tpr  : ', tab2d_2=p_spr   , clinfo2=' p_spr  : ') 
    603          CALL prt_ctl(tab2d_1=p_taui  , clinfo1=' blk_ice_core: p_taui : ', tab2d_2=p_tauj  , clinfo2=' p_tauj : ') 
    604          CALL prt_ctl(tab2d_1=z_wnds_t, clinfo1=' blk_ice_core: z_wnds_t : ') 
    605       ENDIF 
    606  
    607       CALL wrk_dealloc( jpi,jpj,   z_wnds_t ) 
    608       CALL wrk_dealloc( jpi,jpj,   pdim, z_qlw, z_qsb, z_dqlw, z_dqsb ) 
    609       ! 
    610       IF( nn_timing == 1 )  CALL timing_stop('blk_ice_core') 
    611       ! 
    612    END SUBROUTINE blk_ice_core 
    613  
    614  
    615    SUBROUTINE blk_bio_meanqsr 
    616       !!--------------------------------------------------------------------- 
    617       !!                     ***  ROUTINE blk_bio_meanqsr 
    618       !!                      
    619       !! ** Purpose :   provide daily qsr_mean for PISCES when 
    620       !!                analytic diurnal cycle is applied in physic 
    621       !!                 
    622       !! ** Method  :   add part where there is no ice 
    623       !!  
    624       !!--------------------------------------------------------------------- 
    625       IF( nn_timing == 1 )  CALL timing_start('blk_bio_meanqsr') 
    626       ! 
    627       qsr_mean(:,:) = (1. - albo ) *  sf(jp_qsr)%fnow(:,:,1) 
    628       ! 
    629       IF( nn_timing == 1 )  CALL timing_stop('blk_bio_meanqsr') 
    630       ! 
    631    END SUBROUTINE blk_bio_meanqsr 
    632   
    633   
    634    SUBROUTINE blk_ice_meanqsr( palb, p_qsr_mean, pdim ) 
    635       !!--------------------------------------------------------------------- 
    636       !! 
    637       !! ** Purpose :   provide the daily qsr_mean over sea_ice for PISCES when 
    638       !!                analytic diurnal cycle is applied in physic 
    639       !! 
    640       !! ** Method  :   compute qsr 
    641       !!  
    642       !!--------------------------------------------------------------------- 
    643       REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   palb       ! ice albedo (clear sky) (alb_ice_cs)               [%] 
    644       REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   p_qsr_mean !     solar heat flux over ice (T-point)         [W/m2] 
    645       INTEGER                   , INTENT(in   ) ::   pdim       ! number of ice categories 
    646       ! 
    647       INTEGER  ::   ijpl          ! number of ice categories (size of 3rd dim of input arrays) 
    648       INTEGER  ::   ji, jj, jl    ! dummy loop indices 
    649       REAL(wp) ::   zztmp         ! temporary variable 
    650       !!--------------------------------------------------------------------- 
    651       IF( nn_timing == 1 )  CALL timing_start('blk_ice_meanqsr') 
    652       ! 
    653       ijpl  = pdim                            ! number of ice categories 
    654       zztmp = 1. / ( 1. - albo ) 
    655       !                                     ! ========================== ! 
    656       DO jl = 1, ijpl                       !  Loop over ice categories  ! 
    657          !                                  ! ========================== ! 
    658          DO jj = 1 , jpj 
    659             DO ji = 1, jpi 
    660                   p_qsr_mean(ji,jj,jl) = zztmp * ( 1. - palb(ji,jj,jl) ) * qsr_mean(ji,jj) 
    661             END DO 
    662          END DO 
    663       END DO 
    664       ! 
    665       IF( nn_timing == 1 )  CALL timing_stop('blk_ice_meanqsr') 
    666       ! 
    667    END SUBROUTINE blk_ice_meanqsr   
    668  
     648         CALL prt_ctl(tab3d_1=qla_ice , clinfo1=' blk_ice_core: qla_ice  : ', tab3d_2=z_qsb   , clinfo2=' z_qsb    : ', kdim=jpl) 
     649         CALL prt_ctl(tab3d_1=z_qlw   , clinfo1=' blk_ice_core: z_qlw    : ', tab3d_2=dqla_ice, clinfo2=' dqla_ice : ', kdim=jpl) 
     650         CALL prt_ctl(tab3d_1=z_dqsb  , clinfo1=' blk_ice_core: z_dqsb   : ', tab3d_2=z_dqlw  , clinfo2=' z_dqlw   : ', kdim=jpl) 
     651         CALL prt_ctl(tab3d_1=dqns_ice, clinfo1=' blk_ice_core: dqns_ice : ', tab3d_2=qsr_ice , clinfo2=' qsr_ice  : ', kdim=jpl) 
     652         CALL prt_ctl(tab3d_1=ptsu    , clinfo1=' blk_ice_core: ptsu     : ', tab3d_2=qns_ice , clinfo2=' qns_ice  : ', kdim=jpl) 
     653         CALL prt_ctl(tab2d_1=tprecip , clinfo1=' blk_ice_core: tprecip  : ', tab2d_2=sprecip , clinfo2=' sprecip  : ') 
     654      ENDIF 
     655 
     656      CALL wrk_dealloc( jpi,jpj,jpl, z_qlw, z_qsb, z_dqlw, z_dqsb ) 
     657      ! 
     658      IF( nn_timing == 1 )  CALL timing_stop('blk_ice_core_flx') 
     659       
     660   END SUBROUTINE blk_ice_core_flx 
     661#endif 
    669662 
    670663   SUBROUTINE turb_core_2z( zt, zu, sst, T_zt, q_sat, q_zt, dU,    & 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk_mfs.F90

    • Property svn:keywords set to Id
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90

    r5377 r5443  
    2121   USE sbc_oce         ! Surface boundary condition: ocean fields 
    2222   USE sbc_ice         ! Surface boundary condition: ice fields 
     23   USE sbcapr 
    2324   USE sbcdcy          ! surface boundary condition: diurnal cycle 
    2425   USE phycst          ! physical constants 
    2526#if defined key_lim3 
    26    USE par_ice         ! ice parameters 
    2727   USE ice             ! ice variables 
    2828#endif 
     
    3333   USE cpl_oasis3      ! OASIS3 coupling 
    3434   USE geo2ocean       !  
    35    USE oce   , ONLY : tsn, un, vn 
     35   USE oce   , ONLY : tsn, un, vn, sshn, ub, vb, sshb, fraqsr_1lev 
    3636   USE albedo          ! 
    3737   USE in_out_manager  ! I/O manager 
     
    4141   USE timing          ! Timing 
    4242   USE lbclnk          ! ocean lateral boundary conditions (or mpp link) 
     43   USE eosbn2 
     44   USE sbcrnf   , ONLY : l_rnfcpl 
    4345#if defined key_cpl_carbon_cycle 
    4446   USE p4zflx, ONLY : oce_co2 
    4547#endif 
     48#if defined key_cice 
     49   USE ice_domain_size, only: ncat 
     50#endif 
     51#if defined key_lim3 
     52   USE limthd_dh       ! for CALL lim_thd_snwblow 
     53#endif 
     54 
    4655   IMPLICIT NONE 
    4756   PRIVATE 
    48 !EM XIOS-OASIS-MCT compliance 
     57 
    4958   PUBLIC   sbc_cpl_init       ! routine called by sbcmod.F90 
    5059   PUBLIC   sbc_cpl_rcv        ! routine called by sbc_ice_lim(_2).F90 
     
    8897   INTEGER, PARAMETER ::   jpr_botm   = 33            ! botmeltn 
    8998   INTEGER, PARAMETER ::   jpr_ts_ice = 34            ! skin temperature of sea-ice (used for melt-ponds) 
    90    INTEGER, PARAMETER ::   jprcv      = 34            ! total number of fields received 
    91  
    92    INTEGER, PARAMETER ::   jps_fice   =  1            ! ice fraction  
     99   INTEGER, PARAMETER ::   jpr_sflx   = 34            ! salt flux 
     100   INTEGER, PARAMETER ::   jpr_toce   = 35            ! ocean temperature 
     101   INTEGER, PARAMETER ::   jpr_soce   = 36            ! ocean salinity 
     102   INTEGER, PARAMETER ::   jpr_ocx1   = 37            ! ocean current on grid 1 
     103   INTEGER, PARAMETER ::   jpr_ocy1   = 38            ! 
     104   INTEGER, PARAMETER ::   jpr_ssh    = 39            ! sea surface height 
     105   INTEGER, PARAMETER ::   jpr_fice   = 40            ! ice fraction           
     106   INTEGER, PARAMETER ::   jpr_e3t1st = 41            ! first T level thickness  
     107   INTEGER, PARAMETER ::   jpr_fraqsr = 42            ! fraction of solar net radiation absorbed in the first ocean level 
     108   INTEGER, PARAMETER ::   jprcv      = 42            ! total number of fields received 
     109 
     110   INTEGER, PARAMETER ::   jps_fice   =  1            ! ice fraction sent to the atmosphere 
    93111   INTEGER, PARAMETER ::   jps_toce   =  2            ! ocean temperature 
    94112   INTEGER, PARAMETER ::   jps_tice   =  3            ! ice   temperature 
     
    107125   INTEGER, PARAMETER ::   jps_a_p    = 16            ! meltpond fraction   
    108126   INTEGER, PARAMETER ::   jps_ht_p   = 17            ! meltpond depth (m)  
    109    INTEGER, PARAMETER ::   jpsnd      = 18            ! total number of fields sent 
     127   INTEGER, PARAMETER ::   jps_soce   = 16            ! ocean salinity 
     128   INTEGER, PARAMETER ::   jps_ssh    = 17            ! sea surface height 
     129   INTEGER, PARAMETER ::   jps_qsroce = 18            ! Qsr above the ocean 
     130   INTEGER, PARAMETER ::   jps_qnsoce = 19            ! Qns above the ocean 
     131   INTEGER, PARAMETER ::   jps_oemp   = 20            ! ocean freshwater budget (evap - precip) 
     132   INTEGER, PARAMETER ::   jps_sflx   = 21            ! salt flux 
     133   INTEGER, PARAMETER ::   jps_otx1   = 22            ! 2 atmosphere-ocean stress components on grid 1 
     134   INTEGER, PARAMETER ::   jps_oty1   = 23            !  
     135   INTEGER, PARAMETER ::   jps_rnf    = 24            ! runoffs 
     136   INTEGER, PARAMETER ::   jps_taum   = 25            ! wind stress module 
     137   INTEGER, PARAMETER ::   jps_fice2  = 26            ! ice fraction sent to OPA (by SAS when doing SAS-OPA coupling) 
     138   INTEGER, PARAMETER ::   jps_e3t1st = 27            ! first level depth (vvl) 
     139   INTEGER, PARAMETER ::   jps_fraqsr = 28            ! fraction of solar net radiation absorbed in the first ocean level 
     140   INTEGER, PARAMETER ::   jpsnd      = 28            ! total number of fields sended 
     141 
    110142   !                                                         !!** namelist namsbc_cpl ** 
    111143   TYPE ::   FLD_C 
     
    125157   LOGICAL     ::   ln_usecplmask          !  use a coupling mask file to merge data received from several models 
    126158                                           !   -> file cplmask.nc with the float variable called cplmask (jpi,jpj,nn_cplmodel) 
    127  
    128    REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: xcplmask 
    129  
    130159   TYPE ::   DYNARR      
    131160      REAL(wp), POINTER, DIMENSION(:,:,:)    ::   z3    
     
    139168 
    140169   !! Substitution 
     170#  include "domzgr_substitute.h90" 
    141171#  include "vectopt_loop_substitute.h90" 
    142172   !!---------------------------------------------------------------------- 
     
    161191      ALLOCATE( a_i(jpi,jpj,1) , STAT=ierr(2) )  ! used in sbcice_if.F90 (done here as there is no sbc_ice_if_init) 
    162192#endif 
    163       ALLOCATE( xcplmask(jpi,jpj,nn_cplmodel) , STAT=ierr(3) ) 
     193      ALLOCATE( xcplmask(jpi,jpj,0:nn_cplmodel) , STAT=ierr(3) ) 
    164194      ! 
    165195      sbc_cpl_alloc = MAXVAL( ierr ) 
     
    182212      !!              * initialise the OASIS coupler 
    183213      !!---------------------------------------------------------------------- 
    184       INTEGER, INTENT(in) ::   k_ice    ! ice management in the sbc (=0/1/2/3) 
     214      INTEGER, INTENT(in) ::   k_ice       ! ice management in the sbc (=0/1/2/3) 
    185215      !! 
    186216      INTEGER ::   jn   ! dummy loop index 
     
    217247         WRITE(numout,*)'sbc_cpl_init : namsbc_cpl namelist ' 
    218248         WRITE(numout,*)'~~~~~~~~~~~~' 
     249      ENDIF 
     250      IF( lwp .AND. ln_cpl ) THEN                        ! control print 
    219251         WRITE(numout,*)'  received fields (mutiple ice categogies)' 
    220252         WRITE(numout,*)'      10m wind module                 = ', TRIM(sn_rcv_w10m%cldes  ), ' (', TRIM(sn_rcv_w10m%clcat  ), ')' 
     
    361393      srcv(jpr_oemp)%clname = 'OOEvaMPr'      ! ocean water budget = ocean Evap - ocean precip 
    362394      SELECT CASE( TRIM( sn_rcv_emp%cldes ) ) 
     395      CASE( 'none'          )       ! nothing to do 
    363396      CASE( 'oce only'      )   ;   srcv(                                 jpr_oemp   )%laction = .TRUE.  
    364397      CASE( 'conservative'  ) 
     
    374407      !                                                      !     Runoffs & Calving     !    
    375408      !                                                      ! ------------------------- ! 
    376       srcv(jpr_rnf   )%clname = 'O_Runoff'   ;   IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled' )   srcv(jpr_rnf)%laction = .TRUE. 
    377 ! This isn't right - really just want ln_rnf_emp changed 
    378 !                                                 IF( TRIM( sn_rcv_rnf%cldes ) == 'climato' )   THEN   ;   ln_rnf = .TRUE. 
    379 !                                                 ELSE                                                 ;   ln_rnf = .FALSE. 
    380 !                                                 ENDIF 
     409      srcv(jpr_rnf   )%clname = 'O_Runoff' 
     410      IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled' ) THEN 
     411         srcv(jpr_rnf)%laction = .TRUE. 
     412         l_rnfcpl              = .TRUE.                      ! -> no need to read runoffs in sbcrnf 
     413         ln_rnf                = nn_components /= jp_iam_sas ! -> force to go through sbcrnf if not sas 
     414         IF(lwp) WRITE(numout,*) 
     415         IF(lwp) WRITE(numout,*) '   runoffs received from oasis -> force ln_rnf = ', ln_rnf 
     416      ENDIF 
     417      ! 
    381418      srcv(jpr_cal   )%clname = 'OCalving'   ;   IF( TRIM( sn_rcv_cal%cldes ) == 'coupled' )   srcv(jpr_cal)%laction = .TRUE. 
    382419 
     
    388425      srcv(jpr_qnsmix)%clname = 'O_QnsMix' 
    389426      SELECT CASE( TRIM( sn_rcv_qns%cldes ) ) 
     427      CASE( 'none'          )       ! nothing to do 
    390428      CASE( 'oce only'      )   ;   srcv(               jpr_qnsoce   )%laction = .TRUE. 
    391429      CASE( 'conservative'  )   ;   srcv( (/jpr_qnsice, jpr_qnsmix/) )%laction = .TRUE. 
     
    403441      srcv(jpr_qsrmix)%clname = 'O_QsrMix' 
    404442      SELECT CASE( TRIM( sn_rcv_qsr%cldes ) ) 
     443      CASE( 'none'          )       ! nothing to do 
    405444      CASE( 'oce only'      )   ;   srcv(               jpr_qsroce   )%laction = .TRUE. 
    406445      CASE( 'conservative'  )   ;   srcv( (/jpr_qsrice, jpr_qsrmix/) )%laction = .TRUE. 
     
    418457      ! 
    419458      ! non solar sensitivity mandatory for LIM ice model 
    420       IF( TRIM( sn_rcv_dqnsdt%cldes ) == 'none' .AND. k_ice /= 0 .AND. k_ice /= 4) & 
     459      IF( TRIM( sn_rcv_dqnsdt%cldes ) == 'none' .AND. k_ice /= 0 .AND. k_ice /= 4 .AND. nn_components /= jp_iam_sas ) & 
    421460         CALL ctl_stop( 'sbc_cpl_init: sn_rcv_dqnsdt%cldes must be coupled in namsbc_cpl namelist' ) 
    422461      ! non solar sensitivity mandatory for mixed oce-ice solar radiation coupling technique 
     
    465504 
    466505      ! Allocate all parts of frcv used for received fields 
     506      !                                                      ! ------------------------------- ! 
     507      !                                                      !   OPA-SAS coupling - rcv by opa !    
     508      !                                                      ! ------------------------------- ! 
     509      srcv(jpr_sflx)%clname = 'O_SFLX' 
     510      srcv(jpr_fice)%clname = 'RIceFrc' 
     511      ! 
     512      IF( nn_components == jp_iam_opa ) THEN    ! OPA coupled to SAS via OASIS: force received field by OPA (sent by SAS) 
     513         srcv(:)%laction = .FALSE.   ! force default definition in case of opa <-> sas coupling 
     514         srcv(:)%clgrid  = 'T'       ! force default definition in case of opa <-> sas coupling 
     515         srcv(:)%nsgn    = 1.        ! force default definition in case of opa <-> sas coupling 
     516         srcv( (/jpr_qsroce, jpr_qnsoce, jpr_oemp, jpr_sflx, jpr_fice, jpr_otx1, jpr_oty1, jpr_taum/) )%laction = .TRUE. 
     517         srcv(jpr_otx1)%clgrid = 'U'        ! oce components given at U-point 
     518         srcv(jpr_oty1)%clgrid = 'V'        !           and           V-point 
     519         ! Vectors: change of sign at north fold ONLY if on the local grid 
     520         srcv( (/jpr_otx1,jpr_oty1/) )%nsgn = -1. 
     521         sn_rcv_tau%clvgrd = 'U,V' 
     522         sn_rcv_tau%clvor = 'local grid' 
     523         sn_rcv_tau%clvref = 'spherical' 
     524         sn_rcv_emp%cldes = 'oce only' 
     525         ! 
     526         IF(lwp) THEN                        ! control print 
     527            WRITE(numout,*) 
     528            WRITE(numout,*)'               Special conditions for SAS-OPA coupling  ' 
     529            WRITE(numout,*)'               OPA component  ' 
     530            WRITE(numout,*) 
     531            WRITE(numout,*)'  received fields from SAS component ' 
     532            WRITE(numout,*)'                  ice cover ' 
     533            WRITE(numout,*)'                  oce only EMP  ' 
     534            WRITE(numout,*)'                  salt flux  ' 
     535            WRITE(numout,*)'                  mixed oce-ice solar flux  ' 
     536            WRITE(numout,*)'                  mixed oce-ice non solar flux  ' 
     537            WRITE(numout,*)'                  wind stress U,V on local grid and sperical coordinates ' 
     538            WRITE(numout,*)'                  wind stress module' 
     539            WRITE(numout,*) 
     540         ENDIF 
     541      ENDIF 
     542      !                                                      ! -------------------------------- ! 
     543      !                                                      !   OPA-SAS coupling - rcv by sas  !    
     544      !                                                      ! -------------------------------- ! 
     545      srcv(jpr_toce  )%clname = 'I_SSTSST' 
     546      srcv(jpr_soce  )%clname = 'I_SSSal' 
     547      srcv(jpr_ocx1  )%clname = 'I_OCurx1' 
     548      srcv(jpr_ocy1  )%clname = 'I_OCury1' 
     549      srcv(jpr_ssh   )%clname = 'I_SSHght' 
     550      srcv(jpr_e3t1st)%clname = 'I_E3T1st'    
     551      srcv(jpr_fraqsr)%clname = 'I_FraQsr'    
     552      ! 
     553      IF( nn_components == jp_iam_sas ) THEN 
     554         IF( .NOT. ln_cpl ) srcv(:)%laction = .FALSE.   ! force default definition in case of opa <-> sas coupling 
     555         IF( .NOT. ln_cpl ) srcv(:)%clgrid  = 'T'       ! force default definition in case of opa <-> sas coupling 
     556         IF( .NOT. ln_cpl ) srcv(:)%nsgn    = 1.        ! force default definition in case of opa <-> sas coupling 
     557         srcv( (/jpr_toce, jpr_soce, jpr_ssh, jpr_fraqsr, jpr_ocx1, jpr_ocy1/) )%laction = .TRUE. 
     558         srcv( jpr_e3t1st )%laction = lk_vvl 
     559         srcv(jpr_ocx1)%clgrid = 'U'        ! oce components given at U-point 
     560         srcv(jpr_ocy1)%clgrid = 'V'        !           and           V-point 
     561         ! Vectors: change of sign at north fold ONLY if on the local grid 
     562         srcv(jpr_ocx1:jpr_ocy1)%nsgn = -1. 
     563         ! Change first letter to couple with atmosphere if already coupled OPA 
     564         ! this is nedeed as each variable name used in the namcouple must be unique: 
     565         ! for example O_Runoff received by OPA from SAS and therefore O_Runoff received by SAS from the Atmosphere 
     566         DO jn = 1, jprcv 
     567            IF ( srcv(jn)%clname(1:1) == "O" ) srcv(jn)%clname = "S"//srcv(jn)%clname(2:LEN(srcv(jn)%clname)) 
     568         END DO 
     569         ! 
     570         IF(lwp) THEN                        ! control print 
     571            WRITE(numout,*) 
     572            WRITE(numout,*)'               Special conditions for SAS-OPA coupling  ' 
     573            WRITE(numout,*)'               SAS component  ' 
     574            WRITE(numout,*) 
     575            IF( .NOT. ln_cpl ) THEN 
     576               WRITE(numout,*)'  received fields from OPA component ' 
     577            ELSE 
     578               WRITE(numout,*)'  Additional received fields from OPA component : ' 
     579            ENDIF 
     580            WRITE(numout,*)'               sea surface temperature (Celcius) ' 
     581            WRITE(numout,*)'               sea surface salinity '  
     582            WRITE(numout,*)'               surface currents '  
     583            WRITE(numout,*)'               sea surface height '  
     584            WRITE(numout,*)'               thickness of first ocean T level '         
     585            WRITE(numout,*)'               fraction of solar net radiation absorbed in the first ocean level' 
     586            WRITE(numout,*) 
     587         ENDIF 
     588      ENDIF 
     589       
     590      ! =================================================== ! 
     591      ! Allocate all parts of frcv used for received fields ! 
     592      ! =================================================== ! 
    467593      DO jn = 1, jprcv 
    468594         IF ( srcv(jn)%laction ) ALLOCATE( frcv(jn)%z3(jpi,jpj,srcv(jn)%nct) ) 
     
    470596      ! Allocate taum part of frcv which is used even when not received as coupling field 
    471597      IF ( .NOT. srcv(jpr_taum)%laction ) ALLOCATE( frcv(jpr_taum)%z3(jpi,jpj,srcv(jpr_taum)%nct) ) 
     598      ! Allocate w10m part of frcv which is used even when not received as coupling field 
     599      IF ( .NOT. srcv(jpr_w10m)%laction ) ALLOCATE( frcv(jpr_w10m)%z3(jpi,jpj,srcv(jpr_w10m)%nct) ) 
     600      ! Allocate jpr_otx1 part of frcv which is used even when not received as coupling field 
     601      IF ( .NOT. srcv(jpr_otx1)%laction ) ALLOCATE( frcv(jpr_otx1)%z3(jpi,jpj,srcv(jpr_otx1)%nct) ) 
     602      IF ( .NOT. srcv(jpr_oty1)%laction ) ALLOCATE( frcv(jpr_oty1)%z3(jpi,jpj,srcv(jpr_oty1)%nct) ) 
    472603      ! Allocate itx1 and ity1 as they are used in sbc_cpl_ice_tau even if srcv(jpr_itx1)%laction = .FALSE. 
    473604      IF( k_ice /= 0 ) THEN 
     
    493624      ssnd(jps_tmix)%clname = 'O_TepMix' 
    494625      SELECT CASE( TRIM( sn_snd_temp%cldes ) ) 
    495       CASE( 'none'         )       ! nothing to do 
    496       CASE( 'oce only'             )   ;   ssnd(   jps_toce            )%laction = .TRUE. 
    497       CASE( 'weighted oce and ice' ) 
     626      CASE( 'none'                                 )       ! nothing to do 
     627      CASE( 'oce only'                             )   ;   ssnd( jps_toce )%laction = .TRUE. 
     628      CASE( 'oce and ice' , 'weighted oce and ice' ) 
    498629         ssnd( (/jps_toce, jps_tice/) )%laction = .TRUE. 
    499630         IF ( TRIM( sn_snd_temp%clcat ) == 'yes' )  ssnd(jps_tice)%nct = jpl 
    500       CASE( 'mixed oce-ice'        )   ;   ssnd(   jps_tmix            )%laction = .TRUE. 
     631      CASE( 'mixed oce-ice'                        )   ;   ssnd( jps_tmix )%laction = .TRUE. 
    501632      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_temp%cldes' ) 
    502633      END SELECT 
    503       
     634            
    504635      !                                                      ! ------------------------- ! 
    505636      !                                                      !          Albedo           ! 
     
    508639      ssnd(jps_albmix)%clname = 'O_AlbMix' 
    509640      SELECT CASE( TRIM( sn_snd_alb%cldes ) ) 
    510       CASE( 'none'               ! nothing to do 
    511       CASE( 'weighted ice'  )   ;  ssnd(jps_albice)%laction = .TRUE. 
    512       CASE( 'mixed oce-ice' )   ;  ssnd(jps_albmix)%laction = .TRUE. 
     641      CASE( 'none'                 )     ! nothing to do 
     642      CASE( 'ice' , 'weighted ice' )   ; ssnd(jps_albice)%laction = .TRUE. 
     643      CASE( 'mixed oce-ice'        )   ; ssnd(jps_albmix)%laction = .TRUE. 
    513644      CASE default   ;   CALL ctl_stop( 'sbc_cpl_init: wrong definition of sn_snd_alb%cldes' ) 
    514645      END SELECT 
     
    536667         IF ( TRIM( sn_snd_thick%clcat ) == 'yes' ) ssnd(jps_fice)%nct = jpl 
    537668      ENDIF 
    538  
     669       
    539670      SELECT CASE ( TRIM( sn_snd_thick%cldes ) ) 
    540671      CASE( 'none'         )       ! nothing to do 
     
    543674         IF ( TRIM( sn_snd_thick%clcat ) == 'yes' ) THEN 
    544675            ssnd(jps_hice:jps_hsnw)%nct = jpl 
    545          ELSE 
    546             IF ( jpl > 1 ) THEN 
    547 CALL ctl_stop( 'sbc_cpl_init: use weighted ice and snow option for sn_snd_thick%cldes if not exchanging category fields' ) 
    548             ENDIF 
    549676         ENDIF 
    550677      CASE ( 'weighted ice and snow' )  
     
    622749      !                                                      ! ------------------------- ! 
    623750      ssnd(jps_co2)%clname = 'O_CO2FLX' ;  IF( TRIM(sn_snd_co2%cldes) == 'coupled' )    ssnd(jps_co2 )%laction = .TRUE. 
     751 
     752      !                                                      ! ------------------------------- ! 
     753      !                                                      !   OPA-SAS coupling - snd by opa !    
     754      !                                                      ! ------------------------------- ! 
     755      ssnd(jps_ssh   )%clname = 'O_SSHght'  
     756      ssnd(jps_soce  )%clname = 'O_SSSal'  
     757      ssnd(jps_e3t1st)%clname = 'O_E3T1st'    
     758      ssnd(jps_fraqsr)%clname = 'O_FraQsr' 
     759      ! 
     760      IF( nn_components == jp_iam_opa ) THEN 
     761         ssnd(:)%laction = .FALSE.   ! force default definition in case of opa <-> sas coupling 
     762         ssnd( (/jps_toce, jps_soce, jps_ssh, jps_fraqsr, jps_ocx1, jps_ocy1/) )%laction = .TRUE. 
     763         ssnd( jps_e3t1st )%laction = lk_vvl 
     764         ! vector definition: not used but cleaner... 
     765         ssnd(jps_ocx1)%clgrid  = 'U'        ! oce components given at U-point 
     766         ssnd(jps_ocy1)%clgrid  = 'V'        !           and           V-point 
     767         sn_snd_crt%clvgrd = 'U,V' 
     768         sn_snd_crt%clvor = 'local grid' 
     769         sn_snd_crt%clvref = 'spherical' 
     770         ! 
     771         IF(lwp) THEN                        ! control print 
     772            WRITE(numout,*) 
     773            WRITE(numout,*)'  sent fields to SAS component ' 
     774            WRITE(numout,*)'               sea surface temperature (T before, Celcius) ' 
     775            WRITE(numout,*)'               sea surface salinity '  
     776            WRITE(numout,*)'               surface currents U,V on local grid and spherical coordinates'  
     777            WRITE(numout,*)'               sea surface height '  
     778            WRITE(numout,*)'               thickness of first ocean T level '         
     779            WRITE(numout,*)'               fraction of solar net radiation absorbed in the first ocean level' 
     780            WRITE(numout,*) 
     781         ENDIF 
     782      ENDIF 
     783      !                                                      ! ------------------------------- ! 
     784      !                                                      !   OPA-SAS coupling - snd by sas !    
     785      !                                                      ! ------------------------------- ! 
     786      ssnd(jps_sflx  )%clname = 'I_SFLX'      
     787      ssnd(jps_fice2 )%clname = 'IIceFrc' 
     788      ssnd(jps_qsroce)%clname = 'I_QsrOce'    
     789      ssnd(jps_qnsoce)%clname = 'I_QnsOce'    
     790      ssnd(jps_oemp  )%clname = 'IOEvaMPr'  
     791      ssnd(jps_otx1  )%clname = 'I_OTaux1'    
     792      ssnd(jps_oty1  )%clname = 'I_OTauy1'    
     793      ssnd(jps_rnf   )%clname = 'I_Runoff'    
     794      ssnd(jps_taum  )%clname = 'I_TauMod'    
     795      ! 
     796      IF( nn_components == jp_iam_sas ) THEN 
     797         IF( .NOT. ln_cpl ) ssnd(:)%laction = .FALSE.   ! force default definition in case of opa <-> sas coupling 
     798         ssnd( (/jps_qsroce, jps_qnsoce, jps_oemp, jps_fice2, jps_sflx, jps_otx1, jps_oty1, jps_taum/) )%laction = .TRUE. 
     799         ! 
     800         ! Change first letter to couple with atmosphere if already coupled with sea_ice 
     801         ! this is nedeed as each variable name used in the namcouple must be unique: 
     802         ! for example O_SSTSST sent by OPA to SAS and therefore S_SSTSST sent by SAS to the Atmosphere 
     803         DO jn = 1, jpsnd 
     804            IF ( ssnd(jn)%clname(1:1) == "O" ) ssnd(jn)%clname = "S"//ssnd(jn)%clname(2:LEN(ssnd(jn)%clname)) 
     805         END DO 
     806         ! 
     807         IF(lwp) THEN                        ! control print 
     808            WRITE(numout,*) 
     809            IF( .NOT. ln_cpl ) THEN 
     810               WRITE(numout,*)'  sent fields to OPA component ' 
     811            ELSE 
     812               WRITE(numout,*)'  Additional sent fields to OPA component : ' 
     813            ENDIF 
     814            WRITE(numout,*)'                  ice cover ' 
     815            WRITE(numout,*)'                  oce only EMP  ' 
     816            WRITE(numout,*)'                  salt flux  ' 
     817            WRITE(numout,*)'                  mixed oce-ice solar flux  ' 
     818            WRITE(numout,*)'                  mixed oce-ice non solar flux  ' 
     819            WRITE(numout,*)'                  wind stress U,V components' 
     820            WRITE(numout,*)'                  wind stress module' 
     821         ENDIF 
     822      ENDIF 
     823 
    624824      ! 
    625825      ! ================================ ! 
     
    627827      ! ================================ ! 
    628828 
    629       CALL cpl_define(jprcv, jpsnd,nn_cplmodel)             
     829      CALL cpl_define(jprcv, jpsnd, nn_cplmodel) 
     830       
    630831      IF (ln_usecplmask) THEN  
    631832         xcplmask(:,:,:) = 0. 
     
    637838         xcplmask(:,:,:) = 1. 
    638839      ENDIF 
    639       ! 
    640       IF( ln_dm2dc .AND. ( cpl_freq( jpr_qsroce ) + cpl_freq( jpr_qsrmix ) /= 86400 ) )   & 
     840      xcplmask(:,:,0) = 1. - SUM( xcplmask(:,:,1:nn_cplmodel), dim = 3 ) 
     841      ! 
     842      ncpl_qsr_freq = cpl_freq( 'O_QsrOce' ) + cpl_freq( 'O_QsrMix' ) + cpl_freq( 'S_QsrOce' ) + cpl_freq( 'S_QsrMix' ) 
     843      IF( ln_dm2dc .AND. ln_cpl .AND. ncpl_qsr_freq /= 86400 )   & 
    641844         &   CALL ctl_stop( 'sbc_cpl_init: diurnal cycle reconstruction (ln_dm2dc) needs daily couping for solar radiation' ) 
     845      ncpl_qsr_freq = 86400 / ncpl_qsr_freq 
    642846 
    643847      CALL wrk_dealloc( jpi,jpj, zacs, zaos ) 
     
    693897      !!                        emp          upward mass flux [evap. - precip. (- runoffs) (- calving)] (ocean only case) 
    694898      !!---------------------------------------------------------------------- 
    695       INTEGER, INTENT(in) ::   kt       ! ocean model time step index 
    696       INTEGER, INTENT(in) ::   k_fsbc   ! frequency of sbc (-> ice model) computation  
    697       INTEGER, INTENT(in) ::   k_ice    ! ice management in the sbc (=0/1/2/3) 
    698       !! 
    699       LOGICAL ::    llnewtx, llnewtau      ! update wind stress components and module?? 
     899      INTEGER, INTENT(in)           ::   kt          ! ocean model time step index 
     900      INTEGER, INTENT(in)           ::   k_fsbc      ! frequency of sbc (-> ice model) computation  
     901      INTEGER, INTENT(in)           ::   k_ice       ! ice management in the sbc (=0/1/2/3) 
     902 
     903      !! 
     904      LOGICAL  ::   llnewtx, llnewtau      ! update wind stress components and module?? 
    700905      INTEGER  ::   ji, jj, jl, jn         ! dummy loop indices 
    701906      INTEGER  ::   isec                   ! number of seconds since nit000 (assuming rdttra did not change since nit000) 
     
    705910      REAL(wp) ::   zcdrag = 1.5e-3        ! drag coefficient 
    706911      REAL(wp) ::   zzx, zzy               ! temporary variables 
    707       REAL(wp), POINTER, DIMENSION(:,:) ::   ztx, zty  
     912      REAL(wp), POINTER, DIMENSION(:,:) ::   ztx, zty, zmsk, zemp, zqns, zqsr 
    708913      !!---------------------------------------------------------------------- 
    709914      ! 
    710915      IF( nn_timing == 1 )  CALL timing_start('sbc_cpl_rcv') 
    711916      ! 
    712       CALL wrk_alloc( jpi,jpj, ztx, zty ) 
    713       !                                                 ! Receive all the atmos. fields (including ice information) 
    714       isec = ( kt - nit000 ) * NINT( rdttra(1) )             ! date of exchanges 
    715       DO jn = 1, jprcv                                       ! received fields sent by the atmosphere 
    716          IF( srcv(jn)%laction )   CALL cpl_rcv( jn, isec, frcv(jn)%z3, xcplmask, nrcvinfo(jn) ) 
     917      CALL wrk_alloc( jpi,jpj, ztx, zty, zmsk, zemp, zqns, zqsr ) 
     918      ! 
     919      IF( ln_mixcpl )   zmsk(:,:) = 1. - xcplmask(:,:,0) 
     920      ! 
     921      !                                                      ! ======================================================= ! 
     922      !                                                      ! Receive all the atmos. fields (including ice information) 
     923      !                                                      ! ======================================================= ! 
     924      isec = ( kt - nit000 ) * NINT( rdttra(1) )                ! date of exchanges 
     925      DO jn = 1, jprcv                                          ! received fields sent by the atmosphere 
     926         IF( srcv(jn)%laction )   CALL cpl_rcv( jn, isec, frcv(jn)%z3, xcplmask(:,:,1:nn_cplmodel), nrcvinfo(jn) ) 
    717927      END DO 
    718928 
     
    774984         ! 
    775985      ENDIF 
    776        
    777986      !                                                      ! ========================= ! 
    778987      !                                                      !    wind stress module     !   (taum) 
     
    8031012         ENDIF 
    8041013      ENDIF 
    805        
     1014      ! 
    8061015      !                                                      ! ========================= ! 
    8071016      !                                                      !      10 m wind speed      !   (wndm) 
     
    8161025!CDIR NOVERRCHK 
    8171026               DO ji = 1, jpi  
    818                   wndm(ji,jj) = SQRT( frcv(jpr_taum)%z3(ji,jj,1) * zcoef ) 
     1027                  frcv(jpr_w10m)%z3(ji,jj,1) = SQRT( frcv(jpr_taum)%z3(ji,jj,1) * zcoef ) 
    8191028               END DO 
    8201029            END DO 
    8211030         ENDIF 
    822       ELSE 
    823          IF ( nrcvinfo(jpr_w10m) == OASIS_Rcv ) wndm(:,:) = frcv(jpr_w10m)%z3(:,:,1) 
    8241031      ENDIF 
    8251032 
     
    8281035      IF( MOD( kt-1, k_fsbc ) == 0 ) THEN 
    8291036         ! 
    830          utau(:,:) = frcv(jpr_otx1)%z3(:,:,1) 
    831          vtau(:,:) = frcv(jpr_oty1)%z3(:,:,1) 
    832          taum(:,:) = frcv(jpr_taum)%z3(:,:,1) 
     1037         IF( ln_mixcpl ) THEN 
     1038            utau(:,:) = utau(:,:) * xcplmask(:,:,0) + frcv(jpr_otx1)%z3(:,:,1) * zmsk(:,:) 
     1039            vtau(:,:) = vtau(:,:) * xcplmask(:,:,0) + frcv(jpr_oty1)%z3(:,:,1) * zmsk(:,:) 
     1040            taum(:,:) = taum(:,:) * xcplmask(:,:,0) + frcv(jpr_taum)%z3(:,:,1) * zmsk(:,:) 
     1041            wndm(:,:) = wndm(:,:) * xcplmask(:,:,0) + frcv(jpr_w10m)%z3(:,:,1) * zmsk(:,:) 
     1042         ELSE 
     1043            utau(:,:) = frcv(jpr_otx1)%z3(:,:,1) 
     1044            vtau(:,:) = frcv(jpr_oty1)%z3(:,:,1) 
     1045            taum(:,:) = frcv(jpr_taum)%z3(:,:,1) 
     1046            wndm(:,:) = frcv(jpr_w10m)%z3(:,:,1) 
     1047         ENDIF 
    8331048         CALL iom_put( "taum_oce", taum )   ! output wind stress module 
    8341049         !   
     
    8361051 
    8371052#if defined key_cpl_carbon_cycle 
    838       !                                                              ! atmosph. CO2 (ppm) 
     1053      !                                                      ! ================== ! 
     1054      !                                                      ! atmosph. CO2 (ppm) ! 
     1055      !                                                      ! ================== ! 
    8391056      IF( srcv(jpr_co2)%laction )   atm_co2(:,:) = frcv(jpr_co2)%z3(:,:,1) 
    8401057#endif 
     
    8601077      ENDIF 
    8611078#endif 
     1079      !  Fields received by SAS when OASIS coupling 
     1080      !  (arrays no more filled at sbcssm stage) 
     1081      !                                                      ! ================== ! 
     1082      !                                                      !        SSS         ! 
     1083      !                                                      ! ================== ! 
     1084      IF( srcv(jpr_soce)%laction ) THEN                      ! received by sas in case of opa <-> sas coupling 
     1085         sss_m(:,:) = frcv(jpr_soce)%z3(:,:,1) 
     1086         CALL iom_put( 'sss_m', sss_m ) 
     1087      ENDIF 
     1088      !                                                
     1089      !                                                      ! ================== ! 
     1090      !                                                      !        SST         ! 
     1091      !                                                      ! ================== ! 
     1092      IF( srcv(jpr_toce)%laction ) THEN                      ! received by sas in case of opa <-> sas coupling 
     1093         sst_m(:,:) = frcv(jpr_toce)%z3(:,:,1) 
     1094         IF( srcv(jpr_soce)%laction .AND. ln_useCT ) THEN    ! make sure that sst_m is the potential temperature 
     1095            sst_m(:,:) = eos_pt_from_ct( sst_m(:,:), sss_m(:,:) ) 
     1096         ENDIF 
     1097      ENDIF 
     1098      !                                                      ! ================== ! 
     1099      !                                                      !        SSH         ! 
     1100      !                                                      ! ================== ! 
     1101      IF( srcv(jpr_ssh )%laction ) THEN                      ! received by sas in case of opa <-> sas coupling 
     1102         ssh_m(:,:) = frcv(jpr_ssh )%z3(:,:,1) 
     1103         CALL iom_put( 'ssh_m', ssh_m ) 
     1104      ENDIF 
     1105      !                                                      ! ================== ! 
     1106      !                                                      !  surface currents  ! 
     1107      !                                                      ! ================== ! 
     1108      IF( srcv(jpr_ocx1)%laction ) THEN                      ! received by sas in case of opa <-> sas coupling 
     1109         ssu_m(:,:) = frcv(jpr_ocx1)%z3(:,:,1) 
     1110         ub (:,:,1) = ssu_m(:,:)                             ! will be used in sbcice_lim in the call of lim_sbc_tau 
     1111         CALL iom_put( 'ssu_m', ssu_m ) 
     1112      ENDIF 
     1113      IF( srcv(jpr_ocy1)%laction ) THEN 
     1114         ssv_m(:,:) = frcv(jpr_ocy1)%z3(:,:,1) 
     1115         vb (:,:,1) = ssv_m(:,:)                             ! will be used in sbcice_lim in the call of lim_sbc_tau 
     1116         CALL iom_put( 'ssv_m', ssv_m ) 
     1117      ENDIF 
     1118      !                                                      ! ======================== ! 
     1119      !                                                      !  first T level thickness ! 
     1120      !                                                      ! ======================== ! 
     1121      IF( srcv(jpr_e3t1st )%laction ) THEN                   ! received by sas in case of opa <-> sas coupling 
     1122         e3t_m(:,:) = frcv(jpr_e3t1st )%z3(:,:,1) 
     1123         CALL iom_put( 'e3t_m', e3t_m(:,:) ) 
     1124      ENDIF 
     1125      !                                                      ! ================================ ! 
     1126      !                                                      !  fraction of solar net radiation ! 
     1127      !                                                      ! ================================ ! 
     1128      IF( srcv(jpr_fraqsr)%laction ) THEN                    ! received by sas in case of opa <-> sas coupling 
     1129         frq_m(:,:) = frcv(jpr_fraqsr)%z3(:,:,1) 
     1130         CALL iom_put( 'frq_m', frq_m ) 
     1131      ENDIF 
     1132       
    8621133      !                                                      ! ========================= ! 
    863       IF( k_ice <= 1 ) THEN                                  !  heat & freshwater fluxes ! (Ocean only case) 
     1134      IF( k_ice <= 1 .AND. MOD( kt-1, k_fsbc ) == 0 ) THEN   !  heat & freshwater fluxes ! (Ocean only case) 
    8641135         !                                                   ! ========================= ! 
    8651136         ! 
    8661137         !                                                       ! total freshwater fluxes over the ocean (emp) 
    867          SELECT CASE( TRIM( sn_rcv_emp%cldes ) )                                    ! evaporation - precipitation 
    868          CASE( 'conservative' ) 
    869             emp(:,:) = frcv(jpr_tevp)%z3(:,:,1) - ( frcv(jpr_rain)%z3(:,:,1) + frcv(jpr_snow)%z3(:,:,1) ) 
    870          CASE( 'oce only', 'oce and ice' ) 
    871             emp(:,:) = frcv(jpr_oemp)%z3(:,:,1) 
    872          CASE default 
    873             CALL ctl_stop( 'sbc_cpl_rcv: wrong definition of sn_rcv_emp%cldes' ) 
    874          END SELECT 
     1138         IF( srcv(jpr_oemp)%laction .OR. srcv(jpr_rain)%laction ) THEN 
     1139            SELECT CASE( TRIM( sn_rcv_emp%cldes ) )                                    ! evaporation - precipitation 
     1140            CASE( 'conservative' ) 
     1141               zemp(:,:) = frcv(jpr_tevp)%z3(:,:,1) - ( frcv(jpr_rain)%z3(:,:,1) + frcv(jpr_snow)%z3(:,:,1) ) 
     1142            CASE( 'oce only', 'oce and ice' ) 
     1143               zemp(:,:) = frcv(jpr_oemp)%z3(:,:,1) 
     1144            CASE default 
     1145               CALL ctl_stop( 'sbc_cpl_rcv: wrong definition of sn_rcv_emp%cldes' ) 
     1146            END SELECT 
     1147         ELSE 
     1148            zemp(:,:) = 0._wp 
     1149         ENDIF 
    8751150         ! 
    8761151         !                                                        ! runoffs and calving (added in emp) 
    877          IF( srcv(jpr_rnf)%laction )   emp(:,:) = emp(:,:) - frcv(jpr_rnf)%z3(:,:,1) 
    878          IF( srcv(jpr_cal)%laction )   emp(:,:) = emp(:,:) - frcv(jpr_cal)%z3(:,:,1) 
    879          ! 
    880 !!gm :  this seems to be internal cooking, not sure to need that in a generic interface  
    881 !!gm                                       at least should be optional... 
    882 !!         IF( TRIM( sn_rcv_rnf%cldes ) == 'coupled' ) THEN     ! add to the total freshwater budget 
    883 !!            ! remove negative runoff 
    884 !!            zcumulpos = SUM( MAX( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * e1t(:,:) * e2t(:,:) * tmask_i(:,:) )  
    885 !!            zcumulneg = SUM( MIN( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * e1t(:,:) * e2t(:,:) * tmask_i(:,:) ) 
    886 !!            IF( lk_mpp )   CALL mpp_sum( zcumulpos )   ! sum over the global domain 
    887 !!            IF( lk_mpp )   CALL mpp_sum( zcumulneg )  
    888 !!            IF( zcumulpos /= 0. ) THEN                 ! distribute negative runoff on positive runoff grid points 
    889 !!               zcumulneg = 1.e0 + zcumulneg / zcumulpos 
    890 !!               frcv(jpr_rnf)%z3(:,:,1) = MAX( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * zcumulneg 
    891 !!            ENDIF      
    892 !!            ! add runoff to e-p  
    893 !!            emp(:,:) = emp(:,:) - frcv(jpr_rnf)%z3(:,:,1) 
    894 !!         ENDIF 
    895 !!gm  end of internal cooking 
     1152         IF( srcv(jpr_rnf)%laction )     rnf(:,:) = frcv(jpr_rnf)%z3(:,:,1) 
     1153         IF( srcv(jpr_cal)%laction )     zemp(:,:) = zemp(:,:) - frcv(jpr_cal)%z3(:,:,1) 
     1154          
     1155         IF( ln_mixcpl ) THEN   ;   emp(:,:) = emp(:,:) * xcplmask(:,:,0) + zemp(:,:) * zmsk(:,:) 
     1156         ELSE                   ;   emp(:,:) =                              zemp(:,:) 
     1157         ENDIF 
    8961158         ! 
    8971159         !                                                       ! non solar heat flux over the ocean (qns) 
    898          IF( srcv(jpr_qnsoce)%laction )   qns(:,:) = frcv(jpr_qnsoce)%z3(:,:,1) 
    899          IF( srcv(jpr_qnsmix)%laction )   qns(:,:) = frcv(jpr_qnsmix)%z3(:,:,1) 
     1160         IF(      srcv(jpr_qnsoce)%laction ) THEN   ;   zqns(:,:) = frcv(jpr_qnsoce)%z3(:,:,1) 
     1161         ELSE IF( srcv(jpr_qnsmix)%laction ) THEN   ;   zqns(:,:) = frcv(jpr_qnsmix)%z3(:,:,1) 
     1162         ELSE                                       ;   zqns(:,:) = 0._wp 
     1163         END IF 
    9001164         ! update qns over the free ocean with: 
    901          qns(:,:) =  qns(:,:) - emp(:,:) * sst_m(:,:) * rcp            ! remove heat content due to mass flux (assumed to be at SST) 
    902          IF( srcv(jpr_snow  )%laction )   THEN 
    903               qns(:,:) = qns(:,:) - frcv(jpr_snow)%z3(:,:,1) * lfus    ! energy for melting solid precipitation over the free ocean 
     1165         IF( nn_components /= jp_iam_opa ) THEN 
     1166            zqns(:,:) =  zqns(:,:) - zemp(:,:) * sst_m(:,:) * rcp         ! remove heat content due to mass flux (assumed to be at SST) 
     1167            IF( srcv(jpr_snow  )%laction ) THEN 
     1168               zqns(:,:) = zqns(:,:) - frcv(jpr_snow)%z3(:,:,1) * lfus    ! energy for melting solid precipitation over the free ocean 
     1169            ENDIF 
     1170         ENDIF 
     1171         IF( ln_mixcpl ) THEN   ;   qns(:,:) = qns(:,:) * xcplmask(:,:,0) + zqns(:,:) * zmsk(:,:) 
     1172         ELSE                   ;   qns(:,:) =                              zqns(:,:) 
    9041173         ENDIF 
    9051174 
    9061175         !                                                       ! solar flux over the ocean          (qsr) 
    907          IF( srcv(jpr_qsroce)%laction )   qsr(:,:) = frcv(jpr_qsroce)%z3(:,:,1) 
    908          IF( srcv(jpr_qsrmix)%laction )   qsr(:,:) = frcv(jpr_qsrmix)%z3(:,:,1) 
    909          IF( ln_dm2dc )   qsr(:,:) = sbc_dcy( qsr )                           ! modify qsr to include the diurnal cycle 
     1176         IF     ( srcv(jpr_qsroce)%laction ) THEN   ;   zqsr(:,:) = frcv(jpr_qsroce)%z3(:,:,1) 
     1177         ELSE IF( srcv(jpr_qsrmix)%laction ) then   ;   zqsr(:,:) = frcv(jpr_qsrmix)%z3(:,:,1) 
     1178         ELSE                                       ;   zqsr(:,:) = 0._wp 
     1179         ENDIF 
     1180         IF( ln_dm2dc .AND. ln_cpl )   zqsr(:,:) = sbc_dcy( zqsr )   ! modify qsr to include the diurnal cycle 
     1181         IF( ln_mixcpl ) THEN   ;   qsr(:,:) = qsr(:,:) * xcplmask(:,:,0) + zqsr(:,:) * zmsk(:,:) 
     1182         ELSE                   ;   qsr(:,:) =                              zqsr(:,:) 
     1183         ENDIF 
    9101184         ! 
    911    
    912       ENDIF 
    913       ! 
    914       CALL wrk_dealloc( jpi,jpj, ztx, zty ) 
     1185         ! salt flux over the ocean (received by opa in case of opa <-> sas coupling) 
     1186         IF( srcv(jpr_sflx )%laction )   sfx(:,:) = frcv(jpr_sflx  )%z3(:,:,1) 
     1187         ! Ice cover  (received by opa in case of opa <-> sas coupling) 
     1188         IF( srcv(jpr_fice )%laction )   fr_i(:,:) = frcv(jpr_fice )%z3(:,:,1) 
     1189         ! 
     1190 
     1191      ENDIF 
     1192      ! 
     1193      CALL wrk_dealloc( jpi,jpj, ztx, zty, zmsk, zemp, zqns, zqsr ) 
    9151194      ! 
    9161195      IF( nn_timing == 1 )  CALL timing_stop('sbc_cpl_rcv') 
     
    10091288            ! 
    10101289         ENDIF 
    1011  
    10121290         !                                                      ! ======================= ! 
    10131291         !                                                      !     put on ice grid     ! 
     
    11311409    
    11321410 
    1133    SUBROUTINE sbc_cpl_ice_flx( p_frld  , palbi   , psst    , pist    ) 
     1411   SUBROUTINE sbc_cpl_ice_flx( p_frld, palbi, psst, pist ) 
    11341412      !!---------------------------------------------------------------------- 
    11351413      !!             ***  ROUTINE sbc_cpl_ice_flx  *** 
     
    11731451      REAL(wp), INTENT(in   ), DIMENSION(:,:)   ::   p_frld     ! lead fraction                [0 to 1] 
    11741452      ! optional arguments, used only in 'mixed oce-ice' case 
    1175       REAL(wp), INTENT(in   ), DIMENSION(:,:,:), OPTIONAL ::   palbi   ! all skies ice albedo  
    1176       REAL(wp), INTENT(in   ), DIMENSION(:,:  ), OPTIONAL ::   psst    ! sea surface temperature     [Celsius] 
    1177       REAL(wp), INTENT(in   ), DIMENSION(:,:,:), OPTIONAL ::   pist    ! ice surface temperature     [Kelvin] 
    1178       ! 
    1179       INTEGER ::   jl   ! dummy loop index 
    1180       REAL(wp), POINTER, DIMENSION(:,:) ::   zcptn, ztmp, zicefr 
     1453      REAL(wp), INTENT(in   ), DIMENSION(:,:,:), OPTIONAL ::   palbi      ! all skies ice albedo  
     1454      REAL(wp), INTENT(in   ), DIMENSION(:,:  ), OPTIONAL ::   psst       ! sea surface temperature     [Celsius] 
     1455      REAL(wp), INTENT(in   ), DIMENSION(:,:,:), OPTIONAL ::   pist       ! ice surface temperature     [Kelvin] 
     1456      ! 
     1457      INTEGER ::   jl         ! dummy loop index 
     1458      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zcptn, ztmp, zicefr, zmsk 
     1459      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zemp_tot, zemp_ice, zsprecip, ztprecip, zqns_tot, zqsr_tot 
     1460      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zqns_ice, zqsr_ice, zdqns_ice 
     1461      REAL(wp), POINTER, DIMENSION(:,:  ) ::   zevap, zsnw, zqns_oce, zqprec_ice, zqemp_oce ! for LIM3 
    11811462      !!---------------------------------------------------------------------- 
    11821463      ! 
    11831464      IF( nn_timing == 1 )  CALL timing_start('sbc_cpl_ice_flx') 
    11841465      ! 
    1185       CALL wrk_alloc( jpi,jpj, zcptn, ztmp, zicefr ) 
    1186  
     1466      CALL wrk_alloc( jpi,jpj,     zcptn, ztmp, zicefr, zmsk, zemp_tot, zemp_ice, zsprecip, ztprecip, zqns_tot, zqsr_tot ) 
     1467      CALL wrk_alloc( jpi,jpj,jpl, zqns_ice, zqsr_ice, zdqns_ice ) 
     1468 
     1469      IF( ln_mixcpl )   zmsk(:,:) = 1. - xcplmask(:,:,0) 
    11871470      zicefr(:,:) = 1.- p_frld(:,:) 
    11881471      zcptn(:,:) = rcp * sst_m(:,:) 
     
    11921475      !                                                      ! ========================= ! 
    11931476      ! 
    1194       !                                                           ! total Precipitations - total Evaporation (emp_tot) 
    1195       !                                                           ! solid precipitation  - sublimation       (emp_ice) 
    1196       !                                                           ! solid Precipitation                      (sprecip) 
     1477      !                                                           ! total Precipitation - total Evaporation (emp_tot) 
     1478      !                                                           ! solid precipitation - sublimation       (emp_ice) 
     1479      !                                                           ! solid Precipitation                     (sprecip) 
     1480      !                                                           ! liquid + solid Precipitation            (tprecip) 
    11971481      SELECT CASE( TRIM( sn_rcv_emp%cldes ) ) 
    11981482      CASE( 'conservative'  )   ! received fields: jpr_rain, jpr_snow, jpr_ievp, jpr_tevp 
    1199          sprecip(:,:) = frcv(jpr_snow)%z3(:,:,1)                 ! May need to ensure positive here 
    1200          tprecip(:,:) = frcv(jpr_rain)%z3(:,:,1) + sprecip (:,:) ! May need to ensure positive here 
    1201          emp_tot(:,:) = frcv(jpr_tevp)%z3(:,:,1) - tprecip(:,:) 
     1483         zsprecip(:,:) = frcv(jpr_snow)%z3(:,:,1)                  ! May need to ensure positive here 
     1484         ztprecip(:,:) = frcv(jpr_rain)%z3(:,:,1) + zsprecip(:,:)  ! May need to ensure positive here 
     1485         zemp_tot(:,:) = frcv(jpr_tevp)%z3(:,:,1) - ztprecip(:,:) 
     1486         zemp_ice(:,:) = frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_snow)%z3(:,:,1) 
    12021487#if defined key_cice 
    12031488         IF ( TRIM(sn_rcv_emp%clcat) == 'yes' ) THEN 
    12041489            ! emp_ice is the sum of frcv(jpr_ievp)%z3(:,:,1) over all layers - snow 
    1205             emp_ice(:,:) = - frcv(jpr_snow)%z3(:,:,1) 
     1490            zemp_ice(:,:) = - frcv(jpr_snow)%z3(:,:,1) 
    12061491            DO jl=1,jpl 
    1207                emp_ice(:,:   ) = emp_ice(:,:) + frcv(jpr_ievp)%z3(:,:,jl) 
     1492               zemp_ice(:,:   ) = zemp_ice(:,:) + frcv(jpr_ievp)%z3(:,:,jl) 
    12081493            ENDDO 
    12091494            ! latent heat coupled for each category in CICE 
     
    12141499            ! The latent heat flux is split between the ice categories according 
    12151500            ! to the fraction of the ice in each category 
    1216             emp_ice(:,:) = frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_snow)%z3(:,:,1) 
     1501            zemp_ice(:,:) = frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_snow)%z3(:,:,1) 
    12171502            WHERE ( zicefr(:,:) /= 0._wp )  
    12181503               ztmp(:,:) = 1./zicefr(:,:) 
     
    12261511         ENDIF 
    12271512#else 
    1228          emp_ice(:,:) = frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_snow)%z3(:,:,1) 
     1513         zemp_ice(:,:) = frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_snow)%z3(:,:,1) 
    12291514#endif 
    12301515            CALL iom_put( 'rain'         , frcv(jpr_rain)%z3(:,:,1)              )   ! liquid precipitation  
     
    12381523            CALL iom_put( 'hflx_evap_cea', ztmp(:,:) * zcptn(:,:) )   ! heat flux from from evap (cell average) 
    12391524      CASE( 'oce and ice'   )   ! received fields: jpr_sbpr, jpr_semp, jpr_oemp, jpr_ievp 
    1240          emp_tot(:,:) = p_frld(:,:) * frcv(jpr_oemp)%z3(:,:,1) + zicefr(:,:) * frcv(jpr_sbpr)%z3(:,:,1) 
    1241          emp_ice(:,:) = frcv(jpr_semp)%z3(:,:,1) 
    1242          sprecip(:,:) = - frcv(jpr_semp)%z3(:,:,1) + frcv(jpr_ievp)%z3(:,:,1) 
     1525         zemp_tot(:,:) = p_frld(:,:) * frcv(jpr_oemp)%z3(:,:,1) + zicefr(:,:) * frcv(jpr_sbpr)%z3(:,:,1) 
     1526         zemp_ice(:,:) = frcv(jpr_semp)%z3(:,:,1) 
     1527         zsprecip(:,:) = frcv(jpr_ievp)%z3(:,:,1) - frcv(jpr_semp)%z3(:,:,1) 
     1528         ztprecip(:,:) = frcv(jpr_semp)%z3(:,:,1) - frcv(jpr_sbpr)%z3(:,:,1) + zsprecip(:,:) 
    12431529      END SELECT 
     1530 
     1531      IF( iom_use('subl_ai_cea') )   & 
     1532         CALL iom_put( 'subl_ai_cea', frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) )   ! Sublimation over sea-ice         (cell average) 
     1533      !    
     1534      !                                                           ! runoffs and calving (put in emp_tot) 
     1535      IF( srcv(jpr_rnf)%laction )   rnf(:,:) = frcv(jpr_rnf)%z3(:,:,1) 
     1536      IF( srcv(jpr_cal)%laction ) THEN  
     1537         zemp_tot(:,:) = zemp_tot(:,:) - frcv(jpr_cal)%z3(:,:,1) 
     1538         CALL iom_put( 'calving_cea', frcv(jpr_cal)%z3(:,:,1) ) 
     1539      ENDIF 
     1540 
     1541      IF( ln_mixcpl ) THEN 
     1542         emp_tot(:,:) = emp_tot(:,:) * xcplmask(:,:,0) + zemp_tot(:,:) * zmsk(:,:) 
     1543         emp_ice(:,:) = emp_ice(:,:) * xcplmask(:,:,0) + zemp_ice(:,:) * zmsk(:,:) 
     1544         sprecip(:,:) = sprecip(:,:) * xcplmask(:,:,0) + zsprecip(:,:) * zmsk(:,:) 
     1545         tprecip(:,:) = tprecip(:,:) * xcplmask(:,:,0) + ztprecip(:,:) * zmsk(:,:) 
     1546      ELSE 
     1547         emp_tot(:,:) =                                  zemp_tot(:,:) 
     1548         emp_ice(:,:) =                                  zemp_ice(:,:) 
     1549         sprecip(:,:) =                                  zsprecip(:,:) 
     1550         tprecip(:,:) =                                  ztprecip(:,:) 
     1551      ENDIF 
    12441552 
    12451553         CALL iom_put( 'snowpre'    , sprecip                                )   ! Snow 
     
    12481556      IF( iom_use('snow_ai_cea') )   & 
    12491557         CALL iom_put( 'snow_ai_cea', sprecip(:,:) * zicefr(:,:)             )   ! Snow        over sea-ice         (cell average) 
    1250       IF( iom_use('subl_ai_cea') )   & 
    1251          CALL iom_put( 'subl_ai_cea', frcv(jpr_ievp)%z3(:,:,1) * zicefr(:,:) )   ! Sublimation over sea-ice         (cell average) 
    1252       !    
    1253       !                                                           ! runoffs and calving (put in emp_tot) 
    1254       IF( srcv(jpr_rnf)%laction ) THEN  
    1255          emp_tot(:,:) = emp_tot(:,:) - frcv(jpr_rnf)%z3(:,:,1) 
    1256             CALL iom_put( 'runoffs'      , frcv(jpr_rnf)%z3(:,:,1)              )   ! rivers 
    1257          IF( iom_use('hflx_rnf_cea') )   & 
    1258             CALL iom_put( 'hflx_rnf_cea' , frcv(jpr_rnf)%z3(:,:,1) * zcptn(:,:) )   ! heat flux from rivers 
    1259       ENDIF 
    1260       IF( srcv(jpr_cal)%laction ) THEN  
    1261          emp_tot(:,:) = emp_tot(:,:) - frcv(jpr_cal)%z3(:,:,1) 
    1262          CALL iom_put( 'calving', frcv(jpr_cal)%z3(:,:,1) ) 
    1263       ENDIF 
    1264       ! 
    1265 !!gm :  this seems to be internal cooking, not sure to need that in a generic interface  
    1266 !!gm                                       at least should be optional... 
    1267 !!       ! remove negative runoff                            ! sum over the global domain 
    1268 !!       zcumulpos = SUM( MAX( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * e1t(:,:) * e2t(:,:) * tmask_i(:,:) )  
    1269 !!       zcumulneg = SUM( MIN( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * e1t(:,:) * e2t(:,:) * tmask_i(:,:) ) 
    1270 !!       IF( lk_mpp )   CALL mpp_sum( zcumulpos ) 
    1271 !!       IF( lk_mpp )   CALL mpp_sum( zcumulneg )  
    1272 !!       IF( zcumulpos /= 0. ) THEN                          ! distribute negative runoff on positive runoff grid points 
    1273 !!          zcumulneg = 1.e0 + zcumulneg / zcumulpos 
    1274 !!          frcv(jpr_rnf)%z3(:,:,1) = MAX( frcv(jpr_rnf)%z3(:,:,1), 0.e0 ) * zcumulneg 
    1275 !!       ENDIF      
    1276 !!       emp_tot(:,:) = emp_tot(:,:) - frcv(jpr_rnf)%z3(:,:,1)   ! add runoff to e-p  
    1277 !! 
    1278 !!gm  end of internal cooking 
    12791558 
    12801559      !                                                      ! ========================= ! 
     
    12821561      !                                                      ! ========================= ! 
    12831562      CASE( 'oce only' )                                     ! the required field is directly provided 
    1284          qns_tot(:,:  ) = frcv(jpr_qnsoce)%z3(:,:,1) 
     1563         zqns_tot(:,:  ) = frcv(jpr_qnsoce)%z3(:,:,1) 
    12851564      CASE( 'conservative' )                                      ! the required fields are directly provided 
    1286          qns_tot(:,:  ) = frcv(jpr_qnsmix)%z3(:,:,1) 
     1565         zqns_tot(:,:  ) = frcv(jpr_qnsmix)%z3(:,:,1) 
    12871566         IF ( TRIM(sn_rcv_qns%clcat) == 'yes' ) THEN 
    1288             qns_ice(:,:,1:jpl) = frcv(jpr_qnsice)%z3(:,:,1:jpl) 
     1567            zqns_ice(:,:,1:jpl) = frcv(jpr_qnsice)%z3(:,:,1:jpl) 
    12891568         ELSE 
    12901569            ! Set all category values equal for the moment 
    12911570            DO jl=1,jpl 
    1292                qns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) 
     1571               zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) 
    12931572            ENDDO 
    12941573         ENDIF 
    12951574      CASE( 'oce and ice' )       ! the total flux is computed from ocean and ice fluxes 
    1296          qns_tot(:,:  ) =  p_frld(:,:) * frcv(jpr_qnsoce)%z3(:,:,1) 
     1575         zqns_tot(:,:  ) =  p_frld(:,:) * frcv(jpr_qnsoce)%z3(:,:,1) 
    12971576         IF ( TRIM(sn_rcv_qns%clcat) == 'yes' ) THEN 
    12981577            DO jl=1,jpl 
    1299                qns_tot(:,:   ) = qns_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qnsice)%z3(:,:,jl)    
    1300                qns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,jl) 
     1578               zqns_tot(:,:   ) = zqns_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qnsice)%z3(:,:,jl)    
     1579               zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,jl) 
    13011580            ENDDO 
    13021581         ELSE 
     1582            qns_tot(:,:   ) = qns_tot(:,:) + zicefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 
    13031583            DO jl=1,jpl 
    1304                qns_tot(:,:   ) = qns_tot(:,:) + zicefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 
    1305                qns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) 
     1584               zqns_tot(:,:   ) = zqns_tot(:,:) + zicefr(:,:) * frcv(jpr_qnsice)%z3(:,:,1) 
     1585               zqns_ice(:,:,jl) = frcv(jpr_qnsice)%z3(:,:,1) 
    13061586            ENDDO 
    13071587         ENDIF 
    13081588      CASE( 'mixed oce-ice' )     ! the ice flux is cumputed from the total flux, the SST and ice informations 
    13091589! ** NEED TO SORT OUT HOW THIS SHOULD WORK IN THE MULTI-CATEGORY CASE - CURRENTLY NOT ALLOWED WHEN INTERFACE INITIALISED ** 
    1310          qns_tot(:,:  ) = frcv(jpr_qnsmix)%z3(:,:,1) 
    1311          qns_ice(:,:,1) = frcv(jpr_qnsmix)%z3(:,:,1)    & 
     1590         zqns_tot(:,:  ) = frcv(jpr_qnsmix)%z3(:,:,1) 
     1591         zqns_ice(:,:,1) = frcv(jpr_qnsmix)%z3(:,:,1)    & 
    13121592            &            + frcv(jpr_dqnsdt)%z3(:,:,1) * ( pist(:,:,1) - ( (rt0 + psst(:,:  ) ) * p_frld(:,:)   & 
    13131593            &                                                   +          pist(:,:,1)   * zicefr(:,:) ) ) 
    13141594      END SELECT 
    1315       ztmp(:,:) = p_frld(:,:) * sprecip(:,:) * lfus 
    1316       qns_tot(:,:) = qns_tot(:,:)                         &            ! qns_tot update over free ocean with: 
    1317          &          - ztmp(:,:)                           &            ! remove the latent heat flux of solid precip. melting 
    1318          &          - (  emp_tot(:,:)                     &            ! remove the heat content of mass flux (assumed to be at SST) 
    1319          &             - emp_ice(:,:) * zicefr(:,:)  ) * zcptn(:,:)  
    1320       IF( iom_use('hflx_snow_cea') )   & 
    1321          CALL iom_put( 'hflx_snow_cea', ztmp + sprecip(:,:) * zcptn(:,:) )   ! heat flux from snow (cell average) 
    13221595!!gm 
    1323 !!    currently it is taken into account in leads budget but not in the qns_tot, and thus not in  
     1596!!    currently it is taken into account in leads budget but not in the zqns_tot, and thus not in  
    13241597!!    the flux that enter the ocean.... 
    13251598!!    moreover 1 - it is not diagnose anywhere....  
     
    13301603      IF( srcv(jpr_cal)%laction ) THEN                            ! Iceberg melting  
    13311604         ztmp(:,:) = frcv(jpr_cal)%z3(:,:,1) * lfus               ! add the latent heat of iceberg melting  
    1332          qns_tot(:,:) = qns_tot(:,:) - ztmp(:,:) 
     1605         zqns_tot(:,:) = zqns_tot(:,:) - ztmp(:,:) 
    13331606         IF( iom_use('hflx_cal_cea') )   & 
    13341607            CALL iom_put( 'hflx_cal_cea', ztmp + frcv(jpr_cal)%z3(:,:,1) * zcptn(:,:) )   ! heat flux from calving 
    13351608      ENDIF 
     1609 
     1610      ztmp(:,:) = p_frld(:,:) * zsprecip(:,:) * lfus 
     1611      IF( iom_use('hflx_snow_cea') )    CALL iom_put( 'hflx_snow_cea', ztmp + sprecip(:,:) * zcptn(:,:) )   ! heat flux from snow (cell average) 
     1612 
     1613#if defined key_lim3 
     1614      CALL wrk_alloc( jpi,jpj, zevap, zsnw, zqns_oce, zqprec_ice, zqemp_oce )  
     1615 
     1616      ! --- evaporation --- ! 
     1617      ! clem: evap_ice is set to 0 for LIM3 since we still do not know what to do with sublimation 
     1618      ! the problem is: the atm. imposes both mass evaporation and heat removed from the snow/ice 
     1619      !                 but it is incoherent WITH the ice model   
     1620      DO jl=1,jpl 
     1621         evap_ice(:,:,jl) = 0._wp  ! should be: frcv(jpr_ievp)%z3(:,:,1) 
     1622      ENDDO 
     1623      zevap(:,:) = zemp_tot(:,:) + ztprecip(:,:) ! evaporation over ocean 
     1624 
     1625      ! --- evaporation minus precipitation --- ! 
     1626      emp_oce(:,:) = emp_tot(:,:) - emp_ice(:,:) 
     1627 
     1628      ! --- non solar flux over ocean --- ! 
     1629      !         note: p_frld cannot be = 0 since we limit the ice concentration to amax 
     1630      zqns_oce = 0._wp 
     1631      WHERE( p_frld /= 0._wp )  zqns_oce(:,:) = ( zqns_tot(:,:) - SUM( a_i * zqns_ice, dim=3 ) ) / p_frld(:,:) 
     1632 
     1633      ! --- heat flux associated with emp --- ! 
     1634      CALL lim_thd_snwblow( p_frld, zsnw )  ! snow distribution over ice after wind blowing 
     1635      zqemp_oce(:,:) = -      zevap(:,:)                   * p_frld(:,:)      *   zcptn(:,:)   &      ! evap 
     1636         &             + ( ztprecip(:,:) - zsprecip(:,:) )                    *   zcptn(:,:)   &      ! liquid precip 
     1637         &             +   zsprecip(:,:)                   * ( 1._wp - zsnw ) * ( zcptn(:,:) - lfus ) ! solid precip over ocean 
     1638      qemp_ice(:,:)  = -   frcv(jpr_ievp)%z3(:,:,1)        * zicefr(:,:)      *   zcptn(:,:)   &      ! ice evap 
     1639         &             +   zsprecip(:,:)                   * zsnw             * ( zcptn(:,:) - lfus ) ! solid precip over ice 
     1640 
     1641      ! --- heat content of precip over ice in J/m3 (to be used in 1D-thermo) --- ! 
     1642      zqprec_ice(:,:) = rhosn * ( zcptn(:,:) - lfus ) 
     1643 
     1644      ! --- total non solar flux --- ! 
     1645      zqns_tot(:,:) = zqns_tot(:,:) + qemp_ice(:,:) + zqemp_oce(:,:) 
     1646 
     1647      ! --- in case both coupled/forced are active, we must mix values --- !  
     1648      IF( ln_mixcpl ) THEN 
     1649         qns_tot(:,:) = qns_tot(:,:) * xcplmask(:,:,0) + zqns_tot(:,:)* zmsk(:,:) 
     1650         qns_oce(:,:) = qns_oce(:,:) * xcplmask(:,:,0) + zqns_oce(:,:)* zmsk(:,:) 
     1651         DO jl=1,jpl 
     1652            qns_ice(:,:,jl) = qns_ice(:,:,jl) * xcplmask(:,:,0) +  zqns_ice(:,:,jl)* zmsk(:,:) 
     1653         ENDDO 
     1654         qprec_ice(:,:) = qprec_ice(:,:) * xcplmask(:,:,0) + zqprec_ice(:,:)* zmsk(:,:) 
     1655         qemp_oce (:,:) =  qemp_oce(:,:) * xcplmask(:,:,0) +  zqemp_oce(:,:)* zmsk(:,:) 
     1656!!clem         evap_ice(:,:) = evap_ice(:,:) * xcplmask(:,:,0) 
     1657      ELSE 
     1658         qns_tot  (:,:  ) = zqns_tot  (:,:  ) 
     1659         qns_oce  (:,:  ) = zqns_oce  (:,:  ) 
     1660         qns_ice  (:,:,:) = zqns_ice  (:,:,:) 
     1661         qprec_ice(:,:)   = zqprec_ice(:,:) 
     1662         qemp_oce (:,:)   = zqemp_oce (:,:) 
     1663      ENDIF 
     1664 
     1665      CALL wrk_dealloc( jpi,jpj, zevap, zsnw, zqns_oce, zqprec_ice, zqemp_oce )  
     1666 
     1667#else 
     1668 
     1669      ! clem: this formulation is certainly wrong... but better than it was... 
     1670      zqns_tot(:,:) = zqns_tot(:,:)                       &            ! zqns_tot update over free ocean with: 
     1671         &          - ztmp(:,:)                           &            ! remove the latent heat flux of solid precip. melting 
     1672         &          - (  zemp_tot(:,:)                    &            ! remove the heat content of mass flux (assumed to be at SST) 
     1673         &             - zemp_ice(:,:) * zicefr(:,:)  ) * zcptn(:,:)  
     1674 
     1675     IF( ln_mixcpl ) THEN 
     1676         qns_tot(:,:) = qns(:,:) * p_frld(:,:) + SUM( qns_ice(:,:,:) * a_i(:,:,:), dim=3 )   ! total flux from blk 
     1677         qns_tot(:,:) = qns_tot(:,:) * xcplmask(:,:,0) +  zqns_tot(:,:)* zmsk(:,:) 
     1678         DO jl=1,jpl 
     1679            qns_ice(:,:,jl) = qns_ice(:,:,jl) * xcplmask(:,:,0) +  zqns_ice(:,:,jl)* zmsk(:,:) 
     1680         ENDDO 
     1681      ELSE 
     1682         qns_tot(:,:  ) = zqns_tot(:,:  ) 
     1683         qns_ice(:,:,:) = zqns_ice(:,:,:) 
     1684      ENDIF 
     1685 
     1686#endif 
    13361687 
    13371688      !                                                      ! ========================= ! 
     
    13391690      !                                                      ! ========================= ! 
    13401691      CASE( 'oce only' ) 
    1341          qsr_tot(:,:  ) = MAX( 0._wp , frcv(jpr_qsroce)%z3(:,:,1) ) 
     1692         zqsr_tot(:,:  ) = MAX( 0._wp , frcv(jpr_qsroce)%z3(:,:,1) ) 
    13421693      CASE( 'conservative' ) 
    1343          qsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
     1694         zqsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
    13441695         IF ( TRIM(sn_rcv_qsr%clcat) == 'yes' ) THEN 
    1345             qsr_ice(:,:,1:jpl) = frcv(jpr_qsrice)%z3(:,:,1:jpl) 
     1696            zqsr_ice(:,:,1:jpl) = frcv(jpr_qsrice)%z3(:,:,1:jpl) 
    13461697         ELSE 
    13471698            ! Set all category values equal for the moment 
    13481699            DO jl=1,jpl 
    1349                qsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 
     1700               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 
    13501701            ENDDO 
    13511702         ENDIF 
    1352          qsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
    1353          qsr_ice(:,:,1) = frcv(jpr_qsrice)%z3(:,:,1) 
     1703         zqsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
     1704         zqsr_ice(:,:,1) = frcv(jpr_qsrice)%z3(:,:,1) 
    13541705      CASE( 'oce and ice' ) 
    1355          qsr_tot(:,:  ) =  p_frld(:,:) * frcv(jpr_qsroce)%z3(:,:,1) 
     1706         zqsr_tot(:,:  ) =  p_frld(:,:) * frcv(jpr_qsroce)%z3(:,:,1) 
    13561707         IF ( TRIM(sn_rcv_qsr%clcat) == 'yes' ) THEN 
    13571708            DO jl=1,jpl 
    1358                qsr_tot(:,:   ) = qsr_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qsrice)%z3(:,:,jl)    
    1359                qsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,jl) 
     1709               zqsr_tot(:,:   ) = zqsr_tot(:,:) + a_i(:,:,jl) * frcv(jpr_qsrice)%z3(:,:,jl)    
     1710               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,jl) 
    13601711            ENDDO 
    13611712         ELSE 
     1713            qsr_tot(:,:   ) = qsr_tot(:,:) + zicefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 
    13621714            DO jl=1,jpl 
    1363                qsr_tot(:,:   ) = qsr_tot(:,:) + zicefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 
    1364                qsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 
     1715               zqsr_tot(:,:   ) = zqsr_tot(:,:) + zicefr(:,:) * frcv(jpr_qsrice)%z3(:,:,1) 
     1716               zqsr_ice(:,:,jl) = frcv(jpr_qsrice)%z3(:,:,1) 
    13651717            ENDDO 
    13661718         ENDIF 
    13671719      CASE( 'mixed oce-ice' ) 
    1368          qsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
     1720         zqsr_tot(:,:  ) = frcv(jpr_qsrmix)%z3(:,:,1) 
    13691721! ** NEED TO SORT OUT HOW THIS SHOULD WORK IN THE MULTI-CATEGORY CASE - CURRENTLY NOT ALLOWED WHEN INTERFACE INITIALISED ** 
    13701722!       Create solar heat flux over ice using incoming solar heat flux and albedos 
    13711723!       ( see OASIS3 user guide, 5th edition, p39 ) 
    1372          qsr_ice(:,:,1) = frcv(jpr_qsrmix)%z3(:,:,1) * ( 1.- palbi(:,:,1) )   & 
     1724         zqsr_ice(:,:,1) = frcv(jpr_qsrmix)%z3(:,:,1) * ( 1.- palbi(:,:,1) )   & 
    13731725            &            / (  1.- ( albedo_oce_mix(:,:  ) * p_frld(:,:)       & 
    13741726            &                     + palbi         (:,:,1) * zicefr(:,:) ) ) 
    13751727      END SELECT 
    1376       IF( ln_dm2dc ) THEN   ! modify qsr to include the diurnal cycle 
    1377          qsr_tot(:,:  ) = sbc_dcy( qsr_tot(:,:  ) ) 
     1728      IF( ln_dm2dc .AND. ln_cpl ) THEN   ! modify qsr to include the diurnal cycle 
     1729         zqsr_tot(:,:  ) = sbc_dcy( zqsr_tot(:,:  ) ) 
    13781730         DO jl=1,jpl 
    1379             qsr_ice(:,:,jl) = sbc_dcy( qsr_ice(:,:,jl) ) 
     1731            zqsr_ice(:,:,jl) = sbc_dcy( zqsr_ice(:,:,jl) ) 
    13801732         ENDDO 
     1733      ENDIF 
     1734 
     1735      IF( ln_mixcpl ) THEN 
     1736         qsr_tot(:,:) = qsr(:,:) * p_frld(:,:) + SUM( qsr_ice(:,:,:) * a_i(:,:,:), dim=3 )   ! total flux from blk 
     1737         qsr_tot(:,:) = qsr_tot(:,:) * xcplmask(:,:,0) +  zqsr_tot(:,:)* zmsk(:,:) 
     1738         DO jl=1,jpl 
     1739            qsr_ice(:,:,jl) = qsr_ice(:,:,jl) * xcplmask(:,:,0) +  zqsr_ice(:,:,jl)* zmsk(:,:) 
     1740         ENDDO 
     1741      ELSE 
     1742         qsr_tot(:,:  ) = zqsr_tot(:,:  ) 
     1743         qsr_ice(:,:,:) = zqsr_ice(:,:,:) 
    13811744      ENDIF 
    13821745 
     
    13861749      CASE ('coupled') 
    13871750         IF ( TRIM(sn_rcv_dqnsdt%clcat) == 'yes' ) THEN 
    1388             dqns_ice(:,:,1:jpl) = frcv(jpr_dqnsdt)%z3(:,:,1:jpl) 
     1751            zdqns_ice(:,:,1:jpl) = frcv(jpr_dqnsdt)%z3(:,:,1:jpl) 
    13891752         ELSE 
    13901753            ! Set all category values equal for the moment 
    13911754            DO jl=1,jpl 
    1392                dqns_ice(:,:,jl) = frcv(jpr_dqnsdt)%z3(:,:,1) 
     1755               zdqns_ice(:,:,jl) = frcv(jpr_dqnsdt)%z3(:,:,1) 
    13931756            ENDDO 
    13941757         ENDIF 
    13951758      END SELECT 
    1396  
     1759       
     1760      IF( ln_mixcpl ) THEN 
     1761         DO jl=1,jpl 
     1762            dqns_ice(:,:,jl) = dqns_ice(:,:,jl) * xcplmask(:,:,0) + zdqns_ice(:,:,jl) * zmsk(:,:) 
     1763         ENDDO 
     1764      ELSE 
     1765         dqns_ice(:,:,:) = zdqns_ice(:,:,:) 
     1766      ENDIF 
     1767       
    13971768      !                                                      ! ========================= ! 
    13981769      SELECT CASE( TRIM( sn_rcv_iceflx%cldes ) )             !    topmelt and botmelt    ! 
     
    14101781      fr2_i0(:,:) = ( 0.82 * ( 1.0 - cldf_ice ) + 0.65 * cldf_ice ) 
    14111782 
    1412       CALL wrk_dealloc( jpi,jpj, zcptn, ztmp, zicefr ) 
     1783      CALL wrk_dealloc( jpi,jpj,     zcptn, ztmp, zicefr, zmsk, zemp_tot, zemp_ice, zsprecip, ztprecip, zqns_tot, zqsr_tot ) 
     1784      CALL wrk_dealloc( jpi,jpj,jpl, zqns_ice, zqsr_ice, zdqns_ice ) 
    14131785      ! 
    14141786      IF( nn_timing == 1 )  CALL timing_stop('sbc_cpl_ice_flx') 
     
    14301802      INTEGER ::   ji, jj, jl   ! dummy loop indices 
    14311803      INTEGER ::   isec, info   ! local integer 
     1804      REAL(wp) ::   zumax, zvmax 
    14321805      REAL(wp), POINTER, DIMENSION(:,:)   ::   zfr_l, ztmp1, ztmp2, zotx1, zoty1, zotz1, zitx1, zity1, zitz1 
    14331806      REAL(wp), POINTER, DIMENSION(:,:,:) ::   ztmp3, ztmp4    
     
    14461819      !                                                      ! ------------------------- ! 
    14471820      IF( ssnd(jps_toce)%laction .OR. ssnd(jps_tice)%laction .OR. ssnd(jps_tmix)%laction ) THEN 
    1448          SELECT CASE( sn_snd_temp%cldes) 
    1449          CASE( 'oce only'             )   ;   ztmp1(:,:) =   tsn(:,:,1,jp_tem) + rt0 
    1450          CASE( 'weighted oce and ice' )   ;   ztmp1(:,:) = ( tsn(:,:,1,jp_tem) + rt0 ) * zfr_l(:,:)    
    1451             SELECT CASE( sn_snd_temp%clcat ) 
    1452             CASE( 'yes' )    
    1453                ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 
    1454             CASE( 'no' ) 
    1455                ztmp3(:,:,:) = 0.0 
     1821          
     1822         IF ( nn_components == jp_iam_opa ) THEN 
     1823            ztmp1(:,:) = tsn(:,:,1,jp_tem)   ! send temperature as it is (potential or conservative) -> use of ln_useCT on the received part 
     1824         ELSE 
     1825            ! we must send the surface potential temperature  
     1826            IF( ln_useCT )  THEN    ;   ztmp1(:,:) = eos_pt_from_ct( tsn(:,:,1,jp_tem), tsn(:,:,1,jp_sal) ) 
     1827            ELSE                    ;   ztmp1(:,:) = tsn(:,:,1,jp_tem) 
     1828            ENDIF 
     1829            ! 
     1830            SELECT CASE( sn_snd_temp%cldes) 
     1831            CASE( 'oce only'             )   ;   ztmp1(:,:) =   ztmp1(:,:) + rt0 
     1832            CASE( 'oce and ice'          )   ;   ztmp1(:,:) =   ztmp1(:,:) + rt0 
     1833               SELECT CASE( sn_snd_temp%clcat ) 
     1834               CASE( 'yes' )    
     1835                  ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) 
     1836               CASE( 'no' ) 
     1837                  WHERE( SUM( a_i, dim=3 ) /= 0. ) 
     1838                     ztmp3(:,:,1) = SUM( tn_ice * a_i, dim=3 ) / SUM( a_i, dim=3 ) 
     1839                  ELSEWHERE 
     1840                     ztmp3(:,:,1) = rt0 ! TODO: Is freezing point a good default? (Maybe SST is better?) 
     1841                  END WHERE 
     1842               CASE default   ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' ) 
     1843               END SELECT 
     1844            CASE( 'weighted oce and ice' )   ;   ztmp1(:,:) = ( ztmp1(:,:) + rt0 ) * zfr_l(:,:)    
     1845               SELECT CASE( sn_snd_temp%clcat ) 
     1846               CASE( 'yes' )    
     1847                  ztmp3(:,:,1:jpl) = tn_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 
     1848               CASE( 'no' ) 
     1849                  ztmp3(:,:,:) = 0.0 
     1850                  DO jl=1,jpl 
     1851                     ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl) 
     1852                  ENDDO 
     1853               CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' ) 
     1854               END SELECT 
     1855            CASE( 'mixed oce-ice'        )    
     1856               ztmp1(:,:) = ( ztmp1(:,:) + rt0 ) * zfr_l(:,:)  
    14561857               DO jl=1,jpl 
    1457                   ztmp3(:,:,1) = ztmp3(:,:,1) + tn_ice(:,:,jl) * a_i(:,:,jl) 
     1858                  ztmp1(:,:) = ztmp1(:,:) + tn_ice(:,:,jl) * a_i(:,:,jl) 
    14581859               ENDDO 
    1459             CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%clcat' ) 
     1860            CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%cldes' ) 
    14601861            END SELECT 
    1461          CASE( 'mixed oce-ice'        )    
    1462             ztmp1(:,:) = ( tsn(:,:,1,jp_tem) + rt0 ) * zfr_l(:,:)  
    1463             DO jl=1,jpl 
    1464                ztmp1(:,:) = ztmp1(:,:) + tn_ice(:,:,jl) * a_i(:,:,jl) 
    1465             ENDDO 
    1466          CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_temp%cldes' ) 
    1467          END SELECT 
     1862         ENDIF 
    14681863         IF( ssnd(jps_toce)%laction )   CALL cpl_snd( jps_toce, isec, RESHAPE ( ztmp1, (/jpi,jpj,1/) ), info ) 
    14691864         IF( ssnd(jps_tice)%laction )   CALL cpl_snd( jps_tice, isec, ztmp3, info ) 
     
    14741869      !                                                      ! ------------------------- ! 
    14751870      IF( ssnd(jps_albice)%laction ) THEN                         ! ice  
    1476          ztmp3(:,:,1:jpl) = alb_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 
     1871         SELECT CASE( sn_snd_alb%cldes ) 
     1872         CASE( 'ice'          )   ; ztmp3(:,:,1:jpl) = alb_ice(:,:,1:jpl) 
     1873         CASE( 'weighted ice' )   ; ztmp3(:,:,1:jpl) = alb_ice(:,:,1:jpl) * a_i(:,:,1:jpl) 
     1874         CASE default             ; CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_alb%cldes' ) 
     1875         END SELECT 
    14771876         CALL cpl_snd( jps_albice, isec, ztmp3, info ) 
    14781877      ENDIF 
     
    14871886      !                                                      !  Ice fraction & Thickness !  
    14881887      !                                                      ! ------------------------- ! 
    1489       ! Send ice fraction field  
     1888      ! Send ice fraction field to atmosphere 
    14901889      IF( ssnd(jps_fice)%laction ) THEN 
    14911890         SELECT CASE( sn_snd_thick%clcat ) 
     
    14941893         CASE default    ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 
    14951894         END SELECT 
    1496          CALL cpl_snd( jps_fice, isec, ztmp3, info ) 
     1895         IF( ssnd(jps_fice)%laction )   CALL cpl_snd( jps_fice, isec, ztmp3, info ) 
     1896      ENDIF 
     1897       
     1898      ! Send ice fraction field to OPA (sent by SAS in SAS-OPA coupling) 
     1899      IF( ssnd(jps_fice2)%laction ) THEN 
     1900         ztmp3(:,:,1) = fr_i(:,:) 
     1901         IF( ssnd(jps_fice2)%laction )   CALL cpl_snd( jps_fice2, isec, ztmp3, info ) 
    14971902      ENDIF 
    14981903 
     
    15151920            END SELECT 
    15161921         CASE( 'ice and snow'         )    
    1517             ztmp3(:,:,1:jpl) = ht_i(:,:,1:jpl) 
    1518             ztmp4(:,:,1:jpl) = ht_s(:,:,1:jpl) 
     1922            SELECT CASE( sn_snd_thick%clcat ) 
     1923            CASE( 'yes' ) 
     1924               ztmp3(:,:,1:jpl) = ht_i(:,:,1:jpl) 
     1925               ztmp4(:,:,1:jpl) = ht_s(:,:,1:jpl) 
     1926            CASE( 'no' ) 
     1927               WHERE( SUM( a_i, dim=3 ) /= 0. ) 
     1928                  ztmp3(:,:,1) = SUM( ht_i * a_i, dim=3 ) / SUM( a_i, dim=3 ) 
     1929                  ztmp4(:,:,1) = SUM( ht_s * a_i, dim=3 ) / SUM( a_i, dim=3 ) 
     1930               ELSEWHERE 
     1931                 ztmp3(:,:,1) = 0. 
     1932                 ztmp4(:,:,1) = 0. 
     1933               END WHERE 
     1934            CASE default                  ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%clcat' ) 
     1935            END SELECT 
    15191936         CASE default                     ;   CALL ctl_stop( 'sbc_cpl_snd: wrong definition of sn_snd_thick%cldes' ) 
    15201937         END SELECT 
     
    15681985         !                                                              i-1  i   i 
    15691986         !                                                               i      i+1 (for I) 
    1570          SELECT CASE( TRIM( sn_snd_crt%cldes ) ) 
    1571          CASE( 'oce only'             )      ! C-grid ==> T 
    1572             DO jj = 2, jpjm1 
    1573                DO ji = fs_2, fs_jpim1   ! vector opt. 
    1574                   zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj  ,1) ) 
    1575                   zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji  ,jj-1,1) )  
    1576                END DO 
    1577             END DO 
    1578          CASE( 'weighted oce and ice' )    
    1579             SELECT CASE ( cp_ice_msh ) 
    1580             CASE( 'C' )                      ! Ocean and Ice on C-grid ==> T 
     1987         IF( nn_components == jp_iam_opa ) THEN 
     1988            zotx1(:,:) = un(:,:,1)   
     1989            zoty1(:,:) = vn(:,:,1)   
     1990         ELSE         
     1991            SELECT CASE( TRIM( sn_snd_crt%cldes ) ) 
     1992            CASE( 'oce only'             )      ! C-grid ==> T 
    15811993               DO jj = 2, jpjm1 
    15821994                  DO ji = fs_2, fs_jpim1   ! vector opt. 
    1583                      zotx1(ji,jj) = 0.5 * ( un   (ji,jj,1) + un   (ji-1,jj  ,1) ) * zfr_l(ji,jj)   
    1584                      zoty1(ji,jj) = 0.5 * ( vn   (ji,jj,1) + vn   (ji  ,jj-1,1) ) * zfr_l(ji,jj) 
    1585                      zitx1(ji,jj) = 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj) 
    1586                      zity1(ji,jj) = 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj) 
     1995                     zotx1(ji,jj) = 0.5 * ( un(ji,jj,1) + un(ji-1,jj  ,1) ) 
     1996                     zoty1(ji,jj) = 0.5 * ( vn(ji,jj,1) + vn(ji  ,jj-1,1) )  
    15871997                  END DO 
    15881998               END DO 
    1589             CASE( 'I' )                      ! Ocean on C grid, Ice on I-point (B-grid) ==> T 
    1590                DO jj = 2, jpjm1 
    1591                   DO ji = 2, jpim1   ! NO vector opt. 
    1592                      zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   
    1593                      zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   
    1594                      zitx1(ji,jj) = 0.25 * ( u_ice(ji+1,jj+1) + u_ice(ji,jj+1)                     & 
    1595                         &                  + u_ice(ji+1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1596                      zity1(ji,jj) = 0.25 * ( v_ice(ji+1,jj+1) + v_ice(ji,jj+1)                     & 
    1597                         &                  + v_ice(ji+1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     1999            CASE( 'weighted oce and ice' )    
     2000               SELECT CASE ( cp_ice_msh ) 
     2001               CASE( 'C' )                      ! Ocean and Ice on C-grid ==> T 
     2002                  DO jj = 2, jpjm1 
     2003                     DO ji = fs_2, fs_jpim1   ! vector opt. 
     2004                        zotx1(ji,jj) = 0.5 * ( un   (ji,jj,1) + un   (ji-1,jj  ,1) ) * zfr_l(ji,jj)   
     2005                        zoty1(ji,jj) = 0.5 * ( vn   (ji,jj,1) + vn   (ji  ,jj-1,1) ) * zfr_l(ji,jj) 
     2006                        zitx1(ji,jj) = 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj) 
     2007                        zity1(ji,jj) = 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj) 
     2008                     END DO 
    15982009                  END DO 
    1599                END DO 
    1600             CASE( 'F' )                      ! Ocean on C grid, Ice on F-point (B-grid) ==> T 
    1601                DO jj = 2, jpjm1 
    1602                   DO ji = 2, jpim1   ! NO vector opt. 
    1603                      zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   
    1604                      zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   
    1605                      zitx1(ji,jj) = 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1)                     & 
    1606                         &                  + u_ice(ji-1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1607                      zity1(ji,jj) = 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1)                     & 
    1608                         &                  + v_ice(ji-1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     2010               CASE( 'I' )                      ! Ocean on C grid, Ice on I-point (B-grid) ==> T 
     2011                  DO jj = 2, jpjm1 
     2012                     DO ji = 2, jpim1   ! NO vector opt. 
     2013                        zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   
     2014                        zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   
     2015                        zitx1(ji,jj) = 0.25 * ( u_ice(ji+1,jj+1) + u_ice(ji,jj+1)                     & 
     2016                           &                  + u_ice(ji+1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     2017                        zity1(ji,jj) = 0.25 * ( v_ice(ji+1,jj+1) + v_ice(ji,jj+1)                     & 
     2018                           &                  + v_ice(ji+1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     2019                     END DO 
    16092020                  END DO 
    1610                END DO 
     2021               CASE( 'F' )                      ! Ocean on C grid, Ice on F-point (B-grid) ==> T 
     2022                  DO jj = 2, jpjm1 
     2023                     DO ji = 2, jpim1   ! NO vector opt. 
     2024                        zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   
     2025                        zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   
     2026                        zitx1(ji,jj) = 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1)                     & 
     2027                           &                  + u_ice(ji-1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     2028                        zity1(ji,jj) = 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1)                     & 
     2029                           &                  + v_ice(ji-1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     2030                     END DO 
     2031                  END DO 
     2032               END SELECT 
     2033               CALL lbc_lnk( zitx1, 'T', -1. )   ;   CALL lbc_lnk( zity1, 'T', -1. ) 
     2034            CASE( 'mixed oce-ice'        ) 
     2035               SELECT CASE ( cp_ice_msh ) 
     2036               CASE( 'C' )                      ! Ocean and Ice on C-grid ==> T 
     2037                  DO jj = 2, jpjm1 
     2038                     DO ji = fs_2, fs_jpim1   ! vector opt. 
     2039                        zotx1(ji,jj) = 0.5 * ( un   (ji,jj,1) + un   (ji-1,jj  ,1) ) * zfr_l(ji,jj)   & 
     2040                           &         + 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj) 
     2041                        zoty1(ji,jj) = 0.5 * ( vn   (ji,jj,1) + vn   (ji  ,jj-1,1) ) * zfr_l(ji,jj)   & 
     2042                           &         + 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj) 
     2043                     END DO 
     2044                  END DO 
     2045               CASE( 'I' )                      ! Ocean on C grid, Ice on I-point (B-grid) ==> T 
     2046                  DO jj = 2, jpjm1 
     2047                     DO ji = 2, jpim1   ! NO vector opt. 
     2048                        zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   &    
     2049                           &         + 0.25 * ( u_ice(ji+1,jj+1) + u_ice(ji,jj+1)                     & 
     2050                           &                  + u_ice(ji+1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     2051                        zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   &  
     2052                           &         + 0.25 * ( v_ice(ji+1,jj+1) + v_ice(ji,jj+1)                     & 
     2053                           &                  + v_ice(ji+1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     2054                     END DO 
     2055                  END DO 
     2056               CASE( 'F' )                      ! Ocean on C grid, Ice on F-point (B-grid) ==> T 
     2057                  DO jj = 2, jpjm1 
     2058                     DO ji = 2, jpim1   ! NO vector opt. 
     2059                        zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   &    
     2060                           &         + 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1)                     & 
     2061                           &                  + u_ice(ji-1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     2062                        zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   &  
     2063                           &         + 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1)                     & 
     2064                           &                  + v_ice(ji-1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
     2065                     END DO 
     2066                  END DO 
     2067               END SELECT 
    16112068            END SELECT 
    1612             CALL lbc_lnk( zitx1, 'T', -1. )   ;   CALL lbc_lnk( zity1, 'T', -1. ) 
    1613          CASE( 'mixed oce-ice'        ) 
    1614             SELECT CASE ( cp_ice_msh ) 
    1615             CASE( 'C' )                      ! Ocean and Ice on C-grid ==> T 
    1616                DO jj = 2, jpjm1 
    1617                   DO ji = fs_2, fs_jpim1   ! vector opt. 
    1618                      zotx1(ji,jj) = 0.5 * ( un   (ji,jj,1) + un   (ji-1,jj  ,1) ) * zfr_l(ji,jj)   & 
    1619                         &         + 0.5 * ( u_ice(ji,jj  ) + u_ice(ji-1,jj    ) ) *  fr_i(ji,jj) 
    1620                      zoty1(ji,jj) = 0.5 * ( vn   (ji,jj,1) + vn   (ji  ,jj-1,1) ) * zfr_l(ji,jj)   & 
    1621                         &         + 0.5 * ( v_ice(ji,jj  ) + v_ice(ji  ,jj-1  ) ) *  fr_i(ji,jj) 
    1622                   END DO 
    1623                END DO 
    1624             CASE( 'I' )                      ! Ocean on C grid, Ice on I-point (B-grid) ==> T 
    1625                DO jj = 2, jpjm1 
    1626                   DO ji = 2, jpim1   ! NO vector opt. 
    1627                      zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   &    
    1628                         &         + 0.25 * ( u_ice(ji+1,jj+1) + u_ice(ji,jj+1)                     & 
    1629                         &                  + u_ice(ji+1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1630                      zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   &  
    1631                         &         + 0.25 * ( v_ice(ji+1,jj+1) + v_ice(ji,jj+1)                     & 
    1632                         &                  + v_ice(ji+1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1633                   END DO 
    1634                END DO 
    1635             CASE( 'F' )                      ! Ocean on C grid, Ice on F-point (B-grid) ==> T 
    1636                DO jj = 2, jpjm1 
    1637                   DO ji = 2, jpim1   ! NO vector opt. 
    1638                      zotx1(ji,jj) = 0.5  * ( un(ji,jj,1)      + un(ji-1,jj  ,1) ) * zfr_l(ji,jj)   &    
    1639                         &         + 0.25 * ( u_ice(ji-1,jj-1) + u_ice(ji,jj-1)                     & 
    1640                         &                  + u_ice(ji-1,jj  ) + u_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1641                      zoty1(ji,jj) = 0.5  * ( vn(ji,jj,1)      + vn(ji  ,jj-1,1) ) * zfr_l(ji,jj)   &  
    1642                         &         + 0.25 * ( v_ice(ji-1,jj-1) + v_ice(ji,jj-1)                     & 
    1643                         &                  + v_ice(ji-1,jj  ) + v_ice(ji,jj  )  ) *  fr_i(ji,jj) 
    1644                   END DO 
    1645                END DO 
    1646             END SELECT 
    1647          END SELECT 
    1648          CALL lbc_lnk( zotx1, ssnd(jps_ocx1)%clgrid, -1. )   ;   CALL lbc_lnk( zoty1, ssnd(jps_ocy1)%clgrid, -1. ) 
     2069            CALL lbc_lnk( zotx1, ssnd(jps_ocx1)%clgrid, -1. )   ;   CALL lbc_lnk( zoty1, ssnd(jps_ocy1)%clgrid, -1. ) 
     2070            ! 
     2071         ENDIF 
    16492072         ! 
    16502073         ! 
     
    16862109      ENDIF 
    16872110      ! 
     2111      ! 
     2112      !  Fields sent by OPA to SAS when doing OPA<->SAS coupling 
     2113      !                                                        ! SSH 
     2114      IF( ssnd(jps_ssh )%laction )  THEN 
     2115         !                          ! removed inverse barometer ssh when Patm 
     2116         !                          forcing is used (for sea-ice dynamics) 
     2117         IF( ln_apr_dyn ) THEN   ;   ztmp1(:,:) = sshb(:,:) - 0.5 * ( ssh_ib(:,:) + ssh_ibb(:,:) ) 
     2118         ELSE                    ;   ztmp1(:,:) = sshn(:,:) 
     2119         ENDIF 
     2120         CALL cpl_snd( jps_ssh   , isec, RESHAPE ( ztmp1            , (/jpi,jpj,1/) ), info ) 
     2121 
     2122      ENDIF 
     2123      !                                                        ! SSS 
     2124      IF( ssnd(jps_soce  )%laction )  THEN 
     2125         CALL cpl_snd( jps_soce  , isec, RESHAPE ( tsn(:,:,1,jp_sal), (/jpi,jpj,1/) ), info ) 
     2126      ENDIF 
     2127      !                                                        ! first T level thickness  
     2128      IF( ssnd(jps_e3t1st )%laction )  THEN 
     2129         CALL cpl_snd( jps_e3t1st, isec, RESHAPE ( fse3t_n(:,:,1)   , (/jpi,jpj,1/) ), info ) 
     2130      ENDIF 
     2131      !                                                        ! Qsr fraction 
     2132      IF( ssnd(jps_fraqsr)%laction )  THEN 
     2133         CALL cpl_snd( jps_fraqsr, isec, RESHAPE ( fraqsr_1lev(:,:) , (/jpi,jpj,1/) ), info ) 
     2134      ENDIF 
     2135      ! 
     2136      !  Fields sent by SAS to OPA when OASIS coupling 
     2137      !                                                        ! Solar heat flux 
     2138      IF( ssnd(jps_qsroce)%laction )  CALL cpl_snd( jps_qsroce, isec, RESHAPE ( qsr , (/jpi,jpj,1/) ), info ) 
     2139      IF( ssnd(jps_qnsoce)%laction )  CALL cpl_snd( jps_qnsoce, isec, RESHAPE ( qns , (/jpi,jpj,1/) ), info ) 
     2140      IF( ssnd(jps_oemp  )%laction )  CALL cpl_snd( jps_oemp  , isec, RESHAPE ( emp , (/jpi,jpj,1/) ), info ) 
     2141      IF( ssnd(jps_sflx  )%laction )  CALL cpl_snd( jps_sflx  , isec, RESHAPE ( sfx , (/jpi,jpj,1/) ), info ) 
     2142      IF( ssnd(jps_otx1  )%laction )  CALL cpl_snd( jps_otx1  , isec, RESHAPE ( utau, (/jpi,jpj,1/) ), info ) 
     2143      IF( ssnd(jps_oty1  )%laction )  CALL cpl_snd( jps_oty1  , isec, RESHAPE ( vtau, (/jpi,jpj,1/) ), info ) 
     2144      IF( ssnd(jps_rnf   )%laction )  CALL cpl_snd( jps_rnf   , isec, RESHAPE ( rnf , (/jpi,jpj,1/) ), info ) 
     2145      IF( ssnd(jps_taum  )%laction )  CALL cpl_snd( jps_taum  , isec, RESHAPE ( taum, (/jpi,jpj,1/) ), info ) 
     2146 
    16882147      CALL wrk_dealloc( jpi,jpj, zfr_l, ztmp1, ztmp2, zotx1, zoty1, zotz1, zitx1, zity1, zitz1 ) 
    16892148      CALL wrk_dealloc( jpi,jpj,jpl, ztmp3, ztmp4 ) 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcfwb.F90

    r5234 r5443  
    88   !!            3.0  ! 2006-08  (G. Madec)  Surface module 
    99   !!            3.2  ! 2009-07  (C. Talandier) emp mean s spread over erp area  
     10   !!            3.6  ! 2014-11  (P. Mathiot  ) add ice shelf melting 
    1011   !!---------------------------------------------------------------------- 
    1112 
     
    8889         ! 
    8990         IF( kn_fwb == 3 .AND. nn_sssr /= 2 )   CALL ctl_stop( 'sbc_fwb: nn_fwb = 3 requires nn_sssr = 2, we stop ' ) 
    90          ! 
    91          area = glob_sum( e1e2t(:,:) )           ! interior global domain surface 
     91         IF( kn_fwb == 3 .AND. ln_isfcav    )   CALL ctl_stop( 'sbc_fwb: nn_fwb = 3 with ln_isfcav = .TRUE. not working, we stop ' ) 
     92         ! 
     93         area = glob_sum( e1e2t(:,:) * tmask(:,:,1))           ! interior global domain surface 
     94         ! isf cavities are excluded because it can feedback to the melting with generation of inhibition of plumes 
     95         ! and in case of no melt, it can generate HSSW. 
    9296         ! 
    9397#if ! defined key_lim2 &&  ! defined key_lim3 && ! defined key_cice 
     
    106110            z_fwf = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) + rdivisf * fwfisf(:,:) -  snwice_fmass(:,:) ) ) / area   ! sum over the global domain 
    107111            zcoef = z_fwf * rcp 
    108             emp(:,:) = emp(:,:) - z_fwf  
    109             qns(:,:) = qns(:,:) + zcoef * sst_m(:,:) ! account for change to the heat budget due to fw correction 
     112            emp(:,:) = emp(:,:) - z_fwf              * tmask(:,:,1) 
     113            qns(:,:) = qns(:,:) + zcoef * sst_m(:,:) * tmask(:,:,1) ! account for change to the heat budget due to fw correction 
    110114         ENDIF 
    111115         ! 
     
    138142         IF( MOD( kt-1, kn_fsbc ) == 0 ) THEN         ! correct the freshwater fluxes 
    139143            zcoef = fwfold * rcp 
    140             emp(:,:) = emp(:,:) + fwfold 
    141             qns(:,:) = qns(:,:) - zcoef * sst_m(:,:) ! account for change to the heat budget due to fw correction 
     144            emp(:,:) = emp(:,:) + fwfold             * tmask(:,:,1) 
     145            qns(:,:) = qns(:,:) - zcoef * sst_m(:,:) * tmask(:,:,1) ! account for change to the heat budget due to fw correction 
    142146         ENDIF 
    143147         ! 
     
    158162            zsurf_pos = glob_sum( e1e2t(:,:)*ztmsk_pos(:,:) ) 
    159163            !                                                  ! fwf global mean (excluding ocean to ice/snow exchanges)  
    160             z_fwf     = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) - snwice_fmass(:,:) ) ) / area 
     164            z_fwf     = glob_sum( e1e2t(:,:) * ( emp(:,:) - rnf(:,:) + rdivisf * fwfisf(:,:) - snwice_fmass(:,:) ) ) / area 
    161165            !             
    162166            IF( z_fwf < 0._wp ) THEN         ! spread out over >0 erp area to increase evaporation 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_cice.F90

    • Property svn:keywords set to Id
    r5162 r5443  
    4141   USE ice_state, only: aice,aicen,uvel,vvel,vsno,vsnon,vice,vicen 
    4242   USE ice_flux, only: strax,stray,strocnx,strocny,frain,fsnow,  & 
     43                strocnxT,strocnyT,                               &  
    4344                sst,sss,uocn,vocn,ss_tltx,ss_tlty,fsalt_gbm,     & 
    4445                fresh_gbm,fhocn_gbm,fswthru_gbm,frzmlt,          & 
     
    5152                vsnon,vice,vicen 
    5253   USE ice_flux, only: strax,stray,strocnx,strocny,frain,fsnow,  & 
     54                strocnxT,strocnyT,                               &  
    5355                sst,sss,uocn,vocn,ss_tltx,ss_tlty,fsalt_ai,     & 
    5456                fresh_ai,fhocn_ai,fswthru_ai,frzmlt,          & 
     
    98100#  include "domzgr_substitute.h90" 
    99101 
     102   !! $Id$ 
    100103CONTAINS 
    101104 
     
    139142         IF      ( ksbc == jp_flx ) THEN 
    140143            CALL cice_sbc_force(kt) 
    141          ELSE IF ( ksbc == jp_cpl ) THEN 
     144         ELSE IF ( ksbc == jp_purecpl ) THEN 
    142145            CALL sbc_cpl_ice_flx( 1.0-fr_i  ) 
    143146         ENDIF 
     
    147150         CALL cice_sbc_out ( kt, ksbc ) 
    148151 
    149          IF ( ksbc == jp_cpl )  CALL cice_sbc_hadgam(kt+1) 
     152         IF ( ksbc == jp_purecpl )  CALL cice_sbc_hadgam(kt+1) 
    150153 
    151154      ENDIF                                          ! End sea-ice time step only 
     
    202205 
    203206! Do some CICE consistency checks 
    204       IF ( (ksbc == jp_flx) .OR. (ksbc == jp_cpl) ) THEN 
     207      IF ( (ksbc == jp_flx) .OR. (ksbc == jp_purecpl) ) THEN 
    205208         IF ( calc_strair .OR. calc_Tsfc ) THEN 
    206209            CALL ctl_stop( 'STOP', 'cice_sbc_init : Forcing option requires calc_strair=F and calc_Tsfc=F in ice_in' ) 
     
    223226 
    224227      CALL cice2nemo(aice,fr_i, 'T', 1. ) 
    225       IF ( (ksbc == jp_flx) .OR. (ksbc == jp_cpl) ) THEN 
     228      IF ( (ksbc == jp_flx) .OR. (ksbc == jp_purecpl) ) THEN 
    226229         DO jl=1,ncat 
    227230            CALL cice2nemo(aicen(:,:,jl,:),a_i(:,:,jl), 'T', 1. ) 
     
    331334! forced and coupled case  
    332335 
    333       IF ( (ksbc == jp_flx).OR.(ksbc == jp_cpl) ) THEN 
     336      IF ( (ksbc == jp_flx).OR.(ksbc == jp_purecpl) ) THEN 
    334337 
    335338         ztmpn(:,:,:)=0.0 
     
    562565! Combine wind stress and ocean-ice stress 
    563566! [Note that fr_iu hasn't yet been updated, so still from start of CICE timestep] 
     567! strocnx and strocny already weighted by ice fraction in CICE so not done here  
    564568 
    565569      utau(:,:)=(1.0-fr_iu(:,:))*utau(:,:)-ss_iou(:,:) 
    566570      vtau(:,:)=(1.0-fr_iv(:,:))*vtau(:,:)-ss_iov(:,:)      
     571  
     572! Also need ice/ocean stress on T points so that taum can be updated  
     573! This interpolation is already done in CICE so best to use those values  
     574      CALL cice2nemo(strocnxT,ztmp1,'T',-1.)  
     575      CALL cice2nemo(strocnyT,ztmp2,'T',-1.)  
     576  
     577! Update taum with modulus of ice-ocean stress  
     578! strocnxT and strocnyT are not weighted by ice fraction in CICE so must be done here  
     579taum(:,:)=(1.0-fr_i(:,:))*taum(:,:)+fr_i(:,:)*SQRT(ztmp1**2. + ztmp2**2.)  
    567580 
    568581! Freshwater fluxes  
     
    576589      ELSE IF (ksbc == jp_core) THEN 
    577590         emp(:,:)  = (1.0-fr_i(:,:))*emp(:,:)         
    578       ELSE IF (ksbc == jp_cpl) THEN 
     591      ELSE IF (ksbc == jp_purecpl) THEN 
    579592! emp_tot is set in sbc_cpl_ice_flx (called from cice_sbc_in above)  
    580593! This is currently as required with the coupling fields from the UM atmosphere 
     
    612625      ENDIF 
    613626! Take into account snow melting except for fully coupled when already in qns_tot 
    614       IF (ksbc == jp_cpl) THEN 
     627      IF (ksbc == jp_purecpl) THEN 
    615628         qsr(:,:)= qsr_tot(:,:) 
    616629         qns(:,:)= qns_tot(:,:) 
     
    647660 
    648661      CALL cice2nemo(aice,fr_i,'T', 1. ) 
    649       IF ( (ksbc == jp_flx).OR.(ksbc == jp_cpl) ) THEN 
     662      IF ( (ksbc == jp_flx).OR.(ksbc == jp_purecpl) ) THEN 
    650663         DO jl=1,ncat 
    651664            CALL cice2nemo(aicen(:,:,jl,:),a_i(:,:,jl), 'T', 1. ) 
     
    10941107   !!   Default option           Dummy module         NO CICE sea-ice model 
    10951108   !!---------------------------------------------------------------------- 
     1109   !! $Id$ 
    10961110CONTAINS 
    10971111 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_if.F90

    r5234 r5443  
    105105         fr_i(:,:) = eos_fzp( sss_m ) * tmask(:,:,1)      ! sea surface freezing temperature [Celcius] 
    106106 
    107          IF( lk_cpl )   a_i(:,:,1) = fr_i(:,:)          
     107         IF( ln_cpl )   a_i(:,:,1) = fr_i(:,:)          
    108108 
    109109         ! Flux and ice fraction computation 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_lim.F90

    r5234 r5443  
    1919   !!---------------------------------------------------------------------- 
    2020   !!   sbc_ice_lim  : sea-ice model time-stepping and update ocean sbc over ice-covered area 
    21    !!   lim_ctl       : alerts in case of ice model crash 
    22    !!   lim_prt_state : ice control print at a given grid point 
    2321   !!---------------------------------------------------------------------- 
    2422   USE oce             ! ocean dynamics and tracers 
    2523   USE dom_oce         ! ocean space and time domain 
    26    USE par_ice         ! sea-ice parameters 
    2724   USE ice             ! LIM-3: ice variables 
    28    USE iceini          ! LIM-3: ice initialisation 
     25   USE thd_ice         ! LIM-3: thermodynamical variables 
    2926   USE dom_ice         ! LIM-3: ice domain 
    3027 
     
    4037   USE limdyn          ! Ice dynamics 
    4138   USE limtrp          ! Ice transport 
     39   USE limhdf          ! Ice horizontal diffusion 
    4240   USE limthd          ! Ice thermodynamics 
    43    USE limitd_th       ! Thermodynamics on ice thickness distribution  
    4441   USE limitd_me       ! Mechanics on ice thickness distribution 
    4542   USE limsbc          ! sea surface boundary condition 
     
    4744   USE limwri          ! Ice outputs 
    4845   USE limrst          ! Ice restarts 
    49    USE limupdate1       ! update of global variables 
    50    USE limupdate2       ! update of global variables 
     46   USE limupdate1      ! update of global variables 
     47   USE limupdate2      ! update of global variables 
    5148   USE limvar          ! Ice variables switch 
     49 
     50   USE limmsh          ! LIM mesh 
     51   USE limistate       ! LIM initial state 
     52   USE limthd_sal      ! LIM ice thermodynamics: salinity 
    5253 
    5354   USE c1d             ! 1D vertical configuration 
     
    6061   USE prtctl          ! Print control 
    6162   USE lib_fortran     !  
     63   USE limctl 
    6264 
    6365#if defined key_bdy  
     
    6971 
    7072   PUBLIC sbc_ice_lim  ! routine called by sbcmod.F90 
    71    PUBLIC lim_prt_state 
     73   PUBLIC sbc_lim_init ! routine called by sbcmod.F90 
    7274    
    7375   !! * Substitutions 
     
    106108      INTEGER, INTENT(in) ::   kblk    ! type of bulk (=3 CLIO, =4 CORE, =5 COUPLED) 
    107109      !! 
    108       INTEGER  ::   jl      ! dummy loop index 
    109       REAL(wp) ::   zcoef   ! local scalar 
     110      INTEGER  ::   jl                 ! dummy loop index 
    110111      REAL(wp), POINTER, DIMENSION(:,:,:)   ::   zalb_os, zalb_cs  ! ice albedo under overcast/clear sky 
    111112      REAL(wp), POINTER, DIMENSION(:,:,:)   ::   zalb_ice          ! mean ice albedo (for coupled) 
     113      REAL(wp), POINTER, DIMENSION(:,:  )   ::   zutau_ice, zvtau_ice  
    112114      !!---------------------------------------------------------------------- 
    113115 
    114116      IF( nn_timing == 1 )  CALL timing_start('sbc_ice_lim') 
    115117 
    116       IF( kt == nit000 ) THEN 
    117          IF(lwp) WRITE(numout,*) 
    118          IF(lwp) WRITE(numout,*) 'sbc_ice_lim : update ocean surface boudary condition'  
    119          IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   via Louvain la Neuve Ice Model (LIM-3) time stepping' 
    120          ! 
    121          CALL ice_init 
    122          ! 
    123          IF( ln_nicep ) THEN      ! control print at a given point 
    124             jiindx = 15    ;   jjindx =  44 
    125             IF(lwp) WRITE(numout,*) ' The debugging point is : jiindx : ',jiindx, ' jjindx : ',jjindx 
    126          ENDIF 
    127       ENDIF 
    128  
    129       !                                        !----------------------! 
    130       IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN     !  Ice time-step only  ! 
    131          !                                     !----------------------! 
    132          !                                           !  Bulk Formulae ! 
    133          !                                           !----------------! 
    134          ! 
    135          u_oce(:,:) = ssu_m(:,:) * umask(:,:,1)                     ! mean surface ocean current at ice velocity point 
    136          v_oce(:,:) = ssv_m(:,:) * vmask(:,:,1)                    ! (C-grid dynamics :  U- & V-points as the ocean) 
    137          ! 
    138          t_bo(:,:) = ( eos_fzp( sss_m ) +  rt0 ) * tmask(:,:,1) + rt0 * ( 1. - tmask(:,:,1) )  ! masked sea surface freezing temperature [Kelvin] 
    139          !                                                                                  ! (set to rt0 over land) 
    140          !                                           ! Ice albedo 
    141          CALL wrk_alloc( jpi,jpj,jpl, zalb_os, zalb_cs, zalb_ice )       
    142  
    143          CALL albedo_ice( t_su, ht_i, ht_s, zalb_cs, zalb_os )  ! cloud-sky and overcast-sky ice albedos 
    144  
     118      !-----------------------! 
     119      ! --- Ice time step --- ! 
     120      !-----------------------! 
     121      IF( MOD( kt-1, nn_fsbc ) == 0 ) THEN 
     122 
     123         ! mean surface ocean current at ice velocity point (C-grid dynamics :  U- & V-points as the ocean) 
     124         u_oce(:,:) = ssu_m(:,:) * umask(:,:,1) 
     125         v_oce(:,:) = ssv_m(:,:) * vmask(:,:,1) 
     126          
     127         ! masked sea surface freezing temperature [Kelvin] (set to rt0 over land) 
     128         t_bo(:,:) = ( eos_fzp( sss_m ) + rt0 ) * tmask(:,:,1) + rt0 * ( 1._wp - tmask(:,:,1) )   
     129          
     130         ! Mask sea ice surface temperature (set to rt0 over land) 
     131         DO jl = 1, jpl 
     132            t_su(:,:,jl) = t_su(:,:,jl) * tmask(:,:,1) + rt0 * ( 1._wp - tmask(:,:,1) ) 
     133         END DO      
     134         ! 
     135         !------------------------------------------------!                                            
     136         ! --- Dynamical coupling with the atmosphere --- !                                            
     137         !------------------------------------------------! 
     138         ! It provides the following fields: 
     139         ! utau_ice, vtau_ice : surface ice stress (U- & V-points)   [N/m2] 
     140         !----------------------------------------------------------------- 
    145141         SELECT CASE( kblk ) 
    146          CASE( jp_core , jp_cpl )   ! CORE and COUPLED bulk formulations 
    147  
    148             ! albedo depends on cloud fraction because of non-linear spectral effects 
    149             zalb_ice(:,:,:) = ( 1. - cldf_ice ) * zalb_cs(:,:,:) + cldf_ice * zalb_os(:,:,:) 
    150             ! In CLIO the cloud fraction is read in the climatology and the all-sky albedo  
    151             ! (zalb_ice) is computed within the bulk routine 
    152              
     142         CASE( jp_clio    )   ;   CALL blk_ice_clio_tau                         ! CLIO bulk formulation             
     143         CASE( jp_core    )   ;   CALL blk_ice_core_tau                         ! CORE bulk formulation 
     144         CASE( jp_purecpl )   ;   CALL sbc_cpl_ice_tau( utau_ice , vtau_ice )   ! Coupled   formulation 
    153145         END SELECT 
    154146          
    155          !                                           ! Mask sea ice surface temperature 
    156          DO jl = 1, jpl 
    157             t_su(:,:,jl) = t_su(:,:,jl) +  rt0 * ( 1. - tmask(:,:,1) ) 
    158          END DO 
    159       
    160          ! Bulk formulae  - provides the following fields: 
    161          ! utau_ice, vtau_ice : surface ice stress                     (U- & V-points)   [N/m2] 
     147         IF( ln_mixcpl) THEN   ! Case of a mixed Bulk/Coupled formulation 
     148            CALL wrk_alloc( jpi,jpj    , zutau_ice, zvtau_ice) 
     149            CALL sbc_cpl_ice_tau( zutau_ice , zvtau_ice ) 
     150            utau_ice(:,:) = utau_ice(:,:) * xcplmask(:,:,0) + zutau_ice(:,:) * ( 1. - xcplmask(:,:,0) ) 
     151            vtau_ice(:,:) = vtau_ice(:,:) * xcplmask(:,:,0) + zvtau_ice(:,:) * ( 1. - xcplmask(:,:,0) ) 
     152            CALL wrk_dealloc( jpi,jpj  , zutau_ice, zvtau_ice) 
     153         ENDIF 
     154 
     155         !-------------------------------------------------------! 
     156         ! --- ice dynamics and transport (except in 1D case) ---! 
     157         !-------------------------------------------------------! 
     158         numit = numit + nn_fsbc                  ! Ice model time step 
     159         !                                                    
     160         CALL sbc_lim_bef                         ! Store previous ice values 
     161         CALL sbc_lim_diag0                       ! set diag of mass, heat and salt fluxes to 0 
     162         CALL lim_rst_opn( kt )                   ! Open Ice restart file 
     163         ! 
     164         IF( .NOT. lk_c1d ) THEN 
     165            ! 
     166            CALL lim_dyn( kt )                    ! Ice dynamics    ( rheology/dynamics )    
     167            ! 
     168            CALL lim_trp( kt )                    ! Ice transport   ( Advection/diffusion ) 
     169            ! 
     170            IF( nn_monocat /= 2 ) CALL lim_itd_me ! Mechanical redistribution ! (ridging/rafting) 
     171            ! 
     172#if defined key_bdy 
     173            CALL bdy_ice_lim( kt )                ! bdy ice thermo  
     174            IF( ln_icectl )       CALL lim_prt( kt, iiceprt, jiceprt, 1, ' - ice thermo bdy - ' ) 
     175#endif 
     176            ! 
     177            CALL lim_update1( kt )                ! Corrections 
     178            ! 
     179         ENDIF 
     180          
     181         ! previous lead fraction and ice volume for flux calculations 
     182         CALL sbc_lim_bef                         
     183         CALL lim_var_glo2eqv                     ! ht_i and ht_s for ice albedo calculation 
     184         CALL lim_var_agg(1)                      ! at_i for coupling (via pfrld)  
     185         pfrld(:,:)   = 1._wp - at_i(:,:) 
     186         phicif(:,:)  = vt_i(:,:) 
     187          
     188         !------------------------------------------------------!                                            
     189         ! --- Thermodynamical coupling with the atmosphere --- !                                            
     190         !------------------------------------------------------! 
     191         ! It provides the following fields: 
    162192         ! qsr_ice , qns_ice  : solar & non solar heat flux over ice   (T-point)         [W/m2] 
    163193         ! qla_ice            : latent heat flux over ice              (T-point)         [W/m2] 
     
    165195         ! tprecip , sprecip  : total & solid precipitation            (T-point)         [Kg/m2/s] 
    166196         ! fr1_i0  , fr2_i0   : 1sr & 2nd fraction of qsr penetration in ice             [%] 
    167          ! 
     197         !---------------------------------------------------------------------------------------- 
     198         CALL wrk_alloc( jpi,jpj,jpl, zalb_os, zalb_cs, zalb_ice ) 
     199         CALL albedo_ice( t_su, ht_i, ht_s, zalb_cs, zalb_os ) ! cloud-sky and overcast-sky ice albedos 
     200 
    168201         SELECT CASE( kblk ) 
    169202         CASE( jp_clio )                                       ! CLIO bulk formulation 
    170             CALL blk_ice_clio( t_su , zalb_cs    , zalb_os    , zalb_ice  ,               & 
    171                &                      utau_ice   , vtau_ice   , qns_ice   , qsr_ice   ,   & 
    172                &                      qla_ice    , dqns_ice   , dqla_ice  ,               & 
    173                &                      tprecip    , sprecip    ,                           & 
    174                &                      fr1_i0     , fr2_i0     , cp_ice_msh, jpl  ) 
    175             !          
    176             IF( nn_limflx /= 2 )   CALL ice_lim_flx( t_su, zalb_ice, qns_ice, qsr_ice ,   & 
    177                &                                           dqns_ice, qla_ice, dqla_ice, nn_limflx ) 
    178  
     203            ! In CLIO the cloud fraction is read in the climatology and the all-sky albedo  
     204            ! (zalb_ice) is computed within the bulk routine 
     205            CALL blk_ice_clio_flx( t_su, zalb_cs, zalb_os, zalb_ice ) 
     206            IF( ln_mixcpl      ) CALL sbc_cpl_ice_flx( p_frld=pfrld, palbi=zalb_ice, psst=sst_m, pist=t_su ) 
     207            IF( nn_limflx /= 2 ) CALL ice_lim_flx( t_su, zalb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_limflx ) 
    179208         CASE( jp_core )                                       ! CORE bulk formulation 
    180             CALL blk_ice_core( t_su , u_ice     , v_ice     , zalb_ice   ,               & 
    181                &                      utau_ice  , vtau_ice  , qns_ice    , qsr_ice   ,   & 
    182                &                      qla_ice   , dqns_ice  , dqla_ice   ,               & 
    183                &                      tprecip   , sprecip   ,                            & 
    184                &                      fr1_i0    , fr2_i0    , cp_ice_msh, jpl  ) 
    185                ! 
    186             IF( nn_limflx /= 2 )   CALL ice_lim_flx( t_su, zalb_ice, qns_ice, qsr_ice ,   & 
    187                &                                           dqns_ice, qla_ice, dqla_ice, nn_limflx ) 
    188             ! 
    189          CASE ( jp_cpl ) 
    190              
    191             CALL sbc_cpl_ice_tau( utau_ice , vtau_ice ) 
    192  
    193             ! MV -> seb  
    194 !           CALL sbc_cpl_ice_flx( p_frld=ato_i, palbi=zalb_ice, psst=sst_m, pist=t_su    ) 
    195  
    196 !           IF( nn_limflx == 2 )   CALL ice_lim_flx( t_su, zalb_ice, qns_ice, qsr_ice ,   & 
    197 !              &                                           dqns_ice, qla_ice, dqla_ice, nn_limflx ) 
    198 !           ! Latent heat flux is forced to 0 in coupled : 
    199 !           !  it is included in qns (non-solar heat flux) 
    200 !           qla_ice  (:,:,:) = 0._wp 
    201 !           dqla_ice (:,:,:) = 0._wp 
    202             ! END MV -> seb 
    203             ! 
     209            ! albedo depends on cloud fraction because of non-linear spectral effects 
     210            zalb_ice(:,:,:) = ( 1. - cldf_ice ) * zalb_cs(:,:,:) + cldf_ice * zalb_os(:,:,:) 
     211            CALL blk_ice_core_flx( t_su, zalb_ice ) 
     212            IF( ln_mixcpl      ) CALL sbc_cpl_ice_flx( p_frld=pfrld, palbi=zalb_ice, psst=sst_m, pist=t_su ) 
     213            IF( nn_limflx /= 2 ) CALL ice_lim_flx( t_su, zalb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_limflx ) 
     214         CASE ( jp_purecpl ) 
     215            ! albedo depends on cloud fraction because of non-linear spectral effects 
     216            zalb_ice(:,:,:) = ( 1. - cldf_ice ) * zalb_cs(:,:,:) + cldf_ice * zalb_os(:,:,:) 
     217                                 CALL sbc_cpl_ice_flx( p_frld=pfrld, palbi=zalb_ice, psst=sst_m, pist=t_su ) 
     218            IF( nn_limflx == 2 ) CALL ice_lim_flx( t_su, zalb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_limflx ) 
     219            ! Latent heat flux is forced to 0 in coupled: it is included in qns (non-solar heat flux) 
     220            evap_ice  (:,:,:) = 0._wp 
     221            devap_ice (:,:,:) = 0._wp 
    204222         END SELECT 
    205           
    206          !                                           !----------------------! 
    207          !                                           ! LIM-3  time-stepping ! 
    208          !                                           !----------------------! 
    209          !  
    210          numit = numit + nn_fsbc                     ! Ice model time step 
    211          ! 
    212          !                                           ! Store previous ice values 
    213          a_i_b  (:,:,:)   = a_i  (:,:,:)     ! ice area 
    214          e_i_b  (:,:,:,:) = e_i  (:,:,:,:)   ! ice thermal energy 
    215          v_i_b  (:,:,:)   = v_i  (:,:,:)     ! ice volume 
    216          v_s_b  (:,:,:)   = v_s  (:,:,:)     ! snow volume  
    217          e_s_b  (:,:,:,:) = e_s  (:,:,:,:)   ! snow thermal energy 
    218          smv_i_b(:,:,:)   = smv_i(:,:,:)     ! salt content 
    219          oa_i_b (:,:,:)   = oa_i (:,:,:)     ! areal age content 
    220          u_ice_b(:,:)     = u_ice(:,:) 
    221          v_ice_b(:,:)     = v_ice(:,:) 
    222  
    223          ! salt, heat and mass fluxes 
    224          sfx    (:,:) = 0._wp   ; 
    225          sfx_bri(:,:) = 0._wp   ;  
    226          sfx_sni(:,:) = 0._wp   ;   sfx_opw(:,:) = 0._wp 
    227          sfx_bog(:,:) = 0._wp   ;   sfx_dyn(:,:) = 0._wp 
    228          sfx_bom(:,:) = 0._wp   ;   sfx_sum(:,:) = 0._wp 
    229          sfx_res(:,:) = 0._wp 
    230  
    231          wfx_snw(:,:) = 0._wp   ;   wfx_ice(:,:) = 0._wp 
    232          wfx_sni(:,:) = 0._wp   ;   wfx_opw(:,:) = 0._wp 
    233          wfx_bog(:,:) = 0._wp   ;   wfx_dyn(:,:) = 0._wp 
    234          wfx_bom(:,:) = 0._wp   ;   wfx_sum(:,:) = 0._wp 
    235          wfx_res(:,:) = 0._wp   ;   wfx_sub(:,:) = 0._wp 
    236          wfx_spr(:,:) = 0._wp   ;    
    237  
    238          hfx_in (:,:) = 0._wp   ;   hfx_out(:,:) = 0._wp 
    239          hfx_thd(:,:) = 0._wp   ;    
    240          hfx_snw(:,:) = 0._wp   ;   hfx_opw(:,:) = 0._wp 
    241          hfx_bog(:,:) = 0._wp   ;   hfx_dyn(:,:) = 0._wp 
    242          hfx_bom(:,:) = 0._wp   ;   hfx_sum(:,:) = 0._wp 
    243          hfx_res(:,:) = 0._wp   ;   hfx_sub(:,:) = 0._wp 
    244          hfx_spr(:,:) = 0._wp   ;   hfx_dif(:,:) = 0._wp  
    245          hfx_err(:,:) = 0._wp   ;   hfx_err_rem(:,:) = 0._wp 
    246  
    247                           CALL lim_rst_opn( kt )     ! Open Ice restart file 
    248          ! 
    249          IF( ln_nicep )   CALL lim_prt_state( kt, jiindx, jjindx, 1, ' - Beginning the time step - ' )   ! control print 
    250          ! ---------------------------------------------- 
    251          ! ice dynamics and transport (except in 1D case) 
    252          ! ---------------------------------------------- 
    253          IF( .NOT. lk_c1d ) THEN 
    254                           CALL lim_dyn( kt )              ! Ice dynamics    ( rheology/dynamics ) 
    255                           CALL lim_trp( kt )              ! Ice transport   ( Advection/diffusion ) 
    256                           CALL lim_var_glo2eqv            ! equivalent variables, requested for rafting 
    257          IF( ln_nicep )   CALL lim_prt_state( kt, jiindx, jjindx,-1, ' - ice dyn & trp - ' )   ! control print 
    258                           CALL lim_itd_me                 ! Mechanical redistribution ! (ridging/rafting) 
    259                           CALL lim_var_agg( 1 )  
    260 #if defined key_bdy 
    261                           ! bdy ice thermo  
    262                           CALL lim_var_glo2eqv            ! equivalent variables 
    263                           CALL bdy_ice_lim( kt ) 
    264                           CALL lim_itd_me_zapsmall 
    265                           CALL lim_var_agg(1) 
    266          IF( ln_nicep )   CALL lim_prt_state( kt, jiindx, jjindx, 1, ' - ice thermo bdy - ' )   ! control print 
    267 #endif 
    268                           CALL lim_update1 
    269          ENDIF 
    270 !                         !- Change old values for new values 
    271                           u_ice_b(:,:)     = u_ice(:,:) 
    272                           v_ice_b(:,:)     = v_ice(:,:) 
    273                           a_i_b  (:,:,:)   = a_i  (:,:,:) 
    274                           v_s_b  (:,:,:)   = v_s  (:,:,:) 
    275                           v_i_b  (:,:,:)   = v_i  (:,:,:) 
    276                           e_s_b  (:,:,:,:) = e_s  (:,:,:,:) 
    277                           e_i_b  (:,:,:,:) = e_i  (:,:,:,:) 
    278                           oa_i_b (:,:,:)   = oa_i (:,:,:) 
    279                           smv_i_b(:,:,:)   = smv_i(:,:,:) 
    280   
    281          ! ---------------------------------------------- 
    282          ! ice thermodynamic 
    283          ! ---------------------------------------------- 
    284                           CALL lim_var_glo2eqv            ! equivalent variables 
    285                           CALL lim_var_agg(1)             ! aggregate ice categories 
    286                           ! previous lead fraction and ice volume for flux calculations 
    287                           pfrld(:,:)   = 1._wp - at_i(:,:) 
    288                           phicif(:,:)  = vt_i(:,:) 
    289  
    290                           ! MV -> seb 
    291                           SELECT CASE( kblk ) 
    292                              CASE ( jp_cpl ) 
    293                              CALL sbc_cpl_ice_flx( p_frld=pfrld, palbi=zalb_ice, psst=sst_m, pist=t_su    ) 
    294                              IF( nn_limflx == 2 )   CALL ice_lim_flx( t_su, zalb_ice, qns_ice, qsr_ice ,   & 
    295                           &                                           dqns_ice, qla_ice, dqla_ice, nn_limflx ) 
    296                            ! Latent heat flux is forced to 0 in coupled : 
    297                            !  it is included in qns (non-solar heat flux) 
    298                              qla_ice  (:,:,:) = 0._wp 
    299                              dqla_ice (:,:,:) = 0._wp 
    300                           END SELECT 
    301                           ! END MV -> seb 
    302                           ! 
    303                           CALL lim_var_bv                 ! bulk brine volume (diag) 
    304                           CALL lim_thd( kt )              ! Ice thermodynamics  
    305                           zcoef = rdt_ice /rday           !  Ice natural aging 
    306                           oa_i(:,:,:) = oa_i(:,:,:) + a_i(:,:,:) * zcoef 
    307          IF( ln_nicep )   CALL lim_prt_state( kt, jiindx, jjindx, 1, ' - ice thermodyn. - ' )   ! control print 
    308                           CALL lim_itd_th( kt )           !  Remap ice categories, lateral accretion  ! 
    309                           CALL lim_var_agg( 1 )           ! requested by limupdate 
    310                           CALL lim_update2                ! Global variables update 
    311  
    312                           CALL lim_var_glo2eqv            ! equivalent variables (outputs) 
    313                           CALL lim_var_agg(2)             ! aggregate ice thickness categories 
    314          IF( ln_nicep )   CALL lim_prt_state( kt, jiindx, jjindx, 2, ' - Final state - ' )   ! control print 
    315          ! 
    316                           CALL lim_sbc_flx( kt )     ! Update surface ocean mass, heat and salt fluxes 
    317          ! 
    318          IF( ln_nicep )   CALL lim_prt_state( kt, jiindx, jjindx, 3, ' - Final state lim_sbc - ' )   ! control print 
    319          ! 
    320          !                                           ! Diagnostics and outputs  
    321          IF (ln_limdiaout) CALL lim_diahsb 
    322  
    323                           CALL lim_wri( 1  )              ! Ice outputs  
    324  
     223         CALL wrk_dealloc( jpi,jpj,jpl, zalb_os, zalb_cs, zalb_ice ) 
     224 
     225         !----------------------------! 
     226         ! --- ice thermodynamics --- ! 
     227         !----------------------------! 
     228         CALL lim_thd( kt )                         ! Ice thermodynamics       
     229         ! 
     230         CALL lim_update2( kt )                     ! Corrections 
     231         ! 
     232         CALL lim_sbc_flx( kt )                     ! Update surface ocean mass, heat and salt fluxes 
     233         ! 
     234         IF(ln_limdiaout) CALL lim_diahsb           ! Diagnostics and outputs  
     235         ! 
     236         CALL lim_wri( 1 )                          ! Ice outputs  
     237         ! 
    325238         IF( kt == nit000 .AND. ln_rstart )   & 
    326             &             CALL iom_close( numrir )        ! clem: close input ice restart file 
    327          ! 
    328          IF( lrst_ice )   CALL lim_rst_write( kt )        ! Ice restart file  
    329                           CALL lim_var_glo2eqv            ! ??? 
    330          ! 
    331          IF( ln_nicep )   CALL lim_ctl( kt )              ! alerts in case of model crash 
    332          ! 
    333          CALL wrk_dealloc( jpi,jpj,jpl, zalb_os, zalb_cs, zalb_ice ) 
    334          ! 
    335       ENDIF                                    ! End sea-ice time step only 
    336  
    337       !                                        !--------------------------! 
    338       !                                        !  at all ocean time step  ! 
    339       !                                        !--------------------------! 
    340       !                                                
    341       !                                              ! Update surface ocean stresses (only in ice-dynamic case) 
    342       !                                                   ! otherwise the atm.-ocean stresses are used everywhere 
     239            &             CALL iom_close( numrir )  ! close input ice restart file 
     240         ! 
     241         IF( lrst_ice )   CALL lim_rst_write( kt )  ! Ice restart file  
     242         ! 
     243         IF( ln_icectl )  CALL lim_ctl( kt )        ! alerts in case of model crash 
     244         ! 
     245      ENDIF   ! End sea-ice time step only 
     246 
     247      !-------------------------! 
     248      ! --- Ocean time step --- ! 
     249      !-------------------------! 
     250      ! Update surface ocean stresses (only in ice-dynamic case) otherwise the atm.-ocean stresses are used everywhere 
    343251      IF( ln_limdyn )     CALL lim_sbc_tau( kt, ub(:,:,1), vb(:,:,1) )  ! using before instantaneous surf. currents 
    344252!!gm   remark, the ocean-ice stress is not saved in ice diag call above .....  find a solution!!! 
    345  
    346       ! 
    347       IF( nn_timing == 1 )  CALL timing_stop('sbc_ice_lim') 
     253      ! 
     254      IF( nn_timing == 1 ) CALL timing_stop('sbc_ice_lim') 
    348255      ! 
    349256   END SUBROUTINE sbc_ice_lim 
    350257    
     258 
     259   SUBROUTINE sbc_lim_init 
     260      !!---------------------------------------------------------------------- 
     261      !!                  ***  ROUTINE sbc_lim_init  *** 
     262      !! 
     263      !! ** purpose :   Allocate all the dynamic arrays of the LIM-3 modules 
     264      !!---------------------------------------------------------------------- 
     265      INTEGER :: ierr 
     266      !!---------------------------------------------------------------------- 
     267      IF(lwp) WRITE(numout,*) 
     268      IF(lwp) WRITE(numout,*) 'sbc_ice_lim : update ocean surface boudary condition'  
     269      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~   via Louvain la Neuve Ice Model (LIM-3) time stepping' 
     270      ! 
     271                                       ! Open the reference and configuration namelist files and namelist output file  
     272      CALL ctl_opn( numnam_ice_ref, 'namelist_ice_ref',    'OLD',     'FORMATTED', 'SEQUENTIAL', -1, numout, lwp )  
     273      CALL ctl_opn( numnam_ice_cfg, 'namelist_ice_cfg',    'OLD',     'FORMATTED', 'SEQUENTIAL', -1, numout, lwp ) 
     274      IF(lwm) CALL ctl_opn( numoni, 'output.namelist.ice', 'UNKNOWN', 'FORMATTED', 'SEQUENTIAL', -1, numout, lwp, 1 ) 
     275 
     276      CALL ice_run                     ! set some ice run parameters 
     277      ! 
     278      !                                ! Allocate the ice arrays 
     279      ierr =        ice_alloc        ()      ! ice variables 
     280      ierr = ierr + dom_ice_alloc    ()      ! domain 
     281      ierr = ierr + sbc_ice_alloc    ()      ! surface forcing 
     282      ierr = ierr + thd_ice_alloc    ()      ! thermodynamics 
     283      ierr = ierr + lim_itd_me_alloc ()      ! ice thickness distribution - mechanics 
     284      ! 
     285      IF( lk_mpp    )   CALL mpp_sum( ierr ) 
     286      IF( ierr /= 0 )   CALL ctl_stop('STOP', 'sbc_lim_init : unable to allocate ice arrays') 
     287      ! 
     288      !                                ! adequation jpk versus ice/snow layers/categories 
     289      IF( jpl > jpk .OR. (nlay_i+1) > jpk .OR. nlay_s > jpk )   & 
     290         &      CALL ctl_stop( 'STOP',                          & 
     291         &     'sbc_lim_init: the 3rd dimension of workspace arrays is too small.',   & 
     292         &     'use more ocean levels or less ice/snow layers/categories.' ) 
     293      ! 
     294      CALL lim_itd_init                ! ice thickness distribution initialization 
     295      ! 
     296      CALL lim_hdf_init                ! set ice horizontal diffusion computation parameters 
     297      ! 
     298      CALL lim_thd_init                ! set ice thermodynics parameters 
     299      ! 
     300      CALL lim_thd_sal_init            ! set ice salinity parameters 
     301      ! 
     302      CALL lim_msh                     ! ice mesh initialization 
     303      ! 
     304      CALL lim_itd_me_init             ! ice thickness distribution initialization for mecanical deformation 
     305      !                                ! Initial sea-ice state 
     306      IF( .NOT. ln_rstart ) THEN              ! start from rest: sea-ice deduced from sst 
     307         numit = 0 
     308         numit = nit000 - 1 
     309         CALL lim_istate 
     310      ELSE                                    ! start from a restart file 
     311         CALL lim_rst_read 
     312         numit = nit000 - 1 
     313      ENDIF 
     314      CALL lim_var_agg(1) 
     315      CALL lim_var_glo2eqv 
     316      ! 
     317      CALL lim_sbc_init                 ! ice surface boundary condition    
     318      ! 
     319      fr_i(:,:)     = at_i(:,:)         ! initialisation of sea-ice fraction 
     320      tn_ice(:,:,:) = t_su(:,:,:)       ! initialisation of surface temp for coupled simu 
     321      ! 
     322      nstart = numit  + nn_fsbc       
     323      nitrun = nitend - nit000 + 1  
     324      nlast  = numit  + nitrun  
     325      ! 
     326      IF( nstock == 0 )   nstock = nlast + 1 
     327      ! 
     328   END SUBROUTINE sbc_lim_init 
     329 
     330 
     331   SUBROUTINE ice_run 
     332      !!------------------------------------------------------------------- 
     333      !!                  ***  ROUTINE ice_run *** 
     334      !!                  
     335      !! ** Purpose :   Definition some run parameter for ice model 
     336      !! 
     337      !! ** Method  :   Read the namicerun namelist and check the parameter  
     338      !!              values called at the first timestep (nit000) 
     339      !! 
     340      !! ** input   :   Namelist namicerun 
     341      !!------------------------------------------------------------------- 
     342      INTEGER  ::   ios                 ! Local integer output status for namelist read 
     343      NAMELIST/namicerun/ jpl, nlay_i, nlay_s, cn_icerst_in, cn_icerst_indir, cn_icerst_out, cn_icerst_outdir,  & 
     344         &                ln_limdyn, rn_amax, ln_limdiahsb, ln_limdiaout, ln_icectl, iiceprt, jiceprt   
     345      !!------------------------------------------------------------------- 
     346      !                     
     347      REWIND( numnam_ice_ref )              ! Namelist namicerun in reference namelist : Parameters for ice 
     348      READ  ( numnam_ice_ref, namicerun, IOSTAT = ios, ERR = 901) 
     349901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namicerun in reference namelist', lwp ) 
     350 
     351      REWIND( numnam_ice_cfg )              ! Namelist namicerun in configuration namelist : Parameters for ice 
     352      READ  ( numnam_ice_cfg, namicerun, IOSTAT = ios, ERR = 902 ) 
     353902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namicerun in configuration namelist', lwp ) 
     354      IF(lwm) WRITE ( numoni, namicerun ) 
     355      ! 
     356      ! 
     357      IF(lwp) THEN                        ! control print 
     358         WRITE(numout,*) 
     359         WRITE(numout,*) 'ice_run : ice share parameters for dynamics/advection/thermo of sea-ice' 
     360         WRITE(numout,*) ' ~~~~~~' 
     361         WRITE(numout,*) '   number of ice  categories                               = ', jpl 
     362         WRITE(numout,*) '   number of ice  layers                                   = ', nlay_i 
     363         WRITE(numout,*) '   number of snow layers                                   = ', nlay_s 
     364         WRITE(numout,*) '   switch for ice dynamics (1) or not (0)      ln_limdyn   = ', ln_limdyn 
     365         WRITE(numout,*) '   maximum ice concentration                               = ', rn_amax  
     366         WRITE(numout,*) '   Diagnose heat/salt budget or not          ln_limdiahsb  = ', ln_limdiahsb 
     367         WRITE(numout,*) '   Output   heat/salt budget or not          ln_limdiaout  = ', ln_limdiaout 
     368         WRITE(numout,*) '   control prints in ocean.out for (i,j)=(iiceprt,jiceprt) = ', ln_icectl 
     369         WRITE(numout,*) '   i-index for control prints (ln_icectl=true)             = ', iiceprt 
     370         WRITE(numout,*) '   j-index for control prints (ln_icectl=true)             = ', jiceprt 
     371      ENDIF 
     372      ! 
     373      ! sea-ice timestep and inverse 
     374      rdt_ice   = nn_fsbc * rdttra(1)   
     375      r1_rdtice = 1._wp / rdt_ice  
     376 
     377      ! inverse of nlay_i and nlay_s 
     378      r1_nlay_i = 1._wp / REAL( nlay_i, wp ) 
     379      r1_nlay_s = 1._wp / REAL( nlay_s, wp ) 
     380      ! 
     381#if defined key_bdy 
     382      IF( lwp .AND. ln_limdiahsb )  CALL ctl_warn('online conservation check activated but it does not work with BDY') 
     383#endif 
     384      ! 
     385   END SUBROUTINE ice_run 
     386 
     387 
     388   SUBROUTINE lim_itd_init 
     389      !!------------------------------------------------------------------ 
     390      !!                ***  ROUTINE lim_itd_init *** 
     391      !! 
     392      !! ** Purpose :   Initializes the ice thickness distribution 
     393      !! ** Method  :   ... 
     394      !! ** input   :   Namelist namiceitd 
     395      !!------------------------------------------------------------------- 
     396      INTEGER  ::   ios                 ! Local integer output status for namelist read 
     397      NAMELIST/namiceitd/ nn_catbnd, rn_himean 
     398      ! 
     399      INTEGER  ::   jl                   ! dummy loop index 
     400      REAL(wp) ::   zc1, zc2, zc3, zx1   ! local scalars 
     401      REAL(wp) ::   zhmax, znum, zden, zalpha ! 
     402      !!------------------------------------------------------------------ 
     403      ! 
     404      REWIND( numnam_ice_ref )              ! Namelist namiceitd in reference namelist : Parameters for ice 
     405      READ  ( numnam_ice_ref, namiceitd, IOSTAT = ios, ERR = 903) 
     406903   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namiceitd in reference namelist', lwp ) 
     407 
     408      REWIND( numnam_ice_cfg )              ! Namelist namiceitd in configuration namelist : Parameters for ice 
     409      READ  ( numnam_ice_cfg, namiceitd, IOSTAT = ios, ERR = 904 ) 
     410904   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namiceitd in configuration namelist', lwp ) 
     411      IF(lwm) WRITE ( numoni, namiceitd ) 
     412      ! 
     413      ! 
     414      IF(lwp) THEN                        ! control print 
     415         WRITE(numout,*) 
     416         WRITE(numout,*) 'ice_itd : ice cat distribution' 
     417         WRITE(numout,*) ' ~~~~~~' 
     418         WRITE(numout,*) '   shape of ice categories distribution                          nn_catbnd = ', nn_catbnd 
     419         WRITE(numout,*) '   mean ice thickness in the domain (only active if nn_catbnd=2) rn_himean = ', rn_himean 
     420      ENDIF 
     421 
     422      !---------------------------------- 
     423      !- Thickness categories boundaries  
     424      !---------------------------------- 
     425      IF(lwp) WRITE(numout,*) 
     426      IF(lwp) WRITE(numout,*) 'lim_itd_init : Initialization of ice cat distribution ' 
     427      IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~' 
     428 
     429      hi_max(:) = 0._wp 
     430 
     431      SELECT CASE ( nn_catbnd  )        
     432                                   !---------------------- 
     433         CASE (1)                  ! tanh function (CICE) 
     434                                   !---------------------- 
     435         zc1 =  3._wp / REAL( jpl, wp ) 
     436         zc2 = 10._wp * zc1 
     437         zc3 =  3._wp 
     438 
     439         DO jl = 1, jpl 
     440            zx1 = REAL( jl-1, wp ) / REAL( jpl, wp ) 
     441            hi_max(jl) = hi_max(jl-1) + zc1 + zc2 * (1._wp + TANH( zc3 * (zx1 - 1._wp ) ) ) 
     442         END DO 
     443 
     444                                   !---------------------- 
     445         CASE (2)                  ! h^(-alpha) function 
     446                                   !---------------------- 
     447         zalpha = 0.05             ! exponent of the transform function 
     448 
     449         zhmax  = 3.*rn_himean 
     450 
     451         DO jl = 1, jpl  
     452            znum = jpl * ( zhmax+1 )**zalpha 
     453            zden = ( jpl - jl ) * ( zhmax+1 )**zalpha + jl 
     454            hi_max(jl) = ( znum / zden )**(1./zalpha) - 1 
     455         END DO 
     456 
     457      END SELECT 
     458 
     459      DO jl = 1, jpl 
     460         hi_mean(jl) = ( hi_max(jl) + hi_max(jl-1) ) * 0.5_wp 
     461      END DO 
     462 
     463      ! Set hi_max(jpl) to a big value to ensure that all ice is thinner than hi_max(jpl) 
     464      hi_max(jpl) = 99._wp 
     465 
     466      IF(lwp) WRITE(numout,*) ' Thickness category boundaries ' 
     467      IF(lwp) WRITE(numout,*) ' hi_max ', hi_max(0:jpl) 
     468      ! 
     469   END SUBROUTINE lim_itd_init 
     470 
    351471    
    352       SUBROUTINE ice_lim_flx( ptn_ice, palb_ice, pqns_ice, pqsr_ice,   & 
    353          &                          pdqn_ice, pqla_ice, pdql_ice, k_limflx ) 
     472   SUBROUTINE ice_lim_flx( ptn_ice, palb_ice, pqns_ice, pqsr_ice, pdqn_ice, pevap_ice, pdevap_ice, k_limflx ) 
    354473      !!--------------------------------------------------------------------- 
    355       !!                  ***  ROUTINE sbc_ice_lim  *** 
     474      !!                  ***  ROUTINE ice_lim_flx  *** 
    356475      !!                    
    357476      !! ** Purpose :   update the ice surface boundary condition by averaging and / or 
     
    369488      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pqsr_ice   ! net solar flux 
    370489      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pdqn_ice   ! non solar flux sensitivity 
    371       REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pqla_ice   ! latent heat flux 
    372       REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pdql_ice   ! latent heat flux sensitivity 
     490      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pevap_ice  ! sublimation 
     491      REAL(wp), DIMENSION(:,:,:), INTENT(inout) ::   pdevap_ice ! sublimation sensitivity 
    373492      ! 
    374493      INTEGER  ::   jl      ! dummy loop index 
     
    379498      REAL(wp), POINTER, DIMENSION(:,:) :: z_qsr_m   ! Mean solar heat flux over all categories 
    380499      REAL(wp), POINTER, DIMENSION(:,:) :: z_qns_m   ! Mean non solar heat flux over all categories 
    381       REAL(wp), POINTER, DIMENSION(:,:) :: z_qla_m   ! Mean latent heat flux over all categories 
     500      REAL(wp), POINTER, DIMENSION(:,:) :: z_evap_m  ! Mean sublimation over all categories 
    382501      REAL(wp), POINTER, DIMENSION(:,:) :: z_dqn_m   ! Mean d(qns)/dT over all categories 
    383       REAL(wp), POINTER, DIMENSION(:,:) :: z_dql_m   ! Mean d(qla)/dT over all categories 
     502      REAL(wp), POINTER, DIMENSION(:,:) :: z_devap_m ! Mean d(evap)/dT over all categories 
    384503      !!---------------------------------------------------------------------- 
    385504 
     
    389508      SELECT CASE( k_limflx )                              !==  averaged on all ice categories  ==! 
    390509      CASE( 0 , 1 ) 
    391          CALL wrk_alloc( jpi,jpj, z_qsr_m, z_qns_m, z_qla_m, z_dqn_m, z_dql_m) 
    392          ! 
    393          z_qns_m(:,:) = fice_ice_ave ( pqns_ice (:,:,:) ) 
    394          z_qsr_m(:,:) = fice_ice_ave ( pqsr_ice (:,:,:) ) 
    395          z_dqn_m(:,:) = fice_ice_ave ( pdqn_ice (:,:,:) ) 
    396          z_qla_m(:,:) = fice_ice_ave ( pqla_ice (:,:,:) ) 
    397          z_dql_m(:,:) = fice_ice_ave ( pdql_ice (:,:,:) ) 
     510         CALL wrk_alloc( jpi,jpj, z_qsr_m, z_qns_m, z_evap_m, z_dqn_m, z_devap_m) 
     511         ! 
     512         z_qns_m  (:,:) = fice_ice_ave ( pqns_ice (:,:,:) ) 
     513         z_qsr_m  (:,:) = fice_ice_ave ( pqsr_ice (:,:,:) ) 
     514         z_dqn_m  (:,:) = fice_ice_ave ( pdqn_ice (:,:,:) ) 
     515         z_evap_m (:,:) = fice_ice_ave ( pevap_ice (:,:,:) ) 
     516         z_devap_m(:,:) = fice_ice_ave ( pdevap_ice (:,:,:) ) 
    398517         DO jl = 1, jpl 
    399             pdqn_ice(:,:,jl) = z_dqn_m(:,:) 
    400             pdql_ice(:,:,jl) = z_dql_m(:,:) 
     518            pdqn_ice  (:,:,jl) = z_dqn_m(:,:) 
     519            pdevap_ice(:,:,jl) = z_devap_m(:,:) 
    401520         END DO 
    402521         ! 
    403522         DO jl = 1, jpl 
    404             pqns_ice(:,:,jl) = z_qns_m(:,:) 
    405             pqsr_ice(:,:,jl) = z_qsr_m(:,:) 
    406             pqla_ice(:,:,jl) = z_qla_m(:,:) 
     523            pqns_ice (:,:,jl) = z_qns_m(:,:) 
     524            pqsr_ice (:,:,jl) = z_qsr_m(:,:) 
     525            pevap_ice(:,:,jl) = z_evap_m(:,:) 
    407526         END DO 
    408527         ! 
    409          CALL wrk_dealloc( jpi,jpj, z_qsr_m, z_qns_m, z_qla_m, z_dqn_m, z_dql_m) 
     528         CALL wrk_dealloc( jpi,jpj, z_qsr_m, z_qns_m, z_evap_m, z_dqn_m, z_devap_m) 
    410529      END SELECT 
    411530 
     
    417536         ztem_m(:,:) = fice_ice_ave ( ptn_ice  (:,:,:) )  
    418537         DO jl = 1, jpl 
    419             pqns_ice(:,:,jl) = pqns_ice(:,:,jl) + pdqn_ice(:,:,jl) * (ptn_ice(:,:,jl) - ztem_m(:,:)) 
    420             pqla_ice(:,:,jl) = pqla_ice(:,:,jl) + pdql_ice(:,:,jl) * (ptn_ice(:,:,jl) - ztem_m(:,:)) 
    421             pqsr_ice(:,:,jl) = pqsr_ice(:,:,jl) * ( 1._wp - palb_ice(:,:,jl) ) / ( 1._wp - zalb_m(:,:) )  
     538            pqns_ice (:,:,jl) = pqns_ice (:,:,jl) + pdqn_ice  (:,:,jl) * ( ptn_ice(:,:,jl) - ztem_m(:,:) ) 
     539            pevap_ice(:,:,jl) = pevap_ice(:,:,jl) + pdevap_ice(:,:,jl) * ( ptn_ice(:,:,jl) - ztem_m(:,:) ) 
     540            pqsr_ice (:,:,jl) = pqsr_ice (:,:,jl) * ( 1._wp - palb_ice(:,:,jl) ) / ( 1._wp - zalb_m(:,:) )  
    422541         END DO 
    423542         ! 
     
    428547      ! 
    429548   END SUBROUTINE ice_lim_flx 
    430     
    431     
    432    SUBROUTINE lim_ctl( kt ) 
    433       !!----------------------------------------------------------------------- 
    434       !!                   ***  ROUTINE lim_ctl ***  
    435       !!                  
    436       !! ** Purpose :   Alerts in case of model crash 
    437       !!------------------------------------------------------------------- 
    438       INTEGER, INTENT(in) ::   kt      ! ocean time step 
    439       INTEGER  ::   ji, jj, jk,  jl   ! dummy loop indices 
    440       INTEGER  ::   inb_altests       ! number of alert tests (max 20) 
    441       INTEGER  ::   ialert_id         ! number of the current alert 
    442       REAL(wp) ::   ztmelts           ! ice layer melting point 
    443       CHARACTER (len=30), DIMENSION(20)      ::   cl_alname   ! name of alert 
    444       INTEGER           , DIMENSION(20)      ::   inb_alp     ! number of alerts positive 
    445       !!------------------------------------------------------------------- 
    446  
    447       inb_altests = 10 
    448       inb_alp(:)  =  0 
    449  
    450       ! Alert if incompatible volume and concentration 
    451       ialert_id = 2 ! reference number of this alert 
    452       cl_alname(ialert_id) = ' Incompat vol and con         '    ! name of the alert 
    453  
    454       DO jl = 1, jpl 
    455          DO jj = 1, jpj 
    456             DO ji = 1, jpi 
    457                IF(  v_i(ji,jj,jl) /= 0._wp   .AND.   a_i(ji,jj,jl) == 0._wp   ) THEN 
    458                   !WRITE(numout,*) ' ALERTE 2 :   Incompatible volume and concentration ' 
    459                   !WRITE(numout,*) ' at_i     ', at_i(ji,jj) 
    460                   !WRITE(numout,*) ' Point - category', ji, jj, jl 
    461                   !WRITE(numout,*) ' a_i *** a_i_b   ', a_i      (ji,jj,jl), a_i_b  (ji,jj,jl) 
    462                   !WRITE(numout,*) ' v_i *** v_i_b   ', v_i      (ji,jj,jl), v_i_b  (ji,jj,jl) 
    463                   !WRITE(numout,*) ' d_a_i_thd/trp   ', d_a_i_thd(ji,jj,jl), d_a_i_trp(ji,jj,jl) 
    464                   !WRITE(numout,*) ' d_v_i_thd/trp   ', d_v_i_thd(ji,jj,jl), d_v_i_trp(ji,jj,jl) 
    465                   inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    466                ENDIF 
    467             END DO 
    468          END DO 
    469       END DO 
    470  
    471       ! Alerte if very thick ice 
    472       ialert_id = 3 ! reference number of this alert 
    473       cl_alname(ialert_id) = ' Very thick ice               ' ! name of the alert 
    474       jl = jpl  
    475       DO jj = 1, jpj 
    476          DO ji = 1, jpi 
    477             IF(   ht_i(ji,jj,jl)  >  50._wp   ) THEN 
    478                !CALL lim_prt_state( kt, ji, jj, 2, ' ALERTE 3 :   Very thick ice ' ) 
    479                inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    480             ENDIF 
    481          END DO 
    482       END DO 
    483  
    484       ! Alert if very fast ice 
    485       ialert_id = 4 ! reference number of this alert 
    486       cl_alname(ialert_id) = ' Very fast ice               ' ! name of the alert 
    487       DO jj = 1, jpj 
    488          DO ji = 1, jpi 
    489             IF(   MAX( ABS( u_ice(ji,jj) ), ABS( v_ice(ji,jj) ) ) > 1.5  .AND.  & 
    490                &  at_i(ji,jj) > 0._wp   ) THEN 
    491                !CALL lim_prt_state( kt, ji, jj, 1, ' ALERTE 4 :   Very fast ice ' ) 
    492                !WRITE(numout,*) ' ice strength             : ', strength(ji,jj) 
    493                !WRITE(numout,*) ' oceanic stress utau      : ', utau(ji,jj)  
    494                !WRITE(numout,*) ' oceanic stress vtau      : ', vtau(ji,jj) 
    495                !WRITE(numout,*) ' sea-ice stress utau_ice  : ', utau_ice(ji,jj)  
    496                !WRITE(numout,*) ' sea-ice stress vtau_ice  : ', vtau_ice(ji,jj) 
    497                !WRITE(numout,*) ' oceanic speed u          : ', u_oce(ji,jj) 
    498                !WRITE(numout,*) ' oceanic speed v          : ', v_oce(ji,jj) 
    499                !WRITE(numout,*) ' sst                      : ', sst_m(ji,jj) 
    500                !WRITE(numout,*) ' sss                      : ', sss_m(ji,jj) 
    501                !WRITE(numout,*)  
    502                inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    503             ENDIF 
    504          END DO 
    505       END DO 
    506  
    507       ! Alert if there is ice on continents 
    508       ialert_id = 6 ! reference number of this alert 
    509       cl_alname(ialert_id) = ' Ice on continents           ' ! name of the alert 
    510       DO jj = 1, jpj 
    511          DO ji = 1, jpi 
    512             IF(   tms(ji,jj) <= 0._wp   .AND.   at_i(ji,jj) > 0._wp   ) THEN  
    513                !CALL lim_prt_state( kt, ji, jj, 1, ' ALERTE 6 :   Ice on continents ' ) 
    514                !WRITE(numout,*) ' masks s, u, v        : ', tms(ji,jj), tmu(ji,jj), tmv(ji,jj)  
    515                !WRITE(numout,*) ' sst                  : ', sst_m(ji,jj) 
    516                !WRITE(numout,*) ' sss                  : ', sss_m(ji,jj) 
    517                !WRITE(numout,*) ' at_i(ji,jj)          : ', at_i(ji,jj) 
    518                !WRITE(numout,*) ' v_ice(ji,jj)         : ', v_ice(ji,jj) 
    519                !WRITE(numout,*) ' v_ice(ji,jj-1)       : ', v_ice(ji,jj-1) 
    520                !WRITE(numout,*) ' u_ice(ji-1,jj)       : ', u_ice(ji-1,jj) 
    521                !WRITE(numout,*) ' u_ice(ji,jj)         : ', v_ice(ji,jj) 
    522                ! 
    523                inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    524             ENDIF 
    525          END DO 
    526       END DO 
    527  
    528 ! 
    529 !     ! Alert if very fresh ice 
    530       ialert_id = 7 ! reference number of this alert 
    531       cl_alname(ialert_id) = ' Very fresh ice               ' ! name of the alert 
    532       DO jl = 1, jpl 
    533          DO jj = 1, jpj 
    534             DO ji = 1, jpi 
    535                IF( sm_i(ji,jj,jl) < 0.1 .AND. a_i(ji,jj,jl) > 0._wp ) THEN 
    536 !                 CALL lim_prt_state(kt,ji,jj,1, ' ALERTE 7 :   Very fresh ice ' ) 
    537 !                 WRITE(numout,*) ' sst                  : ', sst_m(ji,jj) 
    538 !                 WRITE(numout,*) ' sss                  : ', sss_m(ji,jj) 
    539 !                 WRITE(numout,*)  
    540                   inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    541                ENDIF 
    542             END DO 
    543          END DO 
    544       END DO 
    545 ! 
    546  
    547 !     ! Alert if too old ice 
    548       ialert_id = 9 ! reference number of this alert 
    549       cl_alname(ialert_id) = ' Very old   ice               ' ! name of the alert 
    550       DO jl = 1, jpl 
    551          DO jj = 1, jpj 
    552             DO ji = 1, jpi 
    553                IF ( ( ( ABS( o_i(ji,jj,jl) ) > rdt_ice ) .OR. & 
    554                       ( ABS( o_i(ji,jj,jl) ) < 0._wp) ) .AND. & 
    555                              ( a_i(ji,jj,jl) > 0._wp ) ) THEN 
    556                   !CALL lim_prt_state( kt, ji, jj, 1, ' ALERTE 9 :   Wrong ice age ') 
    557                   inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    558                ENDIF 
    559             END DO 
    560          END DO 
    561       END DO 
    562   
    563       ! Alert on salt flux 
    564       ialert_id = 5 ! reference number of this alert 
    565       cl_alname(ialert_id) = ' High salt flux               ' ! name of the alert 
    566       DO jj = 1, jpj 
    567          DO ji = 1, jpi 
    568             IF( ABS( sfx (ji,jj) ) .GT. 1.0e-2 ) THEN  ! = 1 psu/day for 1m ocean depth 
    569                !CALL lim_prt_state( kt, ji, jj, 3, ' ALERTE 5 :   High salt flux ' ) 
    570                !DO jl = 1, jpl 
    571                   !WRITE(numout,*) ' Category no: ', jl 
    572                   !WRITE(numout,*) ' a_i        : ', a_i      (ji,jj,jl) , ' a_i_b      : ', a_i_b  (ji,jj,jl)    
    573                   !WRITE(numout,*) ' d_a_i_trp  : ', d_a_i_trp(ji,jj,jl) , ' d_a_i_thd  : ', d_a_i_thd(ji,jj,jl)  
    574                   !WRITE(numout,*) ' v_i        : ', v_i      (ji,jj,jl) , ' v_i_b      : ', v_i_b  (ji,jj,jl)    
    575                   !WRITE(numout,*) ' d_v_i_trp  : ', d_v_i_trp(ji,jj,jl) , ' d_v_i_thd  : ', d_v_i_thd(ji,jj,jl)  
    576                   !WRITE(numout,*) ' ' 
    577                !END DO 
    578                inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    579             ENDIF 
    580          END DO 
    581       END DO 
    582  
    583       ! Alert if qns very big 
    584       ialert_id = 8 ! reference number of this alert 
    585       cl_alname(ialert_id) = ' fnsolar very big             ' ! name of the alert 
    586       DO jj = 1, jpj 
    587          DO ji = 1, jpi 
    588             IF( ABS( qns(ji,jj) ) > 1500._wp .AND. at_i(ji,jj) > 0._wp ) THEN 
    589                ! 
    590                !WRITE(numout,*) ' ALERTE 8 :   Very high non-solar heat flux' 
    591                !WRITE(numout,*) ' ji, jj    : ', ji, jj 
    592                !WRITE(numout,*) ' qns       : ', qns(ji,jj) 
    593                !WRITE(numout,*) ' sst       : ', sst_m(ji,jj) 
    594                !WRITE(numout,*) ' sss       : ', sss_m(ji,jj) 
    595                ! 
    596                !CALL lim_prt_state( kt, ji, jj, 2, '   ') 
    597                inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    598                ! 
    599             ENDIF 
    600          END DO 
    601       END DO 
    602       !+++++ 
    603   
    604       ! Alert if very warm ice 
    605       ialert_id = 10 ! reference number of this alert 
    606       cl_alname(ialert_id) = ' Very warm ice                ' ! name of the alert 
    607       inb_alp(ialert_id) = 0 
    608       DO jl = 1, jpl 
    609          DO jk = 1, nlay_i 
    610             DO jj = 1, jpj 
    611                DO ji = 1, jpi 
    612                   ztmelts    =  -tmut * s_i(ji,jj,jk,jl) + rtt 
    613                   IF( t_i(ji,jj,jk,jl) >= ztmelts  .AND.  v_i(ji,jj,jl) > 1.e-10   & 
    614                      &                             .AND.  a_i(ji,jj,jl) > 0._wp   ) THEN 
    615                      !WRITE(numout,*) ' ALERTE 10 :   Very warm ice' 
    616                      !WRITE(numout,*) ' ji, jj, jk, jl : ', ji, jj, jk, jl 
    617                      !WRITE(numout,*) ' t_i : ', t_i(ji,jj,jk,jl) 
    618                      !WRITE(numout,*) ' e_i : ', e_i(ji,jj,jk,jl) 
    619                      !WRITE(numout,*) ' s_i : ', s_i(ji,jj,jk,jl) 
    620                      !WRITE(numout,*) ' ztmelts : ', ztmelts 
    621                      inb_alp(ialert_id) = inb_alp(ialert_id) + 1 
    622                   ENDIF 
    623                END DO 
    624             END DO 
    625          END DO 
    626       END DO 
    627  
    628       ! sum of the alerts on all processors 
    629       IF( lk_mpp ) THEN 
    630          DO ialert_id = 1, inb_altests 
    631             CALL mpp_sum(inb_alp(ialert_id)) 
    632          END DO 
    633       ENDIF 
    634  
    635       ! print alerts 
    636       IF( lwp ) THEN 
    637          ialert_id = 1                                 ! reference number of this alert 
    638          cl_alname(ialert_id) = ' NO alerte 1      '   ! name of the alert 
    639          WRITE(numout,*) ' time step ',kt 
    640          WRITE(numout,*) ' All alerts at the end of ice model ' 
    641          DO ialert_id = 1, inb_altests 
    642             WRITE(numout,*) ialert_id, cl_alname(ialert_id)//' : ', inb_alp(ialert_id), ' times ! ' 
    643          END DO 
    644       ENDIF 
    645      ! 
    646    END SUBROUTINE lim_ctl 
    647   
    648     
    649    SUBROUTINE lim_prt_state( kt, ki, kj, kn, cd1 ) 
    650       !!----------------------------------------------------------------------- 
    651       !!                   ***  ROUTINE lim_prt_state ***  
    652       !!                  
    653       !! ** Purpose :   Writes global ice state on the (i,j) point  
    654       !!                in ocean.ouput  
    655       !!                3 possibilities exist  
    656       !!                n = 1/-1 -> simple ice state (plus Mechanical Check if -1) 
    657       !!                n = 2    -> exhaustive state 
    658       !!                n = 3    -> ice/ocean salt fluxes 
    659       !! 
    660       !! ** input   :   point coordinates (i,j)  
    661       !!                n : number of the option 
    662       !!------------------------------------------------------------------- 
    663       INTEGER         , INTENT(in) ::   kt            ! ocean time step 
    664       INTEGER         , INTENT(in) ::   ki, kj, kn    ! ocean gridpoint indices 
    665       CHARACTER(len=*), INTENT(in) ::   cd1           ! 
    666       !! 
    667       INTEGER :: jl, ji, jj 
    668       !!------------------------------------------------------------------- 
    669  
    670       DO ji = mi0(ki), mi1(ki) 
    671          DO jj = mj0(kj), mj1(kj) 
    672  
    673             WRITE(numout,*) ' time step ',kt,' ',cd1             ! print title 
    674  
    675             !---------------- 
    676             !  Simple state 
    677             !---------------- 
    678              
    679             IF ( kn == 1 .OR. kn == -1 ) THEN 
    680                WRITE(numout,*) ' lim_prt_state - Point : ',ji,jj 
    681                WRITE(numout,*) ' ~~~~~~~~~~~~~~ ' 
    682                WRITE(numout,*) ' Simple state ' 
    683                WRITE(numout,*) ' masks s,u,v   : ', tms(ji,jj), tmu(ji,jj), tmv(ji,jj) 
    684                WRITE(numout,*) ' lat - long    : ', gphit(ji,jj), glamt(ji,jj) 
    685                WRITE(numout,*) ' Time step     : ', numit 
    686                WRITE(numout,*) ' - Ice drift   ' 
    687                WRITE(numout,*) '   ~~~~~~~~~~~ ' 
    688                WRITE(numout,*) ' u_ice(i-1,j)  : ', u_ice(ji-1,jj) 
    689                WRITE(numout,*) ' u_ice(i  ,j)  : ', u_ice(ji,jj) 
    690                WRITE(numout,*) ' v_ice(i  ,j-1): ', v_ice(ji,jj-1) 
    691                WRITE(numout,*) ' v_ice(i  ,j)  : ', v_ice(ji,jj) 
    692                WRITE(numout,*) ' strength      : ', strength(ji,jj) 
    693                WRITE(numout,*) 
    694                WRITE(numout,*) ' - Cell values ' 
    695                WRITE(numout,*) '   ~~~~~~~~~~~ ' 
    696                WRITE(numout,*) ' cell area     : ', area(ji,jj) 
    697                WRITE(numout,*) ' at_i          : ', at_i(ji,jj)        
    698                WRITE(numout,*) ' vt_i          : ', vt_i(ji,jj)        
    699                WRITE(numout,*) ' vt_s          : ', vt_s(ji,jj)        
    700                DO jl = 1, jpl 
    701                   WRITE(numout,*) ' - Category (', jl,')' 
    702                   WRITE(numout,*) ' a_i           : ', a_i(ji,jj,jl) 
    703                   WRITE(numout,*) ' ht_i          : ', ht_i(ji,jj,jl) 
    704                   WRITE(numout,*) ' ht_s          : ', ht_s(ji,jj,jl) 
    705                   WRITE(numout,*) ' v_i           : ', v_i(ji,jj,jl) 
    706                   WRITE(numout,*) ' v_s           : ', v_s(ji,jj,jl) 
    707                   WRITE(numout,*) ' e_s           : ', e_s(ji,jj,1,jl)/1.0e9 
    708                   WRITE(numout,*) ' e_i           : ', e_i(ji,jj,1:nlay_i,jl)/1.0e9 
    709                   WRITE(numout,*) ' t_su          : ', t_su(ji,jj,jl) 
    710                   WRITE(numout,*) ' t_snow        : ', t_s(ji,jj,1,jl) 
    711                   WRITE(numout,*) ' t_i           : ', t_i(ji,jj,1:nlay_i,jl) 
    712                   WRITE(numout,*) ' sm_i          : ', sm_i(ji,jj,jl) 
    713                   WRITE(numout,*) ' smv_i         : ', smv_i(ji,jj,jl) 
    714                   WRITE(numout,*) 
    715                END DO 
    716             ENDIF 
    717             IF( kn == -1 ) THEN 
    718                WRITE(numout,*) ' Mechanical Check ************** ' 
    719                WRITE(numout,*) ' Check what means ice divergence ' 
    720                WRITE(numout,*) ' Total ice concentration ', at_i (ji,jj) 
    721                WRITE(numout,*) ' Total lead fraction     ', ato_i(ji,jj) 
    722                WRITE(numout,*) ' Sum of both             ', ato_i(ji,jj) + at_i(ji,jj) 
    723                WRITE(numout,*) ' Sum of both minus 1     ', ato_i(ji,jj) + at_i(ji,jj) - 1.00 
    724             ENDIF 
    725              
    726  
    727             !-------------------- 
    728             !  Exhaustive state 
    729             !-------------------- 
    730              
    731             IF ( kn .EQ. 2 ) THEN 
    732                WRITE(numout,*) ' lim_prt_state - Point : ',ji,jj 
    733                WRITE(numout,*) ' ~~~~~~~~~~~~~~ ' 
    734                WRITE(numout,*) ' Exhaustive state ' 
    735                WRITE(numout,*) ' lat - long ', gphit(ji,jj), glamt(ji,jj) 
    736                WRITE(numout,*) ' Time step ', numit 
    737                WRITE(numout,*)  
    738                WRITE(numout,*) ' - Cell values ' 
    739                WRITE(numout,*) '   ~~~~~~~~~~~ ' 
    740                WRITE(numout,*) ' cell area     : ', area(ji,jj) 
    741                WRITE(numout,*) ' at_i          : ', at_i(ji,jj)        
    742                WRITE(numout,*) ' vt_i          : ', vt_i(ji,jj)        
    743                WRITE(numout,*) ' vt_s          : ', vt_s(ji,jj)        
    744                WRITE(numout,*) ' u_ice(i-1,j)  : ', u_ice(ji-1,jj) 
    745                WRITE(numout,*) ' u_ice(i  ,j)  : ', u_ice(ji,jj) 
    746                WRITE(numout,*) ' v_ice(i  ,j-1): ', v_ice(ji,jj-1) 
    747                WRITE(numout,*) ' v_ice(i  ,j)  : ', v_ice(ji,jj) 
    748                WRITE(numout,*) ' strength      : ', strength(ji,jj) 
    749                WRITE(numout,*) ' d_u_ice_dyn   : ', d_u_ice_dyn(ji,jj), ' d_v_ice_dyn   : ', d_v_ice_dyn(ji,jj) 
    750                WRITE(numout,*) ' u_ice_b       : ', u_ice_b(ji,jj)    , ' v_ice_b       : ', v_ice_b(ji,jj)   
    751                WRITE(numout,*) 
    752                 
    753                DO jl = 1, jpl 
    754                   WRITE(numout,*) ' - Category (',jl,')' 
    755                   WRITE(numout,*) '   ~~~~~~~~         '  
    756                   WRITE(numout,*) ' ht_i       : ', ht_i(ji,jj,jl)             , ' ht_s       : ', ht_s(ji,jj,jl) 
    757                   WRITE(numout,*) ' t_i        : ', t_i(ji,jj,1:nlay_i,jl) 
    758                   WRITE(numout,*) ' t_su       : ', t_su(ji,jj,jl)             , ' t_s        : ', t_s(ji,jj,1,jl) 
    759                   WRITE(numout,*) ' sm_i       : ', sm_i(ji,jj,jl)             , ' o_i        : ', o_i(ji,jj,jl) 
    760                   WRITE(numout,*) ' a_i        : ', a_i(ji,jj,jl)              , ' a_i_b      : ', a_i_b(ji,jj,jl)    
    761                   WRITE(numout,*) ' d_a_i_trp  : ', d_a_i_trp(ji,jj,jl)        , ' d_a_i_thd  : ', d_a_i_thd(ji,jj,jl)  
    762                   WRITE(numout,*) ' v_i        : ', v_i(ji,jj,jl)              , ' v_i_b      : ', v_i_b(ji,jj,jl)    
    763                   WRITE(numout,*) ' d_v_i_trp  : ', d_v_i_trp(ji,jj,jl)        , ' d_v_i_thd  : ', d_v_i_thd(ji,jj,jl)  
    764                   WRITE(numout,*) ' v_s        : ', v_s(ji,jj,jl)              , ' v_s_b      : ', v_s_b(ji,jj,jl)   
    765                   WRITE(numout,*) ' d_v_s_trp  : ', d_v_s_trp(ji,jj,jl)        , ' d_v_s_thd  : ', d_v_s_thd(ji,jj,jl) 
    766                   WRITE(numout,*) ' e_i1       : ', e_i(ji,jj,1,jl)/1.0e9      , ' ei1        : ', e_i_b(ji,jj,1,jl)/1.0e9  
    767                   WRITE(numout,*) ' de_i1_trp  : ', d_e_i_trp(ji,jj,1,jl)/1.0e9, ' de_i1_thd  : ', d_e_i_thd(ji,jj,1,jl)/1.0e9 
    768                   WRITE(numout,*) ' e_i2       : ', e_i(ji,jj,2,jl)/1.0e9      , ' ei2_b      : ', e_i_b(ji,jj,2,jl)/1.0e9   
    769                   WRITE(numout,*) ' de_i2_trp  : ', d_e_i_trp(ji,jj,2,jl)/1.0e9, ' de_i2_thd  : ', d_e_i_thd(ji,jj,2,jl)/1.0e9 
    770                   WRITE(numout,*) ' e_snow     : ', e_s(ji,jj,1,jl)            , ' e_snow_b   : ', e_s_b(ji,jj,1,jl)  
    771                   WRITE(numout,*) ' d_e_s_trp  : ', d_e_s_trp(ji,jj,1,jl)      , ' d_e_s_thd  : ', d_e_s_thd(ji,jj,1,jl) 
    772                   WRITE(numout,*) ' smv_i      : ', smv_i(ji,jj,jl)            , ' smv_i_b    : ', smv_i_b(ji,jj,jl)    
    773                   WRITE(numout,*) ' d_smv_i_trp: ', d_smv_i_trp(ji,jj,jl)      , ' d_smv_i_thd: ', d_smv_i_thd(ji,jj,jl)  
    774                   WRITE(numout,*) ' oa_i       : ', oa_i(ji,jj,jl)             , ' oa_i_b     : ', oa_i_b(ji,jj,jl) 
    775                   WRITE(numout,*) ' d_oa_i_trp : ', d_oa_i_trp(ji,jj,jl)       , ' d_oa_i_thd : ', d_oa_i_thd(ji,jj,jl) 
    776                END DO !jl 
    777                 
    778                WRITE(numout,*) 
    779                WRITE(numout,*) ' - Heat / FW fluxes ' 
    780                WRITE(numout,*) '   ~~~~~~~~~~~~~~~~ ' 
    781                WRITE(numout,*) ' - Heat fluxes in and out the ice ***' 
    782                WRITE(numout,*) ' qsr_ini       : ', pfrld(ji,jj) * qsr(ji,jj) + SUM( a_i_b(ji,jj,:) * qsr_ice(ji,jj,:) ) 
    783                WRITE(numout,*) ' qns_ini       : ', pfrld(ji,jj) * qns(ji,jj) + SUM( a_i_b(ji,jj,:) * qns_ice(ji,jj,:) ) 
    784                WRITE(numout,*) 
    785                WRITE(numout,*)  
    786                WRITE(numout,*) ' sst        : ', sst_m(ji,jj)   
    787                WRITE(numout,*) ' sss        : ', sss_m(ji,jj)   
    788                WRITE(numout,*)  
    789                WRITE(numout,*) ' - Stresses ' 
    790                WRITE(numout,*) '   ~~~~~~~~ ' 
    791                WRITE(numout,*) ' utau_ice   : ', utau_ice(ji,jj)  
    792                WRITE(numout,*) ' vtau_ice   : ', vtau_ice(ji,jj) 
    793                WRITE(numout,*) ' utau       : ', utau    (ji,jj)  
    794                WRITE(numout,*) ' vtau       : ', vtau    (ji,jj) 
    795                WRITE(numout,*) ' oc. vel. u : ', u_oce   (ji,jj) 
    796                WRITE(numout,*) ' oc. vel. v : ', v_oce   (ji,jj) 
    797             ENDIF 
    798              
    799             !--------------------- 
    800             ! Salt / heat fluxes 
    801             !--------------------- 
    802              
    803             IF ( kn .EQ. 3 ) THEN 
    804                WRITE(numout,*) ' lim_prt_state - Point : ',ji,jj 
    805                WRITE(numout,*) ' ~~~~~~~~~~~~~~ ' 
    806                WRITE(numout,*) ' - Salt / Heat Fluxes ' 
    807                WRITE(numout,*) '   ~~~~~~~~~~~~~~~~ ' 
    808                WRITE(numout,*) ' lat - long ', gphit(ji,jj), glamt(ji,jj) 
    809                WRITE(numout,*) ' Time step ', numit 
    810                WRITE(numout,*) 
    811                WRITE(numout,*) ' - Heat fluxes at bottom interface ***' 
    812                WRITE(numout,*) ' qsr       : ', qsr(ji,jj) 
    813                WRITE(numout,*) ' qns       : ', qns(ji,jj) 
    814                WRITE(numout,*) 
    815                WRITE(numout,*) ' hfx_mass     : ', hfx_thd(ji,jj) + hfx_dyn(ji,jj) + hfx_snw(ji,jj) + hfx_res(ji,jj) 
    816                WRITE(numout,*) ' hfx_in       : ', hfx_in(ji,jj) 
    817                WRITE(numout,*) ' hfx_out      : ', hfx_out(ji,jj) 
    818                WRITE(numout,*) ' dhc          : ', diag_heat_dhc(ji,jj)               
    819                WRITE(numout,*) 
    820                WRITE(numout,*) ' hfx_dyn      : ', hfx_dyn(ji,jj) 
    821                WRITE(numout,*) ' hfx_thd      : ', hfx_thd(ji,jj) 
    822                WRITE(numout,*) ' hfx_res      : ', hfx_res(ji,jj) 
    823                WRITE(numout,*) ' fhtur        : ', fhtur(ji,jj)  
    824                WRITE(numout,*) ' qlead        : ', qlead(ji,jj) * r1_rdtice 
    825                WRITE(numout,*) 
    826                WRITE(numout,*) ' - Salt fluxes at bottom interface ***' 
    827                WRITE(numout,*) ' emp       : ', emp    (ji,jj) 
    828                WRITE(numout,*) ' sfx       : ', sfx    (ji,jj) 
    829                WRITE(numout,*) ' sfx_res   : ', sfx_res(ji,jj) 
    830                WRITE(numout,*) ' sfx_bri   : ', sfx_bri(ji,jj) 
    831                WRITE(numout,*) ' sfx_dyn   : ', sfx_dyn(ji,jj) 
    832                WRITE(numout,*) 
    833                WRITE(numout,*) ' - Momentum fluxes ' 
    834                WRITE(numout,*) ' utau      : ', utau(ji,jj)  
    835                WRITE(numout,*) ' vtau      : ', vtau(ji,jj) 
    836             ENDIF  
    837             WRITE(numout,*) ' ' 
    838             ! 
    839          END DO 
    840       END DO 
    841       ! 
    842    END SUBROUTINE lim_prt_state 
    843     
     549 
     550   SUBROUTINE sbc_lim_bef 
     551      !!---------------------------------------------------------------------- 
     552      !!                  ***  ROUTINE sbc_lim_bef  *** 
     553      !! 
     554      !! ** purpose :  store ice variables at "before" time step  
     555      !!---------------------------------------------------------------------- 
     556      a_i_b  (:,:,:)   = a_i  (:,:,:)     ! ice area 
     557      e_i_b  (:,:,:,:) = e_i  (:,:,:,:)   ! ice thermal energy 
     558      v_i_b  (:,:,:)   = v_i  (:,:,:)     ! ice volume 
     559      v_s_b  (:,:,:)   = v_s  (:,:,:)     ! snow volume  
     560      e_s_b  (:,:,:,:) = e_s  (:,:,:,:)   ! snow thermal energy 
     561      smv_i_b(:,:,:)   = smv_i(:,:,:)     ! salt content 
     562      oa_i_b (:,:,:)   = oa_i (:,:,:)     ! areal age content 
     563      u_ice_b(:,:)     = u_ice(:,:) 
     564      v_ice_b(:,:)     = v_ice(:,:) 
     565       
     566   END SUBROUTINE sbc_lim_bef 
     567 
     568   SUBROUTINE sbc_lim_diag0 
     569      !!---------------------------------------------------------------------- 
     570      !!                  ***  ROUTINE sbc_lim_diag0  *** 
     571      !! 
     572      !! ** purpose :  set ice-ocean and ice-atm. fluxes to zeros at the beggining 
     573      !!               of the time step 
     574      !!---------------------------------------------------------------------- 
     575      sfx    (:,:) = 0._wp   ; 
     576      sfx_bri(:,:) = 0._wp   ;  
     577      sfx_sni(:,:) = 0._wp   ;   sfx_opw(:,:) = 0._wp 
     578      sfx_bog(:,:) = 0._wp   ;   sfx_dyn(:,:) = 0._wp 
     579      sfx_bom(:,:) = 0._wp   ;   sfx_sum(:,:) = 0._wp 
     580      sfx_res(:,:) = 0._wp 
     581       
     582      wfx_snw(:,:) = 0._wp   ;   wfx_ice(:,:) = 0._wp 
     583      wfx_sni(:,:) = 0._wp   ;   wfx_opw(:,:) = 0._wp 
     584      wfx_bog(:,:) = 0._wp   ;   wfx_dyn(:,:) = 0._wp 
     585      wfx_bom(:,:) = 0._wp   ;   wfx_sum(:,:) = 0._wp 
     586      wfx_res(:,:) = 0._wp   ;   wfx_sub(:,:) = 0._wp 
     587      wfx_spr(:,:) = 0._wp   ;    
     588       
     589      hfx_thd(:,:) = 0._wp   ;    
     590      hfx_snw(:,:) = 0._wp   ;   hfx_opw(:,:) = 0._wp 
     591      hfx_bog(:,:) = 0._wp   ;   hfx_dyn(:,:) = 0._wp 
     592      hfx_bom(:,:) = 0._wp   ;   hfx_sum(:,:) = 0._wp 
     593      hfx_res(:,:) = 0._wp   ;   hfx_sub(:,:) = 0._wp 
     594      hfx_spr(:,:) = 0._wp   ;   hfx_dif(:,:) = 0._wp  
     595      hfx_err(:,:) = 0._wp   ;   hfx_err_rem(:,:) = 0._wp 
     596      hfx_err_dif(:,:) = 0._wp   ; 
     597 
     598      afx_tot(:,:) = 0._wp   ; 
     599      afx_dyn(:,:) = 0._wp   ;   afx_thd(:,:) = 0._wp 
     600 
     601      diag_heat(:,:) = 0._wp ;   diag_smvi(:,:) = 0._wp ; 
     602      diag_vice(:,:) = 0._wp ;   diag_vsnw(:,:) = 0._wp ; 
     603       
     604   END SUBROUTINE sbc_lim_diag0 
     605 
    844606      
    845607   FUNCTION fice_cell_ave ( ptab ) 
     
    852614       
    853615      fice_cell_ave (:,:) = 0.0_wp 
    854        
    855616      DO jl = 1, jpl 
    856          fice_cell_ave (:,:) = fice_cell_ave (:,:) & 
    857             &                  + a_i (:,:,jl) * ptab (:,:,jl) 
     617         fice_cell_ave (:,:) = fice_cell_ave (:,:) + a_i (:,:,jl) * ptab (:,:,jl) 
    858618      END DO 
    859619       
     
    869629 
    870630      fice_ice_ave (:,:) = 0.0_wp 
    871       WHERE ( at_i (:,:) .GT. 0.0_wp ) fice_ice_ave (:,:) = fice_cell_ave ( ptab (:,:,:)) / at_i (:,:) 
     631      WHERE ( at_i (:,:) > 0.0_wp ) fice_ice_ave (:,:) = fice_cell_ave ( ptab (:,:,:)) / at_i (:,:) 
    872632 
    873633   END FUNCTION fice_ice_ave 
     
    882642      WRITE(*,*) 'sbc_ice_lim: You should not have seen this print! error?', kt, kblk 
    883643   END SUBROUTINE sbc_ice_lim 
     644   SUBROUTINE sbc_lim_init                 ! Dummy routine 
     645   END SUBROUTINE sbc_lim_init 
    884646#endif 
    885647 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcice_lim_2.F90

    r5234 r5443  
    101101      REAL(wp), DIMENSION(:,:,:), POINTER :: zalb_ice  ! mean ice albedo 
    102102      REAL(wp), DIMENSION(:,:,:), POINTER :: zsist     ! ice surface temperature (K) 
     103      REAL(wp), DIMENSION(:,:  ), POINTER :: zutau_ice, zvtau_ice  
    103104      !!---------------------------------------------------------------------- 
    104  
    105       CALL wrk_alloc( jpi,jpj,1, zalb_os, zalb_cs, zalb_ice, zsist ) 
    106105 
    107106      IF( kt == nit000 ) THEN 
     
    124123         &*Agrif_PArent(nn_fsbc)/REAL(nn_fsbc)) + 1 
    125124# endif 
     125 
     126         CALL wrk_alloc( jpi,jpj  , zutau_ice, zvtau_ice) 
     127         CALL wrk_alloc( jpi,jpj,1, zalb_os, zalb_cs, zalb_ice, zsist ) 
     128 
    126129         !  Bulk Formulea ! 
    127130         !----------------! 
     
    132135               DO ji = 2, jpi   ! NO vector opt. possible 
    133136                  u_oce(ji,jj) = 0.5_wp * ( ssu_m(ji-1,jj  ) * umask(ji-1,jj  ,1) & 
    134                      &           + ssu_m(ji-1,jj-1) * umask(ji-1,jj-1,1) ) * tmu(ji,jj) 
     137                     &                    + ssu_m(ji-1,jj-1) * umask(ji-1,jj-1,1) ) * tmu(ji,jj) 
    135138                  v_oce(ji,jj) = 0.5_wp * ( ssv_m(ji  ,jj-1) * vmask(ji  ,jj-1,1) & 
    136                      &           + ssv_m(ji-1,jj-1) * vmask(ji-1,jj-1,1) ) * tmu(ji,jj) 
     139                     &                    + ssv_m(ji-1,jj-1) * vmask(ji-1,jj-1,1) ) * tmu(ji,jj) 
    137140               END DO 
    138141            END DO 
     
    158161 
    159162         SELECT CASE( ksbc ) 
    160          CASE( jp_core , jp_cpl )   ! CORE and COUPLED bulk formulations 
     163         CASE( jp_core , jp_purecpl )   ! CORE and COUPLED bulk formulations 
    161164 
    162165            ! albedo depends on cloud fraction because of non-linear spectral effects 
     
    182185         SELECT CASE( ksbc ) 
    183186         CASE( jp_clio )           ! CLIO bulk formulation 
    184             CALL blk_ice_clio( zsist, zalb_cs    , zalb_os    , zalb_ice   ,            & 
    185                &                      utau_ice   , vtau_ice   , qns_ice    , qsr_ice,   & 
    186                &                      qla_ice    , dqns_ice   , dqla_ice   ,            & 
    187                &                      tprecip    , sprecip    ,                         & 
    188                &                      fr1_i0     , fr2_i0     , cp_ice_msh , jpl  ) 
     187!           CALL blk_ice_clio( zsist, zalb_cs    , zalb_os    , zalb_ice   ,            & 
     188!              &                      utau_ice   , vtau_ice   , qns_ice    , qsr_ice,   & 
     189!              &                      qla_ice    , dqns_ice   , dqla_ice   ,            & 
     190!              &                      tprecip    , sprecip    ,                         & 
     191!              &                      fr1_i0     , fr2_i0     , cp_ice_msh , jpl  ) 
     192            CALL blk_ice_clio_tau 
     193            CALL blk_ice_clio_flx( zsist, zalb_cs, zalb_os, zalb_ice ) 
    189194 
    190195         CASE( jp_core )           ! CORE bulk formulation 
    191             CALL blk_ice_core( zsist, u_ice      , v_ice      , zalb_ice   ,            & 
    192                &                      utau_ice   , vtau_ice   , qns_ice    , qsr_ice,   & 
    193                &                      qla_ice    , dqns_ice   , dqla_ice   ,            & 
    194                &                      tprecip    , sprecip    ,                         & 
    195                &                      fr1_i0     , fr2_i0     , cp_ice_msh , jpl  ) 
    196             IF( ltrcdm2dc_ice )   CALL blk_ice_meanqsr( zalb_ice, qsr_ice_mean, jpl ) 
    197  
    198          CASE( jp_cpl )            ! Coupled formulation : atmosphere-ice stress only (fluxes provided after ice dynamics) 
     196            CALL blk_ice_core_tau 
     197            CALL blk_ice_core_flx( zsist, zalb_ice ) 
     198 
     199         CASE( jp_purecpl )            ! Coupled formulation : atmosphere-ice stress only (fluxes provided after ice dynamics) 
    199200            CALL sbc_cpl_ice_tau( utau_ice , vtau_ice ) 
    200201         END SELECT 
     202          
     203         IF( ln_mixcpl) THEN 
     204            CALL sbc_cpl_ice_tau( zutau_ice , zvtau_ice ) 
     205            utau_ice(:,:) = utau_ice(:,:) * xcplmask(:,:,0) + zutau_ice(:,:) * ( 1. - xcplmask(:,:,0) ) 
     206            vtau_ice(:,:) = vtau_ice(:,:) * xcplmask(:,:,0) + zvtau_ice(:,:) * ( 1. - xcplmask(:,:,0) ) 
     207         ENDIF 
    201208 
    202209         CALL iom_put( 'utau_ice', utau_ice )     ! Wind stress over ice along i-axis at I-point 
     
    228235         END IF 
    229236         !                                             ! Ice surface fluxes in coupled mode  
    230          IF( ksbc == jp_cpl )   THEN 
     237         IF( ln_cpl ) THEN   ! pure coupled and mixed forced-coupled configurations 
    231238            a_i(:,:,1)=fr_i 
    232239            CALL sbc_cpl_ice_flx( frld,                                              & 
    233240            !                                optional arguments, used only in 'mixed oce-ice' case 
    234             &                                             palbi = zalb_ice, psst = sst_m, pist = zsist ) 
     241            &                                             palbi=zalb_ice, psst=sst_m, pist=zsist ) 
    235242            sprecip(:,:) = - emp_ice(:,:)   ! Ugly patch, WARNING, in coupled mode, sublimation included in snow (parsub = 0.) 
    236243         ENDIF 
    237244                           CALL lim_thd_2      ( kt )      ! Ice thermodynamics  
    238245                           CALL lim_sbc_flx_2  ( kt )      ! update surface ocean mass, heat & salt fluxes  
    239 #if defined key_top 
    240         IF( ltrcdm2dc_ice )CALL lim_bio_meanqsr_2 
    241 #endif 
    242246 
    243247         IF(  .NOT. lk_mpp )THEN 
     
    253257         IF( .NOT. Agrif_Root() )   CALL agrif_update_lim2( kt ) 
    254258# endif 
     259         ! 
     260         CALL wrk_dealloc( jpi,jpj  , zutau_ice, zvtau_ice) 
     261         CALL wrk_dealloc( jpi,jpj,1, zalb_os, zalb_cs, zalb_ice, zsist ) 
    255262         ! 
    256263      ENDIF                                    ! End sea-ice time step only 
     
    264271      IF( ln_limdyn    )   CALL lim_sbc_tau_2( kt, ub(:,:,1), vb(:,:,1) )  ! using before instantaneous surf. currents 
    265272      ! 
    266       CALL wrk_dealloc( jpi,jpj,1, zalb_os, zalb_cs, zalb_ice, zsist ) 
    267       ! 
    268273   END SUBROUTINE sbc_ice_lim_2 
    269274 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcisf.F90

    • Property svn:keywords set to Id
    r5234 r5443  
    77   !! History :  3.2   !  2011-02  (C.Harris  ) Original code isf cav 
    88   !!            X.X   !  2006-02  (C. Wang   ) Original code bg03 
    9    !!            3.4   !  2013-03  (P. Mathiot) Merging 
     9   !!            3.4   !  2013-03  (P. Mathiot) Merging + parametrization 
    1010   !!---------------------------------------------------------------------- 
    1111 
     
    3737 
    3838   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   risf_tsc_b, risf_tsc    
    39    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   fwfisf_b, fwfisf  !: evaporation damping   [kg/m2/s] 
    40    REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qisf            !: net heat flux from ice shelf 
     39   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   qisf              !: net heat flux from ice shelf 
    4140   REAL(wp), PUBLIC ::   rn_hisf_tbl                 !: thickness of top boundary layer [m] 
    4241   LOGICAL , PUBLIC ::   ln_divisf                   !: flag to correct divergence  
     
    309308      sbc_isf_alloc = 0       ! set to zero if no array to be allocated 
    310309      IF( .NOT. ALLOCATED( qisf ) ) THEN 
    311          ALLOCATE(  risf_tsc(jpi,jpj,jpts), risf_tsc_b(jpi,jpj,jpts)              , & 
    312                &    qisf(jpi,jpj)     , fwfisf(jpi,jpj)     , fwfisf_b(jpi,jpj)   , & 
    313                &    rhisf_tbl(jpi,jpj), r1_hisf_tbl(jpi,jpj), rzisf_tbl(jpi,jpj)  , & 
    314                &    ttbl(jpi,jpj)     , stbl(jpi,jpj)       , utbl(jpi,jpj)       , & 
    315                &    vtbl(jpi, jpj)    , risfLeff(jpi,jpj)   , rhisf_tbl_0(jpi,jpj), & 
    316                &    ralpha(jpi,jpj)   , misfkt(jpi,jpj)     , misfkb(jpi,jpj)     , & 
     310         ALLOCATE(  risf_tsc(jpi,jpj,jpts), risf_tsc_b(jpi,jpj,jpts), qisf(jpi,jpj)   , & 
     311               &    rhisf_tbl(jpi,jpj)    , r1_hisf_tbl(jpi,jpj), rzisf_tbl(jpi,jpj)  , & 
     312               &    ttbl(jpi,jpj)         , stbl(jpi,jpj)       , utbl(jpi,jpj)       , & 
     313               &    vtbl(jpi, jpj)        , risfLeff(jpi,jpj)   , rhisf_tbl_0(jpi,jpj), & 
     314               &    ralpha(jpi,jpj)       , misfkt(jpi,jpj)     , misfkb(jpi,jpj)     , & 
    317315               &    STAT= sbc_isf_alloc ) 
    318316         ! 
     
    563561      CALL iom_put('isfgammat', zgammat2d) 
    564562      CALL iom_put('isfgammas', zgammas2d) 
    565          ! 
    566       !CALL wrk_dealloc( jpi,jpj, zfrz,zpress,zti, zqisf, zfwfisf  ) 
     563      ! 
    567564      CALL wrk_dealloc( jpi,jpj, zfrz,zpress,zti, zgammat2d, zgammas2d ) 
    568565      ! 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90

    r5234 r5443  
    1313   !!            3.4  ! 2011-11  (C. Harris) CICE added as an option 
    1414   !!            3.5  ! 2012-11  (A. Coward, G. Madec) Rethink of heat, mass and salt surface fluxes 
     15   !!            3.6  ! 2014-11  (P. Mathiot, C. Harris) add ice shelves melting                     
    1516   !!---------------------------------------------------------------------- 
    1617 
     
    2324   USE phycst           ! physical constants 
    2425   USE sbc_oce          ! Surface boundary condition: ocean fields 
     26   USE trc_oce          ! shared ocean-passive tracers variables 
    2527   USE sbc_ice          ! Surface boundary condition: ice fields 
    2628   USE sbcdcy           ! surface boundary condition: diurnal cycle 
     
    3739   USE sbcice_cice      ! surface boundary condition: CICE    sea-ice model 
    3840   USE sbccpl           ! surface boundary condition: coupled florulation 
     41   USE cpl_oasis3       ! OASIS routines for coupling 
    3942   USE sbcssr           ! surface boundary condition: sea surface restoring 
    4043   USE sbcrnf           ! surface boundary condition: runoffs 
     
    8285      INTEGER ::   icpt   ! local integer 
    8386      !! 
    84       NAMELIST/namsbc/ nn_fsbc   , ln_ana    , ln_flx,  ln_blk_clio, ln_blk_core,           & 
    85          &             ln_blk_mfs, ln_apr_dyn, nn_ice,  nn_ice_embd, ln_dm2dc   , ln_rnf,   & 
    86          &             ln_ssr    ,  nn_isf , nn_fwb    , ln_cdgw , ln_wave , ln_sdw, nn_lsm, nn_limflx 
     87      NAMELIST/namsbc/ nn_fsbc   , ln_ana    , ln_flx, ln_blk_clio, ln_blk_core, ln_mixcpl,   & 
     88         &             ln_blk_mfs, ln_apr_dyn, nn_ice, nn_ice_embd, ln_dm2dc   , ln_rnf   ,   & 
     89         &             ln_ssr    , nn_isf    , nn_fwb, ln_cdgw    , ln_wave    , ln_sdw   ,   & 
     90         &             nn_lsm    , nn_limflx , nn_components, ln_cpl 
    8791      INTEGER  ::   ios 
     92      INTEGER  ::   ierr, ierr0, ierr1, ierr2, ierr3, jpm 
     93      LOGICAL  ::   ll_purecpl 
    8894      !!---------------------------------------------------------------------- 
    8995 
     
    113119          nn_ice      =   0 
    114120      ENDIF 
    115       
     121 
    116122      IF(lwp) THEN               ! Control print 
    117123         WRITE(numout,*) '        Namelist namsbc (partly overwritten with CPP key setting)' 
     
    123129         WRITE(numout,*) '              CORE bulk  formulation                     ln_blk_core = ', ln_blk_core 
    124130         WRITE(numout,*) '              MFS  bulk  formulation                     ln_blk_mfs  = ', ln_blk_mfs 
    125          WRITE(numout,*) '              coupled    formulation (T if key_oasis3)   lk_cpl      = ', lk_cpl 
     131         WRITE(numout,*) '              ocean-atmosphere coupled formulation       ln_cpl      = ', ln_cpl 
     132         WRITE(numout,*) '              forced-coupled mixed formulation           ln_mixcpl   = ', ln_mixcpl 
     133         WRITE(numout,*) '              OASIS coupling (with atm or sas)           lk_oasis    = ', lk_oasis 
     134         WRITE(numout,*) '              components of your executable              nn_components = ', nn_components 
    126135         WRITE(numout,*) '              Multicategory heat flux formulation (LIM3) nn_limflx   = ', nn_limflx 
    127136         WRITE(numout,*) '           Misc. options of sbc : ' 
     
    150159      END SELECT 
    151160      ! 
    152 #if defined key_top && ! defined key_offline 
    153       ltrcdm2dc = (ln_dm2dc .AND. ln_blk_core .AND. nn_ice==2) 
    154       IF( ltrcdm2dc )THEN 
    155          IF(lwp)THEN 
    156             WRITE(numout,*)"analytical diurnal cycle, core bulk formulation and LIM2 use: " 
    157             WRITE(numout,*)"Diurnal cycle on physics but not in passive tracers" 
    158          ENDIF 
    159       ENDIF 
    160 #else  
    161       ltrcdm2dc =  .FALSE. 
    162 #endif 
    163  
    164       ! 
     161      IF ( nn_components /= jp_iam_nemo .AND. .NOT. lk_oasis )   & 
     162         &      CALL ctl_stop( 'STOP', 'sbc_init : OPA-SAS coupled via OASIS, but key_oasis3 disabled' ) 
     163      IF ( nn_components == jp_iam_opa .AND. ln_cpl )   & 
     164         &      CALL ctl_stop( 'STOP', 'sbc_init : OPA-SAS coupled via OASIS, but ln_cpl = T in OPA' ) 
     165      IF ( nn_components == jp_iam_opa .AND. ln_mixcpl )   & 
     166         &      CALL ctl_stop( 'STOP', 'sbc_init : OPA-SAS coupled via OASIS, but ln_mixcpl = T in OPA' ) 
     167      IF ( ln_cpl .AND. .NOT. lk_oasis )    & 
     168         &      CALL ctl_stop( 'STOP', 'sbc_init : OASIS-coupled atmosphere model, but key_oasis3 disabled' ) 
     169      IF( ln_mixcpl .AND. .NOT. lk_oasis )    & 
     170         &      CALL ctl_stop( 'the forced-coupled mixed mode (ln_mixcpl) requires the cpp key key_oasis3' ) 
     171      IF( ln_mixcpl .AND. .NOT. ln_cpl )    & 
     172         &      CALL ctl_stop( 'the forced-coupled mixed mode (ln_mixcpl) requires ln_cpl = T' ) 
     173      IF( ln_mixcpl .AND. nn_components /= jp_iam_nemo )    & 
     174         &      CALL ctl_stop( 'the forced-coupled mixed mode (ln_mixcpl) is not yet working with sas-opa coupling via oasis' ) 
     175 
    165176      !                              ! allocate sbc arrays 
    166177      IF( sbc_oce_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_oce arrays' ) 
    167178 
    168179      !                          ! Checks: 
    169       IF( .NOT. ln_rnf ) THEN                      ! no specific treatment in vicinity of river mouths  
    170          ln_rnf_mouth  = .false.                       
    171          IF( sbc_rnf_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_rnf arrays' ) 
    172          nkrnf         = 0 
    173          rnf     (:,:) = 0.0_wp 
    174          rnf_b   (:,:) = 0.0_wp 
    175          rnfmsk  (:,:) = 0.0_wp 
    176          rnfmsk_z(:)   = 0.0_wp 
    177       ENDIF 
    178180      IF( nn_isf .EQ. 0 ) THEN                      ! no specific treatment in vicinity of ice shelf  
    179181         IF( sbc_isf_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_init : unable to allocate sbc_isf arrays' ) 
    180182         fwfisf  (:,:) = 0.0_wp 
     183         fwfisf_b(:,:) = 0.0_wp 
    181184      END IF 
    182       IF( nn_ice == 0  )   fr_i(:,:) = 0.e0        ! no ice in the domain, ice fraction is always zero 
     185      IF( nn_ice == 0 .AND. nn_components /= jp_iam_opa )   fr_i(:,:) = 0.e0 ! no ice in the domain, ice fraction is always zero 
    183186 
    184187      sfx(:,:) = 0.0_wp                            ! the salt flux due to freezing/melting will be computed (i.e. will be non-zero)  
     
    190193 
    191194      !                                            ! restartability    
    192       IF( MOD( nitend - nit000 + 1, nn_fsbc) /= 0 .OR.   & 
    193           MOD( nstock             , nn_fsbc) /= 0 ) THEN  
    194          WRITE(ctmp1,*) 'experiment length (', nitend - nit000 + 1, ') or nstock (', nstock,   & 
    195             &           ' is NOT a multiple of nn_fsbc (', nn_fsbc, ')' 
    196          CALL ctl_stop( ctmp1, 'Impossible to properly do model restart' ) 
    197       ENDIF 
    198       ! 
    199       IF( MOD( rday, REAL(nn_fsbc, wp) * rdt ) /= 0 )   & 
    200          &  CALL ctl_warn( 'nn_fsbc is NOT a multiple of the number of time steps in a day' ) 
    201       ! 
    202       IF( ( nn_ice == 2 .OR. nn_ice ==3 ) .AND. .NOT.( ln_blk_clio .OR. ln_blk_core .OR. lk_cpl ) )   & 
     195      IF( ( nn_ice == 2 .OR. nn_ice ==3 ) .AND. .NOT.( ln_blk_clio .OR. ln_blk_core .OR. ln_cpl ) )   & 
    203196         &   CALL ctl_stop( 'LIM sea-ice model requires a bulk formulation or coupled configuration' ) 
    204       IF( nn_ice == 4 .AND. .NOT.( ln_blk_core .OR. lk_cpl ) )   & 
    205          &   CALL ctl_stop( 'CICE sea-ice model requires ln_blk_core or lk_cpl' ) 
     197      IF( nn_ice == 4 .AND. .NOT.( ln_blk_core .OR. ln_cpl ) )   & 
     198         &   CALL ctl_stop( 'CICE sea-ice model requires ln_blk_core or ln_cpl' ) 
    206199      IF( nn_ice == 4 .AND. lk_agrif )   & 
    207200         &   CALL ctl_stop( 'CICE sea-ice model not currently available with AGRIF' ) 
     
    210203      IF( ( nn_ice /= 3 ) .AND. ( nn_limflx >= 0 ) )   & 
    211204         &   WRITE(numout,*) 'The nn_limflx>=0 option has no effect if sea ice model is not LIM3' 
    212       IF( ( nn_ice == 3 ) .AND. ( lk_cpl ) .AND. ( ( nn_limflx == -1 ) .OR. ( nn_limflx == 1 ) ) )   & 
     205      IF( ( nn_ice == 3 ) .AND. ( ln_cpl ) .AND. ( ( nn_limflx == -1 ) .OR. ( nn_limflx == 1 ) ) )   & 
    213206         &   CALL ctl_stop( 'The chosen nn_limflx for LIM3 in coupled mode must be 0 or 2' ) 
    214       IF( ( nn_ice == 3 ) .AND. ( .NOT. lk_cpl ) .AND. ( nn_limflx == 2 ) )   & 
     207      IF( ( nn_ice == 3 ) .AND. ( .NOT. ln_cpl ) .AND. ( nn_limflx == 2 ) )   & 
    215208         &   CALL ctl_stop( 'The chosen nn_limflx for LIM3 in forced mode cannot be 2' ) 
    216209 
    217210      IF( ln_dm2dc )   nday_qsr = -1   ! initialisation flag 
    218211 
    219       IF( ln_dm2dc .AND. .NOT.( ln_flx .OR. ln_blk_core ) )   & 
     212      IF( ln_dm2dc .AND. .NOT.( ln_flx .OR. ln_blk_core ) .AND. nn_components /= jp_iam_opa )   & 
    220213         &   CALL ctl_stop( 'diurnal cycle into qsr field from daily values requires a flux or core-bulk formulation' ) 
    221214       
    222       IF( ln_dm2dc .AND. ( ( NINT(rday) / ( nn_fsbc * NINT(rdt) ) )  < 8 ) )   & 
    223          &   CALL ctl_warn( 'diurnal cycle for qsr: the sampling of the diurnal cycle is too small...' ) 
    224  
    225215      IF ( ln_wave ) THEN 
    226216      !Activated wave module but neither drag nor stokes drift activated 
     
    236226         & asked coupling with drag coefficient (ln_cdgw =T) or Stokes drift (ln_sdw=T) ') 
    237227      ENDIF  
    238        
    239228      !                          ! Choice of the Surface Boudary Condition (set nsbc) 
     229      ll_purecpl = ln_cpl .AND. .NOT. ln_mixcpl 
     230      ! 
    240231      icpt = 0 
    241       IF( ln_ana          ) THEN   ;   nsbc = jp_ana    ; icpt = icpt + 1   ;   ENDIF       ! analytical      formulation 
    242       IF( ln_flx          ) THEN   ;   nsbc = jp_flx    ; icpt = icpt + 1   ;   ENDIF       ! flux            formulation 
    243       IF( ln_blk_clio     ) THEN   ;   nsbc = jp_clio   ; icpt = icpt + 1   ;   ENDIF       ! CLIO bulk       formulation 
    244       IF( ln_blk_core     ) THEN   ;   nsbc = jp_core   ; icpt = icpt + 1   ;   ENDIF       ! CORE bulk       formulation 
    245       IF( ln_blk_mfs      ) THEN   ;   nsbc = jp_mfs    ; icpt = icpt + 1   ;   ENDIF       ! MFS  bulk       formulation 
    246       IF( lk_cpl          ) THEN   ;   nsbc = jp_cpl    ; icpt = icpt + 1   ;   ENDIF       ! Coupled         formulation 
    247       IF( cp_cfg == 'gyre') THEN   ;   nsbc = jp_gyre                       ;   ENDIF       ! GYRE analytical formulation 
    248       IF( lk_esopa        )            nsbc = jp_esopa                                      ! esopa test, ALL formulations 
     232      IF( ln_ana          ) THEN   ;   nsbc = jp_ana     ; icpt = icpt + 1   ;   ENDIF       ! analytical           formulation 
     233      IF( ln_flx          ) THEN   ;   nsbc = jp_flx     ; icpt = icpt + 1   ;   ENDIF       ! flux                 formulation 
     234      IF( ln_blk_clio     ) THEN   ;   nsbc = jp_clio    ; icpt = icpt + 1   ;   ENDIF       ! CLIO bulk            formulation 
     235      IF( ln_blk_core     ) THEN   ;   nsbc = jp_core    ; icpt = icpt + 1   ;   ENDIF       ! CORE bulk            formulation 
     236      IF( ln_blk_mfs      ) THEN   ;   nsbc = jp_mfs     ; icpt = icpt + 1   ;   ENDIF       ! MFS  bulk            formulation 
     237      IF( ll_purecpl      ) THEN   ;   nsbc = jp_purecpl ; icpt = icpt + 1   ;   ENDIF       ! Pure Coupled         formulation 
     238      IF( cp_cfg == 'gyre') THEN   ;   nsbc = jp_gyre                        ;   ENDIF       ! GYRE analytical      formulation 
     239      IF( nn_components == jp_iam_opa )   & 
     240         &                  THEN   ;   nsbc = jp_none    ; icpt = icpt + 1   ;   ENDIF       ! opa coupling via SAS module 
     241      IF( lk_esopa        )            nsbc = jp_esopa                                       ! esopa test, ALL formulations 
    249242      ! 
    250243      IF( icpt /= 1 .AND. .NOT.lk_esopa ) THEN 
     
    257250      IF(lwp) THEN 
    258251         WRITE(numout,*) 
    259          IF( nsbc == jp_esopa )   WRITE(numout,*) '              ESOPA test All surface boundary conditions' 
    260          IF( nsbc == jp_gyre  )   WRITE(numout,*) '              GYRE analytical formulation' 
    261          IF( nsbc == jp_ana   )   WRITE(numout,*) '              analytical formulation' 
    262          IF( nsbc == jp_flx   )   WRITE(numout,*) '              flux formulation' 
    263          IF( nsbc == jp_clio  )   WRITE(numout,*) '              CLIO bulk formulation' 
    264          IF( nsbc == jp_core  )   WRITE(numout,*) '              CORE bulk formulation' 
    265          IF( nsbc == jp_cpl   )   WRITE(numout,*) '              coupled formulation' 
    266          IF( nsbc == jp_mfs   )   WRITE(numout,*) '              MFS Bulk formulation' 
    267       ENDIF 
    268       ! 
     252         IF( nsbc == jp_esopa   )   WRITE(numout,*) '              ESOPA test All surface boundary conditions' 
     253         IF( nsbc == jp_gyre    )   WRITE(numout,*) '              GYRE analytical formulation' 
     254         IF( nsbc == jp_ana     )   WRITE(numout,*) '              analytical formulation' 
     255         IF( nsbc == jp_flx     )   WRITE(numout,*) '              flux formulation' 
     256         IF( nsbc == jp_clio    )   WRITE(numout,*) '              CLIO bulk formulation' 
     257         IF( nsbc == jp_core    )   WRITE(numout,*) '              CORE bulk formulation' 
     258         IF( nsbc == jp_purecpl )   WRITE(numout,*) '              pure coupled formulation' 
     259         IF( nsbc == jp_mfs     )   WRITE(numout,*) '              MFS Bulk formulation' 
     260         IF( nsbc == jp_none    )   WRITE(numout,*) '              OPA coupled to SAS via oasis' 
     261         IF( ln_mixcpl          )   WRITE(numout,*) '              + forced-coupled mixed formulation' 
     262         IF( nn_components/= jp_iam_nemo )  & 
     263            &                       WRITE(numout,*) '              + OASIS coupled SAS' 
     264      ENDIF 
     265      ! 
     266      IF( lk_oasis )   CALL sbc_cpl_init (nn_ice)   ! OASIS initialisation. must be done before: (1) first time step 
     267      !                                                     !                                            (2) the use of nn_fsbc 
     268 
     269!     nn_fsbc initialization if OPA-SAS coupling via OASIS 
     270!     sas model time step has to be declared in OASIS (mandatory) -> nn_fsbc has to be modified accordingly 
     271      IF ( nn_components /= jp_iam_nemo ) THEN 
     272 
     273         IF ( nn_components == jp_iam_opa ) nn_fsbc = cpl_freq('O_SFLX') / NINT(rdt) 
     274         IF ( nn_components == jp_iam_sas ) nn_fsbc = cpl_freq('I_SFLX') / NINT(rdt) 
     275         ! 
     276         IF(lwp)THEN 
     277            WRITE(numout,*) 
     278            WRITE(numout,*)"   OPA-SAS coupled via OASIS : nn_fsbc re-defined from OASIS namcouple ", nn_fsbc 
     279            WRITE(numout,*) 
     280         ENDIF 
     281      ENDIF 
     282 
     283      IF( MOD( nitend - nit000 + 1, nn_fsbc) /= 0 .OR.   & 
     284          MOD( nstock             , nn_fsbc) /= 0 ) THEN  
     285         WRITE(ctmp1,*) 'experiment length (', nitend - nit000 + 1, ') or nstock (', nstock,   & 
     286            &           ' is NOT a multiple of nn_fsbc (', nn_fsbc, ')' 
     287         CALL ctl_stop( ctmp1, 'Impossible to properly do model restart' ) 
     288      ENDIF 
     289      ! 
     290      IF( MOD( rday, REAL(nn_fsbc, wp) * rdt ) /= 0 )   & 
     291         &  CALL ctl_warn( 'nn_fsbc is NOT a multiple of the number of time steps in a day' ) 
     292      ! 
     293      IF( ln_dm2dc .AND. ( ( NINT(rday) / ( nn_fsbc * NINT(rdt) ) )  < 8 ) )   & 
     294         &   CALL ctl_warn( 'diurnal cycle for qsr: the sampling of the diurnal cycle is too small...' ) 
     295 
    269296                               CALL sbc_ssm_init               ! Sea-surface mean fields initialisation 
    270297      ! 
    271298      IF( ln_ssr           )   CALL sbc_ssr_init               ! Sea-Surface Restoring initialisation 
    272299      ! 
     300                               CALL sbc_rnf_init               ! Runof initialisation 
     301      ! 
     302      IF( nn_ice == 3      )   CALL sbc_lim_init               ! LIM3 initialisation 
     303 
    273304      IF( nn_ice == 4      )   CALL cice_sbc_init( nsbc )      ! CICE initialisation 
    274       ! 
    275       IF( nsbc   == jp_cpl )   CALL sbc_cpl_init (nn_ice)      ! OASIS initialisation. must be done before first time step 
    276  
     305       
    277306   END SUBROUTINE sbc_init 
    278307 
     
    317346                                                         ! (caution called before sbc_ssm) 
    318347      ! 
    319       CALL sbc_ssm( kt )                                 ! ocean sea surface variables (sst_m, sss_m, ssu_m, ssv_m) 
    320       !                                                  ! averaged over nf_sbc time-step 
     348      IF( nn_components /= jp_iam_sas )   CALL sbc_ssm( kt )   ! ocean sea surface variables (sst_m, sss_m, ssu_m, ssv_m) 
     349      !                                                        ! averaged over nf_sbc time-step 
    321350 
    322351      IF (ln_wave) CALL sbc_wave( kt ) 
     
    329358      CASE( jp_flx   )   ;   CALL sbc_flx     ( kt )                    ! flux formulation 
    330359      CASE( jp_clio  )   ;   CALL sbc_blk_clio( kt )                    ! bulk formulation : CLIO for the ocean 
    331       CASE( jp_core  )   ;   CALL sbc_blk_core( kt )                    ! bulk formulation : CORE for the ocean 
    332       CASE( jp_cpl   )   ;   CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! coupled formulation 
     360      CASE( jp_core  )    
     361         IF( nn_components == jp_iam_sas ) & 
     362            &                CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! OPA-SAS coupling: SAS receiving fields from OPA  
     363                             CALL sbc_blk_core( kt )                    ! bulk formulation : CORE for the ocean 
     364                                                                        ! from oce: sea surface variables (sst_m, sss_m,  ssu_m,  ssv_m) 
     365      CASE( jp_purecpl )  ;  CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! pure coupled formulation 
     366                                                                        ! 
    333367      CASE( jp_mfs   )   ;   CALL sbc_blk_mfs ( kt )                    ! bulk formulation : MFS for the ocean 
     368      CASE( jp_none  )  
     369         IF( nn_components == jp_iam_opa ) & 
     370                             CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! OPA-SAS coupling: OPA receiving fields from SAS 
    334371      CASE( jp_esopa )                                 
    335372                             CALL sbc_ana     ( kt )                    ! ESOPA, test ALL the formulations 
     
    341378      END SELECT 
    342379 
     380      IF( ln_mixcpl )        CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice )   ! forced-coupled mixed formulation after forcing 
     381 
     382 
    343383      !                                            !==  Misc. Options  ==! 
    344384       
     
    363403      !                                                           ! (update freshwater fluxes) 
    364404!RBbug do not understand why see ticket 667 
    365       !clem-bugsal CALL lbc_lnk( emp, 'T', 1. ) 
     405!clem: it looks like it is necessary for the north fold (in certain circumstances). Don't know why. 
     406      CALL lbc_lnk( emp, 'T', 1. ) 
    366407      ! 
    367408      IF( kt == nit000 ) THEN                          !   set the forcing field at nit000 - 1    ! 
     
    404445         ! CALL iom_rstput( kt, nitrst, numrow, 'qsr_b'  , qsr  ) 
    405446         CALL iom_rstput( kt, nitrst, numrow, 'emp_b'  , emp  ) 
    406          CALL iom_rstput( kt, nitrst, numrow, 'sfx_b' , sfx ) 
     447         CALL iom_rstput( kt, nitrst, numrow, 'sfx_b'  , sfx ) 
    407448      ENDIF 
    408449 
     
    419460         CALL iom_put( "qns"   , qns        )                   ! solar heat flux 
    420461         CALL iom_put( "qsr"   ,       qsr  )                   ! solar heat flux 
    421          IF( nn_ice > 0 )   CALL iom_put( "ice_cover", fr_i )   ! ice fraction  
     462         IF( nn_ice > 0 .OR. nn_components == jp_iam_opa )   CALL iom_put( "ice_cover", fr_i )   ! ice fraction  
    422463         CALL iom_put( "taum"  , taum       )                   ! wind stress module  
    423464         CALL iom_put( "wspd"  , wndm       )                   ! wind speed  module over free ocean or leads in presence of sea-ice 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcrnf.F90

    r5234 r5443  
    3232 
    3333   PUBLIC   sbc_rnf       ! routine call in sbcmod module 
    34    PUBLIC   sbc_rnf_div   ! routine called in sshwzv module 
     34   PUBLIC   sbc_rnf_div   ! routine called in divcurl module 
    3535   PUBLIC   sbc_rnf_alloc ! routine call in sbcmod module 
    3636   PUBLIC   sbc_rnf_init  ! (PUBLIC for TAM) 
    3737   !                                                     !!* namsbc_rnf namelist * 
    38    CHARACTER(len=100), PUBLIC ::   cn_dir          !: Root directory for location of ssr files 
    39    LOGICAL           , PUBLIC ::   ln_rnf_depth    !: depth       river runoffs attribute specified in a file 
    40    LOGICAL           , PUBLIC ::   ln_rnf_tem      !: temperature river runoffs attribute specified in a file 
     38   CHARACTER(len=100)         ::   cn_dir          !: Root directory for location of rnf files 
     39   LOGICAL                    ::   ln_rnf_depth      !: depth       river runoffs attribute specified in a file 
     40   LOGICAL                    ::   ln_rnf_depth_ini  !: depth       river runoffs  computed at the initialisation 
     41   REAL(wp)                   ::   rn_rnf_max        !: maximum value of the runoff climatologie ( ln_rnf_depth_ini = .true ) 
     42   REAL(wp)                   ::   rn_dep_max        !: depth over which runoffs is spread ( ln_rnf_depth_ini = .true ) 
     43   INTEGER                    ::   nn_rnf_depth_file !: create (=1) a runoff depth file or not (=0) 
     44   LOGICAL                    ::   ln_rnf_tem      !: temperature river runoffs attribute specified in a file 
    4145   LOGICAL           , PUBLIC ::   ln_rnf_sal      !: salinity    river runoffs attribute specified in a file 
    42    LOGICAL           , PUBLIC ::   ln_rnf_emp      !: runoffs into a file to be read or already into precipitation 
    4346   TYPE(FLD_N)       , PUBLIC ::   sn_rnf          !: information about the runoff file to be read 
    44    TYPE(FLD_N)       , PUBLIC ::   sn_cnf          !: information about the runoff mouth file to be read 
     47   TYPE(FLD_N)               ::   sn_cnf          !: information about the runoff mouth file to be read 
    4548   TYPE(FLD_N)                ::   sn_s_rnf        !: information about the salinities of runoff file to be read 
    4649   TYPE(FLD_N)                ::   sn_t_rnf        !: information about the temperatures of runoff file to be read 
    4750   TYPE(FLD_N)                ::   sn_dep_rnf      !: information about the depth which river inflow affects 
    4851   LOGICAL           , PUBLIC ::   ln_rnf_mouth    !: specific treatment in mouths vicinity 
    49    REAL(wp)          , PUBLIC ::   rn_hrnf         !: runoffs, depth over which enhanced vertical mixing is used 
     52   REAL(wp)                  ::   rn_hrnf         !: runoffs, depth over which enhanced vertical mixing is used 
    5053   REAL(wp)          , PUBLIC ::   rn_avt_rnf      !: runoffs, value of the additional vertical mixing coef. [m2/s] 
    51    REAL(wp)          , PUBLIC ::   rn_rfact        !: multiplicative factor for runoff 
     54   REAL(wp)                   ::   rn_rfact        !: multiplicative factor for runoff 
     55 
     56   LOGICAL           , PUBLIC ::   l_rnfcpl = .false.       ! runoffs recieved from oasis 
    5257 
    5358   INTEGER , PUBLIC  ::   nkrnf = 0         !: nb of levels over which Kz is increased at river mouths 
     
    5863   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   rnf_tsc_b, rnf_tsc  !: before and now T & S runoff contents   [K.m/s & PSU.m/s]    
    5964 
    60    TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) ::   sf_rnf       ! structure: river runoff (file information, fields read) 
    61    TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) ::   sf_s_rnf     ! structure: river runoff salinity (file information, fields read)   
    62    TYPE(FLD), PUBLIC, ALLOCATABLE, DIMENSION(:) ::   sf_t_rnf     ! structure: river runoff temperature (file information, fields read)   
     65   TYPE(FLD),       ALLOCATABLE, DIMENSION(:) ::   sf_rnf       ! structure: river runoff (file information, fields read) 
     66   TYPE(FLD),       ALLOCATABLE, DIMENSION(:) ::   sf_s_rnf     ! structure: river runoff salinity (file information, fields read)   
     67   TYPE(FLD),       ALLOCATABLE, DIMENSION(:) ::   sf_t_rnf     ! structure: river runoff temperature (file information, fields read)   
    6368  
    6469   !! * Substitutions   
     
    105110      CALL wrk_alloc( jpi,jpj, ztfrz) 
    106111 
    107       ! 
    108       IF( kt == nit000 )   CALL sbc_rnf_init                           ! Read namelist and allocate structures 
    109  
    110112      !                                            ! ---------------------------------------- ! 
    111113      IF( kt /= nit000 ) THEN                      !          Swap of forcing fields          ! 
     
    116118      ENDIF 
    117119 
    118       !                                                   !-------------------! 
    119       IF( .NOT. ln_rnf_emp ) THEN                         !   Update runoff   ! 
    120          !                                                !-------------------! 
    121          ! 
    122                              CALL fld_read ( kt, nn_fsbc, sf_rnf   )    ! Read Runoffs data and provide it at kt 
    123          IF( ln_rnf_tem  )   CALL fld_read ( kt, nn_fsbc, sf_t_rnf )    ! idem for runoffs temperature if required 
    124          IF( ln_rnf_sal  )   CALL fld_read ( kt, nn_fsbc, sf_s_rnf )    ! idem for runoffs salinity    if required 
    125          ! 
    126          ! Runoff reduction only associated to the ORCA2_LIM configuration 
    127          ! when reading the NetCDF file runoff_1m_nomask.nc 
    128          IF( cp_cfg == 'orca' .AND. jp_cfg == 2 )   THEN 
    129             WHERE( 40._wp < gphit(:,:) .AND. gphit(:,:) < 65._wp ) 
    130                sf_rnf(1)%fnow(:,:,1) = 0.85 * sf_rnf(1)%fnow(:,:,1) 
     120      !                                            !-------------------! 
     121      !                                            !   Update runoff   ! 
     122      !                                            !-------------------! 
     123      ! 
     124      IF( .NOT. l_rnfcpl )   CALL fld_read ( kt, nn_fsbc, sf_rnf   )    ! Read Runoffs data and provide it at kt 
     125      IF(   ln_rnf_tem   )   CALL fld_read ( kt, nn_fsbc, sf_t_rnf )    ! idem for runoffs temperature if required 
     126      IF(   ln_rnf_sal   )   CALL fld_read ( kt, nn_fsbc, sf_s_rnf )    ! idem for runoffs salinity    if required 
     127      ! 
     128      ! Runoff reduction only associated to the ORCA2_LIM configuration 
     129      ! when reading the NetCDF file runoff_1m_nomask.nc 
     130      IF( cp_cfg == 'orca' .AND. jp_cfg == 2 .AND. .NOT. l_rnfcpl )   THEN 
     131         WHERE( 40._wp < gphit(:,:) .AND. gphit(:,:) < 65._wp ) 
     132            sf_rnf(1)%fnow(:,:,1) = 0.85 * sf_rnf(1)%fnow(:,:,1) 
     133         END WHERE 
     134      ENDIF 
     135      ! 
     136      IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 
     137         ! 
     138         IF( .NOT. l_rnfcpl )   rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) )       ! updated runoff value at time step kt 
     139         ! 
     140         !                                                     ! set temperature & salinity content of runoffs 
     141         IF( ln_rnf_tem ) THEN                                       ! use runoffs temperature data 
     142            rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 
     143            WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp )             ! if missing data value use SST as runoffs temperature 
     144               rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 
    131145            END WHERE 
    132          ENDIF 
    133          ! 
    134          IF( MOD( kt - 1, nn_fsbc ) == 0 ) THEN 
    135             ! 
    136             rnf(:,:) = rn_rfact * ( sf_rnf(1)%fnow(:,:,1) )       ! updated runoff value at time step kt 
    137             ! 
    138             !                                                     ! set temperature & salinity content of runoffs 
    139             IF( ln_rnf_tem ) THEN                                       ! use runoffs temperature data 
    140                rnf_tsc(:,:,jp_tem) = ( sf_t_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 
    141                WHERE( sf_t_rnf(1)%fnow(:,:,1) == -999._wp )             ! if missing data value use SST as runoffs temperature 
    142                    rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 
    143                END WHERE 
    144                WHERE( sf_t_rnf(1)%fnow(:,:,1) == -222._wp )             ! where fwf comes from melting of ice shelves or iceberg 
    145                    ztfrz(:,:) = -1.9 !tfreez( sss_m(:,:) ) !PM to be discuss (trouble if sensitivity study) 
    146                    rnf_tsc(:,:,jp_tem) = ztfrz(:,:) * rnf(:,:) * r1_rau0 - rnf(:,:) * lfusisf * r1_rau0_rcp 
    147                END WHERE 
    148             ELSE                                                        ! use SST as runoffs temperature 
    149                rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 
    150             ENDIF 
    151             !                                                           ! use runoffs salinity data 
    152             IF( ln_rnf_sal )   rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 
    153             !                                                           ! else use S=0 for runoffs (done one for all in the init) 
    154             IF ( ANY( rnf(:,:) < 0._wp ) ) z_err=1 
    155             IF(lk_mpp) CALL mpp_sum(z_err) 
    156             IF( z_err > 0 ) CALL ctl_stop( 'sbc_rnf : negative runnoff values exist' ) 
    157             ! 
    158             CALL iom_put( "runoffs", rnf )         ! output runoffs arrays 
    159          ENDIF 
    160          ! 
    161       ENDIF 
    162       ! 
     146            WHERE( sf_t_rnf(1)%fnow(:,:,1) == -222._wp )             ! where fwf comes from melting of ice shelves or iceberg 
     147               ztfrz(:,:) = -1.9 !tfreez( sss_m(:,:) ) !PM to be discuss (trouble if sensitivity study) 
     148               rnf_tsc(:,:,jp_tem) = ztfrz(:,:) * rnf(:,:) * r1_rau0 - rnf(:,:) * lfusisf * r1_rau0_rcp 
     149            END WHERE 
     150         ELSE                                                        ! use SST as runoffs temperature 
     151            rnf_tsc(:,:,jp_tem) = sst_m(:,:) * rnf(:,:) * r1_rau0 
     152         ENDIF 
     153         !                                                           ! use runoffs salinity data 
     154         IF( ln_rnf_sal )   rnf_tsc(:,:,jp_sal) = ( sf_s_rnf(1)%fnow(:,:,1) ) * rnf(:,:) * r1_rau0 
     155         !                                                           ! else use S=0 for runoffs (done one for all in the init) 
     156         CALL iom_put( "runoffs", rnf )         ! output runoffs arrays 
     157      ENDIF 
     158      ! 
     159      !                                                ! ---------------------------------------- ! 
    163160      IF( kt == nit000 ) THEN                          !   set the forcing field at nit000 - 1    ! 
    164161         !                                             ! ---------------------------------------- ! 
     
    171168         ELSE                                                   !* no restart: set from nit000 values 
    172169            IF(lwp) WRITE(numout,*) '          nit000-1 runoff forcing fields set to nit000' 
    173              rnf_b    (:,:  ) = rnf    (:,:  ) 
    174              rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:) 
     170            rnf_b    (:,:  ) = rnf    (:,:  ) 
     171            rnf_tsc_b(:,:,:) = rnf_tsc(:,:,:) 
    175172         ENDIF 
    176173      ENDIF 
     
    186183         CALL iom_rstput( kt, nitrst, numrow, 'rnf_sc_b', rnf_tsc(:,:,jp_sal) ) 
    187184      ENDIF 
     185      ! 
    188186      CALL wrk_dealloc( jpi,jpj, ztfrz) 
    189187      ! 
     
    255253      !!---------------------------------------------------------------------- 
    256254      CHARACTER(len=32) ::   rn_dep_file   ! runoff file name 
    257       INTEGER           ::   ji, jj, jk    ! dummy loop indices 
     255      INTEGER           ::   ji, jj, jk, jm    ! dummy loop indices 
    258256      INTEGER           ::   ierror, inum  ! temporary integer 
    259257      INTEGER           ::   ios           ! Local integer output status for namelist read 
    260       ! 
    261       NAMELIST/namsbc_rnf/ cn_dir, ln_rnf_emp, ln_rnf_depth, ln_rnf_tem, ln_rnf_sal,   & 
     258      INTEGER           ::   nbrec         ! temporary integer 
     259      REAL(wp)          ::   zacoef   
     260      REAL(wp), DIMENSION(12)                 :: zrec             ! times records 
     261      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: zrnfcl     
     262      REAL(wp), DIMENSION(:,:  ), ALLOCATABLE :: zrnf 
     263      ! 
     264      NAMELIST/namsbc_rnf/ cn_dir            , ln_rnf_depth, ln_rnf_tem, ln_rnf_sal,   & 
    262265         &                 sn_rnf, sn_cnf    , sn_s_rnf    , sn_t_rnf  , sn_dep_rnf,   & 
    263          &                 ln_rnf_mouth      , rn_hrnf     , rn_avt_rnf, rn_rfact 
    264       !!---------------------------------------------------------------------- 
     266         &                 ln_rnf_mouth      , rn_hrnf     , rn_avt_rnf, rn_rfact,     & 
     267         &                 ln_rnf_depth_ini  , rn_dep_max  , rn_rnf_max, nn_rnf_depth_file 
     268      !!---------------------------------------------------------------------- 
     269      ! 
     270      !                                         !==  allocate runoff arrays 
     271      IF( sbc_rnf_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_rnf_alloc : unable to allocate arrays' ) 
     272      ! 
     273      IF( .NOT. ln_rnf ) THEN                      ! no specific treatment in vicinity of river mouths  
     274         ln_rnf_mouth  = .FALSE.                   ! default definition needed for example by sbc_ssr or by tra_adv_muscl 
     275         nkrnf         = 0 
     276         rnf     (:,:) = 0.0_wp 
     277         rnf_b   (:,:) = 0.0_wp 
     278         rnfmsk  (:,:) = 0.0_wp 
     279         rnfmsk_z(:)   = 0.0_wp 
     280         RETURN 
     281      ENDIF 
    265282      ! 
    266283      !                                   ! ============ 
     
    283300         WRITE(numout,*) '~~~~~~~ ' 
    284301         WRITE(numout,*) '   Namelist namsbc_rnf' 
    285          WRITE(numout,*) '      runoff in a file to be read                ln_rnf_emp   = ', ln_rnf_emp 
    286302         WRITE(numout,*) '      specific river mouths treatment            ln_rnf_mouth = ', ln_rnf_mouth 
    287303         WRITE(numout,*) '      river mouth additional Kz                  rn_avt_rnf   = ', rn_avt_rnf 
     
    289305         WRITE(numout,*) '      multiplicative factor for runoff           rn_rfact     = ', rn_rfact 
    290306      ENDIF 
    291       ! 
    292307      !                                   ! ================== 
    293308      !                                   !   Type of runoff 
    294309      !                                   ! ================== 
    295       !                                         !==  allocate runoff arrays 
    296       IF( sbc_rnf_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'sbc_rnf_alloc : unable to allocate arrays' ) 
    297       ! 
    298       IF( ln_rnf_emp ) THEN                     !==  runoffs directly provided in the precipitations  ==! 
    299          IF(lwp) WRITE(numout,*) 
    300          IF(lwp) WRITE(numout,*) '          runoffs directly provided in the precipitations' 
    301          IF( ln_rnf_depth .OR. ln_rnf_tem .OR. ln_rnf_sal ) THEN 
    302            CALL ctl_warn( 'runoffs already included in precipitations, so runoff (T,S, depth) attributes will not be used' ) 
    303            ln_rnf_depth = .FALSE.   ;   ln_rnf_tem = .FALSE.   ;   ln_rnf_sal = .FALSE. 
    304          ENDIF 
    305          ! 
    306       ELSE                                      !==  runoffs read in a file : set sf_rnf structure  ==! 
    307          ! 
     310      ! 
     311      IF( .NOT. l_rnfcpl ) THEN                     
    308312         ALLOCATE( sf_rnf(1), STAT=ierror )         ! Create sf_rnf structure (runoff inflow) 
    309313         IF(lwp) WRITE(numout,*) 
     
    314318         ALLOCATE( sf_rnf(1)%fnow(jpi,jpj,1)   ) 
    315319         IF( sn_rnf%ln_tint ) ALLOCATE( sf_rnf(1)%fdta(jpi,jpj,1,2) ) 
    316          !                                          ! fill sf_rnf with the namelist (sn_rnf) and control print 
    317320         CALL fld_fill( sf_rnf, (/ sn_rnf /), cn_dir, 'sbc_rnf_init', 'read runoffs data', 'namsbc_rnf' ) 
    318          ! 
    319          IF( ln_rnf_tem ) THEN                      ! Create (if required) sf_t_rnf structure 
    320             IF(lwp) WRITE(numout,*) 
    321             IF(lwp) WRITE(numout,*) '          runoffs temperatures read in a file' 
    322             ALLOCATE( sf_t_rnf(1), STAT=ierror  ) 
    323             IF( ierror > 0 ) THEN 
    324                CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' )   ;   RETURN 
    325             ENDIF 
    326             ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1)   ) 
    327             IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) ) 
    328             CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 
    329          ENDIF 
    330          ! 
    331          IF( ln_rnf_sal  ) THEN                     ! Create (if required) sf_s_rnf and sf_t_rnf structures 
    332             IF(lwp) WRITE(numout,*) 
    333             IF(lwp) WRITE(numout,*) '          runoffs salinities read in a file' 
    334             ALLOCATE( sf_s_rnf(1), STAT=ierror  ) 
    335             IF( ierror > 0 ) THEN 
    336                CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' )   ;   RETURN 
    337             ENDIF 
    338             ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1)   ) 
    339             IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) ) 
    340             CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 
    341          ENDIF 
    342          ! 
    343          IF( ln_rnf_depth ) THEN                    ! depth of runoffs set from a file 
    344             IF(lwp) WRITE(numout,*) 
    345             IF(lwp) WRITE(numout,*) '          runoffs depth read in a file' 
    346             rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 
    347             IF( .NOT. sn_dep_rnf%ln_clim ) THEN   ;   WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear    ! add year  
    348                IF( sn_dep_rnf%cltype == 'monthly' )   WRITE(rn_dep_file, '(a,"m",i2)'  ) TRIM( rn_dep_file ), nmonth   ! add month  
    349             ENDIF  
    350             CALL iom_open ( rn_dep_file, inum )                           ! open file 
    351             CALL iom_get  ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf )   ! read the river mouth array 
    352             CALL iom_close( inum )                                        ! close file 
    353             ! 
    354             nk_rnf(:,:) = 0                               ! set the number of level over which river runoffs are applied 
    355             DO jj = 1, jpj 
    356                DO ji = 1, jpi 
    357                   IF( h_rnf(ji,jj) > 0._wp ) THEN 
    358                      jk = 2 
    359                      DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ;  jk = jk + 1 ;  END DO 
    360                      nk_rnf(ji,jj) = jk 
    361                   ELSEIF( h_rnf(ji,jj) == -1._wp   ) THEN   ;  nk_rnf(ji,jj) = 1 
    362                   ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN   ;  nk_rnf(ji,jj) = mbkt(ji,jj) 
    363                   ELSE 
    364                      CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999'  ) 
    365                      WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 
    366                   ENDIF 
     321      ENDIF 
     322      ! 
     323      IF( ln_rnf_tem ) THEN                      ! Create (if required) sf_t_rnf structure 
     324         IF(lwp) WRITE(numout,*) 
     325         IF(lwp) WRITE(numout,*) '          runoffs temperatures read in a file' 
     326         ALLOCATE( sf_t_rnf(1), STAT=ierror  ) 
     327         IF( ierror > 0 ) THEN 
     328            CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_t_rnf structure' )   ;   RETURN 
     329         ENDIF 
     330         ALLOCATE( sf_t_rnf(1)%fnow(jpi,jpj,1)   ) 
     331         IF( sn_t_rnf%ln_tint ) ALLOCATE( sf_t_rnf(1)%fdta(jpi,jpj,1,2) ) 
     332         CALL fld_fill (sf_t_rnf, (/ sn_t_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff temperature data', 'namsbc_rnf' ) 
     333      ENDIF 
     334      ! 
     335      IF( ln_rnf_sal  ) THEN                     ! Create (if required) sf_s_rnf and sf_t_rnf structures 
     336         IF(lwp) WRITE(numout,*) 
     337         IF(lwp) WRITE(numout,*) '          runoffs salinities read in a file' 
     338         ALLOCATE( sf_s_rnf(1), STAT=ierror  ) 
     339         IF( ierror > 0 ) THEN 
     340            CALL ctl_stop( 'sbc_rnf_init: unable to allocate sf_s_rnf structure' )   ;   RETURN 
     341         ENDIF 
     342         ALLOCATE( sf_s_rnf(1)%fnow(jpi,jpj,1)   ) 
     343         IF( sn_s_rnf%ln_tint ) ALLOCATE( sf_s_rnf(1)%fdta(jpi,jpj,1,2) ) 
     344         CALL fld_fill (sf_s_rnf, (/ sn_s_rnf /), cn_dir, 'sbc_rnf_init', 'read runoff salinity data', 'namsbc_rnf' ) 
     345      ENDIF 
     346      ! 
     347      IF( ln_rnf_depth ) THEN                    ! depth of runoffs set from a file 
     348         IF(lwp) WRITE(numout,*) 
     349         IF(lwp) WRITE(numout,*) '          runoffs depth read in a file' 
     350         rn_dep_file = TRIM( cn_dir )//TRIM( sn_dep_rnf%clname ) 
     351         IF( .NOT. sn_dep_rnf%ln_clim ) THEN   ;   WRITE(rn_dep_file, '(a,"_y",i4)' ) TRIM( rn_dep_file ), nyear    ! add year  
     352            IF( sn_dep_rnf%cltype == 'monthly' )   WRITE(rn_dep_file, '(a,"m",i2)'  ) TRIM( rn_dep_file ), nmonth   ! add month  
     353         ENDIF 
     354         CALL iom_open ( rn_dep_file, inum )                           ! open file 
     355         CALL iom_get  ( inum, jpdom_data, sn_dep_rnf%clvar, h_rnf )   ! read the river mouth array 
     356         CALL iom_close( inum )                                        ! close file 
     357         ! 
     358         nk_rnf(:,:) = 0                               ! set the number of level over which river runoffs are applied 
     359         DO jj = 1, jpj 
     360            DO ji = 1, jpi 
     361               IF( h_rnf(ji,jj) > 0._wp ) THEN 
     362                  jk = 2 
     363                  DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ;  jk = jk + 1 
     364                  END DO 
     365                  nk_rnf(ji,jj) = jk 
     366               ELSEIF( h_rnf(ji,jj) == -1._wp   ) THEN   ;  nk_rnf(ji,jj) = 1 
     367               ELSEIF( h_rnf(ji,jj) == -999._wp ) THEN   ;  nk_rnf(ji,jj) = mbkt(ji,jj) 
     368               ELSE 
     369                  CALL ctl_stop( 'sbc_rnf_init: runoff depth not positive, and not -999 or -1, rnf value in file fort.999'  ) 
     370                  WRITE(999,*) 'ji, jj, h_rnf(ji,jj) :', ji, jj, h_rnf(ji,jj) 
     371               ENDIF 
     372            END DO 
     373         END DO 
     374         DO jj = 1, jpj                                ! set the associated depth 
     375            DO ji = 1, jpi 
     376               h_rnf(ji,jj) = 0._wp 
     377               DO jk = 1, nk_rnf(ji,jj) 
     378                  h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 
    367379               END DO 
    368380            END DO 
    369             DO jj = 1, jpj                                ! set the associated depth 
    370                DO ji = 1, jpi 
    371                   h_rnf(ji,jj) = 0._wp 
    372                   DO jk = 1, nk_rnf(ji,jj) 
    373                      h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 
     381         END DO 
     382         ! 
     383      ELSE IF( ln_rnf_depth_ini ) THEN           ! runoffs applied at the surface 
     384         ! 
     385         IF(lwp) WRITE(numout,*) 
     386         IF(lwp) WRITE(numout,*) '    depth of runoff computed once from max value of runoff' 
     387         IF(lwp) WRITE(numout,*) '    max value of the runoff climatologie (over global domain) rn_rnf_max = ', rn_rnf_max 
     388         IF(lwp) WRITE(numout,*) '    depth over which runoffs is spread                        rn_dep_max = ', rn_dep_max 
     389         IF(lwp) WRITE(numout,*) '     create (=1) a runoff depth file or not (=0)      nn_rnf_depth_file  = ', nn_rnf_depth_file 
     390 
     391         CALL iom_open( TRIM( sn_rnf%clname ), inum )    !  open runoff file 
     392         CALL iom_gettime( inum, zrec, kntime=nbrec) 
     393         ALLOCATE( zrnfcl(jpi,jpj,nbrec) )     ;      ALLOCATE( zrnf(jpi,jpj) ) 
     394         DO jm = 1, nbrec 
     395            CALL iom_get( inum, jpdom_data, TRIM( sn_rnf%clvar ), zrnfcl(:,:,jm), jm ) 
     396         END DO 
     397         CALL iom_close( inum ) 
     398         zrnf(:,:) = MAXVAL( zrnfcl(:,:,:), DIM=3 )   !  maximum value in time 
     399         DEALLOCATE( zrnfcl ) 
     400         ! 
     401         h_rnf(:,:) = 1. 
     402         ! 
     403         zacoef = rn_dep_max / rn_rnf_max            ! coef of linear relation between runoff and its depth (150m for max of runoff) 
     404         ! 
     405         WHERE( zrnf(:,:) > 0._wp )  h_rnf(:,:) = zacoef * zrnf(:,:)   ! compute depth for all runoffs 
     406         ! 
     407         DO jj = 1, jpj                     ! take in account min depth of ocean rn_hmin 
     408            DO ji = 1, jpi 
     409               IF( zrnf(ji,jj) > 0._wp ) THEN 
     410                  jk = mbkt(ji,jj) 
     411                  h_rnf(ji,jj) = MIN( h_rnf(ji,jj), gdept_0(ji,jj,jk ) ) 
     412               ENDIF 
     413            END DO 
     414         END DO 
     415         ! 
     416         nk_rnf(:,:) = 0                       ! number of levels on which runoffs are distributed 
     417         DO jj = 1, jpj 
     418            DO ji = 1, jpi 
     419               IF( zrnf(ji,jj) > 0._wp ) THEN 
     420                  jk = 2 
     421                  DO WHILE ( jk /= mbkt(ji,jj) .AND. gdept_0(ji,jj,jk) < h_rnf(ji,jj) ) ;  jk = jk + 1 
    374422                  END DO 
     423                  nk_rnf(ji,jj) = jk 
     424               ELSE 
     425                  nk_rnf(ji,jj) = 1 
     426               ENDIF 
     427            END DO 
     428         END DO 
     429         ! 
     430         DEALLOCATE( zrnf ) 
     431         ! 
     432         DO jj = 1, jpj                                ! set the associated depth 
     433            DO ji = 1, jpi 
     434               h_rnf(ji,jj) = 0._wp 
     435               DO jk = 1, nk_rnf(ji,jj) 
     436                  h_rnf(ji,jj) = h_rnf(ji,jj) + fse3t(ji,jj,jk) 
    375437               END DO 
    376438            END DO 
    377          ELSE                                       ! runoffs applied at the surface 
    378             nk_rnf(:,:) = 1 
    379             h_rnf (:,:) = fse3t(:,:,1) 
    380          ENDIF 
    381          ! 
     439         END DO 
     440         ! 
     441         IF( nn_rnf_depth_file == 1 ) THEN      !  save  output nb levels for runoff 
     442            IF(lwp) WRITE(numout,*) '              create runoff depht file' 
     443            CALL iom_open  ( TRIM( sn_dep_rnf%clname ), inum, ldwrt = .TRUE., kiolib = jprstlib ) 
     444            CALL iom_rstput( 0, 0, inum, 'rodepth', h_rnf ) 
     445            CALL iom_close ( inum ) 
     446         ENDIF 
     447      ELSE                                       ! runoffs applied at the surface 
     448         nk_rnf(:,:) = 1 
     449         h_rnf (:,:) = fse3t(:,:,1) 
    382450      ENDIF 
    383451      ! 
     
    400468         IF( rn_hrnf > 0._wp ) THEN 
    401469            nkrnf = 2 
    402             DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf )   ;   nkrnf = nkrnf + 1   ;   END DO 
     470            DO WHILE( nkrnf /= jpkm1 .AND. gdepw_1d(nkrnf+1) < rn_hrnf )   ;   nkrnf = nkrnf + 1 
     471            END DO 
    403472            IF( ln_sco )   CALL ctl_warn( 'sbc_rnf: number of levels over which Kz is increased is computed for zco...' ) 
    404473         ENDIF 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcssm.F90

    r5234 r5443  
    5858      REAL(wp) ::   zcoef, zf_sbc       ! local scalar 
    5959      REAL(wp), DIMENSION(jpi,jpj,jpts) :: zts 
    60       REAL(wp), DIMENSION(jpi,jpj)      :: zub, zvb,zdep 
    6160      !!--------------------------------------------------------------------- 
    62        
    63       !                                        !* first wet T-, U-, V- ocean level (ISF) variables (T, S, depth, velocity) 
     61 
     62      !                                        !* surface T-, U-, V- ocean level variables (T, S, depth, velocity) 
    6463      DO jj = 1, jpj 
    6564         DO ji = 1, jpi 
    66             zub(ji,jj)        = ub (ji,jj,miku(ji,jj)) 
    67             zvb(ji,jj)        = vb (ji,jj,mikv(ji,jj)) 
    6865            zts(ji,jj,jp_tem) = tsn(ji,jj,mikt(ji,jj),jp_tem) 
    6966            zts(ji,jj,jp_sal) = tsn(ji,jj,mikt(ji,jj),jp_sal) 
     
    7168      END DO 
    7269      ! 
    73       IF( lk_vvl ) THEN 
    74          DO jj = 1, jpj 
    75             DO ji = 1, jpi 
    76                zdep(ji,jj) = fse3t_n(ji,jj,mikt(ji,jj)) 
    77             END DO 
    78          END DO 
    79       ENDIF 
    80       !                                                   ! ---------------------------------------- ! 
    8170      IF( nn_fsbc == 1 ) THEN                             !   Instantaneous surface fields        ! 
    8271         !                                                ! ---------------------------------------- ! 
    83          ssu_m(:,:) = zub(:,:) 
    84          ssv_m(:,:) = zvb(:,:) 
     72         ssu_m(:,:) = ub(:,:,1) 
     73         ssv_m(:,:) = vb(:,:,1) 
    8574         IF( ln_useCT )  THEN    ;   sst_m(:,:) = eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 
    8675         ELSE                    ;   sst_m(:,:) = zts(:,:,jp_tem) 
     
    9281         ENDIF 
    9382         ! 
    94          IF( lk_vvl )   fse3t_m(:,:) = zdep(:,:) 
     83         IF( lk_vvl )   e3t_m(:,:) = fse3t_n(:,:,1) 
     84         ! 
     85         frq_m(:,:) = fraqsr_1lev(:,:) 
    9586         ! 
    9687      ELSE 
     
    10192            IF(lwp) WRITE(numout,*) '~~~~~~~   mean fields initialised to instantaneous values' 
    10293            zcoef = REAL( nn_fsbc - 1, wp ) 
    103             ssu_m(:,:) = zcoef * zub(:,:) 
    104             ssv_m(:,:) = zcoef * zvb(:,:) 
     94            ssu_m(:,:) = zcoef * ub(:,:,1) 
     95            ssv_m(:,:) = zcoef * vb(:,:,1) 
    10596            IF( ln_useCT )  THEN    ;   sst_m(:,:) = zcoef * eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 
    10697            ELSE                    ;   sst_m(:,:) = zcoef * zts(:,:,jp_tem) 
     
    112103            ENDIF 
    113104            ! 
    114             IF( lk_vvl )   fse3t_m(:,:) = zcoef * zdep(:,:) 
     105            IF( lk_vvl )   e3t_m(:,:) = zcoef * fse3t_n(:,:,1) 
     106            ! 
     107            frq_m(:,:) = zcoef * fraqsr_1lev(:,:) 
    115108            !                                             ! ---------------------------------------- ! 
    116109         ELSEIF( MOD( kt - 2 , nn_fsbc ) == 0 ) THEN      !   Initialisation: New mean computation   ! 
     
    121114            sss_m(:,:) = 0.e0 
    122115            ssh_m(:,:) = 0.e0 
    123             IF( lk_vvl )   fse3t_m(:,:) = 0.e0 
     116            IF( lk_vvl )   e3t_m(:,:) = 0.e0 
     117            frq_m(:,:) = 0.e0 
    124118         ENDIF 
    125119         !                                                ! ---------------------------------------- ! 
    126120         !                                                !        Cumulate at each time step        ! 
    127121         !                                                ! ---------------------------------------- ! 
    128          ssu_m(:,:) = ssu_m(:,:) + zub(:,:) 
    129          ssv_m(:,:) = ssv_m(:,:) + zvb(:,:) 
     122         ssu_m(:,:) = ssu_m(:,:) + ub(:,:,1) 
     123         ssv_m(:,:) = ssv_m(:,:) + vb(:,:,1) 
    130124         IF( ln_useCT )  THEN    ;   sst_m(:,:) = sst_m(:,:) + eos_pt_from_ct( zts(:,:,jp_tem), zts(:,:,jp_sal) ) 
    131125         ELSE                    ;   sst_m(:,:) = sst_m(:,:) + zts(:,:,jp_tem) 
     
    137131         ENDIF 
    138132         ! 
    139          IF( lk_vvl )   fse3t_m(:,:) = fse3t_m(:,:) + zdep(:,:) 
     133         IF( lk_vvl )   e3t_m(:,:) = fse3t_m(:,:) + fse3t_n(:,:,1) 
     134         ! 
     135         frq_m(:,:) =   frq_m(:,:) + fraqsr_1lev(:,:) 
    140136 
    141137         !                                                ! ---------------------------------------- ! 
     
    148144            ssv_m(:,:) = ssv_m(:,:) * zcoef           ! 
    149145            ssh_m(:,:) = ssh_m(:,:) * zcoef           ! mean SSH             [m] 
    150             IF( lk_vvl )   fse3t_m(:,:) = fse3t_m(:,:) * zcoef   ! mean vertical scale factor [m] 
     146            IF( lk_vvl )   e3t_m(:,:) = fse3t_m(:,:) * zcoef   ! mean vertical scale factor [m] 
     147            frq_m(:,:) = frq_m(:,:) * zcoef   ! mean fraction of solar net radiation absorbed in the 1st T level [-] 
    151148            ! 
    152149         ENDIF 
     
    165162            CALL iom_rstput( kt, nitrst, numrow, 'sss_m'  , sss_m  ) 
    166163            CALL iom_rstput( kt, nitrst, numrow, 'ssh_m'  , ssh_m  ) 
    167             IF( lk_vvl ) THEN 
    168                CALL iom_rstput( kt, nitrst, numrow, 'fse3t_m'  , fse3t_m(:,:)  ) 
    169             END IF 
    170             ! 
    171          ENDIF 
    172          ! 
     164            IF( lk_vvl )   CALL iom_rstput( kt, nitrst, numrow, 'e3t_m'  , e3t_m  ) 
     165            CALL iom_rstput( kt, nitrst, numrow, 'frq_m'  , frq_m  ) 
     166            ! 
     167         ENDIF 
     168         ! 
     169      ENDIF 
     170      ! 
     171      IF( MOD( kt - 1 , nn_fsbc ) == 0 ) THEN          !   Mean value at each nn_fsbc time-step   ! 
     172         CALL iom_put( 'ssu_m', ssu_m ) 
     173         CALL iom_put( 'ssv_m', ssv_m ) 
     174         CALL iom_put( 'sst_m', sst_m ) 
     175         CALL iom_put( 'sss_m', sss_m ) 
     176         CALL iom_put( 'ssh_m', ssh_m ) 
     177         IF( lk_vvl )   CALL iom_put( 'e3t_m', e3t_m ) 
     178         CALL iom_put( 'frq_m', frq_m ) 
    173179      ENDIF 
    174180      ! 
     
    206212            CALL iom_get( numror, jpdom_autoglo, 'sss_m'  , sss_m  )   !   "         "    salinity    (T-point) 
    207213            CALL iom_get( numror, jpdom_autoglo, 'ssh_m'  , ssh_m  )   !   "         "    height      (T-point) 
    208             IF( lk_vvl ) CALL iom_get( numror, jpdom_autoglo, 'fse3t_m', fse3t_m(:,:) ) 
     214            IF( lk_vvl ) CALL iom_get( numror, jpdom_autoglo, 'e3t_m', e3t_m ) 
     215            ! fraction of solar net radiation absorbed in 1st T level 
     216            IF( iom_varid( numror, 'frq_m', ldstop = .FALSE. ) > 0 ) THEN 
     217               CALL iom_get( numror, jpdom_autoglo, 'frq_m'  , frq_m  ) 
     218            ELSE 
     219               frq_m(:,:) = 1._wp   ! default definition 
     220            ENDIF 
    209221            ! 
    210222            IF( zf_sbc /= REAL( nn_fsbc, wp ) ) THEN      ! nn_fsbc has changed between 2 runs 
     
    217229               sss_m(:,:) = zcoef * sss_m(:,:) 
    218230               ssh_m(:,:) = zcoef * ssh_m(:,:) 
    219                IF( lk_vvl ) fse3t_m(:,:) = zcoef * fse3t_m(:,:) 
     231               IF( lk_vvl )   e3t_m(:,:) = zcoef * fse3t_m(:,:) 
     232               frq_m(:,:) = zcoef * frq_m(:,:) 
    220233            ELSE 
    221234               IF(lwp) WRITE(numout,*) '~~~~~~~   mean fields read in the ocean restart file' 
     
    224237      ENDIF 
    225238      ! 
     239      IF( .NOT. l_ssm_mean ) THEN   ! default initialisation. needed by lim_istate 
     240         ! 
     241         IF(lwp) WRITE(numout,*) '          default initialisation of ss?_m arrays' 
     242         ssu_m(:,:) = ub(:,:,1) 
     243         ssv_m(:,:) = vb(:,:,1) 
     244         IF( ln_useCT )  THEN    ;   sst_m(:,:) = eos_pt_from_ct( tsn(:,:,1,jp_tem), tsn(:,:,1,jp_sal) ) 
     245         ELSE                    ;   sst_m(:,:) = tsn(:,:,1,jp_tem) 
     246         ENDIF 
     247         sss_m(:,:) = tsn(:,:,1,jp_sal) 
     248         ssh_m(:,:) = sshn(:,:) 
     249         IF( lk_vvl )   e3t_m(:,:) = fse3t_n(:,:,1) 
     250         frq_m(:,:) = 1._wp 
     251         ! 
     252      ENDIF 
     253      ! 
    226254   END SUBROUTINE sbc_ssm_init 
    227255 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbctide.F90

    • Property svn:keywords set to Id
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90

    • Property svn:keywords set to Id
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/tide_mod.F90

    • Property svn:keywords set to Id
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/tideini.F90

    • Property svn:keywords set to Id
    r5234 r5443  
    8080          END DO 
    8181       END DO 
     82       !        
     83       ! Ensure that tidal components have been set in namelist_cfg 
     84       IF( nb_harmo .EQ. 0 ) CALL ctl_stop( 'tide_init : No tidal components set in nam_tide' ) 
    8285       ! 
    8386       IF(lwp) THEN 
  • branches/2015/dev_r5021_UKMO1_CICE_coupling/NEMOGCM/NEMO/OPA_SRC/SBC/updtide.F90

    • Property svn:keywords set to Id
Note: See TracChangeset for help on using the changeset viewer.