*IF DEF,A03_5A                                                             SFFLUX5A.2      
C *****************************COPYRIGHT******************************     SFFLUX5A.3      
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved.    SFFLUX5A.4      
C                                                                          SFFLUX5A.5      
C Use, duplication or disclosure of this code is subject to the            SFFLUX5A.6      
C restrictions as set forth in the contract.                               SFFLUX5A.7      
C                                                                          SFFLUX5A.8      
C                Meteorological Office                                     SFFLUX5A.9      
C                London Road                                               SFFLUX5A.10     
C                BRACKNELL                                                 SFFLUX5A.11     
C                Berkshire UK                                              SFFLUX5A.12     
C                RG12 2SZ                                                  SFFLUX5A.13     
C                                                                          SFFLUX5A.14     
C If no contract has been raised with this copy of the code, the use,      SFFLUX5A.15     
C duplication or disclosure of it is strictly prohibited.  Permission      SFFLUX5A.16     
C to do so must first be obtained in writing from the Head of Numerical    SFFLUX5A.17     
C Modelling at the above address.                                          SFFLUX5A.18     
C ******************************COPYRIGHT******************************    SFFLUX5A.19     
C     Vn.                                                                  GSS2F402.301    
CLL   4.2   Oct. 96   T3E migration - *DEF CRAY removed                    GSS2F402.302    
CLL                                     S J Swarbrick                      GSS2F402.303    
C  4.5    Jul. 98  Kill the IBM specific lines (JCThil)                    AJC1F405.73     
C *********************************************************************    GSS2F402.304    

      SUBROUTINE SF_FLUX (                                                  2,4SFFLUX5A.21     
     & P_POINTS,LAND_PTS,LAND_MASK,                                        SFFLUX5A.22     
     & P1,LAND_INDEX,                                                      SFFLUX5A.24     
     & ALPHA1,DQ,DQ_LEAD,DTEMP,DTEMP_LEAD,DZ1,HCONS,ICE_FRACT,             SFFLUX5A.26     
     & LYING_SNOW,QS1,QW_1,RADNET_C,RESFT,RHOKE,RHOKH_1,TI,TL_1,TS1,       APA1F405.397    
     & Z0H,Z0M_EFF,Z1,                                                     SFFLUX5A.28     
     & ASHTF,E_SEA,EPOT,FQW_1,FTL_1,H_SEA,RHOKPM,RHOKPM_POT,               ANG1F405.138    
     & TSTAR,VFRAC,TIMESTEP,CANCAP,                                        APA1F405.398    
     & LTIMER)                                                             SFFLUX5A.30     
                                                                           SFFLUX5A.31     
      IMPLICIT NONE                                                        SFFLUX5A.32     
                                                                           SFFLUX5A.33     
      INTEGER              !    Variables defining grid.                   SFFLUX5A.34     
     & P_POINTS            ! IN Number of P-grid points to be processed.   SFFLUX5A.35     
     &,LAND_PTS            ! IN Number of land points to be processed.     SFFLUX5A.36     
     &,LAND_INDEX(LAND_PTS)! IN Index for compressed land point array;     SFFLUX5A.40     
C                          !    ith element holds position in the FULL     SFFLUX5A.41     
C                          !    field of the ith land pt to be processed   SFFLUX5A.42     
     &,P1                  ! IN First P-point to be processed.             SFFLUX5A.43     
                                                                           SFFLUX5A.45     
      REAL                                                                 SFFLUX5A.46     
     & ALPHA1(P_POINTS) ! IN Gradient of saturated specific humidity       SFFLUX5A.47     
C                       !     with respect to temperature between the      SFFLUX5A.48     
C                       !     bottom model layer and the surface           SFFLUX5A.49     
     &,DQ(P_POINTS)       ! Sp humidity difference between surface         SFFLUX5A.50     
