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 8738 for branches/UKMO/dev_r8183_ICEMODEL_svn_removed/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk.F90 – NEMO

Ignore:
Timestamp:
2017-11-17T15:40:12+01:00 (6 years ago)
Author:
dancopsey
Message:

Merged in main ICEMODEL branch (branches/2017/dev_r8183_ICEMODEL) up to revision 8588

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r8183_ICEMODEL_svn_removed/NEMOGCM/NEMO/OPA_SRC/SBC/sbcblk.F90

    r8733 r8738  
    4040   USE lib_fortran    ! to use key_nosignedzero 
    4141#if defined key_lim3 
    42    USE ice     , ONLY :   u_ice, v_ice, jpl, pfrld, a_i_b, at_i_b 
    43    USE limthd_dh      ! for CALL lim_thd_snwblow 
    44 #elif defined key_lim2 
    45    USE ice_2   , ONLY :   u_ice, v_ice 
    46    USE par_ice_2      ! LIM-2 parameters 
     42   USE ice     , ONLY :   u_ice, v_ice, jpl, a_i_b, at_i_b, tm_su 
     43   USE icethd_dh      ! for CALL ice_thd_snwblow 
    4744#endif 
    4845   USE sbcblk_algo_ncar     ! => turb_ncar     : NCAR - CORE (Large & Yeager, 2009)  
     
    6461   PUBLIC   sbc_blk_init  ! called in sbcmod 
    6562   PUBLIC   sbc_blk       ! called in sbcmod 
    66 #if defined key_lim2 || defined key_lim3 
    67    PUBLIC   blk_ice_tau   ! routine called in sbc_ice_lim module 
    68    PUBLIC   blk_ice_flx   ! routine called in sbc_ice_lim module 
     63#if defined key_lim3 
     64   PUBLIC   blk_ice_tau   ! routine called in icestp module 
     65   PUBLIC   blk_ice_flx   ! routine called in icestp module 
    6966#endif 
    7067 
     
    9693   REAL(wp), PARAMETER ::   Ls     =    2.839e6     ! latent heat of sublimation 
    9794   REAL(wp), PARAMETER ::   Stef   =    5.67e-8     ! Stefan Boltzmann constant 
    98    REAL(wp), PARAMETER ::   Cd_ice =    1.4e-3      ! iovi 1.63e-3     ! transfer coefficient over ice 
     95   REAL(wp), PARAMETER ::   Cd_ice =    1.4e-3      ! transfer coefficient over ice 
    9996   REAL(wp), PARAMETER ::   albo   =    0.066       ! ocean albedo assumed to be constant 
    10097   ! 
     
    111108   REAL(wp) ::   rn_zqt         ! z(q,t) : height of humidity and temperature measurements 
    112109   REAL(wp) ::   rn_zu          ! z(u)   : height of wind measurements 
    113    LOGICAL  ::   ln_Cd_L12 = .FALSE. !  Modify the drag ice-atm and oce-atm depending on ice concentration (from Lupkes et al. JGR2012) 
     110   LOGICAL  ::   ln_Cd_L12 = .FALSE. !  Modify the drag ice-atm depending on ice concentration (from Lupkes et al. JGR2012) 
     111   LOGICAL  ::   ln_Cd_L15 = .FALSE. !  Modify the drag ice-atm depending on ice concentration (from Lupkes et al. JGR2015) 
    114112   ! 
    115    REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   Cd_oce   ! air-ocean drag (clem) 
     113   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   Cd_atm                    ! transfer coefficient for momentum      (tau) 
     114   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   Ch_atm                    ! transfer coefficient for sensible heat (Q_sens) 
     115   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   Ce_atm                    ! tansfert coefficient for evaporation   (Q_lat) 
     116   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   t_zu                      ! air temperature at wind speed height (needed by Lupkes 2015 bulk scheme) 
     117   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   q_zu                      ! air spec. hum.  at wind speed height (needed by Lupkes 2015 bulk scheme) 
     118   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   cdn_oce, chn_oce, cen_oce ! needed by Lupkes 2015 bulk scheme 
    116119 
    117120   INTEGER  ::   nblk           ! choice of the bulk algorithm 
     
    135138      !!             ***  ROUTINE sbc_blk_alloc *** 
    136139      !!------------------------------------------------------------------- 
    137       ALLOCATE( Cd_oce(jpi,jpj) , STAT=sbc_blk_alloc ) 
     140      ALLOCATE( Cd_atm (jpi,jpj), Ch_atm (jpi,jpj), Ce_atm (jpi,jpj), t_zu(jpi,jpj), q_zu(jpi,jpj), & 
     141         &      cdn_oce(jpi,jpj), chn_oce(jpi,jpj), cen_oce(jpi,jpj), STAT=sbc_blk_alloc ) 
    138142      ! 
    139143      IF( lk_mpp             )   CALL mpp_sum ( sbc_blk_alloc ) 
     
    167171         &                 ln_NCAR, ln_COARE_3p0, ln_COARE_3p5, ln_ECMWF,             &   ! bulk algorithm 
    168172         &                 cn_dir , ln_taudif, rn_zqt, rn_zu,                         &  
    169          &                 rn_pfac, rn_efac, rn_vfac, ln_Cd_L12 
     173         &                 rn_pfac, rn_efac, rn_vfac, ln_Cd_L12, ln_Cd_L15 
    170174      !!--------------------------------------------------------------------- 
    171175      ! 
     
    258262         WRITE(numout,*) '      factor applied on ocean/ice velocity                rn_vfac      = ', rn_vfac 
    259263         WRITE(numout,*) '         (form absolute (=0) to relative winds(=1))' 
     264         WRITE(numout,*) '      use ice-atm drag from Lupkes2012                    ln_Cd_L12    = ', ln_Cd_L12 
     265         WRITE(numout,*) '      use ice-atm drag from Lupkes2015                    ln_Cd_L15    = ', ln_Cd_L15 
    260266         ! 
    261267         WRITE(numout,*) 
     
    364370      REAL(wp), DIMENSION(:,:), POINTER ::   zqlw, zqsb        ! long wave and sensible heat fluxes 
    365371      REAL(wp), DIMENSION(:,:), POINTER ::   zqla, zevap       ! latent heat fluxes and evaporation 
    366       REAL(wp), DIMENSION(:,:), POINTER ::   Cd                ! transfer coefficient for momentum      (tau) 
    367       REAL(wp), DIMENSION(:,:), POINTER ::   Ch                ! transfer coefficient for sensible heat (Q_sens) 
    368       REAL(wp), DIMENSION(:,:), POINTER ::   Ce                ! tansfert coefficient for evaporation   (Q_lat) 
    369372      REAL(wp), DIMENSION(:,:), POINTER ::   zst               ! surface temperature in Kelvin 
    370       REAL(wp), DIMENSION(:,:), POINTER ::   zt_zu             ! air temperature at wind speed height 
    371       REAL(wp), DIMENSION(:,:), POINTER ::   zq_zu             ! air spec. hum.  at wind speed height 
    372373      REAL(wp), DIMENSION(:,:), POINTER ::   zU_zu             ! bulk wind speed at height zu  [m/s] 
    373374      REAL(wp), DIMENSION(:,:), POINTER ::   ztpot             ! potential temperature of air at z=rn_zqt [K] 
     
    378379      ! 
    379380      CALL wrk_alloc( jpi,jpj,   zwnd_i, zwnd_j, zsq, zqlw, zqsb, zqla, zevap ) 
    380       CALL wrk_alloc( jpi,jpj,   Cd, Ch, Ce, zst, zt_zu, zq_zu ) 
    381       CALL wrk_alloc( jpi,jpj,   zU_zu, ztpot, zrhoa ) 
     381      CALL wrk_alloc( jpi,jpj,   zst, zU_zu, ztpot, zrhoa ) 
    382382      ! 
    383383 
     
    426426      zqlw(:,:) = (  sf(jp_qlw)%fnow(:,:,1) - Stef * zst(:,:)*zst(:,:)*zst(:,:)*zst(:,:)  ) * tmask(:,:,1)   ! Long  Wave 
    427427 
    428  
    429  
    430428      ! ----------------------------------------------------------------------------- ! 
    431429      !     II    Turbulent FLUXES                                                    ! 
     
    443441      ! 
    444442      CASE( np_NCAR      )   ;   CALL turb_ncar    ( rn_zqt, rn_zu, zst, ztpot, zsq, sf(jp_humi)%fnow, wndm,   &  ! NCAR-COREv2 
    445          &                                               Cd, Ch, Ce, zt_zu, zq_zu, zU_zu ) 
     443         &                                           Cd_atm, Ch_atm, Ce_atm, t_zu, q_zu, zU_zu, cdn_oce, chn_oce, cen_oce ) 
    446444      CASE( np_COARE_3p0 )   ;   CALL turb_coare   ( rn_zqt, rn_zu, zst, ztpot, zsq, sf(jp_humi)%fnow, wndm,   &  ! COARE v3.0 
    447          &                                               Cd, Ch, Ce, zt_zu, zq_zu, zU_zu ) 
     445         &                                           Cd_atm, Ch_atm, Ce_atm, t_zu, q_zu, zU_zu, cdn_oce, chn_oce, cen_oce ) 
    448446      CASE( np_COARE_3p5 )   ;   CALL turb_coare3p5( rn_zqt, rn_zu, zst, ztpot, zsq, sf(jp_humi)%fnow, wndm,   &  ! COARE v3.5 
    449          &                                               Cd, Ch, Ce, zt_zu, zq_zu, zU_zu ) 
     447         &                                           Cd_atm, Ch_atm, Ce_atm, t_zu, q_zu, zU_zu, cdn_oce, chn_oce, cen_oce ) 
    450448      CASE( np_ECMWF     )   ;   CALL turb_ecmwf   ( rn_zqt, rn_zu, zst, ztpot, zsq, sf(jp_humi)%fnow, wndm,   &  ! ECMWF 
    451          &                                               Cd, Ch, Ce, zt_zu, zq_zu, zU_zu ) 
     449         &                                           Cd_atm, Ch_atm, Ce_atm, t_zu, q_zu, zU_zu, cdn_oce, chn_oce, cen_oce ) 
    452450      CASE DEFAULT 
    453451         CALL ctl_stop( 'STOP', 'sbc_oce: non-existing bulk formula selected' ) 
     
    456454      !                          ! Compute true air density : 
    457455      IF( ABS(rn_zu - rn_zqt) > 0.01 ) THEN     ! At zu: (probably useless to remove zrho*grav*rn_zu from SLP...) 
    458          zrhoa(:,:) = rho_air( zt_zu(:,:)             , zq_zu(:,:)             , sf(jp_slp)%fnow(:,:,1) ) 
     456         zrhoa(:,:) = rho_air( t_zu(:,:)              , q_zu(:,:)              , sf(jp_slp)%fnow(:,:,1) ) 
    459457      ELSE                                      ! At zt: 
    460458         zrhoa(:,:) = rho_air( sf(jp_tair)%fnow(:,:,1), sf(jp_humi)%fnow(:,:,1), sf(jp_slp)%fnow(:,:,1) ) 
    461459      END IF 
    462460 
    463       Cd_oce(:,:) = Cd(:,:)  ! record value of pure ocean-atm. drag (clem) 
     461!!      CALL iom_put( "Cd_oce", Cd_atm)  ! output value of pure ocean-atm. transfer coef. 
     462!!      CALL iom_put( "Ch_oce", Ch_atm)  ! output value of pure ocean-atm. transfer coef. 
    464463 
    465464      DO jj = 1, jpj             ! tau module, i and j component 
    466465         DO ji = 1, jpi 
    467             zztmp = zrhoa(ji,jj)  * zU_zu(ji,jj) * Cd(ji,jj)   ! using bulk wind speed 
     466            zztmp = zrhoa(ji,jj)  * zU_zu(ji,jj) * Cd_atm(ji,jj)   ! using bulk wind speed 
    468467            taum  (ji,jj) = zztmp * wndm  (ji,jj) 
    469468            zwnd_i(ji,jj) = zztmp * zwnd_i(ji,jj) 
     
    500499      IF( ABS( rn_zu - rn_zqt) < 0.01_wp ) THEN 
    501500         !! q_air and t_air are given at 10m (wind reference height) 
    502          zevap(:,:) = rn_efac*MAX( 0._wp,             zqla(:,:)*Ce(:,:)*(zsq(:,:) - sf(jp_humi)%fnow(:,:,1)) ) ! Evaporation, using bulk wind speed 
    503          zqsb (:,:) = cp_air(sf(jp_humi)%fnow(:,:,1))*zqla(:,:)*Ch(:,:)*(zst(:,:) - ztpot(:,:)             )   ! Sensible Heat, using bulk wind speed 
     501         zevap(:,:) = rn_efac*MAX( 0._wp,             zqla(:,:)*Ce_atm(:,:)*(zsq(:,:) - sf(jp_humi)%fnow(:,:,1)) ) ! Evaporation, using bulk wind speed 
     502         zqsb (:,:) = cp_air(sf(jp_humi)%fnow(:,:,1))*zqla(:,:)*Ch_atm(:,:)*(zst(:,:) - ztpot(:,:)             )   ! Sensible Heat, using bulk wind speed 
    504503      ELSE 
    505504         !! q_air and t_air are not given at 10m (wind reference height) 
    506505         ! Values of temp. and hum. adjusted to height of wind during bulk algorithm iteration must be used!!! 
    507          zevap(:,:) = rn_efac*MAX( 0._wp,             zqla(:,:)*Ce(:,:)*(zsq(:,:) - zq_zu(:,:) ) ) ! Evaporation ! using bulk wind speed 
    508          zqsb (:,:) = cp_air(sf(jp_humi)%fnow(:,:,1))*zqla(:,:)*Ch(:,:)*(zst(:,:) - zt_zu(:,:) )   ! Sensible Heat ! using bulk wind speed 
     506         zevap(:,:) = rn_efac*MAX( 0._wp,             zqla(:,:)*Ce_atm(:,:)*(zsq(:,:) - q_zu(:,:) ) ) ! Evaporation, using bulk wind speed 
     507         zqsb (:,:) = cp_air(sf(jp_humi)%fnow(:,:,1))*zqla(:,:)*Ch_atm(:,:)*(zst(:,:) - t_zu(:,:) )   ! Sensible Heat, using bulk wind speed 
    509508      ENDIF 
    510509 
     
    513512 
    514513      IF(ln_ctl) THEN 
    515          CALL prt_ctl( tab2d_1=zqla  , clinfo1=' blk_oce: zqla   : ', tab2d_2=Ce , clinfo2=' Ce  : ' ) 
    516          CALL prt_ctl( tab2d_1=zqsb  , clinfo1=' blk_oce: zqsb   : ', tab2d_2=Ch , clinfo2=' Ch  : ' ) 
     514         CALL prt_ctl( tab2d_1=zqla  , clinfo1=' blk_oce: zqla   : ', tab2d_2=Ce_atm , clinfo2=' Ce_oce  : ' ) 
     515         CALL prt_ctl( tab2d_1=zqsb  , clinfo1=' blk_oce: zqsb   : ', tab2d_2=Ch_atm , clinfo2=' Ch_oce  : ' ) 
    517516         CALL prt_ctl( tab2d_1=zqlw  , clinfo1=' blk_oce: zqlw   : ', tab2d_2=qsr, clinfo2=' qsr : ' ) 
    518517         CALL prt_ctl( tab2d_1=zsq   , clinfo1=' blk_oce: zsq    : ', tab2d_2=zst, clinfo2=' zst : ' ) 
     
    566565      ! 
    567566      CALL wrk_dealloc( jpi,jpj,   zwnd_i, zwnd_j, zsq, zqlw, zqsb, zqla, zevap ) 
    568       CALL wrk_dealloc( jpi,jpj,   Cd, Ch, Ce, zst, zt_zu, zq_zu ) 
    569       CALL wrk_dealloc( jpi,jpj,   zU_zu, ztpot, zrhoa ) 
     567      CALL wrk_dealloc( jpi,jpj,   zst, zU_zu, ztpot, zrhoa ) 
    570568      ! 
    571569      IF( nn_timing == 1 )  CALL timing_stop('blk_oce') 
     
    573571   END SUBROUTINE blk_oce 
    574572 
    575 #if defined key_lim2 || defined key_lim3 
     573#if defined key_lim3 
    576574 
    577575   SUBROUTINE blk_ice_tau 
     
    591589      REAL(wp) ::   zwnorm_f, zwndi_f , zwndj_f               ! relative wind module and components at F-point 
    592590      REAL(wp) ::             zwndi_t , zwndj_t               ! relative wind components at T-point 
    593       REAL(wp), DIMENSION(:,:), POINTER ::   Cd               ! transfer coefficient for momentum      (tau) 
    594591      !!--------------------------------------------------------------------- 
    595592      ! 
     
    597594      ! 
    598595      CALL wrk_alloc( jpi,jpj, zrhoa ) 
    599       CALL wrk_alloc( jpi,jpj, Cd ) 
    600  
    601       Cd(:,:) = Cd_ice 
    602  
    603       ! Make ice-atm. drag dependent on ice concentration (see Lupkes et al. 2012) (clem) 
    604 #if defined key_lim3 
    605       IF( ln_Cd_L12 ) THEN 
    606          CALL Cdn10_Lupkes2012( Cd ) ! calculate new drag from Lupkes(2012) equations 
    607       ENDIF 
    608 #endif 
    609  
    610       ! local scalars ( place there for vector optimisation purposes) 
    611       ! Computing density of air! Way denser that 1.2 over sea-ice !!! 
    612       !! 
    613       zrhoa (:,:) =  rho_air(sf(jp_tair)%fnow(:,:,1), sf(jp_humi)%fnow(:,:,1), sf(jp_slp)%fnow(:,:,1)) 
    614  
    615       !!gm brutal.... 
    616       utau_ice  (:,:) = 0._wp 
    617       vtau_ice  (:,:) = 0._wp 
    618       wndm_ice  (:,:) = 0._wp 
    619       !!gm end 
    620  
    621       ! ----------------------------------------------------------------------------- ! 
    622       !    Wind components and module relative to the moving ocean ( U10m - U_ice )   ! 
    623       ! ----------------------------------------------------------------------------- ! 
     596 
     597      ! set transfer coefficients to default sea-ice values 
     598      Cd_atm(:,:) = Cd_ice 
     599      Ch_atm(:,:) = Cd_ice 
     600      Ce_atm(:,:) = Cd_ice 
     601 
     602      wndm_ice(:,:) = 0._wp      !!gm brutal.... 
     603 
     604      ! ------------------------------------------------------------ ! 
     605      !    Wind module relative to the moving ice ( U10m - U_ice )   ! 
     606      ! ------------------------------------------------------------ ! 
    624607      SELECT CASE( cp_ice_msh ) 
    625608      CASE( 'I' )                  ! B-grid ice dynamics :   I-point (i.e. F-point with sea-ice indexation) 
     
    627610         DO jj = 2, jpjm1 
    628611            DO ji = 2, jpim1   ! B grid : NO vector opt 
    629                ! ... scalar wind at I-point (fld being at T-point) 
    630                zwndi_f = 0.25 * (  sf(jp_wndi)%fnow(ji-1,jj  ,1) + sf(jp_wndi)%fnow(ji  ,jj  ,1)   & 
    631                   &              + sf(jp_wndi)%fnow(ji-1,jj-1,1) + sf(jp_wndi)%fnow(ji  ,jj-1,1)  ) - rn_vfac * u_ice(ji,jj) 
    632                zwndj_f = 0.25 * (  sf(jp_wndj)%fnow(ji-1,jj  ,1) + sf(jp_wndj)%fnow(ji  ,jj  ,1)   & 
    633                   &              + sf(jp_wndj)%fnow(ji-1,jj-1,1) + sf(jp_wndj)%fnow(ji  ,jj-1,1)  ) - rn_vfac * v_ice(ji,jj) 
    634                zwnorm_f = zrhoa(ji,jj) * Cd(ji,jj) * SQRT( zwndi_f * zwndi_f + zwndj_f * zwndj_f ) 
    635                ! ... ice stress at I-point 
    636                utau_ice(ji,jj) = zwnorm_f * zwndi_f 
    637                vtau_ice(ji,jj) = zwnorm_f * zwndj_f 
    638612               ! ... scalar wind at T-point (fld being at T-point) 
    639613               zwndi_t = sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.25 * (  u_ice(ji,jj+1) + u_ice(ji+1,jj+1)   & 
     
    644618            END DO 
    645619         END DO 
    646          CALL lbc_lnk( utau_ice, 'I', -1. ) 
    647          CALL lbc_lnk( vtau_ice, 'I', -1. ) 
    648620         CALL lbc_lnk( wndm_ice, 'T',  1. ) 
    649621         ! 
    650622      CASE( 'C' )                  ! C-grid ice dynamics :   U & V-points (same as ocean) 
    651          DO jj = 2, jpj 
    652             DO ji = fs_2, jpi   ! vect. opt. 
     623         DO jj = 2, jpjm1 
     624            DO ji = fs_2, fs_jpim1   ! vect. opt. 
    653625               zwndi_t = (  sf(jp_wndi)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( u_ice(ji-1,jj  ) + u_ice(ji,jj) )  ) 
    654626               zwndj_t = (  sf(jp_wndj)%fnow(ji,jj,1) - rn_vfac * 0.5 * ( v_ice(ji  ,jj-1) + v_ice(ji,jj) )  ) 
     
    656628            END DO 
    657629         END DO 
     630         CALL lbc_lnk( wndm_ice, 'T',  1. ) 
     631         ! 
     632      END SELECT 
     633 
     634      ! Make ice-atm. drag dependent on ice concentration 
     635      IF    ( ln_Cd_L12 ) THEN   ! calculate new drag from Lupkes(2012) equations 
     636         CALL Cdn10_Lupkes2012( Cd_atm ) 
     637         Ch_atm(:,:) = Cd_atm(:,:)       ! momentum and heat transfer coef. are considered identical 
     638      ELSEIF( ln_Cd_L15 ) THEN   ! calculate new drag from Lupkes(2015) equations 
     639         CALL Cdn10_Lupkes2015( Cd_atm, Ch_atm )  
     640      ENDIF 
     641 
     642!!      CALL iom_put( "Cd_ice", Cd_atm)  ! output value of pure ice-atm. transfer coef. 
     643!!      CALL iom_put( "Ch_ice", Ch_atm)  ! output value of pure ice-atm. transfer coef. 
     644 
     645      ! local scalars ( place there for vector optimisation purposes) 
     646      ! Computing density of air! Way denser that 1.2 over sea-ice !!! 
     647      zrhoa (:,:) =  rho_air(sf(jp_tair)%fnow(:,:,1), sf(jp_humi)%fnow(:,:,1), sf(jp_slp)%fnow(:,:,1)) 
     648 
     649      !!gm brutal.... 
     650      utau_ice  (:,:) = 0._wp 
     651      vtau_ice  (:,:) = 0._wp 
     652      !!gm end 
     653 
     654      ! ------------------------------------------------------------ ! 
     655      !    Wind stress relative to the moving ice ( U10m - U_ice )   ! 
     656      ! ------------------------------------------------------------ ! 
     657      SELECT CASE( cp_ice_msh ) 
     658      CASE( 'I' )                  ! B-grid ice dynamics :   I-point (i.e. F-point with sea-ice indexation) 
     659         DO jj = 2, jpjm1 
     660            DO ji = 2, jpim1   ! B grid : NO vector opt 
     661               ! ... scalar wind at I-point (fld being at T-point) 
     662               zwndi_f = 0.25 * (  sf(jp_wndi)%fnow(ji-1,jj  ,1) + sf(jp_wndi)%fnow(ji  ,jj  ,1)   & 
     663                  &              + sf(jp_wndi)%fnow(ji-1,jj-1,1) + sf(jp_wndi)%fnow(ji  ,jj-1,1)  ) - rn_vfac * u_ice(ji,jj) 
     664               zwndj_f = 0.25 * (  sf(jp_wndj)%fnow(ji-1,jj  ,1) + sf(jp_wndj)%fnow(ji  ,jj  ,1)   & 
     665                  &              + sf(jp_wndj)%fnow(ji-1,jj-1,1) + sf(jp_wndj)%fnow(ji  ,jj-1,1)  ) - rn_vfac * v_ice(ji,jj) 
     666               ! ... ice stress at I-point 
     667               zwnorm_f = zrhoa(ji,jj) * Cd_atm(ji,jj) * SQRT( zwndi_f * zwndi_f + zwndj_f * zwndj_f ) 
     668               utau_ice(ji,jj) = zwnorm_f * zwndi_f 
     669               vtau_ice(ji,jj) = zwnorm_f * zwndj_f 
     670            END DO 
     671         END DO 
     672         CALL lbc_lnk( utau_ice, 'I', -1. ) 
     673         CALL lbc_lnk( vtau_ice, 'I', -1. ) 
     674         ! 
     675      CASE( 'C' )                  ! C-grid ice dynamics :   U & V-points (same as ocean) 
    658676         DO jj = 2, jpjm1 
    659677            DO ji = fs_2, fs_jpim1   ! vect. opt. 
    660                utau_ice(ji,jj) = 0.5 * zrhoa(ji,jj) * Cd(ji,jj) * ( wndm_ice(ji+1,jj  ) + wndm_ice(ji,jj) )                          & 
     678               utau_ice(ji,jj) = 0.5 * zrhoa(ji,jj) * Cd_atm(ji,jj) * ( wndm_ice(ji+1,jj  ) + wndm_ice(ji,jj) )            & 
    661679                  &          * ( 0.5 * (sf(jp_wndi)%fnow(ji+1,jj,1) + sf(jp_wndi)%fnow(ji,jj,1) ) - rn_vfac * u_ice(ji,jj) ) 
    662                vtau_ice(ji,jj) = 0.5 * zrhoa(ji,jj) * Cd(ji,jj) * ( wndm_ice(ji,jj+1  ) + wndm_ice(ji,jj) )                          & 
     680               vtau_ice(ji,jj) = 0.5 * zrhoa(ji,jj) * Cd_atm(ji,jj) * ( wndm_ice(ji,jj+1  ) + wndm_ice(ji,jj) )            & 
    663681                  &          * ( 0.5 * (sf(jp_wndj)%fnow(ji,jj+1,1) + sf(jp_wndj)%fnow(ji,jj,1) ) - rn_vfac * v_ice(ji,jj) ) 
    664682            END DO 
     
    666684         CALL lbc_lnk( utau_ice, 'U', -1. ) 
    667685         CALL lbc_lnk( vtau_ice, 'V', -1. ) 
    668          CALL lbc_lnk( wndm_ice, 'T',  1. ) 
    669686         ! 
    670687      END SELECT 
     
    705722      REAL(wp), DIMENSION(:,:)  , POINTER ::   zevap, zsnw   ! evaporation and snw distribution after wind blowing (LIM3) 
    706723      REAL(wp), DIMENSION(:,:)  , POINTER ::   zrhoa 
    707       REAL(wp), DIMENSION(:,:)  , POINTER ::   Cd            ! transfer coefficient for momentum      (tau) 
    708724      !!--------------------------------------------------------------------- 
    709725      ! 
     
    711727      ! 
    712728      CALL wrk_alloc( jpi,jpj,jpl,   z_qlw, z_qsb, z_dqlw, z_dqsb ) 
    713       CALL wrk_alloc( jpi,jpj,       zrhoa) 
    714       CALL wrk_alloc( jpi,jpj, Cd ) 
    715  
    716       Cd(:,:) = Cd_ice 
    717  
    718       ! Make ice-atm. drag dependent on ice concentration (see Lupkes et al.  2012) (clem) 
    719 #if defined key_lim3 
    720       IF( ln_Cd_L12 ) THEN 
    721          CALL Cdn10_Lupkes2012( Cd ) ! calculate new drag from Lupkes(2012) equations 
    722       ENDIF 
    723 #endif 
    724  
    725       ! 
    726       ! local scalars ( place there for vector optimisation purposes) 
     729      CALL wrk_alloc( jpi,jpj,       zrhoa ) 
     730      ! 
     731      ! local scalars 
    727732      zcoef_dqlw   = 4.0 * 0.95 * Stef 
    728733      zcoef_dqla   = -Ls * 11637800. * (-5897.8) 
     
    752757               ! ----------------------------! 
    753758 
    754                ! ... turbulent heat fluxes 
     759               ! ... turbulent heat fluxes with Ch_atm recalculated in blk_ice_tau 
    755760               ! Sensible Heat 
    756                z_qsb(ji,jj,jl) = zrhoa(ji,jj) * cpa * Cd(ji,jj) * wndm_ice(ji,jj) * ( ptsu(ji,jj,jl) - sf(jp_tair)%fnow(ji,jj,1) ) 
     761               z_qsb(ji,jj,jl) = zrhoa(ji,jj) * cpa * Ch_atm(ji,jj) * wndm_ice(ji,jj) * (ptsu(ji,jj,jl) - sf(jp_tair)%fnow(ji,jj,1)) 
    757762               ! Latent Heat 
    758                qla_ice(ji,jj,jl) = rn_efac * MAX( 0.e0, zrhoa(ji,jj) * Ls  * Cd(ji,jj) * wndm_ice(ji,jj)   & 
    759                   &                         * (  11637800. * EXP( -5897.8 / ptsu(ji,jj,jl) ) / zrhoa(ji,jj) - sf(jp_humi)%fnow(ji,jj,1) ) ) 
     763               qla_ice(ji,jj,jl) = rn_efac * MAX( 0.e0, zrhoa(ji,jj) * Ls  * Ch_atm(ji,jj) * wndm_ice(ji,jj) *  & 
     764                  &                ( 11637800. * EXP( -5897.8 / ptsu(ji,jj,jl) ) / zrhoa(ji,jj) - sf(jp_humi)%fnow(ji,jj,1) ) ) 
    760765               ! Latent heat sensitivity for ice (Dqla/Dt) 
    761766               IF( qla_ice(ji,jj,jl) > 0._wp ) THEN 
    762                   dqla_ice(ji,jj,jl) = rn_efac * zcoef_dqla * Cd(ji,jj) * wndm_ice(ji,jj) / ( zst2 ) * EXP( -5897.8 / ptsu(ji,jj,jl) ) 
     767                  dqla_ice(ji,jj,jl) = rn_efac * zcoef_dqla * Ch_atm(ji,jj) * wndm_ice(ji,jj) / zst2 * EXP(-5897.8 / ptsu(ji,jj,jl)) 
    763768               ELSE 
    764769                  dqla_ice(ji,jj,jl) = 0._wp 
     
    766771 
    767772               ! Sensible heat sensitivity (Dqsb_ice/Dtn_ice) 
    768                z_dqsb(ji,jj,jl) = zrhoa(ji,jj) * cpa * Cd(ji,jj) * wndm_ice(ji,jj) 
     773               z_dqsb(ji,jj,jl) = zrhoa(ji,jj) * cpa * Ch_atm(ji,jj) * wndm_ice(ji,jj) 
    769774 
    770775               ! ----------------------------! 
     
    786791      CALL iom_put( 'precip' , tprecip * 86400. )                  ! Total precipitation 
    787792 
    788 #if defined  key_lim3 
    789793      CALL wrk_alloc( jpi,jpj,   zevap, zsnw ) 
    790794 
     
    797801      ! --- evaporation minus precipitation --- ! 
    798802      zsnw(:,:) = 0._wp 
    799       CALL lim_thd_snwblow( pfrld, zsnw )  ! snow distribution over ice after wind blowing 
    800       emp_oce(:,:) = pfrld(:,:) * zevap(:,:) - ( tprecip(:,:) - sprecip(:,:) ) - sprecip(:,:) * (1._wp - zsnw ) 
     803      CALL ice_thd_snwblow( (1.-at_i_b(:,:)), zsnw )  ! snow distribution over ice after wind blowing 
     804      emp_oce(:,:) = ( 1._wp - at_i_b(:,:) ) * zevap(:,:) - ( tprecip(:,:) - sprecip(:,:) ) - sprecip(:,:) * (1._wp - zsnw ) 
    801805      emp_ice(:,:) = SUM( a_i_b(:,:,:) * evap_ice(:,:,:), dim=3 ) - sprecip(:,:) * zsnw 
    802806      emp_tot(:,:) = emp_oce(:,:) + emp_ice(:,:) 
    803807 
    804808      ! --- heat flux associated with emp --- ! 
    805       qemp_oce(:,:) = - pfrld(:,:) * zevap(:,:) * sst_m(:,:) * rcp                               & ! evap at sst 
     809      qemp_oce(:,:) = - ( 1._wp - at_i_b(:,:) ) * zevap(:,:) * sst_m(:,:) * rcp                  & ! evap at sst 
    806810         &          + ( tprecip(:,:) - sprecip(:,:) ) * ( sf(jp_tair)%fnow(:,:,1) - rt0 ) * rcp  & ! liquid precip at Tair 
    807811         &          +   sprecip(:,:) * ( 1._wp - zsnw ) *                                        & ! solid precip at min(Tair,Tsnow) 
     
    811815 
    812816      ! --- total solar and non solar fluxes --- ! 
    813       qns_tot(:,:) = pfrld(:,:) * qns_oce(:,:) + SUM( a_i_b(:,:,:) * qns_ice(:,:,:), dim=3 ) + qemp_ice(:,:) + qemp_oce(:,:) 
    814       qsr_tot(:,:) = pfrld(:,:) * qsr_oce(:,:) + SUM( a_i_b(:,:,:) * qsr_ice(:,:,:), dim=3 ) 
     817      qns_tot(:,:) = ( 1._wp - at_i_b(:,:) ) * qns_oce(:,:) + SUM( a_i_b(:,:,:) * qns_ice(:,:,:), dim=3 )  & 
     818         &           + qemp_ice(:,:) + qemp_oce(:,:) 
     819      qsr_tot(:,:) = ( 1._wp - at_i_b(:,:) ) * qsr_oce(:,:) + SUM( a_i_b(:,:,:) * qsr_ice(:,:,:), dim=3 ) 
    815820 
    816821      ! --- heat content of precip over ice in J/m3 (to be used in 1D-thermo) --- ! 
     
    824829 
    825830      CALL wrk_dealloc( jpi,jpj,   zevap, zsnw ) 
    826 #endif 
    827831 
    828832      !-------------------------------------------------------------------- 
     
    846850      CALL wrk_dealloc( jpi,jpj,jpl,   z_qlw, z_qsb, z_dqlw, z_dqsb ) 
    847851      CALL wrk_dealloc( jpi,jpj,       zrhoa ) 
    848       CALL wrk_dealloc( jpi,jpj, Cd ) 
    849852      ! 
    850853      IF( nn_timing == 1 )  CALL timing_stop('blk_ice_flx') 
     
    973976 
    974977#if defined key_lim3 
     978 
    975979   SUBROUTINE Cdn10_Lupkes2012( Cd ) 
    976980      !!---------------------------------------------------------------------- 
     
    10221026       
    10231027   END SUBROUTINE Cdn10_Lupkes2012 
     1028 
     1029 
     1030   SUBROUTINE Cdn10_Lupkes2015( Cd, Ch ) 
     1031      !!---------------------------------------------------------------------- 
     1032      !!                      ***  ROUTINE  Cdn10_Lupkes2015  *** 
     1033      !! 
     1034      !! ** pUrpose :    1lternative turbulent transfert coefficients formulation 
     1035      !!                 between sea-ice and atmosphere with distinct momentum  
     1036      !!                 and heat coefficients depending on sea-ice concentration  
     1037      !!                 and atmospheric stability (no meltponds effect for now). 
     1038      !!                 
     1039      !! ** Method :     The parameterization is adapted from Lupkes et al. (2015) 
     1040      !!                 and ECHAM6 atmospheric model. Compared to Lupkes2012 scheme, 
     1041      !!                 it considers specific skin and form drags (Andreas et al. 2010) 
     1042      !!                 to compute neutral transfert coefficients for both heat and  
     1043      !!                 momemtum fluxes. Atmospheric stability effect on transfert 
     1044      !!                 coefficient is also taken into account following Louis (1979). 
     1045      !! 
     1046      !! ** References : Lupkes et al. JGR 2015 (theory) 
     1047      !!                 Lupkes et al. ECHAM6 documentation 2015 (implementation) 
     1048      !! 
     1049      !!---------------------------------------------------------------------- 
     1050      ! 
     1051      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   Cd 
     1052      REAL(wp), DIMENSION(:,:), INTENT(inout) ::   Ch 
     1053      REAL(wp), DIMENSION(jpi,jpj)            ::   zst, zqo_sat, zqi_sat 
     1054      ! 
     1055      ! ECHAM6 constants 
     1056      REAL(wp), PARAMETER ::   z0_skin_ice  = 0.69e-3_wp  ! Eq. 43 [m] 
     1057      REAL(wp), PARAMETER ::   z0_form_ice  = 0.57e-3_wp  ! Eq. 42 [m] 
     1058      REAL(wp), PARAMETER ::   z0_ice       = 1.00e-3_wp  ! Eq. 15 [m] 
     1059      REAL(wp), PARAMETER ::   zce10        = 2.80e-3_wp  ! Eq. 41 
     1060      REAL(wp), PARAMETER ::   zbeta        = 1.1_wp      ! Eq. 41 
     1061      REAL(wp), PARAMETER ::   zc           = 5._wp       ! Eq. 13 
     1062      REAL(wp), PARAMETER ::   zc2          = zc * zc 
     1063      REAL(wp), PARAMETER ::   zam          = 2. * zc     ! Eq. 14 
     1064      REAL(wp), PARAMETER ::   zah          = 3. * zc     ! Eq. 30 
     1065      REAL(wp), PARAMETER ::   z1_alpha     = 1._wp / 0.2_wp  ! Eq. 51 
     1066      REAL(wp), PARAMETER ::   z1_alphaf    = z1_alpha    ! Eq. 56 
     1067      REAL(wp), PARAMETER ::   zbetah       = 1.e-3_wp    ! Eq. 26 
     1068      REAL(wp), PARAMETER ::   zgamma       = 1.25_wp     ! Eq. 26 
     1069      REAL(wp), PARAMETER ::   z1_gamma     = 1._wp / zgamma 
     1070      REAL(wp), PARAMETER ::   r1_3         = 1._wp / 3._wp 
     1071      ! 
     1072      INTEGER  ::   ji, jj         ! dummy loop indices 
     1073      REAL(wp) ::   zthetav_os, zthetav_is, zthetav_zu 
     1074      REAL(wp) ::   zrib_o, zrib_i 
     1075      REAL(wp) ::   zCdn_skin_ice, zCdn_form_ice, zCdn_ice 
     1076      REAL(wp) ::   zChn_skin_ice, zChn_form_ice 
     1077      REAL(wp) ::   z0w, z0i, zfmi, zfmw, zfhi, zfhw 
     1078      REAL(wp) ::   zCdn_form_tmp 
     1079      !!---------------------------------------------------------------------- 
     1080 
     1081      ! Momentum Neutral Transfert Coefficients (should be a constant) 
     1082      zCdn_form_tmp = zce10 * ( LOG( 10._wp / z0_form_ice + 1._wp ) / LOG( rn_zu / z0_form_ice + 1._wp ) )**2   ! Eq. 40 
     1083      zCdn_skin_ice = ( vkarmn                                      / LOG( rn_zu / z0_skin_ice + 1._wp ) )**2   ! Eq. 7 
     1084      zCdn_ice      = zCdn_skin_ice   ! Eq. 7 (cf Lupkes email for details) 
     1085      !zCdn_ice     = 1.89e-3         ! old ECHAM5 value (cf Eq. 32) 
     1086 
     1087      ! Heat Neutral Transfert Coefficients 
     1088      zChn_skin_ice = vkarmn**2 / ( LOG( rn_zu / z0_ice + 1._wp ) * LOG( rn_zu * z1_alpha / z0_skin_ice + 1._wp ) )   ! Eq. 50 + Eq. 52 (cf Lupkes email for details) 
     1089      
     1090      ! Atmospheric and Surface Variables 
     1091      zst(:,:)     = sst_m(:,:) + rt0                                       ! convert SST from Celcius to Kelvin 
     1092      zqo_sat(:,:) = 0.98_wp * q_sat( zst(:,:)  , sf(jp_slp)%fnow(:,:,1) )  ! saturation humidity over ocean [kg/kg] 
     1093      zqi_sat(:,:) = 0.98_wp * q_sat( tm_su(:,:), sf(jp_slp)%fnow(:,:,1) )  ! saturation humidity over ice   [kg/kg] 
     1094      ! 
     1095!!      DO jj = 2, jpjm1 
     1096!!         DO ji = fs_2, fs_jpim1 
     1097      DO jj = 1, jpj 
     1098         DO ji = 1, jpi 
     1099            ! Virtual potential temperature [K] 
     1100            zthetav_os = zst(ji,jj)   * ( 1._wp + rctv0 * zqo_sat(ji,jj) )   ! over ocean 
     1101            zthetav_is = tm_su(ji,jj) * ( 1._wp + rctv0 * zqi_sat(ji,jj) )   ! ocean ice 
     1102            zthetav_zu = t_zu (ji,jj) * ( 1._wp + rctv0 * q_zu(ji,jj)    )   ! at zu 
     1103             
     1104            ! Bulk Richardson Number (could use Ri_bulk function from aerobulk instead) 
     1105            zrib_o = grav / zthetav_os * ( zthetav_zu - zthetav_os ) * rn_zu / MAX( 0.5, wndm(ji,jj)     )**2   ! over ocean 
     1106            zrib_i = grav / zthetav_is * ( zthetav_zu - zthetav_is ) * rn_zu / MAX( 0.5, wndm_ice(ji,jj) )**2   ! over ice 
     1107             
     1108            ! Momentum and Heat Neutral Transfert Coefficients 
     1109            zCdn_form_ice = zCdn_form_tmp * at_i_b(ji,jj) * ( 1._wp - at_i_b(ji,jj) )**zbeta  ! Eq. 40 
     1110            zChn_form_ice = zCdn_form_ice / ( 1._wp + ( LOG( z1_alphaf ) / vkarmn ) * SQRT( zCdn_form_ice ) )               ! Eq. 53  
     1111                        
     1112            ! Momentum and Heat Stability functions (possibility to use psi_m_ecmwf instead) 
     1113            z0w = rn_zu * EXP( -1._wp * vkarmn / SQRT( Cdn_oce(ji,jj) ) ) ! over water 
     1114            z0i = z0_skin_ice                                             ! over ice (cf Lupkes email for details) 
     1115            IF( zrib_o <= 0._wp ) THEN 
     1116               zfmw = 1._wp - zam * zrib_o / ( 1._wp + 3._wp * zc2 * Cdn_oce(ji,jj) * SQRT( -zrib_o * ( rn_zu / z0w + 1._wp ) ) )  ! Eq. 10 
     1117               zfhw = ( 1._wp + ( zbetah * ( zthetav_os - zthetav_zu )**r1_3 / ( Chn_oce(ji,jj) * MAX(0.01, wndm(ji,jj)) )   &     ! Eq. 26 
     1118                  &             )**zgamma )**z1_gamma 
     1119            ELSE 
     1120               zfmw = 1._wp / ( 1._wp + zam * zrib_o / SQRT( 1._wp + zrib_o ) )   ! Eq. 12 
     1121               zfhw = 1._wp / ( 1._wp + zah * zrib_o / SQRT( 1._wp + zrib_o ) )   ! Eq. 28 
     1122            ENDIF 
     1123             
     1124            IF( zrib_i <= 0._wp ) THEN 
     1125               zfmi = 1._wp - zam * zrib_i / (1._wp + 3._wp * zc2 * zCdn_ice * SQRT( -zrib_i * ( rn_zu / z0i + 1._wp)))   ! Eq.  9 
     1126               zfhi = 1._wp - zah * zrib_i / (1._wp + 3._wp * zc2 * zCdn_ice * SQRT( -zrib_i * ( rn_zu / z0i + 1._wp)))   ! Eq. 25 
     1127            ELSE 
     1128               zfmi = 1._wp / ( 1._wp + zam * zrib_i / SQRT( 1._wp + zrib_i ) )   ! Eq. 11 
     1129               zfhi = 1._wp / ( 1._wp + zah * zrib_i / SQRT( 1._wp + zrib_i ) )   ! Eq. 27 
     1130            ENDIF 
     1131             
     1132            ! Momentum Transfert Coefficients (Eq. 38) 
     1133            Cd(ji,jj) = zCdn_skin_ice *   zfmi +  & 
     1134               &        zCdn_form_ice * ( zfmi * at_i_b(ji,jj) + zfmw * ( 1._wp - at_i_b(ji,jj) ) ) / MAX( 1.e-06, at_i_b(ji,jj) ) 
     1135             
     1136            ! Heat Transfert Coefficients (Eq. 49) 
     1137            Ch(ji,jj) = zChn_skin_ice *   zfhi +  & 
     1138               &        zChn_form_ice * ( zfhi * at_i_b(ji,jj) + zfhw * ( 1._wp - at_i_b(ji,jj) ) ) / MAX( 1.e-06, at_i_b(ji,jj) ) 
     1139            ! 
     1140         END DO 
     1141      END DO 
     1142!!      CALL lbc_lnk_multi( Cd, 'T',  1., Ch, 'T', 1. ) 
     1143      ! 
     1144   END SUBROUTINE Cdn10_Lupkes2015 
     1145 
    10241146#endif 
    1025     
    10261147 
    10271148   !!====================================================================== 
Note: See TracChangeset for help on using the changeset viewer.