*IF DEF,C82_1A,AND,DEF,WAVE                                                GHM2F405.23     
C ******************************COPYRIGHT******************************    INANCW1A.3      
C (c) CROWN COPYRIGHT 1995, METEOROLOGICAL OFFICE, All Rights Reserved.    INANCW1A.4      
C                                                                          INANCW1A.5      
C Use, duplication or disclosure of this code is subject to the            INANCW1A.6      
C restrictions as set forth in the contract.                               INANCW1A.7      
C                                                                          INANCW1A.8      
C                Meteorological Office                                     INANCW1A.9      
C                London Road                                               INANCW1A.10     
C                BRACKNELL                                                 INANCW1A.11     
C                Berkshire UK                                              INANCW1A.12     
C                RG12 2SZ                                                  INANCW1A.13     
C                                                                          INANCW1A.14     
C If no contract has been raised with this copy of the code, the use,      INANCW1A.15     
C duplication or disclosure of it is strictly prohibited.  Permission      INANCW1A.16     
C to do so must first be obtained in writing from the Head of Numerical    INANCW1A.17     
C Modelling at the above address.                                          INANCW1A.18     
C ******************************COPYRIGHT******************************    INANCW1A.19     
C                                                                          INANCW1A.20     
CLL Subroutine INANCILW                                                    INANCW1A.21     
CLL                                                                        INANCW1A.22     
CLL Purpose : Takes as input,the code defining the frequency of update     INANCW1A.23     
CLL           of ancillary fields as set by the user interface.            INANCW1A.24     
CLL           Converts them into a list of numbers of timesteps after      INANCW1A.25     
CLL           which each field must be updated, and calculates the         INANCW1A.26     
CLL           frequency with which this list must be interrogated.         INANCW1A.27     
CLL           Where the update interval is in months or years,             INANCW1A.28     
CLL           the check will be carried out each day. The physical         INANCW1A.29     
CLL           files required are also determined by input code,            INANCW1A.30     
CLL           and the headers and lookup tables are read into              INANCW1A.31     
CLL           the arguments FIXHD,INTHD,LOOKUP which are in                INANCW1A.32     
CLL           COMMON/ANCILHDW/ of calling routine INANCCTL.                INANCW1A.33     
CLL           Indexes for each possible ancillary field are set up in      INANCW1A.34     
CLL           COMMON/IXANCILW/                                             INANCW1A.35     
CLL                                                                        INANCW1A.36     
CLL Level 2 Control routine for CRAY YMP                                   INANCW1A.37     
CLL                                                                        INANCW1A.38     
CLL  Model            Modification history                                 INANCW1A.39     
CLL version  Date                                                          INANCW1A.40     
CLL  4.1  08/05/96  Introduce for wave sub-model (based on INANCILA)       INANCW1A.41     
CLL                                                RTHBarnes.              INANCW1A.42     
CLL  4.5  05/05/98  Improve error message for missing files. R. Rawlins    GRR1F405.30     
CLL                                                                        INANCW1A.43     
CLL System components covered : C710                                       INANCW1A.44     
CLL                                                                        INANCW1A.45     
CLL System task : C7                                                       INANCW1A.46     
CLL                                                                        INANCW1A.47     
CLL Documentation : Unified Model Documentation Paper No C7                INANCW1A.48     
CLL                 Version No 4  dated 15/06/90                           INANCW1A.49     
CLLEND                                                                     INANCW1A.50     

      SUBROUTINE INANCILW                                                   1,17INANCW1A.51     
     & (LEN_FIXHD,LEN_INTHD,LEN_REALHD,LEN1_LEVDEPC,LEN2_LEVDEPC,          INANCW1A.52     
     &  FIXHD,INTHD,REALHD,LOOKUP,W_FIXHD,W_REALHD,W_LEVDEPC,              INANCW1A.53     
     &  NDATASETS,NLOOKUPS,FTNANCIL,LOOKUP_START,LEN1_LOOKUP,              INANCW1A.54     
     &  ROW_LENGTH,P_ROWS,                                                 INANCW1A.55     
     &  SI,SILEN,ANCILLARY_STEPS,STEPS_PER_HR,                             INANCW1A.56     
*CALL ARGPPX                                                               INANCW1A.57     
     &  ICODE,CMESSAGE,LCAL360)                                            INANCW1A.58     
                                                                           INANCW1A.59     
      IMPLICIT NONE                                                        INANCW1A.60     
                                                                           INANCW1A.61     
      LOGICAL LCAL360  ! Logical switch for 360-day calendar               INANCW1A.62     
                                                                           INANCW1A.63     
      INTEGER                                                              INANCW1A.64     
     &        LEN_FIXHD,       ! Length of header blocks in ancillary      INANCW1A.65     
C                              ! data sets                                 INANCW1A.66     
     &        LEN_INTHD,       !                                           INANCW1A.67     
     &        LEN_REALHD,      !                                           INANCW1A.68     
     &        LEN1_LEVDEPC,    ! Dimension of LEVDEPC in model             INANCW1A.69     
     &        LEN2_LEVDEPC                                                 INANCW1A.70     
                                                                           INANCW1A.71     
     &     ,ANCILLARY_STEPS,                                               INANCW1A.72     
     &        STEPS_PER_HR                                                 INANCW1A.73     
                                                                           INANCW1A.74     
      INTEGER                                                              INANCW1A.75     
     &        NDATASETS,       ! No of physical files                      INANCW1A.76     
     &        NLOOKUPS,        ! No of lookups required(set by User I.)    INANCW1A.77     
     &                IOUNIT,                                              INANCW1A.78     
     &        FTNANCIL(NDATASETS), ! Fortran nos of physical files         INANCW1A.79     
     &        LOOKUP_START(NDATASETS),!start of each individual lookup     INANCW1A.80     
