*IF DEF,C93_1A,OR,DEF,C93_2A GNF0F402.8
C ******************************COPYRIGHT****************************** GTS2F400.1837
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.1838
C GTS2F400.1839
C Use, duplication or disclosure of this code is subject to the GTS2F400.1840
C restrictions as set forth in the contract. GTS2F400.1841
C GTS2F400.1842
C Meteorological Office GTS2F400.1843
C London Road GTS2F400.1844
C BRACKNELL GTS2F400.1845
C Berkshire UK GTS2F400.1846
C RG12 2SZ GTS2F400.1847
C GTS2F400.1848
C If no contract has been raised with this copy of the code, the use, GTS2F400.1849
C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.1850
C to do so must first be obtained in writing from the Head of Numerical GTS2F400.1851
C Modelling at the above address. GTS2F400.1852
C ******************************COPYRIGHT****************************** GTS2F400.1853
C GTS2F400.1854
CLL SUBROUTINE DEL SQUARED FFT U ------------------------------------- DEL2U1A.3
CLL DEL2U1A.4
CLL NOT SUITABLE FOR SINGLE COLUMN USE. DEL2U1A.5
CLL DEL2U1A.6
CLL PURPOSE: Solves DEL SQUARED Q = RHS on surface of sphere. DEL2U1A.7
CLL Uses Fast Fourier Fransforms to decompose right-hand- DEL2U1A.8
CLL side in x-direction and then solves in y-direction DEL2U1A.9
CLL for the fourier coefficients of the solution. DEL2U1A.10
CLL DEL2U1A.11
CLL N.B. 1. This version is for a problem where the solution Q and DEL2U1A.12
CLL the right-hand-side RHS are held at velocity points. DEL2U1A.13
CLL 2. A solution to this equation exists uniquely, upto DEL2U1A.14
CLL an arbitrary constant if and only if the sum of the DEL2U1A.15
CLL right-hand-side values over the sphere is equal to zero. DEL2U1A.16
CLL This is known as the Compatability Condition. DEL2U1A.17
CLL This routine assumes that this condition is satisfied. DEL2U1A.18
CLL This routine chooses the arbitrary constant as follows; DEL2U1A.19
CLL If A(y) is the coefficient of wave number 0 then the DEL2U1A.20
CLL constant is chosen by setting the mean of A to zero. DEL2U1A.21
CLL DEL2U1A.22
CLL version for cray y-mp DEL2U1A.23
CLL DEL2U1A.24
CLL WRITTEN 18/06/92 BY M.H. MAWSON. DEL2U1A.25
CLL DEL2U1A.26
CLL Model Modification history from model version 3.0: DEL2U1A.27
CLL version Date DEL2U1A.28
CLL 3.1 24/02/93 Tidy code to remove QA Fortran messages. MM240293.37
CLL vn4.2 07/11/96:Allow this routine to be used in C93_2A (Farnon) GNF0F402.7
CLL DEL2U1A.29
CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4 DEL2U1A.30
CLL STANDARD B. DEL2U1A.31
CLL DEL2U1A.32
CLL SYSTEM COMPONENTS COVERED: DEL2U1A.33
CLL DEL2U1A.34
CLL SYSTEM TASK: DEL2U1A.35
CLL DEL2U1A.36
CLL DOCUMENTATION: U.M.D.P. No 14 by M.H. Mawson DEL2U1A.37
CLL DEL2U1A.38
CLLEND------------------------------------------------------------- DEL2U1A.39
DEL2U1A.40
C DEL2U1A.41
C*L ARGUMENTS:--------------------------------------------------- DEL2U1A.42
SUBROUTINE DEL_SQUARED_FFT_U ,2DEL2U1A.43
1 (Q,RHS,SEC_U_LATITUDE,COS_P_LATITUDE, DEL2U1A.44
2 TRIGS,IFAX,LATITUDE_STEP_INVERSE, DEL2U1A.45
3 EARTH_RADIUS_INVERSE,U_FIELD, DEL2U1A.46
4 ROW_LENGTH) DEL2U1A.47
DEL2U1A.48
IMPLICIT NONE DEL2U1A.49
DEL2U1A.50
INTEGER DEL2U1A.51
& U_FIELD !IN Horizontal dimension of velocity field DEL2U1A.52
&, ROW_LENGTH !IN Number of points on a row. DEL2U1A.53
&, IFAX(10) !IN Holds factors of row_length used in FFT's DEL2U1A.54
DEL2U1A.55
REAL DEL2U1A.56
& RHS(U_FIELD) !IN Holds right-hand-side. DEL2U1A.57
&,SEC_U_LATITUDE(U_FIELD) !IN 1./cos(lat) at velocity points DEL2U1A.58
&,COS_P_LATITUDE(U_FIELD+ROW_LENGTH) !IN cos(lat) at pressure point DEL2U1A.59
&,LATITUDE_STEP_INVERSE !IN. 1/(delta phi) DEL2U1A.60
&,EARTH_RADIUS_INVERSE !IN 1./(radius of earth). DEL2U1A.61
DEL2U1A.62
REAL DEL2U1A.63
& TRIGS(ROW_LENGTH) !IN Holds trigonometric terms used in FFT's DEL2U1A.64
DEL2U1A.65
REAL DEL2U1A.66
& Q(U_FIELD) !OUT Holds solution. DEL2U1A.67
DEL2U1A.68
C*--------------------------------------------------------------------- DEL2U1A.69
DEL2U1A.70
C*L DEFINE ARRAYS AND VARIABLES USED IN THIS ROUTINE----------------- DEL2U1A.71
C DEFINE LOCAL ARRAYS: 5 ARE REQUIRED DEL2U1A.72
DEL2U1A.73
REAL DEL2U1A.74
& RHS_DATA(ROW_LENGTH+2,U_FIELD/ROW_LENGTH) ! Fourier modes of DEL2U1A.75
&, Q_DATA(ROW_LENGTH+2,U_FIELD/ROW_LENGTH) ! Q and RHS. DEL2U1A.76
&, A_DIAG(U_FIELD/ROW_LENGTH,ROW_LENGTH+2) ! Matrix diagonal DEL2U1A.77
&, A_SUB_DIAG(U_FIELD/ROW_LENGTH,ROW_LENGTH+2) ! Sub diagonal DEL2U1A.78
&, A_SUP_DIAG(U_FIELD/ROW_LENGTH,ROW_LENGTH+2) ! Super diagonal DEL2U1A.79
DEL2U1A.80
C*--------------------------------------------------------------------- DEL2U1A.81
C DEFINE LOCAL VARIABLES DEL2U1A.82
DEL2U1A.83
C COUNT VARIABLES FOR DO LOOPS ETC. DEL2U1A.84
INTEGER DEL2U1A.85
& I,J,K,IK DEL2U1A.86
&, ROWS ! Number of rows in field. DEL2U1A.87
&, LOT ! Number of data vectors passed to FFT's. DEL2U1A.88
&, JUMP ! Number of storage locations between the DEL2U1A.89
& ! start of consecutive data vectors. DEL2U1A.90
&, INCREMENT ! Number of storage locations between each DEL2U1A.91
& ! element of the same data vector, 1, if DEL2U1A.92
& ! consecutive. DEL2U1A.93
&, FFT_ISIGN ! Parameter determining whether spectral MM240293.38
& ! to grid-point (1) or grid-point to MM240293.39
& ! spectral (-1) FFT's are required. MM240293.40
DEL2U1A.98
REAL DEL2U1A.99
& SCALAR ! Generic real work variable. DEL2U1A.100
&,FACTOR ! Holds factor in matrix gaussian DEL2U1A.101
& ! elimination. DEL2U1A.102
&,WAVE_NUMBER ! Holds wave number for which fourier DEL2U1A.103
& ! coefficients are being calculated. DEL2U1A.104
DEL2U1A.105
C*L EXTERNAL SUBROUTINE CALLS:------------------------------------ DEL2U1A.106
EXTERNAL FOURIER DEL2U1A.107
C*--------------------------------------------------------------------- DEL2U1A.108
DEL2U1A.109
CL MAXIMUM VECTOR LENGTH ASSUMED IS ROW_LENGTH+2 DEL2U1A.110
CL--------------------------------------------------------------------- DEL2U1A.111
CL INTERNAL STRUCTURE. DEL2U1A.112
CL--------------------------------------------------------------------- DEL2U1A.113
CL DEL2U1A.114
DEL2U1A.115
CL--------------------------------------------------------------------- DEL2U1A.116
CL SECTION 1. Put all RHS data in bigger array before calling DEL2U1A.117
CL fourier decomposition. Two extra addresses per row DEL2U1A.118
CL required. DEL2U1A.119
CL--------------------------------------------------------------------- DEL2U1A.120
DEL2U1A.121
ROWS = U_FIELD/ROW_LENGTH DEL2U1A.122
DEL2U1A.123
CFPP$ NODEPCHK DEL2U1A.124
! Fujitsu vectorization directive GRB0F405.597
!OCL NOVREC GRB0F405.598
DO 100 J=1,ROWS DEL2U1A.125
IK = (J-1)*ROW_LENGTH DEL2U1A.126
DO 110 I=1,ROW_LENGTH DEL2U1A.127
RHS_DATA(I,J) = RHS(IK+I) DEL2U1A.128
110 CONTINUE DEL2U1A.129
100 CONTINUE DEL2U1A.130
DEL2U1A.131
CL--------------------------------------------------------------------- DEL2U1A.132
CL SECTION 2. Call FOURIER to get fourier decomposition of data. DEL2U1A.133
CL--------------------------------------------------------------------- DEL2U1A.134
DEL2U1A.135
INCREMENT = 1 DEL2U1A.136
JUMP = ROW_LENGTH+2 DEL2U1A.137
FFT_ISIGN = -1 MM240293.41
LOT = ROWS DEL2U1A.139
CALL FOURIER
(RHS_DATA,TRIGS,IFAX,INCREMENT,JUMP,ROW_LENGTH, DEL2U1A.140
& LOT,FFT_ISIGN) MM240293.42
DEL2U1A.142
CL--------------------------------------------------------------------- DEL2U1A.143
CL SECTION 3. Solve equation. DEL2U1A.144
CL--------------------------------------------------------------------- DEL2U1A.145
DEL2U1A.146
CL i) Set up tri-diagonal matrix system left-hand-side. DEL2U1A.147
C Real coefficients only. DEL2U1A.148
DEL2U1A.149
SCALAR = EARTH_RADIUS_INVERSE*EARTH_RADIUS_INVERSE* DEL2U1A.150
& LATITUDE_STEP_INVERSE*LATITUDE_STEP_INVERSE DEL2U1A.151
DO J=1,ROW_LENGTH+2,2 DEL2U1A.152
WAVE_NUMBER = (J+1)/2-1 DEL2U1A.153
A_SUB_DIAG(1,J) = 0. DEL2U1A.154
A_SUP_DIAG(ROWS,J) = 0. DEL2U1A.155
DEL2U1A.156
C Set up A matrix. DEL2U1A.157
C Northern boundary condition. DEL2U1A.158
I=1 DEL2U1A.159
K = (I-1)*ROW_LENGTH+1 DEL2U1A.160
A_DIAG(I,J) = -SEC_U_LATITUDE(K)*SCALAR* DEL2U1A.161
& COS_P_LATITUDE(K+ROW_LENGTH) DEL2U1A.162
& - WAVE_NUMBER*WAVE_NUMBER*EARTH_RADIUS_INVERSE DEL2U1A.163
& *EARTH_RADIUS_INVERSE*SEC_U_LATITUDE(K) DEL2U1A.164
& *SEC_U_LATITUDE(K) DEL2U1A.165
A_SUP_DIAG(I,J) = SEC_U_LATITUDE(K)*SCALAR* DEL2U1A.166
& COS_P_LATITUDE(K+ROW_LENGTH) DEL2U1A.167
DEL2U1A.168
C Inner points. DEL2U1A.169
DO 300 I=2,ROWS-1 DEL2U1A.170
K = (I-1)*ROW_LENGTH+1 DEL2U1A.171
A_DIAG(I,J) = -SEC_U_LATITUDE(K)*SCALAR* DEL2U1A.172
& (COS_P_LATITUDE(K)+COS_P_LATITUDE(K+ROW_LENGTH)) DEL2U1A.173
& - WAVE_NUMBER*WAVE_NUMBER*EARTH_RADIUS_INVERSE DEL2U1A.174
& *EARTH_RADIUS_INVERSE*SEC_U_LATITUDE(K) DEL2U1A.175
& *SEC_U_LATITUDE(K) DEL2U1A.176
A_SUP_DIAG(I,J) = SEC_U_LATITUDE(K)*SCALAR* DEL2U1A.177
& COS_P_LATITUDE(K+ROW_LENGTH) DEL2U1A.178
A_SUB_DIAG(I,J) = SEC_U_LATITUDE(K)*SCALAR* DEL2U1A.179
& COS_P_LATITUDE(K) DEL2U1A.180
300 CONTINUE DEL2U1A.181
DEL2U1A.182
C Southern boundary condition. DEL2U1A.183
I=ROWS DEL2U1A.184
K = (I-1)*ROW_LENGTH+1 DEL2U1A.185
A_DIAG(I,J) = -SEC_U_LATITUDE(K)*SCALAR* DEL2U1A.186
& COS_P_LATITUDE(K) DEL2U1A.187
& - WAVE_NUMBER*WAVE_NUMBER*EARTH_RADIUS_INVERSE DEL2U1A.188
& *EARTH_RADIUS_INVERSE*SEC_U_LATITUDE(K) DEL2U1A.189
& *SEC_U_LATITUDE(K) DEL2U1A.190
A_SUB_DIAG(I,J) = SEC_U_LATITUDE(K)*SCALAR* DEL2U1A.191
& COS_P_LATITUDE(K) DEL2U1A.192
END DO DEL2U1A.193
DEL2U1A.194
C Matrix for imaginery coefficients is copy of real one for same wave DEL2U1A.195
C number. DEL2U1A.196
DO 310 J=2,ROW_LENGTH+2,2 DEL2U1A.197
DO I=1,ROWS DEL2U1A.198
A_DIAG(I,J) = A_DIAG(I,J-1) DEL2U1A.199
A_SUB_DIAG(I,J) = A_SUB_DIAG(I,J-1) DEL2U1A.200
A_SUP_DIAG(I,J) = A_SUP_DIAG(I,J-1) DEL2U1A.201
END DO DEL2U1A.202
310 CONTINUE DEL2U1A.203
DEL2U1A.204
CL ii) Solve matrix system for all right-hand-sides. DEL2U1A.205
DEL2U1A.206
DO 320 J=1,ROW_LENGTH+2 DEL2U1A.207
A_DIAG(1,J) = 1./A_DIAG(1,J) DEL2U1A.208
320 CONTINUE DEL2U1A.209
DO 330 I=2,ROWS DEL2U1A.210
DO J=1,ROW_LENGTH+2 DEL2U1A.211
FACTOR = A_SUB_DIAG(I,J) * A_DIAG(I-1,J) DEL2U1A.212
A_DIAG(I,J) = 1./(A_DIAG(I,J) - FACTOR*A_SUP_DIAG(I-1,J)) DEL2U1A.213
RHS_DATA(J,I) = RHS_DATA(J,I) - FACTOR*RHS_DATA(J,I-1) DEL2U1A.214
END DO DEL2U1A.215
330 CONTINUE DEL2U1A.216
DEL2U1A.217
C Back substitute to get solution. DEL2U1A.218
DEL2U1A.219
DO 340 J=1,ROW_LENGTH+2 DEL2U1A.220
Q_DATA(J,ROWS) = A_DIAG(ROWS,J)*RHS_DATA(J,ROWS) DEL2U1A.221
340 CONTINUE DEL2U1A.222
DO 350 I= ROWS-1,1,-1 DEL2U1A.223
DO J=1,ROW_LENGTH+2 DEL2U1A.224
Q_DATA(J,I) = A_DIAG(I,J)*(RHS_DATA(J,I)- DEL2U1A.225
& A_SUP_DIAG(I,J)*Q_DATA(J,I+1)) DEL2U1A.226
END DO DEL2U1A.227
350 CONTINUE DEL2U1A.228
DEL2U1A.229
C Set constant imaginery mode to zero. DEL2U1A.230
C Remove arbitrary constant from real constant mode. DEL2U1A.231
C Remove mean value as guess to arbitrary constant. DEL2U1A.232
DEL2U1A.233
DO I=1,ROWS DEL2U1A.234
Q_DATA(2,I) = 0. DEL2U1A.235
END DO DEL2U1A.236
SCALAR = 0. DEL2U1A.237
DO I=1,ROWS DEL2U1A.238
SCALAR = SCALAR + Q_DATA(1,I) DEL2U1A.239
END DO DEL2U1A.240
SCALAR = SCALAR / ROWS DEL2U1A.241
DO I=1,ROWS DEL2U1A.242
Q_DATA(1,I) = Q_DATA(1,I) - SCALAR DEL2U1A.243
END DO DEL2U1A.244
DEL2U1A.245
CL--------------------------------------------------------------------- DEL2U1A.246
CL SECTION 4. Call FOURIER to create grid-point fields from DEL2U1A.247
CL fourier solution modes. DEL2U1A.248
CL--------------------------------------------------------------------- DEL2U1A.249
DEL2U1A.250
INCREMENT = 1 DEL2U1A.251
JUMP = ROW_LENGTH+2 DEL2U1A.252
FFT_ISIGN = 1 MM240293.43
CALL FOURIER
(Q_DATA,TRIGS,IFAX,INCREMENT,JUMP,ROW_LENGTH, DEL2U1A.254
& LOT,FFT_ISIGN) MM240293.44
DEL2U1A.256
CL--------------------------------------------------------------------- DEL2U1A.257
CL SECTION 5. Copy solution into output array. DEL2U1A.258
CL--------------------------------------------------------------------- DEL2U1A.259
DEL2U1A.260
DO 500 J=1,ROWS DEL2U1A.261
IK = (J-1)*ROW_LENGTH DEL2U1A.262
DO 510 I=1,ROW_LENGTH DEL2U1A.263
Q(IK+I) = Q_DATA(I,J) DEL2U1A.264
510 CONTINUE DEL2U1A.265
500 CONTINUE DEL2U1A.266
DEL2U1A.267
CL END OF ROUTINE DEL_SQUARED_FFT_U DEL2U1A.268
DEL2U1A.269
RETURN DEL2U1A.270
END DEL2U1A.271
*ENDIF DEL2U1A.272