*IF DEF,A08_7A                                                             SFSNOW7A.2      
C *****************************COPYRIGHT******************************     SFSNOW7A.3      
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved.    SFSNOW7A.4      
C                                                                          SFSNOW7A.5      
C Use, duplication or disclosure of this code is subject to the            SFSNOW7A.6      
C restrictions as set forth in the contract.                               SFSNOW7A.7      
C                                                                          SFSNOW7A.8      
C                Meteorological Office                                     SFSNOW7A.9      
C                London Road                                               SFSNOW7A.10     
C                BRACKNELL                                                 SFSNOW7A.11     
C                Berkshire UK                                              SFSNOW7A.12     
C                RG12 2SZ                                                  SFSNOW7A.13     
C                                                                          SFSNOW7A.14     
C If no contract has been raised with this copy of the code, the use,      SFSNOW7A.15     
C duplication or disclosure of it is strictly prohibited.  Permission      SFSNOW7A.16     
C to do so must first be obtained in writing from the Head of Numerical    SFSNOW7A.17     
C Modelling at the above address.                                          SFSNOW7A.18     
C ******************************COPYRIGHT******************************    SFSNOW7A.19     
C                                                                          SFSNOW7A.20     
CLL  SUBROUTINE SFSNOW ------------------------------------------------    SFSNOW7A.21     
CLL                                                                        SFSNOW7A.22     
CLL  Purpose:  Calculates the decrease/increase in snowdepth due to the    SFSNOW7A.23     
CLL            sublimation/deposition of lying snow; adds the large-       SFSNOW7A.24     
CLL            scale and convective snowfall to the snowdepth;             SFSNOW7A.25     
CLL            updates the snow layer temperature;                         SFSNOW7A.26     
CLL            melts snow when the snow layer temperature is above         SFSNOW7A.27     
CLL            the melting point of ice.                                   SFSNOW7A.28     
CLL                                                                        SFSNOW7A.29     
CLL  Model            Modification history from model version 3.0:         SFSNOW7A.30     
CLL version  Date                                                          SFSNOW7A.31     
CLL                                                                        SFSNOW7A.32     
CLL  Programming standard: Unified Model Documentation Paper No.4          SFSNOW7A.33     
CLL                        version no. 2, dated 18/1/90.                   SFSNOW7A.34     
CLL                                                                        SFSNOW7A.35     
CLL  Logical component covered: P251.                                      SFSNOW7A.36     
CLL                                                                        SFSNOW7A.37     
CLL  System task:                                                          SFSNOW7A.38     
CLL                                                                        SFSNOW7A.39     
CLL  Documentation: um documentation paper no 25                           SFSNOW7A.40     
CLLEND------------------------------------------------------------------   SFSNOW7A.41     
C                                                                          SFSNOW7A.42     
C*L  ARGUMENTS:---------------------------------------------------------   SFSNOW7A.43     

      SUBROUTINE SFSNOW(                                                    3,4SFSNOW7A.44     
     & NPNTS,SOIL_PTS,SOIL_INDEX,                                          SFSNOW7A.45     
     & CONV_SNOW,LS_SNOW,DZ_1,HCONS,SNOW_FRAC,SNOW_SUB,SNOW_SURF_HTF,      SFSNOW7A.46     
     & TSOIL_1,TSTAR,TIMESTEP,                                             SFSNOW7A.47     
     & LYING_SNOW,RGRAIN,L_SNOW_ALBEDO,SNOWMELT,TSNOW,                     SFSNOW7A.48     
     & SNOMLT_SUB_HTF,SNOW_SOIL_HTF,STF_HF_SNOW_MELT,LTIMER)               SFSNOW7A.49     
                                                                           SFSNOW7A.50     
      IMPLICIT NONE                                                        SFSNOW7A.51     
                                                                           SFSNOW7A.52     
      INTEGER                                                              SFSNOW7A.53     
     & NPNTS                ! IN Number of gridpoints.                     SFSNOW7A.54     
     &,SOIL_PTS             ! IN Number of soil points.                    SFSNOW7A.55     
     &,SOIL_INDEX(NPNTS)    ! IN Array of soil points.                     SFSNOW7A.56     
                                                                           SFSNOW7A.57     
      REAL                                                                 SFSNOW7A.58     
     & CONV_SNOW(NPNTS)     ! IN Convective snowfall (kg/m2/s).            SFSNOW7A.59     
     &,LS_SNOW(NPNTS)       ! IN Large-scale snowfall (kg/m2/s).           SFSNOW7A.60     
     &,DZ_1                 ! IN Soil surface layer depth (m).             SFSNOW7A.61     
     &,HCONS(NPNTS)         ! IN Thermal conductivity of surface soil      SFSNOW7A.62     
