*IF DEF,A70_1A,OR,DEF,A70_1B APB4F405.59
*IF DEF,A01_3A,OR,DEF,A02_3A OPWCL3A.2
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.13603
C GTS2F400.13604
C Use, duplication or disclosure of this code is subject to the GTS2F400.13605
C restrictions as set forth in the contract. GTS2F400.13606
C GTS2F400.13607
C Meteorological Office GTS2F400.13608
C London Road GTS2F400.13609
C BRACKNELL GTS2F400.13610
C Berkshire UK GTS2F400.13611
C RG12 2SZ GTS2F400.13612
C GTS2F400.13613
C If no contract has been raised with this copy of the code, the use, GTS2F400.13614
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.13615
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.13616
C Modelling at the above address. GTS2F400.13617
C ******************************COPYRIGHT****************************** GTS2F400.13618
C GTS2F400.13619
!+ Subroutine to calculate optical properties of water clouds. OPWCL3A.3
! OPWCL3A.4
! Method: OPWCL3A.5
! If the optical properties come from an observational OPWCL3A.6
! distribution a separate subroutine is called. Otherwise ADB1F401.721
! appropriate mean quantities in the layer are calculated OPWCL3A.8
! as the parametrization requires and these values are OPWCL3A.9
! substituted into the parametrization to give the optical OPWCL3A.10
! properties. OPWCL3A.11
! OPWCL3A.12
! Current Owner of Code: J. M. Edwards OPWCL3A.13
! OPWCL3A.14
! History: OPWCL3A.15
! Version Date Comment OPWCL3A.16
! 4.0 27-07-95 Original Code OPWCL3A.17
! (J. M. Edwards) OPWCL3A.18
! 4.2 Oct. 96 T3E migration: HF functions GSS3F402.243
! replaced by T3E vec_lib function GSS3F402.244
! rtor_v (S.J.Swarbrick) GSS3F402.245
! 4.5 18-05-98 New parametrization ADB1F405.399
! of the optical ADB1F405.400
! properties of cloud ADB1F405.401
! droplets added. ADB1F405.402
! (J. M. Edwards) ADB1F405.403
! OPWCL3A.19
! Description of Code: OPWCL3A.20
! FORTRAN 77 with extensions listed in documentation. OPWCL3A.21
! OPWCL3A.22
!- --------------------------------------------------------------------- OPWCL3A.23
SUBROUTINE OPT_PROP_WATER_CLOUD(IERR 2OPWCL3A.24
& , N_PROFILE, N_LAYER, N_CLOUD_TOP OPWCL3A.25
& , N_CLOUD_PROFILE, I_CLOUD_PROFILE OPWCL3A.26
& , L_RESCALE, L_LAYER, L_CLOUD_LAYER OPWCL3A.27
& , I_PARAMETRIZATION_DROP, CLOUD_PARAMETER OPWCL3A.28
& , LIQ_WATER_MASS_FRAC, RADIUS_EFFECT OPWCL3A.29
& , K_EXT_TOT_CLOUD, K_EXT_SCAT_CLOUD OPWCL3A.30
& , ASYMMETRY_CLOUD, FORWARD_SCATTER_CLOUD OPWCL3A.31
& , NPD_PROFILE, NPD_LAYER OPWCL3A.32
& , NPD_CLOUD_PARAMETER OPWCL3A.33
& ) OPWCL3A.34
! OPWCL3A.35
! OPWCL3A.36
IMPLICIT NONE OPWCL3A.37
! OPWCL3A.38
! OPWCL3A.39
INTEGER !, INTENT(IN) OPWCL3A.40
& NPD_PROFILE OPWCL3A.41
! MAXIMUM NUMBER OF PROFILES OPWCL3A.42
& , NPD_LAYER OPWCL3A.43
! MAXIMUM NUMBER OF LAYERS OPWCL3A.44
& , NPD_CLOUD_PARAMETER OPWCL3A.45
! MAXIMUM NUMBER OF CLOUD PARAMETERS OPWCL3A.46
! OPWCL3A.47
! INCLUDE COMDECKS OPWCL3A.48
*CALL STDIO3A
OPWCL3A.49
*CALL WCLPRM3A
OPWCL3A.50
*CALL ERROR3A
OPWCL3A.51
! OPWCL3A.52
! DUMMY VARIABLES. OPWCL3A.53
INTEGER !, INTENT(OUT) OPWCL3A.54
& IERR OPWCL3A.55
! ERROR FLAG OPWCL3A.56
INTEGER !, INTENT(IN) OPWCL3A.57
& N_PROFILE OPWCL3A.58
! NUMBER OF PROFILES OPWCL3A.59
& , N_LAYER OPWCL3A.60
! NUMBER OF LAYERS OPWCL3A.61
& , N_CLOUD_TOP OPWCL3A.62
! TOPMOST CLOUDY LAYER OPWCL3A.63
& , I_PARAMETRIZATION_DROP OPWCL3A.64
! TREATMENT OF DROPLETS OPWCL3A.65
& , N_CLOUD_PROFILE(NPD_LAYER) OPWCL3A.66
! NUMBER OF CLOUDY PROFILES OPWCL3A.67
& , I_CLOUD_PROFILE(NPD_PROFILE, NPD_LAYER) OPWCL3A.68
! PROFILES CONTAINING CLOUDS OPWCL3A.69
LOGICAL !, INTENT(IN) OPWCL3A.70
& L_LAYER OPWCL3A.71
! VARIABLES GIVEN IN LAYERS OPWCL3A.72
& , L_CLOUD_LAYER OPWCL3A.73
! CLOUD VARIABLES GIVEN IN LAYERS OPWCL3A.74
& , L_RESCALE OPWCL3A.75
! FLAG FOR DELTA-RESCALING OPWCL3A.76
REAL !, INTENT(IN) OPWCL3A.77
& CLOUD_PARAMETER(NPD_CLOUD_PARAMETER) OPWCL3A.78
! CLOUD PARAMETERS OPWCL3A.79
& , LIQ_WATER_MASS_FRAC(NPD_PROFILE, 0: NPD_LAYER) OPWCL3A.80
! LIQUID WATER CONTENT OPWCL3A.81
& , RADIUS_EFFECT(NPD_PROFILE, 0: NPD_LAYER) OPWCL3A.82
! EFFECTIVE RADIUS OPWCL3A.83
REAL !, INTENT(OUT) OPWCL3A.84
& K_EXT_SCAT_CLOUD(NPD_PROFILE, NPD_LAYER) OPWCL3A.85
! SCATTERING EXTINCTION OPWCL3A.86
& , K_EXT_TOT_CLOUD(NPD_PROFILE, NPD_LAYER) OPWCL3A.87
! TOTAL EXTINCTION OPWCL3A.88
& , ASYMMETRY_CLOUD(NPD_PROFILE, NPD_LAYER) OPWCL3A.89
! CLOUDY ASYMMETRIES OPWCL3A.90
& , FORWARD_SCATTER_CLOUD(NPD_PROFILE, NPD_LAYER) OPWCL3A.91
! CLOUDY FORWARD SCATTERING OPWCL3A.92
! OPWCL3A.93
! LOCAL VARIABLES. OPWCL3A.94
INTEGER OPWCL3A.95
& L OPWCL3A.96
! LOOP VARIABLE OPWCL3A.97
& , LL OPWCL3A.98
! LOOP VARIABLE OPWCL3A.99
& , I OPWCL3A.100
! LOOP VARIABLE OPWCL3A.101
& , j !loop variable GSS3F402.246
REAL OPWCL3A.102
& ASYMMETRY_PROCESS(NPD_PROFILE) OPWCL3A.103
! ASYMMETRY FACTOR FOR CURRENT PROC. OPWCL3A.104
& , RADIUS_AVE(3) GSS3F402.247
! AVERAGE EFFECTIVE RADIUS IN LAYER OPWCL3A.106
& , LIQ_MASS_FRAC_AVE OPWCL3A.107
! AVERAGE LIQUID WATER MASS FRACTION OPWCL3A.108
& , cp(3),cpp(3) GSS3F402.248
! workspace array GSS3F402.249
! HALF-PRECISION FUNCTIONS FOR THE UNIFIED MODEL. OPWCL3A.112
! OPWCL3A.121
! OPWCL3A.122
! OPWCL3A.123
! OPWCL3A.124
IF (I_PARAMETRIZATION_DROP.EQ.IP_SLINGO_SCHRECKER) THEN OPWCL3A.125
! OPWCL3A.126
! WE CALCULATE AVERAGE PROPERTIES FOR THE LAYER AND PUT THESE OPWCL3A.127
! INTO THE PARAMETRIZATION, RATHER THAN CALCULATING THE OPWCL3A.128
! PARAMETRIZATION AT EACH LEVEL: USUALLY THIS IS MORE ACCURATE. OPWCL3A.129
! IT ALSO FITS MORE NATURALLY WITH CASES WHERE DATA ARE GIVEN OPWCL3A.130
! IN LAYERS. OPWCL3A.131
! OPWCL3A.132
! OPWCL3A.133
DO I=N_CLOUD_TOP, N_LAYER OPWCL3A.134
DO LL=1, N_CLOUD_PROFILE(I) OPWCL3A.135
L=I_CLOUD_PROFILE(LL, I) OPWCL3A.136
LIQ_MASS_FRAC_AVE=LIQ_WATER_MASS_FRAC(L, I) OPWCL3A.137
RADIUS_AVE(1)=RADIUS_EFFECT(L, I) GSS3F402.250
K_EXT_TOT_CLOUD(L, I) OPWCL3A.139
& =LIQ_MASS_FRAC_AVE*(CLOUD_PARAMETER(1) OPWCL3A.140
& +CLOUD_PARAMETER(2)/RADIUS_AVE(1)) GSS3F402.251
K_EXT_SCAT_CLOUD(L, I)=K_EXT_TOT_CLOUD(L, I) OPWCL3A.142
& *(1.0E+00-CLOUD_PARAMETER(3) OPWCL3A.143
& -CLOUD_PARAMETER(4)*RADIUS_AVE(1)) GSS3F402.252
ASYMMETRY_PROCESS(L)= OPWCL3A.145
& CLOUD_PARAMETER(5)+CLOUD_PARAMETER(6) OPWCL3A.146
& *RADIUS_AVE(1) GSS3F402.253
ASYMMETRY_CLOUD(L, I)= OPWCL3A.148
& K_EXT_SCAT_CLOUD(L, I)*ASYMMETRY_PROCESS(L) OPWCL3A.149
ENDDO OPWCL3A.150
IF (L_RESCALE) THEN OPWCL3A.151
DO LL=1, N_CLOUD_PROFILE(I) OPWCL3A.152
L=I_CLOUD_PROFILE(LL, I) OPWCL3A.153
FORWARD_SCATTER_CLOUD(L, I) OPWCL3A.154
& =K_EXT_SCAT_CLOUD(L, I) OPWCL3A.155
& *ASYMMETRY_PROCESS(L)**2 OPWCL3A.156
ENDDO OPWCL3A.157
ENDIF OPWCL3A.158
ENDDO OPWCL3A.159
! OPWCL3A.160
ELSE IF (I_PARAMETRIZATION_DROP.EQ.IP_ACKERMAN_STEPHENS) THEN OPWCL3A.161
! OPWCL3A.162
! Set up CP array for use in rtor_v function GSS3F402.254
CP(1)=CLOUD_PARAMETER(3) GSS3F402.255
CP(2)=CLOUD_PARAMETER(6) GSS3F402.256
CP(3)=CLOUD_PARAMETER(9) GSS3F402.257
! GSS3F402.258
DO I=N_CLOUD_TOP, N_LAYER OPWCL3A.163
DO LL=1, N_CLOUD_PROFILE(I) OPWCL3A.164
L=I_CLOUD_PROFILE(LL, I) OPWCL3A.165
LIQ_MASS_FRAC_AVE=LIQ_WATER_MASS_FRAC(L, I) OPWCL3A.166
RADIUS_AVE(1)=RADIUS_EFFECT(L, I) GSS3F402.259
RADIUS_AVE(2)=RADIUS_EFFECT(L, I) GSS3F402.260
RADIUS_AVE(3)=RADIUS_EFFECT(L, I) GSS3F402.261
*IF DEF,VECTLIB PXVECTLB.112
call rtor_v(
3,radius_ave,cp,cpp) GSS3F402.263
*ELSE GSS3F402.264
do j=1,3 GSS3F402.265
cpp(j)=radius_ave(j)**cp(j) GSS3F402.266
end do GSS3F402.267
*ENDIF GSS3F402.268
K_EXT_TOT_CLOUD(L, I)=LIQ_MASS_FRAC_AVE OPWCL3A.168
& *( CLOUD_PARAMETER(1)+CLOUD_PARAMETER(2) GSS3F402.269
& * CPP(1) ) GSS3F402.270
K_EXT_SCAT_CLOUD(L, I)=K_EXT_TOT_CLOUD(L, I) OPWCL3A.171
& *(1.0E+00-CLOUD_PARAMETER(4)-CLOUD_PARAMETER(5) GSS3F402.271
& * CPP(2) ) GSS3F402.272
ASYMMETRY_PROCESS(L)= OPWCL3A.175
& CLOUD_PARAMETER(7)+CLOUD_PARAMETER(8) OPWCL3A.176
& * CPP(3) GSS3F402.273
ASYMMETRY_CLOUD(L, I)= OPWCL3A.178
& K_EXT_SCAT_CLOUD(L, I)*ASYMMETRY_PROCESS(L) OPWCL3A.179
ENDDO OPWCL3A.180
IF (L_RESCALE) THEN OPWCL3A.181
DO LL=1, N_CLOUD_PROFILE(I) OPWCL3A.182
L=I_CLOUD_PROFILE(LL, I) OPWCL3A.183
FORWARD_SCATTER_CLOUD(L, I) OPWCL3A.184
& =K_EXT_SCAT_CLOUD(L, I) OPWCL3A.185
& *ASYMMETRY_PROCESS(L)**2 OPWCL3A.186
ENDDO OPWCL3A.187
ENDIF OPWCL3A.188
ENDDO OPWCL3A.189
! ADB1F405.404
ELSE IF (I_PARAMETRIZATION_DROP.EQ.IP_DROP_PADE_2) THEN ADB1F405.405
! ADB1F405.406
DO I=N_CLOUD_TOP, N_LAYER ADB1F405.407
DO LL=1, N_CLOUD_PROFILE(I) ADB1F405.408
L=I_CLOUD_PROFILE(LL, I) ADB1F405.409
LIQ_MASS_FRAC_AVE=LIQ_WATER_MASS_FRAC(L, I) ADB1F405.410
RADIUS_AVE(1)=RADIUS_EFFECT(L, I) ADB1F405.411
K_EXT_TOT_CLOUD(L, I)=LIQ_MASS_FRAC_AVE ADB1F405.412
& *(CLOUD_PARAMETER(1)+RADIUS_AVE(1) ADB1F405.413
& *(CLOUD_PARAMETER(2)+RADIUS_AVE(1) ADB1F405.414
& *CLOUD_PARAMETER(3))) ADB1F405.415
& /(1.0E+00+RADIUS_AVE(1) ADB1F405.416
& *(CLOUD_PARAMETER(4)+RADIUS_AVE(1) ADB1F405.417
& *(CLOUD_PARAMETER(5)+RADIUS_AVE(1) ADB1F405.418
& *CLOUD_PARAMETER(6)))) ADB1F405.419
K_EXT_SCAT_CLOUD(L, I)=K_EXT_TOT_CLOUD(L, I)*(1.0E+00 ADB1F405.420
& -(CLOUD_PARAMETER(7)+RADIUS_AVE(1) ADB1F405.421
& *(CLOUD_PARAMETER(8)+RADIUS_AVE(1) ADB1F405.422
& *CLOUD_PARAMETER(9))) ADB1F405.423
& /(1.0E+00+RADIUS_AVE(1) ADB1F405.424
& *(CLOUD_PARAMETER(10)+RADIUS_AVE(1) ADB1F405.425
& *CLOUD_PARAMETER(11)))) ADB1F405.426
ASYMMETRY_PROCESS(L) ADB1F405.427
& =(CLOUD_PARAMETER(12)+RADIUS_AVE(1) ADB1F405.428
& *(CLOUD_PARAMETER(13)+RADIUS_AVE(1) ADB1F405.429
& *CLOUD_PARAMETER(14))) ADB1F405.430
& /(1.0E+00+RADIUS_AVE(1) ADB1F405.431
& *(CLOUD_PARAMETER(15)+RADIUS_AVE(1) ADB1F405.432
& *CLOUD_PARAMETER(16))) ADB1F405.433
ASYMMETRY_CLOUD(L, I)= ADB1F405.434
& K_EXT_SCAT_CLOUD(L, I)*ASYMMETRY_PROCESS(L) ADB1F405.435
ENDDO ADB1F405.436
IF (L_RESCALE) THEN ADB1F405.437
DO LL=1, N_CLOUD_PROFILE(I) ADB1F405.438
L=I_CLOUD_PROFILE(LL, I) ADB1F405.439
FORWARD_SCATTER_CLOUD(L, I) ADB1F405.440
& =K_EXT_SCAT_CLOUD(L, I) ADB1F405.441
& *ASYMMETRY_PROCESS(L)**2 ADB1F405.442
ENDDO ADB1F405.443
ENDIF ADB1F405.444
ENDDO ADB1F405.445
! OPWCL3A.190
ELSE OPWCL3A.191
WRITE(IU_ERR, '(/A)') '*** ERROR: AN INVALID PARAMETRIZATION ' OPWCL3A.192
& //'OF CLOUD DROPLETS HAS BEEN USED.' OPWCL3A.193
IERR=I_ERR_FATAL OPWCL3A.194
RETURN OPWCL3A.195
ENDIF OPWCL3A.196
! OPWCL3A.197
! OPWCL3A.198
RETURN OPWCL3A.199
END OPWCL3A.200
*ENDIF DEF,A01_3A,OR,DEF,A02_3A OPWCL3A.201
*ENDIF DEF,A70_1A,OR,DEF,A70_1B APB4F405.60