*IF DEF,A08_5A                                                             HEATCP5A.2      
C *****************************COPYRIGHT******************************     HEATCP5A.3      
C (c) CROWN COPYRIGHT 1996, METEOROLOGICAL OFFICE, All Rights Reserved.    HEATCP5A.4      
C                                                                          HEATCP5A.5      
C Use, duplication or disclosure of this code is subject to the            HEATCP5A.6      
C restrictions as set forth in the contract.                               HEATCP5A.7      
C                                                                          HEATCP5A.8      
C                Meteorological Office                                     HEATCP5A.9      
C                London Road                                               HEATCP5A.10     
C                BRACKNELL                                                 HEATCP5A.11     
C                Berkshire UK                                              HEATCP5A.12     
C                RG12 2SZ                                                  HEATCP5A.13     
C                                                                          HEATCP5A.14     
C If no contract has been raised with this copy of the code, the use,      HEATCP5A.15     
C duplication or disclosure of it is strictly prohibited.  Permission      HEATCP5A.16     
C to do so must first be obtained in writing from the Head of Numerical    HEATCP5A.17     
C Modelling at the above address.                                          HEATCP5A.18     
C ******************************COPYRIGHT******************************    HEATCP5A.19     
!    SUBROUTINE HEAT_CAP------------------------------------------------   HEATCP5A.20     
!                                                                          HEATCP5A.21     
! Subroutine Interface:                                                    HEATCP5A.22     

      SUBROUTINE HEAT_CAP (NPNTS,SOIL_PTS,SOIL_INDEX,B,DZ,HCAP,             2,2HEATCP5A.23     
     &                     SATHH,SMCL,STHF,TSOIL,V_SAT,HCAPS               HEATCP5A.24     
! LOGICAL LTIMER                                                           HEATCP5A.25     
     +,LTIMER                                                              HEATCP5A.26     
     +)                                                                    HEATCP5A.27     
                                                                           HEATCP5A.28     
      IMPLICIT NONE                                                        HEATCP5A.29     
!                                                                          HEATCP5A.30     
! Description:                                                             HEATCP5A.31     
!     Calculates the effective heat capacity of a soil layer               HEATCP5A.32     
!     including the effects of ice, water and phase changes.               HEATCP5A.33     
!                                                     (Cox, 6/95)          HEATCP5A.34     
!                                                                          HEATCP5A.35     
! Documentation : UM Documentation Paper 25                                HEATCP5A.36     
!                                                                          HEATCP5A.37     
! Current Code Owner : David Gregory                                       HEATCP5A.38     
!                                                                          HEATCP5A.39     
! History:                                                                 HEATCP5A.40     
! Version   Date     Comment                                               HEATCP5A.41     
! -------   ----     -------                                               HEATCP5A.42     
!  4.1               New deck.    Peter Cox                                HEATCP5A.43     
!  4.5   26/5/98     Correction to stop overflow when SMCL very small.     ACB2F405.1      
!                    C.Bunton                                              ACB2F405.2      
!                                                                          HEATCP5A.44     
! Adds the vector shared, private directives.                              HEATCP5A.45     
! Code Description:                                                        HEATCP5A.46     
!   Language: FORTRAN 77 + common extensions.                              HEATCP5A.47     
!                                                                          HEATCP5A.48     
! System component covered: P25                                            HEATCP5A.49     
! System Task: P25                                                         HEATCP5A.50     
!                                                                          HEATCP5A.51     
                                                                           HEATCP5A.52     
! Global variables:                                                        HEATCP5A.53     
*CALL C_SOILH                                                              HEATCP5A.54     
                                                                           HEATCP5A.55     
! Subroutine arguments                                                     HEATCP5A.56     
!   Scalar arguments with intent(IN) :                                     HEATCP5A.57     
      INTEGER                                                              HEATCP5A.58     
     & NPNTS                ! IN Number of gridpoints.                     HEATCP5A.59     
     &,SOIL_PTS             ! IN Number of soil points.                    HEATCP5A.60     
                                                                           HEATCP5A.61     
!   Array arguments with intent(IN) :                                      HEATCP5A.62     
      INTEGER                                                              HEATCP5A.63     
     & SOIL_INDEX(NPNTS)    ! IN Array of soil points.                     HEATCP5A.64     
                                                                           HEATCP5A.65     
      REAL                                                                 HEATCP5A.66     
     & B(NPNTS)             ! IN Clapp-Hornberger exponent.                HEATCP5A.67     
     &,DZ                   ! IN Thickness of the soil layer (m).          HEATCP5A.68     
     &,HCAP(NPNTS)          ! IN Soil heat capacity (J/K/m3).              HEATCP5A.69     
     &,SATHH(NPNTS)         ! IN Saturated soil water pressure (m).        HEATCP5A.70     
     &,SMCL(NPNTS)          ! IN Soil moisture content of the              HEATCP5A.71     
