*IF DEF,A70_1B SCLAB3B.2
*IF DEF,A01_3A,OR,DEF,A02_3A SCLAB3B.3
C ******************************COPYRIGHT****************************** SCLAB3B.4
C (c) CROWN COPYRIGHT 1998, METEOROLOGICAL OFFICE, All Rights Reserved. SCLAB3B.5
C SCLAB3B.6
C Use, duplication or disclosure of this code is subject to the SCLAB3B.7
C restrictions as set forth in the contract. SCLAB3B.8
C SCLAB3B.9
C Meteorological Office SCLAB3B.10
C London Road SCLAB3B.11
C BRACKNELL SCLAB3B.12
C Berkshire UK SCLAB3B.13
C RG12 2SZ SCLAB3B.14
C SCLAB3B.15
C If no contract has been raised with this copy of the code, the use, SCLAB3B.16
C duplication or disclosure of it is strictly prohibited. Permission SCLAB3B.17
C to do so must first be obtained in writing from the Head of Numerical SCLAB3B.18
C Modelling at the above address. SCLAB3B.19
C ******************************COPYRIGHT****************************** SCLAB3B.20
C SCLAB3B.21
!+ Subroutine to scale amounts of absorbers. SCLAB3B.22
! SCLAB3B.23
! Method: SCLAB3B.24
! The mixing ratio is multiplied by a factor determined SCLAB3B.25
! by the type of scaling selected. SCLAB3B.26
! SCLAB3B.27
! SCLAB3B.28
! Current Owner of Code: J. M. Edwards SCLAB3B.29
! SCLAB3B.30
! History: SCLAB3B.31
! Version Date Comment SCLAB3B.32
! 4.5 11-06-98 Optimised Code SCLAB3B.33
! (P. Burton) SCLAB3B.34
! SCLAB3B.35
! Description of Code: SCLAB3B.36
! FORTRAN 77 with extensions listed in documentation. SCLAB3B.37
! SCLAB3B.38
!- --------------------------------------------------------------------- SCLAB3B.39
SUBROUTINE SCALE_ABSORB(IERR, N_PROFILE, N_LAYER 13SCLAB3B.40
& , GAS_MIX_RATIO, P, T, L_LAYER, I_TOP SCLAB3B.41
& , GAS_FRAC_RESCALED SCLAB3B.42
& , I_FNC, P_REFERENCE, T_REFERENCE, SCALE_PARAMETER SCLAB3B.43
& , L_DOPPLER, DOPPLER_CORRECTION SCLAB3B.44
& , NPD_PROFILE, NPD_LAYER, NPD_SCALE_FNC SCLAB3B.45
& , NPD_SCALE_VARIABLE SCLAB3B.46
& ) SCLAB3B.47
! SCLAB3B.48
! SCLAB3B.49
IMPLICIT NONE SCLAB3B.50
! SCLAB3B.51
! SCLAB3B.52
! SIZES OF DUMMY ARRAYS. SCLAB3B.53
INTEGER !, INTENT(IN) SCLAB3B.54
& NPD_PROFILE SCLAB3B.55
! MAXIMUM NUMBER OF PROFILES SCLAB3B.56
& , NPD_LAYER SCLAB3B.57
! MAXIMUM NUMBER OF LAYERS SCLAB3B.58
& , NPD_SCALE_FNC SCLAB3B.59
! NUMBER OF SCALING FUNCTIONS SCLAB3B.60
& , NPD_SCALE_VARIABLE SCLAB3B.61
! MAX. NUMBER OF SCALING VARIABLES SCLAB3B.62
! SCLAB3B.63
! INCLUDE COMDECKS. SCLAB3B.64
*CALL STDIO3A
SCLAB3B.65
*CALL SCLFNC3A
SCLAB3B.66
*CALL ERROR3A
SCLAB3B.67
! SCLAB3B.68
! DUMMY ARGUMENTS. SCLAB3B.69
INTEGER !, INTENT(OUT) SCLAB3B.70
& IERR SCLAB3B.71
! ERROR FLAG SCLAB3B.72
INTEGER !, INTENT(IN) SCLAB3B.73
& N_PROFILE SCLAB3B.74
! NUMBER OF PROFILES SCLAB3B.75
& , N_LAYER SCLAB3B.76
! NUMBER OF LAYERS SCLAB3B.77
& , I_FNC SCLAB3B.78
! TYPE OF SCALING FUNCTION SCLAB3B.79
& , I_TOP SCLAB3B.80
! UPPERMOST INDEX FOR SCALING (THIS WILL BE 1 FOR FIELDS SCLAB3B.81
! GIVEN IN LAYERS, AS IN THE UNIFIED MODEL, OR 0 FOR SCLAB3B.82
! FIELDS GIVEN AT THE BOUNDARIES OF LAYERS) SCLAB3B.83
LOGICAL !, INTENT(IN) SCLAB3B.84
& L_LAYER SCLAB3B.85
! DATA SPECIFIED IN LAYERS SCLAB3B.86
& , L_DOPPLER SCLAB3B.87
! FLAG FOR DOPPLER TERM SCLAB3B.88
REAL !, INTENT(IN) SCLAB3B.89
& GAS_MIX_RATIO(NPD_PROFILE, 0: NPD_LAYER) SCLAB3B.90
! MASS MIXING RATIO OF GAS SCLAB3B.91
& , P(NPD_PROFILE, 0: NPD_LAYER) SCLAB3B.92
! PRESSURE SCLAB3B.93
& , T(NPD_PROFILE, 0: NPD_LAYER) SCLAB3B.94
! TEMPERATURE SCLAB3B.95
& , P_REFERENCE SCLAB3B.96
! REFERENCE PRESSURE SCLAB3B.97
& , T_REFERENCE SCLAB3B.98
! REFERENCE TEMPERATURE SCLAB3B.99
& , SCALE_PARAMETER(NPD_SCALE_VARIABLE) SCLAB3B.100
! SCALING PARAMTERS SCLAB3B.101
& , DOPPLER_CORRECTION SCLAB3B.102
! DOPPLER-BROADENING CORRECTION SCLAB3B.103
REAL !, INTENT(OUT) SCLAB3B.104
& GAS_FRAC_RESCALED(NPD_PROFILE, 0: NPD_LAYER) SCLAB3B.105
! MASS FRACTION OF GAS SCLAB3B.106
! SCLAB3B.107
! LOCAL VARIABLES. SCLAB3B.108
INTEGER SCLAB3B.109
& L SCLAB3B.110
! LOOP VARIABLE SCLAB3B.111
& , I SCLAB3B.112
! LOOP VARIABLE SCLAB3B.113
REAL SCLAB3B.114
& PRESSURE_OFFSET SCLAB3B.115
! OFFSET TO PRESSURE SCLAB3B.116
REAL PWK(N_PROFILE,N_LAYER-I_TOP+1) ! Workspace SCLAB3B.117
REAL TWK(N_PROFILE,N_LAYER-I_TOP+1) ! Workspace SCLAB3B.118
*IF DEF,VECTLIB PXVECTLB.138
REAL SP1(N_PROFILE,N_LAYER-I_TOP+1) ! Workspace SCLAB3B.120
REAL SP2(N_PROFILE,N_LAYER-I_TOP+1) ! Workspace SCLAB3B.121
INTEGER n_input ! No. of inputs for rtor_v function SCLAB3B.122
*ENDIF SCLAB3B.123
REAL TMP, T_INV,P_REF_OFF_INV SCLAB3B.124
SCLAB3B.125
! SCLAB3B.126
! SET THE OFFSET TO THE PRESSURE FOR THE DOPPLER CORRECTION. SCLAB3B.127
IF (L_DOPPLER) THEN SCLAB3B.128
PRESSURE_OFFSET=DOPPLER_CORRECTION SCLAB3B.129
ELSE SCLAB3B.130
PRESSURE_OFFSET=0.0E+00 SCLAB3B.131
ENDIF SCLAB3B.132
SCLAB3B.133
T_INV = 1.0/T_REFERENCE SCLAB3B.134
P_REF_OFF_INV = 1.0/(P_REFERENCE+PRESSURE_OFFSET) SCLAB3B.135
SCLAB3B.136
! THE ARRAY GAS_FRAC_RESCALED IS USED INITIALLY TO HOLD ONLY THE SCLAB3B.137
! SCALING FUNCTIONS, AND ONLY LATER IS IT MULTIPLIED BY THE SCLAB3B.138
! MIXING RATIOS SCLAB3B.139
*IF DEF,VECTLIB PXVECTLB.139
do I=1, N_LAYER-I_TOP+1 SCLAB3B.141
do L=1, N_PROFILE SCLAB3B.142
sp1(L,I)=SCALE_PARAMETER(1) SCLAB3B.143
sp2(L,I)=SCALE_PARAMETER(2) SCLAB3B.144
end do SCLAB3B.145
end do SCLAB3B.146
n_input=(N_LAYER-I_TOP+1)*N_PROFILE SCLAB3B.147
*ENDIF SCLAB3B.148
! SCLAB3B.149
IF (I_FNC.EQ.IP_SCALE_POWER_LAW) THEN SCLAB3B.150
! SCLAB3B.151
IF(L_DOPPLER) THEN SCLAB3B.152
DO I= 1, N_LAYER-I_TOP+1 SCLAB3B.153
DO L=1, N_PROFILE SCLAB3B.154
PWK(L,I)=(P(L,I_TOP+I-1)+PRESSURE_OFFSET) SCLAB3B.155
& *P_REF_OFF_INV SCLAB3B.156
TWK(L,I)=T(L,I_TOP+I-1)*T_INV SCLAB3B.157
END DO SCLAB3B.158
END DO SCLAB3B.159
ELSE SCLAB3B.160
DO I= 1, N_LAYER-I_TOP+1 SCLAB3B.161
DO L=1, N_PROFILE SCLAB3B.162
PWK(L,I)=P(L,I_TOP+I-1) SCLAB3B.163
& *P_REF_OFF_INV SCLAB3B.164
TWK(L,I)=T(L,I_TOP+I-1)*T_INV SCLAB3B.165
END DO SCLAB3B.166
END DO SCLAB3B.167
END IF SCLAB3B.168
*IF DEF,VECTLIB PXVECTLB.140
call rtor_v(
n_input,pwk,sp1,pwk) SCLAB3B.170
call rtor_v(
n_input,twk,sp2,twk) SCLAB3B.171
*ELSE SCLAB3B.172
DO I= 1, N_LAYER-I_TOP+1 SCLAB3B.173
DO L=1, N_PROFILE SCLAB3B.174
PWK(L,I)=PWK(L,I)**SCALE_PARAMETER(1) SCLAB3B.175
TWK(L,I)=TWK(L,I)**SCALE_PARAMETER(2) SCLAB3B.176
ENDDO SCLAB3B.177
ENDDO SCLAB3B.178
*ENDIF SCLAB3B.179
! SCLAB3B.180
DO I=I_TOP, N_LAYER SCLAB3B.181
DO L=1, N_PROFILE SCLAB3B.182
GAS_FRAC_RESCALED(L, I) SCLAB3B.183
& =PWK(L,I-I_TOP+1)*TWK(L,I-I_TOP+1) SCLAB3B.184
ENDDO SCLAB3B.185
ENDDO SCLAB3B.186
ELSE IF (I_FNC.EQ.IP_SCALE_FNC_NULL) THEN SCLAB3B.187
RETURN SCLAB3B.188
ELSE IF (I_FNC.EQ.IP_SCALE_POWER_QUAD) THEN SCLAB3B.189
! SCLAB3B.190
IF(L_DOPPLER) THEN SCLAB3B.191
DO I= 1, N_LAYER-I_TOP+1 SCLAB3B.192
DO L=1, N_PROFILE SCLAB3B.193
PWK(L,I)=(P(L,I_TOP+I-1)+PRESSURE_OFFSET) SCLAB3B.194
& *P_REF_OFF_INV SCLAB3B.195
END DO SCLAB3B.196
END DO SCLAB3B.197
ELSE SCLAB3B.198
DO I= 1, N_LAYER-I_TOP+1 SCLAB3B.199
DO L=1, N_PROFILE SCLAB3B.200
PWK(L,I)=P(L,I_TOP+I-1) SCLAB3B.201
& *P_REF_OFF_INV SCLAB3B.202
END DO SCLAB3B.203
END DO SCLAB3B.204
END IF SCLAB3B.205
*IF DEF,VECTLIB PXVECTLB.141
call rtor_v(
n_input,pwk,sp1,pwk) SCLAB3B.207
*ELSE SCLAB3B.208
DO I= 1, N_LAYER-I_TOP+1 SCLAB3B.209
DO L=1, N_PROFILE SCLAB3B.210
PWK(L,I)=PWK(L,I)**SCALE_PARAMETER(1) SCLAB3B.211
ENDDO SCLAB3B.212
ENDDO SCLAB3B.213
*ENDIF SCLAB3B.214
! SCLAB3B.215
DO I=I_TOP, N_LAYER SCLAB3B.216
DO L=1, N_PROFILE SCLAB3B.217
TMP = T(L,I)*T_INV - 1.0 SCLAB3B.218
GAS_FRAC_RESCALED(L, I)=PWK(L,I-I_TOP+1)* SCLAB3B.219
& (1.0E+00+TMP*SCALE_PARAMETER(2) SCLAB3B.220
& +SCALE_PARAMETER(3)*TMP*TMP) SCLAB3B.221
ENDDO SCLAB3B.222
ENDDO SCLAB3B.223
ELSE IF (I_FNC.EQ.IP_SCALE_DOPPLER_QUAD) THEN SCLAB3B.224
! THERE IS NO DOPPLER TERM HERE SINCE IT IS IMPLICITLY INCLUDED SCLAB3B.225
! IN THE SCALING. SCLAB3B.226
! SCLAB3B.227
DO I= 1, N_LAYER-I_TOP+1 SCLAB3B.228
DO L=1, N_PROFILE SCLAB3B.229
PWK(L,I)=(P(L,I_TOP+I-1)+SCALE_PARAMETER(2)) SCLAB3B.230
& /(P_REFERENCE+SCALE_PARAMETER(2)) SCLAB3B.231
END DO SCLAB3B.232
END DO SCLAB3B.233
*IF DEF,VECTLIB PXVECTLB.142
call rtor_v(
n_input,pwk,sp1,pwk) SCLAB3B.235
*ELSE SCLAB3B.236
DO I=1,N_LAYER-I_TOP+1 SCLAB3B.237
DO L=1, N_PROFILE SCLAB3B.238
PWK(L,I)=PWK(L,I)**SCALE_PARAMETER(1) SCLAB3B.239
ENDDO SCLAB3B.240
ENDDO SCLAB3B.241
*ENDIF SCLAB3B.242
! SCLAB3B.243
DO I=I_TOP, N_LAYER SCLAB3B.244
DO L=1, N_PROFILE SCLAB3B.245
TMP = T(L,I)*T_INV - 1.0 SCLAB3B.246
GAS_FRAC_RESCALED(L, I)=PWK(L,I-I_TOP+1) SCLAB3B.247
& *(1.0E+00 SCLAB3B.248
& +TMP*SCALE_PARAMETER(3) SCLAB3B.249
& +SCALE_PARAMETER(4)*TMP*TMP) SCLAB3B.250
ENDDO SCLAB3B.251
ENDDO SCLAB3B.252
ELSE SCLAB3B.253
WRITE(IU_ERR, '(/A)') SCLAB3B.254
& '*** ERROR: AN ILLEGAL TYPE OF SCALING HAS BEEN GIVEN.' SCLAB3B.255
IERR=I_ERR_FATAL SCLAB3B.256
RETURN SCLAB3B.257
ENDIF SCLAB3B.258
! SCLAB3B.259
! MULTIPLY BY THE MIXING RATIO AND LIMIT NEGATIVE SCALINGS. SCLAB3B.260
IF (L_LAYER) THEN SCLAB3B.261
DO I=N_LAYER, 1, -1 SCLAB3B.262
DO L=1, N_PROFILE SCLAB3B.263
GAS_FRAC_RESCALED(L, I)=MAX(REAL(0.0E+00) SCLAB3B.264
& , GAS_FRAC_RESCALED(L, I)*GAS_MIX_RATIO(L, I)) SCLAB3B.265
ENDDO SCLAB3B.266
ENDDO SCLAB3B.267
ELSE SCLAB3B.268
! CONVERT TO VALUES IN LAYERS. SCLAB3B.269
DO I=N_LAYER, 1, -1 SCLAB3B.270
DO L=1, N_PROFILE SCLAB3B.271
GAS_FRAC_RESCALED(L, I) SCLAB3B.272
& =0.5E+00*(GAS_FRAC_RESCALED(L, I-1) SCLAB3B.273
& *GAS_MIX_RATIO(L, I-1) SCLAB3B.274
& +GAS_FRAC_RESCALED(L, I)*GAS_MIX_RATIO(L, I)) SCLAB3B.275
GAS_FRAC_RESCALED(L, I) SCLAB3B.276
& =MAX(REAL(0.0E+00), GAS_FRAC_RESCALED(L, I)) SCLAB3B.277
ENDDO SCLAB3B.278
ENDDO SCLAB3B.279
ENDIF SCLAB3B.280
! SCLAB3B.281
! SCLAB3B.282
RETURN SCLAB3B.283
END SCLAB3B.284
*ENDIF DEF,A01_3A,OR,DEF,A02_3A SCLAB3B.285
*ENDIF DEF,A70_1B SCLAB3B.286