*IF DEF,BCRECONF VININTF1.2
C ******************************COPYRIGHT****************************** VININTF1.3
C (c) CROWN COPYRIGHT 1997, METEOROLOGICAL OFFICE, All Rights Reserved. VININTF1.4
C VININTF1.5
C Use, duplication or disclosure of this code is subject to the VININTF1.6
C restrictions as set forth in the contract. VININTF1.7
C VININTF1.8
C Meteorological Office VININTF1.9
C London Road VININTF1.10
C BRACKNELL VININTF1.11
C Berkshire UK VININTF1.12
C RG12 2SZ VININTF1.13
C VININTF1.14
C If no contract has been raised with this copy of the code, the use, VININTF1.15
C duplication or disclosure of it is strictly prohibited. Permission VININTF1.16
C to do so must first be obtained in writing from the Head of Numerical VININTF1.17
C Modelling at the above address. VININTF1.18
C VININTF1.19
C ********************************************************************* VININTF1.20
CLL -------------- SUBROUTINE VIN_INTF --------------------------------- VININTF1.21
CLL VININTF1.22
CLL Control routine originally for Cray YMP VININTF1.23
CLL VININTF1.24
CLL Written by: C Wilson VININTF1.25
CLL VININTF1.26
CLL Code reviewed by : D. Robinson VININTF1.27
CLL VININTF1.28
CLL Model Modification history VININTF1.29
CLL version Date VININTF1.30
CLL VININTF1.31
CLL 4.4 07/10/97 Add code to Vert Interpolate QCF D. Robinson VININTF1.32
!LL 4.5 15/07/98 Start-end args added to V_INT. S.D.Mullerworth GSM1F405.402
CLL VININTF1.33
CLL Programing standard: UM Documentation paper No3, VININTF1.34
CLL Version No 4, dated 05/02/92 VININTF1.35
CLL VININTF1.36
CLL System components covered: D81 VININTF1.37
CLL VININTF1.38
CLL System task: D81 VININTF1.39
CLL VININTF1.40
CLL Purpose: To vertically interpolate atmospheric boundary data from a VININTF1.41
CLL global or regional model to a new set of levels. VININTF1.42
CLL N B NO HORIZONTAL change of domain is possible. VININTF1.43
CLL VININTF1.44
CLL Documentation: UM Documentation paper No D8, VININTF1.45
CLL VININTF1.46
CLLEND VININTF1.47
VININTF1.48
SUBROUTINE V_INT_INTF 1,6VININTF1.49
VININTF1.50
CL Arguments VININTF1.51
& (DATA_IN,AK_IN,BK_IN,P_LEVELS,Q_LEVELS,TR_VARS,TR_LEVELS, VININTF1.52
& LEN_INTFA,LEN_INTFAU, VININTF1.53
& DATA_OUT,AK_OUT,BK_OUT,P_LEVELS_OUT,Q_LEVELS_OUT,TR_LEVELS_OUT, VININTF1.54
& L_LSPICE,ICODE,CMESSAGE) VININTF1.55
VININTF1.56
IMPLICIT NONE VININTF1.57
VININTF1.58
INTEGER VININTF1.59
& ICODE ! Return code : =0 Normal exit VININTF1.60
C ! >0 Error condition VININTF1.61
&, P_LEVELS ! IN no of P levels input data VININTF1.62
&, Q_LEVELS ! IN no of wet levels input data VININTF1.63
&, TR_LEVELS ! IN no of tracer levels input data VININTF1.64
&, TR_VARS ! IN no of tracers VININTF1.65
&, LEN_INTFA ! IN no of points in horizontal strip round VININTF1.66
C ! limited area boundary VININTF1.67
&, LEN_INTFAU ! IN no of wind points in horizontal strip VININTF1.68
C ! round limited area boundary VININTF1.69
&, P_LEVELS_OUT ! IN no of P levels input data VININTF1.70
&, Q_LEVELS_OUT ! IN no of wet levels input data VININTF1.71
&, TR_LEVELS_OUT ! IN no of tracer levels input data VININTF1.72
VININTF1.73
REAL VININTF1.74
& DATA_IN(*) !IN boundary data VININTF1.75
&, DATA_OUT(*) !OUT boundary data VININTF1.76
&, AK_IN(P_LEVELS) !IN input full level A value VININTF1.77
&, BK_IN(P_LEVELS) !IN input full level B value VININTF1.78
&, AK_OUT(P_LEVELS_OUT) !IN output full level A value VININTF1.79
&, BK_OUT(P_LEVELS_OUT) !IN output full level B value VININTF1.80
VININTF1.81
LOGICAL L_LSPICE ! IN T/F if QCF in Boundary Data VININTF1.82
VININTF1.83
CHARACTER*(*) CMESSAGE ! Error message if ICODE>0 VININTF1.84
VININTF1.85
C* VININTF1.86
*CALL C_R_CP
VININTF1.87
VININTF1.88
C*L External subroutines called : VININTF1.89
VININTF1.90
EXTERNAL VININTF1.91
& V_INT VININTF1.92
C* VININTF1.93
C*L Workspace used VININTF1.94
REAL VININTF1.95
* PSTAR(LEN_INTFA), VININTF1.96
* P_OUT(LEN_INTFA), VININTF1.97
* P_TMP(LEN_INTFA*P_LEVELS), VININTF1.98
* TL(LEN_INTFA,P_LEVELS) VININTF1.99
C* VININTF1.100
CL local VININTF1.101
INTEGER VININTF1.102
& I, VININTF1.103
& IADDR_IN, VININTF1.104
& IADDR_OUT, VININTF1.105
& LEVEL, VININTF1.106
& VAR VININTF1.107
VININTF1.108
REAL TEMP VININTF1.109
VININTF1.110
CL Internal structure: VININTF1.111
VININTF1.112
ICODE=0 VININTF1.113
CMESSAGE=' ' VININTF1.114
VININTF1.115
CL Atmosphere interface VININTF1.116
VININTF1.117
VININTF1.118
CL 1.0 Generate new data on the boundary zone of limited area grid VININTF1.119
CL from previous data on the boundary zone of limited area grid VININTF1.120
VININTF1.121
IADDR_OUT=1 VININTF1.122
IADDR_IN=1 VININTF1.123
VININTF1.124
CL 1.1 Copy pstar to output VININTF1.125
VININTF1.126
DO I=1,LEN_INTFA VININTF1.127
DATA_OUT(I)=DATA_IN(I) VININTF1.128
PSTAR(I)=DATA_IN(I) VININTF1.129
ENDDO VININTF1.130
VININTF1.131
IADDR_IN=IADDR_IN+LEN_INTFA VININTF1.132
IADDR_OUT=IADDR_OUT+LEN_INTFA VININTF1.133
VININTF1.134
VININTF1.135
CL 2.0 Vertical interpolation winds VININTF1.136
VININTF1.137
C set up input level pressures VININTF1.138
C set up for U points and call V_INT VININTF1.139
DO LEVEL=1,P_LEVELS VININTF1.140
DO I=1,LEN_INTFAU VININTF1.141
P_TMP(I+(LEVEL-1)*LEN_INTFAU) = AK_IN(LEVEL)+ VININTF1.142
& PSTAR(I)*BK_IN(LEVEL) VININTF1.143
ENDDO VININTF1.144
ENDDO VININTF1.145
VININTF1.146
C U VININTF1.147
DO LEVEL=1,P_LEVELS_OUT VININTF1.148
C set up output level pressure VININTF1.149
DO I=1,LEN_INTFAU VININTF1.150
P_OUT(I) = AK_OUT(LEVEL)+ PSTAR(I)*BK_OUT(LEVEL) VININTF1.151
ENDDO VININTF1.152
VININTF1.153
CALL V_INT
(P_TMP,P_OUT,DATA_IN(IADDR_IN),DATA_OUT(IADDR_OUT), VININTF1.154
& LEN_INTFAU,P_LEVELS,TEMP,TEMP,.FALSE. GSM1F405.403
& ,1,LEN_INTFAU) GSM1F405.404
VININTF1.156
IADDR_OUT=IADDR_OUT+LEN_INTFAU VININTF1.157
VININTF1.158
ENDDO VININTF1.159
VININTF1.160
IADDR_IN=IADDR_IN+P_LEVELS*LEN_INTFAU VININTF1.161
VININTF1.162
C V VININTF1.163
DO LEVEL=1,P_LEVELS_OUT VININTF1.164
C set up output level pressure VININTF1.165
DO I=1,LEN_INTFAU VININTF1.166
P_OUT(I) = AK_OUT(LEVEL)+ PSTAR(I)*BK_OUT(LEVEL) VININTF1.167
ENDDO VININTF1.168
VININTF1.169
CALL V_INT
(P_TMP,P_OUT,DATA_IN(IADDR_IN),DATA_OUT(IADDR_OUT), VININTF1.170
& LEN_INTFAU,P_LEVELS,TEMP,TEMP,.FALSE. GSM1F405.405
& ,1,LEN_INTFAU) GSM1F405.406
VININTF1.172
IADDR_OUT=IADDR_OUT+LEN_INTFAU VININTF1.173
VININTF1.174
ENDDO VININTF1.175
VININTF1.176
IADDR_IN=IADDR_IN+P_LEVELS*LEN_INTFAU VININTF1.177
VININTF1.178
CL 2.2 Vertical interpolation thetal VININTF1.179
VININTF1.180
C set up input level pressures VININTF1.181
C set up for P points and call V_INT VININTF1.182
DO LEVEL=1,P_LEVELS VININTF1.183
DO I=1,LEN_INTFA VININTF1.184
P_TMP(I+(LEVEL-1)*LEN_INTFA) = AK_IN(LEVEL)+ VININTF1.185
& PSTAR(I)*BK_IN(LEVEL) VININTF1.186
ENDDO VININTF1.187
ENDDO VININTF1.188
VININTF1.189
C Convert input theta to temperature VININTF1.190
DO LEVEL=1,P_LEVELS VININTF1.191
DO I=1,LEN_INTFA VININTF1.192
TL(I,LEVEL)=DATA_IN(IADDR_IN+(LEVEL-1)*LEN_INTFA+I-1) VININTF1.193
& *EXP(LOG(P_TMP(I+(LEVEL-1)*LEN_INTFA)/PREF)*KAPPA) VININTF1.194
ENDDO VININTF1.195
ENDDO VININTF1.196
VININTF1.197
C Vertically interpolate (V_INT =ln(p) ) VININTF1.198
DO LEVEL=1,P_LEVELS_OUT VININTF1.199
C set up output level pressure VININTF1.200
DO I=1,LEN_INTFA VININTF1.201
P_OUT(I) = AK_OUT(LEVEL)+ PSTAR(I)*BK_OUT(LEVEL) VININTF1.202
ENDDO VININTF1.203
VININTF1.204
CALL V_INT
(P_TMP,P_OUT,TL,DATA_OUT(IADDR_OUT), VININTF1.205
& LEN_INTFA,P_LEVELS,TEMP,TEMP,.FALSE. GSM1F405.407
& ,1,LEN_INTFA) GSM1F405.408
VININTF1.207
VININTF1.208
C Convert Output temperature to theta VININTF1.209
DO I=1,LEN_INTFA VININTF1.210
DATA_OUT(IADDR_OUT+I-1)= DATA_OUT(IADDR_OUT+I-1)/ VININTF1.211
& EXP(LOG(P_OUT(I)/PREF)*KAPPA) VININTF1.212
ENDDO VININTF1.213
VININTF1.214
IADDR_OUT=IADDR_OUT+LEN_INTFA VININTF1.215
VININTF1.216
ENDDO VININTF1.217
VININTF1.218
IADDR_IN=IADDR_IN+P_LEVELS*LEN_INTFA VININTF1.219
VININTF1.220
CL 2.3 Vertical interpolation QT VININTF1.221
VININTF1.222
C input level pressures already calculated for thetal VININTF1.223
VININTF1.224
DO LEVEL=1,Q_LEVELS_OUT VININTF1.225
C set up output level pressure VININTF1.226
DO I=1,LEN_INTFA VININTF1.227
P_OUT(I) = AK_OUT(LEVEL)+ PSTAR(I)*BK_OUT(LEVEL) VININTF1.228
ENDDO VININTF1.229
VININTF1.230
CALL V_INT
(P_TMP,P_OUT,DATA_IN(IADDR_IN),DATA_OUT(IADDR_OUT), VININTF1.231
& LEN_INTFA,Q_LEVELS,TEMP,TEMP,.FALSE. GSM1F405.409
& ,1,LEN_INTFA) GSM1F405.410
VININTF1.233
IADDR_OUT=IADDR_OUT+LEN_INTFA VININTF1.234
VININTF1.235
ENDDO VININTF1.236
VININTF1.237
IADDR_IN=IADDR_IN+Q_LEVELS*LEN_INTFA VININTF1.238
VININTF1.239
CL 2.4 Vertical interpolation of TRACERS VININTF1.240
VININTF1.241
IF (TR_VARS.GT.0) THEN VININTF1.242
DO VAR=1,TR_VARS VININTF1.243
VININTF1.244
C input level pressures already calculated VININTF1.245
VININTF1.246
DO LEVEL=P_LEVELS_OUT-TR_LEVELS_OUT+1,P_LEVELS VININTF1.247
C set up output level pressure VININTF1.248
DO I=1,LEN_INTFA VININTF1.249
P_OUT(I) = AK_OUT(LEVEL)+ PSTAR(I)*BK_OUT(LEVEL) VININTF1.250
ENDDO VININTF1.251
VININTF1.252
CALL V_INT
(P_TMP(1+(P_LEVELS-TR_LEVELS)*LEN_INTFA), VININTF1.253
& P_OUT,DATA_IN(IADDR_IN),DATA_OUT(IADDR_OUT), VININTF1.254
& LEN_INTFA,TR_LEVELS,TEMP,TEMP,.FALSE. GSM1F405.411
& ,1,LEN_INTFA) GSM1F405.412
VININTF1.256
IADDR_OUT=IADDR_OUT+LEN_INTFA VININTF1.257
VININTF1.258
ENDDO VININTF1.259
VININTF1.260
ENDDO ! Loop over VAR VININTF1.261
VININTF1.262
IADDR_IN=IADDR_IN+(TR_LEVELS*TR_VARS)*LEN_INTFA VININTF1.263
VININTF1.264
ENDIF ! If any TR_VARS VININTF1.265
VININTF1.266
CL 2.5 Vertical interpolation of QCF VININTF1.267
VININTF1.268
IF (L_LSPICE) THEN ! QCF Boundary Conditions present VININTF1.269
VININTF1.270
C input level pressures already calculated for thetal VININTF1.271
VININTF1.272
DO LEVEL=1,Q_LEVELS_OUT VININTF1.273
C set up output level pressure VININTF1.274
DO I=1,LEN_INTFA VININTF1.275
P_OUT(I) = AK_OUT(LEVEL)+ PSTAR(I)*BK_OUT(LEVEL) VININTF1.276
ENDDO VININTF1.277
VININTF1.278
CALL V_INT
(P_TMP,P_OUT,DATA_IN(IADDR_IN),DATA_OUT(IADDR_OUT), VININTF1.279
& LEN_INTFA,Q_LEVELS,TEMP,TEMP,.FALSE. GSM1F405.413
& ,1,LEN_INTFA) GSM1F405.414
VININTF1.281
IADDR_OUT=IADDR_OUT+LEN_INTFA VININTF1.282
VININTF1.283
ENDDO VININTF1.284
VININTF1.285
ENDIF ! If L_LSPICE VININTF1.286
VININTF1.287
RETURN VININTF1.288
END VININTF1.289
*ENDIF VININTF1.290