*IF DEF,A16_1A PHYDIA1A.2
C ******************************COPYRIGHT****************************** GTS2F400.7219
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.7220
C GTS2F400.7221
C Use, duplication or disclosure of this code is subject to the GTS2F400.7222
C restrictions as set forth in the contract. GTS2F400.7223
C GTS2F400.7224
C Meteorological Office GTS2F400.7225
C London Road GTS2F400.7226
C BRACKNELL GTS2F400.7227
C Berkshire UK GTS2F400.7228
C RG12 2SZ GTS2F400.7229
C GTS2F400.7230
C If no contract has been raised with this copy of the code, the use, GTS2F400.7231
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.7232
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.7233
C Modelling at the above address. GTS2F400.7234
C ******************************COPYRIGHT****************************** GTS2F400.7235
C GTS2F400.7236
CLL SUBROUTINE PHY_DIAG------------------------------------------------ PHYDIA1A.3
CLL PHYDIA1A.4
CLL PURPOSE: Calculation of physical diagnostics. These diagnostics PHYDIA1A.5
CLL are those based on temperatures humidities and pressure. PHYDIA1A.6
CLL Those diagnostics involving the winds are in the other PHYDIA1A.7
CLL diagnostic routine DYN_DIAG PHYDIA1A.8
CLL Date: 08/06/92 PHYDIA1A.9
CLL Exner at model level made consistent with the geopotential eqn. PHYDIA1A.10
CLL PHYDIA1A.11
CLL Model Modification history from model version 3.0: PHYDIA1A.12
CLL version Date PHYDIA1A.13
CLL 3.1 10/01/93 Get model half Hts for all dependant routines. PS100193.1
CLL 3.1 09/02/93 CW090293.1
CLL Modified by C.Wilson CW090293.2
CLL Add alternate call to V_INT_T for temperatures on pressure levels CW090293.3
CLL to call V_INT_TP if QV_INT_TP is true CW090293.4
CLL so as to reduce bias in stratospheric temperature output CW090293.5
CLL 3.2 13/07/93 Changed CHARACTER*(*) to CHARACTER*(80) for TS150793.108
CLL portability. Author Tracey Smith. TS150793.109
CLL 3.2 07/06/93 Correct indexing of WORK1 for use in DIA_THADV RB070693.1
CLL 3.4 21/9/94 Calculate model level geopotential heights ASW3F304.24
CLL (in m). Author S.A.Woltering. ASW3F304.25
CLL 3.4 15/07/94 Redimension WORK1 from P_TO_UV for input to GRR0F304.15
CLL DIA_THADV using new utility routine. Rick Rawlins. GRR0F304.16
CLL 4.0 22/11/95 Correction to Model level geopotential heights. ARB1F400.27
CLL Author Steve Woltering ARB1F400.28
CLL 4.1 15/05/96 Put tracer fields on pressure levels. D.Podd ADP0F401.7
CLL 4.4 16/10/97 Extra swapbounds for P_EXNER_HALF. D Robinson. GDR2F404.24
!LL 4.5 15/04/98 Added start-end arguments to V_INT, V_INT_T and GSM1F405.748
!LL V_INT_Z routines. S.D.Mullerworth GSM1F405.749
CLL 4.5 3/09/98 Corrected relative humidity diagnostic. ADM0F405.297
CLL D Wilson. ADM0F405.298
CLL 4.5 05/06/98 New argument L_VINT_TP. Use to call V_INT_TP or GDR4F405.15
CLL V_INT_T. Also L_LSPICE for correcting relative GDR4F405.16
CLL humidity diagnostic. D. Robinson. GDR4F405.17
CLL PHYDIA1A.14
CLL CW090293.6
CLL Programming standard: U M DOC Paper NO. 4, PHYDIA1A.15
CLL PHYDIA1A.16
CLL SYSTEM COMPONENTS D471 D421 D481 D482 D432 D423 D422 D431 D472 PHYDIA1A.17
CLL D435 D484 D441 PHYDIA1A.18
CLL PHYDIA1A.19
CLL SYSTEM TASK: D4 PHYDIA1A.20
CLL PHYDIA1A.21
CLL External documentation PHYDIA1A.22
CLL PHYDIA1A.23
CLLEND------------------------------------------------------------------ PHYDIA1A.24
C PHYDIA1A.25
C*L ARGUMENTS:--------------------------------------------------------- PHYDIA1A.26
SUBROUTINE PHY_DIAG( 2,23PHYDIA1A.27
*CALL ARGFLDPT
GSM1F405.750
C primary data in PHYDIA1A.28
& PSTAR,U,V,Q,THETA,OROG,P_EXNER_HALF,LAND,TSTAR,TRACERS, ADP0F401.8
C primary data constants PHYDIA1A.30
& U_ROWS,P_ROWS,ROW_LENGTH,P_LEVELS,Q_LEVELS,P_FIELD, PHYDIA1A.31
& U_FIELD,AK,BK,AKH,BKH,EW_SPACE,NS_SPACE,SEC_U_LATITUDE, PHYDIA1A.32
& TR_LEVELS,TR_VARS,TR_P_FIELD_DA, ADP0F401.9
C Input pressure for required interpolation PHYDIA1A.33
& T_P_PRESS,HTS_PRESS,REL_HUMID_PRESS,WBPT_PRESS,TH_ADV_PRESS, PHYDIA1A.34
& TR_PRESS, ADP0F401.10
C Input pressure for indices for product field PHYDIA1A.35
& H2_IND, PHYDIA1A.36
C DIAGNOSTICS OUT PHYDIA1A.37
& HEIGHTS, T_P, REL_HUMID_P, WBPT, SNPROB, MINUS20_ICAO, PHYDIA1A.38
& MINUS20_P, FREEZE_ICAO, FREEZE_Z, FREEZE_P, CONTRAIL_LOWERHT, PHYDIA1A.39
& CONTRAIL_UPPERHT, TROP_P, TROP_T, TROP_Z, TROP_ICAO, PHYDIA1A.40
& MINUS20_Z, TH_ADV_SINGLE, DUCT_HEIGHT, DUCT_INT, PHYDIA1A.41
& P_MSL, TH_ADV_MEAN, HEIGHTS2, MODHT, ASW3F304.26
& TRACERWORK,INT16,PT_TRACER, ADP0F401.11
C diagnostic lengths PHYDIA1A.43
& T_P_LEVS,HTS_LEVS,REL_HUMID_P_LEVS,WBPT_LEVS,TH_ADV_P_LEVS, PHYDIA1A.44
& H2_P_LEVS, PHYDIA1A.45
& TR_PRESS_LEVS,NUM_STASH_LEVELSDA, ADP0F401.12
C diagnostic logical indicators PHYDIA1A.46
& QMODEL_HALF_HEIGHT,QHEIGHTS, QT_P, QREL_HUMID_P, PHYDIA1A.47
& QWBPT, QSNPROB, QMINUS20_ICAO, QMINUS20_P, PHYDIA1A.48
& QFREEZE_ICAO, QFREEZE_Z, QFREEZE_P, QCONTRA_LOWERHT, PHYDIA1A.49
& QCONTRA_UPPERHT, QTROP_P, QTROP_T, QTROP_Z, PHYDIA1A.50
& QTROP_ICAO, QMINUS20_Z, QTH_ADV_SINGLE, QDUCT_HEIGHT, PHYDIA1A.51
& QDUCT_INT, QPMSL, QTH_ADV_MEAN, QHTS2, QMODHT, ASW3F304.27
& SF_TRACER, ADP0F401.13
& Z_REF, L_VINT_TP, L_LSPICE, GDR4F405.18
& ICODE,CMESSAGE) GDR4F405.19
C PHYDIA1A.55
IMPLICIT NONE PHYDIA1A.56
*CALL C_EPSLON
ASW3F304.28
*CALL C_R_CP
PHYDIA1A.57
*CALL C_G
PHYDIA1A.58
*CALL TYPFLDPT
GSM1F405.751
PHYDIA1A.59
INTEGER PHYDIA1A.60
* P_FIELD !IN 1ST DIMENSION OF FIELD OF PSTAR PHYDIA1A.61
*, U_FIELD !IN 1ST DIMENSION OF FIELD OF U,V PHYDIA1A.62
*, U_ROWS !IN NUMBER OF ROWS FOR U,V FIELD PHYDIA1A.63
*, P_ROWS !IN NUMBER OF ROWS FOR P,T FIELD PHYDIA1A.64
*, ROW_LENGTH !IN NUMBER OF POINTS PER ROW PHYDIA1A.65
*, LEVELS !IN NUMBER OF MODEL LEVELS PHYDIA1A.66
*, P_LEVELS !IN NUMBER OF PRESSURE LEVELS PHYDIA1A.67
*, Q_LEVELS !IN NUMBER OF WET LEVELS PHYDIA1A.68
*, ICODE !IN RETURN CODE : IRET=0 NORMAL EXIT PHYDIA1A.69
*, NUM_STASH_LEVELSDA !IN NUMBER OF STASH LEVELS ADP0F401.14
*, TR_LEVELS !IN NUMBER OF TRACER LEVELS ADP0F401.15
*, TR_VARS !IN NUMBER OF TRACERS ADP0F401.16
*, TR_P_FIELD_DA !IN P_FIELD for DA of tracer arrays ADP0F401.17
*, INT16 !IN Dummy variable for STASH_MAXLEN(16) ADP0F401.18
*, PT_TRACER(TR_VARS+1) ADP0F401.19
* !IN POINTERS TO TRACERS IN STASHWORK ADP0F401.20
*, TR_PRESS_LEVS(TR_VARS+1) ADP0F401.21
* !IN NO OF LEVS ON WHICH TO INTERP TRACERS ADP0F401.22
*, T_P_LEVS !IN NO OF LEVS ON WHICH TO INTERP T_P PHYDIA1A.70
*, REL_HUMID_P_LEVS !IN NO OF LEVS ON WHICH TO INTERP REL HUM PHYDIA1A.71
*, HTS_LEVS !IN NO OF LEVS ON WHICH TO INTERP HEIGHTS PHYDIA1A.72
*, H2_P_LEVS !IN NO OF LEVS ON WHICH TO INTERP H**2 PHYDIA1A.73
*, WBPT_LEVS !IN NO OF LEVS ON WHICH TO CALCULATE WBPT PHYDIA1A.74
*, TH_ADV_P_LEVS !IN NO OF LEVS ON WHICH TO CALCULATE THADV PHYDIA1A.75
*, Z_REF !IN LEVEL OF MODEL USED TO CALCULATE PMSL PHYDIA1A.76
*, BOTTOM_QC_LEVEL ! Tropopause quality control level PHYDIA1A.77
*, TOP_QC_LEVEL ! " " " " PHYDIA1A.78
INTEGER PHYDIA1A.79
& H2_IND(H2_P_LEVS) !IN indices for pressure levels for h**2 PHYDIA1A.80
C PHYDIA1A.81
C PHYDIA1A.82
LOGICAL PHYDIA1A.83
* QT_P !IN LOGICAL FLAG FOR PRESS INTER TEMPERTATURE PHYDIA1A.84
*,QHEIGHTS !IN " " " HEIGHTS ON ANY P SURFACE PHYDIA1A.85
*,QREL_HUMID_P !IN " " " HUMIDITIES ANY P SURFACE PHYDIA1A.86
*,QWBPT !IN " " " WET BULB POTENTIAL TEMP PHYDIA1A.87
*,QSNPROB !IN " " " SNOW PROBABILITY PHYDIA1A.88
*,QMINUS20_ICAO !IN " " " -20 deg C LEVEL ICAO HT PHYDIA1A.89
*,QMINUS20_P !IN " " " -20 deg C LEVEL PRESSURE PHYDIA1A.90
*,QFREEZE_ICAO !IN " " " FREEZING LEVEL ICAO HT PHYDIA1A.91
*,QFREEZE_Z !IN " " " FREEZING LEVEL HT PHYDIA1A.92
*,QFREEZE_P !IN " " " FREEZING LEVEL PRESSURE PHYDIA1A.93
*,QCONTRA_LOWERHT!IN " " " HEIGHT OF LOWER CONTRAIL PHYDIA1A.94
*,QCONTRA_UPPERHT!IN " " " HEIGHT OF UPPER CONTRAIL PHYDIA1A.95
*,QMODEL_HALF_HEIGHT!IN " " " HEIGHTS ON MODEL LAYER PHYDIA1A.96
*,LAND(P_FIELD) !IN LAND SEA MASK SET TRUE FOR LAND PHYDIA1A.97
LOGICAL PHYDIA1A.98
* QTROP_P !IN " " " TROPOPAUSE PRESSURE PHYDIA1A.99
*,QTROP_T !IN " " " TROPOPAUSE TEMPERATURE PHYDIA1A.100
*,QTROP_Z !IN " " " TROPOPAUSE HEIGHT PHYDIA1A.101
*,QTROP_ICAO !IN " " " TROPOPAUSE ICAO HEIGHT PHYDIA1A.102
*,QMINUS20_Z !IN " " " -20 deg C LEVEL HEIGHT PHYDIA1A.103
*,QTH_ADV_SINGLE !IN " " " THERMAL ADV SINGLE LEV PHYDIA1A.104
*,QDUCT_HEIGHT !IN " " " RADIO DUCT HEIGHT PHYDIA1A.105
*,QDUCT_INT !IN " " " RADIO DUCT INTENSITY PHYDIA1A.106
*,QPMSL !IN " " " PRESSURE AT MEAN SEA LVL PHYDIA1A.107
*,QTH_ADV_MEAN !IN " " " THERMAL ADVECTION MEAN PHYDIA1A.108
*,QHTS2 !IN " " " heights**2 on pressure lev PHYDIA1A.109
*,QMODHT !IN " " " Model level geopot heights ASW3F304.29
*,SF_TRACER(TR_VARS+1) !IN LOGICAL FLAGS FOR TRACERS ADP0F401.23
&, L_VINT_TP !IN Switch to control Vert Int for Output of GDR4F405.20
! Temperature on model levels. D Robinson. GDR4F405.21
&, L_LSPICE !IN Switch for New cloud/precip microphysics. GDR4F405.22
C PHYDIA1A.110
CHARACTER*80 CMESSAGE TS150793.110
C PHYDIA1A.113
REAL PHYDIA1A.114
* PSTAR(P_FIELD) !IN PRIMARY MODEL ARRAY FOR PSTAR FIELD PHYDIA1A.115
*,TSTAR(P_FIELD) !IN PRIMARY MODEL ARRAY FOR TSTAR FIELD PHYDIA1A.116
*,OROG(P_FIELD) !IN PRIMARY MODEL OROGRAPHY PHYDIA1A.117
*,P_EXNER_HALF(P_FIELD,P_LEVELS+1) !IN EXNER PRESS ON 1/2 LVLS PHYDIA1A.118
*,THETA(P_FIELD,P_LEVELS) !IN PRIMARY MODEL ARRAY FOR THETA FIELD PHYDIA1A.119
*,U(U_FIELD,P_LEVELS) !INT PRIMARY MODEL ARRAY FOR U FIELD PHYDIA1A.120
*,V(U_FIELD,P_LEVELS) !IN PRIMARY MODEL ARRAY FOR V FIELD PHYDIA1A.121
*,Q(P_FIELD,Q_LEVELS) !IN PRIMARY MODEL ARRAY FOR HUMIDITY PHYDIA1A.122
*,TRACERS(TR_P_FIELD_DA,TR_LEVELS,TR_VARS+1) ADP0F401.24
* !IN PRIMARY MODEL ARRAY FOR TRACERS ADP0F401.25
*,HEIGHTS(P_FIELD,HTS_LEVS) ! OUTPUT HEIGHTS ON ANY P SURFACE PHYDIA1A.123
*,T_P(P_FIELD,T_P_LEVS) ! OUTPUT TEMPS ON ANY P SURFACE PHYDIA1A.124
*,P_MSL(P_FIELD) ! OUTPUT PMSL PHYDIA1A.125
*,TROP_T(P_FIELD) ! OUTPUT TEMPS OF TROPOPAUSE PHYDIA1A.126
*,TROP_P(P_FIELD) ! OUTPUT PRESSURE OF TROPOPAUSE PHYDIA1A.127
*,TROP_Z(P_FIELD) ! OUTPUT HEIGHT OF TROPOPAUSE PRESSURE SURFACE PHYDIA1A.128
*,TROP_ICAO(P_FIELD) ! OUTPUT ICAO HT OF TROPOPAUSE PRESSURE PHYDIA1A.129
*,HEIGHTS2(P_FIELD,H2_P_LEVS) ! OUTPUT height**2 on any P surface PHYDIA1A.130
*,MODHT(P_FIELD,P_LEVELS) ! OUTPUT GEOPOT. MODEL LEV HEIGHTS ASW3F304.30
C PHYDIA1A.131
REAL PHYDIA1A.132
* REL_HUMID_P(P_FIELD,REL_HUMID_P_LEVS) PHYDIA1A.133
* ! OUTPUT HUMIDITIES ON ANY P SURFACE PHYDIA1A.134
*,WBPT(P_FIELD,WBPT_LEVS) ! WET BULB POTTEMP ON ANY P SURFACE PHYDIA1A.135
*,SNPROB(P_FIELD) ! SNOW PROBABILITY PHYDIA1A.136
*,MINUS20_ICAO(P_FIELD) ! MINUS 20 LEVEL ICAO HEIGHT PHYDIA1A.137
*,MINUS20_P(P_FIELD) ! MINUS 20 LEVEL PRESSURE PHYDIA1A.138
*,FREEZE_Z(P_FIELD) ! HEIGHT OF THE FREEZING LEVEL PHYDIA1A.139
*,FREEZE_ICAO(P_FIELD) ! ICAO HEIGHT OF THE FREEZING LEVEL PHYDIA1A.140
*,FREEZE_P(P_FIELD) ! PRESSURE OF THE FREEZING LEVEL PHYDIA1A.141
*,CONTRAIL_UPPERHT(P_FIELD) ! UPPER VALUE OF THE CONTRAIL PHYDIA1A.142
*,CONTRAIL_LOWERHT(P_FIELD) ! LOWER VALUE OF THE CONTRAIL PHYDIA1A.143
*,MINUS20_Z(P_FIELD) ! MINUS 20 LEVEL TRUE HEIGHT PHYDIA1A.144
*,TH_ADV_SINGLE(P_FIELD,TH_ADV_P_LEVS)! THERMAL ADV SINGLE LEVELS PHYDIA1A.145
*,DUCT_HEIGHT(P_FIELD) ! RADIO DUCT HEIGHT PHYDIA1A.146
*,DUCT_INT(P_FIELD) ! RADIO DUCT INTENSITY PHYDIA1A.147
*,TH_ADV_MEAN(P_FIELD) ! THERMAL ADVECTION MEAN 850/700/500 PHYDIA1A.148
*,TRACER_P(TR_P_FIELD_DA) ! TRACER FIELD ON ANY P SURFACE ADP0F401.26
*,TRACERWORK(INT16) ! STASHWORK FOR SUBSTITUTION OF TRACERS ADP0F401.27
C---------------------------------------------------------------------- PHYDIA1A.149
C AK,BK DEFINE HYBRID VERTICAL COORDINATES P=A+BP*, PHYDIA1A.150
C DELTA_AK,DELTA_BK DEFINE LAYER PRESSURE THICKNESS PD=AD+BDP*, PHYDIA1A.151
C---------------------------------------------------------------------- PHYDIA1A.152
REAL PHYDIA1A.153
* AKH(P_LEVELS+1) !IN value at layer boundary PHYDIA1A.154
*,BKH(P_LEVELS+1) !IN value at layer boundary PHYDIA1A.155
*,AK (P_LEVELS) !IN VALUE AT LAYER CENTRE PHYDIA1A.156
*,BK (P_LEVELS) !IN VALUE AT LAYER CENTRE PHYDIA1A.157
*,EW_SPACE !IN LONGITUDE GRID SPACING PHYDIA1A.158
*,NS_SPACE !IN LATITUDE GRID SPACING PHYDIA1A.159
*,SEC_U_LATITUDE(U_FIELD) !IN 1/COS(LAT) AT U POINTS PHYDIA1A.160
*,TIMESTEP !IN TIMESTEP PHYDIA1A.161
*,T_P_PRESS(T_P_LEVS) !IN Pressures reqd for Temp inter PHYDIA1A.162
*,HTS_PRESS(HTS_LEVS) !IN " " " HTS PHYDIA1A.163
*,REL_HUMID_PRESS(REL_HUMID_P_LEVS)!IN " " " REL Humidity PHYDIA1A.164
*,WBPT_PRESS(WBPT_LEVS) !IN " " " W.B.P.T PHYDIA1A.165
*,TH_ADV_PRESS(TH_ADV_P_LEVS) !IN " " " Thermal adv PHYDIA1A.166
*,TR_PRESS(TR_VARS+1,NUM_STASH_LEVELSDA) ADP0F401.28
* !IN Pressures reqd for Tracer interp ADP0F401.29
C*---------------------------------------------------------------------- PHYDIA1A.167
PHYDIA1A.168
C*L WORKSPACE USAGE:--------------------------------------------------- PHYDIA1A.169
C REAL ARRAYS REQUIRED AT FULL FIELD LENGTH 4*(P_LEVELS)+7+Q_LEVELS PHYDIA1A.170
C----------------------------------------------------------------------- PHYDIA1A.171
REAL PHYDIA1A.172
* MODEL_HALF_HEIGHT(P_FIELD,P_LEVELS+1) !OUT HEIGHTS OF MODEL HALF PHYDIA1A.173
*, WORK1(P_FIELD,P_LEVELS+1) ! Will hold Rel Humid and P_HALF PHYDIA1A.174
* ! and temperatures for FREEZE PHYDIA1A.175
* ! and pressures for THADV PHYDIA1A.176
*,WORK2(P_FIELD) ! Workspace for Mean thermal advection PHYDIA1A.177
*, PHI_STAR(P_FIELD) ! Geopotential PHYDIA1A.178
*, P(P_FIELD,P_LEVELS) ! Pressure ARRAY PHYDIA1A.179
*, PP ! Intermediate PRESSURE PHYDIA1A.180
*, P_EXNER_FULL_L ! Full Exner pressure for a point/level PHYDIA1A.181
*, BOTTOM_QC_PRESS ! pressure of the bottom QC level PHYDIA1A.182
*, TOP_QC_PRESS ! pressure of the top QC level PHYDIA1A.183
*, PZ(P_FIELD) ! Pressure surface in which results reQD PHYDIA1A.184
*, T(P_FIELD) ! Temperature array PHYDIA1A.185
*, Q_SAT(P_FIELD) ! PHYDIA1A.186
*, DUMMY1 PHYDIA1A.187
*, DUMMY2 PHYDIA1A.188
C PHYDIA1A.189
C*--------------------------------------------------------------------- PHYDIA1A.190
C PHYDIA1A.191
C*L EXTERNAL SUBROUTINES CALLED------------%-------------------------- PHYDIA1A.192
EXTERNAL V_INT_Z,V_INT_ZH,PMSL,V_INT_T,P_TO_UV,TROP,V_INT,QSAT PHYDIA1A.193
EXTERNAL QCTROP,THETAW,ICAO_HT,SNOWPR,FREEZE,DUCT,CONTRAIL PHYDIA1A.194
EXTERNAL DIA_THADV PHYDIA1A.195
EXTERNAL V_INT_TP CW090293.7
C*------------------------------------------------------------------ PHYDIA1A.196
CL MAXIMUM VECTOR LENGTH ASSUMED IS (ROWS+1) * ROWLENGTH PHYDIA1A.197
C---------------------------------------------------------------------- PHYDIA1A.198
C*L DEFINE LOCAL VARIABLES PHYDIA1A.199
INTEGER PHYDIA1A.200
* P_POINTS ! NUMBER OF P POINTS NEEDED PHYDIA1A.201
*, ROWS_P ! NUMBER OF P ROWS NEEDED PHYDIA1A.202
*, U_POINTS ! NUMBER OF U POINTS UPDATED PHYDIA1A.203
*, START_U ! START POSITION FOR U POINTS UPDATED PHYDIA1A.204
*, VERT_POINTS ! NUMBER OF POINTS NON-ZERO DIFFUSION COEFFS PHYDIA1A.205
*, ISL ! LOCAL COUNTER PHYDIA1A.206
*, BL ! BOTTOM LEVEL REQD PHYDIA1A.207
*, TL ! TOP LEVEL REQD PHYDIA1A.208
*, T_REF ! REF level for below sfce Temp extrapola PHYDIA1A.209
*, IPOINT ! Reference point for checking output PHYDIA1A.210
&, P_FLD_VALID ! No of P points excluding halos & unused rows GSM1F405.752
PHYDIA1A.211
REAL PHYDIA1A.212
* PRESS_REQD ! The pressure required for THETAW and THADV PHYDIA1A.213
*, T0 ! Temperature required for FREEZE PHYDIA1A.214
*, CP_OVER_G ! Used in model level heights calculation ASW3F304.31
C----------------------------------------------------------------------- PHYDIA1A.215
C R IS GAS CONSTANT FOR DRY AIR PHYDIA1A.216
C CP IS SPECIFIC HEAT OF DRY AIR AT CONSTANT PRESSURE PHYDIA1A.217
C PREF IS REFERENCE SURFACE PRESSURE PHYDIA1A.218
C----------------------------------------------------------------------- PHYDIA1A.219
INTEGER K,I,II,IK,ITR ! LOOP COUNTERS IN ROUTINE ADP0F401.30
PHYDIA1A.221
REAL PHYDIA1A.222
& PU,PL PHYDIA1A.223
PARAMETER (CP_OVER_G = CP / G) ASW3F304.33
*IF DEF,MPP GDR2F404.25
*CALL PARVARS
GDR2F404.26
*ENDIF GDR2F404.27
*CALL P_EXNERC
PHYDIA1A.224
C*---------------------------------------------------------------------- PHYDIA1A.226
PHYDIA1A.227
T_REF=2 ! This value is used in the vertical interpolation and is PHYDIA1A.228
C set to the 2nd model level. This is not dependant on vert res PHYDIA1A.229
ICODE=0 PHYDIA1A.230
PHYDIA1A.231
! Size of p-fields excluding halos and unused rows GSM1F405.753
P_FLD_VALID=LAST_P_FLD_PT-FIRST_FLD_PT+1 GSM1F405.754
GSM1F405.755
*IF DEF,MPP GDR2F404.28
CALL SWAPBOUNDS
(P_EXNER_HALF,ROW_LENGTH,P_ROWS, GDR2F404.29
& Offx,Offy,P_LEVELS+1) GDR2F404.30
*ENDIF GDR2F404.31
C----------------------------------------------------------------------- PHYDIA1A.232
C Calculation of pressure at ETA levels PHYDIA1A.233
C----------------------------------------------------------------------- PHYDIA1A.234
DO K=1,P_LEVELS PHYDIA1A.235
DO I=1,P_FIELD PHYDIA1A.236
P(I,K)=AK(K)+BK(K)*PSTAR(I) PHYDIA1A.237
ENDDO PHYDIA1A.238
ENDDO PHYDIA1A.239
C----------------------------------------------------------------------- PHYDIA1A.240
DO I=1,P_FIELD PHYDIA1A.241
PHI_STAR(I)=OROG(I)*G PHYDIA1A.242
ENDDO PHYDIA1A.243
C set logical if model_half_heights needed for later PS100193.2
IF(QHEIGHTS .OR. PS100193.3
* QMODHT .OR. ASW3F304.34
* QTROP_Z .OR. PS100193.4
* QSNPROB .OR. PS100193.5
* QFREEZE_Z .OR. PS100193.6
* QMINUS20_Z ) QMODEL_HALF_HEIGHT=.TRUE. PS100193.7
C PHYDIA1A.245
IF(QMODEL_HALF_HEIGHT) THEN PHYDIA1A.246
CALL V_INT_ZH
(P_EXNER_HALF,THETA,Q,PHI_STAR, PHYDIA1A.247
* MODEL_HALF_HEIGHT,P_FIELD,P_LEVELS,Q_LEVELS) PHYDIA1A.248
ELSEIF(QHEIGHTS) THEN PHYDIA1A.249
WRITE(6,100) PHYDIA1A.250
WRITE(6,100) PHYDIA1A.251
100 FORMAT(' WARNING MODEL_HALF_HEIGHTS NOT SWITCHED ON') PHYDIA1A.252
ICODE=1 PHYDIA1A.253
CMESSAGE='PHY_DIAG:to calculate HTs,model half HTs needed first' PHYDIA1A.254
GOTO 1000 PHYDIA1A.255
ENDIF ASW3F304.35
C----------------------------------------------------------------------- ASW3F304.36
CL--------------------------Section 0----------------------------------- ASW3F304.37
CL------------------GEOPOTENTIAL MODEL LEVEL HEIGHTS ITEM 281----------- ASW3F304.38
CL ASW3F304.39
CL section 0 calculation of geopotential height of a model level ASW3F304.40
CL surface. Heights in M ASW3F304.41
C----------------------------------------------------------------------- ASW3F304.42
IF (QMODHT) THEN ASW3F304.43
DO K=1,Q_LEVELS ASW3F304.44
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.756
PU = AKH(K+1)+BKH(K+1)*PSTAR(I) ASW3F304.46
PL = AKH(K)+BKH(K)*PSTAR(I) ASW3F304.47
P_EXNER_FULL_L = P_EXNER_C( P_EXNER_HALF(I,K+1), ASW3F304.48
& P_EXNER_HALF(I,K),PU,PL,KAPPA ) ASW3F304.49
MODHT(I,K) = MODEL_HALF_HEIGHT(I,K) + CP_OVER_G* ARB1F400.29
& (1.0+C_VIRTUAL*Q(I,K))*THETA(I,K) ASW3F304.51
& *(P_EXNER_HALF(I,K) - P_EXNER_FULL_L) ASW3F304.52
ENDDO ASW3F304.54
ENDDO ASW3F304.55
IF(P_LEVELS .GT. Q_LEVELS) THEN ASW3F304.56
DO K=Q_LEVELS+1,P_LEVELS ASW3F304.57
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.757
PU = AKH(K+1)+BKH(K+1)*PSTAR(I) ASW3F304.59
PL = AKH(K)+BKH(K)*PSTAR(I) ASW3F304.60
P_EXNER_FULL_L = P_EXNER_C( P_EXNER_HALF(I,K+1), ASW3F304.61
& P_EXNER_HALF(I,K),PU,PL,KAPPA ) ASW3F304.62
MODHT(I,K) = MODEL_HALF_HEIGHT(I,K) + CP_OVER_G* ARB1F400.30
& THETA(I,K) ASW3F304.64
& *(P_EXNER_HALF(I,K) - P_EXNER_FULL_L) ASW3F304.65
ENDDO ASW3F304.67
ENDDO ASW3F304.68
END IF ASW3F304.69
ENDIF PHYDIA1A.256
C----------------------------------------------------------------------- PHYDIA1A.257
CL--------------------------Section 1----------------------------------- PHYDIA1A.258
CL------------------GEOPOTENTIAL HEIGHTS ITEM 202----------------------- PHYDIA1A.259
CL PHYDIA1A.260
CL section 2 calculation of geopotential height of an arbitary PHYDIA1A.261
CL pressure surface. Pressure input is in Pascals and heights in M PHYDIA1A.262
C----------------------------------------------------------------------- PHYDIA1A.263
C First check the height codes are valid and point to STASH_PRESSURE PHYDIA1A.264
C----------------------------------------------------------------------- PHYDIA1A.265
IF(QHEIGHTS) THEN PHYDIA1A.266
DO K=1,HTS_LEVS PHYDIA1A.267
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.758
PZ(I)=HTS_PRESS(K)*100.0 ! convert to pascals PHYDIA1A.269
ENDDO PHYDIA1A.270
CALL V_INT_Z
(PZ,P(1,Z_REF),PSTAR,P_EXNER_HALF,THETA,Q, PHYDIA1A.271
& MODEL_HALF_HEIGHT,HEIGHTS(1,K),P_FIELD,P_LEVELS,Q_LEVELS, PHYDIA1A.272
& Z_REF,AKH,BKH,FIRST_FLD_PT,LAST_P_FLD_PT) GSM1F405.759
ENDDO PHYDIA1A.274
ENDIF PHYDIA1A.275
C----------------------------------------------------------------------- PHYDIA1A.276
CL--------------------------Section 2----------------------------------- PHYDIA1A.277
CL------------------MEAN SEA LEVEL PRESSURE ITEM 222-------------------- PHYDIA1A.278
C----------------------------------------------------------------------- PHYDIA1A.279
IF(QPMSL) THEN PHYDIA1A.280
CALL PMSL
(P_MSL,P(1,Z_REF),PSTAR,P_EXNER_HALF,THETA,Q,PHI_STAR GSM1F405.760
& ,P_FIELD,P_LEVELS,Q_LEVELS,Z_REF,AKH,BKH,FIRST_FLD_PT GSM1F405.761
& ,LAST_P_FLD_PT) GSM1F405.762
ENDIF PHYDIA1A.283
C----------------------------------------------------------------------- PHYDIA1A.284
CL--------------------------Section 3----------------------------------- PHYDIA1A.285
CL------------------TEMPERATURES ON PRESSURE ITEM 203------------------- PHYDIA1A.286
CL PHYDIA1A.287
CL Pressure input is in Pascals and potential temperature is input PHYDIA1A.288
CL in Kelvin PHYDIA1A.289
C----------------------------------------------------------------------- PHYDIA1A.290
IF(QT_P) THEN PHYDIA1A.291
DO K=1,T_P_LEVS PHYDIA1A.292
DO I=1,P_FIELD PHYDIA1A.293
PZ(I)=T_P_PRESS(K)*100.0 ! convert to pascals PHYDIA1A.294
ENDDO PHYDIA1A.295
! From Vn 4.5, L_VINT_TP is set through UMUI GDR4F405.23
IF (L_VINT_TP) THEN GDR4F405.24
CALL V_INT_TP
(T_P(1,K),PZ,P(1,T_REF),PSTAR,P_EXNER_HALF, CW090293.12
& THETA,P_FIELD,P_LEVELS,T_REF,AKH,BKH) CW090293.13
ELSE CW090293.14
CALL V_INT_T
(T_P(1,K),PZ,P(1,T_REF),PSTAR,P_EXNER_HALF, CW090293.15
& THETA,P_FIELD,P_LEVELS,T_REF,AKH,BKH,FIRST_FLD_PT GSM1F405.763
& ,LAST_P_FLD_PT) GSM1F405.764
ENDIF CW090293.17
ENDDO PHYDIA1A.298
ENDIF PHYDIA1A.299
C----------------------------------------------------------------------- PHYDIA1A.300
CL--------------------------Section 4----------------------------------- PHYDIA1A.301
CL------------------RELATIVE HUM ON PRESSURE ITEM 204------------------- PHYDIA1A.302
C----------------------------------------------------------------------- PHYDIA1A.303
IF (QREL_HUMID_P) THEN PHYDIA1A.304
C----------------------------------------------------------------------- PHYDIA1A.305
C Calculation of temperature at theta points PHYDIA1A.306
C Calculation of relative humidity at pressure points PHYDIA1A.307
C----------------------------------------------------------------------- PHYDIA1A.308
DO K=1,Q_LEVELS PHYDIA1A.309
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.765
PU=PSTAR(I)*BKH(K+1) + AKH(K+1) PHYDIA1A.311
PL=PSTAR(I)*BKH(K) + AKH(K) PHYDIA1A.312
P_EXNER_FULL_L= PHYDIA1A.313
& P_EXNER_C(P_EXNER_HALF(I,K+1),P_EXNER_HALF(I,K), PHYDIA1A.314
& PU,PL,KAPPA) PHYDIA1A.315
T(I)=THETA(I,K)*P_EXNER_FULL_L PHYDIA1A.316
ENDDO PHYDIA1A.317
CALL QSAT
(Q_SAT(FIRST_FLD_PT),T(FIRST_FLD_PT) GSM1F405.766
& ,P(FIRST_FLD_PT,K),P_FLD_VALID) GSM1F405.767
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.768
WORK1(I,K)=Q(I,K)/Q_SAT(I)*100.0 ! Rel humidity in WORK1 PHYDIA1A.320
! Relative humidity should NOT be limited to 100% but do so in old ADM0F405.299
! versions of the cloud scheme to maintain bit comparison. ADM0F405.300
IF(WORK1(I,K).GT.100.0 .AND. .NOT. L_LSPICE) THEN ADM0F405.301
WORK1(I,K)=100.0 PHYDIA1A.323
ELSEIF(WORK1(I,K).LT.0.) THEN PHYDIA1A.324
WORK1(I,K)=0.0 PHYDIA1A.325
ENDIF PHYDIA1A.326
ENDDO PHYDIA1A.327
ENDDO PHYDIA1A.328
C----------------------------------------------------------------------- PHYDIA1A.329
CL Interpolate relative humidity on a pressure surface PHYDIA1A.330
C----------------------------------------------------------------------- PHYDIA1A.331
DO K=1,REL_HUMID_P_LEVS PHYDIA1A.332
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.769
PZ(I)=REL_HUMID_PRESS(K)*100.0 ! convert to Pascals PHYDIA1A.334
ENDDO PHYDIA1A.335
CALL V_INT
(P,PZ,WORK1,REL_HUMID_P(1,K), PHYDIA1A.336
& P_FIELD,Q_LEVELS,DUMMY1,DUMMY2,.FALSE. GSM1F405.770
& ,FIRST_FLD_PT,LAST_P_FLD_PT) GSM1F405.771
ENDDO PHYDIA1A.338
ENDIF PHYDIA1A.339
C----------------------------------------------------------------------- PHYDIA1A.340
C------------------TROPOPAUSE ITEMS 214 215 216 217-------------------- PHYDIA1A.341
CL----------Section 5 calculation of tropopause temp/ht and pressure---- PHYDIA1A.342
C----------------------------------------------------------------------- PHYDIA1A.343
IF (QTROP_T.AND.QTROP_P.AND.QTROP_Z) THEN PHYDIA1A.344
IF(QMODEL_HALF_HEIGHT) THEN PHYDIA1A.345
C----------------------------------------------------------------------- PHYDIA1A.346
C Call tropopause program with quality control PHYDIA1A.347
C----------------------------------------------------------------------- PHYDIA1A.348
BOTTOM_QC_PRESS=60000.0 ! pressure of the bottom QC level PHYDIA1A.349
TOP_QC_PRESS=10000.0 ! pressure of the top QC level PHYDIA1A.350
BOTTOM_QC_LEVEL=1 PHYDIA1A.351
TOP_QC_LEVEL=P_LEVELS PHYDIA1A.352
DO K=1,P_LEVELS PHYDIA1A.353
PP= AK(K) + BK(K) * 100000 ! Pstar assumed to be 1000MB PHYDIA1A.354
IF(BOTTOM_QC_PRESS.LT.PP) THEN PHYDIA1A.355
BOTTOM_QC_LEVEL=K PHYDIA1A.356
ENDIF PHYDIA1A.357
IF(TOP_QC_PRESS.LT.PP) THEN PHYDIA1A.358
TOP_QC_LEVEL=K PHYDIA1A.359
ENDIF PHYDIA1A.360
ENDDO PHYDIA1A.361
DO K=1,P_LEVELS+1 PHYDIA1A.362
DO I=1,P_FIELD PHYDIA1A.363
WORK1(I,K)=AKH(K)+BKH(K)*PSTAR(I) ! Calculate P_HALF PHYDIA1A.364
ENDDO PHYDIA1A.365
ENDDO PHYDIA1A.366
CALL QCTROP
(THETA,WORK1,P_EXNER_HALF PHYDIA1A.367
& ,MODEL_HALF_HEIGHT,TROP_T,TROP_P,TROP_Z,P_FIELD,P_LEVELS PHYDIA1A.368
& ,P(1,Z_REF),P(1,T_REF),PSTAR,Q,Q_LEVELS,Z_REF,T_REF,Z_REF PHYDIA1A.369
& ,BOTTOM_QC_LEVEL,TOP_QC_LEVEL,AKH,BKH GSM1F405.772
& ,FIRST_FLD_PT,LAST_P_FLD_PT) GSM1F405.773
C Last Z_REF used as Min TROP L PHYDIA1A.371
PHYDIA1A.372
C----------------------------------------------------------------------- PHYDIA1A.373
C This piece of code is to ensure sensible values of TROP ht and TEMP. PHYDIA1A.374
C Although,the TROP height is also produced it can be rubbish so for PHYDIA1A.375
C the moment it is best to call V_INTZ PHYDIA1A.376
C----------------------------------------------------------------------- PHYDIA1A.377
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.774
IF(TROP_T(I).LT.0) THEN PHYDIA1A.379
TROP_T(I)=199.0 PHYDIA1A.380
ENDIF PHYDIA1A.381
IF(TROP_P(I).LT.0) THEN PHYDIA1A.382
TROP_P(I)=111.0 PHYDIA1A.383
ENDIF PHYDIA1A.384
ENDDO PHYDIA1A.385
C CALL V_INT_Z(TROP_P,P(1,Z_REF),PSTAR,P_EXNER_HALF,THETA,Q, PHYDIA1A.386
C & MODEL_HALF_HEIGHT,TROP_Z,P_FIELD,P_LEVELS,Q_LEVELS,Z_REF, PHYDIA1A.387
C & AKH,BKH,FIRST_FLD_PT,LAST_P_FLD_PT) GSM1F405.775
C----------------------------------------------------------------------- PHYDIA1A.389
C Calculates ICAO heights from Trop pressure field PHYDIA1A.390
C----------------------------------------------------------------------- PHYDIA1A.391
IF(QTROP_ICAO) THEN PHYDIA1A.392
CALL ICAO_HT
(TROP_P(FIRST_FLD_PT),P_FLD_VALID GSM1F405.776
& ,TROP_ICAO(FIRST_FLD_PT)) GSM1F405.777
ENDIF PHYDIA1A.394
C PHYDIA1A.395
ELSE PHYDIA1A.396
WRITE(6,444) PHYDIA1A.397
WRITE(6,444) PHYDIA1A.398
444 FORMAT(' Subroutine TROP not called No MODEL_HALF_HEIGHTS')
PHYDIA1A.399
ENDIF PHYDIA1A.400
ELSEIF(QTROP_T.NEQV.QTROP_P.OR.QTROP_T.NEQV.QTROP_Z.OR.QTROP_P. PHYDIA1A.401
& NEQV.QTROP_Z) THEN PHYDIA1A.402
WRITE(6,*)'Subroutine TROP not called-tropopause temperature,'
GIE0F403.464
WRITE(6,*)' pressure and height all need to be selected' GIE0F403.465
ENDIF PHYDIA1A.405
C----------------------------------------------------------------------- PHYDIA1A.406
CL-------------------SECTION 6 ITEM 205--------------------------------- PHYDIA1A.407
CL Calculation of Wet Bulb Potential Temperature PHYDIA1A.408
C----------------------------------------------------------------------- PHYDIA1A.409
IF (QWBPT) THEN PHYDIA1A.410
DO K=1,WBPT_LEVS PHYDIA1A.411
PRESS_REQD=WBPT_PRESS(K)*100.0 ! convert to Pascals PHYDIA1A.412
ICODE=0 PHYDIA1A.413
CALL THETAW
PHYDIA1A.414
1 (PRESS_REQD,THETA,Q,P,PSTAR,P_EXNER_HALF,WBPT(1,K), PHYDIA1A.415
2 AK,BK,AKH,BKH,P_FIELD,P_LEVELS,Q_LEVELS,T_REF, PHYDIA1A.416
& FIRST_FLD_PT,LAST_P_FLD_PT, GSM1F405.778
3 ICODE,CMESSAGE) PHYDIA1A.417
IF(ICODE.NE.0) THEN PHYDIA1A.418
ICODE=1 PHYDIA1A.419
CMESSAGE='PHY_DIAG error in calculation of WBPT' PHYDIA1A.420
GOTO 1000 PHYDIA1A.421
ENDIF PHYDIA1A.422
ENDDO PHYDIA1A.423
ENDIF PHYDIA1A.424
C----------------------------------------------------------------------- PHYDIA1A.425
CL---------------------SECTION 7 ITEM 206------------------------------- PHYDIA1A.426
CL Calculation of Snow probability PHYDIA1A.427
C----------------------------------------------------------------------- PHYDIA1A.428
IF (QSNPROB)THEN PHYDIA1A.429
CALL SNOWPR
PHYDIA1A.430
1 (P,PSTAR,P_EXNER_HALF,THETA,Q,MODEL_HALF_HEIGHT, PHYDIA1A.431
2 P_FIELD,P_LEVELS,Q_LEVELS,Z_REF,AKH,BKH, PHYDIA1A.432
& SNPROB,FIRST_FLD_PT,LAST_P_FLD_PT) GSM1F405.779
ENDIF PHYDIA1A.434
C----------------------------------------------------------------------- PHYDIA1A.435
CL--------------------SECTION 8 ITEMS 207/8/18-------------------------- PHYDIA1A.436
CL Calculation of heights and pressure of -20 isotherm PHYDIA1A.437
C----------------------------------------------------------------------- PHYDIA1A.438
IF (QMINUS20_P.AND.QMINUS20_Z) THEN PHYDIA1A.439
IF(QMODEL_HALF_HEIGHT)THEN PHYDIA1A.440
C----------------------------------------------------------------------- PHYDIA1A.441
C Set T0 to 253.16K (-20 deg C) PHYDIA1A.442
C----------------------------------------------------------------------- PHYDIA1A.443
T0=253.16 PHYDIA1A.444
C----------------------------------------------------------------------- PHYDIA1A.445
C Calculate temperatures at full levels (stored in WORK1) PHYDIA1A.446
C----------------------------------------------------------------------- PHYDIA1A.447
DO K=1,P_LEVELS PHYDIA1A.448
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.780
PU=PSTAR(I)*BKH(K+1) + AKH(K+1) PHYDIA1A.450
PL=PSTAR(I)*BKH(K) + AKH(K) PHYDIA1A.451
P_EXNER_FULL_L= PHYDIA1A.452
& P_EXNER_C(P_EXNER_HALF(I,K+1),P_EXNER_HALF(I,K), PHYDIA1A.453
& PU,PL,KAPPA) PHYDIA1A.454
WORK1(I,K)=THETA(I,K)*P_EXNER_FULL_L PHYDIA1A.455
ENDDO PHYDIA1A.456
ENDDO PHYDIA1A.457
C----------------------------------------------------------------------- PHYDIA1A.458
CALL FREEZE
PHYDIA1A.459
1 (T0,P,THETA,WORK1,P_EXNER_HALF,PSTAR,Q,MODEL_HALF_HEIGHT, PHYDIA1A.460
2 OROG,MINUS20_Z,MINUS20_P, PHYDIA1A.461
& P_FIELD,P_LEVELS,Q_LEVELS,Z_REF,AKH,BKH GSM1F405.781
& ,FIRST_FLD_PT,LAST_P_FLD_PT) GSM1F405.782
C----------------------------------------------------------------------- PHYDIA1A.463
IF(QMINUS20_ICAO)THEN PHYDIA1A.464
CALL ICAO_HT
(MINUS20_P(FIRST_FLD_PT),P_FLD_VALID GSM1F405.783
& ,MINUS20_ICAO(FIRST_FLD_PT)) GSM1F405.784
ENDIF PHYDIA1A.466
C----------------------------------------------------------------------- PHYDIA1A.467
ELSE PHYDIA1A.468
WRITE(6,556) PHYDIA1A.469
WRITE(6,556) PHYDIA1A.470
556 FORMAT(' Subroutine FREEZE not called-no MODEL_HALF_HEIGHTs')
PHYDIA1A.471
ENDIF PHYDIA1A.472
ELSEIF(QMINUS20_P.NEQV.QMINUS20_Z) THEN PHYDIA1A.473
WRITE(6,*)'Subroutine FREEZE not called-both -20 level pressure'
GIE0F403.466
WRITE(6,*)'and height need to be selected' GIE0F403.467
ENDIF PHYDIA1A.476
C----------------------------------------------------------------------- PHYDIA1A.477
CL-------------------SECTION 9 ITEMS 209-211---------------------------- PHYDIA1A.478
CL Calculation of Freezing level heights and pressure PHYDIA1A.479
C----------------------------------------------------------------------- PHYDIA1A.480
IF (QFREEZE_Z.AND.QFREEZE_P)THEN PHYDIA1A.481
IF(QMODEL_HALF_HEIGHT)THEN PHYDIA1A.482
C----------------------------------------------------------------------- PHYDIA1A.483
C Set T0 to 273.16K (0 deg C) PHYDIA1A.484
C----------------------------------------------------------------------- PHYDIA1A.485
T0=273.16 PHYDIA1A.486
C----------------------------------------------------------------------- PHYDIA1A.487
C Calculate temperatures at full levels (stored in WORK1) PHYDIA1A.488
C----------------------------------------------------------------------- PHYDIA1A.489
DO K=1,P_LEVELS PHYDIA1A.490
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.785
PU=PSTAR(I)*BKH(K+1) + AKH(K+1) PHYDIA1A.492
PL=PSTAR(I)*BKH(K) + AKH(K) PHYDIA1A.493
P_EXNER_FULL_L= PHYDIA1A.494
& P_EXNER_C(P_EXNER_HALF(I,K+1),P_EXNER_HALF(I,K), PHYDIA1A.495
& PU,PL,KAPPA) PHYDIA1A.496
WORK1(I,K)=THETA(I,K)*P_EXNER_FULL_L PHYDIA1A.497
ENDDO PHYDIA1A.498
ENDDO PHYDIA1A.499
C----------------------------------------------------------------------- PHYDIA1A.500
CALL FREEZE
PHYDIA1A.501
1 (T0,P,THETA,WORK1,P_EXNER_HALF,PSTAR,Q,MODEL_HALF_HEIGHT, PHYDIA1A.502
2 OROG,FREEZE_Z,FREEZE_P, PHYDIA1A.503
& P_FIELD,P_LEVELS,Q_LEVELS,Z_REF,AKH,BKH GSM1F405.786
& ,FIRST_FLD_PT,LAST_P_FLD_PT) GSM1F405.787
IF(QFREEZE_ICAO)THEN PHYDIA1A.505
CALL ICAO_HT
(FREEZE_P(FIRST_FLD_PT),P_FLD_VALID GSM1F405.788
& ,FREEZE_ICAO(FIRST_FLD_PT)) GSM1F405.789
ENDIF PHYDIA1A.507
C----------------------------------------------------------------------- PHYDIA1A.508
ELSE PHYDIA1A.509
WRITE(6,555) PHYDIA1A.510
WRITE(6,555) PHYDIA1A.511
555 FORMAT(' Subroutine FREEZE not called-no MODEL_HALF_HEIGHTs')
PHYDIA1A.512
ENDIF PHYDIA1A.513
ELSEIF(QFREEZE_P.NEQV.QFREEZE_Z) THEN PHYDIA1A.514
WRITE(6,*)'Subroutine FREEZE not called - both freezing level'
GIE0F403.468
WRITE(6,*)'pressure and height need to be selected' GIE0F403.469
ENDIF PHYDIA1A.517
C----------------------------------------------------------------------- PHYDIA1A.518
CL-----------------SECTION 10 ITEMS 220/1------------------------------- PHYDIA1A.519
CL Calculation of duct height and intensity PHYDIA1A.520
C----------------------------------------------------------------------- PHYDIA1A.521
IF(QDUCT_INT.AND.QDUCT_HEIGHT)THEN PHYDIA1A.522
CALL DUCT
PHYDIA1A.523
1 (PSTAR,TSTAR,THETA,Q,U,V, PHYDIA1A.524
2 AK,BK,AKH,BKH,LAND,DUCT_HEIGHT,DUCT_INT,P_EXNER_HALF, PHYDIA1A.525
3 P_LEVELS,Q_LEVELS,ROW_LENGTH,P_ROWS,U_ROWS,P_FIELD,U_FIELD) PHYDIA1A.526
ELSEIF(QDUCT_INT.NEQV.QDUCT_HEIGHT)THEN PHYDIA1A.527
WRITE(6,*)'Subroutine DUCT not called - both duct height and'
GIE0F403.470
WRITE(6,*)'intensity need to be selected' GIE0F403.471
ENDIF PHYDIA1A.530
C----------------------------------------------------------------------- PHYDIA1A.531
CL-----------------SECTION 11 ITEMS 212/3------------------------------- PHYDIA1A.532
CL Calculation of contrail lower and upper height PHYDIA1A.533
C----------------------------------------------------------------------- PHYDIA1A.534
IF(QCONTRA_LOWERHT.AND.QCONTRA_UPPERHT)THEN PHYDIA1A.535
C----------------------------------------------------------------------- PHYDIA1A.536
C Calculate temperatures at full levels (stored in WORK1) PHYDIA1A.537
C----------------------------------------------------------------------- PHYDIA1A.538
DO K=1,P_LEVELS PHYDIA1A.539
DO I=1,P_FIELD PHYDIA1A.540
PU=PSTAR(I)*BKH(K+1) + AKH(K+1) PHYDIA1A.541
PL=PSTAR(I)*BKH(K) + AKH(K) PHYDIA1A.542
P_EXNER_FULL_L= PHYDIA1A.543
& P_EXNER_C(P_EXNER_HALF(I,K+1),P_EXNER_HALF(I,K), PHYDIA1A.544
& PU,PL,KAPPA) PHYDIA1A.545
WORK1(I,K)=THETA(I,K)*P_EXNER_FULL_L PHYDIA1A.546
ENDDO PHYDIA1A.547
ENDDO PHYDIA1A.548
C----------------------------------------------------------------------- PHYDIA1A.549
CALL CONTRAIL
PHYDIA1A.550
1 (P,WORK1,PSTAR,P_EXNER_HALF,THETA,CONTRAIL_UPPERHT, PHYDIA1A.551
2 CONTRAIL_LOWERHT,P_FIELD,P_LEVELS,FIRST_FLD_PT,LAST_P_FLD_PT) GSM1F405.790
ELSEIF(QCONTRA_UPPERHT.NEQV.QCONTRA_LOWERHT)THEN PHYDIA1A.553
WRITE(6,*)'Subroutine CONTRAIL not called - both lower height and'
GIE0F403.472
WRITE(6,*)'upper height need to be selected' GIE0F403.473
ENDIF PHYDIA1A.556
C----------------------------------------------------------------------- PHYDIA1A.557
C----------------------------------------------------------------------- PHYDIA1A.558
CL-----------------SECTION 12 ITEMS 219/223----------------------------- PHYDIA1A.559
CL Calculation of thermal advection PHYDIA1A.560
C----------------------------------------------------------------------- PHYDIA1A.561
IF(QTH_ADV_SINGLE.OR.QTH_ADV_MEAN)THEN PHYDIA1A.562
C----------------------------------------------------------------------- PHYDIA1A.563
CL Interpolate P field from P/T points to U/V points for all levels. RB070693.2
C----------------------------------------------------------------------- PHYDIA1A.566
DO K=1,P_LEVELS PHYDIA1A.567
CALL P_TO_UV
PHYDIA1A.568
1 (P(1,K),WORK1(1,K),P_FIELD,U_FIELD,ROW_LENGTH, GRR0F304.17
2 P_ROWS) RB070693.5
ENDDO PHYDIA1A.570
ENDIF PHYDIA1A.571
C Change effective dimension of WORK1 for input to DIA_THADV GRR0F304.18
C (only first U_FIELD points defined for each level from P_TO_UV) GRR0F304.19
CALL CHANGE_DIMENS
(WORK1,P_FIELD,U_FIELD,P_LEVELS,ICODE) GRR0F304.20
C----------------------------------------------------------------------- PHYDIA1A.572
CL Item 219 single level thermal advection--------------------------- PHYDIA1A.573
C----------------------------------------------------------------------- PHYDIA1A.574
IF(QTH_ADV_SINGLE)THEN PHYDIA1A.575
C----------------------------------------------------------------------- PHYDIA1A.576
CL Loop over required levels PHYDIA1A.577
C----------------------------------------------------------------------- PHYDIA1A.578
DO K=1,TH_ADV_P_LEVS PHYDIA1A.579
PRESS_REQD=TH_ADV_PRESS(K)*100.0 ! Convert to pascals PHYDIA1A.580
CALL DIA_THADV
PHYDIA1A.581
1 (U,V,THETA,P,WORK1,PSTAR,PRESS_REQD,P_EXNER_HALF, PHYDIA1A.582
2 TH_ADV_SINGLE(1,K),P_FIELD,U_FIELD,P_LEVELS,ROW_LENGTH, PHYDIA1A.583
3 P_ROWS,SEC_U_LATITUDE,EW_SPACE,NS_SPACE,AKH,BKH) PHYDIA1A.584
PHYDIA1A.585
ENDDO PHYDIA1A.586
ENDIF PHYDIA1A.587
C----------------------------------------------------------------------- PHYDIA1A.588
CL Item 223 mean thermal advection over levels 850/700/500mb- PHYDIA1A.589
C----------------------------------------------------------------------- PHYDIA1A.590
IF(QTH_ADV_MEAN)THEN PHYDIA1A.591
C----------------------------------------------------------------------- PHYDIA1A.592
C Initialise array PHYDIA1A.593
C----------------------------------------------------------------------- PHYDIA1A.594
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.791
TH_ADV_MEAN(I)=0.0 PHYDIA1A.596
ENDDO PHYDIA1A.597
C----------------------------------------------------------------------- PHYDIA1A.598
CL Loop over levels 850/700/500mb PHYDIA1A.599
C----------------------------------------------------------------------- PHYDIA1A.600
DO K=1,3 PHYDIA1A.601
IF(K.EQ.1)PRESS_REQD=85000.0 PHYDIA1A.602
IF(K.EQ.2)PRESS_REQD=70000.0 PHYDIA1A.603
IF(K.EQ.3)PRESS_REQD=50000.0 PHYDIA1A.604
CALL DIA_THADV
PHYDIA1A.605
1 (U,V,THETA,P,WORK1,PSTAR,PRESS_REQD,P_EXNER_HALF,WORK2, PHYDIA1A.606
2 P_FIELD,U_FIELD,P_LEVELS,ROW_LENGTH,P_ROWS, PHYDIA1A.607
3 SEC_U_LATITUDE,EW_SPACE,NS_SPACE,AKH,BKH) PHYDIA1A.608
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.792
TH_ADV_MEAN(I)=TH_ADV_MEAN(I)+WORK2(I) PHYDIA1A.610
ENDDO PHYDIA1A.611
ENDDO PHYDIA1A.612
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.793
TH_ADV_MEAN(I)=TH_ADV_MEAN(I)/3.0 PHYDIA1A.614
ENDDO PHYDIA1A.615
ENDIF PHYDIA1A.616
C----------------------------------------------------------------------- PHYDIA1A.617
CL Section 13 ITEMS 224 products of other fields PHYDIA1A.618
C----------------------------------------------------------------------- PHYDIA1A.619
CL Item 224 - height**2 on pressure levels PHYDIA1A.620
CL Must be requested on identical levels to height on pressure PHYDIA1A.621
CL levels. PHYDIA1A.622
C PHYDIA1A.623
IF (QHTS2) THEN PHYDIA1A.624
DO K=1,H2_P_LEVS PHYDIA1A.625
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.794
HEIGHTS2(I,K) = HEIGHTS(I,H2_IND(K))*HEIGHTS(I,H2_IND(K)) PHYDIA1A.627
ENDDO PHYDIA1A.628
ENDDO PHYDIA1A.629
ENDIF ADP0F401.31
C----------------------------------------------------------------------- ADP0F401.32
CL-----------------SECTION 14 ITEMS 226-254----------------------------- ADP0F401.33
CL Interpolate tracers onto pressure levels ADP0F401.34
C----------------------------------------------------------------------- ADP0F401.35
IF (TR_VARS.GT.0) THEN ADP0F401.36
DO ITR=1,TR_VARS ADP0F401.37
IF (SF_TRACER(ITR)) THEN ADP0F401.38
DO K=1,TR_PRESS_LEVS(ITR) ADP0F401.39
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.795
PZ(I)=TR_PRESS(ITR,K)*100.0 ! convert to Pascals ADP0F401.41
C----------------------------------------------------------------------- ADP0F401.42
C Extract current tracer field from STASHWORK/TRACERWORK ADP0F401.43
C----------------------------------------------------------------------- ADP0F401.44
TRACER_P(I)=TRACERWORK( PT_TRACER(ITR) - 1 + I + ADP0F401.45
& ( P_FIELD * (K-1) ) ) ADP0F401.46
ENDDO ADP0F401.47
CALL V_INT
(P,PZ,TRACERS(1,1,ITR),TRACER_P, ADP0F401.48
& P_FIELD,TR_LEVELS,DUMMY1,DUMMY2,.FALSE. GSM1F405.796
& ,FIRST_FLD_PT,LAST_P_FLD_PT) GSM1F405.797
C----------------------------------------------------------------------- ADP0F401.50
C Copy interpolated tracer field back to STASHWORK/TRACERWORK ADP0F401.51
C----------------------------------------------------------------------- ADP0F401.52
DO I=FIRST_FLD_PT,LAST_P_FLD_PT GSM1F405.798
TRACERWORK( PT_TRACER(ITR) - 1 + I + ADP0F401.54
& ( P_FIELD * (K-1) ) ) = TRACER_P(I) ADP0F401.55
ENDDO ADP0F401.56
ENDDO ADP0F401.57
ENDIF ADP0F401.58
ENDDO ADP0F401.59
ENDIF PHYDIA1A.630
C----------------------------------------------------------------------- PHYDIA1A.631
1000 CONTINUE PHYDIA1A.632
RETURN PHYDIA1A.633
END PHYDIA1A.634
*ENDIF PHYDIA1A.635