!                           !    layer (W/m/K).                            SFSNOW7A.63     
     &,SNOW_FRAC(NPNTS)     ! IN Snow-cover fraction.                      SFSNOW7A.64     
     &,SNOW_SUB(NPNTS)      ! IN Sublimation of lying snow (kg/m2/s).      SFSNOW7A.65     
     &,SNOW_SURF_HTF(NPNTS) ! IN Snow surface heat flux (W/m2).            SFSNOW7A.66     
     &,TSOIL_1(NPNTS)       ! IN Soil surface layer temperature (K).       SFSNOW7A.67     
     &,TIMESTEP             ! IN Timestep (s).                             SFSNOW7A.68     
     &,TSTAR(NPNTS)         ! IN Snow surface temperature (K).             SFSNOW7A.69     
                                                                           SFSNOW7A.70     
      REAL                                                                 SFSNOW7A.71     
     & LYING_SNOW(NPNTS)    ! INOUT Snow on the ground (kg/m2).            SFSNOW7A.72     
     &,RGRAIN(NPNTS)        ! INOUT Snow grain size (microns).             SFSNOW7A.73     
     &,SNOWMELT(NPNTS)      ! IN    Surface snowmelt (kg/m2/s).            SFSNOW7A.74     
!                           ! OUT   Total snowmelt (kg/m2/s).              SFSNOW7A.75     
     &,TSNOW(NPNTS)         ! INOUT Snow surface layer temperature (K).    SFSNOW7A.76     
                                                                           SFSNOW7A.77     
      REAL                                                                 SFSNOW7A.78     
     & SNOMLT_SUB_HTF(NPNTS)! OUT Sub-surface snowmelt heat flux (W/m2).   SFSNOW7A.79     
     &,SNOW_SOIL_HTF(NPNTS) ! OUT Heat flux from snow to soil (W/m2).      SFSNOW7A.80     
                                                                           SFSNOW7A.81     
      LOGICAL                                                              SFSNOW7A.82     
     & STF_HF_SNOW_MELT     ! IN Stash flag for snow melt heat flux.       SFSNOW7A.83     
     &,L_SNOW_ALBEDO        ! IN Flag for prognostic snow albedo.          SFSNOW7A.84     
     &,LTIMER               ! IN Logical for TIMER.                        SFSNOW7A.85     
                                                                           SFSNOW7A.86     
*CALL C_LHEAT                                                              SFSNOW7A.87     
*CALL C_0_DG_C                                                             SFSNOW7A.88     
*CALL C_SOILH                                                              SFSNOW7A.89     
                                                                           SFSNOW7A.90     
! Local variables                                                          SFSNOW7A.91     
      REAL                                                                 SFSNOW7A.92     
     & ASNOW               ! Reciprocal areal heat capacity of surface     SFSNOW7A.93     
!                          ! snow layer (K m2 / J).                        SFSNOW7A.94     
     &,R0                  ! Grain size for fresh snow (microns).          SFSNOW7A.95     
     &,RMAX                ! Maximum snow grain size (microns).            SFSNOW7A.96     
     &,RATE                ! Grain area growth rate (microns**2 / s).      SFSNOW7A.97     
     &,SNOWFALL            ! Snowfall in timestep (kg/m2).                 SFSNOW7A.98     
     &,SNOWDEPTH           ! Local snowdepth (m).                          SFSNOW7A.99     
     &,SNOMLT_SUB          ! Sub-surface snow melt (kg/m2).                SFSNOW7A.100    
      PARAMETER (R0 = 50., RMAX = 2000.)                                   SFSNOW7A.101    
      INTEGER I,J          ! Loop counters.                                SFSNOW7A.102    
                                                                           SFSNOW7A.103    
