*IF DEF,A03_6A                                                             ACB1F405.11     
C *****************************COPYRIGHT******************************     SFMELT5B.3      
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved.    SFMELT5B.4      
C                                                                          SFMELT5B.5      
C Use, duplication or disclosure of this code is subject to the            SFMELT5B.6      
C restrictions as set forth in the contract.                               SFMELT5B.7      
C                                                                          SFMELT5B.8      
C                Meteorological Office                                     SFMELT5B.9      
C                London Road                                               SFMELT5B.10     
C                BRACKNELL                                                 SFMELT5B.11     
C                Berkshire UK                                              SFMELT5B.12     
C                RG12 2SZ                                                  SFMELT5B.13     
C                                                                          SFMELT5B.14     
C If no contract has been raised with this copy of the code, the use,      SFMELT5B.15     
C duplication or disclosure of it is strictly prohibited.  Permission      SFMELT5B.16     
C to do so must first be obtained in writing from the Head of Numerical    SFMELT5B.17     
C Modelling at the above address.                                          SFMELT5B.18     
C ******************************COPYRIGHT******************************    SFMELT5B.19     
                                                                           SFMELT5B.20     
! SUBROUTINE SF_MELT----------------------------------------------------   SFMELT5B.21     
! Purpose : Calculates surface melting (snow and sea-ice) and increments   SFMELT5B.22     
!           in surface fluxes to satisfy energy balance.                   SFMELT5B.23     
!           Sub-surface snowmelt is calculated and snowdepth incremented   SFMELT5B.24     
!           by melt and sublimation in P251.                               SFMELT5B.25     
!           R.Essery 19/1/95                                               SFMELT5B.26     
!                                                                          SFMELT5B.27     
!                                                                          SFMELT5B.28     
!                                                                          SFMELT5B.29     
!  Model            Modification history:                                  SFMELT5B.30     
! version  Date                                                            SFMELT5B.31     
C  4.5    Jul. 98  Kill the IBM specific lines (JCThil)                    AJC1F405.66     
!-----------------------------------------------------------------------   SFMELT5B.32     

      SUBROUTINE SF_MELT(                                                   3,6SFMELT5B.33     
     & P_FIELD,P1,N_TYPES,LAND_FIELD,LAND1                                 SFMELT5B.34     
     &,POINTS,LAND_MASK,LAND_PTS,LAND_INDEX                                SFMELT5B.38     
     &,ALPHA1,ASHTF,ASURF,TILE_FRAC,ICE_FRACT                              SFMELT5B.40     
     &,RHOKH1_PRIME,TIMESTEP,SIMLT,SMLT,DFQW,DIFF_SENS_HTF                 SFMELT5B.41     
     &,EI,LYING_SNOW,SURF_HT_FLUX,TSTAR_TILE,TI                            SFMELT5B.42     
     &,SICE_MLT_HTF,SNOMLT_SURF_HTF,SNOWMELT,LTIMER                        SFMELT5B.43     
     &)                                                                    SFMELT5B.44     
                                                                           SFMELT5B.45     
      IMPLICIT NONE                                                        SFMELT5B.46     
                                                                           SFMELT5B.47     
      LOGICAL LTIMER                                                       SFMELT5B.48     
                                                                           SFMELT5B.49     
      INTEGER                                                              SFMELT5B.50     
     & P_FIELD              ! IN No. of gridpoints in the whole grid.      SFMELT5B.51     
     &,P1                   ! IN 1st P-pt in full field to be processed.   SFMELT5B.52     
     &,N_TYPES              ! IN max number of tiles per grid-box          SFMELT5B.53     
     &,LAND_FIELD           ! IN No. of land points in the whole grid.     SFMELT5B.54     
     &,LAND1                ! IN 1st L-pt in full field to be processed.   SFMELT5B.55     
     &,POINTS               ! IN No. of gridpoints to be processed.        SFMELT5B.56     
     &,LAND_PTS             ! IN No. of land points to be processed.       SFMELT5B.57     
                                                                           SFMELT5B.58     
      LOGICAL                                                              SFMELT5B.59     
     & LAND_MASK(P_FIELD)   ! IN T for land points, F otherwise.           SFMELT5B.60     
      INTEGER                                                              SFMELT5B.62     
     & LAND_INDEX(P_FIELD)  ! IN Index of land points on the P-grid.       SFMELT5B.63     
!                                The ith element contains the position     SFMELT5B.64     
!                                in whole grid of the ith land point.      SFMELT5B.65     
                                                                           SFMELT5B.67     
       REAL                                                                SFMELT5B.68     
     & ALPHA1(P_FIELD,N_TYPES)                                             SFMELT5B.69     