C                                     !in overall LOOKUP array             INANCW1A.81     
     &        LEN1_LOOKUP,     ! Length of PP header                       INANCW1A.82     
     &        ROW_LENGTH,      ! Atmosphere model dimensions               INANCW1A.83     
     &        P_ROWS,          ! No. of rows for pressure-type variables   INANCW1A.84     
     &        FILE_LEVELS      ! Number of levels of data in files         INANCW1A.85     
C                              ! contining multi-level data.               INANCW1A.86     
                                                                           INANCW1A.87     
     &       ,SILEN             ! Length for SI_ATMOS/SLAB arrays          INANCW1A.88     
     &       ,SI(SILEN)   ! STASHin addresses of wave                      INANCW1A.89     
                                                                           INANCW1A.90     
      INTEGER                                                              INANCW1A.91     
     &        FIXHD(LEN_FIXHD,NDATASETS),! Overall Fixed header array      INANCW1A.92     
     &        W_FIXHD(LEN_FIXHD), ! Fixed header for Dump                  INANCW1A.93     
     &        INTHD(LEN_INTHD,NDATASETS),! Overall Integer header array    INANCW1A.94     
     &        LOOKUP(LEN1_LOOKUP,NLOOKUPS),!Overall Lookup array           INANCW1A.95     
     &        ICODE            ! Return code =0 Normal Exit                INANCW1A.96     
C                              !             >0 Error                      INANCW1A.97     
                                                                           INANCW1A.98     
      REAL                                                                 INANCW1A.99     
     &      REALHD(LEN_REALHD,NDATASETS),!                                 INANCW1A.100    
     &      W_REALHD(LEN_REALHD),!                                         INANCW1A.101    
     &      W_LEVDEPC(LEN1_LEVDEPC,LEN2_LEVDEPC)                           INANCW1A.102    
CCC  &     ,LEVDEPC(P_LEVELS*4)! Space to hold level dependent constants   INANCW1A.103    
C                              ! from data set                             INANCW1A.104    
                                                                           INANCW1A.105    
      CHARACTER*80                                                         INANCW1A.106    
     &        CMESSAGE         ! Out error message if I>0                  INANCW1A.107    
                                                                           INANCW1A.108    
*CALL CSUBMODL                                                             INANCW1A.109    
*CALL CPPXREF                                                              INANCW1A.110    
*CALL PPXLOOK                                                              INANCW1A.111    
*CALL MODEL                                                                INANCW1A.112    
*CALL CLOOKADD                                                             INANCW1A.113    
*CALL CANCILW                                                              INANCW1A.114    
*CALL CENVIR                                                               INANCW1A.115    
                                                                           INANCW1A.116    
*CALL C_MDI                                                                INANCW1A.117    
                                                                           INANCW1A.118    
! Comdecks for ancillary files/fields.                                     INANCW1A.119    
*CALL CANCFLDW                                                             INANCW1A.120    
                                                                           INANCW1A.121    
CL External subroutines called:                                            INANCW1A.122    
                                                                           INANCW1A.123    
      EXTERNAL                                                             INANCW1A.124    
     &        IOERROR,         !                                           INANCW1A.125    
     &        PR_FIXHD,        !                                           INANCW1A.126    
     &        POSERROR,        !                                           INANCW1A.127    
     &        SETPOS,          !                                           INANCW1A.128    
     &        CHK_LOOK         !                                           INANCW1A.129    
                                                                           INANCW1A.130    
CL Namelist input                                                          INANCW1A.131    
                                                                           INANCW1A.132    
      NAMELIST/ANCILCTW/FIELDCODE                                          INANCW1A.133    
                                                                           INANCW1A.134    
C Local Variables                                                          INANCW1A.135    
                                                                           INANCW1A.136    
      INTEGER                                                              INANCW1A.137    
     &        I,               !                                           INANCW1A.138    
     &        ITEM,            !                                           INANCW1A.139    
     &        J,               !                                           INANCW1A.140    
     &        J1,              !                                           INANCW1A.141    
     &        K,               !                                           INANCW1A.142    
     &        LEN_IO,          !                                           INANCW1A.143    
     &        LOOKUPS,         !                                           INANCW1A.144    
     &        NFTIN,           ! Current FTN number for ancillary data     INANCW1A.145    
     &        START_BLOCK      !                                           INANCW1A.146    
     &       ,STASH_CODE       ! Stash item code                           INANCW1A.147    
     &       ,NREC_W           ! No of wave records                        INANCW1A.148    
     &       ,STASH_ADDR       ! Stash address                             INANCW1A.149    
      INTEGER                                                              INANCW1A.150    
     & FILEANCIL_DATA(NANCIL_FIELDS) !logical file nos of each ancillary   INANCW1A.151    
     &,STASHANCIL_DATA(NANCIL_FIELDS) ! stash item nos                     INANCW1A.152    
                                                                           INANCW1A.153    
      DATA                                                                 INANCW1A.154    
     & FILEANCIL_DATA/1,1 /,                                               INANCW1A.155    
     & STASHANCIL_DATA/30,33 /                                             INANCW1A.156    
                                                                           INANCW1A.157    
                                                                           INANCW1A.158    
      REAL                                                                 INANCW1A.159    
     &        A_IO             ! Used in test for I/O errors               INANCW1A.160    
