*IF DEF,A70_1A,OR,DEF,A70_1B APB4F405.11
*IF DEF,A01_3A,OR,DEF,A02_3A CLCOL3A.2
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.13144
C GTS2F400.13145
C Use, duplication or disclosure of this code is subject to the GTS2F400.13146
C restrictions as set forth in the contract. GTS2F400.13147
C GTS2F400.13148
C Meteorological Office GTS2F400.13149
C London Road GTS2F400.13150
C BRACKNELL GTS2F400.13151
C Berkshire UK GTS2F400.13152
C RG12 2SZ GTS2F400.13153
C GTS2F400.13154
C If no contract has been raised with this copy of the code, the use, GTS2F400.13155
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.13156
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.13157
C Modelling at the above address. GTS2F400.13158
C ******************************COPYRIGHT****************************** GTS2F400.13159
C GTS2F400.13160
!+ Subroutine to calculate cloudy fluxes by division into columns. CLCOL3A.3
! CLCOL3A.4
! Method: CLCOL3A.5
! A number of atmospheric profiles are taken and split into CLCOL3A.6
! columns in which each layer is homogeneous. The areal CLCOL3A.7
! coverages of these columns has been calculated before. The CLCOL3A.8
! sub-columns are passed into a long vector to be passed to a CLCOL3A.9
! multicolumn solver. CLCOL3A.10
! CLCOL3A.11
! Current Owner of Code: J. M. Edwards CLCOL3A.12
! CLCOL3A.13
! History: CLCOL3A.14
! Version Date Comment CLCOL3A.15
! 4.0 27-07-95 Original Code CLCOL3A.16
! (J. M. Edwards) CLCOL3A.17
! 4.1 10-06-96 New solvers added. ADB1F401.14
! (J. M. Edwards) ADB1F401.15
! 4.4 19-09-97 Addressing for long ADB2F404.1
! rows corrected and ADB2F404.2
! missing initialization ADB1F405.1
! added. ADB2F404.4
! (J. M. Edwards) ADB2F404.5
! 4.5 18-05-98 Obsolete solvers ADB1F405.2
! removed. ADB1F405.3
! (J. M. Edwards) ADB1F405.4
! CLCOL3A.18
! Description of Code: CLCOL3A.19
! FORTRAN 77 with extensions listed in documentation. CLCOL3A.20
! CLCOL3A.21
!- --------------------------------------------------------------------- CLCOL3A.22
SUBROUTINE CLOUD_COLUMN(IERR 1,10CLCOL3A.23
! Atmospheric Properties CLCOL3A.24
& , N_PROFILE, N_LAYER CLCOL3A.25
! Two-stream Scheme CLCOL3A.26
& , I_2STREAM CLCOL3A.27
! Corrections to Two-stream Equations CLCOL3A.28
& , L_2_STREAM_CORRECT, PLANCK_SOURCE, GROUND_EMISSION CLCOL3A.29
! Options for Solver CLCOL3A.30
& , I_SOLVER, N_AUGMENT CLCOL3A.31
! Options for Equivalent Extinction CLCOL3A.32
& , L_SCALE_SOLAR, ADJUST_SOLAR_KE CLCOL3A.33
! Spectral Region CLCOL3A.34
& , ISOLIR CLCOL3A.35
! Infra-red Properties CLCOL3A.36
& , DIFF_PLANCK CLCOL3A.37
& , L_IR_SOURCE_QUAD, DIFF_PLANCK_2 CLCOL3A.38
! Conditions at TOA CLCOL3A.39
& , FLUX_INC_DOWN, FLUX_INC_DIRECT, SEC_0 CLCOL3A.40
! Conditions at Surface CLCOL3A.41
& , ALBEDO_SURFACE_DIFF, ALBEDO_SURFACE_DIR, SOURCE_GROUND CLCOL3A.42
! Clear-sky Single Scattering Properties CLCOL3A.43
& , TAU_FREE, OMEGA_FREE, ASYMMETRY_FREE CLCOL3A.44
! Cloud Geometry CLCOL3A.45
& , N_CLOUD_TOP CLCOL3A.46
& , N_CLOUD_TYPE, FRAC_CLOUD CLCOL3A.47
& , N_COLUMN, L_COLUMN, AREA_COLUMN CLCOL3A.48
! Cloudy Optical Properties CLCOL3A.49
& , TAU_CLOUD, OMEGA_CLOUD, ASYMMETRY_CLOUD CLCOL3A.50
! Fluxes Calculated CLCOL3A.51
& , FLUX_DIRECT, FLUX_TOTAL CLCOL3A.52
! Flags for Clear-sky Calculations CLCOL3A.53
& , L_CLEAR, I_SOLVER_CLEAR CLCOL3A.54
! Clear-sky Fluxes Calculated CLCOL3A.55
& , FLUX_DIRECT_CLEAR, FLUX_TOTAL_CLEAR CLCOL3A.56
! Dimensions of Arrays CLCOL3A.57
& , NPD_PROFILE, NPD_LAYER, NPD_COLUMN CLCOL3A.58
& ) CLCOL3A.59
! CLCOL3A.60
! CLCOL3A.61
IMPLICIT NONE CLCOL3A.62
! CLCOL3A.63
! CLCOL3A.64
! SIZES OF DUMMY ARRAYS. CLCOL3A.65
INTEGER !, INTENT(IN) CLCOL3A.66
& NPD_PROFILE CLCOL3A.67
! MAXIMUM NUMBER OF PROFILES CLCOL3A.68
& , NPD_LAYER CLCOL3A.69
! MAXIMUM NUMBER OF LAYERS CLCOL3A.70
& , NPD_COLUMN CLCOL3A.71
! NUMBER OF COLUMNS PER POINT CLCOL3A.72
! CLCOL3A.73
! INCLUDE COMDECKS CLCOL3A.74
*CALL DIMFIX3A
CLCOL3A.75
*CALL STDIO3A
CLCOL3A.76
*CALL SPCRG3A
CLCOL3A.77
*CALL SOLVER3A
CLCOL3A.78
*CALL ERROR3A
CLCOL3A.79
! CLCOL3A.80
! CLCOL3A.81
! DUMMY ARGUMENTS. CLCOL3A.82
INTEGER !, INTENT(OUT) CLCOL3A.83
& IERR CLCOL3A.84
! ERROR FLAG CLCOL3A.85
INTEGER !, INTENT(IN) CLCOL3A.86
& N_PROFILE CLCOL3A.87
! NUMBER OF PROFILES CLCOL3A.88
& , N_LAYER CLCOL3A.89
! NUMBER OF LAYERS CLCOL3A.90
INTEGER !, INTENT(IN) CLCOL3A.91
& ISOLIR CLCOL3A.92
! SPECTRAL REGION CLCOL3A.93
INTEGER !, INTENT(IN) CLCOL3A.94
& I_2STREAM CLCOL3A.95
! TWO STREAM SCHEME CLCOL3A.96
& , I_SOLVER CLCOL3A.97
! SOLVER FOR TWO-STREAM EQUATIONS ADB1F401.16
& , N_AUGMENT CLCOL3A.99
! LENGTH OF LONG VECTOR CLCOL3A.100
& , I_SOLVER_CLEAR CLCOL3A.101
! SOLVER FOR CLEAR FLUXES CLCOL3A.102
LOGICAL !, INTENT(IN) CLCOL3A.103
& L_CLEAR CLCOL3A.104
! CALCULATE CLEAR-SKY FLUXES CLCOL3A.105
& , L_SCALE_SOLAR CLCOL3A.106
! SCALE SOLAR BEAM CLCOL3A.107
& , L_IR_SOURCE_QUAD CLCOL3A.108
! USE A QUADRATIC SOURCE TERM CLCOL3A.109
& , L_2_STREAM_CORRECT CLCOL3A.110
! EDGE CORRECTION TO 2-STREAM CLCOL3A.111
! CLCOL3A.112
! FIELDS FOR EQUIVALENT EXTINCTION CLCOL3A.113
REAL !, INTENT(IN) CLCOL3A.114
& ADJUST_SOLAR_KE(NPD_PROFILE, NPD_LAYER) CLCOL3A.115
! ADJUSTMENT OF SOLAR BEAM WITH EQUIVALENT EXTINCTION CLCOL3A.116
! CLCOL3A.117
! CLEAR-SKY OPTICAL PROPETIES CLCOL3A.118
REAL !, INTENT(IN) CLCOL3A.119
& TAU_FREE(NPD_PROFILE, NPD_LAYER) CLCOL3A.120
! FREE OPTICAL DEPTH CLCOL3A.121
& , OMEGA_FREE(NPD_PROFILE, NPD_LAYER) CLCOL3A.122
! FREE ALBEDO OF SINGLE SCATTERING CLCOL3A.123
& , ASYMMETRY_FREE(NPD_PROFILE, NPD_LAYER) CLCOL3A.124
! FREE FRACTIONAL FORWARD SCATTER CLCOL3A.125
! CLCOL3A.126
! CLOUDY OPTICAL PROPETIES CLCOL3A.127
REAL !, INTENT(IN) CLCOL3A.128
& TAU_CLOUD(NPD_PROFILE, NPD_LAYER, NPD_CLOUD_TYPE) CLCOL3A.129
! OPTICAL DEPTH IN CLOUD CLCOL3A.130
& , ASYMMETRY_CLOUD(NPD_PROFILE, NPD_LAYER, NPD_CLOUD_TYPE) CLCOL3A.131
! CLOUDY FRACTIONAL FORWARD SCATTER CLCOL3A.132
& , OMEGA_CLOUD(NPD_PROFILE, NPD_LAYER, NPD_CLOUD_TYPE) CLCOL3A.133
! ALBEDO OF SINGLE SCATTERING IN CLOUD CLCOL3A.134
! CLCOL3A.135
! PLANCKIAN TERMS: CLCOL3A.136
REAL !, INTENT(IN) CLCOL3A.137
& DIFF_PLANCK(NPD_PROFILE, NPD_LAYER) CLCOL3A.138
! CHANGE IN PLANCK FUNCTION CLCOL3A.139
& , DIFF_PLANCK_2(NPD_PROFILE, NPD_LAYER) CLCOL3A.140
! TWICE 2ND DIFFERENCES IN PLANCKIAN CLCOL3A.141
& , PLANCK_SOURCE(NPD_PROFILE, 0: NPD_LAYER) CLCOL3A.142
! PLANCKIAN SOURCE FUNCTION CLCOL3A.143
! CLCOL3A.144
! CONDITIONS AT TOA CLCOL3A.145
REAL !, INTENT(IN) CLCOL3A.146
& SEC_0(NPD_PROFILE) CLCOL3A.147
! SECANT OF ZENITH ANGLE CLCOL3A.148
& , FLUX_INC_DIRECT(NPD_PROFILE) CLCOL3A.149
! INCIDENT DIRECT FLUX CLCOL3A.150
& , FLUX_INC_DOWN(NPD_PROFILE) CLCOL3A.151
! INCIDENT TOTAL FLUX CLCOL3A.152
! CLCOL3A.153
! CONDITIONS AT SURFACE CLCOL3A.154
REAL !, INTENT(IN) CLCOL3A.155
& ALBEDO_SURFACE_DIFF(NPD_PROFILE) CLCOL3A.156
! DIFFUSE ALBEDO OF GROUND CLCOL3A.157
& , ALBEDO_SURFACE_DIR(NPD_PROFILE) CLCOL3A.158
! DIRECT ALBEDO OF GROUND CLCOL3A.159
& , SOURCE_GROUND(NPD_PROFILE) CLCOL3A.160
! SOURCE FUNCTION OF GROUND CLCOL3A.161
! CLCOL3A.162
! CLOUD GEOMETRY CLCOL3A.163
INTEGER !, INTENT(IN) CLCOL3A.164
& N_CLOUD_TOP CLCOL3A.165
! TOP CLOUDY LAYER CLCOL3A.166
& , N_CLOUD_TYPE CLCOL3A.167
! NUMBER OF TYPES OF CLOUDS CLCOL3A.168
& , N_COLUMN(NPD_PROFILE) CLCOL3A.169
! NUMBER OF COLUMNS CLCOL3A.170
LOGICAL !, INTENT(IN) CLCOL3A.171
& L_COLUMN(NPD_PROFILE, NPD_LAYER, NPD_COLUMN) CLCOL3A.172
! TYPE FLAG FOR EACH LAYER/COLUMN CLCOL3A.173
REAL !, INTENT(IN) CLCOL3A.174
& FRAC_CLOUD(NPD_PROFILE, NPD_COLUMN, NPD_CLOUD_TYPE) CLCOL3A.175
! AREA OF EACH COLUMN CLCOL3A.176
& , AREA_COLUMN(NPD_PROFILE, NPD_COLUMN) CLCOL3A.177
! AREA OF EACH COLUMN CLCOL3A.178
! CLCOL3A.179
REAL !, INTENT(IN) CLCOL3A.180
& GROUND_EMISSION(NPD_PROFILE) CLCOL3A.181
! TOTAL FLUX EMITTED FROM GROUND CLCOL3A.182
! CLCOL3A.183
! FLUXES CALCULATED: CLCOL3A.184
REAL !, INTENT(OUT) CLCOL3A.185
& FLUX_DIRECT(NPD_PROFILE, 0: NPD_LAYER) CLCOL3A.186
! DIRECT FLUX CLCOL3A.187
& , FLUX_TOTAL(NPD_PROFILE, 2*NPD_LAYER+2) CLCOL3A.188
! TOTAL FLUX CLCOL3A.189
& , FLUX_DIRECT_CLEAR(NPD_PROFILE, 0: NPD_LAYER) CLCOL3A.190
! CLEAR DIRECT FLUX CLCOL3A.191
& , FLUX_TOTAL_CLEAR(NPD_PROFILE, 2*NPD_LAYER+2) CLCOL3A.192
! CLEAR TOTAL FLUX CLCOL3A.193
! CLCOL3A.194
! CLCOL3A.195
! CLCOL3A.196
! LOCAL VARIABLES. CLCOL3A.197
INTEGER CLCOL3A.198
& N_SOURCE_COEFF CLCOL3A.199
! NUMBER OF SOURCE COEFFICIENTS CLCOL3A.200
& , N_EQUATION CLCOL3A.201
! NUMBER OF EQUATIONS SOLVED CLCOL3A.202
& , I CLCOL3A.203
! LOOP VARIABLE CLCOL3A.204
& , J CLCOL3A.205
! LOOP VARIABLE CLCOL3A.206
& , JS CLCOL3A.207
! LOOP VARIABLE CLCOL3A.208
& , L CLCOL3A.209
! LOOP VARIABLE CLCOL3A.210
& , K CLCOL3A.211
! LOOP VARIABLE CLCOL3A.212
INTEGER CLCOL3A.213
& N_LONG CLCOL3A.214
! LENGTH OF LONG VECTOR CLCOL3A.215
& , N_PROFILE_SOLVED CLCOL3A.216
! NUMBER OF PROFILES SOLVED AT ONCE CLCOL3A.217
& , N_COLUMN_DONE CLCOL3A.218
! NUMBER OF COLUMNS ALREADY ASSIGNED CLCOL3A.219
& , OFFSET CLCOL3A.220
! OFFSET IN LIST OF PROFILES CLCOL3A.221
& , I_PROFILE CLCOL3A.222
! PROFILE BEING CONSIDERED CLCOL3A.223
! CLCOL3A.224
REAL CLCOL3A.225
& SOURCE_COEFF_FREE(NPD_PROFILE, NPD_LAYER, NPD_SOURCE_COEFF) CLCOL3A.226
! FREE SOURCE COEFFICIENTS CLCOL3A.227
& , TRANS_FREE(NPD_PROFILE, NPD_LAYER) CLCOL3A.228
! FREE DIFFUSE TRANSMISSION CLCOL3A.229
& , TRANS_0_FREE(NPD_PROFILE, NPD_LAYER) CLCOL3A.230
! FREE DIRECT TRANSMISSION CLCOL3A.231
& , REFLECT_FREE(NPD_PROFILE, NPD_LAYER) CLCOL3A.232
! FREE REFLECTANCE CLCOL3A.233
& , S_DOWN_FREE(NPD_PROFILE, NPD_LAYER) CLCOL3A.234
! FREE DOWNWARD SOURCE CLCOL3A.235
& , S_UP_FREE(NPD_PROFILE, NPD_LAYER) CLCOL3A.236
! FREE UPWARD SOURCE CLCOL3A.237
! CLCOL3A.238
REAL CLCOL3A.239
& SOURCE_COEFF_CLOUD(NPD_PROFILE, NPD_LAYER, NPD_SOURCE_COEFF) CLCOL3A.240
! CLOUDY TWO-STREAM SOURCE COEFFICIENTS CLCOL3A.241
& , TRANS_CLOUD(NPD_PROFILE, NPD_LAYER) CLCOL3A.242
! CLOUDY DIFFUSE TRANSMISSION CLCOL3A.243
& , REFLECT_CLOUD(NPD_PROFILE, NPD_LAYER) CLCOL3A.244
! CLOUDY REFLECTANCE CLCOL3A.245
& , TRANS_0_CLOUD(NPD_PROFILE, NPD_LAYER) CLCOL3A.246
! CLOUDY DIRECT TRANSMISSION CLCOL3A.247
& , S_DOWN_CLOUD(NPD_PROFILE, NPD_LAYER) CLCOL3A.248
! CLOUDY DOWNWARD SOURCE CLCOL3A.249
& , S_UP_CLOUD(NPD_PROFILE, NPD_LAYER) CLCOL3A.250
! CLOUDY UPWARD SOURCE CLCOL3A.251
! CLCOL3A.252
REAL CLCOL3A.253
& FLUX_LONG(NPD_PROFILE, 2*NPD_LAYER+2) CLCOL3A.254
! DIFFUSE FLUXES IN COLUMNS CLCOL3A.255
& , FLUX_DIRECT_LONG(NPD_PROFILE, 0: NPD_LAYER) CLCOL3A.256
! DIRECT FLUXES IN COLUMNS CLCOL3A.257
! CLCOL3A.258
REAL CLCOL3A.259
& SOURCE_GROUND_LONG(NPD_PROFILE) CLCOL3A.260
! SOURCE FUNCTION OF GROUND IN COL. CLCOL3A.261
& , FLUX_INC_DIRECT_LONG(NPD_PROFILE) CLCOL3A.262
! DIRECT FLUX INCIDENT ON COLUMN CLCOL3A.263
& , FLUX_INC_DOWN_LONG(NPD_PROFILE) CLCOL3A.264
! DIRECT FLUX INCIDENT ON COLUMN CLCOL3A.265
& , ALBEDO_SURFACE_DIFF_LONG(NPD_PROFILE) CLCOL3A.266
! DIFFUSE ALBEDO OF GROUND CLCOL3A.267
& , ALBEDO_SURFACE_DIR_LONG(NPD_PROFILE) CLCOL3A.268
! DIRECT ALBEDO OF GROUND CLCOL3A.269
& , TRANS_LONG(NPD_PROFILE, NPD_LAYER) CLCOL3A.270
! TRANSMISSION IN LONG ARRAY CLCOL3A.271
& , REFLECT_LONG(NPD_PROFILE, NPD_LAYER) CLCOL3A.272
! REFLECTION IN LONG ARRAY CLCOL3A.273
& , TRANS_0_LONG(NPD_PROFILE, NPD_LAYER) CLCOL3A.274
! SOLAR COEFFICIENT IN LONG ARRAY CLCOL3A.275
& , SOURCE_COEFF_LONG(NPD_PROFILE, NPD_LAYER, NPD_SOURCE_COEFF) CLCOL3A.276
! SOURCE COEFFICIENTS IN LONG ARRAY CLCOL3A.277
& , S_UP_LONG(NPD_PROFILE, NPD_LAYER) CLCOL3A.278
! UPWARD SOURCE FUNCTION CLCOL3A.279
& , S_DOWN_LONG(NPD_PROFILE, NPD_LAYER) CLCOL3A.280
! DOWNWARD SOURCE FUNCTION CLCOL3A.281
& , SCALE_SOLAR_LONG(NPD_PROFILE, NPD_LAYER) CLCOL3A.282
! LONG VECTOR OF SOLAR SCALINGS CLCOL3A.283
& , WORK_1(NPD_PROFILE, 2*NPD_LAYER+2) CLCOL3A.284
! WORK ARRAY CLCOL3A.285
& , WORK_2(NPD_PROFILE, 2*NPD_LAYER+2) CLCOL3A.286
! WORK ARRAY CLCOL3A.287
! CLCOL3A.288
REAL CLCOL3A.289
& A3(NPD_PROFILE, 3, 2*NPD_LAYER+2) CLCOL3A.290
! TRIDIAGONAL MATRIX CLCOL3A.291
& , A5(NPD_PROFILE, 5, 2*NPD_LAYER+2) CLCOL3A.292
! PENTADIAGONAL MATRIX CLCOL3A.293
& , B(NPD_PROFILE, 2*NPD_LAYER+2) CLCOL3A.294
! RIGHT-HAND SIDES OF EQUATIONS CLCOL3A.295
! CLCOL3A.296
! CLCOL3A.297
! FUNCTIONS CALLED: CLCOL3A.298
INTEGER CLCOL3A.299
& SET_N_SOURCE_COEFF CLCOL3A.300
! FUNCTION TO SET NUMBER OF SOURCE COEFFICIENTS CLCOL3A.301
! CLCOL3A.302
! SUBROUTINES CALLED: CLCOL3A.303
EXTERNAL CLCOL3A.304
& TWO_COEFF, TWO_COEFF_CLOUD, IR_SOURCE, SOLAR_SOURCE CLCOL3A.305
*IF DEF,SCMA AJC0F405.297
& , SET_MATRIX_FULL AJC0F405.298
*ELSE AJC0F405.299
& , SET_MATRIX_NET, TRIDIAG_SOLVER_UP, SET_MATRIX_FULL AJC0F405.300
*ENDIF AJC0F405.301
& , SET_MATRIX_PENTADIAGONAL, BAND_SOLVER CLCOL3A.307
& , SOLVER_HOMOGEN_DIRECT, CLEAR_SUPPLEMENT ADB1F401.17
! CLCOL3A.309
! CLCOL3A.310
! CLCOL3A.311
! CLCOL3A.312
! ENTER A SUMMING LOOP TO CALCULATE THE TOTAL FLUX BY ADDING UP ADB1F401.18
! THE FLOW OF ENERGY IN EACH COLUMN. CLCOL3A.314
! CLCOL3A.315
IF (ISOLIR.EQ.IP_SOLAR) THEN CLCOL3A.316
DO I=0, N_LAYER CLCOL3A.317
DO L=1, N_PROFILE CLCOL3A.318
FLUX_DIRECT(L, I)=0.0E+00 CLCOL3A.319
ENDDO CLCOL3A.320
ENDDO CLCOL3A.321
ENDIF CLCOL3A.322
DO I=1, N_AUGMENT CLCOL3A.323
DO L=1, N_PROFILE CLCOL3A.324
FLUX_TOTAL(L, I)=0.0E+00 CLCOL3A.325
ENDDO CLCOL3A.326
ENDDO CLCOL3A.327
! CLCOL3A.328
! SET THE NUMBER OF SOURCE COEFFICIENTS FOR THE APPROXIMATION CLCOL3A.329
N_SOURCE_COEFF=SET_N_SOURCE_COEFF
(ISOLIR, L_IR_SOURCE_QUAD) CLCOL3A.330
! CLCOL3A.331
! THE FUNDAMENTAL PARAMETERS OF THE TWO-STREAM EQUATIONS CAN BE CLCOL3A.332
! PRECALCULATED. CLCOL3A.333
CALL TWO_COEFF
(IERR CLCOL3A.334
& , N_PROFILE, 1, N_LAYER CLCOL3A.335
& , I_2STREAM, L_IR_SOURCE_QUAD CLCOL3A.336
& , ASYMMETRY_FREE, OMEGA_FREE, TAU_FREE CLCOL3A.337
& , ISOLIR, SEC_0 CLCOL3A.338
& , TRANS_FREE, REFLECT_FREE, TRANS_0_FREE CLCOL3A.339
& , SOURCE_COEFF_FREE CLCOL3A.340
& , NPD_PROFILE, NPD_LAYER CLCOL3A.341
& ) CLCOL3A.342
IF (IERR.NE.I_NORMAL) RETURN CLCOL3A.343
! CLCOL3A.344
CALL TWO_COEFF_CLOUD
(IERR CLCOL3A.345
& , N_PROFILE, N_CLOUD_TOP, N_LAYER CLCOL3A.346
& , I_2STREAM, L_IR_SOURCE_QUAD, N_SOURCE_COEFF CLCOL3A.347
& , N_CLOUD_TYPE, FRAC_CLOUD CLCOL3A.348
& , ASYMMETRY_CLOUD, OMEGA_CLOUD, TAU_CLOUD CLCOL3A.349
& , ISOLIR, SEC_0 CLCOL3A.350
& , TRANS_CLOUD, REFLECT_CLOUD, TRANS_0_CLOUD CLCOL3A.351
& , SOURCE_COEFF_CLOUD CLCOL3A.352
& , NPD_PROFILE, NPD_LAYER CLCOL3A.353
& ) CLCOL3A.354
IF (IERR.NE.I_NORMAL) RETURN CLCOL3A.355
! CLCOL3A.356
! CLCOL3A.357
! THE INFRA-RED SOURCE FUNCTIONS DEPEND ONLY ON THE LAYER IN WHICH CLCOL3A.358
! THEY ARE EVALUATED AND, UNLIKE THE VISIBLE SOURCE FUNCTIONS, THEY CLCOL3A.359
! MAY BE PRECALCULATED. CLCOL3A.360
IF (ISOLIR.EQ.IP_INFRA_RED) THEN CLCOL3A.361
CALL IR_SOURCE
(N_PROFILE, 1, N_LAYER CLCOL3A.362
& , SOURCE_COEFF_FREE, DIFF_PLANCK CLCOL3A.363
& , L_IR_SOURCE_QUAD, DIFF_PLANCK_2 CLCOL3A.364
& , L_2_STREAM_CORRECT, PLANCK_SOURCE CLCOL3A.365
& , GROUND_EMISSION, N_LAYER CLCOL3A.366
& , TAU_FREE, TRANS_FREE CLCOL3A.367
& , S_DOWN_FREE, S_UP_FREE CLCOL3A.368
& , NPD_PROFILE, NPD_LAYER CLCOL3A.369
& ) CLCOL3A.370
CALL IR_SOURCE
(N_PROFILE, N_CLOUD_TOP, N_LAYER CLCOL3A.371
& , SOURCE_COEFF_CLOUD, DIFF_PLANCK CLCOL3A.372
& , L_IR_SOURCE_QUAD, DIFF_PLANCK_2 CLCOL3A.373
& , L_2_STREAM_CORRECT, PLANCK_SOURCE CLCOL3A.374
& , GROUND_EMISSION, N_LAYER CLCOL3A.375
& , TAU_CLOUD, TRANS_CLOUD CLCOL3A.376
& , S_DOWN_CLOUD, S_UP_CLOUD CLCOL3A.377
& , NPD_PROFILE, NPD_LAYER CLCOL3A.378
& ) CLCOL3A.379
ENDIF CLCOL3A.380
! CLCOL3A.381
! CLCOL3A.382
! THE MAIN LOOP: PROFILES ARE ADDED ON TO THE LONG ARRAY UNTIL CLCOL3A.383
! IT IS NO LONGER POSSIBLE TO SOLVE FOR THEM ALL IN ONE GO. CLCOL3A.384
OFFSET=0 CLCOL3A.385
N_LONG=0 CLCOL3A.386
I_PROFILE=1 CLCOL3A.387
! CLCOL3A.388
10 IF (N_LONG+N_COLUMN(I_PROFILE).LE.NPD_PROFILE) THEN CLCOL3A.389
! CONTINUE FEEDING PROFILES INTO THE LONG ARRAY: CLCOL3A.390
! CLCOL3A.391
DO J=1, N_COLUMN(I_PROFILE) CLCOL3A.392
! CLCOL3A.393
! ASSIGN THE OPTICAL PROPERTIES TO EACH LAYER WITHIN THE CLCOL3A.394
! COLUMN. J IS THE INDEX OF COLUMNS AT A GRID-POINT: CLCOL3A.395
! K INDEXES POINTS IN THE LONG VECTOR. CLCOL3A.396
K=N_LONG+J CLCOL3A.397
! CLCOL3A.398
DO I=1, N_LAYER CLCOL3A.399
IF (L_COLUMN(I_PROFILE, I, J)) THEN CLCOL3A.400
! THE LAYER IS CLOUDY. CLCOL3A.401
TRANS_LONG(K, I)=TRANS_CLOUD(I_PROFILE, I) CLCOL3A.402
REFLECT_LONG(K, I)=REFLECT_CLOUD(I_PROFILE, I) CLCOL3A.403
ELSE CLCOL3A.404
! THE LAYER IS FREE OF CLOUD. CLCOL3A.405
TRANS_LONG(K, I)=TRANS_FREE(I_PROFILE, I) CLCOL3A.406
REFLECT_LONG(K, I)=REFLECT_FREE(I_PROFILE, I) CLCOL3A.407
ENDIF CLCOL3A.408
ENDDO CLCOL3A.409
IF (ISOLIR.EQ.IP_SOLAR) THEN CLCOL3A.410
FLUX_INC_DIRECT_LONG(K)=FLUX_INC_DIRECT(I_PROFILE) CLCOL3A.411
SOURCE_GROUND_LONG(K)=0.0E+00 CLCOL3A.412
DO I=1, N_LAYER CLCOL3A.413
IF (L_COLUMN(I_PROFILE, I, J)) THEN CLCOL3A.414
TRANS_0_LONG(K, I) CLCOL3A.415
& =TRANS_0_CLOUD(I_PROFILE, I) CLCOL3A.416
DO JS=1, N_SOURCE_COEFF CLCOL3A.417
SOURCE_COEFF_LONG(K, I, JS) CLCOL3A.418
& =SOURCE_COEFF_CLOUD(I_PROFILE, I, JS) CLCOL3A.419
ENDDO CLCOL3A.420
ELSE CLCOL3A.421
TRANS_0_LONG(K, I)=TRANS_0_FREE(I_PROFILE, I) CLCOL3A.422
DO JS=1, N_SOURCE_COEFF CLCOL3A.423
SOURCE_COEFF_LONG(K, I, JS) CLCOL3A.424
& =SOURCE_COEFF_FREE(I_PROFILE, I, JS) CLCOL3A.425
ENDDO CLCOL3A.426
ENDIF CLCOL3A.427
ENDDO CLCOL3A.428
IF (L_SCALE_SOLAR) THEN CLCOL3A.429
DO I=1, N_LAYER CLCOL3A.430
SCALE_SOLAR_LONG(K, I) CLCOL3A.431
& =ADJUST_SOLAR_KE(I_PROFILE, I) CLCOL3A.432
ENDDO CLCOL3A.433
ENDIF CLCOL3A.434
ELSE IF (ISOLIR.EQ.IP_INFRA_RED) THEN CLCOL3A.435
DO I=1, N_LAYER CLCOL3A.436
IF (L_COLUMN(I_PROFILE, I, J)) THEN CLCOL3A.437
S_UP_LONG(K, I)=S_UP_CLOUD(I_PROFILE, I) CLCOL3A.438
S_DOWN_LONG(K, I)=S_DOWN_CLOUD(I_PROFILE, I) CLCOL3A.439
ELSE CLCOL3A.440
S_DOWN_LONG(K, I)=S_DOWN_FREE(I_PROFILE, I) CLCOL3A.441
S_UP_LONG(K, I)=S_UP_FREE(I_PROFILE, I) CLCOL3A.442
ENDIF CLCOL3A.443
ENDDO CLCOL3A.444
SOURCE_GROUND_LONG(K)=SOURCE_GROUND(I_PROFILE) CLCOL3A.445
ENDIF CLCOL3A.446
FLUX_INC_DOWN_LONG(K)=FLUX_INC_DOWN(I_PROFILE) CLCOL3A.447
ALBEDO_SURFACE_DIFF_LONG(K) CLCOL3A.448
& =ALBEDO_SURFACE_DIFF(I_PROFILE) CLCOL3A.449
ALBEDO_SURFACE_DIR_LONG(K) CLCOL3A.450
& =ALBEDO_SURFACE_DIR(I_PROFILE) CLCOL3A.451
ENDDO CLCOL3A.452
! CLCOL3A.453
N_LONG=N_LONG+N_COLUMN(I_PROFILE) CLCOL3A.454
! CLCOL3A.455
! INCREMENT I_PROFILE AND RETURN TO SEE IF ANOTHER PROFILE CLCOL3A.456
! MAY BE ADDED. CLCOL3A.457
IF (I_PROFILE.LT.N_PROFILE) THEN CLCOL3A.458
I_PROFILE=I_PROFILE+1 CLCOL3A.459
GOTO 10 CLCOL3A.460
ENDIF CLCOL3A.461
! CLCOL3A.462
ELSE IF (N_COLUMN(I_PROFILE).GT.NPD_PROFILE) THEN CLCOL3A.463
WRITE(IU_ERR, '(/A, I5, A, /A)') CLCOL3A.464
& '*** ERROR: PROFILE ', I_PROFILE CLCOL3A.465
& , ' CONTAINS TOO MANY COLUMNS.' CLCOL3A.466
& , 'INCREASE NPD_PROFILE AND RECOMPILE.' CLCOL3A.467
ELSE CLCOL3A.468
! IF NO MORE PROFILES CAN BE ADDED THE EQUATIONS ARE SOLVED. CLCOL3A.469
! RESET THE POINTER TO POINT TO THE LAST PROFILE CONSIDERED. CLCOL3A.470
I_PROFILE=I_PROFILE-1 CLCOL3A.471
ENDIF CLCOL3A.472
! CLCOL3A.473
N_PROFILE_SOLVED=I_PROFILE-OFFSET CLCOL3A.474
! CLCOL3A.475
IF (ISOLIR.EQ.IP_SOLAR) THEN CLCOL3A.476
CALL SOLAR_SOURCE
(N_LONG, N_LAYER CLCOL3A.477
& , FLUX_INC_DIRECT_LONG CLCOL3A.478
& , TRANS_0_LONG, SOURCE_COEFF_LONG CLCOL3A.479
& , L_SCALE_SOLAR, SCALE_SOLAR_LONG CLCOL3A.480
& , FLUX_DIRECT_LONG CLCOL3A.481
& , S_DOWN_LONG, S_UP_LONG CLCOL3A.482
& , NPD_PROFILE, NPD_LAYER CLCOL3A.483
& ) CLCOL3A.484
ELSE ADB2F404.6
! SET THE DIRECT FLUX AT THE GROUND FOR USE IN THE SOLVER. ADB2F404.7
DO K=1, N_LONG ADB2F404.8
FLUX_DIRECT_LONG(K, N_LAYER)=0.0E+00 ADB2F404.9
ENDDO ADB2F404.10
ENDIF CLCOL3A.485
! CLCOL3A.486
! CLCOL3A.497
! SELECT AN APPROPRIATE SOLVER FOR THE EQUATIONS. ADB1F405.5
! CLCOL3A.516
IF (I_SOLVER.EQ.IP_SOLVER_PENTADIAGONAL) THEN ADB1F405.6
! CLCOL3A.527
CALL SET_MATRIX_PENTADIAGONAL
(N_LONG, N_LAYER CLCOL3A.528
& , TRANS_LONG, REFLECT_LONG CLCOL3A.529
& , S_DOWN_LONG, S_UP_LONG CLCOL3A.530
& , ALBEDO_SURFACE_DIFF_LONG, ALBEDO_SURFACE_DIR_LONG CLCOL3A.531
& , FLUX_DIRECT_LONG(1, N_LAYER), FLUX_INC_DOWN_LONG CLCOL3A.532
& , SOURCE_GROUND_LONG CLCOL3A.533
& , A5, B CLCOL3A.534
& , NPD_PROFILE, NPD_LAYER CLCOL3A.535
& ) CLCOL3A.536
N_EQUATION=2*N_LAYER+2 CLCOL3A.537
! CLCOL3A.538
CALL BAND_SOLVER
(N_LONG, N_EQUATION CLCOL3A.539
& , 2, 2 CLCOL3A.540
& , A5, B CLCOL3A.541
& , FLUX_LONG CLCOL3A.542
& , NPD_PROFILE, 2*NPD_LAYER+2 CLCOL3A.543
& , WORK_1 CLCOL3A.544
& ) ADB1F401.19
! ADB1F401.20
ELSE IF (I_SOLVER.EQ.IP_SOLVER_HOMOGEN_DIRECT) THEN ADB1F401.21
! ADB1F401.22
CALL SOLVER_HOMOGEN_DIRECT
(N_LONG, N_LAYER ADB1F401.23
& , TRANS_LONG, REFLECT_LONG ADB1F401.24
& , S_DOWN_LONG, S_UP_LONG ADB1F401.25
& , ALBEDO_SURFACE_DIFF_LONG, ALBEDO_SURFACE_DIR_LONG ADB1F401.26
& , FLUX_DIRECT_LONG(1, N_LAYER), FLUX_INC_DOWN_LONG ADB1F401.27
& , SOURCE_GROUND_LONG ADB1F401.28
& , FLUX_LONG ADB1F401.29
& , NPD_PROFILE, NPD_LAYER ADB1F401.30
& ) CLCOL3A.545
! CLCOL3A.546
ELSE CLCOL3A.547
! CLCOL3A.548
WRITE(IU_ERR, '(/A)') CLCOL3A.549
& '*** ERROR: THE SOLVER AND CLOUD SCHEME ' CLCOL3A.550
& //'ARE NOT COMPATIBLE.' CLCOL3A.551
IERR=I_ERR_FATAL CLCOL3A.552
RETURN CLCOL3A.553
! CLCOL3A.554
ENDIF CLCOL3A.555
! CLCOL3A.556
! CLCOL3A.557
! ADD THE PARTIAL FLUX FOR THE COLUMN ONTO THE CUMULATIVE TOTAL. CLCOL3A.558
! CLCOL3A.559
N_COLUMN_DONE=0 CLCOL3A.560
DO L=OFFSET+1, N_PROFILE_SOLVED+OFFSET CLCOL3A.561
DO J=1, N_COLUMN(L) CLCOL3A.562
K=J+N_COLUMN_DONE CLCOL3A.563
IF (ISOLIR.EQ.IP_SOLAR) THEN CLCOL3A.564
DO I=0, N_LAYER CLCOL3A.565
FLUX_DIRECT(L, I)=FLUX_DIRECT(L, I) CLCOL3A.566
& +FLUX_DIRECT_LONG(K, I)*AREA_COLUMN(L, J) CLCOL3A.567
ENDDO CLCOL3A.568
ENDIF CLCOL3A.569
DO I=1, N_AUGMENT CLCOL3A.570
FLUX_TOTAL(L, I)=FLUX_TOTAL(L, I) CLCOL3A.571
& +FLUX_LONG(K, I)*AREA_COLUMN(L, J) CLCOL3A.572
ENDDO CLCOL3A.573
ENDDO CLCOL3A.574
N_COLUMN_DONE=N_COLUMN_DONE+N_COLUMN(L) CLCOL3A.575
ENDDO CLCOL3A.576
! CLCOL3A.577
! THE OFFSET IS NOW ADVANCED FOR THE NEXT LOOP AND A NEW CLCOL3A.578
! LONG VECTOR IS FORMED UNLESS WE HAVE ALREADY SOLVED FOR ALL CLCOL3A.579
! THE PROFILES. CLCOL3A.580
OFFSET=OFFSET+N_PROFILE_SOLVED CLCOL3A.581
IF (OFFSET.LT.N_PROFILE) THEN CLCOL3A.582
N_LONG=0 CLCOL3A.583
I_PROFILE=I_PROFILE+1 ADB2F404.11
GOTO 10 CLCOL3A.584
ENDIF CLCOL3A.585
! CLCOL3A.586
! CLCOL3A.587
! CLCOL3A.588
IF (L_CLEAR) THEN CLCOL3A.589
CALL CLEAR_SUPPLEMENT
(IERR, N_PROFILE, N_LAYER, I_SOLVER_CLEAR CLCOL3A.590
& , TRANS_FREE, REFLECT_FREE, TRANS_0_FREE, SOURCE_COEFF_FREE CLCOL3A.591
& , ISOLIR, FLUX_INC_DIRECT, FLUX_INC_DOWN CLCOL3A.592
& , S_DOWN_FREE, S_UP_FREE CLCOL3A.593
& , ALBEDO_SURFACE_DIFF, ALBEDO_SURFACE_DIR CLCOL3A.594
& , SOURCE_GROUND CLCOL3A.595
& , L_SCALE_SOLAR, ADJUST_SOLAR_KE CLCOL3A.596
& , FLUX_DIRECT_CLEAR, FLUX_TOTAL_CLEAR CLCOL3A.597
& , NPD_PROFILE, NPD_LAYER CLCOL3A.598
& ) CLCOL3A.599
ENDIF CLCOL3A.600
! CLCOL3A.601
! CLCOL3A.602
RETURN CLCOL3A.603
END CLCOL3A.604
*ENDIF DEF,A01_3A,OR,DEF,A02_3A CLCOL3A.605
*ENDIF DEF,A70_1A,OR,DEF,A70_1B APB4F405.12