! NO EXTERNAL SUBROUTINES CALLED                                           SFSNOW7A.104    
                                                                           SFSNOW7A.105    
      IF (LTIMER) THEN                                                     SFSNOW7A.106    
        CALL TIMER('SFSNOW  ',103)                                         GPB8F405.148    
      ENDIF                                                                SFSNOW7A.108    
      ASNOW = 1./(SNOW_HCAP*DEFF_SNOW)                                     SFSNOW7A.109    
                                                                           SFSNOW7A.110    
!-----------------------------------------------------------------------   SFSNOW7A.111    
! Update TSNOW for land points without permanent ice cover.                SFSNOW7A.112    
!-----------------------------------------------------------------------   SFSNOW7A.113    
      DO J=1,SOIL_PTS                                                      SFSNOW7A.114    
        I=SOIL_INDEX(J)                                                    SFSNOW7A.115    
        IF (SNOW_FRAC(I) .GT. 0.0) THEN                                    SFSNOW7A.116    
          SNOWDEPTH = LYING_SNOW(I)/(RHO_SNOW*SNOW_FRAC(I))                SFSNOW7A.117    
          SNOWDEPTH = MAX (SNOWDEPTH, DEFF_SNOW/2)                         ARE1F405.33     
          SNOW_SOIL_HTF(I) = SNOW_FRAC(I)*(TSNOW(I) - TSOIL_1(I)) /        ARE1F405.41     
     &                       ( (2*SNOWDEPTH - DEFF_SNOW)/(2*SNOW_HCON)     SFSNOW7A.119    
     &                                           + DZ_1 / (2*HCONS(I)) )   SFSNOW7A.120    
          TSNOW(I) = TSNOW(I) + TIMESTEP*(ASNOW/SNOW_FRAC(I))*             ARE1F405.42     
     &                             (SNOW_SURF_HTF(I) - SNOW_SOIL_HTF(I))   SFSNOW7A.122    
        ELSE                                                               SFSNOW7A.123    
          SNOW_SOIL_HTF(I) = 0.                                            SFSNOW7A.124    
          TSNOW(I) = TSOIL_1(I)                                            SFSNOW7A.125    
        ENDIF                                                              SFSNOW7A.126    
      ENDDO                                                                SFSNOW7A.127    
                                                                           SFSNOW7A.128    
!-----------------------------------------------------------------------   SFSNOW7A.129    
! Increment snowdepth by sublimation and surface melt.                     SFSNOW7A.130    
!-----------------------------------------------------------------------   SFSNOW7A.131    
      DO I=1,NPNTS                                                         ABX1F405.970    
        LYING_SNOW(I) = LYING_SNOW(I) - TIMESTEP *                         SFSNOW7A.134    
     &                                     ( SNOW_SUB(I) + SNOWMELT(I) )   SFSNOW7A.135    
        LYING_SNOW(I) = MAX( LYING_SNOW(I), 0. )                           SFSNOW7A.136    
      ENDDO                                                                SFSNOW7A.137    
                                                                           SFSNOW7A.138    