!                           !    layer (kg/m2).                            HEATCP5A.72     
     &,STHF(NPNTS)          ! IN Frozen soil moisture content of           HEATCP5A.73     
!                           !    the layer as a fraction of                HEATCP5A.74     
!                           !    saturation.                               HEATCP5A.75     
     &,TSOIL(NPNTS)         ! IN Layer temperature (K).                    HEATCP5A.76     
     &,V_SAT(NPNTS)         ! IN Volumetric soil moisture                  HEATCP5A.77     
!                           !    concentration at saturation               HEATCP5A.78     
!                           !    (m3 H2O/m3 soil).                         HEATCP5A.79     
!                                                                          HEATCP5A.80     
      LOGICAL LTIMER        ! Logical switch for TIMER diags               HEATCP5A.81     
                                                                           HEATCP5A.82     
!   Array arguments with intent(OUT) :                                     HEATCP5A.83     
      REAL                                                                 HEATCP5A.84     
     & HCAPS(NPNTS)         ! OUT The total volumetric heat capacity       HEATCP5A.85     
!                           !     (soil+water) of the layer (J/m3/K).      HEATCP5A.86     
                                                                           HEATCP5A.87     
! Local scalars:                                                           HEATCP5A.88     
      INTEGER                                                              HEATCP5A.89     
     & I,J                  ! WORK Loop counter.                           HEATCP5A.90     
                                                                           HEATCP5A.91     
! Local arrays:                                                            HEATCP5A.92     
      REAL                                                                 HEATCP5A.93     
     & DTHU(NPNTS)          ! WORK Rate of change of volumetric unfrozen   HEATCP5A.94     
!                           !      soil moisture concentration with        HEATCP5A.95     
!                           !      temperature (m3 liquid H2O/m3 soil/K)   HEATCP5A.96     
     &,SMCLU(NPNTS)         ! WORK Unfrozen moisture content of each       HEATCP5A.97     
!                           !      soil layer (kg/m2).                     HEATCP5A.98     
     &,SMCLSAT(NPNTS)       ! WORK The saturation moisture content of      HEATCP5A.99     
!                           !      each layer (kg/m2).                     HEATCP5A.100    
     &,SMCLF(NPNTS)         ! WORK Frozen moisture content of each         HEATCP5A.101    
!                           !      soil layer (kg/m2).                     HEATCP5A.102    
     &,TMAX(NPNTS)          ! WORK Temperature above which all water is    HEATCP5A.103    
!                           !      unfrozen (Celsius)                      HEATCP5A.104    
     &,TSL(NPNTS)           ! WORK Soil layer temperature (Celsius)        HEATCP5A.105    
                                                                           HEATCP5A.106    
*CALL C_DENSTY                                                             HEATCP5A.107    
*CALL C_LHEAT                                                              HEATCP5A.108    
*CALL C_PERMA                                                              HEATCP5A.109    
*CALL C_0_DG_C                                                             HEATCP5A.110    
                                                                           HEATCP5A.111    
      IF (LTIMER) THEN                                                     HEATCP5A.112    
        CALL TIMER('HEATCAP ',3)                                           HEATCP5A.113    
      ENDIF                                                                HEATCP5A.114    
!----------------------------------------------------------------------    HEATCP5A.115    
! Initialise all points                                                    HEATCP5A.116    
!----------------------------------------------------------------------    HEATCP5A.117    
      DO I=1,NPNTS                                                         HEATCP5A.118    
        IF (V_SAT(I).GT.0.0) THEN ! Soil points                            HEATCP5A.119    
          HCAPS(I)=HCAP(I)                                                 HEATCP5A.120    
        ELSE ! Ice points                                                  HEATCP5A.121    
          HCAPS(I)=SNOW_HCAP                                               HEATCP5A.122    
        ENDIF                                                              HEATCP5A.123    
      ENDDO                                                                HEATCP5A.124    
                                                                           HEATCP5A.125    
