*IF DEF,A70_1B TCF3B.2
*IF DEF,A01_3A,OR,DEF,A02_3A TCF3B.3
C ******************************COPYRIGHT****************************** TCF3B.4
C (c) CROWN COPYRIGHT 1998, METEOROLOGICAL OFFICE, All Rights Reserved. TCF3B.5
C TCF3B.6
C Use, duplication or disclosure of this code is subject to the TCF3B.7
C restrictions as set forth in the contract. TCF3B.8
C TCF3B.9
C Meteorological Office TCF3B.10
C London Road TCF3B.11
C BRACKNELL TCF3B.12
C Berkshire UK TCF3B.13
C RG12 2SZ TCF3B.14
C TCF3B.15
C If no contract has been raised with this copy of the code, the use, TCF3B.16
C duplication or disclosure of it is strictly prohibited. Permission TCF3B.17
C to do so must first be obtained in writing from the Head of Numerical TCF3B.18
C Modelling at the above address. TCF3B.19
C ******************************COPYRIGHT****************************** TCF3B.20
C TCF3B.21
!+ Subroutine to calculate coefficients in the two-stream equations. TCF3B.22
! TCF3B.23
! Method: TCF3B.24
! The basic two-stream coefficients in the differential equations TCF3B.25
! are calculated. These are then used to determine the TCF3B.26
! transmission and reflection coefficients. Coefficients for TCF3B.27
! determining the solar or infra-red source terms are calculated. TCF3B.28
! TCF3B.29
! Current Owner of Code: J. M. Edwards TCF3B.30
! TCF3B.31
! History: TCF3B.32
! Version Date Comment TCF3B.33
! 4.5 11-06-98 Optimised Code TCF3B.34
! (P. Burton) TCF3B.35
! TCF3B.36
! Description of Code: TCF3B.37
! FORTRAN 77 with extensions listed in documentation. TCF3B.38
! TCF3B.39
!- --------------------------------------------------------------------- TCF3B.40
SUBROUTINE TWO_COEFF(IERR 8,6TCF3B.41
& , N_PROFILE, I_LAYER_FIRST, I_LAYER_LAST TCF3B.42
& , I_2STREAM, L_IR_SOURCE_QUAD TCF3B.43
& , ASYMMETRY, OMEGA, TAU TCF3B.44
& , ISOLIR, SEC_0 TCF3B.45
& , TRANS, REFLECT, TRANS_0 TCF3B.46
& , SOURCE_COEFF TCF3B.47
& , NPD_PROFILE, NPD_LAYER TCF3B.48
& ) TCF3B.49
! TCF3B.50
! TCF3B.51
! TCF3B.52
IMPLICIT NONE TCF3B.53
! TCF3B.54
! TCF3B.55
! SIZES OF DUMMY ARRAYS. TCF3B.56
INTEGER !, INTENT(IN) TCF3B.57
& NPD_PROFILE TCF3B.58
! MAXIMUM NUMBER OF PROFILES TCF3B.59
& , NPD_LAYER TCF3B.60
! MAXIMUM NUMBER OF LAYERS TCF3B.61
! TCF3B.62
! INCLUDE COMDECKS. TCF3B.63
*CALL DIMFIX3A
TCF3B.64
*CALL SPCRG3A
TCF3B.65
*CALL PRMCH3A
TCF3B.66
*CALL PRECSN3A
TCF3B.67
*CALL ERROR3A
TCF3B.68
! TCF3B.69
! TCF3B.70
! TCF3B.71
! DUMMY ARGUMENTS. TCF3B.72
INTEGER !, INTENT(OUT) TCF3B.73
& IERR TCF3B.74
! ERROR FLAG TCF3B.75
INTEGER !, INTENT(IN) TCF3B.76
& N_PROFILE TCF3B.77
! NUMBER OF PROFILES TCF3B.78
& , I_LAYER_FIRST TCF3B.79
! FIRST LAYER TO CONSIDER TCF3B.80
& , I_LAYER_LAST TCF3B.81
! LAST LAYER TO CONSIDER TCF3B.82
& , ISOLIR TCF3B.83
! SPECTRAL REGION TCF3B.84
& , I_2STREAM TCF3B.85
! TWO STREAM SCHEME TCF3B.86
LOGICAL !, INTENT(IN) TCF3B.87
& L_IR_SOURCE_QUAD TCF3B.88
! USE A QUADRATIC SOURCE FUNCTION TCF3B.89
! TCF3B.90
! OPTICAL PROPERTIES OF LAYER: TCF3B.91
REAL !, INTENT(IN) TCF3B.92
& ASYMMETRY(NPD_PROFILE, NPD_LAYER) TCF3B.93
! ASYMMETRY FACTOR TCF3B.94
& , OMEGA(NPD_PROFILE, NPD_LAYER) TCF3B.95
! ALBEDO OF SINGLE SCATTERING TCF3B.96
& , TAU(NPD_PROFILE, NPD_LAYER) TCF3B.97
! OPTICAL DEPTH TCF3B.98
! TCF3B.99
! SOLAR BEAM TCF3B.100
REAL !, INTENT(IN) TCF3B.101
& SEC_0(NPD_PROFILE) TCF3B.102
! SECANT OF ZENITH ANGLE TCF3B.103
! TCF3B.104
! TCF3B.105
! COEFFICIENTS IN THE TWO-STREAM EQUATIONS: TCF3B.106
REAL !, INTENT(OUT) TCF3B.107
& TRANS(NPD_PROFILE, NPD_LAYER) TCF3B.108
! DIFFUSE TRANSMISSION COEFFICIENT TCF3B.109
& , REFLECT(NPD_PROFILE, NPD_LAYER) TCF3B.110
! DIFFUSE REFLECTION COEFFICIENT TCF3B.111
& , TRANS_0(NPD_PROFILE, NPD_LAYER) TCF3B.112
! DIRECT TRANSMISSION COEFFICIENT TCF3B.113
& , SOURCE_COEFF(NPD_PROFILE, NPD_LAYER, NPD_SOURCE_COEFF) TCF3B.114
! SOURCE COEFFICIENTS IN TWO-STREAM EQUATIONS TCF3B.115
! TCF3B.116
! TCF3B.117
! LOCAL VARIABLES. TCF3B.118
INTEGER TCF3B.119
& I TCF3B.120
! LOOP VARIABLE TCF3B.121
& , L TCF3B.122
! LOOP VARIABLE TCF3B.123
& , K TCF3B.124
! LOOP VARIABLE TCF3B.125
& , N_INDEX TCF3B.126
! NUMBER OF INDICES SATISFYING TEST TCF3B.127
& , INDEX(NPD_PROFILE) TCF3B.128
! INDICES OF TESTED POINTS TCF3B.129
! TCF3B.130
! COEFFICIENTS IN THE TWO-STREAM EQUATIONS: TCF3B.131
REAL TCF3B.132
& LAMBDA(NPD_PROFILE, NPD_LAYER) TCF3B.133
! COEFFICIENTS IN TWO-STREAM EQUATIONS TCF3B.134
& , SUM(NPD_PROFILE, NPD_LAYER) TCF3B.135
! SUM OF ALPHA_1 AND ALPHA_2 TCF3B.136
& , DIFF(NPD_PROFILE, NPD_LAYER) TCF3B.137
! DIFFERENCE OF ALPHA_1 AND ALPHA_2 TCF3B.138
& , GAMMA_UP(NPD_PROFILE, NPD_LAYER) TCF3B.139
! BASIC SOLAR COEFFICIENT FOR UPWARD RADIATION TCF3B.140
& , GAMMA_DOWN(NPD_PROFILE, NPD_LAYER) TCF3B.141
! BASIC SOLAR COEFFICIENT FOR DOWNWARD RADIATION TCF3B.142
! TCF3B.143
REAL TCF3B.144
& TARGET TCF3B.145
! TARGET TO SEARCH FOR TCF3B.146
TCF3B.147
REAL TCF3B.148
& TEMP(NPD_PROFILE) TCF3B.149
! TCF3B.150
! TCF3B.151
! SUBROUTINES CALLED: TCF3B.152
EXTERNAL TCF3B.153
& TWO_COEFF_BASIC, SOLAR_COEFFICIENT_BASIC TCF3B.154
& , TRANS_SOURCE_COEFF TCF3B.155
! TCF3B.156
! CRAY DIRECTIVES FOR THE WHOLE ROUTINE: TCF3B.157
! POINTS ARE NOT REPEATED IN THE INDEXING ARRAY, SO IT IS SAFE TCF3B.158
! TO VECTORIZE OVER INDIRECTLY ADDRESSED ARRAYS. TCF3B.159
Cfpp$ NODEPCHK R TCF3B.160
! TCF3B.161
! TCF3B.162
! TCF3B.163
! PERTURB THE SINGLE SCATTERING ALBEDO AWAY FROM 1 TO AVOID TCF3B.164
! LATER DIVISION BY 0. TCF3B.165
TARGET=1.0E+00-TOL_DIV TCF3B.166
DO I=I_LAYER_FIRST, I_LAYER_LAST TCF3B.167
! TCF3B.168
N_INDEX=0 TCF3B.169
DO L =1,N_PROFILE TCF3B.170
IF (OMEGA(L,I).GT.TARGET) THEN TCF3B.171
N_INDEX =N_INDEX+1 TCF3B.172
INDEX(N_INDEX)=L TCF3B.173
END IF TCF3B.174
END DO TCF3B.175
! TCF3B.176
DO K=1, N_INDEX TCF3B.177
OMEGA(INDEX(K), I)=TARGET TCF3B.178
ENDDO TCF3B.179
ENDDO TCF3B.180
! TCF3B.181
! CALCULATE THE BASIC TWO-STREAM COEFFICIENTS. TCF3B.182
CALL TWO_COEFF_BASIC
(IERR TCF3B.183
& , N_PROFILE, I_LAYER_FIRST, I_LAYER_LAST TCF3B.184
& , I_2STREAM TCF3B.185
& , ASYMMETRY, OMEGA TCF3B.186
& , SUM, DIFF TCF3B.187
& , NPD_PROFILE, NPD_LAYER TCF3B.188
& ) TCF3B.189
IF (IERR.NE.I_NORMAL) THEN TCF3B.190
RETURN TCF3B.191
ENDIF TCF3B.192
! TCF3B.193
! LAMBDA IS NOW CALCULATED. TCF3B.194
*IF DEF,VECTLIB PXVECTLB.146
DO I=I_LAYER_FIRST, I_LAYER_LAST TCF3B.196
DO L=1, N_PROFILE TCF3B.197
TEMP(L)=SUM(L,I)*DIFF(L,I) TCF3B.198
ENDDO TCF3B.199
CALL SQRT_V(
N_PROFILE,TEMP,LAMBDA(1,I)) TCF3B.200
ENDDO TCF3B.201
*ELSE TCF3B.202
DO I=I_LAYER_FIRST, I_LAYER_LAST TCF3B.203
DO L=1, N_PROFILE TCF3B.204
LAMBDA(L, I)=SQRT(SUM(L, I)*DIFF(L, I)) TCF3B.205
ENDDO TCF3B.206
ENDDO TCF3B.207
*ENDIF TCF3B.208
! TCF3B.209
! TCF3B.210
! CALCULATE THE BASIC COEFFICIENTS FOR THE SOLAR SOURCE TERMS. TCF3B.211
IF (ISOLIR.EQ.IP_SOLAR) THEN TCF3B.212
! LAMBDA MAY BE PERTURBED BY THIS ROUTINE TO AVOID TCF3B.213
! ILL-CONDITIONING FOR THE SINGULAR ZENITH ANGLE. TCF3B.214
CALL SOLAR_COEFFICIENT_BASIC
(IERR TCF3B.215
& , N_PROFILE, I_LAYER_FIRST, I_LAYER_LAST TCF3B.216
& , OMEGA, ASYMMETRY, SEC_0 TCF3B.217
& , I_2STREAM TCF3B.218
& , SUM, DIFF, LAMBDA TCF3B.219
& , GAMMA_UP, GAMMA_DOWN TCF3B.220
& , NPD_PROFILE, NPD_LAYER TCF3B.221
& ) TCF3B.222
IF (IERR.NE.I_NORMAL) RETURN TCF3B.223
ENDIF TCF3B.224
! TCF3B.225
! TCF3B.226
! DETERMINE THE TRANSMISSION AND REFLECTION COEFFICIENTS. TCF3B.227
CALL TRANS_SOURCE_COEFF
(N_PROFILE, I_LAYER_FIRST, I_LAYER_LAST TCF3B.228
& , ISOLIR, L_IR_SOURCE_QUAD TCF3B.229
& , TAU, SUM, DIFF, LAMBDA, SEC_0 TCF3B.230
& , GAMMA_UP, GAMMA_DOWN TCF3B.231
& , TRANS, REFLECT, TRANS_0, SOURCE_COEFF TCF3B.232
& , NPD_PROFILE, NPD_LAYER TCF3B.233
& ) TCF3B.234
! TCF3B.235
! TCF3B.236
! TCF3B.237
RETURN TCF3B.238
END TCF3B.239
*ENDIF DEF,A01_3A,OR,DEF,A02_3A TCF3B.240
*ENDIF DEF,A70_1B TCF3B.241