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

      SUBROUTINE SOIL_HYD (                                                 3,4SOILHY5A.23     
     & NPNTS,NSHYD,SOIL_PTS,SOIL_INDEX,B,DZ,EXT,FW,KS,SATHH,TIMESTEP       SOILHY5A.24     
     &,V_SAT,SLOW_RUNOFF,SMCL,STHU,W_FLUX,STF_SLOW_RUNOFF,LTIMER           SOILHY5A.25     
     &)                                                                    SOILHY5A.26     
                                                                           SOILHY5A.27     
      IMPLICIT NONE                                                        SOILHY5A.28     
!                                                                          SOILHY5A.29     
! Description:                                                             SOILHY5A.30     
!     Increments the layer soil moisture contents and calculates           SOILHY5A.31     
!     calculates gravitational runoff. Calls the following:                SOILHY5A.32     
!                                                                          SOILHY5A.33     
!     HYD_CON - to calculate the hydraulic conductivity                    SOILHY5A.34     
!                                                     (Cox, 6/95)          SOILHY5A.35     
!                                                                          SOILHY5A.36     
!     DARCY - to calculate the Darcian fluxes between soil layers          SOILHY5A.37     
!                                                     (Cox, 6/95)          SOILHY5A.38     
!                                                                          SOILHY5A.39     
!                                                                          SOILHY5A.40     
! Documentation : UM Documentation Paper 25                                SOILHY5A.41     
!                                                                          SOILHY5A.42     
! Current Code Owner : David Gregory                                       SOILHY5A.43     
!                                                                          SOILHY5A.44     
! History:                                                                 SOILHY5A.45     
! Version   Date     Comment                                               SOILHY5A.46     
! -------   ----     -------                                               SOILHY5A.47     
!  4.1      6/96     New deck.   Peter Cox                                 SOILHY5A.48     
!                                                                          SOILHY5A.49     
! Code Description:                                                        SOILHY5A.50     
!   Language: FORTRAN 77 + common extensions.                              SOILHY5A.51     
!                                                                          SOILHY5A.52     
! System component covered: P25                                            SOILHY5A.53     
! System Task: P25                                                         SOILHY5A.54     
!                                                                          SOILHY5A.55     
                                                                           SOILHY5A.56     
! Global variables:                                                        SOILHY5A.57     
*CALL C_DENSTY                                                             SOILHY5A.58     
*CALL C_POND                                                               SOILHY5A.59     
*CALL C_SOILH                                                              SOILHY5A.60     
                                                                           SOILHY5A.61     
! Subroutine arguments                                                     SOILHY5A.62     
!   Scalar arguments with intent(IN) :                                     SOILHY5A.63     
      INTEGER                                                              SOILHY5A.64     
     & NPNTS                ! IN Number of gridpoints.                     SOILHY5A.65     
     &,NSHYD                ! IN Number of soil moisture levels.           SOILHY5A.66     
     &,SOIL_PTS             ! IN Number of soil points.                    SOILHY5A.67     
                                                                           SOILHY5A.68     
      REAL                                                                 SOILHY5A.69     
     & TIMESTEP             ! IN Model timestep (s).                       SOILHY5A.70     
                                                                           SOILHY5A.71     
      LOGICAL                                                              SOILHY5A.72     
     & STF_SLOW_RUNOFF      ! IN Stash flag for sub-surface runoff.        SOILHY5A.73     
                                                                           SOILHY5A.74     
                                                                           SOILHY5A.75     
                                                                           SOILHY5A.76     
!   Array arguments with intent(IN) :                                      SOILHY5A.77     
      INTEGER                                                              SOILHY5A.78     
     & SOIL_INDEX(NPNTS)    ! IN Array of soil points.                     SOILHY5A.79     
                                                                           SOILHY5A.80     
      REAL                                                                 SOILHY5A.81     
     & B(NPNTS)             ! IN Clapp-Hornberger exponent.                SOILHY5A.82     
     &,DZ(NSHYD)            ! IN Thicknesses of the soil layers (m).       SOILHY5A.83     
     &,EXT(NPNTS,NSHYD)     ! IN Extraction of water from each soil        SOILHY5A.84     