C                         !  and lowest atmospheric level (Q1 - Q*).       SFFLUX5A.51     
C                         !  Holds value over sea-ice where ICE_FRACT      SFFLUX5A.52     
C                         !  >0 i.e. Leads contribution not included.      SFFLUX5A.53     
     &,DQ_LEAD(P_POINTS)  ! DQ for leads fraction of gridsquare.           SFFLUX5A.54     
C                         !  Missing data indicator over non sea-ice.      SFFLUX5A.55     
     &,DTEMP(P_POINTS)    ! Liquid/ice static energy difference            SFFLUX5A.56     
C                         !  between surface and lowest atmospheric        SFFLUX5A.57     
C                         !  level, divided by CP (a modified              SFFLUX5A.58     
C                         !  temperature difference).                      SFFLUX5A.59     
C                         !  Holds value over sea-ice where ICE_FRACT      SFFLUX5A.60     
C                         !  >0 i.e. Leads contribution not included.      SFFLUX5A.61     
     &,DTEMP_LEAD(P_POINTS) ! DTEMP for leads fraction of gridsquare.      SFFLUX5A.62     
C                           !  Missing data indicator over non sea-ice.    SFFLUX5A.63     
     &,DZ1                 ! IN  Thickness of the top soil layer (m).      SFFLUX5A.64     
     &,HCONS(LAND_PTS)     ! IN Soil thermal conductivity including        SFFLUX5A.65     
C                          !    the effects of water and ice (W/m/K).      SFFLUX5A.66     
     &,ICE_FRACT(P_POINTS) ! IN Fraction of gridbox which is sea-ice.      SFFLUX5A.67     
     &,LYING_SNOW(P_POINTS)! IN Lying snow amount (kg per sq metre).       SFFLUX5A.68     
     &,QS1(P_POINTS)        ! Sat. specific humidity qsat(TL_1,PSTAR)      SFFLUX5A.69     
     &,QW_1(P_POINTS)   ! OUT Total water content of lowest                SFFLUX5A.70     
C                       !     atmospheric layer (kg per kg air).           SFFLUX5A.71     
     &,RESFT(P_POINTS)  ! IN Total resistance factor                       SFFLUX5A.74     
C                       !     FRACA+(1-FRACA)*RESFS.                       SFFLUX5A.75     
     &,RHOKE(P_POINTS)     ! IN For FQW, then *GAMMA(1) for implicit cal   SFFLUX5A.76     
     &,RHOKH_1(P_POINTS)   ! IN For FTL,then *GAMMA(1) for implicit calc   SFFLUX5A.77     
     &,TI(P_POINTS)       ! IN Temperature of sea-ice surface layer (K).   SFFLUX5A.78     
     &,TL_1(P_POINTS)    ! IN Liquid/frozen water temperature for          SFFLUX5A.79     
C                        !     lowest atmospheric layer (K).               SFFLUX5A.80     
     &,TS1(LAND_PTS)      ! IN Temperature of top soil layer (K)           SFFLUX5A.81     
     &,Z0H(P_POINTS)     ! IN Roughness length for heat and moisture m     SFFLUX5A.82     
     &,Z0M_EFF(P_POINTS)  ! IN Effective roughness length for momentum     SFFLUX5A.83     
     &,Z1(P_POINTS)       ! IN Height of lowest atmospheric level (m).     SFFLUX5A.84     
                                                                           SFFLUX5A.85     
      LOGICAL                                                              SFFLUX5A.86     
     & LAND_MASK(P_POINTS) ! IN .TRUE. for land; .FALSE. elsewhere. F60.   SFFLUX5A.87     
                                                                           SFFLUX5A.88     
                                                                           SFFLUX5A.89     
! output                                                                   SFFLUX5A.90     
      REAL                                                                 SFFLUX5A.91     
     & ASHTF(P_POINTS)  ! OUT Coefficient to calculate surface             SFFLUX5A.92     
C                       !     heat flux into soil or sea-ice (W/m2/K).     SFFLUX5A.93     
     &,E_SEA(P_POINTS)  ! OUT Evaporation from sea times leads             SFFLUX5A.94     