!                             IN Gradient of saturated specific            SFMELT5B.70     
!                                humidity with respect to temp.            SFMELT5B.71     
!                                between the bottom model layer            SFMELT5B.72     
!                                and the surface.                          SFMELT5B.73     
     &,ASHTF(P_FIELD)       ! IN Forward time weighted coeff.              SFMELT5B.74     
!                                to calculate the soil heat flux           SFMELT5B.75     
!                                between the surface and top soil          SFMELT5B.76     
!                                layer (W/m2/K).                           SFMELT5B.77     
     &,ASURF(P_FIELD)       ! IN Reciprocal areal heat capacity of         SFMELT5B.78     
!                                top soil layer or sea-ice surface         SFMELT5B.79     
!                                layer (m2 K / J).                         SFMELT5B.80     
     &,ICE_FRACT(P_FIELD)   ! IN Fraction of gridbox which is covered      SFMELT5B.81     
!                                by sea-ice.                               SFMELT5B.82     
     &,RHOKH1_PRIME(P_FIELD,N_TYPES)                                       SFMELT5B.83     
!                             IN Modified forward time-weighted            SFMELT5B.84     
!                                transfer coefficient.                     SFMELT5B.85     
     &,TILE_FRAC(P_FIELD,N_TYPES)                                          SFMELT5B.86     
!                             IN Fraction of gridbox which is covered      SFMELT5B.87     
!                                by a tile.                                SFMELT5B.88     
     &,TIMESTEP             ! IN Timestep (sec).                           SFMELT5B.89     
                                                                           SFMELT5B.90     
      LOGICAL                                                              SFMELT5B.91     
     & SIMLT                ! IN STASH flag for sea-ice melting ht flux.   SFMELT5B.92     
     &,SMLT                 ! IN STASH flag for snow melting ht flux.      SFMELT5B.93     
                                                                           SFMELT5B.94     
      REAL                                                                 SFMELT5B.95     
     & DFQW(P_FIELD,N_TYPES)! INOUT Increment to the flux of total         SFMELT5B.96     
!                                   water.                                 SFMELT5B.97     
     &,DIFF_SENS_HTF(P_FIELD,N_TYPES)                                      SFMELT5B.98     
!                             INOUT Increment to the sensible heat         SFMELT5B.99     
!                                    flux (W/m2).                          SFMELT5B.100    
     &,EI(P_FIELD,N_TYPES)  ! INOUT Sublimation from lying snow or         SFMELT5B.101    
!                                   sea-ice (Kg/m2/s).                     SFMELT5B.102    
     &,LYING_SNOW(P_FIELD)  ! INOUT Lying snow (kg/m2).                    SFMELT5B.103    
     &,SURF_HT_FLUX(P_FIELD,N_TYPES)                                       SFMELT5B.104    
!                             INOUT Net downward heat flux at surface      SFMELT5B.105    
!                                   over land or sea-ice fraction of       SFMELT5B.106    
!                                   gridbox (W/m2).                        SFMELT5B.107    
     &,TSTAR_TILE(P_FIELD,N_TYPES)                                         SFMELT5B.108    
!                             INOUT Surface temperature (K).               SFMELT5B.109    
     &,TI(P_FIELD)          ! INOUT Sea-ice surface layer temp. (K).       SFMELT5B.110    
     &,SICE_MLT_HTF(P_FIELD)! OUT Heat flux due to melting of sea-ice      SFMELT5B.111    
!                                 (W/m2).                                  SFMELT5B.112    
     &,SNOMLT_SURF_HTF(P_FIELD)                                            SFMELT5B.113    
!                             OUT Heat flux due to surface melting         SFMELT5B.114    
!                                 of snow (W/m2).                          SFMELT5B.115    
     &,SNOWMELT(P_FIELD,N_TYPES)                                           SFMELT5B.116    
!                            OUT Surface snowmelt (kg/m2/s).               SFMELT5B.117    
                                                                           SFMELT5B.118    
*CALL C_0_DG_C                                                             SFMELT5B.119    
*CALL C_LHEAT                                                              SFMELT5B.120    
*CALL C_R_CP                                                               SFMELT5B.121    
                                                                           SFMELT5B.122    
      REAL                                                                 SFMELT5B.123    
     & DMELT          ! Temporary in calculations of melting heat fluxes   SFMELT5B.124    
     &,DIFF_EI        ! Increment to sublimation.                          SFMELT5B.125    
     &,DTSTAR         ! Increment to surface temperature.                  SFMELT5B.126    
     &,DIFF_SURF_HTF  ! Increment to surface heat flux.                    SFMELT5B.127    
     &,SNOW_MAX       ! Snow available for melting at land points.         SFMELT5B.128    
     &,TSTARMAX       ! Maximum gridbox mean surface temperature at sea    SFMELT5B.129    