C                              ! for checking against primar model value   INANCW1A.161    
                                                                           INANCW1A.162    
      LOGICAL                                                              INANCW1A.163    
     &        LFILE            !                                           INANCW1A.164    
                                                                           INANCW1A.165    
      REAL P1,P2                                                           INANCW1A.166    
      LOGICAL LNER                                                         INANCW1A.167    
      LNER(P1,P2) = ((ABS(P1-P2)) .GT. (1.E-6*ABS(P1+P2)))                 INANCW1A.168    
                                                                           INANCW1A.169    
CL Internal Structure                                                      INANCW1A.170    
                                                                           INANCW1A.171    
      ICODE=0                                                              INANCW1A.172    
      CMESSAGE=' '                                                         INANCW1A.173    
      IOUNIT=0                                                             INANCW1A.174    
                                                                           INANCW1A.175    
C                                                                          INANCW1A.176    
CL  1.  Initialisation for wave sub-model                                  INANCW1A.177    
                                                                           INANCW1A.178    
      DO I=1,NANCIL_FIELDS                                                 INANCW1A.179    
        FILEANCIL(I) = ANCIL_FILE_NO(I)                                    INANCW1A.180    
        STASHANCIL(I)= ITEM_CODES_ANCIL(I)                                 INANCW1A.181    
      ENDDO                                                                INANCW1A.182    
                                                                           INANCW1A.183    
CL  Read in control information from namelist                              INANCW1A.184    
                                                                           INANCW1A.185    
      REWIND 5                                                             INANCW1A.186    
      READ(5,ANCILCTW)                                                     INANCW1A.187    
                                                                           INANCW1A.188    
! Check that ancillary field has valid address (>1) before proceding       INANCW1A.189    
!  to try and update it.  If not, switch off updating via FIELDCODE.       INANCW1A.190    
      DO I=1,NANCIL_FIELDS                                                 INANCW1A.191    
          stash_addr = si(stashancil(i))                                   INANCW1A.192    
        IF (stash_addr .le. 1) THEN                                        INANCW1A.193    
          IF (FIELDCODE(1,I).gt.0) THEN                                    INANCW1A.194    
           WRITE(6,*)' INANCILW: update requested for item ',i,            GRR1F405.31     
     &     ' STASHcode ',stashancil(i),' but prognostic address not set'   GRR1F405.32     
            WRITE(6,*)' FIELDCODE values reset to zeroes'                  GIE0F403.302    
            FIELDCODE(1,I) = 0                                             INANCW1A.198    
            FIELDCODE(2,I) = 0                                             INANCW1A.199    
          END IF                                                           INANCW1A.200    
        END IF                                                             INANCW1A.201    
      END DO                                                               INANCW1A.202    
                                                                           INANCW1A.203    
CL  1.1 Set number of steps after which each ancillary field is updated    INANCW1A.204    
C       Zero is used for fields not to be updated                          INANCW1A.205    
                                                                           INANCW1A.206    
      DO I=1,NANCIL_FIELDS                                                 INANCW1A.207    
        STEPS(I)=0                                                         INANCW1A.208    
        IF (FIELDCODE(1,I).EQ.5) THEN ! new code (every n timesteps)       INANCW1A.209    
          STEPS(I) = FIELDCODE(2,I)                                        INANCW1A.210    
        END IF                                                             INANCW1A.211    
        IF (FIELDCODE(1,I).EQ.4)THEN                                       INANCW1A.212    
          STEPS(I)=FIELDCODE(2,I)*STEPS_PER_HR                             INANCW1A.213    
        END IF                                                             INANCW1A.214    
        IF (FIELDCODE(1,I).EQ.3) THEN                                      INANCW1A.215    
          STEPS(I)=FIELDCODE(2,I)*24*STEPS_PER_HR                          INANCW1A.216    
        END IF                                                             INANCW1A.217    
                                                                           INANCW1A.218    
      IF (LCAL360) THEN                                                    INANCW1A.219    
        IF (FIELDCODE(1,I).EQ.2) THEN                                      INANCW1A.220    
          STEPS(I)=FIELDCODE(2,I)*30*24*STEPS_PER_HR                       INANCW1A.221    
        END IF                                                             INANCW1A.222    
        IF (FIELDCODE(1,I).EQ.1) THEN                                      INANCW1A.223    
          STEPS(I)=FIELDCODE(2,I)*360*24*STEPS_PER_HR                      INANCW1A.224    
        END IF                                                             INANCW1A.225    
      ELSE                                                                 INANCW1A.226    