!                           !    layer (kg/m2/s).                          SOILHY5A.85     
     &,FW(NPNTS)            ! IN Throughfall from canopy plus snowmelt     SOILHY5A.86     
!                           !    minus surface runoff (kg/m2/s).           SOILHY5A.87     
     &,KS(NPNTS)            ! IN Saturated hydraulic conductivity          SOILHY5A.88     
!                           !    (kg/m2/s).                                SOILHY5A.89     
     &,SATHH(NPNTS)         ! IN Saturated soil water pressure (m).        SOILHY5A.90     
     &,V_SAT(NPNTS)         ! IN Volumetric soil moisture                  SOILHY5A.91     
!                           !    concentration at saturation               SOILHY5A.92     
!                           !    (m3 H2O/m3 soil).                         SOILHY5A.93     
!                                                                          SOILHY5A.94     
      LOGICAL LTIMER        ! Logical switch for TIMER diags               SOILHY5A.95     
                                                                           SOILHY5A.96     
!   Array arguments with intent(OUT) :                                     SOILHY5A.97     
      REAL                                                                 SOILHY5A.98     
     & SLOW_RUNOFF(NPNTS)   ! OUT Drainage from the base of the            SOILHY5A.99     
!                           !     soil profile (kg/m2/s).                  SOILHY5A.100    
     &,SMCLSAT(NPNTS,NSHYD) ! OUT The saturation moisture content of       SOILHY5A.101    
!                           !     each layer (kg/m2).                      SOILHY5A.102    
     &,W_FLUX(NPNTS,0:NSHYD)! OUT The fluxes of water between layers       SOILHY5A.103    
!                           !     (kg/m2/s).                               SOILHY5A.104    
                                                                           SOILHY5A.105    
!   Array arguments with intent(INOUT) :                                   SOILHY5A.106    
      REAL                                                                 SOILHY5A.107    
     & SMCL(NPNTS,NSHYD)    ! INOUT Total soil moisture contents           SOILHY5A.108    
!                           !       of each layer (kg/m2).                 SOILHY5A.109    
     &,STHU(NPNTS,NSHYD)    ! INOUT Unfrozen soil moisture content of ea   SOILHY5A.110    
!                           !       layer as a fraction of saturation.     SOILHY5A.111    
                                                                           SOILHY5A.112    
                                                                           SOILHY5A.113    
! Local scalars:                                                           SOILHY5A.114    
      INTEGER                                                              SOILHY5A.115    
     & I,J,N                ! WORK Loop counters.                          SOILHY5A.116    
                                                                           SOILHY5A.117    
! Local arrays:                                                            SOILHY5A.118    
      REAL                                                                 SOILHY5A.119    
     & DSMCL(NPNTS)         ! WORK The transfer of soil                    SOILHY5A.120    
!                           !      moisture (kg/m2/timestep).              SOILHY5A.121    
     &,EXCESS(NPNTS)        ! WORK Excess soil moisture (kg/m2).           SOILHY5A.122    
     &,SMCLMAX(NPNTS,NSHYD) ! WORK The maximum moisture content            SOILHY5A.123    
!                           !      of each layer (kg/m2).                  SOILHY5A.124    
     &,SMCLU(NPNTS,NSHYD)   ! WORK Unfrozen soil moisture contents         SOILHY5A.125    
!                           !      of each layer (kg/m2).                  SOILHY5A.126    
     &,STHUK(NPNTS)         ! WORK Fractional saturation of lowest         SOILHY5A.127    
!                           !      layer.                                  SOILHY5A.128    
                                                                           SOILHY5A.129    