!                       points with ice.                                   SFMELT5B.130    
                                                                           SFMELT5B.131    
      INTEGER                                                              SFMELT5B.132    
     & I                    ! Loop counter - full horizontal field.        SFMELT5B.133    
     &,L                    ! Loop counter - land field.                   SFMELT5B.134    
     &,ITILE                ! Loop counter - land tiles.                   SFMELT5B.135    
                                                                           SFMELT5B.136    
                                                                           SFMELT5B.137    
      IF (LTIMER) THEN                                                     SFMELT5B.138    
        CALL TIMER('SFMELT  ',3)                                           SFMELT5B.139    
      ENDIF                                                                SFMELT5B.140    
                                                                           SFMELT5B.141    
      DO I=P1,P1+POINTS-1                                                  SFMELT5B.142    
        IF (SIMLT) SICE_MLT_HTF(I) = 0.0                                   SFMELT5B.143    
        IF (SMLT) SNOMLT_SURF_HTF(I) = 0.0                                 SFMELT5B.144    
      ENDDO                                                                SFMELT5B.145    
                                                                           SFMELT5B.146    
                                                                           SFMELT5B.147    
!-----------------------------------------------------------------------   SFMELT5B.148    
!  Melt land snow if TSTAR_TILE is greater than TM.                        SFMELT5B.149    
!-----------------------------------------------------------------------   SFMELT5B.150    
      DO ITILE=1,N_TYPES                                                   SFMELT5B.151    
                                                                           SFMELT5B.152    
CDIR$ IVDEP                                                                SFMELT5B.158    
! Fujitsu vectorization directive                                          GRB0F405.501    
!OCL NOVREC                                                                GRB0F405.502    
        DO L=LAND1,LAND1+LAND_PTS-1                                        SFMELT5B.159    
        I = LAND_INDEX(L)                                                  SFMELT5B.160    
                                                                           SFMELT5B.162    
                                                                           SFMELT5B.163    
          SNOW_MAX = MAX(0.0, LYING_SNOW(I) - EI(I,ITILE)*TIMESTEP )       SFMELT5B.164    
                                                                           SFMELT5B.165    
          IF ( SNOW_MAX.GT.0.0 .AND. TSTAR_TILE(I,ITILE).GT.TM ) THEN      SFMELT5B.166    
                                                                           SFMELT5B.167    
            DMELT = ( CP + LC * ALPHA1(I,ITILE) )                          SFMELT5B.168    
     &                    * RHOKH1_PRIME(I,ITILE) + ASHTF(I)               SFMELT5B.169    
                                                                           SFMELT5B.170    
            DTSTAR = - MIN ( TSTAR_TILE(I,ITILE) - TM ,                    SFMELT5B.171    
     &                       LF * SNOW_MAX / ( TIMESTEP * DMELT ) )        SFMELT5B.172    
                                                                           SFMELT5B.173    
            DMELT = DMELT + LF * ALPHA1(I,ITILE) * RHOKH1_PRIME(I,ITILE)   SFMELT5B.174    
                                                                           SFMELT5B.175    
            SNOWMELT(I,ITILE) = - DMELT * DTSTAR / LF                      SFMELT5B.176    
                                                                           SFMELT5B.177    
            DIFF_SENS_HTF(I,ITILE) = DIFF_SENS_HTF(I,ITILE) +              SFMELT5B.178    
     &                        CP * RHOKH1_PRIME(I,ITILE) * DTSTAR          SFMELT5B.179    
                                                                           SFMELT5B.180    
            TSTAR_TILE(I,ITILE) = TSTAR_TILE(I,ITILE) + DTSTAR             SFMELT5B.181    
                                                                           SFMELT5B.182    
            DIFF_SURF_HTF = ASHTF(I) * DTSTAR                              SFMELT5B.183    
                                                                           SFMELT5B.184    
            SURF_HT_FLUX(I,ITILE) = SURF_HT_FLUX(I,ITILE) +                SFMELT5B.185    
     &                                 DIFF_SURF_HTF                       SFMELT5B.186    
                                                                           SFMELT5B.187    
            DIFF_EI = ALPHA1(I,ITILE) * RHOKH1_PRIME(I,ITILE) * DTSTAR     SFMELT5B.188    
                                                                           SFMELT5B.189    
            EI(I,ITILE) = EI(I,ITILE) + DIFF_EI                            SFMELT5B.190    
                                                                           SFMELT5B.191    
            DFQW(I,ITILE) = DFQW(I,ITILE) + DIFF_EI                        SFMELT5B.192    
                                                                           SFMELT5B.193    
            IF (SMLT)                                                      SFMELT5B.194    
     &        SNOMLT_SURF_HTF(I) = SNOMLT_SURF_HTF(I) +                    SFMELT5B.195    
     &                        LF*SNOWMELT(I,ITILE) * TILE_FRAC(I,ITILE)    SFMELT5B.196    
                                                                           SFMELT5B.197    
                                                                           SFMELT5B.198    
          ENDIF                                                            SFMELT5B.199    
        ENDDO ! End of loop over land points                               SFMELT5B.204    
      ENDDO ! loop over land tiles                                         SFMELT5B.206    
                                                                           SFMELT5B.207    
                                                                           SFMELT5B.208    
                                                                           SFMELT5B.209    
