*IF DEF,A70_1A,OR,DEF,A70_1B APB4F405.41
*IF DEF,A01_3A,OR,DEF,A02_3A MNGFX3A.2
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.13433
C GTS2F400.13434
C Use, duplication or disclosure of this code is subject to the GTS2F400.13435
C restrictions as set forth in the contract. GTS2F400.13436
C GTS2F400.13437
C Meteorological Office GTS2F400.13438
C London Road GTS2F400.13439
C BRACKNELL GTS2F400.13440
C Berkshire UK GTS2F400.13441
C RG12 2SZ GTS2F400.13442
C GTS2F400.13443
C If no contract has been raised with this copy of the code, the use, GTS2F400.13444
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.13445
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.13446
C Modelling at the above address. GTS2F400.13447
C ******************************COPYRIGHT****************************** GTS2F400.13448
C GTS2F400.13449
!+ Subroutine to calculate fluxes including only gaseous absorption. MNGFX3A.3
! MNGFX3A.4
! Method: MNGFX3A.5
! Transmission coefficients for each layer are calculated MNGFX3A.6
! from the gaseous absorption alone. Fluxes are propagated MNGFX3A.7
! upward or downward through the column using these MNGFX3A.8
! coefficients and source terms. MNGFX3A.9
! MNGFX3A.10
! Current Owner of Code: J. M. Edwards MNGFX3A.11
! MNGFX3A.12
! History: MNGFX3A.13
! Version Date Comment MNGFX3A.14
! 4.0 27-07-95 Original Code MNGFX3A.15
! (J. M. Edwards) MNGFX3A.16
! 4.1 29-03-96 Half-precision ADB1F401.606
! exponentials introduced. ADB1F401.607
! (J. M. Edwards) ADB1F401.608
! 4.2 Oct. 96 T3E migration: HF functions GSS3F402.226
! replaced by T3E vec_lib function GSS3F402.227
! (S.J.Swarbrick) GSS3F402.228
! MNGFX3A.17
! Description of Code: MNGFX3A.18
! FORTRAN 77 with extensions listed in documentation. MNGFX3A.19
! MNGFX3A.20
!- --------------------------------------------------------------------- MNGFX3A.21
SUBROUTINE MONOCHROMATIC_GAS_FLUX(N_PROFILE, N_LAYER 3MNGFX3A.22
& , L_NET MNGFX3A.23
& , TAU_GAS MNGFX3A.24
& , ISOLIR, SEC_0, FLUX_INC_DIRECT, FLUX_INC_DOWN MNGFX3A.25
& , DIFF_PLANCK, SOURCE_GROUND MNGFX3A.26
& , ALBEDO_SURFACE_DIFF, ALBEDO_SURFACE_DIR MNGFX3A.27
& , DIFFUSIVITY_FACTOR MNGFX3A.28
& , FLUX_DIRECT, FLUX_DIFFUSE MNGFX3A.29
& , NPD_PROFILE, NPD_LAYER MNGFX3A.30
& ) MNGFX3A.31
! MNGFX3A.32
! MNGFX3A.33
IMPLICIT NONE MNGFX3A.34
! MNGFX3A.35
! MNGFX3A.36
! SIZES OF DUMMY ARRAYS. MNGFX3A.37
INTEGER !, INTENT(IN) MNGFX3A.38
& NPD_PROFILE MNGFX3A.39
! MAXIMUM NUMBER OF PROFILES MNGFX3A.40
& , NPD_LAYER MNGFX3A.41
! MAXIMUM NUMBER OF LAYERS MNGFX3A.42
! MNGFX3A.43
! INCLUDE COMDECKS MNGFX3A.44
*CALL SPCRG3A
MNGFX3A.45
*CALL PRMCH3A
MNGFX3A.46
! MNGFX3A.47
! DUMMY ARGUMENTS. MNGFX3A.48
INTEGER !, INTENT(IN) MNGFX3A.49
& N_PROFILE MNGFX3A.50
! NUMBER OF PROFILES MNGFX3A.51
& , N_LAYER MNGFX3A.52
! NUMBER OF LAYERS MNGFX3A.53
& , ISOLIR MNGFX3A.54
! SPECTRAL REGION MNGFX3A.55
LOGICAL !, INTENT(IN) MNGFX3A.56
& L_NET MNGFX3A.57
! CALCULATE NET FLUXES. MNGFX3A.58
REAL !, INTENT(IN) MNGFX3A.59
& TAU_GAS(NPD_PROFILE, NPD_LAYER) MNGFX3A.60
! GASEOUS OPTICAL DEPTHS MNGFX3A.61
& , SEC_0(NPD_PROFILE) MNGFX3A.62
! SECANT OF ZENITH ANGLE MNGFX3A.63
& , FLUX_INC_DIRECT(NPD_PROFILE) MNGFX3A.64
! INCIDENT DIRECT FLUX MNGFX3A.65
& , FLUX_INC_DOWN(NPD_PROFILE) MNGFX3A.66
! INCIDENT DIFFUSE FLUX MNGFX3A.67
& , SOURCE_GROUND(NPD_PROFILE) MNGFX3A.68
! SOURCE FUNCTION OF GROUND MNGFX3A.69
& , DIFF_PLANCK(NPD_PROFILE, NPD_LAYER) MNGFX3A.70
! DIFFERENCE IN PLANCK FUNCTION MNGFX3A.71
& , ALBEDO_SURFACE_DIFF(NPD_PROFILE) MNGFX3A.72
! DIFFUSE SURFACE ALBEDO MNGFX3A.73
& , ALBEDO_SURFACE_DIR(NPD_PROFILE) MNGFX3A.74
! DIRECT SURFACE ALBEDO MNGFX3A.75
& , DIFFUSIVITY_FACTOR MNGFX3A.76
! DIFFUSIVITY FACTOR MNGFX3A.77
REAL !, INTENT(OUT) MNGFX3A.78
& FLUX_DIRECT(NPD_PROFILE, 0: NPD_LAYER) MNGFX3A.79
! DIRECT FLUX MNGFX3A.80
& , FLUX_DIFFUSE(NPD_PROFILE, 2*NPD_LAYER+2) MNGFX3A.81
! DIFFUSE FLUX MNGFX3A.82
! MNGFX3A.83
! LOCAL VARIABLES. MNGFX3A.84
INTEGER MNGFX3A.85
& I MNGFX3A.86
! LOOP VARIABLE MNGFX3A.87
& , L MNGFX3A.88
! LOOP VARIABLE MNGFX3A.89
REAL ADB6F403.3
& TRANS(N_PROFILE, N_LAYER) GSS1F403.51
! TRANSMISSIVITIES MNGFX3A.92
REAL GSS3F402.230
& SOURCE_UP(NPD_PROFILE, NPD_LAYER) GSS3F402.231
! UPWARD SOURCE FUNCTION MNGFX3A.94
& , SOURCE_DOWN(NPD_PROFILE, NPD_LAYER) MNGFX3A.95
! DOWNWARD SOURCE FUNCTION MNGFX3A.96
! MNGFX3A.97
! ADB1F401.613
! MNGFX3A.98
! GSS3F402.232
*IF DEF,VECTLIB PXVECTLB.111
DO I=1, N_LAYER MNGFX3A.99
DO L=1, N_PROFILE MNGFX3A.100
TRANS(L, I)= -DIFFUSIVITY_FACTOR*TAU_GAS(L, I) GSS3F402.234
ENDDO MNGFX3A.102
ENDDO MNGFX3A.103
call exp_v(
n_layer*n_profile,trans,trans) ADB6F403.4
*ELSE GSS3F402.236
DO I=1, N_LAYER GSS3F402.237
DO L=1, N_PROFILE GSS3F402.238
TRANS(L, I)=EXP(-DIFFUSIVITY_FACTOR*TAU_GAS(L, I)) GSS3F402.239
ENDDO GSS3F402.240
ENDDO GSS3F402.241
*ENDIF GSS3F402.242
! MNGFX3A.104
IF (ISOLIR.EQ.IP_SOLAR) THEN MNGFX3A.105
DO I=1, N_LAYER MNGFX3A.106
DO L=1, N_PROFILE MNGFX3A.107
SOURCE_UP(L, I)=0.0E+00 MNGFX3A.108
SOURCE_DOWN(L, I)=0.0E+00 MNGFX3A.109
ENDDO MNGFX3A.110
ENDDO MNGFX3A.111
ELSE IF (ISOLIR.EQ.IP_INFRA_RED) THEN MNGFX3A.112
DO I=1, N_LAYER MNGFX3A.113
DO L=1, N_PROFILE MNGFX3A.114
SOURCE_UP(L, I)=(1.0E+00-TRANS(L, I)+SQRT_TOL_MACHINE) MNGFX3A.115
& *DIFF_PLANCK(L, I) MNGFX3A.116
& /(DIFFUSIVITY_FACTOR*TAU_GAS(L, I)+SQRT_TOL_MACHINE) MNGFX3A.117
SOURCE_DOWN(L, I)=-SOURCE_UP(L, I) MNGFX3A.118
ENDDO MNGFX3A.119
ENDDO MNGFX3A.120
ENDIF MNGFX3A.121
! MNGFX3A.122
! THE DIRECT FLUX. MNGFX3A.123
IF (ISOLIR.EQ.IP_SOLAR) THEN MNGFX3A.124
DO L=1, N_PROFILE MNGFX3A.125
FLUX_DIRECT(L, 0)=FLUX_INC_DIRECT(L) MNGFX3A.126
ENDDO MNGFX3A.127
DO I=1, N_LAYER MNGFX3A.128
DO L=1, N_PROFILE MNGFX3A.129
FLUX_DIRECT(L, I) MNGFX3A.130
& =FLUX_DIRECT(L, I-1)*EXP(-TAU_GAS(L, I)*SEC_0(L)) MNGFX3A.131
ENDDO MNGFX3A.132
ENDDO MNGFX3A.133
ENDIF MNGFX3A.134
! MNGFX3A.135
! DOWNWARD FLUXES. MNGFX3A.136
DO L=1, N_PROFILE MNGFX3A.137
FLUX_DIFFUSE(L, 2)=FLUX_INC_DOWN(L) MNGFX3A.138
ENDDO MNGFX3A.139
DO I=1, N_LAYER MNGFX3A.140
DO L=1, N_PROFILE MNGFX3A.141
FLUX_DIFFUSE(L, 2*I+2)=TRANS(L, I)*FLUX_DIFFUSE(L, 2*I) MNGFX3A.142
& +SOURCE_DOWN(L, I) MNGFX3A.143
ENDDO MNGFX3A.144
ENDDO MNGFX3A.145
! MNGFX3A.146
! UPWARD FLUXES. MNGFX3A.147
IF (ISOLIR.EQ.IP_SOLAR) THEN MNGFX3A.148
DO L=1, N_PROFILE MNGFX3A.149
FLUX_DIFFUSE(L, 2*N_LAYER+1)=SOURCE_GROUND(L) MNGFX3A.150
& +ALBEDO_SURFACE_DIFF(L)*FLUX_DIFFUSE(L, 2*N_LAYER+2) MNGFX3A.151
& +ALBEDO_SURFACE_DIR(L)*FLUX_DIRECT(L, N_LAYER) MNGFX3A.152
ENDDO MNGFX3A.153
ELSE MNGFX3A.154
DO L=1, N_PROFILE MNGFX3A.155
FLUX_DIFFUSE(L, 2*N_LAYER+1)=SOURCE_GROUND(L) MNGFX3A.156
& +ALBEDO_SURFACE_DIFF(L)*FLUX_DIFFUSE(L, 2*N_LAYER+2) MNGFX3A.157
ENDDO MNGFX3A.158
ENDIF MNGFX3A.159
DO I=N_LAYER, 1, -1 MNGFX3A.160
DO L=1, N_PROFILE MNGFX3A.161
FLUX_DIFFUSE(L, 2*I-1)=TRANS(L, I)*FLUX_DIFFUSE(L, 2*I+1) MNGFX3A.162
& +SOURCE_UP(L, I) MNGFX3A.163
ENDDO MNGFX3A.164
ENDDO MNGFX3A.165
! MNGFX3A.166
! REDUCE TO THE NET FLUX IF THIS IS REQUIRED. MNGFX3A.167
IF (L_NET) THEN MNGFX3A.168
DO I=0, N_LAYER MNGFX3A.169
DO L=1, N_PROFILE MNGFX3A.170
FLUX_DIFFUSE(L, I+1)=FLUX_DIFFUSE(L, 2*I+2) MNGFX3A.171
& -FLUX_DIFFUSE(L, 2*I+1) MNGFX3A.172
ENDDO MNGFX3A.173
ENDDO MNGFX3A.174
ENDIF MNGFX3A.175
! MNGFX3A.176
! MNGFX3A.177
RETURN MNGFX3A.178
END MNGFX3A.179
*ENDIF DEF,A01_3A,OR,DEF,A02_3A MNGFX3A.180
*ENDIF DEF,A70_1A,OR,DEF,A70_1B APB4F405.42