! Function & Subroutine calls:                                             SOILHY5A.130    
      EXTERNAL                                                             SOILHY5A.131    
     & HYD_CON,DARCY                                                       SOILHY5A.132    
                                                                           SOILHY5A.133    
      IF (LTIMER) THEN                                                     SOILHY5A.134    
        CALL TIMER('SOILHYD ',103)                                         GPB8F405.150    
      ENDIF                                                                SOILHY5A.136    
!-----------------------------------------------------------------------   SOILHY5A.137    
! Calculate the unfrozen soil moisture contents and the saturation         SOILHY5A.138    
! total soil moisture for each layer.                                      SOILHY5A.139    
!-----------------------------------------------------------------------   SOILHY5A.140    
! CDIR$ IVDEP here would force vectorization but changes results!          SOILHY5A.141    
! Fujitsu vectorization directive                                          GRB0F405.537    
!OCL NOVREC                                                                GRB0F405.538    
      DO N=1,NSHYD                                                         SOILHY5A.142    
        DO J=1,SOIL_PTS                                                    SOILHY5A.143    
          I=SOIL_INDEX(J)                                                  SOILHY5A.144    
          SMCLSAT(I,N)=RHO_WATER*DZ(N)*V_SAT(I)                            SOILHY5A.145    
          SMCLU(I,N)=STHU(I,N)*SMCLSAT(I,N)                                SOILHY5A.146    
        ENDDO                                                              SOILHY5A.147    
      ENDDO                                                                SOILHY5A.148    
                                                                           SOILHY5A.149    
!-----------------------------------------------------------------------   SOILHY5A.150    
! Top boundary condition                                                   SOILHY5A.151    
!-----------------------------------------------------------------------   SOILHY5A.152    
      DO J=1,SOIL_PTS                                                      SOILHY5A.153    
        I=SOIL_INDEX(J)                                                    SOILHY5A.154    
        W_FLUX(I,0)=FW(I)                                                  SOILHY5A.155    
      ENDDO                                                                SOILHY5A.156    
                                                                           SOILHY5A.157    
!-----------------------------------------------------------------------   SOILHY5A.158    
! Define the maximum water content that may exist in each layer            SOILHY5A.159    
!-----------------------------------------------------------------------   SOILHY5A.160    
      DO N=2,NSHYD                                                         SOILHY5A.161    
        DO J=1,SOIL_PTS                                                    SOILHY5A.162    
          I=SOIL_INDEX(J)                                                  SOILHY5A.163    
          SMCLMAX(I,N)=SMCLSAT(I,N)                                        SOILHY5A.164    
        ENDDO                                                              SOILHY5A.165    
      ENDDO                                                                SOILHY5A.166    
                                                                           SOILHY5A.167    
!-----------------------------------------------------------------------   SOILHY5A.168    
! Allow for some ponding of water by permitting excess moisture to         SOILHY5A.169    
! remain in the top layer.                                                 SOILHY5A.170    
!-----------------------------------------------------------------------   SOILHY5A.171    
      DO J=1,SOIL_PTS                                                      SOILHY5A.172    
        I=SOIL_INDEX(J)                                                    SOILHY5A.173    
        SMCLMAX(I,1)=SMCLSAT(I,1)+POND_MAX                                 SOILHY5A.174    
      ENDDO                                                                SOILHY5A.175    
                                                                           SOILHY5A.176    
!-----------------------------------------------------------------------   SOILHY5A.177    
! Increment the soil moisture contents for each layer, beginning with      SOILHY5A.178    
! the bottom.                                                              SOILHY5A.179    
!-----------------------------------------------------------------------   SOILHY5A.180    
      DO J=1,SOIL_PTS                                                      SOILHY5A.181    
        I=SOIL_INDEX(J)                                                    SOILHY5A.182    
        STHUK(I)=STHU(I,NSHYD)                                             SOILHY5A.183    
      ENDDO                                                                SOILHY5A.184    
      CALL HYD_CON (NPNTS,SOIL_PTS,SOIL_INDEX,B,KS,STHUK,                  SOILHY5A.185    
     &              W_FLUX(1,NSHYD),LTIMER)                                SOILHY5A.186    
                                                                           SOILHY5A.187    