!-----------------------------------------------------------------------   SFMELT5B.210    
!   Melt sea-ice if TSTAR_TILE > TSTARMAX or TI > TM.                      SFMELT5B.211    
!-----------------------------------------------------------------------   SFMELT5B.212    
      DO I=P1,P1+POINTS-1                                                  SFMELT5B.213    
        IF ( .NOT. LAND_MASK(I) .AND. ICE_FRACT(I) .GT. 0.0 ) THEN         SFMELT5B.214    
                                                                           SFMELT5B.215    
          TSTARMAX = ICE_FRACT(I)*TM + (1.0 - ICE_FRACT(I))*TFS            SFMELT5B.216    
                                                                           SFMELT5B.217    
          IF ( TSTAR_TILE(I,1) .GT. TSTARMAX ) THEN                        SFMELT5B.218    
            DTSTAR = TSTARMAX - TSTAR_TILE(I,1)                            SFMELT5B.219    
            DMELT = (CP + (LC + LF)*ALPHA1(I,1))*RHOKH1_PRIME(I,1)         SFMELT5B.220    
     &                  + ASHTF(I)                                         SFMELT5B.221    
            DIFF_SENS_HTF(I,1) = CP * RHOKH1_PRIME(I,1) * DTSTAR           SFMELT5B.222    
            DIFF_EI = ALPHA1(I,1) * RHOKH1_PRIME(I,1) * DTSTAR             SFMELT5B.223    
            EI(I,1) = EI(I,1) + DIFF_EI                                    SFMELT5B.224    
            DFQW(I,1) = DFQW(I,1) + DIFF_EI                                SFMELT5B.225    
            DIFF_SURF_HTF = ASHTF(I) * DTSTAR                              SFMELT5B.226    
            TI(I) =TI(I) + ASURF(I) * TIMESTEP * DIFF_SURF_HTF             SFMELT5B.227    
            TSTAR_TILE(I,1) = TSTARMAX                                     SFMELT5B.228    
            IF (SIMLT) SICE_MLT_HTF(I) = - DMELT * DTSTAR                  SFMELT5B.229    
                                                                           SFMELT5B.230    
          ENDIF !end of TSTAR_TILE > TSTARMAX block                        SFMELT5B.231    
                                                                           SFMELT5B.232    
          IF ( TI(I) .GT. TM ) THEN                                        SFMELT5B.233    
            IF (SIMLT) SICE_MLT_HTF(I) = SICE_MLT_HTF(I) +                 SFMELT5B.234    
     &                                (TI(I) - TM)/(ASURF(I)*TIMESTEP)     SFMELT5B.235    
            TI(I) = TM                                                     SFMELT5B.236    
          ENDIF ! end of TI > TM block                                     SFMELT5B.237    
                                                                           SFMELT5B.238    
        ENDIF  ! Sea-ice points                                            SFMELT5B.239    
                                                                           SFMELT5B.240    
      ENDDO ! End of loop over p_points                                    SFMELT5B.241    
                                                                           SFMELT5B.242    
                                                                           SFMELT5B.243    
      IF (LTIMER) THEN                                                     SFMELT5B.244    
        CALL TIMER('SFMELT  ',4)                                           SFMELT5B.245    
      ENDIF                                                                SFMELT5B.246    
                                                                           SFMELT5B.247    
      RETURN                                                               SFMELT5B.248    
      END                                                                  SFMELT5B.249    
*ENDIF                                                                     SFMELT5B.250