*IF DEF,CONTROL,AND,DEF,OCEAN,OR,DEF,CONVPP,OR,DEF,CONVIEEE UDG1F405.31 C ******************************COPYRIGHT****************************** GTS2F400.10819 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.10820 C GTS2F400.10821 C Use, duplication or disclosure of this code is subject to the GTS2F400.10822 C restrictions as set forth in the contract. GTS2F400.10823 C GTS2F400.10824 C Meteorological Office GTS2F400.10825 C London Road GTS2F400.10826 C BRACKNELL GTS2F400.10827 C Berkshire UK GTS2F400.10828 C RG12 2SZ GTS2F400.10829 C GTS2F400.10830 C If no contract has been raised with this copy of the code, the use, GTS2F400.10831 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.10832 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.10833 C Modelling at the above address. GTS2F400.10834 C ******************************COPYRIGHT****************************** GTS2F400.10835 C GTS2F400.10836 CLL Routines: UNPACK -------------------------------------------------- UNPACK1.3 CLL UNPACK1.4 CLL Purpose: This subroutine uses the index arrays UNPACK1.5 CLL INDEX_COMP(N_SEG), INDEX_EXP(N_SEG) and UNPACK1.6 CLL INDEX_TO_ROWS(MAX_ROW,MAX_LEVEL) to unpack data UNPACK1.7 CLL FROM T_COMP(N_COMP) into T_EXP(IMAX,JMAX,KMAX) UNPACK1.8 CLL UNPACK1.9 CLL Tested under compiler: cft77,(cf77 -ZP) UNPACK1.10 CLL Tested under OS version: UNICOS 5.1 UNPACK1.11 CLL UNPACK1.12 CLL Author: S.J.Nightingale UNPACK1.13 CLL UNPACK1.14 CLL Model Modification history from model version 3.0: UNPACK1.15 CLL version date UNPACK1.16 CLL UNPACK1.17 CLL Programming standard : UMDP PAPER 3 UNPACK1.18 CLL UNPACK1.19 CLL system components covered : F4 UNPACK1.20 CLL UNPACK1.21 CLL External documentation: UNPACK1.22 CLL UNPACK1.23 CLLEND----------------------------------------------------------------- UNPACK1.24 C*L UNPACK1.25SUBROUTINE UNPACK(J1,J2,K1,K2,MAX_ROW,MAX_LEVEL, 22UNPACK1.26 *IMAX,JMAX,KMAX,INDEX_COMP,INDEX_EXP,N_SEG,INDEX_TO_ROWS, UNPACK1.27 *N_COMP,T_COMP,T_EXP,REAL_MDI,CYCLIC) UNPACK1.28 C* UNPACK1.29 IMPLICIT NONE UNPACK1.30 CL Argument variables UNPACK1.31 INTEGER UNPACK1.32 * J1 ! (IN) FIRST ROW OF DATA TO BE UNPACKED UNPACK1.33 *,J2 ! (IN) LAST ROW OF DATA TO BE UNPACKED UNPACK1.34 *,K1 ! (IN) FIRST LEVEL OF DATA TO BE UNPACKED UNPACK1.35 *,K2 ! (IN) LAST LEVEL OF DATA TO BE UNPACKED UNPACK1.36 *,IMAX ! (IN) NUMBER OF POINTS EAST-WEST UNPACK1.37 *,JMAX ! (IN) NUMBER OF POINTS NORTH-SOUTH UNPACK1.38 *,KMAX ! (IN) NUMBER OF POINTS IN VERTICAL UNPACK1.39 *,N_SEG ! (IN) TOTAL NUMBER OF SEA SEGMENTS UNPACK1.40 *,N_COMP ! (IN) DIMENSION OF COMPRESSED ARRAY UNPACK1.41 *,MAX_ROW ! (IN) UPPER LIMIT ON JMAX UNPACK1.42 *,MAX_LEVEL ! (IN) UPPER LIMIT ON KMAX UNPACK1.43 *,INDEX_COMP(N_SEG) ! (IN) CONTAINS POSITIONS IN COMPRESSED ARRAY UNPACK1.44 C ! OF START OF EACH SEA SEGMENT UNPACK1.45 *,INDEX_EXP(N_SEG) ! (IN) CONTAINS POSITIONS IN 1-DIMENSIONAL UNPACK1.46 C ! EXPANDED ARRAY UNPACK1.47 C ! T_EXP_1_D(IMAX*MAX_ROW*MAX_LEVEL) UNPACK1.48 C ! OF START OF EACH SEA SEGMENT UNPACK1.49 *,INDEX_TO_ROWS(MAX_ROW,MAX_LEVEL) ! (IN) CONTAINS NUMBER OF FIRST UNPACK1.50 C ! SEA SEGMENT IN EACH ROW UNPACK1.51 C ! AT EACH LEVEL IF THERE IS A UNPACK1.52 C ! SEA SEGMENT IN THE ROW UNPACK1.53 C ! CONTAINS NUMBER OF NEXT UNPACK1.54 C ! SEA SEGMENT OTHERWISE UNPACK1.55 *,I_DATA ! NUMBER OF DISTINCT DATA POINTS EAST-WEST UNPACK1.56 UNPACK1.57 REAL UNPACK1.58 * REAL_MDI ! (IN) REAL MISSING DATA INDICATOR UNPACK1.59 *,T_COMP(N_COMP) ! (IN) COMPRESSED ARRAY UNPACK1.60 *,T_EXP(IMAX,JMAX,KMAX) ! (OUT) 3-DIMENSIONAL EXPANDED ARRAY UNPACK1.61 UNPACK1.62 LOGICAL UNPACK1.63 * CYCLIC ! (IN) INDICATES WHETHER T_EXP(IMAX,JMAX,KMAX) INCLUDES UNPACK1.64 C ! DATA FOR CYCLIC WRAP-AROUND POINTS UNPACK1.65 UNPACK1.66 CL Local variables UNPACK1.67 INTEGER UNPACK1.68 * J60 ! LOCAL LOOP INDEX FOR 60 UNPACK1.69 *,JSPAN ! LOCAL NUMBER OF ITERATIONS OF ROWS UNPACK1.70 *,KSPAN ! LOCAL NUMBER OF ITERATIONS OF LEVELS UNPACK1.71 *,I ! LOCAL LOOP INDEX FOR COLUMNS UNPACK1.72 *,J ! LOCAL LOOP INDEX FOR ROWS UNPACK1.73 *,K ! LOCAL LOOP INDEX FOR LEVELS UNPACK1.74 *,JN,KN ! LOCAL VARIABLES UNPACK1.75 *,NUM_SEG ! NUMBER OF SEA SEGMENTS IN PRESENT ROW UNPACK1.76 *,LEN_SEG ! LENGTH OF PRESENT SEA SEGMENT UNPACK1.77 *,COUNT ! LOCAL COUNTER FOR POINTS IN A SEA SEGMENT UNPACK1.78 *,SEG ! LOCAL LOOP INDEX FOR SEA SEGMENTS IN PRESENT ROW UNPACK1.79 *,SEG_POS ! LOCAL COUNTER FOR SEA SEGMENTS UNPACK1.80 *,X_POS ! LOCAL COUNTER FOR POINTS IN A ROW UNPACK1.81 *,IPOINT_EXP ! LOCAL POINTER TO EXPANDED ARRAY UNPACK1.82 *,IPOINT_COMP ! LOCAL POINTER TO COMPRESSED ARRAY UNPACK1.83 UNPACK1.84 CL--------------------------------------------------------------------- UNPACK1.85 CL 1. Fill the expanded array with real missing data indicators UNPACK1.86 UNPACK1.87 DO 30,K=1,KMAX UNPACK1.88 DO 20,J=1,JMAX UNPACK1.89 DO 10,I=1,IMAX UNPACK1.90 T_EXP(I,J,K)=REAL_MDI UNPACK1.91 10 CONTINUE UNPACK1.92 20 CONTINUE UNPACK1.93 30 CONTINUE UNPACK1.94 CL---------------------------------------------------------------------- UNPACK1.95 CL 2. Set the wrap-around parameters UNPACK1.96 UNPACK1.97 IF (CYCLIC) THEN UNPACK1.98 I_DATA=IMAX-2 UNPACK1.99 ELSE UNPACK1.100 I_DATA=IMAX UNPACK1.101 END IF UNPACK1.102 CL---------------------------------------------------------------------- UNPACK1.103 CL 3. Unpack levels and rows UNPACK1.104 CL 3.1 Set the number of iterations over rows and levels UNPACK1.105 JSPAN = J2 - J1 + 1 UNPACK1.106 KSPAN = K2 - K1 + 1 UNPACK1.107 UNPACK1.108 CL 3.2 Force multitasking over rows-levels loop UNPACK1.109 CMIC$ DO ALL SHARED(MAX_ROW,K1,K2,J1,J2,MAX_LEVEL,N_SEG,N_COMP, UNPACK1.110 CMIC$1 I_DATA,INDEX_TO_ROWS,INDEX_COMP,INDEX_EXP, UNPACK1.111 CMIC$2 T_EXP,JSPAN,KSPAN,T_COMP) UNPACK1.112 CMIC$3 PRIVATE(K,J,JN,KN,NUM_SEG,SEG_POS,LEN_SEG,IPOINT_EXP, UNPACK1.113 CMIC$4 IPOINT_COMP,X_POS,COUNT,SEG,J60) UNPACK1.114 DO 60,J60=0,JSPAN*KSPAN-1 UNPACK1.115 UNPACK1.116 CL 3.3 Set up 2-d loop indices UNPACK1.117 UNPACK1.118 K = J60/JSPAN UNPACK1.119 J = J60 - K*JSPAN + J1 UNPACK1.120 K = K + K1 UNPACK1.121 UNPACK1.122 CL 3.4 Define the next row and level UNPACK1.123 UNPACK1.124 IF (J.EQ.MAX_ROW) THEN UNPACK1.125 JN=1 UNPACK1.126 KN=K+1 UNPACK1.127 ELSE UNPACK1.128 JN=J+1 UNPACK1.129 KN=K UNPACK1.130 END IF UNPACK1.131 UNPACK1.132 CL 3.5 Calculate the number of segments in the present row UNPACK1.133 UNPACK1.134 IF (KN.GT.MAX_LEVEL) THEN UNPACK1.135 NUM_SEG=N_SEG-INDEX_TO_ROWS(J,K)+1 UNPACK1.136 ELSE UNPACK1.137 NUM_SEG=INDEX_TO_ROWS(JN,KN)-INDEX_TO_ROWS(J,K) UNPACK1.138 END IF UNPACK1.139 UNPACK1.140 DO 50,SEG=1,NUM_SEG UNPACK1.141 SEG_POS=INDEX_TO_ROWS(J,K)+SEG-1 UNPACK1.142 UNPACK1.143 CL 3.6 Calculate the length of the present sea segment UNPACK1.144 UNPACK1.145 IF (SEG_POS.LT.N_SEG) THEN UNPACK1.146 LEN_SEG=INDEX_COMP(SEG_POS+1)-INDEX_COMP(SEG_POS) UNPACK1.147 ELSE UNPACK1.148 LEN_SEG=N_COMP-INDEX_COMP(SEG_POS)+1 UNPACK1.149 END IF UNPACK1.150 UNPACK1.151 CL 3.7 Calculate t_exp(i,j,k) for each point in the segment UNPACK1.152 UNPACK1.153 DO 40,COUNT=1,LEN_SEG UNPACK1.154 IPOINT_EXP=INDEX_EXP(SEG_POS)+COUNT-1 UNPACK1.155 IPOINT_COMP=INDEX_COMP(SEG_POS)+COUNT-1 UNPACK1.156 X_POS=IPOINT_EXP-(K-1)*I_DATA*MAX_ROW-(J-1)*I_DATA UNPACK1.157 T_EXP(X_POS,J-J1+1,K-K1+1)=T_COMP(IPOINT_COMP) UNPACK1.158 40 CONTINUE UNPACK1.159 50 CONTINUE UNPACK1.160 60 CONTINUE UNPACK1.161 CL---------------------------------------------------------------------- UNPACK1.162 CL 4. Calculate t_exp(i,j,k) for wrap-around points if necessary UNPACK1.163 UNPACK1.164 IF (CYCLIC) THEN UNPACK1.165 DO 90,K=1,KMAX UNPACK1.166 DO 80,J=1,JMAX UNPACK1.167 T_EXP(IMAX-1,J,K)=T_EXP(1,J,K) UNPACK1.168 T_EXP(IMAX,J,K)=T_EXP(2,J,K) UNPACK1.169 80 CONTINUE UNPACK1.170 90 CONTINUE UNPACK1.171 END IF UNPACK1.172 UNPACK1.173 RETURN UNPACK1.174 END UNPACK1.175 *ENDIF UNPACK1.176