*IF DEF,A03_6A                                                             ACB1F405.9      
C *****************************COPYRIGHT******************************     SFFLUX5B.3      
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved.    SFFLUX5B.4      
C                                                                          SFFLUX5B.5      
C Use, duplication or disclosure of this code is subject to the            SFFLUX5B.6      
C restrictions as set forth in the contract.                               SFFLUX5B.7      
C                                                                          SFFLUX5B.8      
C                Meteorological Office                                     SFFLUX5B.9      
C                London Road                                               SFFLUX5B.10     
C                BRACKNELL                                                 SFFLUX5B.11     
C                Berkshire UK                                              SFFLUX5B.12     
C                RG12 2SZ                                                  SFFLUX5B.13     
C                                                                          SFFLUX5B.14     
C If no contract has been raised with this copy of the code, the use,      SFFLUX5B.15     
C duplication or disclosure of it is strictly prohibited.  Permission      SFFLUX5B.16     
C to do so must first be obtained in writing from the Head of Numerical    SFFLUX5B.17     
C Modelling at the above address.                                          SFFLUX5B.18     
C ******************************COPYRIGHT******************************    SFFLUX5B.19     
C Modification History:                                                    AJC1F405.70     
C Version Date     Change                                                  AJC1F405.71     
C  4.5    Jul. 98  Kill the IBM specific lines (JCThil)                    AJC1F405.72     
                                                                           SFFLUX5B.20     

      SUBROUTINE SF_FLUX (                                                  2,4SFFLUX5B.21     
     & P_POINTS,P_FIELD,LAND_PTS,LAND_FIELD,LAND_MASK,L_LAND,P1,LAND1,     SFFLUX5B.22     
     & LAND_INDEX,                                                         SFFLUX5B.24     
     & ALPHA1,DQ,DQ_LEAD,DTEMP,DTEMP_LEAD,DZ1,HCONS,ICE_FRACT,             SFFLUX5B.26     
     & LYING_SNOW,QS1,QW_1,RADNET_C,RESFT,RHOKE,RHOKH_1,TI,TL_1,TS1,       APA1F405.447    
     & Z0H,Z0M_EFF,Z1_TQ,Z1_UV,                                            SFFLUX5B.28     
     & ASHTF,E_SEA,EPOT,FQW_1,FTL_1,H_SEA,RHOKPM,RHOKPM_POT,LTIMER         ANG1F405.152    
     &,TSTAR,VFRAC,TIMESTEP,CANCAP                                         APA1F405.448    
     & )                                                                   SFFLUX5B.30     
                                                                           SFFLUX5B.31     
      IMPLICIT NONE                                                        SFFLUX5B.32     
                                                                           SFFLUX5B.33     
      INTEGER              !    Variables defining grid.                   SFFLUX5B.34     
     & P_POINTS            ! IN Number of P-grid points to be processed.   SFFLUX5B.35     
     &,P_FIELD             ! IN Total number of P-grid points.             SFFLUX5B.36     
     &,P1                  ! IN First P-point to be processed.             SFFLUX5B.37     
     &,LAND1               ! IN First land point to be processed.          SFFLUX5B.38     
     &,LAND_PTS            ! IN Number of land points to be processed.     SFFLUX5B.39     
     &,LAND_FIELD          ! IN Total number of land points.               SFFLUX5B.40     
     &,LAND_INDEX(LAND_FIELD) ! IN Index for compressed land point array   SFFLUX5B.44     
!                               ith element holds position in the FULL     SFFLUX5B.45     
!                               field of the ith land pt to be processed   SFFLUX5B.46     
                                                                           SFFLUX5B.48     
      LOGICAL                                                              SFFLUX5B.49     
     & L_LAND              ! IN switch to only calculate for land points   SFFLUX5B.50     
     &,LTIMER                                                              SFFLUX5B.51     
      REAL                                                                 SFFLUX5B.52     
     & ALPHA1(P_FIELD)     ! IN Gradient of saturated specific humidity    SFFLUX5B.53     
!                                with respect to temperature between the   SFFLUX5B.54     
!                                bottom model layer and the surface        SFFLUX5B.55     
     &,DQ(P_FIELD)         ! IN Sp humidity difference between surface     SFFLUX5B.56     
