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 12854 – NEMO

Changeset 12854


Ignore:
Timestamp:
2020-05-01T19:06:23+02:00 (4 years ago)
Author:
clem
Message:

1st implementation of snow fraction (impact on albedo). Light transmission is still not ok since we need a non-zero penetration of solar flux when snow thickness is > 0

Location:
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/ICE
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/ICE/icealb.F90

    r12832 r12854  
    1414   !!   ice_alb_init   : initialisation of albedo computation 
    1515   !!---------------------------------------------------------------------- 
    16    USE ice, ONLY: jpl ! sea-ice: number of categories 
    1716   USE phycst         ! physical constants 
    1817   USE dom_oce        ! domain: ocean 
     18   USE ice, ONLY: jpl ! sea-ice: number of categories 
     19   USE icevar         ! sea-ice: operations 
    1920   ! 
    2021   USE in_out_manager ! I/O manager 
     
    100101      REAL(wp), INTENT(  out), DIMENSION(:,:,:) ::   palb_ice     !  albedo of ice 
    101102      ! 
     103      REAL(wp), DIMENSION(jpi,jpj,jpl) :: za_s_fra   ! ice fraction covered by snow 
    102104      INTEGER  ::   ji, jj, jl                ! dummy loop indices 
    103105      REAL(wp) ::   z1_c1, z1_c2,z1_c3, z1_c4 ! local scalar 
     
    107109      REAL(wp) ::   zalb_snw, zafrac_snw      ! snow-covered sea ice albedo & relative snow fraction 
    108110      REAL(wp) ::   zalb_cs, zalb_os          ! albedo of ice under clear/overcast sky 
    109       REAL(wp) ::   zhs_min = 0.1_wp          ! minimum snow thickness to fully shade melt ponds and ice  
    110       REAL(wp) ::   z1_hsmin 
    111111      !!--------------------------------------------------------------------- 
    112112      ! 
     
    119119      z1_c4 = 1. / 0.03 
    120120      ! 
     121      CALL ice_var_snwfra( ph_snw, za_s_fra )   ! calculate ice fraction covered by snow 
     122      ! 
    121123      DO jl = 1, jpl 
    122124         DO jj = 1, jpj 
     
    126128               !--- Specific snow, ice and pond fractions ---! 
    127129               !---------------------------------------------!                
    128                IF( ph_snw(ji,jj,jl) < zhs_min ) THEN   !--- thin snow partially shades melt ponds and ice 
    129                   IF( ld_pnd_alb ) THEN   ;   zafrac_pnd = pafrac_pnd(ji,jj,jl) 
    130                   ELSE                    ;   zafrac_pnd = 0._wp   ;   ENDIF 
    131                   zafrac_snw = MAX( 0._wp, ( ph_snw(ji,jj,jl) * z1_hsmin ) * ( 1._wp - zafrac_pnd ) ) ! max for roundoff errors 
    132                   zafrac_ice = MAX( 0._wp, 1._wp - zafrac_pnd - zafrac_snw )                          ! max for roundoff errors 
     130               zafrac_snw = za_s_fra(ji,jj,jl) 
     131               IF( ld_pnd_alb ) THEN 
     132                  zafrac_pnd = MIN( pafrac_pnd(ji,jj,jl), 1._wp - zafrac_snw ) ! make sure (a_ip_eff + a_s_fra) <= 1 
    133133               ELSE 
    134                   zafrac_snw = 1._wp                   !--- thick snow fully shades melt ponds and ice 
    135134                  zafrac_pnd = 0._wp 
    136                   zafrac_ice = 0._wp 
    137                ENDIF 
     135               ENDIF 
     136               zafrac_ice = MAX( 0._wp, 1._wp - zafrac_pnd - zafrac_snw ) ! max for roundoff errors 
    138137               ! 
    139138               !---------------! 
  • NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/ICE/icethd_zdf_bl99.F90

    r12827 r12854  
    130130      REAL(wp), DIMENSION(jpij)            ::   zq_ini      ! diag errors on heat 
    131131      REAL(wp), DIMENSION(jpij)            ::   zghe        ! G(he), th. conduct enhancement factor, mono-cat 
     132      REAL(wp), DIMENSION(jpij)            ::   za_s_fra    ! ice fraction covered by snow  
    132133      ! 
    133134      ! Mono-category 
     
    143144      END DO 
    144145 
     146      CALL ice_var_snwfra( h_s_1d(1:npti), za_s_fra(1:npti) )   ! calculate ice fraction covered by snow 
     147       
    145148      !------------------ 
    146149      ! 1) Initialization 
     
    149152 
    150153         ! If the snow thickness drops below zhs_min then reduce the snow fraction instead 
    151          IF( h_s_1d(ji) < zhs_min ) THEN 
    152            isnow(ji) = h_s_1d(ji) / zhs_min 
    153            zh_s(ji) = zhs_min * r1_nlay_s 
    154          ELSE 
    155            isnow(ji) = 1.0_wp 
    156            zh_s(ji) = h_s_1d(ji) * r1_nlay_s 
    157          END IF 
    158  
     154         !!IF( h_s_1d(ji) < zhs_min ) THEN 
     155         !!  isnow(ji) = h_s_1d(ji) / zhs_min 
     156         !!  zh_s(ji) = zhs_min * r1_nlay_s 
     157         !!ELSE 
     158         !!  isnow(ji) = 1.0_wp 
     159         !!  zh_s(ji) = h_s_1d(ji) * r1_nlay_s 
     160         !!END IF 
     161         isnow(ji) = za_s_fra(ji) !!clem: 2 variables for the same thing 
     162         zh_s(ji) = h_s_1d(ji) * r1_nlay_s 
     163          
     164          
    159165         ! layer thickness 
    160166         zh_i(ji) = h_i_1d(ji) * r1_nlay_i 
     
    166172      END WHERE 
    167173      ! 
    168       WHERE( zh_s(1:npti) > 0._wp  )   ;   z1_h_s(1:npti) = 1._wp / zh_s(1:npti) 
     174      WHERE( zh_s(1:npti) >= epsi10 )   ;   z1_h_s(1:npti) = 1._wp / zh_s(1:npti) 
    169175      ELSEWHERE                         ;   z1_h_s(1:npti) = 0._wp 
    170176      END WHERE 
     
    881887         !--- Snow-ice interfacial temperature (diagnostic SIMIP) 
    882888         zfac = rn_cnd_s * zh_i(ji) + ztcond_i(ji,1) * zh_s(ji) 
    883          IF( h_s_1d(ji) >= zhs_min ) THEN 
     889         IF( h_s_1d(ji) >= zhs_min ) THEN !!clem change that 
    884890            t_si_1d(ji) = ( rn_cnd_s       * zh_i(ji) * t_s_1d(ji,1) +   & 
    885891               &            ztcond_i(ji,1) * zh_s(ji) * t_i_1d(ji,1) ) / MAX( epsi10, zfac ) 
  • NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/ICE/icevar.F90

    r12832 r12854  
    5151   !!   ice_var_sshdyn    : compute equivalent ssh in lead 
    5252   !!   ice_var_itd       : convert N-cat to M-cat 
     53   !!   ice_var_snwfra    : fraction of ice covered by snow 
    5354   !!---------------------------------------------------------------------- 
    5455   USE dom_oce        ! ocean space and time domain 
     
    7778   PUBLIC   ice_var_sshdyn 
    7879   PUBLIC   ice_var_itd 
     80   PUBLIC   ice_var_snwfra 
    7981 
    8082   INTERFACE ice_var_itd 
    8183      MODULE PROCEDURE ice_var_itd_1c1c, ice_var_itd_Nc1c, ice_var_itd_1cMc, ice_var_itd_NcMc 
     84   END INTERFACE 
     85 
     86   INTERFACE ice_var_snwfra 
     87      MODULE PROCEDURE ice_var_snwfra_1d, ice_var_snwfra_2d, ice_var_snwfra_3d 
    8288   END INTERFACE 
    8389 
     
    187193      REAL(wp), PARAMETER ::   zhl_max =  0.015_wp  ! pond lid thickness above which the ponds disappear from the albedo calculation 
    188194      REAL(wp), PARAMETER ::   zhl_min =  0.005_wp  ! pond lid thickness below which the full pond area is used in the albedo calculation 
    189       REAL(wp), DIMENSION(jpi,jpj,jpl) ::   z1_a_i, z1_v_i, z1_a_ip 
     195      REAL(wp), DIMENSION(jpi,jpj,jpl) ::   z1_a_i, z1_v_i, z1_a_ip, za_s_fra 
    190196      !!------------------------------------------------------------------- 
    191197 
     
    234240         &                                                       ( h_il(:,:,:) - zhl_min ) / ( zhl_max - zhl_min ) 
    235241      END WHERE 
     242      ! 
     243      CALL ice_var_snwfra( h_s, za_s_fra )           ! calculate ice fraction covered by snow 
     244      a_ip_eff = MIN( a_ip_eff, 1._wp - za_s_fra )   ! make sure (a_ip_eff + a_s_fra) <= 1 
     245      ! 
    236246      !                                           !---  salinity (with a minimum value imposed everywhere)      
    237247      IF( nn_icesal == 2 ) THEN 
     
    12681278   END SUBROUTINE ice_var_itd_NcMc 
    12691279 
     1280   !!------------------------------------------------------------------- 
     1281   !! INTERFACE ice_var_snwfra 
     1282   !! 
     1283   !! ** Purpose :  fraction of ice covered by snow 
     1284   !! 
     1285   !! ** Method  :  In absence of proper snow model on top of sea ice, 
     1286   !!               we argue that snow does not cover the whole ice because 
     1287   !!               of wind blowing... 
     1288   !!                 
     1289   !! ** Arguments : ph_s: snow thickness 
     1290   !!                 
     1291   !! ** Output    : pa_s_fra: fraction of ice covered by snow 
     1292   !! 
     1293   !!------------------------------------------------------------------- 
     1294   SUBROUTINE ice_var_snwfra_3d( ph_s, pa_s_fra ) 
     1295      !!------------------------------------------------------------------- 
     1296      REAL(wp), DIMENSION(:,:,:), INTENT(in   ) ::   ph_s        ! snow thickness 
     1297      REAL(wp), DIMENSION(:,:,:), INTENT(  out) ::   pa_s_fra    ! ice fraction covered by snow 
     1298      !!------------------------------------------------------------------- 
     1299      pa_s_fra(:,:,:) = 1._wp - EXP( -0.2_wp * rhos * ph_s(:,:,:) ) 
     1300   END SUBROUTINE ice_var_snwfra_3d 
     1301 
     1302   SUBROUTINE ice_var_snwfra_2d( ph_s, pa_s_fra ) 
     1303      !!------------------------------------------------------------------- 
     1304      REAL(wp), DIMENSION(:,:), INTENT(in   ) ::   ph_s        ! snow thickness 
     1305      REAL(wp), DIMENSION(:,:), INTENT(  out) ::   pa_s_fra    ! ice fraction covered by snow 
     1306      !!------------------------------------------------------------------- 
     1307      pa_s_fra(:,:) = 1._wp - EXP( -0.2_wp * rhos * ph_s(:,:) ) 
     1308   END SUBROUTINE ice_var_snwfra_2d 
     1309 
     1310   SUBROUTINE ice_var_snwfra_1d( ph_s, pa_s_fra ) 
     1311      !!------------------------------------------------------------------- 
     1312      REAL(wp), DIMENSION(:), INTENT(in   ) ::   ph_s        ! snow thickness 
     1313      REAL(wp), DIMENSION(:), INTENT(  out) ::   pa_s_fra    ! ice fraction covered by snow 
     1314      !!------------------------------------------------------------------- 
     1315      pa_s_fra(:) = 1._wp - EXP( -0.2_wp * rhos * ph_s(:) ) 
     1316   END SUBROUTINE ice_var_snwfra_1d 
     1317    
     1318 
    12701319#else 
    12711320   !!---------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.