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 15603 for branches/UKMO/dev_r5518_GO6_starthour_obsoper/NEMOGCM/NEMO/OPA_SRC/SBC/albedo.F90 – NEMO

Ignore:
Timestamp:
2021-12-16T10:39:55+01:00 (3 years ago)
Author:
mattmartin
Message:

Updated NEMO branch for coupled NWP at GO6 to include stochastic model perturbations.
For more info see ticket: https://code.metoffice.gov.uk/trac/nwpscience/ticket/1125.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/UKMO/dev_r5518_GO6_starthour_obsoper/NEMOGCM/NEMO/OPA_SRC/SBC/albedo.F90

    r12555 r15603  
    2121   USE lib_mpp        ! MPP library 
    2222   USE wrk_nemo       ! work arrays 
    23    USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)   
     23   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
     24   USE stopack 
    2425 
    2526   IMPLICIT NONE 
     
    3031 
    3132   INTEGER  ::   albd_init = 0      !: control flag for initialization 
    32    
     33 
    3334   REAL(wp) ::   rmue     = 0.40    !  cosine of local solar altitude 
    3435   REAL(wp) ::   ralb_oce = 0.066   ! ocean or lead albedo (Pegau and Paulson, Ann. Glac. 2001) 
     
    3637   REAL(wp) ::   c2       = 0.10    !  "        " 
    3738   REAL(wp) ::   rcloud   = 0.06    ! cloud effect on albedo (only-for nn_ice_alb=0) 
    38   
     39 
    3940   !                             !!* namelist namsbc_alb 
    4041   INTEGER  ::   nn_ice_alb 
     
    5152      !!---------------------------------------------------------------------- 
    5253      !!               ***  ROUTINE albedo_ice  *** 
    53       !!           
    54       !! ** Purpose :   Computation of the albedo of the snow/ice system  
    55       !!        
     54      !! 
     55      !! ** Purpose :   Computation of the albedo of the snow/ice system 
     56      !! 
    5657      !! ** Method  :   Two schemes are available (from namelist parameter nn_ice_alb) 
    5758      !!                  0: the scheme is that of Shine & Henderson-Sellers (JGR 1985) for clear-skies 
     
    7273      !! ** Note    :   The parameterization from Shine & Henderson-Sellers presents several misconstructions: 
    7374      !!                  1) ice albedo when ice thick. tends to 0 is different than ocean albedo 
    74       !!                  2) for small ice thick. covered with some snow (<3cm?), albedo is larger  
     75      !!                  2) for small ice thick. covered with some snow (<3cm?), albedo is larger 
    7576      !!                     under melting conditions than under freezing conditions 
    76       !!                  3) the evolution of ice albedo as a function of ice thickness shows   
     77      !!                  3) the evolution of ice albedo as a function of ice thickness shows 
    7778      !!                     3 sharp inflexion points (at 5cm, 100cm and 150cm) that look highly unrealistic 
    7879      !! 
    7980      !! References :   Shine & Henderson-Sellers 1985, JGR, 90(D1), 2243-2250. 
    8081      !!                Brandt et al. 2005, J. Climate, vol 18 
    81       !!                Grenfell & Perovich 2004, JGR, vol 109  
     82      !!                Grenfell & Perovich 2004, JGR, vol 109 
    8283      !!---------------------------------------------------------------------- 
    8384      REAL(wp), INTENT(in   ), DIMENSION(:,:,:) ::   pt_ice      !  ice surface temperature (Kelvin) 
     
    9697 
    9798      ijpl = SIZE( pt_ice, 3 )                     ! number of ice categories 
    98        
     99 
    99100      CALL wrk_alloc( jpi,jpj,ijpl, zalb, zalb_it ) 
    100101 
    101       IF( albd_init == 0 )   CALL albedo_init      ! initialization  
    102  
    103        
     102      IF( albd_init == 0 )   CALL albedo_init      ! initialization 
     103 
     104 
    104105      SELECT CASE ( nn_ice_alb ) 
    105106 
     
    108109      !------------------------------------------ 
    109110      CASE( 0 ) 
    110         
     111 
    111112         ralb_sf = 0.80       ! dry snow 
    112113         ralb_sm = 0.65       ! melting snow 
    113114         ralb_if = 0.72       ! bare frozen ice 
    114          ralb_im = rn_albice  ! bare puddled ice  
    115           
     115         ralb_im = rn_albice  ! bare puddled ice 
     116 
    116117         !  Computation of ice albedo (free of snow) 
    117118         WHERE     ( ph_snw == 0._wp .AND. pt_ice >= rt0_ice )   ;   zalb(:,:,:) = ralb_im 
    118119         ELSE WHERE                                              ;   zalb(:,:,:) = ralb_if 
    119120         END  WHERE 
    120        
     121 
    121122         WHERE     ( 1.5  < ph_ice                     )  ;  zalb_it = zalb 
    122123         ELSE WHERE( 1.0  < ph_ice .AND. ph_ice <= 1.5 )  ;  zalb_it = 0.472  + 2.0 * ( zalb - 0.472 ) * ( ph_ice - 1.0 ) 
     
    126127         ELSE WHERE                                       ;  zalb_it = 0.1    + 3.6    * ph_ice 
    127128         END WHERE 
    128       
     129 
    129130         DO jl = 1, ijpl 
    130131            DO jj = 1, jpj 
     
    132133                  ! freezing snow 
    133134                  ! no effect of underlying ice layer IF snow thickness > c1. Albedo does not depend on snow thick if > c2 
    134                   !                                        !  freezing snow         
     135                  !                                        !  freezing snow 
    135136                  zswitch   = 1._wp - MAX( 0._wp , SIGN( 1._wp , - ( ph_snw(ji,jj,jl) - c1 ) ) ) 
    136137                  zalb_sf   = ( 1._wp - zswitch ) * (  zalb_it(ji,jj,jl)  & 
    137138                     &                           + ph_snw(ji,jj,jl) * ( ralb_sf - zalb_it(ji,jj,jl) ) / c1  )   & 
    138                      &        +         zswitch   * ralb_sf   
     139                     &        +         zswitch   * ralb_sf 
    139140 
    140141                  ! melting snow 
     
    142143                  zswitch   = MAX( 0._wp , SIGN( 1._wp , ph_snw(ji,jj,jl) - c2 ) ) 
    143144                  zalb_sm = ( 1._wp - zswitch ) * ( ralb_im + ph_snw(ji,jj,jl) * ( ralb_sm - ralb_im ) / c2 )   & 
    144                       &     +         zswitch   *   ralb_sm  
     145                      &     +         zswitch   *   ralb_sm 
    145146                  ! 
    146147                  ! snow albedo 
    147                   zswitch  =  MAX( 0._wp , SIGN( 1._wp , pt_ice(ji,jj,jl) - rt0_snow ) )    
     148                  zswitch  =  MAX( 0._wp , SIGN( 1._wp , pt_ice(ji,jj,jl) - rt0_snow ) ) 
    148149                  zalb_st  =  zswitch * zalb_sm + ( 1._wp - zswitch ) * zalb_sf 
    149                 
     150 
    150151                  ! Ice/snow albedo 
    151152                  zswitch   = 1._wp - MAX( 0._wp , SIGN( 1._wp , - ph_snw(ji,jj,jl) ) ) 
     
    154155               END DO 
    155156            END DO 
     157 
     158#if defined key_traldf_c2d || key_traldf_c3d 
     159            IF ( ln_stopack .AND. nn_spp_icealb > 0 ) & 
     160               & CALL spp_gen( 1, pa_ice_cs(:,:,jl), nn_spp_icealb, rn_icealb_sd, jk_spp_alb, jl ) 
     161#else 
     162            IF ( ln_stopack .AND. nn_spp_icealb > 0 ) & 
     163               & CALL ctl_stop( 'albedo_ice: parameter perturbation will only work with '// & 
     164                                'key_traldf_c2d or key_traldf_c3d') 
     165#endif 
    156166         END DO 
    157167 
     
    161171      !  New parameterization (2016) 
    162172      !------------------------------------------ 
    163       CASE( 1 )  
     173      CASE( 1 ) 
    164174 
    165175         ralb_im = rn_albice  ! bare puddled ice 
     
    176186!         ralb_sm = 0.82      ! melting snow 
    177187!         ralb_if = 0.54      ! bare frozen ice 
    178 !  
     188! 
    179189         !  Computation of ice albedo (free of snow) 
    180          z1_c1 = 1. / ( LOG(1.5) - LOG(0.05) )  
     190         z1_c1 = 1. / ( LOG(1.5) - LOG(0.05) ) 
    181191         z1_c2 = 1. / 0.05 
    182192         WHERE     ( ph_snw == 0._wp .AND. pt_ice >= rt0_ice )   ;   zalb = ralb_im 
    183193         ELSE WHERE                                              ;   zalb = ralb_if 
    184194         END  WHERE 
    185           
     195 
    186196         WHERE     ( 1.5  < ph_ice                     )  ;  zalb_it = zalb 
    187197         ELSE WHERE( 0.05 < ph_ice .AND. ph_ice <= 1.5 )  ;  zalb_it = zalb     + ( 0.18 - zalb     ) * z1_c1 *  & 
     
    200210 
    201211                   ! snow albedo 
    202                   zswitch = MAX( 0._wp , SIGN( 1._wp , pt_ice(ji,jj,jl) - rt0_snow ) )    
     212                  zswitch = MAX( 0._wp , SIGN( 1._wp , pt_ice(ji,jj,jl) - rt0_snow ) ) 
    203213                  zalb_st = zswitch * zalb_sm + ( 1._wp - zswitch ) * zalb_sf 
    204214 
    205                   ! Ice/snow albedo    
     215                  ! Ice/snow albedo 
    206216                  zswitch             = MAX( 0._wp , SIGN( 1._wp , - ph_snw(ji,jj,jl) ) ) 
    207217                  pa_ice_os(ji,jj,jl) = ( 1._wp - zswitch ) * zalb_st + zswitch *  zalb_it(ji,jj,jl) 
     
    209219              END DO 
    210220            END DO 
     221 
     222#if defined key_traldf_c2d || key_traldf_c3d 
     223            IF ( ln_stopack .AND. nn_spp_icealb > 0 ) & 
     224               & CALL spp_gen( 1, pa_ice_os(:,:,jl), nn_spp_icealb, rn_icealb_sd, jk_spp_alb, jl ) 
     225#else 
     226            IF ( ln_stopack .AND. nn_spp_icealb > 0 ) & 
     227               & CALL ctl_stop( 'albedo_ice: parameter perturbation will only work with '// & 
     228                                'key_traldf_c2d or key_traldf_c3d') 
     229#endif 
    211230         END DO 
    212231         ! Effect of the clouds (2d order polynomial) 
    213          pa_ice_cs = pa_ice_os - ( - 0.1010 * pa_ice_os * pa_ice_os + 0.1933 * pa_ice_os - 0.0148 );  
     232         pa_ice_cs = pa_ice_os - ( - 0.1010 * pa_ice_os * pa_ice_os + 0.1933 * pa_ice_os - 0.0148 ); 
    214233 
    215234      END SELECT 
    216        
     235 
    217236      CALL wrk_dealloc( jpi,jpj,ijpl, zalb, zalb_it ) 
    218237      ! 
     
    223242      !!---------------------------------------------------------------------- 
    224243      !!               ***  ROUTINE albedo_oce  *** 
    225       !!  
     244      !! 
    226245      !! ** Purpose :   Computation of the albedo of the ocean 
    227246      !!---------------------------------------------------------------------- 
     
    229248      REAL(wp), DIMENSION(:,:), INTENT(out) ::   pa_oce_cs   !  albedo of ocean under clear sky 
    230249      !! 
    231       REAL(wp) :: zcoef  
     250      REAL(wp) :: zcoef 
    232251      !!---------------------------------------------------------------------- 
    233252      ! 
    234253      zcoef = 0.05 / ( 1.1 * rmue**1.4 + 0.15 )   ! Parameterization of Briegled and Ramanathan, 1982 
    235       pa_oce_cs(:,:) = zcoef  
     254      pa_oce_cs(:,:) = zcoef 
    236255      pa_oce_os(:,:) = 0.06                       ! Parameterization of Kondratyev, 1969 and Payne, 1972 
    237256      ! 
     
    248267      !!---------------------------------------------------------------------- 
    249268      INTEGER  ::   ios                 ! Local integer output status for namelist read 
    250       NAMELIST/namsbc_alb/ nn_ice_alb, rn_albice  
     269      NAMELIST/namsbc_alb/ nn_ice_alb, rn_albice 
    251270      !!---------------------------------------------------------------------- 
    252271      ! 
Note: See TracChangeset for help on using the changeset viewer.