*IF DEF,A70_1B TRSFC3B.2
*IF DEF,A01_3A,OR,DEF,A02_3A TRSFC3B.3
C ******************************COPYRIGHT****************************** TRSFC3B.4
C (c) CROWN COPYRIGHT 1998, METEOROLOGICAL OFFICE, All Rights Reserved. TRSFC3B.5
C TRSFC3B.6
C Use, duplication or disclosure of this code is subject to the TRSFC3B.7
C restrictions as set forth in the contract. TRSFC3B.8
C TRSFC3B.9
C Meteorological Office TRSFC3B.10
C London Road TRSFC3B.11
C BRACKNELL TRSFC3B.12
C Berkshire UK TRSFC3B.13
C RG12 2SZ TRSFC3B.14
C TRSFC3B.15
C If no contract has been raised with this copy of the code, the use, TRSFC3B.16
C duplication or disclosure of it is strictly prohibited. Permission TRSFC3B.17
C to do so must first be obtained in writing from the Head of Numerical TRSFC3B.18
C Modelling at the above address. TRSFC3B.19
C ******************************COPYRIGHT****************************** TRSFC3B.20
C TRSFC3B.21
!+ Subroutine to calculate transmission and reflection coefficients. TRSFC3B.22
! TRSFC3B.23
! Method: TRSFC3B.24
! Straightforward. TRSFC3B.25
! TRSFC3B.26
! Current Owner of Code: J. M. Edwards TRSFC3B.27
! TRSFC3B.28
! History: TRSFC3B.29
! Version Date Comment TRSFC3B.30
! 4.5 11-06-98 Optimised Code TRSFC3B.31
! (P. Burton) TRSFC3B.32
! TRSFC3B.33
! Description of Code: TRSFC3B.34
! FORTRAN 77 with extensions listed in documentation. TRSFC3B.35
! TRSFC3B.36
!- --------------------------------------------------------------------- TRSFC3B.37
SUBROUTINE TRANS_SOURCE_COEFF(N_PROFILE 2TRSFC3B.38
& , I_LAYER_FIRST, I_LAYER_LAST TRSFC3B.39
& , ISOLIR, L_IR_SOURCE_QUAD TRSFC3B.40
& , TAU, SUM, DIFF, LAMBDA, SEC_0 TRSFC3B.41
& , GAMMA_UP, GAMMA_DOWN TRSFC3B.42
& , TRANS, REFLECT, TRANS_0, SOURCE_COEFF TRSFC3B.43
& , NPD_PROFILE, NPD_LAYER TRSFC3B.44
& ) TRSFC3B.45
! TRSFC3B.46
! TRSFC3B.47
IMPLICIT NONE TRSFC3B.48
! TRSFC3B.49
! TRSFC3B.50
! SIZES OF DUMMY ARRAYS. TRSFC3B.51
INTEGER !, INTENT(IN) TRSFC3B.52
& NPD_PROFILE TRSFC3B.53
! MAXIMUM NUMBER OF PROFILES TRSFC3B.54
& , NPD_LAYER TRSFC3B.55
! MAXIMUM NUMBER OF LAYERS TRSFC3B.56
! TRSFC3B.57
! COMDECKS INCLUDED TRSFC3B.58
*CALL DIMFIX3A
TRSFC3B.59
*CALL SPCRG3A
TRSFC3B.60
*CALL PRMCH3A
TRSFC3B.61
*CALL SCFPT3A
TRSFC3B.62
! TRSFC3B.63
! DUMMY VARIABLES. TRSFC3B.64
INTEGER !, INTENT(IN) TRSFC3B.65
& N_PROFILE TRSFC3B.66
! NUMBER OF PROFILES TRSFC3B.67
& , I_LAYER_FIRST TRSFC3B.68
! FIRST LAYER TO CONSIDER TRSFC3B.69
& , I_LAYER_LAST TRSFC3B.70
! LAST LAYER TO CONSIDER TRSFC3B.71
! TRSFC3B.72
! ALGORITHMIC CONTROL TRSFC3B.73
LOGICAL !, INTENT(IN) TRSFC3B.74
& L_IR_SOURCE_QUAD TRSFC3B.75
! QUADRATIC SOURCE IN INFRA-RED TRSFC3B.76
INTEGER !, INTENT(IN) TRSFC3B.77
& ISOLIR TRSFC3B.78
! SPECTRAL REGION TRSFC3B.79
! TRSFC3B.80
! OPTICAL PROPERTIES OF THE LAYER TRSFC3B.81
REAL !, INTENT(IN) TRSFC3B.82
& TAU(NPD_PROFILE, NPD_LAYER) TRSFC3B.83
! OPTICAL DEPTHS OF LAYERS TRSFC3B.84
& , SUM(NPD_PROFILE, NPD_LAYER) TRSFC3B.85
! SUM OF ALPHA_1 AND ALPHA_2 TRSFC3B.86
& , DIFF(NPD_PROFILE, NPD_LAYER) TRSFC3B.87
! DIFFERENCE OF ALPHA_1 AND ALPHA_2 TRSFC3B.88
& , LAMBDA(NPD_PROFILE, NPD_LAYER) TRSFC3B.89
! LAMBDA TRSFC3B.90
& , SEC_0(NPD_PROFILE) TRSFC3B.91
! SECANT OF SOLAR ZENITH ANGLE TRSFC3B.92
& , GAMMA_UP(NPD_PROFILE, NPD_LAYER) TRSFC3B.93
! BASIC SOLAR COEFFICIENT FOR UPWARD RADIATION TRSFC3B.94
& , GAMMA_DOWN(NPD_PROFILE, NPD_LAYER) TRSFC3B.95
! BASIC SOLAR COEFFICIENT FOR DOWNWARD RADIATION TRSFC3B.96
! TRSFC3B.97
! TRANSMISSION AND REFLECTION COEFFICIENTS AND COEFFICIENTS FOR TRSFC3B.98
! SOURCE TERMS. TRSFC3B.99
REAL !, INTENT(OUT) TRSFC3B.100
& TRANS(NPD_PROFILE, NPD_LAYER) TRSFC3B.101
! DIFFUSE TRANSMISSION COEFFICIENT TRSFC3B.102
& , REFLECT(NPD_PROFILE, NPD_LAYER) TRSFC3B.103
! DIFFUSE REFLECTION COEFFICIENT TRSFC3B.104
& , TRANS_0(NPD_PROFILE, NPD_LAYER) TRSFC3B.105
! DIRECT TRANSMISSION COEFFICIENT TRSFC3B.106
& , SOURCE_COEFF(NPD_PROFILE, NPD_LAYER, NPD_SOURCE_COEFF) TRSFC3B.107
! SOURCE COEFFICIENTS TRSFC3B.108
! TRSFC3B.109
! TRSFC3B.110
! LOCAL VARIABLES TRSFC3B.111
INTEGER TRSFC3B.112
& I TRSFC3B.113
! LOOP VARIABLE TRSFC3B.114
& , L TRSFC3B.115
! LOOP VARIABLE TRSFC3B.116
REAL TRSFC3B.117
& GAMMA TRSFC3B.118
! GAMMA TRSFC3B.119
& , EXPONENTIAL TRSFC3B.120
! EXPONENTIAL OF SCALED OPTICAL DEPTH TRSFC3B.121
REAL XLAMTAU(N_PROFILE,I_LAYER_LAST-I_LAYER_FIRST+1) !Workspace TRSFC3B.122
INTEGER n_input ! No. of inputs for exp_v TRSFC3B.123
REAL TMP_INV, TEMP_NUM2,TEMP_DEN2 TRSFC3B.124
REAL TEMP_NUM1,TEMP_DEN1 TRSFC3B.125
REAL TEMP(NPD_PROFILE) TRSFC3B.126
! TRSFC3B.127
! TRSFC3B.128
! TRSFC3B.129
! TRSFC3B.130
! DETERMINE THE DIFFUSE TRANSMISSION AND REFLECTION COEFFICIENTS. TRSFC3B.131
! TRSFC3B.132
DO I=I_LAYER_FIRST, I_LAYER_LAST TRSFC3B.133
DO L=1, N_PROFILE TRSFC3B.134
XLAMTAU(L,I-I_LAYER_FIRST+1)=-LAMBDA(L,I)*TAU(L,I) TRSFC3B.135
ENDDO TRSFC3B.136
ENDDO TRSFC3B.137
n_input=(I_LAYER_LAST-I_LAYER_FIRST+1)*N_PROFILE TRSFC3B.138
*IF DEF,VECTLIB PXVECTLB.150
call exp_v(
n_input,xlamtau,xlamtau) TRSFC3B.140
*ELSE TRSFC3B.141
do I=1,I_LAYER_LAST-I_LAYER_FIRST+1 TRSFC3B.142
do L=1,n_profile TRSFC3B.143
xlamtau(L,I)=exp(xlamtau(L,I)) TRSFC3B.144
end do TRSFC3B.145
end do TRSFC3B.146
*ENDIF TRSFC3B.147
! TRSFC3B.148
DO I=I_LAYER_FIRST, I_LAYER_LAST TRSFC3B.149
DO L=1, N_PROFILE TRSFC3B.150
EXPONENTIAL=xlamtau(L,I-I_LAYER_FIRST+1) TRSFC3B.151
GAMMA=(SUM(L, I)-LAMBDA(L, I)) TRSFC3B.152
& /(SUM(L, I)+LAMBDA(L, I)) TRSFC3B.153
TMP_INV = 1.0E+00 TRSFC3B.154
& /(1.0E+00-(EXPONENTIAL*GAMMA)**2) TRSFC3B.155
TRANS(L, I)=EXPONENTIAL*(1.0E+00-GAMMA**2) TRSFC3B.156
& *TMP_INV TRSFC3B.157
REFLECT(L, I)=GAMMA*(1.0E+00-EXPONENTIAL**2) TRSFC3B.158
& *TMP_INV TRSFC3B.159
ENDDO TRSFC3B.160
ENDDO TRSFC3B.161
! TRSFC3B.162
! TRSFC3B.163
! TRSFC3B.164
IF (ISOLIR.EQ.IP_SOLAR) THEN TRSFC3B.165
! TRSFC3B.166
! CALCULATE THE DIRECT TRANSMISSION AND THE SOURCE COEFFICIENTS TRSFC3B.167
! FOR THE SOLAR BEAM: IN THE SOLAR CASE THESE ARE TRSFC3B.168
! THE COEFFICIENTS WHICH WILL MULTIPLY THE DIRECT FLUX AT THE TRSFC3B.169
! TOP OF THE LAYER TO GIVE THE SOURCE TERMS FOR THE UPWARD TRSFC3B.170
! DIFFUSE FLUX AND THE TOTAL DOWNWARD FLUX. TRSFC3B.171
! TRSFC3B.172
DO I=I_LAYER_FIRST, I_LAYER_LAST TRSFC3B.173
*IF DEF,VECTLIB PXVECTLB.151
DO L=1, N_PROFILE TRSFC3B.175
TEMP(L) = -TAU(L,I)*SEC_0(L) TRSFC3B.176
END DO TRSFC3B.177
CALL EXP_V(
N_PROFILE,TEMP,TRANS_0(1,I)) TRSFC3B.178
*ELSE TRSFC3B.179
DO L=1, N_PROFILE TRSFC3B.180
TRANS_0(L, I)=EXP(-TAU(L, I)*SEC_0(L)) TRSFC3B.181
ENDDO TRSFC3B.182
*ENDIF TRSFC3B.183
TRSFC3B.184
DO L=1,N_PROFILE TRSFC3B.185
SOURCE_COEFF(L,I,IP_SCF_SOLAR_UP) TRSFC3B.186
& = (GAMMA_UP(L,I) - REFLECT(L,I) TRSFC3B.187
& *(1.0E+00+GAMMA_DOWN(L,I))) TRSFC3B.188
SOURCE_COEFF(L,I,IP_SCF_SOLAR_DOWN) TRSFC3B.189
& =(1.0E+00+GAMMA_DOWN(L,I) TRSFC3B.190
& -GAMMA_UP(L,I)*REFLECT(L,I)) TRSFC3B.191
END DO TRSFC3B.192
DO L=1,N_PROFILE TRSFC3B.193
SOURCE_COEFF(L,I,IP_SCF_SOLAR_UP) TRSFC3B.194
& = SOURCE_COEFF(L,I,IP_SCF_SOLAR_UP) TRSFC3B.195
& -GAMMA_UP(L,I)*TRANS(L,I)*TRANS_0(L,I) TRSFC3B.196
END DO TRSFC3B.197
DO L=1,N_PROFILE TRSFC3B.198
SOURCE_COEFF(L,I,IP_SCF_SOLAR_DOWN) TRSFC3B.199
& = TRANS_0(L,I)*SOURCE_COEFF(L,I,IP_SCF_SOLAR_DOWN) TRSFC3B.200
& -(1.0E+00+GAMMA_DOWN(L,I))*TRANS(L,I) TRSFC3B.201
END DO TRSFC3B.202
ENDDO TRSFC3B.203
! TRSFC3B.204
! TRSFC3B.205
ELSE IF (ISOLIR.EQ.IP_INFRA_RED) THEN TRSFC3B.206
! TRSFC3B.207
! IN THE CASE OF INFRA-RED RADIATION, THE FIRST SOURCE TRSFC3B.208
! COEFFICIENT HOLDS THE MULTIPLIER FOR THE FIRST DIFFERENCE TRSFC3B.209
! OF THE PLANCK FUNCTION ACROSS THE LAYER, AND THE SECOND TRSFC3B.210
! THAT FOR THE SECOND DIFFERENCE. TRSFC3B.211
! TRSFC3B.212
DO I=I_LAYER_FIRST, I_LAYER_LAST TRSFC3B.213
DO L=1, N_PROFILE TRSFC3B.214
TRSFC3B.215
! A TOLERANCE IS ADDED TO THE NUMERATOR AND THE DENOMIATOR TRSFC3B.216
! TO AVOID ILL-CONDITIONING AT SMALL OPTICAL DEPTHS. TRSFC3B.217
! TRSFC3B.218
SOURCE_COEFF(L, I, IP_SCF_IR_1D)=(1.0E+00-TRANS(L, I) TRSFC3B.219
& +REFLECT(L, I)+SQRT_TOL_MACHINE) TRSFC3B.220
& /(SQRT_TOL_MACHINE+TAU(L, I)*SUM(L, I)) TRSFC3B.221
TRSFC3B.222
ENDDO TRSFC3B.223
ENDDO TRSFC3B.224
! TRSFC3B.225
! TRSFC3B.226
IF (L_IR_SOURCE_QUAD) THEN TRSFC3B.227
! TRSFC3B.228
! QUADRATIC CORRECTION TO SOURCE FUNCTION. TRSFC3B.229
! THIS CORRECTION IS VERY ILL-CONDITIONED FOR TRSFC3B.230
! SMALL OPTICAL DEPTHS SO THE ASYMPTOTIC FORM IS THEN USED. TRSFC3B.231
! TRSFC3B.232
DO I=I_LAYER_FIRST, I_LAYER_LAST TRSFC3B.233
DO L=1, N_PROFILE TRSFC3B.234
! TRSFC3B.235
! USE A SEPARATE ASYMPTOTIC FORM WHEN THE OPTICAL TRSFC3B.236
! DEPTH IS SMALL, MAKING THE TRANSITION WHEN THE TRSFC3B.237
! OPTICAL DEPTH IS ROUGHLY EQUAL TO THE CUBE ROOT TRSFC3B.238
! OF THE MACHINE'S PRECISION. TRSFC3B.239
! TRSFC3B.240
IF (TAU(L, I).GT.EXP(3.3E-01*LOG(TOL_MACHINE))) THEN TRSFC3B.241
SOURCE_COEFF(L, I, IP_SCF_IR_2D) TRSFC3B.242
& =-2.0E+00*(1.0E+00-TRANS(L, I)-REFLECT(L, I) TRSFC3B.243
& +SQRT_TOL_MACHINE) TRSFC3B.244
& /(DIFF(L, I)*TAU(L, I)+SQRT_TOL_MACHINE) TRSFC3B.245
ELSE TRSFC3B.246
SOURCE_COEFF(L, I, IP_SCF_IR_2D) TRSFC3B.247
& =-2.0E+00+DIFF(L, I)*TAU(L, I) TRSFC3B.248
ENDIF TRSFC3B.249
! TRSFC3B.250
END DO TRSFC3B.251
END DO TRSFC3B.252
TRSFC3B.253
DO I=I_LAYER_FIRST, I_LAYER_LAST TRSFC3B.254
DO L=1, N_PROFILE TRSFC3B.255
SOURCE_COEFF(L, I, IP_SCF_IR_2D) TRSFC3B.256
& =-(1.0E+00+REFLECT(L, I)+TRANS(L, I) TRSFC3B.257
& +SOURCE_COEFF(L, I, IP_SCF_IR_2D)) TRSFC3B.258
& /(SUM(L, I)*TAU(L, I)+SQRT_TOL_MACHINE) TRSFC3B.259
ENDDO TRSFC3B.260
ENDDO TRSFC3B.261
! TRSFC3B.262
ENDIF TRSFC3B.263
! TRSFC3B.264
ENDIF TRSFC3B.265
! TRSFC3B.266
RETURN TRSFC3B.267
END TRSFC3B.268
*ENDIF DEF,A01_3A,OR,DEF,A02_3A TRSFC3B.269
*ENDIF DEF,A70_1B TRSFC3B.270