*IF DEF,A16_1A CONTRA1A.2
C ******************************COPYRIGHT****************************** GTS2F400.1153
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.1154
C GTS2F400.1155
C Use, duplication or disclosure of this code is subject to the GTS2F400.1156
C restrictions as set forth in the contract. GTS2F400.1157
C GTS2F400.1158
C Meteorological Office GTS2F400.1159
C London Road GTS2F400.1160
C BRACKNELL GTS2F400.1161
C Berkshire UK GTS2F400.1162
C RG12 2SZ GTS2F400.1163
C GTS2F400.1164
C If no contract has been raised with this copy of the code, the use, GTS2F400.1165
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.1166
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.1167
C Modelling at the above address. GTS2F400.1168
C ******************************COPYRIGHT****************************** GTS2F400.1169
C GTS2F400.1170
CLL SUBROUTINE CONTRAIL------------------------------------------------ CONTRA1A.3
CLL CONTRA1A.4
CLL PURPOSE: TO CALCULATE CONTRAIL UPPER AND LOWER HEIGHT CONTRA1A.5
CLL CONTRA1A.6
CLL WRITTEN BY C.M.ROBERTS CONTRA1A.7
CLL MODIFIED BY J.T.HEMING CONTRA1A.8
CLL CONTRA1A.9
CLL MODEL MODIFICATION HISTORY FROM MODEL VERSION 3.0: CONTRA1A.10
CLL VERSION DATE CONTRA1A.11
CLL 4.4 30/07/97 Change limit for TERM6 to prevent calculations GDR2F404.15
CLL going out of T3E real number range. D. Robinson GDR2F404.16
!LL 4.5 20/04/98 Start-end args added to enable dupicate halo GSM1F405.597
!LL calculations to be avoided. S.D.Mullerworth GSM1F405.598
CLL CONTRA1A.12
CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, CONTRA1A.13
CLL VERSION 2, DATED 18/01/90 CONTRA1A.14
CLL CONTRA1A.15
CLL LOGICAL COMPONENT NUMBER: D431 CONTRA1A.16
CLL CONTRA1A.17
CLL PROJECT TASK: CONTRA1A.18
CLL CONTRA1A.19
CLL DOCUMENTATION: CONTRA1A.20
CLL CONTRA1A.21
CLLEND------------------------------------------------------------------ CONTRA1A.22
C CONTRA1A.23
C*L ARGUMENTS:---------------------------------------------------------- CONTRA1A.24
SUBROUTINE CONTRAIL( 2,2CONTRA1A.25
C data in CONTRA1A.26
& P,T,PSTAR, CONTRA1A.27
& P_EXNER_HALF,THETA, CONTRA1A.28
C data out CONTRA1A.29
& UPPER_CONTRAIL,LOWER_CONTRAIL, CONTRA1A.30
C constants in CONTRA1A.31
& POINTS,P_LEVELS, GSM1F405.599
! Range of points to calculate GSM1F405.600
& START,END) GSM1F405.601
C----------------------------------------------------------------------- CONTRA1A.33
IMPLICIT NONE CONTRA1A.34
C----------------------------------------------------------------------- CONTRA1A.35
EXTERNAL ICAO_HT CONTRA1A.36
C CONTRA1A.37
INTEGER CONTRA1A.38
* POINTS ! IN NO OF POINTS CONTRA1A.39
*,P_LEVELS ! IN NO OF MODEL LEVELS CONTRA1A.40
&,START,END ! IN Range of points to calculate GSM1F405.602
C CONTRA1A.41
REAL CONTRA1A.42
* T(POINTS,P_LEVELS) ! IN TEMPERATURE AT FULL LEVELS CONTRA1A.43
*,P(POINTS,P_LEVELS) ! IN PRESSURE " " " CONTRA1A.44
*,PSTAR(POINTS) ! IN SURFACE PRESSURE CONTRA1A.45
*,P_EXNER_HALF(POINTS,P_LEVELS+1) ! IN EXNER PRESSURE AT MODEL CONTRA1A.46
* ! HALF LEVELS CONTRA1A.47
*,THETA(POINTS,P_LEVELS) ! IN POTENTIAL TEMPERATURE AT CONTRA1A.48
* ! MODEL FULL LEVELS CONTRA1A.49
*,UPPER_CONTRAIL(POINTS) ! OUT UPPER VALUE OF THE CONTRAIL CONTRA1A.50
*,LOWER_CONTRAIL(POINTS) ! OUT LOWER VALUE OF THE CONTRAIL CONTRA1A.51
C----------------------------------------------------------------------- CONTRA1A.52
C Local Variables CONTRA1A.53
C----------------------------------------------------------------------- CONTRA1A.54
INTEGER CONTRA1A.55
* I,J ! LOOP COUNTERS CONTRA1A.56
CONTRA1A.57
REAL CONTRA1A.58
* DEL_EXNER_JM1 ! EXNER PRESSURE DIFF BET LEVELS CONTRA1A.59
* ! J-3/2 AND J-1/2 CONTRA1A.60
*,DEL_EXNER_J ! " " " " "J-1/2 AND J+1/2 CONTRA1A.61
*,TERM1 ! \ CONTRA1A.62
*,TERM2 ! } TEMPORARY STORAGE VARIABLES CONTRA1A.63
*,TERM3 ! } CONTRA1A.64
*,TERM4 ! } USED IN SEVERAL DIFFERENT CONTRA1A.65
*,TERM5 ! } CALCULATIONS CONTRA1A.66
*,TERM6 ! / CONTRA1A.67
*,MINTRA_M_14(POINTS,P_LEVELS) !'MINTRA line minus 14 degrees' temp CONTRA1A.68
*,EXPONENT ! lapse rate between two levels *R/g CONTRA1A.69
*,P_M(POINTS) ! Pressure of point of intersection CONTRA1A.70
*,P_MAX(POINTS) ! Maximum pressure of intersection in a column CONTRA1A.71
*,P_MIN(POINTS) ! Minimum pressure of intersection in a column CONTRA1A.72
*,TEST1 ! Test variable CONTRA1A.73
*,TEST2 ! Test variable CONTRA1A.74
*,P_LIMIT ! Upper limit (lowest pressure) at which to CONTRA1A.75
* ! perform calculations CONTRA1A.76
C----------------------------------------------------------------------- CONTRA1A.77
C Logicals CONTRA1A.78
C----------------------------------------------------------------------- CONTRA1A.79
LOGICAL CONTRA1A.80
* INTERSECTION(POINTS) ! TRUE if intersection occurs. CONTRA1A.81
C----------------------------------------------------------------------- CONTRA1A.82
C Constants CONTRA1A.83
C----------------------------------------------------------------------- CONTRA1A.84
C* CONTRA1A.85
*CALL C_R_CP
CONTRA1A.86
*CALL C_G
CONTRA1A.87
C----------------------------------------------------------------------- CONTRA1A.88
REAL CP_OVER_TWO_G CONTRA1A.89
*,A0,A1 ! The 'MINTRA line minus 14 degrees' is CONTRA1A.90
C ! approximated by Tm=A0*(P**A1) CONTRA1A.91
PARAMETER(CP_OVER_TWO_G=CP/(2.*G) CONTRA1A.92
& ,A0=137.14816 ! This constant set for pressure in Pa CONTRA1A.93
& ,A1=0.046822 CONTRA1A.94
& ,P_LIMIT=5000.0) ! No calculations above this level in Pa CONTRA1A.95
C*---------------------------------------------------------------------- CONTRA1A.96
CL Initialise logical array and max and min pressure arrays CONTRA1A.97
C----------------------------------------------------------------------- CONTRA1A.98
DO I=START,END GSM1F405.603
INTERSECTION(I)=.FALSE. CONTRA1A.100
P_MAX(I)=0.0 CONTRA1A.101
P_MIN(I)=PSTAR(I) CONTRA1A.102
ENDDO CONTRA1A.103
C----------------------------------------------------------------------- CONTRA1A.104
CL Calculate the approximation to the 'MINTRA-line minus 14 degrees' CONTRA1A.105
CL at full levels for each point CONTRA1A.106
C----------------------------------------------------------------------- CONTRA1A.107
DO J=1,P_LEVELS CONTRA1A.108
DO I=START,END GSM1F405.604
MINTRA_M_14(I,J)=A0*P(I,J)**A1 CONTRA1A.110
ENDDO CONTRA1A.111
ENDDO CONTRA1A.112
C----------------------------------------------------------------------- CONTRA1A.113
CL Loop round all points and all levels CONTRA1A.114
C----------------------------------------------------------------------- CONTRA1A.115
DO 2 J=1,P_LEVELS CONTRA1A.116
DO 1 I=START,END GSM1F405.605
IF (J.EQ.1) THEN CONTRA1A.118
C----------------------------------------------------------------------- CONTRA1A.119
CL Check if level 1 temperature is less than MINTRA-14 CONTRA1A.120
C----------------------------------------------------------------------- CONTRA1A.121
IF (MINTRA_M_14(I,1).GT.T(I,1)) THEN CONTRA1A.122
P_M(I)=PSTAR(I) CONTRA1A.123
INTERSECTION(I)=.TRUE. CONTRA1A.124
ENDIF CONTRA1A.125
ELSEIF(P(I,J).GE.P_LIMIT)THEN CONTRA1A.126
C----------------------------------------------------------------------- CONTRA1A.127
CL Continue if below pressure level P_LIMIT CONTRA1A.128
CL Calculate 'MINTRA line minus 14 degrees' - 'environment curve' CONTRA1A.129
CL at J-1 and J CONTRA1A.130
C----------------------------------------------------------------------- CONTRA1A.131
TERM3=MINTRA_M_14(I,J)-T(I,J) CONTRA1A.132
TERM4=MINTRA_M_14(I,J-1)-T(I,J-1) CONTRA1A.133
C----------------------------------------------------------------------- CONTRA1A.134
CL If TERM3 and TERM4 have different signs or either is equal to zero CONTRA1A.135
CL there is a point of intersection between levels j-1 and j ; CONTRA1A.136
CL otherwise there is not. CONTRA1A.137
C----------------------------------------------------------------------- CONTRA1A.138
TEST1=TERM3*TERM4 CONTRA1A.139
IF (TEST1.LE.0.0) THEN CONTRA1A.140
INTERSECTION(I)=.TRUE. CONTRA1A.141
C----------------------------------------------------------------------- CONTRA1A.142
CL Exner pressure difference across layers CONTRA1A.143
C----------------------------------------------------------------------- CONTRA1A.144
DEL_EXNER_J=P_EXNER_HALF(I,J)-P_EXNER_HALF(I,J+1) CONTRA1A.145
DEL_EXNER_JM1=P_EXNER_HALF(I,J-1)-P_EXNER_HALF(I,J) CONTRA1A.146
C----------------------------------------------------------------------- CONTRA1A.147
CL Numerator CONTRA1A.148
C----------------------------------------------------------------------- CONTRA1A.149
TERM1=T(I,J-1)-T(I,J) CONTRA1A.150
C----------------------------------------------------------------------- CONTRA1A.151
CL Denominator CONTRA1A.152
C----------------------------------------------------------------------- CONTRA1A.153
TERM2=CP_OVER_TWO_G*(THETA(I,J-1)*DEL_EXNER_JM1 CONTRA1A.154
* +THETA(I,J)*DEL_EXNER_J) CONTRA1A.155
C----------------------------------------------------------------------- CONTRA1A.156
CL Lapse rate between level j-1 and j =TERM1/TERM2 CONTRA1A.157
CL Exponent=Lapse rate *(R/g) CONTRA1A.158
C----------------------------------------------------------------------- CONTRA1A.159
EXPONENT=TERM1/TERM2*R/G CONTRA1A.160
C----------------------------------------------------------------------- CONTRA1A.161
CL Find P_M, the pressure of intersection CONTRA1A.162
C----------------------------------------------------------------------- CONTRA1A.163
TERM5=T(I,J-1)/A0*P(I,J-1)**(-EXPONENT) CONTRA1A.164
TERM6=A1-EXPONENT CONTRA1A.165
IF (ABS(TERM6).LT.1.0E-5) TERM6=1.0E-5 GDR2F404.17
P_M(I)=TERM5**(1.0/TERM6) CONTRA1A.167
C----------------------------------------------------------------------- CONTRA1A.168
CL Check that P_M lies between P(I,J) and P(I,J-1) CONTRA1A.169
CL If not set P_M to the upper level P(I,J) CONTRA1A.170
C----------------------------------------------------------------------- CONTRA1A.171
TEST2=(P_M(I)-P(I,J))*(P_M(I)-P(I,J-1)) CONTRA1A.172
IF(TEST2.GT.0.0) P_M(I)=P(I,J) CONTRA1A.173
ENDIF CONTRA1A.174
ENDIF CONTRA1A.175
1 CONTINUE CONTRA1A.176
C----------------------------------------------------------------------- CONTRA1A.177
CL Is P_M a maximum or minimum pressure of intersection? CONTRA1A.178
C i.e. a solution to the equation at this point. CONTRA1A.179
C----------------------------------------------------------------------- CONTRA1A.180
DO I=START,END GSM1F405.606
IF (INTERSECTION(I)) THEN CONTRA1A.182
IF (P_M(I).GT.P_MAX(I)) P_MAX(I)=P_M(I) CONTRA1A.183
IF (P_M(I).LT.P_MIN(I)) P_MIN(I)=P_M(I) CONTRA1A.184
ENDIF CONTRA1A.185
ENDDO CONTRA1A.186
2 CONTINUE CONTRA1A.187
C----------------------------------------------------------------------- CONTRA1A.188
CL If only one one intersection set P_MIN to zero CONTRA1A.189
CL If no intersections set P_MAX and P_MIN to zero CONTRA1A.190
C----------------------------------------------------------------------- CONTRA1A.191
DO I=START,END GSM1F405.607
IF (INTERSECTION(I).AND.(P_MAX(I).EQ.P_MIN(I))) P_MIN(I)=0.0 CONTRA1A.193
IF (.NOT.INTERSECTION(I)) THEN CONTRA1A.194
P_MAX(I)=0.0 CONTRA1A.195
P_MIN(I)=0.0 CONTRA1A.196
ENDIF CONTRA1A.197
ENDDO CONTRA1A.198
C----------------------------------------------------------------------- CONTRA1A.199
CL Convert P_MAX and P_MIN into ICAO heights in thousands of feet CONTRA1A.200
C----------------------------------------------------------------------- CONTRA1A.201
CALL ICAO_HT
(P_MAX(START),END-START+1,LOWER_CONTRAIL(START)) GSM1F405.608
CALL ICAO_HT
(P_MIN(START),END-START+1,UPPER_CONTRAIL(START)) GSM1F405.609
C----------------------------------------------------------------------- CONTRA1A.204
RETURN CONTRA1A.205
END CONTRA1A.206
C----------------------------------------------------------------------- CONTRA1A.207
*ENDIF CONTRA1A.208