C Gregorian calender:                                                      INANCW1A.227    
C If update interval is months or years, test each day. Further testing    INANCW1A.228    
C done in REPLANCW.                                                        INANCW1A.229    
                                                                           INANCW1A.230    
        IF (FIELDCODE(1,I).EQ.1.OR.FIELDCODE(1,I).EQ.2)THEN                INANCW1A.231    
         STEPS(I)=24*STEPS_PER_HR                                          INANCW1A.232    
        END IF                                                             INANCW1A.233    
      END IF                                                               INANCW1A.234    
                                                                           INANCW1A.235    
      END DO                                                               INANCW1A.236    
                                                                           INANCW1A.237    
CL  1.2 Set master number of steps ANCILLARY_STEPS at which                INANCW1A.238    
CL      individual switches are tested.                                    INANCW1A.239    
                                                                           INANCW1A.240    
C   Find first active field                                                INANCW1A.241    
                                                                           INANCW1A.242    
      DO I=1,NANCIL_FIELDS                                                 INANCW1A.243    
        IF (STEPS(I).GT.0) THEN                                            INANCW1A.244    
          ANCILLARY_STEPS=STEPS(I)                                         INANCW1A.245    
          GOTO 121                                                         INANCW1A.246    
        END IF                                                             INANCW1A.247    
      END DO                                                               INANCW1A.248    
                                                                           INANCW1A.249    
C No above fields found                                                    INANCW1A.250    
                                                                           INANCW1A.251    
      ANCILLARY_STEPS=0                                                    INANCW1A.252    
                                                                           INANCW1A.253    
      GOTO 900                                                             INANCW1A.254    
121   ITEM=I                                                               INANCW1A.255    
                                                                           INANCW1A.256    
CL      Set ANCILLARY_STEPS to lowest common denominater of                INANCW1A.257    
CL      frequencies for active fields                                      INANCW1A.258    
                                                                           INANCW1A.259    
      DO I=ITEM+1,NANCIL_FIELDS                                            INANCW1A.260    
        IF (STEPS(I).LT.ANCILLARY_STEPS                                    INANCW1A.261    
     *      .AND. STEPS(I).GT.0) THEN                                      INANCW1A.262    
          IF (MOD(ANCILLARY_STEPS,STEPS(I)).EQ.0) THEN                     INANCW1A.263    
            ANCILLARY_STEPS=STEPS(I)                                       INANCW1A.264    
          ELSE                                                             INANCW1A.265    
            J1=STEPS(I)-1                                                  INANCW1A.266    
            DO J=J1,1,-1                                                   INANCW1A.267    
              IF ((MOD(ANCILLARY_STEPS,J).EQ.0).AND.                       INANCW1A.268    
     &           (MOD(STEPS(I),J).EQ.0)) THEN                              INANCW1A.269    
                 GOTO 124                                                  INANCW1A.270    
              ENDIF                                                        INANCW1A.271    
            END DO                                                         INANCW1A.272    
124         ANCILLARY_STEPS = J                                            INANCW1A.273    
          END IF                                                           INANCW1A.274    
        END IF                                                             INANCW1A.275    
      END DO                                                               INANCW1A.276    
                                                                           INANCW1A.277    
CCC *ELSE                                                                  INANCW1A.278    
CL 1.1 Set control switches for reconfiguration (not available for         INANCW1A.279    
CL      wave sub-model at present).                                        INANCW1A.280    
                                                                           INANCW1A.281    
CCC *ENDIF                                                                 INANCW1A.282    
                                                                           INANCW1A.283    
CL 1.3 Set number of headers for each ancillary field                      INANCW1A.284    
                                                                           INANCW1A.285    
      DO I=1,NANCIL_FIELDS                                                 INANCW1A.286    
        LEVELS(I)=1                                                        INANCW1A.287    
      END DO                                                               INANCW1A.288    
                                                                           INANCW1A.289    
CL 1.4 Read headers                                                        INANCW1A.290    
                                                                           INANCW1A.291    
      LOOKUPS=0                                                            INANCW1A.292    
                                                                           INANCW1A.293    
      DO I=1,NDATASETS                                                     INANCW1A.294    
                                                                           INANCW1A.295    
C  Initialise LOOKUP_START (=0 implies file I not required)                INANCW1A.296    
        LOOKUP_START(I)=0                                                  INANCW1A.297    
                                                                           INANCW1A.298    
CL Check whether each physical file is needed                              INANCW1A.299    
                                                                           INANCW1A.300    
        LFILE=.FALSE.                                                      INANCW1A.301    
        DO 141 J=1,NANCIL_FIELDS                                           INANCW1A.302    
                                                                           INANCW1A.303    
          IF (FILEANCIL(J).EQ.I.AND.STEPS(J).GT.0) THEN                    INANCW1A.304    
                                                                           INANCW1A.305    
            LFILE=.TRUE.                                                   INANCW1A.306    
          END IF                                                           INANCW1A.307    
141     CONTINUE                                                           INANCW1A.308    
                                                                           INANCW1A.309    
        IF(LFILE) THEN                                                     INANCW1A.310    
                                                                           INANCW1A.311    
      WRITE(6,*) ' '                                                       INANCW1A.312    
      WRITE(6,*)' Ancillary data file ',I,',unit no ',FTNANCIL(I),         INANCW1A.313    
     *' for forcing wind fields'                                           INANCW1A.314    
                                                                           INANCW1A.315    
CL Read headers for physical files required                                INANCW1A.316    
                                                                           INANCW1A.317    
          NFTIN=FTNANCIL(I)                                                INANCW1A.318    
                                                                           INANCW1A.319    
