*IF DEF,C70_1A GLW1F404.2 C ******************************COPYRIGHT****************************** GTS2F400.181 C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved. GTS2F400.182 C GTS2F400.183 C Use, duplication or disclosure of this code is subject to the GTS2F400.184 C restrictions as set forth in the contract. GTS2F400.185 C GTS2F400.186 C Meteorological Office GTS2F400.187 C London Road GTS2F400.188 C BRACKNELL GTS2F400.189 C Berkshire UK GTS2F400.190 C RG12 2SZ GTS2F400.191 C GTS2F400.192 C If no contract has been raised with this copy of the code, the use, GTS2F400.193 C duplication or disclosure of it is strictly prohibited. Permission GTS2F400.194 C to do so must first be obtained in writing from the Head of Numerical GTS2F400.195 C Modelling at the above address. GTS2F400.196 C ******************************COPYRIGHT****************************** GTS2F400.197 C GTS2F400.198 CLL Subroutine ADDRESS_CHECK -------------------------------------- ADDRCHK1.3 CLL ADDRCHK1.4 CLL Purpose : Check that start addresses of fields read in agree ADDRCHK1.5 CLL with start addresses set up by UI. Called in INITDUMP ADDRCHK1.6 CLL if prognostic fields read in from atmos or ocean dumps. ADDRCHK1.7 CLL ADDRCHK1.8 CLL Model Date Modification history: ADDRCHK1.9 CLL version ADDRCHK1.10 CLL 3.2 25/05/93 New routine. D Robinson ADDRCHK1.11 CLL 3.4 16/6/94 : Change CHARACTER*(*) to CHARACTER*(80) N.Farnon ANF0F304.3 CLL 3.5 May 95 Submodels project. Inserted *CALL CSUBMODL, GSS1F305.140 CLL *CALL CPPXREF, *CALL ARGPPX, *CALL PPXLOOK GSS1F305.141 CLL to pass ppxref lookup arrays to F_TYPE. GSS1F305.142 CLL Modified reference to SI to take account of GSS1F305.143 CLL submodel partitioning. GSS1F305.144 CLL S.J.Swarbrick GSS1F305.145 CLL 4.0 05/01/96 Get Internal identifier from LOOKUP(45) to GDR8F400.40 CLL determine im_index for SI array. D. Robinson GDR8F400.41 CLL 4.1 21/03/96 MPP code : Added MPP_DUMP_ADDR/LEN arguments for GPB0F401.81 CLL use when checking dump addressing against stash GPB0F401.82 CLL addressing. P.Burton GPB0F401.83 CLL 4.1 23/05/96 Remove internal_model from argument list. WRB1F401.1 CLL D. Robinson WRB1F401.2 CLL 4.4 01/09/97 Add helpful message after consistency checks. RTHB. ARB1F404.1 CLL ADDRCHK1.12 CLL Programming Standard : UM documentation paper no. 3 ADDRCHK1.13 CLL version no. 1, dated 15/01/90 ADDRCHK1.14 CLL ADDRCHK1.15 CLL Documentation : None ADDRCHK1.16 CLL ADDRCHK1.17 CLLEND-------------------------------------------------------------- ADDRCHK1.18 C ADDRCHK1.19 C*L Arguments ADDRCHK1.20 ADDRCHK1.21 *IF -DEF,MPP GPB0F401.84SUBROUTINE ADDRESS_CHECK (LOOKUP,LEN1_LOOKUP,LEN2_LOOKUP, 5,1ADDRCHK1.22 *ELSE GPB0F401.85
SUBROUTINE ADDRESS_CHECK (LOOKUP,MPP_DUMP_ADDR,MPP_DUMP_LEN, 5,1GPB0F401.86 & LEN1_LOOKUP,LEN2_LOOKUP, GPB0F401.87 *ENDIF GPB0F401.88 + SI,NITEMS,NSECTS,LEN_DATA, ADDRCHK1.23 *CALL ARGPPX
GSS1F305.146 & ICODE,CMESSAGE) WRB1F401.3 ADDRCHK1.25 IMPLICIT NONE ADDRCHK1.26 ADDRCHK1.27 *CALL CSUBMODL
GSS1F305.148 *CALL CPPXREF
GSS1F305.149 *CALL PPXLOOK
GSS1F305.150 GSS1F305.151 INTEGER ADDRCHK1.28 + LEN1_LOOKUP ! 1st dimension of lookup table WRB1F401.4 + ,LEN2_LOOKUP ! 2nd dimension of lookup table ADDRCHK1.30 + ,LOOKUP(LEN1_LOOKUP,LEN2_LOOKUP) ! Lookup table ADDRCHK1.31 *IF DEF,MPP GPB0F401.89 + ,MPP_DUMP_ADDR(LEN2_LOOKUP) ! Addresses of fields as GPB0F401.90 ! ! calculated in READDUMP. GPB0F401.91 + ,MPP_DUMP_LEN(LEN2_LOOKUP) ! Lengths of fields as GPB0F401.92 ! ! calculated in READDUMP. GPB0F401.93 GPB0F401.94 *ENDIF GPB0F401.95 + ,LEN_DATA ! Expected length of data ADDRCHK1.32 + ,NITEMS ! No of stash items ADDRCHK1.33 + ,NSECTS ! No of stash sections ADDRCHK1.34 ! Stash item addresses GSS1F305.154 + ,SI(NITEMS,0:NSECTS,N_INTERNAL_MODEL) GSS1F305.155 + ,ICODE ! Return code ADDRCHK1.36 ADDRCHK1.37 CHARACTER*(80) ANF0F304.4 + CMESSAGE ! Error message ADDRCHK1.39 ADDRCHK1.40 CL Dynamic allocation of arrays for F_TYPE ADDRCHK1.41 INTEGER ADDRCHK1.42 + PP_NUM (LEN2_LOOKUP) ADDRCHK1.43 + ,PP_LEN (LEN2_LOOKUP) ADDRCHK1.44 + ,PP_POS (LEN2_LOOKUP) ADDRCHK1.45 + ,PP_LS (LEN2_LOOKUP) ADDRCHK1.46 + ,PP_STASH (LEN2_LOOKUP) ADDRCHK1.47 + ,PP_TYPE (LEN2_LOOKUP) ADDRCHK1.48 ADDRCHK1.49 CL Local array ADDRCHK1.50 INTEGER FIXHD(256) ! Dummy array until removed from F_TYPE ADDRCHK1.51 ADDRCHK1.52 CL Local variables ADDRCHK1.53 INTEGER ADDRCHK1.54 + ADDRESS_STASH ADDRCHK1.55 + ,ADDRESS_LOOKUP ADDRCHK1.56 + ,ITEM_CODE ADDRCHK1.57 + ,J ADDRCHK1.58 + ,LEN ADDRCHK1.59 + ,N_TYPES ADDRCHK1.60 + ,SECT_NO ADDRCHK1.61 + ,im_ident ! Internal model identifier GDR8F400.42 + ,im_index ! Position of int mod id in INTERNAL_MODEL_LIST GSS1F305.156 &,OLD_STASH ! VALUE OF STASH NUMBER ON PREVIOUS ITERATION OF LOOP ADDRCHK1.62 ADDRCHK1.63 CHARACTER*80 TITLE ADDRCHK1.64 ADDRCHK1.65 CL Subroutines called ADDRCHK1.66 EXTERNAL F_TYPE ADDRCHK1.67 ADDRCHK1.68 C*--------------------------------------------------------------------- ADDRCHK1.69 C ADDRCHK1.70 C SET INITIAL VALUE OF PREVIOUS STASH NUMBER ADDRCHK1.71 C ADDRCHK1.72 OLD_STASH = -1 ADDRCHK1.73 C ADDRCHK1.74 CL Internal Structure ADDRCHK1.75 ADDRCHK1.76 TITLE = 'Prognostic fields' ADDRCHK1.77 C modify f_type later to add len1_lookup and remove fixhd ADDRCHK1.78 CALL F_TYPE
(LOOKUP,LEN2_LOOKUP,PP_NUM,N_TYPES,PP_LEN, ADDRCHK1.79 + PP_STASH,PP_TYPE,PP_POS,PP_LS,FIXHD, GSS1F305.157 *CALL ARGPPX
GSS1F305.158 +TITLE) GSS1F305.159 ADDRCHK1.81 DO J=1,N_TYPES ADDRCHK1.82 ADDRCHK1.83 C Get Stash Section no and Item Code ADDRCHK1.84 ITEM_CODE = MOD ( PP_STASH(J),1000) ADDRCHK1.85 SECT_NO = (PP_STASH(J)-ITEM_CODE)/1000 ADDRCHK1.86 GDR8F400.43 ! Get im_ident/index for this field GDR8F400.44 im_ident = LOOKUP(45,pp_pos(j)) GDR8F400.45 im_index = INTERNAL_MODEL_INDEX(im_ident) GDR8F400.46 GDR8F400.47 C Get lookup and stash start address ADDRCHK1.88 *IF -DEF,MPP GPB0F401.96 ADDRESS_LOOKUP = LOOKUP(40,PP_POS(J)) ADDRCHK1.89 *ELSE GPB0F401.97 ADDRESS_LOOKUP = MPP_DUMP_ADDR(PP_POS(J)) GPB0F401.98 *ENDIF GPB0F401.99 ADDRESS_STASH = SI(ITEM_CODE,SECT_NO,im_index) GSS1F305.166 ADDRCHK1.91 C Check that they match ADDRCHK1.92 C ADDRCHK1.93 C CHECK THAT START ADDRESSES AGREE FOR FIRST OCCURRANCE ADDRCHK1.94 C OF A NEW STASH CODE: FOR FIXED LENGTH FIELDS THERE ADDRCHK1.95 C IS ONLY ONE ENTRY IN THE PP_STASH ARRAY FOR EACH ADDRCHK1.96 C STASH CODE, BUT FOR PACKED FIELDS (EG OCEAN) ADDRCHK1.97 C EACH LEVEL MIGHT HAVE A DIFFERENT LENGTH AND ADDRCHK1.98 C GENERATE A NEW PP_STASH VALUE. ADDRCHK1.99 C ADDRCHK1.100 IF (ADDRESS_STASH .NE. ADDRESS_LOOKUP .AND. ADDRCHK1.101 & OLD_STASH .NE. PP_STASH(J) ) THEN ADDRCHK1.102 CMESSAGE = 'ADDR_CHK : Mis_match in start addresses' ADDRCHK1.103 WRITE (6,*) ' Stash Sect No ',SECT_NO,' Item No ',ITEM_CODE ADDRCHK1.104 WRITE (6,*) ' Start Address in SI ',ADDRESS_STASH ADDRCHK1.105 WRITE (6,*) ' Start Address in LOOKUP Table ',ADDRESS_LOOKUP ADDRCHK1.106 WRITE (6,*) ' You probably need to RECONFIGURE the start dump' ARB1F404.2 ICODE = 1 ADDRCHK1.107 GO TO 999 ! Return ADDRCHK1.108 ENDIF ADDRCHK1.109 ADDRCHK1.110 C REMEMBER CURRENT VERSOIN OF PP_STASH FOR NEXT TIME THRU LOOP ADDRCHK1.111 OLD_STASH = PP_STASH(J) ADDRCHK1.112 C ADDRCHK1.113 ENDDO ADDRCHK1.114 ADDRCHK1.115 C Check full length ADDRCHK1.116 LEN = 0 ADDRCHK1.117 DO J=1,LEN2_LOOKUP ADDRCHK1.118 *IF -DEF,MPP GPB0F401.100 LEN = LEN + LOOKUP(15,J) ADDRCHK1.119 *ELSE GPB0F401.101 LEN = LEN + MPP_DUMP_LEN(J) GPB0F401.102 *ENDIF GPB0F401.103 ENDDO ADDRCHK1.120 ADDRCHK1.121 IF (LEN .NE. LEN_DATA) THEN ADDRCHK1.122 CMESSAGE = 'ADDR_CHK : Mismatch in length of data' ADDRCHK1.123 WRITE (6,*) ' Length according to LOOKUP table ',LEN ADDRCHK1.124 WRITE (6,*) ' Length set up in D1 array ',LEN_DATA ADDRCHK1.125 WRITE (6,*) ' You probably need to RECONFIGURE the start dump' ARB1F404.3 ICODE = 2 ADDRCHK1.126 GO TO 999 ! Return ADDRCHK1.127 ENDIF ADDRCHK1.128 ADDRCHK1.129 999 RETURN ADDRCHK1.130 END ADDRCHK1.131 *ENDIF ADDRCHK1.132