*IF DEF,A70_1A ADB1F402.91
*IF DEF,A01_3A,OR,DEF,A02_3A SCLAB3A.2
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.13841
C GTS2F400.13842
C Use, duplication or disclosure of this code is subject to the GTS2F400.13843
C restrictions as set forth in the contract. GTS2F400.13844
C GTS2F400.13845
C Meteorological Office GTS2F400.13846
C London Road GTS2F400.13847
C BRACKNELL GTS2F400.13848
C Berkshire UK GTS2F400.13849
C RG12 2SZ GTS2F400.13850
C GTS2F400.13851
C If no contract has been raised with this copy of the code, the use, GTS2F400.13852
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.13853
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.13854
C Modelling at the above address. GTS2F400.13855
C ******************************COPYRIGHT****************************** GTS2F400.13856
C GTS2F400.13857
!+ Subroutine to scale amounts of absorbers. SCLAB3A.3
! SCLAB3A.4
! Method: SCLAB3A.5
! The mixing ratio is multiplied by a factor determined SCLAB3A.6
! by the type of scaling selected. SCLAB3A.7
! SCLAB3A.8
! SCLAB3A.9
! Current Owner of Code: J. M. Edwards SCLAB3A.10
! SCLAB3A.11
! History: SCLAB3A.12
! Version Date Comment SCLAB3A.13
! 4.0 27-07-95 Original Code SCLAB3A.14
! (J. M. Edwards) SCLAB3A.15
! 4.1 03-05-96 Range of scaling ADB1F401.926
! function with implicit ADB1F401.927
! Doppler term set to ADB1F401.928
! begin at I_TOP. ADB1F401.929
! (J. M. Edwards) ADB1F401.930
! 4.2 Oct. 96 T3E migration: HF functions GSS3F402.330
! replaced by T3E vec_lib function GSS3F402.331
! rtor_v (S.J.Swarbrick) GSS3F402.332
! 4.5 12/05/98 Replace **k by exp(k*log( )) for faster running GRB1F405.40
! on Fujitsu VPP700 - saves 38%. RBarnes@ecmwf.int GRB1F405.41
! SCLAB3A.16
! Description of Code: SCLAB3A.17
! FORTRAN 77 with extensions listed in documentation. SCLAB3A.18
! SCLAB3A.19
!- --------------------------------------------------------------------- SCLAB3A.20
SUBROUTINE SCALE_ABSORB(IERR, N_PROFILE, N_LAYER 13SCLAB3A.21
& , GAS_MIX_RATIO, P, T, L_LAYER, I_TOP SCLAB3A.22
& , GAS_FRAC_RESCALED SCLAB3A.23
& , I_FNC, P_REFERENCE, T_REFERENCE, SCALE_PARAMETER SCLAB3A.24
& , L_DOPPLER, DOPPLER_CORRECTION SCLAB3A.25
& , NPD_PROFILE, NPD_LAYER, NPD_SCALE_FNC SCLAB3A.26
& , NPD_SCALE_VARIABLE SCLAB3A.27
& ) SCLAB3A.28
! SCLAB3A.29
! SCLAB3A.30
IMPLICIT NONE SCLAB3A.31
! SCLAB3A.32
! SCLAB3A.33
! SIZES OF DUMMY ARRAYS. SCLAB3A.34
INTEGER !, INTENT(IN) SCLAB3A.35
& NPD_PROFILE SCLAB3A.36
! MAXIMUM NUMBER OF PROFILES SCLAB3A.37
& , NPD_LAYER SCLAB3A.38
! MAXIMUM NUMBER OF LAYERS SCLAB3A.39
& , NPD_SCALE_FNC SCLAB3A.40
! NUMBER OF SCALING FUNCTIONS SCLAB3A.41
& , NPD_SCALE_VARIABLE SCLAB3A.42
! MAX. NUMBER OF SCALING VARIABLES SCLAB3A.43
! SCLAB3A.44
! INCLUDE COMDECKS. SCLAB3A.45
*CALL STDIO3A
SCLAB3A.46
*CALL SCLFNC3A
SCLAB3A.47
*CALL ERROR3A
SCLAB3A.48
! SCLAB3A.49
! DUMMY ARGUMENTS. SCLAB3A.50
INTEGER !, INTENT(OUT) SCLAB3A.51
& IERR SCLAB3A.52
! ERROR FLAG SCLAB3A.53
INTEGER !, INTENT(IN) SCLAB3A.54
& N_PROFILE SCLAB3A.55
! NUMBER OF PROFILES SCLAB3A.56
& , N_LAYER SCLAB3A.57
! NUMBER OF LAYERS SCLAB3A.58
& , I_FNC SCLAB3A.59
! TYPE OF SCALING FUNCTION SCLAB3A.60
& , I_TOP SCLAB3A.61
! UPPERMOST INDEX FOR SCALING (THIS WILL BE 1 FOR FIELDS ADB1F401.931
! GIVEN IN LAYERS, AS IN THE UNIFIED MODEL, OR 0 FOR ADB1F401.932
! FIELDS GIVEN AT THE BOUNDARIES OF LAYERS) ADB1F401.933
LOGICAL !, INTENT(IN) SCLAB3A.63
& L_LAYER SCLAB3A.64
! DATA SPECIFIED IN LAYERS SCLAB3A.65
& , L_DOPPLER SCLAB3A.66
! FLAG FOR DOPPLER TERM SCLAB3A.67
REAL !, INTENT(IN) SCLAB3A.68
& GAS_MIX_RATIO(NPD_PROFILE, 0: NPD_LAYER) SCLAB3A.69
! MASS MIXING RATIO OF GAS SCLAB3A.70
& , P(NPD_PROFILE, 0: NPD_LAYER) SCLAB3A.71
! PRESSURE SCLAB3A.72
& , T(NPD_PROFILE, 0: NPD_LAYER) SCLAB3A.73
! TEMPERATURE SCLAB3A.74
& , P_REFERENCE SCLAB3A.75
! REFERENCE PRESSURE SCLAB3A.76
& , T_REFERENCE SCLAB3A.77
! REFERENCE TEMPERATURE ADB1F401.934
& , SCALE_PARAMETER(NPD_SCALE_VARIABLE) SCLAB3A.79
! SCALING PARAMTERS SCLAB3A.80
& , DOPPLER_CORRECTION SCLAB3A.81
! DOPPLER-BROADENING CORRECTION SCLAB3A.82
REAL !, INTENT(OUT) SCLAB3A.83
& GAS_FRAC_RESCALED(NPD_PROFILE, 0: NPD_LAYER) SCLAB3A.84
! MASS FRACTION OF GAS SCLAB3A.85
! SCLAB3A.86
! LOCAL VARIABLES. SCLAB3A.87
INTEGER SCLAB3A.88
& L SCLAB3A.89
! LOOP VARIABLE SCLAB3A.90
& , I SCLAB3A.91
! LOOP VARIABLE SCLAB3A.92
REAL SCLAB3A.93
& PRESSURE_OFFSET SCLAB3A.94
! OFFSET TO PRESSURE SCLAB3A.95
REAL PWK(N_PROFILE,N_LAYER-I_TOP+1) ! Workspace GSS3F402.333
REAL TWK(N_PROFILE,N_LAYER-I_TOP+1) ! Workspace GSS3F402.334
*IF DEF,VECTLIB PXVECTLB.133
REAL SP1(N_PROFILE,N_LAYER-I_TOP+1) ! Workspace GSS3F402.336
REAL SP2(N_PROFILE,N_LAYER-I_TOP+1) ! Workspace GSS3F402.337
INTEGER n_input ! No. of inputs for rtor_v function GSS3F402.338
*ENDIF GSS3F402.339
! SCLAB3A.108
! SET THE OFFSET TO THE PRESSURE FOR THE DOPPLER CORRECTION. SCLAB3A.109
IF (L_DOPPLER) THEN SCLAB3A.110
PRESSURE_OFFSET=DOPPLER_CORRECTION SCLAB3A.111
ELSE SCLAB3A.112
PRESSURE_OFFSET=0.0E+00 SCLAB3A.113
ENDIF SCLAB3A.114
! SCLAB3A.115
! THE ARRAY GAS_FRAC_RESCALED IS USED INITIALLY TO HOLD ONLY THE SCLAB3A.116
! SCALING FUNCTIONS, AND ONLY LATER IS IT MULTIPLIED BY THE SCLAB3A.117
! MIXING RATIOS SCLAB3A.118
*IF DEF,VECTLIB PXVECTLB.134
do I=1, N_LAYER-I_TOP+1 GSS3F402.341
do L=1, N_PROFILE GSS3F402.342
sp1(L,I)=SCALE_PARAMETER(1) GSS3F402.343
sp2(L,I)=SCALE_PARAMETER(2) GSS3F402.344
end do GSS3F402.345
end do GSS3F402.346
n_input=(N_LAYER-I_TOP+1)*N_PROFILE GSS3F402.347
*ENDIF GSS3F402.348
! SCLAB3A.119
IF (I_FNC.EQ.IP_SCALE_POWER_LAW) THEN SCLAB3A.120
! GSS3F402.349
DO I= 1, N_LAYER-I_TOP+1 GSS3F402.350
DO L=1, N_PROFILE GSS3F402.351
PWK(L,I)=(P(L,I_TOP+I-1)+PRESSURE_OFFSET) GSS3F402.352
& /(P_REFERENCE+PRESSURE_OFFSET) GSS3F402.353
TWK(L,I)=T(L,I_TOP+I-1)/T_REFERENCE GSS3F402.354
END DO GSS3F402.355
END DO GSS3F402.356
*IF DEF,VECTLIB PXVECTLB.135
call rtor_v(
n_input,pwk,sp1,pwk) GSS3F402.358
call rtor_v(
n_input,twk,sp2,twk) GSS3F402.359
*ELSE GSS3F402.360
DO I= 1, N_LAYER-I_TOP+1 GSS3F402.361
DO L=1, N_PROFILE GSS3F402.362
*IF -DEF,FUJITSU GRB1F405.42
PWK(L,I)=PWK(L,I)**SCALE_PARAMETER(1) GSS3F402.363
TWK(L,I)=TWK(L,I)**SCALE_PARAMETER(2) GSS3F402.364
*ELSE GRB1F405.43
PWK(L,I)=exp(SCALE_PARAMETER(1)*log(PWK(L,I))) GRB1F405.44
TWK(L,I)=exp(SCALE_PARAMETER(2)*log(TWK(L,I))) GRB1F405.45
*ENDIF GRB1F405.46
ENDDO GSS3F402.365
ENDDO GSS3F402.366
*ENDIF GSS3F402.367
! GSS3F402.368
DO I=I_TOP, N_LAYER SCLAB3A.121
DO L=1, N_PROFILE SCLAB3A.122
GAS_FRAC_RESCALED(L, I) GSS3F402.369
& =PWK(L,I-I_TOP+1)*TWK(L,I-I_TOP+1) GSS3F402.370
ENDDO SCLAB3A.128
ENDDO SCLAB3A.129
ELSE IF (I_FNC.EQ.IP_SCALE_FNC_NULL) THEN SCLAB3A.130
RETURN SCLAB3A.131
ELSE IF (I_FNC.EQ.IP_SCALE_POWER_QUAD) THEN SCLAB3A.132
! GSS3F402.371
DO I= 1, N_LAYER-I_TOP+1 GSS3F402.372
DO L=1, N_PROFILE GSS3F402.373
PWK(L,I)=(P(L,I_TOP+I-1)+PRESSURE_OFFSET) GSS3F402.374
& /(P_REFERENCE+PRESSURE_OFFSET) GSS3F402.375
END DO GSS3F402.376
END DO GSS3F402.377
*IF DEF,VECTLIB PXVECTLB.136
call rtor_v(
n_input,pwk,sp1,pwk) GSS3F402.379
*ELSE GSS3F402.380
DO I= 1, N_LAYER-I_TOP+1 GSS3F402.381
DO L=1, N_PROFILE GSS3F402.382
*IF -DEF,FUJITSU GRB1F405.47
PWK(L,I)=PWK(L,I)**SCALE_PARAMETER(1) GSS3F402.383
*ELSE GRB1F405.48
PWK(L,I)=exp(SCALE_PARAMETER(1)*log(PWK(L,I))) GRB1F405.49
*ENDIF GRB1F405.50
ENDDO GSS3F402.384
ENDDO GSS3F402.385
*ENDIF GSS3F402.386
! GSS3F402.387
DO I=I_TOP, N_LAYER SCLAB3A.133
DO L=1, N_PROFILE SCLAB3A.134
GAS_FRAC_RESCALED(L, I)=PWK(L,I-I_TOP+1)* GSS3F402.388
& (1.0E+00+SCALE_PARAMETER(2)*(T(L, I)/T_REFERENCE-1.0E+00) GSS3F402.389
& +SCALE_PARAMETER(3)*(T(L, I)/T_REFERENCE-1.0E+00)**2) GSS3F402.390
ENDDO SCLAB3A.143
ENDDO SCLAB3A.144
ELSE IF (I_FNC.EQ.IP_SCALE_DOPPLER_QUAD) THEN SCLAB3A.145
! THERE IS NO DOPPLER TERM HERE SINCE IT IS IMPLICITLY INCLUDED SCLAB3A.146
! IN THE SCALING. SCLAB3A.147
! GSS3F402.391
DO I= 1, N_LAYER-I_TOP+1 GSS3F402.392
DO L=1, N_PROFILE GSS3F402.393
PWK(L,I)=(P(L,I_TOP+I-1)+SCALE_PARAMETER(2)) GSS3F402.394
& /(P_REFERENCE+SCALE_PARAMETER(2)) GSS3F402.395
END DO GSS3F402.396
END DO GSS3F402.397
*IF DEF,VECTLIB PXVECTLB.137
call rtor_v(
n_input,pwk,sp1,pwk) GSS3F402.399
*ELSE GSS3F402.400
DO I=1,N_LAYER-I_TOP+1 GSS3F402.401
DO L=1, N_PROFILE GSS3F402.402
*IF -DEF,FUJITSU GRB1F405.51
PWK(L,I)=PWK(L,I)**SCALE_PARAMETER(1) GSS3F402.403
*ELSE GRB1F405.52
PWK(L,I)=exp(SCALE_PARAMETER(1)*log(PWK(L,I))) GRB1F405.53
*ENDIF GRB1F405.54
ENDDO GSS3F402.404
ENDDO GSS3F402.405
*ENDIF GSS3F402.406
! GSS3F402.407
DO I=I_TOP, N_LAYER ADB1F401.935
DO L=1, N_PROFILE SCLAB3A.149
GAS_FRAC_RESCALED(L, I)=PWK(L,I-I_TOP+1) GSS3F402.408
& *(1.0E+00 SCLAB3A.154
& +SCALE_PARAMETER(3)*(T(L, I)/T_REFERENCE-1.0E+00) SCLAB3A.155
& +SCALE_PARAMETER(4)*(T(L, I)/T_REFERENCE-1.0E+00)**2) SCLAB3A.156
ENDDO SCLAB3A.157
ENDDO SCLAB3A.158
ELSE SCLAB3A.159
WRITE(IU_ERR, '(/A)') SCLAB3A.160
& '*** ERROR: AN ILLEGAL TYPE OF SCALING HAS BEEN GIVEN.' SCLAB3A.161
IERR=I_ERR_FATAL SCLAB3A.162
RETURN SCLAB3A.163
ENDIF SCLAB3A.164
! SCLAB3A.165
! MULTIPLY BY THE MIXING RATIO AND LIMIT NEGATIVE SCALINGS. SCLAB3A.166
IF (L_LAYER) THEN SCLAB3A.167
DO I=N_LAYER, 1, -1 SCLAB3A.168
DO L=1, N_PROFILE SCLAB3A.169
GAS_FRAC_RESCALED(L, I)=MAX(REAL(0.0E+00) SCLAB3A.170
& , GAS_FRAC_RESCALED(L, I)*GAS_MIX_RATIO(L, I)) SCLAB3A.171
ENDDO SCLAB3A.172
ENDDO SCLAB3A.173
ELSE SCLAB3A.174
! CONVERT TO VALUES IN LAYERS. SCLAB3A.175
DO I=N_LAYER, 1, -1 SCLAB3A.176
DO L=1, N_PROFILE SCLAB3A.177
GAS_FRAC_RESCALED(L, I) SCLAB3A.178
& =0.5E+00*(GAS_FRAC_RESCALED(L, I-1) SCLAB3A.179
& *GAS_MIX_RATIO(L, I-1) SCLAB3A.180
& +GAS_FRAC_RESCALED(L, I)*GAS_MIX_RATIO(L, I)) SCLAB3A.181
GAS_FRAC_RESCALED(L, I) SCLAB3A.182
& =MAX(REAL(0.0E+00), GAS_FRAC_RESCALED(L, I)) SCLAB3A.183
ENDDO SCLAB3A.184
ENDDO SCLAB3A.185
ENDIF SCLAB3A.186
! SCLAB3A.187
! SCLAB3A.188
RETURN SCLAB3A.189
END SCLAB3A.190
*ENDIF DEF,A01_3A,OR,DEF,A02_3A SCLAB3A.191
*ENDIF DEF,A70_1A ADB1F402.92