*IF DEF,A03_3A ASJ4F401.11
C ******************************COPYRIGHT****************************** GTS2F400.8839
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.8840
C GTS2F400.8841
C Use, duplication or disclosure of this code is subject to the GTS2F400.8842
C restrictions as set forth in the contract. GTS2F400.8843
C GTS2F400.8844
C Meteorological Office GTS2F400.8845
C London Road GTS2F400.8846
C BRACKNELL GTS2F400.8847
C Berkshire UK GTS2F400.8848
C RG12 2SZ GTS2F400.8849
C GTS2F400.8850
C If no contract has been raised with this copy of the code, the use, GTS2F400.8851
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.8852
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.8853
C Modelling at the above address. GTS2F400.8854
C ******************************COPYRIGHT****************************** GTS2F400.8855
C GTS2F400.8856
C*LL SUBROUTINE SF_EXCH------------------------------------------------ SFEXCH3A.3
CLL SFEXCH3A.4
CLL Purpose: Calculate coefficients of turbulent exchange between SFEXCH3A.5
CLL the surface and the lowest atmospheric layer, and SFEXCH3A.6
CLL "explicit" fluxes between the surface and this layer. SFEXCH3A.7
CLL SFEXCH3A.8
CLL Suitable for Single Column use if *IF definition IBM is selected. SFEXCH3A.9
CLL SFEXCH3A.10
CLL Canopy evaporation made implicit SFEXCH3A.11
CLL with respect to canopy water content (requiring TIMESTEP to be SFEXCH3A.12
CLL passed in). SFEXCH3A.13
CLL SFEXCH3A.14
CLL CW, FH <- programmer of some or all of previous code or changes SFEXCH3A.15
CLL SFEXCH3A.16
CLL Model Modification history: SFEXCH3A.17
CLL version Date SFEXCH3A.18
CLL 3.4 18/10/94 *DECK inserted into UM version 3.4. S Jackson SFEXCH3A.19
CLL SFEXCH3A.20
CLL 4.0 05/01/95 rhostar*cD*vshr before interpolation output ASJ1F400.22
CLL via argument list. R.N.B.Smith ASJ1F400.23
CLL ASJ1F400.24
CLL 4.0 30/12/94 Changes to formulation of cH and 10m wind ARN1F400.7
CLL diagnostic; z0h set to z0(veg). ARN1F400.8
CLL R.N.B.Smith ARN1F400.9
CLL 4.1 08/05/96 decks A03_2C and A03_3B removed ASJ4F401.12
CLL S D Jackson ASJ4F401.13
CLL ARN1F400.10
CLL 4.1 08/05/96 Logical switch for rapidly mixing boundary layer ASJ3F401.10
CLL S D Jackson ASJ3F401.11
CLL ASJ3F401.12
!LL 4.1 12/7/96 Added MPP code P.Burton APBGF401.94
CLL 4.2 Oct. 96 T3E migration - *DEF CRAY removed, WHENIMD removed GSS1F402.70
CLL S J Swarbrick GSS1F402.71
!LL 4.3 14/01/97 MPP code : Corrected setting of polar rows GPB1F403.5
!LL P.Burton GPB1F403.6
CLL 4.3 09/06/97 Add swapbounds for RHOKM_1 & CDR10M. ASJ1F403.6
CLL D.Sexton/RTHBarnes ASJ1F403.7
CLL 4.4 08/09/97 L_BL_LSPICE specifies mixed phase precipitation ADM3F404.219
CLL scheme. D. Wilson ADM3F404.220
CLL 4.5 Jul. 98 Kill the IBM specific lines (JCThil) AJC1F405.110
CLL Programming standard: Unified Model Documentation Paper No 4, SFEXCH3A.21
CLL Version 2, dated 18/1/90. SFEXCH3A.22
CLL SFEXCH3A.23
CLL System component covered: Part of P243. SFEXCH3A.24
CLL SFEXCH3A.25
CLL Project task: SFEXCH3A.26
CLL SFEXCH3A.27
CLL Documentation: UM Documentation Paper No 24, section P243. SFEXCH3A.28
CLL See especially sub-section (ix). SFEXCH3A.29
CLL SFEXCH3A.30
CLLEND------------------------------------------------------------------ SFEXCH3A.31
C* SFEXCH3A.32
C*L Arguments --------------------------------------------------------- SFEXCH3A.33
SUBROUTINE SF_EXCH ( 4,99SFEXCH3A.34
+ P_POINTS,LAND_PTS,U_POINTS,ROW_LENGTH,P_ROWS,U_ROWS SFEXCH3A.35
+,LAND_INDEX,P1,GATHER SFEXCH3A.37
+,AK_1,BK_1,TIMESTEP SFEXCH3A.39
+,CANOPY,CATCH,CF_1,ICE_FRACT,LAND_MASK,PSTAR,Q_1 SFEXCH3A.40
+,QCF_1,QCL_1,RESIST,ROOTD,SMC,SMVCCL,SMVCWT,LYING_SNOW,T_1,TSTAR SFEXCH3A.41
+,U_1,V_1,U_1_P,V_1_P,U_0,V_0,Z0V,SIL_OROG,Z1,Z0MSEA,HO2R2_OROG SFEXCH3A.42
&,BQ_1,BT_1,BF_1,CD,CH,EA,ES,ESL,FQW_1,FQW_LEAD,FTL_1,FTL_LEAD ADM3F404.221
+,TAUX_1,TAUY_1,QW_1,RHOKE,RHOKEA,RHOKES,RHOKESL,RHOKH_1,RHOKM_1 SFEXCH3A.44
+,RIB,TL_1,TSTAR_NL,VSHR,Z0H,Z0M,Z0M_EFF,H_BLEND ARN1F400.11
&,T1_SD,Q1_SD SFEXCH3A.46
&,RHO_CD_MODV1 ASJ1F400.25
+,CDR10M,CHR1P5M,CER1P5M,FME SFEXCH3A.47
+,SU10,SV10,SQ1P5,ST1P5,SFME SFEXCH3A.48
+,NRML SFEXCH3A.49
&,L_Z0_OROG,L_RMBL,L_BL_LSPICE,ERROR,LTIMER ADM3F404.222
*IF DEF,SCMA AJC0F405.77
& ,FACTOR_RHOKH,OBS AJC0F405.78
*ENDIF AJC0F405.79
+) SFEXCH3A.51
IMPLICIT NONE SFEXCH3A.52
C SFEXCH3A.53
C Input variables. All fields are on P grid except where noted. SFEXCH3A.54
C Fxxx in a comment indicates the file from which the data are taken. SFEXCH3A.55
C SFEXCH3A.56
C SFEXCH3A.58
C GENERAL NOTES ABOUT GRID-DEFINITION INPUT VARIABLES. SFEXCH3A.59
C ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ SFEXCH3A.60
C For global data :- SFEXCH3A.61
C SFEXCH3A.62
C An Arakawa B-grid is assumed in which each pole is represented by a SFEXCH3A.63
C row of P-grid points. These polar rows are omitted in the input and SFEXCH3A.64
C output of the present subroutine, so that the argument P_ROWS is two SFEXCH3A.65
C less than the total number of P-rows in the grid. Land specific SFEXCH3A.66
C variables that are required as INput by the higher level routine, SFEXCH3A.67
C BDY_LAYR, are stored on P_grid land points only and land pts on polar SFEXCH3A.68
C rows are not input or output by this routine ; diagnostic variables SFEXCH3A.69
C must be defined on land and sea points for post processing. SFEXCH3A.70
C If defined variable IBM is selected then land point calculations are SFEXCH3A.71
C performed using the array LAND_INDEX to select land points. But note SFEXCH3A.72
C that elements of LAND_INDEX define land points on the full field SFEXCH3A.73
C (ie including polar rows). SFEXCH3A.74
C SFEXCH3A.75
C Entire fields of UV-grid values are taken as input, but the two SFEXCH3A.76
C polemost rows are (a) not updated, in the case of INOUT fields, or SFEXCH3A.77
C (b) set to zero, in the case of OUT fields. SFEXCH3A.78
C SFEXCH3A.79
C For limited-area data :- SFEXCH3A.80
C SFEXCH3A.81
C The above applies, but for "polar rows", etc., read "rows at the SFEXCH3A.82
C north and south boundaries of the area", etc. E.g. if you want to SFEXCH3A.83
C do calculations in UV-rows n to m inclusive, the input data will be SFEXCH3A.84
C on P-rows n to m+1, and UV-rows n-1 to m+1. P-rows n to m will SFEXCH3A.85
C then be updated. Land specific variables are processed as for global SFEXCH3A.86
C data. SFEXCH3A.87
C SFEXCH3A.88
C For both cases, the following equalities apply amongst the input SFEXCH3A.89
C grid-definition variables :- SFEXCH3A.90
C SFEXCH3A.91
C P_POINTS = P_ROWS * ROW_LENGTH SFEXCH3A.92
C U_POINTS = U_ROWS * ROW_LENGTH SFEXCH3A.93
C U_ROWS = P_ROWS + 1 SFEXCH3A.94
C LAND_PTS <= P_POINTS SFEXCH3A.95
C SFEXCH3A.96
C An error condition is returned if the input variables don't satisfy SFEXCH3A.97
C these equalities. (There is of course redundancy here; a compromise SFEXCH3A.98
C between economy, clarity and easy dimensioning is intended.) SFEXCH3A.99
C SFEXCH3A.100
C NB: All this has severe implications for batching/macrotasking; SFEXCH3A.101
C effectively it can't be done on a shared-memory machine without SFEXCH3A.102
C either rewriting this routine or using expensive synchronizations SFEXCH3A.103
C (or other messy and/or undesirable subterfuges). SFEXCH3A.104
C SFEXCH3A.105
C SFEXCH3A.120
LOGICAL LTIMER SFEXCH3A.121
*IF DEF,SCMA AJC0F405.80
LOGICAL OBS ! Switch for OBS forcing AJC0F405.81
*ENDIF AJC0F405.82
C SFEXCH3A.122
INTEGER ! Variables defining grid. SFEXCH3A.123
+ P_POINTS ! IN Number of P-grid points to be processed. SFEXCH3A.124
+,LAND_PTS ! IN Number of land points to be processed. SFEXCH3A.125
+,U_POINTS ! IN Number of UV-grid points. SFEXCH3A.126
+,ROW_LENGTH ! IN No. of points in latitude row (inclusive SFEXCH3A.130
C ! of endpoints for ltd. area model). SFEXCH3A.131
+,P_ROWS ! IN Number of rows of data on P-grid. SFEXCH3A.135
+,U_ROWS ! IN Number of rows of data on UV-grid. SFEXCH3A.139
+,LAND_INDEX(LAND_PTS)! IN Index for compressed land point array; SFEXCH3A.143
C ! ith element holds position in the FULL SFEXCH3A.144
C ! field of the ith land pt to be processed SFEXCH3A.145
+,P1 ! IN First P-point to be processed. SFEXCH3A.146
LOGICAL SFEXCH3A.147
+ GATHER ! IN If true then leads variables are comp- SFEXCH3A.148
C ! ressed for sea-ice calculations. This SFEXCH3A.149
C ! saves duplicating calculations if there SFEXCH3A.150
C ! are a relatively few of sea-ice points. SFEXCH3A.151
C ! Set to false for a limited area run SFEXCH3A.152
C ! with a high proportion of sea-ice. SFEXCH3A.153
REAL SFEXCH3A.155
+ AK_1 ! IN Hybrid "A" for lowest model layer. SFEXCH3A.156
+,BK_1 ! IN Hybrid "B" for lowest model layer. SFEXCH3A.157
+,TIMESTEP ! IN Timestep in seconds for EPDT calc. SFEXCH3A.158
+,CANOPY(LAND_PTS) ! IN Surface water (kg per sq metre). F642. SFEXCH3A.159
+,CATCH(LAND_PTS) ! IN Surface capacity (max. surface water) SFEXCH3A.160
C ! (kg per sq metre). F6416. SFEXCH3A.161
+,CF_1(P_POINTS) ! IN Cloud fraction for lowest atmospheric SFEXCH3A.162
C ! layer (decimal fraction). SFEXCH3A.163
*IF DEF,SCMA AJC0F405.83
& ,FACTOR_RHOKH(P_FIELD) ! IN Factor for modifying surface AJC0F405.84
! fluxes if OBS forcing used AJC0F405.85
AJC0F405.86
C AJC0F405.87
C If OBS run use RHOKH_1 and FACTOR_RHOKH AJC0F405.88
C (from FLUX_H and FLUX_E input by namelist) AJC0F405.89
C AJC0F405.90
If (.NOT.OBS) AJC0F405.91
& RHOKH_1(I) = RHOSTAR * CH(I) * VSHR(I) AJC0F405.92
*ENDIF AJC0F405.93
+,ICE_FRACT(P_POINTS) ! IN Fraction of gridbox which is sea-ice. SFEXCH3A.164
+,LYING_SNOW(P_POINTS)! IN Lying snow amount (kg per sq metre). SFEXCH3A.165
+,PSTAR(P_POINTS) ! IN Surface pressure (Pascals). SFEXCH3A.166
+,Q_1(P_POINTS) ! IN Specific humidity for lowest atmospheric SFEXCH3A.167
C ! layer (kg water per kg air). SFEXCH3A.168
+,QCF_1(P_POINTS) ! IN Cloud ice for lowest atmospheric layer SFEXCH3A.169
C ! (kg water per kg air). SFEXCH3A.170
+,QCL_1(P_POINTS) ! IN Cloud liquid water for lowest atm layer SFEXCH3A.171
C ! (kg water per kg air). SFEXCH3A.172
+,RESIST(LAND_PTS) ! IN "Stomatal" resistance to evaporation SFEXCH3A.173
C ! (seconds per metre). F6415. SFEXCH3A.174
+,ROOTD(LAND_PTS) ! IN "Root depth" (metres). F6412. SFEXCH3A.175
+,SMC(LAND_PTS) ! IN Soil moisture content (kg per sq m). SFEXCH3A.176
C ! F621. SFEXCH3A.177
+,SMVCCL(LAND_PTS) ! IN Critical volumetric SMC (cubic metres SFEXCH3A.178
C ! per cubic metre of soil). F6232. SFEXCH3A.179
+,SMVCWT(LAND_PTS) ! IN Volumetric wilting point (cubic m of SFEXCH3A.180
C ! water per cubic m of soil). F6231. SFEXCH3A.181
C SFEXCH3A.182
C Note: (SMVCCL - SMVCWT) is the critical volumetric available soil SFEXCH3A.183
C moisture content. ~~~~~~~~~ SFEXCH3A.184
C SFEXCH3A.185
REAL ! (Split to avoid > 19 continuations.) SFEXCH3A.186
+ T_1(P_POINTS) ! IN Temperature for lowest atmospheric layer SFEXCH3A.187
C ! (Kelvin). SFEXCH3A.188
+,TSTAR(P_POINTS) ! IN Mean gridsquare surface temperature (K). SFEXCH3A.189
+,U_1(U_POINTS) ! IN West-to-east wind component for lowest SFEXCH3A.190
C ! atmospheric layer (m/s). On UV grid. SFEXCH3A.191
+,V_1(U_POINTS) ! IN South-to-north wind component for lowest SFEXCH3A.192
C ! atmospheric layer (m/s). On UV grid. SFEXCH3A.193
+,U_1_P(P_POINTS) ! IN West-to-east wind component for lowest SFEXCH3A.194
C ! atmospheric layer (m/s). On P grid. SFEXCH3A.195
+,V_1_P(P_POINTS) ! IN South-to-north wind component for lowest SFEXCH3A.199
C ! atmospheric layer (m/s). On P grid. SFEXCH3A.200
+,U_0(U_POINTS) ! IN West-to-east component of ocean surface SFEXCH3A.204
C ! current (m/s; ASSUMED zero over land). SFEXCH3A.205
C ! UV grid. F615. SFEXCH3A.206
+,V_0(U_POINTS) ! IN South-to-north component of ocean surface SFEXCH3A.207
C ! current (m/s; ASSUMED zero over land). SFEXCH3A.208
C ! UV grid. F616. SFEXCH3A.209
+,Z0V(P_POINTS) ! IN Vegetative roughness length (m). F6418. SFEXCH3A.210
+,SIL_OROG(LAND_PTS) ! IN Silhouette area of unresolved orography SFEXCH3A.211
C ! per unit horizontal area SFEXCH3A.212
+,Z1(P_POINTS) ! IN Height of lowest atmospheric level (m). SFEXCH3A.213
&,HO2R2_OROG(LAND_PTS) ! IN Peak to trough height of unresolved SFEXCH3A.214
C ! orography devided by 2SQRT(2) (m). SFEXCH3A.215
LOGICAL SFEXCH3A.216
+ LAND_MASK(P_POINTS) ! IN .TRUE. for land; .FALSE. elsewhere. F60. SFEXCH3A.217
+,SU10 ! IN STASH flag for 10-metre W wind. SFEXCH3A.218
+,SV10 ! IN STASH flag for 10-metre S wind. SFEXCH3A.219
+,SQ1P5 ! IN STASH flag for 1.5-metre sp humidity. SFEXCH3A.220
+,ST1P5 ! IN STASH flag for 1.5-metre temperature. SFEXCH3A.221
+,SFME ! IN STASH flag for wind mixing energy flux. SFEXCH3A.222
+,L_Z0_OROG ! IN .TRUE. to use orographic roughness. SFEXCH3A.223
+,L_RMBL ! IN .TRUE. to use rapidly mixing boundary ASJ3F401.13
C ! scheme ASJ3F401.14
&,L_BL_LSPICE ! IN ADM3F404.223
! TRUE Use scientific treatment of mixed ADM3F404.224
! phase precip scheme. ADM3F404.225
! FALSE Do not use mixed phase precip ADM3F404.226
! considerations ADM3F404.227
C SFEXCH3A.224
C Modified (INOUT) variables. SFEXCH3A.225
C SFEXCH3A.226
REAL SFEXCH3A.227
+ Z0MSEA(P_POINTS) ! INOUT Sea-surface roughness length for SFEXCH3A.228
C ! momentum (m). F617. SFEXCH3A.229
C SFEXCH3A.230
C Output variables. SFEXCH3A.231
C SFEXCH3A.232
REAL SFEXCH3A.233
+ BQ_1(P_POINTS) ! OUT A buoyancy parameter for lowest atm level SFEXCH3A.234
C ! ("beta-q twiddle"). SFEXCH3A.235
+,BT_1(P_POINTS) ! OUT A buoyancy parameter for lowest atm level. SFEXCH3A.236
C ! ("beta-T twiddle"). SFEXCH3A.237
&,BF_1(P_POINTS) ADM3F404.228
! OUT A buoyancy parameter for lowest atm level. ADM3F404.229
! ("beta-F twiddle"). ADM3F404.230
+,CD(P_POINTS) ! OUT Bulk transfer coefficient for momentum. SFEXCH3A.238
+,CH(P_POINTS) ! OUT Bulk transfer coefficient for heat and/or SFEXCH3A.239
C ! moisture. SFEXCH3A.240
+,CDR10M(U_POINTS) ! OUT Reqd for calculation of 10m wind (u & v). SFEXCH3A.241
C ! NBB: This is output on the UV-grid, but SFEXCH3A.242
C ! with the first and last rows set to a SFEXCH3A.243
C ! "missing data indicator". SFEXCH3A.244
C ! Sea-ice leads ignored. See 3.D.7 below. SFEXCH3A.245
+,CHR1P5M(P_POINTS) ! OUT Reqd for calculation of 1.5m temperature. SFEXCH3A.246
C ! Sea-ice leads ignored. See 3.D.7 below. SFEXCH3A.247
+,CER1P5M(P_POINTS) ! OUT Reqd for calculation of 1.5m sp humidity. SFEXCH3A.248
C ! Sea-ice leads ignored. See 3.D.7 below. SFEXCH3A.249
&,RHO_CD_MODV1(P_POINTS) ASJ1F400.26
C ! OUT rhostar*cD*vshr before horizontal ASJ1F400.27
C ! interpolation output as a diagnostic. ASJ1F400.28
+,EA(P_POINTS) ! OUT "Explicit" evaporation with only aero- SFEXCH3A.250
C ! dynamic resistance (+ve), or condensation SFEXCH3A.251
C ! (-ve), averaged over grid box (kg/m2/s). SFEXCH3A.252
+,ES(P_POINTS) ! OUT "Explicit" evapotranspiration through a SFEXCH3A.253
C ! non-aerodynamic resistance. Always non- SFEXCH3A.254
C ! negative (kg/m2/s). SFEXCH3A.255
+,ESL(P_POINTS) ! OUT ES without fractional weighting factor SFEXCH3A.256
C ! "L" is for "local". SFEXCH3A.257
REAL ! (Split to avoid > 19 continuations.) SFEXCH3A.258
+ FQW_1(P_POINTS) ! OUT "Explicit" surface flux of QW (i.e. SFEXCH3A.259
C ! evaporation), on P-grid (kg/m2/s). SFEXCH3A.260
+,FQW_LEAD(P_POINTS) ! OUT FQW for leads fraction of gridsquare. SFEXCH3A.261
C ! Missing data indicator at non sea-ice. SFEXCH3A.262
+,FTL_1(P_POINTS) ! OUT "Explicit" surface flux of TL = H/CP. SFEXCH3A.263
C ! (sensible heat / CP). SFEXCH3A.264
+,FTL_LEAD(P_POINTS) ! OUT FTL for leads fraction of gridsquare, SFEXCH3A.265
C ! Missing data indicator at non sea-ice. SFEXCH3A.266
+,TAUX_1(U_POINTS) ! OUT "Explicit" x-component of surface SFEXCH3A.267
C ! turbulent stress; on UV-grid; first and SFEXCH3A.268
C ! last rows set to a "missing data SFEXCH3A.269
C ! indicator". (Newtons per square metre) SFEXCH3A.270
+,TAUY_1(U_POINTS) ! OUT "Explicit" y-component of surface SFEXCH3A.271
C ! turbulent stress; on UV-grid; first and SFEXCH3A.272
C ! last rows set to a "missing data SFEXCH3A.273
C ! indicator". (Newtons per square metre) SFEXCH3A.274
+,QW_1(P_POINTS) ! OUT Total water content of lowest SFEXCH3A.275
C ! atmospheric layer (kg per kg air). SFEXCH3A.276
C SFEXCH3A.277
REAL ! Surface exchange coefficients;passed to subroutine IMPL_CAL SFEXCH3A.278
+ RHOKE(P_POINTS) ! OUT For FQW, then *GAMMA(1) for implicit calcs SFEXCH3A.279
+,RHOKEA(P_POINTS) ! OUT For EA, then *GAMMA(1) for implicit calcs. SFEXCH3A.280
+,RHOKES(P_POINTS) ! OUT For ES, then *GAMMA(1) for implicit calcs SFEXCH3A.281
+,RHOKESL(P_POINTS) ! OUT For ESL,then *GAMMA(1) for implicit calcs SFEXCH3A.282
+,RHOKH_1(P_POINTS) ! OUT For FTL,then *GAMMA(1) for implicit calcs SFEXCH3A.283
+,RHOKM_1(U_POINTS) ! OUT For momentum, then *GAMMA(1) for implicit SFEXCH3A.284
C ! calculations. NBB: This is output on the SFEXCH3A.285
C ! UV-grid, but with the first and last SFEXCH3A.286
C ! rows set to a "missing data indicator". SFEXCH3A.287
REAL ! End of surface exchange coefficients. SFEXCH3A.288
+ RIB(P_POINTS) ! OUT Bulk Richardson number for lowest layer. SFEXCH3A.289
+,TL_1(P_POINTS) ! OUT Liquid/frozen water temperature for SFEXCH3A.290
C ! lowest atmospheric layer (K). SFEXCH3A.291
+,TSTAR_NL(P_POINTS) ! OUT TSTAR No Leads: surface temperature SFEXCH3A.292
C ! over sea-ice fraction of gridsquare. SFEXCH3A.293
C ! =TSTAR over non sea-ice points. SFEXCH3A.294
+,VSHR(P_POINTS) ! OUT Magnitude of surface-to-lowest-lev. wind SFEXCH3A.295
+,Z0H(P_POINTS) ! OUT Roughness length for heat and moisture m SFEXCH3A.296
+,Z0M(P_POINTS) ! OUT Roughness length for momentum (m). SFEXCH3A.297
+,Z0M_EFF(P_POINTS) ! OUT Effective roughness length for momentum SFEXCH3A.298
+,H_BLEND(P_POINTS) ! OUT Blending height SFEXCH3A.301
&,T1_SD(P_POINTS) ! OUT Standard deviation of turbulent SFEXCH3A.302
C ! fluctuations of surface layer SFEXCH3A.303
C ! temperature (K). SFEXCH3A.304
&,Q1_SD(P_POINTS) ! OUT Standard deviation of turbulent SFEXCH3A.305
C ! fluctuations of surface layer SFEXCH3A.306
C ! specific humidity (kg/kg). SFEXCH3A.307
+,FME(P_POINTS) ! OUT Wind mixing energy flux (Watts/sq m). SFEXCH3A.308
INTEGER SFEXCH3A.309
+ NRML(P_POINTS) ! OUT 1 if surface layer unstable, else 0. SFEXCH3A.310
+,ERROR ! OUT 1 if grid definition faulty; else 0. SFEXCH3A.311
C* SFEXCH3A.312
C*L Symbolic constants ------------------------------------------------ SFEXCH3A.313
C SFEXCH3A.314
C (1) UM-wide common parameters. SFEXCH3A.315
C SFEXCH3A.316
*CALL C_0_DG_C
SFEXCH3A.317
*CALL C_LHEAT
SFEXCH3A.318
*CALL C_G
SFEXCH3A.319
*CALL C_R_CP
SFEXCH3A.320
*CALL C_EPSLON
SFEXCH3A.321
*CALL C_VKMAN
SFEXCH3A.322
C SFEXCH3A.323
C (2) Boundary Layer local parameters. SFEXCH3A.324
C SFEXCH3A.325
*CALL C_CHARNK
SFEXCH3A.326
*CALL C_DENSTY
SFEXCH3A.327
*CALL C_GAMMA
SFEXCH3A.328
*CALL C_HT_M
SFEXCH3A.329
*CALL C_ROUGH
SFEXCH3A.330
*CALL C_SURF
SFEXCH3A.331
*CALL C_MDI
SFEXCH3A.332
C SFEXCH3A.333
C (3) Derived local parameters. SFEXCH3A.334
C SFEXCH3A.335
REAL ETAR,GRCP,LCRCP,LFRCP,LS,LSRCP,H_BLEND_MIN,H_BLEND_MAX ARN1F400.12
PARAMETER ( SFEXCH3A.337
+ ETAR=1./(1.-EPSILON) ! Used in calc of buoyancy parameter BETAC. SFEXCH3A.338
+,GRCP=G/CP ! Used in calc of dT across surface layer. SFEXCH3A.339
+,LCRCP=LC/CP ! Evaporation-to-dT conversion factor. SFEXCH3A.340
+,LFRCP=LF/CP ! Freezing-to-dT conversion factor. SFEXCH3A.341
+,LS=LF+LC ! Latent heat of sublimation. SFEXCH3A.342
+,LSRCP=LS/CP ! Sublimation-to-dT conversion factor. SFEXCH3A.343
+,H_BLEND_MIN=0.0 ! Minimum blending height. SFEXCH3A.344
&,H_BLEND_MAX=1000.0 ! Maximum blending height (m). ARN1F400.13
+) SFEXCH3A.345
C* SFEXCH3A.346
*IF DEF,MPP GPB1F403.1
! MPP Common block GPB1F403.2
*CALL PARVARS
GPB1F403.3
*ENDIF GPB1F403.4
C*L SFEXCH3A.347
C External subprograms called. SFEXCH3A.348
C SFEXCH3A.349
EXTERNAL FCDCH,QSAT,QSAT_WAT,SFL_INT ADM3F404.231
*IF -DEF,SCMA AJC1F405.111
EXTERNAL P_TO_UV,UV_TO_P GSS1F403.52
*ENDIF SFEXCH3A.353
EXTERNAL TIMER SFEXCH3A.354
C* SFEXCH3A.355
C SFEXCH3A.356
C Define local storage. SFEXCH3A.357
C SFEXCH3A.358
C (a) Workspace. SFEXCH3A.359
C SFEXCH3A.360
C*L Workspace --------------------------------------------------------- SFEXCH3A.361
C 25 blocks of real workspace are required, as follows. SFEXCH3A.363
REAL SFEXCH3A.364
+ CD_LEAD(P_POINTS) ! Bulk transfer coefficient for momentum SFEXCH3A.365
C ! over sea-ice leads.Missing data over non SFEXCH3A.366
C ! sea-ice points.(Temporary store for Z0MIZ) SFEXCH3A.367
+,CD_MIZ(P_POINTS) ! Bulk transfer coefficient for momentum SFEXCH3A.368
C ! over the sea-ice Marginal Ice Zone. SFEXCH3A.369
C ! Missing data indicator over non sea-ice. SFEXCH3A.370
+,CH_LEAD(P_POINTS) ! Bulk transfer coefficient for heat and SFEXCH3A.371
C ! or moisture over sea ice leads. SFEXCH3A.372
C ! Missing data indicator over non sea-ice. SFEXCH3A.373
+,CH_MIZ(P_POINTS) ! Bulk transfer coefficient for heat and SFEXCH3A.374
C ! or moisture over the Marginal Ice Zone. SFEXCH3A.375
C ! Missing data indicator over non sea-ice. SFEXCH3A.376
+,CD_STD(P_POINTS) ! Local drag coefficient for SFEXCH3A.377
C ! calculation of interpolation coefficients SFEXCH3A.378
+,DQ(P_POINTS) ! Sp humidity difference between surface SFEXCH3A.385
C ! and lowest atmospheric level (Q1 - Q*). SFEXCH3A.386
C ! Holds value over sea-ice where ICE_FRACT SFEXCH3A.387
C ! >0 i.e. Leads contribution not included. SFEXCH3A.388
&,DQI(P_POINTS) ADM3F404.232
! Ice water difference between surface ADM3F404.233
! and lowest atmospheric level (Q1 - Q*). ADM3F404.234
! Holds value over sea-ice where ICE_FRACT ADM3F404.235
! >0 i.e. Leads contribution not included. ADM3F404.236
+,DQ_LEAD(P_POINTS) ! DQ for leads fraction of gridsquare. SFEXCH3A.389
C ! Missing data indicator over non sea-ice. SFEXCH3A.390
&,DQI_LEAD(P_POINTS) ADM3F404.237
! DQI for leads fraction of gridsquare. ADM3F404.238
! Missing data indicator over non sea-ice. ADM3F404.239
+,DTEMP(P_POINTS) ! Liquid/ice static energy difference SFEXCH3A.391
C ! between surface and lowest atmospheric SFEXCH3A.392
C ! level, divided by CP (a modified SFEXCH3A.393
C ! temperature difference). SFEXCH3A.394
C ! Holds value over sea-ice where ICE_FRACT SFEXCH3A.395
C ! >0 i.e. Leads contribution not included. SFEXCH3A.396
+,DTEMP_LEAD(P_POINTS) ! DTEMP for leads fraction of gridsquare. SFEXCH3A.397
C ! Missing data indicator over non sea-ice. SFEXCH3A.398
+,FRACA(P_POINTS) ! Fraction of surface moisture flux with SFEXCH3A.399
C ! only aerodynamic resistance. SFEXCH3A.400
+,PSIS(P_POINTS) ! Soil moisture availability factor. SFEXCH3A.401
+,QSL(P_POINTS) ! Saturated sp humidity at liquid/ice SFEXCH3A.402
C ! temperature and pressure of lowest SFEXCH3A.403
C ! atmospheric level. SFEXCH3A.404
+,QSTAR(P_POINTS) ! Surface saturated sp humidity. Holds SFEXCH3A.405
C ! value over sea-ice where ICE_FRACT > 0. SFEXCH3A.406
C ! i.e. Leads contribution not included. SFEXCH3A.407
+,QSTAR_LEAD(P_POINTS) ! QSTAR for sea-ice leads. SFEXCH3A.408
C ! Missing data indicator over non sea-ice. SFEXCH3A.409
+,RESFS(P_POINTS) ! Combined soil, stomatal and aerodynamic SFEXCH3A.410
C ! resistance factor = PSIS/(1+RS/RA) for SFEXCH3A.411
C ! fraction 1 - FRACA of the gridbox SFEXCH3A.412
+,RESFT(P_POINTS) ! Total resistance factor for moisture SFEXCH3A.413
C ! transfer to/from the surface SFEXCH3A.414
C ! = FRACA + (1-FRACA)*RESFS so that SFEXCH3A.415
C ! 1/RT = RESFT/RA SFEXCH3A.416
+,RIB_LEAD(P_POINTS) ! Bulk Richardson no. for sea-ice leads at SFEXCH3A.417
C ! lowest layer. At non sea-ice points holds SFEXCH3A.418
C ! RIB for FCDCH calculation, then set to SFEXCH3A.419
C ! to missing data indicator. SFEXCH3A.420
+,RS(P_POINTS) ! Stomatal resistance to evaporation. SFEXCH3A.421
+,U_0_P(P_POINTS) ! West-to-east component of ocean surface SFEXCH3A.422
C ! current (m/s; zero over land if U_0 OK). SFEXCH3A.423
C ! P grid. F615. SFEXCH3A.424
+,V_0_P(P_POINTS) ! South-to-north component of ocean surface SFEXCH3A.425
C ! current (m/s; zero over land if V_0 OK). SFEXCH3A.426
C ! P grid. F616. SFEXCH3A.427
+,Z0F(P_POINTS) ! Roughness length for free-convective heat SFEXCH3A.428
C ! and moisture transport. SFEXCH3A.429
+,Z0FS(P_POINTS) ! Roughness length for free-convective heat SFEXCH3A.430
C ! and moisture transport over sea. SFEXCH3A.431
+,Z0HS(P_POINTS) ! Roughness length for heat and moisture SFEXCH3A.432
C ! transport over sea. SFEXCH3A.433
&,WIND_PROFILE_FACTOR(P_POINTS) ARN1F400.14
C ! For transforming effective surface transfer ARN1F400.15
C ! coefficients to those excluding form drag. ARN1F400.16
C SFEXCH3A.434
C Workspace (reqd for compression). SFEXCH3A.435
INTEGER SFEXCH3A.436
+ SICE_INDEX(P_POINTS) ! Index vector for gather to sea-ice points SFEXCH3A.437
LOGICAL ITEST(P_POINTS) ! Used as 'logical' for compression. SFEXCH3A.438
C* SFEXCH3A.503
C SFEXCH3A.504
C (b) Scalars. SFEXCH3A.505
C SFEXCH3A.506
INTEGER SFEXCH3A.507
+ I ! Loop counter (horizontal field index). SFEXCH3A.508
+,J ! Offset counter within I-loop. SFEXCH3A.509
+,L ! Loop counter (land point field index). SFEXCH3A.510
+,NSICE ! Number of sea-ice points. SFEXCH3A.511
+,SI ! Loop counter (sea-ice field index). SFEXCH3A.515
REAL SFEXCH3A.516
+ AL ! Temporary in calculation of buoyancy parameters. SFEXCH3A.517
+,ALPHAL ! Temporary in calculation of buoyancy parameters. SFEXCH3A.518
+,BETAC ! Temporary in calculation of buoyancy parameters. SFEXCH3A.519
+,BETAQ ! Temporary in calculation of buoyancy parameters. SFEXCH3A.520
+,BETAT ! Temporary in calculation of buoyancy parameters. SFEXCH3A.521
+,CHN ! Neutral-stability value of CH, used as a first SFEXCH3A.522
C ! approximation to the "true" CH. SFEXCH3A.523
REAL ! (Split to avoid having > 19 continuation lines.) SFEXCH3A.524
+ RHOSTAR ! Surface air density in kg per cubic metre. SFEXCH3A.525
+,TAU ! Magnitude of surface wind stress over sea. SFEXCH3A.526
+,SMCRIT ! "Critical" available SMC in kg per sq m. SFEXCH3A.527
+,USHEAR ! U-component of surface-to-lowest-level wind shear. SFEXCH3A.528
+,VSHEAR ! V-component of surface-to-lowest-level wind shear. SFEXCH3A.529
+,VSHR2 ! Square of magnitude of surface-to-lowest-level SFEXCH3A.530
C ! wind shear. SFEXCH3A.531
+,ZETAM ! Temporary in calculation of CHN. SFEXCH3A.532
+,ZETAH ! Temporary in calculation of CHN. SFEXCH3A.533
+,ZETA1 ! Temporary in calculation of land roughness SFEXCH3A.534
+,ZETA2 ! Temporary in calculation of land roughness SFEXCH3A.535
+,ZETA3 ! Temporary in calculation of land roughness SFEXCH3A.536
+,Z0 ! Roughness length over land. SFEXCH3A.537
+,EPDT ! "Potential" Evaporation * Timestep SFEXCH3A.538
&,VS ! Surface layer friction velocity SFEXCH3A.539
&,VSF1_CUBED ! Cube of surface layer free convective scaling SFEXCH3A.540
C ! velocity SFEXCH3A.541
&,WS1 ! Turbulent velocity scale for surface layer SFEXCH3A.542
C SFEXCH3A.543
C----------------------------------------------------------------------- SFEXCH3A.544
CL 0. Check that the scalars input to define the grid are consistent. SFEXCH3A.545
C----------------------------------------------------------------------- SFEXCH3A.546
C SFEXCH3A.547
IF (LTIMER) THEN SFEXCH3A.548
CALL TIMER
('SFEXCH ',3) SFEXCH3A.549
ENDIF SFEXCH3A.550
SFEXCH3A.551
ERROR=0 SFEXCH3A.552
*IF DEF,MPP AJC1F405.112
IF ( AJC1F405.113
*ELSEIF DEF,SCMA AJC1F405.114
IF ( U_ROWS .NE. (P_ROWS) .OR. AJC1F405.115
*ELSE AJC1F405.116
IF ( U_ROWS .NE. (P_ROWS+1) .OR. AJC1F405.117
*ENDIF AJC1F405.118
+ U_POINTS .NE. (U_ROWS*ROW_LENGTH) .OR. SFEXCH3A.571
+ P_POINTS .NE. (P_ROWS*ROW_LENGTH) .OR. SFEXCH3A.572
+ LAND_PTS .GT. P_POINTS ) THEN SFEXCH3A.573
ERROR=1 SFEXCH3A.574
GOTO6 SFEXCH3A.575
ENDIF SFEXCH3A.576
C SFEXCH3A.577
C----------------------------------------------------------------------- SFEXCH3A.578
CL 1. Construct SICE_INDEX for compression onto sea points in SFEXCH3A.579
CL sea-ice leads calculations. SFEXCH3A.580
C----------------------------------------------------------------------- SFEXCH3A.581
C SFEXCH3A.582
DO I = 1,P_POINTS SFEXCH3A.583
ITEST(I) = .FALSE. SFEXCH3A.584
IF (ICE_FRACT(I).GT.0.0 .AND. .NOT.LAND_MASK(I)) SFEXCH3A.585
& ITEST(I) = .TRUE. SFEXCH3A.586
ENDDO SFEXCH3A.587
C SFEXCH3A.588
C Routine whenimd is functionally equivalent to WHENILE, so ITEST is SFEXCH3A.589
C 1 for "False", 0 for "True". SFEXCH3A.590
C SFEXCH3A.591
C GSS1F402.72
NSICE = 0 GSS1F402.73
DO I=1,P_POINTS GSS1F402.74
IF(ITEST(I))THEN GSS1F402.75
NSICE = NSICE + 1 GSS1F402.76
SICE_INDEX(NSICE) = I GSS1F402.77
END IF GSS1F402.78
END DO GSS1F402.79
C SFEXCH3A.594
C----------------------------------------------------------------------- SFEXCH3A.595
CL 2. Calculate QSAT values required later and components of ocean SFEXCH3A.596
CL current. SFEXCH3A.597
C Done here to avoid loop splitting. SFEXCH3A.598
C QSTAR 'borrowed' to store P at level 1 (just this once). SFEXCH3A.599
C PSIS 'borrowed' to store leads and non sea-ice surface temp. SFEXCH3A.600
C----------------------------------------------------------------------- SFEXCH3A.601
C SFEXCH3A.602
C----------------------------------------------------------------------- SFEXCH3A.604
CL 2.1 IF (GATHER) THEN SFEXCH3A.605
CL Calculate temperatures and pressures for QSAT calculations. SFEXCH3A.606
CL Calculate QSAT values. For sea-ice points, separate values SFEXCH3A.607
CL are required for the leads (QSTAR_LEAD) and sea-ice (QSTAR) SFEXCH3A.608
CL fractions respectively. QSTAR_LEAD = missing data, elsewhere. SFEXCH3A.609
CL Use RS to store compressed PSTAR for this section only. SFEXCH3A.610
CL NB Unlike QSTAR, TSTAR values at sea-ice points are gridsq. SFEXCH3A.611
CL means and so include the leads contribution. SFEXCH3A.612
CL ELSE SFEXCH3A.613
CL As above with QSTAR_LEAD done on full field. SFEXCH3A.614
CL ENDIF SFEXCH3A.615
C----------------------------------------------------------------------- SFEXCH3A.616
IF (GATHER) THEN SFEXCH3A.617
DO I = 1,P_POINTS SFEXCH3A.618
IF (L_BL_LSPICE) THEN ADM3F404.240
TL_1(I) = T_1(I) - LCRCP*QCL_1(I) ! P243.9 ADM3F404.241
ELSE ADM3F404.242
TL_1(I) = T_1(I) - LCRCP*QCL_1(I) - LSRCP*QCF_1(I) !P243.9 ADM3F404.243
ENDIF ADM3F404.244
TSTAR_NL(I) = TSTAR(I) SFEXCH3A.620
QSTAR_LEAD(I) = 1.0E30 ! Missing data indicator SFEXCH3A.621
QSTAR(I) = AK_1 + BK_1*PSTAR(I) SFEXCH3A.622
ENDDO SFEXCH3A.623
IF (NSICE.GT.0) THEN SFEXCH3A.624
CDIR$ IVDEP SFEXCH3A.625
! Fujitsu vectorization directive GRB0F405.465
!OCL NOVREC GRB0F405.466
DO SI = 1,NSICE SFEXCH3A.626
I = SICE_INDEX(SI) SFEXCH3A.627
TSTAR_NL(I) = (TSTAR(I)-(1.0-ICE_FRACT(I)) *TFS) SFEXCH3A.628
+ / ICE_FRACT(I) ! P2430.1 SFEXCH3A.629
PSIS(SI) = TFS SFEXCH3A.630
RS(SI) = PSTAR(I) SFEXCH3A.631
ENDDO SFEXCH3A.632
ENDIF SFEXCH3A.633
IF (L_BL_LSPICE) THEN ADM3F404.245
CALL QSAT_WAT
(QSL,TL_1,QSTAR,P_POINTS) ADM3F404.246
ELSE ADM3F404.247
CALL QSAT
(QSL,TL_1,QSTAR,P_POINTS) ADM3F404.248
ENDIF ADM3F404.249
SFEXCH3A.635
CALL QSAT
(QSTAR,TSTAR_NL,PSTAR,P_POINTS) SFEXCH3A.636
C ...values at sea-ice points contain ice contribution only SFEXCH3A.637
IF (NSICE.GT.0) CALL QSAT
(QSTAR_LEAD,PSIS,RS,NSICE) SFEXCH3A.638
C ...values at sea-ice points only SFEXCH3A.639
ELSE SFEXCH3A.640
C----------------------------------------------------------------------- SFEXCH3A.642
CL 2.1 Single Column Model selected. SFEXCH3A.643
CL Calculate temperatures and pressures for QSAT calculations. SFEXCH3A.644
CL If there is sea-ice, separate values of surface saturated SFEXCH3A.645
CL specific humidity are required for the leads (QSTAR_LEAD) SFEXCH3A.646
CL and sea-ice (QSTAR) fractions respectively. SFEXCH3A.647
CL NB Unlike QSTAR, TSTAR values at sea-ice points are gridsq. SFEXCH3A.648
CL means and so include the leads contribution. SFEXCH3A.649
C----------------------------------------------------------------------- SFEXCH3A.650
DO I = 1,P_POINTS SFEXCH3A.652
IF (L_BL_LSPICE) THEN ADM3F404.250
TL_1(I) = T_1(I) - LCRCP*QCL_1(I) ! P243.9 ADM3F404.251
ELSE ADM3F404.252
TL_1(I) = T_1(I) - LCRCP*QCL_1(I) - LSRCP*QCF_1(I) !P243.9 ADM3F404.253
ENDIF ADM3F404.254
TSTAR_NL(I) = TSTAR(I) SFEXCH3A.654
C Set to missing data at non sea-ice points after QSAT. SFEXCH3A.655
PSIS(I) = TSTAR(I) SFEXCH3A.656
QSTAR(I) = AK_1 + BK_1*PSTAR(I) SFEXCH3A.657
IF ( ICE_FRACT(I).GT.0.0 .AND. .NOT.LAND_MASK(I) ) THEN SFEXCH3A.658
TSTAR_NL(I) = (TSTAR(I)-(1.0-ICE_FRACT(I)) *TFS) SFEXCH3A.659
+ / ICE_FRACT(I) ! P2430.1 SFEXCH3A.660
PSIS(I) = TFS SFEXCH3A.661
ENDIF SFEXCH3A.662
ENDDO SFEXCH3A.663
IF (L_BL_LSPICE) THEN ADM3F404.255
CALL QSAT_WAT
(QSL,TL_1,QSTAR,P_POINTS) ADM3F404.256
ELSE ADM3F404.257
CALL QSAT
(QSL,TL_1,QSTAR,P_POINTS) ADM3F404.258
ENDIF ADM3F404.259
SFEXCH3A.665
CALL QSAT
(QSTAR,TSTAR_NL,PSTAR,P_POINTS) SFEXCH3A.666
C ...values at sea-ice points contain ice contribution only SFEXCH3A.667
IF (NSICE.GT.0) CALL QSAT
(QSTAR_LEAD,PSIS,PSTAR,P_POINTS) SFEXCH3A.668
C ...values at sea-ice points contain leads contribution only SFEXCH3A.669
DO I=1,P_POINTS SFEXCH3A.670
IF ( .NOT.(ICE_FRACT(I).GT.0.0 .AND. .NOT.LAND_MASK(I)) ) SFEXCH3A.671
+ QSTAR_LEAD(I) = 1.0E30 SFEXCH3A.672
ENDDO SFEXCH3A.673
ENDIF ! End of IF (GATHER) THEN... ELSE. GSS1F402.80
C----------------------------------------------------------------------- SFEXCH3A.677
CL 2.2 Set components of ocean surface current. SFEXCH3A.678
C----------------------------------------------------------------------- SFEXCH3A.679
*IF DEF,SCMA AJC1F405.119
DO I = 1, U_POINTS AJC1F405.120
U_0_P(I) = U_0(I) AJC1F405.121
V_0_P(I) = V_0(I) AJC1F405.122
ENDDO AJC1F405.123
*ELSE SFEXCH3A.683
CALL UV_TO_P
(U_0,U_0_P,U_POINTS,P_POINTS,ROW_LENGTH,U_ROWS) SFEXCH3A.684
CALL UV_TO_P
(V_0,V_0_P,U_POINTS,P_POINTS,ROW_LENGTH,U_ROWS) SFEXCH3A.685
*ENDIF SFEXCH3A.686
C SFEXCH3A.687
C----------------------------------------------------------------------- SFEXCH3A.688
CL 3. Loop round gridpoints to be processed, performing calculations SFEXCH3A.689
CL BEFORE call to FCDCH which necessitates splitting of loop. SFEXCH3A.690
C SFEXCH3A.691
C Note that there are a number of redundant operations in this SFEXCH3A.692
C loop, mainly setting "default" values before entering an IF- SFEXCH3A.693
C block. These are necessary to prevent the flow control SFEXCH3A.694
C becoming too complicated for the compiler to vectorize, and SFEXCH3A.695
C should therefore be left in. SFEXCH3A.696
C SFEXCH3A.697
C Note too that this section has been split into several small SFEXCH3A.698
C loops instead of being kept as one larger loop. This is also SFEXCH3A.699
C done to enable the compiler to vectorize. SFEXCH3A.700
C----------------------------------------------------------------------- SFEXCH3A.701
C SFEXCH3A.702
C----------------------------------------------------------------------- SFEXCH3A.703
CL 3.1 Fix roughness lengths for the various surface types. SFEXCH3A.704
C----------------------------------------------------------------------- SFEXCH3A.705
DO I = 1,P_POINTS SFEXCH3A.706
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.707
CL 3.1.1 Liquid sea. Overwrite sea-ice and land in 3.1.2, 3.1.3. SFEXCH3A.708
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.709
Z0M(I) = Z0MSEA(I) ! P243.B5 SFEXCH3A.710
Z0H(I) = Z0HSEA ! " SFEXCH3A.711
Z0M_EFF(I) = Z0MSEA(I) SFEXCH3A.712
Z0F(I) = Z0FSEA ! " SFEXCH3A.714
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.715
CL 3.1.2 Sea ice: Z0MIZ set on all points for input to FCDCH routine SFEXCH3A.716
CL in CD_MIZ,CH_MIZ calculations. Similarily Z0HSEA,Z0FSEA for SFEXCH3A.717
CL CD_LEAD,CH_LEAD calculations. Z0SICE for CD,CH over sea-ice. SFEXCH3A.718
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.719
CD_LEAD(I) = Z0MIZ SFEXCH3A.720
Z0HS(I) = Z0HSEA SFEXCH3A.721
Z0FS(I) = Z0FSEA SFEXCH3A.722
IF (ICE_FRACT(I).GT.0.0 .AND. .NOT.LAND_MASK(I)) THEN SFEXCH3A.723
Z0M(I) = Z0SICE ! P243.B4 SFEXCH3A.724
Z0H(I) = Z0SICE ! " SFEXCH3A.725
Z0M_EFF(I) = Z0SICE SFEXCH3A.726
Z0F(I) = Z0SICE ! " SFEXCH3A.728
ENDIF SFEXCH3A.729
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.730
CL 3.1.2a Specify blending height for all points. Set to minimum value SFEXCH3A.731
CL so that LAMBDA_EFF = LAMBDA over the sea in KMKH. SFEXCH3A.732
CL This avoids having to pass land-sea mask into KMKH. SFEXCH3A.733
CL Also set the wind profile factor to the default value of 1.0 ARN1F400.20
CL for non-land points. ARN1F400.21
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.734
SFEXCH3A.735
H_BLEND(I) = H_BLEND_MIN SFEXCH3A.736
WIND_PROFILE_FACTOR(I) = 1.0 ARN1F400.22
C ARN1F400.23
ENDDO SFEXCH3A.738
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.740
CL 3.1.3 Land. Reduce roughness if there is any snow lying. SFEXCH3A.741
CL Eqns P243.B1, B2. SFEXCH3A.742
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.743
CDIR$ IVDEP SFEXCH3A.748
! Fujitsu vectorization directive GRB0F405.467
!OCL NOVREC GRB0F405.468
DO L = 1,LAND_PTS SFEXCH3A.749
I = LAND_INDEX(L) - (P1-1) SFEXCH3A.750
IF (LYING_SNOW(I) .LT. 5.0E3) THEN ! Only reduce non-orographic SFEXCH3A.752
C ! roughness for land points SFEXCH3A.753
C ! without permanent snow. SFEXCH3A.754
C SFEXCH3A.755
Z0 = Z0V(I) - 4.0E-4 * LYING_SNOW(I) SFEXCH3A.756
ZETA1 = MIN( 5.0E-4 , Z0V(I) ) SFEXCH3A.757
Z0M(I) = MAX( ZETA1 , Z0 ) SFEXCH3A.758
Z0H(I) = MIN( Z0V(I) , Z0M(I) ) ARN1F400.24
Z0F(I) = Z0H(I) SFEXCH3A.760
ELSE ! for permanent land-ice Z0V is appropriate SFEXCH3A.761
Z0M(I) = Z0V(I) ! P243.B1, based on P243.B2 (2nd case) SFEXCH3A.762
Z0H(I) = Z0V(I) ! " , " " " ( " " ) SFEXCH3A.763
Z0F(I) = Z0V(I) ! " , " " " ( " " ) SFEXCH3A.764
ENDIF SFEXCH3A.765
C SFEXCH3A.766
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.767
CL 3.1.4 Orographic roughness. Calculate Z0M_EFF in neutral case. ARN1F400.25
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.770
IF (L_Z0_OROG) THEN SFEXCH3A.771
C ARN1F400.26
C ! Set blending height, effective roughness length and ARN1F400.27
C ! wind profile factor at land points. ARN1F400.28
C SFEXCH3A.775
SFEXCH3A.776
IF (SIL_OROG(L) .EQ. RMDI) THEN SFEXCH3A.779
ZETA1 = 0.0 ARN1F400.29
ELSE SFEXCH3A.781
ZETA1 = 0.5 * OROG_DRAG_PARAM * SIL_OROG(L) SFEXCH3A.782
ENDIF SFEXCH3A.783
ZETA2 = LOG ( 1.0 + Z1(I)/Z0M(I) ) ARN1F400.30
ZETA3 = 1.0 / SQRT ( ZETA1/(VKMAN*VKMAN) + 1.0/(ZETA2*ZETA2) ) ARN1F400.31
ZETA2 = 1.0 / EXP(ZETA3) ARN1F400.32
H_BLEND(I) = MAX ( Z1(I) / (1.0 - ZETA2) , ARN1F400.33
& HO2R2_OROG(L) * SQRT(2.0) ) ARN1F400.34
H_BLEND(I) = MIN ( H_BLEND_MAX, H_BLEND(I) ) ARN1F400.35
SFEXCH3A.784
Z0M_EFF(I) = H_BLEND(I) / EXP ( VKMAN / SQRT ( ZETA1 + SFEXCH3A.785
& (VKMAN / LOG ( H_BLEND(I) / Z0M(I) ) ) * ARN1F400.36
& (VKMAN / LOG ( H_BLEND(I) / Z0M(I) ) ) ) ) ARN1F400.37
SFEXCH3A.787
WIND_PROFILE_FACTOR(I) = LOG ( H_BLEND(I) / Z0M_EFF(I) ) / ARN1F400.38
& LOG ( H_BLEND(I) / Z0M(I) ) ARN1F400.39
SFEXCH3A.788
ELSE ! Orographic roughness not represented so ARN1F400.40
C ! leave blending height and wind profile factor at their ARN1F400.41
C ! default values and set effective roughness length to its ARN1F400.42
C ! value based on land type. ARN1F400.43
C ARN1F400.44
Z0M_EFF(I) = Z0M(I) ARN1F400.45
ENDIF ARN1F400.46
SFEXCH3A.798
ENDDO SFEXCH3A.803
C----------------------------------------------------------------------- SFEXCH3A.805
CL 3.2 Calculate buoyancy parameters for the lowest model level. SFEXCH3A.806
C----------------------------------------------------------------------- SFEXCH3A.807
DO I=1,P_POINTS SFEXCH3A.808
IF (L_BL_LSPICE) THEN ADM3F404.260
QW_1(I) = Q_1(I) + QCL_1(I) ! P243.10 ADM3F404.261
ELSE ADM3F404.262
QW_1(I) = Q_1(I) + QCL_1(I) + QCF_1(I) ! P243.10 ADM3F404.263
ENDIF ADM3F404.264
BETAT = 1.0 / T_1(I) ! P243.19 (1st eqn) SFEXCH3A.810
BETAQ = C_VIRTUAL / SFEXCH3A.811
+ ( 1.0 + C_VIRTUAL*Q_1(I) - QCL_1(I) - QCF_1(I) ) SFEXCH3A.812
C ... P243.19 (2nd eqn) SFEXCH3A.813
C SFEXCH3A.814
IF (TL_1(I).GT.TM.OR.L_BL_LSPICE) THEN ADM3F404.265
ALPHAL = (EPSILON * LC * QSL(I)) / (R * TL_1(I) * TL_1(I)) SFEXCH3A.816
C ... P243.20 (Clausius-Clapeyron) SFEXCH3A.817
C SFEXCH3A.818
AL = 1.0 / (1.0 + LCRCP*ALPHAL) ! P243.21 SFEXCH3A.819
BETAC = CF_1(I) * AL * (LCRCP*BETAT - ETAR*BETAQ) SFEXCH3A.820
C ... P243.19 (3rd eqn) SFEXCH3A.821
C SFEXCH3A.822
ELSE SFEXCH3A.823
ALPHAL = (EPSILON * LS * QSL(I)) / (R * TL_1(I) * TL_1(I)) SFEXCH3A.824
C ... P243.20 (Clausius-Clapeyron) SFEXCH3A.825
C SFEXCH3A.826
AL = 1.0 / (1.0 + LSRCP*ALPHAL) ! P243.21 SFEXCH3A.827
BETAC = CF_1(I) * AL * (LSRCP*BETAT - ETAR*BETAQ) SFEXCH3A.828
C ... P243.19 (3rd eqn) SFEXCH3A.829
C SFEXCH3A.830
ENDIF SFEXCH3A.831
BT_1(I) = BETAT - ALPHAL*BETAC ! P243.18 (1st eqn) SFEXCH3A.832
BQ_1(I) = BETAQ + BETAC ! P243.18 (2nd eqn) SFEXCH3A.833
BF_1(I) = BETAQ *EPSILON*ETAR ! P243.18 (2nd eqn) ADM3F404.266
ENDDO SFEXCH3A.834
C----------------------------------------------------------------------- SFEXCH3A.835
CL 3.3 Calculate temperature (strictly, liquid/ice static energy) and SFEXCH3A.836
CL humidity jumps, and wind shear, across the surface layer. SFEXCH3A.837
CL Separate values are required for the leads and ice fractions SFEXCH3A.838
CL of sea-ice grid-squares. SFEXCH3A.839
C----------------------------------------------------------------------- SFEXCH3A.840
IF (GATHER) THEN SFEXCH3A.842
DO I=1,P_POINTS SFEXCH3A.843
DTEMP(I) = TL_1(I) - TSTAR_NL(I) SFEXCH3A.844
& + GRCP * ( Z1(I) + Z0M_EFF(I) - Z0H(I) ) ARN1F400.47
C ! P243.118 SFEXCH3A.846
DQ(I) = QW_1(I) - QSTAR(I) ! P243.119 SFEXCH3A.847
DTEMP_LEAD(I) = 1.0E30 ! Missing data indicator SFEXCH3A.848
DQ_LEAD(I) = 1.0E30 ! Missing data indicator SFEXCH3A.849
USHEAR = U_1_P(I) - U_0_P(I) SFEXCH3A.850
VSHEAR = V_1_P(I) - V_0_P(I) SFEXCH3A.851
VSHR2 = MAX (1.0E-6 , USHEAR*USHEAR + VSHEAR*VSHEAR) SFEXCH3A.852
VSHR(I) = SQRT(VSHR2) SFEXCH3A.853
C ... P243.120 (previous 4 lines of code) SFEXCH3A.854
ENDDO SFEXCH3A.855
C----------------------------------------------------------------------- SFEXCH3A.856
CL 3.3.1 Calculate leads values by looping round sea-ice points only. SFEXCH3A.857
C Avoids an if test in the above loop, so code can run faster. SFEXCH3A.858
C----------------------------------------------------------------------- SFEXCH3A.859
CDIR$ IVDEP SFEXCH3A.860
! Fujitsu vectorization directive GRB0F405.469
!OCL NOVREC GRB0F405.470
DO SI=1,NSICE SFEXCH3A.861
I = SICE_INDEX(SI) SFEXCH3A.862
DTEMP_LEAD(I) = TL_1(I)-TFS + GRCP*(Z1(I)+Z0MSEA(I)-Z0HS(I)) SFEXCH3A.863
DQ_LEAD(I) = QW_1(I) - QSTAR_LEAD(SI) SFEXCH3A.864
ENDDO SFEXCH3A.865
ELSE SFEXCH3A.866
DO I=1,P_POINTS SFEXCH3A.868
USHEAR = U_1_P(I) - U_0_P(I) SFEXCH3A.873
VSHEAR = V_1_P(I) - V_0_P(I) SFEXCH3A.874
VSHR2 = MAX (1.0E-6 , USHEAR*USHEAR + VSHEAR*VSHEAR) SFEXCH3A.876
VSHR(I) = SQRT(VSHR2) SFEXCH3A.877
C ... P243.120 (previous 4 lines of code) SFEXCH3A.878
DTEMP(I) = TL_1(I) - TSTAR_NL(I) SFEXCH3A.879
& + GRCP * ( Z1(I) + Z0M_EFF(I) - Z0H(I) ) ARN1F400.48
C ! P243.118 SFEXCH3A.881
DQ(I) = QW_1(I) - QSTAR(I) ! P243.119 SFEXCH3A.882
IF ( ICE_FRACT(I).GT.0.0 .AND. .NOT.LAND_MASK(I) ) THEN SFEXCH3A.883
DTEMP_LEAD(I) = TL_1(I)-TFS + GRCP*(Z1(I)+Z0MSEA(I)-Z0HS(I)) SFEXCH3A.884
DQ_LEAD(I) = QW_1(I) - QSTAR_LEAD(I) SFEXCH3A.885
ELSE SFEXCH3A.886
DTEMP_LEAD(I) = 1.0E30 ! Missing data indicator SFEXCH3A.887
DQ_LEAD(I) = 1.0E30 ! Missing data indicator SFEXCH3A.888
ENDIF SFEXCH3A.889
C SFEXCH3A.890
ENDDO SFEXCH3A.891
ENDIF ! End of IF (GATHER) THEN... ELSE... SFEXCH3A.893
C----------------------------------------------------------------------- SFEXCH3A.895
CL 3.4 Evaporation over land surfaces without snow is limited by SFEXCH3A.896
CL soil moisture availability and stomatal resistance. SFEXCH3A.897
C Set FRACA (= fA in the documentation) according to P243.68, SFEXCH3A.898
C PSIS according to P243.65, and RESFS (= fS) according to P243.75 SFEXCH3A.899
C and P243.61, using neutral-stability value of CH (as explained SFEXCH3A.900
C in section (v) of the P243 documentation). SFEXCH3A.901
C----------------------------------------------------------------------- SFEXCH3A.902
DO I=1,P_POINTS SFEXCH3A.903
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.904
CL 3.4.1 Set parameters (workspace) to values relevant for non-land SFEXCH3A.905
CL points. Only aerodynamic resistance applies. SFEXCH3A.906
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.907
FRACA(I) = 1.0 SFEXCH3A.908
PSIS(I) = 0.0 SFEXCH3A.909
RESFT(I) = 1.0 SFEXCH3A.910
RS(I) = 0.0 SFEXCH3A.911
RESFS(I) = 0.0 SFEXCH3A.912
ENDDO SFEXCH3A.914
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.916
CL 3.4.2 Over-write workspace for other points. SFEXCH3A.917
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.918
CDIR$ IVDEP SFEXCH3A.923
! Fujitsu vectorization directive GRB0F405.471
!OCL NOVREC GRB0F405.472
DO L=1,LAND_PTS SFEXCH3A.924
I = LAND_INDEX(L) - (P1-1) SFEXCH3A.925
C SFEXCH3A.927
C Calculate the soil moisture availability factor, PSIS. SFEXCH3A.928
C SFEXCH3A.929
SMCRIT = RHO_WATER * ROOTD(L) * (SMVCCL(L)-SMVCWT(L)) SFEXCH3A.930
C ... P243.66 SFEXCH3A.931
C SFEXCH3A.932
PSIS(I) = 0.0 SFEXCH3A.933
IF (SMC(L).GE.SMCRIT .AND. SMCRIT.GT.0.0) SFEXCH3A.934
+ PSIS(I) = 1.0 SFEXCH3A.935
IF (SMC(L).LT.SMCRIT .AND. SMC(L).GT.0.0) SFEXCH3A.936
+ PSIS(I) = SMC(L)/SMCRIT SFEXCH3A.937
C SFEXCH3A.938
C For snow-covered land or land points with negative moisture flux SFEXCH3A.939
C set the fraction of the flux with only aerodynamic resistance to 1 SFEXCH3A.940
C (no surface/stomatal resistance to evap from snow or condensation). SFEXCH3A.941
C SFEXCH3A.942
FRACA(I) = 1.0 SFEXCH3A.943
C SFEXCH3A.944
C When there is positive moisture flux from snow-free land, calculate SFEXCH3A.945
C the fraction of the flux from the "canopy". SFEXCH3A.946
C SFEXCH3A.947
IF (DQ(I).LT.0.0 .AND. LYING_SNOW(I).LE.0.0) FRACA(I) = 0.0 SFEXCH3A.948
IF (DQ(I).LT.0.0.AND.LYING_SNOW(I).LE.0.0.AND.CATCH(L).GT.0.0) SFEXCH3A.949
+ FRACA(I) = CANOPY(L)/CATCH(L) SFEXCH3A.950
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.951
CL 3.4.2.1 Calculate neutral stability value of CH (CHN), as an SFEXCH3A.952
CL approximation to CH. SFEXCH3A.953
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.954
ZETAM = LOG ( (Z1(I) + Z0M_EFF(I))/Z0M_EFF(I) ) SFEXCH3A.955
ZETAH = LOG ( (Z1(I) + Z0M_EFF(I))/Z0H(I) ) ARN1F400.49
CHN = (VKMAN/ZETAH) * (VKMAN/ZETAM) * WIND_PROFILE_FACTOR(I) ARN1F400.50
C ... P243.41 (previous 3 lines of code) SFEXCH3A.958
C SFEXCH3A.959
RS(I) = RESIST(L) SFEXCH3A.960
RESFS(I) = PSIS(I) / ( 1.0 + CHN*VSHR(I)*RS(I) ) SFEXCH3A.961
RESFT(I) = FRACA(I) + (1.0 - FRACA(I)) * RESFS(I) SFEXCH3A.962
ENDDO ! Evaporation over land points only, section 3.4.2 SFEXCH3A.967
C----------------------------------------------------------------------- SFEXCH3A.969
CL 3.5 Calculate bulk Richardson numbers for the surface layer. SFEXCH3A.970
CL At sea-ice points RIB contains value for ice only (not leads). SFEXCH3A.971
CL Initialise RIB_LEAD to RIB so that it contains sensible SFEXCH3A.972
CL values at non sea ice points for the FCDCH calculation below. SFEXCH3A.973
C----------------------------------------------------------------------- SFEXCH3A.974
IF (GATHER) THEN SFEXCH3A.976
DO I=1,P_POINTS SFEXCH3A.977
RIB(I) = G * Z1(I) * SFEXCH3A.978
+ ( BT_1(I)*DTEMP(I) + BQ_1(I)*RESFT(I)*DQ(I) ) / SFEXCH3A.979
+ ( VSHR(I)*VSHR(I) ) SFEXCH3A.980
RIB_LEAD(I) = RIB(I) SFEXCH3A.981
ENDDO SFEXCH3A.982
C----------------------------------------------------------------------- SFEXCH3A.983
CL 3.5.1 Calculate bulk Richardson no. for leads at sea-ice points SFEXCH3A.984
CL only. SFEXCH3A.985
C----------------------------------------------------------------------- SFEXCH3A.986
CDIR$ IVDEP SFEXCH3A.987
! Fujitsu vectorization directive GRB0F405.473
!OCL NOVREC GRB0F405.474
DO SI = 1,NSICE SFEXCH3A.988
I = SICE_INDEX(SI) SFEXCH3A.989
RIB_LEAD(I) = G * Z1(I) * SFEXCH3A.990
+ ( BT_1(I) * DTEMP_LEAD(I) + SFEXCH3A.991
+ BQ_1(I) * RESFT(I) * DQ_LEAD(I) ) / SFEXCH3A.992
+ ( VSHR(I) * VSHR(I) ) SFEXCH3A.993
C ... P2430.2, for sea-ice leads. SFEXCH3A.994
ENDDO SFEXCH3A.995
ELSE SFEXCH3A.996
DO I=1,P_POINTS SFEXCH3A.998
RIB(I) = G * Z1(I) * SFEXCH3A.999
+ ( BT_1(I)*DTEMP(I) + BQ_1(I)*RESFT(I)*DQ(I) ) / SFEXCH3A.1000
+ ( VSHR(I)*VSHR(I) ) SFEXCH3A.1001
C ... P243.43 (G times middle line is surface SFEXCH3A.1002
C layer buoyancy difference, P243.25) SFEXCH3A.1003
C SFEXCH3A.1004
RIB_LEAD(I) = RIB(I) SFEXCH3A.1005
IF ( ICE_FRACT(I).GT.0.0 .AND. .NOT.LAND_MASK(I) ) THEN SFEXCH3A.1006
RIB_LEAD(I) = G * Z1(I) * SFEXCH3A.1007
+ ( BT_1(I) * DTEMP_LEAD(I) + SFEXCH3A.1008
+ BQ_1(I) * RESFT(I) * DQ_LEAD(I) ) / SFEXCH3A.1009
+ ( VSHR(I) * VSHR(I) ) SFEXCH3A.1010
C ... P2430.2, for sea-ice leads. SFEXCH3A.1011
ENDIF SFEXCH3A.1012
ENDDO SFEXCH3A.1013
ENDIF ! End of IF (GATHER) THEN... ELSE... SFEXCH3A.1015
C SFEXCH3A.1017
C----------------------------------------------------------------------- SFEXCH3A.1018
CL 3.6 Calculate stability corrected effective roughness length. ARN1F400.51
CL Simple linear interpolation when RIB between 0 and RIB_CRIT (>0) for ARN1F400.52
CL form drag term. ARN1F400.53
C----------------------------------------------------------------------- SFEXCH3A.1022
SFEXCH3A.1023
IF (L_Z0_OROG) THEN SFEXCH3A.1024
CDIR$ IVDEP SFEXCH3A.1029
! Fujitsu vectorization directive GRB0F405.475
!OCL NOVREC GRB0F405.476
DO L = 1,LAND_PTS SFEXCH3A.1030
I = LAND_INDEX(L) - (P1-1) SFEXCH3A.1031
SFEXCH3A.1033
IF (RIB(I) .GE. RI_CRIT) THEN ARN1F400.54
Z0M_EFF(I) = Z0M(I) SFEXCH3A.1035
ELSEIF (RIB(I) .GT. 0.0 ) THEN ARN1F400.55
IF (SIL_OROG(L) .EQ. RMDI) THEN ARN1F400.56
ZETA1 = 0.0 ARN1F400.57
ELSE ARN1F400.58
ZETA1 = 0.5 * OROG_DRAG_PARAM * SIL_OROG(L) * ARN1F400.59
& ( 1.0 - RIB(I) / RI_CRIT ) ARN1F400.60
ENDIF ARN1F400.61
Z0M_EFF(I) = H_BLEND(I) / EXP ( VKMAN / SQRT ( ZETA1 + ARN1F400.62
& (VKMAN / LOG ( H_BLEND(I) / Z0M(I) ) ) * ARN1F400.63
& (VKMAN / LOG ( H_BLEND(I) / Z0M(I) ) ) ) ) ARN1F400.64
ARN1F400.65
ENDIF SFEXCH3A.1039
SFEXCH3A.1040
WIND_PROFILE_FACTOR(I) = LOG ( H_BLEND(I) / Z0M_EFF(I) ) / ARN1F400.66
& LOG ( H_BLEND(I) / Z0M(I) ) ARN1F400.67
SFEXCH3A.1041
ARN1F400.68
ENDDO SFEXCH3A.1050
ENDIF SFEXCH3A.1052
SFEXCH3A.1053
C SFEXCH3A.1054
C----------------------------------------------------------------------- SFEXCH3A.1055
CL 3.7 Calculate CD, CH via routine FCDCH. SFEXCH3A.1056
CL Calculate CD_MIZ,CH_MIZ,CD_LEAD,CH_LEAD on full field then set SFEXCH3A.1057
CL non sea-ice points to missing data (contain nonsense after FCDCH) SFEXCH3A.1058
C Unlike the QSAT calculations above, arrays are not compressed to SFEXCH3A.1060
C sea-ice points for FCDCH. This is because it would require extra SFEXCH3A.1061
C work space and initial tests showed that with with the extra SFEXCH3A.1062
C compression calculations required no time was saved. SFEXCH3A.1063
C NB CD_LEAD stores Z0MIZ for calculation of CD_MIZ,CH_MIZ. SFEXCH3A.1065
C----------------------------------------------------------------------- SFEXCH3A.1066
C SFEXCH3A.1067
CALL FCDCH
(RIB,CD_LEAD,CD_LEAD,CD_LEAD,Z1,WIND_PROFILE_FACTOR, ARN1F400.69
& P_POINTS,CD_MIZ,CH_MIZ,CD_STD,LTIMER) ARN1F400.70
C ! Marginal Ice Zone.P2430.9 ARN1F400.71
CALL FCDCH
(RIB_LEAD,Z0MSEA,Z0HS,Z0FS,Z1,WIND_PROFILE_FACTOR, ARN1F400.72
& P_POINTS,CD_LEAD,CH_LEAD,CD_STD,LTIMER) ARN1F400.73
C ! Sea-ice leads.P2430.8 ARN1F400.74
CALL FCDCH
(RIB,Z0M_EFF,Z0H,Z0F,Z1,WIND_PROFILE_FACTOR, ARN1F400.75
& P_POINTS,CD,CH,CD_STD,LTIMER) ARN1F400.76
DO I=1,P_POINTS SFEXCH3A.1073
C IF ( an ordinary sea points (no sea-ice) or a land point) SFEXCH3A.1074
IF (.NOT.(ICE_FRACT(I).GT.0.0 .AND. .NOT.LAND_MASK(I)) ) THEN SFEXCH3A.1075
CD_MIZ(I) = 1.0E30 SFEXCH3A.1076
CH_MIZ(I) = 1.0E30 SFEXCH3A.1077
CD_LEAD(I) = 1.0E30 SFEXCH3A.1078
CH_LEAD(I) = 1.0E30 SFEXCH3A.1079
RIB_LEAD(I) = 1.0E30 SFEXCH3A.1080
ENDIF SFEXCH3A.1081
ENDDO SFEXCH3A.1082
C SFEXCH3A.1083
C----------------------------------------------------------------------- SFEXCH3A.1084
CL 4. Loop round gridpoints to be processed, performing calculations SFEXCH3A.1085
CL AFTER call to FCDCH which necessitates splitting of loop. SFEXCH3A.1086
C----------------------------------------------------------------------- SFEXCH3A.1087
CL 4.1 Recalculate RESFS using "true" CH. SFEXCH3A.1088
C----------------------------------------------------------------------- SFEXCH3A.1089
CDIR$ IVDEP SFEXCH3A.1095
! Fujitsu vectorization directive GRB0F405.477
!OCL NOVREC GRB0F405.478
DO L = 1,LAND_PTS SFEXCH3A.1096
I = LAND_INDEX(L) - (P1-1) SFEXCH3A.1097
RESFS(I) = PSIS(I) / ( 1.0 + CH(I)*VSHR(I)*RS(I) ) ! P243.75 SFEXCH3A.1099
EPDT = -PSTAR(I)/(R*TSTAR(I))*CH(I)*VSHR(I)*DQ(I)*TIMESTEP SFEXCH3A.1100
IF (EPDT .GT. 0.0 .AND. LYING_SNOW(I) .LE. 0.0 SFEXCH3A.1101
& .AND. CATCH(L) .GT. 0.0) THEN SFEXCH3A.1102
FRACA(I) = CANOPY(L)/(CATCH(L)+EPDT) SFEXCH3A.1103
RESFT(I) = FRACA(I) + (1.0 - FRACA(I)) * RESFS(I) SFEXCH3A.1104
ENDIF ! Positive evaporation from snow-free land SFEXCH3A.1105
ENDDO ! Loop over land-points SFEXCH3A.1110
C----------------------------------------------------------------------- SFEXCH3A.1112
CL 4.D Call SFL_INT to calculate CDR10M, CHR1P5M and CER1P5M - SFEXCH3A.1113
CL interpolation coefficients used in SF_EVAP and IMPL_CAL to SFEXCH3A.1114
CL calculate screen temperature, specific humidity and 10m winds. SFEXCH3A.1115
C----------------------------------------------------------------------- SFEXCH3A.1118
C SFEXCH3A.1119
IF (SU10 .OR. SV10 .OR. SQ1P5 .OR. ST1P5) THEN SFEXCH3A.1120
SFEXCH3A.1129
CALL SFL_INT
( SFEXCH3A.1130
& P_POINTS,U_POINTS,RIB,Z1,Z0M,Z0M_EFF,Z0H,Z0F,CD_STD,CD,CH, ARN1F400.77
& RESFT,WIND_PROFILE_FACTOR, ARN1F400.78
& CDR10M,CHR1P5M,CER1P5M, ARN1F400.79
+ SU10,SV10,ST1P5,SQ1P5,LTIMER SFEXCH3A.1133
+ ) SFEXCH3A.1134
ENDIF SFEXCH3A.1135
C----------------------------------------------------------------------- SFEXCH3A.1136
CL 4.2 Now that diagnostic calculations are over, update CD and CH SFEXCH3A.1137
CL to their correct values (i.e. gridsquare means). SFEXCH3A.1138
C----------------------------------------------------------------------- SFEXCH3A.1139
DO I = 1,P_POINTS SFEXCH3A.1140
IF ( ICE_FRACT(I).GT.0.0 .AND. .NOT.LAND_MASK(I) ) THEN SFEXCH3A.1141
IF ( ICE_FRACT(I).LT. 0.7 ) THEN SFEXCH3A.1142
CD(I) = ( ICE_FRACT(I)*CD_MIZ(I) + SFEXCH3A.1143
+ (0.7-ICE_FRACT(I))*CD_LEAD(I) ) / 0.7 ! P2430.5 SFEXCH3A.1144
CH(I) = ( ICE_FRACT(I)*CH_MIZ(I) + SFEXCH3A.1145
+ (0.7-ICE_FRACT(I))*CH_LEAD(I) ) / 0.7 ! P2430.4 SFEXCH3A.1146
ELSE SFEXCH3A.1147
CD(I) = ( (1.0-ICE_FRACT(I))*CD_MIZ(I) + SFEXCH3A.1148
+ (ICE_FRACT(I)-0.7)*CD(I) ) / 0.3 ! P2430.7 SFEXCH3A.1149
CH(I) = ( (1.0-ICE_FRACT(I))*CH_MIZ(I) + SFEXCH3A.1150
+ (ICE_FRACT(I)-0.7)*CH(I) ) / 0.3 ! P2430.7 SFEXCH3A.1151
ENDIF SFEXCH3A.1152
ENDIF SFEXCH3A.1153
C----------------------------------------------------------------------- SFEXCH3A.1154
CL 4.3 Calculate the surface exchange coefficients RHOK(*). SFEXCH3A.1155
C----------------------------------------------------------------------- SFEXCH3A.1156
RHOSTAR = PSTAR(I) / ( R*TSTAR(I) ) SFEXCH3A.1157
C ... surface air density from ideal gas equation SFEXCH3A.1158
C SFEXCH3A.1159
RHOKM_1(I) = RHOSTAR * CD(I) * VSHR(I) ! P243.124 SFEXCH3A.1160
RHOKH_1(I) = RHOSTAR * CH(I) * VSHR(I) ! P243.125 SFEXCH3A.1161
*IF DEF,SCMA AJC0F405.94
If (OBS) then AJC0F405.95
RHOKEA(I) = FACTOR_RHOKH(I) * FRACA(I) AJC0F405.96
else AJC0F405.97
*ENDIF AJC0F405.98
RHOKEA(I) = RHOKH_1(I) * FRACA(I) ! P243.126 SFEXCH3A.1162
*IF DEF,SCMA AJC0F405.99
endif AJC0F405.100
*ENDIF AJC0F405.101
RHOKESL(I) = RHOKH_1(I) * RESFS(I) ! P243.127 SFEXCH3A.1163
RHOKES(I) = RHOKESL(I) * (1.0 - FRACA(I)) ! P243.128 SFEXCH3A.1164
RHOKE(I) = RHOKEA(I) + RHOKES(I) ! P243.129 SFEXCH3A.1165
C ASJ1F400.29
C RHOSTAR * CD * VSHR stored for diagnostic output before ASJ1F400.30
C horizontal interpolation. ASJ1F400.31
C ASJ1F400.32
RHO_CD_MODV1(I) = RHOKM_1(I) ASJ1F400.33
C ASJ1F400.34
C----------------------------------------------------------------------- SFEXCH3A.1166
CL 4.4 Calculate the "explicit" fluxes of sensible heat and moisture. SFEXCH3A.1167
C----------------------------------------------------------------------- SFEXCH3A.1168
C SFEXCH3A.1169
C Firstly for land points, sea points with no sea-ice (ICE_FRACT=0.0) SFEXCH3A.1170
C and the sea-ice parts of the sea-ice points. SFEXCH3A.1171
FTL_1(I) = -RHOKH_1(I) * DTEMP(I) ! P243.134 SFEXCH3A.1172
FQW_1(I) = -RHOKE(I) * DQ(I) ! P243.135 SFEXCH3A.1173
EA(I) = -RHOKEA(I) * DQ(I) ! P243.136 SFEXCH3A.1174
ES(I) = -RHOKES(I) * DQ(I) ! P243.137 SFEXCH3A.1175
ESL(I) = -RHOKESL(I) * DQ(I) ! P243.138 SFEXCH3A.1176
FTL_LEAD(I) = 1.0E30 ! Missing data indicator SFEXCH3A.1177
FQW_LEAD(I) = 1.0E30 ! Missing data indicator SFEXCH3A.1178
C SFEXCH3A.1179
C Secondly for sea ice points. SFEXCH3A.1180
IF ( (ICE_FRACT(I).GT.0.0) .AND. .NOT.LAND_MASK(I) ) THEN SFEXCH3A.1181
FTL_LEAD(I) = -RHOKH_1(I)*DTEMP_LEAD(I) * (1.0-ICE_FRACT(I)) SFEXCH3A.1182
C ...P2430.11 SFEXCH3A.1183
FTL_1(I) = FTL_LEAD(I) + FTL_1(I)*ICE_FRACT(I) ! P2430.13/15 SFEXCH3A.1184
FQW_LEAD(I) = -RHOKE(I)*DQ_LEAD(I) * (1.0-ICE_FRACT(I)) SFEXCH3A.1185
C ...P2430.12 SFEXCH3A.1186
FQW_1(I) = FQW_LEAD(I) + FQW_1(I)*ICE_FRACT(I) ! P2430.14/16 SFEXCH3A.1187
ENDIF SFEXCH3A.1188
C----------------------------------------------------------------------- SFEXCH3A.1189
CL 4.4.1 Set indicator for unstable suface layer (buoyancy flux +ve.) ASJ3F401.15
CL if required by logical L_RMBL. ASJ3F401.16
C----------------------------------------------------------------------- SFEXCH3A.1191
IF ( L_RMBL.AND.BT_1(I)*FTL_1(I)+BQ_1(I)*FQW_1(I).GT.0.0) THEN ASJ3F401.17
NRML(I) = 1 SFEXCH3A.1193
ELSE SFEXCH3A.1194
NRML(I) = 0 SFEXCH3A.1195
ENDIF SFEXCH3A.1196
C----------------------------------------------------------------------- SFEXCH3A.1197
CL 4.5 Multiply surface exchange coefficients that are on the P-grid SFEXCH3A.1198
CL by GAMMA(1).Needed for implicit calculations in P244(IMPL_CAL). SFEXCH3A.1199
CL RHOKM_1 dealt with in section 4.1 below. SFEXCH3A.1200
C----------------------------------------------------------------------- SFEXCH3A.1201
RHOKE(I) = RHOKE(I) * GAMMA(1) SFEXCH3A.1202
RHOKEA(I) = RHOKEA(I) * GAMMA(1) SFEXCH3A.1203
RHOKES(I) = RHOKES(I) * GAMMA(1) SFEXCH3A.1204
RHOKESL(I) = RHOKESL(I) * GAMMA(1) SFEXCH3A.1205
RHOKH_1(I) = RHOKH_1(I) * GAMMA(1) SFEXCH3A.1206
C----------------------------------------------------------------------- SFEXCH3A.1207
CL 4.5.1 Calculate the standard deviations of layer 1 turbulent SFEXCH3A.1208
CL fluctuations of temperature and humidity using approximate SFEXCH3A.1209
CL formulae from first order closure. SFEXCH3A.1210
C----------------------------------------------------------------------- SFEXCH3A.1211
VS = SQRT ( RHOKM_1(I)/RHOSTAR * VSHR(I) ) SFEXCH3A.1212
VSF1_CUBED = 1.25 * ( Z1(I) + Z0M(I) ) * G * SFEXCH3A.1213
& ( BT_1(I)*FTL_1(I) + BQ_1(I)*FQW_1(I) ) / RHOSTAR SFEXCH3A.1214
C !--------------------------------------------------------------- SFEXCH3A.1215
C ! Only calculate standard deviations for unstable surface layers SFEXCH3A.1216
C !--------------------------------------------------------------- SFEXCH3A.1217
IF (VSF1_CUBED .GT. 0.0) THEN SFEXCH3A.1218
WS1 = ( VSF1_CUBED + VS * VS * VS ) ** (1.0/3.0) SFEXCH3A.1219
T1_SD(I) = MAX ( 0.0 , 1.93 * FTL_1(I) / (RHOSTAR * WS1) ) SFEXCH3A.1220
Q1_SD(I) = MAX ( 0.0 , 1.93 * FQW_1(I) / (RHOSTAR * WS1) ) SFEXCH3A.1221
ELSE SFEXCH3A.1222
T1_SD(I) = 0.0 SFEXCH3A.1223
Q1_SD(I) = 0.0 SFEXCH3A.1224
ENDIF SFEXCH3A.1225
C----------------------------------------------------------------------- SFEXCH3A.1226
CL 4.6 For sea points, calculate the wind mixing energy flux and the SFEXCH3A.1227
CL sea-surface roughness length on the P-grid, using time-level n SFEXCH3A.1228
CL quantities. Use CD_LEAD at sea-ice points. SFEXCH3A.1229
C----------------------------------------------------------------------- SFEXCH3A.1230
IF (.NOT.LAND_MASK(I)) THEN SFEXCH3A.1231
TAU = RHOKM_1(I) * VSHR(I) ! P243.130 SFEXCH3A.1232
IF (ICE_FRACT(I) .GT. 0.0) SFEXCH3A.1233
& TAU = RHOSTAR * CD_LEAD(I) * VSHR(I) * VSHR(I) SFEXCH3A.1234
IF (SFME) FME(I) = (1.0-ICE_FRACT(I)) * TAU * SQRT(TAU/RHOSEA) SFEXCH3A.1235
C ! P243.96 SFEXCH3A.1236
Z0MSEA(I) = MAX ( Z0HSEA , SFEXCH3A.1237
& (CHARNOCK/G) * (TAU / RHOSTAR) ) SFEXCH3A.1238
C ... P243.B6 (Charnock formula) SFEXCH3A.1239
C TAU/RHOSTAR is "mod VS squared", see eqn P243.131 SFEXCH3A.1240
C SFEXCH3A.1241
ENDIF ! of IF (.NOT. LAND_MASK), land-points done in next loop. SFEXCH3A.1245
ENDDO ! Loop over points for sections 4.2 - 4.6 SFEXCH3A.1246
DO L=1,LAND_PTS SFEXCH3A.1247
I = LAND_INDEX(L) - (P1-1) SFEXCH3A.1248
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.1250
CL 4.7 Set Z0MSEA to Z0V, FME to zero for land points. SFEXCH3A.1251
C (Former because UM uses same storage for Z0V SFEXCH3A.1252
C and Z0MSEA.) SFEXCH3A.1253
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.1254
Z0MSEA(I) = Z0V(I) SFEXCH3A.1255
IF (SFME) FME(I) = 0.0 SFEXCH3A.1256
ENDDO ! Loop over points for section 4.7 SFEXCH3A.1262
*IF -DEF,SCMA AJC1F405.124
C SFEXCH3A.1263
C----------------------------------------------------------------------- SFEXCH3A.1264
CL 5. Calculate "explicit" surface fluxes of momentum (on UV-grid). SFEXCH3A.1265
C----------------------------------------------------------------------- SFEXCH3A.1266
CL 5.1 Interpolate exchange coefficient to UV-grid, then mutiply SFEXCH3A.1267
CL by GAMMA(1) to be passed to subroutine IMPL_CAL (P244) which SFEXCH3A.1268
CL only uses RHOKM_1 when mulitplied by GAMMA(1). SFEXCH3A.1269
C----------------------------------------------------------------------- SFEXCH3A.1270
C SFEXCH3A.1271
C PSIS used purely as spare workspace here. SFEXCH3A.1272
C SFEXCH3A.1273
*IF DEF,MPP ASJ1F403.8
! RHOKM_1 contains incorrect data in halos. The P_TO_UV can interpolate ASJ1F403.9
! this into the real data, so first we must update east/west halos. ASJ1F403.10
CALL SWAPBOUNDS
(RHOKM_1,ROW_LENGTH,U_POINTS/ROW_LENGTH,1,0,1) ASJ1F403.11
ASJ1F403.12
*ENDIF ASJ1F403.13
CALL P_TO_UV
(RHOKM_1,PSIS,P_POINTS,U_POINTS,ROW_LENGTH,P_ROWS) SFEXCH3A.1274
DO I=1,U_POINTS-2*ROW_LENGTH SFEXCH3A.1275
J = I+ROW_LENGTH SFEXCH3A.1276
RHOKM_1(J) = PSIS(I) SFEXCH3A.1277
TAUX_1(J) = RHOKM_1(J) * ( U_1(J) - U_0(J) ) ! P243.132 SFEXCH3A.1278
TAUY_1(J) = RHOKM_1(J) * ( V_1(J) - V_0(J) ) ! P243.133 SFEXCH3A.1279
RHOKM_1(J) = GAMMA(1) * RHOKM_1(J) SFEXCH3A.1280
ENDDO SFEXCH3A.1281
C----------------------------------------------------------------------- SFEXCH3A.1282
CL 5.2 Set first and last rows to "missing data indicator". SFEXCH3A.1283
C----------------------------------------------------------------------- SFEXCH3A.1284
*IF DEF,MPP GPB1F403.7
IF (attop) THEN GPB1F403.8
*ENDIF GPB1F403.9
DO I=1,ROW_LENGTH GPB1F403.10
RHOKM_1(I) = 1.0E30 GPB1F403.11
TAUX_1(I) = 1.0E30 GPB1F403.12
TAUY_1(I) = 1.0E30 GPB1F403.13
ENDDO GPB1F403.14
*IF DEF,MPP GPB1F403.15
ENDIF GPB1F403.16
GPB1F403.17
IF (atbase) THEN GPB1F403.18
*ENDIF GPB1F403.19
DO I= (U_ROWS-1)*ROW_LENGTH + 1 , U_ROWS*ROW_LENGTH GPB1F403.20
RHOKM_1(I) = 1.0E30 GPB1F403.21
TAUX_1(I) = 1.0E30 GPB1F403.22
TAUY_1(I) = 1.0E30 GPB1F403.23
ENDDO GPB1F403.24
*IF DEF,MPP GPB1F403.25
ENDIF GPB1F403.26
*ENDIF GPB1F403.27
C----------------------------------------------------------------------- SFEXCH3A.1294
CL 5.D Interpolate CDR10M to UV-grid. SFEXCH3A.1295
C----------------------------------------------------------------------- SFEXCH3A.1296
*IF DEF,MPP ASJ1F403.14
! CDR10M contains incorrect data in halos. The P_TO_UV can interpolate ASJ1F403.15
! this into the real data, so first we must update east/west halos. ASJ1F403.16
CALL SWAPBOUNDS
(CDR10M,ROW_LENGTH,U_POINTS/ROW_LENGTH,1,0,1) ASJ1F403.17
ASJ1F403.18
*ENDIF ASJ1F403.19
IF (SU10 .OR. SV10) THEN SFEXCH3A.1297
CALL P_TO_UV
(CDR10M,PSIS,P_POINTS,U_POINTS,ROW_LENGTH,P_ROWS) SFEXCH3A.1298
DO I=1,U_POINTS-2*ROW_LENGTH SFEXCH3A.1299
J = I + ROW_LENGTH ARN1F400.80
CDR10M(J) = PSIS(I) ARN1F400.81
ENDDO SFEXCH3A.1301
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.1302
CL 5.D.1 Set first and last rows to "missing data indicator". SFEXCH3A.1303
C- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SFEXCH3A.1304
*IF DEF,MPP GPB1F403.28
IF (attop) THEN GPB1F403.29
*ENDIF GPB1F403.30
DO I=1,ROW_LENGTH GPB1F403.31
CDR10M(I) = 1.0E30 GPB1F403.32
ENDDO GPB1F403.33
*IF DEF,MPP GPB1F403.34
ENDIF GPB1F403.35
GPB1F403.36
IF (atbase) THEN GPB1F403.37
*ENDIF GPB1F403.38
DO I= (U_ROWS-1)*ROW_LENGTH + 1 , U_ROWS*ROW_LENGTH GPB1F403.39
CDR10M(I) = 1.0E30 GPB1F403.40
ENDDO GPB1F403.41
*IF DEF,MPP GPB1F403.42
ENDIF GPB1F403.43
*ENDIF GPB1F403.44
ENDIF SFEXCH3A.1310
*ELSE SFEXCH3A.1311
C SFEXCH3A.1312
C----------------------------------------------------------------------- SFEXCH3A.1313
CL 5. Calculate "explicit" surface fluxes of momentum, then overwrite SFEXCH3A.1314
CL coefficient with GAMMA(1)*RHOKM_1 to be passed out for implicit SFEXCH3A.1315
CL calculations in P244 (subroutine IMPL_CAL). This routine only SFEXCH3A.1316
CL uses RHOKM_1when multiplied by GAMMA(1). SFEXCH3A.1317
C----------------------------------------------------------------------- SFEXCH3A.1318
C SFEXCH3A.1319
DO I=1,U_POINTS SFEXCH3A.1320
TAUX_1(I) = RHOKM_1(I) * ( U_1(I) - U_0(I) ) ! P243.132 SFEXCH3A.1321
TAUY_1(I) = RHOKM_1(I) * ( V_1(I) - V_0(I) ) ! P243.133 SFEXCH3A.1322
RHOKM_1(I) = GAMMA(1) * RHOKM_1(I) SFEXCH3A.1323
ENDDO SFEXCH3A.1324
*ENDIF SFEXCH3A.1325
6 CONTINUE ! Branch for error exit. SFEXCH3A.1326
IF (LTIMER) THEN SFEXCH3A.1327
CALL TIMER
('SFEXCH ',4) SFEXCH3A.1328
ENDIF SFEXCH3A.1329
RETURN SFEXCH3A.1330
END SFEXCH3A.1331
*ENDIF SFEXCH3A.1332