CDIR$ IVDEP                                                                SOILHY5A.188    
! Fujitsu vectorization directive                                          GRB0F405.539    
!OCL NOVREC                                                                GRB0F405.540    
      DO J=1,SOIL_PTS                                                      SOILHY5A.189    
        I=SOIL_INDEX(J)                                                    SOILHY5A.190    
        DSMCL(I)=(W_FLUX(I,NSHYD)+EXT(I,NSHYD))*TIMESTEP                   SOILHY5A.191    
        IF (DSMCL(I).GT.SMCLU(I,NSHYD)) THEN                               SOILHY5A.192    
          DSMCL(I)=SMCLU(I,NSHYD)                                          SOILHY5A.193    
          W_FLUX(I,NSHYD)=DSMCL(I)/TIMESTEP-EXT(I,NSHYD)                   SOILHY5A.194    
        ENDIF                                                              SOILHY5A.195    
                                                                           SOILHY5A.196    
        SMCL(I,NSHYD)=SMCL(I,NSHYD)-TIMESTEP*(W_FLUX(I,NSHYD)              SOILHY5A.197    
     &                              +EXT(I,NSHYD))                         SOILHY5A.198    
        SMCLU(I,NSHYD)=SMCLU(I,NSHYD)-TIMESTEP*(W_FLUX(I,NSHYD)            SOILHY5A.199    
     &                              +EXT(I,NSHYD))                         SOILHY5A.200    
        STHU(I,NSHYD)=SMCLU(I,NSHYD)/SMCLSAT(I,NSHYD)                      SOILHY5A.201    
      ENDDO                                                                SOILHY5A.202    
                                                                           SOILHY5A.203    
!-----------------------------------------------------------------------   SOILHY5A.204    
! Layers NSHYD to 1                                                        SOILHY5A.205    
!-----------------------------------------------------------------------   SOILHY5A.206    
      DO N=NSHYD,2,-1                                                      SOILHY5A.207    
        CALL DARCY (NPNTS,SOIL_PTS,SOIL_INDEX,B,KS,SATHH                   SOILHY5A.208    
     &,             STHU(1,N-1),DZ(N-1),STHU(1,N),DZ(N)                    SOILHY5A.209    
     &,             W_FLUX(1,N-1),LTIMER)                                  SOILHY5A.210    
                                                                           SOILHY5A.211    