CL 1.4.1 Buffer in fixed length header record                              INANCW1A.320    
                                                                           INANCW1A.321    
        CALL FILE_OPEN(NFTIN,FT_ENVIRON(NFTIN),                            INANCW1A.322    
     &                 LEN_FT_ENVIR(NFTIN),0,0,ICODE)                      INANCW1A.323    
        IF(ICODE.NE.0)THEN                                                 INANCW1A.324    
          CMESSAGE='INANCLA: Error opening file'                           INANCW1A.325    
          write(6,*) 'INANCILW: Error opening file on unit ',NFTIN,        GRR1F405.33     
     &               ' accessed from env.var.: ',FT_ENVIRON(NFTIN)         GRR1F405.34     
          RETURN                                                           INANCW1A.326    
        ENDIF                                                              INANCW1A.327    
                                                                           INANCW1A.328    
        CALL SETPOS(NFTIN,0,ICODE)                                         INANCW1A.329    
                                                                           INANCW1A.330    
        CALL BUFFIN(NFTIN,FIXHD(1,I),LEN_FIXHD,LEN_IO,A_IO)                INANCW1A.331    
                                                                           INANCW1A.332    
C Check for I/O errors                                                     INANCW1A.333    
                                                                           INANCW1A.334    
          IF(A_IO.NE.-1.0.OR.LEN_IO.NE.LEN_FIXHD) THEN                     INANCW1A.335    
            CALL IOERROR('bufferin of fixed length header',A_IO,LEN_IO,    INANCW1A.336    
     &                    LEN_FIXHD)                                       INANCW1A.337    
            CMESSAGE='INANCILW:I/O error'                                  INANCW1A.338    
            ICODE=1                                                        INANCW1A.339    
            IOUNIT=NFTIN                                                   INANCW1A.340    
            RETURN                                                         INANCW1A.341    
          END IF                                                           INANCW1A.342    
                                                                           INANCW1A.343    
          START_BLOCK=LEN_FIXHD+1                                          INANCW1A.344    
                                                                           INANCW1A.345    
C Check validity of data and print out fixed header information            INANCW1A.346    
                                                                           INANCW1A.347    
        FILE_LEVELS=1                                                      INANCW1A.348    
                                                                           INANCW1A.349    
                                                                           INANCW1A.350    
        CALL PR_FIXHD(FIXHD(1,I),LEN_FIXHD,LEN_INTHD,                      INANCW1A.351    
     &  LEN_REALHD,FILE_LEVELS,FIXHD(112,I),FIXHD(                         INANCW1A.352    
     &  116,I),FIXHD(117,I),FIXHD(121,I),FIXHD(                            INANCW1A.353    
     &  122,I),FIXHD(126,I),FIXHD(127,I),FIXHD(                            INANCW1A.354    
     &  131,I),FIXHD(132,I),FIXHD(141,I),FIXHD(143,I),                     INANCW1A.355    
     &  FIXHD(145,I),LEN1_LOOKUP,FIXHD(152,I),                             INANCW1A.356    
     &  FIXHD(161,I),ICODE,CMESSAGE)                                       INANCW1A.357    
                                                                           INANCW1A.358    
           IF(ICODE.GT.0) RETURN                                           INANCW1A.359    
                                                                           INANCW1A.360    
CL 1.4.2 Buffer in integer constants                                       INANCW1A.361    
                                                                           INANCW1A.362    
           IF(FIXHD(100,I).GT.0) THEN                                      INANCW1A.363    
                                                                           INANCW1A.364    
C Check for error in file pointers                                         INANCW1A.365    
                                                                           INANCW1A.366    
             IF(FIXHD(100,I).NE.START_BLOCK) THEN                          INANCW1A.367    
               CALL POSERROR('integer constants',START_BLOCK,100,          INANCW1A.368    
     &              FIXHD(100,I))                                          INANCW1A.369    
               CMESSAGE='INANCILW: Addressing conflict'                    INANCW1A.370    
               ICODE=2                                                     INANCW1A.371    
               RETURN                                                      INANCW1A.372    
             END IF                                                        INANCW1A.373    
                                                                           INANCW1A.374    
        CALL BUFFIN(NFTIN,INTHD(1,I),FIXHD(101,I),LEN_IO,A_IO)             INANCW1A.375    
                                                                           INANCW1A.376    
C Check for I/O errors                                                     INANCW1A.377    
                                                                           INANCW1A.378    
            IF(A_IO.NE.-1.0.OR.LEN_IO.NE.FIXHD(101,I)) THEN                INANCW1A.379    
              CALL IOERROR('buffer in of integer constants',A_IO,LEN_IO    INANCW1A.380    
     &            ,FIXHD(101,I))                                           INANCW1A.381    
              CMESSAGE='INANCILW: I/O Error'                               INANCW1A.382    
              ICODE=3                                                      INANCW1A.383    
              IOUNIT=NFTIN                                                 INANCW1A.384    
              RETURN                                                       INANCW1A.385    
            END IF                                                         INANCW1A.386    
                                                                           INANCW1A.387    
            START_BLOCK=START_BLOCK+FIXHD(101,I)                           INANCW1A.388    
                                                                           INANCW1A.389    