C                       !     fraction (kg/m2/s). Zero over land.          SFFLUX5A.95     
     &,EPOT(P_POINTS)   ! OUT potential evaporation on P-grid              ANG1F405.139    
C                       !      (kg/m2/s).                                  ANG1F405.140    
     &,FQW_1(P_POINTS)  ! OUT "Explicit" surface flux of QW (i.e.          SFFLUX5A.96     
C                       !      evaporation), on P-grid (kg/m2/s).          SFFLUX5A.97     
     &,FTL_1(P_POINTS)  ! OUT "Explicit" surface flux of TL = H/CP.        SFFLUX5A.98     
C                       !     (sensible heat / CP).                        SFFLUX5A.99     
     &,H_SEA(P_POINTS)  ! OUT Surface sensible heat flux over sea          SFFLUX5A.100    
C                       !     times leads fraction (W/m2).                 SFFLUX5A.101    
C                       !     Zero over land.                              SFFLUX5A.102    
     &,RHOKPM(P_POINTS) ! OUT NB NOT * GAMMA for implicit calcs.           SFFLUX5A.103    
     &,RHOKPM_POT(P_POINTS)                                                ANG1F405.141    
C                       ! OUT Surface exchange coeff. for                  ANG1F405.142    
C                       !     potential evaporation.                       ANG1F405.143    
                                                                           SFFLUX5A.104    
!-----------------------------------------------------------------------   APA1F405.399    
! Extra variables required for the thermal canopy options.                 APA1F405.400    
!-----------------------------------------------------------------------   APA1F405.401    
      REAL                                                                 APA1F405.402    
     & TSTAR(P_POINTS)  ! IN Mean gridsquare surface temperature (K).      APA1F405.403    
     &,VFRAC(LAND_PTS)  ! IN Vegetation fraction.                          APA1F405.404    
     &,TIMESTEP         ! IN Timestep (s).                                 APA1F405.405    
     &,CANCAP(P_POINTS) ! INOUT Volumetric heat capacity of                APA1F405.406    
C                       !       vegetation canopy (J/Kg/m3).               APA1F405.407    
     &,RADNET_C(P_POINTS)! INOUT Adjusted net radiation for vegetation     APA1F405.408    
C                       !       over land (W/m2).                          APA1F405.409    
                                                                           APA1F405.410    
      LOGICAL LTIMER    ! Logical switch for TIMER diags                   SFFLUX5A.105    
                                                                           SFFLUX5A.106    
*CALL C_G                                                                  SFFLUX5A.107    
*CALL C_SOILH                                                              SFFLUX5A.108    
*CALL C_LHEAT                                                              SFFLUX5A.109    
*CALL C_R_CP                                                               SFFLUX5A.110    
*CALL C_KAPPAI                                                             SFFLUX5A.111    
*CALL CSIGMA                                                               APA1F405.411    
*CALL MOSES_OPT                                                            APA1F405.412    
                                                                           SFFLUX5A.112    
                                                                           SFFLUX5A.113    
!   (3) Derived local parameters.                                          SFFLUX5A.114    
      REAL GRCP,LS                                                         SFFLUX5A.115    
      PARAMETER (                                                          SFFLUX5A.116    
     & GRCP=G/CP             ! Used in calc of dT across surface layer.    SFFLUX5A.117    
     &,LS=LF+LC              ! Latent heat of sublimation.                 SFFLUX5A.118    
     & )                                                                   SFFLUX5A.119    
                                                                           SFFLUX5A.120    
!   (b) Scalars.                                                           SFFLUX5A.121    
                                                                           SFFLUX5A.122    
      INTEGER                                                              SFFLUX5A.123    
     & I           ! Loop counter (horizontal field index).                SFFLUX5A.124    
     &,L           ! Loop counter (land point field index).                SFFLUX5A.125    
                                                                           SFFLUX5A.126    
      REAL                                                                 SFFLUX5A.127    
     & DS_RATIO    ! 2 * snowdepth / depth of top soil layer.              SFFLUX5A.128    
     &,FQW_ICE     ! "Explicit" surface flux of QW for sea-ice fraction    SFFLUX5A.129    
