*IF DEF,A03_3A,OR,DEF,A03_5A ASJ4F401.17
C ******************************COPYRIGHT****************************** GTS2F400.9235
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.9236
C GTS2F400.9237
C Use, duplication or disclosure of this code is subject to the GTS2F400.9238
C restrictions as set forth in the contract. GTS2F400.9239
C GTS2F400.9240
C Meteorological Office GTS2F400.9241
C London Road GTS2F400.9242
C BRACKNELL GTS2F400.9243
C Berkshire UK GTS2F400.9244
C RG12 2SZ GTS2F400.9245
C GTS2F400.9246
C If no contract has been raised with this copy of the code, the use, GTS2F400.9247
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.9248
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.9249
C Modelling at the above address. GTS2F400.9250
C ******************************COPYRIGHT****************************** GTS2F400.9251
C GTS2F400.9252
C*LL SUBROUTINE SOIL_HTF----------------------------------------------- SOILHT1A.3
CLL SOILHT1A.4
CLL Purpose: For land points, calculates the heat flux between the SOILHT1A.5
CLL Top two soil layers, and updates the deep soil SOILHT1A.6
CLL temperatures. For other points, or if there is only SOILHT1A.7
CLL one soil layer, the flux is simply set to zero. SOILHT1A.8
CLL SOILHT1A.9
CLL Note the terminology used: the scheme has n soil layers, SOILHT1A.10
CLL where n is given by the argument NSOIL ( = DS_LEVELS+1). SOILHT1A.11
CLL Layer 1 is the top soil layer, assumed to be at SOILHT1A.12
CLL temperature TSTAR. The layers beneath this one are SOILHT1A.13
CLL termed "deep" soil layers, of which there are obviously SOILHT1A.14
CLL n-1. The first layer below the top soil layer is SOILHT1A.15
CLL referred to indifferently as "soil layer 2" or "deep soil SOILHT1A.16
CLL layer 1". SOILHT1A.17
CLL Before March 1990 this routine was specific to a 4 soil layer SOILHT1A.19
CLL scheme. To use any other number of layers, replace the SOILHT1A.20
CLL definition of PARAMETER PSOIL, which is used to dimension SOILHT1A.21
CLL a couple of small work arrays. SOILHT1A.22
CLL SOILHT1A.23
CLL SOILHT1A.25
CLL F.Hewer <- programmer of some or all of previous code or changes SOILHT1A.26
CLL SOILHT1A.27
CLL Model Modification history from model version 3.0: SOILHT1A.28
CLL version Date SOILHT1A.29
CLL 3.4 06/06/94 DEF TIMER replaced by LOGICAL LTIMER ASJ1F304.402
CLL Argument LTIMER added ASJ1F304.403
CLL S.J.Swarbrick ASJ1F304.404
CLL 4.1 08/05/96 decks A03_2C and A03_3B removed ASJ4F401.18
CLL S D Jackson ASJ4F401.19
CLL 4.2 Oct. 96 T3E migration - *DEF CRAY removed GSS1F402.83
CLL S J Swarbrick GSS1F402.84
!LL 4.3 06/03/97 Dimension T_DEEP_SOIL by LAND_FIELD ADR2F403.128
!LL for non-MPP and MPP runs. D. Robinson. ADR2F403.129
!LL 4.5 18/06/98 Changed Timer calls to indicate non-barrier GPB8F405.31
!LL P.Burton GPB8F405.32
CLL 4.5 Jul. 98 Kill the IBM specific lines (JCThil) AJC1F405.43
CLL SOILHT1A.30
CLL Programming standard: Unified Model Documentation Paper No.4 SOILHT1A.31
CLL version no. 2, dated 18/1/90. SOILHT1A.32
CLL SOILHT1A.33
CLL System component covered: P242. SOILHT1A.34
CLL SOILHT1A.35
CLL Documentation: Unified Model Documentation Paper No 24. SOILHT1A.36
C* SOILHT1A.37
C*L ARGUMENTS:---------------------------------------------------------- SOILHT1A.38
SUBROUTINE SOIL_HTF( 1,2SOILHT1A.39
+ HCAP,HCON,LAYER_DEPTH,LYING_SNOW,TSTAR,LAND_MASK,TIMESTEP, SOILHT1A.40
+ P_FIELD,LAND_FIELD,P_POINTS,P1, SOILHT1A.41
+ LAND_PTS,LAND1,LAND_INDEX, SOILHT1A.43
+ NSOIL,T_DEEP_SOIL,ASOIL_1,SOIL_HT_FLUX SOILHT1A.46
+,LTIMER) ASJ1F304.405
IMPLICIT NONE SOILHT1A.51
LOGICAL LTIMER ASJ1F304.406
INTEGER SOILHT1A.52
+ P_FIELD ! IN Number of gridpoints in field. SOILHT1A.53
+,LAND_FIELD ! IN Number of land points in field. SOILHT1A.54
+,P_POINTS ! IN Number of gridpoints to be processed. SOILHT1A.55
+,P1 ! IN First point processed within field. SOILHT1A.56
+,NSOIL ! IN Number of soil layers (N_S in doc). SOILHT1A.57
+,LAND_PTS ! IN Number of land points to be processed. SOILHT1A.59
+,LAND1 ! IN First land point to be processed. SOILHT1A.60
+,LAND_INDEX(P_FIELD) ! IN Index of land points on the P-grid. SOILHT1A.61
C ! The ith element contains the position SOILHT1A.62
C ! in whole grid of the ith land point. SOILHT1A.63
C ! (Must match parameter PSOIL.) SOILHT1A.66
REAL SOILHT1A.68
+ HCAP(LAND_FIELD) ! IN Soil heat capacity in J/K/m**3 SOILHT1A.69
C ! (C_S in documentation). SOILHT1A.70
+,HCON(LAND_FIELD) ! IN Soil thermal conductivity in W/m/K SOILHT1A.71
C ! (LAMBDA_S in documentation). SOILHT1A.72
+,LAYER_DEPTH(NSOIL) ! IN Soil layer depths as multiples of SOILHT1A.73
C ! depth of top layer (ZETA_r in SOILHT1A.74
C ! documentation). The following were SOILHT1A.75
C ! used in the GCM (5th Ann Cyc) :- SOILHT1A.76
C SOILHT1A.77
C LAYER_DEPTH /1.000,3.908,14.05,44.65/ (see eqns P242.15) SOILHT1A.78
C SOILHT1A.79
C (LAYER_DEPTH(1) must of course be 1.0, by definition.) SOILHT1A.80
C SOILHT1A.81
+,LYING_SNOW(P_FIELD) ! IN Lying snow amount (kg per sq m). SOILHT1A.82
+,TSTAR(P_FIELD) ! IN Surface (i.e. soil layer 1) temp (K). SOILHT1A.83
LOGICAL SOILHT1A.84
+ LAND_MASK(P_FIELD) ! IN Land mask (T if land, else F). SOILHT1A.85
REAL TIMESTEP ! IN Timestep (s). SOILHT1A.86
REAL SOILHT1A.87
+ T_DEEP_SOIL(LAND_FIELD,NSOIL-1) SOILHT1A.88
C ! INOUT Deep soil temperatures (K). SOILHT1A.89
REAL SOILHT1A.90
+ ASOIL_1(P_FIELD) ! OUT Soil coefficient used elsewhere in SOILHT1A.91
C ! P24 (sq m K per Joule * timestep). SOILHT1A.92
+,SOIL_HT_FLUX(P_FIELD) ! OUT Heat flux from soil layer 1 to SOILHT1A.93
C ! soil layer 2, i.e. +ve values for SOILHT1A.94
C ! downward flux (Watts per sq m). SOILHT1A.95
INTEGER ERROR ! OUT Error flag: 0 if AOK; SOILHT1A.97
+ ! 1 if NSOIL & PSOIL are not the same. SOILHT1A.98
C* SOILHT1A.100
C Local physical constants -------------------------------------------- SOILHT1A.101
C (Must be here because contains PSOIL, used for later dimensioning.) SOILHT1A.102
*CALL C_SOILH
SOILHT1A.103
C*L Workspace usage --------------------------------------------------- SOILHT1A.104
C Two blocks of real space, plus a few odd bits, are needed. SOILHT1A.105
REAL SOILHT1A.107
+ DELT1(LAND_FIELD) ! Temperature difference across "this" soil lay SOILHT1A.108
+,DELT2(LAND_FIELD) ! Temperature difference across "next" soil lay SOILHT1A.109
REAL ASOIL(NSOIL),BSOIL(NSOIL) SOILHT1A.110
C SOILHT1A.119
EXTERNAL TIMER SOILHT1A.122
C* SOILHT1A.128
C Local variables ----------------------------------------------------- SOILHT1A.129
INTEGER SOILHT1A.130
+ I ! Loop counter; horizontal land point field index. SOILHT1A.131
+,J ! Loop counter; horizontal land and sea field index. SOILHT1A.132
+,THIS_LEVEL ! Loop counter for loop through (deep) soil levels. SOILHT1A.133
+,NEXT_LEVEL ! "Next" level during loops through soil levels. SOILHT1A.134
REAL SOILHT1A.135
+ DS_RATIO ! 2 * (Ratio of actual snowdepth to depth of top SOILHT1A.136
C ! soil layer). SOILHT1A.137
+,SIFACT ! Snow Insulation FACTor, GAMMA_SNOW in documentation. SOILHT1A.138
+,Z2_PLUS_1 ! Combined depth of top 2 soil layers. SOILHT1A.139
IF (LTIMER) THEN ASJ1F304.407
CALL TIMER
('SOILHTF ',103) GPB8F405.33
ENDIF ASJ1F304.408
Z2_PLUS_1 = LAYER_DEPTH(1) + LAYER_DEPTH(2) SOILHT1A.151
IF (NSOIL.GT.1) THEN SOILHT1A.152
DO 1 THIS_LEVEL = 1,NSOIL-1 SOILHT1A.153
NEXT_LEVEL = THIS_LEVEL + 1 SOILHT1A.154
C----------------------------------------------------------------------- SOILHT1A.155
CL 1. Set conductivity coefficients ASOIL and BSOIL, absorbing TIMESTEP SOILHT1A.156
CL from the LHS of eqns P242.3 and P242.4, where they are used. SOILHT1A.157
CL ASOIL/TIMESTEP is ASr, and BSOIL/TIMESTEP is BSr, in eqns SOILHT1A.158
CL P242.12, P242.13. ASOIL(1), i.e. A1, is a function of soil type SOILHT1A.159
CL and therefore varies from point to point. Therefore it is set in SOILHT1A.160
CL loop round points, and not here. SOILHT1A.161
C----------------------------------------------------------------------- SOILHT1A.162
ASOIL(NEXT_LEVEL) = -OMEGA1 * TIMESTEP / SOILHT1A.163
+ ( LAYER_DEPTH(NEXT_LEVEL) * SOILHT1A.164
+ (LAYER_DEPTH(THIS_LEVEL) + LAYER_DEPTH(NEXT_LEVEL)) ) SOILHT1A.165
BSOIL(THIS_LEVEL) = OMEGA1 * TIMESTEP / SOILHT1A.166
+ ( LAYER_DEPTH(THIS_LEVEL) * SOILHT1A.167
+ (LAYER_DEPTH(THIS_LEVEL) + LAYER_DEPTH(NEXT_LEVEL)) ) SOILHT1A.168
1 CONTINUE SOILHT1A.169
BSOIL(NSOIL)=0.0 SOILHT1A.170
CMIC$ DO ALL VECTOR SHARED(P_POINTS, P1, P_FIELD, LAND_MASK, SOILHT1A.171
CMIC$1 SOIL_HT_FLUX) PRIVATE(J) SOILHT1A.172
CDIR$ IVDEP SOILHT1A.173
! Fujitsu vectorization directive GRB0F405.527
!OCL NOVREC GRB0F405.528
DO 2 J=P1,P1+P_POINTS-1 SOILHT1A.174
C----------------------------------------------------------------------- SOILHT1A.175
CL 2. Set soil heat flux to zero over sea points (including sea-ice). SOILHT1A.176
C----------------------------------------------------------------------- SOILHT1A.177
IF (.NOT.LAND_MASK(J)) THEN SOILHT1A.178
SOIL_HT_FLUX(J)=0.0 SOILHT1A.179
ENDIF ! (If a land point.) SOILHT1A.184
2 CONTINUE SOILHT1A.185
CMIC$ DO ALL VECTOR SHARED(LAND_PTS, LAND1,TIMESTEP, Z2_PLUS_1, P_FIELD, SOILHT1A.186
CMIC$1 LAND_FIELD, SOIL_HT_FLUX, HCON, HCAP, ASOIL_1, LYING_SNOW, SOILHT1A.187
CMIC$2 T_DEEP_SOIL, TSTAR, DELT1, BSOIL, DELT2, ASOIL, LAND_INDEX) SOILHT1A.188
CMIC$3 PRIVATE(SIFACT, I, J, DS_RATIO) SOILHT1A.189
CDIR$ IVDEP SOILHT1A.190
! Fujitsu vectorization directive GRB0F405.529
!OCL NOVREC GRB0F405.530
DO 21 I=LAND1,LAND1+LAND_PTS-1 SOILHT1A.191
J = LAND_INDEX(I) SOILHT1A.192
C----------------------------------------------------------------------- SOILHT1A.194
CL 3. Land point calculations multi-soil-layer model. SOILHT1A.195
C----------------------------------------------------------------------- SOILHT1A.196
C----------------------------------------------------------------------- SOILHT1A.197
CL 3.1 Set A1 - see eqns P242.11, P242.14 Units: J-1 m2 K * timestep. SOILHT1A.198
CL (The variable here is set to A1 * timestep.) SOILHT1A.199
C----------------------------------------------------------------------- SOILHT1A.200
ASOIL_1(J) = SQRT( OMEGA1 / (2.0 * HCON(I) * HCAP(I)) ) SOILHT1A.201
+ * TIMESTEP SOILHT1A.202
C----------------------------------------------------------------------- SOILHT1A.203
CL 3.2 Initialise factor used to modify conductivity coefficients in SOILHT1A.204
CL the presence of lying snow (Snow Insulation FACTor). SOILHT1A.205
C----------------------------------------------------------------------- SOILHT1A.206
SIFACT=1.0 SOILHT1A.207
C----------------------------------------------------------------------- SOILHT1A.208
CL 3.3 Calculate factor which modifies the thermal conductivity between SOILHT1A.209
CL the top two subsurface layers in order to represent the insulating SOILHT1A.210
CL effects of lying snow. See eqn P242.19. SOILHT1A.211
C Note that Z2_PLUS_1 is in fact (1+ZETA2), as the depth of the top SOILHT1A.212
C soil layer is by definition (of the units) 1.0. SOILHT1A.213
C Also note, LYING_SNOW is held on the whole grid, not just land pts SOILHT1A.215
C----------------------------------------------------------------------- SOILHT1A.217
IF (LYING_SNOW(J).GT.0.0) THEN SOILHT1A.218
DS_RATIO = 2.0 * SOILHT1A.219
+ LYING_SNOW(J) / (RHO_SNOW) ! Actual depth of lying snow SOILHT1A.220
C ! in metres. SOILHT1A.221
+ * SOILHT1A.222
+ ( ASOIL_1(J) * HCAP(I) ! Reciprocal of thickness of top SOILHT1A.223
+ / TIMESTEP ) ! soil layer in metres. Equivalent SOILHT1A.224
C ! formula for thickness :- SOILHT1A.225
C ! SQRT(2*HCON/(HCAP*OMEGA1)). SOILHT1A.226
C SOILHT1A.227
IF (DS_RATIO.LE.1.0) THEN SOILHT1A.228
SIFACT = 1.0 / (1.0 + DS_RATIO/Z2_PLUS_1) SOILHT1A.229
ELSEIF (LYING_SNOW(J) .LT. 5.0E3) THEN ! See below *** SOILHT1A.230
SIFACT = Z2_PLUS_1 / ( SOILHT1A.231
+ (HCON(I)/SNOW_HCON) * (DS_RATIO-1.0) SOILHT1A.232
+ + 1.0 + Z2_PLUS_1 SOILHT1A.233
+ ) SOILHT1A.234
ELSE ! *** See final paragraph of P242 documentation. SOILHT1A.235
SIFACT=1.0 SOILHT1A.236
ENDIF ! DSRATIO <= 0 SOILHT1A.237
ENDIF ! Lying snow SOILHT1A.238
C----------------------------------------------------------------------- SOILHT1A.239
CL 3.4 Calculate heat flux from top to next-to-top soil layer (+ve SOILHT1A.240
CL downwards), in Watts per square metre. See eqn P242.8 (middle SOILHT1A.241
CL line), as modified according to P242.21. SOILHT1A.242
C----------------------------------------------------------------------- SOILHT1A.243
DELT1(I) = T_DEEP_SOIL(I,1) - TSTAR(J) SOILHT1A.244
SOIL_HT_FLUX(J) = -SIFACT SOILHT1A.245
+ * ( BSOIL(1)/(ASOIL_1(J)) ) SOILHT1A.246
+ * DELT1(I) SOILHT1A.247
C----------------------------------------------------------------------- SOILHT1A.248
CL 3.5 Update deep soil temperatures. SOILHT1A.249
C----------------------------------------------------------------------- SOILHT1A.250
CL 3.6 Update first deep soil layer (i.e. soil layer 2). This is done SOILHT1A.251
CL separately because of the need to modify ASOIL(2) to account for SOILHT1A.252
CL snow insulation. Eqn P242.3, modified according to P242.20. SOILHT1A.253
C----------------------------------------------------------------------- SOILHT1A.254
DELT2(I) = T_DEEP_SOIL(I,2) - T_DEEP_SOIL(I,1) SOILHT1A.255
T_DEEP_SOIL(I,1) = T_DEEP_SOIL(I,1) + SOILHT1A.256
+ SIFACT * ASOIL(2) * DELT1(I) + SOILHT1A.257
+ BSOIL(2)*DELT2(I) SOILHT1A.258
DELT1(I)=DELT2(I) SOILHT1A.259
21 CONTINUE SOILHT1A.264
C----------------------------------------------------------------------- SOILHT1A.266
CL 3.7 Update deep soil layers 2 to (NSOIL-2), i.e. soil layers 3 to SOILHT1A.267
CL NSOIL-1, if these layers exist in the current model. Eqn P242.3. SOILHT1A.268
C Loop counter (THIS_LEVEL) ranges over deep soil layers. SOILHT1A.269
C----------------------------------------------------------------------- SOILHT1A.270
IF (NSOIL.GT.3) THEN SOILHT1A.271
DO 3 THIS_LEVEL = 2,NSOIL-2 SOILHT1A.272
NEXT_LEVEL = THIS_LEVEL + 1 SOILHT1A.273
CMIC$ DO ALL VECTOR SHARED(LAND_PTS, LAND1, NEXT_LEVEL, THIS_LEVEL SOILHT1A.274
CMIC$1 , LAND_FIELD, LAND_MASK, NSOIL, T_DEEP_SOIL, DELT2, ASOIL SOILHT1A.275
CMIC$2 , DELT1, BSOIL) PRIVATE(I) SOILHT1A.276
CDIR$ IVDEP SOILHT1A.277
! Fujitsu vectorization directive GRB0F405.531
!OCL NOVREC GRB0F405.532
DO 31 I=LAND1,LAND1+LAND_PTS-1 SOILHT1A.283
DELT2(I) = T_DEEP_SOIL(I,NEXT_LEVEL) SOILHT1A.285
+ - T_DEEP_SOIL(I,THIS_LEVEL) SOILHT1A.286
T_DEEP_SOIL(I,THIS_LEVEL)=T_DEEP_SOIL(I,THIS_LEVEL) SOILHT1A.287
+ + ASOIL(NEXT_LEVEL) * DELT1(I) SOILHT1A.288
+ + BSOIL(NEXT_LEVEL) * DELT2(I) SOILHT1A.289
DELT1(I)=DELT2(I) SOILHT1A.290
31 CONTINUE SOILHT1A.294
3 CONTINUE SOILHT1A.295
ENDIF SOILHT1A.296
C----------------------------------------------------------------------- SOILHT1A.297
CL 3.8 Update deepest soil layer temperature, if this hasn't been done SOILHT1A.298
CL already. This is done separately simply to avoid an IF in the SOILHT1A.299
CL DO 2 loop (there is obviously no next-layer temperature for the SOILHT1A.300
CL bottom layer). See eqn P242.4. SOILHT1A.301
C----------------------------------------------------------------------- SOILHT1A.302
IF (NSOIL.GT.2) THEN SOILHT1A.303
CMIC$ DO ALL VECTOR SHARED(LAND_PTS, LAND1, NSOIL, LAND_FIELD, SOILHT1A.304
CMIC$1 LAND_MASK, T_DEEP_SOIL, ASOIL, DELT1) PRIVATE(I) SOILHT1A.305
CDIR$ IVDEP SOILHT1A.306
! Fujitsu vectorization directive GRB0F405.533
!OCL NOVREC GRB0F405.534
DO 4 I=LAND1,LAND1+LAND_PTS-1 SOILHT1A.312
T_DEEP_SOIL(I,NSOIL-1) = T_DEEP_SOIL(I,NSOIL-1) SOILHT1A.314
+ + ASOIL(NSOIL) * DELT1(I) SOILHT1A.315
4 CONTINUE SOILHT1A.319
ENDIF SOILHT1A.320
C----------------------------------------------------------------------- SOILHT1A.321
CL 4. Finally, tidy up for the remaining case. SOILHT1A.322
C----------------------------------------------------------------------- SOILHT1A.323
ELSE ! (If 1-layer soil scheme). SOILHT1A.324
CMIC$ DO ALL VECTOR SHARED(P_POINTS,P1,P_FIELD,SOIL_HT_FLUX)PRIVATE(J) SOILHT1A.325
CDIR$ IVDEP SOILHT1A.326
! Fujitsu vectorization directive GRB0F405.535
!OCL NOVREC GRB0F405.536
DO 5 J=P1,P1+P_POINTS-1 SOILHT1A.327
SOIL_HT_FLUX(J)=0.0 SOILHT1A.328
5 CONTINUE SOILHT1A.329
ENDIF ! ENDIF for > 1 soil layer. SOILHT1A.330
6 CONTINUE ! Branch for error exit. SOILHT1A.332
IF (LTIMER) THEN ASJ1F304.409
CALL TIMER
('SOILHTF ',104) GPB8F405.34
ENDIF ASJ1F304.410
RETURN SOILHT1A.337
END SOILHT1A.338
*ENDIF SOILHT1A.339