!                               and lowest atmospheric level (Q1 - Q*).    SFFLUX5B.57     
!                               Holds value over sea-ice where ICE_FRACT   SFFLUX5B.58     
!                               >0 i.e. Leads contribution not included.   SFFLUX5B.59     
     &,DQ_LEAD(P_FIELD)    ! IN DQ for leads fraction of gridsquare.       SFFLUX5B.60     
!                               Missing data indicator over non sea-ice.   SFFLUX5B.61     
     &,DTEMP(P_FIELD)      ! IN Liquid/ice static energy difference        SFFLUX5B.62     
!                               between surface and lowest atmospheric     SFFLUX5B.63     
!                               level, divided by CP (a modified           SFFLUX5B.64     
!                               temperature difference).                   SFFLUX5B.65     
!                               Holds value over sea-ice where ICE_FRACT   SFFLUX5B.66     
!                               >0 i.e. Leads contribution not included.   SFFLUX5B.67     
     &,DTEMP_LEAD(P_FIELD) ! IN DTEMP for leads fraction of gridsquare.    SFFLUX5B.68     
!                               Missing data indicator over non sea-ice.   SFFLUX5B.69     
     &,DZ1                 ! IN  Thickness of the top soil layer (m).      SFFLUX5B.70     
     &,HCONS(LAND_FIELD)   ! IN Soil thermal conductivity including        SFFLUX5B.71     
!                               the effects of water and ice(W/m/K).       SFFLUX5B.72     
     &,ICE_FRACT(P_FIELD)  ! IN Fraction of gridbox which is sea-ice.      SFFLUX5B.73     
     &,LYING_SNOW(P_FIELD) ! IN Lying snow amount (kg per sq metre).       SFFLUX5B.74     
     &,QS1(P_FIELD)        ! IN Sat. specific humidity qsat(TL_1,PSTAR)    SFFLUX5B.75     
     &,QW_1(P_FIELD)       ! IN Total water content of lowest              SFFLUX5B.76     
!                               atmospheric layer (kg per kg air).         SFFLUX5B.77     
     &,RESFT(P_FIELD)      ! IN Total resistance factor                    SFFLUX5B.80     
!                                FRACA+(1-FRACA)*RESFS.                    SFFLUX5B.81     
     &,RHOKE(P_FIELD)      ! IN For FQW, then *GAMMA(1) for implicit       SFFLUX5B.82     
!                               calcs                                      SFFLUX5B.83     
     &,RHOKH_1(P_FIELD)    ! IN For FTL, then *GAMMA(1) for implicit       SFFLUX5B.84     
!                          !    calcs                                      SFFLUX5B.85     
     &,TI(P_FIELD)         ! IN Temperature of sea-ice surface layer (K)   SFFLUX5B.86     
     &,TL_1(P_FIELD)       ! IN Liquid/frozen water temperature for        SFFLUX5B.87     
!                               lowest atmospheric layer (K).              SFFLUX5B.88     
     &,TS1(LAND_FIELD)     ! IN Temperature of top soil layer (K)          SFFLUX5B.89     
     &,Z0H(P_FIELD)        ! IN Roughness length for heat and moisture m   SFFLUX5B.90     
     &,Z0M_EFF(P_FIELD)    ! IN Effective roughness length for momentum    SFFLUX5B.91     
     &,Z1_TQ(P_FIELD)      ! IN Height of lowest atmospheric level (m).    SFFLUX5B.92     
     &,Z1_UV(P_FIELD)      ! IN Height of lowest atmospheric level (m).    SFFLUX5B.93     
                                                                           SFFLUX5B.94     
      LOGICAL                                                              SFFLUX5B.95     
     & LAND_MASK(P_FIELD)  ! IN .TRUE. for land; .FALSE. elsewhere. F60.   SFFLUX5B.96     
                                                                           SFFLUX5B.97     
                                                                           SFFLUX5B.98     
! output                                                                   SFFLUX5B.99     
      REAL                                                                 SFFLUX5B.100    
     & ASHTF(P_FIELD)      ! OUT Coefficient to calculate surface          SFFLUX5B.101    