!                  ! of gridsquare.                                        SFFLUX5A.130    
     &,FTL_ICE     ! "Explicit" surface flux of TL for sea-ice fraction    SFFLUX5A.131    
!                  ! of gridsquare.                                        SFFLUX5A.132    
     &,LAT_HEAT                                                            SFFLUX5A.133    
     &,RAD_REDUC   ! Radiation term required for surface flux calcs.       SFFLUX5A.134    
                                                                           SFFLUX5A.135    
C*L  Workspace                                                             SFFLUX5A.136    
      REAL                                                                 SFFLUX5A.138    
     & DQ1(P_POINTS)        ! (qsat(TL_1,PSTAR)-QW_1) + g/cp*alpha1*Z1     SFFLUX5A.139    
                                                                           SFFLUX5A.145    
                                                                           SFFLUX5A.146    
!***********************************************************************   SFFLUX5A.147    
!  Calculate sensible and latent heat fluxes for land points.              SFFLUX5A.148    
!***********************************************************************   SFFLUX5A.149    
                                                                           SFFLUX5A.150    
      IF (LTIMER) THEN                                                     SFFLUX5A.151    
        CALL TIMER('SFFLUX  ',3)                                           SFFLUX5A.152    
      ENDIF                                                                SFFLUX5A.153    
CDIR$ IVDEP                                                                SFFLUX5A.159    
! Fujitsu vectorization directive                                          GRB0F405.495    
!OCL NOVREC                                                                GRB0F405.496    
      DO L = 1,LAND_PTS                                                    SFFLUX5A.160    
        I = LAND_INDEX(L) - (P1-1)                                         SFFLUX5A.161    
        ASHTF(I) = 2.0 * HCONS(L) / DZ1                                    SFFLUX5A.163    
        IF (LYING_SNOW(I) .GT. 0.0) THEN                                   SFFLUX5A.164    
          LAT_HEAT = LS                                                    SFFLUX5A.165    
          DS_RATIO = 2.0 * LYING_SNOW(I) / (RHO_SNOW * DZ1)                SFFLUX5A.166    
          IF (DS_RATIO.LE.1.0) THEN                                        SFFLUX5A.167    
            ASHTF(I) =  ASHTF(I) /                                         SFFLUX5A.168    
     &                  (1. + DS_RATIO*(HCONS(L)/SNOW_HCON - 1.))          SFFLUX5A.169    
          ELSE IF (LYING_SNOW(I) .LT. 5.0E3) THEN                          SFFLUX5A.170    
            ASHTF(I) =  ASHTF(I)*SNOW_HCON / HCONS(L)                      SFFLUX5A.171    
          ENDIF                                                            SFFLUX5A.172    
        ELSE                                                               SFFLUX5A.173    
          LAT_HEAT = LC                                                    SFFLUX5A.174    
        ENDIF                                                              SFFLUX5A.175    
        E_SEA(I) = 0.0                                                     SFFLUX5A.176    
        H_SEA(I) = 0.0                                                     SFFLUX5A.177    
                                                                           APA1F405.413    
                                                                           APA1F405.414    