C Check validity of integer data and print out information                 INANCW1A.390    
C All files except ozone should contain full fields                        INANCW1A.391    
                                                                           INANCW1A.392    
            IF(INTHD(6,I).NE.ROW_LENGTH) THEN                              INANCW1A.393    
              ICODE=4                                                      INANCW1A.394    
              CMESSAGE='INANCILW:integer header error'                     INANCW1A.395    
              WRITE(6,*) ' INTHD(6) : ',INTHD(6,I),' ??'                   INANCW1A.396    
              RETURN                                                       INANCW1A.397    
            END IF                                                         INANCW1A.398    
                                                                           INANCW1A.399    
            IF(INTHD(7,I).NE.P_ROWS) THEN                                  INANCW1A.400    
              ICODE=5                                                      INANCW1A.401    
              CMESSAGE='INANCILW:integer header error'                     INANCW1A.402    
              WRITE(6,*) ' INTHD(7) : ',INTHD(7,I),' ??'                   INANCW1A.403    
              RETURN                                                       INANCW1A.404    
            END IF                                                         INANCW1A.405    
                                                                           INANCW1A.406    
          END IF                                                           INANCW1A.407    
                                                                           INANCW1A.408    
CL 1.4.3 Buffer in real constants                                          INANCW1A.409    
                                                                           INANCW1A.410    
          IF(FIXHD(105,I).GT.0) THEN                                       INANCW1A.411    
                                                                           INANCW1A.412    
C Check for error in file pointers                                         INANCW1A.413    
                                                                           INANCW1A.414    
           IF(FIXHD(105,I).NE.START_BLOCK) THEN                            INANCW1A.415    
             CALL POSERROR('integer constants',START_BLOCK,105,            INANCW1A.416    
     &            FIXHD(105,I))                                            INANCW1A.417    
             CMESSAGE='INANCILW: Addressing conflict'                      INANCW1A.418    
             ICODE=6                                                       INANCW1A.419    
             RETURN                                                        INANCW1A.420    
           END IF                                                          INANCW1A.421    
                                                                           INANCW1A.422    
C Check for I/O errors                                                     INANCW1A.423    
                                                                           INANCW1A.424    
        CALL BUFFIN(NFTIN,REALHD(1,I),FIXHD(106,I),LEN_IO,A_IO)            INANCW1A.425    
                                                                           INANCW1A.426    
           IF(A_IO.NE.-1.0.OR.LEN_IO.NE.FIXHD(106,I)) THEN                 INANCW1A.427    
             CALL IOERROR('buffer in of real constants',A_IO,LEN_IO,       INANCW1A.428    
     &            FIXHD(106,I))                                            INANCW1A.429    
             CMESSAGE='INANCILW: I/O Error'                                INANCW1A.430    
             ICODE=7                                                       INANCW1A.431    
             IOUNIT=NFTIN                                                  INANCW1A.432    
             RETURN                                                        INANCW1A.433    
           END IF                                                          INANCW1A.434    
                                                                           INANCW1A.435    
           START_BLOCK=START_BLOCK+FIXHD(106,I)                            INANCW1A.436    
                                                                           INANCW1A.437    
C Check validity of real header and print out information                  INANCW1A.438    
                                                                           INANCW1A.439    
           DO J=1,6                                                        INANCW1A.440    
             IF(REALHD(J,I).GT.(W_REALHD(J)+0.1).OR.                       INANCW1A.441    
     &         REALHD(J,I).LT.(W_REALHD(J)-0.1))THEN                       INANCW1A.442    
             IF(I.NE.1.OR.(J.NE.1.AND.J.NE.4))THEN                         INANCW1A.443    
               WRITE(6,*)(REALHD(K,I),K=1,6),(W_REALHD(K),K=1,6)           INANCW1A.444    
               ICODE=8                                                     INANCW1A.445    
               CMESSAGE='INANCILW: REAL header Error.'                     INANCW1A.446    
               RETURN                                                      INANCW1A.447    
             END IF                                                        INANCW1A.448    
             END IF                                                        INANCW1A.449    
           END DO                                                          INANCW1A.450    
                                                                           INANCW1A.451    
         END IF                                                            INANCW1A.452    
                                                                           INANCW1A.453    
CL 1.4.4 Buffer in level dependent constants if required                   INANCW1A.454    
C        Not retained in model after initial check                         INANCW1A.455    
                                                                           INANCW1A.456    
         IF(FIXHD(110,I).GT.0) THEN                                        INANCW1A.457    
                                                                           INANCW1A.458    
C Check for error in file pointers                                         INANCW1A.459    
                                                                           INANCW1A.460    
           IF(FIXHD(110,I).NE.START_BLOCK) THEN                            INANCW1A.461    
             CALL POSERROR('level dependent constants',START_BLOCK,110,    INANCW1A.462    
     &            FIXHD(110,I))                                            INANCW1A.463    
             CMESSAGE='INANCILW: Addressing conflict'                      INANCW1A.464    
             ICODE=9                                                       INANCW1A.465    
             RETURN                                                        INANCW1A.466    
           END IF                                                          INANCW1A.467    
                                                                           INANCW1A.468    
           START_BLOCK=START_BLOCK+FIXHD(111,I)*FIXHD(112,I)               INANCW1A.469    
                                                                           INANCW1A.470    
           IF(I.EQ.-1) THEN   ! no multi-level wave ancillaries            INANCW1A.471    
                                                                           INANCW1A.472    