CDIR$ IVDEP                                                                SOILHY5A.212    
! Fujitsu vectorization directive                                          GRB0F405.541    
!OCL NOVREC                                                                GRB0F405.542    
        DO J=1,SOIL_PTS                                                    SOILHY5A.213    
          I=SOIL_INDEX(J)                                                  SOILHY5A.214    
          DSMCL(I)=(W_FLUX(I,N-1)+EXT(I,N-1))*TIMESTEP                     SOILHY5A.215    
          IF (DSMCL(I).GT.SMCLU(I,N-1)) THEN                               SOILHY5A.216    
            DSMCL(I)=SMCLU(I,N-1)                                          SOILHY5A.217    
            W_FLUX(I,N-1)=DSMCL(I)/TIMESTEP-EXT(I,N-1)                     SOILHY5A.218    
          ELSEIF (DSMCL(I).LT.(SMCL(I,N-1)-SMCLMAX(I,N-1))) THEN           SOILHY5A.219    
            DSMCL(I)=SMCL(I,N-1)-SMCLMAX(I,N-1)                            SOILHY5A.220    
            W_FLUX(I,N-1)=DSMCL(I)/TIMESTEP-EXT(I,N-1)                     SOILHY5A.221    
          ENDIF                                                            SOILHY5A.222    
                                                                           SOILHY5A.223    
          DSMCL(I)=W_FLUX(I,N-1)*TIMESTEP                                  SOILHY5A.224    
          IF (DSMCL(I).GT.(SMCLMAX(I,N)-SMCL(I,N))) THEN                   SOILHY5A.225    
            DSMCL(I)=SMCLMAX(I,N)-SMCL(I,N)                                SOILHY5A.226    
            W_FLUX(I,N-1)=DSMCL(I)/TIMESTEP                                SOILHY5A.227    
          ELSEIF (DSMCL(I).LT.(-SMCLU(I,N))) THEN                          SOILHY5A.228    
            DSMCL(I)=-SMCLU(I,N)                                           SOILHY5A.229    
            W_FLUX(I,N-1)=DSMCL(I)/TIMESTEP                                SOILHY5A.230    
          ENDIF                                                            SOILHY5A.231    
                                                                           SOILHY5A.232    
          SMCL(I,N)=SMCL(I,N)+TIMESTEP*W_FLUX(I,N-1)                       SOILHY5A.233    
          SMCLU(I,N)=SMCLU(I,N)+TIMESTEP*W_FLUX(I,N-1)                     SOILHY5A.234    
          STHU(I,N)=SMCLU(I,N)/SMCLSAT(I,N)                                SOILHY5A.235    
          SMCL(I,N-1)=SMCL(I,N-1)-TIMESTEP*(W_FLUX(I,N-1)                  SOILHY5A.236    
     &                               +EXT(I,N-1))                          SOILHY5A.237    
          SMCLU(I,N-1)=SMCLU(I,N-1)-TIMESTEP*(W_FLUX(I,N-1)                SOILHY5A.238    
     &                               +EXT(I,N-1))                          SOILHY5A.239    
          STHU(I,N-1)=SMCLU(I,N-1)/SMCLSAT(I,N-1)                          SOILHY5A.240    
                                                                           SOILHY5A.241    
        ENDDO                                                              SOILHY5A.242    
      ENDDO                                                                SOILHY5A.243    
                                                                           SOILHY5A.244    
CDIR$ IVDEP                                                                SOILHY5A.245    
! Fujitsu vectorization directive                                          GRB0F405.543    
!OCL NOVREC                                                                GRB0F405.544    
      DO J=1,SOIL_PTS                                                      SOILHY5A.246    
        I=SOIL_INDEX(J)                                                    SOILHY5A.247    
        SMCL(I,1)=SMCL(I,1)+TIMESTEP*W_FLUX(I,0)                           SOILHY5A.248    
        SMCLU(I,1)=SMCLU(I,1)+TIMESTEP*W_FLUX(I,0)                         SOILHY5A.249    
        STHU(I,1)=SMCLU(I,1)/SMCLSAT(I,1)                                  SOILHY5A.250    
      ENDDO                                                                SOILHY5A.251    
                                                                           SOILHY5A.252    
!-----------------------------------------------------------------------   SOILHY5A.253    
! If a layer is supersaturated move the excess moisture to the layer       SOILHY5A.254    
! below.                                                                   SOILHY5A.255    
!-----------------------------------------------------------------------   SOILHY5A.256    
      DO N=1,NSHYD-1                                                       SOILHY5A.257    