!-----------------------------------------------------------------------   APA1F405.415    
! Options for treatment of vegetation thermal canopy                       APA1F405.416    
!-----------------------------------------------------------------------   APA1F405.417    
        IF (CAN_MODEL .EQ. 1) THEN                                         APA1F405.418    
          ASHTF(I) = ASHTF(I)                                              APA1F405.419    
          CANCAP(I) = 0.0                                                  APA1F405.420    
                                                                           APA1F405.421    
        ELSEIF (CAN_MODEL .EQ. 2) THEN                                     APA1F405.422    
          ASHTF(I) = (1.0-VFRAC(L))*ASHTF(I) +                             APA1F405.423    
     &                VFRAC(L)*4.0*SBCON*(TS1(L)**3)                       APA1F405.424    
          CANCAP(I) = 0.0                                                  APA1F405.425    
                                                                           APA1F405.426    
        ELSEIF (CAN_MODEL .EQ. 3) THEN                                     APA1F405.427    
          ASHTF(I) = (1.0-VFRAC(L))*ASHTF(I) +                             APA1F405.428    
     &                VFRAC(L)*4.0*SBCON*(TS1(L)**3)                       APA1F405.429    
          CANCAP(I) = (1.0-VFRAC(L))*0.0 + VFRAC(L)*10.0*1.0E4             APA1F405.430    
                                                                           APA1F405.431    
        ENDIF                                                              APA1F405.432    
        ASHTF(I) = ASHTF(I) + CANCAP(I)/TIMESTEP                           APA1F405.433    
                                                                           APA1F405.434    
        RHOKPM(I) = RHOKH_1(I) / ( RHOKH_1(I) *                            SFFLUX5A.178    
     &              (LAT_HEAT*ALPHA1(I)*RESFT(I) + CP) + ASHTF(I) )        SFFLUX5A.179    
        RADNET_C(I)=RADNET_C(I) + CANCAP(I)*(TSTAR(I)-TS1(L))/TIMESTEP     APA1F405.435    
        RAD_REDUC = RADNET_C(I) - ASHTF(I) *                               APA1F405.436    
     &        ( TL_1(I) - TS1(L) + GRCP * (Z1(I)                           SFFLUX5A.181    
     &                                   + Z0M_EFF(I) - Z0H(I)) )          SFFLUX5A.182    
        DQ1(I) = (QS1(I)-QW_1(I)) +                                        SFFLUX5A.183    
     &            GRCP * ALPHA1(I) * (Z1(I) + Z0M_EFF(I) - Z0H(I))         SFFLUX5A.184    
        FQW_1(I) = RESFT(I)*RHOKPM(I)*( ALPHA1(I) *                        SFFLUX5A.185    
     &             RAD_REDUC + (CP*RHOKH_1(I) + ASHTF(I))* DQ1(I) )        SFFLUX5A.186    
        FTL_1(I) = RHOKPM(I) *                                             SFFLUX5A.187    
     &          ( RAD_REDUC - LAT_HEAT*RESFT(I)*RHOKH_1(I)*DQ1(I) )        SFFLUX5A.188    
        RHOKPM_POT(I)=RHOKH_1(I) / ( RHOKH_1(I) *                          ANG1F405.144    
     &              (LAT_HEAT*ALPHA1(I) + CP) + ASHTF(I) )                 ANG1F405.145    
        EPOT(I) = RHOKPM_POT(I)*( ALPHA1(I) *                              ANG1F405.146    
     &             RAD_REDUC + (CP*RHOKH_1(I) + ASHTF(I))* DQ1(I) )        ANG1F405.147    
!                                                                          SFFLUX5A.189    
!***********************************************************************   SFFLUX5A.190    
!  Calculate sensible and latent heat fluxes for sea and sea-ice points    SFFLUX5A.191    
!***********************************************************************   SFFLUX5A.192    
!                                                                          SFFLUX5A.193    
      ENDDO                                                                SFFLUX5A.198    
      DO I=1,P_POINTS                                                      SFFLUX5A.199    
        IF ( .NOT. LAND_MASK(I).AND.ICE_FRACT(I).GT.0.0) THEN !sea-ice     SFFLUX5A.200    
            ASHTF(I) = 2 * KAPPAI / DE                                     SFFLUX5A.202    
            E_SEA(I) = - (1. - ICE_FRACT(I))*RHOKH_1(I)*DQ_LEAD(I)         SFFLUX5A.203    
                                                                           SFFLUX5A.204    
            H_SEA(I) = - (1. - ICE_FRACT(I))*RHOKH_1(I)*CP*DTEMP_LEAD(I)   SFFLUX5A.205    
                                                                           SFFLUX5A.206    
