*IF DEF,RECON SOILINT1.2
C *****************************COPYRIGHT****************************** SOILINT1.3
C (c) CROWN COPYRIGHT 1998, METEOROLOGICAL OFFICE, All Rights Reserved. SOILINT1.4
C SOILINT1.5
C Use, duplication or disclosure of this code is subject to the SOILINT1.6
C restrictions as set forth in the contract. SOILINT1.7
C SOILINT1.8
C Meteorological Office SOILINT1.9
C London Road SOILINT1.10
C BRACKNELL SOILINT1.11
C Berkshire UK SOILINT1.12
C RG12 2SZ SOILINT1.13
C SOILINT1.14
C If no contract has been raised with this copy of the code, the use, SOILINT1.15
C duplication or disclosure of it is strictly prohibited. Permission SOILINT1.16
C to do so must first be obtained in writing from the Head of Numerical SOILINT1.17
C Modelling at the above address. SOILINT1.18
C ******************************COPYRIGHT****************************** SOILINT1.19
SUBROUTINE SOIL_INTERP(NFTOUT,ITEM,N_TYPES,P_FIELD,FIXHD, 2,3SOILINT1.20
& LEN1_LOOKUP,LEN2_LOOKUP,LOOKUP, SOILINT1.21
& ECMWF_SOIL_LEVELS,ECMWF_SOIL_DEPTHS, SOILINT1.22
& MODEL_LAYER_DEPTH, SOILINT1.23
& N_SOIL_LEVELS,PP_ITEMC,PP_POS, SOILINT1.24
*CALL ARGPPX
SOILINT1.25
& ICODE,CMESSAGE) SOILINT1.26
IMPLICIT NONE SOILINT1.27
! Declarations: SOILINT1.28
! These are of the form:- SOILINT1.29
! INTEGER ExampleVariable !Description of variable SOILINT1.30
! SOILINT1.31
! Global variables (*CALLed COMDECKs etc...): SOILINT1.32
*CALL CSUBMODL
SOILINT1.33
*CALL CPPXREF
SOILINT1.34
*CALL PPXLOOK
SOILINT1.35
*CALL C_DENSTY
SOILINT1.36
! Subroutine arguments SOILINT1.37
! Scalar arguments with intent(in): SOILINT1.38
INTEGER ITEM SOILINT1.39
INTEGER LEN1_LOOKUP SOILINT1.40
INTEGER LEN2_LOOKUP SOILINT1.41
INTEGER NFTOUT SOILINT1.42
INTEGER N_SOIL_LEVELS SOILINT1.43
INTEGER N_TYPES SOILINT1.44
INTEGER P_FIELD SOILINT1.45
! Scalar arguments with intent(out): SOILINT1.46
INTEGER ICODE SOILINT1.47
CHARACTER*256 SOILINT1.48
& CMESSAGE SOILINT1.49
! Array arguments with intent(in): SOILINT1.50
! Array arguments with intent(InOut): SOILINT1.51
INTEGER PP_ITEMC(LEN2_LOOKUP) SOILINT1.52
INTEGER PP_POS(LEN2_LOOKUP) SOILINT1.53
INTEGER FIXHD(256) SOILINT1.54
INTEGER LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP) SOILINT1.55
REAL ECMWF_SOIL_LEVELS(N_SOIL_LEVELS) SOILINT1.56
REAL ECMWF_SOIL_DEPTHS(N_SOIL_LEVELS) SOILINT1.57
REAL MODEL_LAYER_DEPTH(N_SOIL_LEVELS) SOILINT1.58
! Local scalars: SOILINT1.59
INTEGER I,J SOILINT1.60
INTEGER POS SOILINT1.61
REAL SUM SOILINT1.62
! Local dynamic arrays: SOILINT1.63
INTEGER I1(N_SOIL_LEVELS) SOILINT1.64
INTEGER I2(N_SOIL_LEVELS) SOILINT1.65
REAL ALPHA(N_SOIL_LEVELS) SOILINT1.66
REAL ECMWF(P_FIELD,N_SOIL_LEVELS) SOILINT1.67
REAL MODEL(P_FIELD,N_SOIL_LEVELS) SOILINT1.68
REAL MODEL_SOIL_LEVELS(N_SOIL_LEVELS) SOILINT1.69
LOGICAL LFLAG(N_SOIL_LEVELS) SOILINT1.70
!- End of header SOILINT1.71
!-------------------------------------------------------------------- SOILINT1.72
SOILINT1.73
! 1: Calculate model levels from layer thicknesses SOILINT1.74
SUM=MODEL_LAYER_DEPTH(1) SOILINT1.75
MODEL_SOIL_LEVELS(1)=SUM*0.5 SOILINT1.76
DO J=2,N_SOIL_LEVELS SOILINT1.77
MODEL_SOIL_LEVELS(J)=SUM+MODEL_LAYER_DEPTH(J)*0.5 SOILINT1.78
SUM=SUM+MODEL_LAYER_DEPTH(J) SOILINT1.79
END DO SOILINT1.80
SOILINT1.81
! 2: Calculate interpolation coefficients SOILINT1.82
DO J=1,N_SOIL_LEVELS SOILINT1.83
LFLAG(J)=.FALSE. SOILINT1.84
IF(MODEL_SOIL_LEVELS(J).LT.ECMWF_SOIL_LEVELS(1))THEN SOILINT1.85
ALPHA(J)=(MODEL_SOIL_LEVELS(J)-ECMWF_SOIL_LEVELS(1))/ SOILINT1.86
& (ECMWF_SOIL_LEVELS(2)-ECMWF_SOIL_LEVELS(1)) SOILINT1.87
I1(J)=1 SOILINT1.88
I2(J)=2 SOILINT1.89
ELSE IF(MODEL_SOIL_LEVELS(J).GE. SOILINT1.90
& ECMWF_SOIL_LEVELS(N_SOIL_LEVELS))THEN SOILINT1.91
LFLAG(J)=.TRUE. SOILINT1.92
ALPHA(J)=(MODEL_SOIL_LEVELS(J)- SOILINT1.93
& ECMWF_SOIL_LEVELS(N_SOIL_LEVELS)) SOILINT1.94
& /(ECMWF_SOIL_LEVELS(N_SOIL_LEVELS)- SOILINT1.95
& ECMWF_SOIL_LEVELS(N_SOIL_LEVELS-1)) SOILINT1.96
I1(J)=N_SOIL_LEVELS-1 SOILINT1.97
I2(J)=N_SOIL_LEVELS SOILINT1.98
ELSE SOILINT1.99
DO I=2,N_SOIL_LEVELS SOILINT1.100
IF(MODEL_SOIL_LEVELS(J).GE.ECMWF_SOIL_LEVELS(I-1).AND. SOILINT1.101
& MODEL_SOIL_LEVELS(J).LT.ECMWF_SOIL_LEVELS(I))THEN SOILINT1.102
ALPHA(J)=(MODEL_SOIL_LEVELS(J)-ECMWF_SOIL_LEVELS(I-1)) SOILINT1.103
& /(ECMWF_SOIL_LEVELS(I)-ECMWF_SOIL_LEVELS(I-1)) SOILINT1.104
I1(J)=I-1 SOILINT1.105
I2(J)=I SOILINT1.106
END IF SOILINT1.107
END DO SOILINT1.108
END IF SOILINT1.109
END DO SOILINT1.110
! SOILINT1.111
IF(N_SOIL_LEVELS.NE.0)THEN SOILINT1.112
! SOILINT1.113
! 3: Read in field on ECWMF levels SOILINT1.114
CALL LOCATE
(ITEM,PP_ITEMC,N_TYPES,POS) SOILINT1.115
CALL READFLDS
(NFTOUT,N_SOIL_LEVELS,PP_POS(POS), SOILINT1.116
& LOOKUP,LEN1_LOOKUP,ECMWF, SOILINT1.117
& P_FIELD,FIXHD, SOILINT1.118
*CALL ARGPPX
SOILINT1.119
& ICODE,CMESSAGE) SOILINT1.120
IF(ICODE.NE.0)CALL ABORT_IO('SOIL_INTERP',CMESSAGE,ICODE,NFTOUT) SOILINT1.121
! SOILINT1.122
! 4: Convert ECMWF data to volumetric soil moisture concentration SOILINT1.123
IF(ITEM.EQ.9)THEN SOILINT1.124
DO J=1,N_SOIL_LEVELS SOILINT1.125
DO I=1,P_FIELD SOILINT1.126
ECMWF(I,J)=ECMWF(I,J)/ECMWF_SOIL_DEPTHS(1) SOILINT1.127
END DO SOILINT1.128
END DO SOILINT1.129
END IF SOILINT1.130
! SOILINT1.131
! 5: Interpolate onto model levels SOILINT1.132
DO J=1,N_SOIL_LEVELS SOILINT1.133
IF(LFLAG(J))THEN SOILINT1.134
DO I=1,P_FIELD SOILINT1.135
MODEL(I,J)=ECMWF(I,I2(J))+ALPHA(J) SOILINT1.136
& *(ECMWF(I,I2(J))-ECMWF(I,I1(J))) SOILINT1.137
END DO SOILINT1.138
ELSE SOILINT1.139
DO I=1,P_FIELD SOILINT1.140
MODEL(I,J)=ECMWF(I,I1(J))+ALPHA(J) SOILINT1.141
& *(ECMWF(I,I2(J))-ECMWF(I,I1(J))) SOILINT1.142
END DO SOILINT1.143
END IF SOILINT1.144
END DO SOILINT1.145
! SOILINT1.146
! 6: Convert value into actual soil moistures (SMCL) SOILINT1.147
IF(ITEM.EQ.9)THEN SOILINT1.148
DO J=1,N_SOIL_LEVELS SOILINT1.149
DO I=1,P_FIELD SOILINT1.150
IF(MODEL(I,J).GE.0)THEN SOILINT1.151
MODEL(I,J)=RHO_WATER*MODEL_LAYER_DEPTH(J)*MODEL(I,J) SOILINT1.152
ELSE SOILINT1.153
MODEL(I,J)=0.0 SOILINT1.154
END IF SOILINT1.155
END DO SOILINT1.156
END DO SOILINT1.157
END IF SOILINT1.158
! SOILINT1.159
! 7: Output Field SOILINT1.160
CALL WRITFLDS
(NFTOUT,N_SOIL_LEVELS,PP_POS(POS), SOILINT1.161
& LOOKUP,LEN1_LOOKUP,MODEL, SOILINT1.162
& P_FIELD,FIXHD, SOILINT1.163
*CALL ARGPPX
SOILINT1.164
& ICODE,CMESSAGE) SOILINT1.165
IF(ICODE.NE.0)CALL ABORT_IO('SOIL_INTERP',CMESSAGE,ICODE,NFTOUT) SOILINT1.166
! SOILINT1.167
END IF SOILINT1.168
! SOILINT1.169
RETURN SOILINT1.170
END SOILINT1.171
*ENDIF SOILINT1.172