!                             heat flux into soil or sea-ice (W/m2/K).     SFFLUX5B.102    
     &,E_SEA(P_FIELD)      ! OUT Evaporation from sea times leads          SFFLUX5B.103    
!                             fraction (kg/m2/s). Zero over land.          SFFLUX5B.104    
     &,EPOT(P_FIELD)       ! OUT potential evaporation on P-grid           ANG1F405.153    
!                             (kg/m2/s).                                   ANG1F405.154    
     &,FQW_1(P_FIELD)      ! OUT "Explicit" surface flux of QW (i.e.       SFFLUX5B.105    
!                             evaporation), on P-grid (kg/m2/s).           SFFLUX5B.106    
     &,FTL_1(P_FIELD)      ! OUT "Explicit" surface flux of TL = H/CP.     SFFLUX5B.107    
!                            (sensible heat / CP).                         SFFLUX5B.108    
     &,H_SEA(P_FIELD)      ! OUT Surface sensible heat flux over sea       SFFLUX5B.109    
!                            times leads fraction (W/m2).                  SFFLUX5B.110    
!                            Zero over land.                               SFFLUX5B.111    
     &,RHOKPM(P_FIELD)     ! OUT NB NOT * GAMMA for implicit calcs.        SFFLUX5B.112    
     &,RHOKPM_POT(P_FIELD) ! OUT Surface exchange coeff. for               ANG1F405.155    
!                            potential evaporation.                        ANG1F405.156    
                                                                           SFFLUX5B.113    
!-----------------------------------------------------------------------   APA1F405.449    
! Extra variables required for the thermal canopy options.                 APA1F405.450    
!-----------------------------------------------------------------------   APA1F405.451    
      REAL                                                                 APA1F405.452    
     & TSTAR(P_FIELD)   ! IN Mean gridsquare surface temperature (K).      APA1F405.453    
     &,VFRAC(LAND_FIELD)! IN Vegetation fraction.                          APA1F405.454    
     &,TIMESTEP         ! IN Timestep (s).                                 APA1F405.455    
     &,CANCAP(P_FIELD)  ! INOUT Volumetric heat capacity of                APA1F405.456    
C                       !       vegetation canopy (J/Kg/m3).               APA1F405.457    
     &,RADNET_C(P_FIELD)! INOUT Adjusted net radiation for vegetation      APA1F405.458    
C                       !       over land (W/m2).                          APA1F405.459    
                                                                           SFFLUX5B.114    
*CALL C_G                                                                  SFFLUX5B.115    
*CALL C_SOILH                                                              SFFLUX5B.116    
*CALL C_LHEAT                                                              SFFLUX5B.117    
*CALL C_R_CP                                                               SFFLUX5B.118    
*CALL C_KAPPAI                                                             SFFLUX5B.119    
*CALL CSIGMA                                                               APA1F405.460    
*CALL MOSES_OPT                                                            APA1F405.461    
                                                                           SFFLUX5B.120    
                                                                           SFFLUX5B.121    
!   (3) Derived local parameters.                                          SFFLUX5B.122    
      REAL GRCP,LS                                                         SFFLUX5B.123    
      PARAMETER (                                                          SFFLUX5B.124    
     & GRCP=G/CP           ! Used in calc of dT across surface layer.      SFFLUX5B.125    
     &,LS=LF+LC            ! Latent heat of sublimation.                   SFFLUX5B.126    
     & )                                                                   SFFLUX5B.127    
                                                                           SFFLUX5B.128    
!   (b) Scalars.                                                           SFFLUX5B.129    
                                                                           SFFLUX5B.130    
      INTEGER                                                              SFFLUX5B.131    
     & I                   ! Loop counter (horizontal field index).        SFFLUX5B.132    
     &,L                   ! Loop counter (land point field index).        SFFLUX5B.133    
                                                                           SFFLUX5B.134    
      REAL                                                                 SFFLUX5B.135    
     & DS_RATIO            ! 2 * snowdepth / depth of top soil layer.      SFFLUX5B.136    
     &,FQW_ICE             ! "Explicit" surface flux of QW for sea-ice     SFFLUX5B.137    