!-----------------------------------------------------------------------   HEATCP5A.126    
! Calculate the temperature in Celsius and diagnose the saturation,        HEATCP5A.127    
! frozen and unfrozen soil moisture contents of the layer                  HEATCP5A.128    
!-----------------------------------------------------------------------   HEATCP5A.129    
CDIR$ IVDEP                                                                HEATCP5A.130    
! Fujitsu vectorization directive                                          GRB0F405.341    
!OCL NOVREC                                                                GRB0F405.342    
      DO J=1,SOIL_PTS                                                      HEATCP5A.131    
        I=SOIL_INDEX(J)                                                    HEATCP5A.132    
        TSL(I)=TSOIL(I)-ZERODEGC                                           HEATCP5A.133    
        SMCLSAT(I)=RHO_WATER*DZ*V_SAT(I)                                   HEATCP5A.134    
        SMCLF(I)=SMCLSAT(I)*STHF(I)                                        HEATCP5A.135    
        SMCLU(I)=SMCL(I)-SMCLF(I)                                          HEATCP5A.136    
      ENDDO                                                                HEATCP5A.137    
                                                                           HEATCP5A.138    
                                                                           HEATCP5A.139    
CDIR$ IVDEP                                                                HEATCP5A.140    
! Fujitsu vectorization directive                                          GRB0F405.343    
!OCL NOVREC                                                                GRB0F405.344    
      DO J=1,SOIL_PTS                                                      HEATCP5A.141    
        I=SOIL_INDEX(J)                                                    HEATCP5A.142    
!-----------------------------------------------------------------------   HEATCP5A.143    
! Calculate TMAX, the temperature above which all soil water is            HEATCP5A.144    
! unfrozen. Check that (SMCLSAT/SMCL)**B will not overflow when SMCL is    ACB2F405.3      
! very small. The function EPSILON  gives the number of type (real) of     ACB2F405.4      
! SMCL that is negligeable compared to 1.                                  ACB2F405.5      
!-----------------------------------------------------------------------   ACB2F405.6      
*IF DEF,SCMA,AND,-DEF,T3E                                                  ACB2F405.7      
          IF (SMCL(I) .GT. SMCLSAT(I)*1E-20) THEN                          ACB2F405.8      
*ELSE                                                                      ACB2F405.9      
          IF (SMCL(I) .GT. SMCLSAT(I)*(EPSILON(SMCL(I)) ) )THEN            ACB2F405.10     
*ENDIF                                                                     ACB2F405.11     
                                                                           ACB2F405.12     
          TMAX(I)=-SATHH(I)/DPSIDT                                         HEATCP5A.148    
     &           *(SMCLSAT(I)/SMCL(I))**(B(I))                             HEATCP5A.149    
        ELSE                                                               HEATCP5A.150    
          TMAX(I)=-ZERODEGC                                                HEATCP5A.151    
        ENDIF                                                              HEATCP5A.152    
                                                                           HEATCP5A.153    
!-----------------------------------------------------------------------   HEATCP5A.154    
! Calculate the rate of change of volumetric unfrozen soil moisture        HEATCP5A.155    
! concentration with temperature                                           HEATCP5A.156    
!-----------------------------------------------------------------------   HEATCP5A.157    
        IF (TSL(I).GE.TMAX(I)) THEN                                        HEATCP5A.158    
          DTHU(I)=0.0                                                      HEATCP5A.159    
        ELSE                                                               HEATCP5A.160    
          DTHU(I)=DPSIDT*SMCLSAT(I)                                        HEATCP5A.161    
     &             /(B(I)*SATHH(I)*RHO_WATER*DZ)                           HEATCP5A.162    
     &             *(-DPSIDT*TSL(I)/SATHH(I))**(-1.0/B(I)-1.0)             HEATCP5A.163    
        ENDIF                                                              HEATCP5A.164    
                                                                           HEATCP5A.165    
!-----------------------------------------------------------------------   HEATCP5A.166    
! Calculate the effective heat capacity                                    HEATCP5A.167    
!-----------------------------------------------------------------------   HEATCP5A.168    
        HCAPS(I)=HCAP(I)+(HCAPW-HCAPI)*SMCLU(I)/DZ                         HEATCP5A.169    
     &          +HCAPI*SMCL(I)/DZ                                          HEATCP5A.170    
     &          +RHO_WATER*DTHU(I)*((HCAPW-HCAPI)*TSL(I)+LF)               HEATCP5A.171    
      ENDDO                                                                HEATCP5A.172    
                                                                           HEATCP5A.173    
      IF (LTIMER) THEN                                                     HEATCP5A.174    
        CALL TIMER('HEATCAP ',4)                                           HEATCP5A.175    
      ENDIF                                                                HEATCP5A.176    
                                                                           HEATCP5A.177    
      RETURN                                                               HEATCP5A.178    
      END                                                                  HEATCP5A.179    
*ENDIF                                                                     HEATCP5A.180