*IF DEF,A13_1A,OR,DEF,A13_1B ATJ0F402.27
C ******************************COPYRIGHT****************************** GTS2F400.2863
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.2864
C GTS2F400.2865
C Use, duplication or disclosure of this code is subject to the GTS2F400.2866
C restrictions as set forth in the contract. GTS2F400.2867
C GTS2F400.2868
C Meteorological Office GTS2F400.2869
C London Road GTS2F400.2870
C BRACKNELL GTS2F400.2871
C Berkshire UK GTS2F400.2872
C RG12 2SZ GTS2F400.2873
C GTS2F400.2874
C If no contract has been raised with this copy of the code, the use, GTS2F400.2875
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.2876
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.2877
C Modelling at the above address. GTS2F400.2878
C ******************************COPYRIGHT****************************** GTS2F400.2879
C GTS2F400.2880
CLL SUBROUTINE FILT_UV ------------------------------------------ FILTUV1A.3
CLL FILTUV1A.4
CLL PURPOSE: PERFORMS MASS-WEIGHTED FILTERING AND POLAR AVERAGING OF FILTUV1A.5
CLL U AND V FIELDS. FILTUV1A.6
CLL NOT SUITABLE FOR SINGLE COLUMN USE. FILTUV1A.7
CLL FILTUV1A.8
CLL WRITTEN BY M.H MAWSON. FILTUV1A.9
CLL FILTUV1A.10
CLL MODEL MODIFICATION HISTORY FROM MODEL VERSION 3.0: FILTUV1A.11
CLL VERSION DATE FILTUV1A.12
! 4.1 30/06/95 Minor change to P_TO_UV for MPP version and APB7F401.124
! added TYPFLDPT arguments APB7F401.125
! P.Burton APB7F401.126
!LL 4.2 16/08/96 Added TYPLDPT variables. APB0F402.81
!LL Made FILTER_WAVE_NUMBER_U_ROWS globally sized. APB0F402.82
!LL P.Burton APB0F402.83
C vn4.3 Mar. 97 T3E migration: optimisation changes GSS1F403.419
C S.J.Swarbrick GSS1F403.420
CLL FILTUV1A.13
CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, FILTUV1A.14
CLL STANDARD B. VERSION 2, DATED 18/01/90 FILTUV1A.15
CLL SYSTEM COMPONENTS COVERED: P142 FILTUV1A.16
CLL SYSTEM TASK: P1 FILTUV1A.17
CLL DOCUMENTATION: SECTION 3.5 FILTUV1A.18
CLL IN UNIFIED MODEL DOCUMENTATION PAPER FILTUV1A.19
CLL NO. 10 M.J.P. CULLEN,T.DAVIES AND M.H.MAWSON FILTUV1A.20
CLL VERSION 8, DATED 10/09/90. FILTUV1A.21
CLLEND------------------------------------------------------------- FILTUV1A.22
FILTUV1A.23
C*L ARGUMENTS:--------------------------------------------------- FILTUV1A.24
SUBROUTINE FILT_UV 1,8FILTUV1A.25
1 (PSTAR,U,V,RS_FUNCTIONS,DELTA_AK,DELTA_BK, FILTUV1A.26
2 P_FIELD,U_FIELD,NORTHERN_FILTERED_P_ROW, FILTUV1A.27
3 SOUTHERN_FILTERED_P_ROW,P_LEVELS, FILTUV1A.28
4 ROW_LENGTH, APB7F401.127
*CALL ARGFLDPT
APB7F401.128
& TRIGS,IFAX, APB7F401.129
4 COS_LONGITUDE,SIN_LONGITUDE, FILTUV1A.30
5 FILTER_WAVE_NUMBER_U_ROWS) FILTUV1A.31
FILTUV1A.32
IMPLICIT NONE FILTUV1A.33
FILTUV1A.34
INTEGER FILTUV1A.35
* U_FIELD !IN DIMENSION OF FIELDS ON VELOCITY GRID FILTUV1A.36
*, P_FIELD !IN DIMENSION OF FIELDS ON PRESSURE GRID FILTUV1A.37
*, P_LEVELS !IN NUMBER OF MODEL LEVELS. FILTUV1A.38
*, ROW_LENGTH !IN NUMBER OF POINTS PER ROW FILTUV1A.39
*, NORTHERN_FILTERED_P_ROW !IN ROW ON WHICH FILTERING STOPS FILTUV1A.42
* ! MOVING TOWARDS EQUATOR. FILTUV1A.43
*, SOUTHERN_FILTERED_P_ROW !IN ROW ON WHICH FILTERING STARTS AGAIN FILTUV1A.44
* ! MOVING TOWARDS SOUTH POLE. FILTUV1A.45
*, IFAX(10) !IN HOLDS FACTORS OF ROW_LENGTH USED BY FILTUV1A.48
* ! FILTERING. FILTUV1A.49
APB7F401.130
! All TYPFLDPT arguments are intent IN APB7F401.131
*CALL TYPFLDPT
APB7F401.132
FILTUV1A.50
INTEGER APB0F402.84
& FILTER_WAVE_NUMBER_U_ROWS(GLOBAL_U_FIELD/GLOBAL_ROW_LENGTH) APB0F402.85
! LAST WAVE NUMBER NOT TO BE CHOPPED APB0F402.86
REAL FILTUV1A.51
* U(U_FIELD,P_LEVELS) !INOUT U VELOCITY FIELD. FILTUV1A.52
*,V(U_FIELD,P_LEVELS) !INOUT V VELOCITY FIELD. FILTUV1A.53
FILTUV1A.54
REAL FILTUV1A.55
* PSTAR(P_FIELD) !IN PSTAR FIELD. FILTUV1A.56
*,RS_FUNCTIONS(P_FIELD,P_LEVELS) !IN RS*RS*DELTA P FILTUV1A.57
*,DELTA_AK(P_LEVELS) !IN LAYER THICKNESS FILTUV1A.58
*,DELTA_BK(P_LEVELS) !IN LAYER THICKNESS FILTUV1A.59
*,TRIGS(ROW_LENGTH) !IN HOLDS TRIGONOMETRIC FUNCTIONS FILTUV1A.60
* ! USED IN FILTERING. FILTUV1A.61
*,COS_LONGITUDE(ROW_LENGTH) !IN COSINE LONGITUDE AT U POINTS FILTUV1A.62
*,SIN_LONGITUDE(ROW_LENGTH) !IN SINE LONGITUDE AT U POINTS FILTUV1A.63
C*--------------------------------------------------------------------- FILTUV1A.64
FILTUV1A.65
C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- FILTUV1A.66
C DEFINE LOCAL ARRAYS: 1 IS REQUIRED FILTUV1A.67
REAL FILTUV1A.68
* WORK(P_FIELD) ! GENERAL WORKSPACE. FILTUV1A.69
FILTUV1A.70
C*--------------------------------------------------------------------- FILTUV1A.71
C DEFINE LOCAL VARIABLES FILTUV1A.72
FILTUV1A.73
C REAL SCALARS FILTUV1A.74
REAL FILTUV1A.75
* SCALAR1(LAST_P_VALID_PT-FIRST_VALID_PT+1), GSS1F403.421
* SCALAR2(LAST_P_VALID_PT-FIRST_VALID_PT+1), GSS1F403.422
* SCALAR3 GSS1F403.423
FILTUV1A.77
C COUNT VARIABLES FOR DO LOOPS ETC. FILTUV1A.78
INTEGER FILTUV1A.79
* I,K FILTUV1A.80
*, NORTHERN_FILTERED_U_ROW ! U ROW ON WHICH FILTERING STOPS FILTUV1A.81
*, SOUTHERN_FILTERED_U_ROW ! U ROW ON WHICH FILTERING STARTS AGAIN FILTUV1A.82
*, FILTER_SPACE ! HORIZONTAL DIMENSION OF SPACE NEEDED IN FILTERING FILTUV1A.83
* ! ROUTINE. FILTUV1A.84
*, n_input ! no. of inputs for sqrt_v function GSS1F403.424
FILTUV1A.85
C*L EXTERNAL SUBROUTINE CALLS:--------------------------------------- FILTUV1A.86
EXTERNAL FILTUV1A.87
* P_TO_UV,FILTER,POLAR_UV FILTUV1A.88
C*--------------------------------------------------------------------- FILTUV1A.89
CL MAXIMUM VECTOR LENGTH ASSUMED IS P_FIELD FILTUV1A.90
CL--------------------------------------------------------------------- FILTUV1A.91
CL INTERNAL STRUCTURE. FILTUV1A.92
CL--------------------------------------------------------------------- FILTUV1A.93
CL FILTUV1A.94
CL--------------------------------------------------------------------- FILTUV1A.95
CL SECTION 1. MASS-WEIGHT U AND V FIELDS. FILTUV1A.96
CL--------------------------------------------------------------------- FILTUV1A.97
FILTUV1A.98
! QAN fix : blank out WORK array so halos don't contain junk APB7F401.133
DO I=1,P_FIELD APB7F401.134
WORK(I)=0.0 APB7F401.135
ENDDO APB7F401.136
APB7F401.137
CL LOOP OVER P_LEVELS. FILTUV1A.99
FILTUV1A.100
DO 100 K=1,P_LEVELS FILTUV1A.101
FILTUV1A.102
CL CALCULATE RS*DELTA P FROM RS*RS*DELTA P HELD IN RS_FUNCTIONS AND FILTUV1A.103
CL DELTA P. FILTUV1A.104
DO I=FIRST_VALID_PT,LAST_P_VALID_PT GSS1F403.425
SCALAR1(I-FIRST_VALID_PT+1) GSS1F403.426
& = DELTA_AK(K) + DELTA_BK(K)*PSTAR(I) GSS1F403.427
SCALAR2(I-FIRST_VALID_PT+1) GSS1F403.428
& = RS_FUNCTIONS(I,K)/SCALAR1(I-FIRST_VALID_PT+1) GSS1F403.429
END DO GSS1F403.430
FILTUV1A.110
n_input= LAST_P_VALID_PT-FIRST_VALID_PT+1 GSS1F403.431
*IF DEF,VECTLIB PXVECTLB.8
call sqrt_v(
n_input,scalar2,scalar2) GSS1F403.433
*ELSE GSS1F403.434
DO I=1,n_input GSS1F403.435
scalar2(I)=sqrt(scalar2(I)) GSS1F403.436
END DO GSS1F403.437
*ENDIF GSS1F403.438
GSS1F403.439
DO I=FIRST_VALID_PT,LAST_P_VALID_PT GSS1F403.440
WORK(I) = SCALAR1(I-FIRST_VALID_PT+1) * GSS1F403.441
& SCALAR2(I-FIRST_VALID_PT+1) GSS1F403.442
END DO GSS1F403.443
GSS1F403.444
GSS1F403.445
CL CALL P_TO_UV TO TRANSFER RS*DELTA P TO U GRID. FILTUV1A.111
FILTUV1A.112
CALL P_TO_UV
(WORK,RS_FUNCTIONS(1,K),P_FIELD,U_FIELD,ROW_LENGTH, FILTUV1A.113
& tot_P_ROWS) APB7F401.139
FILTUV1A.115
CL MASS WEIGHT U AND V FIELDS. FILTUV1A.116
FILTUV1A.117
DO 120 I=FIRST_VALID_PT,LAST_U_VALID_PT APB7F401.140
U(I,K) = U(I,K) * RS_FUNCTIONS(I,K) FILTUV1A.119
V(I,K) = V(I,K) * RS_FUNCTIONS(I,K) FILTUV1A.120
120 CONTINUE FILTUV1A.121
FILTUV1A.122
CL END LOOP OVER P_LEVELS. FILTUV1A.123
100 CONTINUE FILTUV1A.124
FILTUV1A.125
CL FILTUV1A.126
CL--------------------------------------------------------------------- FILTUV1A.127
CL SECTION 2. CALL FILTER TO FILTER FIELDS. FILTUV1A.128
CL--------------------------------------------------------------------- FILTUV1A.129
FILTUV1A.130
C SET NORTHERN AND SOUTHERN ROWS FOR U FILTERING. FILTUV1A.131
FILTUV1A.132
NORTHERN_FILTERED_U_ROW = NORTHERN_FILTERED_P_ROW FILTUV1A.133
SOUTHERN_FILTERED_U_ROW = SOUTHERN_FILTERED_P_ROW - 1 FILTUV1A.134
FILTUV1A.135
C SET FILTER_SPACE WHICH IS ROW_LENGTH+2 TIMES THE NUMBER OF ROWS TO FILTUV1A.136
C BE FILTERED. FILTUV1A.137
FILTUV1A.138
FILTER_SPACE = (ROW_LENGTH+2)*(NORTHERN_FILTERED_U_ROW-1+ FILTUV1A.139
* U_FIELD/ROW_LENGTH-SOUTHERN_FILTERED_U_ROW) FILTUV1A.140
FILTUV1A.141
CL CALL FILTER FOR U FILTUV1A.142
FILTUV1A.143
CALL FILTER
(U,U_FIELD,P_LEVELS,FILTER_SPACE,ROW_LENGTH, FILTUV1A.144
*CALL ARGFLDPT
APB0F402.87
* FILTER_WAVE_NUMBER_U_ROWS,TRIGS,IFAX, FILTUV1A.145
* NORTHERN_FILTERED_U_ROW,SOUTHERN_FILTERED_U_ROW) FILTUV1A.146
FILTUV1A.147
CL CALL FILTER FOR V FILTUV1A.148
FILTUV1A.149
CALL FILTER
(V,U_FIELD,P_LEVELS,FILTER_SPACE,ROW_LENGTH, FILTUV1A.150
*CALL ARGFLDPT
APB0F402.88
* FILTER_WAVE_NUMBER_U_ROWS,TRIGS,IFAX, FILTUV1A.151
* NORTHERN_FILTERED_U_ROW,SOUTHERN_FILTERED_U_ROW) FILTUV1A.152
FILTUV1A.153
CL FILTUV1A.154
CL--------------------------------------------------------------------- FILTUV1A.155
CL SECTION 3. REMOVE MASS-WEIGHTING FROM U AND V. FILTUV1A.156
CL--------------------------------------------------------------------- FILTUV1A.157
FILTUV1A.158
APB2F401.204
! CALL POLAR_UV TO UPDATE THE POLAR VALUES OF MASS-WEIGHTED U AND V APB2F401.205
APB2F401.206
CALL POLAR_UV
(U,V,ROW_LENGTH,U_FIELD,P_LEVELS, APB2F401.207
*CALL ARGFLDPT
APB2F401.208
& COS_LONGITUDE,SIN_LONGITUDE) APB2F401.209
CL LOOP OVER P_LEVELS. FILTUV1A.159
FILTUV1A.160
DO 300 K=1,P_LEVELS FILTUV1A.161
FILTUV1A.162
FILTUV1A.167
CL REMOVE MASS-WEIGHTING. FILTUV1A.168
FILTUV1A.169
CFPP$ SELECT(CONCUR) FILTUV1A.170
DO 310 I=FIRST_VALID_PT,LAST_U_VALID_PT APB7F401.141
SCALAR3 = 1./RS_FUNCTIONS(I,K) GSS1F403.446
U(I,K) = U(I,K) * SCALAR3 GSS1F403.447
V(I,K) = V(I,K) * SCALAR3 GSS1F403.448
310 CONTINUE FILTUV1A.175
FILTUV1A.176
CL END LOOP OVER P_LEVELS FILTUV1A.177
FILTUV1A.178
300 CONTINUE FILTUV1A.179
FILTUV1A.180
CL END OF ROUTINE FILT_UV FILTUV1A.181
FILTUV1A.182
RETURN FILTUV1A.183
END FILTUV1A.184
*ENDIF FILTUV1A.185