!                            fraction of gridsquare.                       SFFLUX5B.138    
     &,FTL_ICE             ! "Explicit" surface flux of TL for sea-ice     SFFLUX5B.139    
!                            fraction of gridsquare.                       SFFLUX5B.140    
     &,LAT_HEAT                                                            SFFLUX5B.141    
     &,RAD_REDUC           ! Radiation term required for surface flux      SFFLUX5B.142    
!                            calcs.                                        SFFLUX5B.143    
                                                                           SFFLUX5B.144    
!! Workspace                                                               SFFLUX5B.145    
      REAL                                                                 SFFLUX5B.146    
     & DQ1(P_FIELD)        ! (qsat(TL_1,PSTAR)-QW_1) + g/cp*alpha1*Z1      SFFLUX5B.147    
                                                                           SFFLUX5B.148    
                                                                           SFFLUX5B.149    
      EXTERNAL TIMER                                                       SFFLUX5B.150    
                                                                           SFFLUX5B.151    
!***********************************************************************   SFFLUX5B.152    
!  Calculate sensible and latent heat fluxes for land points.              SFFLUX5B.153    
!***********************************************************************   SFFLUX5B.154    
      IF (LTIMER) THEN                                                     SFFLUX5B.155    
        CALL TIMER('SF_FLUX ',3)                                           SFFLUX5B.156    
      ENDIF                                                                SFFLUX5B.157    
                                                                           SFFLUX5B.158    
CDIR$ IVDEP                                                                SFFLUX5B.164    
! Fujitsu vectorization directive                                          GRB0F405.497    
!OCL NOVREC                                                                GRB0F405.498    
      DO L = LAND1,LAND1+LAND_PTS-1                                        SFFLUX5B.165    
        I = LAND_INDEX(L)                                                  SFFLUX5B.166    
                                                                           SFFLUX5B.168    
        ASHTF(I) = 2.0 * HCONS(L) / DZ1                                    SFFLUX5B.169    
        IF (LYING_SNOW(I) .GT. 0.0) THEN                                   SFFLUX5B.170    
          LAT_HEAT = LS                                                    SFFLUX5B.171    
          DS_RATIO = 2.0 * LYING_SNOW(I) / (RHO_SNOW * DZ1)                SFFLUX5B.172    
          IF (DS_RATIO.LE.1.0) THEN                                        SFFLUX5B.173    
            ASHTF(I) =  ASHTF(I) /                                         SFFLUX5B.174    
     &                  (1. + DS_RATIO*(HCONS(L)/SNOW_HCON - 1.))          SFFLUX5B.175    
          ELSE IF (LYING_SNOW(I) .LT. 5.0E3) THEN                          SFFLUX5B.176    
            ASHTF(I) =  ASHTF(I)*SNOW_HCON / HCONS(L)                      SFFLUX5B.177    
          ENDIF                                                            SFFLUX5B.178    
        ELSE                                                               SFFLUX5B.179    
          LAT_HEAT = LC                                                    SFFLUX5B.180    
        ENDIF                                                              SFFLUX5B.181    
        E_SEA(I) = 0.0                                                     SFFLUX5B.182    
        H_SEA(I) = 0.0                                                     SFFLUX5B.183    
                                                                           SFFLUX5B.184    