!***********************************************************************   SFFLUX5A.207    
! Calculate the sensible and latent heat fluxes from sea-ice portion       SFFLUX5A.208    
! of gridbox. Weight RHOKPM by ICE_FRACT for use in IMPL_CAL.              SFFLUX5A.209    
!***********************************************************************   SFFLUX5A.210    
                                                                           SFFLUX5A.211    
            RHOKPM(I) = RHOKH_1(I) / ( RHOKH_1(I) *                        SFFLUX5A.212    
     &                               (LS * ALPHA1(I) + CP) + ASHTF(I) )    SFFLUX5A.213    
            RAD_REDUC = RADNET_C(I) - ICE_FRACT(I) * ASHTF(I) *            APA1F405.437    
     &          ( TL_1(I) - TI(I) + GRCP * (Z1(I)                          SFFLUX5A.215    
     &                                     + Z0M_EFF(I) - Z0H(I)) )        SFFLUX5A.216    
            DQ1(I) = (QS1(I)-QW_1(I)) +                                    SFFLUX5A.217    
     &              GRCP * ALPHA1(I) * (Z1(I) + Z0M_EFF(I) - Z0H(I))       SFFLUX5A.218    
            FQW_ICE = RHOKPM(I) * ( ALPHA1(I) * RAD_REDUC +                SFFLUX5A.219    
     &           (CP * RHOKH_1(I) + ASHTF(I)) * DQ1(I) * ICE_FRACT(I) )    SFFLUX5A.220    
            FTL_ICE = RHOKPM(I) * ( RAD_REDUC -                            SFFLUX5A.221    
     &                     ICE_FRACT(I) * LS * RHOKH_1(I) * DQ1(I) )       SFFLUX5A.222    
            RHOKPM(I) = ICE_FRACT(I) * RHOKPM(I)                           SFFLUX5A.223    
            RHOKPM_POT(I)=RHOKPM(I)                                        ANG1F405.148    
                                                                           SFFLUX5A.224    
!***********************************************************************   SFFLUX5A.225    
! Calculate the total flux over the gridbox                                SFFLUX5A.226    
!***********************************************************************   SFFLUX5A.227    
!                                                                          SFFLUX5A.228    
            FTL_1(I) = H_SEA(I)/CP + FTL_ICE                               SFFLUX5A.229    
            FQW_1(I) = E_SEA(I) + FQW_ICE                                  SFFLUX5A.230    
            EPOT(I) = E_SEA(I) + FQW_ICE                                   ANG1F405.149    
!       Sea points                                                         SFFLUX5A.235    
        ELSE IF( .NOT.LAND_MASK(I) .AND. .NOT.ICE_FRACT(I).GT.0.0 )        SFFLUX5A.236    
     &  THEN                                                               SFFLUX5A.237    
            E_SEA(I) = - RHOKH_1(I) * DQ(I)                                SFFLUX5A.239    
            H_SEA(I) = - RHOKH_1(I) * CP * DTEMP(I)                        SFFLUX5A.240    
            FQW_1(I) = E_SEA(I)                                            SFFLUX5A.241    
            EPOT(I) = E_SEA(I)                                             ANG1F405.150    
            FTL_1(I) =  H_SEA(I) / CP                                      SFFLUX5A.242    
            RHOKPM(I) = 0.0                                                SFFLUX5A.243    
            RHOKPM_POT(I)=RHOKPM(I)                                        ANG1F405.151    
            ASHTF(I) = 1.0                                                 SFFLUX5A.244    
!                                                                          SFFLUX5A.245    
        ENDIF        ! sea/sea-ice block                                   SFFLUX5A.249    
      ENDDO                                                                SFFLUX5A.251    
                                                                           SFFLUX5A.252    
      IF (LTIMER) THEN                                                     SFFLUX5A.253    
        CALL TIMER('SFFLUX  ',4)                                           SFFLUX5A.254    
      ENDIF                                                                SFFLUX5A.255    
      RETURN                                                               SFFLUX5A.256    
      END                                                                  SFFLUX5A.257    
*ENDIF                                                                     SFFLUX5A.258