!-----------------------------------------------------------------------   SFSNOW7A.139    
! Melt snow over land if TSNOW is above freezing.                          SFSNOW7A.140    
! Increment snowdepth by subsurface melt.                                  SFSNOW7A.141    
!-----------------------------------------------------------------------   SFSNOW7A.142    
      DO J=1,SOIL_PTS                                                      ABX1F405.971    
        I=SOIL_INDEX(J)                                                    SFSNOW7A.144    
        SNOMLT_SUB = 0.0                                                   SFSNOW7A.145    
        IF (TSNOW(I).GT.TM .AND. LYING_SNOW(I).GT.0.0) THEN                SFSNOW7A.146    
          SNOMLT_SUB = MIN( LYING_SNOW(I),                                 SFSNOW7A.147    
     &                         SNOW_FRAC(I)*(TSNOW(I) - TM)/(LF*ASNOW) )   SFSNOW7A.148    
          TSNOW(I) = TM                                                    SFSNOW7A.149    
          LYING_SNOW(I) = LYING_SNOW(I) - SNOMLT_SUB                       SFSNOW7A.150    
          SNOWMELT(I) = SNOWMELT(I) + SNOMLT_SUB/TIMESTEP                  SFSNOW7A.151    
        ENDIF                                                              SFSNOW7A.152    
        IF (STF_HF_SNOW_MELT) SNOMLT_SUB_HTF(I) = LF*SNOMLT_SUB            SFSNOW7A.153    
      ENDDO                                                                SFSNOW7A.154    
                                                                           SFSNOW7A.155    
!-----------------------------------------------------------------------   SFSNOW7A.156    
! Increment snowdepth by snowfall.                                         SFSNOW7A.157    
!-----------------------------------------------------------------------   SFSNOW7A.158    
      DO I=1,NPNTS                                                         ABX1F405.972    
        LYING_SNOW(I) = LYING_SNOW(I) + TIMESTEP *                         SFSNOW7A.161    
     &                                     ( LS_SNOW(I) + CONV_SNOW(I) )   SFSNOW7A.162    
      ENDDO                                                                SFSNOW7A.163    
                                                                           SFSNOW7A.164    
!-----------------------------------------------------------------------   SFSNOW7A.165    
! Increment snow grain size used in albedo calculations                    SFSNOW7A.166    
!-----------------------------------------------------------------------   SFSNOW7A.167    
      IF ( L_SNOW_ALBEDO ) THEN                                            SFSNOW7A.168    
        DO I=1,NPNTS                                                       SFSNOW7A.169    
          IF ( LYING_SNOW(I) .GT. 0.) THEN                                 SFSNOW7A.170    
            SNOWFALL = TIMESTEP*(LS_SNOW(I) + CONV_SNOW(I))                SFSNOW7A.171    
            RATE = 0.6                                                     SFSNOW7A.172    
            IF (TSTAR(I) .LT. TM) THEN                                     SFSNOW7A.173    
              IF (RGRAIN(I) .LT. 150.) THEN                                SFSNOW7A.174    
                RATE = 0.06                                                SFSNOW7A.175    
              ELSE                                                         SFSNOW7A.176    
                RATE = 0.23E6*EXP(-3.7E4/(8.13451*TSTAR(I)))               SFSNOW7A.177    
              ENDIF                                                        SFSNOW7A.178    
            ENDIF                                                          SFSNOW7A.179    
            RGRAIN(I) = SQRT( RGRAIN(I)**2 + (RATE/3.14159)*TIMESTEP )     SFSNOW7A.180    
     &                                   - (RGRAIN(I) - R0)*SNOWFALL/2.5   SFSNOW7A.181    
            RGRAIN(I) = MIN( RMAX, RGRAIN(I) )                             SFSNOW7A.182    
            RGRAIN(I) = MAX( R0, RGRAIN(I) )                               SFSNOW7A.183    
          ELSE                                                             SFSNOW7A.184    
            RGRAIN(I) = R0                                                 SFSNOW7A.185    
          ENDIF                                                            SFSNOW7A.186    
        ENDDO                                                              SFSNOW7A.187    
      ENDIF                                                                SFSNOW7A.188    
                                                                           SFSNOW7A.189    
      IF (LTIMER) THEN                                                     SFSNOW7A.190    
        CALL TIMER('SFSNOW  ',104)                                         GPB8F405.149    
      ENDIF                                                                SFSNOW7A.192    
                                                                           SFSNOW7A.193    
      RETURN                                                               SFSNOW7A.194    
      END                                                                  SFSNOW7A.195    
*ENDIF                                                                     SFSNOW7A.196