CCC        CALL BUFFIN(NFTIN,LEVDEPC(1),FIXHD(111,I)*FIXHD(112,I),         INANCW1A.473    
CCC     1  LEN_IO,A_IO)                                                    INANCW1A.474    
                                                                           INANCW1A.475    
C Check for I/O errors                                                     INANCW1A.476    
                                                                           INANCW1A.477    
             IF(A_IO.NE.-1.0.OR.LEN_IO.NE.FIXHD(111,I)*                    INANCW1A.478    
     &         FIXHD(112,I)) THEN                                          INANCW1A.479    
               CALL IOERROR('Buffer in if level dependent constants',      INANCW1A.480    
     &         A_IO,LEN_IO,FIXHD(111,I)*FIXHD(112,I))                      INANCW1A.481    
               CMESSAGE='INANCILW: I/O ERROR.'                             INANCW1A.482    
               ICODE=10                                                    INANCW1A.483    
               IOUNIT=NFTIN                                                INANCW1A.484    
               RETURN                                                      INANCW1A.485    
             END IF                                                        INANCW1A.486    
           END IF                                                          INANCW1A.487    
                                                                           INANCW1A.488    
         END IF                                                            INANCW1A.489    
                                                                           INANCW1A.490    
CL 1.4.5 Buffer in lookup table                                            INANCW1A.491    
C Set start position of boundary fields for file                           INANCW1A.492    
                                                                           INANCW1A.493    
         LOOKUP_START(I)=LOOKUPS+1                                         INANCW1A.494    
                                                                           INANCW1A.495    
         IF(FIXHD(150,I).GT.0) THEN                                        INANCW1A.496    
                                                                           INANCW1A.497    
C Check for error in file pointers                                         INANCW1A.498    
                                                                           INANCW1A.499    
           IF(FIXHD(150,I).NE.START_BLOCK) THEN                            INANCW1A.500    
             CALL POSERROR('lookup table',START_BLOCK,150,                 INANCW1A.501    
     &            FIXHD(150,I))                                            INANCW1A.502    
             CMESSAGE='INANCILW: Addressing conflict'                      INANCW1A.503    
             ICODE=13                                                      INANCW1A.504    
             RETURN                                                        INANCW1A.505    
           END IF                                                          INANCW1A.506    
                                                                           INANCW1A.507    
           IF(LOOKUPS+FIXHD(152,I).GT.NLOOKUPS) THEN                       INANCW1A.508    
       CMESSAGE='INANCILW: Insufficient space for headers'                 INANCW1A.509    
                                                                           INANCW1A.510    
             ICODE=14                                                      INANCW1A.511    
             RETURN                                                        INANCW1A.512    
           END IF                                                          INANCW1A.513    
                                                                           INANCW1A.514    
        CALL BUFFIN(NFTIN,LOOKUP(1,LOOKUPS+1),FIXHD(151,I)*                INANCW1A.515    
     1  FIXHD(152,I),LEN_IO,A_IO)                                          INANCW1A.516    
                                                                           INANCW1A.517    
C Check for I/O errors                                                     INANCW1A.518    
                                                                           INANCW1A.519    
           IF(A_IO.NE.-1.0.OR.LEN_IO.NE.FIXHD(151,I)*                      INANCW1A.520    
     &        FIXHD(152,I)) THEN                                           INANCW1A.521    
             CALL IOERROR('buffer in of lookup table',A_IO,LEN_IO,         INANCW1A.522    
     &            FIXHD(151,I)*FIXHD(152,I))                               INANCW1A.523    
             CMESSAGE='INANCILW: I/O Error'                                INANCW1A.524    
             ICODE=15                                                      INANCW1A.525    
             IOUNIT=NFTIN                                                  INANCW1A.526    
             RETURN                                                        INANCW1A.527    
           END IF                                                          INANCW1A.528    
                                                                           INANCW1A.529    
                                                                           INANCW1A.530    
C Check LOOKUP for consistency with PARAMETER statements                   INANCW1A.531    
                                                                           INANCW1A.532    
           CALL CHK_LOOK(FIXHD(1,I),LOOKUP(1,LOOKUPS+1),LEN1_LOOKUP,       INANCW1A.533    
     &                   FIXHD(161,I),                                     INANCW1A.534    
*CALL ARGPPX                                                               INANCW1A.535    
     &                   ICODE,CMESSAGE)                                   INANCW1A.536    
                                                                           INANCW1A.537    
           NREC_W = 0                                                      INANCW1A.538    
           DO J = 1,FIXHD(152,I)                                           INANCW1A.539    
             IF (LOOKUP(MODEL_CODE,LOOKUPS+J) .eq. 0 .or.                  INANCW1A.540    
     &           LOOKUP(MODEL_CODE,LOOKUPS+J) .eq. imdi) THEN              INANCW1A.541    
               STASH_CODE = LOOKUP(ITEM_CODE,LOOKUPS+J)                    INANCW1A.542    
               LOOKUP(MODEL_CODE,LOOKUPS+J) = wave_im                      INANCW1A.543    
               NREC_W = NREC_W+1                                           INANCW1A.544    
             END IF                                                        INANCW1A.545    
           END DO                                                          INANCW1A.546    
           IF (NREC_W.GT.0) THEN                                           INANCW1A.547    
             WRITE (6,*) ' '                                               INANCW1A.548    
             WRITE (6,*) ' INANCILW : submodel_id in ',NREC_W,             INANCW1A.549    
     &       ' records set to wave_im in ancillary file ',I                INANCW1A.550    
           ENDIF                                                           INANCW1A.551    
                                                                           INANCW1A.552    
         END IF                                                            INANCW1A.553    
                                                                           INANCW1A.554    
         LOOKUPS=LOOKUPS+FIXHD(152,I)                                      INANCW1A.555    
                                                                           INANCW1A.556    
       ELSE                                                                INANCW1A.557    
                                                                           INANCW1A.558    