!-----------------------------------------------------------------------   APA1F405.462    
! Options for treatment of vegetation thermal canopy                       APA1F405.463    
!-----------------------------------------------------------------------   APA1F405.464    
        IF (CAN_MODEL .EQ. 1) THEN                                         APA1F405.465    
          ASHTF(I) = ASHTF(I)                                              APA1F405.466    
          CANCAP(I) = 0.0                                                  APA1F405.467    
                                                                           APA1F405.468    
        ELSEIF (CAN_MODEL .EQ. 2) THEN                                     APA1F405.469    
          ASHTF(I) = (1.0-VFRAC(L))*ASHTF(I) +                             APA1F405.470    
     &                VFRAC(L)*4.0*SBCON*(TS1(L)**3)                       APA1F405.471    
          CANCAP(I) = 0.0                                                  APA1F405.472    
                                                                           APA1F405.473    
        ELSEIF (CAN_MODEL .EQ. 3) THEN                                     APA1F405.474    
          ASHTF(I) = (1.0-VFRAC(L))*ASHTF(I) +                             APA1F405.475    
     &                VFRAC(L)*4.0*SBCON*(TS1(L)**3)                       APA1F405.476    
          CANCAP(I) = (1.0-VFRAC(L))*0.0 + VFRAC(L)*10.0*1.0E4             APA1F405.477    
                                                                           APA1F405.478    
        ENDIF                                                              APA1F405.479    
        ASHTF(I) = ASHTF(I) + CANCAP(I)/TIMESTEP                           APA1F405.480    
                                                                           APA1F405.481    
        RHOKPM(I) = RHOKH_1(I) / ( RHOKH_1(I) *                            SFFLUX5B.185    
     &              (LAT_HEAT*ALPHA1(I)*RESFT(I) + CP) + ASHTF(I) )        SFFLUX5B.186    
        RADNET_C(I)=RADNET_C(I) + CANCAP(I)*(TSTAR(I)-TS1(L))/TIMESTEP     APA1F405.482    
        RAD_REDUC = RADNET_C(I) - ASHTF(I) *                               APA1F405.483    
     &        ( TL_1(I) - TS1(L) + GRCP * (Z1_TQ(I)                        SFFLUX5B.188    
     &                                   + Z0M_EFF(I) - Z0H(I)) )          SFFLUX5B.189    
        DQ1(I) = (QS1(I)-QW_1(I)) +                                        SFFLUX5B.190    
     &            GRCP * ALPHA1(I) * (Z1_TQ(I) + Z0M_EFF(I) - Z0H(I))      SFFLUX5B.191    
        FQW_1(I) = RESFT(I)*RHOKPM(I)*( ALPHA1(I) *                        SFFLUX5B.192    
     &             RAD_REDUC + (CP*RHOKH_1(I) + ASHTF(I))* DQ1(I) )        SFFLUX5B.193    
        RHOKPM_POT(I)=RHOKH_1(I) / ( RHOKH_1(I) *                          ANG1F405.157    
     &              (LAT_HEAT*ALPHA1(I) + CP) + ASHTF(I) )                 ANG1F405.158    
        EPOT(I) = RHOKPM_POT(I)*( ALPHA1(I) *                              ANG1F405.159    
     &             RAD_REDUC + (CP*RHOKH_1(I) + ASHTF(I))* DQ1(I) )        ANG1F405.160    
        FTL_1(I) = RHOKPM(I) *                                             SFFLUX5B.194    
     &          ( RAD_REDUC - LAT_HEAT*RESFT(I)*RHOKH_1(I)*DQ1(I) )        SFFLUX5B.195    
                                                                           SFFLUX5B.196    
!***********************************************************************   SFFLUX5B.197    
!  Calculate sensible and latent heat fluxes for sea and sea-ice points    SFFLUX5B.198    
!***********************************************************************   SFFLUX5B.199    
                                                                           SFFLUX5B.200    
      ENDDO ! loop over land points                                        SFFLUX5B.205    
                                                                           SFFLUX5B.206    
      IF (.NOT.L_LAND) THEN                                                SFFLUX5B.207    
        DO I=P1,P1+P_POINTS-1                                              SFFLUX5B.208    
          IF ( .NOT. LAND_MASK(I).AND.ICE_FRACT(I).GT.0.0) THEN !sea-ice   SFFLUX5B.209    
            ASHTF(I) = 2 * KAPPAI / DE                                     SFFLUX5B.211    
            E_SEA(I) = - (1. - ICE_FRACT(I))*RHOKH_1(I)*DQ_LEAD(I)         SFFLUX5B.212    
                                                                           SFFLUX5B.213    
            H_SEA(I) = - (1. - ICE_FRACT(I))*RHOKH_1(I)*CP*DTEMP_LEAD(I)   SFFLUX5B.214    
                                                                           SFFLUX5B.215    