CDIR$ IVDEP                                                                SOILHY5A.258    
! Fujitsu vectorization directive                                          GRB0F405.545    
!OCL NOVREC                                                                GRB0F405.546    
        DO J=1,SOIL_PTS                                                    SOILHY5A.259    
          I=SOIL_INDEX(J)                                                  SOILHY5A.260    
                                                                           SOILHY5A.261    
          EXCESS(I)=MAX((SMCL(I,N)-SMCLMAX(I,N)),0.0)                      SOILHY5A.262    
                                                                           SOILHY5A.263    
          IF (EXCESS(I).GT.0.0) THEN                                       SOILHY5A.264    
                                                                           SOILHY5A.265    
            W_FLUX(I,N)=W_FLUX(I,N)+EXCESS(I)/TIMESTEP                     SOILHY5A.266    
                                                                           SOILHY5A.267    
            SMCL(I,N)=SMCL(I,N)-EXCESS(I)                                  SOILHY5A.268    
            SMCLU(I,N)=SMCLU(I,N)-EXCESS(I)                                SOILHY5A.269    
            STHU(I,N)=SMCLU(I,N)/SMCLSAT(I,N)                              SOILHY5A.270    
                                                                           SOILHY5A.271    
            SMCL(I,N+1)=SMCL(I,N+1)+EXCESS(I)                              SOILHY5A.272    
            SMCLU(I,N+1)=SMCLU(I,N+1)+EXCESS(I)                            SOILHY5A.273    
            STHU(I,N+1)=SMCLU(I,N+1)/SMCLSAT(I,N+1)                        SOILHY5A.274    
                                                                           SOILHY5A.275    
          ENDIF                                                            SOILHY5A.276    
                                                                           SOILHY5A.277    
        ENDDO                                                              SOILHY5A.278    
      ENDDO                                                                SOILHY5A.279    
                                                                           SOILHY5A.280    
!-----------------------------------------------------------------------   SOILHY5A.281    
! If there is still excess moisture add this to the flux from the base     SOILHY5A.282    
! of the soil profile.                                                     SOILHY5A.283    
!-----------------------------------------------------------------------   SOILHY5A.284    
CDIR$ IVDEP                                                                SOILHY5A.285    
! Fujitsu vectorization directive                                          GRB0F405.547    
!OCL NOVREC                                                                GRB0F405.548    
      DO J=1,SOIL_PTS                                                      SOILHY5A.286    
        I=SOIL_INDEX(J)                                                    SOILHY5A.287    
        EXCESS(I)=MAX((SMCL(I,NSHYD)-SMCLMAX(I,NSHYD)),0.0)                SOILHY5A.288    
        IF (EXCESS(I).GT.0.0) THEN                                         SOILHY5A.289    
                                                                           SOILHY5A.290    
          W_FLUX(I,NSHYD)=W_FLUX(I,NSHYD)+EXCESS(I)/TIMESTEP               SOILHY5A.291    
                                                                           SOILHY5A.292    
          SMCL(I,NSHYD)=SMCL(I,NSHYD)-EXCESS(I)                            SOILHY5A.293    
          SMCLU(I,NSHYD)=SMCLU(I,NSHYD)-EXCESS(I)                          SOILHY5A.294    
          STHU(I,NSHYD)=SMCLU(I,NSHYD)/SMCLSAT(I,NSHYD)                    SOILHY5A.295    
                                                                           SOILHY5A.296    
        ENDIF                                                              SOILHY5A.297    
      ENDDO                                                                SOILHY5A.298    
                                                                           SOILHY5A.299    
!-----------------------------------------------------------------------   SOILHY5A.300    
! Output slow runoff (drainage) diagnostic.                                SOILHY5A.301    
!-----------------------------------------------------------------------   SOILHY5A.302    
      IF (STF_SLOW_RUNOFF) THEN                                            SOILHY5A.303    
        DO I=1,NPNTS                                                       SOILHY5A.304    
          SLOW_RUNOFF(I)=0.0                                               SOILHY5A.305    
        ENDDO                                                              SOILHY5A.306    
        DO J=1,SOIL_PTS                                                    SOILHY5A.307    
          I=SOIL_INDEX(J)                                                  SOILHY5A.308    
          SLOW_RUNOFF(I)=W_FLUX(I,NSHYD)                                   SOILHY5A.309    
        ENDDO                                                              SOILHY5A.310    
      ENDIF                                                                SOILHY5A.311    
      IF (LTIMER) THEN                                                     SOILHY5A.312    
        CALL TIMER('SOILHYD ',104)                                         GPB8F405.151    
      ENDIF                                                                SOILHY5A.314    
      RETURN                                                               SOILHY5A.315    
      END                                                                  SOILHY5A.316    
*ENDIF                                                                     SOILHY5A.317