CL  If file not required, zero fixed length header                         INANCW1A.559    
         DO J=1,LEN_FIXHD                                                  INANCW1A.560    
           FIXHD(J,I)=0                                                    INANCW1A.561    
         END DO                                                            INANCW1A.562    
                                                                           INANCW1A.563    
         LOOKUP_START(I)=LOOKUPS+1                                         INANCW1A.564    
       END IF                                                              INANCW1A.565    
                                                                           INANCW1A.566    
      END DO                                                               INANCW1A.567    
                                                                           INANCW1A.568    
CL 1.5 Set positions in main data blocks                                   INANCW1A.569    
                                                                           INANCW1A.570    
                                                                           INANCW1A.571    
      DO I=1,NANCIL_FIELDS                                                 INANCW1A.572    
        D1_ANCILADD(I)=SI(STASHANCIL(I))                                   INANCW1A.573    
      ENDDO                                                                INANCW1A.574    
                                                                           INANCW1A.575    
CL 1.51 If a request is made to update a field, ensure that space for      INANCW1A.576    
CL     that field has been allocted in D1.                                 INANCW1A.577    
                                                                           INANCW1A.578    
      DO I=1,NANCIL_FIELDS                                                 INANCW1A.579    
        IF((FIELDCODE(1,I).GT.0).AND.(D1_ANCILADD(I).LE.1)) THEN           INANCW1A.580    
          WRITE(6,*)' An address in D1 has not been set for ancillary      INANCW1A.581    
     & field number ',I                                                    INANCW1A.582    
          ICODE=30                                                         INANCW1A.583    
          CMESSAGE='INANCILW: updating for ancillary field is requested    INANCW1A.584    
     & but space not allocated in D1'                                      INANCW1A.585    
          RETURN                                                           INANCW1A.586    
        ENDIF                                                              INANCW1A.587    
      END DO                                                               INANCW1A.588    
                                                                           INANCW1A.589    
CL 1.6 Set positions of data                                               INANCW1A.590    
                                                                           INANCW1A.591    
      DO I=1,NANCIL_FIELDS                                                 INANCW1A.592    
      NLOOKUP(I) =0                                                        INANCW1A.593    
      LOOKUP_STEP(I)=0                                                     INANCW1A.594    
                                                                           INANCW1A.595    
C If LOOKUP_START=0 for file FILEANCIL(I), no fields required.             INANCW1A.596    
        IF (LOOKUP_START(FILEANCIL(I)).GT.0) THEN                          INANCW1A.597    
                                                                           INANCW1A.598    
        DO J=LOOKUP_START(FILEANCIL(I)),LOOKUPS                            INANCW1A.599    
                                                                           INANCW1A.600    
          IF (LOOKUP(ITEM_CODE,J).EQ.STASHANCIL(I)) THEN                   INANCW1A.601    
            NLOOKUP(I)=J-LOOKUP_START(FILEANCIL(I))+1                      INANCW1A.602    
            GOTO 161                                                       INANCW1A.603    
          END IF                                                           INANCW1A.604    
                                                                           INANCW1A.605    
        END DO                                                             INANCW1A.606    
                                                                           INANCW1A.607    
C Find second occurrence of data to set LOOKUP_STEP                        INANCW1A.608    
                                                                           INANCW1A.609    
161     LOOKUP_STEP(I)=0                                                   INANCW1A.610    
                                                                           INANCW1A.611    
        IF(J.LT.LOOKUPS) THEN                                              INANCW1A.612    
                                                                           INANCW1A.613    
          DO J1=J+LEVELS(I),LOOKUPS                                        INANCW1A.614    
            IF (LOOKUP(ITEM_CODE,J1).EQ.STASHANCIL(I)) THEN                INANCW1A.615    
              LOOKUP_STEP(I)=J1-NLOOKUP(I)-LOOKUP_START(FILEANCIL(I))+1    INANCW1A.616    
              GOTO 164                                                     INANCW1A.617    
            END IF                                                         INANCW1A.618    
          END DO                                                           INANCW1A.619    
164      CONTINUE                                                          INANCW1A.620    
        END IF                                                             INANCW1A.621    
                                                                           INANCW1A.622    
        END IF                                                             INANCW1A.623    
                                                                           INANCW1A.624    
      END DO                                                               INANCW1A.625    
                                                                           INANCW1A.626    
 900  CONTINUE                                                             INANCW1A.627    
 9999 CONTINUE                                                             INANCW1A.628    
      RETURN                                                               INANCW1A.629    
      END                                                                  INANCW1A.630    
*ENDIF                                                                     INANCW1A.631