!***********************************************************************   SFFLUX5B.216    
! Calculate the sensible and latent heat fluxes from sea-ice portion       SFFLUX5B.217    
! of gridbox. Weight RHOKPM by ICE_FRACT for use in IMPL_CAL.              SFFLUX5B.218    
!***********************************************************************   SFFLUX5B.219    
                                                                           SFFLUX5B.220    
            RHOKPM(I) = RHOKH_1(I) / ( RHOKH_1(I) *                        SFFLUX5B.221    
     &                               (LS * ALPHA1(I) + CP) + ASHTF(I) )    SFFLUX5B.222    
            RAD_REDUC = RADNET_C(I) - ICE_FRACT(I) * ASHTF(I) *            APA1F405.484    
     &          ( TL_1(I) - TI(I) + GRCP * (Z1_TQ(I)                       SFFLUX5B.224    
     &                                     + Z0M_EFF(I) - Z0H(I)) )        SFFLUX5B.225    
            DQ1(I) = (QS1(I)-QW_1(I)) +                                    SFFLUX5B.226    
     &              GRCP * ALPHA1(I) * (Z1_TQ(I) + Z0M_EFF(I) - Z0H(I))    SFFLUX5B.227    
            FQW_ICE = RHOKPM(I) * ( ALPHA1(I) * RAD_REDUC +                SFFLUX5B.228    
     &           (CP * RHOKH_1(I) + ASHTF(I)) * DQ1(I) * ICE_FRACT(I) )    SFFLUX5B.229    
            FTL_ICE = RHOKPM(I) * ( RAD_REDUC -                            SFFLUX5B.230    
     &                     ICE_FRACT(I) * LS * RHOKH_1(I) * DQ1(I) )       SFFLUX5B.231    
            RHOKPM(I) = ICE_FRACT(I) * RHOKPM(I)                           SFFLUX5B.232    
            RHOKPM_POT(I)=RHOKPM(I)                                        ANG1F405.161    
                                                                           SFFLUX5B.233    
!***********************************************************************   SFFLUX5B.234    
! Calculate the total flux over the gridbox                                SFFLUX5B.235    
!***********************************************************************   SFFLUX5B.236    
                                                                           SFFLUX5B.237    
            FTL_1(I) = H_SEA(I)/CP + FTL_ICE                               SFFLUX5B.238    
            FQW_1(I) = E_SEA(I) + FQW_ICE                                  SFFLUX5B.239    
            EPOT(I) = E_SEA(I) + FQW_ICE                                   ANG1F405.162    
!       Sea points                                                         SFFLUX5B.244    
          ELSE IF( .NOT.LAND_MASK(I) .AND. .NOT.ICE_FRACT(I).GT.0.0 )      SFFLUX5B.245    
     &    THEN                                                             SFFLUX5B.246    
            E_SEA(I) = - RHOKH_1(I) * DQ(I)                                SFFLUX5B.248    
            H_SEA(I) = - RHOKH_1(I) * CP * DTEMP(I)                        SFFLUX5B.249    
            FQW_1(I) = E_SEA(I)                                            SFFLUX5B.250    
            EPOT(I) = E_SEA(I)                                             ANG1F405.163    
            FTL_1(I) =  H_SEA(I) / CP                                      SFFLUX5B.251    
            RHOKPM(I) = 0.0                                                SFFLUX5B.252    
            RHOKPM_POT(I)=RHOKPM(I)                                        ANG1F405.164    
            ASHTF(I) = 1.0                                                 SFFLUX5B.253    
                                                                           SFFLUX5B.254    
        ENDIF        ! sea/sea-ice block                                   SFFLUX5B.258    
        ENDDO                                                              SFFLUX5B.260    
                                                                           SFFLUX5B.261    
      ENDIF ! L_LAND                                                       SFFLUX5B.263    
      IF (LTIMER) THEN                                                     SFFLUX5B.265    
        CALL TIMER('SF_FLUX ',4)                                           SFFLUX5B.266    
      ENDIF                                                                SFFLUX5B.267    
                                                                           SFFLUX5B.268    
      RETURN                                                               SFFLUX5B.269    
      END                                                                  SFFLUX5B.270    
*ENDIF                                                                     SFFLUX5B.271