*IF DEF,A70_1A,OR,DEF,A70_1B APB4F405.33
*IF DEF,A01_3A,OR,DEF,A02_3A GSSAN3A.2
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.13331
C GTS2F400.13332
C Use, duplication or disclosure of this code is subject to the GTS2F400.13333
C restrictions as set forth in the contract. GTS2F400.13334
C GTS2F400.13335
C Meteorological Office GTS2F400.13336
C London Road GTS2F400.13337
C BRACKNELL GTS2F400.13338
C Berkshire UK GTS2F400.13339
C RG12 2SZ GTS2F400.13340
C GTS2F400.13341
C If no contract has been raised with this copy of the code, the use, GTS2F400.13342
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.13343
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.13344
C Modelling at the above address. GTS2F400.13345
C ******************************COPYRIGHT****************************** GTS2F400.13346
C GTS2F400.13347
!+ Subroutine to calculate fluxes using Gaussian quadrature. GSSAN3A.3
! GSSAN3A.4
! Method: GSSAN3A.5
! Fluxes are calculated by using Gaussian quadrature for GSSAN3A.6
! the angular integration. This is not a full implementation GSSAN3A.7
! of Gaussian quadrature for multiple scattering, but is GSSAN3A.8
! intended only for non-scattering calculations in the GSSAN3A.9
! infra-red. In this case, the fluxes can be calculated as GSSAN3A.10
! a weighted sum of two-stream fluxes where the diffusivity GSSAN3A.11
! factors for the two-stream approximations are determined GSSAN3A.12
! from the Gaussian points. GSSAN3A.13
! GSSAN3A.14
! Current Owner of Code: J. M. Edwards GSSAN3A.15
! GSSAN3A.16
! History: GSSAN3A.17
! Version Date Comment GSSAN3A.18
! 4.0 27-07-95 Original Code GSSAN3A.19
! (J. M. Edwards) GSSAN3A.20
! GSSAN3A.21
! Description of Code: GSSAN3A.22
! FORTRAN 77 with extensions listed in documentation. GSSAN3A.23
! GSSAN3A.24
!- --------------------------------------------------------------------- GSSAN3A.25
SUBROUTINE GAUSS_ANGLE(N_PROFILE, N_LAYER, L_NET, N_AUGMENT 1,2GSSAN3A.26
& , N_ORDER_GAUSS GSSAN3A.27
& , TAU GSSAN3A.28
& , FLUX_INC_DOWN GSSAN3A.29
& , DIFF_PLANCK, SOURCE_GROUND, ALBEDO_SURFACE_DIFF GSSAN3A.30
& , FLUX_DIFFUSE GSSAN3A.31
& , L_IR_SOURCE_QUAD, DIFF_PLANCK_2 GSSAN3A.32
& , NPD_PROFILE, NPD_LAYER GSSAN3A.33
& ) GSSAN3A.34
! GSSAN3A.35
! GSSAN3A.36
IMPLICIT NONE GSSAN3A.37
! GSSAN3A.38
! GSSAN3A.39
! SIZES OF DUMMY ARRAYS. GSSAN3A.40
INTEGER !, INTENT(IN) GSSAN3A.41
& NPD_PROFILE GSSAN3A.42
! MAXIMUM NUMBER OF PROFILES GSSAN3A.43
& , NPD_LAYER GSSAN3A.44
! MAXIMUM NUMBER OF LAYERS GSSAN3A.45
! GSSAN3A.46
! INCLUDE COMDECKS. GSSAN3A.47
*CALL SPCRG3A
GSSAN3A.48
*CALL GSSWTP3A
GSSAN3A.49
*CALL C_PI
GSSAN3A.50
! GSSAN3A.51
! DUMMY VARIABLES. GSSAN3A.52
INTEGER !, INTENT(IN) GSSAN3A.53
& N_PROFILE GSSAN3A.54
! NUMBER OF PROFILES GSSAN3A.55
& , N_LAYER GSSAN3A.56
! NUMBER OF LAYERS GSSAN3A.57
& , N_AUGMENT GSSAN3A.58
! SIZE OF ARRAY TO INCREMENT GSSAN3A.59
& , N_ORDER_GAUSS GSSAN3A.60
! ORDER OF GAUSSIAN INTEGRATION GSSAN3A.61
LOGICAL !, INTENT(IN) GSSAN3A.62
& L_NET GSSAN3A.63
! NET FLUXES REQUIRED GSSAN3A.64
& , L_IR_SOURCE_QUAD GSSAN3A.65
! USE QUADRATIC SOURCE TERM GSSAN3A.66
REAL !, INTENT(IN) GSSAN3A.67
& TAU(NPD_PROFILE, NPD_LAYER) GSSAN3A.68
! OPTICAL DEPTH GSSAN3A.69
& , ALBEDO_SURFACE_DIFF(NPD_PROFILE) GSSAN3A.70
! DIFFUSE ALBEDO GSSAN3A.71
& , FLUX_INC_DOWN(NPD_PROFILE) GSSAN3A.72
! INCIDENT TOTAL FLUX GSSAN3A.73
& , DIFF_PLANCK(NPD_PROFILE, NPD_LAYER) GSSAN3A.74
! DIFFERENCE IN PI*PLANCK FUNCTION GSSAN3A.75
& , SOURCE_GROUND(NPD_PROFILE) GSSAN3A.76
! GROUND SOURCE FUNCTION GSSAN3A.77
& , DIFF_PLANCK_2(NPD_PROFILE, NPD_LAYER) GSSAN3A.78
! 2x2ND DIFFERENCES OF PLANCKIAN GSSAN3A.79
REAL !, INTENT(OUT) GSSAN3A.80
& FLUX_DIFFUSE(NPD_PROFILE, 2*NPD_LAYER+2) GSSAN3A.81
! DIFFUSE FLUXES GSSAN3A.82
! GSSAN3A.83
! LOCAL VARIABALES. GSSAN3A.84
INTEGER GSSAN3A.85
& I GSSAN3A.86
! LOOP VARIABLE GSSAN3A.87
& , L GSSAN3A.88
! LOOP VARIABLE GSSAN3A.89
& , K GSSAN3A.90
! LOOP VARIABLE GSSAN3A.91
REAL GSSAN3A.92
& FLUX_STREAM(NPD_PROFILE, 2*NPD_LAYER+2) GSSAN3A.93
! FLUX IN STREAM GSSAN3A.94
& , FLUX_NULL(NPD_PROFILE, 2*NPD_LAYER+2) GSSAN3A.95
! ARRAY OF NULL FLUXES GSSAN3A.96
& , SECANT_RAY GSSAN3A.97
! SECANT OF ANGLE WITH VERTICAL GSSAN3A.98
& , DIFF_PLANCK_RAD(NPD_PROFILE, NPD_LAYER) GSSAN3A.99
! DIFFERENCE IN PI*PLANCK FUNCTION GSSAN3A.100
& , DIFF_PLANCK_RAD_2(NPD_PROFILE, NPD_LAYER) GSSAN3A.101
! 2x2ND DIFFERENCES OF PLANCKIAN GSSAN3A.102
& , SOURCE_GROUND_RAD(NPD_PROFILE) GSSAN3A.103
! GROUND SOURCE FUNCTION GSSAN3A.104
& , RADIANCE_INC(NPD_PROFILE) GSSAN3A.105
! INCIDNET RADIANCE GSSAN3A.106
& , WEIGHT_STREAM GSSAN3A.107
! WEIGHTING FOR STREAM GSSAN3A.108
! GSSAN3A.109
! SET THE GAUSSIAN WEIGHTS FOR INTEGRATION. GSSAN3A.110
*CALL GSSWTD3A
GSSAN3A.111
! GSSAN3A.112
! SUBROUTINES CALLED: GSSAN3A.113
EXTERNAL GSSAN3A.114
& MONOCHROMATIC_IR_RADIANCE, AUGMENT_FLUX GSSAN3A.115
! GSSAN3A.116
! GSSAN3A.117
! GSSAN3A.118
! SET THE SOURCE FUNCTION. GSSAN3A.119
DO L=1, N_PROFILE GSSAN3A.120
SOURCE_GROUND_RAD(L)=SOURCE_GROUND(L)/PI GSSAN3A.121
RADIANCE_INC(L)=FLUX_INC_DOWN(L)/PI GSSAN3A.122
ENDDO GSSAN3A.123
DO I=1, N_LAYER GSSAN3A.124
DO L=1, N_PROFILE GSSAN3A.125
DIFF_PLANCK_RAD(L, I)=DIFF_PLANCK(L, I)/PI GSSAN3A.126
ENDDO GSSAN3A.127
ENDDO GSSAN3A.128
DO I=1, 2*N_LAYER+2 GSSAN3A.129
DO L=1, N_PROFILE GSSAN3A.130
FLUX_DIFFUSE(L, I)=0.0 GSSAN3A.131
ENDDO GSSAN3A.132
ENDDO GSSAN3A.133
IF (L_IR_SOURCE_QUAD) THEN GSSAN3A.134
DO I=1, N_LAYER GSSAN3A.135
DO L=1, N_PROFILE GSSAN3A.136
DIFF_PLANCK_RAD_2(L, I)=DIFF_PLANCK_2(L, I)/PI GSSAN3A.137
ENDDO GSSAN3A.138
ENDDO GSSAN3A.139
ENDIF GSSAN3A.140
! GSSAN3A.141
! CALCULATE THE FLUXES WITH A NUMBER OF DIFFUSIVITY FACTORS GSSAN3A.142
! AND SUM THE RESULTS. GSSAN3A.143
DO K=1, N_ORDER_GAUSS GSSAN3A.144
SECANT_RAY=2.0E+00/(GAUSS_POINT(K, N_ORDER_GAUSS)+1.0E+00) GSSAN3A.145
! GSSAN3A.146
! CALCULATE THE RADIANCE AT THIS ANGLE. GSSAN3A.147
CALL MONOCHROMATIC_IR_RADIANCE
(N_PROFILE, N_LAYER GSSAN3A.148
& , L_NET GSSAN3A.149
& , TAU GSSAN3A.150
& , RADIANCE_INC GSSAN3A.151
& , DIFF_PLANCK_RAD, SOURCE_GROUND_RAD, ALBEDO_SURFACE_DIFF GSSAN3A.152
& , SECANT_RAY GSSAN3A.153
& , FLUX_STREAM GSSAN3A.154
& , NPD_PROFILE, NPD_LAYER GSSAN3A.155
& ) GSSAN3A.156
! GSSAN3A.157
! AUGMENT THE FLUX BY THE AMOUNT IN THIS STREAM. GSSAN3A.158
WEIGHT_STREAM=5.0E-01*PI*GAUSS_WEIGHT(K, N_ORDER_GAUSS) GSSAN3A.159
& *(GAUSS_POINT(K, N_ORDER_GAUSS)+1.0E+00) GSSAN3A.160
CALL AUGMENT_FLUX
(N_PROFILE, N_LAYER, N_AUGMENT GSSAN3A.161
& , IP_INFRA_RED, .FALSE. GSSAN3A.162
& , WEIGHT_STREAM GSSAN3A.163
& , FLUX_NULL, FLUX_DIFFUSE GSSAN3A.164
& , FLUX_NULL, FLUX_STREAM GSSAN3A.165
& , FLUX_NULL, FLUX_NULL GSSAN3A.166
& , FLUX_NULL, FLUX_NULL GSSAN3A.167
& , NPD_PROFILE, NPD_LAYER GSSAN3A.168
& ) GSSAN3A.169
! GSSAN3A.170
ENDDO GSSAN3A.171
! GSSAN3A.172
! GSSAN3A.173
RETURN GSSAN3A.174
END GSSAN3A.175
*ENDIF DEF,A01_3A,OR,DEF,A02_3A GSSAN3A.176
*ENDIF DEF,A70_1A,OR,DEF,A70_1B APB4F405.34