*IF DEF,C93_1A,OR,DEF,C93_2A GNF0F402.20 C ******************************COPYRIGHT****************************** GTS2F400.8533 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.8534 C GTS2F400.8535 C Use, duplication or disclosure of this code is subject to the GTS2F400.8536 C restrictions as set forth in the contract. GTS2F400.8537 C GTS2F400.8538 C Meteorological Office GTS2F400.8539 C London Road GTS2F400.8540 C BRACKNELL GTS2F400.8541 C Berkshire UK GTS2F400.8542 C RG12 2SZ GTS2F400.8543 C GTS2F400.8544 C If no contract has been raised with this copy of the code, the use, GTS2F400.8545 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.8546 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.8547 C Modelling at the above address. GTS2F400.8548 C ******************************COPYRIGHT****************************** GTS2F400.8549 C GTS2F400.8550 CLL SUBROUTINE SETFILT ------------------------------------------ SETF1A.3 CLL SETF1A.4 CLL PURPOSE: SETF1A.5 CLL SUBROUTINE 'SETFILT' - COMPUTES FACTORS OF N & TRIGONOMETRIC SETF1A.6 CLL FUNCTIONS REQUIRED BY FOURIER, FFT99 & FFT991 SETF1A.7 CLL UNIFIED MODEL RE-WRITE OF ECMWF ROUTINE SET99 SETF1A.8 CLL ALSO CALCULATES TWO_D_GRID_CORRECTION FACTORS USED IN SET_FIL SETF1A.9 CLL SETF1A.10 CLL NOT SUITABLE FOR SINGLE COLUMN USE. SETF1A.11 CLL SETF1A.12 CLL REWRITTEN TO UNIFIED MODEL PROGRAMMING STANDARDS FROM ECMWF SETF1A.13 CLL CODE BY M.H.MAWSON; ORIGINAL CODE WRITER C. TEMPERTON SETF1A.14 CLL SETF1A.15 CLL MODEL MODIFICATION HISTORY FROM MODEL VERSION 3.0: SETF1A.16 CLL 3.1 24/02/93 Tidy code to remove QA Fortran messages. MM240293.4 ! 4.1 19/06/95 Added MPP code and argument ROWS P.Burton APB7F401.669 CLL vn4.2 07/11/96:Allow this routine to be used in C93_2A (Farnon) GNF0F402.19 CLL SETF1A.18 CLL PROGRAMMING STANDARD: UNIFIED MODEL DOCUMENTATION PAPER NO. 4, SETF1A.19 CLL STANDARD B. VERSION 2, DATED 18/01/90 SETF1A.20 CLL SYSTEM TASK: P1 SETF1A.21 CLL SETF1A.22 CLL DOCUMENTATION: UNIFIED MODEL DOCUMENTATION PAPER NUMBER 10 SETF1A.23 CLL M.J.P. CULLEN, T. DAVIES AND M.H. MAWSON SETF1A.24 CLL VERSION 8 DATED 1/05/90. SETF1A.25 CLLEND------------------------------------------------------------- SETF1A.26 SETF1A.27 C*L ARGUMENT LIST SETF1A.28 SETF1A.29SUBROUTINE SETFILT(TRIGS,IFAX,N,ROWS,TWO_D_GRID_CORRECTION, 2APB7F401.670 & P_FIELD, COS_P_LATITUDE) APB7F401.671 SETF1A.32 IMPLICIT NONE SETF1A.33 SETF1A.34 INTEGER SETF1A.35 * IFAX(10) !OUT HOLDS FACTORS OF N SETF1A.36 SETF1A.37 INTEGER SETF1A.38 * N !IN NUMBER OF POINTS OF DATA ON A SLICE SETF1A.39 *, ROWS !IN NUMBER OF ROWS IN P_FIELD APB7F401.672 *, P_FIELD !IN HOLDS NUMBER OF POINTS IN THE FIELD. SETF1A.40 SETF1A.41 REAL SETF1A.42 * COS_P_LATITUDE(P_FIELD) !IN COSINE OF LATITUDE AT P POINTS. SETF1A.43 SETF1A.44 REAL SETF1A.45 * TRIGS(N) !OUT HOLDS TRIGONOMETRIC FUNCTIONS NEEDED BY SETF1A.46 * ! FOURIER, FFT99 AND FFT991 SETF1A.47 *, TWO_D_GRID_CORRECTION(ROWS) !OUT HOLDS FACTOR ON APB7F401.673 * ! EACH ROW WHICH MODIFIES THE STABILITY SETF1A.49 * ! RELATION EQUATION (50) SO THAT IT TAKES INTO SETF1A.50 * ! ACCOUNT THE 2-D NATURE OF THE GRID. SETF1A.51 C* -------------------------------------------------------------- SETF1A.52 *IF DEF,MPP APB7F401.674 *CALL PARVARS
APB7F401.675 *CALL PARFFTS
APB7F401.676 *ENDIF APB7F401.677 SETF1A.53 C*L WORKSPACE. 2 ARRAYS ARE REQUIRED ---------------------------- SETF1A.54 INTEGER SETF1A.55 * JFAX(10) ! HOLDS FACTORS OF N BEFORE THEY ARE ORDERED SETF1A.56 * ! AND STORED IN IFAX SETF1A.57 * ,LFAX(8) ! HOLDS LIST OF VALID FACTORS. LAST VALUE IS SETF1A.58 * ! MINUS PENULTIMATE ONE. THIS IS USED TO SETF1A.59 * ! SEND CODE TO THE ERROR MESSAGE AS N CONTAINS SETF1A.60 * ! AN INVALID FACTOR. SETF1A.61 C* -------------------------------------------------------------- SETF1A.62 SETF1A.63 C*L NO EXTERNAL ROUTINES --------------------------------------- SETF1A.64 C* --------------------------------------------------------------- SETF1A.65 SETF1A.66 C LOCAL VARIABLES SETF1A.67 REAL SETF1A.68 * DEL ! HOLDS ANGLE IN RADIANS BETWEEN POINTS ON LATITUDE SETF1A.69 * ! CIRCLE SETF1A.70 * ,ANGLE ! HOLDS ANGLE IN RADIANS AT A POINT ON THE LATITUDE SETF1A.71 * ! CIRCLE SETF1A.72 SETF1A.73 INTEGER SETF1A.74 * K ! LOOP COUNTER SETF1A.75 * ,I ! LOOP COUNTER SETF1A.76 * ,NU ! HOLDS CURRENT FACTORISED VALUE OF N SETF1A.77 * ,IFAC ! HOLDS CURRENT FACTOR BEING TESTED FOR SETF1A.78 * ,L ! HOLDS CURRENT POSITION IN LFAX ARRAY SETF1A.79 * ,NFAX ! HOLDS TOTAL NUMBER OF FACTORS OF N SETF1A.80 SETF1A.82 CL SETF1A.83 CL ---------------------------------------------------------------- SETF1A.84 CL SECTION 1. INITIALISATION. SETF1A.85 CL ---------------------------------------------------------------- SETF1A.86 SETF1A.87 LFAX(1)=6 SETF1A.89 LFAX(2)=8 SETF1A.90 LFAX(3)=5 SETF1A.91 LFAX(4)=4 SETF1A.92 LFAX(5)=3 SETF1A.93 LFAX(6)=2 SETF1A.94 LFAX(7)=1 SETF1A.95 LFAX(8)=-1 SETF1A.96 SETF1A.97 CL SETF1A.98 CL ---------------------------------------------------------------- SETF1A.99 CL SECTION 2. SET TRIGONOMETRIC FUNCTIONS SETF1A.100 CL ---------------------------------------------------------------- SETF1A.101 SETF1A.102 DEL=4.0*ASIN(1.0)/N MM240293.5 DO 200 K=0,N/2-1 SETF1A.104 ANGLE=K*DEL MM240293.6 *IF -DEF,MPP APB7F401.678 TRIGS(2*K+1)=COS(ANGLE) SETF1A.106 TRIGS(2*K+2)=SIN(ANGLE) SETF1A.107 *ELSE APB7F401.679 ! Set global_trigs array - carried by COMMON info FILTER APB7F401.680 global_trigs(2*K+1)=COS(ANGLE) APB7F401.681 global_trigs(2*K+2)=SIN(ANGLE) APB7F401.682 *ENDIF APB7F401.683 200 CONTINUE SETF1A.108 SETF1A.109 CL SETF1A.110 CL ---------------------------------------------------------------- SETF1A.111 CL SECTION 3. FIND FACTORS OF N (8,6,5,4,3,2; ONLY ONE 8 ALLOWED) SETF1A.112 CL STORE FACTORS IN DESCENDING ORDER. SETF1A.113 CL ---------------------------------------------------------------- SETF1A.114 SETF1A.115 C LOOK FOR SIXES FIRST AND STORE FACTORS IN DESCENDING ORDER SETF1A.116 NU=N SETF1A.117 IFAC=6 SETF1A.118 C K HOLDS NUMBER OF FACTORS FOUND. L IS USED TO MOVE THROUGH LIST OF SETF1A.119 C VALID FACTORS. SETF1A.120 K=0 SETF1A.121 L=1 SETF1A.122 300 CONTINUE SETF1A.123 IF (MOD(NU,IFAC).EQ.0) THEN SETF1A.124 C IF IFAC IS A FACTOR OF N. SETF1A.125 K=K+1 SETF1A.126 JFAX(K)=IFAC SETF1A.127 IF (IFAC.EQ.8.AND.K.NE.1) THEN SETF1A.128 JFAX(1)=8 SETF1A.129 JFAX(K)=6 SETF1A.130 ENDIF SETF1A.131 NU=NU/IFAC SETF1A.132 C IF N FACTORISES COMPLETELY JUMP PAST ERROR MESSAGE SETF1A.133 IF(NU.EQ.1) GO TO 310 SETF1A.134 C IF FACTOR IS NOT AN 8 SEE IF IT APPEARS MORE THAN ONCE. SETF1A.135 IF(IFAC.NE.8) GO TO 300 SETF1A.136 ENDIF SETF1A.137 L=L+1 SETF1A.138 IFAC=LFAX(L) SETF1A.139 C IF NOT COMPLETELY FACTORISED GO BACK TO TOP OF PROCEDURE SETF1A.140 IF(IFAC.GT.1) GO TO 300 SETF1A.141 SETF1A.142 C ILLEGAL FACTOR IN N. PRINT ERROR MESSAGE THEN JUMP TO END OF SETF1A.143 C ROUTINE. SETF1A.144 SETF1A.145 WRITE(6,1300) N SETF1A.146 1300 FORMAT(' ERROR IN SETFILT. N = ',I4,' CONTAINS AN ILLEGAL FACTOR') SETF1A.147 GO TO 330 SETF1A.148 SETF1A.149 C NOW REVERSE ORDER OF FACTORS SO THAT THEY ARE IN ASCENDING ORDER SETF1A.150 SETF1A.151 310 CONTINUE SETF1A.152 NFAX=K SETF1A.153 IFAX(1)=NFAX SETF1A.154 DO 320 I=1,NFAX SETF1A.155 IFAX(NFAX+2-I)=JFAX(I) SETF1A.156 320 CONTINUE SETF1A.157 IFAX(10)=N SETF1A.158 330 CONTINUE SETF1A.159 SETF1A.160 CL SETF1A.161 CL ---------------------------------------------------------------- SETF1A.162 CL SECTION 4. CALCULATE 2-D GRID CORRECTION TERM. SETF1A.163 CL SEE DOC. PAPER 10 SECTION 3.5. SETF1A.164 CL ---------------------------------------------------------------- SETF1A.165 SETF1A.166 CL CALCULATION NOT PERFORMED ON POLAR ROWS. SETF1A.167 *IF -DEF,MPP APB7F401.684 TWO_D_GRID_CORRECTION(1) = 0. SETF1A.168 TWO_D_GRID_CORRECTION(ROWS) = 0. SETF1A.169 DO 400 I=2,ROWS-1 SETF1A.170 TWO_D_GRID_CORRECTION(I) = (1.+4.*(ROWS-1.)*(ROWS-1.)/(N*N) SETF1A.171 * *COS_P_LATITUDE(I*N) SETF1A.172 * *COS_P_LATITUDE(I*N))**.5 SETF1A.173 400 CONTINUE SETF1A.174 *ELSE APB7F401.685 DO I=1+Offy,ROWS-Offy APB7F401.686 TWO_D_GRID_CORRECTION(I) = APB7F401.687 & (1.+4.*(glsize(2)-1.)*(glsize(2)-1.)/(glsize(1)*glsize(1))* APB7F401.688 & COS_P_LATITUDE(I*lasize(1))*COS_P_LATITUDE(I*lasize(1)))**0.5 APB7F401.689 ENDDO APB7F401.690 APB7F401.691 IF (attop) TWO_D_GRID_CORRECTION(1+Offy)=0.0 APB7F401.692 IF (atbase) TWO_D_GRID_CORRECTION(ROWS-Offy)=0.0 APB7F401.693 *ENDIF APB7F401.694 SETF1A.175 CL END OF ROUTINE SETFILT SETF1A.176 RETURN SETF1A.177 END SETF1A.178 *ENDIF SETF1A.179